若有錯誤煩請指正
下面經過幾個例子理解不一樣數據類型的堆棧內存處理node
var a = 12; var b = a; b = 13; console.log(a);
瀏覽器可以運行js代碼,是由於瀏覽器會在計算機內存中分配出一塊內存,用來供代碼執行,這塊內存叫棧內存,也叫Stack,或者ECStack(Execution Context Stack)執行環境棧。web
爲了區分是哪一個區域(全局或者函數等)下的代碼執行,會產生一個執行上下文(EC : Execution Context)。所謂執行上下文,實際上是一個抽象的概念,簡單來理解就是代碼執行區域的劃分。瀏覽器
在全局環境下會產生 EC(G) :Execution Context (golbal) 全局執行上下文,其中VO(G)全局變量對象(Varibale Object)存儲全局執行上下文聲明的變量,而後進入棧內存執行。app
接着開始執行,先聲明變量,聲明變量有三步函數
var [變量] = [值]spa
先建立值(執行等號右邊)3d
聲明變量 declare指針
定義(賦值)變量:讓變量和值關聯到一塊兒,也就是所謂的賦值操做,也叫定義(defined)或指針指向code
var n; //默認值是undefined 未定義
因此var a = 12
步驟是對象
12
值a
12
賦值給a
而var b = a
處理是
由於右側的a不是值,因此不須要第一步,不須要在棧裏面開闢空間,直接進行第二步聲明,而後執行第三步,關聯到12
值(指針)
b=13
的處理步驟是
13
值b
已經在當前上下文的變量對象中,因此不須要第二步聲明13
賦值給b
結果:
整體執行邏輯:
var a = {n: 12}; var b = a; b['n'] = 13; console.log(a.n);
當第一步建立的值是一個引用類型的值時候,值就無法直接存到棧裏(沒有這麼大的空間)。當建立引用類型值的時候,會進行如下處理
這就是第一步,建立值的過程
第二步聲明。第三部賦值,將16進制的地址賦值給變量
var b = a;
時,由於a
爲 變量,因此不須要建立值,接着聲明b
,最後賦值,將棧中a
指向的地址也一樣賦值給b
,讓b
也指向那個16進制地址
b['n'] = 13
運行原理:
b['n'] = 13
屬於對象的成員訪問
b
首先基於地址0x000000
找到堆內存n
的值改成13
console.log(a.n)
也屬於成員訪問 因此輸出13
順序以下
總結:基本數據類型和引用數據類型的區別?
基本類型的值直接存儲在棧內存當中,直接按照值操做,引用數據類型值是開闢單獨的堆內存存儲信息的,將堆內存的地址存在棧當中,操做的都是引用地址
var a = {n: 12}; var b = a; b = {n: 13}; console.log(a.n);
當到b = {n: 13};
時
新開闢一個堆內存{n: 13}
,將地址指向b
不一樣於VO,VO(G)是全局變量對象,存儲當前上下文聲明的變量的
GO global object 全局對象,是加載頁面默認造成的。在瀏覽器中,加載頁面時,在全局上下文中會默認定義一個叫window
的對象,其中有setTimeout
,setInterval
等供js調用的屬性和方法
注意區分VO和GO
JavaScript 中有一個特殊的對象,稱爲 全局對象(Global Object),它及其全部屬性均可以在程序的任何地方訪問,即全局變量
在瀏覽器 JavaScript 中,一般window
是全局對象, 而 Node。js 中的全局對象是global
,全部全局變量(除了global
自己之外)都是global
對象的屬性。
在 Node。js 咱們能夠直接訪問到global
的屬性,而不須要在應用中包含它。
global
,process
,__filename
,__dirname
var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b);
var a = {n: 1}; var b = a;
前兩行代碼執行以下,不在闡述:
要想理解a.x = a = {n: 2};
簡單說一下運算符優先級
var a=12,b=13;
至關於
var a=12 var b=13
var a=b=13
至關於
b=13 var a=b//或者var a=13
正常計算都是從右到左處理的(固然第一步仍是建立值)
可是無論是a.x=b=13
仍是b=a.x=13
都要先計算a.x
由於優先級比較高(成員訪問的優先級爲19,僅次於()
運算,運算符優先級 )
a.x = a = {n: 2};
運算步驟以下
a.x = 地址
a = 地址
因此如今a
指向0x000001,b
指向0x000000,即a
爲{n:2}
,b
爲{n:1,x:{n:2}}
結果:
一個變量只能夠關聯一個棧中的值,可是一個棧中的值,能夠被多個變量關聯