Get to know MDN better
Map 对象就是一个简单的键/值对映射集合,可以按照数据插入时的顺序遍历所有的元素。
下面的代码演示了使用 Map 进行的一些基本操作。请参考 Map 以获取更多的样例和完整的 API。你可以使用 for...of 循环来在每一次迭代中得到 [key, value] 数组。
一般地,object 会被用于将字符串类型映射到值。Object 允许设置键值对、根据键获取值、删除键、检测某个键是否存在。不过,Map 对象还有一些优点,可以更好地应用于映射关系表示中。
这三条提示可以帮你决定用 Map 还是 Object:
WeakMap 是键/值对的集合,其键必须是对象或非注册符号,其值为任意 JavaScript 类型,并且不会对其键创建强引用。也就是说,一个对象作为键出现在 WeakMap 中并不会阻止该对象被垃圾回收。一旦作为键的对象被收集,其在任何 WeakMap 中的相应值也会被垃圾收集,只要它们没有在其他地方被强引用。唯一可用作 WeakMap 键的原始类型类型是 symbol,更具体地说,是非注册 symbol,因为非注册 symbol 保证是唯一的,并且不能被重新创建。
WeakMap API 与 Map API 基本相同。不过,WeakMap 不允许观察其键的有效性,这也是它不允许枚举的原因。因此,没有任何方法可以获取 WeakMap 中的键的列表。如果有的话,该列表将取决于垃圾回收的状态,从而引入非确定性。
可以在 WeakMap 参考页的“为什么使用 WeakMap”小节查看更多信息和示例。
WeakMap 对象的一个用例是存储一个对象的私有数据或隐藏实现细节。Nick Fitzgerald 的博文“使用 ECMAScript 6 WeakMap 隐藏实现细节”提供了一个例子。对象内部的私有数据和方法被存储在 WeakMap 类型的 privates 变量中。所有暴露出的原型和实例都是公开的,而其他内容都是外界不可访问的,因为模块并未导出 privates 对象。
Set 对象是一组唯一值的集合,可以按照添加顺序来遍历。Set 中的值只能出现一次;它在集合 Set 中是唯一的。
以下代码演示了 Set 的基本操作,更多示例和完整 API 可以参考 Set。
可以使用 Array.from 或展开语法来完成集合到数组的转换。同样,Set 的构造函数接受数组作为参数,可以完成从 Array 到 Set 的转换。
备注:Set 对象存储唯一值,所以数组转换为 Set 时,任何重复值将会被删除!
一般情况下,在 JavaScript 中使用数组来存储一组元素,而新的 Set 对象有这些优势:
WeakSet 对象是可收集垃圾值的集合,包括对象和非注册 symbol。WeakSet 中的值只能出现一次。它在 WeakSet 的集合中是唯一的。
与 Set 对象的主要区别有:
WeakSet 对象的用例有限。它们不会泄露内存,因此可以安全地使用 DOM 元素作为键,并将其标记用于跟踪等目的。
Map 对象和 Set 对象的键和值的等值判断都基于 SameValueZero 算法: