Skip to content
快看这页儿写了啥...

如何使 (a == 1 && a == 2 && a == 3) 成立?

题干

js
(a == 1 && a == 2 && a == 3) // ?
  • 对象原始值转换

题解

  • 利用 obj[Symbol.toPrimitive](hint) 方法,使其每次返回不同的值。

  • 利用 == 运算符会进行隐式类型转换的特性,重写对象的 toStringvalueOf 方法,使其每次返回不同的值。

  • 利用 Object.defineProperty 方法劫持,定义一个 get 函数,使其每次返回不同的值。

🌰:

js
// 方法一
let a = { value: 0 }
a.toString = function() {
  return this.value += 1;
}
console.log(a == 1 && a == 2 && a == 3); // true


// 方法二
let a = [1,2,3];
a.toString = a.shift;
console.log(a == 1 && a == 2 && a == 3); // true


// 方法三
let a = { value: 0 }
a.valueof = function(){
  return this.value += 1;
}
console.log(a == 1 && a == 2 && a == 3); // true


// 方法四
Object.defineProperty(window,'a',{
  get:function() {
    this.value ? this.value++ : this.value = 1;
    return this.value;
  }
})
console.log(a == 1 && a == 2 && a == 3); // true


// 方法五
let a = { value: 0 }
a[Symbol.toPrimitive] = function(hint) {
  console.log(hint); // default 
  return this.value += 1;
}
console.log(a == 1 && a == 2 && a == 3); // true

对象原始值转换步骤:

对象原始值转换时,JS 会尝试查找并调用三个对象方法:

  • 调用 obj[Symbol.toPrimitive](hint) —— 带有 symbolSymbol.toPrimitive(系统 symbol)的方法,如果这个方法存在的话。

  • 否则,如果 hint"string" —— 尝试调用 obj.toString()obj.valueOf(),无论哪个存在。

  • 否则,如果 hint"number""default" —— 尝试调用 obj.valueOf()obj.toString(),无论哪个存在。

详见 现代JavaScript - 对象原始值转换 一节。

扩展

现代JavaScript - 对象原始值转换

贡献者

isboyjc's avatar isboyjc

浏览量(PV)  次  ·  独立访客(UV)  人次
不正经的前端 | 八股 · 欢迎 star ⭐