ホームページ  >  記事  >  ウェブフロントエンド  >  toString をオーバーロードして JS HashMap の分析_JavaScript スキルを実装する

toString をオーバーロードして JS HashMap の分析_JavaScript スキルを実装する

WBOY
WBOYオリジナル
2016-05-16 18:09:251740ブラウズ

しかし、注意深く比較してみると、その差は依然として非常に大きいことがわかるでしょう。 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)
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。