键控集合

您可以使用对象字面量来存储键值对,使用数组存储 可迭代值集合。ES6 还引入了专用数据结构, “Map”用于键值对,“Set”用于 各个值

地图

映射是一种可迭代数据结构,以键值对的形式存储信息。 类似于对象字面量与对象字面量不同,映射允许两个值 键和键具有任意数据类型,而添加到映射的顺序元素则是 会在对其进行迭代时保留下来。

如需创建地图,请使用 Map() 构造函数:

const myMap = new Map();  myMap; > Map(0) 

您可以使用类似于数组(或 任何包含以下内容的迭代器对象) 类似于数组的对象,由两个元素组成。每个元素中的第一个元素 双元素数据结构成为键,而第二个元素则成为值 与该密钥相关联。最简单的形式是 每个元素本身就是一个数组,由两个元素组成:键和 元素的值:

const myMap = new Map([     [ "myKey", "A string value" ],     [ "mySecondKey", 500 ],     [ "myThirdKey", true ] ]);  myMap; > Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true} 

同样,映射对象与对象字面量的不同之处在于, 并且键可以采用任何数据类型和值:

const notAFunction = () => console.log( "function" ); const myMap = new Map([   [ null, 0 ],   [ false, "This is false" ],   [ undefined, "No defined value" ],   [ NaN, "Not a number" ] ]);  myMap; > Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'} 

如需获取、设置或删除地图元素,请使用从 Map 继承的方法 构造函数:

const myMap = new Map();  myMap; > Map(0)  myMap.set( "myKey", "My value." );  myMap.has( "myKey" ); > true  myMap.get( "myKey" ); "My value."  myMap.delete( "myKey" );  myMap; > Map(0) 

Map 中的键是唯一的,也就是说,设置相同的键会覆盖 之前存储的键值对:

const myMap = new Map([ [ "myKey", "A string value" ] ]);  myMap.set( "myKey", 500 );  myMap; > Map(1) {'myKey' => 500} 

与对象一样,您可以将映射分配给使用 const 和 然后修改该地图。但是,与 const 的其他用例一样,您不能 更改或删除变量本身:

const myMap = new Map(); myMap.set( "myKey", "A string value" );  myMap; > Map(1) {'myKey' => 500} 

WeakMap

WeakMap 是指引用、 该参数必须是对对象或符号的引用 尚未添加到全局符号注册表的 ID。

如需创建 WeakMap,请使用 WeakMap() 构造函数:

const myWeakMap = new WeakMap();  myWeakMap; > WeakMap(0) 

WeakMap 语法与 Map 语法类似,但 WeakMap 并不 可迭代,并且尝试使用 作为键的对象或符号以外的任何值都会导致语法错误。如果 存在对键的引用 该对象或符号,以及 WeakMap 和 WeakMap 均符合进行垃圾回收的条件。

这样便可实现多种用例,例如将与对象关联的元数据存储在 WeakMap,使用对象的引用作为键。如果没有其他参考文件, 并且该对象已从内存中移除,则关联的 元数据也会被移除

字符集

集是唯一值的可迭代集合,与数组有点相似, 但集只能包含唯一值。与使用 Map 时一样,对 Set 会保留向其中添加元素的顺序。

如需创建 Set,请使用 Set() 构造函数:

const mySet = new Set();  mySet; > Set [] 

您还可以从数组字面量创建集合:

const mySet = new Set([ 1, 2, 3 ]);  mySet; > Set(3) [ 1, 2, 3 ] 

由于 Set 不允许使用重复的元素,因此通过 数组包含相同值的多个实例,它只会保留第一个 具有该值的实例:

const mySet = new Set([ 1, 2, 3, 2 ]);  mySet; > Set(3) [ 1, 2, 3 ] 

如需在 Set 中添加或移除元素,请使用从 Set 继承的方法 构造函数。这些方法会根据元素的值对元素执行操作 而不是引用索引:

const mySet = new Set();  mySet.add( "My value." );  mySet; > Set [ "My value." ]  mySet.has( "My value." ); > true  mySet.delete( "My value." );  mySet; > Set [] 

虽然集不是编入索引的集合, 因此系统会对集中的元素进行迭代 。尝试向集合添加重复元素值的行为 但会保留原始广告订单:

const mySet = new Set([ 1, 2, 3 ]);  mySet; > Set(3) [ 1, 2, 3 ]  mySet.add( 2 ); > Set(3) [ 1, 2, 3 ] 

如需基于集合创建数组,请使用 Array.from() 方法或展开 语法:

const mySet = new Set([ 1, 2, 3 ]); const myArray = Array.from( mySet );  myArray; > Array(3) [ 1, 2, 3 ]  [ ...mySet ]; > Array(3) [ 1, 2, 3 ] 

WeakSet

WeakSet 是一个仅包含可垃圾回收值的集合, 例如对对象的引用或符号 尚未添加到全局符号注册表的 ID。

如需创建 WeakSet,请使用 WeakSet() 构造函数:

const myWeakSet = new WeakSet();  myWeakSet; > WeakSet [] 

WeakSet 语法与 Set 语法类似,但 WeakSet 与 可迭代,并且尝试向 对象或符号以外的任何值都会导致语法错误。与 WeakMap 一样 如果没有其他引用对 WeakSet 引用的值存在时,该值将符合 垃圾回收

这允许一些用例,例如聚合单个可迭代集合, 相关对象。如果 WeakSet 中,关联的元素也会从 WeakSet 中移除。

检查您的理解情况

考虑以下示例:

         const myMap = new Map([ [ "myKey", "My string" ] ]);         myMap.set( "myKey", 100 );       

myMap 会返回什么?

100
"My string"
undefined