一、Set
1、定义:
一种类似数组的数据结构,但内部数据是唯一的,没有重复的数据
2、初始化语法:
可以接受一个数组或者类数组作为参数
var set = new Set([1,2,3,4,5]);
3、属性、方法:
- set.size ==>内部数据数量
- set.add() ==>添加某个值,返回Set结构本身,所以可以使用链式调用
set.add(6).add(7).add(8);
- set.delete() ==> 删除某个值,返回一个布尔值,表示删除是否成功
set.delete(8)
- set.has() ==> 返回一个布尔值,表示是否有这个数据
set.has(8)
- set.clear() ==> 清楚所有成员,没有返回值
4、遍历方法
var set = new Set(['aaa','bbb','ccc'])
- keys():返回一个键名遍历器(Iterator),然后使用for...of遍历
由于set结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys和values方法的行为完全一致
- values():返回一个键值遍历器(Iterator),然后使用for...of遍历
- entries():返回一个键值对遍历器(Iterator),然后使用for...of遍历
- forEach():使用回调函数遍历每个函数
- for..of
- 扩展运算符(...)
5、使用:实现并集,交集,差集
let set1 = new Set([1,2,3,4,5,6]);
let set2 = new Set([4,5,6,7,8,9]);
//并集
let union = new Set([...set1,...set2]);
//[1,2,3,4,5,6,7,8,9]
//交集
let intersect = new Set([...set1].filter(x => set2.has(x)));
//[4,5,6]
//差集
let differece= new Set([...set1].filter(x => !set2.has(x)));
//[1,2,3,4]
二、WeakSet
1、概念:
1、WeakSet成员只能是对象
2、内部对象都是弱引用
即垃圾回收机制不会管WeakSet内是否有该对象,只要这个对象在其他地方没有被使用了,就会被回收;
这意味折无法引用WeakSet的数据,也就不能遍历了
2、初始化:
var arr = [[1,2],[3,4]];
var ws = new WeakSet(arr);
3、方法:
ws.add()
ws.delete()
ws.has()
4、注意:
1、WeakSet没有size属性
2、不能遍历,因为内部数据随时可能消失,遍历机制无法保证数据存在
用途:
1、储存Dom节点,不用担心这些节点从文档移除是会引发内存泄露