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 的键名所指向的对象,不计入垃圾回收机制。