ToPrimitive(obj, Number) 和 ToPrimitive(obj, String) 调用顺序不同在于: 区别在于调用 toString 方法和 valueOf 方法的顺序,区分这一点就行了。
ToPrimitive(obj, Number) ==> Number({})
- 如果 obj 是基本类型,直接返回
- 否则,调用 valueOf 方法,如果得到原始值,则返回
- 否则,调用 toString 方法,如果得到原始值,则返回
- 否则,报错
ToPrimitive(obj, String) ==> Number({})
- 如果 obj 是基本类型,直接返回
- 否则,调用 toString 方法,如果得到原始值,则返回
- 否则,调用 valueOf 方法,如果得到原始值,则返回
- 否则,报错
一元运算 +a
+a 等同 ToPrimitive(obj, Number)
二元运算 a+b
a+b 等同 ToPrimitive(obj) + ToPrimitive(obj)
- 当 + 两边有一个是字符串,则按字符串进行拼接
- 否则,转到 number 进行计算
ToPrimitive(arr)
ToPrimitive([]) => [].tostring() => [].join(“,”) => “”
ToPrimitive([1, 2, 3]) => [1, 2, 3].tostring() => [1, 2, 3].join(“,”) => “1,2,3”
ToPrimitive(obj)
ToPrimitive({}) => {}.toString() => “[object Object]”
ToPrimitive({ a: 1, b: 2 }) => { a: 1, b: 2 }.toString() => “[object Object]”
其他
console.log(1 + null); //1
console.log([] + []); //‘’
console.log([] + {}); //‘[object Object]’
console.log({} + {}); //‘[object Object][object Object]’