在瀏覽器的進(jìn)程里面桑驱,不管是在常量池,棧蟀拷,堆中碰纬,我們都是給對象來開辟內(nèi)存空間的萍聊,雖然說對象的分布不同问芬,常量池存放的可能是值類型的對象,堆中可能是引用類型的對象寿桨,那么既然開辟了內(nèi)存此衅,怎樣才能找到它呢? 我們根據(jù)內(nèi)存地址來找到它 亭螟,在JS中我們無法獲取到具體的值挡鞍,我們只能知道它是通過16進(jìn)制的方式 瀏覽器自動分配的,是類似@123abc這樣预烙。
我們通過變量來拿到對象的內(nèi)存地址墨微,在這里我們叫做引用。
1.變量聲明
var c = {};
當(dāng)我們聲明一個變量c扁掸,我們在內(nèi)存中做了什么呢翘县?
1.在棧中開辟一塊內(nèi)存空間 名字叫c
2.把對象的內(nèi)存地址 @123abc 給到變量c進(jìn)行存儲這個過程在c語言中叫指針的過程 最域,在JS中叫做引用的過程;
我們把內(nèi)存地址給了變量C 進(jìn)行存儲 訪問時候?qū)嶋H上是根據(jù)當(dāng)前的變量存儲的地址锈麸,找到了
我對應(yīng)的內(nèi)存空間 镀脂。
變量的意義就是來存儲對象的內(nèi)存地址,我們通過存儲的內(nèi)存地址來找到對象的內(nèi)存空間忘伞;
這個過程 除了賦值之外薄翅,其實還是把我們當(dāng)前對象的內(nèi)存地址賦值,或者說是將內(nèi)存里面的引用 給了我們的變量氓奈。
當(dāng)我們輸出
typeof c; //object
為什么會判定這個變量是object類型呢翘魄?其實變量本身沒有數(shù)據(jù)類型的,當(dāng)我們訪問變量的數(shù)據(jù)類型的時候探颈,一定是根據(jù)當(dāng)前變量存儲的內(nèi)存地址來找到變量的內(nèi)存空間從而找到這個對象熟丸,去看這個對象是什么數(shù)據(jù)類型 。
我們來驗證一下
比如
var d ;
當(dāng)我們聲明一個變量d伪节,不做任何操作的時候光羞,當(dāng)程序去解析代碼時會在棧中開辟一塊內(nèi)存d出來,當(dāng)我們試圖去訪問d時怀大,輸出什么纱兑?一定是undefined;
同樣輸出他的類型時typeof d; //undefined
也是undefined化借;因為變量d中沒有存儲任何的內(nèi)存地址潜慎,什么都沒有,所以就沒有任何的數(shù)據(jù)類型蓖康。
這與之前所理解的 “賦值” 還是有一些差距的
2.語言的執(zhí)行規(guī)則
首先舉一個非常經(jīng)典的例子铐炫。
按道理說程序應(yīng)該會報錯可為什么會是undefined
很多人解釋說的變量的提升?那么變量的提升究竟是什么東西呢蒜焊?
其實是這樣子的
在腳本語言中的執(zhí)行順序 是 先定義 后執(zhí)行
先定義: 分為 通過var定義變量 和 function聲明函數(shù) 并且從上往下執(zhí)行定義代碼
后執(zhí)行: 除了定義代碼之外其余的全部都是執(zhí)行代碼 也是從上往下執(zhí)行
那么上圖中的代碼執(zhí)行順序就應(yīng)該是這樣的了:
1.定義變量 a
var a ;
2 訪問變量aconsole.log(a);
3 把 1 賦值 給 aa=1
(把1在內(nèi)存中的地址賦值給變量a倒信,讓a拿到它的引用)
所以當(dāng)?shù)诙捷敵鯽時 還沒有拿到引用地址,結(jié)果就是undefined了如果下面還有
console.log(a)
那么就會輸出1
了 泳梆,因為a已經(jīng)拿到了1在常量里的內(nèi)存地址a鳖悠。
這就是腳本語言的執(zhí)行規(guī)則,一定是先定義后執(zhí)行优妙。
3.為什么先定義后執(zhí)行呢乘综?
是由于我們內(nèi)存機制所主導(dǎo)的,并不是在信口開河套硼。
在內(nèi)存里面的順序是這樣的:
1.開辟變量的內(nèi)存空間卡辰;
2 拿到變量的內(nèi)存地址;
當(dāng)我們var a = 1;
的時候會在棧中 開辟出一塊內(nèi)存空間 變量a;然后在堆中開辟一塊內(nèi)存空間 @123abc 這個內(nèi)存地址 給到變量a 進(jìn)行存儲九妈;當(dāng)我們console.log(a)
訪問變量a的時候會根據(jù)里面存儲的內(nèi)存地址找到對應(yīng)的內(nèi)存空間朴恳。
既然內(nèi)存里面是這么做的,那么腳本語言的執(zhí)行也是這么做的允蚣。
執(zhí)行規(guī)則 是由我們內(nèi)存的機制所主導(dǎo)所以是 先定義 后執(zhí)行
所以于颖,當(dāng)我們寫代碼的順序和執(zhí)行的順序不一致的時候,就會出現(xiàn)一些意想不到的問題嚷兔,變量的提升的本質(zhì)其實也就是先定義后執(zhí)行森渐,而這個順序的根本原因也就是內(nèi)存的機制所決定的。