ES6概念:
ES6是JavaScript下一代标准,在2015年6月正式发布。可用于编写复杂的大型应用程序,成为企业级开发语言
编写环境:
nodeJS是JavaScript语言的服务器运行环境,对ES6的支持度比浏览器高,我们通过安装nodeJS环境,可以体验更多的ES6特性。
我们使用版本管理工具nvmw(Windows)来安装node,可以自由切换版本。
环境支持:
Babel转码器可以吧ES6转化为ES5,这样我们可以用ES6编写程序而无需担心环境是否支持。
新增了很多特性:
- 增加了let命令,const命令,import命令和class命令
- 增加了块级作用域:内外层互不干扰,外层无法读取内层变量。
- ES6规定var 和function声明的变量属于全局对象的属性,let,const,class声明的全局变量不属于全局对象的属性
- 变量的解构赋值:ES6当中可以从数组、对象、字符串中提取值,按照位置的对应关系给变量赋值。
- Es6新增了Module模块的概念
- 还将Promise对象纳入了规范。避免层层嵌套的回调函数。提供了统一的接口,使得控制异步操作更加的容易
- 新增箭头函数,箭头左边是输入的参数,右边是进行的操作和返回的值。箭头函数使表达式更加的简洁。箭头函数当中的this指的的是定义时所在的对象而不是使用时所在的对象。这样我们在使用的时候就不会产生很多歧义了。
- 新增了许多操作数组的方法:Array.from(arrylikelist)把类数组对象和可枚举的对象转化为数组;比如我们用dom操作获得的nodelist不可以使用数组的原生方法,这时候可以使用Array.from()方法把它转化成数组。Array.of(1,2,4)把一组数值转化为数组。数组实例的find(fn)找出第一个符合条件的数组成员。findIndex(fn)返回第一个符合条件的数组成员的位置。[].fill(num)用定值填充数组。
- 新增了模板字符串:用反引号标识,可以当中普通字符使用,字符串中可以用${value}嵌入变量,带来了很多方便。
变量声明:
let命令:用于声明变量,它所声明的变量只有在let命令所在的代码块才有效。let声明的变量不存在变量声明提升,必须在声明后使用。在块中存在let,const命令,这个区块对这些变量形成封闭作用域。不能够在声明之前使用变量:ES6规定不存在变量声明提升防止在变量声明之前就使用它,减少运行时的错误。let不允许在相同的作用域内重复声明一个变量。
const命令:用于声明常量,一旦声明就不可修改。而且声明时必须赋值。也在声明的块当中有效。也不可重复声明,也不提升。
块级作用域:内外层互不干扰,外层无法读取内层变量。
ES5中只有全局作用域和函数作用域。比如for循环的括号里用var声明的变量泄漏为全局变量;ES6当中,用let声明变量只在块级作用域内有效。let实际上为JavaScript新增了块级作用域。
块级作用域使得立即执行函数不再必要了。立即执行函数相当于一个块级作用域。
ES5存在函数声明提升,而在ES6当中代码块中的函数不会影响到作用域的外部。
Promise:
ES6将Promsie纳入了规范,并原生提供了Promise对象
promise对象用来传递异步操作的信息:它代表了一个未来才知道结果的事件,并且这个事件提供统一的API,可供进一步处理
优点:避免层层嵌套的回调函数。它提供了统一的接口,使得控制异步操作更加的容易
用promise对象实现AJAX操作 var getJSON=function(url){ var promise=new Promise(function(resolve,reject){ //AJAX操作 $.ajax({ url:url, type:'GET', dataType:'json', success:function(data){ resolve(data); }, error:function(xhr,textStatus){ reject(textStatus); } }) }) return promise; } getJSON('/post.json') /*这里是promise实例对象*/ /*状态改变时的回调函数*/ .then( //状态从pending进行中——resolved已完成时调用的函数 function( /*从resolve传过来的数据*/ data) { //成功后执行的操作 console.log(data); }, //状态从pending进行中——rejected失败时调用的函数 function( /*从reject传过来的数据*/ ) { //失败后的操作 console.log(data); } )