教程 > ES6 教程 > ES6 高级 阅读:39

ES6 集合

ES6引入了两个新的数据结构。Map 和 集合。

  • Maps - 这种数据结构可以将一个键映射到一个值。
  • 集合 - 集合类似于数组。然而,集合不鼓励重复。

Map

Map 对象是一个简单的键/值对。Map 中的键和值可以是原始的或对象。

以下是相同的语法。

new Map([iterable]) 

参数 iterable 代表任何可迭代的对象,其元素由一个键/值对组成。Map 是有序的,也就是说,它们按照插入的顺序遍历元素。

Map 属性

序号 属性 描述
1 Map.prototype.size 此属性返回Map对象中键/值对的数量。

了解基本的Map操作

set() 函数为Map对象中的键设置值。set() 函数需要两个参数,即键和它的值。这个函数返回Map对象。

has() 函数返回一个布尔值,表示在 Map 对象中是否找到指定的键。这个函数需要一个键作为参数。

var map = new Map(); 
map.set('name','Fql Jiyik'); 
map.get('name'); // Fql Jiyik

上面的例子创建了一个 Nao 对象。该 Map 只有一个元素。元素的键是由名称表示的。键被映射到一个值 Fql Jiyik

注意 - 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 

上面的例子,定义了一个地图对象。 该示例链接 set() 函数以定义键/值对。

get() 函数用于检索与指定键对应的值。

也可以向 Map 构造函数传递一个数组。 此外,map 还支持使用展开运算符来表示数组。

var roles = new Map([ 
   ['r1', 'User'], 
   ['r2', 'Guest'], 
   ['r3', 'Admin'], 
]);  
console.log(roles.get('r2'))

成功执行上述代码后会显示以下输出。

Guest

注意 - 如果指定的键在 Map 中不存在,则 get() 函数返回 undefined

如果键已经存在于 map 中,则 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

Map 方法

序号 方法 描述
1 Map.prototype.clear() 从 Map 对象中删除所有键/值对。
2 Map.prototype.delete(key) 删除与键关联的任何值并返回 Map.prototype.has(key) 之前返回的值。
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 对象中每个元素的键。
6 Map.prototype.values() 返回一个新的 Iterator 对象,该对象包含按插入顺序排列的 Map 对象中每个元素的 [key, value] 数组。

for…of 循环

以下示例说明了使用 for...of 循环遍历 Map。

'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

Weak Maps

Weak Map 与 Map 相同,但有以下例外 -

它的键必须是对象。

Weak Map 中的键可以被垃圾收集。 垃圾收集是清除程序中未引用对象占用的内存的过程。

无法迭代或清除弱映射。

use strict' 
let weakMap = new WeakMap(); 
let obj = {}; 
console.log(weakMap.set(obj,"hello"));  
console.log(weakMap.has(obj));// true

成功执行上述代码后会显示以下输出。

WeakMap {} 
true

集合

集合是 ES6 数据结构。 它类似于数组,但它不能包含重复项。 换句话说,它允许我们存储唯一值。 集合支持原始值和对象引用。

就像 Map 一样,集合也是有序的,即元素按其插入顺序迭代。 可以使用以下语法初始化集合。

集合属性

序号 属性 描述
1 Set.prototype.size 返回 Set 对象中值的数量。

集合方法

序号 方法 描述
1 Set.prototype.add(value) 将具有给定值的新元素附加到 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。 如果将 thisArg 参数提供给 forEach,它将用作每个回调的“this”值。
6 Set.prototype.has(value) 返回一个布尔值,断言某个元素是否存在于 Set 对象中并具有给定值。
7 Set.prototype.values() 返回一个新的 Iterator 对象,它包含按插入顺序排列的 Set 对象中每个元素的值。

Weak 集合

Weak集只能包含对象,并且它们包含的对象可能会被垃圾收集。 与 Weak Map 一样,Weak 集不能迭代。

'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 将是错误的,因为有更多的元素需要阅读。

示例 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:Map 和迭代器

var map = new Map([[1,'one'],[2,'two'],[3,'three']]); 
var iterator = map.entries(); 
console.log(iterator.next()); 

成功执行上述代码后会显示以下输出。

{ value: [ 1, 'one' ], done: false }  

示例 5:Map 和迭代器

var map = new Map([[1,'one'],[2,'two'],[3,'three']]); 
var iterator = map.values(); 
console.log(iterator.next());  

成功执行上述代码后会显示以下输出。

{value: "one", done: false} 

示例 6:Map 和迭代器

var map = new Map([[1,'one'],[2,'two'],[3,'three']]); 
var iterator = map.keys(); 
console.log(iterator.next());  

成功执行上述代码后会显示以下输出。

成功执行上述代码后会显示以下输出。

查看笔记

扫码一下
查看教程更方便