ES6 中 Set、Map、WeakMap 和 WeakSet 数据结构详解及使用示例表达
一、Set 数据结构
Set
是一种集合数据结构,用于存储任意类型的唯一值。它不允许重复的值存在。
-
声明方式 :
使用
new Set()
创建新的实例。javascriptconst mySet = new Set();
-
主要方法:
-
.add(value)
:向集合中添加一个新值。javascriptmySet.add(1); mySet.add("string");
-
.delete(value)
:删除指定的值。javascriptmySet.delete(1);
-
.has(value)
:判断集合中是否存在某个值。javascriptconsole.log(mySet.has("string")); // true
-
.clear()
:清空整个集合中的所有值。javascriptmySet.clear();
-
.size
:返回集合中元素的数量。javascriptconsole.log(mySet.size); // 当前集合大小
-
-
使用场景:
-
数组去重是一个常见的应用场景。
javascriptconst array = [1, 2, 2, 3, 4]; const uniqueArray = [...new Set(array)]; console.log(uniqueArray); // [1, 2, 3, 4]
-
二、Map 数据结构
Map
是一种键值对的数据结构,支持任何类型的键(不仅仅是字符串),提供更高的灵活性和性能。
-
声明方式 :
使用
new Map()
或传递初始键值对数组创建实例。javascriptconst myMap = new Map(); const mapWithInitialValues = new Map([[obj1, "aaa"], [obj2, "bbb"], [2, "ddd"]]);
-
主要方法:
-
.set(key, value)
:设置键值对。javascriptmyMap.set("name", "Alice").set("age", 25);
-
.get(key)
:通过键获取对应的值。javascriptconsole.log(myMap.get("name")); // Alice
-
.delete(key)
:删除指定键及其关联的值。javascriptmyMap.delete("age");
-
.has(key)
:检查是否包含特定键。javascriptconsole.log(myMap.has("name")); // true
-
.clear()
:清除所有的键值对。javascriptmyMap.clear();
-
.size
:返回键值对的数量。javascriptconsole.log(myMap.size); // 键值对数量
-
-
特殊能力:
-
支持对象或数组作为键。
javascriptconst objKey = { id: 1 }; const map = new Map(); map.set(objKey, "Object Key"); console.log(map.get(objKey)); // 'Object Key'
-
-
使用场景:
- 动态缓存某些复杂键值对的关系时,
Map
更加适合。
- 动态缓存某些复杂键值对的关系时,
三、WeakMap 数据结构
WeakMap
是一种特殊的映射表,其键必须是对象,且这些对象不会阻止垃圾回收的发生。
-
声明方式 :
使用
new WeakMap()
创建实例。javascriptconst weakMap = new WeakMap();
-
主要方法:
-
.set(key, value)
:设置键值对。javascriptconst objKey = {}; weakMap.set(objKey, "value");
-
.get(key)
:通过键获取对应的值。javascriptconsole.log(weakMap.get(objKey)); // value
-
.delete(key)
:删除指定键及其关联的值。javascriptweakMap.delete(objKey);
-
.has(key)
:检查是否包含特定键。javascriptconsole.log(weakMap.has(objKey)); // false
-
-
特点:
- 不允许迭代,也不暴露
.keys()
、.values()
方法。 - 键只能是对象,无法使用原始类型作为键。
- 不允许迭代,也不暴露
-
使用场景:
-
绑定私有属性到对象而不影响全局作用域。
javascriptconst privateData = new WeakMap(); function MyClass(data) { privateData.set(this, data); } MyClass.prototype.getData = function() { return privateData.get(this); }; const instance = new MyClass({ secret: "hidden" }); console.log(instance.getData()); // { secret: "hidden" }
-
四、WeakSet 数据结构
WeakSet
类似于 Set
,但它只接受对象作为成员,并且这些对象也不会被强引用保留。
-
声明方式 :
使用
new WeakSet()
创建实例。javascriptconst weakSet = new WeakSet();
-
主要方法:
-
.add(value)
:添加一个对象到集合中。javascriptconst obj = {}; weakSet.add(obj);
-
.delete(value)
:从集合中移除指定的对象。javascriptweakSet.delete(obj);
-
.has(value)
:检查集合中是否包含某个对象。javascriptconsole.log(weakSet.has(obj)); // false
-
-
特点:
- 不允许遍历,也没有
.forEach()
等方法。 - 成员仅限于对象,不支持其他类型。
- 不允许遍历,也没有
-
使用场景:
-
跟踪一组对象的状态,而不需要显式销毁它们。
javascriptconst trackedObjects = new WeakSet(); function track(object) { trackedObjects.add(object); } function isTracked(object) { return trackedObjects.has(object); } const obj = {}; track(obj); console.log(isTracked(obj)); // true
-
示例代码总结
以下是综合使用的示例:
javascript
// Set 示例
const setExample = new Set([1, 2, 3, 3]);
console.log(setExample); // Set(3) { 1, 2, 3 }
// Map 示例
const mapExample = new Map();
mapExample.set({ key: "unique" }, "value");
console.log(mapExample.get({ key: "unique" })); // undefined (因为每次创建的对象不同)
const sameObj = { key: "same" };
mapExample.set(sameObj, "sharedValue");
console.log(mapExample.get(sameObj)); // sharedValue
// WeakMap 示例
const weakMapExample = new WeakMap();
const objForWeakMap = {};
weakMapExample.set(objForWeakMap, "data");
console.log(weakMapExample.get(objForWeakMap)); // data
// WeakSet 示例
const weakSetExample = new WeakSet();
const objForWeakSet = {};
weakSetExample.add(objForWeakSet);
console.log(weakSetExample.has(objForWeakSet)); // true
