键控集合

您可以使用对象字面量来存储键值对,使用数组存储 可迭代值集合。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