ECMA-262中文版译文
作者:dh20156 日期:2009-11-19
ECMA-262标准第3版-1999年11月
ECMA信息标准化和通信系统
ECMAScript语言说明
联系方式: 电话:+41 22 849.60.00 传真:+41 22 849.60.01 网址:http://www.ecma.ch 邮箱:helpdesk@ecma.ch
翻译:W3CGROUP 杜欢(dh20156, 2009年11月)
个人能力精力有限,欢迎大家批评指正,转载请注明出处!
历史提要
本标准的制定基于多个现有的技术,其中最著名的是JavaScript(Netscape)和JScript(Microsoft)。该语言是由当时在Netscape公司的Brendan Eich创造的,它第一次发布在该公司的Navigator2.0的浏览器中,并且在随后的所有版本浏览器中都有发布,微软公司在IE3.0的时候才开始引入并在以后的所有版本中使用它。
本标准的发展始于1996年11月。第一版在1997年6月被ECMA General Assembly采纳。
本标准在1998年4月通过快速通道提交到ISO/IEC JTC 1并被采纳为国际标准ISO/IEC 16262。第一版和第二版之间的编辑有着本质的变化。
本文档是标准第三版的定义,包括了强大的正则表达式,更好的字符串处理,新的控制语句,try/catch例外处理,更简洁明了的错误信息,格式化数字输出,并对即将到来的国际化工具和未来的语言增长进行了微调。
对该语言的工作还没有结束,科技委员会正在做具有重大意义的优化,包括在互联网上创建和使用脚本的机制,和其他的标准相互协调,比如W3C组织和无线应用协议论坛等等。
本标准在1999年11月被ECMA General Assembly接受采纳为ECMA-262第3版。
目录
1. 范围
2. 一致性
3. 参考
4. 概述
4.1 WEB脚本
4.2 语言概述
4.2.1 对象
4.3 定义
4.3.1 类型
4.3.2 原始值
4.3.3 对象
4.3.4 构造函数
4.3.5 原型
4.3.6 原生对象
4.3.7 内置对象
4.3.8 宿主对象
4.3.9 Undefined值
4.3.10 Undefined类型
4.3.11 Null值
4.3.12 Null类型
4.3.13 Boolean值
4.3.14 Boolean类型
4.3.15 Boolean对象
4.3.16 String值
4.3.17 String类型
4.3.18 String对象
4.3.19 Number值
4.3.20 Number类型
4.3.21 Number对象
4.3.22 Infinity
4.3.23 NaN
5. 符号约定
5.1 语法和词法
5.1.1 上下文无关文法
5.1.2 RegExp正则表达式的词汇和语法
5.1.3 数字、字符串语法
5.1.4 语法句法
5.1.5 语法符号
5.2 算法约定
6. 源文
7. 词法约定
7.1 Unicode 格式字符
7.2 空格
7.3 行尾
7.4 注释
7.5 特征
7.5.1 保留字
7.5.2 关键词
7.5.3 未来保留字
7.6 标识符
7.7 标点
7.8 字面量
7.8.1 Null字面量
7.8.2 Boolean字面量
7.8.3 Numeric字面量
7.8.4 String字面量
7.8.5 正则表达式字面量
7.9 自动插入分号
7.9.1 自动插入分号规则
7.9.2 自动插入分号示例
8. 类型
8.1 Undefined类型
8.2 Null类型
8.3 Boolean类型
8.4 String类型
8.5 Number类型
8.6 Object类型
8.6.1 property属性
8.6.2 内部propertys和methods
8.7 引用类型
8.7.1 GetValue(V)
8.7.2 PutValue(V,W)
8.8 List类型 8.9 Completion类型
9. 类型转换
9.1 转为原始(primitive)类型
9.2 转为Boolean类型
9.3 转为Number类型
9.3.1 String类型转为Number类型
9.4 转为整型
9.5 转为32位整型
9.6 转为32位无符号整型
9.7 转为16位无符号整型
9.8 转为String类型
9.8.1 Number类型转为String类型
9.9 转为Object
10. 执行环境
10.1 定义
10.1.1 函数对象
10.1.2 可执行代码类型
10.1.3 变量
10.1.4 作用域链和标识符确定
10.1.5 全局对象
10.1.6 活动对象
10.1.7 This
10.1.8 Arguments对象
10.2 进入执行环境
10.2.1 全局代码
10.2.2 Eval代码
10.2.3 函数代码
11. 表达式
11.1 基本表达式
11.1.1 this关键字
11.1.2 标识符引用
11.1.3 字面量引用
11.1.4 Array初始化程序
11.1.5 Object初始化程序
11.1.6 分组操作
11.2 Left-Hand-Side表达式
11.2.1 Property访问器
11.2.2 new操作符
11.2.3 函数调用
11.2.4 参数列表
11.2.5 函数表达式
11.3 后缀表达式
11.3.1 后缀+ 运算符
11.3.2 后缀- 运算符
11.4 一元运算符
11.4.1 delete操作符
11.4.2 void操作符
11.4.3 typeof操作符
11.4.4 前缀+ 运算符
11.4.5 前缀- 运算符
11.4.6 一元+ 运算符
11.4.7 一元- 运算符
11.4.8 按位非运算符~
11.4.9 逻辑非运算符!
11.5 乘除法运算
11.5.1 * 运算符
11.5.2 / 运算符
11.5.3 % 运算符
11.6 加减法运算
11.6.1 加法 + 运算符
11.6.2 减法 - 运算符
11.6.3 数字加减运算
11.7 位运算
11.7.1 左移 << 运算符
11.7.2 右移 >> 运算符
11.7.3 无符号右移 >>> 运算符
11.8 比较运算
11.8.1 小于 < 运算符
11.8.2 大于 > 运算符
11.8.3 小于等于 <= 运算符
11.8.4 大于等于 >= 运算符
11.8.5 抽象关系比较算法
11.8.6 instanceof运算符
11.8.7 in运算符
11.9 相等比较
11.9.1 相等运算符 ==
11.9.2 不等运算符 !=
11.9.3 抽象相等比较算法
11.9.4 严格相等运算符 ===
11.9.5 严格不等运算符 !==
11.9.6 严格相等比较算法
11.10 二进制位运算
11.11 二进制逻辑运算
11.12 条件运算符 ?:
11.13 分配运算
11.13.1 直接分配 =
11.13.2 混合分配 op=
11.14 逗号运算符
12 语句
12.1 Block
12.2 变量语句
12.3 空语句
12.4 表达式语句
12.5 if语句
12.6 循环语句
12.6.1 do-while语句
12.6.2 while语句
12.6.3 for语句
12.6.4 for-in语句
12.7 continue语句
12.8 break语句
12.9 return 语句
12.10 with语句
12.11 switch语句
12.12 标签语句
12.13 throw语句
12.14 try语句
13. 函数定义
13.1 定义
13.1.1 等于语法操作
13.1.2 连接对象
13.2 创建函数对象
13.2.1 [[Call]]
13.2.2 [[Construct]]
14. 程序
15. ECMAScript原生对象
15.1 全局对象
15.1.1 全局对象值属性
15.1.2 全局对象函数属性
15.1.3 URI处理函数属性
15.1.4 全局对象构造器属性
15.1.5 全局对象其他属性
15.2 Object对象
15.2.1 Object构造函数调用
15.2.2 Object构造器
15.2.3 Object构造器属性
15.2.4 Object原型对象属性
15.2.5 Object实例属性
15.3 Function对象
15.3.1 Function构造函数调用
15.3.2 Function构造器
15.3.3 Function构造器属性
15.3.4 Function原型对象属性
15.3.5 Function实例属性
15.4 Array对象
15.4.1 Array构造函数调用
15.4.2 Array构造器
15.4.3 Array构造器属性
15.4.4 Array原型对象属性
15.4.5 Array实例属性
15.5 String对象
15.5.1 String构造函数调用
15.5.2 String构造器
15.5.3 String构造器属性
15.5.4 String原型对象属性
15.5.5 String实例属性
15.6 Boolean对象
15.6.1 Boolean构造函数调用
15.6.2 Boolean构造器
15.6.3 Boolean构造器属性
15.6.4 Boolean原型对象属性
15.6.5 Boolean实例属性
15.7 Number对象
15.7.1 Number构造函数调用
15.7.2 Number构造器
15.7.3 Number构造器属性
15.7.4 Number原型对象属性
15.7.5 Number实例属性
15.8 Math对象
15.8.1 Math值属性
15.8.2 Math函数属性
15.9 Date对象
15.9.1 Date概述和内部操作定义
15.9.2 Date构造函数调用
15.9.3 Date构造器
15.9.4 Date构造器属性
15.9.5 Date原型对象属性
15.9.6 Date实例属性
15.10 RegExp(正则表达式)对象
15.10.1 匹配模式
15.10.2 匹配模式语义
15.10.3 RegExp构造函数调用
15.10.4 RegExp构造器
15.10.5 RegExp构造器属性
15.10.6 RegExp原型对象属性
15.10.7 RegExp实例属性
15.11 Error对象
15.11.1 Error构造函数调用
15.11.2 Error构造器
15.11.3 Error构造器属性
15.11.4 Error原型对象属性
15.11.5 Error实例属性
15.11.6 标准中用到的原生错误类型
15.11.7 NativeError对象结构
16. 错误
附录A - 语法摘要
附录B - 兼容性
本标准用于定义ECMAScript脚本语言
任何遵照ECMAScript的实现,都必须完全支持本说明中描述的:类型,值,对象,属性,函数,程序语法和语义 (types,values,objects,properties,functions,program syntax,semantics)
任何遵照此国际标准的实现,都必须遵守使用Unicode标准(2.1或以后版本)去解释字符,以ISO/IEC 10646-1 第3级实现中的UCS-2或UTF-16作为编码方式。如果采用的ISO/IEC 10646-1的子集没有指定,它将会是BMP子集300,如果采用的编码方式没有指定,则采用UTF-16的编码方式。
任何遵照ECMAScript的实现,都允许提供一些附加的超过本文档中描述的:类型、值、对象、属性和函数(types, values,objects,properties,functions),在一些特别的实现中,允许为本文档中描述的对象提供一些本文档中没有定义过的属性和属性值。
任何遵照ECMAScript的实现,都允许提供一些本文档中没有描述过的程序及正则表达式语法,在一些特别的实现中,允许支持在程序语法中使用本文档7.5.3中列出的未来保留关键字。
ISO/IEC 9899:1996 Programming Languages-C,包括修正1和勘误表1和2。
ISO/IEC 10646-1:1993 Information Technology -- 通用多八位编码字符集(UCS)及它的修正和勘误部分。
Unicode公司(1996),Unicode标准,版本2.0,ISBN:0-201-48345-9,加利福尼亚,Menlo Park,Addison-Wesley出版公司。
Unicode公司(1998),Unicode技术报告#8:Unicode标准,版本2.1。
Unicode公司(1998),Unicode技术报告#15:Unicode的标准化形式。
ANSI/IEEE标准754-1985:IEEE二进制浮点运算标准。纽约电气电子工程师协会(1985)。
本章节包括对ECMAScript语言的非正式概述。
ECMAScript是一种面向对象(object-oriented)的编程语言,用于执行计算和操作在宿主环境中的计算机对象。这里定义的ECMAScript没有被设计为能够自给自足的计算,事实上,在本说明中,没有对要输入的外部数据和要输出的计算结果作出任何规定,相反,我们期望的计算环境是在本说明中描述的ECMAScript程序提供的那些不限于对象和其他的设施,而且,也有一些特别的环境,如宿主对象,对它的描述及行为都超过了本说明的范围,不过,可以知道的是,它们可能会提供一些可以由ECMAScript程序访问的属性和调用的函数。
脚本语言是一种编程语言,它用来操作、自定义、自动化现有系统中的设备。在这些系统中,有用的功能已经可以通过用户接口来使用,而脚本语言就是将这些功能暴露给程序控制的机制。这样,就可以说,现有系统提供了一个运行脚本语言完整功能需要的对象和设备的宿主环境。脚本语言是专门给专业和非专业的编程人员使用的,为了适应非专业的程序员,有些方面多少有些不太严格。
ECMAScript最初的设计是一种网页脚本语言,它为浏览器中网页更活跃提供一种机制,并且,在基于WEB的C/S结构中做呈现服务端计算的这部分操作。ECMAScript可以为各种宿主环境提供核心的脚本性能,因此,本文档指定的核心脚本语言是与所有那些特定宿主环境分离的。
在ECMAScript中的一些设施和其他一些在使用的编程语言类似,如Java和Self,在这些地方有所描述: Gosling,James,Bill Joy和Guy Steele,The Java Language Specification.1996年Addison Wesley出版社。 Ungar,David,Smith和Randall B,Self:The Power of Simplicity.OOPSLA 87会议论文第227-241页,1987年10月Orlando FL.
网页浏览器提供了一个ECMAScript的宿主环境,用以包含客户端计算。比如,它提供了windows,menus,pop-ups, dialog boxes,text areas,anchors,frames,history,cookies和input/output等对象。此外,该宿主环境还提供了一些绑定脚本代码到事件的方法,如焦点的改变,页面和图像的加载、卸载,错误、忽略,选区,表单提交,鼠标行为等等。脚本代码出现HTML代码中,显示出来的页面由用户接口元素和处理过的文本和图像组成。脚本代码和用户接口发生交互响应而不需要主程序。
网页服务为服务端计算提供了一个不同的宿主环境,包括的对象有requests,clients,files和锁定共享数据的机制。同时使用浏览器端脚本和服务端脚本,通过在客户端和服务端分散计算,使得为用户接口提供一种基于WEB的应用程序成为可能。
所有支持ECMAScript的WEB浏览器和服务,都有自己的宿主环境用于完成ECMAScript的执行环境。
下面是ECMAScript的概要信息(部分),此概述并非标准中的概述。
ECMAScript是基于对象(object-based)的:基本语言,宿主提供对象,ECMAScript程序就是一个对象交互的聚合。 ECMAScript对象(object)的properties是一个无序的集合,有0个或多个属性(attributes)决定哪些property可用,比如,当某个property的ReadOnly属性被设置为true时,任何企图改变该property值的代码将没有效果。properties 是一个包含其他对象的容器,原始值(primitive values)或方法(methods)。原始值属于下列内置(built-in)类型中的一员:Undefined,Null,Boolean,Number和String;对象则是内置类型Object;方法是一个通过property关联到对象的函数。
ECMAScript定义了一个内置对象(built-in objects)集合,使得ECMAScript实体更完善。这些内置对象包括Global 对象,Object对象,Function对象,Array对象,String对象,Boolean对象,Number对象,Math对象,Date对象, RegExp对象和错误对象:Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError。
ECMAScript也定义了一个内置操作符的集合或者说不是,严格地说,是函数和方法。ECMAScript操作符包括了各种一元运算符、乘除运算符、加减法运算符、位移运算符、关系运算符、相等运算符、二元运算符、二元逻辑运算符、分配运算符和逗号运算符。
ECMAScript的语法类似Java的语法。ECMAScript语法宽松是为了使它能够成为更容易使用的脚本语言。比如,变量不需要申明类型也不需要为properties指定类型,函数定义也可以不需要出现在它们的调用语句之前。
ECMAScript没有像C++,Smalltalk,Java等语言中的真正的类,但是支持构造器(constructors),它在执行代码时创建对象,为对象分配内存并初始化它们全部或部分初始值和properties。所有的构造器都是对象,但不是所有对象都是构造器。每个构造器都有一个Prototype属性用于实现基于原型的继承(prototype-based inheritance)和属性共享(shared properties)。对象在构造器使用new表达式时被创建,比如,new String("A String")创建了一个新的字符串对象。不用new表达式去直接调用一个构造器,结果将依赖于这个构造器,比如,String("A String") 产生一个原始值String,而不是一个对象。
ECMAScript支持基于原型的继承。所有构造器都有一个相关联的原型,所有由构造器创建的对象都隐含一个到该原型的引用(称为对象原型),此外,一个原型可能有一个非空的、隐含的引用,到它的原型,所以,这又被称为是原型链(prototype chain)。当一个引用来自一个对象的property时,它会去该对象和它的原型链中查找与该property 同名的属性,换句话说,会先直接从该对象中检测是否存在这个同名的引用,如果有,则返回,否则,再从该对象的原型(prototype)中去检测是否存在该引用。
在基于类的面向对象语言里,通常,状态由实例持有,方法由类持有,继承只有结构和行为。在ECMAScript中,状态和方法由对象持有,结构、行为和状态都可以被继承。
对象通常都不会直接包含那些由原型包含共享的属性和值。描述见下图:

