Standard ECMA-262 5.1 Edition / June 2011 重要部分翻译

ECMA-262,5rd

4.2 语言概述

下面是一个ECMAScript非正式的概述,并非语言的所有部分都被阐述。这概述不属于标准文献章节的一部分。

ECMAScript是基于对象的:基本的语言和宿主能力被对象提供,ECMAScirpt程序是对象间交流的集合。对象是一个无序的属性集合,每个属性又拥有零个或者多个子属性,这些子属性决定先前的父属性能够被使用----比如,当一个父属性的子属性被设置为true时,任何想通过执行ECMAScript代码而改变这个父属性都是无效的。属性是一种容器,这种容器包含了其它对象,原生值,或者方法。一个原生值是下面内建类型的成员:UndefinedNullBooleanNumber,和String;一个对象是内建类型Object的成员;方法是函数,这个函数能够通过对象内部属性与对象建立关联。

ECMAScript 定义了一个内建对象集合,这些内建对象圆满完成了定义这个ECMAScirpt实体。这些内建对象包括Global对象,Object对象,Function对象,Math对象,Date对象,RegExp对象和错误对象ErrorEvealErrorRangeErrorreferenceErrorSyntaxErrorTypeErrorURLError

ECMAScript也定义了一个内建运算符集合。这些内建运算符严格上来说也许不是函数或者方法。ECMAScript 运算符包括各种各样的一元运算符,多元运算符,叠加运算符,位移运算符,关系运算符,相等运算符,二进按位运算符,二进制逻辑运算符,分配运算符和逗号运算符。

ECMAScript 语法有意地与JAVA语法相似。ECMAScript语法作为一门对于服务端语言较容易使用的脚本语言是不严格的。比如,一个变量不需要申明与属性有关的类型,定义一个函数不要求申明在调用它之前的位置。

 

4.2.1 对象

ECMAScript 不包含像C++Smalltalk,或者Java真正的类,但它有相当的,被支持的构造器。构造器通过执行代码为对象分配存储空间并且通过对他们的属性分配初始化值来初始化这些对象的所有或者一部分。所有的构造器是对象,但并不是所有的对象都是构造器。每个构造器拥有Prototype属性,这个属性用于实现“基于Prototype”的继承和共享想属性。可以用New表达式来使用构造器创建对象;比如,new String(“A String”) 创建一个新的字符串对象。不使用new调用一个构造器将会产生一个影响,这个影响由构造器决定。比如,String(A String)产生一个原生字符串,不是一个对象。

ECMAScript 支持“Prototype-based”继承。每一个构造器有一个相关联的Prototype,每一个被构造器创建的对象有一个暗藏的引用(被叫做对象的Prototype)指向这个构造器的Prototype。除此之外,构造器的这个Prototype对象有可能也有一个非空的引用指向构造它的构造器的Prototype。以此类推,这就被称作原型链。当一个引用被作为一个对象的属性,对于这个对象属性的引用会命名在原型链的第一个对象,这个对象会包含一个相同名字的属性。换句话来讲,被提及的第一个对象会直接被检测是否包含一个属性;如果那个对象包含被命名属性,那么这个属性就是这个引用指向的对象的属性。如果那个对象不包含这个已命名的属性,那个对象的属性将会接着在下一个对象中查找。如此一直找下去。

在一个基于类面向对象的语言中,一般来说,状态由实例左右,方法由类左右,继承的仅仅是结构和行为。在ECMAScript中,状态和方法都是被对象左右,并且结构,行为和状态全部会被继承。

所有那些不会直接包含一个特殊属性(这个属性会由那些对象的属性包含)的对象会共享他们的属性和属性的值。图解说明如下:

CF 是一个构造器(也是一个对象)。5个对象已经被new表达式创建cf1cf2cf3cf4 cf5。这5个对象中的每一个对象包含一个属性被命名为q1q2。虚线表示隐藏的原型关系;例,cf3的原型是CFp。这个构造器为CFCF自己拥有两个属性,被命名为P1P2,每一个对于CFpcf1cf2cf3cf4cf5都是不可见的。这个在CFp中被命名为CFP1的属性是被cf1cf2cf3cf4cf5共享(但不被CF共享),因而是任何的属性都能在CFP隐藏的原型链中被找到,这个原型链没有被命名q1q2CFP1。注意这里没有隐藏的属性链接在CFCFp之间。

