Set 集合与Map集合
前言:长久以来,数组一直是javascript中唯一的集合类型,在es6之前,由于可选的集合类型有限,数组使用的又是数值类型索引,因而经常用于创建队列和栈。如果开发者要使用非数组类型索引,就会使用非数组对象创建所需要的数据结构,而这就是Set集合和Map集合。Set集合是一种无重复元素的列表。Map集合内含多组键值对,经常被用于缓存频繁取用的数据。
一、set集合
ECMAScript6中新增的set集合类型是一种有序列表,其中含有一些相互独立的非重复值,通过Set集合可以快速访问其中数据,更有效地追踪各种离散值。
1.创建Set集合并添加元素
调用new Set()创建Set集合,调用add方法向集合中添加元素,size属性可以获取集合中元素数量。
let set = new Set();
set.add(5);
set.add('5');
console.log(set.size) // 2
在set集合中,不会对所存值进行强制类型转换,数字5和字符“5”可以作为两个独立元素存在。
2.用数组来初始化Set集合
set构造函数同样会过滤重复值从而保证集合中元素各自唯一
let set = new Set([1, 2, 5, 2, 1, 6, 8, 10, 9, 10]);
console.log(set.size) // 7
Set构造函数可以接受所有可迭代对象作为参数,数组、Set集合、Map集合都是可迭代的
3.通过has方法可以检测Set集合中是否存在某个值,返回布尔值
4.移除元素
调用delete()方法可以移除Set集合中某一个元素,调用clear()方法会移除集合中所有元素。
let set = new Set();
set.add(5);
set.add("5");
console.log(set.has(5)); // true
set.delete(5)
console.log(set.has(5)); // false
set.clear();
console.log(set.has("5"); // false
console.log(set.size) // 0
5.Set集合的forEach()方法
forEach()方法的回调函数接受以下3个参数:
set集合中下一次索引的位置
与第一个参数一样的值
被遍历的Set集合本身
let set = new Set([1, 2]);
set.forEach(function(value, key, ownSet){
console.log(key + '--' + value);
cosole.log(ownSet === set);
};
//输出
1--1
true
2--2
true
6.将set集合转换为数组
let set = new Set([1, 2, 3, 3, 3, 4, 5]);
let array = [...set];
console.log(array); // [1, 2, 3, 4, 5]
二、Weak Set 集合
Weak Set 集合只存储对象的弱引用,并且不可以存储原始值。
集合中的弱引用如果是对象唯一的引用,则会被回收并释放相应内存
1.用WeakSet构造函数可以创建 Weak Set集合,集合支持3个方法:add()、has()、delete()。
let set = new WeakSet();
let key = {};
set.add(key);
console.log(set.has(key)); // true
set.delete(key);
console.log(set.has(key)); // false
注意:WeakSet 构造函数不接受任何原始值,如果数组中包含其他非对象值,程序会抛出错误。
2.WeakSet集合和 Set集合的区别
(1)、WeakSet的实例中,如果向add()方法传入非对象参数会导致程序报错,而向has()和delete()方法传入非对象参数会返回false
(2)、Weak Set 集合不可迭代,所以不能用于for-of 循环
(3)、Weak Set 集合不暴露任何迭代器,所以无法通过程序本身来检测其中的内容
(4)、Weak Set 集合不支持forEach()方法
(5)、Weak Set集合不支持size属性
如果你只需要跟踪对象引用,你更应该使用Weak Set集合而不是普通的Set集合
三、Map集合
Map类型是一种储存着许多键值对的有序列表,其中键名和对应的值支持所有的数据类型。Map属性名不会被强制类型转换。
1.如果向Map集合中添加新的元素,可以调用set()方法并分别传入键名和对应值作为两个参数,如果要从集合中获取信息,则可以调用get()方法
let map = new Map();
map.set('title', 'understanding ECMAScript 6“);
map.set("year", 2016);
console.log(map.get("title")); // "understanding ECMAScript 6"
console.log(map.get("year")); // 2016
2.Map集合支持的方法
has():检测指定键名在Map集合是是否存在
delete(): 从Map集合中移除指定键名及其对应的值
clear(): 移除Map集合中所有键值对
Map集合同样支持size属性,其代表当前集合中包含的键值对数量
3.Map集合的初始化方法
可以向Map构造函数传入数组来初始化一个Map集合,数组中每一个元素都是一个子数组,子数组中包含一个键值对的键名与值两个元素。
let map = new Map(["name", "nicholas"], ["age", 25]]);
console.log(map.size) // 2
3.Map集合的forEach()方法
接受3个参数:
下一次索引值
值对应的键名
Map集合本身
四、Weak Map集合
1.使用Weak Map 集合
列表的键名必须是非null类型的对象,键名对应的值则可以是任意类型。
2.支持的方法
1.has()方法
2.delete()方法