Skip to content

Commit 2fe9716

Browse files
committed
docs(spec): edit glossary
1 parent bf19144 commit 2fe9716

File tree

3 files changed

+87
-3
lines changed

3 files changed

+87
-3
lines changed

docs/reference.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
- 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/)
3737
- kangax, [Javascript quiz. ES6 edition](http://perfectionkills.com/javascript-quiz-es6/): ES6 小测试
3838
- Jeremy Fairbank, [HTML5DevConf ES7 and Beyond!](https://speakerdeck.com/jfairbank/html5devconf-es7-and-beyond): ES7 新增语法点介绍
39+
- Timothy Gu, [How to Read the ECMAScript Specification](https://timothygu.me/es-howto/): 如何读懂 ES6 规格
3940

4041
## let 和 const
4142

docs/spec.md

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,93 @@ ECMAScript 6 的规格,可以在 ECMA 国际标准组织的官方网站([www
1616

1717
ECMAScript 6 规格的 26 章之中,第 1 章到第 3 章是对文件本身的介绍,与语言关系不大。第 4 章是对这门语言总体设计的描述,有兴趣的读者可以读一下。第 5 章到第 8 章是语言宏观层面的描述。第 5 章是规格的名词解释和写法的介绍,第 6 章介绍数据类型,第 7 章介绍语言内部用到的抽象操作,第 8 章介绍代码如何运行。第 9 章到第 26 章介绍具体的语法。
1818

19-
对于一般用户来说,除了第 4 章,其他章节都涉及某一方面的细节,不用通读,只要在用到的时候,查阅相关章节即可。下面通过一些例子,介绍如何使用这份规格。
19+
对于一般用户来说,除了第 4 章,其他章节都涉及某一方面的细节,不用通读,只要在用到的时候,查阅相关章节即可。
20+
21+
## 术语
22+
23+
ES6 规格使用了一些专门的术语,了解这些术语,可以帮助你读懂规格。本节介绍其中的几个。
24+
25+
### 抽象操作
26+
27+
所谓”抽象操作“(abstract operations)就是引擎的一些内部方法,外部不能调用。规格定义了一系列的抽象操作,规定了它们的行为,留给各种引擎自己去实现。
28+
29+
举例来说,`Boolean(value)`的算法,第一步是这样的。
30+
31+
> 1. Let b be ToBoolean(value).
32+
33+
这里的`ToBoolean`就是一个抽象操作,是引擎内部求出布尔值的算法。
34+
35+
许多函数的算法都会多次用到同样的步骤,所以 ES6 规格将它们抽出来,定义成”抽象操作“,方便描述。
36+
37+
### Record 和 field
38+
39+
ES6 规格将键值对(key-value map)的数据结构称为 Record,其中的每一组键值对称为 field。这就是说,一个 Record 由多个 field 组成,而每个 field 都包含一个键名(key)和一个键值(value)。
40+
41+
### [[Notation]]
42+
43+
ES6 规格大量使用`[[Notation]]`这种书写法,比如`[[Value]]``[[Writable]]``[[Get]]``[[Set]]`等等。它用来指代 field 的键名。
44+
45+
举例来说,`obj`是一个 Record,它有一个`Prototype`属性。ES6 规格不会写`obj.Prototype`,而是写`obj.[[Prototype]]`。一般来说,使用`[[Notation]]`这种书写法的属性,都是对象的内部属性。
46+
47+
所有的 JavaScript 函数都有一个内部属性`[[Call]]`,用来运行该函数。
48+
49+
```javascript
50+
F.[[Call]](V, argumentsList)
51+
```
52+
53+
上面代码中,`F`是一个函数对象,`[[Call]]`是它的内部方法,`F.[[call]]()`表示运行该函数,`V`表示`[[Call]]`运行时`this`的值,`argumentsList`则是调用时传入函数的参数。
54+
55+
### Completion Record
56+
57+
每一个语句都会返回一个 Completion Record,表示运行结果。每个 Completion Record 有一个`[[Type]]`属性,表示运行结果的类型。
58+
59+
`[[Type]]`属性有五种可能的值。
60+
61+
- normal
62+
- return
63+
- throw
64+
- break
65+
- continue
66+
67+
如果`[[Type]]`的值是`normal`,就称为 normal completion,表示运行正常。其他的值,都称为 abrupt completion。其中,开发者只需要关注`[[Type]]``throw`的情况,即运行出错;`break``continue``return`这三个值都只出现在特定场景,可以不用考虑。
68+
69+
## 抽象操作的标准流程
70+
71+
抽象操作的运行流程,一般是下面这样。
72+
73+
> 1. Let resultCompletionRecord be AbstractOp().
74+
> 1. If resultCompletionRecord is an abrupt completion, return resultCompletionRecord.
75+
> 1. Let result be resultCompletionRecord.[[Value]].
76+
> 1. return result.
77+
78+
上面的第一步是调用抽象操作`AbstractOp()`,得到`resultCompletionRecord`,这是一个 Completion Record。第二步,如果这个 Record 属于 abrupt completion,就将`resultCompletionRecord`返回给用户。如果此处没有返回,就表示运行结果正常,所得的值存放在`resultCompletionRecord.[[Value]]`属性。第三步,将这个值记为`result`。第四步,将`result`返回给用户。
79+
80+
ES6 规格将这个标准流程,使用简写的方式表达。
81+
82+
> 1. Let result be AbstractOp().
83+
> 1. ReturnIfAbrupt(result).
84+
> 1. return result.
85+
86+
这个简写方式里面的`ReturnIfAbrupt(result)`,就代表了上面的第二步和第三步,即如果有报错,就返回错误,否则取出值。
87+
88+
甚至还有进一步的简写格式。
89+
90+
> 1. Let result be ? AbstractOp().
91+
> 1. return result.
92+
93+
上面流程的`?`,就代表`AbstractOp()`可能会报错。一旦报错,就返回错误,否则取出值。
94+
95+
除了`?`,ES 6 规格还使用另一个简写符号`!`
96+
97+
> 1. Let result be ! AbstractOp().
98+
> 1. return result.
99+
100+
上面流程的`!`,代表`AbstractOp()`不会报错,返回的一定是 normal completion,总是可以取出值。
20101

21102
## 相等运算符
22103

104+
下面通过一些例子,介绍如何使用这份规格。
105+
23106
相等运算符(`==`)是一个很让人头痛的运算符,它的语法行为多变,不符合直觉。这个小节就看看规格怎么规定它的行为。
24107

25108
请看下面这个表达式,请问它的值是多少。

docs/symbol.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ a2[1] = 6;
563563

564564
### Symbol.species
565565

566-
对象的`Symbol.species`属性,指向一个构造函数。创建造衍生对象时,会使用该属性。
566+
对象的`Symbol.species`属性,指向一个构造函数。创建衍生对象时,会使用该属性。
567567

568568
```javascript
569569
class MyArray extends Array {
@@ -583,7 +583,7 @@ class MyArray extends Array {
583583
}
584584
```
585585

586-
上面代码中,由于定义了`Symbol.species`属性,创建衍生对象时就会使用这个属性返回的的函数,作为构造函数。这个例子也说明,定义`Symbol.species`属性要采用`get`读取器。默认的`Symbol.species`属性等同于下面的写法。
586+
上面代码中,由于定义了`Symbol.species`属性,创建衍生对象时就会使用这个属性返回的函数,作为构造函数。这个例子也说明,定义`Symbol.species`属性要采用`get`读取器。默认的`Symbol.species`属性等同于下面的写法。
587587

588588
```javascript
589589
static get [Symbol.species]() {

0 commit comments

Comments
 (0)