ECMAScript 6.0,ECMAScript 2015,直到大家最后确定简称为 ES6。
ECMA-262 标准 第6版。计划以后每年发布一次标准,使用年份作为标准的版本。因为当前版本是在2015年发布的,所以又称ECMAScript 2015。ECMA 的全称是 European Computer Manufacturers Association(欧洲计算机制造商协会)。ECMA-262 被 ISO 国际标准化组织采纳为 ISO/IEC 16262:2011
日常讨论的 JavaScript 通常还包括 DOM(文档对象模型)、BOM(浏览器对象模型),而 ES6 不包含这些。
Well-known Features
本节介绍一些广为人知的 ES6 “明星”特性,也就是讨论 ES6 时经常提及的一些新特性。当然 ES6 并不仅限于这些,还包括很多其他有用的特性,会在本系列的其他文章中介绍。
let and const
ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
const声明一个只读的常量。一旦声明,常量的值就不能改变。
Template String
传统的字符串var name='es6';
var sayhello ='hello, \my name is '+name+'.';
console.log(sayhello);
输出:hello, my name is es6.
ES6 模板字符串
var name= 'es6';var sayhello = `hello,mynameis${name}.`;
console.log(sayhello)输出:hello,mynameises6.
空格和换行都会被保留
Arrow Function
允许使用 => 定义函数,箭头函数自动绑定当前上下文 this。
x => x+1等同于匿名函数function(x) {returnx+1;}
多个参数:(a,b) => a+b等同于function(a, b) {returna+ b;}
多行函数体:(a,b) => { console.log(a +b);return a +b;}等同于function(a, b){console.log(a + b);returna + b;}
Promise
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
Class
ES2015的类只是一个语法糖,通过class关键字让语法更接近传统的面向对象模式,本质上还是基于原型的。使用单一便捷的声明格式,使得类使用起来更方便,也更具互操作性。类支持基于原型的继承,调用父类的构造函数,生成实例,静态方法和构造函数。
在 JavaScript 中引入 OO 面向对象。实际上是语法糖,只是看上去更面向对象而已。也有观点极力反对 Class,认为 Class 隐藏了 JavaScript 本身原型链的语言特性,使其更难理解。
一半以上库是按 OO/class 方式写的,除了jQuery之外,几乎每个“严肃”的JS基础库都有一个Class实现,工具、IDE 更容易识别,JavaScript 引擎性能优化。---- johnhax
Module
许多JS框架都会实现一套自己的 module/loader 机制。反复造轮子这也就罢了,更大的问题在于,这些轮子互相都是不兼容的。结果就造成了JS社区的分化和内耗,阻碍了JS库和组件在较细粒度上的竞争和发展,JS框架和库的切换成了强迫开发者做出非此即彼的选择。缺乏语言级别的 module,其恶果就是既没有足够的标准库,也很难像其他语言一样通过丛林法则发展出事实标准库。 ---- johnhax
社区主流解决方案有 CommonJS 和 AMD,分别用于服务器端和浏览器端,浏览器端还有 seajs 遵循的 CMD。
ES6 Module
export 命令 和 import 命令
exportvarfirstName ='mei';exportvarlastName ='qingguang';exportvaryear =1988;import{firstName, lastName,year} from'./profile'console.log(firstName, lastName,year)模块整体输出varfirstName ='mei';varlastName ='qingguang';varyear =1988;export{firstName, lastName, year};import*asProfilefrom'./profile'console.log(Profile.firstName, Profile.lastName, Profile.year)export default 整体输出exportdefaultfunction(){console.log('My name is mei qingguang');};importsayMyNamefrom'./profile'console.log(sayMyName())
Node.js 运行环境
可以在 Node.js 和 io.js 中使用部分 ES6 特性。Node.js 和 io.js 都是使用 V8 引擎作为 JavaScript 运行环境,io.js 集成了更高版本的 V8 引擎,因此可以比 Node.js 支持更多的 ES6 特性。在 Node.js 中,需要使用 --harmony 参数开启 ES6 特性,包括所有已完成、待完成和修订中的特性。为了避免用到那些废弃的特性,可以通过加类似 --harmony_generators 参数开启特定的特性。而在 io.js 中,所有已完成的稳定 ES6 特性都已经默认开启,不需要加任何运行时参数。而待完成和修订中的特性也可以通过特定的参数开启。编译器
编译器
有两个著名的编译器 Traceur Babel ,能将 ES6 代码编译成 ES5 代码,本次只介绍 Babel。Babel 从根本上讲是一个平台,这是它与 compile-to-JS 语言 CoffeeScript 和 TypeScript 最大的不同。Babel 的插件系统允许开发者自定义代码转换器并插入到编译过程。Babel 还能提升 JavaScript 的执行速度,在编译时进行性能优化。
网友评论