一、var
在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量
注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象
二、let
let 是ES6新增的命令,用来声明变量
用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效
let不允许在相同作用域中重复声明
三、const
const声明一个只读的常量,一旦声明,常量的值就不能改变
区别:
-
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