ECMAScript 6.0于2015 年 6 月正式发布了,成为JavaScript 语言的下一代标准。ES6增加的语言特性解决了哪些问题,会给开发者哪些便利,是本文主要探讨的问题。
增加了对unicode字符的支持
ES5对字符的处理有限,无法很好地处理码点大于0xFFFF
的字符。
ES6在string
原生方法中支持码点大于0xFFFF
的字符,取得码点或是遍历,都可以直接操作;并且对字符不同的表示方法做了统一化。
在正则表达式里新增\u
\s
修饰符,使得正则对特殊字符的匹配不需要开发者额外处理。
异步编程
ES6 前异步编程的解决方式:
- 回调函数
- 事件监听
- 发布/订阅
- 自定义promise
Promise
ES6提供了原生的Promise对象,统一了用法和标准。
- 对象的状态不受外界影响。能够方便地获取异步操作的状态、赋予对应操作。
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。
缺点
- 无法取消Promise,一旦新建它就会立即执行,无法中途取消。
- 如果不设置回调函数,或在catch中再次抛出错误。Promise内部抛出的错误,不会反应到外部。
- 当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
Generator
Generator 函数形式上与普通函数无异,特征有二
-
function
关键字与函数名之间有一个星号; - 函数体内部使用
yield
表达式,来表明函数执行的状态。
意义:
-
可以交出函数的执行权(即暂停执行)
-
函数体内外的数据交换
可以在 Generator 函数运行的不同阶段,调整函数行为。包括从外部向内部注入不同的值,控制返回和抛出错误。
async
(ES2017 标准引入)
async
函数从理解上来说, Generator 函数的星号(*
)替换成async
,将yield
替换成await
。
但相比较generate而言,内置执行器,有更易于理解的语义。
async
函数返回一个 Promise 对象,可以使用then
方法添加回调函数。async
函数内部return
语句返回的值,会成为then
方法回调函数的参数。
当函数执行的时候,一旦遇到await
就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
只要一个await
语句后面的 Promise 变为reject
,那么整个async
函数都会中断执行。且返回的Promise对象变为rejected状态。
减少全局变量和方法
ES6 将全局方法parseInt()和parseFloat(),移植到Number对象上面。 逐步减少全局性方法,使得语言逐步模块化。
代码作用域
增加let
,const
的变量声明方式,不存在变量提升,不允许重复声明,使语言使用更加严谨。
增加块级作用域, 使得变量的作用域更利于管理,也使得立即执行函数表达式不再必要了。
增加箭头函数
让this绑定定义时所在的作用域,而不是指向运行时所在的作用域,也使得表达更加简洁。
语法糖
ES6推出了模版字符串,使得多行字符串及夹杂变量的字符串写起来更加方便。
对象增加属性名表达式与简洁表示法。
增加遍历器机制,为各种不同的数据结构提供统一的访问机制。
增加解构的语法,取值更直观方便。
增加class关键字来定义类,过去,生成实例对象的传统方法是通过构造函数。不再和传统面向对象语言有大的差异。且支持extends。
元编程
引入Proxy
对象,可以拦截某些操作并实现自定义行为。
引入 Rflect
对象,可以获取默认操作,可以将默认操作从处理程序转发到目标。
Symbol
symbol 是一种基本数据类型 ,提供一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。
更多的原生方法
ES6提供了更多的原生方法,避免了开发者重复造轮子。如字符串的查找。
完善正则的匹配规则,如新加的y、s修饰符。
增加了set、map的数据结构。
虽然JavaScript 不适合进行科学和金融方面的精确计算,但增加Number.EPSILON
等数值方法,使得对数值操作易于在精度方面进行控制。
增加对对象的操作与读取的API。
优化
对尾递归进行优化,赋予javscript运行复杂度更高的方法的能力。
参考
网友评论