溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

WeakMap怎么在JavaScript中使用

發(fā)布時(shí)間:2021-02-07 19:53:53 來(lái)源:億速云 閱讀:156 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

WeakMap怎么在JavaScript中使用?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

WeakMap 對(duì)象是一組鍵/值對(duì)的集合,其中的鍵是弱引用的。其鍵必須是對(duì)象,而值可以是任意的。

語(yǔ)法

new WeakMap([iterable])

參數(shù)

iterable
Iterable 是一個(gè)數(shù)組(二元數(shù)組)或者其他可迭代的且其元素是鍵值對(duì)的對(duì)象。每個(gè)鍵值對(duì)會(huì)被加到新的 WeakMap 里。null 會(huì)被當(dāng)做 undefined。

描述

WeakMap 的 key 只能是 Object 類型。 原始數(shù)據(jù)類型 是不能作為 key 的(比如 Symbol)。

Why WeakMap?

在 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 實(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ì)象。

示例

使用 WeakMap

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

實(shí)現(xiàn)一 個(gè)帶有 .clear() 方法的類 WeakMap 類

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
 }
}

規(guī)范

SpecificationStatusComment
ECMAScript 2015 (6th Edition, ECMA-262)
 WeakMap
StandardInitial 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í)。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI