一、 var声明的变量会挂载在window上,而let和const声明的变量不会。
var a = 100;
console.log(a,window.a) //100 100
let b = 10;
console.log(b,window.b) //10 undefined
const c = 1;
console.log(c,window.c) //1 undefined
二、 var声明的变量存在变量提升,let和const不存在变量提升
console.log(a); //声明的变量在没有赋值前输出undefined
var a = 100;
console.log(b); //报错,找不到b这个变量
let b = 10;
console.log(c); //报错,找不到c这个变量
const c = 10;
三、 let和const声明形成块作用域
if(1){
var a = 100;
let b = 10;
}
console.log(a); //100
console.log(b); //报错,找不到b这个变量
if(1){
var a = 100;
const c = 1;
}
console.log(a); //100
console.log(c); //报错,找不到c这个变量
四、 同一作用域下let和const不能声明同名变量,而var可以
var a = 100;
console.log(a); //100
var a = 10;
console.log(a); //10
let a = 100;
let a = 10;
//报错,标识符a已经被声明了
五、 暂存死区
var a = 100;
if(1){
a = 10;
//在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a,
//而这时,还未到声明时候,所以控制台Error : a is not defined
let a = 1;
}
六、 const
/*
1.一旦声明变量必须赋值,不能使用null占位。
2.声明后不能再更改。
3.如果声明的是复合类型数据,可以修改其属性
*/
const a = 100;
const list = [];
list[0] = 10;
console.log(list) //[10]
const obj = {a:100};
obj.name = 'apple';
obj.a = 10000;
console.log(obj) //{a: 10000, name: "apple"}