亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript中的堆棧

luodongseu / 2253人閱讀

摘要:是按引用訪問(wèn)的如下圖所示棧內(nèi)存中存放的只是該對(duì)象的訪問(wèn)地址,在堆內(nèi)存中為這個(gè)值分配空間。棧內(nèi)存堆內(nèi)存為了使程序運(yùn)行時(shí)占用的內(nèi)存最小,通常要實(shí)現(xiàn)垃圾回收機(jī)制。

棧(stack) 棧stack為自動(dòng)分配的內(nèi)存空間,它由系統(tǒng)自動(dòng)釋放;

堆(heap) 堆heap是動(dòng)態(tài)分配的內(nèi)存,大小不定也不會(huì)自動(dòng)釋放。

JavaScript 中的變量分為基本類型和引用類型。

基本類型 (Undefined、Null、Boolean、Number和String)
基本類型在內(nèi)存中占據(jù)空間小、大小固定 ,他們的值保存在棧(stack)空間,是按值來(lái)訪問(wèn)

引用類型 (對(duì)象、數(shù)組、函數(shù))
引用類型占據(jù)空間大、大小不固定, 棧內(nèi)存中存放地址指向堆(heap)內(nèi)存中的對(duì)象。是按引用訪問(wèn)的

如下圖所示:棧內(nèi)存中存放的只是該對(duì)象的訪問(wèn)地址, 在堆內(nèi)存中為這個(gè)值分配空間 。 由于這種值的大小不固定,因此不能把它們保存到棧內(nèi)存中。但內(nèi)存地址大小的固定的,因此可以將內(nèi)存地址保存在棧內(nèi)存中。 這樣,當(dāng)查詢引用類型的變量時(shí), 先從棧中讀取內(nèi)存地址, 然后再通過(guò)地址找到堆中的值。

當(dāng)我們看到一個(gè)變量類型是已知的,就分配在棧里面,比如INT,Double等。其他未知的類型,比如自定義的類型,因?yàn)橄到y(tǒng)不知道需要多大,所以程序自己申請(qǐng),這樣就分配在堆里面。

棧內(nèi)存&堆內(nèi)存

為了使程序運(yùn)行時(shí)占用的內(nèi)存最小,通常要實(shí)現(xiàn)垃圾回收機(jī)制。

當(dāng)一個(gè)方法執(zhí)行時(shí),每個(gè)方法都會(huì)建立自己的內(nèi)存棧,在這個(gè)方法內(nèi)定義的變量將會(huì)逐個(gè)放入這塊棧存里,隨著方法的執(zhí)行結(jié)束,這個(gè)方法的棧存也將自然銷毀了。因此,所有在方法中定義的變量都是放在棧內(nèi)存中的;

當(dāng)我們?cè)诔绦蛑袆?chuàng)建一個(gè)對(duì)象時(shí),這個(gè)對(duì)象將被保存到運(yùn)行時(shí)數(shù)據(jù)區(qū)中,以便反復(fù)利用(因?yàn)閷?duì)象的創(chuàng)建成本開(kāi)銷較大),這個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)就是堆內(nèi)存。堆內(nèi)存中的對(duì)象不會(huì)隨方法的結(jié)束而銷毀,即使方法結(jié)束后,這個(gè)對(duì)象還可能被另一個(gè)引用變量所引用(方法的參數(shù)傳遞時(shí)很常見(jiàn)),則這個(gè)對(duì)象依然不會(huì)被銷毀,只有當(dāng)一個(gè)對(duì)象沒(méi)有任何引用變量引用它時(shí),系統(tǒng)的垃圾回收機(jī)制才會(huì)在核實(shí)的時(shí)候回收它。

思考問(wèn)題

demo1.
var a = 1;
var b = a;
b = 2;

// 這時(shí)a是?

demo1中在變量對(duì)象中的數(shù)據(jù)發(fā)生復(fù)制行為時(shí),系統(tǒng)會(huì)自動(dòng)為新的變量分配一個(gè)新值。var b = a執(zhí)行之后,b雖然重新賦值為2,但是他們其實(shí)已經(jīng)是相互獨(dú)立互不影響的值了。

demo2.
var m = { a: 1, b: 2 }
var n = m;
n.a = 2;

// 這時(shí)m.a的值呢?

