1. 程式人生 > >let const var 之間的區別

let const var 之間的區別

let const 均為ES6新增語法,首先看看它倆之間的異同點

一 . let與const相同點

1.宣告的變數只能在塊級作用域有效;

{
  let a = 10;
  var b = 1;
}

a // ReferenceError: a is not defined.
b // 1

2.不存在變數提升;

// var 的情況
console.log(foo); // 輸出undefined
var foo = 2;

// let 的情況
console.log(bar); // 報錯ReferenceError
let bar = 2;

3.相同塊作用域內不允許同一變數重複宣告;

// 報錯
function func() {
  let a = 10;
  var a = 1;
}

// 報錯
function func() {
  let a = 10;
  let a = 1;
}
function func(arg) {
  let arg; // 報錯
}

function func(arg) {
  {
    let arg; // 不報錯
  }
}

二 . let與const不同點

const宣告一個只讀的常量。一旦宣告,常量的值就不能改變。

const a = 3.1415
a // 3.1415
a = 3

如上程式碼執行時會直接報錯  Assignment to constant variable.

意思就是隻讀常量的值不可以改變

const b //錯誤寫法,必需給予初始化值
// const b = 0 //正確寫法

同時const宣告的變數必需給予初始化值,否則也會直接報錯 Missing initializer in const declaration

const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體地址不得改動。對於簡單型別的資料(數值、字串、布林值),值就儲存在變數指向的那個記憶體地址,因此等同於常量。但對於複合型別的資料(主要是物件和陣列),變數指向的記憶體地址,儲存的只是一個指標

const foo = {};

// 為 foo 新增一個屬性,可以成功
foo.prop = 123;
foo.prop // 123

// 將 foo 指向另一個物件,就會報錯
foo = {}; // TypeError: "foo" is read-only

綜上所述let與const的區別已經很明顯了,而let和const 與var 的區別正好就是let和const的相同點加上它們的不同點

var 不存在塊作用域;可以變數提升;允許重複宣告;