javascript堆和棧

javascript變量類(lèi)型分為基本類(lèi)型和引用類(lèi)型

棧 stack”和“堆 heap”

簡(jiǎn)單的來(lái)講,stack上分配的內(nèi)存系統(tǒng)自動(dòng)釋放,heap上分配的內(nèi)存,系統(tǒng)不釋放,哪怕程序退出,那一塊內(nèi)存還是在那里。stack一般是靜態(tài)分配內(nèi)存,heap上一般是動(dòng)態(tài)分配內(nèi)存

棧內(nèi)存

棧內(nèi)存在函數(shù)中定義的一些基本類(lèi)型的變量和對(duì)象的引用變量都在函數(shù)的棧內(nèi)存中分配。當(dāng)在一段代碼塊定義一個(gè)變量時(shí),js就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過(guò)變量的作用域后,js會(huì)自動(dòng)釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用

基本類(lèi)型

基本類(lèi)型有 Undefined、Null、Boolean、Number 和String
這些類(lèi)型在內(nèi)存中分別占有固定大小的空間,他們的值保存在??臻g 它們是直接按值存放的,所以可以直接訪問(wèn)

引用類(lèi)型

引用類(lèi)型,值的大小不固定,棧內(nèi)存中存放地址指向堆內(nèi)存中的對(duì)象。變量中實(shí)際保存的是一個(gè)指針,這個(gè)指針指向另一個(gè)位置。每個(gè)空間大小不一樣,要根據(jù)情況開(kāi)進(jìn)行特定的分配。
當(dāng)我們需要訪問(wèn)引用類(lèi)型(如對(duì)象,數(shù)組,函數(shù)等)的值時(shí),首先從棧中獲得該對(duì)象的地址指針,然后再?gòu)亩褍?nèi)存中取得所需的數(shù)據(jù)。

傳值和傳址

舉例
let a=[1,2,3,4,5]
let b=a;
let c=a[0]
b[4]=6
c=7
從上面我們可以得知,當(dāng)我改變b中的數(shù)據(jù)時(shí),a中數(shù)據(jù)也發(fā)生了變化;但是當(dāng)我改變c的數(shù)據(jù)值時(shí),a卻沒(méi)有發(fā)生改變。
傳值與傳址的區(qū)別
a是一個(gè)數(shù)組屬于引用類(lèi)型 當(dāng)賦予b數(shù)據(jù)的時(shí)候傳的是棧中的地址,相當(dāng)于一個(gè)新的不同名的指針,并不是一個(gè)新的對(duì)象 。而c僅僅是從a堆內(nèi)存中獲取的一個(gè)數(shù)據(jù)值,并保存在棧中。所以b修改的時(shí)候,會(huì)根據(jù)地址回到a堆中修改,c則直接在棧中修改,并且不能指向a堆內(nèi)存中。


圖片.png

var a = {
key1:"11111"
}
function Copy(p) {
var c = {};
for (var i in p) {
  c[i] = p[i];
}
return c;
}
a.key2 = ['小輝','小輝'];

var b = Copy(a);
b.key3 = '33333';

alert(b.key1); //1111111
alert(b.key3); //33333
alert(a.key3); //undefined
原因是key1的值屬于基本類(lèi)型,所以拷貝的時(shí)候傳遞的就是該數(shù)據(jù)段;但是key2的值是堆內(nèi)存中的對(duì)象,所以key2在拷貝的時(shí)候傳遞的是指向key2對(duì)象的地址,無(wú)論復(fù)制多少個(gè)key2,其值始終是指向父對(duì)象的key2對(duì)象的內(nèi)存空間。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在函數(shù)中定義的一些基本類(lèi)型的變量和對(duì)象的引用變量都在函數(shù)的棧內(nèi)存中分配。 當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java就...
    木有魚(yú)丸啦閱讀 634評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,734評(píng)論 18 399
  • 1.項(xiàng)目經(jīng)驗(yàn) 2.基礎(chǔ)問(wèn)題 3.指南認(rèn)識(shí) 4.解決思路 ios開(kāi)發(fā)三大塊: 1.Oc基礎(chǔ) 2.CocoaTouch...
    扶光啟玄閱讀 5,205評(píng)論 0 13
  • 「如何忘掉這筆債/如何加 如何減 如何數(shù)算愉快」 本來(lái)日子該過(guò)得很安穩(wěn),我該是別人眼中羨慕的對(duì)象。 我有一個(gè)疼愛(ài)我...
    甜夢(mèng)每朝驚破閱讀 388評(píng)論 0 0
  • 老子說(shuō):大道至簡(jiǎn)。很多人說(shuō),炒股很難,今天簡(jiǎn)單點(diǎn),說(shuō)一下成為“股神”的四個(gè)步驟。 1、 對(duì)于一個(gè)不懂股票的人來(lái)說(shuō),...
    武松打虎老馬說(shuō)股閱讀 1,158評(píng)論 0 1

友情鏈接更多精彩內(nèi)容