Map对象用来保存键值对,并且能够记住键的原始插入顺序,任何对象或者原始值都可以作为键或者是值。
WeakMap对象同样用来保存键值对,对于键是弱引用的而且必须为一个对象,而值可以是任意的对象或者原始值。
Map对象类似于一个普通的键值对的Object对象,也是键值对的集合,但是他们之间有一些重要的区别:
| 描述 | Map | Object |
|---|---|---|
| 意外的键 | Map默认情况不包含任何键,只包含显式插入的键。 |
一个Object有一个原型, 原型链上的键名有可能和在对象上的设置的键名产生冲突。 |
| 键的类型 | 一个Map的键可以是任意值,包括函数、对象或任意基本类型。 |
一个Object 的键必须是一个String或是Symbol。 |
| 键的顺序 | Map中的key是有序的,当迭代的时候,一个Map对象以插入的顺序返回键值。 |
一个Object的键的迭代顺序需要通过键的类型与创建的顺序来确定。 |
| 键值数量 | Map的键值对个数可以轻易地通过size属性获取。 |
Object的键值对个数只能手动计算。 |
| 迭代 | Map是iterable的,所以可以直接被迭代。 |
迭代一个Object需要以某种方式获取它的键然后才能迭代。 |
| 性能 | Map在频繁增删键值对的场景下表现更好。 |
Object在频繁添加和删除键值对的场景下未作出优化。 |
注:关于一个Object的键的迭代顺序问题,在ES6以后,对象保留了String与Symbol的创建顺序,当创建的对象仅有String或者Symbol时,迭代顺序与创建顺序相同,当对象中两种类型都存在时,String总是在前,当String可以被转换为Number时,这些键在迭代时处于最前,且会按照数字的顺序进行迭代。
Map.prototype.constructor: 返回构造函数。Map.prototype.size: 返回Map对象的键值对的数量。Map.prototype.clear(): 移除Map对象的所有键值对 。Map.prototype.delete(key): 如果Map对象中存在该元素,则移除它并返回true,否则如果该元素不存在则返回 false。Map.prototype.entries(): 返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的[key, value]数组。Map.prototype.forEach(callback[, thisArg]): 按插入顺序,为Map对象里的每一键值对调用一次callback函数,如果为forEach提供了thisArg,它将在每次回调中作为this值。Map.prototype.get(key): 返回键对应的值,如果不存在,则返回undefined。Map.prototype.has(key): 返回一个布尔值,表示Map实例是否包含键对应的值。Map.prototype.keys(): 返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的键。Map.prototype.set(key, value): 设置Map对象中键的值,返回该Map对象。Map.prototype.values(): 返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的值。Map.prototype[@@iterator](): 返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的[key, value]数组。WeakMap的key只能是Object类型,原始数据类型不能作为key。WeakMap持有的是每个键对象的弱引用,这意味着在没有其他引用存在时垃圾回收能正确进行,WeakMap用于映射的key只有在其没有被回收时才是有效的,正由于弱引用,WeakMap的key是不可枚举的,没有方法能给出所有的key。
简单来说,有时需要在某个对象上面存放一些对象,但是这会形成对于这个对象的引用,一旦不再需要这个对象,我们就必须手动删除这个引用,否则垃圾回收机制无法释放对象占用的内存,WeakMap的设计就是解决这个问题的,它的键所引用的对象都是弱引用,垃圾回收机制不将该引用考虑在内,因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存,此时WeakMap里边所对应的键值都会消失,不需要手动删除引用。如果需要在对象上添加对象而又不想干扰垃圾回收机制的话,就可以使用WeakMap。
WeakMap.prototype.constructor: 返回构造函数。WeakMap.prototype.delete(key): 移除key的关联对象。WeakMap.prototype.get(key): 返回key关联对象,没有key关联对象时返回undefined。WeakMap.prototype.has(key): 根据是否有key关联对象返回一个Boolean值。WeakMap.prototype.set(key, value): 在WeakMap中设置一组key关联对象,返回这个 WeakMap对象。