# const 和 let
不要用 var,而是用 const 和 let,分別表示常量和變數,不同于 var 的函式作用域,const 和 let 都是塊級作用域,
1 const NUM = 1000; 2 3 let count = 0; 4 count = count + 1;
1.count
在我們使用const宣告常量時,總認為值一旦宣告就不可改變,其實是有誤解的;
const實際上保證的,并不是變數的值不得改動,而是變數指向的那個記憶體地址不得改動,對于簡單型別的資料(數值、字串、布林值),值就保存在變數指向的那個記憶體地址,因此等同于常量,
但對于復合型別的資料(主要是物件和陣列),變數指向的記憶體地址,保存的只是一個指標,const只能保證這個指標是固定的,至于它指向的資料結構是不是可變的,就完全不能控制了,因此,將一個物件宣告為常量必須非常小心,
// 宣告四個產量,分別賦予不同的型別 const NUM = 1000; const NAME = '博客園'; const TIME = { year: 2021, month: 4, day: 19 } const ARR = [5, 8] //改變常量 NUM = 1006; //不可執行 錯誤提示:Uncaught TypeError: Assignment to constant variable NAME = '博客'; //不可執行 錯誤提示:Uncaught TypeError: Assignment to constant variable TIME = { year: 2022, month: 4, day: 19 } // 不可執行, 將 TIME 指向另一個物件,就會報錯 TIME.year = 2022 // 為 TIME添加一個屬性,可以成功 ARR = ['name'] // 不可執行, 將 ARR 指向另一個陣列,就會報錯 ARR.push(85) // 可執行
上面代碼中,常量TIME,這個地址指向一個物件,不可變的只是這個地址,即不能把TIME指向另一個地址,但物件本身是可變的,所以依然可以為其添加新屬性,
如果真的想將物件凍結,應該使用Object.freeze方法,
1 const foo = Object.freeze({}); 2 3 // 常規模式時,下面一行不起作用; 4 // 嚴格模式時,該行會報錯 5 foo.prop = 123;
上面代碼中,常量foo指向一個凍結的物件,所以添加新屬性不起作用,嚴格模式時還會報錯,
除了將物件本身凍結,物件的屬性也應該凍結,下面是一個將物件徹底凍結的函式,
1 var constantize = (obj) => { 2 Object.freeze(obj); 3 Object.keys(obj).forEach( (key, i) => { 4 if ( typeof obj[key] === 'object' ) { 5 constantize( obj[key] ); 6 } 7 }); 8 };
2.let
1.let 宣告不會在全域宣告時(在最頂部的范圍)創建window 物件的屬性,
2.let 宣告的變數只在其宣告的塊或子塊中可用,這一點,與var相似,二者之間最主要的區別在于var宣告的變數的作用域是整個封閉函式,
1 { 2 let name = '小王'; 3 console.log(name );//小王 4 console.log(Window.name);//underfined 5 var age=18; 6 } 7 8 console.log(age);//18 9 console.log(name);//報錯
3.在同一個函式或塊作用域中重復宣告同一個變數會引起SyntaxError,
if(true){ let name= '小王'; let name= '小飛'; } // Uncaught SyntaxError: Identifier 'name' has already been declared
4.switch 陳述句中只有一個塊,你可能因此而遇到錯誤,
1 switch(1) { 2 case 1: 3 let name; 4 break; 5 case 2: 6 let name; 7 break; 8 } 9 // Uncaught SyntaxError: Identifier 'name' has already been declared 10 //解決方法--一個嵌套在 case 子句中的塊會創建一個新的塊作用域的詞法環境,就不會產生上訴重復宣告的錯誤, 11 switch(1) { 12 case 1:{ 13 let name; 14 break; 15 } 16 case 2:{ 17 let name; 18 break; 19 } 20 }
5.var 與 let合并的宣告方式會報SyntaxError錯誤, 因為var會將變數提升至塊的頂部, 這會導致隱式地重復宣告變數.
1 2 var name ='小王'; 3 let name = '小飛'; 4 //Uncaught SyntaxError: Identifier 'name' has already been declared 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/277994.html
標籤:JavaScript
下一篇:重學前端 大廠前端工程實戰演練
