(a== 1 && a ==2 && a==3) ever evaluate to true? 幾種解法分析

1. Object.defineProperty

var val = 1;
Object.defineProperty(window, 'a', {
    configurable: true,
    get: function() {
        console.log(`觸發第${val}次get`);
        return val++
    }
})
if(a == 1 && a == 2 && a == 3) {
    console.log('yes!')
}
觸發第1次get
觸發第2次get
觸發第3次get
yes!

2. toString() valueOf()

const b = {
  i: 1,
  toString: function () {
    return this.i++;
  }
}
if(b == 1 && b == 2 && b == 3) {
  console.log('Hello World!');   // Hello World!
}

const b = {
  i: 1,
  valueOf: function () {
    return this.i++;
  }
}
if(b == 1 && b == 2 && b == 3) {
  console.log('Hello World!');   // Hello World!
}
比較會隱式調用toString或者valueOf方法,若是原始類型的值和對象比較,對象會轉爲原始類型的值,再進行比較。對象轉換成原始類型的值,算法是先調用valueOf方法,若是返回的仍是對象,再接着調用toString方法

3. array.join = array.shift

var a = [1,2,3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);

a == 1 ,此時 a 返回的就是shift返回的第一個元素 1 ,比較完以後  a = [2,3]
a == 2 ,此時 a 返回的就是shift返回的第一個元素 2 ,比較完以後  a = [3]
a == 3 ,此時 a 返回的就是shift返回的第一個元素 3 ,比較完以後  a = []
數組也是對象,數組的toString 方法返回一個字符串,該字符串由數組中的每一個元素的 toString() 返回值經調用 join() 方法鏈接(由逗號隔開)組成。

原文連接: https://arronf2e.github.io/a-1-and-a-2-and-a3-ever-evaluate-to-true-ji-chong-jie-fa-fen-xi.htmlhtml

相關文章
相關標籤/搜索