set用于声明变量
1.var 的一个升级版
2.不存在变量提升
console.log(a);//Uncaught ReferenceError: a is not definedlet a=1;console.log(a);//1
console.log(a);//undefinedvar 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=2console.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