Can (a == 1 && a == 2 && a == 3) ever evaluate to true?

a == 1 && a == 2 && a == 3 可能为 true 吗?

如果变量 a 是一个基本 Number 类型,这是不可能为 true 的,因此解题思路也需要从变量 a 的类型及(对象)转换(基本类型)上来考虑。

方案一:

        const a = {
            value: 1,
            toString: () => {
                return a.value++
            }
        }
        console.log(a == 1 && a == 2 && a == 3) // true

将 a 定义为一个对象,并重写了其 toString 方法。因此在每次进行判断时,按照规则,== 号两边出现了对象类型,另一边是 Number 类型,需要调用 a 对象 toString 方法,toString 方法的返回值会作为对象转为基本类型的值,我们每次将 value 属性加 1。同样,如果按照相同的方式重写 valueOf 方法,也是可以达到同样目的的

方案二:

        let value = 0;
        Object.defineProperty(window, 'a', {
            get: () => {
                return ++value
            }
        })
        console.log(a == 1 && a == 2 && a == 3) // true

将 a 作为属性,挂载在 window 对象当中,重写其 getter 方法。

你可能感兴趣的:(Can (a == 1 && a == 2 && a == 3) ever evaluate to true?)