前言
首先,我们来看个demo
let a = {
value: 1,
toString() {
// console.log("toString")
return this.value++;
}
}
看一下输出结果:
console.log(a === 1 && a === 2 && a === 3) // false
console.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