var、let、const
var、let、const之間的區別和使用
1、var聲明變量可以重複聲明,而let不可以重複聲明
let a = 1; let a = 2; var b = 3; var b = 4; a // Identifier 'a' has already been declared b // 4
2、var是不受限於塊級的,而let是受限於塊級
{ let a = 11 var b = 12 } console.log(b) //12 console.log(a) //a is not defined
3、let 不存在變量提升,var 會變量提升:
console.log(a); //ReferenceError: a is not defined let a = "apple"; console.log(b); //undefined var b = "banana";
4、const聲明之後必須賦值,否則會報錯
const PI = "3.1415926"; PI // 3.1415926 const MY_AGE; // SyntaxError: Missing initializer in const declaration
6、const定義不可變的量,改變了就會報錯
const aa = 223 aa = 456 //Assignment to constant variable. console.log(aa)
7、一旦函數裏面使用了const和let,全局變量在裏面就無法使用
var PI = "a"; if(true){ console.log(PI); // ReferenceError: PI is not defined,就算在外面的是let,都報錯 const PI = "3.1415926"; }
注意:
const 如何做到變量在聲明初始化之後不允許改變的?其實 const 其實保證的不是變量的值不變,而是保證變量指向的內存地址所保存的數據不允許改動。此時,你可能已經想到,簡單類型和複合類型保存值的方式是不同的。是的,對於簡單類型(數值 number、字符串 string 、布爾值 boolean),值就保存在變量指向的那個內存地址,因此 const 聲明的簡單類型變量等同於常量。而複雜類型(對象 object,數組 array,函數 function),變量指向的內存地址其實是保存了一個指向實際數據的指針,所以 const 只能保證指針是固定的,至於指針指向的數據結構變不變就無法控制了,所以使用 const 聲明複雜類型對象時要慎重。
const aa = { a:456, b:789, c:123 } aa.c = 4562456 aa.k =1234789 console.log(aa.k) //1234789 //const只是保存了一個指向實際數據的指針,對於複雜對象類型(對象 object,數組 array,函數 function)數據結構變不變,const並無法控制