From b17a970cd0189195f47b5ee8e6247a3115ff4b4c Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 23 Aug 2014 02:59:51 +0800 Subject: [PATCH 0001/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9function/=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 24 ++++++++++- docs/destructuring.md | 3 ++ docs/function.md | 93 ++++++++++++++++++++++++++++++++++++++++--- docs/reference.md | 1 + 4 files changed, 113 insertions(+), 8 deletions(-) diff --git a/docs/class.md b/docs/class.md index 870bf3ddd..b326790be 100644 --- a/docs/class.md +++ b/docs/class.md @@ -76,7 +76,7 @@ var firstName = 'David'; var lastName = 'Belle'; var year = 1973; -export {firstName, lastName, year} +export {firstName, lastName, year}; ``` @@ -132,7 +132,19 @@ console.log("圆面积:" + area(4)); console.log("圆周长:" + circumference(14)); ``` -上面写法是逐一指定要导入的方法。另一种写法是使用module关键字,整体导入。 + +上面写法是逐一指定要导入的方法。另一种写法是整体导入。 + +```javascript + +import * as circle from 'circle'; + +console.log("圆面积:" + circle.area(4)); +console.log("圆周长:" + circle.circumference(14)); + +``` + +module关键字可以取代import语句,达到整体输入模块的作用。 ```javascript @@ -177,6 +189,14 @@ customName(); // 'foo' 显然,一个模块只能有一个默认方法。 +如果想在一条import语句中,同时输入默认方法和指定名称的变量,可以写成下面这样。 + +```javascript + +import customName, { otherMethod } from './export-default'; + +``` + 如果要输出默认属性,只需将值跟在`export default`之后即可。 ```javascript diff --git a/docs/destructuring.md b/docs/destructuring.md index 3df12fdcd..3fd5e5e5d 100644 --- a/docs/destructuring.md +++ b/docs/destructuring.md @@ -145,6 +145,9 @@ y // "World" var { x = 3 } = {}; x // 3 +var {x, y = 5} = {x: 1}; +console.log(x, y) // 1, 5 + ``` 如果要将一个已经声明的变量用于解构赋值,必须非常小心。 diff --git a/docs/function.md b/docs/function.md index 8ba947efa..9fe50fd25 100644 --- a/docs/function.md +++ b/docs/function.md @@ -2,7 +2,56 @@ ## 函数参数的默认值 -ES6允许为函数的参数设置默认值。 +在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 + +```javascript + +function log(x, y) { + y = y || 'World'; + console.log(x, y); +} + +log('Hello') // Hello World +log('Hello', 'China') // Hello China +log('Hello', '') // Hello World + +``` + +上面代码检查函数log的参数y有没有赋值,如果没有,则指定默认值为World。这种写法的缺点在于,如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。就像上面代码的最后一行,参数y等于空字符,结果被改为默认值。 + +为了避免这个问题,通常需要先判断一下参数y是否被赋值,如果没有,再等于默认值。这有两种写法。 + +```javascript + +// 写法一 +if (typeof y === 'undefined') { + y = 'World'; +} + + +// 写法二 +if (arguments.length === 1) { + y = 'World'; +} + + +``` + +ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。 + +```javascript + +function log(x, y = 'World') { + console.log(x, y); +} + +log('Hello') // Hello World +log('Hello', 'China') // Hello China +log('Hello', '') // Hello + +``` + +可以看到,ES6的写法比ES5简洁许多,而且非常自然。下面是另一个例子。 ```javascript @@ -16,18 +65,16 @@ var p = new Point(); ``` -任何带有默认值的参数,被视为可选参数。不带默认值的参数,则被视为必需参数。 - 利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误。 ```javascript function throwIfMissing() { - throw new Error('Missing parameter'); - } + throw new Error('Missing parameter'); +} function foo(mustBeProvided = throwIfMissing()) { - return mustBeProvided; + return mustBeProvided; } foo() @@ -37,6 +84,40 @@ foo() 上面代码的foo函数,如果调用的时候没有参数,就会调用默认值throwIfMissing函数,从而抛出一个错误。 +从上面代码还可以看到,参数mustBeProvided的默认值等于throwIfMissing函数的运行结果(即函数名之后有一对圆括号),这表明参数的默认值不是在定义时执行,而是在运行时执行(即如果参数已经赋值,默认值中的函数就不会运行),这与python语言不一样。 + +另一个需要注意的地方是,参数默认值所处的作用域,不是全局作用域,而是函数作用域。 + +```javascript + +var x = 1; + +function foo(x, y = x) { + console.log(y); +} + +foo(2) // 2 + +``` + +上面代码中,参数y的默认值等于x,由于处在函数作用域,所以x等于参数x,而不是全局变量x。 + +参数默认值可以与解构赋值,联合起来使用。 + +```javascript + +function foo({x, y = 5}) { + console.log(x, y); +} + +foo({}) // undefined, 5 +foo({x: 1}) // 1, 5 +foo({x: 1, y: 2}) // 1, 2 + +``` + +上面代码中,foo函数的参数是一个对象,变量x和y用于解构赋值,y有默认值5。 + ## rest参数 ES6引入rest参数(...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中。 diff --git a/docs/reference.md b/docs/reference.md index 046e0b1e4..b27e1a35e 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -26,6 +26,7 @@ - Axel Rauschmayer, [ECMAScript 6’s new array methods](http://www.2ality.com/2014/05/es6-array-methods.html): 对ES6新增的数组方法的全面介绍 - Nicholas C. Zakas, [Creating defensive objects with ES6 proxies](http://www.nczonline.net/blog/2014/04/22/creating-defensive-objects-with-es6-proxies/) - Addy Osmani, [Data-binding Revolutions with Object.observe()](http://www.html5rocks.com/en/tutorials/es7/observe/): 介绍Object.observer()的概念 +- Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 ## Generator From 2e6377c9858b8a2c7fc475fa707bd775569a5772 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 24 Aug 2014 16:23:28 +0800 Subject: [PATCH 0002/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9function/=E7=AE=AD?= =?UTF-8?q?=E5=A4=B4=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/function.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/function.md b/docs/function.md index 9fe50fd25..0625d73ca 100644 --- a/docs/function.md +++ b/docs/function.md @@ -302,7 +302,7 @@ var result = values.sort((a, b) => a - b); - 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。 - 不可以使用arguments对象,该对象在函数体内不存在。 -关于this对象,下面的代码将它绑定定义时的对象。 +上面三点中,第一点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。下面的代码是一个例子,将this对象绑定定义时所在的对象。 ```javascript @@ -312,7 +312,7 @@ var handler = { init: function() { document.addEventListener("click", - event => this.doSomething(event.type), false); + event => this.doSomething(event.type), false); }, doSomething: function(type) { @@ -322,6 +322,8 @@ var handler = { ``` -上面代码的init方法中,使用了箭头函数,这导致this绑定handler对象。否则,doSomething方法内部的this对象就指向全局对象,运行时会报错。 +上面代码的init方法中,使用了箭头函数,这导致this绑定handler对象,否则回调函数运行时,this.doSomething这一行会报错,因为此时this指向全局对象。 由于this在箭头函数中被绑定,所以不能用call()、apply()、bind()这些方法去改变this的指向。 + +长期以来,JavaScript语言的this对象一直是一个令人头痛的问题,在对象方法中使用this,必须非常小心。箭头函数绑定this,很大程度上解决了这个困扰。 From 6c9921741534c4c5e848a04c8d390febde271dc0 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 24 Aug 2014 20:53:35 +0800 Subject: [PATCH 0003/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 8 +++++--- docs/reference.md | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/class.md b/docs/class.md index b326790be..93bcf1380 100644 --- a/docs/class.md +++ b/docs/class.md @@ -56,7 +56,7 @@ ES6实现了模块功能,试图解决JavaScript代码的依赖和部署上的 模块功能有两个关键字:export和import。export用于用户自定义模块,规定对外接口;import用于输入其他模块提供的功能,同时创造命名空间(namespace),防止函数名冲突。 -ES6允许将独立的JS文件作为模块,也就是说,允许一个JavaScript脚本文件调用另一个脚本文件。最简单的模块就是一个JS文件,里面使用export关键字输出变量。 +ES6允许将独立的JS文件作为模块,也就是说,允许一个JavaScript脚本文件调用另一个脚本文件。该文件内部的所有变量,外部无法获取,必须使用export关键字输出变量。下面是一个JS文件,里面使用export关键字输出变量。 ```javascript @@ -67,7 +67,7 @@ export var year = 1973; ``` -上面是profile.js,ES6将其视为一个模块,里面用export关键字输出了三个变量。export的写法,除了像上面这样,还有另外一种,两者是等价的。 +上面是profile.js文件,ES6将其视为一个模块,里面用export关键字输出了三个变量。export的写法,除了像上面这样,还有另外一种。 ```javascript @@ -80,7 +80,9 @@ export {firstName, lastName, year}; ``` -使用export定义模块以后,其他js文件就可以通过import关键字加载这个模块(文件)。 +上面代码在export关键字后,使用大括号输出一组变量,它与前一种写法是等价的。 + +使用export定义模块以后,其他JS文件就可以通过import关键字加载这个模块(文件)。 ```javascript diff --git a/docs/reference.md b/docs/reference.md index b27e1a35e..57e590d8f 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -53,3 +53,4 @@ - ES6 Module Loader, [ES6 Module Loader Polyfill](https://github.com/ModuleLoader/es6-module-loader): 在浏览器和node.js加载ES6模块的一个库,文档里对ES6模块有详细解释 - Paul Miller, [es6-shim](https://github.com/paulmillr/es6-shim): 一个针对老式浏览器,模拟ES6部分功能的垫片库(shim) - army8735, [Javascript Downcast](https://github.com/army8735/jsdc): 国产的ES6到ES5的转码器 +- esnext, [ES6 Module Transpiler](https://github.com/esnext/es6-module-transpiler):基于node.js的将ES6模块转为ES5代码的命令行工具 From 73d6abe31ae864fe291bc45fe9a78d2af6824062 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 24 Aug 2014 22:26:29 +0800 Subject: [PATCH 0004/1409] =?UTF-8?q?=E6=96=B0=E5=A2=9EWeakSet=E9=83=A8?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/reference.md | 1 + docs/set-map.md | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/docs/reference.md b/docs/reference.md index 57e590d8f..6cd535f9d 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -27,6 +27,7 @@ - Nicholas C. Zakas, [Creating defensive objects with ES6 proxies](http://www.nczonline.net/blog/2014/04/22/creating-defensive-objects-with-es6-proxies/) - Addy Osmani, [Data-binding Revolutions with Object.observe()](http://www.html5rocks.com/en/tutorials/es7/observe/): 介绍Object.observer()的概念 - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 +- Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 ## Generator diff --git a/docs/set-map.md b/docs/set-map.md index 782278a1b..33334426f 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -109,6 +109,60 @@ function dedupe(array) { ``` +## WeakSet + +WeakSet结构与Set类似,也是不重复的值的集合。但是,它与Set有两个区别。 + +首先,WeakSet的成员只能是对象,而不能是其他类型的值。其次,WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。 + +WeakSet是一个构造函数,可以使用new命令,创建WeakSet数据结构。 + +```javascript + +var ws = new WeakSet(); + +``` + +作为构造函数,WeakSet可以接受一个数组或类似数组的对象作为参数。(实际上,任何具有iterable接口的对象,都可以作为WeakSet的对象。)该数组的所有成员,都会自动成为WeakSet实例对象的成员。 + +```javascript + +var a = [[1,2], [3,4]]; + +var ws = new WeakSet(a); + +``` + +上面代码中,a是一个数组,它有两个成员,也都是数组。将a作为WeakSet构造函数的参数,a的成员会自动成为WeakSet的成员。 + +WeakSet结构有以下四个方法。 + +- **WeakSet.prototype.add(value)**:向WeakSet实例添加一个新成员。 +- **WeakSet.prototype.clear()**:清除WeakSet实例的所有成员。 +- **WeakSet.prototype.delete(value)**:清除WeakSet实例的指定成员。 +- **WeakSet.prototype.has(value)**:返回一个布尔值,表示某个值是否在WeakSet实例之中。 + +下面是一个例子。 + +```javascript + +var ws = new WeakSet(); +var obj = {}; +var foo = {}; + +ws.add(window); +ws.add(obj); + +ws.has(window); // true +ws.has(foo); // false + +ws.delete(window); +ws.has(window); // false + +ws.clear(); + +``` + ## Map **(1)基本用法** From ca867a9db4a651240d3121cee2a43bcc19b28233 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 26 Aug 2014 03:16:56 +0800 Subject: [PATCH 0005/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9Object/Symbol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/object.md | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/docs/object.md b/docs/object.md index d25ca38c1..0b6b8e56a 100644 --- a/docs/object.md +++ b/docs/object.md @@ -212,9 +212,7 @@ function f(w) { 上面代码中,w1、w2、w3三个变量都等于`Symbol()`,但是它们的值是不相等的。 -由于这种特点,Symbol类型适合作为标识符,用于对象的属性名,保证了属性名之间不会发生冲突。如果一个对象由多个模块构成,这样就不会出现同名的属性。 - -Symbol类型作为属性名,可以被遍历,Object.getOwnPropertySymbols()和Object.getOwnPropertyKeys()都可以获取该属性。 +由于这种特点,Symbol类型适合作为标识符,用于对象的属性名,保证了属性名之间不会发生冲突。如果一个对象由多个模块构成,这样就不会出现同名的属性。另一种用途是,可以防止属性值被不小心修改。 ```javascript @@ -228,7 +226,22 @@ Object.defineProperty(a, mySymbol, { value: 'Hello!' }); ``` -上面代码通过点结构和Object.defineProperty两种方法,为对象增加一个属性。 +上面代码通过方括号结构和Object.defineProperty两种方法,将对象的属性名指定为一个Symbol值。 + +注意,不能使用点结构,将Symbol值作为对象的属性名。 + +```javascript + +var a = {}; +var mySymbol = Symbol(); + +a.mySymbol = 'Hello!'; + +a[mySymbol] // undefined + +``` + +上面代码中,mySymbol属性的值为未定义,原因在于`a.mySymbol`这样的写法,并不是把一个Symbol值当作属性名,而是把mySymbol这个字符串当作属性名进行赋值,这是因为点结构中的属性名永远都是字符串。 下面的写法为Map结构添加了一个成员,但是该成员永远无法被引用。 @@ -256,9 +269,31 @@ obj[specialMethod](123); ``` +Symbol类型作为属性名,不会出现在for...in循环中,也不会被Object.getOwnPropertyNames方法返回,但是有一个对应的Object.getOwnPropertySymbols方法,以及Object.getOwnPropertyKeys方法都可以获取Symbol属性名。 + +```javascript + +var obj = {}; + +var foo = Symbol("foo"); + +Object.defineProperty(obj, foo, { + value: "foobar", +}); + +Object.getOwnPropertyNames(obj) +// [] + +Object.getOwnPropertySymbols(obj) +// [Symbol(foo)] + +``` + +上面代码中,使用Object.getOwnPropertyNames方法得不到Symbol属性名,需要使用Object.getOwnPropertySymbols方法。 + ## Proxy -所谓Proxy,可以理解成在目标对象之前,架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,可以被过滤和改写。 +所谓Proxy,可以理解成在目标对象之前,架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。 ES6原生提供Proxy构造函数,用来生成proxy实例对象。 @@ -276,7 +311,7 @@ proxy.title // 35 ``` -上面代码就是Proxy构造函数使用实例,它接受两个参数,第一个所要代理的目标对象(上例是一个空对象),第二个是拦截函数,它有一个get方法,用来拦截对目标对象的访问请求。get方法的两个参数分别是目标对象和所要访问的属性。可以看到,由于拦截函数总是返回35,所以访问任何属性都得到35。 +上面代码就是Proxy构造函数使用实例,它接受两个参数,第一个是所要代理的目标对象(上例是一个空对象),第二个是拦截函数,它有一个get方法,用来拦截对目标对象的访问请求。get方法的两个参数分别是目标对象和所要访问的属性。可以看到,由于拦截函数总是返回35,所以访问任何属性都得到35。 下面是另一个拦截函数的例子。 From d814b273c83ffce5d9841e61da8a654488b71947 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 26 Aug 2014 12:41:56 +0800 Subject: [PATCH 0006/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9Object/Proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/object.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/object.md b/docs/object.md index 0b6b8e56a..0ee089e9f 100644 --- a/docs/object.md +++ b/docs/object.md @@ -338,6 +338,38 @@ proxy.age // 抛出一个错误 上面代码表示,如果访问目标对象不存在的属性,会抛出一个错误。如果没有这个拦截函数,访问不存在的属性,只会返回undefined。 +除了取值函数get,Proxy还可以设置存值函数set,用来拦截某个属性的赋值行为。假定Person对象有一个age属性,该属性应该是一个不大于200的整数,那么可以使用Proxy对象保证age的属性值符合要求。 + +```javascript + +let validator = { + set: function(obj, prop, value) { + if (prop === 'age') { + if (!Number.isInteger(value)) { + throw new TypeError('The age is not an integer'); + } + if (value > 200) { + throw new RangeError('The age seems invalid'); + } + } + + // 对于age以外的属性,直接保存 + obj[prop] = value; + } +}; + +let person = new Proxy({}, validator); + +person.age = 100; + +person.age // 100 +person.age = 'young' // 报错 +person.age = 300 // 报错 + +``` + +上面代码中,由于设置了存值函数set,任何不符合要求的age属性赋值,都会抛出一个错误。 + ## Object.observe(),Object.unobserve() Object.observe方法用来监听对象的变化。一旦监听对象发生变化,就会触发回调函数。 From 08aa66f0216a17c76e2f9e69f9d0779d21eb2b4f Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 29 Aug 2014 01:51:37 +0800 Subject: [PATCH 0007/1409] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 29 ++++++++++++++++++++++++++++- docs/destructuring.md | 24 ++++++++++++++++++++---- docs/function.md | 2 ++ docs/generator.md | 25 +++++++++++++++++++++++++ docs/iterator.md | 6 +++++- docs/object.md | 21 ++++++++++++++++++--- docs/reference.md | 1 + docs/set-map.md | 4 +++- docs/string.md | 11 +++++++++++ 9 files changed, 113 insertions(+), 10 deletions(-) diff --git a/docs/class.md b/docs/class.md index 93bcf1380..6f099389a 100644 --- a/docs/class.md +++ b/docs/class.md @@ -2,7 +2,22 @@ ## Class -ES6引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。 +ES5通过构造函数,定义并生成新对象。下面是一个例子。 + +```javascript + +function Point(x,y){ + this.x = x; + this.y = y; +} + +Point.prototype.toString = function () { + return '('+this.x+', '+this.y+')'; +} + +``` + +ES6引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。上面的代码用“类”改写,就是下面这样。 ```javascript @@ -207,6 +222,18 @@ export default 42; ``` +export default也可以用来输出类。 + +```javascript + +// MyClass.js +export default class { ... } + +// main.js +import MyClass from 'MyClass' + +``` + ## 模块的继承 模块之间也可以继承。 diff --git a/docs/destructuring.md b/docs/destructuring.md index 3fd5e5e5d..20a0abaf4 100644 --- a/docs/destructuring.md +++ b/docs/destructuring.md @@ -51,10 +51,21 @@ var [foo] = 1; var [foo] = 'Hello'; var [foo] = false; var [foo] = NaN; +var [bar, foo] = [1]; ``` -以上几种情况都属于解构不成功,foo的值都会等于undefined。但是,如果对undefined或null进行解构,就会报错。 +以上几种情况都属于解构不成功,foo的值都会等于undefined。另一种情况是不完全解构。 + +```javascript + +var [x, y] = [1, 2, 3]; + +``` + +上面代码中,x和y可以顺利取到值。 + +如果对undefined或null进行解构,会报错。 ```javascript @@ -73,6 +84,9 @@ var [foo] = null; var [foo = true] = []; foo // true +[x, y='b'] = ['a'] // x=3, y='b' +[x, y='b'] = ['a', undefined] // x=3, y='b' + ``` 解构赋值不仅适用于var命令,也适用于let和const命令。 @@ -215,9 +229,11 @@ var { foo, bar } = example(); ```javascript -function f({x, y, z}) { - // ... -} +function f([x]) { ... } + +f(['a']) + +function f({x, y, z}) { ... } f({x:1, y:2, z:3}) diff --git a/docs/function.md b/docs/function.md index 0625d73ca..6487adf8f 100644 --- a/docs/function.md +++ b/docs/function.md @@ -186,6 +186,8 @@ add(...numbers) // 42 ``` +上面代码中,`array.push(...items)`和`add(...numbers)`这两行,都是函数的调用,它们的都使用了扩展运算符。该运算符将一个数组,变为参数序列。 + 扩展运算符可以简化求出一个数组最大元素的写法。 ```javascript diff --git a/docs/generator.md b/docs/generator.md index c3b25a23e..7e035c55f 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -74,6 +74,31 @@ setTimeout(function () { 上面代码中,只有调用next方法时,函数f才会执行。 +利用Generator函数,可以在任意对象上部署iterator接口。 + +```javascript + +function* iterEntries(obj) { + let keys = Object.keys(obj); + for (let i=0; i < keys.length; i++) { + let key = keys[i]; + yield [key, obj[key]]; + } +} + +let myObj = { foo: 3, bar: 7 }; + +for (let [key, value] of iterEntries(myObj)) { + console.log(key, value); +} + +// foo 3 +// bar 7 + +``` + +上述代码中,由于Generator函数返回一个具有iterator接口的对象,所以只要让yield语句每次返回一个参数对象的成员,就可以在任意对象上部署next方法。 + ## next方法的参数 yield语句本身没有返回值,或者说总是返回undefined。next方法可以带一个参数,该参数就会被当作上一个yield语句的返回值。 diff --git a/docs/iterator.md b/docs/iterator.md index 00029b0bc..ab210261b 100644 --- a/docs/iterator.md +++ b/docs/iterator.md @@ -54,6 +54,8 @@ it.next().value // '2' ``` +在ES6中,数组、类似数组的对象、Set和Map结构,都原生具备iterator接口,可以被for...of循环遍历。 + ## for...of循环 ES6中,一个对象只要部署了next方法,就被视为具有iterator接口,就可以用for...of循环遍历它的值。下面用上一节的idMaker函数生成的it遍历器作为例子。 @@ -91,6 +93,8 @@ for(let v of arr) { ``` +for...of循环完全可以取代数组实例的forEach方法。 + JavaScript原有的for...in循环,只能获得对象的键名,不能直接获取键值。ES6提供for...of循环,允许遍历获得键值。 ```javascript @@ -114,7 +118,7 @@ for (a of arr) { ``` -上面代码表明,for...in循环读取键名,for...of循环读取键值。 +上面代码表明,for...in循环读取键名,for...of循环读取键值。如果要通过for...of循环,获取数组的索引,可以借助数组实例的entries方法和keys方法,参见《数组的扩展》章节。 对于Set和Map结构的数据,可以直接使用for...of循环。 diff --git a/docs/object.md b/docs/object.md index 0ee089e9f..09dd214c9 100644 --- a/docs/object.md +++ b/docs/object.md @@ -52,11 +52,18 @@ __proto__属性,用来读取或设置当前对象的prototype对象。该属 ```javascript +// es6的写法 + var obj = { __proto__: someOtherObj, method: function() { ... } } +// es5的写法 + +var obj = Object.create(someOtherObj); +obj.method = function() { ... } + ``` 有了这个属性,实际上已经不需要通过Object.create()来生成新对象了。 @@ -260,15 +267,23 @@ a.size // 1 let specialMethod = Symbol(); let obj = { - [specialMethod]: function (arg) { - ... - } + [specialMethod]: function (arg) { ... } }; obj[specialMethod](123); ``` +采用增强的对象写法,上面代码的obj对象可以写得更简洁一些。 + +```javascript + +let obj = { + [specialMethod](arg) { ... } +}; + +``` + Symbol类型作为属性名,不会出现在for...in循环中,也不会被Object.getOwnPropertyNames方法返回,但是有一个对应的Object.getOwnPropertySymbols方法,以及Object.getOwnPropertyKeys方法都可以获取Symbol属性名。 ```javascript diff --git a/docs/reference.md b/docs/reference.md index 6cd535f9d..e0a009d32 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -16,6 +16,7 @@ - Ryan Dao, [Summary of ECMAScript 6 major features](http://ryandao.net/portal/content/summary-ecmascript-6-major-features) - Luke Hoban, [ES6 features](https://github.com/lukehoban/es6features) - Traceur-compiler, [Language Features](https://github.com/google/traceur-compiler/wiki/LanguageFeatures): Traceur文档列出的一些ES6例子 +- Axel Rauschmayer, [ECMAScript 6: what’s next for JavaScript?](https://speakerdeck.com/rauschma/ecmascript-6-whats-next-for-javascript-august-2014): 关于ES6新增语法的综合介绍,有很多例子 ## 语法点 diff --git a/docs/set-map.md b/docs/set-map.md index 33334426f..15cccda83 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -62,7 +62,7 @@ s.has(2) // false ``` -下面是一个对比,看看在判断是否包括一个键上面,对象和Set的写法不同。 +下面是一个对比,看看在判断是否包括一个键上面,对象结构和Set结构的写法不同。 ```javascript @@ -109,6 +109,8 @@ function dedupe(array) { ``` +Set的遍历,可以借助for...of循环完成,参见《Iterator和for...of循环》章节。 + ## WeakSet WeakSet结构与Set类似,也是不重复的值的集合。但是,它与Set有两个区别。 diff --git a/docs/string.md b/docs/string.md index 52e7fcab2..89b7ca888 100644 --- a/docs/string.md +++ b/docs/string.md @@ -247,3 +247,14 @@ console.log(`${ x } + ${ y } = ${ x + y}`) ``` 上面代码表示,在模板字符串中嵌入变量,需要将变量名写在${}之中。 + +模板字符串使得字符串与变量的结合,变得容易。下面是一个例子。 + +```javascript + +if (x > MAX) { + throw new Error(`Most ${MAX} allowed: ${x}!`); + // 传统写法为'Most '+MAX+' allowed: '+x+'!' +} + +``` From eea51491337850c7b26018350ce49db574818a93 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 8 Sep 2014 23:56:59 +0800 Subject: [PATCH 0008/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9string/codePointAt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/reference.md | 1 + docs/string.md | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/reference.md b/docs/reference.md index e0a009d32..062ebc841 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -29,6 +29,7 @@ - Addy Osmani, [Data-binding Revolutions with Object.observe()](http://www.html5rocks.com/en/tutorials/es7/observe/): 介绍Object.observer()的概念 - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 +- Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 ## Generator diff --git a/docs/string.md b/docs/string.md index 89b7ca888..f027f91bd 100644 --- a/docs/string.md +++ b/docs/string.md @@ -18,7 +18,7 @@ s.charCodeAt(1) // 57271 ``` -上面代码说明,对于4个字节储存的字符,JavaScript不能正确处理。字符串长度会误判为2,而且charAt方法无法读取字符,charCodeAt方法只能分别返回前两个字节和后两个字节的值。 +上面代码中,汉字“𠮷”的Unicode编号是0x20BB7,需要4个字节储存。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2,而且charAt方法无法读取字符,charCodeAt方法只能分别返回前两个字节和后两个字节的值。 ES6提供了codePointAt方法,能够正确处理4个字节储存的字符,返回一个字符的Unicode编号。 @@ -27,13 +27,15 @@ ES6提供了codePointAt方法,能够正确处理4个字节储存的字符, var s = "𠮷a"; s.codePointAt(0) // 134071 -s.codePointAt(1) // 97 +s.codePointAt(1) // 57271 s.charCodeAt(2) // 97 ``` -codePointAt方法的参数,是字符在字符串中的位置(从0开始)。上面代码表明,它会正确返回四字节的UTF-16字符的Unicode编号。对于那些两个字节储存的常规字符,它的返回结果与charCodeAt方法相同。 +codePointAt方法的参数,是字符在字符串中的位置(从0开始)。上面代码中,JavaScript将“𠮷a”视为三个字符,codePointAt方法在第一个字符上,正确地识别了“𠮷”,返回了它的十进制Unicode编号134071(即十六进制的20BB7)。在第二个字符(即“𠮷”的后两个字节)和第三个字符“a”上,codePointAt方法的结果与charCodeAt方法相同。 + +总之,codePointAt方法会正确返回四字节的UTF-16字符的Unicode编号。对于那些两个字节储存的常规字符,它的返回结果与charCodeAt方法相同。 codePointAt方法是测试一个字符由两个字节还是由四个字节组成的最简单方法。 From fc8815580ab47b0532d902cffeb6e70b2fe15ed9 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Fri, 12 Sep 2014 10:20:15 +0800 Subject: [PATCH 0009/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/string.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/string.md b/docs/string.md index f027f91bd..1b59e2ed5 100644 --- a/docs/string.md +++ b/docs/string.md @@ -18,7 +18,7 @@ s.charCodeAt(1) // 57271 ``` -上面代码中,汉字“𠮷”的Unicode编号是0x20BB7,需要4个字节储存。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2,而且charAt方法无法读取字符,charCodeAt方法只能分别返回前两个字节和后两个字节的值。 +上面代码中,汉字“𠮷”的Unicode编号是0x20BB7,UTF-16编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节储存。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2,而且charAt方法无法读取字符,charCodeAt方法只能分别返回前两个字节和后两个字节的值。 ES6提供了codePointAt方法,能够正确处理4个字节储存的字符,返回一个字符的Unicode编号。 From d15bfa96a8351e3e438c86ef92fe30c5aa6fc9b9 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 15 Sep 2014 22:24:08 +0800 Subject: [PATCH 0010/1409] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=B4=AD=E4=B9=B0?= =?UTF-8?q?=E7=BA=B8=E4=B9=A6=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- images/copyright.png | Bin 0 -> 64857 bytes images/cover.jpg | Bin 41817 -> 234459 bytes images/cover_thumbnail.jpg | Bin 10696 -> 11348 bytes images/page1.png | Bin 0 -> 59479 bytes images/page2.png | Bin 0 -> 55075 bytes 6 files changed, 1 insertion(+), 1 deletion(-) create mode 100755 images/copyright.png create mode 100755 images/page1.png create mode 100755 images/page2.png diff --git a/README.md b/README.md index 0f686a6be..2ec6b41d4 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 本书为中级难度,适合已有一定JavaScript语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。 -网上为预览版,电子工业出版社不久将出版全书。 +网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。恳请大家购买,支持开源项目,让出版社别亏钱(网上购买:[亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/),[京东](http://item.jd.com/11526272.html),[当当](http://product.dangdang.com/23546442.html),[China-pub](http://product.china-pub.com/4284817))。 ### 版权许可 diff --git a/images/copyright.png b/images/copyright.png new file mode 100755 index 0000000000000000000000000000000000000000..9bd7893cf8424f98d51ea2a6a485c6cb58b65222 GIT binary patch literal 64857 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 literal 0 HcmV?d00001 diff --git a/images/cover.jpg b/images/cover.jpg index 361762884443f6e925f6b8df3802e21629649eb7..38d6c1bdec2e017f90af0352b4f4a0afba9c7c96 100755 GIT binary patch literal 234459 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®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 literal 41817 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 diff --git a/images/cover_thumbnail.jpg b/images/cover_thumbnail.jpg index f4a93c52bc5707c2619b85c411b476b79e44262e..02e4c8decfd5ee8ac09a928b99f0effded871bb1 100755 GIT binary patch delta 10764 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 delta 10076 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�hM_) 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 Date: Mon, 15 Sep 2014 22:29:19 +0800 Subject: [PATCH 0011/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ec6b41d4..0d250b2f8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 本书为中级难度,适合已有一定JavaScript语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。 -网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。恳请大家购买,支持开源项目,让出版社别亏钱(网上购买:[亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/),[京东](http://item.jd.com/11526272.html),[当当](http://product.dangdang.com/23546442.html),[China-pub](http://product.china-pub.com/4284817))。 +网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。希望大家购买,支持开源项目,要是出版社亏钱,我就没机会出版下一本书了(网上购买:[亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/),[京东](http://item.jd.com/11526272.html),[当当](http://product.dangdang.com/23546442.html),[China-pub](http://product.china-pub.com/4284817))。 ### 版权许可 From cd3f0013e73238b510d2fc4053ff3ddc7f644889 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 15 Sep 2014 22:39:11 +0800 Subject: [PATCH 0012/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d250b2f8..19471e5f8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,14 @@ 本书为中级难度,适合已有一定JavaScript语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。 -网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。希望大家购买,支持开源项目,要是出版社亏钱,我就没机会出版下一本书了(网上购买:[亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/),[京东](http://item.jd.com/11526272.html),[当当](http://product.dangdang.com/23546442.html),[China-pub](http://product.china-pub.com/4284817))。 +网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。希望大家购买,支持开源项目,要是出版社亏钱,我就没机会出版下一本书了。 + +### 网上购买 + +- [亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/) +- [京东](http://item.jd.com/11526272.html) +- [当当](http://product.dangdang.com/23546442.html) +- [China-pub](http://product.china-pub.com/4284817)) ### 版权许可 From ca22b8caa8d54c68a20ee2904f75789ae409a04b Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 15 Sep 2014 22:41:55 +0800 Subject: [PATCH 0013/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 19471e5f8..e6ea0c591 100644 --- a/README.md +++ b/README.md @@ -8,14 +8,12 @@ 本书为中级难度,适合已有一定JavaScript语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。 -网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。希望大家购买,支持开源项目,要是出版社亏钱,我就没机会出版下一本书了。 - -### 网上购买 +网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。希望大家购买,支持开源项目。 - [亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/) - [京东](http://item.jd.com/11526272.html) - [当当](http://product.dangdang.com/23546442.html) -- [China-pub](http://product.china-pub.com/4284817)) +- [China-pub](http://product.china-pub.com/4284817) ### 版权许可 From 072774174b674c9827a3ad30fc18341d4dd78d2c Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 15 Sep 2014 22:42:36 +0800 Subject: [PATCH 0014/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e6ea0c591..2e8ff1d65 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 本书为中级难度,适合已有一定JavaScript语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。 -网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。希望大家购买,支持开源项目。 +网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。希望大家购买,支持开源项目,要是出版社亏钱,我就没机会出版下一本书了。 - [亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/) - [京东](http://item.jd.com/11526272.html) From b206d4a3400ecf1335ca8a4a5538d1bffb27c125 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 16 Sep 2014 21:21:02 +0800 Subject: [PATCH 0015/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2e8ff1d65..ea96b570f 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 本书为中级难度,适合已有一定JavaScript语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。 -网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。希望大家购买,支持开源项目,要是出版社亏钱,我就没机会出版下一本书了。 +网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。欢迎大家购买,支持开源项目。 - [亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/) - [京东](http://item.jd.com/11526272.html) From 515ba70a9955e3553ceb595b5c0e9d6f45b4dd52 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 17 Sep 2014 21:52:02 +0800 Subject: [PATCH 0016/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ea96b570f..f160c9128 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 本书为中级难度,适合已有一定JavaScript语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。 -网上为预览版,全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。欢迎大家购买,支持开源项目。 +全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。欢迎大家购买,支持开源项目。 - [亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/) - [京东](http://item.jd.com/11526272.html) From 8f9b3bd02ed8148617ae4c03be45d23a467e53de Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 22 Sep 2014 09:39:04 +0800 Subject: [PATCH 0017/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9object/observe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/intro.md | 2 +- docs/object.md | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/docs/intro.md b/docs/intro.md index c012b90bf..f454d6cbe 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -1,6 +1,6 @@ # ECMAScript 6简介 -ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,正处在快速开发之中,大部分已经完成了,预计将在2014年底正式发布。Mozilla将在这个标准的基础上,推出JavaScript 2.0。 +ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,正处在快速开发之中,大部分已经完成了,预计将在2015年6月正式发布。Mozilla公司将在这个标准的基础上,推出JavaScript 2.0。 ES6的目标,是使得JavaScript语言可以用来编写大型的复杂的应用程序,成为企业级开发语言。 diff --git a/docs/object.md b/docs/object.md index 09dd214c9..9630cdd92 100644 --- a/docs/object.md +++ b/docs/object.md @@ -387,7 +387,7 @@ person.age = 300 // 报错 ## Object.observe(),Object.unobserve() -Object.observe方法用来监听对象的变化。一旦监听对象发生变化,就会触发回调函数。 +Object.observe方法用来监听对象(以及数组)的变化。一旦监听对象发生变化,就会触发回调函数。 ```javascript @@ -408,7 +408,27 @@ Object.observe(o, observer); 上面代码中,Object.observe方法监听一个空对象o,一旦o发生变化(比如新增或删除一个属性),就会触发回调函数。 -Object.observe方法指定的回调函数,接受一个数组(changes)作为参数。该数组的成员与对象的变化一一对应,也就是说,对象发生多少个变化,该数组就有多少个成员。每个成员是一个对象(change),它的name属性表示发生变化源对象的属性名,oldValue属性表示发生变化前的值,object属性指向变动后的源对象,type属性表示变化的种类,目前共支持六种变化:add、update、delete、setPrototype、reconfigure(属性的attributes对象发生变化)、preventExtensions(当一个对象变得不可扩展时,也就不必再观察了)。 +Object.observe方法指定的回调函数,接受一个数组(changes)作为参数。该数组的成员与对象的变化一一对应,也就是说,对象发生多少个变化,该数组就有多少个成员。每个成员是一个对象(change),它的name属性表示发生变化源对象的属性名,oldValue属性表示发生变化前的值,object属性指向变动后的源对象,type属性表示变化的种类。基本上,change对象是下面的样子。 + +```javascript + +var change = { + object: {...}, + type: 'update', + name: 'p2', + oldValue: 'Property 2' +} + +``` + +Object.observe方法目前共支持监听六种变化。 + +- add:添加属性 +- update:属性值的变化 +- delete:删除属性 +- setPrototype:设置原型 +- reconfigure:属性的attributes对象发生变化 +- preventExtensions:对象被禁止扩展(当一个对象变得不可扩展时,也就不必再监听了) Object.observe方法还可以接受第三个参数,用来指定监听的事件种类。 From 9d3cc774bc1947b550b060b1f64adfb61495422c Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 24 Sep 2014 18:58:13 +0800 Subject: [PATCH 0018/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9destructuring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/destructuring.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/destructuring.md b/docs/destructuring.md index 20a0abaf4..c7bb98420 100644 --- a/docs/destructuring.md +++ b/docs/destructuring.md @@ -84,8 +84,8 @@ var [foo] = null; var [foo = true] = []; foo // true -[x, y='b'] = ['a'] // x=3, y='b' -[x, y='b'] = ['a', undefined] // x=3, y='b' +[x, y='b'] = ['a'] // x='a', y='b' +[x, y='b'] = ['a', undefined] // x='a', y='b' ``` From 4bba9a0a71c17e0c59b856a15df735ca1a63e44f Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 5 Oct 2014 19:17:48 +0800 Subject: [PATCH 0019/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++ docs/reference.md | 1 + 2 files changed, 67 insertions(+) diff --git a/docs/generator.md b/docs/generator.md index 7e035c55f..36bd4c014 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -122,6 +122,29 @@ g.next(true) // { value: 0, done: false } 上面代码先定义了一个可以无限运行的Generator函数f,如果next方法没有参数,每次运行到yield语句,变量reset的值总是undefined。当next方法带一个参数true时,当前的变量reset就被重置为这个参数(即true),因此i会等于-1,下一轮循环就会从-1开始递增。 +再看一个例子。 + +```javascript + +function* foo(x) { + var y = 2 * (yield (x + 1)); + var z = yield (y / 3); + return (x + y + z); +} + +var it = foo(5); + +it.next() +// { value:6, done:false } +it.next(12) +// { value:8, done:false } +it.next(13) +// { value:42, done:true } + +``` + +上面代码第一次调用next方法时,返回`x+1`的值6;第二次调用next方法,将上一次yield语句的值设为12,因此y等于24,返回`y / 3`的值8;第三次调用next方法,将上一次yield语句的值设为13,因此z等于13,这时x等于5,y等于24,所以return语句的值等于42。 + 注意,由于next方法的参数表示上一个yield语句的返回值,所以第一次使用next方法时,不能带有参数。V8引擎直接忽略第一次使用next方法时的参数,只有从第二次使用next方法开始,参数才是有效的。 ## 异步操作的应用 @@ -146,6 +169,29 @@ loader.next() 上面代码表示,第一次调用loadUI函数时,该函数不会执行,仅返回一个遍历器。下一次对该遍历器调用next方法,则会显示Loading界面,并且异步加载数据。等到数据加载完成,再一次使用next方法,则会隐藏Loading界面。可以看到,这种写法的好处是所有Loading界面的逻辑,都被封装在一个函数,按部就班非常清晰。 +Ajax是典型的异步操作,通过Generator函数部署Ajax操作,可以用同步的方式表达。 + +```javascript + +function* main() { + var result = yield request("http://some.url"); + var resp = JSON.parse(result); + console.log(resp.value); +} + +function request(url) { + makeAjaxCall(url, function(response){ + it.next(response); + }); +} + +var it = main(); +it.next(); + +``` + +上面代码的main函数,就是通过Ajax操作获取数据。可以看到,除了多了一个yield,它几乎与同步操作的写法完全一样。注意,makeAjaxCall函数中的next方法,必须加上response参数,因为yield语句构成的表达式,本身是没有值的,总是等于undefined。 + 下面是另一个例子,通过Generator函数逐行读取文本文件。 ```javascript @@ -218,6 +264,26 @@ function* f(){ for...of循环可以自动遍历Generator函数,且此时不再需要调用next方法。 +```javascript + +function *foo() { + yield 1; + yield 2; + yield 3; + yield 4; + yield 5; + return 6; +} + +for (var v of foo()) { + console.log(v); +} +// 1 2 3 4 5 + +``` + +上面代码使用for...of循环,依次显示5个yield语句的值。这里需要注意,一旦next方法的返回对象的done属性为true,for...of循环就会中止,且不包含该返回对象,所以上面代码的return语句返回的6,不包括在for...of循环之中。 + 下面是一个利用generator函数和for...of循环,实现斐波那契数列的例子。 ```javascript diff --git a/docs/reference.md b/docs/reference.md index 062ebc841..1d7172b29 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -40,6 +40,7 @@ - Marc Harter, [Generators in Node.js: Common Misconceptions and Three Good Use Cases](http://strongloop.com/strongblog/how-to-generators-node-js-yield-use-cases/): 讨论Generator函数的作用 - Axel Rauschmayer, [Iterators and generators in ECMAScript 6](http://www.2ality.com/2013/06/iterators-generators.html): 探讨Iterator和Generator的设计目的 - StackOverflow, [ES6 yield : what happens to the arguments of the first call next()?](http://stackoverflow.com/questions/20977379/es6-yield-what-happens-to-the-arguments-of-the-first-call-next): 第一次使用next方法时不能带有参数 +- Kyle Simpson, [ES6 Generators: Complete Series]: 由浅入深探讨Generator的系列文章,共四篇 ## Promise对象 From 032e950fdd691c57bfa7dc97cf940a6af78d8555 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Mon, 6 Oct 2014 14:52:05 +0800 Subject: [PATCH 0020/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9promise?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/promise.md | 98 ++++++++++++++++++++++++++++++++++++++--------- docs/reference.md | 3 +- 3 files changed, 82 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index f160c9128..f914c4159 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,9 @@ 全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。欢迎大家购买,支持开源项目。 -- [亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/) - [京东](http://item.jd.com/11526272.html) - [当当](http://product.dangdang.com/23546442.html) +- [亚马逊](http://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/B00MQKRLD6/) - [China-pub](http://product.china-pub.com/4284817) ### 版权许可 diff --git a/docs/promise.md b/docs/promise.md index a2d521ae0..4a274eb38 100644 --- a/docs/promise.md +++ b/docs/promise.md @@ -60,13 +60,11 @@ var getJSON = function(url) { client.send(); function handler() { - if (this.readyState === this.DONE) { - if (this.status === 200) { - resolve(this.response); - } else { - reject(this); - } - } + if (this.status === 200) { + resolve(this.response); + } else { + reject(new Error(this.statusText)); + } }; }); @@ -74,16 +72,33 @@ var getJSON = function(url) { }; getJSON("/posts.json").then(function(json) { - // continue + console.log('Contents: ' + value); }, function(error) { - // handle errors + console.error('出错了', reason); }); ``` -## 链式操作 +上面代码中,resolve方法和reject方法调用时,都带有参数。它们的参数会被传递给回调函数。reject方法的参数通常是Error对象的实例,而resolve方法的参数除了正常的值以外,还可能是另一个Promise实例,比如像下面这样。 -then方法返回的是一个新的Promise对象,因此可以采用链式写法。 +```javascript + +var p1 = new Promise(function(resolve, reject){ + // ... some code +}); + +var p2 = new Promise(function(resolve, reject){ + // ... some code + resolve(p1); +}) + +``` + +上面代码中,p1和p2都是Promise的实例,但是p2的resolve方法将p1作为参数,这时p1的状态就会传递给p2。如果调用的时候,p1的状态是pending,那么p2的回调函数就会等待p1的状态改变;如果p1的状态已经是fulfilled或者rejected,那么p2的回调函数将会立刻执行。 + +## Promise.prototype.then方法:链式操作 + +Promise.prototype.then方法返回的是一个新的Promise对象,因此可以采用链式写法。 ```javascript @@ -111,9 +126,9 @@ getJSON("/post/1.json").then(function(post) { 这种设计使得嵌套的异步操作,可以被很容易得改写,从回调函数的“横向发展”改为“向下发展”。 -## catch方法:捕捉错误 +## Promise.prototype.catch方法:捕捉错误 -catch方法是then(null, rejection)的别名,用于指定发生错误时的回调函数。 +Promise.prototype.catch方法是Promise.prototype.then(null, rejection)的别名,用于指定发生错误时的回调函数。 ```javascript @@ -126,7 +141,7 @@ getJSON("/posts.json").then(function(posts) { ``` -Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。 +Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。 ```javascript @@ -140,9 +155,25 @@ getJSON("/post/1.json").then(function(post) { ``` -## Promise.all方法 +## Promise.all方法,Promise.race方法 + +Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例。 + +```javascript + +var p = Promise.all([p1,p2,p3]); + +``` + +上面代码中,Promise.all方法接受一个数组作为参数,p1、p2、p3都是Promise对象的实例。(Promise.all方法的参数不一定是数组,但是必须具有iterator接口,且返回的每个成员都是Promise实例。) + +p的状态由p1、p2、p3决定,分成两种情况。 + +(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。 + +(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。 -Promise.all方法用于将多个异步操作(或Promise对象),包装成一个新的Promise对象。当这些异步操作都完成后,新的Promise对象的状态才会变为fulfilled;只要其中一个异步操作失败,新的Promise对象的状态就会变为rejected。 +下面是一个具体的例子。 ```javascript @@ -159,7 +190,19 @@ Promise.all(promises).then(function(posts) { ``` -## Promise.resolve方法 +Promise.race方法同样是将多个Promise实例,包装成一个新的Promise实例。 + +```javascript + +var p = Promise.race([p1,p2,p3]); + +``` + +上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的Promise实例的返回值,就传递给p的返回值。 + +如果Promise.all方法和Promise.race方法的参数,不是Promise实例,就会先调用下面讲到的Promise.resolve方法,将参数转为Promise实例,再进一步处理。 + +## Promise.resolve方法,Promise.reject方法 有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用。 @@ -171,7 +214,7 @@ var jsPromise = Promise.resolve($.ajax('/whatever.json')); 上面代码将jQuery生成deferred对象,转为一个新的ES6的Promise对象。 -如果Promise.resolve方法的参数,不是具有then方法的对象(又称thenable对象),则返回一个新的Promise对象,且它的状态为resolved。 +如果Promise.resolve方法的参数,不是具有then方法的对象(又称thenable对象),则返回一个新的Promise对象,且它的状态为fulfilled。 ```javascript @@ -184,7 +227,24 @@ p.then(function (s){ ``` -上面代码生成一个新的Promise对象,它的状态为fulfilled,所以回调函数会立即执行,Promise.resolve方法的参数就是回调函数的参数。 +上面代码生成一个新的Promise对象的实例p,它的状态为fulfilled,所以回调函数会立即执行,Promise.resolve方法的参数就是回调函数的参数。 + +如果Promise.resolve方法的参数是一个Promise对象的实例,则会被原封不动地返回。 + +Promise.reject(reason)方法也会返回一个新的Promise实例,该实例的状态为rejected。Promise.reject方法的参数reason,会被传递给实例的回调函数。 + +```javascript + +var p = Promise.reject('出错了'); + +p.then(null, function (s){ + console.log(s) +}); +// 出错了 + +``` + +上面代码生成一个Promise对象的实例p,状态为rejected,回调函数会立即执行。 ## async函数 diff --git a/docs/reference.md b/docs/reference.md index 1d7172b29..8a868b928 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -40,7 +40,7 @@ - Marc Harter, [Generators in Node.js: Common Misconceptions and Three Good Use Cases](http://strongloop.com/strongblog/how-to-generators-node-js-yield-use-cases/): 讨论Generator函数的作用 - Axel Rauschmayer, [Iterators and generators in ECMAScript 6](http://www.2ality.com/2013/06/iterators-generators.html): 探讨Iterator和Generator的设计目的 - StackOverflow, [ES6 yield : what happens to the arguments of the first call next()?](http://stackoverflow.com/questions/20977379/es6-yield-what-happens-to-the-arguments-of-the-first-call-next): 第一次使用next方法时不能带有参数 -- Kyle Simpson, [ES6 Generators: Complete Series]: 由浅入深探讨Generator的系列文章,共四篇 +- Kyle Simpson, [ES6 Generators: Complete Series](http://davidwalsh.name/es6-generators): 由浅入深探讨Generator的系列文章,共四篇 ## Promise对象 @@ -48,6 +48,7 @@ - Tilde, [rsvp.js](https://github.com/tildeio/rsvp.js) - Sandeep Panda, [An Overview of JavaScript Promises](http://www.sitepoint.com/overview-javascript-promises/): ES6 Promise入门介绍 - Jafar Husain, [Async Generators](https://docs.google.com/file/d/0B4PVbLpUIdzoMDR5dWstRllXblU/view?sle=true): 对async与Generator混合使用的一些讨论 +- Axel Rauschmayer, [ECMAScript 6 promises (2/2): the API](http://www.2ality.com/2014/10/es6-promises-api.html): 对ES6 Promise规格和用法的详细介绍 ## 工具 From ace860f2638347f58f1267e478f4235ff5e619f6 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 7 Oct 2014 09:13:33 +0800 Subject: [PATCH 0021/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 12 ++++++++++-- docs/intro.md | 17 +++++++++-------- docs/reference.md | 1 + 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/docs/class.md b/docs/class.md index 6f099389a..a723fe581 100644 --- a/docs/class.md +++ b/docs/class.md @@ -40,12 +40,20 @@ point.toString() // (2, 3) ``` -上面代码定义了一个“类”,可以看到里面有一个constructor函数,这就是构造函数。而this关键字则代表实例对象。 +上面代码定义了一个“类”,可以看到里面有一个constructor函数,这就是构造函数,而this关键字则代表实例对象。这个类除了构造方法,还定义了一个toString方法。注意,定义方法的时候,前面不需要加上function这个保留字,直接把函数定义放进去了就可以了。 Class之间可以通过extends关键字,实现继承。 ```javascript +class ColorPoint extends Point {} + +``` + +上面代码定义了一个ColorPoint类,该类通过extends关键字,继承了Point类的所有属性和方法。但是由于没有部署任何代码,所以这两个类完全一样,等于复制了一个Point类。下面,我们在ColorPoint内部加上代码。 + +```javascript + class ColorPoint extends Point { constructor(x, y, color) { @@ -61,7 +69,7 @@ class ColorPoint extends Point { ``` -上面代码定义了一个ColorPoint类,该类通过extends关键字,继承了Point类的所有属性和方法。在constructor方法内,super就指代父类Point;在toString方法内,`super()`表示对父类求值,由于此处需要字符串,所以会自动调用父类的toString方法。 +上面代码中,constructor方法和toString方法之中,都出现了super关键字,它指代父类的同名方法。在constructor方法内,super指代父类的constructor方法;在toString方法内,super指代父类的toString方法。 ## Module的基本用法 diff --git a/docs/intro.md b/docs/intro.md index f454d6cbe..53cb1fe63 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -44,9 +44,9 @@ Node.js的0.11版还不是稳定版本,要使用版本管理工具[nvm](https: ```bash -source nvm.sh -nvm use 0.11 -node --harmony +$ source nvm.sh +$ nvm use 0.11 +$ node --harmony ``` @@ -55,6 +55,7 @@ node --harmony ```bash $ node --v8-options | grep harmony + --harmony_typeof --harmony_scoping --harmony_modules @@ -74,7 +75,7 @@ $ node --v8-options | grep harmony ## Traceur编译器 -Google公司的[Traceur](https://github.com/google/traceur-compiler)编译器,可以将ES6代码编译为ES5代码。 +Google公司的[Traceur](https://github.com/google/traceur-compiler)编译器,可以将ES6代码编译为ES5代码。这意味着,你可以用ES6的方式编写程序,又不用担心浏览器是否支持。 它有多种使用方式。 @@ -173,7 +174,7 @@ $traceurRuntime.ModuleStore.getAnonymousModule(function() { ```bash -npm install -g traceur +$ npm install -g traceur ``` @@ -189,11 +190,11 @@ Calc constructor ``` -如果要将ES6脚本转为ES5,要采用下面的写法 +如果要将ES6脚本转为ES5保存,要采用下面的写法 ```bash -traceur --script calc.es6.js --out calc.es5.js +$ traceur --script calc.es6.js --out calc.es5.js ``` @@ -203,7 +204,7 @@ traceur --script calc.es6.js --out calc.es5.js ```bash -traceur --script calc.es6.js --out calc.es5.js --experimental +$ traceur --script calc.es6.js --out calc.es5.js --experimental ``` diff --git a/docs/reference.md b/docs/reference.md index 8a868b928..95e9d151a 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -30,6 +30,7 @@ - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 - Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 +- Jack Franklin, [An introduction to ES6 classes](http://javascriptplayground.com/blog/2014/07/introduction-to-es6-classes-tutorial/): ES6 class的入门介绍 ## Generator From ed7deeb70ce1483860c24e48527514268580af12 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 11 Oct 2014 12:59:31 +0800 Subject: [PATCH 0022/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 80 +++++++++++++++++++++++++++++++++++++++++++++++ docs/reference.md | 2 ++ 2 files changed, 82 insertions(+) diff --git a/docs/generator.md b/docs/generator.md index 36bd4c014..b961e7931 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -305,6 +305,86 @@ for (n of fibonacci()) { 从上面代码可见,使用for...of语句时不需要使用next方法。 +## throw方法 + +Generator函数还有一个特点,它可以在函数体外抛出错误,然后在函数体内捕获。 + +```javascript + +var g = function* () { + while (true) { + try { + yield; + } catch (e) { + if (e != 'a') { + throw e; + } + console.log('内部捕获', e); + } + } +}; + +var i = g(); +i.next(); + +try { + i.throw('a'); + i.throw('b'); +} catch (e) { + console.log('外部捕获', e); +} +// 内部捕获 a +// 外部捕获 b + +``` + +上面代码中,遍历器i连续抛出两个错误。第一个错误被Generator函数体内的catch捕获,然后Generator函数执行完成,于是第二个错误被函数体外的catch捕获。 + +这种函数体内捕获错误的机制,大大方便了对错误的处理。如果使用回调函数的写法,想要捕获多个错误,就不得不为每个函数写一个错误处理语句。 + +```javascript + +foo('a', function (a) { + if (a.error) { + throw new Error(a.error); + } + + foo('b', function (b) { + if (b.error) { + throw new Error(b.error); + } + + foo('c', function (c) { + if (c.error) { + throw new Error(c.error); + } + + console.log(a, b, c); + }); + }); +}); + +``` + +使用Generator函数可以大大简化上面的代码。 + +```javascript + +function* g(){ + try { + var a = yield foo('a'); + var b = yield foo('b'); + var c = yield foo('c'); + } catch (e) { + console.log(e); + } + + console.log(a, b, c); + +} + +``` + ## yield*语句 如果yield命令后面跟的是一个遍历器,需要在yield命令后面加上星号,表明它返回的是一个遍历器。这被称为yield*语句。 diff --git a/docs/reference.md b/docs/reference.md index 95e9d151a..6834b89be 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -42,6 +42,7 @@ - Axel Rauschmayer, [Iterators and generators in ECMAScript 6](http://www.2ality.com/2013/06/iterators-generators.html): 探讨Iterator和Generator的设计目的 - StackOverflow, [ES6 yield : what happens to the arguments of the first call next()?](http://stackoverflow.com/questions/20977379/es6-yield-what-happens-to-the-arguments-of-the-first-call-next): 第一次使用next方法时不能带有参数 - Kyle Simpson, [ES6 Generators: Complete Series](http://davidwalsh.name/es6-generators): 由浅入深探讨Generator的系列文章,共四篇 +- Gajus Kuizinas, [The Definitive Guide to the JavaScript Generators](http://gajus.com/blog/2/the-definetive-guide-to-the-javascript-generators): 对Generator的综合介绍 ## Promise对象 @@ -60,3 +61,4 @@ - Paul Miller, [es6-shim](https://github.com/paulmillr/es6-shim): 一个针对老式浏览器,模拟ES6部分功能的垫片库(shim) - army8735, [Javascript Downcast](https://github.com/army8735/jsdc): 国产的ES6到ES5的转码器 - esnext, [ES6 Module Transpiler](https://github.com/esnext/es6-module-transpiler):基于node.js的将ES6模块转为ES5代码的命令行工具 +- Sebastian McKenzie, [6to5](https://github.com/sebmck/6to5): 将ES6转为ES5代码的Node模块,支持source map From 72b6fdeb73e1642d667279e829a3011ebf65bd8e Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 12 Oct 2014 12:27:21 +0800 Subject: [PATCH 0023/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9let?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 2 +- docs/let.md | 14 ++++++++++++++ docs/reference.md | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/generator.md b/docs/generator.md index b961e7931..e3c72aba8 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -412,7 +412,7 @@ for(let value of delegatingIterator) { ``` -上面代码中,delegatingIterator是代理者,delegatedIterator是被代理者。由于`yield* delegatedIterator`语句得到的值,是一个遍历器,所以要用星号表示。 +上面代码中,delegatingIterator是代理者,delegatedIterator是被代理者。由于`yield* delegatedIterator`语句得到的值,是一个遍历器,所以要用星号表示。运行结果就是使用一个遍历器,遍历了多个Genertor函数,有递归的效果。 下面是一个稍微复杂的例子,使用yield*语句遍历完全二叉树。 diff --git a/docs/let.md b/docs/let.md index 6acf55374..237a3dffa 100644 --- a/docs/let.md +++ b/docs/let.md @@ -18,6 +18,20 @@ b //1 上面代码在代码块之中,分别用let和var声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。 +for循环的计数器,就很合适使用let命令。 + +```javascript + +for(let i = 0; i < arr.length; i++){} + +console.log(i) +//ReferenceError: i is not defined + + +``` + +上面代码的计数器i,只在for循环体内有效。 + 下面的代码如果使用var,最后输出的是9。 ```javascript diff --git a/docs/reference.md b/docs/reference.md index 6834b89be..11219ff0b 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -10,6 +10,7 @@ - Sayanee Basu, [Use ECMAScript 6 Today](http://net.tutsplus.com/articles/news/ecmascript-6-today/) - Ariya Hidayat, [Toward Modern Web Apps with ECMAScript 6](http://www.sencha.com/blog/toward-modern-web-apps-with-ecmascript-6/) - Dale Schouten, [10 Ecmascript-6 tricks you can perform right now](http://html5hub.com/10-ecmascript-6-tricks-you-can-perform-right-now/) +- Colin Toh, [Lightweight ES6 Features That Pack A Punch](http://colintoh.com/blog/lightweight-es6-features): ES6的一些“轻量级”的特性介绍 - Domenic Denicola, [ES6: The Awesome Parts](http://www.slideshare.net/domenicdenicola/es6-the-awesome-parts) - Nicholas C. Zakas, [Understanding ECMAScript 6](https://github.com/nzakas/understandinges6) - Justin Drake, [ECMAScript 6 in Node.JS](https://github.com/JustinDrake/node-es6-examples) From 20c74cbe526956333cb17edfe58ae1a2d7a4b129 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Thu, 16 Oct 2014 17:36:16 +0800 Subject: [PATCH 0024/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/generator.md b/docs/generator.md index e3c72aba8..b8e502cea 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -275,7 +275,7 @@ function *foo() { return 6; } -for (var v of foo()) { +for (let v of foo()) { console.log(v); } // 1 2 3 4 5 @@ -296,7 +296,7 @@ function* fibonacci() { } } -for (n of fibonacci()) { +for (let n of fibonacci()) { if (n > 1000) break; console.log(n); } From c99b5720f6c5b21df9c65dc83ca73ab1a5990487 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 19 Oct 2014 08:01:00 +0800 Subject: [PATCH 0025/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/set-map.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/set-map.md b/docs/set-map.md index 15cccda83..746b23053 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -180,7 +180,7 @@ data[element] = metadata; ``` -上面代码原意是将一个DOM节点作为对象data的键,但是由于对象只接受字符串作为键名,所以element被自动转为字符串“[Object HTMLDivElement]”。 +上面代码原意是将一个DOM节点作为对象data的键,但是由于对象只接受字符串作为键名,所以element被自动转为字符串`[Object HTMLDivElement]`。 为了解决这个问题,ES6提供了map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,对象也可以当作键。 @@ -197,9 +197,9 @@ console.log(m.get(o)) ``` -上面代码将对象o当作m的一个键。 +上面代码使用set方法,将对象o当作m的一个键,然后又使用get方法读取这个键。 -Map函数也可以接受一个数组进行初始化。 +map函数也可以接受一个数组进行初始化,该数组的成员是一个个表示键值对的数组。 ```javascript @@ -245,6 +245,8 @@ map.get(k2) // 222 上面代码中,变量k1和k2的值是一样的,但是它们在Map结构中被视为两个键。 +由上可知,map的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。 + **(2)属性和方法** Map数据结构有以下属性和方法。 From 382c333ca659fb0d1df1f26d7fbb2f2eb1cb2440 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 9 Nov 2014 12:59:33 +0800 Subject: [PATCH 0026/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9docs/number?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/number.md | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f914c4159..b759f60f0 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 本书为中级难度,适合已有一定JavaScript语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。 -全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。欢迎大家购买,支持开源项目。 +全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。电子版与纸版完全一致,如果您对本书感兴趣,建议考虑购买纸版。这样可以使出版社不因出版开源书籍而亏钱,进而鼓励更多的作者开源自己的书籍。 - [京东](http://item.jd.com/11526272.html) - [当当](http://product.dangdang.com/23546442.html) diff --git a/docs/number.md b/docs/number.md index 9238e955e..28a321e29 100644 --- a/docs/number.md +++ b/docs/number.md @@ -37,6 +37,18 @@ Number.isNaN("NaN") // false ES6将全局方法parseInt()和parseFloat(),移植到Number对象上面,行为完全保持不变。 +```javascript + +// ES5的写法 +parseInt("12.34") // 12 +parseFloat('123.45#') // 123.45 + +// ES6的写法 +Number.parseInt("12.34") // 12 +Number.parseFloat('123.45#') // 123.45 + +``` + 这样做的目的,是逐步减少全局性方法,使得语言逐步模块化。 ## Number.isInteger()和安全整数 From 2edd0b1776cebc81fb4f944694015b0fe261eea5 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 13 Nov 2014 09:16:18 +0800 Subject: [PATCH 0027/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9intor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/intro.md | 2 +- docs/reference.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/intro.md b/docs/intro.md index 53cb1fe63..9be78ec9a 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -245,7 +245,7 @@ fs.writeFileSync('out.js.map', result.sourceMap); ES7可能包括的功能有: -(1)**Object.observe**:对象与网页元素的双向绑定,只要其中之一发生变化,就会自动反映在另一者上。 +(1)**Object.observe**:用来监听对象(以及数组)的变化。一旦监听对象发生变化,就会触发回调函数。 (2)**Multi-Threading**:多线程支持。目前,Intel和Mozilla有一个共同的研究项目RiverTrail,致力于让JavaScript多线程运行。预计这个项目的研究成果会被纳入ECMAScript标准。 diff --git a/docs/reference.md b/docs/reference.md index 11219ff0b..3e2e9bab8 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -21,6 +21,7 @@ ## 语法点 +- Kyle Simpson, [For and against `let`](http://davidwalsh.name/for-and-against-let): 讨论let命令的作用域 - Nick Fitzgerald, [Destructuring Assignment in ECMAScript 6](http://fitzgeraldnick.com/weblog/50/): 详细介绍解构赋值的用法 - Nicholas C. Zakas, [Understanding ECMAScript 6 arrow functions](http://www.nczonline.net/blog/2013/09/10/understanding-ecmascript-6-arrow-functions/) - Jack Franklin, [Real Life ES6 - Arrow Functions](http://javascriptplayground.com/blog/2014/04/real-life-es6-arrow-fn/) From 527bb244d99296abd79d718ba6f8cacaccfdd603 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 13 Nov 2014 09:23:16 +0800 Subject: [PATCH 0028/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b759f60f0..0fe044b2a 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 本书为中级难度,适合已有一定JavaScript语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。 -全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。电子版与纸版完全一致,如果您对本书感兴趣,建议考虑购买纸版。这样可以使出版社不因出版开源书籍而亏钱,进而鼓励更多的作者开源自己的书籍。 +全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。电子版与纸版的内容是一致的,如果您对本书感兴趣,建议考虑购买纸版。这样可以使出版社不因出版开源书籍而亏钱,进而鼓励更多的作者开源自己的书籍。 - [京东](http://item.jd.com/11526272.html) - [当当](http://product.dangdang.com/23546442.html) From 29c88ee19e7049c029d2cbca48e7eec4920afb36 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Wed, 19 Nov 2014 17:01:48 +0800 Subject: [PATCH 0029/1409] =?UTF-8?q?=E6=94=B9=E6=AD=A3=E6=96=87=E5=AD=97?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/promise.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/promise.md b/docs/promise.md index 4a274eb38..5fd65e7e7 100644 --- a/docs/promise.md +++ b/docs/promise.md @@ -72,9 +72,9 @@ var getJSON = function(url) { }; getJSON("/posts.json").then(function(json) { - console.log('Contents: ' + value); + console.log('Contents: ' + json); }, function(error) { - console.error('出错了', reason); + console.error('出错了', error); }); ``` From dc6437d0b2da4f52cb0950ceb61715a4ccbeab92 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 20 Nov 2014 17:59:33 +0800 Subject: [PATCH 0030/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9object.observe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/object.md | 42 ++++++++++++++++++++++++++++++++++++++---- docs/reference.md | 3 ++- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/docs/object.md b/docs/object.md index 9630cdd92..61abb1bde 100644 --- a/docs/object.md +++ b/docs/object.md @@ -391,6 +391,42 @@ Object.observe方法用来监听对象(以及数组)的变化。一旦监听 ```javascript +var user = {}; +Object.observe(user, function(changes){ + changes.forEach(function(change) { + user.fullName = user.firstName+" "+user.lastName; + }); +}); + +user.firstName = 'Michael'; +user.lastName = 'Jackson'; +user.fullName // 'Michael Jackson' + +``` + +上面代码中,Object.observer方法监听user对象。一旦该对象发生变化,就自动生成fullName属性。 + +一般情况下,Object.observe方法接受两个参数,第一个参数是监听的对象,第二个函数是一个回调函数。一旦监听对象发生变化(比如新增或删除一个属性),就会触发这个回调函数。很明显,利用这个方法可以做很多事情,比如自动更新DOM。 + +```javascript + +var div = $("#foo"); + +Object.observe(user, function(changes){ + changes.forEach(function(change) { + var fullName = user.firstName+" "+user.lastName; + div.text(fullName); + }); +}); + +``` + +上面代码中,只要user对象发生变化,就会自动更新DOM。如果配合jQuery的change方法,就可以实现数据对象与DOM对象的双向自动绑定。 + +回调函数的changes参数是一个数组,代表对象发生的变化。下面是一个更完整的例子。 + +```javascript + var o = {}; function observer(changes){ @@ -406,9 +442,7 @@ Object.observe(o, observer); ``` -上面代码中,Object.observe方法监听一个空对象o,一旦o发生变化(比如新增或删除一个属性),就会触发回调函数。 - -Object.observe方法指定的回调函数,接受一个数组(changes)作为参数。该数组的成员与对象的变化一一对应,也就是说,对象发生多少个变化,该数组就有多少个成员。每个成员是一个对象(change),它的name属性表示发生变化源对象的属性名,oldValue属性表示发生变化前的值,object属性指向变动后的源对象,type属性表示变化的种类。基本上,change对象是下面的样子。 +参照上面代码,Object.observe方法指定的回调函数,接受一个数组(changes)作为参数。该数组的成员与对象的变化一一对应,也就是说,对象发生多少个变化,该数组就有多少个成员。每个成员是一个对象(change),它的name属性表示发生变化源对象的属性名,oldValue属性表示发生变化前的值,object属性指向变动后的源对象,type属性表示变化的种类。基本上,change对象是下面的样子。 ```javascript @@ -448,4 +482,4 @@ Object.unobserve(o, observer); ``` -注意,Object.observe和Object.unobserve这两个方法不属于ES6,而是属于ES7的一部分,Chrome 36已经开始支持了。 +注意,Object.observe和Object.unobserve这两个方法不属于ES6,而是属于ES7的一部分。不过,Chrome浏览器从33版起就已经支持。 diff --git a/docs/reference.md b/docs/reference.md index 3e2e9bab8..2cd53cf4e 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -28,7 +28,8 @@ - Axel Rauschmayer, [Handling required parameters in ECMAScript 6](http://www.2ality.com/2014/04/required-parameters-es6.html) - Axel Rauschmayer, [ECMAScript 6’s new array methods](http://www.2ality.com/2014/05/es6-array-methods.html): 对ES6新增的数组方法的全面介绍 - Nicholas C. Zakas, [Creating defensive objects with ES6 proxies](http://www.nczonline.net/blog/2014/04/22/creating-defensive-objects-with-es6-proxies/) -- Addy Osmani, [Data-binding Revolutions with Object.observe()](http://www.html5rocks.com/en/tutorials/es7/observe/): 介绍Object.observer()的概念 +- Addy Osmani, [Data-binding Revolutions with Object.observe()](http://www.html5rocks.com/en/tutorials/es7/observe/): 介绍Object.observe()的概念 +- Sella Rafaeli, [Native JavaScript Data-Binding](http://www.sellarafaeli.com/blog/native_javascript_data_binding): 如何使用Object.observe方法,实现数据对象与DOM对象的双向绑定 - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 - Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 From 0ded6505653d1c9d5c70607a56ff0cdf242bc73b Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 22 Nov 2014 21:23:57 +0800 Subject: [PATCH 0031/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9sting/u-modifier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/string.md | 76 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/docs/string.md b/docs/string.md index 1b59e2ed5..21715930d 100644 --- a/docs/string.md +++ b/docs/string.md @@ -41,21 +41,6 @@ codePointAt方法是测试一个字符由两个字节还是由四个字节组成 ```javascript -function is32Bit(c) { - return c.codePointAt(0) > 0xFFFF; -} - -is32Bit("𠮷") // true -is32Bit("a") // false - -``` - -## String.fromCodePoint方法 - -该方法用于从Unicode编号返回对应的字符串,作用与codePointAt正好相反。 - -```javascript - String.fromCodePoint(134071) // "𠮷" ``` @@ -100,9 +85,13 @@ ES6对这一点做出了改进,只要将超过0xFFFF的编号放入大括号 ES6对正则表达式添加了u修饰符,用来正确处理大于\uFFFF的Unicode字符。 +**(1)点字符** + +点(.)字符在正则表达式中,解释为除了换行以外的任意单个字符。对于大于\uFFFF的Unicode字符,点字符不能识别,必须加上u修饰符。 + ```javascript -var s = "𠮷"; +大于\uFFFF的Unicode字符var s = "𠮷"; /^.$/.test(s) // false /^.$/u.test(s) // true @@ -111,6 +100,46 @@ var s = "𠮷"; 上面代码表示,如果不添加u修饰符,正则表达式就会认为字符串为两个字符,从而匹配失败。 +**(2)Unicode字符表示法** + +ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达式中必须加上u修饰符,才能识别。 + +```javascript + +/\u{61}/.test('a') // false +/\u{61}/u.test('a') // true +/\u{20BB7}/u.test('𠮷') // true + +``` + +上面代码表示,如果不加u修饰符,正则表达式无法识别\u{61}这种表示法,只会认为这匹配属61个连续的u。 + +**(3)量词** + +使用u修饰符后,所有量词都会正确识别大于\uFFFF的Unicode字符。 + +```javascript + +/a{2}/.test('aa') // true +/a{2}/u.test('aa') // true +/𠮷{2}/.test('𠮷𠮷') // false +/𠮷{2}/u.test('𠮷𠮷') // true + +``` + +**(4)预定义模式** + +u修饰符也影响到预定义模式,正确识别大于\uFFFF的Unicode字符。 + +```javascript + +/^\S$/.test('𠮷') // false +/^\S$/u.test('𠮷') + +``` + +上面代码的`\S`是预定义模式,匹配所有不是空格的字符。只有加了u修饰符,它才能正确匹配大于\uFFFF的Unicode字符。 + 利用这一点,可以写出一个正确返回字符串长度的函数。 ```javascript @@ -127,6 +156,19 @@ codePointLength(s) // 2 ``` +**(5)i修饰符** + +有些Unicode字符的编码不同,但是字型很相近,比如,\u004B与\u212A都是大写的K。 + +```javascript + +/[a-z]/i.test('\u212A') // false +/[a-z]/iu.test('\u212A') // true + +``` + +上面代码中,不加u修饰符,就无法识别非正规的K字符。 + ## contains(), startsWith(), endsWith() 传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。 @@ -251,7 +293,7 @@ console.log(`${ x } + ${ y } = ${ x + y}`) 上面代码表示,在模板字符串中嵌入变量,需要将变量名写在${}之中。 模板字符串使得字符串与变量的结合,变得容易。下面是一个例子。 - +This article explains the effects of the u flag. It helps if you’ve read JavaScript has a Unicode problem first. ```javascript if (x > MAX) { From 8430a5d7040011906ae9a467fc9aa2ca5ff531ab Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 22 Nov 2014 21:55:29 +0800 Subject: [PATCH 0032/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9sting/u-modifier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/string.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/string.md b/docs/string.md index 21715930d..0f8f3693d 100644 --- a/docs/string.md +++ b/docs/string.md @@ -91,7 +91,7 @@ ES6对正则表达式添加了u修饰符,用来正确处理大于\uFFFF的Unic ```javascript -大于\uFFFF的Unicode字符var s = "𠮷"; +var s = "𠮷"; /^.$/.test(s) // false /^.$/u.test(s) // true @@ -293,7 +293,7 @@ console.log(`${ x } + ${ y } = ${ x + y}`) 上面代码表示,在模板字符串中嵌入变量,需要将变量名写在${}之中。 模板字符串使得字符串与变量的结合,变得容易。下面是一个例子。 -This article explains the effects of the u flag. It helps if you’ve read JavaScript has a Unicode problem first. + ```javascript if (x > MAX) { From 0dda99a04cd39f6f648b9673e1be956d0e95aef8 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sat, 22 Nov 2014 21:59:24 +0800 Subject: [PATCH 0033/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9array/array.from?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/array.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/array.md b/docs/array.md index 9c68fb8d4..23bac7a5b 100644 --- a/docs/array.md +++ b/docs/array.md @@ -26,6 +26,16 @@ Array.from(arrayLike).map(x => x * x); ``` +Array.from()的一个应用是,将字符串转为数组,然后返回字符串的长度。这样可以避免JavaScript将大于\uFFFF的Unicode字符,算作两个字符的bug。 + +```javascript + +function countSymbols(string) { + return Array.from(string).length; +} + +``` + ## Array.of() Array.of()方法用于将一组值,转换为数组。 From d66f0faac0937b0db24d1a4224fe8d03cbd043d6 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 23 Nov 2014 08:29:46 +0800 Subject: [PATCH 0034/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9string/normalize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/string.md | 60 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/docs/string.md b/docs/string.md index 0f8f3693d..288feccd1 100644 --- a/docs/string.md +++ b/docs/string.md @@ -2,7 +2,7 @@ ES6加强了对Unicode的支持,并且扩展了字符串对象。 -## codePointAt方法 +## codePointAt() JavaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的字符(Unicode编号大于0xFFFF的字符),JavaScript会认为它们是两个字符。 @@ -72,13 +72,16 @@ JavaScript允许采用“\uxxxx”形式表示一个字符,其中“xxxx”表 上面代码表示,如果直接在“\u”后面跟上超过0xFFFF的数值(比如\u20BB7),JavaScript会理解成“\u20BB+7”。由于\u20BB是一个不可打印字符,所以只会显示一个空格,后面跟着一个7。 -ES6对这一点做出了改进,只要将超过0xFFFF的编号放入大括号,就能正确解读该字符。 +ES6对这一点做出了改进,只要将Unicode编号放入大括号,就能正确解读该字符。 ```javascript "\u{20BB7}" // "𠮷" +"\u{41}\u{42}\u{43}" +// "ABC" + ``` ## 正则表达式的u修饰符 @@ -112,7 +115,7 @@ ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达 ``` -上面代码表示,如果不加u修饰符,正则表达式无法识别\u{61}这种表示法,只会认为这匹配属61个连续的u。 +上面代码表示,如果不加u修饰符,正则表达式无法识别`\u{61}`这种表示法,只会认为这匹配属61个连续的u。 **(3)量词** @@ -129,7 +132,7 @@ ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达 **(4)预定义模式** -u修饰符也影响到预定义模式,正确识别大于\uFFFF的Unicode字符。 +u修饰符也影响到预定义模式,能否正确识别大于\uFFFF的Unicode字符。 ```javascript @@ -167,7 +170,54 @@ codePointLength(s) // 2 ``` -上面代码中,不加u修饰符,就无法识别非正规的K字符。 +上面代码中,不加u修饰符,就无法识别非规范的K字符。 + +## normalize() + +为了表示语调和重音符号,Unicode提供了两种方法。一种是直接提供带重音符号的字符,比如Ǒ(\u01D1)。另一种是提供合成符号(combining character),即原字符与重音符号的合成,两个字符合成一个字符,比如O(\u004F)和ˇ(\u030C)合成Ǒ(\u004F\u030C)。 + +这两种表示方法,在视觉和语义上都等价,但是JavaScript不能识别。 + +```javascript + +'\u01D1'==='\u004F\u030C' //false + +'\u01D1'.length // 1 +'\u004F\u030C'.length // 2 + +``` + +上面代码表示,JavaScript将合成字符视为两个字符,导致两种表示方法不相等。 + +ES6提供String.prototype.normalize()方法,用来将字符的不同表示方法统一为同样的形式,这称为Unicode正规化。 + +```javascript + +'\u01D1'.normalize() === '\u004F\u030C'.normalize() +// true + +``` + +normalize方法可以接受四个参数。 + +- NFC,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。 + +- NFD,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。 + +- NFKC,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。 + +- NFKD,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。 + +```javascript + +'\u004F\u030C'.normalize(NFC).length // 1 +'\u004F\u030C'.normalize(NFD).length // 2 + +``` + +上面代码表示,NFC参数返回字符的合成形式,NFD参数返回字符的分解形式。 + +不过,normalize方法目前不能识别三个或三个以上字符的合成。这种情况下,还是只能使用正则表达式,通过Unicode编号区间判断。 ## contains(), startsWith(), endsWith() From d1f968625904fae79f99acd00bfcd62b72ed5925 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 23 Nov 2014 09:04:28 +0800 Subject: [PATCH 0035/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9string/normalize?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/string.md | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/docs/string.md b/docs/string.md index 288feccd1..2f077cbba 100644 --- a/docs/string.md +++ b/docs/string.md @@ -41,7 +41,34 @@ codePointAt方法是测试一个字符由两个字节还是由四个字节组成 ```javascript -String.fromCodePoint(134071) // "𠮷" +function is32Bit(c) { + return c.codePointAt(0) > 0xFFFF; +} + +is32Bit("𠮷") // true +is32Bit("a") // false + +``` + +## String.fromCodePoint() + +ES5提供String.fromCharCode方法,用于从Unicode编号返回对应字符,但是这个方法不能识别辅助平面的字符(编号大于0xFFFF)。 + +```javascript + +String.fromCharCode(0x20BB7) +// "ஷ" + +``` + +上面代码中,最后返回的字符编号是0x0BB7,而不是0x20BB7。 + +ES6提供了String.fromCodePoint方法,可以识别0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。 + +```javascript + +String.fromCodePoint(0x20BB7) +// "𠮷" ``` @@ -201,11 +228,8 @@ ES6提供String.prototype.normalize()方法,用来将字符的不同表示方 normalize方法可以接受四个参数。 - NFC,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。 - - NFD,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。 - - NFKC,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。 - - NFKD,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。 ```javascript From a80574fa1ffc4302b9d2d10461442bd1d7962aac Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 23 Nov 2014 10:02:30 +0800 Subject: [PATCH 0036/1409] =?UTF-8?q?=E6=96=B0=E5=A2=9Estring/at?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/string.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/string.md b/docs/string.md index 2f077cbba..59b0249f6 100644 --- a/docs/string.md +++ b/docs/string.md @@ -74,6 +74,28 @@ String.fromCodePoint(0x20BB7) 注意,fromCodePoint方法定义在String对象上,而codePointAt方法定义在字符串的实例对象上。 +## at() + +ES5提供String.prototype.charAt方法,返回字符串给定位置的字符。该方法不能识别Unicode编号大于0xFFFF的字符。 + +```javascript + +'𠮷'.charAt(0) +// '\uD842' + +``` + +上面代码中,charAt方法返回的是UTF-16编码的第一个字节,实际上是无法显示的。 + +ES7提供了at方法,可以识别Unicode编号大于0xFFFF的字符,返回正确的字符。 + +```javascript + +'𠮷'.at(0) +// '𠮷' + +``` + ## 字符的Unicode表示法 JavaScript允许采用“\uxxxx”形式表示一个字符,其中“xxxx”表示字符的Unicode编号。 From 83778d608b9cff8c74e92966babb2d6ab92e4a2d Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 27 Nov 2014 14:13:13 +0800 Subject: [PATCH 0037/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9let?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/let.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/let.md b/docs/let.md index 237a3dffa..7e6862773 100644 --- a/docs/let.md +++ b/docs/let.md @@ -145,7 +145,9 @@ function f() { console.log('I am outside!'); } ``` -上面代码在ES5中运行,会得到“I am inside!”,但是在ES6中运行,会得到“I am outside!”。 +上面代码在ES5中运行,会得到“I am inside!”,但是在ES6中运行,会得到“I am outside!”。这是因为ES5存在函数提升,不管会不会进入if代码块,函数声明都会提升到当前作用域的顶部,得到执行;而ES6支持块级作用域,不管会不会进入if代码块,其内部声明的函数皆不会影响到作用域的外部。 + +需要注意的是,如果在严格模式下,函数只能在顶层作用域和函数内声明,其他情况(比如if代码块、循环代码块)的声明都会报错。 ## const命令 From 66146a6e064dc458a61304fb36c2945864d99388 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 4 Dec 2014 09:05:18 +0800 Subject: [PATCH 0038/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9module=E9=83=A8?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 193 ++++++++++++++++++++++++++++++++++++++-------- docs/reference.md | 2 + 2 files changed, 163 insertions(+), 32 deletions(-) diff --git a/docs/class.md b/docs/class.md index a723fe581..ac24218e3 100644 --- a/docs/class.md +++ b/docs/class.md @@ -73,63 +73,71 @@ class ColorPoint extends Point { ## Module的基本用法 -**(1)export和import** +JavaScript没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如Ruby的require、Python的import,甚至就连CSS都有@import,但是JavaScript任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。 -ES6实现了模块功能,试图解决JavaScript代码的依赖和部署上的问题,取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。 +ES6解决了这个问题,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。 -模块功能有两个关键字:export和import。export用于用户自定义模块,规定对外接口;import用于输入其他模块提供的功能,同时创造命名空间(namespace),防止函数名冲突。 +**(1)export命令,import命令** + +模块功能有两个命令:export和import。export命令用于用户自定义模块,规定对外接口;import命令用于输入其他模块提供的功能,同时创造命名空间(namespace),防止函数名冲突。 ES6允许将独立的JS文件作为模块,也就是说,允许一个JavaScript脚本文件调用另一个脚本文件。该文件内部的所有变量,外部无法获取,必须使用export关键字输出变量。下面是一个JS文件,里面使用export关键字输出变量。 ```javascript // profile.js -export var firstName = 'David'; -export var lastName = 'Belle'; -export var year = 1973; +export var firstName = 'Michael'; +export var lastName = 'Jackson'; +export var year = 1958; ``` -上面是profile.js文件,ES6将其视为一个模块,里面用export关键字输出了三个变量。export的写法,除了像上面这样,还有另外一种。 +上面代码是profile.js文件,保存了用户信息。ES6将其视为一个模块,里面用export命令对外部输出了三个变量。 + +export的写法,除了像上面这样,还有另外一种。 ```javascript // profile.js -var firstName = 'David'; -var lastName = 'Belle'; -var year = 1973; +var firstName = 'Michael'; +var lastName = 'Jackson'; +var year = 1958; export {firstName, lastName, year}; ``` -上面代码在export关键字后,使用大括号输出一组变量,它与前一种写法是等价的。 +上面代码在export命令后面,使用大括号指定所要输出的一组变量。 + +它与前一种export命令直接放置在var语句前的写法是等价的,但是应该优先考虑使用这种写法。因为这样就可以在脚本尾部,一眼看清楚输出了哪些变量。 -使用export定义模块以后,其他JS文件就可以通过import关键字加载这个模块(文件)。 +使用export命令定义了模块的对外接口以后,其他JS文件就可以通过import命令加载这个模块(文件)。 ```javascript +// main.js + import {firstName, lastName, year} from './profile'; -function setHeader(element) { +function sfirsetHeader(element) { element.textContent = firstName + ' ' + lastName; } ``` -上面代码中import关键字接受一个对象(用大括号表示),里面指定要从其他模块导入的变量。大括号里面的变量名,必须与被导入模块对外接口的名称相同。 +上面代码属于另一个文件main.js,import命令就用于加载profile.js文件,并从中输入变量。import命令接受一个对象(用大括号表示),里面指定要从其他模块导入的变量名。大括号里面的变量名,必须与被导入模块(profile.js)对外接口的名称相同。 -如果想为输入的属性或方法重新取一个名字,import语句要写成下面这样。 +如果想为输入的变量重新取一个名字,import语句中要使用as关键字,将输入的变量重命名。 ```javascript -import { someMethod, another as newName } from './exporter'; +import { lastName as surname } from './profile'; ``` -**(2)模块的整体加载** +**(2)模块的整体输入,module命令** -export关键字除了输出变量,还可以输出方法或类(class)。下面是一个circle.js文件,它输出两个方法。 +export命令除了输出变量,还可以输出方法或类(class)。下面是一个circle.js文件,它输出两个方法area和circumference。 ```javascript @@ -145,7 +153,7 @@ export function circumference(radius) { ``` -然后,main.js引用这个模块。 +然后,main.js输入circlek.js模块。 ```javascript @@ -158,7 +166,7 @@ console.log("圆周长:" + circumference(14)); ``` -上面写法是逐一指定要导入的方法。另一种写法是整体导入。 +上面写法是逐一指定要输入的方法。另一种写法是整体输入。 ```javascript @@ -169,7 +177,7 @@ console.log("圆周长:" + circle.circumference(14)); ``` -module关键字可以取代import语句,达到整体输入模块的作用。 +module命令可以取代import语句,达到整体输入模块的作用。 ```javascript @@ -182,25 +190,23 @@ console.log("圆周长:" + circle.circumference(14)); ``` -module关键字后面跟一个变量,表示导入的模块定义在该变量上。 +module命令后面跟一个变量,表示输入的模块定义在该变量上。 -**(3)export default语句** +**(3)export default命令** -如果不想为某个属性或方法,指定输入的名称,可以使用export default语句。 +如果想要输出匿名函数,可以使用export default命令。 ```javascript // export-default.js -export default function foo() { +export default function () { console.log('foo'); } ``` -上面代码中的foo方法,就被称为该模块的默认方法。 - -在其他模块导入该模块时,import语句可以为默认方法指定任意名字。 +其他模块输入该模块时,import命令可以为该匿名函数指定任意名字。 ```javascript @@ -212,9 +218,41 @@ customName(); // 'foo' ``` -显然,一个模块只能有一个默认方法。 +上面代码的import命令,可以用任意名称指向输出的匿名函数。需要注意的是,这时import命令后面,不使用大括号。 -如果想在一条import语句中,同时输入默认方法和指定名称的变量,可以写成下面这样。 +export default命令用在非匿名函数前,也是可以的。 + +```javascript + +// export-default.js + +export default function foo() { + console.log('foo'); +} + +// 或者写成 + +function foo() { + console.log('foo'); +} + +export default foo; + +``` + +上面代码中,foo函数的函数名foo,在模块外部是无效的。加载的时候,视同匿名函数加载。 + +export default命令用于指定模块的默认输出。如果模块加载时,只能输出一个值或方法,那就是export default所指定的那个值或方法。所以,import命令后面才不用加大括号。显然,一个模块只能有一个默认输出,因此export deault命令只能使用一次。 + +有了export default命令,输入模块时就非常直观了,以输入jQuery模块为例。 + +```javascript + +import $ from 'jquery'; + +``` + +如果想在一条import语句中,同时输入默认方法和其他变量,可以写成下面这样。 ```javascript @@ -222,7 +260,7 @@ import customName, { otherMethod } from './export-default'; ``` -如果要输出默认属性,只需将值跟在`export default`之后即可。 +如果要输出默认的值,只需将值跟在`export default`之后即可。 ```javascript @@ -262,14 +300,18 @@ export default function(x) { 上面代码中的“export *”,表示输出circle模块的所有属性和方法,export default命令定义模块的默认方法。 -这时,可以为circle中的属性或方法,改名后再输出。 +这时,也可以将circle的属性或方法,改名后再输出。 ```javascript +// circleplus.js + export { area as circleArea } from 'circle'; ``` +上面代码表示,只输出circle模块的area方法,且将其改名为circleArea。 + 加载上面模块的写法如下。 ```javascript @@ -283,3 +325,90 @@ console.log(exp(math.pi)); ``` 上面代码中的"import exp"表示,将circleplus模块的默认方法加载为exp方法。 + +## ES6模块的转码 + +浏览器目前还不支持ES6模块,为了现在就能使用,可以将转为ES5的写法。 + +**(1)ES6 module transpiler** + +[ES6 module transpiler](https://github.com/esnext/es6-module-transpiler)是square公司开源的一个转码器,可以将ES6模块转为CommonJS模块或AMD模块的写法,从而在浏览器中使用。 + +首先,安装这个转玛器。 + +```bash + +$ npm install -g es6-module-transpiler + +``` + +然后,使用`compile-modules convert`命令,将ES6模块文件转码。 + +```bash + +$ compile-modules convert file1.js file2.js + +``` + +o参数可以指定转码后的文件名。 + +```bash + +$ compile-modules convert -o out.js file1.js + +``` + +**(2)SystemJS** + +另一种解决方法是使用[SystemJS](https://github.com/systemjs/systemjs)。它是一个垫片库(polyfill),可以在浏览器内加载ES6模块、AMD模块和CommonJS模块,将其转为ES5格式。它在后台调用的是Google的Traceur转码器。 + +使用时,先在网页内载入system.js文件。 + +```html + + + +``` + +然后,使用`System.import`方法加载模块文件。 + +```html + + + +``` + +上面代码中的`./app`,指的是当前目录下的app.js文件。它可以是ES6模块文件,`System.import`会自动将其转码。 + +需要注意的是,`System.import`使用异步加载,返回一个Promise对象,可以针对这个对象编程。下面是一个模块文件。 + +```javascript + +// app/es6-file.js: + +export class q { + constructor() { + this.es6 = 'hello'; + } +} + + +``` + +然后,在网页内加载这个模块文件。 + +```html + + + +``` + +上面代码中,`System.import`方法返回的是一个Promise对象,所以可以用then方法指定回调函数。 diff --git a/docs/reference.md b/docs/reference.md index 2cd53cf4e..d0704f192 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -34,6 +34,7 @@ - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 - Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 - Jack Franklin, [An introduction to ES6 classes](http://javascriptplayground.com/blog/2014/07/introduction-to-es6-classes-tutorial/): ES6 class的入门介绍 +- Jack Franklin, [JavaScript Modules the ES6 Way](http://24ways.org/2014/javascript-modules-the-es6-way/): ES6模块入门 ## Generator @@ -65,3 +66,4 @@ - army8735, [Javascript Downcast](https://github.com/army8735/jsdc): 国产的ES6到ES5的转码器 - esnext, [ES6 Module Transpiler](https://github.com/esnext/es6-module-transpiler):基于node.js的将ES6模块转为ES5代码的命令行工具 - Sebastian McKenzie, [6to5](https://github.com/sebmck/6to5): 将ES6转为ES5代码的Node模块,支持source map +- SystemJS, [SystemJS](https://github.com/systemjs/systemjs): 在浏览器中加载AMD、CJS、ES6模块的一个垫片库 From 97fcf5d921aa6d23a13f04b4d38b6e063adbe301 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Wed, 10 Dec 2014 22:30:47 +0800 Subject: [PATCH 0039/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9string/unicode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/string.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/string.md b/docs/string.md index 59b0249f6..257fff72e 100644 --- a/docs/string.md +++ b/docs/string.md @@ -4,7 +4,7 @@ ES6加强了对Unicode的支持,并且扩展了字符串对象。 ## codePointAt() -JavaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的字符(Unicode编号大于0xFFFF的字符),JavaScript会认为它们是两个字符。 +JavaScript内部,字符以UTF-16的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的字符(Unicode码点大于0xFFFF的字符),JavaScript会认为它们是两个字符。 ```javascript @@ -18,9 +18,9 @@ s.charCodeAt(1) // 57271 ``` -上面代码中,汉字“𠮷”的Unicode编号是0x20BB7,UTF-16编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节储存。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2,而且charAt方法无法读取字符,charCodeAt方法只能分别返回前两个字节和后两个字节的值。 +上面代码中,汉字“𠮷”的码点是0x20BB7,UTF-16编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节储存。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2,而且charAt方法无法读取字符,charCodeAt方法只能分别返回前两个字节和后两个字节的值。 -ES6提供了codePointAt方法,能够正确处理4个字节储存的字符,返回一个字符的Unicode编号。 +ES6提供了codePointAt方法,能够正确处理4个字节储存的字符,返回一个字符的码点。 ```javascript @@ -33,9 +33,9 @@ s.charCodeAt(2) // 97 ``` -codePointAt方法的参数,是字符在字符串中的位置(从0开始)。上面代码中,JavaScript将“𠮷a”视为三个字符,codePointAt方法在第一个字符上,正确地识别了“𠮷”,返回了它的十进制Unicode编号134071(即十六进制的20BB7)。在第二个字符(即“𠮷”的后两个字节)和第三个字符“a”上,codePointAt方法的结果与charCodeAt方法相同。 +codePointAt方法的参数,是字符在字符串中的位置(从0开始)。上面代码中,JavaScript将“𠮷a”视为三个字符,codePointAt方法在第一个字符上,正确地识别了“𠮷”,返回了它的十进制码点134071(即十六进制的20BB7)。在第二个字符(即“𠮷”的后两个字节)和第三个字符“a”上,codePointAt方法的结果与charCodeAt方法相同。 -总之,codePointAt方法会正确返回四字节的UTF-16字符的Unicode编号。对于那些两个字节储存的常规字符,它的返回结果与charCodeAt方法相同。 +总之,codePointAt方法会正确返回四字节的UTF-16字符的码点。对于那些两个字节储存的常规字符,它的返回结果与charCodeAt方法相同。 codePointAt方法是测试一个字符由两个字节还是由四个字节组成的最简单方法。 @@ -52,7 +52,7 @@ is32Bit("a") // false ## String.fromCodePoint() -ES5提供String.fromCharCode方法,用于从Unicode编号返回对应字符,但是这个方法不能识别辅助平面的字符(编号大于0xFFFF)。 +ES5提供String.fromCharCode方法,用于从码点返回对应字符,但是这个方法不能识别辅助平面的字符(编号大于0xFFFF)。 ```javascript @@ -61,7 +61,7 @@ String.fromCharCode(0x20BB7) ``` -上面代码中,最后返回的字符编号是0x0BB7,而不是0x20BB7。 +上面代码中,最后返回码点U+0BB7对应的字符,而不是码点U+20BB7对应的字符。 ES6提供了String.fromCodePoint方法,可以识别0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。 @@ -76,7 +76,7 @@ String.fromCodePoint(0x20BB7) ## at() -ES5提供String.prototype.charAt方法,返回字符串给定位置的字符。该方法不能识别Unicode编号大于0xFFFF的字符。 +ES5提供String.prototype.charAt方法,返回字符串给定位置的字符。该方法不能识别码点大于0xFFFF的字符。 ```javascript @@ -98,7 +98,7 @@ ES7提供了at方法,可以识别Unicode编号大于0xFFFF的字符,返回 ## 字符的Unicode表示法 -JavaScript允许采用“\uxxxx”形式表示一个字符,其中“xxxx”表示字符的Unicode编号。 +JavaScript允许采用“\uxxxx”形式表示一个字符,其中“xxxx”表示字符的码点。 ```javascript @@ -121,7 +121,7 @@ JavaScript允许采用“\uxxxx”形式表示一个字符,其中“xxxx”表 上面代码表示,如果直接在“\u”后面跟上超过0xFFFF的数值(比如\u20BB7),JavaScript会理解成“\u20BB+7”。由于\u20BB是一个不可打印字符,所以只会显示一个空格,后面跟着一个7。 -ES6对这一点做出了改进,只要将Unicode编号放入大括号,就能正确解读该字符。 +ES6对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。 ```javascript @@ -139,7 +139,7 @@ ES6对正则表达式添加了u修饰符,用来正确处理大于\uFFFF的Unic **(1)点字符** -点(.)字符在正则表达式中,解释为除了换行以外的任意单个字符。对于大于\uFFFF的Unicode字符,点字符不能识别,必须加上u修饰符。 +点(.)字符在正则表达式中,解释为除了换行以外的任意单个字符。对于码点大于0xFFFF的Unicode字符,点字符不能识别,必须加上u修饰符。 ```javascript @@ -164,11 +164,11 @@ ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达 ``` -上面代码表示,如果不加u修饰符,正则表达式无法识别`\u{61}`这种表示法,只会认为这匹配属61个连续的u。 +上面代码表示,如果不加u修饰符,正则表达式无法识别`\u{61}`这种表示法,只会认为这匹配61个连续的u。 **(3)量词** -使用u修饰符后,所有量词都会正确识别大于\uFFFF的Unicode字符。 +使用u修饰符后,所有量词都会正确识别大于码点大于0xFFFF的Unicode字符。 ```javascript @@ -181,7 +181,7 @@ ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达 **(4)预定义模式** -u修饰符也影响到预定义模式,能否正确识别大于\uFFFF的Unicode字符。 +u修饰符也影响到预定义模式,能否正确识别码点大于0xFFFF的Unicode字符。 ```javascript @@ -190,7 +190,7 @@ u修饰符也影响到预定义模式,能否正确识别大于\uFFFF的Unicode ``` -上面代码的`\S`是预定义模式,匹配所有不是空格的字符。只有加了u修饰符,它才能正确匹配大于\uFFFF的Unicode字符。 +上面代码的`\S`是预定义模式,匹配所有不是空格的字符。只有加了u修饰符,它才能正确匹配码点大于0xFFFF的Unicode字符。 利用这一点,可以写出一个正确返回字符串长度的函数。 From 5e9968e8989fe4b9545ec57b8fb76672da74b0b7 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Fri, 12 Dec 2014 08:40:44 +0800 Subject: [PATCH 0040/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9docs/class/?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 10 ++++------ docs/reference.md | 8 ++++++-- docs/string.md | 22 ++++++++++++++++++---- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/docs/class.md b/docs/class.md index ac24218e3..42202055b 100644 --- a/docs/class.md +++ b/docs/class.md @@ -75,11 +75,11 @@ class ColorPoint extends Point { JavaScript没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如Ruby的require、Python的import,甚至就连CSS都有@import,但是JavaScript任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。 -ES6解决了这个问题,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。 +在ES6之前,社区制定了一些模块加载方案,最主要的有CommonJS和AMD两种。前者用于服务器,后者用于浏览器。ES6在语言规格的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。 **(1)export命令,import命令** -模块功能有两个命令:export和import。export命令用于用户自定义模块,规定对外接口;import命令用于输入其他模块提供的功能,同时创造命名空间(namespace),防止函数名冲突。 +模块功能主要由两个命令构成:export和import。export命令用于用户自定义模块,规定对外接口;import命令用于输入其他模块提供的功能,同时创造命名空间(namespace),防止函数名冲突。 ES6允许将独立的JS文件作为模块,也就是说,允许一个JavaScript脚本文件调用另一个脚本文件。该文件内部的所有变量,外部无法获取,必须使用export关键字输出变量。下面是一个JS文件,里面使用export关键字输出变量。 @@ -107,9 +107,7 @@ export {firstName, lastName, year}; ``` -上面代码在export命令后面,使用大括号指定所要输出的一组变量。 - -它与前一种export命令直接放置在var语句前的写法是等价的,但是应该优先考虑使用这种写法。因为这样就可以在脚本尾部,一眼看清楚输出了哪些变量。 +上面代码在export命令后面,使用大括号指定所要输出的一组变量。它与前一种写法(直接放置在var语句前)是等价的,但是应该优先考虑使用这种写法。因为这样就可以在脚本尾部,一眼看清楚输出了哪些变量。 使用export命令定义了模块的对外接口以后,其他JS文件就可以通过import命令加载这个模块(文件)。 @@ -213,7 +211,6 @@ export default function () { // import-default.js import customName from './export-default'; - customName(); // 'foo' ``` @@ -277,6 +274,7 @@ export default class { ... } // main.js import MyClass from 'MyClass' +let o = new MyClass(); ``` diff --git a/docs/reference.md b/docs/reference.md index d0704f192..9f772708e 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -33,8 +33,6 @@ - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 - Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 -- Jack Franklin, [An introduction to ES6 classes](http://javascriptplayground.com/blog/2014/07/introduction-to-es6-classes-tutorial/): ES6 class的入门介绍 -- Jack Franklin, [JavaScript Modules the ES6 Way](http://24ways.org/2014/javascript-modules-the-es6-way/): ES6模块入门 ## Generator @@ -56,6 +54,12 @@ - Jafar Husain, [Async Generators](https://docs.google.com/file/d/0B4PVbLpUIdzoMDR5dWstRllXblU/view?sle=true): 对async与Generator混合使用的一些讨论 - Axel Rauschmayer, [ECMAScript 6 promises (2/2): the API](http://www.2ality.com/2014/10/es6-promises-api.html): 对ES6 Promise规格和用法的详细介绍 +## Class与模块 + +- Jack Franklin, [An introduction to ES6 classes](http://javascriptplayground.com/blog/2014/07/introduction-to-es6-classes-tutorial/): ES6 class的入门介绍 +- Jack Franklin, [JavaScript Modules the ES6 Way](http://24ways.org/2014/javascript-modules-the-es6-way/): ES6模块入门 +- Axel Rauschmayer, [ECMAScript 6 modules: the final syntax](http://www.2ality.com/2014/09/es6-modules-final.html): ES6模块的介绍,以及与CommonJS规格的详细比较 + ## 工具 - Google, [traceur-compiler](https://github.com/google/traceur-compiler): Traceur编译器 diff --git a/docs/string.md b/docs/string.md index 257fff72e..7c6b403bf 100644 --- a/docs/string.md +++ b/docs/string.md @@ -379,14 +379,28 @@ r.sticky // true var name = "Bob", time = "today"; `Hello ${name}, how are you ${time}?` +``` + +上面代码中的字符串,都是用反引号表示。如果在模板字符串中嵌入变量,需要将变量名写在`${}`之中。 + +大括号内部可以进行运算,以及引用对象属性。 + +```javascript + var x = 1; var y = 2; -console.log(`${ x } + ${ y } = ${ x + y}`) + +console.log(`${x} + ${y} = ${x+y}`) // "1 + 2 = 3" - -``` -上面代码表示,在模板字符串中嵌入变量,需要将变量名写在${}之中。 +console.log(`${x} + ${y*2} = ${x+y*2}`) +// "1 + 4 = 5" + +var obj = {x: 1, y: 2}; +console.log(`${obj.x + obj.y}`) +// 3 + +``` 模板字符串使得字符串与变量的结合,变得容易。下面是一个例子。 From 4cf70a17ab763c800dd3f42f1672fe4b3e7a689d Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 14 Dec 2014 12:33:41 +0800 Subject: [PATCH 0041/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9module?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 18 ++++++++++++++++++ docs/reference.md | 1 + 2 files changed, 19 insertions(+) diff --git a/docs/class.md b/docs/class.md index 42202055b..d94472d2f 100644 --- a/docs/class.md +++ b/docs/class.md @@ -77,6 +77,24 @@ JavaScript没有模块(module)体系,无法将一个大程序拆分成互 在ES6之前,社区制定了一些模块加载方案,最主要的有CommonJS和AMD两种。前者用于服务器,后者用于浏览器。ES6在语言规格的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。 +ES6模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS和AMD模块,都只能在运行时确定这些东西。比如,CommonJS模块就是对象,输入时必须查找对象属性。 + +```javascript + +var { stat, exists, readFile } = require('fs'); + +``` + +ES6模块不是对象,而是通过export命令显式指定输出的代码,输入时也采用静态命令的形式。 + +```javascript + +import { stat, exists, readFile } from 'fs'; + +``` + +所以,ES6可以在编译时就完成模块编译,效率要比CommonJS模块高。 + **(1)export命令,import命令** 模块功能主要由两个命令构成:export和import。export命令用于用户自定义模块,规定对外接口;import命令用于输入其他模块提供的功能,同时创造命名空间(namespace),防止函数名冲突。 diff --git a/docs/reference.md b/docs/reference.md index 9f772708e..f2d4faae9 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -59,6 +59,7 @@ - Jack Franklin, [An introduction to ES6 classes](http://javascriptplayground.com/blog/2014/07/introduction-to-es6-classes-tutorial/): ES6 class的入门介绍 - Jack Franklin, [JavaScript Modules the ES6 Way](http://24ways.org/2014/javascript-modules-the-es6-way/): ES6模块入门 - Axel Rauschmayer, [ECMAScript 6 modules: the final syntax](http://www.2ality.com/2014/09/es6-modules-final.html): ES6模块的介绍,以及与CommonJS规格的详细比较 +- Dave Herman, [Static module resolution](http://calculist.org/blog/2012/06/29/static-module-resolution/): ES6模块的静态化设计思想 ## 工具 From e635b182f60cbd7765ab2c0828715775431e9474 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 18 Dec 2014 22:24:14 +0800 Subject: [PATCH 0042/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 88 +++++++++++++++++++++++++++++++++++------------ docs/reference.md | 1 + 2 files changed, 67 insertions(+), 22 deletions(-) diff --git a/docs/generator.md b/docs/generator.md index b8e502cea..f0d762e8b 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -2,15 +2,15 @@ ## 含义 -所谓Generator,简单说,就是一个内部状态的遍历器,即每调用一次遍历器,内部状态发生一次改变(可以理解成发生某些事件)。ES6引入Generator函数,作用就是可以完全控制内部状态的变化,依次遍历这些状态。 +所谓Generator,有多种理解角度。首先,可以把它理解成一个内部状态的遍历器,即每调用一次遍历器,内部状态发生一次改变(可以理解成发生某些事件)。ES6引入Generator函数,作用就是可以完全控制内部状态的变化,依次遍历这些状态。 -Generator函数就是普通函数,但是有两个特征。一是,function关键字后面有一个星号;二是,函数体内部使用yield语句,定义遍历器的每个成员,即不同的内部状态(yield语句在英语里的意思就是“产出”)。 +在形式上,Generator是一个普通函数,但是有两个特征。一是,function命令与函数名之间有一个星号;二是,函数体内部使用yield语句,定义遍历器的每个成员,即不同的内部状态(yield语句在英语里的意思就是“产出”)。 ```javascript function* helloWorldGenerator() { - yield 'hello'; - yield 'world'; + yield 'hello'; + yield 'world'; return 'ending'; } @@ -50,9 +50,7 @@ hw.next() 总结一下,Generator函数使用iterator接口,每次调用next方法的返回值,就是一个标准的iterator返回值:有着value和done两个属性的对象。其中,value是yield语句后面那个表达式的值,done是一个布尔值,表示是否遍历结束。 -Generator函数的本质,其实是提供一种可以暂停执行的函数。yield语句就是暂停标志,next方法遇到yield,就会暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回对象的value属性的值。当下一次调用next方法时,再继续往下执行,直到遇到下一个yield语句。如果没有再遇到新的yield语句,就一直运行到函数结束,将return语句后面的表达式的值,作为value属性的值,如果该函数没有return语句,则value属性的值为undefined。 - -由于yield后面的表达式,直到调用next方法时才会执行,因此等于为JavaScript提供了手动的“惰性求值”(Lazy Evaluation)的语法功能。 +由于Generator函数返回的遍历器,只有调用next方法才会遍历下一个成员,所以其实提供了一种可以暂停执行的函数。yield语句就是暂停标志,next方法遇到yield,就会暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回对象的value属性的值。当下一次调用next方法时,再继续往下执行,直到遇到下一个yield语句。如果没有再遇到新的yield语句,就一直运行到函数结束,将return语句后面的表达式的值,作为value属性的值,如果该函数没有return语句,则value属性的值为undefined。另一方面,由于yield后面的表达式,直到调用next方法时才会执行,因此等于为JavaScript提供了手动的“惰性求值”(Lazy Evaluation)的语法功能。 yield语句与return语句有点像,都能返回紧跟在语句后面的那个表达式的值。区别在于每次遇到yield,函数暂停执行,下一次再从该位置继续向后执行,而return语句不具备位置记忆的功能。 @@ -72,7 +70,7 @@ setTimeout(function () { ``` -上面代码中,只有调用next方法时,函数f才会执行。 +上面代码中,函数f如果是普通函数,在为generator变量赋值时就会执行。但是,函数f是一个Generator函数,就变成只有调用next方法时,函数f才会执行。 利用Generator函数,可以在任意对象上部署iterator接口。 @@ -97,7 +95,7 @@ for (let [key, value] of iterEntries(myObj)) { ``` -上述代码中,由于Generator函数返回一个具有iterator接口的对象,所以只要让yield语句每次返回一个参数对象的成员,就可以在任意对象上部署next方法。 +上述代码中,myObj是一个普通对象,通过iterEntries函数,就有了iterator接口。也就是说,可以在任意对象上部署next方法。 ## next方法的参数 @@ -234,8 +232,8 @@ function scheduler(task) { setTimeout(function () { if (!task.next().done) { scheduler(task); - } - }, 0); + } + }, 0); } ``` @@ -247,13 +245,13 @@ function scheduler(task) { var Q = require('q'); function delay(milliseconds) { - var deferred = Q.defer(); - setTimeout(deferred.resolve, milliseconds); - return deferred.promise; + var deferred = Q.defer(); + setTimeout(deferred.resolve, milliseconds); + return deferred.promise; } function* f(){ - yield delay(100); + yield delay(100); }; ``` @@ -267,16 +265,16 @@ for...of循环可以自动遍历Generator函数,且此时不再需要调用nex ```javascript function *foo() { - yield 1; - yield 2; - yield 3; - yield 4; - yield 5; - return 6; + yield 1; + yield 2; + yield 3; + yield 4; + yield 5; + return 6; } for (let v of foo()) { - console.log(v); + console.log(v); } // 1 2 3 4 5 @@ -305,6 +303,52 @@ for (let n of fibonacci()) { 从上面代码可见,使用for...of语句时不需要使用next方法。 +## 作为数据结构的Generator + +Generator可以暂停函数执行,返回任意表达式的值。这种特点使得Generator有多种应用场景。 + +- 异步操作的同步化表达(abstractions of async behavior) +- 控制流管理(control flow management) +- 数据结构(data structure) + +第一种和第二种应用在本章前面部分,已经有所提及了。这里主要再补充一下,Generator可以看作是数据结构,因为它可以对任意表达式,提供类似数组的接口。 + +```javascript + +function *doStuff() { + yield fs.readFile.bind(null, 'hello.txt'); + yield fs.readFile.bind(null, 'world.txt'); + yield fs.readFile.bind(null, 'and-such.txt'); +} + +``` + +上面代码就是依次返回三个函数,但是由于使用了Generator函数,导致可以像处理数组那样,处理这三个返回的函数。 + +```javascript + +for (task of doStuff()) { + // task是一个函数,可以像回调函数那样使用它 +} + +``` + +实际上,如果用ES5表达,完全可以用数组模拟Generator的这种用法。 + +```javascript + +function doStuff() { + return [ + fs.readFile.bind(null, 'hello.txt'), + fs.readFile.bind(null, 'world.txt'), + fs.readFile.bind(null, 'and-such.txt') + ]; +} + +``` + +上面的函数,可以用一模一样的for...of循环处理!两相一比较,就不难看出Generator的这种用法,就是让数据或者操作,可以像数组那样处理。 + ## throw方法 Generator函数还有一个特点,它可以在函数体外抛出错误,然后在函数体内捕获。 diff --git a/docs/reference.md b/docs/reference.md index f2d4faae9..879fd3b21 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -45,6 +45,7 @@ - StackOverflow, [ES6 yield : what happens to the arguments of the first call next()?](http://stackoverflow.com/questions/20977379/es6-yield-what-happens-to-the-arguments-of-the-first-call-next): 第一次使用next方法时不能带有参数 - Kyle Simpson, [ES6 Generators: Complete Series](http://davidwalsh.name/es6-generators): 由浅入深探讨Generator的系列文章,共四篇 - Gajus Kuizinas, [The Definitive Guide to the JavaScript Generators](http://gajus.com/blog/2/the-definetive-guide-to-the-javascript-generators): 对Generator的综合介绍 +- Jan Krems, [Generators Are Like Arrays](https://gist.github.com/jkrems/04a2b34fb9893e4c2b5c): 讨论Generator可以被当作数据结构看待 ## Promise对象 From 8b3d0a575d91f13c8b794485e79ce00bb4a6c853 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 21 Dec 2014 22:16:37 +0800 Subject: [PATCH 0043/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9docs/class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 2 ++ docs/generator.md | 2 +- docs/reference.md | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/class.md b/docs/class.md index d94472d2f..f8832e9d9 100644 --- a/docs/class.md +++ b/docs/class.md @@ -71,6 +71,8 @@ class ColorPoint extends Point { 上面代码中,constructor方法和toString方法之中,都出现了super关键字,它指代父类的同名方法。在constructor方法内,super指代父类的constructor方法;在toString方法内,super指代父类的toString方法。 +有一个地方,需要注意。类和模块的内部,默认就是严格模式,所以不需要使用`use strict`指定运行模式。考虑到未来所有的代码,其实都是运行在模块之中,所以ES6实际上把整个语言升级到了严格模式。 + ## Module的基本用法 JavaScript没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如Ruby的require、Python的import,甚至就连CSS都有@import,但是JavaScript任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。 diff --git a/docs/generator.md b/docs/generator.md index f0d762e8b..686a7d0fd 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -347,7 +347,7 @@ function doStuff() { ``` -上面的函数,可以用一模一样的for...of循环处理!两相一比较,就不难看出Generator的这种用法,就是让数据或者操作,可以像数组那样处理。 +上面的函数,可以用一模一样的for...of循环处理!两相一比较,就不难看出Generator使得数据或者操作,具备了类似数组的接口。 ## throw方法 diff --git a/docs/reference.md b/docs/reference.md index 879fd3b21..b3bfe2d55 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -4,6 +4,7 @@ - [ECMAScript 6 Language Specification](http://people.mozilla.org/~jorendorff/es6-draft.html): 语言规格草案 - [harmony:proposals](http://wiki.ecmascript.org/doku.php?id=harmony:proposals): ES6的各种提案 +- [Draft Specification for ES.next (Ecma-262 Edition 6)](http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts): ES6草案各版本之间的变动 ## 综合介绍 From ef6bd9d6fa2cb974f7db43afa022393178bc91c3 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 23 Dec 2014 08:55:24 +0800 Subject: [PATCH 0044/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9object/assign?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 26 +++++ docs/object.md | 263 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 221 insertions(+), 68 deletions(-) diff --git a/docs/generator.md b/docs/generator.md index 686a7d0fd..ae262c9e2 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -499,3 +499,29 @@ result // ['a', 'b', 'c', 'd', 'e', 'f', 'g'] ``` + +## 作为对象属性的Generator函数 + +如果一个对象的属性是Generator函数,可以简写成下面的形式。 + +```javascript + +let obj = { + * myGeneratorMethod() { + ··· + } +}; + +``` + +它的完整形式如下,两者是等价的。 + +```javascript + +let obj = { + myGeneratorMethod: function* () { + ··· + } +}; + +``` diff --git a/docs/object.md b/docs/object.md index 61abb1bde..60986c8cd 100644 --- a/docs/object.md +++ b/docs/object.md @@ -1,5 +1,124 @@ # 对象的扩展 +## 属性的简洁表示法 + +ES6允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。 + +```javascript + +var Person = { + + name: '张三', + + //等同于birth: birth + birth, + + // 等同于hello: function ()... + hello() { console.log('我的名字是', this.name); } + +}; + +``` + +这种写法用于函数的返回值,将会非常方便。 + +```javascript + +function getPoint() { + var x = 1; + var y = 10; + + return {x, y}; +} + +getPoint() +// {x:1, y:10} + +``` + +下面是一个类似的例子。 + +```javascript + +let x = 4; +let y = 1; + +// 下行等同于 let obj = { x: x, y: y }; +let obj = { x, y }; + +``` + +## 属性名表达式 + +JavaScript语言定义对象的属性,有两种方法。 + +```javascript + +// 方法一 +obj.foo = true; + +// 方法二 +obj['a'+'bc'] = 123; + +``` + +上面代码的方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内。 + +但是,如果使用字面量方式定义对象(使用大括号),在ES5中只能使用方法一(标识符)定义属性。 + +```javascript + +var obj = { + foo: true, + abc: 123 +}; + +``` + +ES6允许字面量定义对象时,用方法二(表达式)作为对象的属性名,即把表达式放在方括号内。 + +```javascript + +let propKey = 'foo'; + +let obj = { + [propKey]: true, + ['a'+'bc']: 123 +}; + +``` + +下面是另一个例子。 + +```javascript + +var lastWord = "last word"; + +var a = { + "first word": "hello", + [lastWord]: "world" +}; + +a["first word"] // "hello" +a[lastWord] // "world" +a["last word"] // "world" + +``` + +表达式还可以用于定义方法名。 + +```javascript + +let obj = { + ['h'+'ello']() { + return 'hi'; + } +}; + +console.log(obj.hello()); // hi + +``` + ## Object.is() Object.is()用来比较两个值是否严格相等。它与严格比较运算符(===)的行为基本一致,不同之处只有两个:一是+0不等于-0,二是NaN等于自身。 @@ -44,135 +163,143 @@ target // {a:1, b:2, c:3} ``` -## __proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf() - -**(1)__proto__属性** +assign方法有很多用处。 -__proto__属性,用来读取或设置当前对象的prototype对象。该属性一度被正式写入ES6草案,但后来又被移除。目前,所有浏览器(包括IE11)都部署了这个属性。 +**(1)为对象添加属性** ```javascript -// es6的写法 - -var obj = { - __proto__: someOtherObj, - method: function() { ... } +class Point { + constructor(x, y) { + Object.assign(this, {x, y}); + } } -// es5的写法 - -var obj = Object.create(someOtherObj); -obj.method = function() { ... } - ``` -有了这个属性,实际上已经不需要通过Object.create()来生成新对象了。 +上面方法通过assign方法,将x属性和y属性添加到Point类的对象实例。 -**(2)Object.setPrototypeOf()** - -Object.setPrototypeOf方法的作用与__proto__相同,用来设置一个对象的prototype对象。 +**(2)为对象添加方法** ```javascript -// 格式 -Object.setPrototypeOf(object, prototype) +Object.assign(SomeClass.prototype, { + someMethod(arg1, arg2) { + ··· + }, + anotherMethod() { + ··· + } +}); -// 用法 -var o = Object.setPrototypeOf({}, null); +// 等同于下面的写法 +SomeClass.prototype.someMethod = function (arg1, arg2) { + ··· +}; +SomeClass.prototype.anotherMethod = function () { + ··· +}; ``` -该方法等同于下面的函数。 +上面代码使用了对象属性的简洁表示法,直接将两个函数放在大括号中,再使用assign方法添加到SomeClass.prototype之中。 + +**(3)克隆对象** ```javascript -function (obj, proto) { - obj.__proto__ = proto; - return obj; +function clone(origin) { + return Object.assign({}, origin); } ``` -**(3)Object.getPrototypeOf()** +上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。 -该方法与setPrototypeOf方法配套,用于读取一个对象的prototype对象。 +不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。 ```javascript -Object.getPrototypeOf(obj) +function clone(origin) { + let originProto = Object.getPrototypeOf(origin); + return Object.assign(Object.create(originProto), origin); +} ``` -## 增强的对象写法 - -ES6允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。 +**(4)为属性指定默认值** ```javascript -var Person = { +const DEFAULTS = { + logLevel: 0, + outputFormat: 'html' +}; - name: '张三', +function processContent(options) { + let options = Object.assign({}, DEFAULTS, options); +} - //等同于birth: birth - birth, +``` - // 等同于hello: function ()... - hello() { console.log('我的名字是', this.name); } +上面代码中,DEFAULTS对象是默认值,options对象是用户提供的参数。assign方法将DEFAULTS和options合并成一个新对象,如果两者有同名属性,则option的属性值会覆盖DEFAULTS的属性值。 -}; +## __proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf() -``` +**(1)__proto__属性** -这种写法用于函数的返回值,将会非常方便。 +__proto__属性,用来读取或设置当前对象的prototype对象。该属性一度被正式写入ES6草案,但后来又被移除。目前,所有浏览器(包括IE11)都部署了这个属性。 ```javascript -function getPoint() { - var x = 1; - var y = 10; +// es6的写法 - return {x, y}; +var obj = { + __proto__: someOtherObj, + method: function() { ... } } -getPoint() -// {x:1, y:10} +// es5的写法 + +var obj = Object.create(someOtherObj); +obj.method = function() { ... } ``` -## 属性名表达式 +有了这个属性,实际上已经不需要通过Object.create()来生成新对象了。 -ES6允许定义对象时,用表达式作为对象的属性名。在写法上,要把表达式放在方括号内。 +**(2)Object.setPrototypeOf()** -```javascript +Object.setPrototypeOf方法的作用与__proto__相同,用来设置一个对象的prototype对象。它是ES6正式推荐的设置原型对象的方法。 -var lastWord = "last word"; +```javascript -var a = { - "first word": "hello", - [lastWord]: "world" -}; +// 格式 +Object.setPrototypeOf(object, prototype) -a["first word"] // "hello" -a[lastWord] // "world" -a["last word"] // "world" +// 用法 +var o = Object.setPrototypeOf({}, null); ``` -上面代码中,对象a的属性名lastWord是一个变量。 - -下面是一个将字符串的加法表达式作为属性名的例子。 +该方法等同于下面的函数。 ```javascript -var suffix = " word"; +function (obj, proto) { + obj.__proto__ = proto; + return obj; +} + +``` -var a = { - ["first" + suffix]: "hello", - ["last" + suffix]: "world" -}; +**(3)Object.getPrototypeOf()** -a["first word"] // "hello" -a["last word"] // "world" +该方法与setPrototypeOf方法配套,用于读取一个对象的prototype对象。 + +```javascript + +Object.getPrototypeOf(obj) ``` From 956a8860cc19a66a6aee22df090aba1323628cd0 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Fri, 26 Dec 2014 05:44:02 +0800 Subject: [PATCH 0045/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 140 +++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 69 deletions(-) diff --git a/docs/generator.md b/docs/generator.md index ae262c9e2..367de19dd 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -52,7 +52,7 @@ hw.next() 由于Generator函数返回的遍历器,只有调用next方法才会遍历下一个成员,所以其实提供了一种可以暂停执行的函数。yield语句就是暂停标志,next方法遇到yield,就会暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回对象的value属性的值。当下一次调用next方法时,再继续往下执行,直到遇到下一个yield语句。如果没有再遇到新的yield语句,就一直运行到函数结束,将return语句后面的表达式的值,作为value属性的值,如果该函数没有return语句,则value属性的值为undefined。另一方面,由于yield后面的表达式,直到调用next方法时才会执行,因此等于为JavaScript提供了手动的“惰性求值”(Lazy Evaluation)的语法功能。 -yield语句与return语句有点像,都能返回紧跟在语句后面的那个表达式的值。区别在于每次遇到yield,函数暂停执行,下一次再从该位置继续向后执行,而return语句不具备位置记忆的功能。 +yield语句与return语句有点像,都能返回紧跟在语句后面的那个表达式的值。区别在于每次遇到yield,函数暂停执行,下一次再从该位置继续向后执行,而return语句不具备位置记忆的功能。一个函数里面,只能执行一次(或者说一个)return语句,但是可以执行多次(或者说多个)yield语句。正常函数只能返回一个值,因为只能执行一次return;Generator函数可以返回一系列的值,因为可以有任意多个yield。 Generator函数可以不用yield语句,这时就变成了一个单纯的暂缓执行函数。 @@ -70,32 +70,7 @@ setTimeout(function () { ``` -上面代码中,函数f如果是普通函数,在为generator变量赋值时就会执行。但是,函数f是一个Generator函数,就变成只有调用next方法时,函数f才会执行。 - -利用Generator函数,可以在任意对象上部署iterator接口。 - -```javascript - -function* iterEntries(obj) { - let keys = Object.keys(obj); - for (let i=0; i < keys.length; i++) { - let key = keys[i]; - yield [key, obj[key]]; - } -} - -let myObj = { foo: 3, bar: 7 }; - -for (let [key, value] of iterEntries(myObj)) { - console.log(key, value); -} - -// foo 3 -// bar 7 - -``` - -上述代码中,myObj是一个普通对象,通过iterEntries函数,就有了iterator接口。也就是说,可以在任意对象上部署next方法。 +上面代码中,函数f如果是普通函数,在为变量generator赋值时就会执行。但是,函数f是一个Generator函数,就变成只有调用next方法时,函数f才会执行。 ## next方法的参数 @@ -145,9 +120,58 @@ it.next(13) 注意,由于next方法的参数表示上一个yield语句的返回值,所以第一次使用next方法时,不能带有参数。V8引擎直接忽略第一次使用next方法时的参数,只有从第二次使用next方法开始,参数才是有效的。 -## 异步操作的应用 +## for...of循环 + +for...of循环可以自动遍历Generator函数,且此时不再需要调用next方法。 + +```javascript + +function *foo() { + yield 1; + yield 2; + yield 3; + yield 4; + yield 5; + return 6; +} + +for (let v of foo()) { + console.log(v); +} +// 1 2 3 4 5 + +``` + +上面代码使用for...of循环,依次显示5个yield语句的值。这里需要注意,一旦next方法的返回对象的done属性为true,for...of循环就会中止,且不包含该返回对象,所以上面代码的return语句返回的6,不包括在for...of循环之中。 + +下面是一个利用generator函数和for...of循环,实现斐波那契数列的例子。 + +```javascript + +function* fibonacci() { + let [prev, curr] = [0, 1]; + for (;;) { + [prev, curr] = [curr, prev + curr]; + yield curr; + } +} + +for (let n of fibonacci()) { + if (n > 1000) break; + console.log(n); +} + +``` + +从上面代码可见,使用for...of语句时不需要使用next方法。 -Generator函数的这种暂停执行的效果,意味着可以把异步操作写在yield语句里面,等到调用next方法时再往后执行。这实际上等同于不需要写回调函数了,因为异步操作的后续操作可以放在yield语句下面,反正要等到调用next方法时再执行。所以,Generator函数的一个重要实际意义就是用来处理异步操作,改写回调函数。 +## 应用 + +Generator可以暂停函数执行,返回任意表达式的值。这种特点使得Generator有多种应用场景。 + +### (1)异步操作的同步化表达 + +Generator函数的暂停执行的效果,意味着可以把异步操作写在yield语句里面,等到调用next方法时再往后执行。这实际上等同于不需要写回调函数了,因为异步操作的后续操作可以放在yield语句下面,反正要等到调用next方法时再执行。所以,Generator函数的一个重要实际意义就是用来处理异步操作,改写回调函数。 ```javascript @@ -209,6 +233,8 @@ function* numbers() { 上面代码打开文本文件,使用yield语句可以手动逐行读取文件。 +### (2)控制流管理 + 总结一下,如果某个操作非常耗时,可以把它拆成N步。 ```javascript @@ -258,60 +284,36 @@ function* f(){ 上面代码使用Promise的函数库Q,yield语句返回的就是一个Promise对象。 -## for...of循环 +### (3)部署iterator接口 -for...of循环可以自动遍历Generator函数,且此时不再需要调用next方法。 +利用Generator函数,可以在任意对象上部署iterator接口。 ```javascript -function *foo() { - yield 1; - yield 2; - yield 3; - yield 4; - yield 5; - return 6; -} - -for (let v of foo()) { - console.log(v); +function* iterEntries(obj) { + let keys = Object.keys(obj); + for (let i=0; i < keys.length; i++) { + let key = keys[i]; + yield [key, obj[key]]; + } } -// 1 2 3 4 5 - -``` - -上面代码使用for...of循环,依次显示5个yield语句的值。这里需要注意,一旦next方法的返回对象的done属性为true,for...of循环就会中止,且不包含该返回对象,所以上面代码的return语句返回的6,不包括在for...of循环之中。 -下面是一个利用generator函数和for...of循环,实现斐波那契数列的例子。 - -```javascript +let myObj = { foo: 3, bar: 7 }; -function* fibonacci() { - let [prev, curr] = [0, 1]; - for (;;) { - [prev, curr] = [curr, prev + curr]; - yield curr; - } +for (let [key, value] of iterEntries(myObj)) { + console.log(key, value); } -for (let n of fibonacci()) { - if (n > 1000) break; - console.log(n); -} +// foo 3 +// bar 7 ``` -从上面代码可见,使用for...of语句时不需要使用next方法。 - -## 作为数据结构的Generator - -Generator可以暂停函数执行,返回任意表达式的值。这种特点使得Generator有多种应用场景。 +上述代码中,myObj是一个普通对象,通过iterEntries函数,就有了iterator接口。也就是说,可以在任意对象上部署next方法。 -- 异步操作的同步化表达(abstractions of async behavior) -- 控制流管理(control flow management) -- 数据结构(data structure) +### (4)作为数据结构 -第一种和第二种应用在本章前面部分,已经有所提及了。这里主要再补充一下,Generator可以看作是数据结构,因为它可以对任意表达式,提供类似数组的接口。 +Generator可以看作是数据结构,更确切地说,可以看作是一个数组结构,因为Generator函数可以返回一系列的值,这意味着它可以对任意表达式,提供类似数组的接口。 ```javascript From 15547a5abc75349f497e7e4f20ee112f1c6b08ac Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Fri, 26 Dec 2014 09:08:56 +0800 Subject: [PATCH 0046/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 390 +++++++++++++++++++++++++--------------------- docs/reference.md | 1 + 2 files changed, 213 insertions(+), 178 deletions(-) diff --git a/docs/generator.md b/docs/generator.md index 367de19dd..0815c1a54 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -2,7 +2,7 @@ ## 含义 -所谓Generator,有多种理解角度。首先,可以把它理解成一个内部状态的遍历器,即每调用一次遍历器,内部状态发生一次改变(可以理解成发生某些事件)。ES6引入Generator函数,作用就是可以完全控制内部状态的变化,依次遍历这些状态。 +所谓Generator,有多种理解角度。首先,可以把它理解成一个内部状态的遍历器,每调用一次,内部状态发生一次改变(可以理解成发生某些事件)。ES6引入Generator函数,作用就是可以完全控制内部状态的变化,依次遍历这些状态。 在形式上,Generator是一个普通函数,但是有两个特征。一是,function命令与函数名之间有一个星号;二是,函数体内部使用yield语句,定义遍历器的每个成员,即不同的内部状态(yield语句在英语里的意思就是“产出”)。 @@ -165,6 +165,217 @@ for (let n of fibonacci()) { 从上面代码可见,使用for...of语句时不需要使用next方法。 +## throw方法 + +Generator函数还有一个特点,它可以在函数体外抛出错误,然后在函数体内捕获。 + +```javascript + +var g = function* () { + while (true) { + try { + yield; + } catch (e) { + if (e != 'a') { + throw e; + } + console.log('内部捕获', e); + } + } +}; + +var i = g(); +i.next(); + +try { + i.throw('a'); + i.throw('b'); +} catch (e) { + console.log('外部捕获', e); +} +// 内部捕获 a +// 外部捕获 b + +``` + +上面代码中,遍历器i连续抛出两个错误。第一个错误被Generator函数体内的catch捕获,然后Generator函数执行完成,于是第二个错误被函数体外的catch捕获。 + +这种函数体内捕获错误的机制,大大方便了对错误的处理。如果使用回调函数的写法,想要捕获多个错误,就不得不为每个函数写一个错误处理语句。 + +```javascript + +foo('a', function (a) { + if (a.error) { + throw new Error(a.error); + } + + foo('b', function (b) { + if (b.error) { + throw new Error(b.error); + } + + foo('c', function (c) { + if (c.error) { + throw new Error(c.error); + } + + console.log(a, b, c); + }); + }); +}); + +``` + +使用Generator函数可以大大简化上面的代码。 + +```javascript + +function* g(){ + try { + var a = yield foo('a'); + var b = yield foo('b'); + var c = yield foo('c'); + } catch (e) { + console.log(e); + } + + console.log(a, b, c); + +} + +``` + +## yield*语句 + +如果yield命令后面跟的是一个遍历器,需要在yield命令后面加上星号,表明它返回的是一个遍历器。这被称为yield*语句。 + +```javascript + +let delegatedIterator = (function* () { + yield 'Hello!'; + yield 'Bye!'; +}()); + +let delegatingIterator = (function* () { + yield 'Greetings!'; + yield* delegatedIterator; + yield 'Ok, bye.'; +}()); + +for(let value of delegatingIterator) { + console.log(value); +} +// "Greetings! +// "Hello!" +// "Bye!" +// "Ok, bye." + +``` + +上面代码中,delegatingIterator是代理者,delegatedIterator是被代理者。由于`yield* delegatedIterator`语句得到的值,是一个遍历器,所以要用星号表示。运行结果就是使用一个遍历器,遍历了多个Genertor函数,有递归的效果。 + +下面是一个稍微复杂的例子,使用yield*语句遍历完全二叉树。 + +```javascript + +// 下面是二叉树的构造函数, +// 三个参数分别是左树、当前节点和右树 +function Tree(left, label, right) { + this.left = left; + this.label = label; + this.right = right; +} + +// 下面是中序(inorder)遍历函数。 +// 由于返回的是一个遍历器,所以要用generator函数。 +// 函数体内采用递归算法,所以左树和右树要用yield*遍历 +function* inorder(t) { + if (t) { + yield* inorder(t.left); + yield t.label; + yield* inorder(t.right); + } +} + +// 下面生成二叉树 +function make(array) { + // 判断是否为叶节点 + if (array.length == 1) return new Tree(null, array[0], null); + return new Tree(make(array[0]), array[1], make(array[2])); +} +let tree = make([[['a'], 'b', ['c']], 'd', [['e'], 'f', ['g']]]); + +// 遍历二叉树 +var result = []; +for (let node of inorder(tree)) { + result.push(node); +} + +result +// ['a', 'b', 'c', 'd', 'e', 'f', 'g'] + +``` + +## 作为对象属性的Generator函数 + +如果一个对象的属性是Generator函数,可以简写成下面的形式。 + +```javascript + +let obj = { + * myGeneratorMethod() { + ··· + } +}; + +``` + +它的完整形式如下,两者是等价的。 + +```javascript + +let obj = { + myGeneratorMethod: function* () { + ··· + } +}; + +``` + +## Generator与状态机 + +Generator是实现状态机的最佳结构。比如,下面的clock函数就是一个状态机。 + +```javascript + +var ticking = true; +var clock = function() { + if (ticking) + console.log('Tick!'); + else + console.log('Tock!'); + ticking = !ticking; +} + +``` + +上面代码的clock函数一共有两种状态(Tick和Tock),每运行一次,就改变一次状态。这个函数如果用Generator实现,就是下面这样。 + +```javascript + +var clock = function*(_) { + while (true) { + yield _; + console.log('Tick!'); + yield _; + console.log('Tock!'); + } +}; + +``` + +上面的Generator实现与ES5实现对比,可以看到少了用来保存状态的外部变量ticking,这样就更简洁,更安全(状态不会被非法篡改)、更符合函数式编程的思想,在写法上也更优雅。Generator之所以可以不用外部变量保存状态,是因为它本身就包含了一个状态信息,即目前是否处于暂停态。 + ## 应用 Generator可以暂停函数执行,返回任意表达式的值。这种特点使得Generator有多种应用场景。 @@ -350,180 +561,3 @@ function doStuff() { ``` 上面的函数,可以用一模一样的for...of循环处理!两相一比较,就不难看出Generator使得数据或者操作,具备了类似数组的接口。 - -## throw方法 - -Generator函数还有一个特点,它可以在函数体外抛出错误,然后在函数体内捕获。 - -```javascript - -var g = function* () { - while (true) { - try { - yield; - } catch (e) { - if (e != 'a') { - throw e; - } - console.log('内部捕获', e); - } - } -}; - -var i = g(); -i.next(); - -try { - i.throw('a'); - i.throw('b'); -} catch (e) { - console.log('外部捕获', e); -} -// 内部捕获 a -// 外部捕获 b - -``` - -上面代码中,遍历器i连续抛出两个错误。第一个错误被Generator函数体内的catch捕获,然后Generator函数执行完成,于是第二个错误被函数体外的catch捕获。 - -这种函数体内捕获错误的机制,大大方便了对错误的处理。如果使用回调函数的写法,想要捕获多个错误,就不得不为每个函数写一个错误处理语句。 - -```javascript - -foo('a', function (a) { - if (a.error) { - throw new Error(a.error); - } - - foo('b', function (b) { - if (b.error) { - throw new Error(b.error); - } - - foo('c', function (c) { - if (c.error) { - throw new Error(c.error); - } - - console.log(a, b, c); - }); - }); -}); - -``` - -使用Generator函数可以大大简化上面的代码。 - -```javascript - -function* g(){ - try { - var a = yield foo('a'); - var b = yield foo('b'); - var c = yield foo('c'); - } catch (e) { - console.log(e); - } - - console.log(a, b, c); - -} - -``` - -## yield*语句 - -如果yield命令后面跟的是一个遍历器,需要在yield命令后面加上星号,表明它返回的是一个遍历器。这被称为yield*语句。 - -```javascript - -let delegatedIterator = (function* () { - yield 'Hello!'; - yield 'Bye!'; -}()); - -let delegatingIterator = (function* () { - yield 'Greetings!'; - yield* delegatedIterator; - yield 'Ok, bye.'; -}()); - -for(let value of delegatingIterator) { - console.log(value); -} -// "Greetings! -// "Hello!" -// "Bye!" -// "Ok, bye." - -``` - -上面代码中,delegatingIterator是代理者,delegatedIterator是被代理者。由于`yield* delegatedIterator`语句得到的值,是一个遍历器,所以要用星号表示。运行结果就是使用一个遍历器,遍历了多个Genertor函数,有递归的效果。 - -下面是一个稍微复杂的例子,使用yield*语句遍历完全二叉树。 - -```javascript - -// 下面是二叉树的构造函数, -// 三个参数分别是左树、当前节点和右树 -function Tree(left, label, right) { - this.left = left; - this.label = label; - this.right = right; -} - -// 下面是中序(inorder)遍历函数。 -// 由于返回的是一个遍历器,所以要用generator函数。 -// 函数体内采用递归算法,所以左树和右树要用yield*遍历 -function* inorder(t) { - if (t) { - yield* inorder(t.left); - yield t.label; - yield* inorder(t.right); - } -} - -// 下面生成二叉树 -function make(array) { - // 判断是否为叶节点 - if (array.length == 1) return new Tree(null, array[0], null); - return new Tree(make(array[0]), array[1], make(array[2])); -} -let tree = make([[['a'], 'b', ['c']], 'd', [['e'], 'f', ['g']]]); - -// 遍历二叉树 -var result = []; -for (let node of inorder(tree)) { - result.push(node); -} - -result -// ['a', 'b', 'c', 'd', 'e', 'f', 'g'] - -``` - -## 作为对象属性的Generator函数 - -如果一个对象的属性是Generator函数,可以简写成下面的形式。 - -```javascript - -let obj = { - * myGeneratorMethod() { - ··· - } -}; - -``` - -它的完整形式如下,两者是等价的。 - -```javascript - -let obj = { - myGeneratorMethod: function* () { - ··· - } -}; - -``` diff --git a/docs/reference.md b/docs/reference.md index b3bfe2d55..6deea0faf 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -47,6 +47,7 @@ - Kyle Simpson, [ES6 Generators: Complete Series](http://davidwalsh.name/es6-generators): 由浅入深探讨Generator的系列文章,共四篇 - Gajus Kuizinas, [The Definitive Guide to the JavaScript Generators](http://gajus.com/blog/2/the-definetive-guide-to-the-javascript-generators): 对Generator的综合介绍 - Jan Krems, [Generators Are Like Arrays](https://gist.github.com/jkrems/04a2b34fb9893e4c2b5c): 讨论Generator可以被当作数据结构看待 +- Harold Cooper, [Coroutine Event Loops in Javascript](http://syzygy.st/javascript-coroutines/): Generator用于实现状态机 ## Promise对象 From 78cacd8b27855a3c35f4ddf5a7e7b7de184a2605 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 28 Dec 2014 14:41:16 +0800 Subject: [PATCH 0047/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/generator.md b/docs/generator.md index 0815c1a54..7ecdeeead 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -52,7 +52,7 @@ hw.next() 由于Generator函数返回的遍历器,只有调用next方法才会遍历下一个成员,所以其实提供了一种可以暂停执行的函数。yield语句就是暂停标志,next方法遇到yield,就会暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回对象的value属性的值。当下一次调用next方法时,再继续往下执行,直到遇到下一个yield语句。如果没有再遇到新的yield语句,就一直运行到函数结束,将return语句后面的表达式的值,作为value属性的值,如果该函数没有return语句,则value属性的值为undefined。另一方面,由于yield后面的表达式,直到调用next方法时才会执行,因此等于为JavaScript提供了手动的“惰性求值”(Lazy Evaluation)的语法功能。 -yield语句与return语句有点像,都能返回紧跟在语句后面的那个表达式的值。区别在于每次遇到yield,函数暂停执行,下一次再从该位置继续向后执行,而return语句不具备位置记忆的功能。一个函数里面,只能执行一次(或者说一个)return语句,但是可以执行多次(或者说多个)yield语句。正常函数只能返回一个值,因为只能执行一次return;Generator函数可以返回一系列的值,因为可以有任意多个yield。 +yield语句与return语句有点像,都能返回紧跟在语句后面的那个表达式的值。区别在于每次遇到yield,函数暂停执行,下一次再从该位置继续向后执行,而return语句不具备位置记忆的功能。一个函数里面,只能执行一次(或者说一个)return语句,但是可以执行多次(或者说多个)yield语句。正常函数只能返回一个值,因为只能执行一次return;Generator函数可以返回一系列的值,因为可以有任意多个yield。从另一个角度看,也可以说Generator生成了一系列的值,这也就是它的名称的来历(在英语中,generator这个词是“生成器”的意思)。 Generator函数可以不用yield语句,这时就变成了一个单纯的暂缓执行函数。 @@ -561,3 +561,13 @@ function doStuff() { ``` 上面的函数,可以用一模一样的for...of循环处理!两相一比较,就不难看出Generator使得数据或者操作,具备了类似数组的接口。 + +## Generator与协程 + +协程(coroutine)是一种程序运行的方式。传统的“子例程”(subroutine)采用堆栈式“后进先出”的执行方式,只有当调用的子函数完全执行完毕,才会结束执行父函数。协程与其不同,多个函数可以并行执行,但是只有一个函数处于正在运行的状态,其他函数都处于暂停态(suspended),函数之间可以交换执行权。也就是说,一个函数执行到一半,可以暂停执行,将执行权交给另一个函数,等到稍后收回执行权的时候,再恢复执行。这种可以并行执行、交换执行权的函数,就称为协程。 + +不难看出,协程适合用于多任务运行的环境。在这个意义上,它与线程很相似,都有自己的执行上下文、可以分享全局变量。它们的不同之处在于,同一时间可以有多个线程处于运行状态,但是运行的协程只能有一个,其他都处于暂停状态。此外,线程是抢先式的,到底哪个线程优先得到资源,必须由运行环境决定,但是协程是合作式的,执行权由协程自己分配。 + +Generator函数是ECMAScript 6对协程的实现,但属于不完全实现,只做到了暂停执行和转移执行权,有一些特性没有实现,比如不支持所调用的函数之中的yield语句。 + +如果将Generator函数看作多任务运行的方式,存在多个进入点和退出点。那么,一方面,并发的多任务可以写成多个Generator函数;另一方面,继发的任务则可以按照发生顺序,写在一个Generator函数之中。 From 189741eeed527904c0f4ae96339edd6e56238b3e Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 28 Dec 2014 22:01:28 +0800 Subject: [PATCH 0048/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9iterator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/destructuring.md | 11 +++ docs/function.md | 25 +++++ docs/generator.md | 65 ++++++++++++- docs/iterator.md | 212 ++++++++++++++++++++++++++++++------------ docs/reference.md | 4 +- 5 files changed, 257 insertions(+), 60 deletions(-) diff --git a/docs/destructuring.md b/docs/destructuring.md index c7bb98420..36ad9e1bc 100644 --- a/docs/destructuring.md +++ b/docs/destructuring.md @@ -99,6 +99,17 @@ const [v1, v2, ..., vN ] = array; ``` +对于Set结构,也可以使用数组的解构赋值。 + +```javascript + +[a, b, c] = new Set(["a", "b", "c"]) +a // "a" + +``` + +事实上,只要某种数据结构具有Iterator接口,都可以采用数组形式的结构赋值。 + ## 对象的解构赋值 解构不仅可以用于数组,还可以用于对象。 diff --git a/docs/function.md b/docs/function.md index 6487adf8f..e78dbacf7 100644 --- a/docs/function.md +++ b/docs/function.md @@ -219,6 +219,31 @@ d ``` +扩展运算符还可以将字符串转为真正的数组。 + +```javascript + +[..."hello"] +// [ "h", "e", "l", "l", "o" ] + +``` + +扩展运算符内部调用的是数据结构的Iterator接口,因此只要具有Iterator接口的对象,都可以使用扩展运算符。 + +```javascript + +var go = function*(){ + yield 1; + yield 2; + yield 3; +}; + +[...go()] // [1, 2, 3] + +``` + +上面代码中,变量go是一个Generator函数,执行后返回的是一个遍历器,对这个遍历器执行扩展运算符,就会将内部遍历得到的值,转为一个数组。 + ## 箭头函数 ES6允许使用“箭头”(=>)定义函数。 diff --git a/docs/generator.md b/docs/generator.md index 7ecdeeead..22a40054f 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -268,12 +268,53 @@ for(let value of delegatingIterator) { // "Greetings! // "Hello!" // "Bye!" -// "Ok, bye." +// "Ok, bye." ``` 上面代码中,delegatingIterator是代理者,delegatedIterator是被代理者。由于`yield* delegatedIterator`语句得到的值,是一个遍历器,所以要用星号表示。运行结果就是使用一个遍历器,遍历了多个Genertor函数,有递归的效果。 +如果`yield*`后面跟着一个数组,就表示该数组会返回一个遍历器,因此就会遍历数组成员。 + +```javascript + +function* gen(){ + yield* ["a", "b", "c"]; +} + +gen().next() // { value:"a", done:false } + +``` + +上面代码中,yield命令后面如果不加星号,返回的是整个数组,加了星号就表示返回的是数组的遍历器。 + +`yield*`命令可以很方便地取出嵌套数组的所有成员。 + +```javascript + +function* iterTree(tree) { + if (Array.isArray(tree)) { + for(let i=0; i < tree.length; i++) { + yield* iterTree(tree[i]); + } + } else { + yield tree; + } +} + +const tree = [ 'a', ['b', 'c'], ['d', 'e'] ]; + +for(let x of iterTree(tree)) { + console.log(x); +} +// a +// b +// c +// d +// e + +``` + 下面是一个稍微复杂的例子,使用yield*语句遍历完全二叉树。 ```javascript @@ -522,6 +563,26 @@ for (let [key, value] of iterEntries(myObj)) { 上述代码中,myObj是一个普通对象,通过iterEntries函数,就有了iterator接口。也就是说,可以在任意对象上部署next方法。 +下面是一个对数组部署Iterator接口的例子,尽管数组原生具有这个接口。 + +```javascript + +function* makeSimpleGenerator(array){ + var nextIndex = 0; + + while(nextIndex < array.length){ + yield array[nextIndex++]; + } +} + +var gen = makeSimpleGenerator(['yo', 'ya']); + +gen.next().value // 'yo' +gen.next().value // 'ya' +gen.next().done // true + +``` + ### (4)作为数据结构 Generator可以看作是数据结构,更确切地说,可以看作是一个数组结构,因为Generator函数可以返回一系列的值,这意味着它可以对任意表达式,提供类似数组的接口。 @@ -570,4 +631,4 @@ function doStuff() { Generator函数是ECMAScript 6对协程的实现,但属于不完全实现,只做到了暂停执行和转移执行权,有一些特性没有实现,比如不支持所调用的函数之中的yield语句。 -如果将Generator函数看作多任务运行的方式,存在多个进入点和退出点。那么,一方面,并发的多任务可以写成多个Generator函数;另一方面,继发的任务则可以按照发生顺序,写在一个Generator函数之中。 +如果将Generator函数看作多任务运行的方式,存在多个进入点和退出点。那么,一方面,并发的多任务可以写成多个Generator函数;另一方面,继发的任务则可以按照发生顺序,写在一个Generator函数之中,然后用一个任务管理函数执行(参考本节的“控制流管理”部分)。 diff --git a/docs/iterator.md b/docs/iterator.md index ab210261b..5fa15b160 100644 --- a/docs/iterator.md +++ b/docs/iterator.md @@ -2,47 +2,44 @@ ## Iterator(遍历器) -遍历器(Iterator)是一种协议,任何对象只要部署这个协议,就可以完成遍历操作。在ES6中,遍历操作特指for...of循环。 +遍历器(Iterator)是一种接口规格,任何对象只要部署这个接口,就可以完成遍历操作。它的作用有两个,一是为各种数据结构,提供一个统一的、简便的接口,二是使得对象的属性能够按某种次序排列。在ES6中,遍历操作特指for...of循环,即Iterator接口主要供for...of循环使用。 -它的作用主要有两个,一是为遍历对象的属性提供统一的接口,二是为使得对象的属性能够按次序排列。 - -ES6的遍历器协议规定,部署了next方法的对象,就具备了遍历器功能。next方法必须返回一个包含value和done两个属性的对象。其中,value属性是当前遍历位置的值,done属性是一个布尔值,表示遍历是否结束。 +遍历器提供了一个指针,指向当前对象的某个属性,使用next方法,就可以将指针移动到下一个属性。next方法返回一个包含value和done两个属性的对象。其中,value属性是当前遍历位置的值,done属性是一个布尔值,表示遍历是否结束。下面是一个模拟next方法返回值的例子。 ```javascript function makeIterator(array){ - var nextIndex = 0; - - return { - next: function(){ - return nextIndex < array.length ? - {value: array[nextIndex++], done: false} : - {value: undefined, done: true}; - } + var nextIndex = 0; + return { + next: function(){ + return nextIndex < array.length ? + {value: array[nextIndex++], done: false} : + {value: undefined, done: true}; } + } } var it = makeIterator(['a', 'b']); -it.next().value // 'a' -it.next().value // 'b' -it.next().done // true +it.next() // { value: "a", done: false } +it.next() // { value: "b", done: false } +it.next() // { value: undefined, done: true } ``` -上面代码定义了一个makeIterator函数,它的作用是返回一个遍历器对象,用来遍历参数数组。请特别注意,next返回值的构造。 +上面代码定义了一个makeIterator函数,它的作用是返回一个遍历器对象,用来遍历参数数组。next方法依次遍历数组的每个成员,请特别注意,next返回值的构造。 下面是一个无限运行的遍历器例子。 ```javascript function idMaker(){ - var index = 0; + var index = 0; - return { - next: function(){ - return {value: index++, done: false}; - } + return { + next: function(){ + return {value: index++, done: false}; } + } } var it = idMaker(); @@ -54,29 +51,135 @@ it.next().value // '2' ``` -在ES6中,数组、类似数组的对象、Set和Map结构,都原生具备iterator接口,可以被for...of循环遍历。 +上面的例子,只是为了说明next方法返回值的结构。Iterator接口返回的遍历器,原生具备next方法,不用自己部署。所以,真正需要部署的是Iterator接口,让其返回一个遍历器。在ES6中,有三类数据结构原生具备Iterator接口:数组、类似数组的对象、Set和Map结构。除此之外,其他数据结构(主要是对象)的Iterator接口都需要自己部署。 -## for...of循环 +下面就是如何部署Iterator接口。一个对象如果要有Iterator接口,必须部署一个@@iterator方法(原型链上的对象具有该方法也可),该方法部署在一个键名为`Symbol.iterator`的属性上,对应的键值是一个函数,该函数返回一个遍历器对象。 + +```javascript + +class MySpecialTree { + // ... + [Symbol.iterator]() { + // ... + return theIterator; + } +} + +``` + +上面代码是一个类部署Iterator接口的写法。`Symbol.iterator`是一个表达式,返回一个Symbol对象的iterator属性,这是一个类型为Symbol的特殊值,所以要放在方括号内。这里要注意,@@iterator的键名是`Symbol.iterator`,该方法执行后,返回一个当前对象的遍历器。 + +《数组的扩展》一章中提到,ES6对数组提供entries()、keys()和values()三个方法,就是返回三个遍历器。 + +```javascript + +var arr = [1, 5, 7]; +var arrEntries = arr.entries(); + +arrEntries.toString() +// "[object Array Iterator]" + +arrEntries === arrEntries[Symbol.iterator]() +// true + +``` + +上面代码中,entries方法返回的是一个遍历器(iterator),本质上就是调用了`Symbol.iterator`方法。 + +字符串是一个类似数组的对象,因此也原生具有Iterator接口。 + +```javascript + +var someString = "hi"; +typeof someString[Symbol.iterator] +// "function" + +var iterator = someString[Symbol.iterator](); + +iterator.next() // { value: "h", done: false } +iterator.next() // { value: "i", done: false } +iterator.next() // { value: undefined, done: true } + +``` + +上面代码中,调用`Symbol.iterator`方法返回一个遍历器,在这个遍历器上可以调用next方法,实现对于字符串的遍历。 + +可以覆盖原生的`Symbol.iterator`方法,达到修改遍历器行为的目的。 + +```javascript -ES6中,一个对象只要部署了next方法,就被视为具有iterator接口,就可以用for...of循环遍历它的值。下面用上一节的idMaker函数生成的it遍历器作为例子。 +var str = new String("hi"); + +[...str] // ["h", "i"] + +str[Symbol.iterator] = function() { + return { + next: function() { + if (this._first) { + this._first = false; + return { value: "bye", done: false }; + } else { + return { done: true }; + } + }, + _first: true + }; +}; + +[...str] // ["bye"] +str // "hi" + +``` + +上面代码中,字符串str的`Symbol.iterator`方法被修改了,所以扩展运算符(...)返回的值变成了bye,而字符串本身还是hi。 + +部署`Symbol.iterator`方法的最简单实现,还是使用下一节要提到的Generator函数。 ```javascript -for (var n of it) { - if (n > 5) - break; - console.log(n); +var myIterable = {}; + +myIterable[Symbol.iterator] = function* () { + yield 1; + yield 2; + yield 3; +}; +[...myIterable] // [1, 2, 3] + +// 或者采用下面的简洁写法 + +let obj = { + * [Symbol.iterator]() { + yield 'hello'; + yield 'world'; + } +}; + +for (let x of obj) { + console.log(x); } -// 0 -// 1 -// 2 -// 3 -// 4 -// 5 +// hello +// world + +``` + +如果`Symbol.iterator`方法返回的不是遍历器,解释引擎将会报错。 + +```javascript + +var obj = {}; + +obj[Symbol.iterator] = () => 1; + +[...obj] // TypeError: [] is not a function ``` -上面代码说明,for...of默认从0开始循环。 +上面代码中,变量obj的@@iterator方法返回的不是遍历器,因此报错。 + +## for...of循环 + +ES6中,一个对象只要部署了@@iterator方法,就被视为具有iterator接口,就可以用for...of循环遍历它的值。也就是说,for...of循环内部调用是原对象的`Symbol.iterator`方法。 数组原生具备iterator接口。 @@ -85,15 +188,23 @@ for (var n of it) { const arr = ['red', 'green', 'blue']; for(let v of arr) { - console.log(v); + console.log(v); // red green blue } -// red -// green -// blue ``` -for...of循环完全可以取代数组实例的forEach方法。 +上面代码说明,for...of循环可以代替数组实例的forEach方法。 + +```javascript + +const arr = ['red', 'green', 'blue']; + +arr.forEach(function (element, index) { + console.log(element); // red green blue + console.log(index); // 0 1 2 +}); + +``` JavaScript原有的for...in循环,只能获得对象的键名,不能直接获取键值。ES6提供for...of循环,允许遍历获得键值。 @@ -101,26 +212,18 @@ JavaScript原有的for...in循环,只能获得对象的键名,不能直接 var arr = ["a", "b", "c", "d"]; for (a in arr) { - console.log(a); + console.log(a); // 0 1 2 3 } -// 0 -// 1 -// 2 -// 3 for (a of arr) { - console.log(a); + console.log(a); // a b c d } -// a -// b -// c -// d ``` 上面代码表明,for...in循环读取键名,for...of循环读取键值。如果要通过for...of循环,获取数组的索引,可以借助数组实例的entries方法和keys方法,参见《数组的扩展》章节。 -对于Set和Map结构的数据,可以直接使用for...of循环。 +Set和Map结构也原生具有Iterator接口,可以直接使用for...of循环。 ```javascript @@ -182,13 +285,8 @@ for (e of es6) { let str = "hello"; for (let s of str) { - console.log(s); + console.log(s); // h e l l o } -// h -// e -// l -// l -// o // DOM NodeList对象的例子 diff --git a/docs/reference.md b/docs/reference.md index 6deea0faf..1f61d8bab 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -35,9 +35,10 @@ - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 - Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 -## Generator +## Iterator和Generator - Mozilla Developer Network, [Iterators and generators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators) +- Mozilla Developer Network, [The Iterator protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/The_Iterator_protocol) - Matt Baker, [Replacing callbacks with ES6 Generators](http://flippinawesome.org/2014/02/10/replacing-callbacks-with-es6-generators/) - Steven Sanderson, [Experiments with Koa and JavaScript Generators](http://blog.stevensanderson.com/2013/12/21/experiments-with-koa-and-javascript-generators/) - jmar777, [What's the Big Deal with Generators?](http://devsmash.com/blog/whats-the-big-deal-with-generators) @@ -63,6 +64,7 @@ - Jack Franklin, [JavaScript Modules the ES6 Way](http://24ways.org/2014/javascript-modules-the-es6-way/): ES6模块入门 - Axel Rauschmayer, [ECMAScript 6 modules: the final syntax](http://www.2ality.com/2014/09/es6-modules-final.html): ES6模块的介绍,以及与CommonJS规格的详细比较 - Dave Herman, [Static module resolution](http://calculist.org/blog/2012/06/29/static-module-resolution/): ES6模块的静态化设计思想 +- Axel Rauschmayer, [ECMAScript 6: new OOP features besides classes](http://www.2ality.com/2014/12/es6-oop.html) ## 工具 From 38adc8e8ebb140b2cbb9523f021000f8cfc8e471 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 28 Dec 2014 23:34:33 +0800 Subject: [PATCH 0049/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9symbol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 48 +++++++++++++++++++++++--- docs/iterator.md | 28 ++++++++++++++- docs/object.md | 87 ++++++++++++++++++++++++++++++++++++++++++----- docs/reference.md | 1 + 4 files changed, 149 insertions(+), 15 deletions(-) diff --git a/docs/generator.md b/docs/generator.md index 22a40054f..d913c8176 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -487,15 +487,53 @@ function* numbers() { ### (2)控制流管理 -总结一下,如果某个操作非常耗时,可以把它拆成N步。 +如果有一个多步操作非常耗时,采用回调函数,可能会写成下面这样。 + +```javascript + +step1(function (value1) { + step2(value1, function(value2) { + step3(value2, function(value3) { + step4(value3, function(value4) { + // Do something with value4 + }); + }); + }); +}); + +``` + +采用Promise改写上面的代码。 + +```javascript + +Q.fcall(step1) +.then(step2) +.then(step3) +.then(step4) +.then(function (value4) { + // Do something with value4 +}, function (error) { + // Handle any error from step1 through step4 +}) +.done(); + +``` + +上面代码已经把回调函数,改成了直线执行的形式。Generator函数可以进一步改善代码运行流程。 ```javascript function* longRunningTask() { - yield step1(); - yield step2(); - // ... - yield stepN(); + try { + var value1 = yield step1(); + var value2 = yield step2(value1); + var value3 = yield step3(value2); + var value4 = yield step4(value3); + // Do something with value4 + } catch (e) { + // Handle any error from step1 through step4 + } } ``` diff --git a/docs/iterator.md b/docs/iterator.md index 5fa15b160..d63d61c69 100644 --- a/docs/iterator.md +++ b/docs/iterator.md @@ -67,7 +67,33 @@ class MySpecialTree { ``` -上面代码是一个类部署Iterator接口的写法。`Symbol.iterator`是一个表达式,返回一个Symbol对象的iterator属性,这是一个类型为Symbol的特殊值,所以要放在方括号内。这里要注意,@@iterator的键名是`Symbol.iterator`,该方法执行后,返回一个当前对象的遍历器。 +上面代码是一个类部署Iterator接口的写法。`Symbol.iterator`是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为Symbol的特殊值,所以要放在方括号内(请参考Symbol一节)。这里要注意,@@iterator的键名是`Symbol.iterator`,键值是一个方法(函数),该方法执行后,返回一个当前对象的遍历器。 + +下面是为对象添加Iterator接口的例子。 + +```javascript + +let obj = { + data: [ 'hello', 'world' ], + [Symbol.iterator]() { + const self = this; + let index = 0; + return { + next() { + if (index < self.data.length) { + return { + value: self.data[index++], + done: false + }; + } else { + return { value: undefined, done: true }; + } + } + }; + } +}; + +``` 《数组的扩展》一章中提到,ES6对数组提供entries()、keys()和values()三个方法,就是返回三个遍历器。 diff --git a/docs/object.md b/docs/object.md index 60986c8cd..8a030e6dc 100644 --- a/docs/object.md +++ b/docs/object.md @@ -305,7 +305,20 @@ Object.getPrototypeOf(obj) ## Symbol -ES6引入了一种新的原始数据类型Symbol。它通过Symbol函数生成。 +ES6引入了一种新的原始数据类型Symbol,表示独一无二的ID。它通过Symbol函数生成。 + +```javascript + +let symbol1 = Symbol(); + +typeof symbol +// "symbol" + +``` + +上面代码中,变量symbol1就是一个独一无二的ID。typeof运算符的结果,表明变量symbol1是Symbol数据类型,而不是字符串之类的其他类型。 + +Symbol函数可以接受一个字符串作为参数,表示Symbol实例的名称。 ```javascript @@ -314,15 +327,34 @@ var mySymbol = Symbol('Test'); mySymbol.name // Test -typeof mySymbol -// "symbol" - ``` -上面代码表示,Symbol函数接受一个字符串作为参数,用来指定生成的Symbol的名称,可以通过name属性读取。typeof运算符的结果,表明Symbol是一种单独的数据类型。 +上面代码表示,Symbol函数的字符串参数,用来指定生成的Symbol的名称,可以通过name属性读取。之所以要新增name属性,是因为键名是Symbol类型,而有些场合需要一个字符串类型的值来指代这个键。 注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。 +Symbol类型的值不能与其他类型的值进行运算,会报错。 + +```javascript + +var sym = Symbol('My symbol'); +'' + sym +// TypeError: Cannot convert a Symbol value to a string + +``` + +但是,Symbol类型的值可以转为字符串。 + +```javascript + +String(sym) +// 'Symbol(My symbol)' + +sym.toString() +// 'Symbol(My symbol)' + +``` + symbol的最大特点,就是每一个Symbol都是不相等的,保证产生一个独一无二的值。 ```javascript @@ -331,6 +363,10 @@ let w1 = Symbol(); let w2 = Symbol(); let w3 = Symbol(); +w1 === w2 // false +w1 === w3 // false +w2 === w3 // false + function f(w) { switch (w) { case w1: @@ -346,18 +382,27 @@ function f(w) { 上面代码中,w1、w2、w3三个变量都等于`Symbol()`,但是它们的值是不相等的。 -由于这种特点,Symbol类型适合作为标识符,用于对象的属性名,保证了属性名之间不会发生冲突。如果一个对象由多个模块构成,这样就不会出现同名的属性。另一种用途是,可以防止属性值被不小心修改。 +由于这种特点,Symbol类型适合作为标识符,用于对象的属性名,保证了属性名之间不会发生冲突。如果一个对象由多个模块构成,这样就不会出现同名的属性,也就防止了键值被不小心改写或覆盖。Symbol类型还可以用于定义一组常量,防止它们的值发生冲突。 ```javascript -var a = {}; var mySymbol = Symbol(); +// 第一种写法 +var a = {}; a[mySymbol] = 'Hello!'; -//另一种写法 +// 第二种写法 +var a = { + [mySymbol]: 123 +}; + +// 第三种写法 +var a = {}; Object.defineProperty(a, mySymbol, { value: 'Hello!' }); +a[mySymbol] // "Hello!" + ``` 上面代码通过方括号结构和Object.defineProperty两种方法,将对象的属性名指定为一个Symbol值。 @@ -387,6 +432,15 @@ a.size // 1 ``` +为Symbol函数添加一个参数,就可以引用了。 + +```javascript + +let a = Map(); +a.set(Symbol('my_key'), 'Noise'); + +``` + 如果要在对象内部使用Symbol属性名,必须采用属性名表达式。 ```javascript @@ -411,7 +465,7 @@ let obj = { ``` -Symbol类型作为属性名,不会出现在for...in循环中,也不会被Object.getOwnPropertyNames方法返回,但是有一个对应的Object.getOwnPropertySymbols方法,以及Object.getOwnPropertyKeys方法都可以获取Symbol属性名。 +Symbol类型作为属性名,不会出现在for...in循环中,也不会被Object.keys()、Object.getOwnPropertyNames()返回,但是有一个对应的Object.getOwnPropertySymbols方法,以及Object.getOwnPropertyKeys方法都可以获取Symbol属性名。 ```javascript @@ -433,6 +487,21 @@ Object.getOwnPropertySymbols(obj) 上面代码中,使用Object.getOwnPropertyNames方法得不到Symbol属性名,需要使用Object.getOwnPropertySymbols方法。 +Reflect.ownKeys方法返回所有类型的键名。 + +```javascript + +let obj = { + [Symbol('my_key')]: 1, + enum: 2, + nonEnum: 3 +}; + +Reflect.ownKeys(obj) +// [Symbol(my_key), 'enum', 'nonEnum'] + +``` + ## Proxy 所谓Proxy,可以理解成在目标对象之前,架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。 diff --git a/docs/reference.md b/docs/reference.md index 1f61d8bab..d8402bb59 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -34,6 +34,7 @@ - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 - Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 +- Axel Rauschmayer, [Symbols in ECMAScript 6](http://www.2ality.com/2014/12/es6-symbols.html): Symbol简介 ## Iterator和Generator From 2556bf89627fa823c7437d4951327d4a79f025d2 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 30 Dec 2014 09:29:50 +0800 Subject: [PATCH 0050/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9Readme=E5=92=8Cgene?= =?UTF-8?q?rator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/generator.md | 37 +++++++++++++++++++++---------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 0fe044b2a..1c34d93b8 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 本书为中级难度,适合已有一定JavaScript语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。 -全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。电子版与纸版的内容是一致的,如果您对本书感兴趣,建议考虑购买纸版。这样可以使出版社不因出版开源书籍而亏钱,进而鼓励更多的作者开源自己的书籍。 +全书已由电子工业出版社出版([版权页](images/copyright.png),[内页1](images/page1.png),[内页2](images/page2.png)),铜版纸全彩印刷,附有索引。纸版是根据电子版排印的,内容截止到2014年10月,感谢张春雨编辑支持我将全书开源的做法。如果您对本书感兴趣,建议考虑购买纸版。这样可以使出版社不因出版开源书籍而亏钱,进而鼓励更多的作者开源自己的书籍。 - [京东](http://item.jd.com/11526272.html) - [当当](http://product.dangdang.com/23546442.html) diff --git a/docs/generator.md b/docs/generator.md index d913c8176..a560a3e79 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -1,6 +1,8 @@ # Generator 函数 -## 含义 +## 语法 + +### 简介 所谓Generator,有多种理解角度。首先,可以把它理解成一个内部状态的遍历器,每调用一次,内部状态发生一次改变(可以理解成发生某些事件)。ES6引入Generator函数,作用就是可以完全控制内部状态的变化,依次遍历这些状态。 @@ -72,7 +74,7 @@ setTimeout(function () { 上面代码中,函数f如果是普通函数,在为变量generator赋值时就会执行。但是,函数f是一个Generator函数,就变成只有调用next方法时,函数f才会执行。 -## next方法的参数 +### next方法的参数 yield语句本身没有返回值,或者说总是返回undefined。next方法可以带一个参数,该参数就会被当作上一个yield语句的返回值。 @@ -120,7 +122,7 @@ it.next(13) 注意,由于next方法的参数表示上一个yield语句的返回值,所以第一次使用next方法时,不能带有参数。V8引擎直接忽略第一次使用next方法时的参数,只有从第二次使用next方法开始,参数才是有效的。 -## for...of循环 +### for...of循环 for...of循环可以自动遍历Generator函数,且此时不再需要调用next方法。 @@ -165,7 +167,7 @@ for (let n of fibonacci()) { 从上面代码可见,使用for...of语句时不需要使用next方法。 -## throw方法 +### throw方法 Generator函数还有一个特点,它可以在函数体外抛出错误,然后在函数体内捕获。 @@ -245,7 +247,7 @@ function* g(){ ``` -## yield*语句 +### yield*语句 如果yield命令后面跟的是一个遍历器,需要在yield命令后面加上星号,表明它返回的是一个遍历器。这被称为yield*语句。 @@ -357,7 +359,7 @@ result ``` -## 作为对象属性的Generator函数 +### 作为对象属性的Generator函数 如果一个对象的属性是Generator函数,可以简写成下面的形式。 @@ -383,7 +385,9 @@ let obj = { ``` -## Generator与状态机 +## 含义 + +### Generator与状态机 Generator是实现状态机的最佳结构。比如,下面的clock函数就是一个状态机。 @@ -417,6 +421,16 @@ var clock = function*(_) { 上面的Generator实现与ES5实现对比,可以看到少了用来保存状态的外部变量ticking,这样就更简洁,更安全(状态不会被非法篡改)、更符合函数式编程的思想,在写法上也更优雅。Generator之所以可以不用外部变量保存状态,是因为它本身就包含了一个状态信息,即目前是否处于暂停态。 +### Generator与协程 + +协程(coroutine)是一种程序运行的方式。传统的“子例程”(subroutine)采用堆栈式“后进先出”的执行方式,只有当调用的子函数完全执行完毕,才会结束执行父函数。协程与其不同,多个函数可以并行执行,但是只有一个函数处于正在运行的状态,其他函数都处于暂停态(suspended),函数之间可以交换执行权。也就是说,一个函数执行到一半,可以暂停执行,将执行权交给另一个函数,等到稍后收回执行权的时候,再恢复执行。这种可以并行执行、交换执行权的函数,就称为协程。 + +不难看出,协程适合用于多任务运行的环境。在这个意义上,它与线程很相似,都有自己的执行上下文、可以分享全局变量。它们的不同之处在于,同一时间可以有多个线程处于运行状态,但是运行的协程只能有一个,其他都处于暂停状态。此外,线程是抢先式的,到底哪个线程优先得到资源,必须由运行环境决定,但是协程是合作式的,执行权由协程自己分配。 + +Generator函数是ECMAScript 6对协程的实现,但属于不完全实现,只做到了暂停执行和转移执行权,有一些特性没有实现,比如不支持所调用的函数之中的yield语句。 + +如果将Generator函数看作多任务运行的方式,存在多个进入点和退出点。那么,一方面,并发的多任务可以写成多个Generator函数;另一方面,继发的任务则可以按照发生顺序,写在一个Generator函数之中,然后用一个任务管理函数执行(参考本节的“控制流管理”部分)。 + ## 应用 Generator可以暂停函数执行,返回任意表达式的值。这种特点使得Generator有多种应用场景。 @@ -661,12 +675,3 @@ function doStuff() { 上面的函数,可以用一模一样的for...of循环处理!两相一比较,就不难看出Generator使得数据或者操作,具备了类似数组的接口。 -## Generator与协程 - -协程(coroutine)是一种程序运行的方式。传统的“子例程”(subroutine)采用堆栈式“后进先出”的执行方式,只有当调用的子函数完全执行完毕,才会结束执行父函数。协程与其不同,多个函数可以并行执行,但是只有一个函数处于正在运行的状态,其他函数都处于暂停态(suspended),函数之间可以交换执行权。也就是说,一个函数执行到一半,可以暂停执行,将执行权交给另一个函数,等到稍后收回执行权的时候,再恢复执行。这种可以并行执行、交换执行权的函数,就称为协程。 - -不难看出,协程适合用于多任务运行的环境。在这个意义上,它与线程很相似,都有自己的执行上下文、可以分享全局变量。它们的不同之处在于,同一时间可以有多个线程处于运行状态,但是运行的协程只能有一个,其他都处于暂停状态。此外,线程是抢先式的,到底哪个线程优先得到资源,必须由运行环境决定,但是协程是合作式的,执行权由协程自己分配。 - -Generator函数是ECMAScript 6对协程的实现,但属于不完全实现,只做到了暂停执行和转移执行权,有一些特性没有实现,比如不支持所调用的函数之中的yield语句。 - -如果将Generator函数看作多任务运行的方式,存在多个进入点和退出点。那么,一方面,并发的多任务可以写成多个Generator函数;另一方面,继发的任务则可以按照发生顺序,写在一个Generator函数之中,然后用一个任务管理函数执行(参考本节的“控制流管理”部分)。 From fa535283126ef0cf11f54095b8c50aa59dc7dbc9 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 30 Dec 2014 14:01:25 +0800 Subject: [PATCH 0051/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9object/proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/object.md | 116 +++++++++++++++++++++++++++++++++++++++------- docs/reference.md | 10 ++-- 2 files changed, 107 insertions(+), 19 deletions(-) diff --git a/docs/object.md b/docs/object.md index 8a030e6dc..11408ceca 100644 --- a/docs/object.md +++ b/docs/object.md @@ -504,16 +504,18 @@ Reflect.ownKeys(obj) ## Proxy -所谓Proxy,可以理解成在目标对象之前,架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。 +Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。 -ES6原生提供Proxy构造函数,用来生成proxy实例对象。 +Proxy可以理解成在目标对象之前,架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。proxy这个词的原意是代理,用在这里表示由它来“代理”某些操作。 + +ES6原生提供Proxy构造函数,用来生成Proxy实例。 ```javascript var proxy = new Proxy({}, { - get: function(target, property) { - return 35; - } + get: function(target, property) { + return 35; + } }); proxy.time // 35 @@ -522,24 +524,46 @@ proxy.title // 35 ``` -上面代码就是Proxy构造函数使用实例,它接受两个参数,第一个是所要代理的目标对象(上例是一个空对象),第二个是拦截函数,它有一个get方法,用来拦截对目标对象的访问请求。get方法的两个参数分别是目标对象和所要访问的属性。可以看到,由于拦截函数总是返回35,所以访问任何属性都得到35。 +作为构造函数,Proxy接受两个参数。第一个参数是所要代理的目标对象(上例是一个空对象),即如果没有Proxy的介入,操作原来要访问的就是这个对象;第二个参数是一个设置对象,对于每一个被代理的操作,需要提供一个对应的处理函数,该函数将拦截对应的操作。比如,上面代码中,设置对象有一个get方法,用来拦截对目标对象属性的访问请求。get方法的两个参数分别是目标对象和所要访问的属性。可以看到,由于拦截函数总是返回35,所以访问任何属性都得到35。 + +注意,要使得Proxy起作用,必须针对Proxy实例(上例是proxy对象)进行操作,而不是针对目标对象(上例是空对象)进行操作。 + +Proxy实例也可以作为其他对象的原型对象。 + +```javascript + +var proxy = new Proxy({}, { + get: function(target, property) { + return 35; + } +}); + +let obj = Object.create(proxy); + +obj.time // 35 + +``` + +上面代码中,proxy对象是obj对象的原型,obj对象本身并没有time属性,所有根据原型链,会在proxy对象上读取该属性,导致被拦截。 + +对于没有设置拦截的操作,则直接落在目标函数上,按照原先的方式产生结果。 -下面是另一个拦截函数的例子。 +下面是另一个拦截读取操作的例子。 ```javascript var person = { - name: "张三" + name: "张三" }; var proxy = new Proxy(person, { - get: function(target, property) { - if (property in target) { - return target[property]; - } else { - throw new ReferenceError("Property \"" + property + "\" does not exist."); - } - } + get: function(target, property) { + if (property in target) { + return target[property]; + } else { + throw new ReferenceError("Property \"" + property + "\" does not exist."); + } + } }); proxy.name // "张三" @@ -579,7 +603,67 @@ person.age = 300 // 报错 ``` -上面代码中,由于设置了存值函数set,任何不符合要求的age属性赋值,都会抛出一个错误。 +上面代码中,由于设置了存值函数set,任何不符合要求的age属性赋值,都会抛出一个错误。利用set方法,还可以数据绑定,即每当对象发生变化时,会自动更新DOM。 + +ownKeys方法用来拦截Object.keys()操作。 + +```javascript + +let target = {}; + +let handler = { + ownKeys(target) { + return ['hello', 'world']; + } +}; + +let proxy = new Proxy(target, handler); + +Object.keys(proxy) +// [ 'hello', 'world' ] + +``` + +上面代码拦截了对于target对象的Object.keys()操作,返回预先设定的数组。 + +Proxy支持的拦截操作一览。 + +- defineProperty(target, propKey, propDesc):返回一个布尔值,拦截Object.defineProperty(proxy, propKey, propDesc) +- deleteProperty(target, propKey) :返回一个布尔值,拦截delete proxy[propKey] +- enumerate(target):返回一个遍历器,拦截for (x in proxy) +- get(target, propKey, receiver):返回类型不限,拦截对象属性的读取 +- getOwnPropertyDescriptor(target, propKey) :返回属性的描述对象,拦截Object.getOwnPropertyDescriptor(proxy, propKey) +- getPrototypeOf(target) :返回一个对象,拦截Object.getPrototypeOf(proxy) +- has(target, propKey):返回一个布尔值,拦截propKey in proxy +- isExtensible(target):返回一个布尔值,拦截Object.isExtensible(proxy) +- ownKeys(target):返回一个数组,拦截Object.getOwnPropertyPropertyNames(proxy)、Object.getOwnPropertyPropertySymbols(proxy)、Object.keys(proxy) +- preventExtensions(target):返回一个布尔值,拦截Object.preventExtensions(proxy) +- set(target, propKey, value, receiver):返回一个布尔值,拦截对象属性的设置 +- setPrototypeOf(target, proto):返回一个布尔值,拦截Object.setPrototypeOf(proxy, proto) + +如果目标对象是函数,那么还有两种额外操作可以拦截。 + +- apply方法:拦截Proxy实例作为函数调用的操作,比如proxy(···)、proxy.call(···)、proxy.apply(···)。 +- construct方法:拦截Proxy实例作为构造函数调用的操作,比如new proxy(···)。 + +Proxy.revocable方法返回一个可取消的Proxy实例。 + +```javascript + +let target = {}; +let handler = {}; + +let {proxy, revoke} = Proxy.revocable(target, handler); + +proxy.foo = 123; +proxy.foo // 123 + +revoke(); +proxy.foo // TypeError: Revoked + +``` + +Proxy.revocable方法返回一个对象,该对象的proxy属性是Proxy实例,revoke属性是一个函数,可以取消Proxy实例。上面代码中,当执行revoke函数之后,再访问Proxy实例,就会抛出一个错误。 ## Object.observe(),Object.unobserve() diff --git a/docs/reference.md b/docs/reference.md index d8402bb59..d0fec441d 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -28,13 +28,17 @@ - Jack Franklin, [Real Life ES6 - Arrow Functions](http://javascriptplayground.com/blog/2014/04/real-life-es6-arrow-fn/) - Axel Rauschmayer, [Handling required parameters in ECMAScript 6](http://www.2ality.com/2014/04/required-parameters-es6.html) - Axel Rauschmayer, [ECMAScript 6’s new array methods](http://www.2ality.com/2014/05/es6-array-methods.html): 对ES6新增的数组方法的全面介绍 -- Nicholas C. Zakas, [Creating defensive objects with ES6 proxies](http://www.nczonline.net/blog/2014/04/22/creating-defensive-objects-with-es6-proxies/) -- Addy Osmani, [Data-binding Revolutions with Object.observe()](http://www.html5rocks.com/en/tutorials/es7/observe/): 介绍Object.observe()的概念 -- Sella Rafaeli, [Native JavaScript Data-Binding](http://www.sellarafaeli.com/blog/native_javascript_data_binding): 如何使用Object.observe方法,实现数据对象与DOM对象的双向绑定 - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 - Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 + +## Object + +- Nicholas C. Zakas, [Creating defensive objects with ES6 proxies](http://www.nczonline.net/blog/2014/04/22/creating-defensive-objects-with-es6-proxies/) +- Addy Osmani, [Data-binding Revolutions with Object.observe()](http://www.html5rocks.com/en/tutorials/es7/observe/): 介绍Object.observe()的概念 +- Sella Rafaeli, [Native JavaScript Data-Binding](http://www.sellarafaeli.com/blog/native_javascript_data_binding): 如何使用Object.observe方法,实现数据对象与DOM对象的双向绑定 - Axel Rauschmayer, [Symbols in ECMAScript 6](http://www.2ality.com/2014/12/es6-symbols.html): Symbol简介 +- Axel Rauschmayer, [Meta programming with ECMAScript 6 proxies](http://www.2ality.com/2014/12/es6-proxies.html): Proxy详解 ## Iterator和Generator From a7a7fdaa62e36e02e5d12bad89ccbf9e661e1a2d Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 4 Jan 2015 10:57:26 +0800 Subject: [PATCH 0052/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/generator.md b/docs/generator.md index a560a3e79..5ecb57758 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -4,7 +4,7 @@ ### 简介 -所谓Generator,有多种理解角度。首先,可以把它理解成一个内部状态的遍历器,每调用一次,内部状态发生一次改变(可以理解成发生某些事件)。ES6引入Generator函数,作用就是可以完全控制内部状态的变化,依次遍历这些状态。 +所谓Generator,有多种理解角度。首先,可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改变(可以理解成发生某些事件)。ES6引入Generator函数,作用就是可以完全控制函数的内部状态的变化,依次遍历这些状态。 在形式上,Generator是一个普通函数,但是有两个特征。一是,function命令与函数名之间有一个星号;二是,函数体内部使用yield语句,定义遍历器的每个成员,即不同的内部状态(yield语句在英语里的意思就是“产出”)。 @@ -97,6 +97,8 @@ g.next(true) // { value: 0, done: false } 上面代码先定义了一个可以无限运行的Generator函数f,如果next方法没有参数,每次运行到yield语句,变量reset的值总是undefined。当next方法带一个参数true时,当前的变量reset就被重置为这个参数(即true),因此i会等于-1,下一轮循环就会从-1开始递增。 +这个功能有很重要的语法意义。Generator函数从暂停状态到恢复运行,它的上下文状态(context)是不变的。通过next方法的参数,就有办法在Generator函数开始运行之后,继续向函数体内部注入值。也就是说,可以在Generator函数运行的不同阶段,从外部向内部注入不同的值,从而调整函数行为。 + 再看一个例子。 ```javascript @@ -425,9 +427,9 @@ var clock = function*(_) { 协程(coroutine)是一种程序运行的方式。传统的“子例程”(subroutine)采用堆栈式“后进先出”的执行方式,只有当调用的子函数完全执行完毕,才会结束执行父函数。协程与其不同,多个函数可以并行执行,但是只有一个函数处于正在运行的状态,其他函数都处于暂停态(suspended),函数之间可以交换执行权。也就是说,一个函数执行到一半,可以暂停执行,将执行权交给另一个函数,等到稍后收回执行权的时候,再恢复执行。这种可以并行执行、交换执行权的函数,就称为协程。 -不难看出,协程适合用于多任务运行的环境。在这个意义上,它与线程很相似,都有自己的执行上下文、可以分享全局变量。它们的不同之处在于,同一时间可以有多个线程处于运行状态,但是运行的协程只能有一个,其他都处于暂停状态。此外,线程是抢先式的,到底哪个线程优先得到资源,必须由运行环境决定,但是协程是合作式的,执行权由协程自己分配。 +不难看出,协程适合用于多任务运行的环境。在这个意义上,它与线程很相似,都有自己的执行上下文、可以分享全局变量。它们的不同之处在于,同一时间可以有多个线程处于运行状态,但是运行的协程只能有一个,其他都处于暂停状态。此外,线程是抢先式的,到底哪个线程优先得到资源,必须由运行环境决定,但是协程是合作式的,执行权由协程自己分配。从实现上看,在内存中,子例程只使用一个栈(stack),而协程是同时存在多个栈,但只有一个栈是在运行状态,也就是说,协程是以多占用内存为代价,实现多任务的并行。 -Generator函数是ECMAScript 6对协程的实现,但属于不完全实现,只做到了暂停执行和转移执行权,有一些特性没有实现,比如不支持所调用的函数之中的yield语句。 +Generator函数是ECMAScript 6对协程的实现,但属于不完全实现,只做到了暂停执行和转移执行权,有一些特性没有实现,比如不支持所调用的函数之中的yield语句(即递归执行yield语句)。 如果将Generator函数看作多任务运行的方式,存在多个进入点和退出点。那么,一方面,并发的多任务可以写成多个Generator函数;另一方面,继发的任务则可以按照发生顺序,写在一个Generator函数之中,然后用一个任务管理函数执行(参考本节的“控制流管理”部分)。 @@ -560,7 +562,7 @@ scheduler(longRunningTask()); function scheduler(task) { setTimeout(function () { - if (!task.next().done) { + if (!task.next(task.value).done) { scheduler(task); } }, 0); From efee4f880573c46980e69d639bea3af7f5d341c3 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 6 Jan 2015 16:23:11 +0800 Subject: [PATCH 0053/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9set-map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/function.md | 18 ++- docs/reference.md | 1 + docs/set-map.md | 345 +++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 328 insertions(+), 36 deletions(-) diff --git a/docs/function.md b/docs/function.md index e78dbacf7..e3e8feeda 100644 --- a/docs/function.md +++ b/docs/function.md @@ -228,7 +228,23 @@ d ``` -扩展运算符内部调用的是数据结构的Iterator接口,因此只要具有Iterator接口的对象,都可以使用扩展运算符。 +扩展运算符内部调用的是数据结构的Iterator接口,因此只要具有Iterator接口的对象,都可以使用扩展运算符,比如Map结构。 + +```javascript + +let map = new Map([ + [1, 'one'], + [2, 'two'], + [3, 'three'], +]); + + +let arr = [...map.keys()]; // [1, 2, 3] + +``` + +Generator函数运行后,返回一个遍历器对象,因此也可以使用扩展运算符。 + ```javascript diff --git a/docs/reference.md b/docs/reference.md index d0fec441d..4e2fcf0da 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -30,6 +30,7 @@ - Axel Rauschmayer, [ECMAScript 6’s new array methods](http://www.2ality.com/2014/05/es6-array-methods.html): 对ES6新增的数组方法的全面介绍 - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 +- Axel Rauschmayer, [ECMAScript 6: maps and sets](http://www.2ality.com/2015/01/es6-maps-sets.html): Set和Map结构的详细介绍 - Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 ## Object diff --git a/docs/set-map.md b/docs/set-map.md index 746b23053..50b55494f 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -2,6 +2,8 @@ ## Set +### 基本用法 + ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。 Set本身是一个构造函数,用来生成Set数据结构。 @@ -19,7 +21,7 @@ for (i of s) {console.log(i)} 上面代码通过add方法向Set结构加入成员,结果表明Set结构不会添加重复的值。 -Set函数接受一个数组作为参数,用来初始化。 +Set函数可以接受一个数组作为参数,用来初始化。 ```javascript @@ -30,7 +32,23 @@ items.size ``` -向Set加入值的时候,不会发生类型转换。这意味在Set中,5和“5”是两个不同的值。 +向Set加入值的时候,不会发生类型转换,5和“5”是两个不同的值。Set内部判断两个值是否精确相等,使用的是精确相等运算符(===)。这意味着,两个对象总是不相等的。 + +```javascript + +let set = new Set(); + +set.add({}) +set.size // 1 + +set.add({}) +set.size // 2 + +``` + +上面代码表示,由于两个空对象不是精确相等,所以它们被视为两个值。 + +### 属性和方法 Set结构有以下属性。 @@ -39,10 +57,10 @@ Set结构有以下属性。 Set数据结构有以下方法。 -- add(value):添加某个值。 -- delete(value):删除某个值。 -- has(value):返回一个布尔值,表示该值是否为set的成员。 -- clear():清除所有成员。 +- add(value):添加某个值,返回Set结构本身。 +- delete(value):删除某个值,返回一个布尔值,表示删除是否成功。 +- has(value):返回一个布尔值,表示该值是否为Set的成员。 +- clear():清除所有成员,没有返回值。 下面是这些属性和方法的使用演示。 @@ -109,7 +127,113 @@ function dedupe(array) { ``` -Set的遍历,可以借助for...of循环完成,参见《Iterator和for...of循环》章节。 +### 遍历操作 + +Set结构有一个values方法,返回一个遍历器。 + +```javascript + +let set = new Set(['red', 'green', 'blue']); +for ( let item of set.values() ){ + console.log(item); +} +// red +// green +// blue + +``` + +Set结构的默认遍历器就是它的values方法。 + +```javascript + +Set.prototype[Symbol.iterator] === Set.prototype.values +// true + +``` + +这意味着,可以省略values方法,直接用for...of循环遍历Set。 + +```javascript + +let set = new Set(['red', 'green', 'blue']); + +for (let x of set) { + console.log(x); +} +// red +// green +// blue + +``` + +Set结构的foreach方法,用于对每个成员执行某种操作,返回修改后的Set结构。 + +```javascript + +let set = new Set([1, 2, 3]); + +set.foreach((value, key) => value*2 ) +// 返回Set结构{2, 4, 6} + +``` + +上面代码说明,foreach方法的参数就是一个处理函数。该函数的参数依次为键值、键名、集合本身(上例省略了该参数)。另外,foreach方法还可以有第二个参数,表示绑定的this对象。 + +为了与Map结构保持一致,Set结构也有keys和entries方法,这时每个值的键名就是键值。 + +```javascript + +let set = new Set(['red', 'green', 'blue']); +for ( let item of set.keys() ){ + console.log(item); +} +// red +// green +// blue + +for ( let [key, value] of set.entries() ){ + console.log(key, value); +} +// red, red +// green, green +// blue, blue + +``` + +由于扩展运算符(...)内部使用for...of循环,所以也可以用于Set结构。 + +```javascript + +let set = new Set(['red', 'green', 'blue']); +let arr = [...set]; +// ['red', 'green', 'blue'] + +``` + +这就提供了另一种便捷的去除数组重复元素的方法。 + +```javascript + +let arr = [3, 5, 2, 2, 5, 5]; +let unique = [...new Set(arr)]; +// [3, 5, 2] + +``` + +而且,数组的map和filter方法也可以用于Set了。 + +```javascript + +let set = new Set([1, 2, 3]); +set = new Set([...set].map(x => x * 2)); +// 返回Set结构:{2, 4, 6} + +let set = new Set([1, 2, 3, 4, 5]); +set = new Set([...set].filter(x => (x % 2) == 0)); +// 返回Set结构:{2, 4} + +``` ## WeakSet @@ -137,10 +261,9 @@ var ws = new WeakSet(a); 上面代码中,a是一个数组,它有两个成员,也都是数组。将a作为WeakSet构造函数的参数,a的成员会自动成为WeakSet的成员。 -WeakSet结构有以下四个方法。 +WeakSet结构有以下三个方法。 - **WeakSet.prototype.add(value)**:向WeakSet实例添加一个新成员。 -- **WeakSet.prototype.clear()**:清除WeakSet实例的所有成员。 - **WeakSet.prototype.delete(value)**:清除WeakSet实例的指定成员。 - **WeakSet.prototype.has(value)**:返回一个布尔值,表示某个值是否在WeakSet实例之中。 @@ -182,24 +305,25 @@ data[element] = metadata; 上面代码原意是将一个DOM节点作为对象data的键,但是由于对象只接受字符串作为键名,所以element被自动转为字符串`[Object HTMLDivElement]`。 -为了解决这个问题,ES6提供了map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,对象也可以当作键。 +为了解决这个问题,ES6提供了map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应。 ```javascript var m = new Map(); - -o = {p: "Hello World"}; +var o = {p: "Hello World"}; m.set(o, "content") +m.get(o) // "content" -console.log(m.get(o)) -// "content" +m.has(o) // true +m.delete(o) // true +m.has(o) // false ``` -上面代码使用set方法,将对象o当作m的一个键,然后又使用get方法读取这个键。 +上面代码使用set方法,将对象o当作m的一个键,然后又使用get方法读取这个键,接着使用delete方法删除了这个键。 -map函数也可以接受一个数组进行初始化,该数组的成员是一个个表示键值对的数组。 +作为构造函数,Map也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。 ```javascript @@ -245,20 +369,54 @@ map.get(k2) // 222 上面代码中,变量k1和k2的值是一样的,但是它们在Map结构中被视为两个键。 -由上可知,map的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。 +由上可知,Map的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。 + +如果Map的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map将其视为一个键。这对于NaN,以及+0和-0都成立。 + +```javascript + +let map = new Map(); + +map.set(NaN, 123); +map.get(NaN) // 123 + +map.set(-0, 123); +map.get(+0) // 123 + +``` + +如果读取一个未知的键,则返回undefined。 + +```javascript + +new Map().get('asfddfsasadf') +// undefined + +``` **(2)属性和方法** Map数据结构有以下属性和方法。 - size:返回成员总数。 -- set(key, value):设置一个键值对。 -- get(key):读取一个键。 +- set(key, value):设置key所对应的键值,然后返回整个Map结构。如果key已经有值,则键值会被更新,否则就新生成该键。 +- get(key):读取key对应的键值,如果找不到key,返回undefined。 - has(key):返回一个布尔值,表示某个键是否在Map数据结构中。 -- delete(key):删除某个键。 -- clear():清除所有成员。 +- delete(key):删除某个键,返回true。如果删除失败,返回false。 +- clear():清除所有成员,没有返回值。 -下面是一些用法实例。 +set()方法返回的是Map本身,因此可以采用链式写法。 + +```javascript + +let map = new Map() + .set(1, 'a') + .set(2, 'b') + .set(3, 'c'); + +``` + +下面是has()和delete()的例子。 ```javascript @@ -285,6 +443,20 @@ m.get("edition") // 6 ``` +下面是size属性和clear方法的例子。 + +```javascript + +let map = new Map(); +map.set('foo', true); +map.set('bar', false); + +map.size // 2 +map.clear() +map.size // 0 + +``` + **(3)遍历** Map原生提供三个遍历器。 @@ -297,31 +469,101 @@ Map原生提供三个遍历器。 ```javascript +let map = new Map([ + ['F', 'no'], + ['T', 'yes'], +]); + for (let key of map.keys()) { - console.log("Key: %s", key); + console.log(key); } +// "F" +// "T" for (let value of map.values()) { - console.log("Value: %s", value); + console.log(value); } +// "no" +// "yes" for (let item of map.entries()) { - console.log("Key: %s, Value: %s", item[0], item[1]); + console.log(item[0], item[1]); +} +// "F" "no" +// "T" "yes" + +// 或者 +for (let [key, value] of map.entries()) { + console.log(key, value); } -// same as using map.entries() -for (let item of map) { - console.log("Key: %s, Value: %s", item[0], item[1]); +// 等同于使用map.entries() +for (let [key, value] of map) { + console.log(key, value); } ``` +上面代码最后的那个例子,表示Map结构的默认遍历器接口(Symbol.iterator属性),就是entries方法。 + +```javascript + +map[Symbol.iterator] === map.entries +// true + +``` + +Map结构转为数组结构,比较快速的方法是结合使用扩展运算符(...)。 + +```javascript + +let map = new Map([ + [1, 'one'], + [2, 'two'], + [3, 'three'], +]); + +[...map.keys()] +// [1, 2, 3] + +[...map.values()] +// ['one', 'two', 'three'] + +[...map.entries()] +// [[1,'one'], [2, 'two'], [3, 'three']] + +[...map] +// [[1,'one'], [2, 'two'], [3, 'three']] + +``` + +结合数组的map方法、filter方法,可以实现Map的遍历和过滤(Map本身没有map和filter方法)。 + +```javascript + +let map0 = new Map() + .set(1, 'a') + .set(2, 'b') + .set(3, 'c'); + +let map1 = new Map( + [...map0].filter(([k, v]) => k < 3) +); +// 产生Map结构 {1 => 'a', 2 => 'b'} + +let map2 = new Map( + [...map0].map(([k, v]) => [k * 2, '_' + v]) + ); +// 产生Map结构 {2 => '_a', 4 => '_b', 6 => '_c'} + +``` + 此外,Map还有一个forEach方法,与数组的forEach方法类似,也可以实现遍历。 ```javascript map.forEach(function(value, key, map)) { - console.log("Key: %s, Value: %s", key, value); + console.log("Key: %s, Value: %s", key, value); }; ``` @@ -331,13 +573,13 @@ forEach方法还可以接受第二个参数,用来绑定this。 ```javascript var reporter = { - report: function(key, value) { - console.log("Key: %s, Value: %s", key, value); - } + report: function(key, value) { + console.log("Key: %s, Value: %s", key, value); + } }; map.forEach(function(value, key, map) { - this.report(key, value); + this.report(key, value); }, reporter); ``` @@ -346,7 +588,7 @@ map.forEach(function(value, key, map) { ## WeakMap -WeakMap结构与Map结构基本类似,唯一的区别是它只接受对象作为键名(null除外),不接受原始类型的值作为键名。 +WeakMap结构与Map结构基本类似,唯一的区别是它只接受对象作为键名(null除外),不接受原始类型的值作为键名,而且键名所指向的对象,不计入垃圾回收机制。 WeakMap的设计目的在于,键名是对象的弱引用(垃圾回收机制不将该引用考虑在内),所以其所对应的对象可能会被自动回收。当对象被回收后,WeakMap自动移除对应的键值对。典型应用是,一个对应DOM元素的WeakMap结构,当某个DOM元素被清除,其所对应的WeakMap记录就会自动被移除。基本上,WeakMap的专用场合就是,它的键所对应的对象,可能会在将来消失。WeakMap结构有助于防止内存泄漏。 @@ -370,4 +612,37 @@ console.log(value); // undefined ``` -WeakMap还有has和delete方法,但没有size属性,也无法遍历它的值,这与WeakMap的键不被计入引用、被垃圾回收机制忽略有关。 +WeakMap与Map在API上的区别主要是两个,一是没有遍历操作(即没有key()、values()和entries()方法),也没有size属性;二是无法清空,即不支持clear方法。这与WeakMap的键不被计入引用、被垃圾回收机制忽略有关。因此,WeakMap只有四个方法可用:get()、set()、has()、delete()。 + +WeakMap的一个用处是部署私有属性。 + +```javascript + +let _counter = new WeakMap(); +let _action = new WeakMap(); + +class Countdown { + constructor(counter, action) { + _counter.set(this, counter); + _action.set(this, action); + } + dec() { + let counter = _counter.get(this); + if (counter < 1) return; + counter--; + _counter.set(this, counter); + if (counter === 0) { + _action.get(this)(); + } + } +} + +let c = new Countdown(2, () => console.log('DONE')); + +c.dec() +c.dec() +// DONE + +``` + +上面代码中,Countdown类的两个内部属性_counter和_action,是实例的弱引用,所以如果删除实例,它们也就随之消失,不会造成内存泄漏。 From e0203fcf6a3f991ed3f7b2f9913708ea836f3be8 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 8 Jan 2015 10:39:19 +0800 Subject: [PATCH 0054/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9set-map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/set-map.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/set-map.md b/docs/set-map.md index 50b55494f..d243a7c9d 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -371,7 +371,7 @@ map.get(k2) // 222 由上可知,Map的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。 -如果Map的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map将其视为一个键。这对于NaN,以及+0和-0都成立。 +如果Map的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map将其视为一个键,包括0和-0。另外,虽然NaN不严格相等于自身,但Map将其视为同一个键。 ```javascript From 49ec7d0998deb6ac154cfde4e48fcff9eb2bf7c9 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sat, 10 Jan 2015 08:27:11 +0800 Subject: [PATCH 0055/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9set?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/set-map.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/set-map.md b/docs/set-map.md index d243a7c9d..2ec638c3c 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -32,7 +32,7 @@ items.size ``` -向Set加入值的时候,不会发生类型转换,5和“5”是两个不同的值。Set内部判断两个值是否精确相等,使用的是精确相等运算符(===)。这意味着,两个对象总是不相等的。 +向Set加入值的时候,不会发生类型转换,所以5和“5”是两个不同的值。Set内部判断两个值是否不同,使用的算法类似于精确相等运算符(===),唯一的例外是NaN等于自身。这意味着,两个对象总是不相等的。 ```javascript @@ -235,6 +235,21 @@ set = new Set([...set].filter(x => (x % 2) == 0)); ``` +因此使用Set,可以很容易地实现并集(Union)和交集(Intersect)。 + +```javascript + +let a = new Set([1,2,3]); +let b = new Set([4,3,2]); + +let union = new Set([...a, ...b]); +// [1,2,3,4] + +let intersect = new Set([...a].filter(x => b.has(x))); +// [2,3] + +``` + ## WeakSet WeakSet结构与Set类似,也是不重复的值的集合。但是,它与Set有两个区别。 From 540642f75d1ed1c98721f018318f990b75106d12 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Mon, 12 Jan 2015 22:10:06 +0800 Subject: [PATCH 0056/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9docs/function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/function.md | 117 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 114 insertions(+), 3 deletions(-) diff --git a/docs/function.md b/docs/function.md index e3e8feeda..8ecfd9fa3 100644 --- a/docs/function.md +++ b/docs/function.md @@ -65,6 +65,47 @@ var p = new Point(); ``` +定义了默认值的参数,必须是函数的尾部参数,其后不能再有其他无默认值的参数。这是因为有了默认值以后,该参数可以省略,只有位于尾部,才可能判断出到底省略了哪些参数。 + +```javascript + +// 以下两种写法都是错的 + +function f(x=5, y) { +} + +function f(x, y=5, z) { +} + +``` + +如果传入undefined,将触发该参数等于默认值,null则没有这个效果。 + +```javascript + +function foo(x=5, y=6){ + console.log(x,y); +} + +foo(undefined, null) +// 5 null + +``` + +上面代码中,x参数对应undefined,结果触发了默认值,y参数等于null,就没有触发默认值。 + +指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。 + +```javascript + +(function(a){}).length // 1 +(function(a=5){}).length // 0 +(function(a, b, c=5){}).length // 2 + +``` + +上面代码中,length属性的返回值,等于函数的参数个数减去指定了默认值的参数个数。 + 利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误。 ```javascript @@ -188,14 +229,42 @@ add(...numbers) // 42 上面代码中,`array.push(...items)`和`add(...numbers)`这两行,都是函数的调用,它们的都使用了扩展运算符。该运算符将一个数组,变为参数序列。 -扩展运算符可以简化求出一个数组最大元素的写法。 +由于扩展运算符可以展开数组,所以不再需要apply方法,将数组转为函数的参数了。 + +```javascript + +// ES5的写法 + +function f(x, y, z) { } +var args = [0, 1, 2]; +f.apply(null, args); + +// ES6的写法 + +function f(x, y, z) { } +var args = [0, 1, 2]; +f(...args); + +``` + +扩展运算符与正常的函数参数可以结合使用,非常灵活。 + +```javascript + +function f(v, w, x, y, z) { } +var args = [0, 1]; +f(-1, ...args, 2, ...[3]); + +``` + +下面是扩展运算符取代apply方法的一个实际的例子,应用Math.max方法,简化求出一个数组最大元素的写法。 ```javascript -// ES5 +// ES5的写法 Math.max.apply(null, [14, 3, 77]) -// ES6 +// ES6的写法 Math.max(...[14, 3, 77]) // 等同于 @@ -205,6 +274,24 @@ Math.max(14, 3, 77); 上面代码表示,由于JavaScript不提供求数组最大元素的函数,所以只能套用Math.max函数,将数组转为一个参数序列,然后求最大值。有了扩展运算符以后,就可以直接用Math.max了。 +另一个例子是通过push函数,将一个数组添加到另一个数组的尾部。 + +```javascript + +// ES5的写法 +var arr1 = [0, 1, 2]; +var arr2 = [3, 4, 5]; +Array.prototype.push.apply(arr1, arr2); + +// ES6的写法 +var arr1 = [0, 1, 2]; +var arr2 = [3, 4, 5]; +arr1.push(...arr2); + +``` + +上面代码的ES5写法中,push方法的参数不能是数组,所以只好通过apply方法变通使用push方法。有了扩展运算符,就可以直接将数组传入push方法。 + 扩展运算符还可以用于数组的赋值。 ```javascript @@ -219,6 +306,19 @@ d ``` +上面代码其实也提供了,将一个数组拷贝进另一个数组的便捷方法。 + +JavaScript的函数只能返回一个值,如果需要返回多个值,只能返回数组或对象。扩展运算符提供了解决这个问题的一种变通方法。 + +```javascript + +var dateFields = readDateFields(database); +var d = new Date(...dateFields); + +``` + +上面代码从数据库取出一行数据,通过扩展运算符,直接将其传入构造函数Date。 + 扩展运算符还可以将字符串转为真正的数组。 ```javascript @@ -228,6 +328,17 @@ d ``` +任何类似数组的对象,都可以用扩展运算符转为真正的数组。 + +```javascript + +var nodeList = document.querySelectorAll('div'); +var array = [...nodeList]; + +``` + +上面代码中,querySelectorAll方法返回的是一个nodeList对象,扩展运算符可以将其转为真正的数组。 + 扩展运算符内部调用的是数据结构的Iterator接口,因此只要具有Iterator接口的对象,都可以使用扩展运算符,比如Map结构。 ```javascript From 29149c7450982ba966ae8755bbbcaae8a709bdd9 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 13 Jan 2015 09:51:16 +0800 Subject: [PATCH 0057/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9numbers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/array.md | 24 +++++++- docs/destructuring.md | 10 ++++ docs/function.md | 10 ++++ docs/number.md | 133 +++++++++++++++++++++++++++++++++++++++++- docs/object.md | 68 +++++++++++++++++---- 5 files changed, 229 insertions(+), 16 deletions(-) diff --git a/docs/array.md b/docs/array.md index 23bac7a5b..fcb92a2c0 100644 --- a/docs/array.md +++ b/docs/array.md @@ -16,6 +16,27 @@ Array.from(ps).forEach(function (p) { 上面代码中,querySelectorAll方法返回的是一个类似数组的对象,只有将这个对象转为真正的数组,才能使用forEach方法。 +Array.from方法可以将函数的arguments对象,转为数组。 + +```javascript + +function foo() { + var args = Array.from( arguments ); +} + +foo( "a", "b", "c" ); + +``` + +任何有length属性的对象,都可以通过Array.from方法转为数组。 + +```javascript + +Array.from({ 0: "a", 1: "b", 2: "c", length: 3 }); +// [ "a", "b" , "c" ] + +``` + Array.from()还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理。 ```JavaScript @@ -43,11 +64,12 @@ Array.of()方法用于将一组值,转换为数组。 ```javaScript Array.of(3, 11, 8) // [3,11,8] +Array.of(3) // [3] Array.of(3).length // 1 ``` -这个函数的主要目的,是弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。 +这个方法的主要目的,是弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异。 ```javascript diff --git a/docs/destructuring.md b/docs/destructuring.md index 36ad9e1bc..a6db313eb 100644 --- a/docs/destructuring.md +++ b/docs/destructuring.md @@ -199,6 +199,16 @@ var x; ``` +对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量。 + +```javascript + +let { log, sin, cos } = Math; + +``` + +上面代码将Math对象的对数、正弦、余弦三个方法,赋值到对应的变量上,使用起来就会方便很多。 + ## 用途 变量的解构赋值用途很多。 diff --git a/docs/function.md b/docs/function.md index 8ecfd9fa3..a8a1bb8fd 100644 --- a/docs/function.md +++ b/docs/function.md @@ -208,6 +208,16 @@ function f(a, ...b, c) { ``` +函数的length属性,不包括rest参数。 + +```javascript + +(function(a) {}).length // 1 +(function(...a) {}).length // 0 +(function(a, ...b) {}).length // 1 + +``` + ## 扩展运算符 扩展运算符(spread)是三个点(...)。它好比rest参数的逆运算,将一个数组转为用逗号分隔的参数序列。该运算符主要用于函数调用。 diff --git a/docs/number.md b/docs/number.md index 28a321e29..828f23bd1 100644 --- a/docs/number.md +++ b/docs/number.md @@ -17,7 +17,71 @@ ES6提供了二进制和八进制数值的新的写法,分别用前缀0b和0o ES6在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法,用来检查Infinite和NaN这两个特殊值。 -它们与传统的isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,非数值一律返回false。 +Number.isFinite()用来检查一个数值是否非无穷(infinity)。 + +```javascript + +Number.isFinite(15); // true +Number.isFinite(0.8); // true +Number.isFinite(NaN); // false +Number.isFinite(Infinity); // false +Number.isFinite(-Infinity); // false +Number.isFinite("foo"); // false +Number.isFinite("15"); // false +Number.isFinite(true); // false + +``` + +ES5通过下面的代码,部署Number.isFinite方法。 + +```javascript + +(function (global) { + var global_isFinite = global.isFinite; + + Object.defineProperty(Number, 'isFinite', { + value: function isFinite(value) { + return typeof value === 'number' && global_isFinite(value); + }, + configurable: true, + enumerable: false, + writable: true + }); +})(this); + +``` + +Number.isNaN()用来检查一个值是否为NaN。 + +```javascript + +Number.isNaN(NaN); // true +Number.isNaN(15); // false +Number.isNaN("15"); // false +Number.isNaN(true); // false + +``` + +ES5通过下面的代码,部署Number.isNaN()。 + +```javascript + +(function (global) { + var global_isNaN = global.isNaN; + + Object.defineProperty(Number, 'isNaN', { + value: function isNaN(value) { + return typeof value === 'number' && global_isNaN(value); + }, + configurable: true, + enumerable: false, + writable: true + }); +})(this); + +``` + +它们与传统的全局方法isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,非数值一律返回false。 ```javascript @@ -60,6 +124,30 @@ Number.isInteger()用来判断一个值是否为整数。需要注意的是, Number.isInteger(25) // true Number.isInteger(25.0) // true Number.isInteger(25.1) // false +Number.isInteger("15") // false +Number.isInteger(true) // false + +``` + +ES5通过下面的代码,部署Number.isInteger()。 + +```javascript + +(function (global) { + var floor = Math.floor, + isFinite = global.isFinite; + + Object.defineProperty(Number, 'isInteger', { + value: function isInteger(value) { + return typeof value === 'number' && isFinite(value) && + value > -9007199254740992 && value < 9007199254740992 && + floor(value) === value; + }, + configurable: true, + enumerable: false, + writable: true + }); +})(this); ``` @@ -93,7 +181,47 @@ Math.trunc(-4.9) // -4 ``` -**(2)数学方法** +**(2)Math.sign()** + +Math.sign方法用来判断一个数到底是正数、负数、还是零。如果参数为正数,返回+1;参数为负数,返回-1;参数为0,返回0;参数为NaN,返回NaN。 + +```javascript + +Math.sign(-5) // -1 +Math.sign(5) // +1 +Math.sign(0) // +0 +Math.sign(-) // -0 +Math.sign(NaN) // NaN + +``` + +ES5通过下面的代码,可以部署Math.sign()。 + +```javascript + +(function (global) { + var isNaN = Number.isNaN; + + Object.defineProperty(Math, 'sign', { + value: function sign(value) { + var n = +value; + if (isNaN(n)) + return n /* NaN */; + + if (n === 0) + return n; // Keep the sign of the zero. + + return (n < 0) ? -1 : 1; + }, + configurable: true, + enumerable: false, + writable: true + }); +})(this); + +``` + +**(3)数学方法** ES6在Math对象上还提供了许多新的数学方法。 @@ -110,5 +238,4 @@ ES6在Math对象上还提供了许多新的数学方法。 - Math.log1p(x) 返回1 + x的自然对数 - Math.log10(x) 返回以10为底的x的对数 - Math.log2(x) 返回以2为底的x的对数 -- Math.sign(x) 如果x为负返回-1,x为0返回0,x为正返回1 - Math.tanh(x) 返回x的双曲正切(hyperbolic tangent) diff --git a/docs/object.md b/docs/object.md index 11408ceca..f6451fcb9 100644 --- a/docs/object.md +++ b/docs/object.md @@ -6,6 +6,42 @@ ES6允许直接写入变量和函数,作为对象的属性和方法。这样 ```javascript +function f( x, y ) { + return { x, y }; +} + +// 等同于 + +function f( x, y ) { + return { x: x, y: y }; +} + +``` + +上面是属性简写的例子,方法也可以简写。 + +```javascript + +var o = { + method() { + return "Hello!"; + } +}; + +// 等同于 + +var o = { + method: function() { + return "Hello!"; + } +}; + +``` + +下面是一个更实际的例子。 + +```javascript + var Person = { name: '张三', @@ -36,18 +72,6 @@ getPoint() ``` -下面是一个类似的例子。 - -```javascript - -let x = 4; -let y = 1; - -// 下行等同于 let obj = { x: x, y: y }; -let obj = { x, y }; - -``` - ## 属性名表达式 JavaScript语言定义对象的属性,有两种方法。 @@ -133,6 +157,26 @@ Object.is(NaN, NaN) // true ``` +ES5可以通过下面的代码,部署Object.is()。 + +```javascript + +Object.defineProperty(Object, 'is', { + value: function(x, y) { + if (x === y) { + // 针对+0 不等于 -0的情况 + return x !== 0 || 1 / x === 1 / y; + } + // 针对NaN的情况 + return x !== x && y !== y; + }, + configurable: true, + enumerable: false, + writable: true +}); + +``` + ## Object.assign() Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。只要有一个参数不是对象,就会抛出TypeError错误。 From 4d044952dc703d764485f791d65068bdb85c1b44 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Wed, 14 Jan 2015 12:10:21 +0800 Subject: [PATCH 0058/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9string/contains?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=94=B9=E4=B8=BAincludes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/string.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/string.md b/docs/string.md index 7c6b403bf..791bd340d 100644 --- a/docs/string.md +++ b/docs/string.md @@ -265,11 +265,11 @@ normalize方法可以接受四个参数。 不过,normalize方法目前不能识别三个或三个以上字符的合成。这种情况下,还是只能使用正则表达式,通过Unicode编号区间判断。 -## contains(), startsWith(), endsWith() +## includes(), startsWith(), endsWith() 传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。 -- **contains()**:返回布尔值,表示是否找到了参数字符串。 +- **includes()**:返回布尔值,表示是否找到了参数字符串。 - **startsWith()**:返回布尔值,表示参数字符串是否在源字符串的头部。 - **endsWith()**:返回布尔值,表示参数字符串是否在源字符串的尾部。 @@ -279,7 +279,7 @@ var s = "Hello world!"; s.startsWith("Hello") // true s.endsWith("!") // true -s.contains("o") // true +s.includes("o") // true ``` @@ -291,7 +291,7 @@ var s = "Hello world!"; s.startsWith("o", 4) // true s.endsWith("o", 8) // true -s.contains("o", 8) // false +s.includes("o", 8) // false ``` From 93a5cdd882660c9e5d46e8a1e95ee6ce085c4fe7 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Fri, 16 Jan 2015 08:01:55 +0800 Subject: [PATCH 0059/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9string/startsWith?= =?UTF-8?q?=E7=9A=84=E4=BE=8B=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/string.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/string.md b/docs/string.md index 791bd340d..3f4c0420c 100644 --- a/docs/string.md +++ b/docs/string.md @@ -289,9 +289,9 @@ s.includes("o") // true var s = "Hello world!"; -s.startsWith("o", 4) // true -s.endsWith("o", 8) // true -s.includes("o", 8) // false +s.startsWith("world", 6) // true +s.endsWith("Hello", 5) // true +s.includes("Hello", 6) // false ``` From 4f7f2ea8ebb524c9d5bf69e8e516e10278fe3b46 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 25 Jan 2015 14:24:20 +0800 Subject: [PATCH 0060/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/destructuring.md | 2 +- docs/generator.md | 53 +++++++++++++++++++++++++++++++++++++++++++ docs/promise.md | 43 +++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 1 deletion(-) diff --git a/docs/destructuring.md b/docs/destructuring.md index a6db313eb..9066e9388 100644 --- a/docs/destructuring.md +++ b/docs/destructuring.md @@ -108,7 +108,7 @@ a // "a" ``` -事实上,只要某种数据结构具有Iterator接口,都可以采用数组形式的结构赋值。 +事实上,只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值。 ## 对象的解构赋值 diff --git a/docs/generator.md b/docs/generator.md index 5ecb57758..339611a32 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -74,6 +74,59 @@ setTimeout(function () { 上面代码中,函数f如果是普通函数,在为变量generator赋值时就会执行。但是,函数f是一个Generator函数,就变成只有调用next方法时,函数f才会执行。 +另外需要注意,yield语句不能用在普通函数中,否则会报错。 + +```javascript + +(function (){ + yield 1; +})() +// SyntaxError: Unexpected number + +``` + +上面代码在一个普通函数中使用yield语句,结果产生一个句法错误。 + +下面是另外一个例子。 + +```javascript + +var arr = [1, [[2, 3], 4], [5, 6]]; + +var flat = function* (a){ + a.forEach(function(item){ + if (typeof item !== 'number'){ + yield* flat(item); + } else { + yield item; + } + } +}; + +for (var f of flat(arr)){ + console.log(f); +} + +``` + +上面代码也会产生句法错误,因为forEach方法的参数是一个普通函数,但是在里面使用了yield语句。一种修改方法是改用for循环。 + +```javascript + +var flat = function* (a){ + var length = a.length; + for(var i =0;i Date: Sun, 25 Jan 2015 22:58:24 +0800 Subject: [PATCH 0061/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9docs/generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 54 +++++++++++++++++++++++++++++++++++++++++++++++ docs/reference.md | 1 + 2 files changed, 55 insertions(+) diff --git a/docs/generator.md b/docs/generator.md index 339611a32..f2b9cf35b 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -113,6 +113,8 @@ for (var f of flat(arr)){ ```javascript +var arr = [1, [[2, 3], 4], [5, 6]]; + var flat = function* (a){ var length = a.length; for(var i =0;i Date: Tue, 27 Jan 2015 21:52:28 +0800 Subject: [PATCH 0062/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9string/=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E5=AD=97=E7=AC=A6=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 18 +++++++ docs/generator.md | 15 ++++++ docs/iterator.md | 98 +++++++++++++++++++++++++++++++------- docs/reference.md | 7 +++ docs/set-map.md | 49 +++++++++++++++++-- docs/string.md | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 284 insertions(+), 21 deletions(-) diff --git a/docs/class.md b/docs/class.md index f8832e9d9..32a0af008 100644 --- a/docs/class.md +++ b/docs/class.md @@ -153,6 +153,24 @@ import { lastName as surname } from './profile'; ``` +ES6支持多重加载,即所加载的模块中又加载其他模块。 + +```javascript + +import { Vehicle } from './Vehicle'; + +class Car extends Vehicle { + move () { + console.log(this.name + ' is spinning wheels...') + } +} + +export { Car } + +``` + +上面的模块先加载Vehicle模块,然后在其基础上添加了move方法,再作为一个新模块输出。 + **(2)模块的整体输入,module命令** export命令除了输出变量,还可以输出方法或类(class)。下面是一个circle.js文件,它输出两个方法area和circumference。 diff --git a/docs/generator.md b/docs/generator.md index f2b9cf35b..34c84d9b8 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -52,6 +52,21 @@ hw.next() 总结一下,Generator函数使用iterator接口,每次调用next方法的返回值,就是一个标准的iterator返回值:有着value和done两个属性的对象。其中,value是yield语句后面那个表达式的值,done是一个布尔值,表示是否遍历结束。 +由于Generator函数本身就能生成遍历器,所以它的Symbol.iterator属性指向自身。 + +```javascript + +function* gen(){ + // some code +} + +gen[Symbol.iterator]() === gen +// true + +``` + +上面代码中,gen是一个Generator函数,它的Symbol.iterator属性就指向它自己。 + 由于Generator函数返回的遍历器,只有调用next方法才会遍历下一个成员,所以其实提供了一种可以暂停执行的函数。yield语句就是暂停标志,next方法遇到yield,就会暂停执行后面的操作,并将紧跟在yield后面的那个表达式的值,作为返回对象的value属性的值。当下一次调用next方法时,再继续往下执行,直到遇到下一个yield语句。如果没有再遇到新的yield语句,就一直运行到函数结束,将return语句后面的表达式的值,作为value属性的值,如果该函数没有return语句,则value属性的值为undefined。另一方面,由于yield后面的表达式,直到调用next方法时才会执行,因此等于为JavaScript提供了手动的“惰性求值”(Lazy Evaluation)的语法功能。 yield语句与return语句有点像,都能返回紧跟在语句后面的那个表达式的值。区别在于每次遇到yield,函数暂停执行,下一次再从该位置继续向后执行,而return语句不具备位置记忆的功能。一个函数里面,只能执行一次(或者说一个)return语句,但是可以执行多次(或者说多个)yield语句。正常函数只能返回一个值,因为只能执行一次return;Generator函数可以返回一系列的值,因为可以有任意多个yield。从另一个角度看,也可以说Generator生成了一系列的值,这也就是它的名称的来历(在英语中,generator这个词是“生成器”的意思)。 diff --git a/docs/iterator.md b/docs/iterator.md index d63d61c69..ebe3589f5 100644 --- a/docs/iterator.md +++ b/docs/iterator.md @@ -2,6 +2,8 @@ ## Iterator(遍历器) +### 语法 + 遍历器(Iterator)是一种接口规格,任何对象只要部署这个接口,就可以完成遍历操作。它的作用有两个,一是为各种数据结构,提供一个统一的、简便的接口,二是使得对象的属性能够按某种次序排列。在ES6中,遍历操作特指for...of循环,即Iterator接口主要供for...of循环使用。 遍历器提供了一个指针,指向当前对象的某个属性,使用next方法,就可以将指针移动到下一个属性。next方法返回一个包含value和done两个属性的对象。其中,value属性是当前遍历位置的值,done属性是一个布尔值,表示遍历是否结束。下面是一个模拟next方法返回值的例子。 @@ -51,9 +53,15 @@ it.next().value // '2' ``` -上面的例子,只是为了说明next方法返回值的结构。Iterator接口返回的遍历器,原生具备next方法,不用自己部署。所以,真正需要部署的是Iterator接口,让其返回一个遍历器。在ES6中,有三类数据结构原生具备Iterator接口:数组、类似数组的对象、Set和Map结构。除此之外,其他数据结构(主要是对象)的Iterator接口都需要自己部署。 +上面的例子,说明了next方法返回值的结构:value和done两个属性。 + +### Iterator接口的部署 + +具有Iterator接口的对象,都能被for...of循环遍历(见后文的介绍)。所谓Iterator接口,就是指它会返回一个遍历器对象,该对象具备next方法,每次调用该方法,会依次返回一个具有上节提到的value和done两个属性的新对象,指向原对象的一个成员。 + +在ES6中,有三类数据结构原生具备Iterator接口:数组、类似数组的对象、Set和Map结构。除此之外,其他数据结构(主要是对象)的Iterator接口都需要自己部署。其他对象需要手动部署Iterator接口,让其返回一个遍历器。 -下面就是如何部署Iterator接口。一个对象如果要有Iterator接口,必须部署一个@@iterator方法(原型链上的对象具有该方法也可),该方法部署在一个键名为`Symbol.iterator`的属性上,对应的键值是一个函数,该函数返回一个遍历器对象。 +一个对象如果要有Iterator接口,必须部署一个@@iterator方法(原型链上的对象具有该方法也可),该方法部署在一个键名为`Symbol.iterator`的属性上,对应的键值是一个函数,该函数返回一个遍历器对象。 ```javascript @@ -69,7 +77,59 @@ class MySpecialTree { 上面代码是一个类部署Iterator接口的写法。`Symbol.iterator`是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为Symbol的特殊值,所以要放在方括号内(请参考Symbol一节)。这里要注意,@@iterator的键名是`Symbol.iterator`,键值是一个方法(函数),该方法执行后,返回一个当前对象的遍历器。 -下面是为对象添加Iterator接口的例子。 +下面是一个例子。 + +```javascript + +function O(value){ + this.value = value; + this.next = null; +} + +O.prototype[Symbol.iterator] = function(){ + + var iterator = { + next: next + }; + + var current = this; + + function next(){ + if (current){ + var value = current.value; + var done = current == null; + current = current.next; + return { + done: done, + value: value + } + } else { + return { + done: true + } + } + } + return iterator; +} + +var one = new O(1); +var two = new O(2); +var three = new O(3); +one.next = two; +two.next = three; + +for (var i of one){ + console.log(i) +} +// 1 +// 2 +// 3 + +``` + +上面代码首先在构造函数的原型链上部署Symbol.iterator方法,调用该方法会返回遍历器对象iterator,调用该对象的next方法,在返回一个值的同时,自动将内部指针移到下一个实例。 + +下面是另一个为对象添加Iterator接口的例子。 ```javascript @@ -95,6 +155,22 @@ let obj = { ``` +如果`Symbol.iterator`方法返回的不是遍历器,解释引擎将会报错。 + +```javascript + +var obj = {}; + +obj[Symbol.iterator] = () => 1; + +[...obj] // TypeError: [] is not a function + +``` + +上面代码中,变量obj的@@iterator方法返回的不是遍历器,因此报错。 + +### 原生具备iterator接口的数据结构 + 《数组的扩展》一章中提到,ES6对数组提供entries()、keys()和values()三个方法,就是返回三个遍历器。 ```javascript @@ -159,6 +235,8 @@ str // "hi" 上面代码中,字符串str的`Symbol.iterator`方法被修改了,所以扩展运算符(...)返回的值变成了bye,而字符串本身还是hi。 +### Iterator接口与Generator函数 + 部署`Symbol.iterator`方法的最简单实现,还是使用下一节要提到的Generator函数。 ```javascript @@ -189,20 +267,6 @@ for (let x of obj) { ``` -如果`Symbol.iterator`方法返回的不是遍历器,解释引擎将会报错。 - -```javascript - -var obj = {}; - -obj[Symbol.iterator] = () => 1; - -[...obj] // TypeError: [] is not a function - -``` - -上面代码中,变量obj的@@iterator方法返回的不是遍历器,因此报错。 - ## for...of循环 ES6中,一个对象只要部署了@@iterator方法,就被视为具有iterator接口,就可以用for...of循环遍历它的值。也就是说,for...of循环内部调用是原对象的`Symbol.iterator`方法。 diff --git a/docs/reference.md b/docs/reference.md index bd957fda4..80b05899d 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -19,6 +19,8 @@ - Luke Hoban, [ES6 features](https://github.com/lukehoban/es6features) - Traceur-compiler, [Language Features](https://github.com/google/traceur-compiler/wiki/LanguageFeatures): Traceur文档列出的一些ES6例子 - Axel Rauschmayer, [ECMAScript 6: what’s next for JavaScript?](https://speakerdeck.com/rauschma/ecmascript-6-whats-next-for-javascript-august-2014): 关于ES6新增语法的综合介绍,有很多例子 +- Toby Ho, [ES6 in io.js](http://davidwalsh.name/es6-io) + ## 语法点 @@ -31,7 +33,12 @@ - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 - Axel Rauschmayer, [ECMAScript 6: maps and sets](http://www.2ality.com/2015/01/es6-maps-sets.html): Set和Map结构的详细介绍 + +## 字符串 + - Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 +- Nicholas C. Zakas, [A critical review of ECMAScript 6 quasi-literals](http://www.nczonline.net/blog/2012/08/01/a-critical-review-of-ecmascript-6-quasi-literals/) +- Mozilla Developer Network, [Template strings](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings) ## Object diff --git a/docs/set-map.md b/docs/set-map.md index 2ec638c3c..51023e454 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -256,6 +256,16 @@ WeakSet结构与Set类似,也是不重复的值的集合。但是,它与Set 首先,WeakSet的成员只能是对象,而不能是其他类型的值。其次,WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于WeakSet之中。这个特点意味着,无法引用WeakSet的成员,因此WeakSet是不可遍历的。 +```javascript + +var ws = new WeakSet(); +ws.add(1) +// TypeError: Invalid value used in weak set + +``` + +上面代码试图向WeakSet添加一个数值,结果报错。 + WeakSet是一个构造函数,可以使用new命令,创建WeakSet数据结构。 ```javascript @@ -303,6 +313,25 @@ ws.clear(); ``` +WeakSet没有size属性,没有办法遍历它的成员。 + +```javascript + +ws.size +// undefined + +ws.forEach(function(item){ console.log('WeakSet has ' + item)}) +// TypeError: undefined is not a function + +ws.forEach +// undefined + +``` + +上面代码试图获取size和forEach属性,结果都不能成功。 + +WeakSet不能遍历,是因为成员都是弱引用,随时可能消失,遍历机制无法保存成员的存在,很可能刚刚遍历结束,成员就取不到了。WeakSet的一个用处,是储存DOM节点,而不用担心这些节点从文档移除时,会引发内存泄漏。 + ## Map **(1)基本用法** @@ -611,24 +640,36 @@ WeakMap的设计目的在于,键名是对象的弱引用(垃圾回收机制 ```javascript -var map = new WeakMap(); +var wm = new WeakMap(); var element = document.querySelector(".element"); -map.set(element, "Original"); +wm.set(element, "Original"); -var value = map.get(element); +var value = wm.get(element); console.log(value); // "Original" element.parentNode.removeChild(element); element = null; -value = map.get(element); +value = wm.get(element); console.log(value); // undefined ``` WeakMap与Map在API上的区别主要是两个,一是没有遍历操作(即没有key()、values()和entries()方法),也没有size属性;二是无法清空,即不支持clear方法。这与WeakMap的键不被计入引用、被垃圾回收机制忽略有关。因此,WeakMap只有四个方法可用:get()、set()、has()、delete()。 +```javascript + +var wm = new WeakMap(); + +wm.size +// undefined + +wm.forEach +// undefined + +``` + WeakMap的一个用处是部署私有属性。 ```javascript diff --git a/docs/string.md b/docs/string.md index 3f4c0420c..3eb18afc6 100644 --- a/docs/string.md +++ b/docs/string.md @@ -402,6 +402,15 @@ console.log(`${obj.x + obj.y}`) ``` +如果模板字符串中的变量没有声明,将报错。 + +```javascript + +var msg = `Hello, ${place}`; +// throws error + +``` + 模板字符串使得字符串与变量的结合,变得容易。下面是一个例子。 ```javascript @@ -412,3 +421,112 @@ if (x > MAX) { } ``` + +模板字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。 + +```javascript + +var a = 5; +var b = 10; + +tag`Hello ${ a + b } world ${ a * b}`; + +``` + +上面代码中,模板字符串前面有一个函数tag,整个表达式将返回tag处理模板字符串后的返回值。 + +函数tag依次接受三个参数。第一个参数是一个数组,该数组的成员是模板字符串中那些没有变量替换的部分,也就是说,变量替换只发生在数组的第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推。第一个参数之后的参数,都是模板字符串各个变量被替换后的值。 + +- 第一个参数:['Hello ', ' world '] +- 第二个参数: 15 +- 第三个参数:50 + +```javascript + +var a = 5; +var b = 10; + +function tag(s, v1, v2) { + console.log(s[0]); // "Hello " + console.log(s[1]); // " world " + console.log(v1); // 15 + console.log(v2); // 50 + + return "OK"; +} + +tag`Hello ${ a + b } world ${ a * b}`; +// "OK" + +``` + +下面是一个更复杂的例子。 + +```javascript + +var total = 30; +var msg = passthru`The total is ${total} (${total*1.05} with tax)`; + +function passthru(literals) { + var result = ""; + var i = 0; + + while (i < literals.length) { + result += literals[i++]; + if (i < arguments.length) { + result += arguments[i]; + } + } + + return result; + +} + +msg +// "The total is 30 (31.5 with tax)" + +``` + +上面这个例子展示了,如何将各个参数按照原来的位置拼合回去。 + +处理函数的第一个参数,还有一个raw属性。它也是一个数组,成员与处理函数的第一个参数完全一致,唯一的区别是字符串被转义前的原始格式,这是为了模板函数处理的方便而提供的。 + +```javascript + +tag`First line\nSecond line` + +``` + +上面代码中,tag函数的第一个参数是一个数组`["First line\nSecond line"]`,这个数组有一个raw属性,等于`["First line\\nSecond line"]`,两者唯一的区别就是斜杠被转义了。 + +function tag(strings) { + console.log(strings.raw[0]); + // "First line\\nSecond line" +} + +## String.raw() + +String.raw方法,往往用来充当模板字符串的处理函数,返回字符串被转义前的原始格式。 + +```javascript + +String.raw`Hi\n${2+3}!`; +// "Hi\\n5!" + +String.raw`Hi\u000A!`; +// 'Hi\\u000A!' + +``` + +String.raw方法也可以正常的函数形式使用。这时,它的第一个参数,应该是一个具有raw属性的对象,且raw属性的值应该是一个数组。 + +```javascript + +String.raw({ raw: 'test' }, 0, 1, 2); +// 't0e1s2t' + + +// 等同于 +String.raw({ raw: ['t','e','s','t'] }, 0, 1, 2); + +``` From b06c2f1f6d5e0c1dd92581d45c19c6034c9c4e77 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Wed, 28 Jan 2015 21:48:15 +0800 Subject: [PATCH 0063/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9docs/generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 71 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/docs/generator.md b/docs/generator.md index 34c84d9b8..5e493c74c 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -324,6 +324,48 @@ function* g(){ ``` +如果Generator函数内部没有定义catch,那么throw方法抛出的错误,将被函数体的catch捕获。 + +```javascript + +function *foo() { } + +var it = foo(); +try { + it.throw( "Oops!" ); +} catch (err) { + console.log( "Error: " + err ); // Error: Oops! +} + +``` + +上面代码中,foo函数内部没有任何语句,throw抛出的错误被函数体外的catch捕获。 + +反过来,Generator函数内抛出的错误,也可以被函数体外的catch捕获。 + +```javascript + +function *foo() { + var x = yield 3; + var y = x.toUpperCase(); + yield y; +} + +var it = foo(); + +it.next(); // { value:3, done:false } + +try { + it.next( 42 ); +} +catch (err) { + console.log( err ); +} + +``` + +上面代码中,第二个next方法向函数体内传入一个参数42,数值是没有toUpperCase方法的,所以会抛出一个TypeError错误,被函数体外的catch捕获。 + 一旦Generator执行过程中抛出错误,就不会再执行下去了。如果此后还调用next方法,将一直返回发生错误前的那个值。 ```javascript @@ -414,6 +456,35 @@ gen().next() // { value:"a", done:false } 上面代码中,yield命令后面如果不加星号,返回的是整个数组,加了星号就表示返回的是数组的遍历器。 +如果被代理的Generator函数有return语句,那么就可以向代理它的Generator函数返回数据。 + +```javascript + +function *foo() { + yield 2; + yield 3; + return "foo"; +} + +function *bar() { + yield 1; + var v = yield *foo(); + console.log( "v: " + v ); + yield 4; +} + +var it = bar(); + +it.next(); // +it.next(); // +it.next(); // +it.next(); // "v: foo" +it.next(); // + +``` + +上面代码在第四次调用next方法的时候,屏幕上会有输出,这是因为函数foo的return语句,向函数bar提供了返回值。 + `yield*`命令可以很方便地取出嵌套数组的所有成员。 ```javascript From d3fa544cea9303ccca4d5870eeed856d9804e8fb Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Wed, 4 Feb 2015 17:59:15 +0800 Subject: [PATCH 0064/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9function/rest=20&?= =?UTF-8?q?=20spread?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/function.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++ docs/reference.md | 1 + 2 files changed, 64 insertions(+) diff --git a/docs/function.md b/docs/function.md index a8a1bb8fd..b5d7cf02a 100644 --- a/docs/function.md +++ b/docs/function.md @@ -239,6 +239,14 @@ add(...numbers) // 42 上面代码中,`array.push(...items)`和`add(...numbers)`这两行,都是函数的调用,它们的都使用了扩展运算符。该运算符将一个数组,变为参数序列。 +下面是Date函数的参数使用扩展运算符的例子。 + +```javascript + +const date = new Date(...[2015, 1, 1]); + +``` + 由于扩展运算符可以展开数组,所以不再需要apply方法,将数组转为函数的参数了。 ```javascript @@ -318,6 +326,44 @@ d 上面代码其实也提供了,将一个数组拷贝进另一个数组的便捷方法。 +扩展运算符也可以与解构赋值结合起来,用于生成数组。 + +```javascript + +const [first, ...rest] = [1, 2, 3, 4, 5]; +first // 1 +rest // [2, 3, 4, 5] + +const [first, ...rest] = []; +first // undefined +rest // []: + +const [first, ...rest] = ["foo"]; +first // "foo" +rest // [] + +const [first, ...rest] = ["foo", "bar"]; +first // "foo" +rest // ["bar"] + +const [first, ...rest] = ["foo", "bar", "baz"]; +first // "foo" +rest // ["bar","baz"] + +``` + +如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。 + +```javascript + +const [...butLast, last] = [1, 2, 3, 4, 5]; +// 报错 + +const [first, ..., last] = [1, 2, 3, 4, 5]; +// 报错 + +``` + JavaScript的函数只能返回一个值,如果需要返回多个值,只能返回数组或对象。扩展运算符提供了解决这个问题的一种变通方法。 ```javascript @@ -432,6 +478,7 @@ var sum = (num1, num2) => { return num1 + num2; } var getTempItem = id => ({ id: id, name: "Temp" }); ``` + 箭头函数的一个用处是简化回调函数。 ```javascript @@ -460,6 +507,22 @@ var result = values.sort((a, b) => a - b); ``` +下面是rest参数与箭头函数结合的例子。 + +```javascript + +const numbers = (...nums) => nums; + +numbers(1, 2, 3, 4, 5) +// [1,2,3,4,5] + +const headAndTail = (head, ...tail) => [head, tail]; + +headAndTail(1, 2, 3, 4, 5) +// [1,[2,3,4,5]] + +``` + 箭头函数有几个使用注意点。 - 函数体内的this对象,绑定定义时所在的对象,而不是使用时所在的对象。 diff --git a/docs/reference.md b/docs/reference.md index 80b05899d..81a358990 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -33,6 +33,7 @@ - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 - Axel Rauschmayer, [ECMAScript 6: maps and sets](http://www.2ality.com/2015/01/es6-maps-sets.html): Set和Map结构的详细介绍 +- Ragan Wald, [Destructuring and Recursion in ES6](http://raganwald.com/2015/02/02/destructuring.html): rest参数和扩展运算符的详细介绍 ## 字符串 From aa30945f1bc00a7d802847d62868792a969f3672 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 5 Feb 2015 23:08:48 +0800 Subject: [PATCH 0065/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9object/proxy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/let.md | 13 +++++++++++++ docs/object.md | 35 ++++++++++++++++++++++++++++++++++- docs/reference.md | 4 +++- 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/docs/let.md b/docs/let.md index 7e6862773..0f8064ab8 100644 --- a/docs/let.md +++ b/docs/let.md @@ -75,6 +75,19 @@ function do_something() { 上面代码在声明foo之前,就使用这个变量,结果会抛出一个错误。 +这也意味着typeof不再是一个百分之百安全的操作。 + +```javascript + +if (1) { + typeof x; // ReferenceError + let x; +} + +``` + +上面代码中,由于块级作用域内typeof运行时,x还没有声明,所以会抛出一个ReferenceError。 + 注意,let不允许在相同作用域内,重复声明同一个变量。 ```javascript diff --git a/docs/object.md b/docs/object.md index f6451fcb9..44ae792e3 100644 --- a/docs/object.md +++ b/docs/object.md @@ -590,7 +590,7 @@ obj.time // 35 上面代码中,proxy对象是obj对象的原型,obj对象本身并没有time属性,所有根据原型链,会在proxy对象上读取该属性,导致被拦截。 -对于没有设置拦截的操作,则直接落在目标函数上,按照原先的方式产生结果。 +对于没有设置拦截的操作,则直接落在目标对象上,按照原先的方式产生结果。 下面是另一个拦截读取操作的例子。 @@ -617,6 +617,39 @@ proxy.age // 抛出一个错误 上面代码表示,如果访问目标对象不存在的属性,会抛出一个错误。如果没有这个拦截函数,访问不存在的属性,只会返回undefined。 +利用proxy,可以将读取属性的操作(get),转变为执行某个函数。 + +```javascript + +var pipe = (function () { + var pipe; + return function (value) { + pipe = []; + return new Proxy({}, { + get: function (pipeObject, fnName) { + if (fnName == "get") { + return pipe.reduce(function (val, fn) { + return fn(val); + }, value); + } + pipe.push(window[fnName]); + return pipeObject; + } + }); + } +}()); + +var double = function (n) { return n*2 }; +var pow = function (n) { return n*n }; +var reverseInt = function (n) { return n.toString().split('').reverse().join('')|0 }; + +pipe(3) . double . pow . reverseInt . get +// 63 + +``` + +上面代码设置Proxy以后,达到了将函数名链式使用的效果。 + 除了取值函数get,Proxy还可以设置存值函数set,用来拦截某个属性的赋值行为。假定Person对象有一个age属性,该属性应该是一个不大于200的整数,那么可以使用Proxy对象保证age的属性值符合要求。 ```javascript diff --git a/docs/reference.md b/docs/reference.md index 81a358990..0bb3e7246 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -24,7 +24,8 @@ ## 语法点 -- Kyle Simpson, [For and against `let`](http://davidwalsh.name/for-and-against-let): 讨论let命令的作用域 +- Kyle Simpson, [For and against `let`](http://davidwalsh.name/for-and-against-let): 讨论let命令的作用域 +- kangax, [Why `typeof` is no longer “safe”](http://es-discourse.com/t/why-typeof-is-no-longer-safe/15): 讨论在块级作用域内,let命令的变量声明和赋值的行为 - Nick Fitzgerald, [Destructuring Assignment in ECMAScript 6](http://fitzgeraldnick.com/weblog/50/): 详细介绍解构赋值的用法 - Nicholas C. Zakas, [Understanding ECMAScript 6 arrow functions](http://www.nczonline.net/blog/2013/09/10/understanding-ecmascript-6-arrow-functions/) - Jack Franklin, [Real Life ES6 - Arrow Functions](http://javascriptplayground.com/blog/2014/04/real-life-es6-arrow-fn/) @@ -48,6 +49,7 @@ - Sella Rafaeli, [Native JavaScript Data-Binding](http://www.sellarafaeli.com/blog/native_javascript_data_binding): 如何使用Object.observe方法,实现数据对象与DOM对象的双向绑定 - Axel Rauschmayer, [Symbols in ECMAScript 6](http://www.2ality.com/2014/12/es6-symbols.html): Symbol简介 - Axel Rauschmayer, [Meta programming with ECMAScript 6 proxies](http://www.2ality.com/2014/12/es6-proxies.html): Proxy详解 +- Daniel Zautner, [Meta-programming JavaScript Using Proxies](http://dzautner.com/meta-programming-javascript-using-proxies/):使用Proxy实现元编程 ## Iterator和Generator From 8a223e4413a1ce95e000dbaf04c0f45096abdd05 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 8 Feb 2015 20:48:39 +0800 Subject: [PATCH 0066/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9let?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/function.md | 9 +++++ docs/let.md | 98 +++++++++++++++++++++++++++++++++++++++++++++-- docs/reference.md | 2 + 3 files changed, 105 insertions(+), 4 deletions(-) diff --git a/docs/function.md b/docs/function.md index b5d7cf02a..ecf8f7db7 100644 --- a/docs/function.md +++ b/docs/function.md @@ -375,6 +375,15 @@ var d = new Date(...dateFields); 上面代码从数据库取出一行数据,通过扩展运算符,直接将其传入构造函数Date。 +除了扩展数组,扩展运算符还可以将一个数值扩展成数值。 + +```javascript + +[...5] +// [0, 1, 2, 3, 4, 5] + +``` + 扩展运算符还可以将字符串转为真正的数组。 ```javascript diff --git a/docs/let.md b/docs/let.md index 0f8064ab8..9cd7e0adc 100644 --- a/docs/let.md +++ b/docs/let.md @@ -88,20 +88,85 @@ if (1) { 上面代码中,由于块级作用域内typeof运行时,x还没有声明,所以会抛出一个ReferenceError。 +总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。 + +```javascript + +if (true) { + // TDZ开始 + tmp = 'abc'; // ReferenceError + console.log(tmp); // ReferenceError + + let tmp; // TDZ结束 + console.log(tmp); // undefined + + tmp = 123; + console.log(tmp); // 123 +} + +``` + +上面代码中,在let命令声明变量tmp之前,都属于变量tmp的“死区”。 + +有些“死区”比较隐蔽,不太容易发现。 + +```javascript + +function bar(x=y, y=2) { + return [x, y]; +} + +bar(); // 报错 + +``` + +上面代码中,调用bar函数之所以报错,是因为参数x默认值等于另一个参数y,而此时y还没有声明,属于”死区“。 + +```javascript + +let foo = 'outer'; + +function bar(func = x => foo) { + let foo = 'inner'; + console.log(func()); // outer +} + +bar(); + +``` + +上面代码中,函数bar的参数func,默认是一个匿名函数,返回值为foo。这个匿名函数运行时,foo只在函数体外声明,内层的声明还没执行,因此foo指向函数体外的声明,输出outer。 + 注意,let不允许在相同作用域内,重复声明同一个变量。 ```javascript // 报错 { - let a = 10; - var a = 1; + let a = 10; + var a = 1; } // 报错 { - let a = 10; - let a = 1; + let a = 10; + let a = 1; +} + +``` + +因此,不能在函数内部重新声明参数。 + +```javascript + +function func(arg) { + let arg; // 报错 +} + +function func(arg) { + { + let arg; // 不报错 + } } ``` @@ -205,3 +270,28 @@ const message = "Goodbye!"; const age = 30; ``` + +由于const命令只是指向变量所在的地址,所以将一个对象声明为常量必须非常小心。 + +```javascript + +const foo = {}; +foo.prop = 123; + +foo.prop +// 123 + +foo = {} // 不起作用 + +``` + +上面代码中,常量foo储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。如果真的想将对象冻结,应该使用Object.freeze方法。 + +```javascript + +const foo = Object.freeze({}); +foo.prop = 123; // 不起作用 + +``` + +上面代码中,常量foo指向一个冻结的对象,所以添加新属性不起作用。 diff --git a/docs/reference.md b/docs/reference.md index 0bb3e7246..d89a6d9c1 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -26,6 +26,7 @@ - Kyle Simpson, [For and against `let`](http://davidwalsh.name/for-and-against-let): 讨论let命令的作用域 - kangax, [Why `typeof` is no longer “safe”](http://es-discourse.com/t/why-typeof-is-no-longer-safe/15): 讨论在块级作用域内,let命令的变量声明和赋值的行为 +- Axel Rauschmayer, [Variables and scoping in ECMAScript 6](http://www.2ality.com/2015/02/es6-scoping.html): 讨论块级作用域与let和const的行为 - Nick Fitzgerald, [Destructuring Assignment in ECMAScript 6](http://fitzgeraldnick.com/weblog/50/): 详细介绍解构赋值的用法 - Nicholas C. Zakas, [Understanding ECMAScript 6 arrow functions](http://www.nczonline.net/blog/2013/09/10/understanding-ecmascript-6-arrow-functions/) - Jack Franklin, [Real Life ES6 - Arrow Functions](http://javascriptplayground.com/blog/2014/04/real-life-es6-arrow-fn/) @@ -66,6 +67,7 @@ - Jan Krems, [Generators Are Like Arrays](https://gist.github.com/jkrems/04a2b34fb9893e4c2b5c): 讨论Generator可以被当作数据结构看待 - Harold Cooper, [Coroutine Event Loops in Javascript](http://syzygy.st/javascript-coroutines/): Generator用于实现状态机 - Ruslan Ismagilov, [learn-generators](https://github.com/isRuslan/learn-generators): 编程练习,共6道题 +- Kyle Simpson, [Iterating ES6 Numbers](http://blog.getify.com/iterating-es6-numbers/): 在数值对象上部署遍历器 ## Promise对象 From b148bcdbfb89e6aa5aafd9e8b0469caf512f87da Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Mon, 9 Feb 2015 11:23:52 +0800 Subject: [PATCH 0067/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9string/template=20s?= =?UTF-8?q?tring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/reference.md | 2 ++ docs/string.md | 46 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/docs/reference.md b/docs/reference.md index d89a6d9c1..6ff6dc055 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -42,6 +42,8 @@ - Mathias Bynens, [Unicode-aware regular expressions in ES6](https://mathiasbynens.be/notes/es6-unicode-regex): 详细介绍正则表达式的u修饰符 - Nicholas C. Zakas, [A critical review of ECMAScript 6 quasi-literals](http://www.nczonline.net/blog/2012/08/01/a-critical-review-of-ecmascript-6-quasi-literals/) - Mozilla Developer Network, [Template strings](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings) +- Addy Osmani, [Getting Literal With ES6 Template Strings](http://updates.html5rocks.com/2015/01/ES6-Template-Strings): 模板字符串的介绍 +- Blake Winton, [ES6 Templates](https://weblog.latte.ca/blake/tech/firefox/templates.html): 模板字符串的介绍 ## Object diff --git a/docs/string.md b/docs/string.md index 3eb18afc6..40d7f0a79 100644 --- a/docs/string.md +++ b/docs/string.md @@ -375,13 +375,22 @@ r.sticky // true `In JavaScript this is not legal.` +console.log(`string text line 1 +string text line 2`); + // 字符串中嵌入变量 var name = "Bob", time = "today"; `Hello ${name}, how are you ${time}?` ``` -上面代码中的字符串,都是用反引号表示。如果在模板字符串中嵌入变量,需要将变量名写在`${}`之中。 +上面代码中的字符串,都是用反引号表示。如果在模板字符串中嵌入变量,需要将变量名写在`${}`之中。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。 + +```javascript + +var greeting = `\`Yo\` World!`; + +``` 大括号内部可以进行运算,以及引用对象属性。 @@ -402,6 +411,19 @@ console.log(`${obj.x + obj.y}`) ``` +模板字符串之中还能调用函数。 + +```javascript + +function fn() { + return "Hello World"; +} + +console.log(`foo ${fn()} bar`); +// foo Hello World bar + +``` + 如果模板字符串中的变量没有声明,将报错。 ```javascript @@ -441,21 +463,35 @@ tag`Hello ${ a + b } world ${ a * b}`; - 第二个参数: 15 - 第三个参数:50 +也就是说,tag函数实际的参数如下。 + +```javascript + +tag(['Hello ', ' world '], 15, 50) + +``` + +下面是tag函数的代码,以及运行结果。 + ```javascript var a = 5; var b = 10; function tag(s, v1, v2) { - console.log(s[0]); // "Hello " - console.log(s[1]); // " world " - console.log(v1); // 15 - console.log(v2); // 50 + console.log(s[0]); + console.log(s[1]); + console.log(v1); + console.log(v2); return "OK"; } tag`Hello ${ a + b } world ${ a * b}`; +// "Hello " +// " world " +// 15 +// 50 // "OK" ``` From 0c21b61c55374be2ca23fe4fbcc3624ea8ad81d9 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 10 Feb 2015 08:45:18 +0800 Subject: [PATCH 0068/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9promise/catch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/promise.md | 104 +++++++++++++++++++++++++++++++++++++++++++--- docs/reference.md | 1 + 2 files changed, 99 insertions(+), 6 deletions(-) diff --git a/docs/promise.md b/docs/promise.md index 640bfbcfb..da19ed131 100644 --- a/docs/promise.md +++ b/docs/promise.md @@ -96,7 +96,7 @@ var p2 = new Promise(function(resolve, reject){ 上面代码中,p1和p2都是Promise的实例,但是p2的resolve方法将p1作为参数,这时p1的状态就会传递给p2。如果调用的时候,p1的状态是pending,那么p2的回调函数就会等待p1的状态改变;如果p1的状态已经是fulfilled或者rejected,那么p2的回调函数将会立刻执行。 -## Promise.prototype.then方法:链式操作 +## Promise.prototype.then() Promise.prototype.then方法返回的是一个新的Promise对象,因此可以采用链式写法。 @@ -126,9 +126,9 @@ getJSON("/post/1.json").then(function(post) { 这种设计使得嵌套的异步操作,可以被很容易得改写,从回调函数的“横向发展”改为“向下发展”。 -## Promise.prototype.catch方法:捕捉错误 +## Promise.prototype.catch() -Promise.prototype.catch方法是Promise.prototype.then(null, rejection)的别名,用于指定发生错误时的回调函数。 +Promise.prototype.catch方法是`Promise.prototype.then(null, rejection)`的别名,用于指定发生错误时的回调函数。 ```javascript @@ -141,6 +141,8 @@ getJSON("/posts.json").then(function(posts) { ``` +上面代码中,getJSON方法返回一个Promise对象,如果该对象运行正常,则会调用then方法指定的回调函数;如果该方法抛出错误,则会调用catch方法指定的回调函数,处理这个错误。 + Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。 ```javascript @@ -150,12 +152,102 @@ getJSON("/post/1.json").then(function(post) { }).then(function(comments) { // some code }).catch(function(error) { - // 处理前两个回调函数的错误 + // 处理前面三个Promise产生的错误 +}); + +``` + +上面代码中,一共有三个Promise对象:一个由getJSON产生,两个由then产生。它们之中任何一个抛出的错误,都会被最后一个catch捕获。 + +跟传统的try/catch代码块不同的是,如果没有使用catch方法指定错误处理的回调函数,Promise对象抛出的错误不会传递到外层代码,即不会有任何反应。 + +```javascript + +var someAsyncThing = function() { + return new Promise(function(resolve, reject) { + // 下面一行会报错,因为x没有声明 + resolve(x + 2); + }); +}; + +someAsyncThing().then(function() { + console.log('everything is great'); +}); + +``` + +上面代码中,someAsyncThing函数产生的Promise对象会报错,但是由于没有调用catch方法,这个错误不会被捕获,也不会传递到外层代码,导致运行后没有任何输出。 + +需要注意的是,catch方法返回的还是一个Promise对象,因此后面还可以接着调用then方法。 + +```javascript + +var someAsyncThing = function() { + return new Promise(function(resolve, reject) { + // 下面一行会报错,因为x没有声明 + resolve(x + 2); + }); +}; + +someAsyncThing().then(function() { + return someOtherAsyncThing(); +}).catch(function(error) { + console.log('oh no', error); +}).then(function() { + console.log('carry on'); }); +// oh no [ReferenceError: x is not defined] +// carry on ``` -## Promise.all方法,Promise.race方法 +上面代码运行完catch方法指定的回调函数,会接着运行后面那个then方法指定的回调函数。 + +catch方法之中,还能再抛出错误。 + +```javascript + +var someAsyncThing = function() { + return new Promise(function(resolve, reject) { + // 下面一行会报错,因为x没有声明 + resolve(x + 2); + }); +}; + +someAsyncThing().then(function() { + return someOtherAsyncThing(); +}).catch(function(error) { + console.log('oh no', error); + // 下面一行会报错,因为y没有声明 + y + 2; +}).then(function() { + console.log('carry on'); +}); +// oh no [ReferenceError: x is not defined] + +``` + +上面代码中,catch方法抛出一个错误,因为后面没有别的catch方法了,导致这个错误不会被捕获,也不会到传递到外层。如果改写一下,结果就不一样了。 + +```javascript + +someAsyncThing().then(function() { + return someOtherAsyncThing(); +}).catch(function(error) { + console.log('oh no', error); + // 下面一行会报错,因为y没有声明 + y + 2; +}).catch(function(error) { + console.log('carry on', error); +}); +// oh no [ReferenceError: x is not defined] +// carry on [ReferenceError: y is not defined] + +``` + +上面代码中,第二个catch方法用来捕获,前一个catch方法抛出的错误。 + +## Promise.all(),Promise.race() Promise.all方法用于将多个Promise实例,包装成一个新的Promise实例。 @@ -202,7 +294,7 @@ var p = Promise.race([p1,p2,p3]); 如果Promise.all方法和Promise.race方法的参数,不是Promise实例,就会先调用下面讲到的Promise.resolve方法,将参数转为Promise实例,再进一步处理。 -## Promise.resolve方法,Promise.reject方法 +## Promise.resolve(),Promise.reject() 有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用。 diff --git a/docs/reference.md b/docs/reference.md index 6ff6dc055..176562289 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -78,6 +78,7 @@ - Sandeep Panda, [An Overview of JavaScript Promises](http://www.sitepoint.com/overview-javascript-promises/): ES6 Promise入门介绍 - Jafar Husain, [Async Generators](https://docs.google.com/file/d/0B4PVbLpUIdzoMDR5dWstRllXblU/view?sle=true): 对async与Generator混合使用的一些讨论 - Axel Rauschmayer, [ECMAScript 6 promises (2/2): the API](http://www.2ality.com/2014/10/es6-promises-api.html): 对ES6 Promise规格和用法的详细介绍 +- Jack Franklin, [Embracing Promises in JavaScript](http://javascriptplayground.com/blog/2015/02/promises/): catch方法的例子 ## Class与模块 From 9344196b46bfdd0b26c69ffcf6ec740ddeda283c Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 10 Feb 2015 16:36:29 +0800 Subject: [PATCH 0069/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9iterator/Symbol.ite?= =?UTF-8?q?rator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/iterator.md | 8 ++++++++ docs/string.md | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/iterator.md b/docs/iterator.md index ebe3589f5..db07920bf 100644 --- a/docs/iterator.md +++ b/docs/iterator.md @@ -155,6 +155,14 @@ let obj = { ``` +对于类似数组的对象,部署Iterator接口,有一个简便方法,就是`Symbol.iterator`方法直接引用数值的Iterator接口。 + +```javascript + +NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator]; + +``` + 如果`Symbol.iterator`方法返回的不是遍历器,解释引擎将会报错。 ```javascript diff --git a/docs/string.md b/docs/string.md index 40d7f0a79..4d878b7d7 100644 --- a/docs/string.md +++ b/docs/string.md @@ -256,8 +256,8 @@ normalize方法可以接受四个参数。 ```javascript -'\u004F\u030C'.normalize(NFC).length // 1 -'\u004F\u030C'.normalize(NFD).length // 2 +'\u004F\u030C'.normalize('NFC').length // 1 +'\u004F\u030C'.normalize('NFD').length // 2 ``` From dce22909c47e7af21cbe59ec1d0fb5384e8ec38a Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Fri, 13 Feb 2015 12:27:50 +0800 Subject: [PATCH 0070/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9class/introduction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 83 +++++++++++++++++++++++++++++++++++++++++++---- docs/reference.md | 1 + 2 files changed, 78 insertions(+), 6 deletions(-) diff --git a/docs/class.md b/docs/class.md index 32a0af008..06eb934b1 100644 --- a/docs/class.md +++ b/docs/class.md @@ -17,7 +17,7 @@ Point.prototype.toString = function () { ``` -ES6引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。上面的代码用“类”改写,就是下面这样。 +ES6引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,class可以看作只是一个语法糖,没有引进任何ES5做不到的新功能,只是让对象原型的写法更加清晰而已。上面的代码用“类”改写,就是下面这样。 ```javascript @@ -35,14 +35,59 @@ class Point { } +``` + +上面代码定义了一个“类”,可以看到里面有一个constructor函数,这就是构造函数,而this关键字则代表实例对象。这个类除了构造方法,还定义了一个toString方法。注意,定义方法的时候,前面不需要加上function这个保留字,直接把函数定义放进去了就可以了。 + +生成实例对象的写法,与ES5完全一样,也是使用new命令。 + +```javascript + var point = new Point(2,3); + point.toString() // (2, 3) +point.hasOwnProperty('x') // true +point.hasOwnProperty('y') // true +point.hasOwnProperty('toString') // false +point.__proto__.hasOwnProperty('toString') // false + ``` -上面代码定义了一个“类”,可以看到里面有一个constructor函数,这就是构造函数,而this关键字则代表实例对象。这个类除了构造方法,还定义了一个toString方法。注意,定义方法的时候,前面不需要加上function这个保留字,直接把函数定义放进去了就可以了。 +上面代码中,x和y都是point自身的属性,所以hasOwnProperty方法返回true,而toString是原型对象的属性,所以hasOwnProperty方法返回false。这些都与ES5的行为保持一致。 + +```javascript + +var p1 = new Point(2,3); +var p2 = new Point(3,2); + +p1.__proto__ === p2.__proto__ +//true + +``` + +上面代码中,p1和p2都是Point的实例,它们的原型都是Point,所以\__proto__属性是相等的。 + +这也意味着,可以通过\__proto__属性为Class添加方法。 + +```javascript + +var p1 = new Point(2,3); +var p2 = new Point(3,2); -Class之间可以通过extends关键字,实现继承。 +p1.__proto__.printName = function () { return 'Oops' }; + +p1.printName() // "Oops" +p2.printName() // "Oops" + +var p3 = new Point(4,2); +p3.printName() // "Oops" + +``` + +上面代码在p1的原型上添加了一个printName方法,由于p1的原型就是p2的原型,因此p2也可以调用这个方法。而且,新建的实例p3也可以调用这个方法。这意味着,使用实例的\__proto__属性改写原型,必须相当谨慎,不推荐使用,因为这会不可逆转地改变Class。 + +Class之间可以通过extends关键字,实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。 ```javascript @@ -57,12 +102,12 @@ class ColorPoint extends Point {} class ColorPoint extends Point { constructor(x, y, color) { - super(x, y); // 等同于super.constructor(x, y) + super(x, y); // 等同于parent.constructor(x, y) this.color = color; } toString() { - return this.color+' '+super(); + return this.color+' '+super(); // 等同于parent.toString() } } @@ -71,7 +116,33 @@ class ColorPoint extends Point { 上面代码中,constructor方法和toString方法之中,都出现了super关键字,它指代父类的同名方法。在constructor方法内,super指代父类的constructor方法;在toString方法内,super指代父类的toString方法。 -有一个地方,需要注意。类和模块的内部,默认就是严格模式,所以不需要使用`use strict`指定运行模式。考虑到未来所有的代码,其实都是运行在模块之中,所以ES6实际上把整个语言升级到了严格模式。 +父类和子类的\__proto__属性,指向是不一样的。 + +```javascript + +var p1 = new Point(2,3); +var p2 = new ColorPoint(2,3,red); + +p2.__proto__ === p1.__proto // false +p2.__proto__.__proto__ === p1.__proto__ // true + +``` + +通过子类的\__proto__属性,可以修改父类。 + +```javascript + +p2.__proto__.__proto__.printName = function () { + console.log('Ha'); +}; + +p1.printName() // Ha + +``` + +上面代码在ColorPoint的实例p2上向Point类添加方法,结果影响到了Point的实例p1。 + +有一个地方需要注意,类和模块的内部,默认就是严格模式,所以不需要使用`use strict`指定运行模式。考虑到未来所有的代码,其实都是运行在模块之中,所以ES6实际上把整个语言升级到了严格模式。 ## Module的基本用法 diff --git a/docs/reference.md b/docs/reference.md index 176562289..d23dc9076 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -82,6 +82,7 @@ ## Class与模块 +- Sebastian Porto, [ES6 classes and JavaScript prototypes](https://reinteractive.net/posts/235-es6-classes-and-javascript-prototypes): ES6 Class的写法与ES5 Prototype的写法对比 - Jack Franklin, [An introduction to ES6 classes](http://javascriptplayground.com/blog/2014/07/introduction-to-es6-classes-tutorial/): ES6 class的入门介绍 - Jack Franklin, [JavaScript Modules the ES6 Way](http://24ways.org/2014/javascript-modules-the-es6-way/): ES6模块入门 - Axel Rauschmayer, [ECMAScript 6 modules: the final syntax](http://www.2ality.com/2014/09/es6-modules-final.html): ES6模块的介绍,以及与CommonJS规格的详细比较 From f6b5bf640bccfa2ebcb1a7d2a1f17d2ef2008a30 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 15 Feb 2015 08:24:27 +0800 Subject: [PATCH 0071/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/generator.md b/docs/generator.md index 5e493c74c..b8491b181 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -52,7 +52,7 @@ hw.next() 总结一下,Generator函数使用iterator接口,每次调用next方法的返回值,就是一个标准的iterator返回值:有着value和done两个属性的对象。其中,value是yield语句后面那个表达式的值,done是一个布尔值,表示是否遍历结束。 -由于Generator函数本身就能生成遍历器,所以它的Symbol.iterator属性指向自身。 +上一章说过,任意一个对象的Symbol.iterator属性,等于该对象的遍历器函数,即调用该函数会返回该对象的一个遍历器。由于Generator函数调用后返回自身的遍历器,所以Generator函数就是自身的遍历器函数,即它的Symbol.iterator属性指向自身。 ```javascript From 0d3a7ea26a796ccb1d6254128750487f8cfb207a Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 15 Feb 2015 19:13:15 +0800 Subject: [PATCH 0072/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9object/Symbol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/object.md | 263 ++++++++++++++++++++++++++++++++-------------- docs/reference.md | 3 +- 2 files changed, 186 insertions(+), 80 deletions(-) diff --git a/docs/object.md b/docs/object.md index 44ae792e3..f267bb0ba 100644 --- a/docs/object.md +++ b/docs/object.md @@ -349,18 +349,24 @@ Object.getPrototypeOf(obj) ## Symbol -ES6引入了一种新的原始数据类型Symbol,表示独一无二的ID。它通过Symbol函数生成。 +### 概述 + +在ES5中,对象的属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法,新方法的名字有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6引入Symbol的原因。 + +ES6引入了一种新的原始数据类型Symbol,表示独一无二的ID。它通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。 ```javascript -let symbol1 = Symbol(); +let s = Symbol(); -typeof symbol +typeof s // "symbol" ``` -上面代码中,变量symbol1就是一个独一无二的ID。typeof运算符的结果,表明变量symbol1是Symbol数据类型,而不是字符串之类的其他类型。 +上面代码中,变量s就是一个独一无二的ID。typeof运算符的结果,表明变量s是Symbol数据类型,而不是字符串之类的其他类型。 + +注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。 Symbol函数可以接受一个字符串作为参数,表示Symbol实例的名称。 @@ -373,9 +379,27 @@ mySymbol.name ``` -上面代码表示,Symbol函数的字符串参数,用来指定生成的Symbol的名称,可以通过name属性读取。之所以要新增name属性,是因为键名是Symbol类型,而有些场合需要一个字符串类型的值来指代这个键。 +上面代码表示,Symbol函数的字符串参数,用来指定生成的Symbol的名称,可以通过name属性读取。之所以要新增name属性,是因为如果一个对象的属性名是Symbol类型,可能不太方便引用,而有些场合需要一个字符串类型的值来指代这个键。 -注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。 +Symbol函数的参数只是表示对当前Symbol类型的值的描述,因此相同参数的Symbol函数的返回值是不相等的。 + +```javascript + +// 没有参数的情况 +var s1 = Symbol(); +var s2 = Symbol(); + +s1 === s2 // false + +// 有参数的情况 +var s1 = Symbol("foo"); +var s2 = Symbol("foo"); + +s1 === s2 // false + +``` + +上面代码中,s1和s2都是Symbol函数的返回值,而且参数相同,但是它们是不相等的。 Symbol类型的值不能与其他类型的值进行运算,会报错。 @@ -399,34 +423,9 @@ sym.toString() ``` -symbol的最大特点,就是每一个Symbol都是不相等的,保证产生一个独一无二的值。 - -```javascript - -let w1 = Symbol(); -let w2 = Symbol(); -let w3 = Symbol(); - -w1 === w2 // false -w1 === w3 // false -w2 === w3 // false - -function f(w) { - switch (w) { - case w1: - ... - case w2: - ... - case w3: - ... - } -} - -``` - -上面代码中,w1、w2、w3三个变量都等于`Symbol()`,但是它们的值是不相等的。 +### 作为属性名的Symbol -由于这种特点,Symbol类型适合作为标识符,用于对象的属性名,保证了属性名之间不会发生冲突。如果一个对象由多个模块构成,这样就不会出现同名的属性,也就防止了键值被不小心改写或覆盖。Symbol类型还可以用于定义一组常量,防止它们的值发生冲突。 +Symbol类型作为标识符,用于对象的属性名时,保证了属性名之间不会发生冲突。如果一个对象由多个模块构成,这样就不会出现同名的属性,也就防止了键值被不小心改写或覆盖。Symbol类型还可以用于定义一组常量,防止它们的值发生冲突。 ```javascript @@ -445,11 +444,36 @@ var a = { var a = {}; Object.defineProperty(a, mySymbol, { value: 'Hello!' }); +// 以上写法都得到同样结果 a[mySymbol] // "Hello!" ``` -上面代码通过方括号结构和Object.defineProperty两种方法,将对象的属性名指定为一个Symbol值。 +上面代码通过方括号结构和Object.defineProperty,将对象的属性名指定为一个Symbol值。 + +在对象内部使用Symbol属性名,必须采用属性名表达式,就像上面的第二种写法。 + +```javascript + +let s = Symbol(); + +let obj = { + [s]: function (arg) { ... } +}; + +obj[s](123); + +``` + +采用增强的对象写法,上面代码的obj对象可以写得更简洁一些。 + +```javascript + +let obj = { + [s](arg) { ... } +}; + +``` 注意,不能使用点结构,将Symbol值作为对象的属性名。 @@ -466,50 +490,63 @@ a[mySymbol] // undefined 上面代码中,mySymbol属性的值为未定义,原因在于`a.mySymbol`这样的写法,并不是把一个Symbol值当作属性名,而是把mySymbol这个字符串当作属性名进行赋值,这是因为点结构中的属性名永远都是字符串。 -下面的写法为Map结构添加了一个成员,但是该成员永远无法被引用。 +需要注意的是,Symbol类型作为属性名时,该属性还是公开属性,不是私有属性。 + +### Symbol.for(),Symbol.keyFor() + +Symbol.for方法在全局环境中搜索指定key的Symbol值,如果存在就返回这个Symbol值,否则就新建一个指定key的Symbol值并返回。 + +`Symbol.for()`与`Symbol()`这两种写法的区别是,前者会被登记在全局环境中供搜索,后者不会。`Symbol.for()`不会每次调用就返回一个新的Symbol类型的值,而是会先检查跟定的key是否已经存在,如果不存在才会新建一个值。 ```javascript -let a = Map(); -a.set(Symbol(), 'Noise'); -a.size // 1 +Symbol.for("bar") === Symbol.for("bar") +// true + +Symbol("bar") === Symbol("bar") +// false ``` -为Symbol函数添加一个参数,就可以引用了。 +上面代码中,由于`Symbol()`写法没有登记机制,所以每次调用都会返回一个不同的值。 + +Symbol.keyFor方法返回一个已登记的Symbol类型值的key。 ```javascript -let a = Map(); -a.set(Symbol('my_key'), 'Noise'); +var s1 = Symbol.for("foo"); +Symbol.keyFor(s1) // "foo" + +var s2 = Symbol("foo"); +Symbol.keyFor(s2) // undefined ``` -如果要在对象内部使用Symbol属性名,必须采用属性名表达式。 +上面代码中,变量s2属于未登记的Symbol值,所以返回undefined。 -```javascript +### 属性名的遍历 -let specialMethod = Symbol(); +Symbol作为属性名,该属性不会出现在for...in循环中,也不会被Object.keys()、Object.getOwnPropertyNames()返回,但是有一个对应的Object.getOwnPropertySymbols方法,以及Object.getOwnPropertyKeys方法都可以获取指定对象的所有Symbol属性名。 -let obj = { - [specialMethod]: function (arg) { ... } -}; +Object.getOwnPropertySymbols方法返回一个数组,成员是当前对象的所有用作属性名的Symbol值。 -obj[specialMethod](123); +```javascript -``` +var obj = {}; +var a = Symbol('a'); +var b = Symbol.for('b'); -采用增强的对象写法,上面代码的obj对象可以写得更简洁一些。 +obj[a] = 'Hello'; +obj[b] = 'World'; -```javascript +var objectSymbols = Object.getOwnPropertySymbols(obj); -let obj = { - [specialMethod](arg) { ... } -}; +objectSymbols +// [Symbol(a), Symbol(b)] ``` -Symbol类型作为属性名,不会出现在for...in循环中,也不会被Object.keys()、Object.getOwnPropertyNames()返回,但是有一个对应的Object.getOwnPropertySymbols方法,以及Object.getOwnPropertyKeys方法都可以获取Symbol属性名。 +下面是另一个例子,Object.getOwnPropertySymbols方法与for...in循环、Object.getOwnPropertyNames方法进行对比的例子。 ```javascript @@ -518,9 +555,13 @@ var obj = {}; var foo = Symbol("foo"); Object.defineProperty(obj, foo, { - value: "foobar", + value: "foobar", }); +for (var i in obj) { + console.log(i); // 无输出 +} + Object.getOwnPropertyNames(obj) // [] @@ -531,7 +572,7 @@ Object.getOwnPropertySymbols(obj) 上面代码中,使用Object.getOwnPropertyNames方法得不到Symbol属性名,需要使用Object.getOwnPropertySymbols方法。 -Reflect.ownKeys方法返回所有类型的键名。 +Reflect.ownKeys方法可以返回所有类型的键名。 ```javascript @@ -546,8 +587,42 @@ Reflect.ownKeys(obj) ``` +### 内置的Symbol值 + +除了定义自己使用的Symbol值以外,ES6还提供一些内置的Symbol值,指向语言内部使用的方法。 + +(1)Symbol.hasInstance + +该值指向对象的内部方法@@hasInstance(两个@表示这是内部方法,外部无法直接调用,下同),该对象使用instanceof运算符时,会调用这个方法,判断该对象是否为某个构造函数的实例。 + +(2)Symbol.isConcatSpreadable + +该值指向对象的内部方法@@isConcatSpreadable,该对象使用Array.prototype.concat()时,会调用这个方法,返回一个布尔值,表示该对象是否可以扩展成数组。 + +(3)Symbol.isRegExp + +该值指向对象的内部方法@@isRegExp,该对象被用作正则表达式时,会调用这个方法,返回一个布尔值,表示该对象是否为一个正则对象。 + +(4)Symbol.iterator + +该值指向对象的内部方法@@iterator,该对象进行for...of循环时,会调用这个方法,返回该对象的默认遍历器,详细介绍参见《Iterator和for...of循环》一章。 + +(5)Symbol.toPrimitive + +该值指向对象的内部方法@@toPrimitive,该对象被转为原始类型的值时,会调用这个方法,返回该对象对应的原始类型值。 + +(6)Symbol.toStringTag + +该值指向对象的内部属性@@toStringTag,在该对象上调用Object.prototype.toString()时,会返回这个属性,它是一个字符串,表示该对象的字符串形式。 + +(7)Symbol.unscopables + +该值指向对象的内部属性@@unscopables,返回一个数组,成员为该对象使用with关键字时,会被with环境排除在的那些属性值。 + ## Proxy +### 概述 + Proxy用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。 Proxy可以理解成在目标对象之前,架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。proxy这个词的原意是代理,用在这里表示由它来“代理”某些操作。 @@ -592,7 +667,29 @@ obj.time // 35 对于没有设置拦截的操作,则直接落在目标对象上,按照原先的方式产生结果。 -下面是另一个拦截读取操作的例子。 +Proxy支持的拦截操作一览。 + +- defineProperty(target, propKey, propDesc):返回一个布尔值,拦截Object.defineProperty(proxy, propKey, propDesc) +- deleteProperty(target, propKey) :返回一个布尔值,拦截delete proxy[propKey] +- enumerate(target):返回一个遍历器,拦截for (x in proxy) +- get(target, propKey, receiver):返回类型不限,拦截对象属性的读取 +- getOwnPropertyDescriptor(target, propKey) :返回属性的描述对象,拦截Object.getOwnPropertyDescriptor(proxy, propKey) +- getPrototypeOf(target) :返回一个对象,拦截Object.getPrototypeOf(proxy) +- has(target, propKey):返回一个布尔值,拦截propKey in proxy +- isExtensible(target):返回一个布尔值,拦截Object.isExtensible(proxy) +- ownKeys(target):返回一个数组,拦截Object.getOwnPropertyPropertyNames(proxy)、Object.getOwnPropertyPropertySymbols(proxy)、Object.keys(proxy) +- preventExtensions(target):返回一个布尔值,拦截Object.preventExtensions(proxy) +- set(target, propKey, value, receiver):返回一个布尔值,拦截对象属性的设置 +- setPrototypeOf(target, proto):返回一个布尔值,拦截Object.setPrototypeOf(proxy, proto) + +如果目标对象是函数,那么还有两种额外操作可以拦截。 + +- apply方法:拦截Proxy实例作为函数调用的操作,比如proxy(···)、proxy.call(···)、proxy.apply(···)。 +- construct方法:拦截Proxy实例作为构造函数调用的操作,比如new proxy(···)。 + +### get + +get方法用于拦截某个属性的读取操作。上文已经有一个例子,下面是另一个拦截读取操作的例子。 ```javascript @@ -650,7 +747,9 @@ pipe(3) . double . pow . reverseInt . get 上面代码设置Proxy以后,达到了将函数名链式使用的效果。 -除了取值函数get,Proxy还可以设置存值函数set,用来拦截某个属性的赋值行为。假定Person对象有一个age属性,该属性应该是一个不大于200的整数,那么可以使用Proxy对象保证age的属性值符合要求。 +### set + +set方法用来拦截某个属性的赋值操作。假定Person对象有一个age属性,该属性应该是一个不大于200的整数,那么可以使用Proxy对象保证age的属性值符合要求。 ```javascript @@ -682,6 +781,30 @@ person.age = 300 // 报错 上面代码中,由于设置了存值函数set,任何不符合要求的age属性赋值,都会抛出一个错误。利用set方法,还可以数据绑定,即每当对象发生变化时,会自动更新DOM。 +### apply + +apply方法拦截函数的调用、call和apply操作。 + +```javascript + +var target = function () { return 'I am the target'; }; +var handler = { + apply: function (receiver, ...args) { + return 'I am the proxy'; + } +}; + +var p = new Proxy(target, handler); + +p() === 'I am the proxy'; +// true + +``` + +上面代码中,变量p是Proxy的实例,当它作为函数调用时(p()),就会被apply方法拦截,返回一个字符串。 + +### ownKeys + ownKeys方法用来拦截Object.keys()操作。 ```javascript @@ -703,25 +826,7 @@ Object.keys(proxy) 上面代码拦截了对于target对象的Object.keys()操作,返回预先设定的数组。 -Proxy支持的拦截操作一览。 - -- defineProperty(target, propKey, propDesc):返回一个布尔值,拦截Object.defineProperty(proxy, propKey, propDesc) -- deleteProperty(target, propKey) :返回一个布尔值,拦截delete proxy[propKey] -- enumerate(target):返回一个遍历器,拦截for (x in proxy) -- get(target, propKey, receiver):返回类型不限,拦截对象属性的读取 -- getOwnPropertyDescriptor(target, propKey) :返回属性的描述对象,拦截Object.getOwnPropertyDescriptor(proxy, propKey) -- getPrototypeOf(target) :返回一个对象,拦截Object.getPrototypeOf(proxy) -- has(target, propKey):返回一个布尔值,拦截propKey in proxy -- isExtensible(target):返回一个布尔值,拦截Object.isExtensible(proxy) -- ownKeys(target):返回一个数组,拦截Object.getOwnPropertyPropertyNames(proxy)、Object.getOwnPropertyPropertySymbols(proxy)、Object.keys(proxy) -- preventExtensions(target):返回一个布尔值,拦截Object.preventExtensions(proxy) -- set(target, propKey, value, receiver):返回一个布尔值,拦截对象属性的设置 -- setPrototypeOf(target, proto):返回一个布尔值,拦截Object.setPrototypeOf(proxy, proto) - -如果目标对象是函数,那么还有两种额外操作可以拦截。 - -- apply方法:拦截Proxy实例作为函数调用的操作,比如proxy(···)、proxy.call(···)、proxy.apply(···)。 -- construct方法:拦截Proxy实例作为构造函数调用的操作,比如new proxy(···)。 +### Proxy.revocable() Proxy.revocable方法返回一个可取消的Proxy实例。 @@ -731,7 +836,7 @@ let target = {}; let handler = {}; let {proxy, revoke} = Proxy.revocable(target, handler); - + proxy.foo = 123; proxy.foo // 123 diff --git a/docs/reference.md b/docs/reference.md index d23dc9076..2ae84e0d0 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -52,7 +52,8 @@ - Sella Rafaeli, [Native JavaScript Data-Binding](http://www.sellarafaeli.com/blog/native_javascript_data_binding): 如何使用Object.observe方法,实现数据对象与DOM对象的双向绑定 - Axel Rauschmayer, [Symbols in ECMAScript 6](http://www.2ality.com/2014/12/es6-symbols.html): Symbol简介 - Axel Rauschmayer, [Meta programming with ECMAScript 6 proxies](http://www.2ality.com/2014/12/es6-proxies.html): Proxy详解 -- Daniel Zautner, [Meta-programming JavaScript Using Proxies](http://dzautner.com/meta-programming-javascript-using-proxies/):使用Proxy实现元编程 +- Daniel Zautner, [Meta-programming JavaScript Using Proxies](http://dzautner.com/meta-programming-javascript-using-proxies/): 使用Proxy实现元编程 +- MDN, [Symbol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol): Symbol类型的详细介绍 ## Iterator和Generator From 4c9b971e570da41d0918cf2c0931640133fe0313 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 15 Feb 2015 22:02:35 +0800 Subject: [PATCH 0073/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9class/extends?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 17 +++++++++++++++++ docs/reference.md | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/class.md b/docs/class.md index 06eb934b1..f8585835f 100644 --- a/docs/class.md +++ b/docs/class.md @@ -142,6 +142,23 @@ p1.printName() // Ha 上面代码在ColorPoint的实例p2上向Point类添加方法,结果影响到了Point的实例p1。 +下面是一个继承原生的Array构造函数的例子。 + +```javascript + +class MyArray extends Array { + constructor(...args) { + super(...args); + } +} + +var arr = new MyArray(); +arr[1] = 12; + +``` + +上面代码定义了一个MyArray的类,继承了Array构造函数。因此,就可以从MyArray生成数组的实例。 + 有一个地方需要注意,类和模块的内部,默认就是严格模式,所以不需要使用`use strict`指定运行模式。考虑到未来所有的代码,其实都是运行在模块之中,所以ES6实际上把整个语言升级到了严格模式。 ## Module的基本用法 diff --git a/docs/reference.md b/docs/reference.md index 2ae84e0d0..9cd6fc315 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -16,7 +16,7 @@ - Nicholas C. Zakas, [Understanding ECMAScript 6](https://github.com/nzakas/understandinges6) - Justin Drake, [ECMAScript 6 in Node.JS](https://github.com/JustinDrake/node-es6-examples) - Ryan Dao, [Summary of ECMAScript 6 major features](http://ryandao.net/portal/content/summary-ecmascript-6-major-features) -- Luke Hoban, [ES6 features](https://github.com/lukehoban/es6features) +- Luke Hoban, [ES6 features](https://github.com/lukehoban/es6features): ES6新语法点的罗列 - Traceur-compiler, [Language Features](https://github.com/google/traceur-compiler/wiki/LanguageFeatures): Traceur文档列出的一些ES6例子 - Axel Rauschmayer, [ECMAScript 6: what’s next for JavaScript?](https://speakerdeck.com/rauschma/ecmascript-6-whats-next-for-javascript-august-2014): 关于ES6新增语法的综合介绍,有很多例子 - Toby Ho, [ES6 in io.js](http://davidwalsh.name/es6-io) From 1f7cb6cf7a83b3ad37ef014b72759c7f4d0b9782 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 15 Feb 2015 23:50:29 +0800 Subject: [PATCH 0074/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9weakmap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/set-map.md | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/docs/set-map.md b/docs/set-map.md index 51023e454..5fa928e95 100644 --- a/docs/set-map.md +++ b/docs/set-map.md @@ -644,18 +644,16 @@ var wm = new WeakMap(); var element = document.querySelector(".element"); wm.set(element, "Original"); - -var value = wm.get(element); -console.log(value); // "Original" +wm.get(element) // "Original" element.parentNode.removeChild(element); element = null; - -value = wm.get(element); -console.log(value); // undefined +wm.get(element) // undefined ``` +上面代码中,变量wm是一个WeakMap实例,我们将一个DOM节点element作为键名,然后销毁这个节点,element对应的键就自动消失了,再引用这个键名就返回undefined。 + WeakMap与Map在API上的区别主要是两个,一是没有遍历操作(即没有key()、values()和entries()方法),也没有size属性;二是无法清空,即不支持clear方法。这与WeakMap的键不被计入引用、被垃圾回收机制忽略有关。因此,WeakMap只有四个方法可用:get()、set()、has()、delete()。 ```javascript @@ -670,7 +668,26 @@ wm.forEach ``` -WeakMap的一个用处是部署私有属性。 +前文说过,WeakMap应用的典型场合就是DOM节点作为键名。下面是一个例子。 + +```javascript + +let myElement = document.getElementById('logo'); +let myWeakmap = new WeakMap(); + +myWeakmap.set(myElement, {timesClicked: 0}); + +myElement.addEventListener('click', function() { + let logoData = myWeakmap.get(myElement); + logoData.timesClicked++; + myWeakmap.set(myElement, logoData); +}, false); + +``` + +上面代码中,myElement是一个DOM节点,每当发生click事件,就更新一下状态。我们将这个状态作为键值放在WeakMap里,对应的键名就是myElement。一旦这个DOM节点删除,该状态就会自动消失,不存在内存泄漏风险。 + +WeakMap的另一个用处是部署私有属性。 ```javascript From 4ee9fa07d9aaefa5dbf4e0a70ec9b0594a43737f Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Mon, 16 Feb 2015 17:08:54 +0800 Subject: [PATCH 0075/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9class?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 369 ++++++++++++++++++++++++++++++++++++++++++++-- docs/reference.md | 2 + 2 files changed, 356 insertions(+), 15 deletions(-) diff --git a/docs/class.md b/docs/class.md index f8585835f..5dd9cf410 100644 --- a/docs/class.md +++ b/docs/class.md @@ -2,6 +2,10 @@ ## Class +### 基本语法 + +**(1)概述** + ES5通过构造函数,定义并生成新对象。下面是一个例子。 ```javascript @@ -17,7 +21,7 @@ Point.prototype.toString = function () { ``` -ES6引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,class可以看作只是一个语法糖,没有引进任何ES5做不到的新功能,只是让对象原型的写法更加清晰而已。上面的代码用“类”改写,就是下面这样。 +ES6引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰而已。上面的代码用“类”改写,就是下面这样。 ```javascript @@ -37,13 +41,68 @@ class Point { ``` -上面代码定义了一个“类”,可以看到里面有一个constructor函数,这就是构造函数,而this关键字则代表实例对象。这个类除了构造方法,还定义了一个toString方法。注意,定义方法的时候,前面不需要加上function这个保留字,直接把函数定义放进去了就可以了。 +上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。Point类除了构造方法,还定义了一个toString方法。注意,定义方法的时候,前面不需要加上function这个保留字,直接把函数定义放进去了就可以了。 + +**(2)constructor方法** + +constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,该方法会被默认添加,代码如下。 + +```javascript + +constructor() {} -生成实例对象的写法,与ES5完全一样,也是使用new命令。 +``` + +constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。 ```javascript -var point = new Point(2,3); +class Foo { + constructor() { + return Object.create(null); + } +} + +new Foo() instanceof Foo +// false + +``` + +上面代码中,constructor函数返回一个全新的对象,结果导致实例对象不是Foo类的实例。 + +**(3)实例对象** + +生成实例对象的写法,与ES5完全一样,也是使用new命令。如果忘记加上new,像函数那样调用Class,将会报错。 + +```javascript + +// 报错 +var point = Point(2, 3); + +// 正确 +var point = new Point(2, 3); + +``` + +与ES5一样,实例的属性除非显式定义在其本身(即定义在this对象上),否则都是定义在原型上(即定义在class上)。 + +```javascript + +//定义类 +class Point { + + constructor(x, y) { + this.x = x; + this.y = y; + } + + toString() { + return '('+this.x+', '+this.y+')'; + } + +} + +var point = Point(2, 3); point.toString() // (2, 3) @@ -54,7 +113,7 @@ point.__proto__.hasOwnProperty('toString') // false ``` -上面代码中,x和y都是point自身的属性,所以hasOwnProperty方法返回true,而toString是原型对象的属性,所以hasOwnProperty方法返回false。这些都与ES5的行为保持一致。 +上面代码中,x和y都是实例对象point自身的属性(因为定义在this变量上),所以hasOwnProperty方法返回true,而toString是原型对象的属性(因为定义在Point类上),所以hasOwnProperty方法返回false。这些都与ES5的行为保持一致。 ```javascript @@ -85,7 +144,77 @@ p3.printName() // "Oops" ``` -上面代码在p1的原型上添加了一个printName方法,由于p1的原型就是p2的原型,因此p2也可以调用这个方法。而且,新建的实例p3也可以调用这个方法。这意味着,使用实例的\__proto__属性改写原型,必须相当谨慎,不推荐使用,因为这会不可逆转地改变Class。 +上面代码在p1的原型上添加了一个printName方法,由于p1的原型就是p2的原型,因此p2也可以调用这个方法。而且,此后新建的实例p3也可以调用这个方法。这意味着,使用实例的\__proto\__属性改写原型,必须相当谨慎,不推荐使用,因为这会改变Class的原始定义,影响到所有实例。 + +**(4)name属性** + +由于本质上,ES6的Class只是ES5的构造函数的一层包装,所以函数的许多特性都被Class继承,包括name属性。 + +```javascript + +class Point {} + +Point.name // "Point" + +``` + +name属性总是返回紧跟在class关键字后面的类名。 + +**(5)Class表达式** + +与函数一样,Class也可以使用表达式的形式定义。 + +```javascript + +const MyClass = class Me { + getClassName() { + return Me.name; + } +}; + +``` + +上面代码使用表达式定义了一个类。需要注意的是,这个类的名字是MyClass而不是Me,Me只在Class的内部代码可用,指代当前类。 + +```javascript + +let inst = new MyClass(); +inst.getClassName() // Me +Me.name // ReferenceError: Me is not defined + +``` + +上面代码表示,Me只在Class内部有定义。 + +如果Class内部没用到的话,可以省略Me,也就是可以写成下面的形式。 + +```javascript + +const MyClass = class { /* ... */ }; + +``` + +**(6)不存在变量提升** + +Class不存在变量提升(hoist),这一点与ES5完全不同。 + +```javascript + +new Foo(); // ReferenceError + +class Foo {} + +``` + +上面代码中,Foo类使用在前,定义在后,这样会报错,因为ES6不会把变量声明提升到代码头部。这种规定的原因与下文要提到的继承有关,必须保证子类在父类之后定义。 + +**(7)严格模式** + +类和模块的内部,默认就是严格模式,所以不需要使用`use strict`指定运行模式。考虑到未来所有的代码,其实都是运行在模块之中,所以ES6实际上把整个语言升级到了严格模式。 + +### Class的继承 + +**(1)基本用法** Class之间可以通过extends关键字,实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。 @@ -116,19 +245,121 @@ class ColorPoint extends Point { 上面代码中,constructor方法和toString方法之中,都出现了super关键字,它指代父类的同名方法。在constructor方法内,super指代父类的constructor方法;在toString方法内,super指代父类的toString方法。 -父类和子类的\__proto__属性,指向是不一样的。 +子类必须在constructor方法中调用super方法,否则新建实例时会报错。 ```javascript -var p1 = new Point(2,3); -var p2 = new ColorPoint(2,3,red); +class Point { /* ... */ } + +class ColorPoint extends Foo { + constructor() { + } +} + +let cp = new ColorPoint(); // ReferenceError + +``` + +如果子类没有定义constructor方法,这个方法会被默认添加,代码如下。也就是说,不管有没有显式定义,任何一个子类都有constructor方法。 + +```javascript + +constructor(...args) { + super(...args); +} + +``` + +另一个需要注意的地方是,只有调用super方法之后,才可以使用this关键字,否则会报错。 + +```javascript + +class Point { + constructor(x, y) { + this.x = x; + this.y = y; + } +} + +class ColorPoint extends Point { + constructor(x, y, color) { + this.color = color; // ReferenceError + super(x, y); + this.color = color; // 正确 + } +} + +``` + +上面代码中,子类的constructor方法没有调用super方法之前,就使用this关键字,结果报错,而放在super方法之后就是正确的。 + +下面是生成子类实例的代码。 + +```javascript + +let cp = new ColorPoint(25, 8, 'green'); + +cp instanceof ColorPoint // true +cp instanceof Point // true + +``` + +上面代码中,实例对象cp同时是ColorPoint和Point两个类的实例,这与ES5的行为完全一致。 + +**(2)prototype属性** + +Class作为构造函数的升级,也有自己的prototype属性,其规则与ES5构造函数的prototype属性一致。 + +```javascript + +class A { +} + +A.prototype === Function.prototype +// true + +class B extends A { +} + +B.prototype === C +// true + +class C extends Object { +} + +C.prototype === Object +// true + +``` + +上面代码中,子类的prototype属性都指向父类。如果一个类是基类(即不存在任何继承),那么它的原型指向`Function.prototype`。 + +**(3)Object.getPrototypeOf方法** + +Object.getPrototypeOf方法可以用来从子类上获取父类。 + +```javascript + +Object.getPrototypeOf(ColorPoint) === Point +// true + +``` + +**(4)\__proto\__属性** + +父类和子类的\__proto\__属性,指向是不一样的。 + +```javascript + +var p1 = new Point(2, 3); +var p2 = new ColorPoint(2, 3, 'red'); p2.__proto__ === p1.__proto // false p2.__proto__.__proto__ === p1.__proto__ // true ``` -通过子类的\__proto__属性,可以修改父类。 +通过子类的\__proto\__属性,可以修改父类。 ```javascript @@ -136,12 +367,14 @@ p2.__proto__.__proto__.printName = function () { console.log('Ha'); }; -p1.printName() // Ha +p1.printName() // "Ha" ``` 上面代码在ColorPoint的实例p2上向Point类添加方法,结果影响到了Point的实例p1。 +**(5)构造函数的继承** + 下面是一个继承原生的Array构造函数的例子。 ```javascript @@ -157,13 +390,119 @@ arr[1] = 12; ``` -上面代码定义了一个MyArray的类,继承了Array构造函数。因此,就可以从MyArray生成数组的实例。 +上面代码定义了一个MyArray类,继承了Array构造函数,因此就可以从MyArray生成数组的实例。这意味着,ES6可以自定义原生数据结构(比如Array、String等)的子类,这是ES5无法做到的。 + +上面这个例子也说明,extends关键字不仅可以用来继承类,还可以用来继承构造函数。下面是一个自定义Error子类的例子。 + +```javascript + +class MyError extends Error { +} + +throw new MyError('Something happened!'); + +``` + +### 取值函数getter和存值函数setter + +与ES5一样,在Class内部可以使用get和set关键字,对某个属性设置存值函数和取值函数。 + +```javascript + +class MyClass { + get prop() { + return 'getter'; + } + set prop(value) { + console.log('setter: '+value); + } +} + +let inst = new MyClass(); + +inst.prop = 123; +// setter: 123 + +inst.prop +// 'getter' + +``` + +上面代码中,prop属性有对应的存值函数和取值函数,因此赋值和读取行为都被自定义了。 + +### Generator方法 + +如果某个方法之前加上星号(*),就表示该方法是一个Generator函数。 + +```javascript + +class Foo { + constructor(...args) { + this.args = args; + } + * [Symbol.iterator]() { + for (let arg of this.args) { + yield arg; + } + } +} + +for (let x of new Foo('hello', 'world')) { + console.log(x); +} +// hello +// world + +``` + +上面代码中,Foo类的Symbol.iterator方法前有一个星号,表示该方法是一个Generator函数。Symbol.iterator方法返回一个Foo类的默认遍历器,for...of循环会自动调用这个遍历器。 + +### 静态方法 + +类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。 + +```javascript + +class Foo { + static classMethod() { + return 'hello'; + } +} + +Foo.classMethod() // 'hello' + +var foo = new Foo(); +foo.classMethod() +// TypeError: undefined is not a function + +``` + +上面代码中,Foo类的classMethod方法前有static关键字,表明该方法是一个静态方法,可以直接在Foo类上调用(`Foo.classMethod()`),而不是在Foo类的实例上调用。如果在实例上调用静态方法,会抛出一个错误,表示不存在该方法。 + +父类的静态方法,可以被子类继承。 + +```javascript + +class Foo { + static classMethod() { + return 'hello'; + } +} + +class Bar extends Foo { +} + +Bar.classMethod(); // 'hello' + +``` + +上面代码中,父类Foo有一个静态方法,子类Bar可以调用这个方法。 -有一个地方需要注意,类和模块的内部,默认就是严格模式,所以不需要使用`use strict`指定运行模式。考虑到未来所有的代码,其实都是运行在模块之中,所以ES6实际上把整个语言升级到了严格模式。 +## Module -## Module的基本用法 +ES6的Class只是面向对象编程的语法糖,升级了ES5的对象定义的写法,并没有解决模块化问题。Module功能就是为了解决这个问题而提出的。 -JavaScript没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如Ruby的require、Python的import,甚至就连CSS都有@import,但是JavaScript任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。 +历史上,JavaScript一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如Ruby的require、Python的import,甚至就连CSS都有@import,但是JavaScript任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。 在ES6之前,社区制定了一些模块加载方案,最主要的有CommonJS和AMD两种。前者用于服务器,后者用于浏览器。ES6在语言规格的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。 diff --git a/docs/reference.md b/docs/reference.md index 9cd6fc315..b5b7797ff 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -34,6 +34,7 @@ - Axel Rauschmayer, [ECMAScript 6’s new array methods](http://www.2ality.com/2014/05/es6-array-methods.html): 对ES6新增的数组方法的全面介绍 - Dmitry Soshnikov, [ES6 Notes: Default values of parameters](http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/): 介绍参数的默认值 - Mozilla Developer Network, [WeakSet](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet):介绍WeakSet数据结构 +- Dwayne Charrington, [What Are Weakmaps In ES6?](http://ilikekillnerds.com/2015/02/what-are-weakmaps-in-es6/): WeakMap数据结构介绍 - Axel Rauschmayer, [ECMAScript 6: maps and sets](http://www.2ality.com/2015/01/es6-maps-sets.html): Set和Map结构的详细介绍 - Ragan Wald, [Destructuring and Recursion in ES6](http://raganwald.com/2015/02/02/destructuring.html): rest参数和扩展运算符的详细介绍 @@ -89,6 +90,7 @@ - Axel Rauschmayer, [ECMAScript 6 modules: the final syntax](http://www.2ality.com/2014/09/es6-modules-final.html): ES6模块的介绍,以及与CommonJS规格的详细比较 - Dave Herman, [Static module resolution](http://calculist.org/blog/2012/06/29/static-module-resolution/): ES6模块的静态化设计思想 - Axel Rauschmayer, [ECMAScript 6: new OOP features besides classes](http://www.2ality.com/2014/12/es6-oop.html) +- Axel Rauschmayer, [Classes in ECMAScript 6 (final semantics)](http://www.2ality.com/2015/02/es6-classes-final.html): Class语法的详细介绍和设计思想分析 ## 工具 From caacc57d9f519092d86db9250e756bab30a318f2 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Mon, 16 Feb 2015 18:47:46 +0800 Subject: [PATCH 0076/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9generator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/generator.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/generator.md b/docs/generator.md index b8491b181..b329c11a2 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -754,9 +754,12 @@ function* longRunningTask() { scheduler(longRunningTask()); function scheduler(task) { - setTimeout(function () { - if (!task.next(task.value).done) { - scheduler(task); + setTimeout(function() { + var taskObj = task.next(task.value); + // 如果Generator函数未结束,就继续调用 + if (!taskObj.done) { + task.value = taskObj.value + scheduler(task); } }, 0); } From b88e6b611e194846eaca9f07120f19997ef52af7 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Mon, 16 Feb 2015 22:27:58 +0800 Subject: [PATCH 0077/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9promise/async?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/promise.md | 128 ++++++++++++++++++++++++++++++++++++++++++++-- docs/reference.md | 1 + 2 files changed, 126 insertions(+), 3 deletions(-) diff --git a/docs/promise.md b/docs/promise.md index da19ed131..2bd73e70f 100644 --- a/docs/promise.md +++ b/docs/promise.md @@ -383,9 +383,13 @@ run(g); ## async函数 -async函数是用来取代回调函数的另一种方法。 +### 概述 -只要函数名之前加上async关键字,就表明该函数内部有异步操作。该异步操作应该返回一个Promise对象,前面用await关键字注明。当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。 +async函数与Promise、Generator函数一样,是用来取代回调函数、解决异步操作的另一种方法。它可以写出比Promise和Generator更简洁易读的代码,但是依赖这两者来实现。 + +async函数并不属于ES6,而是被列入了ES7,但是traceur编译器和regenerator转码器已经实现了这个功能。 + +在用法上,只要函数名之前加上async关键字,就表明该函数内部有异步操作。该异步操作应该返回一个Promise对象,前面用await关键字注明。当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。 ```javascript @@ -417,4 +421,122 @@ async function asyncValue(value) { 上面代码中,asyncValue函数前面有async关键字,表明函数体内有异步操作。执行的时候,遇到await语句就会先返回,等到timeout函数执行完毕,再返回value。 -async函数并不属于ES6,而是被列入了ES7,但是traceur编译器已经实现了这个功能。 +### 与Promise、Generator的比较 + +我们通过一个例子,来看Async函数与Promise、Generator函数的区别。 + +假定某个DOM元素上面,部署了一系列的动画,前一个动画结束,才能开始后一个。如果当中有一个动画出错,就不再往下执行,返回上一个成功执行的动画的返回值。 + +首先是Promise的写法。 + +```javascript + +function chainAnimationsPromise(elem, animations) { + + // 变量ret用来保存上一个动画的返回值 + var ret = null; + + // 新建一个空的Promise + var p = Promise.resolve(); + + // 使用then方法,添加所有动画 + for(var anim in animations) { + p = p.then(function(val) { + ret = val; + return anim(elem); + }) + } + + // 返回一个部署了错误捕捉机制的Promise + return p.catch(function(e) { + /* 忽略错误,继续执行 */ + }).then(function() { + return ret; + }); + +} + +``` + +虽然Promise的写法比回调函数的写法大大改进,但是一眼看上去,代码完全都是Promise的API(then、catch等等),操作本身的语义反而不容易看出来。 + +接着是Generator函数的写法。 + +```javascript + +function chainAnimationsGenerator(elem, animations) { + + return spawn(function*() { + var ret = null; + try { + for(var anim of animations) { + ret = yield anim(elem); + } + } catch(e) { + /* 忽略错误,继续执行 */ + } + return ret; + }); + +} + +``` + +上面代码使用Generator函数遍历了每个动画,语义比Promise写法更清晰,用户定义的操作全部都出现在spawn函数的内部。这个写法的问题在于,必须有一个任务运行器,自动执行Generator函数,上面代码的spawn函数就是任务运行器,它返回一个Promise对象,而且必须保证yield语句后面的表达式,必须返回一个Promise。下面是spawn函数的代码。 + +```javascript + +function spawn(genF) { + // 返回一个Promise + return new Promise(function(resolve, reject) { + // 执行Generator函数,返回一个遍历器 + var gen = genF(); + + // 定义一个函数,执行每一个任务 + function step(nextF) { + var next; + try { + next = nextF(); + } catch(e) { + // 如果任务执行出错,Promise状态变为已失败 + reject(e); + return; + } + if(next.done) { + // 所有任务执行完毕,Promise状态变为已完成 + resolve(next.value); + return; + } + // 如果还有下一个任务,就继续调用step方法 + Promise.resolve(next.value).then(function(v) { + step(function() { return gen.next(v); }); + }, function(e) { + step(function() { return gen.throw(e); }); + }); + } + + step(function() { return gen.next(undefined); }); + }); +} + +``` + +最后是Async函数的写法。 + +```javascript + +async function chainAnimationsAsync(elem, animations) { + var ret = null; + try { + for(var anim of animations) { + ret = await anim(elem); + } + } catch(e) { + /* 忽略错误,继续执行 */ + } + return ret; +} + +``` + +可以看到Async函数的实现最简洁,最符合语义,几乎没有语义不相关的代码。它实际上将Generator写法中的任务运行器,改在语言层面提供,因此代码量最少。Generator写法的spawn函数本质是将Generator函数转为Promise对象,Async函数将这个过程在语言内部处理掉了,不暴露给用户。 diff --git a/docs/reference.md b/docs/reference.md index b5b7797ff..165cbf7e6 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -81,6 +81,7 @@ - Jafar Husain, [Async Generators](https://docs.google.com/file/d/0B4PVbLpUIdzoMDR5dWstRllXblU/view?sle=true): 对async与Generator混合使用的一些讨论 - Axel Rauschmayer, [ECMAScript 6 promises (2/2): the API](http://www.2ality.com/2014/10/es6-promises-api.html): 对ES6 Promise规格和用法的详细介绍 - Jack Franklin, [Embracing Promises in JavaScript](http://javascriptplayground.com/blog/2015/02/promises/): catch方法的例子 +- Luke Hoban, [Async Functions for ECMAScript](https://github.com/lukehoban/ecmascript-asyncawait): Async函数的设计思想,与Promise、Gernerator函数的关系 ## Class与模块 From 0f6ed36b02363cd8c8ee82406a5387c6c5630b6e Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 17 Feb 2015 08:00:10 +0800 Subject: [PATCH 0078/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9desctructuring?= =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/destructuring.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/destructuring.md b/docs/destructuring.md index 9066e9388..538835562 100644 --- a/docs/destructuring.md +++ b/docs/destructuring.md @@ -284,7 +284,7 @@ jQuery.ajax = function (url, { **(5)遍历Map结构** -任何部署了Iterator接口的对象,都可以用for...of循环遍历。Map结构原生支持Iterator接口,配合变量的结构赋值,获取键名和键值就非常方便。 +任何部署了Iterator接口的对象,都可以用for...of循环遍历。Map结构原生支持Iterator接口,配合变量的解构赋值,获取键名和键值就非常方便。 ```javascript From 1f3489eab8933e9e57053b19c84cd86f3495611c Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 17 Feb 2015 08:55:52 +0800 Subject: [PATCH 0079/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9promise/catch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/promise.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/docs/promise.md b/docs/promise.md index 2bd73e70f..a0779c482 100644 --- a/docs/promise.md +++ b/docs/promise.md @@ -143,6 +143,37 @@ getJSON("/posts.json").then(function(posts) { 上面代码中,getJSON方法返回一个Promise对象,如果该对象运行正常,则会调用then方法指定的回调函数;如果该方法抛出错误,则会调用catch方法指定的回调函数,处理这个错误。 +下面是一个例子。 + +```javascript + +var promise = new Promise(function(resolve, reject) { + throw new Error('test') +}); +promise.catch(function(error) { console.log(error) }); +// Error: test + +``` + +上面代码中,Promise抛出一个错误,就被catch方法指定的回调函数捕获。 + +如果Promise状态已经变成“已完成”,再抛出错误是无效的。 + +```javascript + +var promise = new Promise(function(resolve, reject) { + resolve("ok"); + throw new Error('test'); +}); +promise + .then(function(value) { console.log(value) }) + .catch(function(error) { console.log(error) }); +// ok + +``` + +上面代码中,Promise在resolve语句后面,再抛出错误,不会被捕获,等于没有抛出。 + Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。 ```javascript @@ -178,6 +209,20 @@ someAsyncThing().then(function() { 上面代码中,someAsyncThing函数产生的Promise对象会报错,但是由于没有调用catch方法,这个错误不会被捕获,也不会传递到外层代码,导致运行后没有任何输出。 +```javascript + +var promise = new Promise(function(resolve, reject) { + resolve("ok"); + setTimeout(function() { throw new Error('test') }, 0) +}); +promise.then(function(value) { console.log(value) }); +// ok +// Uncaught Error: test + +``` + +上面代码中,Promise指定在下一轮“事件循环”再抛出错误,结果由于没有指定catch语句,就冒泡到最外层,成了未捕获的错误。 + 需要注意的是,catch方法返回的还是一个Promise对象,因此后面还可以接着调用then方法。 ```javascript From b5253b24beb85f86c3ee0636adb12c26e4482af9 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 17 Feb 2015 13:40:43 +0800 Subject: [PATCH 0080/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9let?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 12 +++++++ docs/let.md | 88 ++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 81 insertions(+), 19 deletions(-) diff --git a/docs/class.md b/docs/class.md index 5dd9cf410..fb91cb0d1 100644 --- a/docs/class.md +++ b/docs/class.md @@ -208,6 +208,18 @@ class Foo {} 上面代码中,Foo类使用在前,定义在后,这样会报错,因为ES6不会把变量声明提升到代码头部。这种规定的原因与下文要提到的继承有关,必须保证子类在父类之后定义。 +```javascript + +{ + let Foo = class {}; + class Bar extends Foo { + } +} + +``` + +如果存在Class的提升,上面代码将报错,因为let命令也是不提升的。 + **(7)严格模式** 类和模块的内部,默认就是严格模式,所以不需要使用`use strict`指定运行模式。考虑到未来所有的代码,其实都是运行在模块之中,所以ES6实际上把整个语言升级到了严格模式。 diff --git a/docs/let.md b/docs/let.md index 9cd7e0adc..c866143a3 100644 --- a/docs/let.md +++ b/docs/let.md @@ -2,17 +2,19 @@ ## let命令 +### 基本用法 + ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 ```javascript { - let a = 10; - var b = 1; + let a = 10; + var b = 1; } a // ReferenceError: a is not defined. -b //1 +b // 1 ``` @@ -32,18 +34,17 @@ console.log(i) 上面代码的计数器i,只在for循环体内有效。 -下面的代码如果使用var,最后输出的是9。 +下面的代码如果使用var,最后输出的是10。 ```javascript var a = []; for (var i = 0; i < 10; i++) { - var c = i; a[i] = function () { - console.log(c); + console.log(i); }; } -a[6](); // 9 +a[6](); // 10 ``` @@ -52,16 +53,17 @@ a[6](); // 9 ```javascript var a = []; -for (var i = 0; i < 10; i++) { - let c = i; +for (let i = 0; i < 10; i++) { a[i] = function () { - console.log(c); + console.log(i); }; } a[6](); // 6 ``` +### 不存在变量提升 + let不像var那样,会发生“变量提升”现象。 ```javascript @@ -88,6 +90,21 @@ if (1) { 上面代码中,由于块级作用域内typeof运行时,x还没有声明,所以会抛出一个ReferenceError。 +只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。 + +```javascript + +var tmp = 123; + +if (true) { + tmp = 'abc'; // ReferenceError + let tmp; +} + +``` + +上面代码中,存在全局量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。 + 总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。 ```javascript @@ -112,16 +129,14 @@ if (true) { ```javascript -function bar(x=y, y=2) { - return [x, y]; -} - -bar(); // 报错 +// 报错 ``` 上面代码中,调用bar函数之所以报错,是因为参数x默认值等于另一个参数y,而此时y还没有声明,属于”死区“。 +需要注意的是,函数参数的作用域与函数体的作用域是分离的。 + ```javascript let foo = 'outer'; @@ -135,9 +150,11 @@ bar(); ``` -上面代码中,函数bar的参数func,默认是一个匿名函数,返回值为foo。这个匿名函数运行时,foo只在函数体外声明,内层的声明还没执行,因此foo指向函数体外的声明,输出outer。 +上面代码中,函数bar的参数func,默认是一个匿名函数,返回值为变量foo。这个匿名函数运行时,foo只在函数体外声明,内层的声明还没执行,因此foo指向函数体外的声明,输出outer。 + +### 不允许重复声明 -注意,let不允许在相同作用域内,重复声明同一个变量。 +let不允许在相同作用域内,重复声明同一个变量。 ```javascript @@ -250,14 +267,27 @@ const的作用域与let命令相同:只在声明所在的块级作用域内有 ```javascript -if (condition) { - const MAX = 5; +if (true) { + const MAX = 5; } // 常量MAX在此处不可得 ``` +const命令也不存在提升,只能在声明的位置后面使用。 + +```javascript + +if (true) { + console.log(MAX); // ReferenceError + const MAX = 5; +} + +``` + +上面代码在常量MAX声明之前就调用,结果报错。 + const声明的常量,也与let一样不可重复声明。 ```javascript @@ -295,3 +325,23 @@ foo.prop = 123; // 不起作用 ``` 上面代码中,常量foo指向一个冻结的对象,所以添加新属性不起作用。 + +## 全局对象的属性 + +全局对象是最顶层的对象,在浏览器环境指的是window对象,在Node.js指的是global对象。ES5规定,所有全局变量都是全局对象的属性。 + +ES6规定,var命令和function命令声明的全局变量,属于全局对象的属性;let命令、const命令、class命令声明的全局变量,不属于全局对象的属性。 + +```javascript + +var a = 1; +// 如果在node环境,可以写成global.a +// 或者采用通用方法,写成this.a +window.a // 1 + +let b = 1; +window.b // undefined + +``` + +上面代码中,全家变量a由var命令声明,所以它是全局对象的属性;全局变量b由let命令声明,所以它不是全局对象的属性,返回undefined。 From 262518bc91547db7093341b71d76167a614db47e Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Wed, 18 Feb 2015 10:08:52 +0800 Subject: [PATCH 0081/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9let=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=88=A0=E9=99=A4=E7=9A=84=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/intro.md | 6 ++++-- docs/let.md | 6 +++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/intro.md b/docs/intro.md index 9be78ec9a..35e12c171 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -247,8 +247,10 @@ ES7可能包括的功能有: (1)**Object.observe**:用来监听对象(以及数组)的变化。一旦监听对象发生变化,就会触发回调函数。 -(2)**Multi-Threading**:多线程支持。目前,Intel和Mozilla有一个共同的研究项目RiverTrail,致力于让JavaScript多线程运行。预计这个项目的研究成果会被纳入ECMAScript标准。 +(2)**Async函数**:在Promise和Generator函数基础上,提出的异步操作解决方案。 -(3)**Traits**:它将是“类”功能(class)的一个替代。通过它,不同的对象可以分享同样的特性。 +(3)**Multi-Threading**:多线程支持。目前,Intel和Mozilla有一个共同的研究项目RiverTrail,致力于让JavaScript多线程运行。预计这个项目的研究成果会被纳入ECMAScript标准。 + +(4)**Traits**:它将是“类”功能(class)的一个替代。通过它,不同的对象可以分享同样的特性。 其他可能包括的功能还有:更精确的数值计算、改善的内存回收、增强的跨站点安全、类型化的更贴近硬件的低级别操作、国际化支持(Internationalization Support)、更多的数据结构等等。 diff --git a/docs/let.md b/docs/let.md index c866143a3..1cb81176e 100644 --- a/docs/let.md +++ b/docs/let.md @@ -129,7 +129,11 @@ if (true) { ```javascript -// 报错 +function bar(x=y, y=2) { + return [x, y]; +} + +bar(); // 报错 ``` From 0c9997606470cf85a5093454f1e5af78d3c3908e Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Mon, 23 Feb 2015 16:52:08 +0800 Subject: [PATCH 0082/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9function=20&=20clas?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/class.md | 14 ++++++++++++++ docs/function.md | 30 ++++++++++++++++++++++++++---- docs/reference.md | 3 ++- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/docs/class.md b/docs/class.md index fb91cb0d1..239ece035 100644 --- a/docs/class.md +++ b/docs/class.md @@ -694,6 +694,20 @@ customName(); // 'foo' 上面代码的import命令,可以用任意名称指向输出的匿名函数。需要注意的是,这时import命令后面,不使用大括号。 +```javascript + +// 第一组 +import crc32 from 'crc32'; +export default function crc32(){} + +// 第二组 +import { crc32 } from 'crc32'; +export function crc32(){}; + +``` + +上面代码的两组写法,第一组是使用export default时,对应的import语句不需要使用大括号;第二组是不使用export default时,对应的import语句需要使用大括号。 + export default命令用在非匿名函数前,也是可以的。 ```javascript diff --git a/docs/function.md b/docs/function.md index ecf8f7db7..1632c0fd9 100644 --- a/docs/function.md +++ b/docs/function.md @@ -28,13 +28,11 @@ if (typeof y === 'undefined') { y = 'World'; } - // 写法二 if (arguments.length === 1) { y = 'World'; } - ``` ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。 @@ -65,6 +63,30 @@ var p = new Point(); ``` +默认值的写法非常灵活,下面是一个为对象属性设置默认值的例子。 + +```javascript + +fetch(url, { body='', method='GET', headers={} }){ + console.log(method); +} + +``` + +上面代码中,传入函数fetch的第二个参数是一个对象,调用的时候可以为它的三个属性设置默认值。这个例子也说明,不仅函数定义时,可以设置参数默认值,而且函数调用时,也可以设置参数默认值。 + +甚至还可以设置双重默认值。 + +```javascript + +fetch(url, { method='GET' } = {}){ + console.log(method); +} + +``` + +上面代码中,调用函数fetch时,如果不含第二个参数,则默认值为一个空对象;如果包含第二个参数,则它的method属性默认值为GET。 + 定义了默认值的参数,必须是函数的尾部参数,其后不能再有其他无默认值的参数。这是因为有了默认值以后,该参数可以省略,只有位于尾部,才可能判断出到底省略了哪些参数。 ```javascript @@ -111,11 +133,11 @@ foo(undefined, null) ```javascript function throwIfMissing() { - throw new Error('Missing parameter'); + throw new Error('Missing parameter'); } function foo(mustBeProvided = throwIfMissing()) { - return mustBeProvided; + return mustBeProvided; } foo() diff --git a/docs/reference.md b/docs/reference.md index 165cbf7e6..ac069eedb 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -20,7 +20,7 @@ - Traceur-compiler, [Language Features](https://github.com/google/traceur-compiler/wiki/LanguageFeatures): Traceur文档列出的一些ES6例子 - Axel Rauschmayer, [ECMAScript 6: what’s next for JavaScript?](https://speakerdeck.com/rauschma/ecmascript-6-whats-next-for-javascript-august-2014): 关于ES6新增语法的综合介绍,有很多例子 - Toby Ho, [ES6 in io.js](http://davidwalsh.name/es6-io) - +- Guillermo Rauch, [ECMAScript 6](http://rauchg.com/2015/ecmascript-6/) ## 语法点 @@ -104,3 +104,4 @@ - esnext, [ES6 Module Transpiler](https://github.com/esnext/es6-module-transpiler):基于node.js的将ES6模块转为ES5代码的命令行工具 - Sebastian McKenzie, [6to5](https://github.com/sebmck/6to5): 将ES6转为ES5代码的Node模块,支持source map - SystemJS, [SystemJS](https://github.com/systemjs/systemjs): 在浏览器中加载AMD、CJS、ES6模块的一个垫片库 +- Facebook, [regenerator](https://github.com/facebook/regenerator): 将Generator函数转为ES5的转码器 From caa4f9e99372d3b87e34dacc99638ed628ae1a0e Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 26 Feb 2015 01:09:05 +0800 Subject: [PATCH 0083/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9array?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/array.md | 44 +++++++++++++++++++++++++++++++++++++ docs/function.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++- docs/object.md | 18 ++++++++++++++- docs/reference.md | 2 ++ 4 files changed, 118 insertions(+), 2 deletions(-) diff --git a/docs/array.md b/docs/array.md index fcb92a2c0..770bf1dcc 100644 --- a/docs/array.md +++ b/docs/array.md @@ -37,6 +37,16 @@ Array.from({ 0: "a", 1: "b", 2: "c", length: 3 }); ``` +对于还没有部署该方法的浏览器,可以用Array.prototyp.slice方法替代。 + +```javascript + +const toArray = (() => + Array.from ? Array.from : obj => [].slice.call(obj) +)(); + +``` + Array.from()还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理。 ```JavaScript @@ -170,6 +180,40 @@ for (let [index, elem] of ['a', 'b'].entries()) { ``` +## 数组实例的includes() + +Array.protypeto.includes方法返回一个布尔值,表示某个数组是否包含给定的值。该方法属于ES7。 + +```javascript + +[1, 2, 3].includes(2); // true +[1, 2, 3].includes(4); // false +[1, 2, NaN].includes(NaN); // true + +``` + +该方法的第二个参数表示搜索的起始位置,默认为0。 + +```javascript + +[1, 2, 3].includes(3, 3); // false +[1, 2, 3].includes(3, -1); // true + +``` + +下面代码用来检查当前环境是否支持该方法,如果不支持,部署一个简易的替代版本。 + +```javascript + +const contains = (() => + Array.prototype.includes + ? (arr, value) => arr.includes(value) + : (arr, value) => arr.some(el => el === value) +)(); +contains(["foo", "bar"], "baz"); // => false + +``` + ## 数组推导 ES6提供简洁写法,允许直接通过现有数组生成新数组,这被称为数组推导(array comprehension)。 diff --git a/docs/function.md b/docs/function.md index 1632c0fd9..4e97044d6 100644 --- a/docs/function.md +++ b/docs/function.md @@ -203,7 +203,22 @@ add(2, 5, 3) // 10 上面代码的add函数是一个求和函数,利用rest参数,可以向该函数传入任意数目的参数。 -前面说过,rest参数中的变量代表一个数组,所以数组特有的方法都可以用于这个变量。下面是一个利用rest参数改写数组push方法的例子。 +下面是一个rest参数代替arguments变量的例子。 + +```javascript + +// arguments变量的写法 +const sortNumbers = () => + Array.prototype.slice.call(arguments).sort(); + +// rest参数的写法 +const sortNumbers = (...numbers) => numbers.sort(); + +``` + +上面代码的两种写法,比较后可以发现,rest参数的写法更自然也更简洁。 + +rest参数中的变量代表一个数组,所以数组特有的方法都可以用于这个变量。下面是一个利用rest参数改写数组push方法的例子。 ```javascript @@ -510,6 +525,17 @@ var getTempItem = id => ({ id: id, name: "Temp" }); ``` +箭头函数使得表达更加简洁。 + +```javascript + +const isEven = n => n % 2 == 0; +const square = n => n * n; + +``` + +上面代码只用了两行,就定义了两个简单的工具函数。如果不用箭头函数,可能就要占用多行,而且还不如现在这样写醒目。 + 箭头函数的一个用处是简化回调函数。 ```javascript @@ -585,3 +611,31 @@ var handler = { 由于this在箭头函数中被绑定,所以不能用call()、apply()、bind()这些方法去改变this的指向。 长期以来,JavaScript语言的this对象一直是一个令人头痛的问题,在对象方法中使用this,必须非常小心。箭头函数绑定this,很大程度上解决了这个困扰。 + +箭头函数内部,还可以再使用箭头函数。下面是一个部署管道机制(pipeline)的例子。 + +```javascript + +const pipeline = (...funcs) => + val => funcs.reduce((a, b) => b(a), val); + +const plus1 = a => a + 1; +const mult2 = a => a * 2; +const addThenMult = pipeline(plus1, mult2); + +addThenMult(5) +// 12 + +``` + +上面的代码等同于下面的写法。 + +```javascript + +const plus1 = a => a + 1; +const mult2 = a => a * 2; + +mult2(plus1(5)) +// 12 + +``` diff --git a/docs/object.md b/docs/object.md index f267bb0ba..81e89a190 100644 --- a/docs/object.md +++ b/docs/object.md @@ -271,7 +271,23 @@ function clone(origin) { ``` -**(4)为属性指定默认值** +**(4)合并多个对象** + +将多个对象合并到某个对象。 + +```javascript +const merge = + (target, ...sources) => Object.assign(target, ...sources); +``` + +如果希望合并后返回一个新对象,可以改写上面函数,对一个空对象合并。 + +```javascript +const merge = + (...sources) => Object.assign({}, ...sources); +``` + +**(5)为属性指定默认值** ```javascript diff --git a/docs/reference.md b/docs/reference.md index ac069eedb..b0c364c33 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -21,6 +21,8 @@ - Axel Rauschmayer, [ECMAScript 6: what’s next for JavaScript?](https://speakerdeck.com/rauschma/ecmascript-6-whats-next-for-javascript-august-2014): 关于ES6新增语法的综合介绍,有很多例子 - Toby Ho, [ES6 in io.js](http://davidwalsh.name/es6-io) - Guillermo Rauch, [ECMAScript 6](http://rauchg.com/2015/ecmascript-6/) +- Charles King, [The power of ECMAScript 6](http://charlesbking.com/power_of_es6/#/) +- Benjamin De Cock, [Frontend Guidelines](https://github.com/bendc/frontend-guidelines): ES6最佳实践 ## 语法点 From d37c6ff2a4ed1bb89c539ce9e2a92ca05129e7ee Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Fri, 27 Feb 2015 10:30:48 +0800 Subject: [PATCH 0084/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9iterator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/iterator.md | 185 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 137 insertions(+), 48 deletions(-) diff --git a/docs/iterator.md b/docs/iterator.md index db07920bf..6f2ef86bf 100644 --- a/docs/iterator.md +++ b/docs/iterator.md @@ -2,11 +2,15 @@ ## Iterator(遍历器) -### 语法 +### 概念 -遍历器(Iterator)是一种接口规格,任何对象只要部署这个接口,就可以完成遍历操作。它的作用有两个,一是为各种数据结构,提供一个统一的、简便的接口,二是使得对象的属性能够按某种次序排列。在ES6中,遍历操作特指for...of循环,即Iterator接口主要供for...of循环使用。 +JavaScript原有的数据结构,主要是数组(Array)和对象(Object),ES6又添加了Map和Set,用户还可以组合使用它们,定义自己的数据结构。这就需要一种统一的接口机制,来处理所有不同的数据结果。 -遍历器提供了一个指针,指向当前对象的某个属性,使用next方法,就可以将指针移动到下一个属性。next方法返回一个包含value和done两个属性的对象。其中,value属性是当前遍历位置的值,done属性是一个布尔值,表示遍历是否结束。下面是一个模拟next方法返回值的例子。 +遍历器(Iterator)就是这样一种机制。它属于一种接口规格,任何数据结构只要部署这个接口,就可以完成遍历操作,即依次处理该结构的所有成员。它的作用有两个,一是为各种数据结构,提供一个统一的、简便的接口,二是使得数据结构的成员能够按某种次序排列。在ES6中,遍历操作特指for...of循环,即Iterator接口主要供for...of消费。 + +遍历器的遍历过程是这样的:它提供了一个指针,默认指向当前数据结构的起始位置。第一次调用遍历器的next方法,可以将指针指向到第一个成员,第二次调用就指向第二个成员,直至指向数据结构的结束位置。每一次调用,都会返回当前成员的信息,具体来说,就是返回一个包含value和done两个属性的对象。其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。 + +下面是一个模拟next方法返回值的例子。 ```javascript @@ -28,9 +32,10 @@ it.next() // { value: "b", done: false } it.next() // { value: undefined, done: true } ``` -上面代码定义了一个makeIterator函数,它的作用是返回一个遍历器对象,用来遍历参数数组。next方法依次遍历数组的每个成员,请特别注意,next返回值的构造。 -下面是一个无限运行的遍历器例子。 +上面代码定义了一个makeIterator函数,它的参数是一个数组。调用该函数,就会返回一个对象。这个对象具有一个next方法,每次调用next方法,它的内部指针就会指向数组的下一个成员,并返回一个该成员信息的对象。请特别注意,next方法的返回值的构造:一个具有value和done两个属性的对象。通过这个返回值,我们就可以知道当前成员的值是什么,以及遍历是否结束。在这个例子中,makeIterator函数用来生成遍历器,它返回的那个具有next方法的对象就是遍历器,调用遍历器的next方法,就可以遍历事先给定的数组。 + +因为遍历器的作用,只是把接口规格加到数据结构之上。所以,遍历器与它所遍历的那个数据结构,实际上是分开的,完全可以写出没有对应数据结构的遍历器,或者说用遍历器模拟出数据结构。下面是一个无限运行的遍历器例子。 ```javascript @@ -53,15 +58,37 @@ it.next().value // '2' ``` -上面的例子,说明了next方法返回值的结构:value和done两个属性。 +上面的例子中,idMaker函数返回的对象就是遍历器,但是并没有对应的数据结构,或者说遍历器自己描述了一个数据结构出来。 -### Iterator接口的部署 +总之,所谓Iterator接口,就是指调用这个接口,会返回一个遍历器对象。该对象具备next方法,每次调用该方法,会返回一个具有value和done两个属性的新对象,指向部署了Iterator接口的数据结构的一个成员。 -具有Iterator接口的对象,都能被for...of循环遍历(见后文的介绍)。所谓Iterator接口,就是指它会返回一个遍历器对象,该对象具备next方法,每次调用该方法,会依次返回一个具有上节提到的value和done两个属性的新对象,指向原对象的一个成员。 +### 默认的Iterator接口 -在ES6中,有三类数据结构原生具备Iterator接口:数组、类似数组的对象、Set和Map结构。除此之外,其他数据结构(主要是对象)的Iterator接口都需要自己部署。其他对象需要手动部署Iterator接口,让其返回一个遍历器。 +Iterator接口的开发目的,就是为所有数据结构,提供了一种统一的访问机制,即for...of循环(见后文的介绍)。当使用for...of循环,遍历某种数据结构时,该循环会自动去寻找Iterator接口。 -一个对象如果要有Iterator接口,必须部署一个@@iterator方法(原型链上的对象具有该方法也可),该方法部署在一个键名为`Symbol.iterator`的属性上,对应的键值是一个函数,该函数返回一个遍历器对象。 +ES6规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性。也就是说,调用Symbol.iterator方法,就会得到当前数据结构的默认遍历器。Symbol.iterator是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为Symbol的特殊值,所以要放在方括号内(请参考Symbol一节)。 + +在ES6中,有三类数据结构原生具备Iterator接口:数组、类似数组的对象、Set和Map结构。 + +```javascript + +let arr = ['a', 'b', 'c']; +let iter = arr[Symbol.iterator](); + +iter.next() // { value: 'a', done: false } +iter.next() // { value: 'b', done: false } +iter.next() // { value: 'c', done: false } +iter.next() // { value: undefined, done: true } + +``` + +上面代码中,变量arr是一个数组,原生就具有遍历器接口,部署在arr的Symbol.iterator属性上面。所以,调用这个属性,就得到遍历器。 + +上面提到,原生就部署iterator接口的数据结构有三类,对于这三类数据结构,不用自己写遍历器,for...of循环会自动遍历它们。除此之外,其他数据结构(主要是对象)的Iterator接口,都需要自己在Symbol.iterator属性上面部署,这样才会被for...of循环遍历。 + +对象(Object)之所以没有默认部署Iterator接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,就等于部署一种线性转换。不过,严格地说,对象部署遍历器接口并不是很必要,因为这时对象实际上被当作Map结构使用,ES5没有Map结构,而ES6原生提供了。 + +一个对象如果要有可被for...of循环调用的Iterator接口,就必须在Symbol.iterator的属性上部署遍历器方法(原型链上的对象具有该方法也可)。 ```javascript @@ -75,18 +102,16 @@ class MySpecialTree { ``` -上面代码是一个类部署Iterator接口的写法。`Symbol.iterator`是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为Symbol的特殊值,所以要放在方括号内(请参考Symbol一节)。这里要注意,@@iterator的键名是`Symbol.iterator`,键值是一个方法(函数),该方法执行后,返回一个当前对象的遍历器。 - -下面是一个例子。 +上面代码是一个类部署Iterator接口的写法。Symbol.iterator属性对应一个函数,执行后返回当前对象的遍历器。下面是一个例子。 ```javascript -function O(value){ +function Obj(value){ this.value = value; this.next = null; } -O.prototype[Symbol.iterator] = function(){ +Obj.prototype[Symbol.iterator] = function(){ var iterator = { next: next @@ -112,9 +137,9 @@ O.prototype[Symbol.iterator] = function(){ return iterator; } -var one = new O(1); -var two = new O(2); -var three = new O(3); +var one = new Obj(1); +var two = new Obj(2); +var three = new Obj(3); one.next = two; two.next = three; @@ -155,7 +180,7 @@ let obj = { ``` -对于类似数组的对象,部署Iterator接口,有一个简便方法,就是`Symbol.iterator`方法直接引用数值的Iterator接口。 +对于类似数组的对象(存在数值键名和length属性),部署Iterator接口,有一个简便方法,就是`Symbol.iterator`方法直接引用数值的Iterator接口。 ```javascript @@ -163,7 +188,7 @@ NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator]; ``` -如果`Symbol.iterator`方法返回的不是遍历器,解释引擎将会报错。 +如果Symbol.iterator方法返回的不是遍历器,解释引擎将会报错。 ```javascript @@ -175,7 +200,7 @@ obj[Symbol.iterator] = () => 1; ``` -上面代码中,变量obj的@@iterator方法返回的不是遍历器,因此报错。 +上面代码中,变量obj的Symbol.iterator方法返回的不是遍历器,因此报错。 ### 原生具备iterator接口的数据结构 @@ -277,7 +302,11 @@ for (let x of obj) { ## for...of循环 -ES6中,一个对象只要部署了@@iterator方法,就被视为具有iterator接口,就可以用for...of循环遍历它的值。也就是说,for...of循环内部调用是原对象的`Symbol.iterator`方法。 +ES6中,一个数据结构只要部署了Symbol.iterator方法,就被视为具有iterator接口,就可以用for...of循环遍历它的成员。也就是说,for...of循环内部调用的是数据结构的Symbol.iterator方法。 + +for...of循环可以使用的范围包括数组、Set和Map结构、类似数组的对象(比如arguments对象、DOM NodeList对象)、后文的Generator对象,以及字符串。 + +### 数组 数组原生具备iterator接口。 @@ -298,8 +327,8 @@ for(let v of arr) { const arr = ['red', 'green', 'blue']; arr.forEach(function (element, index) { - console.log(element); // red green blue - console.log(index); // 0 1 2 + console.log(element); // red green blue + console.log(index); // 0 1 2 }); ``` @@ -309,6 +338,7 @@ JavaScript原有的for...in循环,只能获得对象的键名,不能直接 ```javascript var arr = ["a", "b", "c", "d"]; + for (a in arr) { console.log(a); // 0 1 2 3 } @@ -321,13 +351,15 @@ for (a of arr) { 上面代码表明,for...in循环读取键名,for...of循环读取键值。如果要通过for...of循环,获取数组的索引,可以借助数组实例的entries方法和keys方法,参见《数组的扩展》章节。 +### Set和Map结构 + Set和Map结构也原生具有Iterator接口,可以直接使用for...of循环。 ```javascript var engines = Set(["Gecko", "Trident", "Webkit", "Webkit"]); for (var e of engines) { - console.log(e); + console.log(e); } // Gecko // Trident @@ -346,52 +378,109 @@ for (var [name, value] of es6) { ``` -上面代码演示了如何遍历Set结构和Map结构,后者是同时遍历键名和键值。 - -对于普通的对象,for...of结构不能直接使用,会报错,必须部署了iterator接口后才能使用。但是,这样情况下,for...in循环依然可以用来遍历键名。 +上面代码演示了如何遍历Set结构和Map结构。值得注意的地方有两个,首先,遍历的顺序是按照各个成员被添加进数据结构的顺序。其次,Set结构遍历时,返回的是一个值,而Map结构遍历时,返回的是一个数组,该数组的两个成员分别为当前Map成员的键名和键值。 ```javascript -var es6 = { - edition: 6, - committee: "TC39", - standard: "ECMA-262" -}; - -for (e in es6) { - console.log(e); +let map = new Map().set('a', 1).set('b', 2); +for (let pair of map) { + console.log(pair); } -// edition -// committee -// standard +// ['a', 1] +// ['b', 2] -for (e of es6) { - console.log(e); +``` + +### 计算生成的数据结构 + +ES6的数组、Set、Map都部署了以下三个方法,调用后都返回遍历器。 + +- entries() 返回一个遍历器,用来遍历 [键名, 键值] 组成的数组。对于数组,键名就是索引值;对于Set,键名与键值相同。Map结构的iterator接口,默认就是调用entries方法。 +- keys() 返回一个遍历器,用来遍历所有的键名。 +- values() 返回一个遍历器,用来遍历所有的键值。 + +这三个方法调用后生成的遍历器,所遍历的都是计算生成的数据结构。 + +```javascript + +let arr = ['a', 'b', 'c']; +for (let pair of arr.entries()) { + console.log(pair); } -// TypeError: es6 is not iterable +// [0, 'a'] +// [1, 'b'] +// [2, 'c'] ``` -上面代码表示,for...in循环可以遍历键名,for...of循环会报错。 +### 类似数组的对象 -总结一下,for...of循环可以使用的范围包括数组、类似数组的对象(比如arguments对象、DOM NodeList对象)、Set和Map结构、后文的Generator对象,以及字符串。下面是for...of循环用于字符串和DOM NodeList对象的例子。 +类似数组的对象包括好几类。下面是for...of循环用于字符串、DOM NodeList对象、arguments对象的例子。 ```javascript -// 字符串的例子 - +// 字符串 let str = "hello"; for (let s of str) { console.log(s); // h e l l o } -// DOM NodeList对象的例子 - +// DOM NodeList对象 let paras = document.querySelectorAll("p"); for (let p of paras) { p.classList.add("test"); } +// arguments对象 +function printArgs() { + for (let x of arguments) { + console.log(x); + } +} +printArgs('a', 'b'); +// 'a' +// 'b' + ``` + +对于字符串来说,for...of循环还有一个特点,就是会正确识别32位UTF-16字符。 + +```javascript + +for (let x of 'a\uD83D\uDC0A') { + console.log(x); +} +// 'a' +// '\uD83D\uDC0A' + +``` + +### 对象 + +对于普通的对象,for...of结构不能直接使用,会报错,必须部署了iterator接口后才能使用。但是,这样情况下,for...in循环依然可以用来遍历键名。 + +```javascript + +var es6 = { + edition: 6, + committee: "TC39", + standard: "ECMA-262" +}; + +for (e in es6) { + console.log(e); +} +// edition +// committee +// standard + +for (e of es6) { + console.log(e); +} +// TypeError: es6 is not iterable + +``` + +上面代码表示,对于普通的对象,for...in循环可以遍历键名,for...of循环会报错。 From f1c2415227aa0c8541a73d74666e7621e74ee191 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Fri, 27 Feb 2015 14:59:18 +0800 Subject: [PATCH 0085/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9iterator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/iterator.md | 112 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 107 insertions(+), 5 deletions(-) diff --git a/docs/iterator.md b/docs/iterator.md index 6f2ef86bf..ff8ccd100 100644 --- a/docs/iterator.md +++ b/docs/iterator.md @@ -62,13 +62,32 @@ it.next().value // '2' 总之,所谓Iterator接口,就是指调用这个接口,会返回一个遍历器对象。该对象具备next方法,每次调用该方法,会返回一个具有value和done两个属性的新对象,指向部署了Iterator接口的数据结构的一个成员。 +如果使用TypeScript的写法,遍历器接口、遍历器和遍历器返回值的规格可以描述如下。 + +```javascript + +interface Iterable { + [System.iterator]() : Iterator, +} + +interface Iterator { + next(value?: any) : IterationResult, +} + +interface IterationResult { + value: any, + done: boolean, +} + +``` + ### 默认的Iterator接口 Iterator接口的开发目的,就是为所有数据结构,提供了一种统一的访问机制,即for...of循环(见后文的介绍)。当使用for...of循环,遍历某种数据结构时,该循环会自动去寻找Iterator接口。 ES6规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性。也就是说,调用Symbol.iterator方法,就会得到当前数据结构的默认遍历器。Symbol.iterator是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为Symbol的特殊值,所以要放在方括号内(请参考Symbol一节)。 -在ES6中,有三类数据结构原生具备Iterator接口:数组、类似数组的对象、Set和Map结构。 +在ES6中,有三类数据结构原生具备Iterator接口:数组、某些类似数组的对象、Set和Map结构。 ```javascript @@ -202,6 +221,62 @@ obj[Symbol.iterator] = () => 1; 上面代码中,变量obj的Symbol.iterator方法返回的不是遍历器,因此报错。 +### 调用默认iterator接口的场合 + +有一些场合会默认调用iterator接口(即Symbol.iterator方法),除了下文会介绍的for...of循环,还有几个别的场合。 + +**(1)解构赋值** + +对数组和Set结构进行解构赋值时,会默认调用iterator接口。 + +```javascript + +let set = new Set().add('a').add('b').add('c'); + +let [x,y] = set; +// x='a'; y='b' + +let [first, ...rest] = set; +// first='a'; rest=['b','c']; + +``` + +**(2)扩展运算符** + +扩展运算符(...)也会调用默认的iterator接口。 + +```javascript + +// 例一 +var str = 'hello'; +[...str] // ['h','e','l','l','o'] + +// 例二 +let arr = ['b', 'c']; +['a', ...arr, 'd'] +// ['a', 'b', 'c', 'd'] + +``` + +上面代码的扩展运算符内部就调用iterator接口。 + +实际上,这提供了一种简便机制,可以将任何部署了iterator接口的对象,转为对象。 + +```javascript + +let arr = [...iterable]; + +``` + +**(3)其他场合** + +以下场合也会用到默认的iterator接口,可以查阅相关章节。 + +- yield* +- Array.from() +- Map(), Set(), WeakMap(), WeakSet() +- Promise.all(), Promise.race() + ### 原生具备iterator接口的数据结构 《数组的扩展》一章中提到,ES6对数组提供entries()、keys()和values()三个方法,就是返回三个遍历器。 @@ -221,7 +296,7 @@ arrEntries === arrEntries[Symbol.iterator]() 上面代码中,entries方法返回的是一个遍历器(iterator),本质上就是调用了`Symbol.iterator`方法。 -字符串是一个类似数组的对象,因此也原生具有Iterator接口。 +字符串是一个类似数组的对象,也原生具有Iterator接口。 ```javascript @@ -304,23 +379,30 @@ for (let x of obj) { ES6中,一个数据结构只要部署了Symbol.iterator方法,就被视为具有iterator接口,就可以用for...of循环遍历它的成员。也就是说,for...of循环内部调用的是数据结构的Symbol.iterator方法。 -for...of循环可以使用的范围包括数组、Set和Map结构、类似数组的对象(比如arguments对象、DOM NodeList对象)、后文的Generator对象,以及字符串。 +for...of循环可以使用的范围包括数组、Set和Map结构、某些类似数组的对象(比如arguments对象、DOM NodeList对象)、后文的Generator对象,以及字符串。 ### 数组 -数组原生具备iterator接口。 +数组原生具备iterator接口,for...of循环本质上就是调用这个接口产生的遍历器,可以用下面的代码证明。 ```javascript const arr = ['red', 'green', 'blue']; +let iterator = arr[Symbol.iterator](); for(let v of arr) { console.log(v); // red green blue } +for(let v of iterator) { + console.log(v); // red green blue +} + ``` -上面代码说明,for...of循环可以代替数组实例的forEach方法。 +上面代码的for...of循环的两种写法是等价的。 + +for...of循环可以代替数组实例的forEach方法。 ```javascript @@ -457,6 +539,24 @@ for (let x of 'a\uD83D\uDC0A') { ``` +并不是所有类似数组的对象都具有iterator接口,一个简便的解决方法,就是使用Array.from方法将其转为数组。 + +```javascript + +let arrayLike = { length: 2, 0: 'a', 1: 'b' }; + +// 报错 +for (let x of arrayLike) { + console.log(x); +} + +// 正确 +for (let x of Array.from(arrayLike)) { + console.log(x); +} + +``` + ### 对象 对于普通的对象,for...of结构不能直接使用,会报错,必须部署了iterator接口后才能使用。但是,这样情况下,for...in循环依然可以用来遍历键名。 @@ -484,3 +584,5 @@ for (e of es6) { ``` 上面代码表示,对于普通的对象,for...in循环可以遍历键名,for...of循环会报错。 + +在对象上部署iterator接口的代码,参见本章前面部分。 From 890861be03a5bbfddc4fea48b952113002b4fb02 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Sun, 1 Mar 2015 13:59:58 +0800 Subject: [PATCH 0086/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9promise/async?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/promise.md | 10 ++++++++-- docs/reference.md | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/promise.md b/docs/promise.md index a0779c482..0e3ca40e2 100644 --- a/docs/promise.md +++ b/docs/promise.md @@ -439,10 +439,16 @@ async函数并不属于ES6,而是被列入了ES7,但是traceur编译器和re ```javascript async function getStockPrice(symbol, currency) { - let price = await getStockPrice(symbol); - return convert(price, currency); + let price = await getStockPrice(symbol); + return convert(price, currency); } +getStockPrice("JNJ") + .then( + price => console.log(price), + error => console.error(error) + ); + ``` 上面代码是一个获取股票报价的函数,函数前面的async关键字,表明该函数将返回一个Promise对象。调用该函数时,当遇到await关键字,立即返回它后面的表达式(getStockPrice函数)产生的Promise对象,不再执行函数体内后面的语句。等到getStockPrice完成,再自动回到函数体内,执行剩下的语句。 diff --git a/docs/reference.md b/docs/reference.md index b0c364c33..78de7afc4 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -67,6 +67,7 @@ - jmar777, [What's the Big Deal with Generators?](http://devsmash.com/blog/whats-the-big-deal-with-generators) - Marc Harter, [Generators in Node.js: Common Misconceptions and Three Good Use Cases](http://strongloop.com/strongblog/how-to-generators-node-js-yield-use-cases/): 讨论Generator函数的作用 - Axel Rauschmayer, [Iterators and generators in ECMAScript 6](http://www.2ality.com/2013/06/iterators-generators.html): 探讨Iterator和Generator的设计目的 +- Axel Rauschmayer, [Iterables and iterators in ECMAScript 6](http://www.2ality.com/2015/02/es6-iteration.html): Iterator的详细介绍 - StackOverflow, [ES6 yield : what happens to the arguments of the first call next()?](http://stackoverflow.com/questions/20977379/es6-yield-what-happens-to-the-arguments-of-the-first-call-next): 第一次使用next方法时不能带有参数 - Kyle Simpson, [ES6 Generators: Complete Series](http://davidwalsh.name/es6-generators): 由浅入深探讨Generator的系列文章,共四篇 - Gajus Kuizinas, [The Definitive Guide to the JavaScript Generators](http://gajus.com/blog/2/the-definetive-guide-to-the-javascript-generators): 对Generator的综合介绍 @@ -84,6 +85,7 @@ - Axel Rauschmayer, [ECMAScript 6 promises (2/2): the API](http://www.2ality.com/2014/10/es6-promises-api.html): 对ES6 Promise规格和用法的详细介绍 - Jack Franklin, [Embracing Promises in JavaScript](http://javascriptplayground.com/blog/2015/02/promises/): catch方法的例子 - Luke Hoban, [Async Functions for ECMAScript](https://github.com/lukehoban/ecmascript-asyncawait): Async函数的设计思想,与Promise、Gernerator函数的关系 +- Jafar Husain, [Asynchronous Generators for ES7](https://github.com/jhusain/asyncgenerator): Async函数的深入讨论 ## Class与模块 From 5618f6e5e7bdbb8a84bf84741c18aded1004bb46 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Tue, 3 Mar 2015 23:30:21 +0800 Subject: [PATCH 0087/1409] =?UTF-8?q?=E6=96=B0=E5=BB=BAstyle.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/function.md | 6 +- docs/reference.md | 1 + docs/string.md | 4 + docs/style.md | 241 ++++++++++++++++++++++++++++++++++++++++++++++ sidebar.md | 1 + 5 files changed, 251 insertions(+), 2 deletions(-) create mode 100644 docs/style.md diff --git a/docs/function.md b/docs/function.md index 4e97044d6..12f523e97 100644 --- a/docs/function.md +++ b/docs/function.md @@ -54,8 +54,8 @@ log('Hello', '') // Hello ```javascript function Point(x = 0, y = 0) { - this.x = x; - this.y = y; + this.x = x; + this.y = y; } var p = new Point(); @@ -63,6 +63,8 @@ var p = new Point(); ``` +除了简洁,ES6的写法还有两个好处:首先,阅读代码的人,可以立刻意识到哪些参数是可以省略的,不用查看函数体或文档;其次,有利于将来的代码优化,即使未来的版本彻底拿到这个参数,也不会导致以前的代码无法运行。 + 默认值的写法非常灵活,下面是一个为对象属性设置默认值的例子。 ```javascript diff --git a/docs/reference.md b/docs/reference.md index 78de7afc4..37d393570 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -23,6 +23,7 @@ - Guillermo Rauch, [ECMAScript 6](http://rauchg.com/2015/ecmascript-6/) - Charles King, [The power of ECMAScript 6](http://charlesbking.com/power_of_es6/#/) - Benjamin De Cock, [Frontend Guidelines](https://github.com/bendc/frontend-guidelines): ES6最佳实践 +- Jani Hartikainen, [ES6: What are the benefits of the new features in practice?](http://codeutopia.net/blog/2015/01/06/es6-what-are-the-benefits-of-the-new-features-in-practice/) ## 语法点 diff --git a/docs/string.md b/docs/string.md index 4d878b7d7..740109deb 100644 --- a/docs/string.md +++ b/docs/string.md @@ -535,11 +535,15 @@ tag`First line\nSecond line` 上面代码中,tag函数的第一个参数是一个数组`["First line\nSecond line"]`,这个数组有一个raw属性,等于`["First line\\nSecond line"]`,两者唯一的区别就是斜杠被转义了。 +```javascript + function tag(strings) { console.log(strings.raw[0]); // "First line\\nSecond line" } +``` + ## String.raw() String.raw方法,往往用来充当模板字符串的处理函数,返回字符串被转义前的原始格式。 diff --git a/docs/style.md b/docs/style.md new file mode 100644 index 000000000..fc631dded --- /dev/null +++ b/docs/style.md @@ -0,0 +1,241 @@ +# 编程风格 + +本章探讨如何将ES6的新语法,运用到编码实践之中,与传统的JavaScript语法结合在一起,以及如何形成良好的编码风格。 + +## 块级作用域 + +**(1)let取代var** + +ES6提出了两个新的声明变量的命令:let和const。其中,let完全可以取代var,因为两者语义相同,而且let没有副作用。 + +```javascript + +"use strict"; + +if(true) { + let x = 'hello'; +} + +for (let i = 0; i < 10; i++) { + console.log(i); +} + +``` + +上面代码如果用var替代let,实际上就声明了一个全局变量,这显然不是本意。变量应该只在其声明的代码块内有效,var命令做不到这一点。 + +var命令存在变量提升效用,let命令没有这个问题。 + +```javascript + +"use strict"; + +if(true) { + console.log(x); // ReferenceError + let x = 'hello'; +} + +``` + +上面代码如果使用var替代let,console.log那一行就不会报错,而是会输出undefined,因为变量声明提升到代码块的头部。这违反了变量先声明后使用的原则。 + +所以,建议不再使用var命令,而是使用let命令取代。 + +**(2)全局常量和线程安全** + +在let和const之间,建议优先使用const,尤其是在全局环境,不应该设置变量,只应设置常量。这符合函数式编程思想,有利于将来的分布式运算。 + +```javascript + +// bad +var a = 1, b = 2, c = 3; + +// good +const a = 1; +const b = 2; +const c = 3; + +// best +const [a, b, c] = [1, 2, 3]; + +``` + +const声明常量还有两个好处,一是阅读代码的人立刻会意识到不应该修改这个值,二是防止了无意间修改变量值所导致的错误。 + +所有的函数都应该设置为常量。 + +let表示的变量,只应出现在单线程运行的代码中,不能是多线程共享的,这样有利于保证线程安全。 + +**(3)严格模式** + +V8引擎只在严格模式之下,支持let和const。结合前两点,这实际上意味着,将来所有的编程都是针对严格模式的。 + +## 字符串 + +静态字符串一律使用单引号或反引号,不使用双引号。动态字符串使用反引号。 + +```javascript + +// bad +const a = "foobar"; +const b = 'foo' + a + 'bar'; + +// acceptable +const c = `foobar`; + +// good +const a = 'foobar'; +const b = `foo${a}bar`; +const c = 'foobar'; + +``` + +## 对象 + +单行定义的对象,最后一个成员不以逗号结尾。多行定义的对象,最后一个成员以逗号结尾。 + +```javascript + +// bad +const a = { k1: v1, k2: v2, }; +const b = { + k1: v1, + k2: v2 +}; + +// good +const a = { k1: v1, k2: v2 }; +const b = { + k1: v1, + k2: v2, +}; + +``` + +对象尽量静态化,一旦定义,就不得随意添加新的属性。如果添加属性不可避免,要使用Object.assign方法。 + +```javascript + +// bad +const a = {}; +a.x = 3; + +// if reshape unavoidable +const a = {}; +Object.assign(a, { x: 3 }); + +// good +const a = { x: null }; +a.x = 3; + +``` + +## 函数 + +使用匿名函数的场合,一律改为使用箭头函数。 + +```javascript + +// bad +arr.reduce(function(x, y) { return x + y; }, 0); + +// good +arr.reduce((x, y) => x + y, 0); + +``` + +箭头函数取代Function.prototype.bind,不应再用 self / _this / that 绑定 this。 + +```javascript + +// bad +const self = this; +const boundMethod = function(...params) { + return method.apply(self, params); +} + +// acceptable +const boundMethod = method.bind(this); + +// best +const boundMethod = (...params) => method.apply(this, params); + +``` + +所有配置项都应该集中在一个对象,放在最后一个参数,布尔值不可以直接作为参数。 + +```bash + +// bad +function divide(a, b, option = false ) { +} + +// good +function divide(a, b, { option = false } = {}) { +} + +``` + +## Map结构 + +注意区分Object和Map,只有模拟实体对象时,才使用Object。如果只是需要key:value的数据结构,使用Map。因为Map有内建的遍历机制。 + +```javascript + +let map = new Map(arr); + +for (let key of map.keys()) { + console.log(key); +} + +for (let value of map.values()) { + console.log(value); +} + +for (let item of map.entries()) { + console.log(item[0], item[1]); +} + +``` + +## 模块 + +使用import取代require。 + +```javascript +// bad +const moduleA = require('moduleA'); +const func1 = moduleA.func1; +const func2 = moduleA.func2; + +// good +import { func1, func2 } from 'moduleA'; +``` + +使用export取代module.exports。 + +```javascript + +// commonJS的写法 +var React = require('react'); + +var Breadcrumbs = React.createClass({ + render() { + return <nav />; + } +}); + +module.exports = Breadcrumbs; + +// ES6的写法 +import React from 'react'; + +const Breadcrumbs = React.createClass({ + render() { + return <nav />; + } +}); + +export default Breadcrumbs + +``` diff --git a/sidebar.md b/sidebar.md index b031a01c6..ce8d4baca 100644 --- a/sidebar.md +++ b/sidebar.md @@ -19,6 +19,7 @@ 1. [Generator函数](#docs/generator) 1. [Promise对象](#docs/promise) 1. [Class和Module](#docs/class) +1. [编程风格](#docs/style) 1. [参考链接](#docs/reference) ## 其他 From db97b3393192cd20a8e905107e1a4e15bba11394 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Wed, 4 Mar 2015 18:51:25 +0800 Subject: [PATCH 0088/1409] =?UTF-8?q?=E4=BF=AE=E6=94=B9let?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/function.md | 13 +++++++++++++ docs/let.md | 5 +++-- docs/style.md | 4 ++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/docs/function.md b/docs/function.md index 12f523e97..cde5fb315 100644 --- a/docs/function.md +++ b/docs/function.md @@ -167,6 +167,19 @@ foo(2) // 2 上面代码中,参数y的默认值等于x,由于处在函数作用域,所以x等于参数x,而不是全局变量x。 +参数变量是默认声明的,所以不能用let或const再次声明。 + +```javascript + +function foo(x = 5) { + let x = 1; // error + const x = 2; // error +} + +``` + +上面代码中,参数变量x是默认声明的,在函数体中,不能用let或const再次声明,否则会报错。 + 参数默认值可以与解构赋值,联合起来使用。 ```javascript diff --git a/docs/let.md b/docs/let.md index 1cb81176e..218c0b349 100644 --- a/docs/let.md +++ b/docs/let.md @@ -29,7 +29,6 @@ for(let i = 0; i < arr.length; i++){} console.log(i) //ReferenceError: i is not defined - ``` 上面代码的计数器i,只在for循环体内有效。 @@ -88,7 +87,7 @@ if (1) { ``` -上面代码中,由于块级作用域内typeof运行时,x还没有声明,所以会抛出一个ReferenceError。 +上面代码中,由于块级作用域内typeof运行时,x还没有值,所以会抛出一个ReferenceError。 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。 @@ -105,6 +104,8 @@ if (true) { 上面代码中,存在全局量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。 +ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些命令,就会报错。 + 总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。 ```javascript diff --git a/docs/style.md b/docs/style.md index fc631dded..6f7aebaa9 100644 --- a/docs/style.md +++ b/docs/style.md @@ -221,7 +221,7 @@ var React = require('react'); var Breadcrumbs = React.createClass({ render() { - return <nav />; + return