摘要:是按引用訪問的如下圖所示棧內(nèi)存中存放的只是該對象的訪問地址,在堆內(nèi)存中為這個值分配空間。棧內(nèi)存堆內(nèi)存為了使程序運(yùn)行時占用的內(nèi)存最小,通常要實(shí)現(xiàn)垃圾回收機(jī)制。
棧(stack) 棧stack為自動分配的內(nèi)存空間,它由系統(tǒng)自動釋放;
堆(heap) 堆heap是動態(tài)分配的內(nèi)存,大小不定也不會自動釋放。
JavaScript 中的變量分為基本類型和引用類型。
基本類型 (Undefined、Null、Boolean、Number和String)
基本類型在內(nèi)存中占據(jù)空間小、大小固定 ,他們的值保存在棧(stack)空間,是按值來訪問
引用類型 (對象、數(shù)組、函數(shù))
引用類型占據(jù)空間大、大小不固定, 棧內(nèi)存中存放地址指向堆(heap)內(nèi)存中的對象。是按引用訪問的
如下圖所示:棧內(nèi)存中存放的只是該對象的訪問地址, 在堆內(nèi)存中為這個值分配空間 。 由于這種值的大小不固定,因此不能把它們保存到棧內(nèi)存中。但內(nèi)存地址大小的固定的,因此可以將內(nèi)存地址保存在棧內(nèi)存中。 這樣,當(dāng)查詢引用類型的變量時, 先從棧中讀取內(nèi)存地址, 然后再通過地址找到堆中的值。
當(dāng)我們看到一個變量類型是已知的,就分配在棧里面,比如INT,Double等。其他未知的類型,比如自定義的類型,因?yàn)橄到y(tǒng)不知道需要多大,所以程序自己申請,這樣就分配在堆里面。
棧內(nèi)存&堆內(nèi)存為了使程序運(yùn)行時占用的內(nèi)存最小,通常要實(shí)現(xiàn)垃圾回收機(jī)制。
當(dāng)一個方法執(zhí)行時,每個方法都會建立自己的內(nèi)存棧,在這個方法內(nèi)定義的變量將會逐個放入這塊棧存里,隨著方法的執(zhí)行結(jié)束,這個方法的棧存也將自然銷毀了。因此,所有在方法中定義的變量都是放在棧內(nèi)存中的;
當(dāng)我們在程序中創(chuàng)建一個對象時,這個對象將被保存到運(yùn)行時數(shù)據(jù)區(qū)中,以便反復(fù)利用(因?yàn)閷ο蟮膭?chuàng)建成本開銷較大),這個運(yùn)行時數(shù)據(jù)區(qū)就是堆內(nèi)存。堆內(nèi)存中的對象不會隨方法的結(jié)束而銷毀,即使方法結(jié)束后,這個對象還可能被另一個引用變量所引用(方法的參數(shù)傳遞時很常見),則這個對象依然不會被銷毀,只有當(dāng)一個對象沒有任何引用變量引用它時,系統(tǒng)的垃圾回收機(jī)制才會在核實(shí)的時候回收它。
思考問題
demo1. var a = 1; var b = a; b = 2; // 這時a是?
demo1中在變量對象中的數(shù)據(jù)發(fā)生復(fù)制行為時,系統(tǒng)會自動為新的變量分配一個新值。var b = a執(zhí)行之后,b雖然重新賦值為2,但是他們其實(shí)已經(jīng)是相互獨(dú)立互不影響的值了。
demo2. var m = { a: 1, b: 2 } var n = m; n.a = 2; // 這時m.a的值呢?
demo2中我們通過var n = m執(zhí)行一次復(fù)制引用類型的操作。引用類型的復(fù)制同樣也會為新的變量自動分配一個新的值保存在變量對象中,但不同的是,這個新的值,僅僅只是引用類型的一個地址指針。當(dāng)?shù)刂分羔樝嗤瑫r,盡管他們相互獨(dú)立,但是在變量對象中訪問到的具體對象實(shí)際上是同一個。因此當(dāng)我改變n時,m也發(fā)生了變化。這就是引用類型的特性。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/83381.html
摘要:如果我們進(jìn)入一個函數(shù),我們在堆棧的頂部??纯聪旅娴拇a當(dāng)引擎開始執(zhí)行此代碼時,調(diào)用堆棧將為空。之后,步驟如下調(diào)用堆棧中的每個條目稱為堆棧幀。這正是拋出異常時構(gòu)造堆棧跟蹤的方式當(dāng)異常發(fā)生時,它基本上是調(diào)用堆棧的狀態(tài)。 隨著JavaScript越來越受歡迎,團(tuán)隊正在利用這個技術(shù)棧在多個層次- 前端,后端,混合應(yīng)用程序,嵌入式設(shè)備等等提供支持。 這篇文章旨在成為系列中第一個旨在深入挖掘Jav...
showImg(https://segmentfault.com/img/bVbjYU7?w=2000&h=1333); 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! JavsScript 是一門單線程的編程語言,這就意味著一個時間里只能處理一件事,也就是說 JavaScript 引擎一次只能在一個線程里處理一條語句。 雖然單線程簡化了編程代碼,因?yàn)槟悴槐靥珦?dān)心并發(fā)引出的問...
摘要:調(diào)用棧是一種單線程編程語言,這意味著它只有一個調(diào)用堆棧。調(diào)用棧是一種數(shù)據(jù)結(jié)構(gòu),它記錄了我們在程序中的位置。而且這不是唯一的問題,一旦你的瀏覽器開始處理調(diào)用棧中的眾多任務(wù),它可能會停止響應(yīng)相當(dāng)長一段時間。 本文是旨在深入研究JavaScript及其實(shí)際工作原理的系列文章中的第一篇:我們認(rèn)為通過了解JavaScript的構(gòu)建塊以及它們是如何工作的,將能夠編寫更好的代碼和應(yīng)用程序。我們還將分...
摘要:它對數(shù)組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時成為的副本。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯過了前面的章節(jié),可...
摘要:它對數(shù)組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時成為的副本。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯過了前面的章節(jié),可...
摘要:本章會對語言引擎,運(yùn)行時,調(diào)用棧做一個概述。調(diào)用棧只是一個單線程的編程語言,這意味著它只有一個調(diào)用棧。查看如下代碼當(dāng)引擎開始執(zhí)行這段代碼的時候,調(diào)用棧會被清空。之后,產(chǎn)生如下步驟調(diào)用棧中的每個入口被稱為堆棧結(jié)構(gòu)。 原文請查閱這里,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原...
閱讀 1166·2021-10-15 09:39
閱讀 3070·2021-09-10 10:50
閱讀 3463·2019-08-30 15:53
閱讀 1890·2019-08-30 15:52
閱讀 2577·2019-08-29 15:31
閱讀 1985·2019-08-26 13:43
閱讀 2606·2019-08-26 13:37
閱讀 1449·2019-08-23 18:31