亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

前端高頻面試題之JS中堆和棧的區(qū)別和瀏覽器的垃圾回收機(jī)制

 更新時間:2023年10月19日 10:10:00   作者:~black-  
本文給大家分享前端高頻面試題JS中堆和棧的區(qū)別和瀏覽器的垃圾回收機(jī)制,本文分文別類給大家介紹了棧(stack)和堆(heap)的區(qū)別基本類型和引用類型的相關(guān)知識,瀏覽器垃圾回收機(jī)制包括基本概念給大家介紹的非常詳細(xì),需要的朋友參考下吧

一、 棧(stack)和 堆(heap)

棧(stack):是棧內(nèi)存的簡稱,棧是自動分配相對固定大小的內(nèi)存空間,并由系統(tǒng)自動釋放,棧數(shù)據(jù)結(jié)構(gòu)遵循FILO(first in last out)先進(jìn)后出的原則,較為經(jīng)典的就是乒乓球盒結(jié)構(gòu),先放進(jìn)去的乒乓球只能最后取出來。

堆(heap):是堆內(nèi)存的簡稱,堆是動態(tài)分配內(nèi)存,內(nèi)存大小不固定,也不會自動釋放,堆數(shù)據(jù)結(jié)構(gòu)是一種無序的樹狀結(jié)構(gòu),同時它還滿足key-value鍵值對的存儲方式;我們只用知道key名,就能通過key查找到對應(yīng)的value。比較經(jīng)典的就是書架存書的例子,我們知道書名,就可以找到對應(yīng)的書籍。

棧的特點:開口向上、速度快,容量??;堆的特點:速度稍慢、容量比較大;

二、 基本類型和引用類型

基本數(shù)據(jù)類型:Undefined,String,Boolean,Null,Number,都是直接按值存放在棧內(nèi)存中,占用的內(nèi)存空間的大小是確定的,并由系統(tǒng)自動分配和自動釋放。這樣帶來的好處就是,內(nèi)存可以及時得到回收,相對于堆來說,更加容易管理內(nèi)存空間。
引用數(shù)據(jù)類型:指那些可能由多個值構(gòu)成的對象,如對象(Object)、數(shù)組(Array)、函數(shù)(Function) ,它們是通過拷貝和new出來的,這樣的數(shù)據(jù)存儲于堆中。

三、 傳值和傳址的區(qū)別

基本類型:采用的是值傳遞。
引用類型:則是地址傳遞。

引用類型的數(shù)據(jù)的地址指針是存儲于棧中的,將存放在棧內(nèi)存中的地址賦值給接收的變量。當(dāng)我們想要訪問引用類型的值的時候,需要先從棧中獲得對象的地址指針,然后,在通過地址指針找到堆中的所需要的數(shù)據(jù)(保存在堆內(nèi)存中,包含引用類型的變量實際上保存的不是變量本身,而是指向該對象的指針)。

四、 內(nèi)存分配垃圾回收

1.內(nèi)存分配
(1)棧內(nèi)存:線性有序存儲,容量小,系統(tǒng)分配效率高。
(2)堆內(nèi)存:首先要在堆內(nèi)存新分配存儲區(qū)域,之后又要把指針存儲到棧內(nèi)存中,效率相對就要低一些了。

2.垃圾回收:
(1)棧內(nèi)存:變量基本上用完就回收了,相比于堆來說存取速度會快,并且棧內(nèi)存中的數(shù)據(jù)是可以共享的。
(2)堆內(nèi)存:堆內(nèi)存中的對象不會隨方法的結(jié)束而銷毀,就算方法結(jié)束了,這個對象也可能會被其他引用變量所引用(參數(shù)傳遞)。創(chuàng)建對象是為了反復(fù)利用(因為對象的創(chuàng)建成本通常較大),這個對象將被保存到運(yùn)行時數(shù)據(jù)區(qū)(也就是堆內(nèi)存)。只有當(dāng)一個對象沒有任何引用變量引用它時,系統(tǒng)的垃圾回收機(jī)制才會在核實的時候回收它。

五、瀏覽器垃圾回收機(jī)制

1. 瀏覽器的垃圾回收機(jī)制

(1). 垃圾回收的概念
垃圾回收:JavaScript代碼運(yùn)?時,需要分配內(nèi)存空間來儲存變量和值。當(dāng)變量不在參與運(yùn)?時,就需要系統(tǒng)收回被占?的內(nèi)存空間,這就是垃圾回收。

