在JavaScript中,我們會使用3種關鍵字來宣告變數:var、let、const,它們的使用情境與產生的運算結果有所不同,以下就來一一介紹。
宣告時必須同時設定其值,一旦給值之後,就不能再更改其值。
const x;
宣告未給值:
宣告後,改變值:
當我們希望特定變數經設定後,不允許在執行過程中改變,就必須用const。
使用const建立物件
建立物件後,無法再指派新物件給它。
雖然一樣是空物件,但實際上,是指向不同記憶體位置的物件。
const person = {};
person = {};
但可以修改物件內容:
person.name = 'Mary';
console.log(person.name); //Mary
陣列也是同樣的情況:
const ary = [];
ary = [];
ary.push('Mary');
console.log(ary[0]); //Mary
為什麼物件跟陣列可以修改其內容,而基本型別卻不行呢?
因為物件跟陣列是屬於參考型別,在JavaScript中參考型別是可變的,而且物件跟陣列變數的內容並不是真正的值,而是一個記憶體位址,指向實際的值,所以如果重新指向其他物件,等同於修改變數的值,const是不允許的。
只要記住,const變數只能在宣告時一併給值,之後就不能再改變它了。
相信各位看到var是再熟悉不過了,JavaScript是弱型別的程式語言,在ES6之前,變數宣告只需用var就一切搞定,這樣的語言特性,讓很多初學者產生誤解,以為JavaScript是很簡單又容易上手的語言。
是的,這話沒有說錯,但如果繼續深入研究,我想很多人要對以上那句話打問號了,尤其是後端程式語言開發者。
var name = 'Mary';
function sayHello() {
var greeting = 'Hello!';
for (var i = 0; i < 3; i++) {
var msg = `${greeting} ${name}`;
console.log(`msg:${msg}`); //msg:Hello! Mary
console.log(`i:${i}`); //i:0 i:1 i:2
}
console.log(`msg:${msg}`); //msg:Hello! Mary
console.log(`i:${i}`); //i:3
}
sayHello();
上面的範例在for迴圈中,可以正常存取msg與i變數,這個很正常。
但在for迴圈的區塊外,依然可以正常存取msg與i變數,這對於後端程式語言開發者來說的確是很奇怪。
這是因為var關鍵字,是以函式區塊為範圍,所以整個sayHello( )都可以存取for迴圈內的變數,一旦出了sayHello( )就無法存取函式內的變數了。
在函式外執行:
console.log(`msg:${msg}`);
console.log(`i:${i}`);'
會發生錯誤:
所以上面的例子我們擁有3個作用域環境:
因為var關鍵字會帶來一些問題,所以在ES6提供了const與let的宣告關鍵字。
let name = 'Mary';
function sayHello() {
let greeting = 'Hello!';
for (let i = 0; i < 3; i++) {
let msg = `${greeting} ${name}`;
console.log(`msg:${msg}`); //msg:Hello! Mary
console.log(`i:${i}`); //i:0 i:1 i:2
}
console.log(`msg:${msg}`); //Uncaught ReferenceError: msg is not defined
console.log(`i:${i}`); //Uncaught ReferenceError: i is not defined
}
sayHello();
如果將var換成let的話,會發現變數msg、i只能在for迴圈內部存取了。
所以之後盡可能的話,就使用let來取代var吧。
參考來源:
忍者:JavaScript開發技巧探秘