JavaScript基礎(chǔ)之?dāng)?shù)據(jù)類型的示例分析-創(chuàng)新互聯(lián)

這篇文章主要為大家展示了“JavaScript基礎(chǔ)之?dāng)?shù)據(jù)類型的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“JavaScript基礎(chǔ)之?dāng)?shù)據(jù)類型的示例分析”這篇文章吧。

成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括金寨網(wǎng)站建設(shè)、金寨網(wǎng)站制作、金寨網(wǎng)頁(yè)制作以及金寨網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,金寨網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到金寨省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

基本數(shù)據(jù)結(jié)構(gòu)

棧,只允許在一段進(jìn)行插入或者刪除操作的線性表,是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)。

堆是基于散列算法的數(shù)據(jù)結(jié)構(gòu)。

隊(duì)列

隊(duì)列是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)。

JavaScript中數(shù)據(jù)類型的存儲(chǔ)

JavaScript中將數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,它們其中有一個(gè)區(qū)別就是存儲(chǔ)的位置不同。

基本數(shù)據(jù)類型

我們都知道JavaScript中的基本數(shù)據(jù)類型有:

  • String

  • Number

  • Boolean

  • Undefined

  • Null

  • Symbol(暫時(shí)不管)

基本數(shù)據(jù)類型都是一些簡(jiǎn)單的數(shù)據(jù)段,它們是存儲(chǔ)在棧內(nèi)存中。

引用數(shù)據(jù)類型

JavaScript中的引用數(shù)據(jù)類型有:

  • Array

  • Object

引用數(shù)據(jù)類型是保存在堆內(nèi)存中的,然后再棧內(nèi)存中保存一個(gè)對(duì)堆內(nèi)存中實(shí)際對(duì)象的引用。所以,JavaScript中對(duì)引用數(shù)據(jù)類型的操作都是操作對(duì)象的引用而不是實(shí)際的對(duì)象。

可以理解為,棧內(nèi)存中保存了一個(gè)地址,這個(gè)地址和堆內(nèi)存中的實(shí)際值是相關(guān)的。

圖解

現(xiàn)在,我們聲明幾個(gè)變量試試:

var name="axuebin";
var age=25;
var job;
var arr=[1,2,3];
var obj={age:25};

可以通過(guò)下圖來(lái)表示數(shù)據(jù)類型在內(nèi)存中的存儲(chǔ)情況:

JavaScript基礎(chǔ)之?dāng)?shù)據(jù)類型的示例分析

此時(shí)name,age,job三種基本數(shù)據(jù)類型是直接存在棧內(nèi)存中的,而arr,obj在棧內(nèi)存中只是存了一個(gè)地址來(lái)表示對(duì)堆內(nèi)存中的引用。

復(fù)制

基本數(shù)據(jù)類型

對(duì)于基本數(shù)據(jù)類型,如果進(jìn)行復(fù)制,系統(tǒng)會(huì)自動(dòng)為新的變量在棧內(nèi)存中分配一個(gè)新值,很容易理解。

引用數(shù)據(jù)類型

如果對(duì)于數(shù)組、對(duì)象這樣的引用數(shù)據(jù)類型而言,復(fù)制的時(shí)候就會(huì)有所區(qū)別了:

系統(tǒng)也會(huì)自動(dòng)為新的變量在棧內(nèi)存中分配一個(gè)值,但這個(gè)值僅僅是一個(gè)地址。也就是說(shuō),復(fù)制出來(lái)的變量和原有的變量具有相同的地址值,指向堆內(nèi)存中的同一個(gè)對(duì)象。

JavaScript基礎(chǔ)之?dāng)?shù)據(jù)類型的示例分析

如果所示,執(zhí)行了var objCopy=obj之后,obj和objCopy具有相同的地址值,執(zhí)行堆內(nèi)存中的同一個(gè)實(shí)際對(duì)象。

這有什么不同呢?

當(dāng)我修改obj或objCopy時(shí),都會(huì)引起另一個(gè)變量的改變。

為什么?

為什么基礎(chǔ)數(shù)據(jù)類型存在棧中,而引用數(shù)據(jù)類型存在堆中呢?

  1. 堆比棧大,棧比對(duì)速度快。

  2. 基礎(chǔ)數(shù)據(jù)類型比較穩(wěn)定,而且相對(duì)來(lái)說(shuō)占用的內(nèi)存小。

  3. 引用數(shù)據(jù)類型大小是動(dòng)態(tài)的,而且是無(wú)限的。

  4. 堆內(nèi)存是無(wú)序存儲(chǔ),可以根據(jù)引用直接獲取。

