set
ES6 提供了新的数据结构 Set。它类似数组,但成员的值都是唯一的没有重复的值。
- Set 本身是一个构造函数用来生成 Set 数据结构。
- Set 函数接收一个数组或者具有 iterable 接口的其他数据。
- 向 Set 中加入值得时候不会发生类型转换。
- 在 Set 内部 NaN 等于 NaN,所以不会存储多次。
Set 实例属性和方法
属性
- constructor: 构造函数,默认就是 Set 函数
- size: 返回 Set 实例的成员总数
方法
- add(value): 用于添加某个值,返回 Set 结构本身
- delete(value):删除某个值,返回一个布尔值,表示删除是否成功
- has(value): 返回一个布尔值,表示该值知否为 Set 的成员
- clear(): 清除所有的成员,没有返回值
遍历操作
由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以 keys 和 values 方法的行为一致
- keys(): 返回键名的遍历器
- values(): 返回键值的遍历器
- entries(): 返回键值对的遍历器
- forEach(): 使用回调函数遍历每个成员
javascript
let set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.values()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.entries()) {
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
// Set结构默认可遍历,它的默认遍历器生成函数就是它的values方法,这意味着可以省略values方法,直接用for...of遍历Set
for (let x of set) {
console.log(x);
}
// red
// green
// blue
let set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value));
// 1 : 1
// 4 : 4
// 9 : 9
遍历的应用
- 数组去重
WeakSet
WeakSet 结构与 Set 类似,也是不可重复,但它与 Set 有两个区别:1.WeakSet 成员只能是对象; 2.WeakSet 中的对象都是弱引用,即垃圾回收机制不会考虑 WeakSet 对该对象的引用。3.WeakSet 不可遍历
实例的方法
- add(value)
- delete(value)
- has(value)
Map
JavaScript 中的对象传统上只能用字符串作为键。Map 类似于对象,它的键可以使各种可以是各种类型的值。
语法
javascript
const map1 = new Map();
map1.set({ a: 1 }, 1);
// 任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作 Map 构造函数的参数
const map2 = new Map([
['name', 'richard'],
['age', '26'],
]);
只要两个值严格相等,Map 将其视为一个键只有对同一对象的引用 Map 才视为同一个值,0 和-0 是一个值,NaN 视为一个值。
javascript
const map = new Map();
map.set(['a'], 1);
map.get(['a']); // undefined
实例的属性和方法
- size 属性:返回 Map 结构的成员总数
- set(key, value):返回整个 Map 结构
- get(key): 返回 key 对应的 value,找不到返回 undefined
- has(key): 返回一个布尔值,表示键是否在当前 Map 对象之中
- delete(key): 删除某个键,成功返回 true
- clear(): 清空所有的成员,没有返回值
遍历方法
- keys(): 返回键名的遍历器
- values(): 返回键值的遍历器
- entries(): 返回所有成员的遍历器
- forEach(callback, this): 遍历 Map 的所有成员
- callback 有三个参数 value, key 和 map
- this 需要指向的 this
Map 结构的默认遍历器就是 entries 方法。Map 结构转为数组结构比较快速的方法就是使用扩展运算符。
javascript
const map = new Map([
[1, 'one'],
[2, 'two'],
[3, 'three'],
]);
[...map.entries()];
// [[1,'one'], [2, 'two'], [3, 'three']]
[...map];
// [[1,'one'], [2, 'two'], [3, 'three']]
WeakMap
WeakMap 只接受对象作为键名(null 除外),WeakMap 的键名指向的对象不计入垃圾回收机制。
实例的属性
- get(key)
- set(key)
- has(key)
- delete(key)