细述Javascript的加法运算符的具体使用

简介

JavaScript是一门了不起的语言。我喜欢它的灵活性:只需以你喜欢的方式做事:更改变量类型,动态的向对象添加方法或属性,对不同的变量类型使用运算符等等。

然而动态是要付出代价的,开发人员需要知道怎样处理对于不同操作符的类型转换:加号(+),等号(==和===),不等号(!=和!==)等等,许多运算符有自己处理类型转换的方式。

加法运算符

最常用的运算符:+,这个运算符用于接连字符串或对数字求和:

字符串连接:

var result = "Hello, " + "World!";
// 字符串 + 字符串 = 字符串 (连接)
// "Hello, World!"

数字算术相加:

var result = 10 + 5;
// 数字 + 数字 = 数字 (相加)
// 15

JavaScript允许使用对象,数组,null或undefined作为操作数。下面试着揭开转换的一般规则。

转换规则

使用下面的等式看一下在操作运算符里JavaScript是如何进行类型转换的:

  1. 如果至少有一个操作数是对象,会被转换成原始值(字符串,数字或布尔);
  2. 转换之后,如果至少有一个操作数是字符串类型,第二个操作数会被转换成字符串,并且会执行连接。
  3. 在其他的情况下,两个操作数都会转换成数字并执行算数加法运算。

如果两个操作数都是原始类型,运算符会检查是否至少有一个是字符串类型,如果是就执行连接操作。其他情况就都转换为数字并求合。

对象类型转为原始类型

对象类型向原始类型的转换

  • 如果对象类型是Date,会调用该对象的toString();
  • 其他情况下,如果valueOf()返回的是原始类型,会调用对象的valueOf();
  • 其他情况下(如果valueOf()不存在或没有返回原始类型),会调用toString()方法,大部分情况下是用的这种转换。

当数组转换为原始类型,JavaScript会使用它的join(',')方法,例如[1,5,6]就是"1,5,6"。普通JavaScript对像{}的原始类型是"[object Object]"。

学习例子

下面的例子帮助我们理解简单和复杂的转换场景。

例1:数字和字符串

var result = 1 + "5"; // "15"

解析:

  • 1+"5"(第二个操作数是字符串,基于规则2数字1变"1")
  • "1"+"5"(字符串连接)
  • "15"

第二个操作数是字符串,第一个操作数从数字转换为字符串,然后进行连接。

例2:数字和数组

var result = [1, 3, 5] + 1; //"1,3,51"

解析:

  1. [1, 3, 5] + 1 (使用规则1,将数组[1, 3, 5]转换成原始值: "1,3,5")
  2. "1,3,5" + 1 (使用规则,将数字1转换为字符串 "1")
  3. "1,3,5" + "1" (字符串连接)
  4. "1,3,51"

第1个操作数是数组,所以它被转换为原始字符串值,在下一步数字操作数转换为字符串,然后再完成两个字符串的连接。

例3:数字和布尔类型

var result = 10 + true; //11

解析:

  1. 10 + true (基于规则3将布尔值true转换成数字1)
  2. 10 + 1 (将两个数字求值)
  3. 11

因为两个操作数都不是字符串,布尔值转换成数字,然后执行算术的求和。

例4:数字和对象

var result = 15 + {}; // "15[object Object]"

解析:

  1. "15 + {}" (第二操作数是个对象,应用规则1将对象转换为原始类型字符串"[object Object]")
  2. 15 + "[object Object]" (使用规则2将数字15转换成字符串 "15")
  3. "15" + "[object Object]" (字符串连接)
  4. "15[object Object]"

第二个对象操作数转为字符串值,因为valueOf()方法返回对象本身,它不是原始值,toString() 方法就会被调用并返回字符串,第二个操作数现在是字符串了,因此数字也被转换为字符串,最后执行两个字符串的连接。

Example 5: 数字和null

var result = 8 + null; // 8

解析:

  • 8 + null (因为两个操作数都不是字符串,基于规则3将null转为数字0)
  • 8 + 0 (数字相加)
  • 8

因为操作数不是对象也不是字符串,null被转换成数字,然后计算数字的和。

Example 6: 字符串和null

var result = "queen" + null; // "queennull"

解析:

  • "queen" + null (因为第一个操作数是字符串,基于规则2将null转成字符串"null")
  • "queen" + "null" (字符串连接)
  • "queennull"

因为第一个操作数是字符串,null转成字符串,然后进行字符串连接。

Example 7:数字和undefined

var result = 12 + undefined; // NaN

解析:

  • 12 + undefined (因为操作数都不是对象或字符串,基于规则3将undefined转为数字NaN)
  • 12 + NaN (数字相加)
  • NaN

因为操作数都不是对象或字符串,undefined转为数字:NaN,对数字和NaN进行相加求值等于NaN.

可以在JsBin中看这些例子

总结

