JavaScript中的Set、Map、WeakSet和WeakMap是ES6中新增的数据结构,它们都提供了一种非常便捷和高效的方式来管理数据。在本文中,我们将介绍它们的基本概念以及常用方法,并提供一些示例代码。
Set
Set是一种无重复值的集合,它可以存储任何类型的值。Set中的值是唯一的,重复的值将被自动去重。下面是一些常用的Set方法:
add(value)
:向Set中添加一个新的值。delete(value)
:从Set中删除一个值。has(value)
:检查Set中是否存在某个值。size
:返回Set中值的数量。clear()
:清空Set中的所有值。forEach(callbackFn, thisArg)
:遍历Set中的每个值,并对其执行回调函数。
下面是一个使用Set的示例代码:
const set = new Set();set.add(1); // 添加值1
set.add(2); // 添加值2
set.add(3); // 添加值3
set.add(2); // 添加重复的值2,但不会被添加进Set中console.log(set.size); // 输出3,Set中有3个唯一的值set.delete(2); // 从Set中删除值2console.log(set.has(2)); // 输出false,Set中不再包含值2set.forEach((value) => {console.log(value);
});
Map
Map是一种键值对的集合,其中的键和值可以是任何类型。Map中的键是唯一的,重复的键将被覆盖。下面是一些常用的Map方法:
set(key, value)
:向Map中添加一个新的键值对。get(key)
:获取指定键的值。has(key)
:检查Map中是否存在某个键。delete(key)
:从Map中删除指定键的键值对。size
:返回Map中键值对的数量。clear()
:清空Map中的所有键值对。forEach(callbackFn, thisArg)
:遍历Map中的每个键值对,并对其执行回调函数。
下面是一个使用Map的示例代码:
const map = new Map();map.set('name', 'John'); // 设置键'name'的值为'John'
map.set('age', 30); // 设置键'age'的值为30
map.set('name', 'Jane'); // 重复设置键'name'的值为'Jane',会覆盖原有的值console.log(map.get('name')); // 输出'Jane',获取键'name'的值console.log(map.has('age')); // 输出true,Map中包含键'age'map.forEach((value, key) => {console.log(key + ': ' + value);
});
WeakSet
WeakSet是一种弱引用的集合,它只能存储对象类型的值。WeakSet中的值是唯一的,重复的值将被自动去重。WeakSet对值的引用是弱引用,当值不再被引用时,该值将被自动回收。因此,WeakSet不能被迭代,也没有方法可以获取WeakSet中的所有值。
下面是一个使用WeakSet的示例代码:
const weakSet = new WeakSet();const obj1 = { name: 'John' };
const obj2 = { name: 'Jane' };weakSet.add(obj1); // 将obj1添加进WeakSet
weakSet.add(obj2); // 将obj2添加进WeakSet
weakSet.add(obj1); // 将重复的obj1添加进WeakSet,但不会被添加console.log(weakSet.has(obj1)); // 输出true,WeakSet中包含obj1weakSet.delete(obj1); // 从WeakSet中删除obj1console.log(weakSet.has(obj1)); // 输出false,WeakSet中不再包含obj1
WeakMap
WeakMap是一种弱引用的键值对的集合,其中的键是对象类型,值可以是任何类型。WeakMap中的键是唯一的,重复的键将被覆盖。WeakMap对键的引用是弱引用,当键不再被引用时,该键值对将被自动回收。因此,WeakMap不能被迭代,也没有方法可以获取WeakMap中的所有键值对。
下面是一个使用WeakMap的示例代码:
const weakMap = new WeakMap();const obj1 = {};
const obj2 = {};weakMap.set(obj1, 'value1'); // 设置键为obj1的值为'value1'
weakMap.set(obj2, 'value2'); // 设置键为obj2的值为'value2'
weakMap.set(obj1, 'value3'); // 重复设置键为obj1的值为'value3',会覆盖原有的值console.log(weakMap.get(obj1)); // 输出'value3',获取键为obj1的值console.log(weakMap.has(obj2)); // 输出true,WeakMap中包含键为obj2的键值对weakMap.delete(obj1); // 从WeakMap中删除键为obj1的键值对console.log(weakMap.has(obj1)); // 输出false,WeakMap中不再包含键为obj1的键值对
总结:
Set、Map、WeakSet和WeakMap是JavaScript中非常有用的数据结构,它们分别提供了无重复值的集合、键值对的集合、弱引用的集合和弱引用的键值对集合的功能。通过使用它们提供的方法,我们可以很方便地管理和操作数据。