写在前面
此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
为了备战 2021 春招
每天一题,督促自己
从多方面多角度总结答案,丰富知识
下面代码中 a 在什么情况下会打印 1?
简书整合地址:前端 100 问
正文回答
因为==
会进行隐式类型转换 所以我们重写 toString
方法就可以了
引用类型在比较运算符时候,隐式转换会调用本类型 toString
或 valueOf
方法
var a = {
i: 1,
toString() {
return a.i++;
},
};
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}
// or
var a = { num: 0 };
a.valueOf = function () {
return ++a.num;
};
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}
// or
var a = [1, 2, 3];
a.join = a.shift;
if (a == 1 && a == 2 && a == 3) {
console.log("1");
}
// or ES6的symbol
let a = { [Symbol.toPrimitive]: ((i) => () => ++i)(0) };
if (a == 1 && a == 2 && a == 3) {
console.log("1");
}
网友评论