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