ES6引入了两种新的数据结构:地图和集合.
地图 : 此数据结构可以将键映射到值.
设置 : 集类似于数组.但是,集合不鼓励重复.
Map对象是一个简单的密钥/值对.地图中的键和值可以是原始的或对象.
以下是相同的语法.
new Map([iterable])
参数iterable表示其元素由键/值对组成的任何可迭代对象.地图是有序的,即它们按插入顺序遍历元素.
Sr.No | Property&描述 |
---|---|
1 | Map.prototype.size 此属性返回键数/Map对象中的值对. |
set()函数设置Map对象中键的值. set()函数有两个参数,即键及其值.此函数返回Map对象.
has()函数返回一个布尔值,指示是否在Map对象中找到指定的键.此函数将键作为参数.
var map = new Map(); map.set('name','Tutorial Point'); map.get('name'); // Tutorial point
上面的例子创建了一个地图对象.地图只有一个元素.元素键由 name 表示.键被映射到值教程点.
注意 : 地图区分相似的值但具有不同的数据类型.换句话说,整数键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
上面的例子定义了一个地图对象.该示例链接set()函数以定义键/值对.
get()函数用于检索与指定键对应的值.
Map构造函数也可以传递给数组.此外,map还支持使用spread运算符来表示数组.
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对象,该对象包含一个 [key,value]数组,用于Map对象中的每个元素插入顺序. |
4 | Map.prototype.forEach(callbackFn [,thisArg]) 按插入顺序为Map对象中的每个键值对调用 callbackFn 一次.如果向forEach提供thisArg参数,它将被用作每个回调的'this'值. |
5 | Map.prototype.keys() 按插入顺序返回一个新的Iterator对象,该对象包含Map对象中每个元素的键 . |
6 | Map.prototype.values() 以插入顺序返回一个新的Iterator对象,该对象包含 [key,value]数组,用于Map对象中的每个元素. |
以下示例说明使用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 | Property&描述 |
---|---|
1 | Set.prototype.size 返回集合中的值的数量对象. |
Sr.No | Method&描述 |
---|---|
1 | Set.prototype.add(value) 追加新元素Set对象的给定值.返回Set对象. |
2 | Set.prototype.clear() 从Set对象中删除所有元素. |
3 | 设置. prototype.delete(value) 删除与该值相关联的元素. |
4 | Set.prototype.entries() 返回一个新的Iterator对象,其中包含 [value,value]的数组Set对象中的元素,按插入顺序排列.这类似于Map对象,因此每个条目的键和值都具有相同的值. |
5 | Set.prototype.forEach(callbackFn [,thisArg]) 对Set对象中的每个值调用 callbackFn 插入顺序.如果向forEach提供 athisArg 参数,则它将用作每个回调的"this"值. |
6 | Set.prototype.has(value) 返回一个布尔值,断言一个元素是否与Set对象中的给定值一起出现. |
7 | Set.prototype.values() 以插入顺序返回一个新的Iterator对象,其中包含Set对象中每个元素的值. |
弱集只能包含对象,它们包含的对象可能是垃圾收集的.像弱映射一样,弱集不能迭代.
'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
Iterator是一个允许访问对象集合的对象一次一个. set和map都有返回迭代器的方法.
迭代器是 next()方法的对象.当调用next()方法时,它返回一个具有'value'和'done'属性的对象. 'done'是boolean,在读取集合中的所有项目后返回true
var set = new Set(['a','b','c','d','e']); var iterator = set.entries(); console.log(iterator.next())
成功执行上述代码后会显示以下输出.
{ value: [ 'a', 'a' ], done: false }
由于该集合不存储键/值,因此值数组包含类似的键和值.完成将是假的,因为有更多的元素要读.
var set = new Set(['a','b','c','d','e']); var iterator = set.values(); console.log(iterator.next());
成功执行上述代码后会显示以下输出.
{ value: 'a', done: false }
var set = new Set(['a','b','c','d','e']); var iterator = set.keys(); console.log(iterator.next());
成功执行上述代码后会显示以下输出.
{ value: 'a', done: false }
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.entries(); console.log(iterator.next());
成功执行上述代码后会显示以下输出.
{ value: [ 1, 'one' ], done: false }
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.values(); console.log(iterator.next());
成功执行上述代码后会显示以下输出.
{value: "one", done: false}
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.keys(); console.log(iterator.next());
成功执行上述代码后会显示以下输出.
{value: 1, done: false}