Skip to content

类型转换

https://www.yuque.com/qinsjs/jsinfo/vb3cyu

  1. 布尔运算, 均为 true
  2. 数学运算
  3. 符串转换

Hint

具体规范 https://tc39.es/ecma262/#sec-toprimitive

具体有三种

  • "string": 对象 -> 字符串 时
  • "number": 对象 -> 数字 时
  • "default": 不确定时, 很少发生

"string" 举例:
{ [obj]: "value" },此时,obj 就是这种情况

"number" 举例:

  • 显示转换:Number(obj)
  • 数学运算:+objdate - date2
  • 大于小于:obj1 > obj2

"default" 在少数情况下发生,当运算符“不确定”期望值的类型时。

  • 二元的加 如 obj1 + obj2
  • 与 字符、数字、symbol 进行 == 比较时

todo 这里可以深入实验一下。

转换的选择

js
if (Symbol.toPrimitive) {
  // 优先使用 Symbol.toPrimitive
} else if (hint == "string") {
  // 调用 toString
  // 没有 toString 则使用 valueOf
} else {
  // "number" 和 "default"
  // 调用 valueOf
  // 没有 valueOf 则使用 toString
}

这三个 方法都必须返回 一个原始值。
Symbol.toPrimitive 如果不是原始值,就会 error。
而 toString 或 valueOf 则会忽略。

toPrimitive 更严格, toString 或 valueOf 是历史的包袱

js
{
  [Symbol.toPrimitive](hint) { ... }
}

toString 方法返回一个字符串 "[object Object]"。

valueOf 方法返回对象自身。历史问题