JavaScript 内里差别的范例做加法之前,需要做种种转换,这里做一个比较完善的总结。
基础转换规则
运算两边存在对象时
假如有一个对象,那末先把它转换成基础范例值
转换以后,假如有字符串,另一个值先转换成字符串,然后再做衔接操纵
假如没有,把两者转换成数字再相加
假如两者都是基础范例值,先搜检是不是有字符串范例,假如有就做衔接操纵;假如没有,就把两者转换成数字相加。
对象转换成基础范例值
假如是 Date 对象,那末用
toString()
别的状况下,用
valueOf()
其他状况下(
valueOf()
不存在或许不返回基础范例值),那末用toString()
举例
数字加字符串
var result = 1 + '5' // 15
两者都是基础范例值,且有字符串,因而做衔接操纵。
数字加数组
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。
参考: