天天看點

ES6 中 var,const,let差別

Let

ES6 新增了 let 指令,用于聲明變量。其用法類似于 var ,但是所聲明的變量隻在 let指令所在的代碼塊内有效。

  • for 循環還有一個特别之處,就是設定循環變量的那部分是一個父作用域,而循環體内部是一個單獨的子作用域。
for (let i = O; i < 3; i++) {
	let i=’ abc ’;
	console .log(i);
}

           
abc 
abc
abc
           

正确運作以上代碼将輸出 3 次 abc 。這表明函數内部的變量 i 與循環變量土不在同一個作用域,而是有各自單獨的作用域。

  • 不存在變量提升

    var 指令會發生“變量提升”現象, 即變量可以在聲明之前使用,值為 undefined。這種現象多少是有些奇怪的,按照一般的邏輯,變量應該在聲明語句之後才可以使用。

    為了糾正這種現象, let 指令改變了文法行為,它所聲明的變量一定要在聲明後使用,否則便會報錯 。

    var 的情況

console .log (foo ); 
var foo = 2 ;
           

let 的情況

console .log (foo ); 
let foo = 2 ;
           

在以上代碼中,變量 foo 用 var 指令聲明會發生變量提升,即腳本開始運作時,變量 foo便己經存在,但是沒有值,是以會輸出 undefined。變量 bar 用 let 指令聲明則不會發生變量提升。這表示在聲 明它之前,變量 bar 是不存在的,這時如果用到它,就會抛出一個錯誤 ReferenceError。

  • 暫時性死區

    暫時性死區的本質就是,隻要進入目前作用域,所要使用的變量就己經存在,但是不可擷取,隻有等到聲明變量的那一行代碼出現 , 才可以擷取和使用該變量。

  • 不允許重複聲明

    let 不允許在相同作用域内重複聲明同 一個變量。

Const

const 聲明一個隻讀的常量。 一旦聲明,常量的值就不能改變 。

const 實際上保證的并不是變量的值不得改動,而是變量指向的那個記憶體位址不得改動。

對于簡單類型的資料(數值、字元串、布爾值〉而言,值就儲存在變量指向的記憶體位址中,是以等同于常量。但對于複合類型的資料(主要是對象和數組)而言,變量指向的記憶體位址儲存的隻是一個指針, const 隻能保證這個指針是固定的,至于它指向的資料結構是不是可變的,

這完全不能控制 。 是以,将一個對象聲明為常量時必須非常小心。

繼續閱讀