# 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实例的成员总数
# 方法
- 操作方法
- 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
2
3
4
5
6
7
8
9
10
11
- 遍历操作
- 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
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
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