CF是一个构造函数(同时也是一个对象)。通过对它进行new表达式创建了5个实例对象:cf1,cf2,cf3,cf4,cf5。每个实例对象都包含有q1和q2两个属性。虚线表示隐含的原型关系,所以,比如,CF的原型是CFp,构造函数CF自己有两个属性P1和P2,它们对CFp,cf1,cf2,cf3,cf4,cf5都不可见。CFp的属性CFP1由cf1,cf2,cf3,cf4,cf5共享(不包括 CF),还有那些在CFp的隐含的原型链中找到的property name不是q1,q2或者CFP1的其他属性。注意,CF和CFp之间不存在隐含的原型联系。
不像基于类的对象语言,这里的属性可以由对象动态添加并赋值。因为,构造器不需要名字,或者给构造出的对象的所有或部分属性赋值。如上图,只要为CFp添加一个属性值即可由cf1,cf2,cf3,cf4,cf5共享。
以下是ECMAScript中主要术语的非正式定义。
type是数据值的集合
原始值是Undefined,Null,Boolean,Number,String这些类型的成员。原始值是语言实现中底层可以直接表示的数据。
对象是Object类型的成员。它所包含的所有属性成员,如原始值、对象或者函数,是一个无序的集合。对象属性成员放置的函数又被称为方法。
构造器是一个函数对象用来创建和初始化对象。每个构造器都有一个关联的原型对象用来实现属性成员的继承和共享。
ECMAScript中的原型是用来实现对象结构、状态和行为继承的。当一个构造器构造了一个对象,这个对象会隐含地引用到该构造器关联的原型,为了解析属性的引用。构造器的关联的原型可以通过程序表达式constructor.prototype 来引用。在某个共享的对象的原型上添加的属性值,通过继承,可以被所有其他对象共享。
原生对象是由ECMAScript的实现提供的,独立于宿主环境。标准的原生对象会在本说明中定义。其中有些原生对像又是内置对象,其他的那些则可能在执行一个ECMAScript程序时产生。
内置对象由ECMAScript的实现提供的,独立于宿主环境,出现在ECMAScript程序开始执行的时候。标准的内置对象会在本说明中定义,一些ECMAScript的实现可能有其他的说明和定义。所有的内置对象都是原生对象。
宿主对象由给ECMAScript提供完整执行环境的宿主环境提供的。任何对象,不是原生对象,就是宿主对象。
未定义值是一个原始值,当一个变量没有被分配值时使用。
Undefined类型有一个正确的值,undefined。
空值是一个原始值,它表示空的,没有的,或不存在的引用。
Null类型有一个正确的值,null。
布尔值是Boolean类型的成员,它只能是两个唯一值中的一个,true或false。
Boolean类型表示一个逻辑实体,由两个唯一值组成。一个是true,另一个是false。
Boolean对象是Object类型的成员,它是内置对象Boolean的实例。意思是,一个Boolean对象是通过Boolean构造器的 new表达式创建,提供一个boolean参数。结果对象有一个隐含的(未命名)原型boolean。一个Boolean对象支配一个 Boolean值。
字符串值是String类型的成员,它是一个有限的有序的,由0到16位无符号整数长度的值。注意:尽管每个值通常都表示一个单独的16位的UTF-16文本的单元,但该语言不会做出任何限制和要求当这个值不是 16位无符号整数的情况时。
String类型是所有字符串值的集合。
String对象是Object类型的成员,它是内置对象String的实例。意思是,一个String对象是通过String构造器的new 表达式创建,提供一个字符串参数。结果对象有一个隐含的(未命名)原型string。一个String对象可以支配一个字符串值,通过调用String构造器(参见15.5.1)。
数字值是Number类型的成员,它是一个直接表示的数字。
Number类型是表示数字的值的集合。在ECMAScript中,该集合表示IEEE754的64位双精度运算格式的值,包含一个特殊值"Not-a-Number"(NaN),正无穷大和负无穷大。
Number对象是Object类型的成员,它是内置对象Number的实例。意思是,一个Number对象是通过Number构造器的new 表达式创建,提供一个数字参数。结果对象有一个隐含的(未命名)原型number。一个Number对象可以支配一个数字值,通过调用Number构造器(参见15.7.1)。
原始值Infinity表示一个正无穷大的数字,Number类型成员。
原始值NaN表示IEEE标准"Not-a-Number"值的集合,Number类型成员。
回复
]4.3.3 - 对象属性成员放置的函数又被"成"为方法
上一篇
下一篇

文章来自:
Tags: 





