前言
首先,我们来看个demo
let a = {value: 1,toString() {// console.log("toString")return this.value++;}
}
看一下输出结果:
console.log(a === 1 && a === 2 && a === 3) // falseconsole.log(a == 1 && a == 2 && a == 3) // true
结论:通过Object的toString()可以实现 a1 && a2 && a3 而并不能实现 a=1 && a=2 && a=3
然后,加上万能的console
let a = {value: 1,toString() {console.log("toString")return this.value++;}
}
console.log(a === 1 && a === 2 && a === 3) // false
console.log("--------------------------------------")
console.log(a == 1 && a == 2 && a == 3) // true
输出结果:
也就是说使用 == 隐式转换使得Object调用了toString()
举例
使a == 1&&a == 2&&a == 3为true的方法
// 方法一:通过toString()实现
let i1 = {i: 1,toString() {return this.i++;}
}
console.log("toString() => ", i1 == 1 && i1 == 2 && i1 == 3) // true// 方法二:通过valueOf()实现
let i2 = {i: 1,valueOf() {return this.i++;}
}
console.log("valueOf() => ", i2 == 1 && i2 == 2 && i2 == 3) // true// 方法三:Object.defineProperty() 实现
let value = 1;
Object.defineProperty(window, "c", {get: function() {return value++;}
})
console.log("Object.defineProperty() => ", c == 1 && c == 2 && c == 3)// 方法四:通过Proxy实现
let d = new Proxy({}, {value: 1,get(target, key) {return () => this.value++;}
})
console.log("new Proxy() => ", d == 1 && d == 2 && d == 3)// 方法五:Symbol.toPrimitive实现
let e = {value: 1,[Symbol.toPrimitive]: () => {return e.value++;}
}
console.log("Symbol.toPrimitive => ", e == 1 && e == 2 && e == 3)// 方法六:数组的shift()方法
let f = [1, 2, 3]
f.join = f.shift;
console.log("shift() => ", f == 1 && f == 2 && f == 3)// 方法七:数组的pop()方法
let g = [3, 2, 1]
f.join = f.pop;
console.log("pop() => ", g == 1 && g == 2 && g == 3)
使a === 1&&a === 2&&a === 3为true的方法
// 方法1:Object.defineProperty实现let value = 1;Object.defineProperty(window, "a", {get:function() {return value++;}});console.log(a === 1 && a === 2 && a === 3) // true// 方法2:Proxy实现let b = {number: 1};b = new Proxy(b, {get(target, key) {return target[key]++;}});console.log(b.number === 1 && b.number ===2 && b.number ===3) // true