JavaScript十二月新标准ECMA262v5快速浏览

今天终于抽出时间瞟了一眼JavaScript的新标准ECMA262v5,让我欣喜的是,不像是因为过于激进而被废除的v4,这个新标准对JavaScript保留了ECMA262v3时代大部分的语言特性,把重点放在了修补旧标准中被人诟病的问题上,而且加入了许多令人期待的新特性和新功能。因为我还没有很深入研究,这里仅仅是分享我快速浏览时看到的一些主要的亮点和变化,请不要把本文当作一个全面的新旧标准对比,也欢迎大家补充。

1.文档得到改进,官方版本PDF文件带了索引,目录也有了链接。

(虽然跟语言无关……)这份文档使用了pdf的更多特性,阅读起来较之v3方便了不少。

2.v3中描述暧昧的scope chain的概念被去掉,引入了全新的执行上下文概念来解释动态的变量作用域。

scope chain在ECMAv3中一直是块难啃的骨头,本身标准的描述就不够清晰,再加上动态作用域的实现又有些难以理解,很多人都一直因为scope chain问题而苦恼。在v5中,变量作用域的概念被完全更新,采用上下文和outer上下文的概念来解释这个问题。比起原来向scope chain中加入Activation Object的解释方法,这种描述令实现更自由(上下文对象不一定是JavaScript对象,而Activation Object一定是JavaScript对象)

3.引入了strict模式,strict模式提供了禁用一些语言特性以提升性能的潜在可能。

根据我目前的推断,在strict模式模式下JavaScript的变量应该是可以实现为静态寻址的。众所周知,JavaScript运行效率低的原因之一就是动态的变量声明和变量名查找导致的效率问题,而新的标准引入了strict模式使得这一问题得以根本解决,在一些多次调用的核心代码中使用strict模式将大大提高JavaScript的运行效率。当然这些特性还要求语言实现者提供相应支持才行。

4.eval和arguments做为标识符受到了限制。

我想是为了弥补v3将eval和arguments做为普通标识符带来的问题,v5在各个地方都对eval和arguments作出了限制,对它们进行赋值等操作会导致抛出运行时异常。我个人认为现在基本可以将它们等同于关键字看待。

5.JSON被引入标准中

JSON的概念被正式引入了v5,并且有了标准的词法和语法定义。同时,新标准也提供了不同层面内置类型方法来支持JSON,包括Date的toJSON和新引入的JSON对象。

6.引入了属性类型,对象模型描述更加清晰

新标准引入了两种Property类型,一种是普通的存储Value的property,另一种是有Getter和Setter的属性。而v3中略显含糊的对象是“属性无序集合”的概念,随着这样的定义也变得很清晰。

7.引入了Error的子类型

所有Error不再属于同一个Error类型,EvalError, RangeError, ReferenceError, SyntaxError, TypeError 以及 URIError 被引入语言中

8.更多内置类型的方法

下面是一份新标准中给出的新添加内置类型以及属性列表:

Object.getPrototypeOf, Object.getOwnPropertyDescriptor, Object.getOwnPropertyNames, Object.create, Object.defineProperty, Object.defineProperties, Object.seal, Object.freeze, Object.preventExtensions, Object.isSealed, Object.isFrozen, Object.isExtensible, Object.keys, Function.prototype.bind, Array.prototype.indexOf, Array.prototype.lastIndexOf, Array.prototype.every, Array.prototype.some, Array.prototype.forEach, Array.prototype.map, Array.prototype.filter, Array.prototype.reduce, Array.prototype.reduceRight, String.prototype.trim, Date.now, Date.prototype.toISOString, Date.prototype.toJSON.

我们看到,这份列表中包括了我们期待以久的很多方法。Object扩展实际上开放了更多v3中不可访问的对象特性,包括getter setter enumerable等等都可以。而Array扩展则引入了期待以久的集合操作(比如著名的forEach)。Date.now则是一个小小的修补,比起new Date看起来舒服一些。Function.prototype.bind也在列表当中,这个新的内置函数提供了比目前一些流行的bind更完善和高效的绑定thisValue功能,而且还顺便提供了绑定参数,这是变相的currying实现。

 

好了,因为是快速浏览,暂时就写这么多了,有时间的话我会再做一些研究,提供一些深入点的解读文章,敬请期待哦:P

 

官方文档链接http://www.ecma-international.org/publications/standards/Ecma-262.htm

posted @ 2009-12-22 02:00  winter-cn  阅读(...)  评论(... 编辑 收藏