减法,乘法,除法在运算过程中,都是先将操作数,转成数值,再进行后续操作,而加法,却有所不一样。
1)两个数值相加
当两个数值相加时,加法运算符,跟减法操作符一样,直接求和。
var a = 1
var b = 2
a + b // 3
2)字符串相加
当两个字符串相加时,加法运算符,这表现为字符串拼接。
var a = '1'
var b = '2'
a + b // '12'
注意:只有有一个操作数为,字符串,都视为字符串拼接,另一个操作数,也会先转成字符串
3) 其他原始类型相加
true + false // 1
true + null // 1
true + undefined // NaN
null + undefined // NaN
4) 对象的相加
如果操作数是一个对象,必须先将其转成一个原始类型,再相加
var obj = { p: 1 }
obj + 2 // '[object Object]2'
上面代码中,对象obj转成原始类型的值为[object Object],再与2相加就得到了上面的结果。
对象转成原始类型的值,规则如下:
首先自动调用对象的valueOf方法
var obj = {
p: 1
valueOf() {
return this.p
}
}
obj + 2 // 3
再调用toString方法,将其转化为字符串
var obj = { p: 1 };
obj.valueOf().toString() // "[object Object]"
这里有一个特例,如果操作数是一个Date对象的实例,那么会优先执行toString方法
var obj = new Date();
obj.valueOf = function () { return 1 };
obj.toString = function () { return 'hello' };
obj + 2 // "hello2"