对象转原始类型的过程是怎样的?

对象转原始类型会调用内部方法 ToPrimitive,过程如下:

转换流程

  1. 调用 Symbol.toPrimitive()(如果存在)
  2. 否则根据上下文调用 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

同分类其他题目