亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WeakMap怎么在JavaScript中使用

發布時間:2021-02-07 19:53:53 來源:億速云 閱讀:160 作者:Leah 欄目:開發技術

WeakMap怎么在JavaScript中使用?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

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

語法

new WeakMap([iterable])

參數

iterable
Iterable 是一個數組(二元數組)或者其他可迭代的且其元素是鍵值對的對象。每個鍵值對會被加到新的 WeakMap 里。null 會被當做 undefined。

描述

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

Why WeakMap?

在 JavaScript 里,map API 可以通過使其四個 API 方法共用兩個數組(一個存放鍵,一個存放值)來實現。給這種 map 設置值時會同時將鍵和值添加到這兩個數組的末尾。從而使得鍵和值的索引在兩個數組中相對應。當從該 map 取值的時候,需要遍歷所有的鍵,然后使用索引從存儲值的數組中檢索出相應的值。

但這樣的實現會有兩個很大的缺點,首先賦值和搜索操作都是 O(n) 的時間復雜度( n 是鍵值對的個數),因為這兩個操作都需要遍歷全部整個數組來進行匹配。另外一個缺點是可能會導致內存泄漏,因為數組會一直引用著每個鍵和值。這種引用使得垃圾回收算法不能回收處理他們,即使沒有其他任何引用存在了。

相比之下,原生的 WeakMap 持有的是每個鍵對象的“弱引用”,這意味著在沒有其他引用存在時垃圾回收能正確進行。原生 WeakMap 的結構是特殊且有效的,其用于映射的 key 只有在其沒有被回收時才是有效的。

正由于這樣的弱引用,WeakMap 的 key 是不可枚舉的 (沒有方法能給出所有的 key)。如果key 是可枚舉的話,其列表將會受垃圾回收機制的影響,從而得到不確定的結果。因此,如果你想要這種類型對象的 key 值的列表,你應該使用 Map。

基本上,如果你要往對象上添加數據,又不想干擾垃圾回收機制,就可以使用 WeakMap。

屬性

  • WeakMap.length

length  屬性的值為 0。

  • WeakMap.prototype

WeakMap 構造器的原型。 允許添加屬性到所有的 WeakMap 對象。

WeakMap 實例

所有 WeakMap 實例繼承自 WeakMap.prototype.

屬性

WeakMap.prototype.constructor
返回創建WeakMap實例的原型函數。 WeakMap函數是默認的。

方法

  • WeakMap.prototype.delete(key)

移除key的關聯對象。執行后 WeakMap.prototype.has(key)返回false。

  • WeakMap.prototype.get(key)

返回key關聯對象, 或者 undefined(沒有key關聯對象時)。

  • WeakMap.prototype.has(key)

根據是否有key關聯對象返回一個Boolean值。

  • WeakMap.prototype.set(key, value)

在WeakMap中設置一組key關聯對象,返回這個 WeakMap對象。

示例

使用 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可以是任意值,包括一個對象或一個函數
wm2.set(o3, undefined);
wm2.set(wm1, wm2); // 鍵和值可以是任意對象,甚至另外一個WeakMap對象

wm1.get(o2); // "azerty"
wm2.get(o2); // undefined,wm2中沒有o2這個鍵
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

實現一 個帶有 .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
 }
}

規范

SpecificationStatusComment
ECMAScript 2015 (6th Edition, ECMA-262)
 WeakMap
StandardInitial definition.
ECMAScript (ECMA-262)
 WeakMap
Living Standard

關于WeakMap怎么在JavaScript中使用問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

镇宁| 苍山县| 伊宁县| 泽普县| 保定市| 墨脱县| 湘乡市| 旌德县| 巩留县| 启东市| 石嘴山市| 庆云县| 温宿县| 塔河县| 英德市| 江城| 浦江县| 巨野县| 桂平市| 沙湾县| 于田县| 天柱县| 绵竹市| 桃源县| 湖南省| 靖安县| 闻喜县| 和静县| 巴青县| 石台县| 聂拉木县| 仁寿县| 福州市| 土默特右旗| 睢宁县| 古交市| 澄迈县| 林周县| 固镇县| 东莞市| 比如县|