Set
-
Set集合是一种无重复元素的列表,通常的用途用以检测给定的元素在某个集合中是否存在
-
ES5模拟Set
var set = Object.create(null); set.foo = true; if (set.foo) {} if ('foo' in set) {}
-
ES6里面的Set
-
Set类型是一种有序列表,不会对键进行强制类型转换(对象的键只能是字符串,故会对键进行强制类型转换)
-
初始化
let set = new Set(); // 无参数 let set = new Set([1, 2, 3, 4]); // 参数为数组,会对数组去重,键为元素 let set = new Set(iterableObj); // 任何可迭代对象,包括Set和Map
-
Set使用Object.is()比较两个键是否相同,注意:键+0和-0会被认为是同一个键,但Object.is(+0, -0) = false
-
增删查
let set = new Set(); set.add(1); set.add(2); set.add(3); set.add(4); console.log(set.size); // 4,返回集合的长度 console.log(set.has(1)); // true set.delete(1); console.log(set.has(1)); // false set.clear(); // 清空 console.log(set.size); // 0
-
遍历方法forEach
-
参数
Set集合中下一次索引的位置
与第一个参数一样的值(主要是为了跟Map、数组一样接受三个参数)
集合本身
let set = new Set(['a', 'b']); set.forEach((value, key, ownerSet) => { console.log(value, key, ownerSet === set); }); // 'a', 'a', true // 'b', 'b', true
-
-
不能通过索引来直接访问元素
-
使用展开运算符…即可将set转换为数组
let set = new Set(['a', 'b']); console.log([...set]); // ['a', 'b']
-
Weak Set
-
Weak Set集合只储存对象的弱引用,并且不可以存储原始值;集合中的弱引用如果是对象唯一的引用,则会被回收并释放相应的内存
-
增删查(除此之外没有其他的方法,无清空方法clear)
let set = new WeakSet(), key = {}; set.add(key); console.log(set.has(key)); // true set.delete(key); console.log(set.has(key)); // false
-
Weak Set构造函数不接受任何原始值,如果数组里面包含其他非对象值,程序会抛出错误
let key1 = {}, key2 = {}; let set = new WeakSet([key1, key2]);
-
在WeakSet实例中,如果向add()方法传入非对象参数会导致程序报错,而向has()和delete()方法传入非对象参数则会返回false
-
WeakSet集合不可迭代,所以不能被用于for-of循环
-
WeakSet集合不暴露任何迭代器(例如keys()和value()方法),所以无法通过程序本身来检查其中的内容
-
WeakSet集合不支持forEach()方法
-
WeakSet集合不支持size属性
-
如果只需要跟踪对象引用,更应该使用WeakSet集合而不是普通的Set集合
Map
-
Map类型是一种储存着许多键值对的有序列表,其中的键名和对应的值支持所有的数据类型
-
键名的等价性判断是通过Object.is()方法实现的
-
增删查改
let map = new Map(); map.set('name', 'Crane'); // 增加和修改都是同一个接口 map.set('age', 22); map.set('gf', 0); console.log(map.has('name')); // 查询 console.log(map.get('name')); // 获取 console.log(map.get('age')); // 获取 console.log(map.size); // 获取长度 map.delete('gf'); // 删除一个键值对 console.log(map.size); map.clear(); // 清空map console.log(map.size);
-
实例化
// 使用数组传参: // 确保键值对被储存到Map集合中之前不会被强制转换为其他数据类型 let map = new Map([['name', 'Crane'], ['age', 22]]);
-
遍历方法forEach
-
参数:
Map集合中下一次索引的位置
值对应的键名
Map集合本身
let map = new Map([['name', 'Crane'], ['age', 22]]); map.forEach((value, key, ownerMap) => { console.log(key + ' ' + value); console.log(ownerMap === map); }); // name Crane // true // age 25 // true
-
WeakMap
-
WeakMap集合中的键名必须是一个对象,如果使用非对象键名会报错,集合中保存的是这些值的弱引用,如果在弱引用之外不存在其他的强引用,引擎的垃圾回收机制会自动回收这个对象,同时也会移除WeakMap集合中的键值对。但是只有集合的键名遵从这个规则,键名对应的值如果是一个对象,则保存的是对象的强引用,不会触发垃圾回收机制
-
WeakMap 类型是一种储存着许多键值对的无序列表,列表的键名必须是非null类型的对象,键名对应的值则可以是任意类型
-
WeakMap实例没有size属性
-
增删查
let key1 = {}, key2 = {}, map = new WeakMap([[key1, 'Hello'], [key2, 'Crane']]), element = document.getElementById('id'); if (map.has(key1)) { console.log(map.get(key1)); } map.set(element, 'Element'); element.parentNode.removeChild(element); console.log(map.has(element))