これは 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が成り立ちます。 - 2 回目の比較:
a.valueOf()は2を返すため、a == 2が成り立ちます。 - 3 回目の比較:
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メソッドと同様に、プロパティへのアクセスごとに増加する値が返されます。