JavaScript 里面不一样的类型作加法以前,须要作各类转换,这里作一个比较完善的总结。javascript
运算双方存在对象时java
若是有一个对象,那么先把它转换成基本类型值数组
转换以后,若是有字符串,另外一个值先转换成字符串,而后再作链接操做code
若是没有,把两者转换成数字再相加对象
若是两者都是基本类型值,先检查是否有字符串类型,若是有就作链接操做;若是没有,就把两者转换成数字相加。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"
;而后是一个字符串加一个数字,作链接操做。
var result = 10 + true // 11
两者都是基本类型值,且没有字符串,因此把true
转换成数字相加。
var result = 15 + {} // "15[object Object]"
首先对对象作转换,对象的valueOf
仍是自身,因此用toString()
来转换,{}.toString()
的结果是"[object Object]"
,因此最后的结果就是"15[object Object]"
。
var result = 8 + null // 8
null 转为0,再作加法运算。
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。
参考: