es6关于let和const的总结

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
原文地址:https://www.cnblogs.com/douyaer/p/7648282.html