对于两个操作数都是数字或者字符串的,结果显而易见,都是数字的相加或者字符串的连接。
对于除此之外的其他情况,需要一些注意的点。如果其中一个是字符串或者转换为字符串的对象,另外一个操作数都将会转为字符串,加法将进行字符串的连接操作。
如果两个操作数都不是字符串(对象转为字符串,string-like)的,那么都将进行算术加法运算。
具体如下:
如果其中一个是对象,则会遵循对象到原始值得转换规则,转换为原始值。日期对象通过toString()方法执行转换,其他对象先使用valueOf,如果返回原始值则使用该原始值,否则继续使用toString()。由于多数对象都不具备可用valueOf方法返回原始值(一般返回对象本身),因此它们通过toSting方法执行转换。
在进行了对象到原始值的转换后,如果其中一个操作数是字符串的话,另一个操作数也会转换为字符串,然后进行字符串连接。
否则,两个操作数将转换为数字(NaN),然后进行加法操作。
下面是一些例子,重点记住原始值转为数字时的具体值,如null => 0, false => 0, true => 1, undefained => NaN等。
console.log(1 + 2) // 3 执行加单加法
console.log(1 + "2") // "12",转换字符串连接
console.log(1 + null) // "1null" ,null 转换为0相加 null
console.log('1' + null) // 1 , 转换为"null" 连接
console.log(1 + true) // 2, true转换为1 加法
console.log(1 + {}) // 1[object Object],对象转字符串连接
console.log(true + true) // 2,true转为1加法
console.log(null + null) // 2,null转为 0加法
console.log(1 + undefined) // NaN,undefined转为NaN 加法
console.log(undefined + undefined) // NaN,undefined转为NaN 加法
console.log(1 + []) // "1",[]转为空字符串连接