let和var,const
1.let:只在块级作用域中有效
(1)不存在变量提升;
(2)不可和var在
同一个作用域下同时声明;(如果同时,会抛出语法错误);
(3)for循环,for里面是父级作用域,即
for(var i=0;i<3;i++){
var i='abc';
console.log(i)
} //打印3次abc,这两个i是在不同作用域下定义的
2.var:存在变量声明,被提升到函数顶部;
3.const:
(1)和let前两点相同;
(2)用const声明的常量不可在赋值;
(3)const定义完常量必须赋值,不能后赋值;
const a;
a=4;
console.log(a) //出错
(4)用const声明的对象不允许绑定修改,但允许修改值;对象是引用类型
例1:const person={
name:xiaop;
}
person.name=huahua; //正确
person={
name:huahua; //抛出语法错误
}
例2:
const arr = ['apple','banana'];
arr.push(‘orange’);
console.log(arr) 正确// ['apple','banana','orange'];
特殊:(基本不用)
const arr = Object.freeze(['apple','banana']); //Object.freeze:冻结,真正的不可修改
arr.push(‘orange’);
console.log(arr) //抛出错误
4.临时死区
javascript引擎在扫描代码时发现变量声明时,要么将它们提升至作用域顶部(var),要么将声明放在TDZ中(let const)。访问TDZ中的变量会触发运行时的错误。只有执行过变量声明语句后,变量才能从TDZ中移除,然后才可以正常访问。
if (condition){
console.log(typeof value); //引用错误
let value = "blue"; //此时value在TDZ中
}
特殊:在作用域外调用只会是undefined
console.log(typeof value); //undefined
if (condition){
let value = "blue";
}
建议:以后用let,不要使用var
(前端小白,如有错误,欢迎指正,在此感激不尽)