1. 程式人生 > >js中const,var,let區別

js中const,var,let區別

let的含義及let與var的區別:

let 宣告的變數只在它所在的程式碼塊有效;

如下:

for (let i = 0; i < 10; i++) {
  console.log(i);//0,1,2,3,4,5,6,7,8,9
}
console.log('aaa');
console.log(i); // i is not defined

上面程式碼中,計數器i只在for迴圈體內有效,在迴圈體外引用就會報錯。如下var程式碼:

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function() {
    console.log(i);
  }
}
a[6](); // 10

變數i是var宣告的,在全域性範圍內都有效,所以每一次迴圈,新的i值都會覆蓋舊值,導致最後輸出的是最後一輪i的值。 
但是如果使用let,宣告的變數僅在塊級作用域內有效,最後輸出的是6. 如下:

var b = [];
for (let j = 0; j < 10; j++) {
  b[j] = function() {
    console.log(j);
  }
}
b[6](); // 6

不存在變數提升

let 不像var 那樣會發生 ‘變數提升’ 現象,因此,變數需要先宣告然後再使用,否則報錯;

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

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

暫時性死區

快級作用域記憶體在let命令,它所宣告的變數就繫結在這個區域,不再受外部影響;如下程式碼:

var tmp = 123;
if (true) {
  tmp = 'abc';
  let tmp;
  console.log(tmp); // tmp is not defined
}

上面程式碼定於全域性變數tmp,但是在快級作用域內let又聲明瞭一個區域性變數tmp,導致綁定了這個快級作用域;因此打印出tmp會報錯。

不允許重複宣告

let 不允許在相同作用域內,重複宣告同一個變數。如下程式碼排錯

function a() {
  let a = 10;
  var a = 1;
  console.log(a);
}
a();
function a() {
  let a1 = 10;
  let a1 = 1;
  console.log(a1);
}
a();

也不能在函式內部重新宣告引數。

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

ES6的塊級作用域

function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  console.log(n); // 5
} 
f1()

上面的程式碼有2個程式碼塊,都聲明瞭變數n,執行後輸出5,說明了外層程式碼塊不受內層程式碼塊的影響,如果使用了變數var,那麼輸出的就是10;

const命令

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

如下程式碼:

const a = 1; 
a = 2; 
console.log(a);  //報錯

也就是說 const 一旦聲明瞭變數,就必須初始化,不能留到以後賦值。如果使用const宣告一個變數,但是不賦值,也會報錯;如下程式碼:

const aa;  // 報錯
  • const的作用域與let命令相同;只在宣告所在的塊級作用域內有效。
if (true) {
 const aa = 1;
} 
console.log(aa);  // 報錯

不可重複宣告 (和let一樣)

var message = "Hello!";
let age = 25;
// 以下兩行都會報錯
const message = "Goodbye!";
const age = 30;

但是對於複合型別的變數,比如陣列,儲存的是一個地址,不可改變的是這個地址,即不能把一個地址指向另一個地址,但是物件本身是可變的,比如可以給它新增新的屬性;如下程式碼:

const a33 = [];
a33.push('Hello'); // 可執行
a33.length = 0;    // 可執行
a33 = ['55']  // 報錯