术语

ES6 规格使用了一些专门的术语,了解这些术语,可以帮助你读懂规格。本节介绍其中的几个。

抽象操作

所谓“抽象操作”(abstract operations)就是引擎的一些内部方法,外部不能调用。规格定义了一系列的抽象操作,规定了它们的行为,留给各种引擎自己去实现。

举例来说,Boolean(value)的算法,第一步是这样的。

  1. Let b be ToBoolean(value).

这里的ToBoolean就是一个抽象操作,是引擎内部求出布尔值的算法。

许多函数的算法都会多次用到同样的步骤,所以 ES6 规格将它们抽出来,定义成“抽象操作”,方便描述。

Record 和 field

ES6 规格将键值对(key-value map)的数据结构称为 Record,其中的每一组键值对称为 field。这就是说,一个 Record 由多个 field 组成,而每个 field 都包含一个键名(key)和一个键值(value)。

[[Notation]]

ES6 规格大量使用[[Notation]]这种书写法,比如[[Value]][[Writable]][[Get]][[Set]]等等。它用来指代 field 的键名。

举例来说,obj是一个 Record,它有一个Prototype属性。ES6 规格不会写obj.Prototype,而是写obj.[[Prototype]]。一般来说,使用[[Notation]]这种书写法的属性,都是对象的内部属性。

所有的 JavaScript 函数都有一个内部属性[[Call]],用来运行该函数。

  1. F.[[Call]](V, argumentsList)

上面代码中,F是一个函数对象,[[Call]]是它的内部方法,F.[[call]]()表示运行该函数,V表示[[Call]]运行时this的值,argumentsList则是调用时传入函数的参数。

Completion Record

每一个语句都会返回一个 Completion Record,表示运行结果。每个 Completion Record 有一个[[Type]]属性,表示运行结果的类型。

[[Type]]属性有五种可能的值。

  • normal
  • return
  • throw
  • break
  • continue

如果[[Type]]的值是normal,就称为 normal completion,表示运行正常。其他的值,都称为 abrupt completion。其中,开发者只需要关注[[Type]]throw的情况,即运行出错;breakcontinuereturn这三个值都只出现在特定场景,可以不用考虑。