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 方法。
网友评论