ECMAScript262语言规范(第4章)

ECMAScript262语言规范(第4章)

4 概览(Overview)

本章节是对ECMAScript 语言的非规范性概览。

ECMAScript是一个基于对象的、主要在宿主环境里执行和操作计算对象的编程语言。它并不是为满足自我计算而发明的。实际上,在本规范里也没有定义外部数据输入和计算结果输出。它有别于其他可以独立运行的语言。ECMAScript脚本程序希望其执行环境提供规范里描述的必要的对象及条件,特别是具体环境的宿主对象(hostobjects)。这些宿主对象和环境的描述和特性已超出本规范的范围,但需要指出的是它们提供了一些可供ECMAScript脚本程序使用的属性(properties)和可调用的函数(functions)。

脚本语言是一门操作、控制和自动化处理一个已存在的系统里资源的编程语言。在这些系统里,有用的功能已近通过用户接口提供了,而脚本语言则是控制或揭示这些功能的一种机制。已存在的系统提供宿主环境来给与脚本语言生存空间。脚本语言被发明给专业的程序员和非专业程序员使用。

ECMAScript最初被设计才一门网页脚本语言(Web scripting language,),提供一种机制来使得网页更鲜活和基于web的CS架构的服务器端得计算。ECMAScript能提供核心的脚本功能给许多宿主环境,因此,本规范里定义是核心的脚本语言而不是任何特定的环境。

ECMAScript的一些特性和其他的语言相似,特别是java:

Gosling, James, BillJoy and Guy Steele. The Java™ Language Specification. Addison WesleyPublishing Co., 1996.

Ungar, David, andSmith, Randall B. Self: The Power of Simplicity. OOPSLA '87 ConferenceProceedings, pp. 227–241, Orlando, FL, October 1987.

IEEE Standard for the Scheme Programming Language. IEEE Std1178-1990.

 

4.1 网页脚本(Web Scripting)

浏览器提供给ECMAScript 一个用于在服务器端计算的宿主环境,它包括一些对象如:用于显示的窗口(windows)、菜单(menus)、弹出框(popups)、对话框(dialog boxes)、文本域(text areas)、锚点(anchors),、帧(frames)、 历史(history)、 cookies和输入输出(input/output)。而且,宿主环境提供一种方式将脚本与事件相联系,比如聚焦(focus)、页面和图片加载及卸载( page and image loading, unloading)、错误和中断(error and abort)、选择(selection),、表单提交(form submission)和鼠标动作( mouse actions)。脚本一般作为一个用户接口元素出现在HTML和显示页面中,对文本和图片做操作,主要对用户的行为做反映,它不需要main函数。

Web服务器提供另一个不同的宿主环境来做服务器端的计算,包括请求和响应、文件处理、数据共享和锁定。通过客户端和服务器端联合,可以提供给用户一个基于web的应用。每个支持ECMAScript语言的浏览器和服务器都必须提供ECMAScript的执行环境。

4.2语言概况( Language Overview)

下面是ECMAScript语言的非完整型概览。

ECMAScript是基于对象的:通过对象提供基础语言和宿主资源。一个ECMAScript脚本程序是一些通信对象(communicatingobjects)的集合,一个ECMAScript对象是一些属性(properties)的集合,每个属性都有0个和多个 特性(attributes)来决定这个属性如何被使用—例如,当可编辑特性(Writable attribute)被定义为false时,任何修改该属性(property)的尝试都会失败。Properties包括其他对象(objects),原始值(primitive values)或函数(functions)。原始值是下面其中一种内置类型:Undefined,Null,Boolean,Number,和String。对象是的内置类型的一种,而函数是可调用的对象。被当做一个对象的属性的函数是一个方法method。

ECMAScript定义了一个内置对象(built-in objects)集合,它包含全集对象(Global object)、 Object对象(object),、 函数对象(Functionobject)、 数组对象(Arrayobject)、 字符串对象(Stringobject)、 布尔对象(Booleanobject)、 数字对象(Number object)、 算术对象(Mathobject)、 日期对象(Dateobject)、正则表达式对象(RegExpobject)、JSON object、错误对象( Error objects(包括Error, EvalError,RangeError, ReferenceError, SyntaxError, TypeErrorURIError))。

