趣题记录
下面代码中 a 在什么情况下会打印 1?
var a = ?; if(a == 1 && a == 2 && a == 3){ console.log(1); }
方法一、使用toString()
let aa = { i: 1, toString () { console.log(`i`,aa.i) return aa.i++ } } if(aa == 1 && aa == 2 && aa == 3) { console.log(1); }
方法二、利用 valueOf()
let a = { i: 1, valueOf () { return a.i++ } } if(a == 1 && a == 2 && a == 3) { console.log(1); }
方法三、利用数组的 join 和 shift
var a = [1,2,3]; a.join = a.shift; if(a == 1 && a == 2 && a == 3) { console.log(1); }
方法四、ES6的Symbol
let a = { [Symbol.toPrimitive]: (i => () => ++i) (0) }; if(a == 1 && a == 2 && a == 3) { console.log(1); }
方法五、Object.defineProperty
Object.defineProperty(window, 'a', { get: function() { return this.value = this.value ? (this.value += 1) : 1; } }); if(a == 1 && a == 2 && a == 3) { console.log(1); }