# Map

# Map概念

ES6提供了Map数据结构,类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包含对象)都可以当作键。是一种更完善的Hash结构实现。Object数据结构的键仅局限于字符串类型

# Map的方法

  • Map结构的set方法,将对象o当作m的一个键,然后又使用get方法读取这个值,set方法返回是当前的Map对象,因此可以采用链式写法
const m = new Map();
const o = {p: 'Hello world'};
m.set(o,'content')
m.get(o) //'content'
m.has(o) //true
m.delete(o)//true
m.has(o)//false
1
2
3
4
5
6
7
  • Map作为构造函数,Map可以接受一个数组作为参数,该数组的成员是一个个表示键值对的数组。

    const map = new Map([                         
      ['name','张三'],
      ['title','Author']
    ])       
    map.size//2
    map.has('name')//true
    map.get('name')//'张三'
    // 上面代码新建Map实例时,就指定了两个键name和title
    
    1
    2
    3
    4
    5
    6
    7
    8

    上述构造函数实例中执行的是以下算法

    const items = [
      ['name', '张三'],
      ['title', 'Author']
    ];
    const map = new Map();
    items.forEach(
    	([key,value]) => map.set(key, value)
    )
    
    1
    2
    3
    4
    5
    6
    7
    8
  • size属性返回Map结构的成员总数

TIP

  • 只有对同一个对象的引用,Map结构才将其视为同一个键
  • 如果Map的键是一个简单类型的值,则只要两个值严格相等,Map就将其视为一个键,包括0-0。另外NaN不严格等于自身,但Map将其视为同一个键。

实例的属性和操作方法

  • size属性。返回Map结构的成员总数。
  • set方法设置键值,返回整个Map结构。
  • get方法读取key对应的键值,如果找不到key,则返回undefined
  • has判断某个键是否在Map数据结构中,返回一个布尔值
  • delete方法删除某个键,返回true。如果删除失败则返回false
  • clear清除所有成员,没有返回值。

# Map遍历方法

  • Map.prototype.keys();返回键名的遍历器
  • Map.prototype.values();返回键值的遍历器
  • Map.prototype.entries();返回所有成员的遍历器
  • Map.prototype.forEach();遍历Map所有成员
const map = new Map([
  ['F','no'],['T','yes']
])
for(let key of map.keys()){
  console.log(key);//"F","T"
}
for(let value of map.values()){
  console.log(value)//"no","yes"
}
for(let item of map.entries()){
  console.log(item[0],item[1])
  //"F" "no"
  //"T" "yes"							
}
//或者
for(let [key,value] of map.entries()){
  console.log(key,value)
}
//"F" "no"
//"T" "yes"
//等同于使用map.entries()
for(let [key,value] of map) {
  console.log(key,value)
}
//"F" "no"
//"T" "yes"
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

上面的最后例子表示,Map结构的默认遍历器接口(Symbol.iterator属性)就是entries方法。

map[Symbol.iterator] === map.entries
1

# Map结构和其他结构转换

  1. Map-->Array
const map = new Map([
  ['1','one'],
  ['2','two'],
  ['3','three']
])

[...map]
// [[1,'one'],[2,'two'],[3,'three']]
1
2
3
4
5
6
7
8
  1. Array --> Map 将数组传入Map构造函数即可

# WeakMap

WeakMap 的设计目的在于,有时想在某个对象上面存放一些数据,但是这会形成对于这个对象的引用。一旦不再需要这两个对象,就必须手动删除这个引用,否则垃圾回收机制就不会释放对象占用的内存。

WeakMap结构与Map结构类似,也是用于生成键值对的集合

  • WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名
  • WeakMap的键名所指向的对象,不计入垃圾回收机制。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用
  • WeakMap弱引用的只是键名而不是键值。键值依然是正常引用的。
  • WeakMap不存在遍历方法,也没有size属性。因为没有办法列出所有键名,某个键名是否存在完全不可预测,和垃圾回收机制是否运行相关。其 clear() 方法已经被弃用,所以可以通过创建一个空的 WeakMap 并替换原对象来实现清除。