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 |