ES6 - 集合
ES6 引入了两种新的数据结构:Maps 和 Sets。
Maps − 此数据结构支持将键映射到值。
Sets − 集合类似于数组。但是,集合不鼓励重复。
Maps
Map 对象是一个简单的键/值对。Map 中的键和值可以是原始的,也可以是对象。
以下是其语法。
new Map([iterable])
参数 iterable 表示任何可迭代对象,其元素由键/值对组成。地图是有序的,即它们按照插入的顺序遍历元素。
地图属性
Sr.No | 属性和说明 |
---|---|
1 |
Map.prototype.size
此属性返回 Map 对象中的键/值对的数量。 |
了解基本 Map 操作
set() 函数设置 Map 对象中键的值。set() 函数接受两个参数,即键及其值。此函数返回 Map 对象。
has() 函数返回一个布尔值,表示是否在 Map 对象中找到指定的键。此函数将键作为参数。
var map = new Map(); map.set('name','Tutorial Point'); map.get('name'); // Tutorial point
以上示例创建了一个 map 对象。该 map 只有一个元素。元素键由 name 表示。键映射到值 Tutorial point。
注意 − Map 区分相似的值,但具有不同的数据类型。换句话说,整数键 1 被认为不同于 字符串键"1"。请考虑以下示例以更好地理解此概念
var map = new Map(); map.set(1,true); console.log(map.has("1")); //false map.set("1",true); console.log(map.has("1")); //true
输出
false true
set() 方法也是可链接的。请考虑以下示例。
var roles = new Map(); roles.set('r1', 'User') .set('r2', 'Guest') .set('r3', 'Admin'); console.log(roles.has('r1'))
输出
True
上述示例定义了一个 map 对象。该示例链接 set() 函数来定义键/值对。
get() 函数用于检索与指定键相对应的值。
Map 构造函数也可以传递一个数组。此外,map 还支持使用扩展运算符来表示数组。
示例
var roles = new Map([ ['r1', 'User'], ['r2', 'Guest'], ['r3', 'Admin'], ]); console.log(roles.get('r2'))
成功执行上述代码后将显示以下输出。
Guest
注意 − 如果指定的键在映射中不存在,则 get() 函数返回 undefined。
如果键的值已存在于映射中,则 set() 会替换该键的值。请考虑以下示例。
var roles = new Map([ ['r1', 'User'], ['r2', 'Guest'], ['r3', 'Admin'], ]); console.log(`value of key r1 before set(): ${roles.get('r1')}`) roles.set('r1','superUser') console.log(`value of key r1 after set(): ${roles.get('r1')}`)
成功执行上述代码后将显示以下输出。
value of key r1 before set(): User value of key r1 after set(): superUser
映射方法
Sr.No | 方法 &描述 |
---|---|
1 |
Map.prototype.clear()
从 Map 对象中删除所有键/值对。 |
2 |
Map.prototype.delete(key)
删除与键关联的任何值并返回 Map.prototype.has(key) 之前返回的值。 Map.prototype.has(key) 将返回 false之后。 |
3 |
Map.prototype.entries()
返回一个新的 Iterator 对象,该对象包含 Map 对象中每个元素的 [key, value] 数组(按插入顺序排列)。 |
4 |
Map.prototype.forEach(callbackFn[, thisArg])
对 Map 对象中存在的每个键值对调用一次 callbackFn,插入顺序。如果为 forEach 提供了 thisArg 参数,它将被用作每个回调的'this'值。 |
5 |
Map.prototype.keys()
返回一个新的 Iterator 对象,该对象按插入顺序包含 Map 对象中每个元素的 keys。 |
6 |
Map.prototype.values()
返回一个新的 Iterator 对象,该对象按插入顺序包含 Map 对象中每个元素的 [key, value] 数组。 |
for…of 循环
以下示例说明如何使用 for…of 循环遍历地图。
'use strict' var roles = new Map([ ['r1', 'User'], ['r2', 'Guest'], ['r3', 'Admin'], ]); for(let r of roles.entries()) console.log(`${r[0]}: ${r[1]}`);
成功执行上述代码后将显示以下输出。
r1: User r2: Guest r3: Admin
弱映射
弱映射与映射相同,但有以下例外 −
其键必须是对象。
弱映射中的键可以被垃圾收集。垃圾收集是清除程序中未引用对象占用的内存的过程。
弱映射无法迭代或清除。
示例:弱映射
'use strict' let weakMap = new WeakMap(); let obj = {}; console.log(weakMap.set(obj,"hello")); console.log(weakMap.has(obj));// true
成功执行上述代码后将显示以下输出。
WeakMap {} true
集合
集合是 ES6 数据结构。它类似于数组,但不能包含重复项。换句话说,它允许您存储唯一值。集合支持原始值和对象引用。
与映射一样,集合也是有序的,即元素按其插入顺序进行迭代。可以使用以下语法初始化集合。
集合属性
Sr.No | 属性 &描述 |
---|---|
1 |
Set.prototype.size
返回 Set 对象中的值的数量。 |
Set 方法
Sr.No | 方法 &描述 |
---|---|
1 |
Set.prototype.add(value)
将具有给定值的新元素附加到 Set 对象。返回 Set 对象。 |
2 |
Set.prototype.clear()
从 Set 对象中删除所有元素。 |
3 |
Set.prototype.delete(value)
删除与值关联的元素。 |
4 |
Set.prototype.entries()
返回一个新的 Iterator 对象,该对象包含 Set 对象中每个元素的 [value, value] 数组(按插入顺序排列)。这与 Map 对象保持相似,因此每个条目的键和值都具有相同的值。 |
5 |
Set.prototype.forEach(callbackFn[, thisArg])
按插入顺序对 Set 对象中存在的每个值调用一次 callbackFn。如果为 forEach 提供了 athisArg 参数,它将用作每个回调的"this"值。 |
6 |
Set.prototype.has(value)
返回一个布尔值,断言 Set 对象中是否存在具有给定值的元素。 |
7 |
Set.prototype.values()
返回一个包含按插入顺序对 Set 对象中的每个元素执行 values。 |
弱集
弱集只能包含对象,并且它们包含的对象可能会被垃圾收集。与弱映射一样,弱集无法迭代。
示例:使用弱集
'use strict' let weakSet = new WeakSet(); let obj = {msg:"hello"}; weakSet.add(obj); console.log(weakSet.has(obj)); weakSet.delete(obj); console.log(weakSet.has(obj));
成功执行上述代码后将显示以下输出。
true false
迭代器
迭代器是一个允许一次访问一个对象集合的对象。set 和 map 都有返回迭代器的方法。
迭代器是具有 next() 方法的对象。调用 next() 方法时,它会返回一个具有 'value' 和 'done' 属性的对象。'done' 是布尔值,在读取集合中的所有项目后将返回 true
示例 1:集合和迭代器
var set = new Set(['a','b','c','d','e']); var iterator = set.entries(); console.log(iterator.next())
成功执行上述代码后将显示以下输出。
{ value: [ 'a', 'a' ], done: false }
由于集合不存储键/值,值数组包含类似的键和值。由于有更多元素需要读取,因此 done 将为 false。
示例 2:集合和迭代器
var set = new Set(['a','b','c','d','e']); var iterator = set.values(); console.log(iterator.next());
成功执行上述代码后将显示以下输出。
{ value: 'a', done: false }
示例 3:集合和迭代器
var set = new Set(['a','b','c','d','e']); var iterator = set.keys(); console.log(iterator.next());
成功执行上述代码后将显示以下输出。
{ value: 'a', done: false }
示例 4:映射和迭代器
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.entries(); console.log(iterator.next());
成功执行上述代码后将显示以下输出。
{ value: [ 1, 'one' ], done: false }
示例 5:映射和迭代器
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.values(); console.log(iterator.next());
成功执行上述代码后将显示以下输出。
{value: "one", done: false}
示例 6:映射和迭代器
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.keys(); console.log(iterator.next());
成功执行上述代码后将显示以下输出。
{value: 1, done: false}