一、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一共有六种声明变量的方法。