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

时间:2009-12-27 12:56:00 

今天终于抽出时间瞟了一眼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实现。

标签:ECMA,标准,JavaScript
0
投稿

猜你喜欢

  • Javascript函数类型判断解决方案

    2009-08-27 15:32:00
  • SQL Server连接中经常出现的3个常见错误与解答

    2010-07-26 14:25:00
  • 怎么样才能设计出漂亮的网页?

    2008-10-07 16:57:00
  • 读取MySQL的log方法

    2011-07-01 12:04:57
  • 分析SQL语句性能3种方法分享

    2012-06-06 20:09:30
  • asp数字或者字符排序函数代码

    2011-02-24 11:00:00
  • sqlserver 多库查询 sp_addlinkedserver使用方法(添加链接服务器)

    2011-09-30 11:49:22
  • 浅谈品牌的视觉识别

    2009-07-03 12:28:00
  • 站长必须要了解的九条平面设计常识

    2008-06-07 14:33:00
  • 关于网站地图

    2011-01-06 12:14:00
  • SQL Server asp.net 数据提供程序连接池

    2009-09-18 08:18:00
  • oracle下巧用bulk collect实现cursor批量fetch的sql语句

    2009-03-04 10:43:00
  • 剑走偏锋:体验ebay的AIR

    2008-11-13 11:51:00
  • asp定时生成静态HTML的代码

    2010-07-02 12:29:00
  • display:inline-block的深入理解

    2007-05-11 17:03:00
  • Oracle常见错误诊断

    2010-07-27 12:56:00
  • 国际上十四个优秀网页设计审核站

    2007-09-30 20:18:00
  • 如何在ADSI中查询用户属性?

    2010-06-17 12:53:00
  • css网页下拉菜单制作方法(4):定位问题

    2007-02-03 11:39:00
  • 实现框架页面iframe的背景透明方法

    2008-06-18 12:21:00
  • asp之家 网络编程 m.aspxhome.com