From 22afca322c290db7ef6137fc304946271fd0b953 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Tue, 20 Oct 2015 11:08:03 +0800 Subject: [PATCH] edit destruring --- docs/destructuring.md | 24 ++++++++++++++++-------- docs/intro.md | 8 +++++--- docs/module.md | 10 +++++----- docs/reference.md | 6 +++--- 4 files changed, 29 insertions(+), 19 deletions(-) diff --git a/docs/destructuring.md b/docs/destructuring.md index 40e1214..9be0d27 100644 --- a/docs/destructuring.md +++ b/docs/destructuring.md @@ -108,8 +108,8 @@ const [v1, v2, ..., vN ] = array; 对于Set结构,也可以使用数组的解构赋值。 ```javascript -[a, b, c] = new Set(["a", "b", "c"]) -a // "a" +let [x, y, z] = new Set(["a", "b", "c"]) +x // "a" ``` 事实上,只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值。 @@ -128,7 +128,7 @@ var [first, second, third, fourth, fifth, sixth] = fibs(); sixth // 5 ``` -上面代码中,fibs是一个Generator函数,原生具有Iterator接口。解构赋值会依次从这个接口获取值。 +上面代码中,`fibs`是一个Generator函数,原生具有Iterator接口。解构赋值会依次从这个接口获取值。 ## 对象的解构赋值 @@ -165,6 +165,14 @@ f // 'hello' l // 'world' ``` +这实际上说明,对象的解构赋值是下面形式的简写(参见《对象的扩展》一章)。 + +```javascript +var { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" }; +``` + +也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。 + 和数组一样,解构也可以用于嵌套结构的对象。 ```javascript @@ -203,9 +211,9 @@ var {x = 3} = {x: null}; x // null ``` -上面代码中,如果x属性等于null,就不严格相等于undefined,导致默认值不会生效。 +上面代码中,如果`x`属性等于`null`,就不严格相等于`undefined`,导致默认值不会生效。 -如果解构失败,变量的值等于undefined。 +如果解构失败,变量的值等于`undefined`。 ```javascript var {foo} = {bar: 'baz'} @@ -219,7 +227,7 @@ foo // undefined var {foo: {bar}} = {baz: 'baz'} ``` -上面代码中,等号左边对象的foo属性,对应一个子对象。该子对象的bar属性,解构时会报错。原因很简单,因为foo这时等于undefined,再取子属性就会报错,请看下面的代码。 +上面代码中,等号左边对象的`foo`属性,对应一个子对象。该子对象的`bar`属性,解构时会报错。原因很简单,因为`foo`这时等于`undefined`,再取子属性就会报错,请看下面的代码。 ```javascript var _tmp = {baz: 'baz'}; @@ -232,7 +240,7 @@ _tmp.foo.bar // 报错 // 错误的写法 var x; -{x} = {x:1}; +{x} = {x: 1}; // SyntaxError: syntax error ``` @@ -266,7 +274,7 @@ d // "l" e // "o" ``` -类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。 +类似数组的对象都有一个`length`属性,因此还可以对这个属性解构赋值。 ```javascript let {length : len} = 'hello'; diff --git a/docs/intro.md b/docs/intro.md index 5ca65c5..482afc2 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -2,7 +2,7 @@ ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 -标准的制定者有计划,以后每年发布一次标准,使用年份作为标准的版本。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。也就是说,ES6就是ES2015。 +标准的制定者有计划,以后每年发布一次标准,使用年份作为标准的版本。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。也就是说,ES6就是ES2015,下一年应该会发布小幅修订的ES2016。 ## ECMAScript和JavaScript的关系 @@ -146,7 +146,7 @@ $ babel-node es6.js [1, 4, 9] ``` -babel命令可以将ES6代码转为ES5代码。 +`babel`命令可以将ES6代码转为ES5代码。 ```bash $ babel es6.js @@ -403,7 +403,7 @@ fs.writeFileSync('out.js.map', result.sourceMap); 2013年3月,ES6的草案封闭,不再接受新功能了。新的功能将被加入ES7。 -任何人都可以向ES7提案,从提案到变成正式标准,需要经历五个阶段。每个阶段的变动都需要由TC39委员会批准。 +任何人都可以向TC39提案,从提案到变成正式标准,需要经历五个阶段。每个阶段的变动都需要由TC39委员会批准。 - Stage 0 - Strawman(展示阶段) - Stage 1 - Proposal(征求意见阶段) @@ -435,6 +435,8 @@ fs.writeFileSync('out.js.map', result.sourceMap); - es7.asyncFunctions:async函数 - es7.objectRestSpread:对象的Rest参数和扩展运算符 +ECMAScript当前的所有提案,可以在TC39的官方网站[Github.com/tc39/ecma262](https://github.com/tc39/ecma262)查看。 + Babel转码器对Stage 2及以上阶段的功能,是默认支持的。对于那些默认没有打开的功能,需要手动打开。 ```bash diff --git a/docs/module.md b/docs/module.md index b3b448c..5c6ed11 100644 --- a/docs/module.md +++ b/docs/module.md @@ -44,13 +44,13 @@ ES6的模块自动采用严格模式,不管你有没有在模块头部加上`" - 不能使用`fn.caller`和`fn.arguments`获取函数调用的堆栈 - 增加了保留字(比如`protected`、`static`和`interface`) -上面这些限制,模块都必须遵守。 +上面这些限制,模块都必须遵守。由于严格模式是ES5引入的,不属于ES6,所以请参阅相关ES5书籍,本书不再详细介绍了。 ## export命令 -模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。 +模块功能主要由两个命令构成:`export`和`import`。`export`命令用于规定模块的对外接口,`import`命令用于输入其他模块提供的功能。 -一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量。下面是一个JS文件,里面使用export命令输出变量。 +一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用`export`关键字输出该变量。下面是一个JS文件,里面使用`export`命令输出变量。 ```javascript // profile.js @@ -59,7 +59,7 @@ export var lastName = 'Jackson'; export var year = 1958; ``` -上面代码是profile.js文件,保存了用户信息。ES6将其视为一个模块,里面用export命令对外部输出了三个变量。 +上面代码是`profile.js`文件,保存了用户信息。ES6将其视为一个模块,里面用export命令对外部输出了三个变量。 export的写法,除了像上面这样,还有另外一种。 @@ -72,7 +72,7 @@ var year = 1958; export {firstName, lastName, year}; ``` -上面代码在export命令后面,使用大括号指定所要输出的一组变量。它与前一种写法(直接放置在var语句前)是等价的,但是应该优先考虑使用这种写法。因为这样就可以在脚本尾部,一眼看清楚输出了哪些变量。 +上面代码在`export`命令后面,使用大括号指定所要输出的一组变量。它与前一种写法(直接放置在var语句前)是等价的,但是应该优先考虑使用这种写法。因为这样就可以在脚本尾部,一眼看清楚输出了哪些变量。 export命令除了输出变量,还可以输出函数或类(class)。 diff --git a/docs/reference.md b/docs/reference.md index f41d7ef..5737c30 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -2,9 +2,9 @@ ## 官方文件 -- [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草案各版本之间的变动 +- [ECMAScript® 2015 Language Specification](http://www.ecma-international.org/ecma-262/6.0/index.html): ES6语言规格 +- [ECMAScript Current Proposals](https://github.com/tc39/ecma262): ECMAScript当前的各种提案 +- [ECMAScript® 2016 Language Specification](http://tc39.github.io/ecma262/): ECMAScript 2016草案 ## 综合介绍