回收機(jī)制:
● Javascript 具有?動垃圾回收機(jī)制,會定期對那些不再使?的變量、對象所占?的內(nèi)存進(jìn)?釋放,原理就是找到不再使?的變量,然后釋放掉其占?的內(nèi)存。
● JavaScript中存在兩種變量:局部變量和全局變量。全局變量的?命周期會持續(xù)要??卸載;?局部變量聲明在函數(shù)中,它的?命周期從函數(shù)執(zhí)?開始,直到函數(shù)執(zhí)?結(jié)束,在這個過程中,局部變量會在堆或棧中存儲它們的值,當(dāng)函數(shù)執(zhí)?結(jié)束后,這些局部變量不再被使?,它們所占有的空間就會被釋放。
● 不過,當(dāng)局部變量被外部函數(shù)使?時,其中?種情況就是閉包,在函數(shù)執(zhí)?結(jié)束后,函數(shù)外部的變量依然指向函數(shù)內(nèi)部的局部變量,此時局部變量依然在被使?,所以不會回收。

(3) 垃圾回收的?式
瀏覽器通常使?的垃圾回收?法有兩種:標(biāo)記清除,引?計數(shù)。
(1)標(biāo)記清除

● 標(biāo)記清除是瀏覽器常?的垃圾回收?式,當(dāng)變量進(jìn)?執(zhí)?環(huán)境時,就標(biāo)記這個變量“進(jìn)?環(huán)境”,被標(biāo)記為“進(jìn)?環(huán)境”的變量是不能被回收的,因為他們正在被使?。當(dāng)變量離開環(huán)境時,就會被標(biāo)記為“離開環(huán)境”,被標(biāo)記為“離開環(huán)境”的變量會被內(nèi)存釋放。

● 垃圾收集器在運(yùn)?的時候會給存儲在內(nèi)存中的所有變量都加上標(biāo)記。然后,它會去掉環(huán)境中的變量以及被環(huán)境中的變量引?的標(biāo)記。?在此之后再被加上標(biāo)記的變量將被視為準(zhǔn)備刪除的變量,原因是環(huán)境中的變量已經(jīng)?法訪問到這些變量了。最后。垃圾收集器完成內(nèi)存清除?作,銷毀那些帶標(biāo)記的值,并回收他們所占?的內(nèi)存空間。
(2)引?計數(shù)
● 另外?種垃圾回收機(jī)制就是引?計數(shù),這個?的相對較少。引?計數(shù)就是跟蹤記錄每個值被引?的次數(shù)。當(dāng)聲明了?個變量并將?個引?類型賦值給該變量時,則這個值的引?次數(shù)就是1。相反,如果包含對這個值引?的變量?取得了另外?個值,則這個值的引?次數(shù)就減1。當(dāng)這個引?次數(shù)變?yōu)?時,說明這個變量已經(jīng)沒有價值,因此,在在機(jī)回收期下次再運(yùn)?時,這個變量所占有的內(nèi)存空間就會被釋放出來。

● 這種?法會引起循環(huán)引?的問題:例如: obj1 和 obj2 通過屬性進(jìn)?相互引?,兩個對象的引?次數(shù)都是2。當(dāng)使?循環(huán)計數(shù)時,由于函數(shù)執(zhí)?完后,兩個對象都離開作?域,函數(shù)執(zhí)?結(jié)束,obj1 和 obj2 還將會繼續(xù)存在,因此它們的引?次數(shù)永遠(yuǎn)不會是0,就會引起循環(huán)引?。

function fun() {
  let obj1 = {}
  let obj2 = {}
  obj1.a = obj2 // obj1 引用了 obj2
  obj2.a = obj1 // obj2 引用了 obj1
}

這種情況下,就要?動釋放變量占?的內(nèi)存:

obj1.a = null
obj2.a = null

(3) 減少垃圾回收
雖然瀏覽器可以進(jìn)?垃圾?動回收,但是當(dāng)代碼?較復(fù)雜時,垃圾回收所帶來的代價?較?,所以應(yīng)該盡量減少垃圾回收。
對數(shù)組進(jìn)?優(yōu)化:在清空?個數(shù)組時,最簡單的?法就是給其賦值為[ ],但是與此同時會創(chuàng)建?個新的空對象,可以將數(shù)組的?度設(shè)置為0,以此來達(dá)到清空數(shù)組的?的。
對 object 進(jìn)?優(yōu)化:對象盡量復(fù)?,對于不再使?的對象,就將其設(shè)置為null,盡快被回收。
對函數(shù)進(jìn)?優(yōu)化:在循環(huán)中的函數(shù)表達(dá)式,如果可以復(fù)?,盡量放在函數(shù)的外?。

