一、作用域
var的作用域是函数级作用域,let和const是块级作用域。
function fun() {
var a = 1;
if (1) {
let b = 2;
const c = 3;
console.log(a);//1
console.log(c);//3
}
console.log(a);//1
console.log(b);//error
console.log(c);//error
}
fun();
console.log(a);//error
console.log(b);//error
console.log(c);//error
大家可以通过对这段代码调试运行理解作用域的区别
二、重复声明
var可以被重复声明,let和const不可以重复声明。
var a = 1;
var a = 2;
console.log(a);//2
let b = 2;
let b = 3;//error
const c = 4;
const c = 5;//error
三、变量提升
var有变量提升,let和const没有变量提升。
console.log(a);//undefined
var a = 1;
console.log(b);//error
let b = 2;
console.log(b);//error
const c = 2;
四、暂时性死区
在let和const定义变量的上方会形成一个暂时性死区,当在暂时性死区内调用这个变量时会报错,var不会,因为有变量提升会输出undefined。
还有
当const定义一个基本数据类型的时候,这个变量的值不可更改,但是当const定义一个对象时,虽然这个对象不可更改,但是对象内部的值可以更改。
例如
const obj = {
name: 'liu',
age: 18
}
obj.age = 20;
console.log(obj);
但是可以通过Object.freeze()解决这个问题:
const obj = {
name: 'liu',
age: 18
}
Object.freeze(obj);
obj.age = 20;
console.log(obj);