Skip to main content

1.使 a==1&&a==2&&a==3 成立

对象 进行==比较时调用的方法

let a = {
i: 0,
valueOf() {
console.log('调用valueOf')
return {}
},
toString() {
console.log('调用toString')
return 1
},
}
a == 1
//调用valueOf
//调用toString
//true

解法 1

改写对象的 valueOf,toString 方法

let a = {
i: 0,
valueOf() {
return ++this.i
},
}
a == 1 && a == 2 && a == 3
let a = {
i: 0,
toString() {
return ++this.i
},
}
a == 1 && a == 2 && a == 3

数组 进行==比较时调用的方法

数组的 toString 方法:Array 对象覆盖了 Object 的 toString 方法。对于数组对象,连接数组并返回一个字符串,其中包含用逗号分隔的每个数组元素。

数组转 字符串时,先对

let a = [1, 2, 3]
a.__index = 0
a.toString = function () {
console.log('toString')
return a[a.__index++]
}
a.valueOf = function () {
console.log('valueOf')
}
console.log(a == 1 && a == 2 && a == 3)
let a = [1, 2, 3]
a.join = a.shift()
console.log(a == 1 && a == 2 && a == 3)

proxy

let a = new Proxy(
{},
{
i: 1,
get: function () {
return () => this.i++
},
}
)
console.log(a == 1 && a == 2 && a == 3)

Symbol.toPrimitive

对象的 Symbol.toPrimitive 属性,指向一个方法。该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。

let a = {
i: 0,
[Symbol.toPrimitive]: function (val) {
return ++this.i
},
}
console.log(a == 1 && a == 2 && a == 3)

// 通过闭包把i放进去
let a = {
[Symbol.toPrimitive]: ((i) => () => {
console.log(i)
return ++i
})(0),
}

console.log(a == 1 && a == 2 && a == 3)

Object.defineProperty

let current = 1
Object.defineProperty(window, 'a', {
get() {
return current++
},
})

//通过闭包把i放进去
Object.defineProperty(window, 'a', {
get: (
(i) => () =>
i++
)(1),
})
console.log(a === 1 && a === 2 && a === 3)