前端 js 棧內(nèi)存和堆內(nèi)存 基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型的區(qū)別?
先了解一下JavaScript 數(shù)據(jù)類型有哪些?
javaScript 中有8種基本的數(shù)據(jù)類型:7種為基本數(shù)據(jù)類型,而Object 為復(fù)雜數(shù)據(jù)類型
基本數(shù)據(jù)類型(原始數(shù)據(jù)類型):
- number 用于任何類型的數(shù)字
- bigint 用于任意長(zhǎng)度的整數(shù)。
- string 用于字符串
- boolean :布爾值 用于 true 和 false。
- null 用于未知的值
- undefined 用于未定義的值 —— 只有一個(gè) undefined 值的獨(dú)立類型。
- symbol 用于唯一的標(biāo)識(shí)符。
復(fù)雜數(shù)據(jù)類型(非原始數(shù)據(jù)類型):億點(diǎn)小知識(shí): Object 是復(fù)雜數(shù)據(jù)類型的統(tǒng)稱,以下類型都是屬于Object 類型:
- Function(函數(shù))
- Array(數(shù)組)
- Date(日期)
- RegExp(正則表達(dá)式)
接下來(lái)我們來(lái)看一下 棧內(nèi)存和堆內(nèi)存
當(dāng)定義一個(gè)變量的時(shí)候,JavaScript 引擎會(huì)為變量分配兩種內(nèi)存:棧內(nèi)存和堆內(nèi)存。
棧內(nèi)存和堆內(nèi)存分別對(duì)應(yīng)基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型
- 棧內(nèi)存:
基本數(shù)據(jù)類型: number、bigint 、string 、boo lean 、null 、undefined 、symbol
對(duì)于基本數(shù)據(jù)類型有固定的大小。JavaScript 引擎為它們分配一片固定的內(nèi)存,并存儲(chǔ)在上:
let name = "小張";
let age = 18;
因?yàn)?name 和 age 都是基本數(shù)據(jù)類型,JavaScript 引擎將它們存儲(chǔ)在棧上,如下圖所示:
JavaScript 將對(duì)象復(fù)雜數(shù)據(jù)類型(Object) 存儲(chǔ)在堆上
let obj = {
name: "小張",
age: 18
};
let arr = [1,2,3]
對(duì)于復(fù)雜數(shù)據(jù)類型 會(huì)把變量名(對(duì)象名)作為堆內(nèi)存的地址指向 堆內(nèi)存 如下圖所示:
關(guān)于棧(Stack)
“棧”具有線程和“先進(jìn)后出”的特點(diǎn),也就是每個(gè)棧楨一般會(huì)保存下一個(gè)棧楨的地址,指向next節(jié)點(diǎn)(即指向下一個(gè)棧楨),類似隊(duì)列的鏈?zhǔn)浇Y(jié)構(gòu)。同時(shí)先入棧的會(huì)先執(zhí)行,后入棧的會(huì)先彈出(執(zhí)行完銷毀)。
我們常說(shuō)的棧內(nèi)存一般指的是內(nèi)存的空間棧。
那么棧內(nèi)存有哪些特點(diǎn)
數(shù)據(jù)一執(zhí)行完畢,變量會(huì)立即釋放,節(jié)約內(nèi)存空間。
- 優(yōu)勢(shì):存取速度比堆要快,僅次于直接位于CPU中的寄存器。
- 缺點(diǎn):存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。
億點(diǎn)小知識(shí):棧內(nèi)存的數(shù)據(jù)會(huì)進(jìn)行共享
let a = 2
let b = 2
運(yùn)行過(guò)程是 它會(huì)在棧中創(chuàng)建一個(gè)變量為a的引用 然后查找棧內(nèi)是否有2這個(gè)數(shù)據(jù),如果沒(méi)有就創(chuàng)建一個(gè)2數(shù)據(jù)進(jìn)行賦值,當(dāng)b進(jìn)行查找的時(shí)候會(huì)找到2這個(gè)數(shù)據(jù)直接會(huì)指向2這個(gè)數(shù)據(jù),但當(dāng)a=3的時(shí)候 同樣會(huì)去查找有沒(méi)有3數(shù)據(jù),沒(méi)有會(huì)進(jìn)行創(chuàng)建3,但不會(huì)影響b=2 這個(gè)值
關(guān)于堆(Heap)
是內(nèi)存中最大的一塊內(nèi)存區(qū)域,也是被各個(gè)線程共享的內(nèi)存區(qū)域,所有的對(duì)象實(shí)例(或復(fù)雜類型信息)都保存在堆內(nèi)存中。
堆內(nèi)存特點(diǎn)
堆內(nèi)存中所有的實(shí)體都有內(nèi)存地址值,內(nèi)存釋放靠垃圾回收機(jī)制不定時(shí)的收取。
- 堆的優(yōu)勢(shì):可以動(dòng)態(tài)地分配內(nèi)存大小。
- 缺點(diǎn):由于要在運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存,存取速度較慢。(這個(gè)一般是體會(huì)不到的,只是相對(duì)于棧內(nèi)存而言)
了解一些相關(guān)的知識(shí)
-
變量
變量名是棧內(nèi)存指針的別名。因?yàn)榭梢韵嚷暶髯兞?,后賦值。
聲明變量是在指針頁(yè)表里建立變量信息。而賦值才是真正的開辟內(nèi)存空間。但是為了節(jié)省內(nèi)存
所以變量名與值數(shù)據(jù)是分開存放的。
就因?yàn)樽兞颗c值是分開兩個(gè)地方保存,所以才有“棧內(nèi)存數(shù)據(jù)共享”這個(gè)特性。從而會(huì)有不同的變量名指向同一個(gè)內(nèi)存,和相同變量名指向不同的內(nèi)存等情況。
而保存變量名的內(nèi)存地址稱為指針變量。 -
內(nèi)存溢出
內(nèi)存溢出是指程序在申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory。 -
內(nèi)存泄露
內(nèi)存泄露是指程序在申請(qǐng)內(nèi)存后,無(wú)法釋放已申請(qǐng)的內(nèi)存空間,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴(yán)重,無(wú)論多少內(nèi)存,遲早會(huì)被占光。
我們?cè)陂_發(fā)中有時(shí)候會(huì)遇到瀏覽器崩潰無(wú)響應(yīng)可能就是因?yàn)閮?nèi)存堆積的后果。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-503375.html
以上就是js的棧內(nèi)存和堆內(nèi)存感謝大家的閱讀
如碰到其他的問(wèn)題 可以私下我 一起探討學(xué)習(xí)
如果對(duì)你有所幫助還請(qǐng) 點(diǎn)贊
收藏謝謝~!
關(guān)注收藏博客 作者會(huì)持續(xù)更新…文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-503375.html
到了這里,關(guān)于前端 js 棧內(nèi)存和堆內(nèi)存 基本數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型的區(qū)別?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!