ECMAScript 还定义了一些内置的操作符(built-in operators),包括一元运算符( unaryoperations) 、乘法运算符(multiplicativeoperators)、加法运算符( additiveoperators)、位运算符( bitwiseshift operators)、关系运算符(relational operators)、 比较运算符(equality operators)、二进制位运算符( binarybitwise operators)、二进制逻辑运算符( binarylogical operators)、赋值运算符(assignment operators)和逗号运算符( thecomma operator.)

ECMAScript 的语法很像java,但是它书写比较宽泛,不那么严格。例如一个变量不需要声明和类型定义,函数(function)不需要先声明再使用。

4.2.1对象(Objects)

ECMAScript不像 C++, Smalltalk, 和Java那样使用class来定义类. 相反,对象可以由多种途径生成,如通过文字符号(literal notation)或构造方法(constructors),构造方法可以初始化部分和全部值及属性。每个构造方法都是一个Function,并且必有一个叫prototype 的属性,用来实现基于prototype 的继承(prototype-based inheritance)和共享属性(shared properties). Objects用new表达式来创建,如new Date(2009,11)产生一个新的Date对象。调用一个构造方法但是不用new产生的结果由构造方法,如Date()产生一个当前日期而不是一个新对象。

每个由构造方法创建的对象都有一个对构造方法的prototype属性的隐含的参考(叫对象的prototype)。而且prototype可能有一个对其prototype的非空的隐含的参考,这就叫prototype链。当一个引用成为一个对象的属性时,首先查找prototype链的第一对象,如果这个对象有这个属性,那么引用的就是这个属性,如果没有,就会查找prototype链的下一个对象,如此类推。

在一个基于类的和面向对象的语言中,状态由实例承载,方法由类承载,继承的只是结构和行为。而在ECMAScript 中,状态和方法都会被对象(objects)承载,结构、行为和状态都能被继承。


所有的对象都不直接包含由其prototype包含的特定的属性和值, 图1说明了这些:

CF是一个构造函数(同时也是一个对象),五个对象通过new表达式由其创建,分别为cf1、cf2、cf3、cf4和cf5,它们每个都有2个属性,分别为q1和q2。虚线代表了prototype的隐式关系,比如cf3的prototype是CFp,构造函数CF有2自己的个属性P1和P2,它们对于CFp、cf1、cf2、cf3、cf4和cf5都是不可见的。CFp的属性CFp对于cf1、cf2、cf3、cf4和cf5是共享的(但对CF不是)在CFp的prototype链里没有q1、q2或CFP1,因为在CF和CFp中没有prototype链。

.不像基于类的面向对象的语言,在JavaScript里属性可以动态的被加载进去。这就是说构造方法不需要定义所有的属性,在上面的图中,可以通过加一个新的属性给CFp来加一个新的属性给 cf1、cf2、cf3、cf4和cf5。

 

4.2.2 ECMAScript语言的严格变种(The Strict Variant ofECMAScript)

ECMAScript语言认识到一些语言的使用者希望限制使用语言的某些特性,他们这样做可能是考虑到一些安全特性,避免一些他们认为是容易出错的特点(features,),得到增强的错误检查,或其他原因。基于这些可能性,ECMAScript定义了语言的严格变异,这个严格的变异排除了一些特殊的语法和语义特性,并且修改了详细的语义特征,这个严格的变异同时指出一些而外的错误必须被抛出。

这个严格的变异通常被称为语言的严格模式(strict mode),严格模式下使用严格的语法和语义

 

4.3 定义(Definitions)

基于本文档的目的,如下目录和定义被提供。

4.3.1  类型(type)

见第八章。

4.3.2  原始值(primitivevalue )

类型Undefined, Null, Boolean, Number 和String中的一个,见第八章。

备注:原始值是由语言最低级别的实现直接表达的。

4.3.3  对象(object)

类型Object

备注:一个object是一个属性的集合且含有一个prototype对象,其prototype对象可能是null。

4.3.4  构造函数(constructor)

是一个Function对象,用于创建并初始化对象

备注:构造函数的prototype属性是一个prototype对象,用于实现属性继承和共享。

4.3.5  原型(prototype)

为其他对象提供共享属性的对象

备注:当用构造函数创建对象时,

 

4.3.6  原生对象(nativeobject)

由本语言规范定义而非宿主环境定义的对象

