js let、var、const的区别

192 阅读1分钟

1、let

不能在相同作用域重复声明;没有变量提升;有函数作用域和块级作用域;会有暂时性死区;不是 window 对象的属性用 delete 被删除; 对数组对象使用delete 与 var const 一致

console.log(fa);//Cannot access 'fa' before initialization(初始化之前无法访问),这就是暂时性死区
let fa = 1;
console.log(window.fa);//undefined
let fa = 2;//Identifier 'fa' has already been declared(标识符'fa'已经声明)

a = 10; //未定义,可被delete删除
delete a;//undefined
let b = 11;
delete b;//undefined

let c = [1,2,3]
delete c;//[1,2,3]
delete c[0];//[empty,2,3]

let d = {name:"sy",title:12}
delete d;//{name:"sy",title:12}
delete d.name;//{title:12}

2、var

可以重复声明,有变量提升(提升到该作用域的顶部),只有函数作用域,函数提升优先于变量提升;会挂载到 window 对象上;用 delete 不能被删除;对数组对象使用delete 与 let const 一致

console.log(foo);//undefined(变量提升,js 赋值为undefined)
var foo
foo = 1
console.log(foo);//1
console.log(window.foo);//1 会挂载到window对象上
var foo = 3
console.log(foo);//3(可以重复声明)
function f() {
    var foo;
    console.log(foo);//undefined(会先找函数内部)
    foo = 2
    console.log(foo);//2
}
f()
console.log(foo);//3(证明函数内部的变量与全局变量分离)

var b = 11;
delete (b);
console.log("b2", window.b);//11

var a = [1,2,3]
delete a;//[1,2,3]
delete a[1];//[1,empty,3]

var c = {name:"sy",title:12}
delete c;//{name:"sy",title:12}
delete c.name;//{title:12}

3、const

常量 不可改变;声明时必须赋初始值;用 delete 被删除; 对数组对象使用delete 与 let var 一致

const a = 2;
a = 4//Assignment to constant variable.(对常数变量的赋值)
const b;//Missing initializer in const declaration(在const声明中缺少初始化式)
const b = 11;
delete (b);
console.log("b2", window.b);//undefind