Skip to content

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)