我們都知道在最新的 ES6 中,新添加了兩個用於變量聲明的關鍵字 let 和 const,那么這兩個和我們以前經常使用的 var 有什么區別呢?今天我們就來看一下吧。
變量聲明和初始化
在比較它們的區別之前,我們先來看一下變量聲明和初始化。變量聲明:
var str
變量聲明會引入了一個新的標識符 declaration,在 JavaScript 中,新創建的變量的默認值都是 undefined。我們再來看一下變量賦值:
var str
console.log(str) // undefined
str='hello'
str 變量被我們賦予了一個值。
作用域
JavaScript 的世界共有兩種作用域:全局作用域和方法作用域。使用 var 聲明的變量的作用域是方法作用域,如下 date 變量在方法外面不可訪問的:
function getDate(){
var date = new Date() 在getDate方法外不可訪問
return date;
}
看起來蠻正常的。var 變量關鍵字的真正問題在於其在方法內部的定義變量開始的任何地方都可以訪問到這個變量。
如下所示,i、discountedPrice、finalPrice 這三個變量是定義在一個 for 循環體中的 (即位於塊作用域中),按照正常思維來講,在循環結束后,這三個變量是不可訪問的,
但是現在在這個整個大的方法中,依然是可以訪問的:
var 和 let 對比
var 和 let 第一點不同就是 let 是塊作用域,即其在整個大括號 {} 之內可見。如果使用 let 來重寫上面的 for 循環的話,會報錯:
let 和 var 的第二點不同是,在變量聲明之前就訪問變量的話,會直接提示 ReferenceError,而不像 var 那樣使用默認值 undefined:
let 和 const 對比
const 和 let 的作用域是一致的,不同的是 const 變量一旦被賦值,就不能再改變了:
但是這並不意味着使用 const 聲明的變量本身不可變,只是說它不可被再次賦值了:
使用場景
我們已經講解了它們的主要不同,但是什么時候用 var、let 或 const 呢?我的建議是,大多數情況下都使用 const,除非你知道你的變量的值還會被改變,這樣的話,別人閱讀你的代碼不用老想着這個變量的值會不會有改變。如果這個變量的值的確需要改變,例如在 for 循環里面,那么就是用 let。這也同時意味着你以后就不要用 var 了。
關於 const 的使用,一些程序員還傾向於只用來聲明常量,其它情況下一律使用 let 關鍵字,我覺得這樣也是可行的。