今天看到了一个有趣的题: 当a的值为多少时,下列代码会输出1?
var a = ?;
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}
第一眼,我看到都有点懵了,后面还是去查了一下资料才知道。
当 a == 1 进行比较的时候,会做一个隐式类型转换, 转换的步骤是:
- 先执行 valueOf() 的方法
- 然后再 执行 toString() 方法
然后,这时候我们就可以进行一些骚操作了。
下面是我根据这个步骤进行修改了一下
var a = {
value: 0,
toString() {
return ++this.value;
}
};
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}
输出如下:
这边 a 会先进行 隐式类型转换, 先执行 valueOf(),后面在执行toSting(); 因此咱们这边就重写了一下toString()方法,让a的值++,继而在每次执行 == 运行时,a 的值都会发生改变。