これは 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
メソッドと同様に、プロパティへのアクセスごとに増加する値が返されます。