
1、简介
➤ ECMAScript是什么????
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实际上后两者是ECMA-262标准的实现和扩展。
➤ ECMAScript 5 、ECMAScript 6 和 ECMAScript 2015的关系?
ECMAScript 5是ECMAS在2009年推出的标准,简称ES5。 ECMAScript 6是ES5的升级,也被称为ECMAScript 2015,简称ES6。对javascript而言,ES6标准的推出无疑是一个里程碑。目前ES6基本成为业界标准,它的普及速度比 ES5 要快很多,主要原因是现代浏览器对 ES6 的支持友好。如 Chrome 和 Firefox 浏览器,已经支持 ES6 中绝大多数的特性。
ES6新特性
➤ 箭头(Arrows) 和 关键字(This)
箭头(Arrows)是一个函数的简写,使用括号包裹参数,跟随一个 =>,紧接着是函数体。这种写法类似c#、java8和CoffeeScript。支持表达式及语句体,与function不一样的是:=> 在其作用的代码块中能共享this对象,如果它嵌套在其他function中,它共享父函数的“variable”变量。
| 1 | // 可以跟表达式 | 
➤ 类(Classes)
在ES6中,类(classes)是面向对象模式的原型的一个简单的语法糖。用单一的方便的声明形式,使类模式更容易使用 ,类支持基于原型的继承(prototype-based inheritance)、超级调用(super calls)、实例(instance )、静态方法(static methods)和构造函数(constructors)。
| 1 | class SkinnedMesh extends THREE.Mesh { | 
extends 允许一个子类继承父类,需要注意的是,子类的 constructor 函数中需要执行 super() 函数。
当然,你也可以在子类方法中调用父类的方法,如 super.parentMethodName()。
=> 更详细见 这里
➤ 增强的对象字面量
对象字面量扩展了:构造器中设置prototype值、简写(如:foo: foo)、定义函数以及超级调用等功能,这种设计使得对象字面量与class声明更贴近。
| 1 | var obj = { | 
注意: __proto__属性需要native支持, 它是被之前的 ECMAScript版本废弃。绝大部分引擎都支持这个属性(其他见这里).
➤ 模板字符串 (Template Strings)
模板字符串提供了构建字符串的语法糖,这很类似于Perl/Python等语言的字符串插入特性。如下:
| 1 | // 基本的字符串 | 
➤ 解构(Destructuring)
解构允许用模式匹配绑定,支持数组和对象。解构类似于标准的对象查找foo["bar"],当找不到时会返回undefined. 可以避免在对象赋值时产生中间变量。
| 1 | // 列表匹配 | 
➤ Default + Rest + Spread 操作符
| 1 | function f(x, y=12) { | 
➤ let + const
let 是新的 var,let 允许创建块级作用域,ES6 推荐在函数中使用 let 定义变量,而非 var。 const 声明的常量类似于指针,它指向某个引用,也就是说这个「常量」并非一成不变的。
| 1 | 
 | 
有几个点需要注意:
- let关键词声明的变量不具备变量提升(hoisting)特性
- let和- const声明只在最靠近的一个块中(花括号内)有效
- 当使用常量 const 声明时,请使用大写变量,如:CAPITAL_CASING
- const在声明时必须被赋值
➤ for..of & for..in
for...of用于遍历一个迭代器,如数组:
| 1 | let nicknames = ['di', 'boo', 'punkeye']; | 
for...in 用来遍历对象中的属性:
| 1 | let nicknames = ['di', 'boo', 'punkeye']; | 
➤ 迭代器(Iterators)
迭代器允许每次访问数据集合的一个元素,当指针指向数据集合最后一个元素是,迭代器便会退出。它提供了 next() 函数来遍历一个序列,这个方法返回一个包含 done 和 value 属性的对象。
ES6 中可以通过 Symbol.iterator 给对象设置默认的遍历器,无论什么时候对象需要被遍历,执行它的 @@iterator 方法便可以返回一个用于获取值的迭代器。
数组默认就是一个迭代器:
| 1 | var arr = [11,12,13]; | 
➤ Generators
Generator 函数是 ES6 的新特性,它允许一个函数返回的可遍历对象生成多个值。
在使用中你会看到 * 语法和一个新的关键词 yield:
| 1 | function *infiniteNumbers() { | 
每次执行 yield 时,返回的值变为迭代器的下一个值。
➤ Promises
ES6 对 Promise 有了原生的支持,一个 Promise 是一个等待被异步执行的对象,当它执行完成后,其状态会变成 resolved 或者 rejected。
| 1 | var p = new Promise(function(resolve, reject) { | 
每一个 Promise 都有一个 .then 方法,这个方法接受两个参数,第一个是处理 resolved 状态的回调,一个是处理 rejected 状态的回调:
| 1 | p.then((val) => console.log("Promise Resolved", val), | 
➤ Unicode
es6 支持所有的unicode, 包括新的unicode形式和 正则u模式,以及新的api来处理字符串在21位代码。
| 1 | // same as ES5.1 | 
➤ Modules
es6在语言级别支持模块的组建声明。把流行的JavaScript模块加载器进行系统化模式(AMD, CommonJS)。运行时行为由host-defined定义默认加载程序,隐式异步模型——没有代码执行,直到请求模块是可用的和处理。
| 1 | // lib/math.js | 
| 1 | // app.js | 
| 1 | // otherApp.js | 
还有一些额外的特性包括export default 和 export *
| 1 | // lib/mathplusplus.js | 
| 1 | // app.js | 
➤ Map + Set + WeakMap + WeakSet
高效的数据结构,
| 1 | // Sets | 
➤ Symbol
Symbol 是一种新的数据类型,它的值是唯一的,不可变的。ES6 中提出 symbol 的目的是为了生成一个唯一的标识符,不过你访问不到这个标识符:
| 1 | var sym = Symbol( "some optional description" ); | 
注意,这里 Symbol 前面不能使用 new 操作符。
如果它被用作一个对象的属性,那么这个属性会是不可枚举的:
| 1 | var o = { | 
如果要获取对象 symbol 属性,需要使用 Object.getOwnPropertySymbols(o)。
➤ Math + Number + String + Object APIs
es6增加了新的库,包括核心的Math库,Array和Object.assign等
| 1 | Number.EPSILON |