详解加法运算符

JavaScript 里面不一样的类型作加法以前,须要作各类转换,这里作一个比较完善的总结。javascript

基本转换规则

  1. 运算双方存在对象时java

    • 若是有一个对象,那么先把它转换成基本类型值数组

    • 转换以后,若是有字符串,另外一个值先转换成字符串,而后再作链接操做code

    • 若是没有,把两者转换成数字再相加对象

  2. 若是两者都是基本类型值,先检查是否有字符串类型,若是有就作链接操做;若是没有,就把两者转换成数字相加。ip

对象转换成基本类型值

  • 若是是 Date 对象,那么用toString()字符串

  • 其它状况下,用valueOf()get

  • 其余状况下(valueOf()不存在或者不返回基本类型值),那么用toString()it

举例

数字加字符串

var result = 1 + '5' // 15

两者都是基本类型值,且有字符串,所以作链接操做。io

数字加数组

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

数组是引用类型,先用valueOf()进行转换,可是数组的valueOf()的结果仍是原来的数组,因此用toString()方法获得一个字符串"1, 3, 5";而后是一个字符串加一个数字,作链接操做。

数字加 boolean

var result = 10 + true // 11

两者都是基本类型值,且没有字符串,因此把true转换成数字相加。

数字加对象

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

首先对对象作转换,对象的valueOf仍是自身,因此用toString()来转换,{}.toString()的结果是"[object Object]",因此最后的结果就是"15[object Object]"

数字加 null

var result = 8 + null // 8

null 转为0,再作加法运算。

字符串加 null

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

数字加 undefined

var result = 12 + undefined // NaN

undefined转换成数字,获得NaN,所以加法的结果就是NaN

[] + {}

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

两者都是对象,并且两者的valueOf方法的结果都是自身,因此要调用toString方法。空数组调用的结果是个空字符串,空对象调用的结果是"[object Object]", 字符串链接以后的结果就是"[object Object]"

{} + []

var result = {} + [] // 0

在这里,{}被解析成一个空的 block,所以实际上解析成这样:

{ // empty block }
+ []

就是把一个空数组转换成数值,调用valueOf以后仍是自身,所以调用toString, 获得一个空字符串,转换成数字0。

参考:

相关文章
相关标签/搜索