Map 对象保存键值对,并能记住键的原始插入顺。任何值(引用类型或原始数据类型)都可以作为一个键或一个值。
new Map([iterable])
iterable 可以是一个 Array 或其它 iterable 对象,其元素为键值对(两个元素的数组,例如:[[1, 'one'], [2, 'two']])。每个键值对都会添加到 Map,null 会被当作 undefined。
Key 的相等
- key 的相等比较是基于
sameValueZero 算法。
- NaN 是与 NaN 相等的(虽然
NaN !== NaN),其它的值是根据 === 运算符的结果判断是否相等。
Object 和 Map 的比较
- Object 有自己的原型,原型链上的 key 可能会和设置在 Object 上的 key 冲突(当然可以使用
Object.create(null) 来创建一个没有原型的对象)。
- Object 的 key 只能是 String 或者 Symbol,Map 可以是任何值(函数、对象、原始类型)。
- Map 可直接进行迭代,而 Object 得先获取它的 key 数组,然后再进行迭代。
- Map 可以轻松的用
size 属性获取一个 Map 的键值对个数,而 Object 的键值对个数只能手动计算。
- Map 的 key 是有序的,而添加到 Object 的 key 则不是。遍历的时候 Map 按照插入顺序返回键。(ES6之后,Object 会保留 String、Symbol 键的创建顺序。)
- Map 在涉及频繁 添加/删除 键值对的情况下,性能会更好。Object 未针对频繁 添加/删除 键值对进行优化。