zlx362211854 / daily-study

每日一个知识点总结,以issue的形式体现
10 stars 6 forks source link

42. Map 和 WeakMap #80

Open goldEli opened 4 years ago

goldEli commented 4 years ago

介绍下 Map 和 WeakMap 的用法和区别

nanslee commented 4 years ago

导读

Demo

      const m = new Map();
      m.set('a', 1);
      m.set(2, 'hello')
      console.log(m.get('a'));   // 10   
      console.log(m.get(2))    // hello

      m.set('a', 2)   // 覆盖上一次     2
      console.log(m.size)     // 2
      console.log(m.has('2'))
      console.log(m.delete('a'))

      for(key of m) {
        console.log(key)
      }    
      //  [2, "hello"]

Map 提供的属性和方法有:
size
set(k,v)
get(K)
has(k)
delete(k)
clear()

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

WeakMap

goldEli commented 4 years ago

Map 用于字典对象,key value的方式存储数据。相较于普通对象 {}Mapkey 可以是各种类型

var map = new Map()
var blank = {}
map.set("a", 1)
map.set(-1, 1)
map.set(blank, 1)
console.log(map)
// Map(4) {"a" => 1, -1 => 1, {…} => 1, ƒ => 1}

map.get("a")   // 1
map.get(-1)    // 1
map.get(blank) // 1

WeakMapMap 区别在于,一个是弱引用,一个是强引用。

当 key 为引用类型时,如果该 key 的内存地址被回收,Map中储存的对象不会被销毁,而 WeakMap 会被销毁。

var address = {}
var map = new Map()
map.set(address, 1)
address = null
console.log(map)
var address = {}
var map = new WeakMap()
map.set(address, 1)
address = null
console.log(map)
// WeakMap {}
zlx362211854 commented 4 years ago

es6中新增了Set和Map两种数据结构,对应WeakSet和WeakMap两种弱类型引用的结构

参见http://es6.ruanyifeng.com/#docs/set-map#Set

其中 Map是一种字典结构,本质上是键值对的集合,键可以是任何js对象,实现了值->值的映射结构,扩展了js的Object结构。

WeakMap是Map的弱引用类型结构,与Map有如下区别:
  1. WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名
  2. WeakMap的键名所指向的对象,不计入垃圾回收机制