与基于类对象语言不同,ECMAScript 属性能够通过分配值而被动态地添加到对象中。那是因为构造器没有依赖于名字和属性的值去构造对象的全部和部分属性。在上面的图解中,对于cf1cf2cf3cf4中的任意一个对象增加了一个新的共享的属性,那么cf5就会通过CFp中的属性被分配了一个新值。

 

 

10、可执行代码和执行上下文

10.1、可执行代码的类型

ECMAScript可执行代码有三种类型:

全局代码是源程序正文,它被当作ECMAScript程序。部分程序的全局代码没有包含任何源程序正文,这些源程序正文被解析为FunctionBody的一部分。

Eval代码是源程序正文,这个源程序正文被内建eval函数支持。更精确地来说,如果内建函数eval的参数是一个字符串,那么这个字符串将被当作ECMAScript程序。被eval函数特殊调用的eval代码是程序全局代码的一部分。

函数代码是源程序正文,这个正文被解析为FunctionBody的一部分。特定的FunctionBody的函数代码不包括任何源程序正文,这些正文被解析为嵌套FunctionBody的一部分。当作为构造器使用内建Function对象的时候,Function代码也表现为一种源程序正文。更准确地说,最后一个参数提供给Function构造器是被转换为一个字符串并且把它作为FunctionBody。如果不只一个参数提供给Function构造器,那么所有的参数除了最后一个会被转换为字符串并且链接在一起,被逗号分开。这个结果字符串将被翻译为靠最后一个参数定义的FunctionBodyFormalParameterList

Function特殊实例的函数代码不包括任何被解析作为嵌套 FunctionBody一份部分的源程序代码。

 

10.2、词法环境

词法环境是一种规格类型,这种类型被用于定义标识符集合,这些标识符是用于标识特殊变量和基于ECMAScript代码词法嵌套结构的函数的。一个词法环境由Environment Record和可能为空的指向外层词法环境的引用组成。通常,词法环境是与ECMAScript代码的一些特殊句法相关,比如FunctionDeclaration

WithStatement,或者TryStatementCatch从句。一个新的词法 环境将被创建当以上这些代码被评估执行时。

 

Environment Record记录这个标识符绑定,标识符绑定由相关联的词法环境的scope创建。

外层词法环境引用是用于模块化词法环境逻辑上嵌套值。一个内层词法环境的外层引用指向的词法环境逻辑上包围内存的词法环境。一个外层的词法环境也许,当然,拥有它自己的外层词法环境。一个外层词法环境也许作为一个词法环境服务于多个内层词法环境。比如,如果FunctionDeclaration包含两个嵌套FunctionDeclarations,那么这每个内层嵌套的函数的词法环境将把外层函数当前执行的词法环境作为他们的外层词法环境。

词法环境和Environment Record值是纯粹的规格机制,不必与任何指定的ECMAScript实现一致。对于ECMAScript程序,很有可能直接访问或者操作以上值。

 

10.2.1 Environment Record

有两种Environment Record值在规格中被使用:Declaration Environment Recordobject Environment RecordsDeclaration Environment Records是用于定义这种ECMAScript语言语句元素的结果。这些元素是FunctionDeclarations,VariableDeclarations,Catch子句,这个子句是直接与带有ECMAScript语言值语句标识绑定相关。Object Environment Record是用于定义这种ECMAScript元素结果,这些元素是ProgramWithStatement(与带有一些对象的属性标识符绑定有联系)。

从规格的意图来看,Environment Record值可能被看作一种以简单基于对象的集团存在。在这种集团中,Environment Record是一个虚拟的类,它下面有两个具体子类,他们是declarative Environment Recordobject Environment Record。这个虚拟的类包括在Table17中定义的虚拟规格方法。对于每一个具体子类,这些虚拟方法有不同的具体算法。

 

 

11、表达式

11.1.4、 Array Initialiser

Array initialiser 是一个表达式,这个表达式描述了一个数组对象初始化,这个表达式由以一个正式的字面文字写。它是一个有零个或者更多表达式的列表,每个表达式表示一个数组元素,被附上正方形括号。元素不需要字面上的文字。他们在数组初始化者被评估执行时被评估执行。

