一、var
在ES5中,頂層對象的屬性和全局變量是等價的,用var聲明的變量既是全局變量,也是頂層變量
注意:頂層對象,在瀏覽器環(huán)境指的是window對象,在 Node 指的是global對象
二、let
let 是ES6新增的命令,用來聲明變量
用法類似于var,但是所聲明的變量,只在let命令所在的代碼塊內(nèi)有效
let不允許在相同作用域中重復聲明
三、const
const聲明一個只讀的常量,一旦聲明,常量的值就不能改變
區(qū)別:
-
1. 變量提升
var 聲明的變量存在變量提升,即變量可以在聲明之前調用,值為undefined
let 和 const 不存在變量提升,即它們所聲明的變量一定要在聲明后使用,否則報錯
console.log(a) // undefined
var a= 10
console.log(b) // Cannot access 'num' before initialization
let b = 20
console.log(c) // Cannot access 'num' before initialization
const c = 30
-
2. 塊級作用域
var 不存在塊級作用域
let 和 const 存在塊級作用域
{
var a = 10
}
console.log(a) // 10
{
let b = 20
}
console.log(b) // Uncaught ReferenceError: b is not defined
{
const c = 30
}
console.log(c) // Uncaught ReferenceError: c is not defined
-
3. 重復聲明
var 允許重復聲明變量
let 和 const 在同一作用域不允許重復聲明變量
var a = 10
a = 20
console.log(a) // 20
let b = 10
b = 20
console.log(b) // 20
const c = 10
c = 20
console.log(c) // Uncaught TypeError: Assignment to constant variable
-
4. 修改聲明的變量
var 和 let 可以
const 聲明一個只讀的常量。一旦聲明,常量的值就不能改變
var a = 10
a = 20
console.log(a) // 20
let b = 10
b = 20
console.log(b) // 20
const c = 10
c = 20
console.log(c) // Uncaught TypeError: Assignment to constant variable