var
在ES5中,顶层对象的属性和全局变量是等价的,用var
声明的变量既是全局变量,也是顶层变量
注意:顶层对象,在浏览器环境指的是window
对象,在 Node
指的是global
对象
var a = 10
console.log(window.a) // 10
var声明具有变量提升
console.log(a)
var a = 10
在编译后会变成
var a
console.log(a) // undefined
a = 10
var声明的变量可以重复声明,后声明的会覆盖之前声明的
var a = 10
var a = 20
console.log(a) // 20
在函数中声明var变量是局部变量,不会影响到全局var声明
var a = 10
function toSay () {
var a = 20
console.log(a
}
toSay() // 20
console.log(a) // 10
如果没有使用var声明,相当于在全局声明一个变量
function toSay () {
a = 20
}
toSay()
console.log(a) // 20
let
let没有变量提升,而且不会挂载到window下,使用let
声明变量前,该变量都不可用,也就是大家常说的“暂时性死区
经评论区大佬LLeslie指正,let和const其实存在变量提升,只是仅提升创建的操作,初始化和赋值的操作都没有被提升
console.log(b) // ncaught ReferenceError: d is not defined
let b = 20
console.log(window.b) // undefined
let有块级作用域
let b = 20
function toSay () {
let b = 30
console.log(b)
}
toSay() // 30
console.log(b) // 20
let在相同作用域下不能重复声明
let a = 20
let a = 10 // Uncaught SyntaxError: Identifier 'a' has already been declared
const
const 声明一个常量,一旦声明就不能更改,也不会挂载到window下面
const a = 20
a = 30 // Uncaught TypeError: Assignment to constant variable.
const 值不能更改
const b
b = 20 // Uncaught SyntaxError: Missing initializer in const declaration
const 值不能更改实际指的是不能修改变量保存的指针地址,但是指针指向的数据是可以修改的
const a = {
b: 2
}
a.b = 3
console.log(a.b) // 3
const b = [1,2,3,4]
b[2] = 5
console.log(b) // [1,2,5,4]
// 不能把a指向另一个变量
a = {} // TypeError: "a" is read-only
总结
- var具有变量提升,let,const仅提升声明,形成暂时性死区
- const初始化必须赋值,let和var仅提升创建操作
- let和const有块级作用域,var没有
- var可以重新声明,let和const不可以,let可以在不同作用域下重新声明
- let和var可以改变值,const不行
- var会挂载到window下,let和const不会