2012-09-12 8 views
5

このコードでは何が起こっていますか?オブジェクトをJavaScriptのプロパティキーとして使用する

var a = {a:1}; 
var b = {b:2}; 
var c = {}; 

c[a] = 1; 
c[b] === 1 // true! 

c[b] = 2; 
c[a] === 2 // true! 

は、具体的には、なぜアップbcリターンでaのプロパティに格納された値を使用して探していますか?

オブジェクトをJavaScriptのプロパティのキーとして使用するとはどういう意味ですか?

私はこれをChrome/NodeとFirefoxでテストしました。

+2

現在のところ、javascriptはオブジェクトをキーとしてサポートしていないため、[オブジェクトオブジェクト]となる値を格納する文字列に変換されるため、すべてのオブジェクトにキーとして適用されますが、将来は 'Map 'は、オブジェクトをキーとして保存するために使用できるものです。 – Sushil

+0

@Sushilの面白い音。この潜在的な将来のMapクラスに関する情報への参照はありますか?私は数分の検索の後でどこにも言及されていませんでした。 –

+1

ECMAScript 6の将来の実装https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Mapここに行きます。さらに、非常に素晴らしいWeakMap概念(私は個人的にはそれが好きです)https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/WeakMapここでそれについて読むことができます – Sushil

答えて

10

オブジェクトをJavaScriptのプロパティのキーとして使用するとはどういう意味ですか?

Javascriptオブジェクトでは文字列キーのみが使用できるため、オブジェクトはまず文字列に変換されます。

特に、cを検索すると、aのプロパティに格納されていた値が返されるのはなぜですか?

{a: 1}{b: 2}の文字列表現は、このように、プロパティが上書きされ、両方"[object Object]"あります。

編集:あなたが本当に(可能ならば、私は、別のソリューションを好むだろう)キーとしてオブジェクトを使用する必要が場合は、オブジェクトのJSON表現を使用することができます。

c[JSON.stringify(a)] = 1 
c[JSON.stringify(b)] = 2 

しかし、もう一度、試してください別のアプローチを考えてください。おそらく、オブジェクトには、オブジェクト自体以外の一意の識別子があります。あなたがキーとしてオブジェクトを使用する理由

+1

おかげでLinus、これは意味があります。私はある意味ではオブジェクトをキーとして使う必要があるので、実際の 'Map'クラスが役に立ちます。しかし、私は非常に多くのセットを持っていないので、私はちょうどキー/値のペアの配列を作成し、それらを介して 'get'ループで、 '==='でキーをテストすると思います。それはO(N)になりますが、私のNは約10になりますので、私は気にしません。再度、感謝します。 –

2

は、 キーが[Object Object]あるobject.toString()の結果、なりつつあり

それであなたはプロパティ"[Object Object]"に値を設定し、で値を取得しているdothingされていますプロパティ"[Object Object]"

関連する問題