let命令
1、let用法類似var,用於聲明變量。但是所聲明的變量只在let命令所在的代碼塊內有效。
2、不存在變量提升,所以變量一定要在聲明后使用,否則報錯。
3、暫時性死區。只要塊級作用域內存在let命令,它所聲明的變量就“綁定”在這個區域,不再受外部的影響。比如 :
var a = 1;
if(true){
a = 2; //報錯
let a;
}
上面的代碼中存在全局變量a,但是塊級作用域中let又聲明了一個局部變量a,導致后者綁定這個塊級作用域,所以在let聲明變量前,對a賦值會報錯。
4、不允許重復聲明。let不允許在相同的作用域內聲明同一變量。
function( ){
let a = 1;
var a =2;
} //報錯
const命令
1、const用來聲明常量。一旦聲明其值不能改變。這就意味着const一旦聲明常量,就必須初始化,不能留到以后賦值。
2、與let命令相同,只在聲明所在的塊級作用域內有效。
3、const命令聲明的變量也不提升,同樣存在暫時性死區,只能在聲明后使用。同樣不可重復聲明變量。
4、對於復合類型的變量,變量名不指向數據,而是指向數據所在的地址。const命令只是指向的地址不變,並不保證改地址的數據不變,所以將一個地址聲明為變量需要非常小心。
const foo = {};
foo.prop = 123;
foo= { }; // 報錯
上面的代碼,常量foo存儲的是一個地址,指向一個對象。不可變的只是這個地址,即不能把foo指向另一個地址,但對象本身是可變的,所以依然可以為其添加屬性。如果想使對象不可變,可以將對象凍結,使用object.freeze方法。
5、跨模塊常量的寫法。
//constants.js模塊
export const A = 1;
export const B = 2;
export const C = 3;
//text1.js模塊
import * as constants from './constants';
console.log(constants.A ); // 1
console.log(constants.B ); // 2
//text2.js模塊
import {A, B} from './constants';
console.log(constants.A ); // 1
console.log(constants.B ); // 2
ES5只有兩種聲明變量的方式:var命令和function命令。ES6為其添加了let命令和const命令。后面還會提到另外兩種聲明方法:import命令和class命令。所以ES6一共有六種聲明變量的方法。
