7.Set和Map

155 阅读2分钟

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(了解)

  1. 不能传入非对象类型的参数
  2. 不可迭代
  3. 没有forEach()
  4. 没有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