let,var,const的区别

728 阅读2分钟

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指正,letconst其实存在变量提升,只是仅提升创建的操作,初始化和赋值的操作都没有被提升
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不会