摘要:棧內存和堆內存中的變量分為基本類型和引用類型基本類型是保存在棧內存中的簡單數據段,它們的值都有固定的大小,保存在棧空間,通過按值訪問引用類型是保存在堆內存中的對象,值大小不固定,棧內存中存放的該對象的訪問地址指向堆內存中的對象,不允許直接訪
棧內存和堆內存
JavaScript中的變量分為基本類型和引用類型結合代碼與圖來理解基本類型是保存在棧內存中的簡單數據段,它們的值都有固定的大小,保存在棧空間,通過按值訪問
引用類型是保存在堆內存中的對象,值大小不固定,棧內存中存放的該對象的訪問地址指向堆內存中的對象,JavaScript不允許直接訪問堆內存中的位置,因此操作對象時,實際操作對象的引用
let a1 = 0; // 棧內存 let a2 = "this is string" // 棧內存 let a3 = null; // 棧內存 let b = { x: 10 }; // 變量b存在于棧中,{ x: 10 }作為對象存在于堆中 let c = [1, 2, 3]; // 變量c存在于棧中,[1, 2, 3]作為對象存在于堆中
當我們要訪問堆內存中的引用數據類型時
從棧中獲取該對象的地址引用
再從堆內存中取得我們需要的數據
基本類型發生復制行為let a = 20; let b = a; b = 30; console.log(a); // 20
結合下面圖進行理解:
在棧內存中的數據發生復制行為時,系統會自動為新的變量分配一個新值,最后這些變量都是相互獨立互不影響的
引用類型發生復制行為let a = { x: 10, y: 20 } let b = a; b.x = 5; console.log(a.x); // 5
引用類型的復制,同樣為新的變量b分配一個新的值,保存在棧內存中,不同的是,這個值僅僅是引用類型的一個地址指針
他們兩個指向同一個值,也就是地址指針相同,在堆內存中訪問到的具體對象實際上是同一個
因此改變b.x時,a.x也發生了變化,這就是引用類型的特性
結合下圖理解
總結文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107855.html
摘要:所以相對于簡單數據類型而言,他們占用內存比較小,如果放在堆中,查找會浪費很多時間,而把堆中的數據放入棧中也會影響棧的效率。六總結本文總結了數據類型及其聲明賦值更新時在內存堆棧中的表現,可以更深入的理解這些數據類型。 JS數據類型 與 內存堆棧 一、前言 JS的數據類型已經是大家都很熟悉的東西了,但是大家是否對這些數據類型在內存中的分配了解,甚至在操作這些變量時,內存中是如何表現的,本文...
摘要:基本類型基本類型的比較就是值的比較訪問是訪問值本身不能定義方法和屬性保存在棧內存中引用類型除了基本類型外,就是引用類型了。 基本類型 1、number2、string3、boolean4、symbol5、undefined6、null基本類型的比較就是值的比較;訪問是訪問值本身;不能定義方法和屬性;保存在棧內存中 引用類型 JavaScript除了基本類型外,就是引用類型了。如Arra...
摘要:引用數據類型是存放在堆內存中的,變量實際上是一個存放在棧內存的指針,這個指針指向堆內存中的地址。棧和堆的區別其實淺拷貝和深拷貝的主要區別就是數據在內存中的存儲類型不同。這里,對存在子對象的對象進行拷貝的時候,就是深拷貝了。 數據類型 在開始拷貝之前,我們從JavaScript的數據類型和內存存放地址講起。數據類型分為基本數據類型 和引用數據類型 基本數據類型主要包括undefin...
摘要:學習中函數參數值傳遞和引用傳遞的學習中函數參數值傳遞和引用傳遞在紅寶書中說到,中所有函數的參數都是按值傳遞的。 學習JS中函數參數值傳遞和引用傳遞的學習 JS中函數參數值傳遞和引用傳遞 在JavaScript紅寶書中說到,ECMAScript中所有函數的參數都是按值傳遞的。理解這個概念先要從JS的堆內存和棧內存說起:棧內存為自動分配的內存空間,它由系統自動釋放;堆內存則是動態分配的內存...
閱讀 2953·2021-11-11 16:55
閱讀 514·2021-09-27 13:36
閱讀 1072·2021-09-22 15:35
閱讀 2907·2019-08-30 12:46
閱讀 3125·2019-08-26 17:02
閱讀 1826·2019-08-26 11:56
閱讀 1294·2019-08-26 11:47
閱讀 422·2019-08-23 17:01