var const和let的區別

2021-09-28 18:15:29 字數 2712 閱讀 1612

var和let/const區別:

1、塊級作用域。

2、不存在變數提公升。

3、暫時性死區。

4、不可重複宣告。

5、let、const宣告的全域性變數不會掛載頂層物件下面。

const命令需要注意兩個注意點:

1、const宣告之後必須馬上賦值,否則會報錯。

2、const簡單型別一旦宣告就不能再更改,複雜型別(陣列,物件等)指標指向的位址不能更改,內部資料可以更改。

塊級作用域:

es5只有全域性作用域和函式作用域,沒有塊級作用域。

這帶來很多不合理的場景:

1、內層變數可能覆蓋外層變數;

2、用來計數的迴圈變數洩露為全域性變數。

塊級作用域

1、作用域:

function f1() 

console.log(n); //5

}f1();

2、塊級作用域任意巢狀:

console.log(insane); //讀不到

}}}};

3、塊級作用域真正使**分割成塊了。

不存在變數提公升

變數提公升現象:在用一作用域下,變數可以在宣告之前使用,值為undefined。

es5時使用var宣告變數,經常會出現變數提公升的現象。

// var

console.log(foo); //undefined

var foo = 2;

// let

console.log(bar); //報錯referenceerror

let bar = 2;

暫時性死區

只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到宣告變數的哪一行**出現,才可以獲取和使用該變數。

暫時性死區和不能變數提公升的意義在於:為了減少執行時錯誤,防止變數宣告前就使用這個變數,從而導致意料之外的行為。

不能重複宣告變數

在測試時出現這種情況:var a = 『』;const a = 「」。這種情況是因為babel在轉換時,做了一些處理,在瀏覽器的控制台中測試,就成功報錯。

let、const不允許在相同作用域內,重複宣告同乙個變數。

let、const宣告的全域性變數不會掛在頂層物件下面

1、瀏覽器環境頂層物件是:window。

2、node環境頂層物件是:global。

3、var宣告的全域性變數會掛在頂層物件下面,而let、const不會。

// var

var foo = 2;

console.log(window.foo); //2

// let

let bar = 2;

console.log(window.bar); //undefined

const命令

一旦宣告,必須馬上賦值

let p; var p1; // 不報錯

const p3 = '馬上賦值'

const p3; // 報錯 沒有賦值

const一旦宣告值就不能改變

簡單型別:不能改動

const p = '不能改變';

p = '報錯'

複雜型別:變數指標不能變

考慮如下情況:

const p = ['不能改動']

const p2 = 

p[0] = '不報錯'

p2.name = '不報錯'

p = ['報錯']

p2 =

複雜型別(物件、陣列等):位址儲存的是乙個指標,const只能保證指標是固定的(總是指向同乙個位址),它內部的值是可以改變的(不要以為const就安全了!)

所以只要不重新賦值整個陣列/物件, 因為儲存的是乙個指標,所以對陣列使用的push、shift、splice等方法也是允許的,你就是把值乙個乙個全都刪光了都不會報錯。

複雜型別還有函式,正則等,這點也要注意一下。

總結:

再總結一下,看到這些名詞,腦子裡應該會有對應的理解,如果沒有的話,那可以再看看對應的內容。

var和let/const的區別:

1、塊級作用域

2、不存在變數提公升

3、暫時性死區

4、不可重複宣告

5、let、const宣告的全域性變數不會掛在頂層物件下面

const命令兩個注意點:

1、let可以先宣告稍後再賦值,而const在 宣告之後必須馬上賦值,否則會報錯

2、const 簡單型別一旦宣告就不能再更改,複雜型別(陣列、物件等)指標指向的位址不能更改,內部資料可以更改。

let、const使用場景:

1、let使用場景:變數,用以替代var。

2、const使用場景:常量、宣告匿名函式、箭頭函式的時候。

js中let和var const的區別

es6中增加了let關鍵字以定義塊級作用域的變數 1.var可以重複宣告,後面的會覆蓋前面的,let不允許重複宣告,會直接報錯 var a 10 var a 20 20 console.log a let b 10 let b 20 identifier b has already been dec...

es6中的let和var const的區別

通過var定義的變數,作用域是整個封閉函式,是全域的 通過let定義的變數,作用域是在塊級或是子塊中。console.log fun undefined var fun 2 console.log fun 2 var fun 45 不會報錯 let fun 46 會報錯 script 變數提公升現象...

let和 的區別

一 與 的比較vala string aa a是非空型別,下面的給a賦值為null將會編譯不通過 a null a.length 宣告是可空型別,可以賦值為null varb string?bb b null b是可空型別,直接訪問可空型別將編譯不通過,需要通過?或者 來訪問 b.length b?...