摘要:中對的要求主要是對非對象僅保留弱引用,且取值是復雜度,這導致了它的兩個特性不能求大小,更不能枚舉。按說這種關乎內存管理的對象是沒法的。但是對有一個很奇妙的。在中的每一個中設置一個屬性屬性名是的唯一。值為該在中對應的。同時取值也是復雜度的。
ES6 中對 WeakMap 的要求主要是對 key(非 null 對象) 僅保留弱引用,且取值是 O(1) 復雜度,這導致了它的兩個特性:
不能求大小,更不能枚舉。
當 key 對象不被其他變量引用時,會被垃圾回收系統回收。
按說這種關乎內存管理的對象是沒法 shim 的。但是webcomponents.js 對 WeakMap 有一個很奇妙的 shim。經過閱讀后整理原理如圖:
解說:
WeakMap 內不提供存儲 key 和 value 的區域,避免產生本對象對 key 的強引用。
每個 WeakMap 中只存儲一個隨機、唯一生成的 name 字符串。
在 WeakMap 中的每一個 key 中設置一個屬性:
屬性名是 WeakMap 的唯一 name。
值為該 key 在 WeakMap 中對應的 value。
此時,獲取 WeakMap 中指定 key 對應的 value,就等價于獲取 key 中的 WeakMap::name 屬性的值。
為了防止由于原型繼承導致 WeakMap::name 屬性不是本對象自有的屬性,采用了一個技巧來保證獲取 WeakMap::name 屬性的值不是從原型繼承來的,這個技巧作為另一個文章再談。
雖然使用 Object::hasOwnProperty 也可以達到相同的效果,但是從庫的級別考慮,該屬性可能被第三方代碼污染,所以采用了更極端的方式來驗證。
通過這種引用方式,達成了 WeakMap 對象事實上沒有引用到 key 對象的效果,那么當 key 對象不被別的變量引用時,就會被垃圾回收系統自動回收。同時取值也是 O(1) 復雜度的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85523.html
摘要:特性概述比較新特性更多。之后后分篇描述目前已經比較成熟的語法特性例如和。同上,但返回該元素的索引號。和對象的屬性行為一致。不將參數強制轉行為。判斷是否為在范圍內的正整數。不少層面的特性可以通過進行兼容性支持。 原文: http://pij.robinqu.me/JavaScript_Core/ECMAScript/es6/es6_api_extension.html 源...
Set有對應的WeakSet, Map也有WeakMap。這一篇,我們就來學習一下WeakMap有寫什么特性。先來看一下WeakMap的基本特性: 1: WeakMap是一種存儲多個鍵值對的無序列表 2: WeakMap的鍵必須是非null的對象類型 3: WeakMap的鍵對應的值,可以是任意類型 接下來看一下WeakMap的接口方法:一:WeakMap的新建與初始化與Map相同的,WeakM...
摘要:一個對象若只被弱引用所引用,則被認為是不可訪問或弱可訪問的,并因此可能在任何時刻被回收。也就是說,一旦不再需要,里面的鍵名對象和所對應的鍵值對會自動消失,不用手動刪除引用。如果有錯誤或者不嚴謹的地方,請務必給予指正,十分感謝。 前言 我們先從 WeakMap 的特性說起,然后聊聊 WeakMap 的一些應用場景。 特性 1. WeakMap 只接受對象作為鍵名 const map = ...
摘要:最近準備初級前端面試,發現有很多手寫實現什么的,例如什么手寫實現,。后面以這道題為引線面試官可能會追問什么是執行上下文的判斷,的區別手寫一個函數實現斐波那契數列首先拷一個阮神在他教程里的一個寫法。 最近準備初級前端面試,發現有很多手寫實現什么的,例如什么手寫實現bind,promise。手寫ajax,手寫一些算法。翻閱了很多書籍和博客。 這里做一個總結改進,算是對我后面大概為期一個月找...
閱讀 2348·2021-11-15 11:37
閱讀 2625·2021-09-23 11:21
閱讀 2952·2021-09-07 10:11
閱讀 3164·2019-08-30 15:53
閱讀 2826·2019-08-29 15:13
閱讀 1606·2019-08-26 13:57
閱讀 1098·2019-08-26 12:23
閱讀 2438·2019-08-26 11:51