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?...