让 a == 1 && a==2 && a==3 的结果为 true
这不是答案,只是补充
使用 valueOf
和 toString
可达到目的。单个重载实现的情况下,隐藏转换调用都比较明确。但如果两个都实现了,隐式转换的时候到底该调哪个?
a == 1
的时候是用 valueOf()
还是 toString()
来转换的?a == "1"
的时候呢?a + "1"
呢?又或者 "1" + a
?直觉除了 a == 1
使用 valueOf()
之外,都应该使用 toString()
,但实测全是使用的 valueOf()
—— 说实在的,我很迷茫。
不过还有一个 Symbol.toPrimitive
,在隐式转换的时候优先级比前二者更高,比如
class A {
value = 0;
[Symbol.toPrimitive](hint) {
console.log(hint);
switch (hint) {
case "string":
return this.value;
// case "number":
// case "default":
default:
return ++this.value;
}
}
}
其实可以达到同样的效果,而且 console.log(hint)
输出都是 default
。同样不是很清楚在什么时候 hint
会是 "string", "number", "default"
中的哪一个。但是实测在 ${a} 124
的时候 hint 是 "string"
,在 ~~a
的时候 hint 是 "number"
。
13 回答13k 阅读
7 回答2.2k 阅读
3 回答1.4k 阅读✓ 已解决
6 回答1.4k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.4k 阅读✓ 已解决
6 回答1.2k 阅读