数组元素也许被忽略在开始,中间,或者列表的的结尾。当元素中列表中的逗号不在一个AssignmentExpressioni.e.,一个逗号在另一个逗号开始或者后面),这缺少的数组元素将算在数组的长度并且增加后来元素的索引。被忽略的数组元素没有被定义。如果一个元素被忽略在一个数组的结尾,这个元素将不会算在这个数组的长度。

ArrayLiteral :

[ Elisionopt ]

[ ElementList ]

[ ElementList , Elisionopt ]

ElementList :

Elisionopt AssignmentExpression

ElementList , Elisionopt AssignmentExpression

Elision :

,

Elision  ,

 

语义:这个产物ArrayLiteral[ Elision opt] 将如下被评估执行:

1.让array为创建一个新对象的返回值,创建一个新对象的表达式就像new Array(),在这当中,Array是一个标准的带名字的内建构造 器。

2.Pad为评估执行Elision的结果;如果不存在,用数字值0.

3.以参数“lenth”,padfalse调用array的内部方法[[Put]]

4.返回array

这个产物ArrayLiteral:[ElementList]如下评估执行:

1.返回这个评估执行ElementList的结果。

这个产物ArrayLiteral[ElementList, Elisionopt]被如下评估执行:

1.让array为评估执行ElementList的结果。

2.让pad为评估执行Elision的结果;如果不存在,用数字0

3.让len为以参数“length”调用array内部方法[[Get]]的结果。

4.以参数“length”,ToUint32(pad+len),和false调用array的内部 方法[[Put]]

5.返回 array

 

产物 ElementListElisionopt  AssignmentExpression 被如下评估执行:

1.让array为创建一个新对象的结果,创建新对象就像通过表达式 new Array (),在其中,Array是相应名字的标准的内建构造器。

2.让firstIndex为评估执行Elision的结果。如果不存在,用数字0

3.让initResult为评估执行AssignmentExpression的结果。

4.让initResultGetValue(initResult)。

5.以参数ToString(firstIndex),Property  Descriptor{[[Value]]:initValue,[[Writable]]:true,[[Enumerable]]:true,[ [Configurable]]:true}false调用array的内部方法 [[DefineOwnProperty]]

6.返回 array

 

产物ElementList:ElementList,Elisionopt AssignmentExpression是被如下评估执行:

1.让array为评估执行ElementList结果。

2.让pad为评估执行Elision的结果;如果不存在,用数字0

3.让initResult为评估执行AssignmentExpression的结果。

4.让initValueGetValue(initResult)

5.让len为以参数“length”调用array内部方法[[Get]]的结果。

