JavaScript中的集合与映射:Set、WeakSet、Map和WeakMap详解
立即解锁
发布时间: 2025-08-22 01:06:06 阅读量: 1 订阅数: 3 


深入理解ECMAScript 6的核心特性与应用
### JavaScript 中的集合与映射:Set、WeakSet、Map 和 WeakMap 详解
#### 1. Set 的基本操作与特性
Set 是一种用于跟踪唯一有序值的简单机制。以下是一些基本操作示例:
```javascript
let set = new Set([1, 2, 3, 5]);
console.log(set.has(5)); // true
set.delete(5);
console.log(set.has(5)); // false
console.log(set.size); // 1
set.clear();
console.log(set.has("5")); // false
console.log(set.size); // 0
```
在上述代码中,`delete()` 方法用于移除指定元素,`clear()` 方法用于清空集合。
#### 2. Set 的 forEach() 方法
如果你熟悉数组的 `forEach()` 方法,那么 Set 的 `forEach()` 方法使用起来也很相似。该方法接受一个回调函数,回调函数有三个参数:
- 集合中下一个位置的值
- 与第一个参数相同的值
- 读取该值的集合
以下是使用示例:
```javascript
let set = new Set([1, 2]);
set.forEach(function(value, key, ownerSet) {
console.log(key + " " + value);
console.log(ownerSet === set);
});
```
输出结果为:
```
1 1
true
2 2
true
```
与数组一样,你可以传递 `this` 值作为 `forEach()` 的第二个参数,也可以使用箭头函数来避免传递第二个参数:
```javascript
let set = new Set([1, 2]);
let processor = {
output(value) {
console.log(value);
},
process(dataSet) {
dataSet.forEach(function(value) {
this.output(value);
}, this);
}
};
processor.process(set);
// 使用箭头函数
let set = new Set([1, 2]);
let processor = {
output(value) {
console.log(value);
},
process(dataSet) {
dataSet.forEach(value => this.output(value));
}
};
processor.process(set);
```
#### 3. 将 Set 转换为数组
将数组转换为 Set 很简单,只需将数组传递给 `Set` 构造函数;而将 Set 转换回数组可以使用扩展运算符 `...`:
```javascript
let set = new Set([1, 2, 3, 3, 3, 4, 5]),
array = [...set];
console.log(array); // [1,2,3,4,5]
```
这种方法对于去除数组中的重复元素很有用:
```javascript
function eliminateDuplicates(items) {
return [...new Set(items)];
}
let numbers = [1, 2, 3, 3, 3, 4, 5],
noDuplicates = eliminateDuplicates(numbers);
console.log(noDuplicates); // [1,2,3,4,5]
```
#### 4. WeakSet 的介绍与使用
普通的 Set 存储对象引用时,只要 Set 实例的引用存在,对象就不会被垃圾回收。为了解决这个问题,ES6 引入了 WeakSet,它只存储弱对象引用,不能存储原始值。
创建 WeakSet 并使用其方法的示例如下:
```javascript
let set = new WeakSet(),
key = {};
// add the object to the set
set.add(key);
console.log(set.has(key)); // true
set.delete(key);
console.log(set.has(key)); // false
```
也可以通过传递可迭代对象来初始化 WeakSet:
```javascript
let key1 = {},
key2 = {},
set = new WeakSet([key1, key2]);
console.log(set.has(key1)); // true
console.log(set.has(key2)); // true
```
WeakSet 与普通 Set 的主要区别如下表所示:
| 特性 | 普通 Set | WeakSet |
| ---- | ---- | ---- |
| 存储原始值 | 可以 | 不可以 |
| 可迭代性 | 是 | 否 |
| 暴露迭代器 | 是 | 否 |
| 有 forEach() 方法 | 是 | 否 |
| 有 size 属性 | 是 | 否 |
#### 5. Map 的基本操作与特
0
0
复制全文
相关推荐









