什麼是let ES6新增加let命令,用於宣告變數。用法和var十分相識,不過let宣告的變數只在命令所在程式碼塊內有效果。很多人可能和我一樣使用了let不過並沒有完全瞭解他,我們可以看一段程式碼
{
let a1=4;
var a2=5;
}
console.log(a1);//ReferenceError: a in not defind
console.log(a2);//5
複製程式碼
let不存在變數提升 如果你留意過,你一定會發現var存在“變數提升”的現象(變數在宣告之前使用,值為undefined)。按照我們的正常思維宣告只有這個變數才能使用,所以let就糾正了這個現象。我們來看一段程式碼
console.log(v);//undefined
var v=4;
複製程式碼
console.log(l);//ReferenceError: l in not defind
let l=5;
複製程式碼
可以發現let宣告的變數並沒有提升,我們在宣告之前輸錯他報了ReferenceError錯誤。
let不允許重複宣告 let不允許在一個塊級作用域內重複宣告同一個變數。如果再次宣告就會報錯。
if(true){
let test=1;
var test=2;//報錯
}
if(true){
let test=1;
let test=2;//報錯
}
if(true){
let test=1;
if(true){
let test=2;//不報錯
}
}
複製程式碼
我們發現同一個塊級作用域中重複宣告就會報錯,但是如果我們在內部巢狀的塊級作用域中再次宣告卻又是可以的。
let暫時性死區 let宣告的變數只繫結在當前這個塊級作用域內,不受外部的影響,那麼如果塊級作用域外宣告瞭變數而在作用域內我們用let再次宣告這個變數會出現什麼情況呢。
var test="es6";
if(!false){
test="es5";//ReferenceError: test is not defined
let test;
}
複製程式碼
我們在用var宣告瞭全域性變數test,但是我們在塊級作用域內用let又宣告瞭一個區域性變數test,這樣後者就繫結了這個塊級作用域,所以我們對test賦值會出現報錯。 ES6明確規定,在塊級中存在let和const命令,則這個塊級對這些命令宣告的變數從一開始就形成了封閉作用域。在宣告之前呼叫他們就會報錯。
const命令 const宣告的變數是一個只讀變數,一旦宣告,常量的值就不能改變了。所以const宣告的變數必須在一開始就初始化不然就會報錯,我們來看一段程式碼
const c=1;
c=2//TypeError: Assignment to constant variable.
複製程式碼
const c;//SyntaxError: Missing initializer in const declaration
複製程式碼
const和let一樣只在宣告所在塊級作用域有效,變數不會提升,同樣存在暫時性死區,只能在宣告之後使用,不可以重複宣告。
const的本質 const宣告的變數並不是值不得改動,而是變數指向的那個記憶體地址不得改動,對於基本型別的資料,值就儲存在變數指向的記憶體地址中,因此他等同於常量。不過如果是複合型別資料(物件、陣列),變數指向的記憶體地址儲存的只是一個指標,const只能儲存指標固定,不過指標指向的資料結構是不是改變的,是不能控制的,我們看一段程式碼。
const obj={a:2};
obj.a=1;//我們可以修改他的屬性
obj.b=1;//我們可以新增他的屬性
obj={a:1}//不過我們不能修改這個指標 (報錯)TypeError: Assignment to constant variable.
複製程式碼
總結 let和const作為ES6新增加的指令雖然功能和var很相識,不過和var存在很多不同。