主要知识点:Set的基本操做,Weak Set,Map的基本操做,Weak Map
![]()
ES6 提供了新的数据结构 Set。它相似于数组,可是成员的值都是惟一的,没有重复的值。segmentfault
Set 自己是一个构造函数,用来生成 Set 数据结构。数组
let set = new Set(); set.add(5); set.add("5"); console.log(set.size); // 2
可使用数组来初始化一个 Set ,而且 Set 构造器会确保不重复地使用这些值:数据结构
let set = new Set([1, 2, 3, 4, 5, 5, 5, 5]); console.log(set.size); // 5
使用 has() 方法来测试某个值是否存在于 Set 中:函数
let set = new Set(); set.add(5); set.add("5"); console.log(set.has(5)); // true console.log(set.has(6)); // false
使用 delete() 方法来移除单个值,或调用 clear() 方法来将全部值从 Set 中移除。测试
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 console.log(set.size); // 1 set.clear(); console.log(set.has("5")); // false console.log(set.size); // 0
forEach() 方法会被传递一个回调函数,该回调接受三个参数:spa
let set = new Set([1, 2]); set.forEach(function(value, key, ownerSet) { console.log(key + " " + value); console.log(ownerSet === set); }); // 输出 1 1 true 2 2 true
let set = new Set([1, 2, 3, 3, 3, 4, 5]), array = [...set]; console.log(array); // [1,2,3,4,5]
能够用此方法进行数组去重:code
function eliminateDuplicates(items) { return [...new Set(items)]; } let numbers = [1, 2, 3, 3, 3, 4, 5], noDuplicates = eliminateDuplicates(numbers); console.log(noDuplicates); // [1,2,3,4,5]
Set的引用类型:对象存储在 Set 的一个实例中时,实际上至关于把对象存储在变量中。只要对于 Set 实例的引用仍然存在,所存储的对象就没法被垃圾回收机制回收,从而没法释放内存。对象
let set = new Set(), key = {}; set.add(key); console.log(set.size); // 1 // 取消原始引用 key = null; console.log(set.size); // 1 // 从新得到原始引用 key = [...set][0];
当 JS 代码在网页中运行,同时你想保持与 DOM 元素的联系,在该元素可能被其余脚本移除的状况下,你应当不但愿本身的代码保留对该 DOM 元素的最后一个引用(这种状况被称为内存泄漏)。
Weak Set
该类型只容许存储对象弱引用,而不能存储基本类型的值。对象的弱引用在它本身成为该对象的惟一引用时,不会阻止垃圾回收:
建立 Weak Setblog
let set = new WeakSet(), key = {}; // 将对象加入 set set.add(key); console.log(set.has(key)); // true set.delete(key); console.log(set.has(key)); // false
和Set的区别:
const ws = new WeakSet(); ws.add(1) // TypeError: Invalid value used in weak set ws.add(Symbol()) // TypeError: invalid value used in weak set
ES6 的 Map 类型是键值对的有序列表,而键和值均可以是任意类型。
let map = new Map(); map.set("title", "Understanding ES6"); map.set("year", 2016); console.log(map.get("title")); // "Understanding ES6" console.log(map.get("year")); // 2016
若是任意一个键不存在于 Map 中, 则 get() 方法就会返回特殊值 undefined
能够将对象做为键,这些键不会被强制转换成其余形式,每一个对象就都被认为是惟一的
let map = new Map(), key1 = {}, key2 = {}; map.set(key1, 5); map.set(key2, 42); console.log(map.get(key1)); // 5 console.log(map.get(key2)); // 42
属性:size
let map = new Map(); map.set("name", "Nicholas"); map.set("age", 25); console.log(map.size); // 2 console.log(map.has("name")); // true console.log(map.get("name")); // "Nicholas" console.log(map.has("age")); // true console.log(map.get("age")); // 25 map.delete("name"); console.log(map.has("name")); // false console.log(map.get("name")); // undefined console.log(map.size); // 1 map.clear(); console.log(map.has("name")); // false console.log(map.get("name")); // undefined console.log(map.has("age")); // false console.log(map.get("age")); // undefined console.log(map.size); // 0
将数组传递给 Map 构造器,以便使用数据来初始化一个 Map 。该数组中的每一项也必须是数组,内部数组的首个项会做为键,第二项则为对应值:
let map = new Map([["name", "Nicholas"], ["age", 25]]); console.log(map.has("name")); // true console.log(map.get("name")); // "Nicholas" console.log(map.has("age")); // true console.log(map.get("age")); // 25 console.log(map.size); // 2
let map = new Map([ ["name", "Nicholas"], ["age", 25]]); map.forEach(function(value, key, ownerMap) { console.log(key + " " + value); console.log(ownerMap === map); }); //打印: name Nicholas true age 25 true