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命令聲明的常量也是不提升,同樣存在暫時性死區,只能在聲明的位置後面使用。