JS的加法规则中,只有数字或者字符串相加,其他数据类型将转换成这两种数据类型。
下来将来讲解JS如何进行转换
转换规则
对于操作数先调用toPrimitive(obj, type),其中type在非Date默认为'number',否则为'string'。
type为number时它的执行步骤为:
- 如果是原始值,则返回其本身
- 如果是对象,则调用对象的valueOf(),如果是原始值,则返回原始值
- 否则,调用对象的toString(),结果是原始值,则返回
- 否则,报错TypeError
type为string时:2,3步骤调换。
加法规则
- 操作数中含有对象(Object,Function,Array),则将对象转成原始值(valueOf),如果返回的原始值不是基础类型值,则再调用toString()方法后,再进行相加。例如[1,2]转成[1,2]再转'1,2',如果无法转成string则报错。
- 操作数中含有字符串,则将其他操作数转成字符串相加。
- 其他情况,则将操作数调用Number()转成数字相加。
注意:对于多个操作数相加,会两两先转换相加,得到结果后再与后面的操作数相加,直到结束。
特殊情况
特殊情况就是第一个操作数是{},JS会将其解释为代码块。
例如{} + {}
// 第一个个{}会解释成代码块,所以+{}
// {}.valueOf()为{}
// {}.toString()为'[object Object]'
// + 一元操作符,相当于Number(),则Number('[object Object]'),返回NaN
{} + {} // NaN
{} + [] // 0