ES12 中的容器详解

ES12(也称为 ES2021)是 ECMAScript 标准的最新版本,它带来了许多新的功能和特性,其中包括对容器的增强。在本文中,我们将详细介绍 ES12 中的容器,包括 Map、Set、WeakMap 和 WeakSet,以及它们的使用方法和指导意义。

Map

Map 是一种键值对的集合,其中每个键对应一个唯一的值。在 ES6 中引入了 Map,而在 ES12 中,Map 被进一步增强,以支持更多的功能。

创建 Map

在 ES12 中,我们可以使用新的静态方法 Map.from() 来创建 Map。这个方法接受一个可迭代对象作为参数,例如数组或 Set,然后返回一个新的 Map。

Map 的新方法

在 ES12 中,Map 增加了一些新的实例方法:

  • map.upsert(key, value):如果 Map 中已经存在一个键为 key 的条目,则更新它的值为 value;否则,将 key 和 value 插入 Map。
  • map.update(key, updater):如果 Map 中已经存在一个键为 key 的条目,则将其值作为参数传递给 updater 函数,并将其返回值作为新值;否则,不进行任何操作。
  • map.updateOrInsert(key, updater):如果 Map 中已经存在一个键为 key 的条目,则将其值作为参数传递给 updater 函数,并将其返回值作为新值;否则,将 key 和 updater 的返回值插入 Map。
  • map.filter(predicate):返回一个新的 Map,其中只包含满足 predicate 函数的条目。
  • map.map(mapper):返回一个新的 Map,其中每个条目的值都是 mapper 函数的结果。

Set

Set 是一种无序且不重复的集合。在 ES6 中引入了 Set,而在 ES12 中,Set 被进一步增强,以支持更多的功能。

创建 Set

在 ES12 中,我们可以使用新的静态方法 Set.from() 来创建 Set。这个方法接受一个可迭代对象作为参数,例如数组或 Map,然后返回一个新的 Set。

Set 的新方法

在 ES12 中,Set 增加了一些新的实例方法:

  • set.upsert(value):如果 Set 中已经存在一个值为 value 的条目,则不进行任何操作;否则,将 value 插入 Set。
  • set.update(value, updater):如果 Set 中已经存在一个值为 value 的条目,则将其值作为参数传递给 updater 函数,并将其返回值作为新值;否则,不进行任何操作。
  • set.updateOrInsert(value, updater):如果 Set 中已经存在一个值为 value 的条目,则将其值作为参数传递给 updater 函数,并将其返回值作为新值;否则,将 updater 的返回值插入 Set。
  • set.filter(predicate):返回一个新的 Set,其中只包含满足 predicate 函数的条目。
  • set.map(mapper):返回一个新的 Set,其中每个条目的值都是 mapper 函数的结果。

WeakMap

WeakMap 是一种键值对的集合,其中每个键对应一个唯一的值。与 Map 不同的是,WeakMap 中的键只能是对象,并且当键对象不再被引用时,它对应的键值对会自动被删除。在 ES6 中引入了 WeakMap,而在 ES12 中,WeakMap 被进一步增强,以支持更多的功能。

创建 WeakMap

在 ES12 中,我们可以使用新的静态方法 WeakMap.from() 来创建 WeakMap。这个方法接受一个可迭代对象作为参数,例如数组,然后返回一个新的 WeakMap。

WeakMap 的新方法

在 ES12 中,WeakMap 增加了一些新的实例方法:

  • weakMap.upsert(key, value):如果 WeakMap 中已经存在一个键为 key 的条目,则更新它的值为 value;否则,将 key 和 value 插入 WeakMap。
  • weakMap.update(key, updater):如果 WeakMap 中已经存在一个键为 key 的条目,则将其值作为参数传递给 updater 函数,并将其返回值作为新值;否则,不进行任何操作。
  • weakMap.updateOrInsert(key, updater):如果 WeakMap 中已经存在一个键为 key 的条目,则将其值作为参数传递给 updater 函数,并将其返回值作为新值;否则,将 key 和 updater 的返回值插入 WeakMap。
  • weakMap.filter(predicate):返回一个新的 WeakMap,其中只包含满足 predicate 函数的条目。
  • weakMap.map(mapper):返回一个新的 WeakMap,其中每个条目的值都是 mapper 函数的结果。

WeakSet

WeakSet 是一种无序且不重复的集合。与 Set 不同的是,WeakSet 中的值只能是对象,并且当值对象不再被引用时,它对应的条目会自动被删除。在 ES6 中引入了 WeakSet,而在 ES12 中,WeakSet 被进一步增强,以支持更多的功能。

创建 WeakSet

在 ES12 中,我们可以使用新的静态方法 WeakSet.from() 来创建 WeakSet。这个方法接受一个可迭代对象作为参数,例如数组,然后返回一个新的 WeakSet。

WeakSet 的新方法

在 ES12 中,WeakSet 增加了一些新的实例方法:

  • weakSet.upsert(value):如果 WeakSet 中已经存在一个值为 value 的条目,则不进行任何操作;否则,将 value 插入 WeakSet。
  • weakSet.update(value, updater):如果 WeakSet 中已经存在一个值为 value 的条目,则将其值作为参数传递给 updater 函数,并将其返回值作为新值;否则,不进行任何操作。
  • weakSet.updateOrInsert(value, updater):如果 WeakSet 中已经存在一个值为 value 的条目,则将其值作为参数传递给 updater 函数,并将其返回值作为新值;否则,将 updater 的返回值插入 WeakSet。
  • weakSet.filter(predicate):返回一个新的 WeakSet,其中只包含满足 predicate 函数的条目。
  • weakSet.map(mapper):返回一个新的 WeakSet,其中每个条目的值都是 mapper 函数的结果。

总结

ES12 中的容器增强了 Map、Set、WeakMap 和 WeakSet,以支持更多的功能和特性。这些容器的新方法使得它们更加灵活和易于使用,同时也提供了更好的性能和内存管理。在实际开发中,我们可以根据具体的需求选择适合的容器,并使用它们的新方法来实现更加高效和优雅的代码。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6565c0c2d2f5e1655def74a1


纠错
反馈