转自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map
描述节
一个Map对象在迭代时会根据对象中元素的插入顺序来进行— 一个 [这里是代码001]循环在每次迭代后会返回一个形式为[key,value]的数组。
键的相等(Key equality)节
键的比较是基于"SameValueZero" 算法:NaN
是与NaN
相等的(虽然NaN !== NaN
),剩下所有其它的值是根据===
运算符的结果判断是否相等。在目前的ECMAScript规范中,-0
和+0
被认为是相等的,尽管这在早期的草案中并不是这样。有关详细信息,请参阅浏览器兼容性表中的“Value equality for -0 and 0”。
Objects 和 maps 的比较节
[这里是代码008]和Maps
类似的是,它们都允许你按键存取一个值、删除键、检测一个键是否绑定了值。因此(并且也没有其他内建的替代方式了)过去我们一直都把对象当成Maps
使用。不过Maps
和Objects
有一些重要的区别,在下列情况里使用Map
会是更好的选择:
- 一个
Object
的键只能是[这里是代码015]或者[这里是代码016],但一个Map
的键可以是任意值,包括函数、对象、基本类型。 - Map 中的键值是有序的,而添加到对象中的键则不是。因此,当对它进行遍历时,Map 对象是按插入的顺序返回键值。
- 你可以通过
size
属性直接获取一个Map
的键值对个数,而Object
的键值对个数只能手动计算。 Map
可直接进行迭代,而Object
的迭代需要先获取它的键数组,然后再进行迭代。Object
都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。虽然 ES5 开始可以用map = Object.create(null)
来创建一个没有原型的对象,但是这种用法不太常见。Map
在涉及频繁增删键值对的场景下会有些性能优势。