[英]How can a weak map be implemented in ES5?
還有另一個問題要問同樣的問題,但我無法理解已接受的答案。
有問題的庫似乎使用Object.defineProperty
添加對要存儲的對象的引用(盡管間接通過另一個對象)。
但是...肯定會因為這個鏈接而導致對象無法被垃圾回收嗎?
我想念什么?
真的有可能創建一個對象並將其存儲在某個地方而無需保持垃圾回收器可以注意到的引用嗎? (ES2015之前)
接受的答案:
我花了一段時間查看代碼,但隨后又打了我:該鍵本身用於存儲對該值的引用。
例如,設置幾層
defProp(obj,globalID,{value:store}); defProp已定義為Object.defineProperty,其中obj是鍵,globalID是guid,store是包含該值的存儲對象。
然后進入獲取值
obj [globalID];
這很聰明。 WeakMap實際上並不包含對任何內容的引用(弱或其他),它只是設置了一個秘密存儲值的策略。 使用Object.defineProperty意味着您不會偶然發現值存儲-您必須知道魔術指導來查找它。
由於鍵直接引用值(而WeakMap並不引用該值),所以當所有對鍵的引用都消失時,它會像平常一樣被GC。
有問題的圖書館 。
當然,這是否意味着由於該鏈接而無法對對象進行垃圾回收?
是。
我想念什么?
沒有。 也許這正是期望的行為。
正如答案所解釋的,“ WeakMap實際上不包含對任何東西(弱或其他)的 引用 ”和“ 當所有對鍵的引用都消失了時,它像正常情況一樣被GC化。 ”
問題庫中的代碼是復雜的。 但是基於另一個更清晰的WeakMap實現,我有以下內容...
WeakMap對鍵和與其關聯的值都持有弱引用 。 這意味着WeakMap不會以任何方式影響鍵對象或值對象的垃圾回收。
在ES5中實現此目的的方法是在“添加”到地圖時,向使用的鍵添加一個(如果需要的話,則隱藏)屬性,然后不執行其他任何操作(即,不將鍵添加到數組中或者實際上不執行任何操作用它)。 這樣,除了自身以外,沒有其他東西可以指代鑰匙。
因此,AFAICT WeakMap的API有限。 例如,您不能枚舉WeakMap中的項目,因為它不包含對其內容的引用!
請注意,WeakMap中的鍵不能為原語(字符串,數字,未定義,null,符號,布爾值)。
使用has
或get
,您只需在作為鍵提供的對象上尋找secret屬性。
如果存在,則WeakMap“包含”或“具有”; 否則就不會。
對於get
,secret屬性可以再次包含對與鍵對象關聯的值的引用,而從WeakMap到鍵對象或值對象則沒有引用。
我認為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.