对于前端开发者来说,规范的主要作用是用来查阅不清楚的细节或者写 polyfill。刚开始看规范会觉得比较无聊,但是能够用规范理解一些代码的行为才是乐趣所在。最近在看 You Don’t Know JS 这本书,刚好可以配合 ECMAScript 规范来看,感觉非常好。建议大家使用网页版的 http://www.ecma-international.org/ecma-262/6.0/ 观看,因为跳转和搜索非常方便。

1. Types

1.1 所有的类型

规范的 6.1.1-6.1.7 节明确规定了7种类型:

Algorithms within this specification manipulate values each of which has an associated type. The possible value types are exactly those defined in this clause.

并且规定了何为函数:

A function object is an object that supports the [[Call]] internal methods.

1.2 The typeof Operator

typeof 操作符的所有情况下的值都列在这里,

关于为什么 typeof null 是 "object",为什么 typoef 一个未定义的值是 "undefined",为什么 typeof 一个函数是 "function"等等,规定就是这样,表格里写得很清楚。

2. Natives

像 String(),Number(),Boolean(), Array() 等等这类原生构造函数在实际工作开发中很少用,但是他们有很多奇奇怪怪的特性。比如为啥 new Array(2) 和 new Array(2, 3) 差别这么大, 为啥可以直接写字面量 "abc" 还需要这种 new String( "abc" )等等。反正这些奇奇怪怪的东西很无聊。

另外意外发现关于 length 属性,有一些奇怪的规定,并没有解释任何理由: 比如这个 http://www.ecma-international.org/ecma-262/6.0/#sec-function.prototype.apply:

The length property of the apply method is 2.

就是规定这个值必须是 2,看一下规范,有很多这种无厘头的规定

Function.prototype.apply.length // => 2
Function.prototype.call.length // => 1
Function.prototype.bind.length // => 1

3. Type Conversion

规范的 7.1 节 列出了所有类型转换的 abstract operation, 总共 16 个,不过大部分平时不怎么用到。最常用的就是 ToString, ToNumber , ToBoolean, ToPrimitive.随便举几个例子应用:

类似的东西还有很多,那几个表格挺长,很多记不住也懒得去记,需要时可以查阅。但是有些人用此来作为笔试或者面试题就很奇怪了。

3.1 ==, === 和 Obejct.is

这三个,规范已经写得很清楚了,一个个步骤去执行就好了, Object.is 可以看成 === 的完善版,对 NaN, +0, -0 的处理更“正常”,另外最重要的 Object.is 是一个函数而不是操作符,这样就可以享受到作为函数的一切好处,比如直接作为参数传递,可以重写它等等,这些都是操作符 === 做不到的。