Map和WeakMap的差異啊冠跷,差了個(gè)單詞唄爹凹。(好了厨诸,本文完)
稍等镶殷,別打人禾酱,別打臉
好了,我們來正兒八經(jīng)的分析一波绘趋。
差異
-
首先構(gòu)造函數(shù)名不同嘛
let map = new Map();
let weakmap = new WeakMap();
-
內(nèi)置API有差異
Map
的API有:
(1) Map.prototype.clear()
(2) Map.prototype.delete()
(3) Map.prototype.entries()
(4) Map.prototype.forEach()
(5) Map.prototype.get()
(6) Map.prototype.has()
(7) Map.prototype.keys()
(8) Map.prototype.set()
(9) Map.prototype.values()
(10) Map.prototype[@@iterator]()
WeakMap
的API有:
(1) WeakMap.prototype.delete()
(2) WeakMap.prototype.get()
(3) WeakMap.prototype.has()
(4) WeakMap.prototype.set()
可以看出weakMap
api少了clear颤陶, entries,forEach陷遮,keys滓走,values,以及獲取iterator對(duì)象的方法
,另外weakMap
還沒有size
屬性帽馋,無法獲取內(nèi)部存了多少個(gè)映射搅方。
-
可以用來設(shè)置鍵的類型
Map可以用JS的任意類型作為鍵。WeakMap的話只能是對(duì)象绽族。
let weakMap = new WeakMap();
weakMap.set('14', '14'); // Uncaught TypeError: Invalid value used as weak map key
//at WeakMap.set (<anonymous>)
-
GC(垃圾回收)姨涡。
let a = {x: 12};
let b = {y: 13};
let map = new Map();
let weakMap = new WeakMap();
map.set(a, '14');
weakMap.set(b, '15');
a = null;
b = null; // 設(shè)置為null提醒垃圾回收可以回收了。
當(dāng)把a(bǔ), b都設(shè)置成null之后吧慢,GC會(huì)回收weakMap中的b對(duì)象對(duì)應(yīng)的鍵值對(duì)(這里的意思是鍵和值都回收)涛漂,也就是{ y: 13}
這個(gè)對(duì)象會(huì)被回收,'14'
這個(gè)常量也會(huì)被清除。但是不會(huì)回收Map中a對(duì)象對(duì)應(yīng)的鍵值對(duì)匈仗,也就是{x: 12}
這個(gè)對(duì)象并不會(huì)回收瓢剿。
WeakMap
中值被回收,是因?yàn)殒I被回收了
let a = {x: 12};
let b = {y: 15};
let weakMap = new WeakMap();
weakMap.set(a, b);
console.log(weakMap.get(a));
b = null; // 這樣做不會(huì)影響weakMap的存儲(chǔ)
console.log(weakMap.get(a));
多說幾句
Map的使用悠轩,用在值需要頻繁的刪改的場(chǎng)景(map有優(yōu)化)间狂,以及鍵只能是對(duì)象的場(chǎng)景比較優(yōu)。如果只是簡(jiǎn)單的記錄值而且鍵不會(huì)是對(duì)象的情況哗蜈,用普通對(duì)象就OK了前标。