作为ES6新增特性,Set是一种新的集合类型,为这门语言带来了集合数据结构。Set在很多方面都像加强的Map,这是因为它们大多API和行为是共有的。
Set基本API
创建set
const s = new Set()
add:添加值
const s = new Set()
s.add(1)
s.add(2).add(3)
console.log(s) //{ 1 2, 3 }
add返回集合实例,所以可以将多个添加操作串联起来
has: 判断是否有该成员
console.log(s.has(1)) //true
delet:删除该成员
s.delete(1)
console.log(s) //{ 2, 3 }
clear:清空
s.clear()
console.log(s) //{}
size:获取有几个值(属性)
console.log(s.size) //0
Set特点
Set的值可以是Js中任意数据类型
//创建的同时初始化,可以传入一个可迭代对象
const s = new Set([function () { }, Symbol(), new Object()])
console.log(s) //{ [Function (anonymous)], Symbol(), {} }
Set内部的判等方式基本上相当于使用严格相等(===),除了NaN,Set中的NaN等于NaN
const s = new Set()
const a = parseFloat('a')
const b = parseInt('b')
s.add(a)
console.log(s.has(b)) //true
Set会维护插入的顺序
const s = new Set()
s.add(4).add(2).add(1)
console.log(s) //{ 4, 2, 1 }
Set迭代
const s = new Set([10, 20, 30])
for (let value of s) {
console.log(value) //10 20 30
}
//s.forEach(function(value,key,set){},this指向) //value:每个成员,key等于value,没啥用,set:s本身
s.forEach((value, key, s) => {
console.log(value, key, s)
})
10 10 Set(3) { 10, 20, 30 }
20 20 Set(3) { 10, 20, 30 }
30 30 Set(3) { 10, 20, 30 }
无序:set没有下标去标识每一个值,所以是无序的,也不能像数组那样通过下标去访问set的成员
无重复值
const s = new Set()
s.add(1)
s.add(2).add(1)
console.log(s) //{ 1, 2 }
什么时候使用Set?
数组或字符串去重时;
不需要通过下标访问,只需要遍历时;
为了使用Set提供的方法和属性时。
强引用与弱引用
可查看我的另一篇博客——Javascript Map与WeakMap
WeakSet
ES6新增“弱集合”,也是一种新的集合类型,weak描述的是垃圾回收程序对待“弱集合”中值的方式(即弱引用)
WeakSet 基本API
const s = new WeakSet()
const obj1 = { name: '张三' },
obj2 = { name: '李四' },
obj3 = { name: '王五' }
s.add(obj1).add(obj2).add(obj3)
console.log(s.has(obj1)) //true
s.delete(obj1)
console.log(s.has(obj1)) //false
区别于Set,WeakSet的基本API仅有如上,它没有clear和size
WeakSet特点
1 WeakSet的值只能是Object或者继承自Object的类型,如上述代码所示。
2“weak”,表示这些值不属于正式的引用,不会阻止垃圾回收。
3 不可迭代,因为弱集合中的值可能随时被销毁,所以没必要提供迭代的能力,也不用像clear一次性清空所有,所以也没有clear方法。
什么时候使用WeakSet?
由于WeakSet不会妨碍垃圾回收,所以它很适合应用于某元素用完就应该立即被释放的场景。