类型转换
https://www.yuque.com/qinsjs/jsinfo/vb3cyu
- 布尔运算, 均为 true
- 数学运算
- 符串转换
Hint
具体规范 https://tc39.es/ecma262/#sec-toprimitive
具体有三种
- "string": 对象 -> 字符串 时
- "number": 对象 -> 数字 时
- "default": 不确定时, 很少发生
"string" 举例:{ [obj]: "value" },此时,obj 就是这种情况
"number" 举例:
- 显示转换:
Number(obj) - 数学运算:
+obj、date - 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 方法返回对象自身。历史问题