中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

JavaScript弱映射與弱集合實例分析

發布時間:2022-06-20 11:38:16 來源:億速云 閱讀:304 作者:iii 欄目:web開發

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

JavaScript弱映射與弱集合實例分析

簡單來講,如果一個變量、對象是“不可達”的,那么這個變量、對象就沒有必要繼續保存在內存中,進而應該被回收。

舉個例子:

let xiaoming = {name:'xiaoming'}//創建一個對象,并用變量xiaoming引用

xiaoming = null	//將變量xiaoming置空,從而使對象{name:'xiaoming'}不可達

//{name:'xiaoming'}對象被回收

如果一個對象被數組,其他對象引用,只要引用它數組和對象存在于數組中,那么這個對象也就被認為是可達的。

數組中的對象:

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

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

Map中的鍵對象:

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

WeapMap在釋放鍵對象的處理上和Map有著本質上的不同,簡單來講,WeapMap不會因為對象作為鍵而阻止垃圾回收。

WeakMap

WeakMapMap的區別可分為三個方面:

  1. WeakMap只能以對象作為鍵

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

代碼執行結果如下:

JavaScript弱映射與弱集合實例分析

可見,當我們使用字符串作為key時,程序不能正常執行。

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

也就是說,如果一個對象除了WeakMap的引用之外沒有其他引用,那么這個對象就會被系統回收。

舉個例子:

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

  • WeakMap不支持迭代

  • WeakMap不支持keys()

  • WeakMap不支持values()

  • WeakMap不支持entires()

所以,我們沒有辦法獲得所有的鍵值對。

WeakMap只能使用如下方法:

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

  • weakMap.set(key,val)設置鍵值對

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

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

之所以要限制WeakMap的數據訪問方式,是因為JavaScript引擎釋放對象的時機是無法確定的。

當一個對象失去了所有的引用之后,JavaScript引擎有可能會立即釋放對象占用的空間,也有可能再等一等。

所以,在某一時刻,WeakMap的元素數量是不能確定的。(試想一下,如果一個對象在失去所有的引用之后,我們遍歷WeakMap的元素,可能會得到不同的結果。)

WeakMap使用案例

WeakMap的應用場景通常是存儲一個“屬于”對象的數據,當這個對象不存在時,“屬于”這個對象的數據也應該隨之釋放。

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

如果我們用JavaScript代碼描述這個故事,就應該用WeakMap:

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

rabbit = null	//狡兔死
flyBird = null	//飛鳥盡
//隨即,走狗和良弓都會被釋放,也可能不是立刻就釋放
//這個故事告訴我們,當走狗沒有啥好下場,可能不是立刻就被
//弄死了,但是遲早要弄死

WeakSet

Set相比,WeakSet有以下不同點:

  1. WeakSet只能添加對象元素

  2. WeakSet不阻止系統對元素的回收

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

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

我們可以用WeakMap來驗證一些存在性信息,或者驗證"是/否"等狀態,例如,我們可以使用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的局限性是不能迭代,無法一次性獲取所有元素,當時不影響它們在非常關鍵的地方發揮重要的作用。

到此,關于“JavaScript弱映射與弱集合實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

AI

西华县| 龙江县| 吉安市| 西青区| 青浦区| 札达县| 吴川市| 黑龙江省| 宜宾县| 连江县| 敦煌市| 宁津县| 井陉县| 肥东县| 资源县| 曲沃县| 突泉县| 常熟市| 苏尼特左旗| 上饶市| 石城县| 宁河县| 通化县| 论坛| 若羌县| 砚山县| 黄冈市| 莲花县| 邢台市| 彝良县| 闽清县| 湟中县| 辉县市| 互助| 天柱县| 景德镇市| 五家渠市| 渝北区| 靖远县| 上思县| 新龙县|