Set
- 定义
这是一种无重复值的有序列表(如果添加了重复项相当于添加无效,对象除外,因为他们不会被转为字符串类型相同的对象在其中就是两个object,也没有类型转换)。Set允许对它包含的数据进行快速访问,从而增加了一个追踪离散值的更有效方式。 - 基本操作与方法
let set = new Set(); // 创建set对象 set.add(5); // 添加元素,也可以添加对象 set.add("5"); // 没有类型转换所以可以添加进去 console.log(set.size); // console.log(set.has(5)) // 返回true set.delete(5); // 删除指定元素 set.clear(); //删除所有元素 // 也可以用数组初始化set对象,同样的会自动忽略相同值 let set1 = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
- forEach()
循环遍历set中元素
forEach中回调函数要使用this值时在整个的第二个参数加上this,或者使用箭头函数。let set = new Set([1, 2, 3]); set.forEach(function(vaule, key, ownSet){ console.log(vaule); });// 第一、二个参数为set对象首元素,第三个参数为set自身
set.forEach((value) => this.output(value));
- set对象转换为数组(剩余运算符实现)
那么以这种方式我们多了一种数组去重的办法:let set = new Set([1, 2, 3]); let arr = [...set];
function deWeight(arr) { return [...(new Set(arr))]; } // 将数组对象转化为set对象存储在转为数组 let arr = [1, 1, 1, 1, 1, 2]; console.log(deWeight(arr));
- weakSet
是set对象的一个弱引用,set方法存入的对象当对象指定在外部指定去除时set对象内部任然会有,weakSet更加像是一个指向性的对象外部去除内部也不会存在
几点区别:- weakSet各种方法只能传入对象
- 没有forEach方法
Map
- 定义
Map更像是一种数据关联,为可以为一个对象设置一个键值一起存储到Map对象,然后通过键值去访问到数据,json中键值只能是字符型,但Map键值都可以。 - 基本操作方法
存入为set、访问为get,都是通过操作键值(键值可以是对象),其他与set对象相同。// 定义添加 let map = new Map(); map.set(键值,键值对应值); // 直接添加 let map = new Map([["name", "Nicholas"], ["age", 25]]);
- Map的forEach方法
用法与set对象一致,相对于理解上Map的该方法更能说通三个参数为键值、键值对应值、对象本身。 - weakMap
与前面所介绍weakSet的各项特点一致。简化了构建私有化对象的问题,这边是书本上看到的一个私有化案例还不是很懂意思,还需琢磨一下。let Person = (function() { let privateData = new WeakMap(); function Person(name) { privateData.set(this, { name: name }); } Person.prototype.getName = function() { return privateData.get(this).name; }; return Person; }());