一文对比var、let、const之间的区别

在es5中,用var声明的变量既是全局变量,也是顶层变量(浏览器中指window对象)。在Node指的是global对象。

var

在es5中,用var声明的变量既是全局变量,也是顶层变量(浏览器中指window对象)。在Node指的是global对象。

全局变量,在浏览器中自动挂载到window对象上
1
2
3
// 全局变量,在浏览器中自动挂载到window对象上
var a = 10;
console.log(window.a); // 10
var变量声明,会造成变量提升
1
2
3
4
// var变量声明,会造成变量提升
console.log(b); // undefined
var b;

多次使用var声明,后面声明的变量会覆盖前面的声明
1
2
3
4
5
// 多次使用var声明,后面声明的变量会覆盖前面的声明
var c = 20;
var c = 30;
console.log(c); // 30

在函数中使用var声明变量,该变量是局部的
1
2
3
4
5
6
7
// 在函数中使用var声明变量,该变量是局部的
var d = 40;
function fn() {
var d = 50;
}
console.log(d); //40

函数内变量不使用var声明,会提升为全局变量
1
2
3
4
5
6
// 函数内变量不使用var声明,会提升为全局变量
var e = 60;
function fn(){
e = 70;
}
console.log(e); // 60

let

let作用于块级作用域
1
2
3
4
{
let a = 10;
}
console.log(a); // Uncaught ReferenceError: a is not defined
let不存在变量提升
1
2
console.log(b);  // Uncaught ReferenceError: Cannot access 'b' before initialization
let b;
let在块级作用域存在“暂时性死区”
1
2
3
4
5
var a = 30;
if(true) { // 这形成了块级作用域,后面的let变量声明有“暂时性死区”,在let声明之前访问变量a会报错
a = 40; // Uncaught ReferenceError: Cannot access 'a' before initialization
let a;
}
let在同一作用域不允许重复声明
1
2
3
let a = 10;
let a = 20; // Uncaught SyntaxError: Identifier 'a' has already been declared
s
1
2
3
4
function fn(args) {
let args = 10; // Uncaught SyntaxError: Identifier 'args' has already been declared
}
fn();
不同作用域是可以重复声明的,比如两个块级作用域
1
2
3
4
5
let b = 30;
{
let b = 40;
}
console.log(b); // 30

const

const定义的变量是只读的,不能改变
1
2
3
const a = 10;
a = 20;
console.log(a); // Uncaught TypeError: Assignment to constant variable.
const声明变量必须立刻初始化
1
const b; // Uncaught SyntaxError: Missing initializer in const declaration
使用var,let声明过的变量,不允许再使用const声明
1
2
3
4
5
var c = 30;
const c = 40; // Uncaught SyntaxError: Identifier 'c' has already been declared

let d = 50;
const d = 60; // Uncaught SyntaxError: Identifier 'd' has already been declared
const只能保证指针是固定的,并不能保证变量的数据结构不变
1
2
3
const obj = {};
obj.name = "alan";
console.log(obj); // {name:"alan"}

var,let,const区别

  • 变量提升

var存在变量提升;let和const一定要先声明再使用,不存在变量提升

  • 暂时性死区

var不存在暂时性死区,let和const存在“暂时性死区”,必须先声明,再使用,

  • 块级作用域

var不存在块级作用域,let,const存在块级作用域

  • 重复声明

var允许重复声明变量,后面的声明覆盖前面的。let和const在同一作用域不允许重复声明变量

  • 修改声明的变量

var,let可以修改声明变量,const不能修改已经声明的变量,一旦声明,常量的值就不能改变。

  • 使用

能用const就尽量用const, 其它大多数情况使用let,不要使用var