Appearance
对象隐式转换
来源:
js/基础/2转化.html,对 JS 对象在隐式转换中的Symbol.toPrimitive、toString、valueOf调用机制进行实例化验证。
一、转换触发场景
隐式类型转换通常发生在:
- 不同类型之间的加减乘除运算
- 使用
==和!=判断时 if语句里的条件判断
二、对象在 if 判断中始终为真
即使对象定义了 Symbol.toPrimitive 返回 false,在 if 判断中对象始终为真,不会触发隐式转换。
js
三、转换调用优先级
对象转原始值时,按以下顺序调用:
- 调用
Symbol.toPrimitive(hint)(如果存在) - 调用
valueOf(),如果返回原始值则使用 - 调用
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