2016-12-09 5 views
4

MapにMDNのドキュメントは言う:実行時までキーが不明なときにMap()を使用するのはなぜですか?

あなたはまだ[オブジェクトまたはマップ]を使用しているかわからない場合は、 に以下の質問を自問してください:

  • は通常、未知の鍵であります実行時まで、動的にそれらを検索する必要がありますか?

  • [...]

これらすべては、あなたがコレクションの地図をしたいサインをしています。 [...] https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map

しかし、私はあまりにも角括弧でdynamicalyオブジェクトのキーを設定することができます(すなわち。myObject[dynamicKey])。

mapsを使用する別の理由は、「マップの目的をフィッティングする」以外の動的キーをコレクションとして使用する場合ですか?これは、同じドキュメント内の以前のポイントに近い関連

+0

I特に 'set'方法は、関数型プログラミングに便利ですマップ、(のようなときのアキュムレータを返すという事実のように'reduce'は地図です)。しかし、この質問は、意見に基づくリスクがある。 – trincot

+0

これがあなたの*唯一の基準であれば、それほど大きな違いはありません。それは、文字列や記号以外のものをキーに使うなど、違いを生む引用符から省略したものの、 'size'を得ること、@trincotは' set'を記述すること、それは必要なプロトタイプを持たない –

+3

* "しかし、私はオブジェクトのキーをダイナミックに角括弧で設定することもできます(つまり、myObject [dynamicKey])。" *できます。しかし、エンジンは、固定されたプロパティセットでオブジェクトを最適化するのに非常に優れています。実行時にプロパティを追加すると、オブジェクトが最適化されなくなる可能性があります。概念的には、オブジェクトを* records *や 'Map's ... * maps *として使用してください。 –

答えて

1

オブジェクトのプロトタイプを持っているので、デフォルトのキーがマップにあります。

は伝統的に、あなたはプロトタイプのプロパティをフィルタリングする必要があります(彼らは「見て[キー]まで動的に」と言いたいです)オブジェクトを反復処理する場合:

for(var key in obj) { 
    if(obj.hasOwnProperty(key)) { 
     // do something 
    } 
} 

あなたはを通して繰り返しますMapではプロトタイププロパティと混合した独自のプロパティを持たないため、余分なチェックをスキップできます。

+0

あなたは「探している」プロパティについて話しています。動的キーに 'maps'を使うことは、それを「設定」するときです。しかし、それは確かに "見上げる"ための良い点です! – jpenna

+0

あなたが持っている質問には、特にキーを調べることに関する話があります。キーの設定について知りたければ、関連するセクションを引用する必要があります。 – JJJ

+0

はい、それはリンクされたMDNの記事で言及された他の理由の1つです。しかし、これはOPの質問に答えるものではありません。 – Bergi

1

オブジェクトは、数字と文字列をキーとしてのみサポートします。マップはオブジェクトをキーとしてもサポートしています。実行時まであなたのキーが不明な場合は、キーのタイプがわからないことがあります。マップはより安全です。

私はあなたがECMAScript 6コードをECMAScript 5に移したときにMapを使うべきではないと思います.Mapを使用するために必要なpolyfillはパフォーマンスが良くありません。

+3

実際には、オブジェクトには文字列キーしかありません。数字(または他のインスタンス)をキーとして使用しようとすると、キーとして追加される前に文字列に変換されます。 –

+1

オブジェクトには、[Symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol)のキーもあります。 –

+1

実行時に変数の値が不明な場合もありますが、タイプが不明な変数はほとんどありません。 – Bergi

0

しかし、オブジェクトに値を渡すことには依然として問題があります。 キーは常にオブジェクト内の文字列に変換されるためです。例えば

let author1 = { name: "Name1" }; 
let author2 = { name: "Name2" }; 

let mostRecentReply = {}; 

mostRecentReply[author1] = "Test1"; 
mostRecentReply[author2] = "Test2"; 

console.log(mostRecentReply[author1]); 
console.log(mostRecentReply[author2]); 

意志出力以下:

Test2 
Test2 

マップを使用しても問題が解決します

let mostRecentReply = new Map(); 
mostRecentReply.set(author1, "Test1"); 
mostRecentReply.set(author2, "Test2"); 

console.log(mostRecentReply.get(author1)); 
console.log(mostRecentReply.get(author2)); 

意志出力:

Test1 
Test2 
+0

これは、オブジェクトをキーとして使用しているときに '[object Object]'に変換されるため、キーとして渡されるオブジェクトはすべて同じ要素を参照するためです。 'author2'を使った2番目の代入はキー' author1'の最初の代入をオーバーライドします。これは '[object Object]'として解釈されるためです。しかし、あなたの答えが私の質問に合っているかどうかは分かりません。これは 'オブジェクト'の上に 'map'を使う利点ですが、実際には動的キーの設定を扱っていません – jpenna

+0

はい、リンクされたMDNの記事。しかし、これはOPの質問に答えるものではありません。 – Bergi

2

Mapを任意のキーで使用する理由は、名前の衝突を避けるためです。例えば。我々はObject.prototype.toStringと衝突上記

let a = {}; 
 

 
function foo(key) { 
 
    console.log(a[key] === undefined ? "Unset" : "Set"); 
 
    a[key] = "Hi"; 
 
    console.log(a[key]); 
 
    console.log("" + a); 
 
} 
 

 
foo("goodKey"); // Unset, Hi, [object Object] 
 
foo("toString"); // Set, Hi, TypeError: can't convert a to primitive type

:プレーンオブジェクトと。

我々は罰金だ Map

let a = new Map(); 
 

 
function foo(key) { 
 
    console.log(a.get(key) === undefined ? "Unset" : "Set"); 
 
    a.set(key, "Hi"); 
 
    console.log(a.get(key)); 
 
    console.log("" + a); 
 
} 
 

 
foo("goodKey"); // Unset, Hi, [object Map] 
 
foo("toString"); // Unset, Hi, [object Map]

+0

はい、それはリンクされたMDNの記事で言及された他の理由の1つです。しかし、これはOPの質問に答えるものではありません。 – Bergi

+0

@Bergiこれは、*単純なオブジェクトでdynamicKeyを使用すべきではない理由です。 OPは何を求めたのですか? – jib

+0

Hm、おそらく。私はこの質問を「他のすべてが等しいと仮定して、なぜダイナミックキーのオブジェクトよりもマップが優れているのか」と理解していました。 – Bergi

関連する問題