# 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
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
8size
属性返回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
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结构和其他结构转换
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
2
3
4
5
6
7
8
Array --> Map
将数组传入Map
构造函数即可
# WeakMap
WeakMap
的设计目的在于,有时想在某个对象上面存放一些数据,但是这会形成对于这个对象的引用。一旦不再需要这两个对象,就必须手动删除这个引用,否则垃圾回收机制就不会释放对象占用的内存。
WeakMap
结构与Map
结构类似,也是用于生成键值对的集合
WeakMap
只接受对象作为键名(null
除外),不接受其他类型的值作为键名WeakMap
的键名所指向的对象,不计入垃圾回收机制。也就是说,一旦不再需要,WeakMap
里面的键名对象和所对应的键值对会自动消失,不用手动删除引用WeakMap
弱引用的只是键名而不是键值。键值依然是正常引用的。WeakMap
不存在遍历方法,也没有size
属性。因为没有办法列出所有键名,某个键名是否存在完全不可预测,和垃圾回收机制是否运行相关。其clear()
方法已经被弃用,所以可以通过创建一个空的WeakMap
并替换原对象来实现清除。
← Symbol基本数据类型 Set数据结构 →