ECMAScript 2015(简称 ES2015)这个词,也是经常可以看到的。它与 ES6 的区别是:ES6 的第一个版本,就这样在 2015 年 6 月发布了,正式名称就是《ECMAScript 2015 标准》(简称 ES2015)。2016 年 6 月,小幅修订的《ECMAScript 2016 标准》(简称 ES2016)如期发布,这个版本可以看作是 ES6.1 版,因为两者的差异非常小(只新增了数组实例的includes方法和指数运算符),基本上是同一个标准。根据计划,2017 年 6 月发布 ES2017 标准。
因此,ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年发布的正式版本的语言标准。
1.let和const命令
- 它们都是块级作用域:
ES5 只有全局作用域和函数作用域,没有块级作用域:内层变量可能会覆盖外层变量;内层变量可能会覆盖外层变量等等。
(1)let :声明变量
- 类似于var,但是所声明的变量,只在let命令当前执行的代码块中有效。
{
var a=10;//全局变量
let b=20;//在当前作用域内有效
}
console.log(a);//10
console.log(b);//b is not defined
//适合for循环
//es5 一般情况和闭包
for(var i=0;i<10;i++){
setTimeout(function () {
console.log(i);//输出一直是10 替代 自加
},1);
}
//闭包
for(var i=0;i<10;i++){
(function(a){
setTimeout(function () {
console.log(a);//输出0-10
},0);
})(i);
}
//es6
//当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量
//函数内部的变量i和外部的变量i是分离的。
//可以代替以前的自执行函数
//for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
for(let i=0;i<10;i++){
setTimeout(function () {
console.log(i);//输出0-10 对应i
},1);
}
- 不存在变量提升
// var
console.log(f); //undefined
var f=0;
// let
console.log(fff);//can't access lexical declaration `fff' before initialization
let fff=5;
- 暂时性死区(temporal dead zone,简称 TDZ)。
// 只要这个块区域有let 就忽略var
var f=0;
if(true){
console.log(f);
// Cannot access 'f' before initialization 初始化前无法访问“ f”
let f;
}
- 不允许重复声明
{
function func() {
let a = 10;
var a = 1;
}
function func() {
let a = 10;
let a = 1;
}
}
//Identifier 'a' has already been declared
(2)const
- 声明一个只读的常量时,一旦声明,常量的值不能改变。
const c=30;//常量 可查看不可修改 在当前作用域内有效
console.log(c);//30
c=10;//Assignment to constant variable.at...
- 声明的变量不得改变值,所以声明时需要同时初始化。
const c;
//Missing initializer in const declaration
//const声明中缺少初始化程序
- const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。