プレーンオブジェクトキーは文字列である必要がありますが、Map
は任意のタイプのキーを持つことができます。
しかし、実際にはこれを使用することはほとんどありません。ほぼすべての場合で、とにかく文字列をキーとして使用しています。そして、おそらくnew Map()
は{}
よりも低速です。では、プレーンオブジェクトの代わりにMap
を使用する方がよい理由は他にありますか?
ランタイムデータ(キャッシュなど)を格納するためにプレーンオブジェクト(_{}
_)よりもMap
sを使用する方がよい理由はいくつかあります。
.size
_プロパティは、このマップに存在するエントリの数を知らせます。.clear()
、.forEach()
など。関数の引数の受け渡し、設定の保存など、その他の場合はすべて、プレーンオブジェクトを使用して記述されます。
また、覚えておいてください:コードを早く最適化しようとしないでください。プロジェクトでパフォーマンスの問題が発生していない限り、プレーンオブジェクトとマップのベンチマークを行うのに時間を無駄にしないでください。
これについてはよくわかりませんが、パフォーマンスがマップを使用する理由ではないと思います。この更新されたjsperfページを見てください。
http://jsperf.com/es6-map-vs-object-properties/7
(少なくとも文字列を扱う場合)オブジェクトは基本的な設定と取得のマップよりもはるかに高速です。
編集:この回答は現在古く、間違っています。以下のコメントストリームをご覧ください。
他の回答では、オブジェクトとMap
sの最後の違いについては触れていません。
Map
オブジェクトはキーと値のペアを保持し、はキーの元の挿入順序を記憶します。したがって、それを反復すると、Mapオブジェクトは挿入順にキーを返します。
引用 [〜#〜] mdn [〜#〜] 、emphasismine
これが、最近のプロジェクトで初めてMap
を使用することにした主な理由でした。 <table>
に表示する必要がある通常のオブジェクトがあり、各プロパティは特定の行にあります。
let productPropertyOrder = [ "name", "weight", "price", "stocked" ];
let product =
{
name: "Lasagne",
weight: "1kg",
price: 10,
stocked: true
}
目的のキーの順序に従ってオブジェクトをMap
に変換する関数を作成しました。
注:この関数は、
order
にないすべてのオブジェクトプロパティを破棄します
function objectToMap( obj, order )
{
let map = new Map();
for ( const key of order )
{
if ( obj.hasOwnProperty( key ) )
{
map.set( key, obj[ key ] );
}
}
return map;
}
次に、マップを目的の順序で反復できます。
let productMap = objectToMap( product, productPropertyOrder );
for ( const value of productMap.values() )
{
let cell = document.createElement( "td" );
cell.innerText = value;
row.appendChild( cell );
}
もちろん、これは少し工夫されています。プロセスでMap
を作成せずにプロパティの順序を反復するときに表示することもできるからです。
for ( const key of productPropertyOrder )
{
if ( product.hasOwnProperty( key ) )
{
let value = product[ key ];
// create cell
}
}
しかし、そのようなオブジェクトの配列があり、それらを多くの場所に表示する場合は、最初にそれらすべてをマップに変換することは理にかなっています。