总结
ES6
正式将 Set
与 Map
引入了 JS
。在此之前,开发者往往使用对象来模拟它们,但由于与对象属性有关的限制,这么做经常会遇到问题。
Set
是无重复值的有序列表。根据 Object.is()
方法来判断其中的值不相等,以保证无重复。Set
会自动移除重复的值,因此你可以使用它来过滤数组中的重复值并返回结果。Set
并不是数组的子类型,所以你无法随机访问其中的值。但你可以使用 has()
方法来判断某个值是否存在于 Set
中,或通过 size
属性来查看其中有多少个值。Set
类型还拥有 forEach()
方法,用于处理每个值。
Weak Set
是只能包含对象的特殊 Set
。其中的对象使用弱引用来存储,意味着当 Weak Set
中的项是某个对象的仅存引用时,它不会屏蔽垃圾回收。由于内存管理的复杂性,Weak Set
的内容不能被检查,因此最好将 Weak Set
仅用于追踪需要被归组在一起的对象。
Map
是有序的键值对,其中的键允许是任何类型。与 Set
相似,通过调用 Object.is()
方法来判断重复的键,这意味着能将数值 5 与字符串 "5" 作为两个相对独立的键。使用 set()
方法能将任何类型的值关联到某个键上,并且该值此后能用 get()
方法提取出来。Map
也拥有一个 size
属性与一个 forEach()
方法,让项目访问更容易。
Weak Map
是只能包含对象类型的键的特殊 Map
。与 Weak Set
相似,键的对象引用是弱引用,因此当它是某个对象的仅存引用时,也不会屏蔽垃圾回收。当键被回收之后,所关联的值也同时从 Weak Map
中被移除。对于和对象相关联的附加信息来说,若要在访问它们的代码之外对其进行生命周期管理(也就是说,当在对象外部移除对象的引用时,要求其私有数据也能一并被销毁),则 Weak Map
在内存管理方面的特性让它们成为了唯一合适的选择。