一、重写valueOf() // 1 var a = { value: 0, valueOf () { return ++this.value } } if (a == 1 && a == 2 && a == 3) { console.log('成立') }
二、重写valueOf()和toString() var a = { value: 0, toString () { return ++this.value } } if (a == 1 && a == 2 && a == 3) { console.log('成立') }
三、重写Symbol.toPrimitive var a = { value: 0, [Symbol.toPrimitive] (hint) { if (hint === 'default') { return ++this.value } } } if (a == 1 && a == 2 && a == 3) { console.log('成立') }
四、定义class并重写valueOf() class A { constructor () { this.value = 0 } valueOf () { return ++this.value } } var a = new A() if (a == 1 && a == 2 && a == 3) { console.log('成立') }
五、利用数组转为字符串会隐式调用join() let a = [1, 2, 3] a['join'] = function () { return this.shift() } if (a == 1 && a == 2 && a == 3) { console.log('成立') }
六、定义class继承Array并重写join() class A extends Array { join = this.shift } var a = new A(1, 2, 3) if (a == 1 && a == 2 && a == 3) { console.log('成立') }