6.以参数ToString(ToUin32((pad+len))Property Descriptor  {[[Value]]:initValue,[[Writable]]:true,[[Enumerable]]:true,[[Configura ble]]:true},和false调用array内部对象[[DefineOwnProperty]]

7.返回 array

 

产物ElisionElision,是被如下评估执行:

1.让preceding为评估调用Elision的结果。

2.返回preceding+1

注意:[[DefineOwnProperty]]是用于确认arrayown属性是被定义。即使标准内建Array Prototype object已经以一个管理身份修改过。这个管理员将排除使用 [[Put]]新建的own属性。

 

11.1.5Object Initialiser

Object initaliser是一个描述用正式的类是字面文字来写的对象的初始化。它是一个成对的属性名和相关的值的列表,附上大括号。这个值可以不是文字;他们将在Object initialiser每次被评估执行时被评估执行。

语法:

ObjectLiteral :

{ }

{ PropertyNameAndValueList }

{ PropertyNameAndValueList , }

PropertyNameAndValueList :

PropertyAssignment

PropertyNameAndValueList , PropertyAssignment

PropertyAssignment :

PropertyName : AssignmentExpression

get PropertyName ( ) { FunctionBody }

set PropertyName ( PropertySetParameterList ) { FunctionBody }

PropertyName :

IdentifierName

StringLiteral

NumericLiteral

PropertySetParameterList :

Identifier

 

语义:

产物ObjectLiteral:{}如下被评估执行:

1.返回新创建的对象就好像通过表达式new Object()一样,在 其 中,Object是具有同名的标准的内建构造器。

 

产物Obejct:{PropertyNameAndValueList }和ObejctLiteral:{PropertyNameAndValueList,}被如下评估执行:

1.返回这个评估执行PropertyNameAndValueList的结果。

 

产物PropertyNameAndValueListPropertyAssignment如下被评估执行:

1.返回新创建的对象就好像通过表达式new Object()一样,在 其 中,Object是具有同名的标准的内建构造器。

2.propidPropertyAssignment的评估执行结果。

3.以参数propid.name,propId.descriptor,false调用obj的内部对象 [[DefineOwnProperty]]

4.返回obj

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15、标准内建ECMAScript对象

在一段ECMAScript程序开始执行前,这里无论如何都会有一个可用的内建对象存在。一个对象(全局对象)是可执行程序词法环境的一部分。其它对象的是作为全局对象可访问的对象存在。

除了特殊指定外,如果那个内建对象有一个内部属性[[Call]],这个内建对象的内部属性[[Class]]就是“Function”,或者如果那个内建对象没有内部属性[[Call]],那么这个内建对象的内部属性[[Class]]就是“Object”。除特殊指定外,内建对象的内部属性[[Extensible]]初始地会有一个值true

很多内建对象是函数:他们可能会伴随着参数被调用。有些并且是构造器:他们是一些以new运算符作为使用意图的函数。对于每一个内建函数,规格描述的这些参数被函数和Function对象的属性依赖。对于每一个内建构造器,规格还要描述一些属性,这些属性是一个原型对象,这个原型对象是构造器和特殊实例的属性,这个特殊实例是一个new表达式所调用的构造器所返回的值。

除非别的指定外,在一个特殊函数的描述中,如果一个函数或者构造器被一个比这个函数所指定的参数还少的参数条款描述。这个函数或者构造器将会完全地表现为他好像已经被给出了足够的附加参数,这些参数每一个都是undefined值。

除了特殊指定外,在一个特殊的函数描述中,如果一个函数或者构造器被以比允许的参数多的参数条款描述,这些额外的参数会在函数调用被评估,然后被函数忽略。然而,实现可以定义执行特定的行为有关,只要行为不抛出TypeError异常,这个异常是明确地基于这个额外参数的出现上的。

注意:对于内建函数集合增加附加能力的这种实现是被鼓励通过向现有的函数增加新的函数而不是增加新的参数。

每一个内建函数和每一个内建构造器有Function原型对象。这个原型对象是这个表达式Function.prototype15.3.4)的初始化值,也是它的内部属性[[Prototype]]的值。

除非特殊指定,每一个内建原型对象有Object原型对象。这个原型对象是这个表达式Object.prototype(15.2.4)的初始化值,也是它的内部属性[[Protoytpe]]的值,除了这个Object原型对象它自己。

没有一个内建函数被这样的条款描述,条款中内建函数是没有构造器将会实现这个内部方法[[Construct]],除了在没用特殊指定的特殊函数表述中。没有内建函数会以这样的条款描述,条款中内建函数会有一个prototype属性除了在没用特殊指定的特殊函数表述中。

当一个构造器是作为一个函数被调用并且当它被调用作为new表示的一部分时,条款通常会描述明确的行为。这个作为一个函数被调用的行为与调用构造器的内部方法[[Call]]是一致的。而作为new表达式的一部分的行为与调用构造器[[Construct]]内部方法是一致的。

每个内建Function对象以这样的条款描述:无论是作为一个构造器,一个平凡的函数,或者两者,都有一个length属性,length属性的值是一个integer。除了特殊指定外,这个值等于被命名参数的最大值数量,这些参数以函数描述的子条款显示,包括可选参数。

注意:例如,是String原型对象的slipce属性初始化值的Function对象以子条款“String.prototype.slice(start,end)”描述,这个子条款显示两个已命名参数,starend;因此Function对象的length属性值是2

在每个例子中,这个内建Function对象的length属性以这样的条款描述:这个length属性拥有一些字段属性{[[Writable]]false[[Enumerable]]false[[Configurable]]:false}。除了其它特殊指定外,每个其它的属性以这样的条款描述:属性有这些字段属性值{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true}

 

15.1、全局对象

独特的全局对象将会在操作装置进入任何执行上下文以前被创建。

除了特殊指定,全局对象标准的内建属性有字段属性{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:true}

全局对象没有[[Construct]]内部属性;它不可以作为可以使用new操作符构造器来使用。

全局对象没有[[Call]]内部属性;它不可以像函数一样被调用。

全局对象的内部属性[[Prototype]][[Class]]值是互相依赖实现的。

