let
{
typeof a; 只要在let变量之前引用该变量的都会报错
let a = 10;该变量无法被外部引用
var b = 11;
console.log(`let值为${a}`)
}
console.log(`var b 值为 ${b}`)
console.log(`let a 值为 ${a}`) 此处会报错,a is not defind
let通常用作循环内:
for(let a = 0 ; a < 10 ; a++){
console.log(`a的值 为${a}`)
}
不存在变量提升
console.log(foo); undefind
var foo = 2;
console.log(foo) 2
console.log(lfoo); 报错,lfoo is not defind
let lfoo = 2;
console.log(lfoo) 2
暂时性死区
只要块级作用域内存在let命令,他所声明的变量就'绑定'这个区域,不受外部影响
var tmp = 123;
if(true){
tmp = 'abc';
let tmp;
};
上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。const
声明一个只读的常量,一旦被声明,常量的值就不能被改变
const pi = 3.1415926;
console.log(pi);
pi = 3;此处会报错
const cfoo;
上面代码表示,对于const来说,只声明不赋值,就会报错。const的作用域与let命令相同:只在声明所在的块级作用域内有效。本质
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
因此,将一个对象声明为常量必须非常小心。
const ca = [];
ca.push("hello"); 正常
ca.length = 0; 正常
a = ['delumo'] 报错
上面代码中,常量a是一个数组,这个数组本身是可写的,但是如果将另一个数组赋值给a,就会报错
顺带提一句,目前来说,chrome和firefox不用编译即可运行const和let
该文章转载自: http://es6.ruanyifeng.com/#docs/destructuring