备注:标准的原生对象由本语言规范定义。有一些是内置对象,有一些是在可在程序中执行的构造函数。

4.3.7  内置对象(built-inobject)

由ECMAScript实现,独立于宿主环境,在脚本程序被执行前就提供了

备注:标准的内置对象由本语言规范定义,不同的ECMAScript语言的实现可能不一样。所有内置对象都是原生对象。内置构造函数(built-in constructor)是一个内置对象同时也是一个构造函数。

4.3.8  宿主对象(hostobject)

由宿主环境提供,用于实现ECMAScript的对象运行的对象

备注:一个对象非原生对象(native object)即宿主对象(host object)

4.3.9  未定义值(undefinedvalue)

原始值,当一个对象未被赋值时,它的值就是undefined

4.3.10  未定义类型(Undefinedtype)

一种类型,其独有值为undefined value

4.3.11  空值(null value)

原始值,表示没有引用任何对象值

4.3.12  空类型(Null type)

一种类型,其独有值为Null value

4.3.13  布尔值(Booleanvalue)

布尔类型的值

备注:仅有2个布尔型值true和false

4.3.14  布尔型(Booleantype)

布尔值true和false的类型

4.3.15  布尔对象( Booleanobject)

类型的一种,标准内置Boolean构造函数的一种实例

备注:布尔对象都是由Boolean构造函数通过new表达式创建的,提供一个布尔值作为参数。结果值是一个值为布尔型值的内部属性。一个布尔型对象可以被强转为布尔型值。

4.3.16  字符串值(Stringvalue)

原始值,由0个和多个16位无符号整数组成的有限序列

备注:字符串值是字符串类型的,在序列里的每一个整数代表一个16比特单元的UTF-16文本(text),所以,ECMAScript不能表示任何非严格定义的不是由16比特无符号数字代表的值。

4.3.17  字符串类型(Stringtype)

所有可能的字符串值的集合(set)

4.3.18  字符串类型(Stringobject)

标准内置字符串构造函数的一种实例

备注:字符串对象由字符串构造函数通过new表达式创建,提供一个字符串值作为属性,结果对象是一个值为字符串值的内部属性。字符串对象可以通过String构造函数强制转换为字符串值。

4.3.19  数字值(Numbervalue)

原始值,对应于一个双精度、64比特2进制的IEEE 754值

备注:数字值是数字类型的,直接代表一个数。

4.3.20 数字类型(Number type)

所有可能的数字值的集合(set),其中包括一个特殊的NaN值(Not-a-Number)以及正无穷大和负无穷大

4.3.21 数字对象(Number object)

一种对象,标准内置数字构造函数(Number Constructor)的实例

备注:数字对象由数字构造函数(Number Constructor)通过new表达式创建,提供一个数字值做参数。结果值是一个数字类型的值。数字对象可以通过数字构造函数强制转换为数字值。

4.3.22  无穷(Infinity)

数字值,正是无限多值。

4.3.23 不是数字(NaN)

数字值,在IEEE 754里是不是数字(Not-a-Number)

4.3.24  函数(function)

对象的一种,标准内置构造函数Function的一个实例,可以作为一个子程序调用

备注:除了其生命的属性(properties),函数包括可执行的代码和状态(其被调用时的行为)。函数的代码可能是ECMAScript编写的,也可能不是。

4.3.25 内置函数(built-in function)

内置对象,是一个函数

备注:内置函数包括parseInt和 Math.exp。ECMAScript的实现里可能提供本标准没有定义的内置函数。

4.3.26  属性(property)

键值对,对象的一部分

备注:根据属性形式的不同,其值可能直接是一个数据(一个原始值,一个对象或函数对象)或者是非直接的一对访问函数

4.3.27  方法(method)

函数,一个属性值

备注:当一个函数被作为一个对象的方法调用时,这个对象将这个函数当做它的值

4.3.28 内置方法(built-in method)

方法,一个内置函数法

备注:本规范定义的标准的内置方法,ECMAScript的实现可能提供其他的内置方法

4.3.29 特性(attribute)

一个属性的内在的一些特征值定义。

4.3.30 自身属性(own property)

属性,直接被其对象包含的。

4.3.31  继承的属性(inheritedproperty )

非自身属性,而是其prototype对象(prototype自身的或由prototype继承的)的属性


你可能感兴趣的:(javascript)