オーバーライドするのと同じように、js カスタム ハッシュでオブジェクトを指定する方法はありますか
__hash__()
Python では、誰かが特定のオブジェクトを辞書にハッシュする方法を定義しましょう。
私の根底にある質問は、jsオブジェクトを連想配列に入れるために使用されるハッシュ関数は何ですか?それをオーバーライドできますか?
オーバーライドするのと同じように、js カスタム ハッシュでオブジェクトを指定する方法はありますか
__hash__()
Python では、誰かが特定のオブジェクトを辞書にハッシュする方法を定義しましょう。
私の根底にある質問は、jsオブジェクトを連想配列に入れるために使用されるハッシュ関数は何ですか?それをオーバーライドできますか?
オブジェクトをキーとして使用するということですが、そのキーに再度アクセスするにはどうすればよいですか?
魔法のメソッドはtoString()
. JS のすべてのオブジェクトは文字列キーを使用しtoString()
、文字列でない場合はメソッドが呼び出されます。
var objA = {
data: 'yay',
toString: function() {
return 'value_as_key';
}
};
var objB = {
data: 'some other totally data thing',
toString: function() {
return 'value_as_key';
}
}
var foo = {};
foo[objA] = 'abc';
foo[objB] = 'def';
foo['value_as_key'] = 'qwe';
foo.value_as_key = 'omg';
foo[objA]; // 'omg'
foo[objB]; // 'omg'
foo['value_as_key']; // 'omg'
foo.value_as_key; // 'omg'
通常、オブジェクト全体をキーとして使用することは望ましくありません。特に、独自のメソッドを作成しない場合は、基本的なオブジェクトtoString()
のデフォルトのtoString()
メソッドはそれほど素晴らしいものではないため...
({a:123}).toString() // [object Object]
({b:456}).toString() // [object Object]
var foo = {};
foo[{a:123}] = 'wtf';
foo[{asdf:9876}]; // 'wtf'
foo['[object Object]']; // 'wtf
JS では、ハッシュを制御することはできませんが、その必要はありません。
2 つのものが等しい場合は同じです。ハッシュは定義の一部ではなく、単なる実装の詳細です。内部では、2 つの異なるオブジェクトが同じハッシュを持っている可能性がありますが、それらは依然として異なり、実装はそれを魔法のように処理する必要があります (たとえば、チェーン ハッシュ テーブルを使用することによって)。
また、オブジェクトのキーは常に文字列です。インタープリターは、実際の値を格納するのではなく、ハッシュ コンストラクター内、[]
、または の後に値を文字列化します。つまり、これが最初に現れることはめったにありません。.
いくつかの例を挙げると:
function X() {}
x = new X()
y = new Y()
h = {x: 2, y: 3} // h has 2 members, named "x" and "y"
a = (x, y)
b = (x, y)
h[a] = 4
h[b] = 5 // h has 3 members, named "x", "y", and "[object Object]"
Python 用語で言えば、(100% 正確というわけではありませんが)__repr__
の代わりに dict がキーに対して呼び出されたようなものです。これは、クラスの異なるインスタンスの同等性を制御するカスタム メソッドを提供できることを意味します。__hash__
toString