您好,登錄后才能下訂單哦!
WeakMap怎么在JavaScript中使用?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
WeakMap 對(duì)象是一組鍵/值對(duì)的集合,其中的鍵是弱引用的。其鍵必須是對(duì)象,而值可以是任意的。
new WeakMap([iterable])
iterable
Iterable 是一個(gè)數(shù)組(二元數(shù)組)或者其他可迭代的且其元素是鍵值對(duì)的對(duì)象。每個(gè)鍵值對(duì)會(huì)被加到新的 WeakMap 里。null 會(huì)被當(dāng)做 undefined。
WeakMap 的 key 只能是 Object 類型。 原始數(shù)據(jù)類型 是不能作為 key 的(比如 Symbol)。
在 JavaScript 里,map API 可以通過(guò)使其四個(gè) API 方法共用兩個(gè)數(shù)組(一個(gè)存放鍵,一個(gè)存放值)來(lái)實(shí)現(xiàn)。給這種 map 設(shè)置值時(shí)會(huì)同時(shí)將鍵和值添加到這兩個(gè)數(shù)組的末尾。從而使得鍵和值的索引在兩個(gè)數(shù)組中相對(duì)應(yīng)。當(dāng)從該 map 取值的時(shí)候,需要遍歷所有的鍵,然后使用索引從存儲(chǔ)值的數(shù)組中檢索出相應(yīng)的值。
但這樣的實(shí)現(xiàn)會(huì)有兩個(gè)很大的缺點(diǎn),首先賦值和搜索操作都是 O(n) 的時(shí)間復(fù)雜度( n 是鍵值對(duì)的個(gè)數(shù)),因?yàn)檫@兩個(gè)操作都需要遍歷全部整個(gè)數(shù)組來(lái)進(jìn)行匹配。另外一個(gè)缺點(diǎn)是可能會(huì)導(dǎo)致內(nèi)存泄漏,因?yàn)閿?shù)組會(huì)一直引用著每個(gè)鍵和值。這種引用使得垃圾回收算法不能回收處理他們,即使沒(méi)有其他任何引用存在了。
相比之下,原生的 WeakMap 持有的是每個(gè)鍵對(duì)象的“弱引用”,這意味著在沒(méi)有其他引用存在時(shí)垃圾回收能正確進(jìn)行。原生 WeakMap 的結(jié)構(gòu)是特殊且有效的,其用于映射的 key 只有在其沒(méi)有被回收時(shí)才是有效的。
正由于這樣的弱引用,WeakMap 的 key 是不可枚舉的 (沒(méi)有方法能給出所有的 key)。如果key 是可枚舉的話,其列表將會(huì)受垃圾回收機(jī)制的影響,從而得到不確定的結(jié)果。因此,如果你想要這種類型對(duì)象的 key 值的列表,你應(yīng)該使用 Map。
基本上,如果你要往對(duì)象上添加數(shù)據(jù),又不想干擾垃圾回收機(jī)制,就可以使用 WeakMap。
WeakMap.length
length 屬性的值為 0。
WeakMap.prototype
WeakMap 構(gòu)造器的原型。 允許添加屬性到所有的 WeakMap 對(duì)象。
所有 WeakMap 實(shí)例繼承自 WeakMap.prototype.
WeakMap.prototype.constructor
返回創(chuàng)建WeakMap實(shí)例的原型函數(shù)。 WeakMap函數(shù)是默認(rèn)的。
WeakMap.prototype.delete(key)
移除key的關(guān)聯(lián)對(duì)象。執(zhí)行后 WeakMap.prototype.has(key)返回false。
WeakMap.prototype.get(key)
返回key關(guān)聯(lián)對(duì)象, 或者 undefined(沒(méi)有key關(guān)聯(lián)對(duì)象時(shí))。
WeakMap.prototype.has(key)
根據(jù)是否有key關(guān)聯(lián)對(duì)象返回一個(gè)Boolean值。
WeakMap.prototype.set(key, value)
在WeakMap中設(shè)置一組key關(guān)聯(lián)對(duì)象,返回這個(gè) WeakMap對(duì)象。
const wm1 = new WeakMap(), wm2 = new WeakMap(), wm3 = new WeakMap(); const o1 = {}, o2 = function(){}, o3 = window; wm1.set(o1, 37); wm1.set(o2, "azerty"); wm2.set(o1, o2); // value可以是任意值,包括一個(gè)對(duì)象或一個(gè)函數(shù) wm2.set(o3, undefined); wm2.set(wm1, wm2); // 鍵和值可以是任意對(duì)象,甚至另外一個(gè)WeakMap對(duì)象 wm1.get(o2); // "azerty" wm2.get(o2); // undefined,wm2中沒(méi)有o2這個(gè)鍵 wm2.get(o3); // undefined,值就是undefined wm1.has(o2); // true wm2.has(o2); // false wm2.has(o3); // true (即使值是undefined) wm3.set(o1, 37); wm3.get(o1); // 37 wm1.has(o1); // true wm1.delete(o1); wm1.has(o1); // false
class ClearableWeakMap { constructor(init) { this._wm = new WeakMap(init) } clear() { this._wm = new WeakMap() } delete(k) { return this._wm.delete(k) } get(k) { return this._wm.get(k) } has(k) { return this._wm.has(k) } set(k, v) { this._wm.set(k, v) return this } }
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) WeakMap | Standard | Initial definition. |
ECMAScript (ECMA-262) WeakMap | Living Standard |
關(guān)于WeakMap怎么在JavaScript中使用問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。