es6新增的變量聲明方式let、const和之前的var都可以用來聲明變量厨钻。那么這三者的區(qū)別是什么呢扼雏?
let
- let的作用域是塊級作用域,es6之前的作用域只有全局作用域夯膀、函數(shù)作用域诗充,沒有塊級作用域
- let聲明的變量不會有聲明提升,所以在let 聲明的變量之前訪問改變量會造成報錯棍郎,也就是暫時性死區(qū)
console.log(b); //ReferenceError: b is not defined
let b = '1';
- 不能重復(fù)定義
let a = 1;
let a = 2;//Identifier 'a' has already been declared
- 存在暫時性死區(qū)
var a = 1;
if(1){
console.log(a);//報錯
let a = 2;
}
①在一個塊級作用域中其障,變量唯一存在,一旦在一個塊級作用域中用let聲明了一個變量涂佃,那么這個變量就屬于這個塊級作用域所有励翼,不受外部變量的影響
②無論在塊中的任何地方聲明變量,在塊中使用這個名字的變量都是這個變量辜荠,無論外部是否有其他同名變量汽抚。
③暫時性死區(qū)的本質(zhì)就是,只要進(jìn)入到當(dāng)前作用域伯病,那么在變量聲明之前造烁,該變量都是不可用的否过,只有聲明變量之后才能使用
④暫時性死區(qū)的意義:規(guī)范代碼,讓我們把聲明變量的工作放在作用域的前面惭蟋,這樣代碼一目了然
const
const用來聲明一個常量苗桂,且聲明的常量是不允許修改的,只讀屬性告组。所以在聲明的時候必須賦值煤伟,否則會報錯。
const和let一樣存在暫時性死區(qū)木缝,沒有變量提升便锨,也不允許重復(fù)聲明。
const定義之后再重復(fù)賦值也會報錯我碟。
const a = 1;
a = 2;//報錯
假如const定義的變量是一個對象放案,那么可以給這個對象的變量賦值、增加屬性矫俺、刪除屬性等操作都是可以的吱殉。
因?yàn)閏onst是限制了定義的變量不再重新分配地址,也就是地址不變厘托,但是指向的地址上存儲的內(nèi)容是可變的考婴。
const定義了一個無法重新分配內(nèi)存的變量。const僅僅阻止重新分配催烘,而不是不可變的。
這一點(diǎn)跟Obejct.freeze()有很大的區(qū)別缎罢。
Object.freeze(obj)返回一個不可變的對象伊群,這意味著不能刪除、修改策精、添加對象的屬性舰始。
但是Object.freeze很膚淺,假如參數(shù)對象的屬性也是對象咽袜,那么Object.freeze對這個對象的對象屬性就不起作用了丸卷,需要對obj進(jìn)行遞歸遍歷并用Object.freeze處理。
var
①var的作用域是函數(shù)作用域询刹,在函數(shù)內(nèi)利用var聲明一個變量谜嫉,則在函數(shù)內(nèi)這個變量有效。
②變量聲明提升
function(){
console.log(a);//undefined
var a = 1;
console.log(a);//1
}
console.log(a);//報錯