2016-11-05 2 views
0

私は、次の予期しない結果(最新のクロム、FF)直面している:私はので、このような行動の地図から値を取り出すに問題を抱えているObject.is(SameValueZero)potencialバグ

var o = {foo: "bar"}; 
alert(Object.is(o, {foo: "bar"})); //false 

var map = new Map(); 
map.set(o, 1); 

var o2 = {foo: "bar"}; 
alert(map.get(o2)); //undefined 

を。重大なパフォーマンスの低下なしにこれを修正する方法はありますか?

おかげ

+4

2つの異なるオブジェクトは決して等しくありません。これはバグではなく、これは指定された動作です。多くの関連する質問(潜在的な重複)を参照してください:http://stackoverflow.com/search?q=%5Bjavascript%5D+map+object+key+equality+ –

+0

私の問題についてもっと知りました:http://adipofjavascript.com/blog/drips/object-equality-in-javascript.html 質問は閉じているかもしれません... – Schneefall

答えて

0

考えるの例では、オブジェクトのJSON形式表現を比較するJSON.stringify()を使用することができます。質問にオブジェクト。

このアプローチは、一般的な解決策として使用するべきではありません。

var o = {foo: "bar"}; 
 

 
console.log(JSON.stringify(o) === JSON.stringify({foo: "bar"}));

+0

しかし、同じ順序で?私はそうは思わない。 –

+0

@SamKuhmonen説明している内容の例を共有できますか? – guest271314

+1

これは、特定のタイプの値、たとえば'JSON.stringify(function(){})== JSON.stringify(function(){return 2});関数が明らかに等価でないときは' true'を返します。 – RobG

0

私は解決策を見つけたようまあ、そうです。私はキーを文字列にし、普通のオブジェクトをaのように使用するつもりです:

var map = new Map(); 

var o = {foo: "bar"}; 
map.set(o, "val"); 

//----> 

var map = {}; 

var k = JSON.stringify({foo: "bar"}); 
map[k] = "val"; 
+0

これは問題ありません。理論的には、オブジェクトにはシーケンスやイテレータが内部にないため、 '{a:0、b:1} 'は' {"b":1、 "a":0} 'に文字列化できます。正しい順序についての仕様はありません。文字列化されたオブジェクトによって等価性をチェックすることはあなた自身のリスクです – ixpl0