Set 是不包含重复值的列表。
Map 是键值对的有序列表,键和值都可以是任意类型。
一、Set
1、Set的创建、增加、删除、和数组互转等
1、Set的创建、增加、删除、和数组互转等 //创建Set和添加项目 let set = new Set(); set.add(5); set.add(5); //多次添加相同值,只保留第一个 set.add("5"); console.log(set.size); // 2 //使用数组来初始化一个 Set let set2 = new Set([1, 2, 3, 4, 5, 5, 5, 5]); console.log(set2.size); // 5 //Set转数组 let array = [...set2]; console.log(array); // [1,2,3,4,5] //判断Set中是否存在某个值 console.log(set2.has(5)); //true console.log(set2.has(6)); //false //移除单个值 set2.delete(5); console.log(set2.has(5)); //false console.log(set2.size); //4 //移除所有值 set2.clear(); console.log(set2.size); //0
2、Set 上的 forEach() 方法
forEach() 方法会被传递一个回调函数,该回调接受三个参数:Set中下个位置的值、与第一个参数相同的值、目标Set 自身。
具有 forEach() 方法的其他对象(即数组与 Map )都会给回调函数传递三个参数,前两个参数都分别是下个位置的值与键(给数组使用的键是数值索引)。
Set却没有键,为了让这些回调函数保持参数相同,将Set中的每一项同时认定为键与值,所以该回调函数的前两个参数就始终相同。
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 */
3、Weak Set
对象存储在 Set 的一个实例中时,实际上相当于把对象存储在变量中。只要对于 Set 实例的引用仍然存在,所存储的对象就无法被垃圾回收机制回收,可以被称为 Strong Set。
let set = new Set(), key = {a: 1}; set.add(key); console.log(set.size); // 1 // 取消原始引用 key = null; console.log(set.size); // 1 // 重新获得原始引用 key = [...set][0]; console.log(key); //{a: 1}
将key设置为 null 清除了对key对象的一个引用,但是另一个引用还存于set内部。你仍然可以使用扩展运算符将Set 转换为数组,然后访问数组的第一项,key变量就取回了原先的对象。
Weak Set只允许存储对象弱引用,不能存储基本类型的值。对象的弱引用在它自己成为该对象的唯一引用时,不会阻止垃圾回收。
Weak Set 没有 forEach() 方法和size 属性。
let set = new WeakSet(), key = {}; // 将对象加入 set set.add(key); console.log(set.has(key)); // true //set.delete(key); //移除对于键的最后一个强引用,同时从Weak Set中移除 key = null;
二、 Map
1、Map的创建、增加、删除等
1、Map的创建、增加、删除等 let map = new Map(); //添加键值对 map.set("name", "张三"); map.set("age", 20); //查询有多少个键值对 console.log(map.size); // 2 //判断指定的键是否存在于 Map 中 console.log(map.has("name")); // true //根据指定的键获取对应的值 console.log(map.get("name")); // "张三" //移除Map中的键以及对应的值 map.delete("name"); //移除Map中所有的键与值 map.clear(); console.log(map.has("name")); // false console.log(map.get("name")); // undefined //使用数组初始化 let map2 = new Map([["name", "张三"], ["age", 20]]); //map2键值对和map一样 console.log(map2.get("name")); // "张三" console.log(map2.get("age")); // 20 console.log(map2.size); // 2
2、Map 上的 forEach 方法
let map = new Map([["name", "张三"], ["age", 20]]); map.forEach(function(value, key, ownerMap) { console.log(key + " " + value); console.log(ownerMap === map); }); /*输出: name 张三 true age 20 true */
3、Weak Map
在Weak Map中,所有的键都必须是对象,当这些键在Weak Map之外不存在引用时,该键值对会被移除。
let key1 = {}, key2 = {}, map = new WeakMap([[key1, "Hello"], [key2, 42]]); console.log(map.has(key1)); // true console.log(map.get(key1)); // "Hello" console.log(map.has(key2)); // true console.log(map.get(key2)); // 42