參考文章

理解js內(nèi)存分配

原始值和引用值

在ECMAScript中,變量可以存放兩種類型的值,即原始值和引用值。
原始值指的就是代表原始數(shù)據(jù)類型(基本數(shù)據(jù)類型)的值,即Undefined,Null,Number,String,Boolean類型所表示的值。
引用值指的就是復(fù)合數(shù)據(jù)類型的值,即Object,Function,Array,以及自定義對(duì)象,等等

棧和堆

與原始值與引用值對(duì)應(yīng)存在兩種結(jié)構(gòu)的內(nèi)存即棧和堆
棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),在javascript中可以通過(guò)Array來(lái)模擬棧的行為

原始值是存儲(chǔ)在棧中的簡(jiǎn)單數(shù)據(jù),也就是說(shuō),他們的值直接存儲(chǔ)在變量訪問(wèn)的位置。

堆是基于散列算法的數(shù)據(jù)結(jié)構(gòu),在javascript中,引用值是存放在堆中的。
引用值是存儲(chǔ)在堆中的對(duì)象,也就是說(shuō),存儲(chǔ)在變量處的值(即指向?qū)ο蟮淖兞?,存?chǔ)在棧中)是一個(gè)指針,指向存儲(chǔ)在堆中的實(shí)際對(duì)象.

例:var obj = new Object(); obj存儲(chǔ)在棧中它指向于new Object()這個(gè)對(duì)象,而new Object()是存放在堆中的。

那為什么引用值要放在堆中,而原始值要放在棧中,不都是在內(nèi)存中嗎,為什么不放在一起呢?那接下來(lái),讓我們來(lái)探索問(wèn)題的答案!

首先,我們來(lái)看一下代碼:

function Person(id,name,age){
this.id = id;
this.name = name;
this.age = age;
}
var num = 10;
var bol = true;
var str = "abc";
var obj = new Object();
var arr = ['a','b','c'];
var person = new Person(100,"笨蛋的座右銘",25);

然后我們來(lái)看一下內(nèi)存分析圖:

JavaScript基礎(chǔ)之?dāng)?shù)據(jù)類型的示例分析

變量num,bol,str為基本數(shù)據(jù)類型,它們的值,直接存放在棧中,obj,person,arr為復(fù)合數(shù)據(jù)類型,他們的引用變量存儲(chǔ)在棧中,指向于存儲(chǔ)在堆中的實(shí)際對(duì)象。

由上圖可知,我們無(wú)法直接操縱堆中的數(shù)據(jù),也就是說(shuō)我們無(wú)法直接操縱對(duì)象,但我們可以通過(guò)棧中對(duì)對(duì)象的引用來(lái)操作對(duì)象,就像我們通過(guò)遙控機(jī)操作電視機(jī)一樣,區(qū)別在于這個(gè)電視機(jī)本身并沒有控制按鈕。

現(xiàn)在讓我們來(lái)回答為什么引用值要放在堆中,而原始值要放在棧中的問(wèn)題:

記住一句話:能量是守衡的,無(wú)非是時(shí)間換空間,空間換時(shí)間的問(wèn)題

堆比棧大,棧比堆的運(yùn)算速度快,對(duì)象是一個(gè)復(fù)雜的結(jié)構(gòu),并且可以自由擴(kuò)展,如:數(shù)組可以無(wú)限擴(kuò)充,對(duì)象可以自由添加屬性。將他們放在堆中是為了不影響棧的效率。而是通過(guò)引用的方式查找到堆中的實(shí)際對(duì)象再進(jìn)行操作。相對(duì)于簡(jiǎn)單數(shù)據(jù)類型而言,簡(jiǎn)單數(shù)據(jù)類型就比較穩(wěn)定,并且它只占據(jù)很小的內(nèi)存。不將簡(jiǎn)單數(shù)據(jù)類型放在堆是因?yàn)橥ㄟ^(guò)引用到堆中查找實(shí)際對(duì)象是要花費(fèi)時(shí)間的,而這個(gè)綜合成本遠(yuǎn)大于直接從棧中取得實(shí)際值的成本。所以簡(jiǎn)單數(shù)據(jù)類型的值直接存放在棧中。

以上是“JavaScript基礎(chǔ)之?dāng)?shù)據(jù)類型的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享文章:JavaScript基礎(chǔ)之?dāng)?shù)據(jù)類型的示例分析-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://muchs.cn/article42/ceeghc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、微信小程序、網(wǎng)站設(shè)計(jì)、App開發(fā)、微信公眾號(hào)、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司