# Set 和 Map

# Set

# 一些基本的东西

  • Set 结构的成员是唯一值
  • Set 加入值的时候不会发生类型转换,'5' 和 5 是两个不同的值
  • 内部判断两个值是否相等使用的算法叫做"Same-value equality",类似于 ===
  • Set 内部,NaN 等于 NaN
  • 两个对象总是不相等的
  • Array.from 方法可以将Set结构转为数组结构

# Set实例的属性和方法

# 属性

Set.prototype.constructor:构造函数,默认就是Set函数 Set.prototype.size:返回Set实例的成员总数

# 方法

  1. 操作方法
  • add:添加值,返回Set本身
  • delete:删除某值,返回布尔
  • has:表示参数是否为Set成员,返回布尔
  • clear:清除所有成员,没有返回值
const s = new Set();
s.add(1).add(2).add(2);

console.log(s.size); // 2

s.has(1) // true
s.has(2) // true
s.has(3) // false

s.delete(2)
s.has(2) // false
1
2
3
4
5
6
7
8
9
10
11
  1. 遍历操作
  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回键值对的遍历器
  • forEach(): 使用回调函数遍历每个成员

特别指出:Set的遍历顺序就是插入顺序

由于Set结构没有键名,只有键值,所以keys方法和values方法行为完全一致

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']
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Set 实例默认的遍历器生成函数就是 values

Set.prototype[Symbol.iterator] === set.prototype.values
1

# WeakSet

和Set的区别:

  • WeakSet 的成员只能是对象,不能是其他值
  • WeakSet 中的对象都是弱引用,垃圾回收不考虑WeakSet对该对象的引用,如果其他对象都不再引用该对象,垃圾回收机制就会自动回收该对象所占的内存空间
  • WeakSet 不可遍历

WeakSet的三个方法

  • add
  • delete
  • has

WeakSet 没有size属性,因为不可遍历

# Map

# 含义和基本用法

  • Map数据结构类似于对象,也是键值对的集合
  • Map的键的范围不限于字符串,各种类型都可以当键
  • 可以用数组或者Set当参数传入
const map = new Map([
  ['name', '张三'],
  ['title', 'Author']
]);

map.size // 2
map.has('name') // true
map.get('name') // "张三"
1
2
3
4
5
6
7
8
  • 相同的键多次赋值会覆盖
  • 用对象当键值对的时候要主要,判断的是对象的引用地址是否相同
  • Map中 NaN 是相等的

# 实例的属性和方法

# 属性和操作方法

  • size:属性返回 Map 结构的成员总数
  • set(key, value):设置键名key对应的键值为value,可以链式写
  • get(key):读取key对应的键值,如果找不到key,返回undefined
  • has(key):返回一个布尔值,表示某个键是否在当前 Map 对象之中
  • delete:删除某个键,返回true。如果删除失败,返回false
  • clear:清除所有成员,没有返回值

# 遍历方法

  • Map.prototype.keys():返回键名的遍历器。
  • Map.prototype.values():返回键值的遍历器。
  • Map.prototype.entries():返回所有成员的遍历器。
  • Map.prototype.forEach():遍历 Map 的所有成员。

Map 的遍历顺序就是插入顺序

# WeakMap

WeakMap与Map的区别:

  • WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名
  • WeakMap的键名所指向的对象,不计入垃圾回收机制

WeakMap的专用场合就是,它的键所对应的对象,可能会在将来消失。WeakMap结构有助于防止内存泄漏。

# 方法属性

  • get
  • set
  • has
  • delete