为了避免潜在的问题,不要对对象进行使用加法运算符,除非你清楚的定义了toString()或valueOf()方法。正如例子中所看到了,加法操作符有很多特定的情况。了解确切的转换场景能帮你避免未来的意外,祝coding愉快!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Javascript 按位左移运算符使用介绍(<<)

    按位左移运算符 (<<)左移表达式的位. result = expression1 << expression2 参数result 任何变量. expression1 任何表达式. expression2 任何表达式. 说明<< 运算符把 expression1 的所有位向左移 expression2 指定的位数.例如: var temptemp = 14 << 2变量 temp 的值为 56,因为 14 (即二进制的 00001110)向左移两位等于 56

  • javascript三元运算符用法实例

    三元运算符用法实例: 如名字表示的三元运算符需要三个操作数. 语法是 条件 ? 结果1 : 结果2;. 这里你把条件写在问号(?)的前面后面跟着用冒号(:)分隔的结果1和结果2.满足条件时结果1否则结果2. 复制代码 代码如下: <script type="text/javascript"> var b=5; (b == 5) ? a="true" : a="false"; document.write(" --------

  • js 与或运算符 || && 妙用

    首先出个题:如图: 假设对成长速度显示规定如下: 成长速度为5显示1个箭头: 成长速度为10显示2个箭头: 成长速度为12显示3个箭头: 成长速度为15显示4个箭头: 其他都显示都显示0各箭头. 用代码怎么实现? 差一点的if,else: Js代码 复制代码 代码如下: var add_level = 0; if(add_step == 5){ add_level = 1; } else if(add_step == 10){ add_level = 2; } else if(add_step

  • 浅谈JS运算符&&和|| 及其优先级

    今天看了一段YUI compressor压缩的js代码: userNum && (ind += index,ind >= userNum && (ind -= userNum),ind < 0 && (ind === -2 && (ind = -1),ind += userNum),selLi.removeClass("on"),$(selLi[ind]).addClass("on"));

  • JavaScript中按位“异或”运算符使用介绍

    按位"异或"运算符 (^)是对两个表达式执行按位异或.使用方法: 复制代码 代码如下: result = expression1 ^ expression2 其中result是任何变量. expression1是任何表达式. expression2是任何表达式. 按位"异或"运算符说明 ^ 运算符查看两个表达式的二进制表示法的值,并执行按位异或.该操作的结果如下所示: 0101 (expression1) 1100 (expression2) ---- 1001 (

  • JS按位非(~)运算符与~~运算符的理解分析

    那么,对于typeof var!=="number"的类型来说,进行运算时,会尝试转化成32位整形数据,如果无法转换成整形数据,就转换为NaN: JS在位运算上用了更简便的一种方法来实现这中运算,那么它的实现原理大致上可以这样理解: 复制代码 代码如下: var testData=-2.9; var testResult=(typeof testData==="number"&&!isNaN(testData)&&testData!=

  • JavaScript位移运算符(无符号) >>> 三个大于号 的使用方法详解

    d3.bisector(accessor)是一种指定参数accessor或者比较器函数返回一个二等分对象.返回的对象有left和right两个属性.分别类似于bisectLeft和bisectRight方法. 这个方法适用于对象数组而不适用于原始的简单数组. N>>>1就代表N的二进制右移一位,二进制右移一位就能得到中间值. 例如 10>>>1 10的二进制代码为 1010 向右移动一位后为 0101 即 5

  • JavaScript中的6种运算符总结

    JavaScript 运算符主要包括: 算术运算符 赋值运算符 比较运算符 三元运算符 逻辑运算符 字符串连接运算符 算术运算符 运算符 说明 例子 运算结果 + 加 y = 2+1 y = 3 - 减 y = 2-1 y = 1 * 乘 y = 2*3 y = 6 / 除,返回结果为浮点类型 y = 6/3 y = 2 % 求余,返回结果为浮点类型 要求两个操作数均为整数 y = 6%4 y = 2 ++ 递加,分为前加和后加 对布尔值和 NULL 将无效 y = 2 ++y(前加) y++(

  • Javascript 按位取反运算符 (~)

    复制代码 代码如下: result = ~ [数字] 所有一元运算符(如 ~ 运算符)都按照下面的规则来计算表达式的值: 复制代码 代码如下: 1. 如果应用于未定义的表达式或 null 表达式,则会引发一个运行时错误.2. 将对象转换为字符串.3. 如果可能,将字符串转换为数字. 否则,将引发运行时错误.4. 布尔值被视为数字(如果为 false,则为 0:如果为 true,则为 1). 运算符将应用于结果数字. ~ 运算符查看表达式的二进制表示形式的值,并执行位非运算. 表达式中的任何一位为

  • JavaScript三元运算符的多种使用技巧

    发现代码慢慢写多了的时候会不自觉的将if else 用 三元来替代,仅仅是未了让代码更简洁精辟,当然也有人说用三元可以让你有高潮的感觉.最近在写js 的时候也有这样的感觉,并且收集了一些小技巧,分享分享. 大鸟请跳过下面这段,大大鸟帮忙指正 ^__^ ====普及线==== 表达式 (expr1) ? (expr2) : (expr3) 在 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3. ============ 普通用法 当你发现

  • js中的 || 与 && 运算符详解

    js中逻辑运算符在开发中可以算是比较常见的运算符了,主要有三种:逻辑与&&.逻辑或||和逻辑非!. 当&&和|| 连接语句时,两边的语句会转化为布尔类型(Boolean),然后再进行运算,具体的运算规则如下: 1.&& 1.1两边条件都为true时,结果才为true: 1.2如果有一个为false,结果就为false: 1.3当第一个条件为false时,就不再判断后面的条件 注意:当数值参与逻辑与运算时,结果为true,那么会返回的会是第二个为真的值:如果结

随机推荐