es6新增命令let,用於聲明變量,他與var的不一樣主要有三點:es6
let有塊級做用域:數組
es5數據結構
for(var i=0;i<5;i++){
};
console.log(i) //5
|
for(let i=0;i<5;i++){
};
console.log(i) //報錯
|
第一個for循環變量i的做用域爲window,因此會輸出5,第二個for循環,變量i的做用域爲for循環內部,外部訪問不到i,因此報錯。es5
let沒有變量提高:spa
es5指針
console.log(i);//undefined
var i = 123;
|
es6code
console.log(i);//報錯
let i = 123;
|
因爲let定義的變量沒有變量提高,因此提早調用會報錯。對象
同級做用域內,let不能夠重複定義:內存
es5
var i = 1;
var i = 2;
|
es6
let i = 1;
let i = 2;//報錯
|
再試一下非同級做用域let是否能夠重複定義
function fn1(){
let i = 1;
console.log(i); //1
function fn2(){
let i = 2;
console.log(i); //2
}
fn2();
}
fn1();
|
在非同級做用域下let是能夠重複定義的,並且父子做用域互不干涉。
ps:阮老師博客裏的」暫時性死區」是啥,沒看明白
es新增const命令,用於定義常量。
引用阮一峯博客的一句話:
const實際上保證的,並非變量的值不得改動,而是變量指向的那個內存地址不得改動。對於簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,所以等同於常量。但對於複合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指針,const只能保證這個指針是固定的,至於它指向的數據結構是否是可變的,就徹底不能控制了。所以,將一個對象聲明爲常量必須很是當心。
舉個例子:
const a = 123;
a =
345;//報錯
|
const arr = [1,2,3];
arr[
0] = 9;
|
const o = {a:1,b:2};
o.a =
9;
|