集合
ES6 引入了几种新的数据结构,称为集合(Collections),主要包括Set、WeakSet、Map和WeakMap。这些新集合类型为 JavaScript 提供了更强大和灵活的数据管理能力。
Set
Set是一种新的数据结构,它允许你存储任何类型的唯一值,无论是原始值还是对象引用。Set中的元素是唯一的,重复的值会被忽略。
- 基本操作:
javascript
let set = new Set([1, 2, 3, 2, 1]);
console.log(set); // 输出: Set { 1, 2, 3 }
// 添加元素
set.add(4);
console.log(set.has(4)); // 输出: true
// 删除元素
set.delete(2);
console.log(set); // 输出: Set { 1, 3, 4 }
// 遍历Set
for (let item of set) {
console.log(item); // 输出: 1, 3, 4
}WeakSet
WeakSet与Set类似,但有一些关键区别:只能包含对象,并且持有的对象是弱引用。这意味着如果一个对象只被WeakSet引用,那么它有可能被垃圾回收机制回收。
- 特点:
- 只能添加对象。
- 对象是弱引用。
- 没有遍历方法(如
forEach)和获取所有键的方法(因为对象可能会随时被回收)。
javascript
let ws = new WeakSet();
let obj = {};
ws.add(obj);
console.log(ws.has(obj)); // 输出: true
ws.delete(obj);
console.log(ws.has(obj)); // 输出: falseMap
Map是一种可以将任何类型的键映射到值的数据结构。与使用对象(Object)作为键值对存储相比,Map具有几个优势,包括保持插入顺序、更好的性能以及能够使用非字符串作为键。
- 基本操作:
javascript
let map = new Map([
["name", "Alice"],
["age", 25],
]);
console.log(map.get("name")); // 输出: Alice
// 设置键值对
map.set("gender", "female");
console.log(map.size); // 输出: 3
// 删除键值对
map.delete("age");
console.log(map.has("age")); // 输出: false
// 遍历Map
for (let [key, value] of map) {
console.log(key + ": " + value);
}WeakMap
WeakMap类似于Map,但它只接受对象作为键,并且这些对象是弱引用。当没有其他引用指向某个键对象时,该键值对可能会被自动移除并允许其键对象被垃圾回收。
- 特点:
- 键必须是对象。
- 键是弱引用。
- 没有遍历方法或获取所有键的方法。
javascript
let wm = new WeakMap();
let keyObj = {};
wm.set(keyObj, "value associated with keyObj");
console.log(wm.get(keyObj)); // 输出: value associated with keyObj
wm.delete(keyObj);
console.log(wm.has(keyObj)); // 输出: false通过引入Set、WeakSet、Map和WeakMap,ES6 极大地增强了 JavaScript 处理复杂数据结构的能力,特别是在需要高效地管理和追踪大量数据的情况下。这些集合类型不仅提高了代码的可读性和维护性,也为开发者提供了更多灵活性来解决各种问题。