var、let、const 的区别
本文来介绍一下面试常问的 var、let、const 有什么区别
1. 作用域不同
var 没有块级作用域,let 和 const有 块级作用域 用 var 声明变量:
js
for (var i = 0; i < 3; i++) {
  console.log(`循环内i的值:${i}`)
}
console.log(`循环外i的值:${i}`)
运行结果:
循环内 i 的值:0
 循环内 i 的值:1
 循环内 i 的值:2
 循环外 i 的值:3
用 let 声明变量:
js
for (let i = 0; i < 3; i++) {
  console.log(`循环内i的值:${i}`)
}
console.log(`循环外i的值:${i}`)
运行结果:
循环内 i 的值:0
 循环内 i 的值:1
 循环内 i 的值:2
 Uncaught ReferenceError: i is not defined
2. 暂时性死区
只要使用了 let 和 const 声明的变量就会绑定这个块级作用域,不受外部影响
 使用 var 来声明变量:
js
var a = 10
if (true) {
  console.log(a) // 10
  var a = 20
}
使用 let 声明变量:
js
var a = 10
if (true) {
  console.log(a)
  let a = 20
  // 报错:Uncaught ReferenceError: Cannot access 'a' before initialization
}
使用 const 声明变量:
js
var a = 10
if (true) {
  console.log(a)
  const a = 20
  // 报错:Uncaught ReferenceError: Cannot access 'a' before initialization
}
3. 变量提升
var 声明的变量存在变量提升,let、const 不存在变量提升 使用 var 声明变量
js
console.log(a) // undefined
var a = 10
由于 var 存在变量提升的特性,这段代码会在 JS 引擎预编译的时候变成这样:
js
var a
console.log(a)
a = 10
使用 let 的变量或 const 声明的常量
js
console.log(a)
let a = 10 || const a = 10
// 报错:Uncaught ReferenceError: Cannot access 'a' before initialization
4. 重复声明
var 声明的变量可以重复声明, let 和 const 声明的不可以重复声明
js
var a = 10
var a = 20
console.log(a) // 20
js
var a = 10
let a = 20 || const a = 20
console.log(a)
// 报错:Uncaught SyntaxError: Identifier 'a' has already been declared
5. 变量能否被修改
var 和 let 声明的变量可以修改,但 const 声明的常量不能修改
js
var a = 10  || let a = 10
a = 20
console.log(a) // 20
js
const a = 10
a = 20
console.log(a)
// 报错:Uncaught TypeError: Assignment to constant variable
6. 垃圾回收
ES6 增加这两个关键字不仅有助于改善代码风格,而且同样有助于改进垃圾回收的过程。因为 const 和 let 都以块(而非函数)为作用域,所以相比于使用 var ,使用这两个新关键字可能会更早地让垃圾回收程序介入,尽早回收应该回收的内存。在块作用域比函数作用域更早终止的情况下,这就有可能发生。
 小豪的blog
小豪的blog