しかし、注意深く比較してみると、その差は依然として非常に大きいことがわかるでしょう。 Java HashMap のキーはオブジェクト型であるため、任意のタイプのパラメーターを使用できますが、JS のキーは文字列または数値のみにすることができます。 obj={};map[obj]=1; このコードは数値でも文字でもないキーを渡しますが、エラーは発生しません。これは、インタプリタが組み込みの toString メソッドを通じて obj オブジェクトを文字「[object Object]」に変換するためです。for each を使用してマッピングできます。 Java があらゆる種類のキーを受け入れることができる理由は、Java のオブジェクトが HashCode メソッドを実装し、各クラスが Object の HashCode を継承またはオーバーライドするため、どの変数もハッシュ値を持つためです。 JSでも試してみることができます。
前述の toString メソッドは、任意の型を文字に変換するために使用されますが、これと同様に、数値に変換するために使用される別のメソッド valueOf があります。数値の方がインデックス付けしやすいため、最初に valueOf を試してみましょう:
Object .prototype.valueOf = function()
{
alert("Hello~")
};
var map = [];
map[obj] = 1;
結果は非常に残念で、ダイアログ ボックスは表示されず、JS エンジンが obj オブジェクトを番号。次に、これを toString メソッドに変更してみます。
Object.prototype.toString = function()
{
alert("Hello~")
};
map[ obj] = 1;
ダイアログ ボックスが表示されます。もちろんデータは返されず、この 1 はmap["unknown"]に格納されました。しかし、値を返し、各変数の一意の値を保証できる場合は、元の map[key] メソッドを使用して任意の型のインデックスを作成できます。 Object の toString メソッドをオーバーロードします:
コードをコピー
Object.prototype.toString = function()
{
if(this._HASH == null)
this._HASH = HASH_ID ; :" this ._HASH;
};
テストしてみましょう:
コードをコピー
コードは次のとおりです: var HashMap = {}; var obj2 = {}; obj1] = "Foo1 "; HashMap[obj2] = "Foo2";
alert(HashMap[obj1] " & "HashMap[obj2]); ";
HashMap[obj2] = "Bar2";
alert(HashMap[obj1] " & " HashMap[obj2]);
それぞれ出力: Foo1 & Foo2 および Bar1 & Bar2 は、obj1 と obj2 が常に同じインデックスに対応することを示しています。
もちろん、オブジェクト自体が toString メソッドをオーバーライドする場合は、毎回異なる値が返されるとは限りません。したがって、使用する場合は、実際の状況に応じて適切な調整を行ってください。 (2011/3/12)