是儲存資料用的容器。容器內可以放字串(String)、數值(Number)、布林值(Boolean)、陣列(Array)或是物件(Object)。
首先要為變數命名並宣告,這樣之後才能呼叫它。變數的命名最好是有意義、短、好發音、(以形容詞搭配的)名詞,而不是隨意取 aa
、 apple
、cat
這類讓人一頭霧水的無意義名稱。這坑開了,以後苦的是自己XD
Fig. x. 小駝峰,wiki,駝峰式大小寫 - 維基百科
Fig. x. 大駝峰,wiki,駝峰式大小寫 - 維基百科
駝峰式(Camel case)
大駝峰(upper camel case)/Pascal Case:每個單字的首字母都是大寫。
AnOtter
小駝峰(lower camel case):只有第一個單字的首字母是小寫,其他單字的首字母都是大寫
anOtter
Snake Case
_
連接an_Otter
Kebab Case
-
連接an-Otter
Screaming Case
AN_OTTER
例:借用 mdn 的例子並略做修改
var x = 1;
console.log("init",x, y); // "init" 1 undefined
if (x === 1) {
var x = 2;
var y = 3;
console.log("inside",x, y); // "inside" 2 3
}
console.log("outside",x, y); // "outside" 2 3
說明:
在 if 內的 var 影響到 if 外的 var,導致 console.log x 的結果永久性的變成 2。
原本外層沒有宣告 y,結果應該要是 not defined,但卻拿到 undefined。
原本好好的,結果宣告的值被汙染,整個亂套拉RR
於是 var 就慢慢的被新出的 let 淹沒惹。(但青菜蘿蔔各有所好就是了)
function fn1(){
console.log(a);
var a=1;
};
fn1(); // undefined
function fn2(){
var a;
console.log(a);
var a=1;
};
fn2(); // undefined
說明:
明明在 fn1 內的順序是先 console.log 再宣告 a,結果執行 fn1 卻出現 undefined?其實 fn1、fn2 兩個函式是一樣的,只是被 var 宣告的變數偷跑,把自己提升(Hoisting)到函式內的最前面了。
把 var 的範例拿來用,只是把 var 改成 let,再修改幾行
let x = 1;
console.log("init", x); // "init" 1
if (x === 1) {
let x = 2;
let y = 3;
console.log("inside", x, y); // "inside" 2 3
}
// let x = 3; // 重複宣告就壞給你看 O_<
x = 3; // 重新賦值
console.log("outside", x); // "outside" 3
逆侃侃,是不是舒服多了?各自作用域劃分的清清楚楚,不用擔心變數被亂改(汙染)了。
沿用剛剛的範例,小小修改
console.clear();
const x = 1;
console.log("init", x); // "init" 1
if (x === 1) {
const x = 2;
const y = 3;
console.log("inside", x, y); // "inside" 2 3
}
x = 3; // 到這邊就壞惹
console.log("outside", x); // 所以後面就死掉了
說明:
最外層的 x 跟 if 內的 x 是不同人(作用域各自獨立)。但要重新賦值就又壞惹。
由於程式的讀取是一行行、由上至下的,所以今天宣告的位置放錯了,讀取就會出問題,最後 code 就掛了。因為對瀏覽器來說,你要它找出變數 x,但以讀取的順序來說,這個變數根本(還)沒宣告、找不到,它不知道要怎麼辦 (只好噴錯)。
console.log("init", x); // Uncaught ReferenceError: Cannot access 'x' before initialization
const x = 1;
喔耶寫完開心!
參考資料