ES6中新增了Set
、WeakSet
、Map
、WeakMap
数据结构
一、Set
Set
是类似数组的数据结构,和数组最大的区别是,Set
中所有的成员都是唯一的。可以把Set
想象成是一个既没有重复元素,也没有顺序概念的数组
Set
本身是一个构造函数,用来生成 Set 数据结构
const s1 = new Set()
s1.add(1)
s1.add(2)
s1.add(1)
// s1 的值为 {1, 2}
Set ()
函数可接受一个可循环的数据结构,如数组、类数组、含有 iterable
接口的其他数据结构等作为参数
const s2 = new Set([1,2,1,4,3,4])
// s2 的值为 {1, 2, 3, 4}
- 常用属性和方法
(1) size
用于查看Set子类对象的成员数量
const s2 = new Set(['a','b','c','d']);
// s2 的值为 {"a", "b", "c", "d"}
s2.size // 4
(2) add(value)
用于向set 中添加一个值,返回Set
结构本身,所以可以使用链式调用
(3) delete(value)
用于删除一个值,返回布尔值表示是否成功删除
(4) has(value)
用于查找 Set
中是否包含某个值,返回布尔值
(5) clear()
用于清除所有成员,无返回值
- set循环相关方法
(1)keys()
:返回键名
(2)values()
:返回键值
(3)entries()
:返回所有键值对成员
Set
结构没有键名,只有键值(或者说键名和键值是同一个值),所以key
方法和value
方法的行为完全一致。
entries
方法返回的同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等。
二、WeakSet
WeakSet
结构与 Set
类似,也是不重复的值的集合。但是,它与Set
有两个区别
-
WeakSet
的成员只能是对象,而不能是其他类型的值。 -
WeakSet
中的对象都是弱引用,即垃圾回收机制不考虑WeakSet
对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet
之中
三、Map
类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值都可以当作键
- Map属性及操作方法
(1) size
(2) set(key, value)
、get(key)
设置一个键名为key
,键值为 value
的成员,并返回整个Map
结构,如果已经存在该键名,则会更新键值读取这个 key 对应的值,如果没有则返回 undefined
;get(key)
用于返回键名为key
的键值
(3) has(key)
、delete(key)
、clear() 和
Set的
has、delete
、clear
使用方式十分类似
2.Map
循环
Map
实例的循环方式和Set类似,可以用keys
、values
、entries
、forEach
等方式循环成员
Map
实例的循环方式与Set的不同点在于Map
实例的键名和键值是不同的
四、WeakMap
WeakMap
结构与Map
结构类似,也是用于生成键值对的集合。不同之处在于,WeakMap
不会阻止它的键值被垃圾回收,那意味着你可以把数据和对象关联起来不用担心内存泄漏
小结:
- 在使用的过程中明显的
Set
和Map
比我们之前经常使用的Array
和Object
是有明显的便捷优势的,所以在以后的开发中,我们可以根据场景需要来通过Set
和Map
来替代Array
和Object
来使用 - 如果对数据结构存储的唯一性有要求,考虑使用
Set
- 如果数据的复杂程度高,考虑使用
Map
,在一些构建工具中是非常喜欢使用Map
这种数据结构来进行配置,因为map
是一种灵活、高效性、适合一对一查找的数据结构 -
Set
和Map
有着类似的API
,主要的不同是Set
没有set
方法,因为它不能存储键值对,剩下的几乎相同 -
WeakMap
与WeakSet
作为一个比较新颖的概念,其主要特点在于弱引用 - 相比于
Map
与Set
的强引用,弱引用可以令对象在 “适当” 情况下正确被垃圾回收,减少内存资源浪费
网友评论