数据类型转化

98 阅读1分钟

今天看到了一个有趣的题: 当a的值为多少时,下列代码会输出1?

var a = ?;
if (a == 1 && a == 2 && a == 3) {
    console.log(1);
}

第一眼,我看到都有点懵了,后面还是去查了一下资料才知道。

当 a == 1 进行比较的时候,会做一个隐式类型转换, 转换的步骤是:

  1. 先执行 valueOf() 的方法
  2. 然后再 执行 toString() 方法

然后,这时候我们就可以进行一些骚操作了。

下面是我根据这个步骤进行修改了一下

var a = {
    value: 0,
    toString() {
        return ++this.value;
    }
};

if (a == 1 && a == 2 && a == 3) {
    console.log(1);
}

输出如下:

image.png

这边 a 会先进行 隐式类型转换, 先执行 valueOf(),后面在执行toSting(); 因此咱们这边就重写了一下toString()方法,让a的值++,继而在每次执行 == 运行时,a 的值都会发生改变。