您可以使用对象字面量来存储键值对,使用数组存储 可迭代值集合。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
会返回什么?
undefined
"My string"
100