石家莊網(wǎng)站建設(shè)案例網(wǎng)絡(luò)推廣員怎么做
ES12 (ECMAScript 2021) 特性總結(jié):WeakRef
1. WeakRef
概述
描述
WeakRef
是 ES12 引入的一個(gè)新特性,用于創(chuàng)建對(duì)對(duì)象的弱引用。弱引用不會(huì)阻止垃圾回收器回收對(duì)象,即使該對(duì)象仍然被弱引用持有。WeakRef
通常與 FinalizationRegistry
結(jié)合使用,用于在對(duì)象被垃圾回收時(shí)執(zhí)行清理操作。
語(yǔ)法
const weakRef = new WeakRef(targetObject);
主要方法
deref()
:返回弱引用指向的目標(biāo)對(duì)象。如果目標(biāo)對(duì)象已被垃圾回收,則返回undefined
。
2. WeakRef
的用法
創(chuàng)建弱引用
const obj = { name: "Alice" };
const weakRef = new WeakRef(obj);// 訪問(wèn)目標(biāo)對(duì)象
const target = weakRef.deref();
console.log(target); // { name: "Alice" }
檢查對(duì)象是否被回收
let obj = { name: "Bob" };
const weakRef = new WeakRef(obj);// 解除對(duì) obj 的強(qiáng)引用
obj = null;// 強(qiáng)制觸發(fā)垃圾回收(僅用于演示,實(shí)際環(huán)境中不應(yīng)手動(dòng)調(diào)用)
global.gc();// 檢查對(duì)象是否被回收
setTimeout(() => {const target = weakRef.deref();console.log(target); // undefined(對(duì)象已被回收)
}, 1000);
3. WeakRef
的使用場(chǎng)景
1. 緩存系統(tǒng)
在緩存系統(tǒng)中,可以使用 WeakRef
來(lái)緩存對(duì)象。當(dāng)內(nèi)存不足時(shí),垃圾回收器會(huì)自動(dòng)回收這些對(duì)象,從而避免內(nèi)存泄漏。
示例
const cache = new Map();function getCachedData(key) {let cachedRef = cache.get(key);if (cachedRef) {const cachedData = cachedRef.deref();if (cachedData) {return cachedData;}}// 重新獲取數(shù)據(jù)并緩存const newData = fetchData(key);cache.set(key, new WeakRef(newData));return newData;
}
2. 監(jiān)聽(tīng)對(duì)象生命周期
結(jié)合 FinalizationRegistry
,可以在對(duì)象被垃圾回收時(shí)執(zhí)行清理操作。
示例
const registry = new FinalizationRegistry((heldValue) => {console.log(`Object with value ${heldValue} has been garbage collected.`);
});let obj = { name: "Charlie" };
const weakRef = new WeakRef(obj);// 注冊(cè)清理回調(diào)
registry.register(obj, "some metadata");// 解除對(duì) obj 的強(qiáng)引用
obj = null;// 當(dāng) obj 被垃圾回收時(shí),會(huì)觸發(fā)清理回調(diào)
3. 避免內(nèi)存泄漏
在需要持有對(duì)象引用但又不想阻止垃圾回收的場(chǎng)景中,WeakRef
是一個(gè)理想的選擇。
示例
class EventListener {constructor(target) {this.targetRef = new WeakRef(target);this.handleEvent = this.handleEvent.bind(this);target.addEventListener("click", this.handleEvent);}handleEvent(event) {const target = this.targetRef.deref();if (target) {console.log("Event triggered on:", target);} else {// 目標(biāo)對(duì)象已被回收,清理事件監(jiān)聽(tīng)器event.currentTarget.removeEventListener("click", this.handleEvent);}}
}
4. 注意事項(xiàng)
-
垃圾回收的不確定性:
- 垃圾回收的時(shí)機(jī)由 JavaScript 引擎決定,無(wú)法手動(dòng)控制。
- 即使對(duì)象不再被強(qiáng)引用,垃圾回收也可能不會(huì)立即執(zhí)行。
-
避免濫用:
WeakRef
和FinalizationRegistry
是高級(jí)特性,通常只在特定場(chǎng)景下使用。- 過(guò)度使用可能導(dǎo)致代碼難以理解和維護(hù)。
-
兼容性:
- 確保目標(biāo)運(yùn)行環(huán)境支持
WeakRef
和FinalizationRegistry
。
- 確保目標(biāo)運(yùn)行環(huán)境支持
5. 總結(jié)
特性 | 描述 | 使用場(chǎng)景 |
---|---|---|
WeakRef | 創(chuàng)建對(duì)對(duì)象的弱引用,不會(huì)阻止垃圾回收器回收對(duì)象 | 緩存系統(tǒng)、監(jiān)聽(tīng)對(duì)象生命周期、避免內(nèi)存泄漏 |
deref() | 返回弱引用指向的目標(biāo)對(duì)象,若對(duì)象已被回收則返回 undefined | 檢查對(duì)象是否仍然可用 |
結(jié)合 FinalizationRegistry | 在對(duì)象被垃圾回收時(shí)執(zhí)行清理操作 | 對(duì)象生命周期管理、資源清理 |