Set的用法
set是一种集合;类似数组,不同的是set集合中的元素不能重复
有两种定义方式:
第一种:定义时不加参数
let list = new Set();
list.add(1);
list.add(2);
console.log(list.size);//2
第一种:定义时加参数
let arr = [1,2,3,4,5];
let list = new Set(arr);
console.log(list.size);//5
set集合中的元素不能重复的情况如下:
let list = new Set();
list.add(1);
list.add(2);
list.add(1);
console.log(list);//Set(2) {1, 2} 不报错,相同的元素加不进去
set重要使用,去重
let arr1 = [1,2,3,1,2];
let list1 = new Set(arr1);
console.log(list1);//Set(3) {1, 2, 3}
set是不会进行数据类型的隐形转换,如下事例中,字符串2就不等于数值2
let arr2 = [1,2,3,1,'2'];
let list2 = new Set(arr2);
console.log(list2);//Set(4) {1, 2, 3, "2"}
set实例的方法:
- add 添加
- delete 删除
- clear 清空
- has 是否存在
var arr = [1,2,3,4,5];
let list = new Set(arr);
console.log(list.has(2));//true
console.log(list.delete(4),list);//true Set(4) {1, 2, 3, 5}
list.clear();
console.log(list);//Set(0) {}
Set实例的方法和遍历:
- keys(),values(),entries()
- forEach()
- for of
var arr = [1,2,3,4,5];
let list = new Set(arr);
for(let key of list.keys()){
console.log(key);//1 2 3 4 5
}
for(let value of list.values()){
console.log(value);//1 2 3 4 5
}
//数组的key和value是一样的。不加values()的情况下,默认values();
for(let value of list){
console.log(value);//1 2 3 4 5
}
for(let [key,value] of list.entries()){
console.log(key, value);//1 2 3 4 5
}
list.forEach(function (item){
console.log(item);//1 2 3 4 5
});
WeakSet的用法
WeakSet和set的区别:
- 1、WeakSet和set支持的数据类型不一样,WeakSet的元素只能是对象,而set可以是数值,布尔,字符串等。
- 2、WeakSet是弱引用,通俗的讲,就是在WeakSet中添加的对象, 这个对象不是整个值拷过来,而是地址的引用,它不去检测这个地址是不是已经被垃圾回收机制回收了
- 3、 WeakSet没有size属性,没有clear()方法。不能遍历
WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失,遍历不能保证成员的存在。可能刚刚遍历结束,成员就取不到了。
WeakSet的一个用处是存储DOM节点,而不用担心这些节点从文档移除时,会引起内存的泄露。
let weakList = new WeakSet();
let obg = {};
weakList.add(obg);
// weakList.add(2);//这样添加就会报错,因为不是对象
console.log('weakList', weakList);//weakList WeakSet {{…}}
Map的用法
Map是一个对象,类似Object,有key,value。不同的是Object中的key只能是字符串,而Map的key可以使任意数据类型。
Map和Set的用法十分相似,定义方法也有有两种:
第一种没有参数的:
let map = new Map();
let arr = [1,2,3];
map.set(arr,456);
console.log(map);//Map(1) {Array(3) => 456}
console.log(map.get(arr));//456
第二种有参数的:new Map([[key,value],[key,value]])
let map = new Map([['a',123],['b',456]]);
console.log(map);//Map(2) {"a" => 123, "b" => 456}
这里需要注意:map添加元素使用的是.set(),获取时使用的是.get();
Map常用的属性值:size delete clear has
let map = new Map([['a',123],['b',456]]);
console.log(map);//Map(2) {"a" => 123, "b" => 456}
console.log(map.has('a'));//true
console.log(map.size);//2
console.log(map.delete('a'),map);//true Map(1) {"b" => 456}
map.clear();
console.log(map);//Map(0) {}
Map常用的方法:keys(),values(),entries()
和for of和forEach()循环
let a = [["one",1],["two",2]];
let map = new Map(a);
map.forEach(function(value, key, map){ //遍历map
console.log(key + ":" + value); //one:1,two:2
});
for(var key of map.keys()){ //返回key的迭代器
console.log(key); //one,two
}
for(var value of map.values()){ //返回值的迭代器
console.log(value); //1,2
}
for(var [key,value] of map.entries()){ //返回项的迭代器
console.log(value); //1,2
}
WeakMap的用法
WeakMap与Map的区别:
- 1、WeakMap接受的key值必须是对象
- 2、没有size属性。不能使用clear方法
- 3、不能遍历
与WeakSet类似
var weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, 123);
console.log(weakMap.get(obj));//123