demo2中我們通過(guò)var n = m執(zhí)行一次復(fù)制引用類型的操作。引用類型的復(fù)制同樣也會(huì)為新的變量自動(dòng)分配一個(gè)新的值保存在變量對(duì)象中,但不同的是,這個(gè)新的值,僅僅只是引用類型的一個(gè)地址指針。當(dāng)?shù)刂分羔樝嗤瑫r(shí),盡管他們相互獨(dú)立,但是在變量對(duì)象中訪問(wèn)到的具體對(duì)象實(shí)際上是同一個(gè)。因此當(dāng)我改變n時(shí),m也發(fā)生了變化。這就是引用類型的特性。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/83381.html

相關(guān)文章

  • JavaScript如何工作:引擎,運(yùn)行時(shí)和調(diào)用堆棧的概述

    摘要:如果我們進(jìn)入一個(gè)函數(shù),我們?cè)诙褩5捻敳?。看看下面的代碼當(dāng)引擎開(kāi)始執(zhí)行此代碼時(shí),調(diào)用堆棧將為空。之后,步驟如下調(diào)用堆棧中的每個(gè)條目稱為堆棧幀。這正是拋出異常時(shí)構(gòu)造堆棧跟蹤的方式當(dāng)異常發(fā)生時(shí),它基本上是調(diào)用堆棧的狀態(tài)。 隨著JavaScript越來(lái)越受歡迎,團(tuán)隊(duì)正在利用這個(gè)技術(shù)棧在多個(gè)層次- 前端,后端,混合應(yīng)用程序,嵌入式設(shè)備等等提供支持。 這篇文章旨在成為系列中第一個(gè)旨在深入挖掘Jav...

    wwolf 評(píng)論0 收藏0
  • 搞懂 JavsScript 異步 —? 事件輪詢

    showImg(https://segmentfault.com/img/bVbjYU7?w=2000&h=1333); 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! JavsScript 是一門(mén)單線程的編程語(yǔ)言,這就意味著一個(gè)時(shí)間里只能處理一件事,也就是說(shuō) JavaScript 引擎一次只能在一個(gè)線程里處理一條語(yǔ)句。 雖然單線程簡(jiǎn)化了編程代碼,因?yàn)槟悴槐靥珦?dān)心并發(fā)引出的問(wèn)...

    adam1q84 評(píng)論0 收藏0
  • JavaScript是如何工作的:引擎,運(yùn)行時(shí)和調(diào)用堆棧的概述!

    摘要:調(diào)用棧是一種單線程編程語(yǔ)言,這意味著它只有一個(gè)調(diào)用堆棧。調(diào)用棧是一種數(shù)據(jù)結(jié)構(gòu),它記錄了我們?cè)诔绦蛑械奈恢?。而且這不是唯一的問(wèn)題,一旦你的瀏覽器開(kāi)始處理調(diào)用棧中的眾多任務(wù),它可能會(huì)停止響應(yīng)相當(dāng)長(zhǎng)一段時(shí)間。 本文是旨在深入研究JavaScript及其實(shí)際工作原理的系列文章中的第一篇:我們認(rèn)為通過(guò)了解JavaScript的構(gòu)建塊以及它們是如何工作的,將能夠編寫(xiě)更好的代碼和應(yīng)用程序。我們還將分...

    PiscesYE 評(píng)論0 收藏0
  • JavaScript 是如何工作的:JavaScript 的共享傳遞和按值傳遞

    摘要:它對(duì)數(shù)組和對(duì)象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲(chǔ)在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時(shí)成為的副本。 這是專門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過(guò)了前面的章節(jié),可...

    keithyau 評(píng)論0 收藏0
  • JavaScript 是如何工作的:JavaScript 的共享傳遞和按值傳遞

    摘要:它對(duì)數(shù)組和對(duì)象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲(chǔ)在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時(shí)成為的副本。 這是專門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過(guò)了前面的章節(jié),可...

    陳偉 評(píng)論0 收藏0
  • JavaScript 工作原理之一-引擎,運(yùn)行時(shí),調(diào)用堆棧(譯)

    摘要:本章會(huì)對(duì)語(yǔ)言引擎,運(yùn)行時(shí),調(diào)用棧做一個(gè)概述。調(diào)用棧只是一個(gè)單線程的編程語(yǔ)言,這意味著它只有一個(gè)調(diào)用棧。查看如下代碼當(dāng)引擎開(kāi)始執(zhí)行這段代碼的時(shí)候,調(diào)用棧會(huì)被清空。之后,產(chǎn)生如下步驟調(diào)用棧中的每個(gè)入口被稱為堆棧結(jié)構(gòu)。 原文請(qǐng)查閱這里,本文采用知識(shí)共享署名 4.0 國(guó)際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請(qǐng)查閱這里。 這是 JavaScript 工作原...

    Betta 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<