ES6新增了四类数据结构:分别是
Set
、WeakSet
、Map
、WeakMap
.
1. Set —没有重复成员元素的数组;
- 本质:Set本身是一个构造函数;接收一个具有iterable接口数据结构的参数,用来生成一个没有重复元素的数组;
let nums=new Set([1,2,3,4,3,2]);//[1,2,3,4]
nums.add(2);//[1,2,3,4]
nums.add('2');//[1,2,3,4,'2']
nums.add({});//[1,2,3,4,'2',{}] Set添加元素时不会发生类型转换,
nums.add({});//[1,2,3,4,'2',{},{}] Set添加的对象总不相等
- 2个属性:
// ① Set.prototype.constructor:返回Set的构造函数
// ② Set.prototype.size:返回Set实例的成员个数
- 两类8个方法:操作方法(4种)+遍历方法(4种)
①Set.add(value)
:向Set实例添加值value,返回Set结构本身 ;
②Set.delete(value)
:向Set实例删除值value,返回boolean, 成功为true,失败返回false;
③Set.has(value)
:检查Set实例是否含有值value,返回boolean,包含返回true,不包含返回false
④Set.clear()
:清楚Set实例的所有成员,无返回值;
⑤Set.keys()
:返回键名的遍历器;
⑥Set.values()
:返回键值的遍历器;
⑦Set.entries()
:返回键值对的遍历器;
⑧Set.forEach((value,key)=>{},thisObj)
:使用回调函数遍历每个成员
- 使用场景:①数组去重、②求数组的交集、并集、差集
// ①数组去重
let arr=[1,2,3,4,3,2,1];
let b=[...arr];//[1,2,3,4]
let a=Array.from(new Set(arr));//[1,2,3,4]
// ②数组运算
let arr1=new Set([1,2,3,4]);
let arr2=new Set([3,4,5,6]);
let union=new Set([...arr1,...arr2]);//[1,2,3,4,5,6]
let intersect=new Set([...arr1].filter(value=>b.has(value)));//[3,4]
let diffrence=new Set([...arr1].filter(value=>!b.has(value)));//[1,2]
2. WeakSet—成员只能是对象的Set
- WeakSet的成员只能是对象不能是其他类型值;
- WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用;
弱引用,即当一个WeakSet实例的成员引用对象A时,当其他对象不在引用对象A,JS的垃圾回收机制便会自动回收该对象占用的内存,不考虑WeakSet实例是否还在引用;弱引用的对象随时可能消失,无法保证成员的存在,因此WeakSet相比较Set数据结构,没有clear()方法、没有size属性、也没有遍历方法;
3. Map——键值对的键名、键值都可以为任意数据结构的对象;
ES5中对象(Object)本质上都是简直对的集合(Hash结构),但只能用字符串作为键名;Map对象可以用对象作为键名,实现真正的值-值对;对于键名、键值均为对象的Map数据,在内存中存储时,实际上是两个对象的索引值对索引值的对应关系映射;
-
属性:
Map.size
返回Map实例成员的总数; -
方法:操作方法(5种)+遍历方法(4种)
①Map.set(key,value)
:设置key值对应的值,如果key存在,则覆盖原有值;
②Map.get(key)
:获取键名为key的键值;
③Map.has(key)
:检查键名key是否存在Map实例中,返回boolean值,若存在返回true,不存在返回false;
④Map.delete(key)
:删除键名为key的属性,返回boolean值,若删除成功返回true,失败返回false;
⑤Map.clear()
:清除Map实例的所有成员,无返回值
⑥Map.keys()
:返回键名的遍历器
⑦Map.values()
:返回键值的遍历器
⑧Map.entries()
:返回所有成员的遍历器
⑨Map.forEach((value,key,map)=>{},thisObj)
:遍历Map的所有成员 -
Map 与其他数据类型之间相互转换
。。。
。。。
4.WeakMap—键名只能为对象的Map,弱引用
- WeakMap的成员的键名只能是对象不能是其他类型值;
- WeakMap中的键名和值都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用;