除了属性定义在规格中,全局对象也许有新增的host定义属性。这也许包括一个属性,这个属性的值是全局对象自己;比如,在HTML文档对象模型中,全局对象的window属性是全局对象它自己。

 

15.2Object Objects

15.2.1Object Consructor 作为一个Function被调用

Object作为一个函数被调用而不是一个构造器被调用是,它会发生一个类型转换。

15.2.1.1 Object([value])

Object函数不带参数,或者带一个参数值被调用时,以下的步骤将执行:

1.如果值为nullundefined或者不被支持,创建并返回一个new Object对象完全就好像标准的内建Object constructor被以同样的参数(15.2.2.1)被调用。

2.返回 ToObject(value)

 

15.2.2、 Object Constructor 

Object被作为一个new表达式被调用,它就是一个也许会创建对象的构造器。

15.2.2.1、 new Object([value])

Object Constructor以不带参数或者带一个参数值被调用,这下面的步骤就执行:

1.如果值是支持的,就

A.如果Typevalue)是Object,就

I.如果值是一个本地ECMAScript对象,不创建一个新的对象,而是直接返回值。

II.如果值是一个host对象,行为动作就发生并且一个结果将被返回在一个依赖实现管理,管理也许依靠host对象

B.如果Type(value)String,返回 ToObject(value)

C.如果Type(value)Boolean,返回ToObject(value)

D.如果Type(value)Number,返回toObject(value)

2.断言:参数值不是一个受支持的类型,或者它的类是是Null或者Undefined.

3.让obj成为一个新的创建的的本地ECMASCript对象。

4.设置obj[[Prototype]]内部属性为标准的内建Object原型对象(15.2.4)。

5.设置obj[[Class]]内部属性为“Object”。

6.设置obj[[Extensible]]内部属性为true

7.以指定在8.12中规则设置obj所有的内部方。

8.返回obj

 

15.2.3Object Constructor的属性

Object Constructor内部属性[[Prototype]]的值是标准的内建Function Prototype对象。

除此之外内部属性和length属性(整个值是1),Object Constructor有下面的属性:

15.2.3.1Object.prototype

Object.prototype初始化值是标准的内建Object Prototype对象(15.2.4)。属性有字段属性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}

 

15.2.3.5Object.create(O[,Properties])

Create函数以指定的原型创建一个新对象。当create函数被调用,这下面的步骤将执行:

1.如果Type(O)不是对象也不是Null抛出TypeError异常。

2.让obj成为创建一个新对象的结果就如同表达式new Object().  这其中,Object是带名字的标准的内建Constructor

3.设置obj[[prototype]]内建属性值为O

4.如果参数Properties是出现且不为undefined,就增加一个own 属性到 obj,就像以参数obj和属性调用标准的函数 Object.defineProperties

5.返回obj

 

15.2.3.6Object.definedProperty(O,P,Attributes)

defineProperty函数是用于增加own属性并/或跟新一个已存在的对象的own属性。当defineProperty函数被调用,这下面的步骤将执行:

1.如果Type(O)不是对象将抛出TypeError异常。

2.让name成为ToString(P).

3.让desc成为以Attributes作为参数调用ToPropertyDescripor方法 的值。

4.以参数namedesctrue去调用O[[DefineOwnProperty]] 部方法。

5.返回 O.

15.3 Function Objects

15.3.1 函数构造器作为一个函数调用

Function作为一个函数而不是构造器调用,它创建并初始化一个新的Function对象,从而这个函数调用Function(。。。)相当于以同样参数执行对象创建表达式new Function(。。。)。

15.3.1.1 Functionp1,p2,...,pn,body)

Function函数是被调用以一些参数P1,P2...,Pn,body(n可能是0,那是因为,这里没有P参数,并且body也许没有被提供),这下面的不走将被执行:

1.让argCount为函数执行时的总的参数数量。

2.让P成为空String

3.如果argCount0,让body成为空String

4.再如果argCount1,让body为那个参数。

5.其余情况,argCount大于1

A.让firstArg成为第一个参数。

B.让p成为ToString(fristArg)

C.让k2

D.重复,直到k小于argCount

I.nextArg成为第k个参数。

II.P成为连接先前P的值与字符“,”的结果,然后 ToString(nextArg)。

III.k增加1

E.body为第k的一个参数。

6.让bodyToString(body)。

