被第一人視角的我打斷了對話,現在要繼續講完:
在D22的時候,我們知道了識別字、保留字,其中識別字缺少了宣告這件事仍可以賦值,但是它會被存於全域,易造成污染。
x1 = 2;
//window查找是否有這個屬性
window.x1
所以宣告究竟能做到些什麼?
var
& let
& const
的差異在下面我會將宣告的差異分成兩個面向來講解:
在本日只會討論 1. 宣告變數的可變性 的部分,那就開始吧!
不可變的const
用const
宣告的數值,不可重新賦值跟重新宣告。
const x = 2;
x = 1;
當你試著重新賦值時,就會顯示上方的錯誤。
可變的let
,var
以var
或let
宣告的變數,其值可以視情況做修改;而宣告的部分:var
可重複宣告,let
不可重複宣告
var:
var x = 2;
var x = 1;
console.log(x);
let:
let y = 2;
let y = 1;
console.log(y);
讓我們試著從記憶體的角度來看看吧?
首先,你知道變數也需要存放地方嗎?那是在哪呢?!
以JavaScript來說分別就是:
1
,"字串"
等object
等。所以,當你每次宣告變數,並賦予基本型別值時,JS引擎其實在背後都會為變數新增記憶體空間。
例如當你宣告了一個變數為2
時,其實是:
let x = 2;//const or var 也是
而當你重新賦值時,實際正同時發生以下的事情:
let x = 2;
x = 1;
這時候實際上會再新建0x002的記憶體位置,並將1存入,接著x
轉為指向0x002的記憶體位置。
let x = 2;
//把x值傳給y
let y = x;
兩個不同變數皆會指向相同記憶體位置。
x
的值時當x
將值賦予給別人後,將本身的值從2
改為1
時
let x = 2;
//把x值傳給y
let y = x;
x = 1;
let
& const
不變與可變還記得上面講到:用let
宣告的變數可修改,但const
則不行這件事嗎?所謂的可變與不可變其實是指:記憶體位置
let
允許你修改記憶體位置,但const
則不行
我們先試著用const
再寫一次同樣的內容:
const x = 2;
x = 1;
前面提過 let
,const
兩種宣告的值是否能修改,其實是跟記憶體位置有關,因此這時自然就會報錯啦~
我們同樣用const
宣告,這次要建立的是一個複合型別的空陣列
const x = [];
接著我們透過push
幫它新增值1
,2
,然後印出結果
x.push(1);
x.push(2);
console.log(x);
結果卻沒有報錯,怎麼回事呢? 一樣再從記憶體來看
當你宣告了一個空陣列時,其實是長這樣的
const x = [];
此時,你在Call Stack儲存的其實是Heap的記憶體位置,而不再是一個值。
所以當使用push
添加值卻不會報錯,是因為push
影響的是Heap。
x.push(1);
x.push(2);
所以當我們試著重新賦值[]
時就會報錯啦~
const x = [];
x = [];
因為x = []
對於記憶體來說是其實會讓callstack再新增一個記憶位置,並將x指向它,因此就會報錯
從上面的示範,應該就能簡單說明,為何同樣以const
宣告,基本型別與複合型別卻有不同的結果吧~
我:但這樣還是沒有解釋到為何宣告能預防全域污染這件事啊...
方函式:別急,至少現在你能理解工具人與姐妹之間的差異是:~~
-- to be continued --
那今天就到這邊摟!
每天的休息,是為了後面的追求,明天見。