1.Set
Set对象类似于数组,且成员的值都是唯一的,允许存储任何类型的唯一值,无论是原始值还是对象引用。Set存储元素是无序的,不能通过下标访问。Set本身是一个构造函数,用来生成Set数据结构
最常用来进行数组去重·
var arr = [1,2,3,4,3,5,5,3]
var arr2 = [...new Set(arr)] //[1,2,3,4,5]
1.1 Set常用的方法
- add()方法用于向set结构中添加值
- delete()方法用于从set结构中删除值,返回值为布尔值
- has()方法用于判断某一个值是否是set数据结构中的成员
- clear()方法用于清空set数据结构中的值
1.2 迭代Set
1. forEach
const set = new Set(['a', 'b', 'c']);
set.forEach(value => {
console.log(value); // 在控制台中依次打印a, b, c
})
2. for of
- keys():返回键名(键名 = 键值)
- values():返回键值
- entries():返回键值对
2. Map
Map是一组键值对的结构,和JSON对象类似。key不仅可以是字符串号可以是对象。Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这样就解决了同名键碰撞的问题。
2.1 Map常用的方法
- set(key, value)方法: 设置Key所对应的键值,然后返回整个Map结构
- get(key)方法: 读取key对应的键值,如果找不到key,返回undefined
- has(key)方法: 返回一个布尔值,表示某个键是否在Map结构中
- delete(key)方法: 删除某个键,返回true,删除失败返回false
- clear()方法: 清除所有成员,没有返回值
2.2 迭代Map
1.for of
- keys(): 返回键名的遍历器
- values(): 返回键值的遍历器
- entries(): 返回所有成员的遍历器
2. forEach
3. Map和Set的区别
- 初始化需要的值不一样,Map需要的是一个二维数组,而Set 需要的是一维 Array 数组
- Map 是键值对的存在,值不作为健;而 Set 没有 value 只有 key,value 就是 key;
- Map的键是不能修改,但是键对应的值是可以修改的;Set不能通过迭代器来改变Set的值,因为Set的值就是键。
- Map 和 Set 都不允许键重复
4. WeakSet
- WeakSet 的成员只能是对象,而不能是其他类型的值
- WeakSet中的对象都是弱引用,即如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的空间。但在Set中,只要Set实例存在引用,垃圾回收机制就不能释放该对象的内存空间,即Set类型可以看作是一个强引用。
- weakSet是不可遍历的,并且没有size属性。其内部有多少个成员取决于垃圾回收机制有没有运行, 运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此es6规定weakSet是不可遍历的。
//Set:外部设置key = null,而Set内部并没有取消引用。
let set = new Set();
let key = {
value:1
};
set.add(key);
console.log(set.size);// 1
// 取消原始引用
key = null;
console.log(set.size);// 1
// 重新获得原始引用
key = [...set][0];
console.log(key);// {value: 1}
//WeakSet:外部设置key = null,WeakSet内部的引用也取消
let ws = new WeakSet();
let key = [1, 2];
ws.add(key);
console.log(ws.has(key));// true
key = null;
console.log(ws.has(key));// false
5.WeakMap
-
WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
-
WeakMap的键名所指向的对象不计入垃圾回收机制。它的键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内。因此所有引用的对象的其他引用都被清除,垃圾回收站就会释放该对象所占用的内存。
-
WeakMap没有遍历操作(即没有key()、values()和entries()方法),也没有size属性。
-
WeakMap无法清空,即不支持clear()方法。