7.如果P不是一个可作为FormalParameterList opt 转化的,就 抛出SyntaxError异常。

8.如果body不是一个可作为FunctionBody转化的,就抛出 SyntaxError异常。

9.如果body是一个严格模式代码(see 10.1.1)就让stricttrue 否则让strictfalse

10.如果stricttrue,抛出任何指定在13.1应用的异常。

11.返回一个new Function Object,这个对象在13.2被指定,执 行把P作为FormalParameterList opt并且body作为 FunctionBody。通过the Global Environment 作为Scrop参数并strict作为Strict标志。

每一个函数的原型属性会自动被创建,为函数能被作为一个构造器使用的可能性作准备。

注意:它是运行但不是必须为每一个正式的参数指定一个函数自变量。比如,下面三个表达式会产生同样的结果:

new Function“a”,”b”,”c”,”return a+b+c”)

new Function(“a,b,c”,”return a + b +c”)

new Function(“a,b”,”c”,”return a+b+c”)

 

15.3.3 Function Constructor构造器属性

Function 构造器本事是一个Functon 对象,并且他的[[Class]]是“Function”。Function Constructor 内部属性[[Prototype]]的值是一个标准的内建Function Prototype对象(15.3.4)。

Function Constructor内部属性[[Extensible]]的值为true

Function Constructor 有下面的属性:

15.3.3.1Function.prototype

Function.prototype初始化值是一个标准的内建Function Prototype对象(15.3.4)。

这个属性拥有这些字段属性{[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}

 

15.3.3.2Function.length

这个有一个值为1data 属性,这个属性拥有这些字段属性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}.

 

15.3.4Function Prototype Object属性

这个Function Prototype Object 它本身是一个 Function object(它的[[Class]] is “Function”),当被调用时,这个Function object会接受任何参数并且返回undefined

Function Prototype Object的内部属性[[Prototype]]的值是一个标准的内建Object Prototype 对象(15.2.4)。Function Prototype Object的内部属性[[Extensible]]true

Function prototype 对象没有一个直接的valueOf 属性;然而,它从Object Prototype 对象继承了这个属性。

Function Prototype 对象的length属性是0

 

15.3.4.1Function.prototype.constructor

Function.prototype.constructor的初始化值是内建Function Constructor

 

15.3.5.2prototype

Prototype属性的值是用于被初始化这个新创建的对象的内部属性[[Prototype]],这个初始化在Function object 作为创建那个新对象的构造器调用之前执行。这个属性有这些字段属性{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:false}

 

注意:使用Function.prototype.bind 创建的Function objects没有一个prototype 属性。 

 

 

15.4Array Objects