2. 哪些情況會導(dǎo)致內(nèi)存泄漏

以下四種情況會造成內(nèi)存的泄漏:
● 意外的全局變量:由于使?未聲明的變量,?意外的創(chuàng)建了?個全局變量,?使這個變量?直留在內(nèi)存中?法被回收。
● 被遺忘的計時器或回調(diào)函數(shù):設(shè)置了 setInterval 定時器,?忘記取消它,如果循環(huán)函數(shù)有對外部變量的引?的話,那么這個變量會被?直留在內(nèi)存中,??法被回收。
● 脫離 DOM 的引?:獲取?個 DOM 元素的引?,?后?這個元素被刪除,由于?直保留了對這個元素的引?,所以它也?法被回收。
● 閉包:不合理的使?閉包,從?導(dǎo)致某些變量?直被留在內(nèi)存當(dāng)中。

到此這篇關(guān)于前端高頻面試題之JS中堆和棧的區(qū)別和瀏覽器的垃圾回收機(jī)制的文章就介紹到這了,更多相關(guān)js堆和棧的區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript學(xué)習(xí)筆記之10個原生技巧

    javascript學(xué)習(xí)筆記之10個原生技巧

    首先在這里要非常感謝無私分享作品的網(wǎng)友們,這些代碼片段主要由網(wǎng)友們平時分享的作品代碼里面和經(jīng)常去逛網(wǎng)站然后查看源文件收集到的。把平時網(wǎng)站上常用的一些實用功能代碼片段通通收集起來,方便網(wǎng)友們學(xué)習(xí)使用,利用好的話可以加快網(wǎng)友們的開發(fā)速度,提高工作效率。
    2014-05-05
  • JavaScript中有關(guān)一個數(shù)組中最大值和最小值及它們的下表的輸出的解決辦法

    JavaScript中有關(guān)一個數(shù)組中最大值和最小值及它們的下表的輸出的解決辦法

    這篇文章主要介紹了JavaScript中有關(guān)一個數(shù)組中最大值和最小值及它們的下表的輸出的一種解決辦法,本文還給大家介紹了js快速獲取數(shù)組中最大值和最小值的方法,非常不錯,需要的朋友可以參考下
    2016-07-07
  • Js利用console計算代碼運(yùn)行時間的方法示例

    Js利用console計算代碼運(yùn)行時間的方法示例

    最近看了一本書,發(fā)現(xiàn)了個計算代碼執(zhí)行時間的方法,感覺還挺有用的,所以這篇文章主要給大家介紹了關(guān)于Javascript利用console計算代碼運(yùn)行時間的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-09-09
  • layui數(shù)據(jù)表格 table.render 報錯的解決方法

    layui數(shù)據(jù)表格 table.render 報錯的解決方法

    今天小編就為大家分享一篇layui數(shù)據(jù)表格 table.render 報錯的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 微信小程序?qū)崿F(xiàn)MUI數(shù)字輸入框效果

    微信小程序?qū)崿F(xiàn)MUI數(shù)字輸入框效果

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)MUI數(shù)字輸入框效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 簡單的前端js+ajax 購物車框架(入門篇)

    簡單的前端js+ajax 購物車框架(入門篇)

    其實,一直想把自己寫的一些js給總結(jié)下,也許是能力有限不能把它完美結(jié)合起來。只能自己默默的看著哪些代碼,無能為力
    2011-10-10
  • uniapp手寫滾動選擇器的完整代碼(時間選擇器)

    uniapp手寫滾動選擇器的完整代碼(時間選擇器)

    這篇文章主要介紹了uniapp手寫滾動選擇器的完整代碼(時間選擇器),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-07-07
  • js實現(xiàn)適配移動端的拖動效果

    js實現(xiàn)適配移動端的拖動效果

    這篇文章主要為大家詳細(xì)介紹了js實現(xiàn)適配移動端的拖動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • js中的scroll和offset 使用比較的實例與分析

    js中的scroll和offset 使用比較的實例與分析

    這篇文章介紹了js中的scroll和offset使用比較的實例與分析,有需要的朋友可以參考一下
    2013-09-09
  • 淺談幾種常用的JS類定義方法

    淺談幾種常用的JS類定義方法

    下面小編就為大家?guī)硪黄獪\談幾種常用的JS類定義方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06

最新評論