set用于声明变量
1.var 的一个升级版
2.不存在变量提升
console.log(a);//Uncaught ReferenceError: a is not defined
let a=1;
console.log(a);//1
console.log(a);//undefined
var a=1;
console.log(a);//1
3.会形成暂时性死区(处于同一个块级作用域里的同名变量在let声明之前使用都会报错)
let a=2;
console.log(a);//报错
var a=1;
console.log(a);
4.在同一个块级作用域里面不允许重复声明同一个变量
if(2>1){
let a=1;
var a=2;
console.log(a)
}
//报错
if(2>1){
let a=1;
let a=2;
console.log(a)
}//报错
if(2>1){
let a=1;
a=2;
console.log(a)
}//2
5.块级作用域(不在同一个块里面的变量不会互相影响,①内层变量不能覆盖外层变量;②循环变量不会泄漏为全局变量;③var的for循环会发生值得覆盖,let的for循环会将每一次循环产生的值储存)
let a=3;
if(2>1){
let a=1;
if(3>2){
let a=2
console.log(a)//2
}
console.log(a);//1
};
console.log(a)//3
for(var i=0;i<5;i++){
var a=2;
};
console.log(i)//5
var arr=[];
for(var i=0;i<5;i++){
function f(){
console.log(i)
};
arr.push(f)
};
arr.forEach(function(e){
console.log(e())
})//5,5,5,5,5
var arr=[];
for(let i=0;i<5;i++){
function f(){
console.log(i)
};
arr.push(f)
};
arr.forEach(function(e){
console.log(e())
})//0,1,2,3,4
const用来声明变量
1.一旦声明,其值不能发生改变
const a=1;
a=2;//报错
2.一旦声明变量就必须赋值
const a;//报错
3.对于复合型变量,变量名不指向数据,而是指向数据所在地址,因此const只会保证变量名指向的地址不会变,不会保证数据不变
const obj={};
obj.name='张三';
console.log(obj.name)//'张三'
const a=[];
a.push('王炜');
console.log(a[0])//王炜
4.可以采用object.freeze方法将对象冻结
const obj=obj.freeze({});
obj.name="王炜";
console.log(obj.name)//报错
5.拥有块级作用域,只在声明的块里面有用
if(true){
const a=1;
};
console.log(a)//Uncaught ReferenceError: a is not defined