Array 对象给与了这类属性名特殊的对待。一个属性名P(以一个字符值形式存在)是一个数组引用,当且仅当如果ToStringtoUint32P))是等与p并且ToUint32p)不等于232-1(备注:因为数组引用从零开始,最大为232-2。一个属性名是一个数组引用的属性也被叫做element。每个数组对象有一个length属性,这个length属性的值总是一个小于232非负整型的数。Length属性的值在数字上大于数组的每一个引用值。当一个数组被创建或者改变,其它属性会以这个不变量作调整。尤其是,当一个属性(它的名字为数组的引用)增加时,如果有必要,对于不止一个数组引用值,这个length属性是被改变;当length属性是被改变,每一个不小于新length的属性(名字为数组引用)将被删除。这个约束只对数组对象的own属性管用,对从数组原型继承来的引用属性不管用。

一个对象,O,如果下面的算法返回true的话,据说是稀疏的:

1.让len为以参数length调用O的内部属性[[Get]]的结果。

2.循环整型变量0 <i<ToUint32(len)

A.让elem为以参数ToString(i)调用O内部方法 [[GetOwnProperty]]的结果。

B.如果elemundefined,返回true

3.返回false

 

15.4.1 Array Constructor被作为函数调用时

Array被作为一个函数而不是作为一个构造器调用时,它创建并且实例化一个新的Array object.因调用函数Array(...)是等价于以同样的参数用new Array(...)创建对象。

 

15.4.1.1Array([item1[,item2[,...]]])

Array函数被调用,下面的步骤将执行:

1.创建并返回一个新的Array object就完全如内建构造器Array以同样参数用new表达式执行一样(15.4.2)。

 

15.4.2Array Constructor

当数组作为new表达式的一部分被调用时,它是一个构造器;它初始化这个新创建的对象。

 

15.4.2.1 new Array([item0[,item1[,...]]])

这个表述适用于当且仅当数组构造器没被传入参数或者至少传入了2个参数。

新构建对象的内部属性[[Prototype]]被设置为初始的Array prototype object,这个对象为Array.prototype初始值(15.4.3.1)

新构建对象的内部属性[[Class]]被设置为“Array”。

新构建对象的内部属性[[Extensible]]被设置为true

新构建对象的length属性被设置为参数的数量。

新构建对象的0属性被设置为item0(如果被提供);1属性被设置为item1(如果被提供);总的来说,这里有很多的参数,k属性被设置为参数k,第一个参数被考虑为参数数字0。这些属性全部有字段属性{[[Writable]]:true,[[Enumerable]]:true,[[Configurable]]:true}

 

15.4.2.2new Array(len)

新构建对象的内部属性[[Prototype]]被设置为初始的Array prototype object,这个对象为Array.prototype初始值(15.4.3.1)。新构建对象的内部属性[[Class]]被设置为“Array”。新构建对象的内部属性[[Extensible]]被设置为true

如果参数len是一个数字并且ToUint32(len)等于len,这个新构建对象的length属性被设置为ToUint32(len)。如果这个参数len是一个数字并且ToUint32(len)不等于lenRangeError异常将会抛出。

如果这个参数len不是一个数字,这个新构建对象的length属性被设为1并且0属性被设置为lenlen会有字段属性{[[Writable]]:true,[[Enumerable]]:true,[[Configurable]]:true}

 

 

15.4.3Array Constructor的属性

Array Constructor的内部属性[[Prototype]]Function prototype object(15.3.4)

还包括内部属性并且length属性(它的值为1),这些属性如下:

 

15.4.3.1Array.prototype

Array.prototype初始化值是Array prototype object(15.4.4)

这个属性有字段属性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}

 

 

15.4.4 Array Prototype Object的属性

Array Prototype object的内部属性[[Prototype]]值是标准的内建Object prototype object15.2.4)。

Array Prototype object 它本身是一个数组;它的[[Class]]是“Array”,并且它有一个length属性(初始化值为+0)并且特殊内部方法[[DefinedOwnProperty]]被描述于15.4.5.1

以下描述的方法是Array protope object的属性,短语“this object”指调用函数的this值。它允许this是一个对象,这个对象的内部属性[[Class]]不是“Array”。

注意:Array Prototype object own属性中没有valueOf;然而,它的valueOf属性来自继承的内建Object Prototype object

 

15.4.4.1Array.prototype.constructor

Array.prototype.constructor的初始化值是标准的内建Array Constructor

 

 

15.5String Objects

15.5.1String Constructor 被作为函数调用

String被作为一个函数而不是构造器调用时,它执行类型转换。

 

15.1.1String([value])

ToString(value)计算后,返回一个String 值(不是一个String对象)。如果value不被支持,空字符串“”就被返回。

 

15.5.2 String Constructor

String作为new表达式的一部分被调用时,它是一个构造器,它初始化这个新创建的对象。

 

15.5.2.1new String([value])

新构建对象的内部属性[[Prototype]]被设置为标准的内建String Prototype object,这个对象是String.prototype(15.5.3.1)的初始化值。

新构建对象的[[Class]]属性被设置为“String”。

新构建对象的内部属性[[Extensible]]被设置为true

新构建对象的内部属性[[PrimitiveValue]]被设置为ToString(value).或者如果value不被支持的话,被设置为空字符串。

 

15.5.3String Constructor的属性

String Constructor内部属性[[Prototype]]是标准的内建Function Prototype object(15.3.4)

还包括内部属性和length属性(value1),String constructor 有以下属性:

 

15.5.3.1、 String.prototype

String.prototype初始化值是标准的内建String prototype object(15.5.4)

这个属性还有字段属性{[[Writeable]]:false,[[Enumerable]]:false,[[Configurable]]:false}

 

 

15.5.4String Prototype Object的属性

String Prototype Object 本身是一个String object(它的[[Class]]是“String),这个对象的值为空字符串。

String prototype object 的内部属性[[Prototype]]是一个标准的内建Object prototype object(15.2.4)

 

15.5.4.1String.prototype.constructor

String.prototype.constructor的初始化值是内建String Constructor

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值