Set
Set集合:无重复值的有序集合,可以存储任何类型的值
//定义
let set = new Set();
console.log(set);
//添加元素
set.add(2);
set.add('4');
set.add('4');
set.add(['hello', 'world', 3]);
console.log(set);//Set(3){2, "4", Array(3)}
//集合的遍历(了解)
set.forEach((val, key) => {
console.log(val);
console.log(key);
})
//这种遍历方式得到的val和key是相等的,在es6中set中的值就是键,键就是值,所以这种方式毫无意义,了解就行
//删除元素
set.delete(2);
console.log(set);//Set(2){"4", Array(3)}
//校验某个值是否在set中
console.log(set.has('4'));//true
//获取集合长度
console.log(set.size);//2
//清空集合
set.clear();
console.log(set);//Set(0){}
将set转换成数组
let set = new Set([1, 2, 3, 5, 7, 8, 6]);
console.log(set);//Set(7){1, 2, 3, 5, 7,…}
//扩展运算符
let arr = [...set];
console.log(arr);//[1, 2, 3, 5, 7, 8, 6]
数组去重
let arr = [3, 4, 1, 8, 9, 4, 3, 5, 1, 2, 6];
console.log(...new Set(arr));//3 4 1 8 9 5 2 6
Set中存在的问题
Set中对象的引用无法被释放
let set = new Set();
let obj = {
name: 'tom'
};
set.add(obj);
obj = null;//释放对象
console.log(set);//Set(1){{…}},还存在于Set中并未被释放
解决上述问题(了解):
let set = new WeakSet();
let obj = {
name: 'tom'
};
set.add(obj);
obj = null;//释放对象
console.log(set);
WeakSet(了解)
- 不能传入非对象类型的参数
- 不可迭代
- 没有forEach()
- 没有size属性
Map
Map集合:键值对形式的有序集合,键和值可以是任意类型
//定义
let map = new Map();
//添加元素
map.set('name', '张三');
map.set('age', 20);
console.log(map);
console.log(map.get('name'));
//校验某个值是否在map中
map.has('name');//true
//删除元素
map.delete('name');
console.log(map);
//清空集合
map.clear();
console.log(map);
//键和值是任意类型
map.set(['a', [1, 2, 3]], 'hello');
console.log(map);
//new的时候同时进行初始化
let m = new Map([
['a', 1],
['c', 2]
]);
console.log(m);
和Set一样Map也有对应的WeakMap。