- 0133技术站
- 联系QQ:18840023
- QQ交流群
- 微信公众号
ES6引入了两种新的数据结构:Map和Set。
● Map - 此数据结构可将键映射到值。
● Set - 集类似于数组。但是,集合不鼓励重复。
Map
Map对象是一个简单的键/值对。Map中的键和值可以是原始的或对象。
以下是语法:
new Map([iterable])
参数iterable表示任何可迭代对象,其元素包含键/值对。映射是有序的,即它们按插入顺序遍历元素。
Map属性
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对象。地图只有一个元素。元素键由name表示。键被映射到值Tutorial Point。
注 - Map区分相似但具有不同数据类型的值。换句话说,整数(integer)键 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还支持使用spread操作符表示数组。
例:
var roles = new Map([ ['r1', 'User'], ['r2', 'Guest'], ['r3', 'Admin'], ]); console.log(roles.get('r2'))
成功执行上述代码后,将显示以下输出:
Guest
注 - 如果映射中不存在指定的键,则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方法
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一次。如果将thisArg参数提供给forEach,它将用作每个回调的“this”值。 |
5 | Map.prototype.keys() 返回一个新的Iterator对象,该对象按插入顺序包含映射对象中每个元素的键。 |
6 | Map.prototype.values() 返回一个新的Iterator对象,该对象按插入顺序包含映射对象中每个元素的值。 |
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 Map
Weak Map与Map相同,但以下情况除外:
● 它的键必须是对象。
● Weak Map中的键可以是垃圾收集。垃圾收集是清除程序中未引用对象占用的内存的过程。
● Weak 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
Set
Set是ES6数据结构。它类似于一个数组,但它不能包含重复项。换句话说,它允许您存储唯一值。设置支持原始值和对象引用。
就像Map一样,Set(集合)也是有序的,即元素按其插入顺序迭代。可以使用以下语法初始化集合。
new Set([iterable])
参数iterable表示任何可迭代对象。
Set属性
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对象,该对象包含集合对象中每个元素的[value, value]数组,按插入顺序排列。这与Map对象保持类似,因此每个条目的键值和这里的值都是相同的。 |
5 | Set.prototype.forEach(callbackFn[, thisArg]) 对于Set对象中出现的每个值,按插入顺序调用指定函数callbackFn一次。如果将athisArg参数提供给forEach,它将用作每个回调的“this”值。 |
6 | Set.prototype.has(value) 返回一个布尔值,用于断言元素是否在set对象中具有给定值。 |
7 | Set.prototype.values() 返回一个新的Iterator对象,该对象按插入顺序包含集合对象中每个元素的值。 |
Weak Set
Weak Set只能包含对象,它们包含的对象可能是垃圾回收。像Weak Map一样,Weak Set不能迭代。
示例:使用Weak 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
Iterator是一个允许一次访问一个对象集合的对象。set和map都有返回迭代器的方法。
Iterator是具有next()方法的对象。当调用next()方法时,它返回一个具有'value'和'done'属性的对象。'done'是boolean,在读取集合中的所有项目后返回true。
示例1:Set和Iterator
var set = new Set(['a','b','c','d','e']); var iterator = set.entries(); console.log(iterator.next())
成功执行上述代码后,将显示以下输出:
{ value: [ 'a', 'a' ], done: false }
由于set不存储键/值,因此值数组包含类似的键和值。done将为false,因为有更多的元素需要读取。
示例2:Set和Iterator
var set = new Set(['a','b','c','d','e']); var iterator = set.values(); console.log(iterator.next());
成功执行上述代码后,将显示以下输出:
{ value: 'a', done: false }
例3:Set和Iterator
var set = new Set(['a','b','c','d','e']); var iterator = set.keys(); console.log(iterator.next());
成功执行上述代码后,将显示以下输出:
{ value: 'a', done: false }
示例4:Map和Iterator
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和Iterator
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.values(); console.log(iterator.next());
成功执行上述代码后,将显示以下输出:
{value: "one", done: false}
例6:Map和Iterator
var map = new Map([[1,'one'],[2,'two'],[3,'three']]); var iterator = map.keys(); console.log(iterator.next());
成功执行上述代码后,将显示以下输出:
{value: 1, done: false}
推荐手册