1、ECMAScript 和 JavaScript 的關系
ECMAScript 和 JavaScript 的關系是,前者是后者的規格,后者是前者的一種實現(另外的 ECMAScript 方言還有 Jscript 和 ActionScript)。
2、let命令
ES6中新增了let命令,用來聲明變量。它的用法類似于var,但是所聲明的變量,只在let命令所在的代碼塊內有效。
vara=[];for(vari=0;i<10;i++){a[i]=function(){console.log(i);};}a[6]();// 10
變量i是var命令聲明的,在全局范圍內都有效,所以全局只有一個變量i。每一次循環,變量i的值都會發生改變,而循環內被賦給數組a的函數內部的console.log(i),里面的i指向的就是全局的i。也就是說,所有數組a的成員里面的i,指向的都是同一個i,導致運行時輸出的是最后一輪的i的值,也就是10
vara=[];for(leti=0;i<10;i++){a[i]=function(){console.log(i);};}a[6]();// 6
變量i是let聲明的,當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以最后輸出的是6。因為 JavaScript 引擎內部會記住上一輪循環的值,初始化本輪的變量i時,就在上一輪循環的基礎上進行計算。
另外,for循環還有一個特別之處,就是設置循環變量的那部分是一個父作用域,而循環體內部是一個單獨的子作用域。
因為 JavaScript 引擎內部會記住上一輪循環的值,初始化本輪的變量i時,就在上一輪循環的基礎上進行計算。
不存在變量提升
var命令會發生”變量提升“現象,即變量可以在聲明之前使用,值為undefined。這種現象多多少少是有些奇怪的,按照一般的邏輯,變量應該在聲明語句之后才可以使用。
為了糾正這種現象,let命令改變了語法行為,它所聲明的變量一定要在聲明后使用,否則報錯。
不允許重復聲明
let不允許在相同作用域內,重復聲明同一個變量。
const 命令
基本用法
const聲明一個只讀的常量。一旦聲明,常量的值就不能改變。
const的作用域與let命令相同:只在聲明所在的塊級作用域內有效
const實際上保證的,并不是變量的值不得改動,而是變量指向的那個內存地址不得改動。對于簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,因此等同于常量。但對于復合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指針,const只能保證這個指針是固定的,至于它指向的數據結構是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。
ES6 聲明變量的六種方法
ES5 只有兩種聲明變量的方法:var命令和function命令。ES6除了添加let和const命令,另外兩種聲明變量的方法:import命令和class命令。所以,ES6 一共有6種聲明變量的方法。