es6(一):es6介绍以及let,const

es是js的规范,而js是具体实现
将es6转化为es5代码工具:运用的多的是babel
在线转换地址:babeltraceur(属于谷歌)
 
1.let申明变量:let其实可以完全取代var,并且没有var这么多副作用
1 {
2       var a = 10;
3       let b = 10;//let申明的变量是块级作用域
4     }
5     console.log(a)//10
6     // console.log(b)//b is not defined
let很适合的一种场景是:for
1 for (let i = 0; i < 3; i++) {
2       console.log(i)
3     }
4     for (var j = 0; j < 3; j++) {
5       console.log(j)
6     }
7     // console.log(i)//i is not defined
8     console.log(j)//3

看下面这种情况:

 1 var k = []
 2     for (var i1 = 0; i1 < 5; i1++) {//var i1,申明了全局变量i1,只存在一个i1;即每次循环的i1指向的都是同一个i1
 3       k[i1] = function () {
 4         console.log(i1);
 5       }
 6     }
 7     k[3]();//5
 8 
 9     var p = []
10     for (let i2 = 0; i2 < 5; i2++) {//let i2,申明变量i2,只在块级作用域有效;即每次循环的i2都是新的、重新申明的变量(同时js引擎内部可以记住上一次循环的值)
11       p[i2] = function () {
12         console.log(i2)
13       }
14     }
15     p[3]()//3

注意下面这种情况:

1 for(let i3=0;i3<3;i3++){//圆括号里面是一个作用域
2       let i3=10//花括号里面又是一个作用域
3       console.log(i3)
4     }
5     //输出:10 10 10 
let不存在变量提升(对比var变量提升)
1 console.log(i4)//i4 is not defined
2   let i4=10 
3 console.log(i5) //undefined 未赋值
4     var i5=100
暂时性死区:在es6中,如果区块中存在let和const命令申明的变量,这个区块就对变量形成封闭作用域。即暂时性死区(temporal dead zone,简称TDZ)
1 var people=100
2     if(true){
3       //TDZ开始
4       // console.log(people)//people is not defined
5       let people=1000//TDZ结束
6       console.log(people)
7     }
暂时性死区本质:进入区块,只有let申明变量后,才能进行访问
 
let不允许在相同作用域下重复申明变量
1 function test(){
2       let a=10;
3       // var a=100
4       let a=1000
5     }
6     test()//报错,a已被申明

 

块级作用域的出现使得IIFE不再必要了;块级作用域外部不能访问块级作用域中的let申明的变量;借助花括号(可以嵌套多个),块级作用域的写法:
1 {
2   let a100=100
3  }
4  console.log(a100)//报错

 

const:const申明只读的常量;申明时必须同时赋值,否则报错;同理,const与let一样都是块级作用域范围

实质上:const是保证变量指向的内存地址不得改动。对于简单类型(数值,字符串,布尔值),表现为值不能改变;而对于复合类型(数组,对象),不变的是内存地址,指向的数据结构可能会变动
 1 const PI=3.14
 2     console.log(PI)
 3 
 4     // const AB//报错,必须申明时同时赋值
 5     // AB=1
 6     
 7     const ABC=[]
 8     ABC[0]='hello'
 9     ABC[1]='hi'
10     console.log(ABC)
11     // ABC={}//这时报错

同时:ES6中,let,const,class申明的变量不再是顶层对象的属性;而var ,function申明的依然是顶层对象的属性(为了保持兼容性)

1 console.log(window.PI)//undefined;PI是上面代码中由const申明的常量

 

参考:更多详情请点击阮一峰前辈的ECMAScript 6 入门

posted @ 2017-12-21 16:15  why_not_try  阅读(272)  评论(0编辑  收藏  举报