代码解释如下:
console.log(1 + 1) // 2, 走了第一条通道
console.log(1 + null) // 1, 走了第一条通道,因为Number(null)为0
console.log(1 + undefined) // NaN, 走了第一条通道,因为Number(undefined)为NaN
console.log(1 + '1') // '11', 走了第二条通道
console.log('1'+ undefined) // '1undefined', 走了第二条通道
console.log('1'+ null) // '1null', 走了第二条通道
console.log([1,2] + 1) // '1,21', 走了第三条通道,因为[1,2].valueOf()值还是[1,2],不为原始类型,[1,2].toString()的值为'1,2',然后进行拼接结果为'1,21'
console.log([1,2] + {a:3}) // '1,2[object Object]', 走了第三条通道,因为({a:3}).valueOf()值还是{a:3},不为原始类型,({a:3}).toString()的值为'[object Object]',然后进行拼接结果为'1,2[object Object]'
// 特别说明一下第三条通道,因为下面相加的包含对象类型,故对象类型先调用valueOf方法,
// 在定义对象时,自己写的valueOf方法进行覆盖,故返回1,因此2 === 1 + 1为true,其他同理
const obj1 = {
valueOf: function () {
return 1;
}
};
const obj2 = {
toString: function () {
return 2;
}
};
const obj3 = {
valueOf: function () {
return 1;
},
toString: function () {
return 2;
}
};
console.warn('是否相等', 2 === 1 + obj1); // true
console.warn('是否相等', 3 === 1 + obj2); // true
console.warn('是否相等', 3 === 1 + obj2); // false