📅  最后修改于: 2020-10-25 10:43:01             🧑  作者: Mango
ES6引入了两个新的数据结构:Maps和Sets。
映射-此数据结构允许将键映射到值。
集-集类似于数组。但是,集合不鼓励重复。
Map对象是一个简单的键/值对。映射中的键和值可以是原始的或对象的。
以下是相同的语法。
new Map([iterable])
参数iterable表示其元素由键/值对组成的任何可迭代对象。地图是有序的,即,地图按其插入顺序遍历元素。
Sr.No | Property & Description |
---|---|
1 |
Map.prototype.size
This property returns the number of key/value pairs in the Map object. |
set()函数设置Map对象中键的值。 set()函数采用两个参数,即键及其值。此函数返回Map对象。
has()函数返回一个布尔值,该布尔值指示是否在Map对象中找到指定的键。此函数以键作为参数。
var map = new Map();
map.set('name','Tutorial Point');
map.get('name'); // Tutorial point
上面的示例创建一个地图对象。该地图只有一个元素。元素键由name表示。该键被映射到一个值Tutorial point 。
注–映射区分相似的值,但具有不同的数据类型。换句话说,认为整数键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
注意-如果指定的键在映射中不存在,则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 | Method & Description |
---|---|
1 |
Map.prototype.clear()
Removes all key/value pairs from the Map object. |
2 |
Map.prototype.delete(key)
Removes any value associated to the key and returns the value that Map.prototype.has(key) would have previously returned. Map.prototype.has(key) will return false afterwards. |
3 |
Map.prototype.entries()
Returns a new Iterator object that contains an array of [key, value] for each element in the Map object in insertion order. |
4 |
Map.prototype.forEach(callbackFn[, thisArg])
Calls callbackFn once for each key-value pair present in the Map object, in insertion order. If a thisArg parameter is provided to forEach, it will be used as the ‘this’ value for each callback . |
5 |
Map.prototype.keys()
Returns a new Iterator object that contains the keys for each element in the Map object in insertion order. |
6 |
Map.prototype.values()
Returns a new Iterator object that contains an array of [key, value] for each element in the Map object in insertion order. |
以下示例说明了使用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 & Description |
---|---|
1 |
Set.prototype.size
Returns the number of values in the Set object. |
Sr.No | Method & Description |
---|---|
1 |
Set.prototype.add(value)
Appends a new element with the given value to the Set object. Returns the Set object. |
2 |
Set.prototype.clear()
Removes all the elements from the Set object. |
3 |
Set.prototype.delete(value)
Removes the element associated to the value. |
4 |
Set.prototype.entries()
Returns a new Iterator object that contains an array of [value, value] for each element in the Set object, in insertion order. This is kept similar to the Map object, so that each entry has the same value for its key and value here. |
5 |
Set.prototype.forEach(callbackFn[, thisArg])
Calls callbackFn once for each value present in the Set object, in insertion order. If athisArg parameter is provided to forEach, it will be used as the ‘this’ value for each callback. |
6 |
Set.prototype.has(value)
Returns a boolean asserting whether an element is present with the given value in the Set object or not. |
7 |
Set.prototype.values()
Returns a new Iterator object that contains the values for each element in the Set object in insertion order. |
弱集只能包含对象,并且它们包含的对象可能被垃圾回收。像弱映射一样,弱集合也无法迭代。
'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
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}