這是一篇關於 JavaScript 特性的小短文,計劃有空就會寫寫這種小知識點的文章
在 JavaScript 中,定義一個變數 a,使得:
a == 1 && a == 2 && a == 3 === true
解法 1:重寫 valueOf
方法#
- 程式碼範例:
let value = 0;
const a = {
valueOf: function() {
return ++value;
}
};
console.assert(a==1 && a==2 && a==3, true);
-
原理:
- 當
a
被用於比較操作(如a == 1
)時,JavaScript 引擎調用a.valueOf()
來獲取其原始值。 - 我們重寫
valueOf
方法,使其每次調用時返回遞增的值。
- 當
-
執行結果:
- 第一次比較:
a.valueOf()
返回1
,所以a == 1
。 - 第二次比較:
a.valueOf()
返回2
,所以a == 2
。 - 第三次比較:
a.valueOf()
返回3
,所以a == 3
。
- 第一次比較:
解法 2:使用 Proxy
物件#
- 程式碼範例:
let value = 0;
const a = new Proxy({}, {
get: function(target, name) {
return ++value;
}
});
console.assert(a.anyProperty == 1 && a.anyProperty == 2 && a.anyProperty == 3, true);
-
原理:
Proxy
物件用於建立一個物件的代理,允許我們攔截和自定義基本操作,如屬性訪問。- 我們攔截對
a
的任何屬性的訪問,並在每次訪問時返回遞增的值。
-
執行結果:
- 與
valueOf
方法類似,每次屬性訪問都會返回遞增的值。
- 與