一、let用法相似var,用於聲明變量。可是所聲明的變量只在let命令所在的代碼塊內有效。spa
二、不存在變量提高,因此變量必定要在聲明後使用,不然報錯。對象
三、暫時性死區。只要塊級做用域內存在let命令,它所聲明的變量就「綁定」在這個區域,再也不受外部的影響。好比 :內存
var a = 1;作用域
if(true){io
a = 2; //報錯console
let a;function
}class
上面的代碼中存在全局變量a,可是塊級做用域中let又聲明瞭一個局部變量a,致使後者綁定這個塊級做用域,因此在let聲明變量前,對a賦值會報錯。import
四、不容許重複聲明。let不容許在相同的做用域內聲明同一變量。變量
function( ){
let a = 1;
var a =2;
} //報錯
一、const用來聲明常量。一旦聲明其值不能改變。這就意味着const一旦聲明常量,就必須初始化,不能留到之後賦值。
二、與let命令相同,只在聲明所在的塊級做用域內有效。
三、const命令聲明的變量也不提高,一樣存在暫時性死區,只能在聲明後使用。一樣不可重複聲明變量。
四、對於複合類型的變量,變量名不指向數據,而是指向數據所在的地址。const命令只是指向的地址不變,並不保證改地址的數據不變,因此將一個地址聲明爲變量須要很是當心。
const foo = {};
foo.prop = 123;
foo= { }; // 報錯
上面的代碼,常量foo存儲的是一個地址,指向一個對象。不可變的只是這個地址,即不能把foo指向另外一個地址,但對象自己是可變的,因此依然能夠爲其添加屬性。若是想使對象不可變,能夠將對象凍結,使用object.freeze方法。
五、跨模塊常量的寫法。
//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一共有六種聲明變量的方法。