es6新增命令let,用於聲明變數,他與var的不同主要有三點: let有塊級作用域: es5 for(var i=0;i<5;i++){ }; console.log(i) //5 for(var i=0;i<5;i++){ }; console.log(i) //5 es6 for(let i= ...
es6新增命令let,用於聲明變數,他與var的不同主要有三點:
- let有塊級作用域
- let沒有變數提升
- 同級作用域內,let不可以重覆定義
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,所以報錯。
let沒有變數提升:
es5
console.log(i);//undefined var i = 123; |
es6
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; |