淺談JS中var,let和const的區別
區別1
let
和var
用來聲明變量,const
用來聲明常量。
變量就是賦值後可以改變它的值,常量就是賦值後就不能改變它的值。
當聲明為對象時,可以直接修改對象內的屬性值
const age = 26; age = 36; // TypeError: 給常量賦值 // const聲明的作用域也是塊 const name = 'Matt'; if (true) { const name = 'Nicholas'; } console.log(name); // Matt
區別2
const
不允許隻聲明不賦值,一旦聲明就必須賦值
const num; // 錯誤 const num = 1; //正確
區別3
var
是函數作用域,let
和const
是塊級作用域。
花括號{}
就是塊級作用域,函數作用域就是函數裡面的內容。
{ let num = 4; } console.log(num);// num is not defined { var num = 4; } console.log(num); // 4
區別4
var
有提升的功能,let
和const
沒有
// 片段A console.log(a); //undefined var a = 4; // 片段B console.log(b); //b is not defined let b = 4;
片段A
在代碼預編譯時,javaScript引擎會自動將所有代碼裡面的var
關鍵字聲明的語句都會提升到當前作用域的頂端,如下:
var a; console.log(a); //undefined a = 4;
區別5
在最外層的作用域,也就是全局作用域,用var
聲明的變量,會作為window
的一個屬性;而用let
和const
聲明的變量或常量,並不會作為window
的屬性
var a = 4; function foo(){ /* 這裡的this采用默認的規則,與window進行瞭綁定,所以實際上訪問的是window.a */ console.log(this.a);// 4 } foo()
let a = 4; function foo(){ /* 在這種情況下,this.a 訪問的是window.a,但是let定義的變量,並不會作為window的屬性,所以訪問不到 */ console.log(this.a);// undefined } foo()
區別6
let
,const
不允許同一個塊作用域中出現冗餘聲明(重復聲明),而var
可以
var name; var name; // 可以 let age; let age; // SyntaxError;標識符age已經聲明過瞭 const name = 'Matt'; const name = 'Nicholas'; // SyntaxError
區別7
變量滲透問題
// for循環中var定義的迭代變量會滲透到循環體外部 for (var i = 0; i < 5; ++i) { // 循環邏輯 } console.log(i); // 5
// 改成使用let之後,這個問題就消失瞭,因為迭代變量的作用域僅限於for循環塊內部 for (let i = 0; i < 5; ++i) { // 循環邏輯 } console.log(i); // ReferenceError: i沒有定義
到此這篇關於淺談JS中var,let和const的區別的文章就介紹到這瞭,更多相關JS var,let,const,內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- JavaScript三大變量聲明詳析
- ECMAScript中var let const常見問題及區別詳解
- 基於JavaScript ES新特性let與const關鍵字
- 簡單談談JavaScript變量提升
- javascript的var與let,const之間的區別詳解