对象转原始类型的过程是怎样的?
对象转原始类型会调用内部方法 ToPrimitive,过程如下:
转换流程
- 调用
Symbol.toPrimitive()(如果存在) - 否则根据上下文调用
valueOf()和toString():- 数字上下文(如
-a,a - 1):先valueOf(),再toString() - 字符串上下文(如
String(a),a + ''):先toString(),再valueOf()
- 数字上下文(如
Symbol.toPrimitive 优先级最高
let obj = {
[Symbol.toPrimitive](hint) {
if (hint === 'number') return 10
if (hint === 'string') return 'hello'
return 'default'
}
}
+obj // 10 (hint = 'number')
`${obj}` // 'hello' (hint = 'string')
obj + '' // 'default'(hint = 'default')默认行为
let arr = [1, 2, 3]
arr.toString() // '1,2,3'
arr.valueOf() // [1, 2, 3](返回自身)
arr + '' // '1,2,3'(字符串上下文,调 toString)
arr - 1 // NaN(数字上下文,valueOf 返回数组 → toString → '1,2,3' → 1,2,3 → NaN)
+[]结果是0:[]→toString()→''→Number('')→0