ES6的Map结构

ES6 引入了新的数据结构MapSetWeakMapWeakSet

Map

JavaScript中,ObjectMap都是键值对的集合,但是Object,只能用字符串当作key,而Map的不限于字符串,
Map结构提供了value-value的对应,Map有内建的遍历机制,是更完善的 Hash 结构实现。所以在使用中如果需要key: value的数据结构,使用Map结构。
Map具有极快的查找速度。

基本用法

Map方法的参数可以为空,可以是一个数组。任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构。例如Set

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const person = new Map([
['name', 'xiaoming'],
['age', 18]
]);
person.set('sex', 'man')
person.has('sex') // true
person.get('sex') // 'man'
person.delete('sex') // true
person.has('sex') // false
person.size //2
person.clear() //0, 清除所有
//key为一个object
let address = {
province: 'shanghai'
city:'shanghai'
}
person.set(address, 'china')
person.get(address) // 'china'
//读取一个未知的键,则返回`undefined`
person.get('height') //undefined
//只有对同一个对象的引用,Map 结构才将其视为同一个键
person.get({
province: 'shanghai'
city:'shanghai'
})
//undefined, 这里的get的key虽然与address相同的,但实际上这是两个值,内存地址是不一样的,因此get方法无法读取该键,返回undefined。

遍历Map

  • keys():返回键名的遍历器。
  • values():返回键值的遍历器。
  • entries():返回所有成员的遍历器。
  • forEach():遍历 Map 的所有成员
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const person2 = new Map([
['name', 'xiaoming'],
['age', 18]
]);
for (let key of person2.keys()) {
console.log(key);
}
// "name"
// "age"
for (let value of person2.values()) {
console.log(value);
}
// "xiaoming"
// 18
for (let item of person2.entries()) {
console.log(item[0], item[1]);
}
// 'name' 'xiaoming'
// 'age' 18
for (let [key, value] of person2.entries()) {
console.log(key, value);
}
// 'name' 'xiaoming'
// 'age' 18

Set

Set类似于数组,但是成员的值都是唯一的。

基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const SET = new Set([1, 1, 2, 2, 3, 3, 3]);
for (let i of SET) {
console.log(i);
}
//1 2 3
SET.size // 3
SET.has(1) // true
SET.has(4) // false
SET.delete(2);
SET.has(2) // false
SET.clear()
SET.size //0
SET.add(4)
SET.has(4) // true

上面的代码中可以看出Set可以用作数组去重

遍历Set

  • keys():返回键名的遍历器。
  • values():返回键值的遍历器。
  • entries():返回所有成员的遍历器。
  • forEach():遍历 Map 的所有成员

    Set的key和value是同一个值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    const SET = new Set(['cat', 'dog', 'pig']);
    for (let item of SET.keys()) {
    console.log(item);
    }
    // 'cat'
    // 'dog'
    // 'pig'
    for (let item of SET.values()) {
    console.log(item);
    }
    // 'cat'
    // 'dog'
    // 'pig'

WeakMap

WeakMapMap类似,但是WeakMap只接受对象作为key(除了null)。
WeakMap的key所指向的对象,不计入垃圾回收机制,是弱引用,只要外部的引用消失,WeakMap 内部的引用,就会自动被垃圾回收清除。
也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。有助于防止内存泄漏。
size、forEach、clear 方法都不存在。

WeakSet

WeakSetSet类似,但是WeakSet只接受对象作为key。
WeakSet的key所指向的对象,不计入垃圾回收机制,是弱引用,只要外部的引用消失,WeakSet 内部的引用,就会自动被垃圾回收清除。
也就是说,一旦不再需要,WeakSet 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。有助于防止内存泄漏。
size、forEach方法不存在。

本文出自 ECMAScript 6 入门