在 ES12 中,新的集合类型 Map、Set 和 WeakMap 被引入,它们提供了一些新的、更强大的数据结构,有助于开发者更好地处理数据。本文将会对这三个新的集合类型进行详细介绍,并提供一些示例代码和使用指导。
Map
Map 可以看作是一种键值对的集合类型,其中的键和值可以是任意类型的数据。Map 的一个主要特点是它的键可以是任意类型的数据,这与 JavaScript 中的对象有些相似,但是 Map 更为强大。
基本用法
创建一个新的 Map 对象可以使用 new Map()
,也可以直接传入一个数组,其中每个元素都是一个键值对的数组。例如:
-- -------------------- ---- ------- -- ------ --- ----- ---- - --- ------ -- ------------ --- ----- ---- - --- ----- -------- ---------- -------- ---------- -------- --------- ---
向 Map 中添加新的键值对可以使用 set(key, value)
方法,获取键对应的值可以使用 get(key)
方法,删除键值对可以使用 delete(key)
方法,检查 Map 中是否存在某个键可以使用 has(key)
方法。
-- -------------------- ---- ------- ----- --- - --- ------ --------------- ---------- --------------- ---------- ----------------------------- -- -- ------ ----------------------------- -- -- ---- ------------------- ----------------------------- -- -- -----
迭代器
Map 迭代器可以用来遍历 Map 中的键值对。Map 的迭代器有四种类型,分别是 keys、values、entries 和 Symbol.iterator。其中,Symbol.iterator 是默认的迭代器类型,可以使用 for...of
循环来遍历 Map 中的键值对。
-- -------------------- ---- ------- ----- --- - --- ----- -------- ---------- -------- ---------- -------- --------- --- -- -- --- --- --- ------ --- -- ----------- - ----------------- - -- -- --- --- --- ------ ----- -- ------------- - ------------------- - -- -- --- ----- --- ------ ----- ------ -- -------------- - ---------------- ------- -
使用场景
Map 的一个常见使用场景是用来存储一些比较复杂的数据结构,例如对象或数组。由于 Map 的键可以是任意类型的数据,因此可以很方便地将一些复杂的数据结构作为键来使用。
另外,Map 也可以用来缓存一些计算结果,以避免重复计算。例如:
-- -------------------- ---- ------- ----- ----- - --- ------ -------- ------------ - -- -------------- - ------ ------------- - ----- ------ - - -- - - - - ----------- - -- - ----------- - --- ------------ -------- ------ ------- -
Set
Set 是一种无序、唯一的集合类型,其中的元素可以是任意类型的数据。Set 的一个主要特点是它的元素是唯一的,即一个元素只会出现一次。
基本用法
创建一个新的 Set 对象可以使用 new Set()
,也可以直接传入一个数组,其中的元素会被自动去重。向 Set 中添加新的元素可以使用 add(value)
方法,检查 Set 中是否存在某个元素可以使用 has(value)
方法,删除元素可以使用 delete(value)
方法。
const set = new Set([1, 2, 3]); set.add(4); set.delete(2); console.log(set.has(3)); // 输出 true console.log(set.has(2)); // 输出 false
迭代器
Set 迭代器可以用来遍历 Set 中的元素。Set 的迭代器有三种类型,分别是 values、entries 和 Symbol.iterator。其中,Symbol.iterator 是默认的迭代器类型,可以使用 for...of
循环来遍历 Set 中的元素。
const set = new Set([1, 2, 3]); // 遍历 Set 中的元素 for (const value of set) { console.log(value); }
使用场景
Set 的一个常见使用场景是用来去重。由于 Set 中的元素是唯一的,因此可以很方便地将一个数组中的重复元素去重。
另外,Set 也可以用来判断一个元素是否存在于某个集合中。例如:
const whitelist = new Set(['alice', 'bob', 'charlie']); function isAllowed(name) { return whitelist.has(name); }
WeakMap
WeakMap 是一种弱引用的集合类型,其中的键必须是对象,值可以是任意类型的数据。WeakMap 的一个主要特点是它的键是弱引用的,即如果一个键不再被其他对象引用,它所对应的键值对会被自动删除。
基本用法
创建一个新的 WeakMap 对象可以使用 new WeakMap()
,向 WeakMap 中添加新的键值对可以使用 set(key, value)
方法,获取键对应的值可以使用 get(key)
方法,删除键值对可以使用 delete(key)
方法,检查 WeakMap 中是否存在某个键可以使用 has(key)
方法。
const weakMap = new WeakMap(); const key = {}; weakMap.set(key, 'value'); console.log(weakMap.get(key)); // 输出 value key = null; console.log(weakMap.get(key)); // 输出 undefined
使用场景
WeakMap 的一个常见使用场景是用来存储一些与对象相关的数据,例如对象的私有属性。由于 WeakMap 中的键是弱引用的,因此当一个对象被垃圾回收时,与它相关的键值对也会被自动删除,这可以避免内存泄漏。
另外,WeakMap 也可以用来实现一些高级的数据结构,例如缓存一些计算结果并避免重复计算。例如:
-- -------------------- ---- ------- ----- ----- - --- ---------- -------- ------------ - -- -------------- - ------ ------------- - ----- ------ - - -- - - - - ----------- - -- - ----------- - --- ------------ -------- ------ ------- -
总结
本文介绍了 ES12 新引入的三种集合类型:Map、Set 和 WeakMap。这三种集合类型各具特点,可以用来解决不同的问题。在实际开发中,我们可以根据具体的需求来选择合适的集合类型。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/668560afdc1ed1a61b6e463e