es是js的规范,而js是具体实现
将es6转化为es5代码工具:运用的多的是babel
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 入门