Map 和 WeakMap的区别

112 阅读2分钟

Map

Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值。

var str = 'string'
var num = 123
var obj = {}
var fn = function(){}
var myMap = new Map()
myMap.set(str, '字符串')
myMap.set(num, 10)

Map(4) {'string' => '字符串', 123 => 10, {…} => {…}, ƒ => '我是函数'}

Map数据结构有如下API:

  • size:myMap.size 返回Map对象的成员数量。
  • set:为Map对象添加新成员,set(key, value)key可以是任意数据类型
  • get:可以通过myMap.get(key)获取到value的值,如果不存在则返回undefined
  • has:可以通过myMap.has(key),返回一个布尔值,表示某个属性是否存在于当前的Map对象中
  • delete:可以通过delete(key)去删除某个属性,返回true则说明删除成功,false则说明失败
  • clear:可以通过myMap.clear()去清除Map中的所有成员,没有返回值

Map结构原生提供是三个遍历器生成函数和一个遍历方法

  • keys():返回键名的遍历器。
  • values():返回键值的遍历器。
  • entries():返回所有成员的遍历器。
  • forEach():遍历Map的所有成员。
let myMap = new Map()
myMap.set('string', '11111')
myMap.set(10, 100000)

// 获取myMap中所有的key
for(let key of myMap.keys()){
  console.log(key)  // 'string', 10
}

// 获取myMap中所有的value
for(let value of myMap.values()){
  console.log(value)  // '11111'  100000
}

// entries 会得到[key, value]
for(let item of myMap.entries()){
  console.log(item)  // ['string', '123']   [10, 10000]
}

WeakMap

WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。 WeakMap对象提供的API如下

set(key, value) get(key) has(key) delette(key)

这四个API的用法和Map中用法是一模一样的

注意 由于WeakMap对象的属性(也就是键名)只能是对象,但是这个对象的引用是弱引用,所以在垃圾回收的时候并不会回收此对象。这也无需担心它所占用的内存问题,因为弱引用对象一旦没有被其它地方引用,WeakMap里面的键值会自动消失,不用手动删除

总结

  • Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

  • WeakMap 结构与 Map 结构类似,也是用于生成键值对的集合。但是 WeakMap 只接受对象作为键名( null 除外),不接受其他类型的值作为键名。而且 WeakMap 的键名所指向的对象,不计入垃圾回收机制。