Answers:
有一些原因使我Map
比起普通对象({}
)更喜欢使用s 来存储运行时数据(缓存等):
.size
属性使我知道此Map中存在多少个条目;.clear()
,.forEach()
等;其他所有情况,例如传递函数参数,存储配置等,均使用普通对象编写。
另外,请记住:不要尝试过早优化代码。除非您的项目遇到性能问题,否则不要浪费时间进行普通对象与地图的基准测试。
===
:)
Map
使用SameValueZero算法。developer.mozilla.org/en-US/docs/Web/JavaScript/...
Map
使用s的东西说了些什么?
我对此不确定,但我认为性能并不是使用Maps的原因。看看这个更新的jsperf页面:
http://jsperf.com/es6-map-vs-object-properties/73
看起来(至少在处理字符串时)对象比用于基本设置和获取的映射要快得多。
其他答案没有提及object和Map
s 之间的最后一个区别:
该
Map
对象保存键值对,并记住键的原始插入顺序。因此,在对其进行迭代时,Map对象将按插入顺序返回键。
来自MDN的引言,重点是我的
这是我决定Map
在最近的项目中首次使用的主要原因。我有一个普通对象,需要在中显示<table>
,每个属性都在特定行中显示。
let productPropertyOrder = [ "name", "weight", "price", "stocked" ];
let product =
{
name: "Lasagne",
weight: "1kg",
price: 10,
stocked: true
}
我编写了一个函数,Map
根据所需的键顺序将对象转换为:
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
}
}
但是,如果您有一个这样的对象数组并将要在许多地方显示它们,则首先将它们全部转换为地图是有意义的。