(a ==1 && a== 2 && a==3) 有可能是 true 吗?
第一种解法:
const a = {
i: 0,
toString: function() {
return a.i++
}
}
if (a == 1 && a == 2 && a == 3) {
console.log('成功')
}
// 之所以成功,因为使用了松散相等的运算符,使用松散相等时,如果其中一个操作数与另一个类型不同,则 JS 引擎将尝试将一个操作转换为另一个类型。
// 在左边对象、右边的数字的情况下,它会尝试将对象转换为一个数,首先通过调用valueOf
如果是可调用的。否则,它会调用toString
方法。
第二种解法:
const a_ = 1;
const a = 2;
const _a = 3;
if (a_ == 1 && a == 2 && _a == 3) {
console.log('成功')
}
// 有三个不同的变量来声明,本质上没有做到题设(不推荐)
第三种解法:
let val = 0;
Object.defineProperty(window, 'a', {
get: function() {
return ++val
}
})
if (a == 1 && a == 2 && a == 3) {
console.log('成功')
}
// 使用 get, 让 a 返回三个不同的值,在真正的代码逻辑中不推荐使用