var声明的变量会挂载在window上,而let和const声明的变量不会。
var name = 'dyx';
let name1 = 'dyx1';
const name2 = 'dyx2';
console.log(window.name);
console.log(window.name1);
console.log(window.name2);
var声明变量存在变量提升,let和const不存在变量提升。
console.log(name);
var name = 'dyx';
console.log(name1);
let name1 = 'dyx1';
console.log(name2);
const name2 = 'dyx2';
let和const声明形成块作用域。
if (true) {
var name = 'dyx';
let name1 = 'dyx1';
const name2 = 'dyx2';
}
console.log(name);
console.log(name1);
console.log(name2);
同一作用域下let和const不能声明同名变量,而var可以。
var name = 'dyx';
var name = 'dyx1';
let name1 = 'dyx2';
let name1 = 'dyx3';
const name2 = 'dyx4';
const name2 = 'dyx5';
暂时性死区。
var name = 'dyx';
if (true) {
name = 'douyaxing';
let name = 'dyxweb';
}
const一旦声明必须赋值,声明后不能再修改,如果声明的是复合类型数据,可以修改其属性。
const name = 'dyx';
name = 'dyx1';
const info = {
name: 'dyx',
}
info.name = 'douyaxing';
console.log(info);
暂时性死区的原因
- 变量的赋值可以分为三个阶段:
- 创建变量,在内存中开辟空间。
- 初始化变量,将变量初始化为undefined。
- 真正赋值。
- let 的「创建」过程被提升了,但是初始化没有提升。存在暂时死区,在变量未初始化或赋值前不允许访问。
- var 的「创建」和「初始化」都被提升了。
- function 的「创建」「初始化」和「赋值」都被提升了。