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並無法控制

 

Tags: