1.var命令
- var聲明的變量,在全局范圍內(nèi)都有效,可以修改;
var a = 1;
function change(){
a = 4;
console.log(a);//可以輸出a=4
}
change();
- 聲明時,不初始化會輸出undefined,不會報錯。
var a; //不會報錯
console.log(a); //undefined
- 存在變量提升
console.log(foo); // 輸出undefined var foo = 2;
2.let命令
-
let的用法類似于var,但是所聲明的變量,只在let命令所在的代碼塊內(nèi)有效;
for (let i = 0; i < 10; i++) {} console.log(i); //ReferenceError: i is not defined 使用let命令聲明變量之前,該變量都是不可用的(不存在變量提升);
console.log(bar); // 報錯ReferenceError
let bar = 2;
- let不允許在相同作用域內(nèi),重復(fù)聲明同一個變量。
// 報錯
function () {
let a = 10;
var a = 1;
}
// 報錯
function () {
let a = 10;
let a = 1;
}
3.const命令
- const聲明一個只讀的常量。一旦聲明,常量的值就不能改變。
const PI = 3.1415;
PI // 3.1415
PI = 3; // TypeError: Assignment to constant variable
- const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以后賦值。
const foo; // SyntaxError: Missing initializer in const declaration
- const的作用域與let命令相同:只在聲明所在的塊級作用域內(nèi)有效。
if (true) {
const MAX = 5;
}
MAX // Uncaught ReferenceError: MAX is not defined
- const命令聲明的常量,與let一樣也不提升,只能在聲明的位置后面使用。
if (true) {
console.log(MAX); // ReferenceError
const MAX = 5;
}
上面代碼在常量MAX聲明之前就調(diào)用,結(jié)果報錯。
- const聲明的常量,也與let一樣不可重復(fù)聲明。
var message = "Hello!";
let age = 25;
// 以下兩行都會報錯
const message = "Goodbye!";
const age = 30;
- 對于復(fù)合類型的變量,變量名不指向數(shù)據(jù),而是指向數(shù)據(jù)所在的地址。const命令只是保證變量名指向的地址不變,并不保證該地址的數(shù)據(jù)不變。
const foo = {};
foo.prop = 123;
foo.prop
// 123
foo = {}; // TypeError: "foo" is read-only
上面代碼中,常量foo儲存的是一個地址,這個地址指向一個對象。不可變的只是這個地址,即不能把foo指向另一個地址,但對象本身是可變的,所以依然可以為其添加新屬性。
分別在什么情況下使用?:
es6里面不建議使用var了,因為var定義的變量沒有塊級作用域,還會出現(xiàn)變量提升的情況,這樣經(jīng)常會導(dǎo)致你意想不到的錯誤;而let就不會這樣,const是定義那些不可以被重新賦值的變量,let是定義普通的變量。
如有錯誤,請指正!