ES12(也称为 ES2021)是 ECMAScript 标准的最新版本,它带来了许多新的功能和特性,其中包括对容器的增强。在本文中,我们将详细介绍 ES12 中的容器,包括 Map、Set、WeakMap 和 WeakSet,以及它们的使用方法和指导意义。
Map
Map 是一种键值对的集合,其中每个键对应一个唯一的值。在 ES6 中引入了 Map,而在 ES12 中,Map 被进一步增强,以支持更多的功能。
创建 Map
在 ES12 中,我们可以使用新的静态方法 Map.from()
来创建 Map。这个方法接受一个可迭代对象作为参数,例如数组或 Set,然后返回一个新的 Map。
const arr = [['key1', 'value1'], ['key2', 'value2']]; const map = Map.from(arr); console.log(map); // Map(2) { 'key1' => 'value1', 'key2' => 'value2' }
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 函数的结果。
// javascriptcn.com 代码示例 const map = new Map([['key1', 'value1'], ['key2', 'value2']]); map.upsert('key1', 'new value'); // 更新 key1 的值为 'new value' map.upsert('key3', 'value3'); // 插入一个新的键值对 map.update('key2', value => value.toUpperCase()); // 将 key2 的值转换为大写 map.update('key3', value => value.toUpperCase()); // 不进行任何操作 map.updateOrInsert('key2', value => value.toUpperCase()); // 将 key2 的值转换为大写 map.updateOrInsert('key4', value => value.toUpperCase()); // 插入一个新的键值对 const filtered = map.filter(([key, value]) => key.startsWith('key')); console.log(filtered); // Map(3) { 'key1' => 'new value', 'key2' => 'VALUE2', 'key4' => 'VALUE' } const mapped = map.map(([key, value]) => [key.toUpperCase(), value.toLowerCase()]); console.log(mapped); // Map(4) { 'KEY1' => 'new value', 'KEY2' => 'VALUE2', 'KEY3' => 'value3', 'KEY4' => 'value' }
Set
Set 是一种无序且不重复的集合。在 ES6 中引入了 Set,而在 ES12 中,Set 被进一步增强,以支持更多的功能。
创建 Set
在 ES12 中,我们可以使用新的静态方法 Set.from()
来创建 Set。这个方法接受一个可迭代对象作为参数,例如数组或 Map,然后返回一个新的 Set。
const arr = ['value1', 'value2', 'value1']; const set = Set.from(arr); console.log(set); // Set(2) { 'value1', 'value2' }
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 函数的结果。
// javascriptcn.com 代码示例 const set = new Set(['value1', 'value2']); set.upsert('value1'); // 不进行任何操作 set.upsert('value3'); // 插入一个新的值 set.update('value2', value => value.toUpperCase()); // 将 value2 的值转换为大写 set.update('value3', value => value.toUpperCase()); // 不进行任何操作 set.updateOrInsert('value2', value => value.toUpperCase()); // 将 value2 的值转换为大写 set.updateOrInsert('value4', value => value.toUpperCase()); // 插入一个新的值 const filtered = set.filter(value => value.startsWith('value')); console.log(filtered); // Set(4) { 'value1', 'VALUE2', 'value3', 'value4' } const mapped = set.map(value => value.toUpperCase()); console.log(mapped); // Set(4) { 'VALUE1', 'VALUE2', 'VALUE3', 'VALUE4' }
WeakMap
WeakMap 是一种键值对的集合,其中每个键对应一个唯一的值。与 Map 不同的是,WeakMap 中的键只能是对象,并且当键对象不再被引用时,它对应的键值对会自动被删除。在 ES6 中引入了 WeakMap,而在 ES12 中,WeakMap 被进一步增强,以支持更多的功能。
创建 WeakMap
在 ES12 中,我们可以使用新的静态方法 WeakMap.from()
来创建 WeakMap。这个方法接受一个可迭代对象作为参数,例如数组,然后返回一个新的 WeakMap。
const arr = [[{}, 'value1'], [{}, 'value2']]; const weakMap = WeakMap.from(arr); console.log(weakMap); // WeakMap { [object Object] => 'value1', [object Object] => 'value2' }
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 函数的结果。
// javascriptcn.com 代码示例 const weakMap = new WeakMap([[{}, 'value1'], [{}, 'value2']]); weakMap.upsert({}, 'new value'); // 插入一个新的键值对 weakMap.upsert({}, 'new value'); // 插入一个新的键值对 weakMap.update({}, value => value.toUpperCase()); // 不进行任何操作 weakMap.updateOrInsert({}, value => value.toUpperCase()); // 插入一个新的键值对 const filtered = weakMap.filter(([key, value]) => value.startsWith('value')); console.log(filtered); // WeakMap { [object Object] => 'value1', [object Object] => 'value2' } const mapped = weakMap.map(([key, value]) => [{}, value.toLowerCase()]); console.log(mapped); // WeakMap { [object Object] => 'value1', [object Object] => 'value2' }
WeakSet
WeakSet 是一种无序且不重复的集合。与 Set 不同的是,WeakSet 中的值只能是对象,并且当值对象不再被引用时,它对应的条目会自动被删除。在 ES6 中引入了 WeakSet,而在 ES12 中,WeakSet 被进一步增强,以支持更多的功能。
创建 WeakSet
在 ES12 中,我们可以使用新的静态方法 WeakSet.from()
来创建 WeakSet。这个方法接受一个可迭代对象作为参数,例如数组,然后返回一个新的 WeakSet。
const arr = [{}, {}, {}]; const weakSet = WeakSet.from(arr); console.log(weakSet); // WeakSet { [object Object], [object Object], [object Object] }
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 函数的结果。
// javascriptcn.com 代码示例 const weakSet = new WeakSet([{}, {}, {}]); weakSet.upsert({}); // 插入一个新的值 weakSet.upsert({}); // 插入一个新的值 weakSet.update({}, value => value.toUpperCase()); // 不进行任何操作 weakSet.updateOrInsert({}, value => value.toUpperCase()); // 插入一个新的值 const filtered = weakSet.filter(value => true); console.log(filtered); // WeakSet { [object Object], [object Object], [object Object] } const mapped = weakSet.map(value => ({})); console.log(mapped); // WeakSet { [object Object], [object Object], [object Object] }
总结
ES12 中的容器增强了 Map、Set、WeakMap 和 WeakSet,以支持更多的功能和特性。这些容器的新方法使得它们更加灵活和易于使用,同时也提供了更好的性能和内存管理。在实际开发中,我们可以根据具体的需求选择适合的容器,并使用它们的新方法来实现更加高效和优雅的代码。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6565c0c2d2f5e1655def74a1