js es6 let const的区别

---------------let--------------------
能向下兼容

let跟var 的相同点
1.var有的let都有

1 console.log(a) //undefined
2 var a=1;//提升变量声明
3 console.log(b) //报错
4 let b=2;//不存在变量提升

 

----------let特点----------------

变量只允许声明一次/不能重复声明
如果var 声明了一次,let再声明就报错

var a=1;
let a=2;//报错

//这里是暂时性死区 TDZ
let a =1 
{
//块作用域里的a自动绑定当前作用域,为当前作用域的a,所以报错.
console.log(a)//报错.因为let 只在声明时存在,不存在var提升变量
let a=2;
console.log(a)
}

 

---------------------------
let 声明的全局变量不再跟顶层对象挂钩

var a=1;//window.a输出为1;
let b=2;//window.b输出为und,真的全局

function fn(arg){
//形参相当于var arg;
{
let arg=2;
}
}

 


-------------块作用域------------------

说到let,就不得不说一下块作用域
块作用域是独立的,自执行,没有返回值,可以拿到父级的参数.
如果块作用域里有var,那么var 的这个参数相当于声明在全局,
除json,function外,带{ }的语句有let/const都是块作用域

 

{
//块作用域
let a = 1

}

console.log(a) //报错


do{
//拿到块作用最后的一条语句(试用而已)
}

 

重点来了:比方说for循环,用let时,每次循环的结果都是独立的块作用域.
而用var的话,结果每次都是10,不独立.

let arr =[]
for(let i=0;i<10;i++){
arr[i]=function(){
console.log(i)
}
}
arr[1]()//1
arr[2]()//2

 

但是如下的话,for()里的内容相当于一个隐藏的作用域(相当于赋值i,跟var一样),相当于{}内容的父级,所以引用的是全局的i

let arr =[]
let i;
for(i=0;i<10;i++){ 
arr[i]=function(){
console.log(i)
}
}
arr[1]()//10

 

 

总的来说,for的括号里如果是有let就是单独的一个作用域(括号里独立),var会泄漏到全局,所以相当于在全局声明了一个变量.



 

----------const---------------
用来声明常量的,只允许赋值一次,不能改变
let所有特性,const都有

let和const的区别有两点
  1.const声明变量必须立即初始化值,不能留到后面
  2.一旦变量声明就不可修改

本质:保存是对象的内存指针

const a=[1];//相当于家
a[0]=2//可以拓展,相遇于装修
console.log(a);//[2];

const b={}
b.c=1;
console.log(b)//{c:1};

 

posted @ 2018-03-11 23:27  灰犀  阅读(258)  评论(0编辑  收藏  举报