Skip to content

对象隐式转换

来源:js/基础/2转化.html,对 JS 对象在隐式转换中的 Symbol.toPrimitivetoStringvalueOf 调用机制进行实例化验证。


一、转换触发场景

隐式类型转换通常发生在:

  • 不同类型之间的加减乘除运算
  • 使用 ==!= 判断时
  • if 语句里的条件判断

二、对象在 if 判断中始终为真

即使对象定义了 Symbol.toPrimitive 返回 false,在 if 判断中对象始终为真,不会触发隐式转换。

js

三、转换调用优先级

对象转原始值时,按以下顺序调用:

  1. 调用 Symbol.toPrimitive(hint)(如果存在)
  2. 调用 valueOf(),如果返回原始值则使用
  3. 调用 toString(),如果 valueOf 未返回原始值
js

四、hint 参数与运算符的关系

Symbol.toPrimitive 接收的 hint 参数由运算符决定:

运算符/场景hint 值
模板字符串 `${obj}`"string"
字符串拼接 '123' + obj"default"
加法 obj + 10"default"
一元 +obj"number"
除法 obj / 10"number"
乘法 obj * 10"number"
js

五、转换算法总结

调用 obj[Symbol.toPrimitive](hint)
  ↓ 不存在
hint === "string" ?
  ├─ 是 → 优先 toString(),失败再 valueOf()
  └─ 否 → 优先 valueOf(),失败再 toString()

+ 运算符特殊规则:

  • 操作数中存在字符串 → 进行字符串拼接
  • 操作数是对象 → 先 ToPrimitive 获取原始值,通常得到字符串
  • 最后执行 + 操作

六、注意事项

  • 整数直接调用方法会报错,因为 . 被识别为小数点,需加括号:(123).toString()
  • 浮点数可直接调用:1.23.toString()
  • Object.prototype.toString.call(obj) 不受 Symbol.toPrimitive 影响,返回的是内部 [[Class]] 标记
js