溫馨提示×

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

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

JavaScript弱映射與弱集合實(shí)例分析

發(fā)布時(shí)間:2022-06-20 11:38:16 來(lái)源:億速云 閱讀:254 作者:iii 欄目:web開(kāi)發(fā)

這篇文章主要介紹“JavaScript弱映射與弱集合實(shí)例分析”,在日常操作中,相信很多人在JavaScript弱映射與弱集合實(shí)例分析問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”JavaScript弱映射與弱集合實(shí)例分析”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

JavaScript弱映射與弱集合實(shí)例分析

簡(jiǎn)單來(lái)講,如果一個(gè)變量、對(duì)象是“不可達(dá)”的,那么這個(gè)變量、對(duì)象就沒(méi)有必要繼續(xù)保存在內(nèi)存中,進(jìn)而應(yīng)該被回收。

舉個(gè)例子:

let xiaoming = {name:'xiaoming'}//創(chuàng)建一個(gè)對(duì)象,并用變量xiaoming引用

xiaoming = null	//將變量xiaoming置空,從而使對(duì)象{name:'xiaoming'}不可達(dá)

//{name:'xiaoming'}對(duì)象被回收

如果一個(gè)對(duì)象被數(shù)組,其他對(duì)象引用,只要引用它數(shù)組和對(duì)象存在于數(shù)組中,那么這個(gè)對(duì)象也就被認(rèn)為是可達(dá)的。

數(shù)組中的對(duì)象:

let xiaoming = {name:'xiaoming'}
let arr = [xiaoming]
xiaoming = null //將變量xiaoming置空
//對(duì)象{name:'xiaoming'}由于存在于數(shù)組中,并不會(huì)被釋放

同樣的,如果我們把一個(gè)對(duì)象做為Map的鍵,如果Map存在,那么對(duì)象就不會(huì)被引擎回收。

Map中的鍵對(duì)象:

let xiaoming = {name:'xiaoming'}
let map = new Map()
map.set(xiaoming,'a boy')
xiaoming = null //將變量xiaoming置空
//對(duì)象{name:'xiaoming'}由于是map的鍵,并不會(huì)被釋放

WeapMap在釋放鍵對(duì)象的處理上和Map有著本質(zhì)上的不同,簡(jiǎn)單來(lái)講,WeapMap不會(huì)因?yàn)閷?duì)象作為鍵而阻止垃圾回收。

WeakMap

WeakMapMap的區(qū)別可分為三個(gè)方面:

  1. WeakMap只能以對(duì)象作為鍵

let weakMap = new WeakMap()
let obj = {name:'obj'}
weakMap.set(obj,'obj as the key')
weakMap.set('str','str as the key')//報(bào)錯(cuò)

代碼執(zhí)行結(jié)果如下:

JavaScript弱映射與弱集合實(shí)例分析

可見(jiàn),當(dāng)我們使用字符串作為key時(shí),程序不能正常執(zhí)行。

  1. 不阻止引擎對(duì)鍵(對(duì)象)的回收

也就是說(shuō),如果一個(gè)對(duì)象除了WeakMap的引用之外沒(méi)有其他引用,那么這個(gè)對(duì)象就會(huì)被系統(tǒng)回收。

舉個(gè)例子:

let weakMap = new WeakMap()
let obj = {name:'obj'}
weakMap.set(obj,'obj as the key')
obj = null	//將變量obj置空
//此時(shí),對(duì)象{name:'obj'}就會(huì)被回收
  1. WeakMap支持的方法有限

  • WeakMap不支持迭代

  • WeakMap不支持keys()

  • WeakMap不支持values()

  • WeakMap不支持entires()

所以,我們沒(méi)有辦法獲得所有的鍵值對(duì)。

WeakMap只能使用如下方法:

  • weakMap.get(key)獲取鍵值對(duì)

  • weakMap.set(key,val)設(shè)置鍵值對(duì)

  • weakMap.delete(key)刪除鍵值對(duì)

  • weakMap.has(key)判斷是否存在

之所以要限制WeakMap的數(shù)據(jù)訪問(wèn)方式,是因?yàn)?code>JavaScript引擎釋放對(duì)象的時(shí)機(jī)是無(wú)法確定的。

當(dāng)一個(gè)對(duì)象失去了所有的引用之后,JavaScript引擎有可能會(huì)立即釋放對(duì)象占用的空間,也有可能再等一等。

所以,在某一時(shí)刻,WeakMap的元素?cái)?shù)量是不能確定的。(試想一下,如果一個(gè)對(duì)象在失去所有的引用之后,我們遍歷WeakMap的元素,可能會(huì)得到不同的結(jié)果。)

WeakMap使用案例

WeakMap的應(yīng)用場(chǎng)景通常是存儲(chǔ)一個(gè)“屬于”對(duì)象的數(shù)據(jù),當(dāng)這個(gè)對(duì)象不存在時(shí),“屬于”這個(gè)對(duì)象的數(shù)據(jù)也應(yīng)該隨之釋放。

有一個(gè)非常適合使用WeakMap`的歷史故事:“狡兔死,走狗烹;飛鳥(niǎo)盡,良弓藏”。

如果我們用JavaScript代碼描述這個(gè)故事,就應(yīng)該用WeakMap:

let weakMap = new WeakMap()
let rabbit = {name:'rabbit'}  	//狡兔
let runDog  = {name:'runDog'}	//走狗
let flyBird = {name:'flyBird'}	//飛鳥(niǎo)
let goodBow = {name:'goodBow'}	//良弓
weakMap.set(rabbit,runDog)
weakMap.set(flyBird,goodBow)

rabbit = null	//狡兔死
flyBird = null	//飛鳥(niǎo)盡
//隨即,走狗和良弓都會(huì)被釋放,也可能不是立刻就釋放
//這個(gè)故事告訴我們,當(dāng)走狗沒(méi)有啥好下場(chǎng),可能不是立刻就被
//弄死了,但是遲早要弄死

WeakSet

Set相比,WeakSet有以下不同點(diǎn):

  1. WeakSet只能添加對(duì)象元素

  2. WeakSet不阻止系統(tǒng)對(duì)元素的回收

  3. WeakSet支持add()、has()、delete()

  4. WeakSet不支持size屬性和keys()方法

我們可以用WeakMap來(lái)驗(yàn)證一些存在性信息,或者驗(yàn)證"是/否"等狀態(tài),例如,我們可以使用WeakMap判斷用戶是否在線:

let onlineUser = new WeakMap()
let zhangSan = {name:'張三'}
let liSi = {name:'李四'}
let wangEr = {name:'王二'}
let maZi = {name:'麻子'}

function login(user){
    ... ...
    onlineUser.add(user)
}

//判斷用戶是否在線
function isOnline(user){
    return onlineUser.has(user)
}

WeakMapWeakSet的局限性是不能迭代,無(wú)法一次性獲取所有元素,當(dāng)時(shí)不影響它們?cè)诜浅jP(guān)鍵的地方發(fā)揮重要的作用。

到此,關(guān)于“JavaScript弱映射與弱集合實(shí)例分析”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(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