JavaScript 是一种动态语言,它可以通过对象字面量来创建对象,但在某些情况下,使用 Map/Set/WeakMap/WeakSet 数据结构会更加高效和便捷。这些数据结构都是 ES6 引入的,而在 ES8 中,它们都得到了进一步的改进和完善。
Map
Map 是一种以键值对形式存储数据的数据结构,其中键和值可以是任意类型的数据。Map 中的键是唯一的,而值则可以重复。Map 提供了一些常用的方法,如 set、get、has、delete 和 clear 等。
创建 Map
可以使用 Map 构造函数来创建一个空的 Map 对象:
const map = new Map();
也可以在创建时添加键值对:
const map = new Map([ ['key1', 'value1'], ['key2', 'value2'], ['key3', 'value3'] ]);
Map 方法
set
set 方法用于向 Map 中添加键值对:
map.set('key4', 'value4');
get
get 方法用于获取指定键的值:
console.log(map.get('key1')); // 输出 value1
has
has 方法用于判断是否存在指定键:
console.log(map.has('key2')); // 输出 true
delete
delete 方法用于删除指定键值对:
map.delete('key3');
clear
clear 方法用于清空 Map 中的所有键值对:
map.clear();
Map 遍历
Map 提供了三种遍历方法:keys、values 和 entries。其中,keys 方法返回 Map 中所有键的迭代器,values 方法返回 Map 中所有值的迭代器,而 entries 方法返回 Map 中所有键值对的迭代器。
-- -------------------- ---- ------- --- ------ --- -- ----------- - ----------------- - --- ------ ----- -- ------------- - ------------------- - --- ------ ----- ------ -- -------------- - -------------------- ----------- -展开代码
Set
Set 是一种不重复的数据集合,其中的元素可以是任意类型的数据。Set 提供了一些常用的方法,如 add、has、delete 和 clear 等。
创建 Set
可以使用 Set 构造函数来创建一个空的 Set 对象:
const set = new Set();
也可以在创建时添加元素:
const set = new Set(['value1', 'value2', 'value3']);
Set 方法
add
add 方法用于向 Set 中添加元素:
set.add('value4');
has
has 方法用于判断 Set 中是否存在指定元素:
console.log(set.has('value2')); // 输出 true
delete
delete 方法用于删除指定元素:
set.delete('value3');
clear
clear 方法用于清空 Set 中的所有元素:
set.clear();
Set 遍历
Set 提供了三种遍历方法:keys、values 和 entries。其中,keys 方法返回 Set 中所有元素的迭代器,values 方法返回 Set 中所有元素的迭代器,而 entries 方法返回 Set 中所有元素的迭代器(因为 Set 中的元素没有键,所以 entries 方法返回的是 [value, value] 数组)。
-- -------------------- ---- ------- --- ------ --- -- ----------- - ----------------- - --- ------ ----- -- ------------- - ------------------- - --- ------ ----- ------ -- -------------- - -------------------- ----------- -展开代码
WeakMap
WeakMap 与 Map 类似,也是一种以键值对形式存储数据的数据结构,但其中的键必须是对象,而值可以是任意类型的数据。WeakMap 中的键是弱引用的,即当键对象被垃圾回收时,与之关联的键值对也会自动被删除。WeakMap 提供了一些常用的方法,如 set、get、has 和 delete 等。
创建 WeakMap
可以使用 WeakMap 构造函数来创建一个空的 WeakMap 对象:
const weakMap = new WeakMap();
也可以在创建时添加键值对:
const obj1 = {}; const obj2 = {}; weakMap.set(obj1, 'value1'); weakMap.set(obj2, 'value2');
WeakMap 方法
set
set 方法用于向 WeakMap 中添加键值对:
const obj3 = {}; weakMap.set(obj3, 'value3');
get
get 方法用于获取指定键的值:
console.log(weakMap.get(obj1)); // 输出 value1
has
has 方法用于判断是否存在指定键:
console.log(weakMap.has(obj2)); // 输出 true
delete
delete 方法用于删除指定键值对:
weakMap.delete(obj3);
WeakMap 的应用
WeakMap 的一个常见应用是用于存储对象的私有属性,因为这些属性只能通过对象本身来访问,而外部代码无法访问。
-- -------------------- ---- ------- ----- ------------ - --- ---------- ----- ------- - ------------- - ---------------------- - ------------- --------- ------------- -------- --- - ----------------- - ------ ------------------------------------ - ---------------------- - ----------------------------------- - ------ - - ----- --- - --- ---------- ----------------------------------- -- -- ------ ------------------------ --------- ----------------------------------- -- -- --- ------展开代码
WeakSet
WeakSet 与 Set 类似,也是一种不重复的数据集合,但其中的元素必须是对象。WeakSet 中的元素是弱引用的,即当元素对象被垃圾回收时,该元素也会自动被删除。WeakSet 提供了一些常用的方法,如 add、has 和 delete 等。
创建 WeakSet
可以使用 WeakSet 构造函数来创建一个空的 WeakSet 对象:
const weakSet = new WeakSet();
也可以在创建时添加元素:
const obj1 = {}; const obj2 = {}; weakSet.add(obj1); weakSet.add(obj2);
WeakSet 方法
add
add 方法用于向 WeakSet 中添加元素:
const obj3 = {}; weakSet.add(obj3);
has
has 方法用于判断 WeakSet 中是否存在指定元素:
console.log(weakSet.has(obj2)); // 输出 true
delete
delete 方法用于删除指定元素:
weakSet.delete(obj3);
WeakSet 的应用
WeakSet 的一个常见应用是用于存储对象的标记,例如用于判断某个对象是否已经被处理过。
-- -------------------- ---- ------- ----- ------------ - --- ---------- -------- ------------------ - -- ----------------------- - ------- - -- ---- ---------------------- -展开代码
总结
Map/Set/WeakMap/WeakSet 数据结构是 JavaScript 中非常常用的数据结构,它们可以帮助我们更加高效和便捷地存储和处理数据。在使用这些数据结构时,需要注意它们的特点和使用方法,以充分发挥它们的优势。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651157db95b1f8cacd9cc6c4