ECMAScript® 2023 Language Specification
Toggle shortcuts help
Toggle "can call user code" annotations
Navigate to/from multipage
Jump to search box
Pins
Table of Contents
Introduction
Scope
Conformance
2.1
Example Normative Optional Clause Heading
2.2
Example Legacy Clause Heading
2.3
Example Legacy Normative Optional Clause Heading
Normative References
Overview
4.1
Web Scripting
4.2
Hosts and Implementations
4.3
ECMAScript Overview
4.3.1
Objects
4.3.2
The Strict Variant of ECMAScript
4.4
Terms and Definitions
4.4.1
implementation-approximated
4.4.2
implementation-defined
4.4.3
host-defined
4.4.4
type
4.4.5
primitive value
4.4.6
object
4.4.7
constructor
4.4.8
prototype
4.4.9
ordinary object
4.4.10
exotic object
4.4.11
standard object
4.4.12
built-in object
4.4.13
undefined value
4.4.14
Undefined type
4.4.15
null value
4.4.16
Null type
4.4.17
Boolean value
4.4.18
Boolean type
4.4.19
Boolean object
4.4.20
String value
4.4.21
String type
4.4.22
String object
4.4.23
Number value
4.4.24
Number type
4.4.25
Number object
4.4.26
Infinity
4.4.27
NaN
4.4.28
BigInt value
4.4.29
BigInt type
4.4.30
BigInt object
4.4.31
Symbol value
4.4.32
Symbol type
4.4.33
Symbol object
4.4.34
function
4.4.35
built-in function
4.4.36
property
4.4.37
method
4.4.38
built-in method
4.4.39
attribute
4.4.40
own property
4.4.41
inherited property
4.5
Organization of This Specification
Notational Conventions
5.1
Syntactic and Lexical Grammars
5.1.1
Context-Free Grammars
5.1.2
The Lexical and RegExp Grammars
5.1.3
The Numeric String Grammar
5.1.4
The Syntactic Grammar
5.1.5
Grammar Notation
5.1.5.1
Terminal Symbols
5.1.5.2
Nonterminal Symbols and Productions
5.1.5.3
Optional Symbols
5.1.5.4
Grammatical Parameters
5.1.5.5
one of
5.1.5.6
[empty]
5.1.5.7
Lookahead Restrictions
5.1.5.8
[no
LineTerminator
here]
5.1.5.9
but not
5.1.5.10
Descriptive Phrases
5.2
Algorithm Conventions
5.2.1
Abstract Operations
5.2.2
Syntax-Directed Operations
5.2.3
Runtime Semantics
5.2.3.1
Completion (
completionRecord
5.2.3.2
Throw an Exception
5.2.3.3
ReturnIfAbrupt
5.2.3.4
ReturnIfAbrupt Shorthands
5.2.3.5
Implicit Normal Completion
5.2.4
Static Semantics
5.2.5
Mathematical Operations
5.2.6
Value Notation
5.2.7
Identity
ECMAScript Data Types and Values
6.1
ECMAScript Language Types
6.1.1
The Undefined Type
6.1.2
The Null Type
6.1.3
The Boolean Type
6.1.4
The String Type
6.1.4.1
StringIndexOf (
string
searchValue
fromIndex
6.1.5
The Symbol Type
6.1.5.1
Well-Known Symbols
6.1.6
Numeric Types
6.1.6.1
The Number Type
6.1.6.1.1
Number::unaryMinus (
6.1.6.1.2
Number::bitwiseNOT (
6.1.6.1.3
Number::exponentiate (
base
exponent
6.1.6.1.4
Number::multiply (
6.1.6.1.5
Number::divide (
6.1.6.1.6
Number::remainder (
6.1.6.1.7
Number::add (
6.1.6.1.8
Number::subtract (
6.1.6.1.9
Number::leftShift (
6.1.6.1.10
Number::signedRightShift (
6.1.6.1.11
Number::unsignedRightShift (
6.1.6.1.12
Number::lessThan (
6.1.6.1.13
Number::equal (
6.1.6.1.14
Number::sameValue (
6.1.6.1.15
Number::sameValueZero (
6.1.6.1.16
NumberBitwiseOp (
op
6.1.6.1.17
Number::bitwiseAND (
6.1.6.1.18
Number::bitwiseXOR (
6.1.6.1.19
Number::bitwiseOR (
6.1.6.1.20
Number::toString (
radix
6.1.6.2
The BigInt Type
6.1.6.2.1
BigInt::unaryMinus (
6.1.6.2.2
BigInt::bitwiseNOT (
6.1.6.2.3
BigInt::exponentiate (
base
exponent
6.1.6.2.4
BigInt::multiply (
6.1.6.2.5
BigInt::divide (
6.1.6.2.6
BigInt::remainder (
6.1.6.2.7
BigInt::add (
6.1.6.2.8
BigInt::subtract (
6.1.6.2.9
BigInt::leftShift (
6.1.6.2.10
BigInt::signedRightShift (
6.1.6.2.11
BigInt::unsignedRightShift (
6.1.6.2.12
BigInt::lessThan (
6.1.6.2.13
BigInt::equal (
6.1.6.2.14
BinaryAnd (
6.1.6.2.15
BinaryOr (
6.1.6.2.16
BinaryXor (
6.1.6.2.17
BigIntBitwiseOp (
op
6.1.6.2.18
BigInt::bitwiseAND (
6.1.6.2.19
BigInt::bitwiseXOR (
6.1.6.2.20
BigInt::bitwiseOR (
6.1.6.2.21
BigInt::toString (
radix
6.1.7
The
Object Type
6.1.7.1
Property Attributes
6.1.7.2
Object Internal Methods and Internal Slots
6.1.7.3
Invariants of the Essential Internal Methods
6.1.7.4
Well-Known Intrinsic Objects
6.2
ECMAScript Specification Types
6.2.1
The Enum Specification Type
6.2.2
The List and Record Specification Types
6.2.3
The Set and Relation Specification Types
6.2.4
The Completion Record Specification Type
6.2.4.1
NormalCompletion (
value
6.2.4.2
ThrowCompletion (
value
6.2.4.3
UpdateEmpty (
completionRecord
value
6.2.5
The Reference Record Specification Type
6.2.5.1
IsPropertyReference (
6.2.5.2
IsUnresolvableReference (
6.2.5.3
IsSuperReference (
6.2.5.4
IsPrivateReference (
6.2.5.5
GetValue (
6.2.5.6
PutValue (
6.2.5.7
GetThisValue (
6.2.5.8
InitializeReferencedBinding (
6.2.5.9
MakePrivateReference (
baseValue
privateIdentifier
6.2.6
The Property Descriptor Specification Type
6.2.6.1
IsAccessorDescriptor (
Desc
6.2.6.2
IsDataDescriptor (
Desc
6.2.6.3
IsGenericDescriptor (
Desc
6.2.6.4
FromPropertyDescriptor (
Desc
6.2.6.5
ToPropertyDescriptor (
Obj
6.2.6.6
CompletePropertyDescriptor (
Desc
6.2.7
The Environment Record Specification Type
6.2.8
The Abstract Closure Specification Type
6.2.9
Data Blocks
6.2.9.1
CreateByteDataBlock (
size
6.2.9.2
CreateSharedByteDataBlock (
size
6.2.9.3
CopyDataBlockBytes (
toBlock
toIndex
fromBlock
fromIndex
count
6.2.10
The PrivateElement Specification Type
6.2.11
The ClassFieldDefinition Record Specification Type
6.2.12
Private Names
6.2.13
The ClassStaticBlockDefinition Record Specification Type
Abstract Operations
7.1
Type Conversion
7.1.1
ToPrimitive (
input
[ ,
preferredType
] )
7.1.1.1
OrdinaryToPrimitive (
hint
7.1.2
ToBoolean (
argument
7.1.3
ToNumeric (
value
7.1.4
ToNumber (
argument
7.1.4.1
ToNumber Applied to the String Type
7.1.4.1.1
StringToNumber (
str
7.1.4.1.2
RS: StringNumericValue
7.1.4.1.3
RoundMVResult (
7.1.5
ToIntegerOrInfinity (
argument
7.1.6
ToInt32 (
argument
7.1.7
ToUint32 (
argument
7.1.8
ToInt16 (
argument
7.1.9
ToUint16 (
argument
7.1.10
ToInt8 (
argument
7.1.11
ToUint8 (
argument
7.1.12
ToUint8Clamp (
argument
7.1.13
ToBigInt (
argument
7.1.14
StringToBigInt (
str
7.1.14.1
StringIntegerLiteral Grammar
7.1.14.2
RS: MV
7.1.15
ToBigInt64 (
argument
7.1.16
ToBigUint64 (
argument
7.1.17
ToString (
argument
7.1.18
ToObject (
argument
7.1.19
ToPropertyKey (
argument
7.1.20
ToLength (
argument
7.1.21
CanonicalNumericIndexString (
argument
7.1.22
ToIndex (
value
7.2
Testing and Comparison Operations
7.2.1
RequireObjectCoercible (
argument
7.2.2
IsArray (
argument
7.2.3
IsCallable (
argument
7.2.4
IsConstructor (
argument
7.2.5
IsExtensible (
7.2.6
IsIntegralNumber (
argument
7.2.7
IsPropertyKey (
argument
7.2.8
IsRegExp (
argument
7.2.9
SS: IsStringWellFormedUnicode (
string
7.2.10
SameValue (
7.2.11
SameValueZero (
7.2.12
SameValueNonNumber (
7.2.13
IsLessThan (
LeftFirst
7.2.14
IsLooselyEqual (
7.2.15
IsStrictlyEqual (
7.3
Operations on Objects
7.3.1
MakeBasicObject (
internalSlotsList
7.3.2
Get (
7.3.3
GetV (
7.3.4
Set (
Throw
7.3.5
CreateDataProperty (
7.3.6
CreateMethodProperty (
7.3.7
CreateDataPropertyOrThrow (
7.3.8
CreateNonEnumerableDataPropertyOrThrow (
7.3.9
DefinePropertyOrThrow (
desc
7.3.10
DeletePropertyOrThrow (
7.3.11
GetMethod (
7.3.12
HasProperty (
7.3.13
HasOwnProperty (
7.3.14
Call (
[ ,
argumentsList
] )
7.3.15
Construct (
[ ,
argumentsList
[ ,
newTarget
] ] )
7.3.16
SetIntegrityLevel (
level
7.3.17
TestIntegrityLevel (
level
7.3.18
CreateArrayFromList (
elements
7.3.19
LengthOfArrayLike (
obj
7.3.20
CreateListFromArrayLike (
obj
[ ,
elementTypes
] )
7.3.21
Invoke (
[ ,
argumentsList
] )
7.3.22
OrdinaryHasInstance (
7.3.23
SpeciesConstructor (
defaultConstructor
7.3.24
EnumerableOwnProperties (
kind
7.3.25
GetFunctionRealm (
obj
7.3.26
CopyDataProperties (
target
source
excludedItems
7.3.27
PrivateElementFind (
7.3.28
PrivateFieldAdd (
value
7.3.29
PrivateMethodOrAccessorAdd (
method
7.3.30
HostEnsureCanAddPrivateElement (
7.3.31
PrivateGet (
7.3.32
PrivateSet (
value
7.3.33
DefineField (
receiver
fieldRecord
7.3.34
InitializeInstanceElements (
constructor
7.4
Operations on Iterator Objects
7.4.1
Iterator Records
7.4.2
GetIteratorFromMethod (
obj
method
7.4.3
GetIterator (
obj
kind
7.4.4
IteratorNext (
iteratorRecord
[ ,
value
] )
7.4.5
IteratorComplete (
iterResult
7.4.6
IteratorValue (
iterResult
7.4.7
IteratorStep (
iteratorRecord
7.4.8
IteratorClose (
iteratorRecord
completion
7.4.9
IfAbruptCloseIterator (
value
iteratorRecord
7.4.10
AsyncIteratorClose (
iteratorRecord
completion
7.4.11
CreateIterResultObject (
value
done
7.4.12
CreateListIteratorRecord (
list
7.4.13
IteratorToList (
iteratorRecord
Syntax-Directed Operations
8.1
RS: Evaluation
8.2
Scope Analysis
8.2.1
SS: BoundNames
8.2.2
SS: DeclarationPart
8.2.3
SS: IsConstantDeclaration
8.2.4
SS: LexicallyDeclaredNames
8.2.5
SS: LexicallyScopedDeclarations
8.2.6
SS: VarDeclaredNames
8.2.7
SS: VarScopedDeclarations
8.2.8
SS: TopLevelLexicallyDeclaredNames
8.2.9
SS: TopLevelLexicallyScopedDeclarations
8.2.10
SS: TopLevelVarDeclaredNames
8.2.11
SS: TopLevelVarScopedDeclarations
8.3
Labels
8.3.1
SS: ContainsDuplicateLabels
8.3.2
SS: ContainsUndefinedBreakTarget
8.3.3
SS: ContainsUndefinedContinueTarget
8.4
Function Name Inference
8.4.1
SS: HasName
8.4.2
SS: IsFunctionDefinition
8.4.3
SS: IsAnonymousFunctionDefinition (
expr
8.4.4
SS: IsIdentifierRef
8.4.5
RS: NamedEvaluation
8.5
Contains
8.5.1
SS: Contains
8.5.2
SS: ComputedPropertyContains
8.6
Miscellaneous
8.6.1
RS: InstantiateFunctionObject
8.6.2
RS: BindingInitialization
8.6.2.1
InitializeBoundName (
name
value
environment
8.6.3
RS: IteratorBindingInitialization
8.6.4
SS: AssignmentTargetType
8.6.5
SS: PropName
Executable Code and Execution Contexts
9.1
Environment Records
9.1.1
The Environment Record Type Hierarchy
9.1.1.1
Declarative Environment Records
9.1.1.1.1
HasBinding (
9.1.1.1.2
CreateMutableBinding (
9.1.1.1.3
CreateImmutableBinding (
9.1.1.1.4
InitializeBinding (
9.1.1.1.5
SetMutableBinding (
9.1.1.1.6
GetBindingValue (
9.1.1.1.7
DeleteBinding (
9.1.1.1.8
HasThisBinding ( )
9.1.1.1.9
HasSuperBinding ( )
9.1.1.1.10
WithBaseObject ( )
9.1.1.2
Object Environment Records
9.1.1.2.1
HasBinding (
9.1.1.2.2
CreateMutableBinding (
9.1.1.2.3
CreateImmutableBinding (
9.1.1.2.4
InitializeBinding (
9.1.1.2.5
SetMutableBinding (
9.1.1.2.6
GetBindingValue (
9.1.1.2.7
DeleteBinding (
9.1.1.2.8
HasThisBinding ( )
9.1.1.2.9
HasSuperBinding ( )
9.1.1.2.10
WithBaseObject ( )
9.1.1.3
Function Environment Records
9.1.1.3.1
BindThisValue (
9.1.1.3.2
HasThisBinding ( )
9.1.1.3.3
HasSuperBinding ( )
9.1.1.3.4
GetThisBinding ( )
9.1.1.3.5
GetSuperBase ( )
9.1.1.4
Global Environment Records
9.1.1.4.1
HasBinding (
9.1.1.4.2
CreateMutableBinding (
9.1.1.4.3
CreateImmutableBinding (
9.1.1.4.4
InitializeBinding (
9.1.1.4.5
SetMutableBinding (
9.1.1.4.6
GetBindingValue (
9.1.1.4.7
DeleteBinding (
9.1.1.4.8
HasThisBinding ( )
9.1.1.4.9
HasSuperBinding ( )
9.1.1.4.10
WithBaseObject ( )
9.1.1.4.11
GetThisBinding ( )
9.1.1.4.12
HasVarDeclaration (
9.1.1.4.13
HasLexicalDeclaration (
9.1.1.4.14
HasRestrictedGlobalProperty (
9.1.1.4.15
CanDeclareGlobalVar (
9.1.1.4.16
CanDeclareGlobalFunction (
9.1.1.4.17
CreateGlobalVarBinding (
9.1.1.4.18
CreateGlobalFunctionBinding (
9.1.1.5
Module Environment Records
9.1.1.5.1
GetBindingValue (
9.1.1.5.2
DeleteBinding (
9.1.1.5.3
HasThisBinding ( )
9.1.1.5.4
GetThisBinding ( )
9.1.1.5.5
CreateImportBinding (
N2
9.1.2
Environment Record Operations
9.1.2.1
GetIdentifierReference (
env
name
strict
9.1.2.2
NewDeclarativeEnvironment (
9.1.2.3
NewObjectEnvironment (
9.1.2.4
NewFunctionEnvironment (
newTarget
9.1.2.5
NewGlobalEnvironment (
thisValue
9.1.2.6
NewModuleEnvironment (
9.2
PrivateEnvironment Records
9.2.1
PrivateEnvironment Record Operations
9.2.1.1
NewPrivateEnvironment (
outerPrivEnv
9.2.1.2
ResolvePrivateIdentifier (
privEnv
identifier
9.3
Realms
9.3.1
CreateRealm ( )
9.3.2
CreateIntrinsics (
realmRec
9.3.3
SetRealmGlobalObject (
realmRec
globalObj
thisValue
9.3.4
SetDefaultGlobalBindings (
realmRec
9.4
Execution Contexts
9.4.1
GetActiveScriptOrModule ( )
9.4.2
ResolveBinding (
name
[ ,
env
] )
9.4.3
GetThisEnvironment ( )
9.4.4
ResolveThisBinding ( )
9.4.5
GetNewTarget ( )
9.4.6
GetGlobalObject ( )
9.5
Jobs and Host Operations to Enqueue Jobs
9.5.1
JobCallback Records
9.5.2
HostMakeJobCallback (
callback
9.5.3
HostCallJobCallback (
jobCallback
argumentsList
9.5.4
HostEnqueuePromiseJob (
job
realm
9.6
InitializeHostDefinedRealm ( )
9.7
Agents
9.7.1
AgentSignifier ( )
9.7.2
AgentCanSuspend ( )
9.8
Agent Clusters
9.9
Forward Progress
9.10
Processing Model of WeakRef and FinalizationRegistry Targets
9.10.1
Objectives
9.10.2
Liveness
9.10.3
Execution
9.10.4
Host Hooks
9.10.4.1
HostEnqueueFinalizationRegistryCleanupJob (
finalizationRegistry
9.11
ClearKeptObjects ( )
9.12
AddToKeptObjects (
value
9.13
CleanupFinalizationRegistry (
finalizationRegistry
9.14
CanBeHeldWeakly (
10
Ordinary and Exotic Objects Behaviours
10.1
Ordinary Object Internal Methods and Internal Slots
10.1.1
[[GetPrototypeOf]] ( )
10.1.1.1
OrdinaryGetPrototypeOf (
10.1.2
[[SetPrototypeOf]] (
10.1.2.1
OrdinarySetPrototypeOf (
10.1.3
[[IsExtensible]] ( )
10.1.3.1
OrdinaryIsExtensible (
10.1.4
[[PreventExtensions]] ( )
10.1.4.1
OrdinaryPreventExtensions (
10.1.5
[[GetOwnProperty]] (
10.1.5.1
OrdinaryGetOwnProperty (
10.1.6
[[DefineOwnProperty]] (
Desc
10.1.6.1
OrdinaryDefineOwnProperty (
Desc
10.1.6.2
IsCompatiblePropertyDescriptor (
Extensible
Desc
Current
10.1.6.3
ValidateAndApplyPropertyDescriptor (
extensible
Desc
current
10.1.7
[[HasProperty]] (
10.1.7.1
OrdinaryHasProperty (
10.1.8
[[Get]] (
Receiver
10.1.8.1
OrdinaryGet (
Receiver
10.1.9
[[Set]] (
Receiver
10.1.9.1
OrdinarySet (
Receiver
10.1.9.2
OrdinarySetWithOwnDescriptor (
Receiver
ownDesc
10.1.10
[[Delete]] (
10.1.10.1
OrdinaryDelete (
10.1.11
[[OwnPropertyKeys]] ( )
10.1.11.1
OrdinaryOwnPropertyKeys (
10.1.12
OrdinaryObjectCreate (
proto
[ ,
additionalInternalSlotsList
] )
10.1.13
OrdinaryCreateFromConstructor (
constructor
intrinsicDefaultProto
[ ,
internalSlotsList
] )
10.1.14
GetPrototypeFromConstructor (
constructor
intrinsicDefaultProto
10.1.15
RequireInternalSlot (
internalSlot
10.2
ECMAScript Function Objects
10.2.1
[[Call]] (
thisArgument
argumentsList
10.2.1.1
PrepareForOrdinaryCall (
newTarget
10.2.1.2
OrdinaryCallBindThis (
calleeContext
thisArgument
10.2.1.3
RS: EvaluateBody
10.2.1.4
OrdinaryCallEvaluateBody (
argumentsList
10.2.2
[[Construct]] (
argumentsList
newTarget
10.2.3
OrdinaryFunctionCreate (
functionPrototype
sourceText
ParameterList
Body
thisMode
env
privateEnv
10.2.4
AddRestrictedFunctionProperties (
realm
10.2.4.1
%ThrowTypeError% ( )
10.2.5
MakeConstructor (
[ ,
writablePrototype
[ ,
prototype
] ] )
10.2.6
MakeClassConstructor (
10.2.7
MakeMethod (
homeObject
10.2.8
DefineMethodProperty (
homeObject
key
closure
enumerable
10.2.9
SetFunctionName (
name
[ ,
prefix
] )
10.2.10
SetFunctionLength (
length
10.2.11
FunctionDeclarationInstantiation (
func
argumentsList
10.3
Built-in Function Objects
10.3.1
[[Call]] (
thisArgument
argumentsList
10.3.2
[[Construct]] (
argumentsList
newTarget
10.3.3
CreateBuiltinFunction (
behaviour
length
name
additionalInternalSlotsList
[ ,
realm
[ ,
prototype
[ ,
prefix
] ] ] )
10.4
Built-in Exotic Object Internal Methods and Slots
10.4.1
Bound Function Exotic Objects
10.4.1.1
[[Call]] (
thisArgument
argumentsList
10.4.1.2
[[Construct]] (
argumentsList
newTarget
10.4.1.3
BoundFunctionCreate (
targetFunction
boundThis
boundArgs
10.4.2
Array Exotic Objects
10.4.2.1
[[DefineOwnProperty]] (
Desc
10.4.2.2
ArrayCreate (
length
[ ,
proto
] )
10.4.2.3
ArraySpeciesCreate (
originalArray
length
10.4.2.4
ArraySetLength (
Desc
10.4.3
String Exotic Objects
10.4.3.1
[[GetOwnProperty]] (
10.4.3.2
[[DefineOwnProperty]] (
Desc
10.4.3.3
[[OwnPropertyKeys]] ( )
10.4.3.4
StringCreate (
value
prototype
10.4.3.5
StringGetOwnProperty (
10.4.4
Arguments Exotic Objects
10.4.4.1
[[GetOwnProperty]] (
10.4.4.2
[[DefineOwnProperty]] (
Desc
10.4.4.3
[[Get]] (
Receiver
10.4.4.4
[[Set]] (
Receiver
10.4.4.5
[[Delete]] (
10.4.4.6
CreateUnmappedArgumentsObject (
argumentsList
10.4.4.7
CreateMappedArgumentsObject (
func
formals
argumentsList
env
10.4.4.7.1
MakeArgGetter (
name
env
10.4.4.7.2
MakeArgSetter (
name
env
10.4.5
Integer-Indexed Exotic Objects
10.4.5.1
[[GetOwnProperty]] (
10.4.5.2
[[HasProperty]] (
10.4.5.3
[[DefineOwnProperty]] (
Desc
10.4.5.4
[[Get]] (
Receiver
10.4.5.5
[[Set]] (
Receiver
10.4.5.6
[[Delete]] (
10.4.5.7
[[OwnPropertyKeys]] ( )
10.4.5.8
IntegerIndexedObjectCreate (
prototype
10.4.5.9
IsValidIntegerIndex (
index
10.4.5.10
IntegerIndexedElementGet (
index
10.4.5.11
IntegerIndexedElementSet (
index
value
10.4.6
Module Namespace Exotic Objects
10.4.6.1
[[GetPrototypeOf]] ( )
10.4.6.2
[[SetPrototypeOf]] (
10.4.6.3
[[IsExtensible]] ( )
10.4.6.4
[[PreventExtensions]] ( )
10.4.6.5
[[GetOwnProperty]] (
10.4.6.6
[[DefineOwnProperty]] (
Desc
10.4.6.7
[[HasProperty]] (
10.4.6.8
[[Get]] (
Receiver
10.4.6.9
[[Set]] (
Receiver
10.4.6.10
[[Delete]] (
10.4.6.11
[[OwnPropertyKeys]] ( )
10.4.6.12
ModuleNamespaceCreate (
module
exports
10.4.7
Immutable Prototype Exotic Objects
10.4.7.1
[[SetPrototypeOf]] (
10.4.7.2
SetImmutablePrototype (
10.5
Proxy Object Internal Methods and Internal Slots
10.5.1
[[GetPrototypeOf]] ( )
10.5.2
[[SetPrototypeOf]] (
10.5.3
[[IsExtensible]] ( )
10.5.4
[[PreventExtensions]] ( )
10.5.5
[[GetOwnProperty]] (
10.5.6
[[DefineOwnProperty]] (
Desc
10.5.7
[[HasProperty]] (
10.5.8
[[Get]] (
Receiver
10.5.9
[[Set]] (
Receiver
10.5.10
[[Delete]] (
10.5.11
[[OwnPropertyKeys]] ( )
10.5.12
[[Call]] (
thisArgument
argumentsList
10.5.13
[[Construct]] (
argumentsList
newTarget
10.5.14
ValidateNonRevokedProxy (
proxy
10.5.15
ProxyCreate (
target
handler
11
ECMAScript Language: Source Text
11.1
Source Text
11.1.1
SS: UTF16EncodeCodePoint (
cp
11.1.2
SS: CodePointsToString (
text
11.1.3
SS: UTF16SurrogatePairToCodePoint (
lead
trail
11.1.4
SS: CodePointAt (
string
position
11.1.5
SS: StringToCodePoints (
string
11.1.6
SS: ParseText (
sourceText
goalSymbol
11.2
Types of Source Code
11.2.1
Directive Prologues and the Use Strict Directive
11.2.2
Strict Mode Code
11.2.3
Non-ECMAScript Functions
12
ECMAScript Language: Lexical Grammar
12.1
Unicode Format-Control Characters
12.2
White Space
12.3
Line Terminators
12.4
Comments
12.5
Hashbang Comments
12.6
Tokens
12.7
Names and Keywords
12.7.1
Identifier Names
12.7.1.1
SS: Early Errors
12.7.1.2
SS: IdentifierCodePoints
12.7.1.3
SS: IdentifierCodePoint
12.7.2
Keywords and Reserved Words
12.8
Punctuators
12.9
Literals
12.9.1
Null Literals
12.9.2
Boolean Literals
12.9.3
Numeric Literals
12.9.3.1
SS: Early Errors
12.9.3.2
SS: MV
12.9.3.3
SS: NumericValue
12.9.4
String Literals
12.9.4.1
SS: Early Errors
12.9.4.2
SS: SV
12.9.4.3
SS: MV
12.9.5
Regular Expression Literals
12.9.5.1
SS: BodyText
12.9.5.2
SS: FlagText
12.9.6
Template Literal Lexical Components
12.9.6.1
SS: TV
12.9.6.2
SS: TRV
12.10
Automatic Semicolon Insertion
12.10.1
Rules of Automatic Semicolon Insertion
12.10.2
Examples of Automatic Semicolon Insertion
12.10.3
Interesting Cases of Automatic Semicolon Insertion
12.10.3.1
Interesting Cases of Automatic Semicolon Insertion in Statement Lists
12.10.3.2
Cases of Automatic Semicolon Insertion and “[no
LineTerminator
here]”
12.10.3.2.1
List of Grammar Productions with Optional Operands and “[no
LineTerminator
here]”
13
ECMAScript Language: Expressions
13.1
Identifiers
13.1.1
SS: Early Errors
13.1.2
SS: StringValue
13.1.3
RS: Evaluation
13.2
Primary Expression
13.2.1
The
this
Keyword
13.2.1.1
RS: Evaluation
13.2.2
Identifier Reference
13.2.3
Literals
13.2.3.1
RS: Evaluation
13.2.4
Array Initializer
13.2.4.1
RS: ArrayAccumulation
13.2.4.2
RS: Evaluation
13.2.5
Object Initializer
13.2.5.1
SS: Early Errors
13.2.5.2
SS: IsComputedPropertyKey
13.2.5.3
SS: PropertyNameList
13.2.5.4
RS: Evaluation
13.2.5.5
RS: PropertyDefinitionEvaluation
13.2.6
Function Defining Expressions
13.2.7
Regular Expression Literals
13.2.7.1
SS: Early Errors
13.2.7.2
SS: IsValidRegularExpressionLiteral (
literal
13.2.7.3
RS: Evaluation
13.2.8
Template Literals
13.2.8.1
SS: Early Errors
13.2.8.2
SS: TemplateStrings
13.2.8.3
SS: TemplateString (
templateToken
raw
13.2.8.4
GetTemplateObject (
templateLiteral
13.2.8.5
RS: SubstitutionEvaluation
13.2.8.6
RS: Evaluation
13.2.9
The Grouping Operator
13.2.9.1
SS: Early Errors
13.2.9.2
RS: Evaluation
13.3
Left-Hand-Side Expressions
13.3.1
Static Semantics
13.3.1.1
SS: Early Errors
13.3.2
Property Accessors
13.3.2.1
RS: Evaluation
13.3.3
EvaluatePropertyAccessWithExpressionKey (
baseValue
expression
strict
13.3.4
EvaluatePropertyAccessWithIdentifierKey (
baseValue
identifierName
strict
13.3.5
The
new
Operator
13.3.5.1
RS: Evaluation
13.3.5.1.1
EvaluateNew (
constructExpr
arguments
13.3.6
Function Calls
13.3.6.1
RS: Evaluation
13.3.6.2
EvaluateCall (
func
ref
arguments
tailPosition
13.3.7
The
super
Keyword
13.3.7.1
RS: Evaluation
13.3.7.2
GetSuperConstructor ( )
13.3.7.3
MakeSuperPropertyReference (
actualThis
propertyKey
strict
13.3.8
Argument Lists
13.3.8.1
RS: ArgumentListEvaluation
13.3.9
Optional Chains
13.3.9.1
RS: Evaluation
13.3.9.2
RS: ChainEvaluation
13.3.10
Import Calls
13.3.10.1
RS: Evaluation
13.3.10.1.1
ContinueDynamicImport (
promiseCapability
moduleCompletion
13.3.11
Tagged Templates
13.3.11.1
RS: Evaluation
13.3.12
Meta Properties
13.3.12.1
RS: Evaluation
13.3.12.1.1
HostGetImportMetaProperties (
moduleRecord
13.3.12.1.2
HostFinalizeImportMeta (
importMeta
moduleRecord
13.4
Update Expressions
13.4.1
SS: Early Errors
13.4.2
Postfix Increment Operator
13.4.2.1
RS: Evaluation
13.4.3
Postfix Decrement Operator
13.4.3.1
RS: Evaluation
13.4.4
Prefix Increment Operator
13.4.4.1
RS: Evaluation
13.4.5
Prefix Decrement Operator
13.4.5.1
RS: Evaluation
13.5
Unary Operators
13.5.1
The
delete
Operator
13.5.1.1
SS: Early Errors
13.5.1.2
RS: Evaluation
13.5.2
The
void
Operator
13.5.2.1
RS: Evaluation
13.5.3
The
typeof
Operator
13.5.3.1
RS: Evaluation
13.5.4
Unary
Operator
13.5.4.1
RS: Evaluation
13.5.5
Unary
Operator
13.5.5.1
RS: Evaluation
13.5.6
Bitwise NOT Operator (
13.5.6.1
RS: Evaluation
13.5.7
Logical NOT Operator (
13.5.7.1
RS: Evaluation
13.6
Exponentiation Operator
13.6.1
RS: Evaluation
13.7
Multiplicative Operators
13.7.1
RS: Evaluation
13.8
Additive Operators
13.8.1
The Addition Operator (
13.8.1.1
RS: Evaluation
13.8.2
The Subtraction Operator (
13.8.2.1
RS: Evaluation
13.9
Bitwise Shift Operators
13.9.1
The Left Shift Operator (
<<
13.9.1.1
RS: Evaluation
13.9.2
The Signed Right Shift Operator (
>>
13.9.2.1
RS: Evaluation
13.9.3
The Unsigned Right Shift Operator (
>>>
13.9.3.1
RS: Evaluation
13.10
Relational Operators
13.10.1
RS: Evaluation
13.10.2
InstanceofOperator (
target
13.11
Equality Operators
13.11.1
RS: Evaluation
13.12
Binary Bitwise Operators
13.12.1
RS: Evaluation
13.13
Binary Logical Operators
13.13.1
RS: Evaluation
13.14
Conditional Operator (
? :
13.14.1
RS: Evaluation
13.15
Assignment Operators
13.15.1
SS: Early Errors
13.15.2
RS: Evaluation
13.15.3
ApplyStringOrNumericBinaryOperator (
lval
opText
rval
13.15.4
EvaluateStringOrNumericBinaryExpression (
leftOperand
opText
rightOperand
13.15.5
Destructuring Assignment
13.15.5.1
SS: Early Errors
13.15.5.2
RS: DestructuringAssignmentEvaluation
13.15.5.3
RS: PropertyDestructuringAssignmentEvaluation
13.15.5.4
RS: RestDestructuringAssignmentEvaluation
13.15.5.5
RS: IteratorDestructuringAssignmentEvaluation
13.15.5.6
RS: KeyedDestructuringAssignmentEvaluation
13.16
Comma Operator (
13.16.1
RS: Evaluation
14
ECMAScript Language: Statements and Declarations
14.1
Statement Semantics
14.1.1
RS: Evaluation
14.2
Block
14.2.1
SS: Early Errors
14.2.2
RS: Evaluation
14.2.3
BlockDeclarationInstantiation (
code
env
14.3
Declarations and the Variable Statement
14.3.1
Let and Const Declarations
14.3.1.1
SS: Early Errors
14.3.1.2
RS: Evaluation
14.3.2
Variable Statement
14.3.2.1
RS: Evaluation
14.3.3
Destructuring Binding Patterns
14.3.3.1
RS: PropertyBindingInitialization
14.3.3.2
RS: RestBindingInitialization
14.3.3.3
RS: KeyedBindingInitialization
14.4
Empty Statement
14.4.1
RS: Evaluation
14.5
Expression Statement
14.5.1
RS: Evaluation
14.6
The
if
Statement
14.6.1
SS: Early Errors
14.6.2
RS: Evaluation
14.7
Iteration Statements
14.7.1
Semantics
14.7.1.1
LoopContinues (
completion
labelSet
14.7.1.2
RS: LoopEvaluation
14.7.2
The
do
while
Statement
14.7.2.1
SS: Early Errors
14.7.2.2
RS: DoWhileLoopEvaluation
14.7.3
The
while
Statement
14.7.3.1
SS: Early Errors
14.7.3.2
RS: WhileLoopEvaluation
14.7.4
The
for
Statement
14.7.4.1
SS: Early Errors
14.7.4.2
RS: ForLoopEvaluation
14.7.4.3
ForBodyEvaluation (
test
increment
stmt
perIterationBindings
labelSet
14.7.4.4
CreatePerIterationEnvironment (
perIterationBindings
14.7.5
The
for
in
for
of
, and
for
await
of
Statements
14.7.5.1
SS: Early Errors
14.7.5.2
SS: IsDestructuring
14.7.5.3
RS: ForDeclarationBindingInitialization
14.7.5.4
RS: ForDeclarationBindingInstantiation
14.7.5.5
RS: ForInOfLoopEvaluation
14.7.5.6
ForIn/OfHeadEvaluation (
uninitializedBoundNames
expr
iterationKind
14.7.5.7
ForIn/OfBodyEvaluation (
lhs
stmt
iteratorRecord
iterationKind
lhsKind
labelSet
[ ,
iteratorKind
] )
14.7.5.8
RS: Evaluation
14.7.5.9
EnumerateObjectProperties (
14.7.5.10
For-In Iterator Objects
14.7.5.10.1
CreateForInIterator (
object
14.7.5.10.2
The %ForInIteratorPrototype% Object
14.7.5.10.2.1
%ForInIteratorPrototype%.next ( )
14.7.5.10.3
Properties of For-In Iterator Instances
14.8
The
continue
Statement
14.8.1
SS: Early Errors
14.8.2
RS: Evaluation
14.9
The
break
Statement
14.9.1
SS: Early Errors
14.9.2
RS: Evaluation
14.10
The
return
Statement
14.10.1
RS: Evaluation
14.11
The
with
Statement
14.11.1
SS: Early Errors
14.11.2
RS: Evaluation
14.12
The
switch
Statement
14.12.1
SS: Early Errors
14.12.2
RS: CaseBlockEvaluation
14.12.3
CaseClauseIsSelected (
input
14.12.4
RS: Evaluation
14.13
Labelled Statements
14.13.1
SS: Early Errors
14.13.2
SS: IsLabelledFunction (
stmt
14.13.3
RS: Evaluation
14.13.4
RS: LabelledEvaluation
14.14
The
throw
Statement
14.14.1
RS: Evaluation
14.15
The
try
Statement
14.15.1
SS: Early Errors
14.15.2
RS: CatchClauseEvaluation
14.15.3
RS: Evaluation
14.16
The
debugger
Statement
14.16.1
RS: Evaluation
15
ECMAScript Language: Functions and Classes
15.1
Parameter Lists
15.1.1
SS: Early Errors
15.1.2
SS: ContainsExpression
15.1.3
SS: IsSimpleParameterList
15.1.4
SS: HasInitializer
15.1.5
SS: ExpectedArgumentCount
15.2
Function Definitions
15.2.1
SS: Early Errors
15.2.2
SS: FunctionBodyContainsUseStrict
15.2.3
RS: EvaluateFunctionBody
15.2.4
RS: InstantiateOrdinaryFunctionObject
15.2.5
RS: InstantiateOrdinaryFunctionExpression
15.2.6
RS: Evaluation
15.3
Arrow Function Definitions
15.3.1
SS: Early Errors
15.3.2
SS: ConciseBodyContainsUseStrict
15.3.3
RS: EvaluateConciseBody
15.3.4
RS: InstantiateArrowFunctionExpression
15.3.5
RS: Evaluation
15.4
Method Definitions
15.4.1
SS: Early Errors
15.4.2
SS: HasDirectSuper
15.4.3
SS: SpecialMethod
15.4.4
RS: DefineMethod
15.4.5
RS: MethodDefinitionEvaluation
15.5
Generator Function Definitions
15.5.1
SS: Early Errors
15.5.2
RS: EvaluateGeneratorBody
15.5.3
RS: InstantiateGeneratorFunctionObject
15.5.4
RS: InstantiateGeneratorFunctionExpression
15.5.5
RS: Evaluation
15.6
Async Generator Function Definitions
15.6.1
SS: Early Errors
15.6.2
RS: EvaluateAsyncGeneratorBody
15.6.3
RS: InstantiateAsyncGeneratorFunctionObject
15.6.4
RS: InstantiateAsyncGeneratorFunctionExpression
15.6.5
RS: Evaluation
15.7
Class Definitions
15.7.1
SS: Early Errors
15.7.2
SS: ClassElementKind
15.7.3
SS: ConstructorMethod
15.7.4
SS: IsStatic
15.7.5
SS: NonConstructorElements
15.7.6
SS: PrototypePropertyNameList
15.7.7
SS: AllPrivateIdentifiersValid
15.7.8
SS: PrivateBoundIdentifiers
15.7.9
SS: ContainsArguments
15.7.10
RS: ClassFieldDefinitionEvaluation
15.7.11
RS: ClassStaticBlockDefinitionEvaluation
15.7.12
RS: EvaluateClassStaticBlockBody
15.7.13
RS: ClassElementEvaluation
15.7.14
RS: ClassDefinitionEvaluation
15.7.15
RS: BindingClassDeclarationEvaluation
15.7.16
RS: Evaluation
15.8
Async Function Definitions
15.8.1
SS: Early Errors
15.8.2
RS: InstantiateAsyncFunctionObject
15.8.3
RS: InstantiateAsyncFunctionExpression
15.8.4
RS: EvaluateAsyncFunctionBody
15.8.5
RS: Evaluation
15.9
Async Arrow Function Definitions
15.9.1
SS: Early Errors
15.9.2
SS: AsyncConciseBodyContainsUseStrict
15.9.3
RS: EvaluateAsyncConciseBody
15.9.4
RS: InstantiateAsyncArrowFunctionExpression
15.9.5
RS: Evaluation
15.10
Tail Position Calls
15.10.1
SS: IsInTailPosition (
call
15.10.2
SS: HasCallInTailPosition
15.10.3
PrepareForTailCall ( )
16
ECMAScript Language: Scripts and Modules
16.1
Scripts
16.1.1
SS: Early Errors
16.1.2
SS: IsStrict
16.1.3
RS: Evaluation
16.1.4
Script Records
16.1.5
ParseScript (
sourceText
realm
hostDefined
16.1.6
ScriptEvaluation (
scriptRecord
16.1.7
GlobalDeclarationInstantiation (
script
env
16.2
Modules
16.2.1
Module Semantics
16.2.1.1
SS: Early Errors
16.2.1.2
SS: ImportedLocalNames (
importEntries
16.2.1.3
SS: ModuleRequests
16.2.1.4
Abstract Module Records
16.2.1.5
Cyclic Module Records
16.2.1.5.1
LoadRequestedModules ( [
hostDefined
] )
16.2.1.5.1.1
InnerModuleLoading (
state
module
16.2.1.5.1.2
ContinueModuleLoading (
state
moduleCompletion
16.2.1.5.2
Link ( )
16.2.1.5.2.1
InnerModuleLinking (
module
stack
index
16.2.1.5.3
Evaluate ( )
16.2.1.5.3.1
InnerModuleEvaluation (
module
stack
index
16.2.1.5.3.2
ExecuteAsyncModule (
module
16.2.1.5.3.3
GatherAvailableAncestors (
module
execList
16.2.1.5.3.4
AsyncModuleExecutionFulfilled (
module
16.2.1.5.3.5
AsyncModuleExecutionRejected (
module
error
16.2.1.5.4
Example Cyclic Module Record Graphs
16.2.1.6
Source Text Module Records
16.2.1.6.1
ParseModule (
sourceText
realm
hostDefined
16.2.1.6.2
GetExportedNames ( [
exportStarSet
] )
16.2.1.6.3
ResolveExport (
exportName
[ ,
resolveSet
] )
16.2.1.6.4
InitializeEnvironment ( )
16.2.1.6.5
ExecuteModule ( [
capability
] )
16.2.1.7
GetImportedModule (
referrer
specifier
16.2.1.8
HostLoadImportedModule (
referrer
specifier
hostDefined
payload
16.2.1.9
FinishLoadingImportedModule (
referrer
specifier
payload
result
16.2.1.10
GetModuleNamespace (
module
16.2.1.11
RS: Evaluation
16.2.2
Imports
16.2.2.1
SS: Early Errors
16.2.2.2
SS: ImportEntries
16.2.2.3
SS: ImportEntriesForModule
16.2.3
Exports
16.2.3.1
SS: Early Errors
16.2.3.2
SS: ExportedBindings
16.2.3.3
SS: ExportedNames
16.2.3.4
SS: ExportEntries
16.2.3.5
SS: ExportEntriesForModule
16.2.3.6
SS: ReferencedBindings
16.2.3.7
RS: Evaluation
17
Error Handling and Language Extensions
17.1
Forbidden Extensions
18
ECMAScript Standard Built-in Objects
19
The Global Object
19.1
Value Properties of the Global Object
19.1.1
globalThis
19.1.2
Infinity
19.1.3
NaN
19.1.4
undefined
19.2
Function Properties of the Global Object
19.2.1
eval (
19.2.1.1
PerformEval (
strictCaller
direct
19.2.1.2
HostEnsureCanCompileStrings (
calleeRealm
19.2.1.3
EvalDeclarationInstantiation (
body
varEnv
lexEnv
privateEnv
strict
19.2.2
isFinite (
number
19.2.3
isNaN (
number
19.2.4
parseFloat (
string
19.2.5
parseInt (
string
radix
19.2.6
URI Handling Functions
19.2.6.1
decodeURI (
encodedURI
19.2.6.2
decodeURIComponent (
encodedURIComponent
19.2.6.3
encodeURI (
uri
19.2.6.4
encodeURIComponent (
uriComponent
19.2.6.5
Encode (
string
extraUnescaped
19.2.6.6
Decode (
string
preserveEscapeSet
19.2.6.7
ParseHexOctet (
string
position
19.3
Constructor Properties of the Global Object
19.3.1
AggregateError ( . . . )
19.3.2
Array ( . . . )
19.3.3
ArrayBuffer ( . . . )
19.3.4
BigInt ( . . . )
19.3.5
BigInt64Array ( . . . )
19.3.6
BigUint64Array ( . . . )
19.3.7
Boolean ( . . . )
19.3.8
DataView ( . . . )
19.3.9
Date ( . . . )
19.3.10
Error ( . . . )
19.3.11
EvalError ( . . . )
19.3.12
FinalizationRegistry ( . . . )
19.3.13
Float32Array ( . . . )
19.3.14
Float64Array ( . . . )
19.3.15
Function ( . . . )
19.3.16
Int8Array ( . . . )
19.3.17
Int16Array ( . . . )
19.3.18
Int32Array ( . . . )
19.3.19
Map ( . . . )
19.3.20
Number ( . . . )
19.3.21
Object ( . . . )
19.3.22
Promise ( . . . )
19.3.23
Proxy ( . . . )
19.3.24
RangeError ( . . . )
19.3.25
ReferenceError ( . . . )
19.3.26
RegExp ( . . . )
19.3.27
Set ( . . . )
19.3.28
SharedArrayBuffer ( . . . )
19.3.29
String ( . . . )
19.3.30
Symbol ( . . . )
19.3.31
SyntaxError ( . . . )
19.3.32
TypeError ( . . . )
19.3.33
Uint8Array ( . . . )
19.3.34
Uint8ClampedArray ( . . . )
19.3.35
Uint16Array ( . . . )
19.3.36
Uint32Array ( . . . )
19.3.37
URIError ( . . . )
19.3.38
WeakMap ( . . . )
19.3.39
WeakRef ( . . . )
19.3.40
WeakSet ( . . . )
19.4
Other Properties of the Global Object
19.4.1
Atomics
19.4.2
JSON
19.4.3
Math
19.4.4
Reflect
20
Fundamental Objects
20.1
Object Objects
20.1.1
The Object Constructor
20.1.1.1
Object ( [
value
] )
20.1.2
Properties of the Object Constructor
20.1.2.1
Object.assign (
target
, ...
sources
20.1.2.2
Object.create (
Properties
20.1.2.3
Object.defineProperties (
Properties
20.1.2.3.1
ObjectDefineProperties (
Properties
20.1.2.4
Object.defineProperty (
Attributes
20.1.2.5
Object.entries (
20.1.2.6
Object.freeze (
20.1.2.7
Object.fromEntries (
iterable
20.1.2.8
Object.getOwnPropertyDescriptor (
20.1.2.9
Object.getOwnPropertyDescriptors (
20.1.2.10
Object.getOwnPropertyNames (
20.1.2.11
Object.getOwnPropertySymbols (
20.1.2.11.1
GetOwnPropertyKeys (
type
20.1.2.12
Object.getPrototypeOf (
20.1.2.13
Object.hasOwn (
20.1.2.14
Object.is (
value1
value2
20.1.2.15
Object.isExtensible (
20.1.2.16
Object.isFrozen (
20.1.2.17
Object.isSealed (
20.1.2.18
Object.keys (
20.1.2.19
Object.preventExtensions (
20.1.2.20
Object.prototype
20.1.2.21
Object.seal (
20.1.2.22
Object.setPrototypeOf (
proto
20.1.2.23
Object.values (
20.1.3
Properties of the Object Prototype Object
20.1.3.1
Object.prototype.constructor
20.1.3.2
Object.prototype.hasOwnProperty (
20.1.3.3
Object.prototype.isPrototypeOf (
20.1.3.4
Object.prototype.propertyIsEnumerable (
20.1.3.5
Object.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
20.1.3.6
Object.prototype.toString ( )
20.1.3.7
Object.prototype.valueOf ( )
20.1.3.8
Object.prototype.__proto__
20.1.3.8.1
get Object.prototype.__proto__
20.1.3.8.2
set Object.prototype.__proto__
20.1.3.9
Legacy Object.prototype Accessor Methods
20.1.3.9.1
Object.prototype.__defineGetter__ (
getter
20.1.3.9.2
Object.prototype.__defineSetter__ (
setter
20.1.3.9.3
Object.prototype.__lookupGetter__ (
20.1.3.9.4
Object.prototype.__lookupSetter__ (
20.1.4
Properties of Object Instances
20.2
Function Objects
20.2.1
The Function Constructor
20.2.1.1
Function ( ...
parameterArgs
bodyArg
20.2.1.1.1
CreateDynamicFunction (
constructor
newTarget
kind
parameterArgs
bodyArg
20.2.2
Properties of the Function Constructor
20.2.2.1
Function.length
20.2.2.2
Function.prototype
20.2.3
Properties of the Function Prototype Object
20.2.3.1
Function.prototype.apply (
thisArg
argArray
20.2.3.2
Function.prototype.bind (
thisArg
, ...
args
20.2.3.3
Function.prototype.call (
thisArg
, ...
args
20.2.3.4
Function.prototype.constructor
20.2.3.5
Function.prototype.toString ( )
20.2.3.6
Function.prototype [ @@hasInstance ] (
20.2.4
Function Instances
20.2.4.1
length
20.2.4.2
name
20.2.4.3
prototype
20.2.5
HostHasSourceTextAvailable (
func
20.3
Boolean Objects
20.3.1
The Boolean Constructor
20.3.1.1
Boolean (
value
20.3.2
Properties of the Boolean Constructor
20.3.2.1
Boolean.prototype
20.3.3
Properties of the Boolean Prototype Object
20.3.3.1
Boolean.prototype.constructor
20.3.3.2
Boolean.prototype.toString ( )
20.3.3.3
Boolean.prototype.valueOf ( )
20.3.4
Properties of Boolean Instances
20.4
Symbol Objects
20.4.1
The Symbol Constructor
20.4.1.1
Symbol ( [
description
] )
20.4.2
Properties of the Symbol Constructor
20.4.2.1
Symbol.asyncIterator
20.4.2.2
Symbol.for (
key
20.4.2.3
Symbol.hasInstance
20.4.2.4
Symbol.isConcatSpreadable
20.4.2.5
Symbol.iterator
20.4.2.6
Symbol.keyFor (
sym
20.4.2.7
Symbol.match
20.4.2.8
Symbol.matchAll
20.4.2.9
Symbol.prototype
20.4.2.10
Symbol.replace
20.4.2.11
Symbol.search
20.4.2.12
Symbol.species
20.4.2.13
Symbol.split
20.4.2.14
Symbol.toPrimitive
20.4.2.15
Symbol.toStringTag
20.4.2.16
Symbol.unscopables
20.4.3
Properties of the Symbol Prototype Object
20.4.3.1
Symbol.prototype.constructor
20.4.3.2
get Symbol.prototype.description
20.4.3.3
Symbol.prototype.toString ( )
20.4.3.3.1
SymbolDescriptiveString (
sym
20.4.3.4
Symbol.prototype.valueOf ( )
20.4.3.5
Symbol.prototype [ @@toPrimitive ] (
hint
20.4.3.6
Symbol.prototype [ @@toStringTag ]
20.4.4
Properties of Symbol Instances
20.4.5
Abstract Operations for Symbols
20.4.5.1
KeyForSymbol (
sym
20.5
Error Objects
20.5.1
The Error Constructor
20.5.1.1
Error (
message
[ ,
options
] )
20.5.2
Properties of the Error Constructor
20.5.2.1
Error.prototype
20.5.3
Properties of the Error Prototype Object
20.5.3.1
Error.prototype.constructor
20.5.3.2
Error.prototype.message
20.5.3.3
Error.prototype.name
20.5.3.4
Error.prototype.toString ( )
20.5.4
Properties of Error Instances
20.5.5
Native Error Types Used in This Standard
20.5.5.1
EvalError
20.5.5.2
RangeError
20.5.5.3
ReferenceError
20.5.5.4
SyntaxError
20.5.5.5
TypeError
20.5.5.6
URIError
20.5.6
NativeError
Object Structure
20.5.6.1
The
NativeError
Constructors
20.5.6.1.1
NativeError
message
[ ,
options
] )
20.5.6.2
Properties of the
NativeError
Constructors
20.5.6.2.1
NativeError
.prototype
20.5.6.3
Properties of the
NativeError
Prototype Objects
20.5.6.3.1
NativeError
.prototype.constructor
20.5.6.3.2
NativeError
.prototype.message
20.5.6.3.3
NativeError
.prototype.name
20.5.6.4
Properties of
NativeError
Instances
20.5.7
AggregateError Objects
20.5.7.1
The AggregateError Constructor
20.5.7.1.1
AggregateError (
errors
message
[ ,
options
] )
20.5.7.2
Properties of the AggregateError Constructor
20.5.7.2.1
AggregateError.prototype
20.5.7.3
Properties of the AggregateError Prototype Object
20.5.7.3.1
AggregateError.prototype.constructor
20.5.7.3.2
AggregateError.prototype.message
20.5.7.3.3
AggregateError.prototype.name
20.5.7.4
Properties of AggregateError Instances
20.5.8
Abstract Operations for Error Objects
20.5.8.1
InstallErrorCause (
options
21
Numbers and Dates
21.1
Number Objects
21.1.1
The Number Constructor
21.1.1.1
Number (
value
21.1.2
Properties of the Number Constructor
21.1.2.1
Number.EPSILON
21.1.2.2
Number.isFinite (
number
21.1.2.3
Number.isInteger (
number
21.1.2.4
Number.isNaN (
number
21.1.2.5
Number.isSafeInteger (
number
21.1.2.6
Number.MAX_SAFE_INTEGER
21.1.2.7
Number.MAX_VALUE
21.1.2.8
Number.MIN_SAFE_INTEGER
21.1.2.9
Number.MIN_VALUE
21.1.2.10
Number.NaN
21.1.2.11
Number.NEGATIVE_INFINITY
21.1.2.12
Number.parseFloat (
string
21.1.2.13
Number.parseInt (
string
radix
21.1.2.14
Number.POSITIVE_INFINITY
21.1.2.15
Number.prototype
21.1.3
Properties of the Number Prototype Object
21.1.3.1
Number.prototype.constructor
21.1.3.2
Number.prototype.toExponential (
fractionDigits
21.1.3.3
Number.prototype.toFixed (
fractionDigits
21.1.3.4
Number.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
21.1.3.5
Number.prototype.toPrecision (
precision
21.1.3.6
Number.prototype.toString ( [
radix
] )
21.1.3.7
Number.prototype.valueOf ( )
21.1.4
Properties of Number Instances
21.2
BigInt Objects
21.2.1
The BigInt Constructor
21.2.1.1
BigInt (
value
21.2.1.1.1
NumberToBigInt (
number
21.2.2
Properties of the BigInt Constructor
21.2.2.1
BigInt.asIntN (
bits
bigint
21.2.2.2
BigInt.asUintN (
bits
bigint
21.2.2.3
BigInt.prototype
21.2.3
Properties of the BigInt Prototype Object
21.2.3.1
BigInt.prototype.constructor
21.2.3.2
BigInt.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
21.2.3.3
BigInt.prototype.toString ( [
radix
] )
21.2.3.4
BigInt.prototype.valueOf ( )
21.2.3.5
BigInt.prototype [ @@toStringTag ]
21.3
The Math Object
21.3.1
Value Properties of the Math Object
21.3.1.1
Math.E
21.3.1.2
Math.LN10
21.3.1.3
Math.LN2
21.3.1.4
Math.LOG10E
21.3.1.5
Math.LOG2E
21.3.1.6
Math.PI
21.3.1.7
Math.SQRT1_2
21.3.1.8
Math.SQRT2
21.3.1.9
Math [ @@toStringTag ]
21.3.2
Function Properties of the Math Object
21.3.2.1
Math.abs (
21.3.2.2
Math.acos (
21.3.2.3
Math.acosh (
21.3.2.4
Math.asin (
21.3.2.5
Math.asinh (
21.3.2.6
Math.atan (
21.3.2.7
Math.atanh (
21.3.2.8
Math.atan2 (
21.3.2.9
Math.cbrt (
21.3.2.10
Math.ceil (
21.3.2.11
Math.clz32 (
21.3.2.12
Math.cos (
21.3.2.13
Math.cosh (
21.3.2.14
Math.exp (
21.3.2.15
Math.expm1 (
21.3.2.16
Math.floor (
21.3.2.17
Math.fround (
21.3.2.18
Math.hypot ( ...
args
21.3.2.19
Math.imul (
21.3.2.20
Math.log (
21.3.2.21
Math.log1p (
21.3.2.22
Math.log10 (
21.3.2.23
Math.log2 (
21.3.2.24
Math.max ( ...
args
21.3.2.25
Math.min ( ...
args
21.3.2.26
Math.pow (
base
exponent
21.3.2.27
Math.random ( )
21.3.2.28
Math.round (
21.3.2.29
Math.sign (
21.3.2.30
Math.sin (
21.3.2.31
Math.sinh (
21.3.2.32
Math.sqrt (
21.3.2.33
Math.tan (
21.3.2.34
Math.tanh (
21.3.2.35
Math.trunc (
21.4
Date Objects
21.4.1
Overview of Date Objects and Definitions of Abstract Operations
21.4.1.1
Time Values and Time Range
21.4.1.2
Day Number and Time within Day
21.4.1.3
Year Number
21.4.1.4
Month Number
21.4.1.5
Date Number
21.4.1.6
Week Day
21.4.1.7
GetUTCEpochNanoseconds (
year
month
day
hour
minute
second
millisecond
microsecond
nanosecond
21.4.1.8
GetNamedTimeZoneEpochNanoseconds (
timeZoneIdentifier
year
month
day
hour
minute
second
millisecond
microsecond
nanosecond
21.4.1.9
GetNamedTimeZoneOffsetNanoseconds (
timeZoneIdentifier
epochNanoseconds
21.4.1.10
DefaultTimeZone ( )
21.4.1.11
LocalTime (
21.4.1.12
UTC (
21.4.1.13
Hours, Minutes, Second, and Milliseconds
21.4.1.14
MakeTime (
hour
min
sec
ms
21.4.1.15
MakeDay (
year
month
date
21.4.1.16
MakeDate (
day
time
21.4.1.17
TimeClip (
time
21.4.1.18
Date Time String Format
21.4.1.18.1
Expanded Years
21.4.1.19
Time Zone Offset String Format
21.4.1.19.1
IsTimeZoneOffsetString (
offsetString
21.4.1.19.2
ParseTimeZoneOffsetString (
offsetString
21.4.2
The Date Constructor
21.4.2.1
Date ( ...
values
21.4.3
Properties of the Date Constructor
21.4.3.1
Date.now ( )
21.4.3.2
Date.parse (
string
21.4.3.3
Date.prototype
21.4.3.4
Date.UTC (
year
[ ,
month
[ ,
date
[ ,
hours
[ ,
minutes
[ ,
seconds
[ ,
ms
] ] ] ] ] ] )
21.4.4
Properties of the Date Prototype Object
21.4.4.1
Date.prototype.constructor
21.4.4.2
Date.prototype.getDate ( )
21.4.4.3
Date.prototype.getDay ( )
21.4.4.4
Date.prototype.getFullYear ( )
21.4.4.5
Date.prototype.getHours ( )
21.4.4.6
Date.prototype.getMilliseconds ( )
21.4.4.7
Date.prototype.getMinutes ( )
21.4.4.8
Date.prototype.getMonth ( )
21.4.4.9
Date.prototype.getSeconds ( )
21.4.4.10
Date.prototype.getTime ( )
21.4.4.11
Date.prototype.getTimezoneOffset ( )
21.4.4.12
Date.prototype.getUTCDate ( )
21.4.4.13
Date.prototype.getUTCDay ( )
21.4.4.14
Date.prototype.getUTCFullYear ( )
21.4.4.15
Date.prototype.getUTCHours ( )
21.4.4.16
Date.prototype.getUTCMilliseconds ( )
21.4.4.17
Date.prototype.getUTCMinutes ( )
21.4.4.18
Date.prototype.getUTCMonth ( )
21.4.4.19
Date.prototype.getUTCSeconds ( )
21.4.4.20
Date.prototype.setDate (
date
21.4.4.21
Date.prototype.setFullYear (
year
[ ,
month
[ ,
date
] ] )
21.4.4.22
Date.prototype.setHours (
hour
[ ,
min
[ ,
sec
[ ,
ms
] ] ] )
21.4.4.23
Date.prototype.setMilliseconds (
ms
21.4.4.24
Date.prototype.setMinutes (
min
[ ,
sec
[ ,
ms
] ] )
21.4.4.25
Date.prototype.setMonth (
month
[ ,
date
] )
21.4.4.26
Date.prototype.setSeconds (
sec
[ ,
ms
] )
21.4.4.27
Date.prototype.setTime (
time
21.4.4.28
Date.prototype.setUTCDate (
date
21.4.4.29
Date.prototype.setUTCFullYear (
year
[ ,
month
[ ,
date
] ] )
21.4.4.30
Date.prototype.setUTCHours (
hour
[ ,
min
[ ,
sec
[ ,
ms
] ] ] )
21.4.4.31
Date.prototype.setUTCMilliseconds (
ms
21.4.4.32
Date.prototype.setUTCMinutes (
min
[ ,
sec
[ ,
ms
] ] )
21.4.4.33
Date.prototype.setUTCMonth (
month
[ ,
date
] )
21.4.4.34
Date.prototype.setUTCSeconds (
sec
[ ,
ms
] )
21.4.4.35
Date.prototype.toDateString ( )
21.4.4.36
Date.prototype.toISOString ( )
21.4.4.37
Date.prototype.toJSON (
key
21.4.4.38
Date.prototype.toLocaleDateString ( [
reserved1
[ ,
reserved2
] ] )
21.4.4.39
Date.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
21.4.4.40
Date.prototype.toLocaleTimeString ( [
reserved1
[ ,
reserved2
] ] )
21.4.4.41
Date.prototype.toString ( )
21.4.4.41.1
TimeString (
tv
21.4.4.41.2
DateString (
tv
21.4.4.41.3
TimeZoneString (
tv
21.4.4.41.4
ToDateString (
tv
21.4.4.42
Date.prototype.toTimeString ( )
21.4.4.43
Date.prototype.toUTCString ( )
21.4.4.44
Date.prototype.valueOf ( )
21.4.4.45
Date.prototype [ @@toPrimitive ] (
hint
21.4.5
Properties of Date Instances
22
Text Processing
22.1
String Objects
22.1.1
The String Constructor
22.1.1.1
String (
value
22.1.2
Properties of the String Constructor
22.1.2.1
String.fromCharCode ( ...
codeUnits
22.1.2.2
String.fromCodePoint ( ...
codePoints
22.1.2.3
String.prototype
22.1.2.4
String.raw (
template
, ...
substitutions
22.1.3
Properties of the String Prototype Object
22.1.3.1
String.prototype.at (
index
22.1.3.2
String.prototype.charAt (
pos
22.1.3.3
String.prototype.charCodeAt (
pos
22.1.3.4
String.prototype.codePointAt (
pos
22.1.3.5
String.prototype.concat ( ...
args
22.1.3.6
String.prototype.constructor
22.1.3.7
String.prototype.endsWith (
searchString
[ ,
endPosition
] )
22.1.3.8
String.prototype.includes (
searchString
[ ,
position
] )
22.1.3.9
String.prototype.indexOf (
searchString
[ ,
position
] )
22.1.3.10
String.prototype.lastIndexOf (
searchString
[ ,
position
] )
22.1.3.11
String.prototype.localeCompare (
that
[ ,
reserved1
[ ,
reserved2
] ] )
22.1.3.12
String.prototype.match (
regexp
22.1.3.13
String.prototype.matchAll (
regexp
22.1.3.14
String.prototype.normalize ( [
form
] )
22.1.3.15
String.prototype.padEnd (
maxLength
[ ,
fillString
] )
22.1.3.16
String.prototype.padStart (
maxLength
[ ,
fillString
] )
22.1.3.16.1
StringPad (
maxLength
fillString
placement
22.1.3.16.2
ToZeroPaddedDecimalString (
minLength
22.1.3.17
String.prototype.repeat (
count
22.1.3.18
String.prototype.replace (
searchValue
replaceValue
22.1.3.18.1
GetSubstitution (
matched
str
position
captures
namedCaptures
replacementTemplate
22.1.3.19
String.prototype.replaceAll (
searchValue
replaceValue
22.1.3.20
String.prototype.search (
regexp
22.1.3.21
String.prototype.slice (
start
end
22.1.3.22
String.prototype.split (
separator
limit
22.1.3.23
String.prototype.startsWith (
searchString
[ ,
position
] )
22.1.3.24
String.prototype.substring (
start
end
22.1.3.25
String.prototype.toLocaleLowerCase ( [
reserved1
[ ,
reserved2
] ] )
22.1.3.26
String.prototype.toLocaleUpperCase ( [
reserved1
[ ,
reserved2
] ] )
22.1.3.27
String.prototype.toLowerCase ( )
22.1.3.28
String.prototype.toString ( )
22.1.3.29
String.prototype.toUpperCase ( )
22.1.3.30
String.prototype.trim ( )
22.1.3.30.1
TrimString (
string
where
22.1.3.31
String.prototype.trimEnd ( )
22.1.3.32
String.prototype.trimStart ( )
22.1.3.33
String.prototype.valueOf ( )
22.1.3.34
String.prototype [ @@iterator ] ( )
22.1.4
Properties of String Instances
22.1.4.1
length
22.1.5
String Iterator Objects
22.1.5.1
The %StringIteratorPrototype% Object
22.1.5.1.1
%StringIteratorPrototype%.next ( )
22.1.5.1.2
%StringIteratorPrototype% [ @@toStringTag ]
22.2
RegExp (Regular Expression) Objects
22.2.1
Patterns
22.2.1.1
SS: Early Errors
22.2.1.2
SS: CountLeftCapturingParensWithin (
node
22.2.1.3
SS: CountLeftCapturingParensBefore (
node
22.2.1.4
SS: CapturingGroupNumber
22.2.1.5
SS: IsCharacterClass
22.2.1.6
SS: CharacterValue
22.2.1.7
SS: GroupSpecifiersThatMatch (
thisGroupName
22.2.1.8
SS: CapturingGroupName
22.2.1.9
SS: RegExpIdentifierCodePoints
22.2.1.10
SS: RegExpIdentifierCodePoint
22.2.2
Pattern Semantics
22.2.2.1
Notation
22.2.2.1.1
RegExp Records
22.2.2.2
RS: CompilePattern
22.2.2.3
RS: CompileSubpattern
22.2.2.3.1
RepeatMatcher (
min
max
greedy
parenIndex
parenCount
22.2.2.4
RS: CompileAssertion
22.2.2.4.1
IsWordChar (
rer
Input
22.2.2.5
RS: CompileQuantifier
22.2.2.6
RS: CompileQuantifierPrefix
22.2.2.7
RS: CompileAtom
22.2.2.7.1
CharacterSetMatcher (
rer
invert
direction
22.2.2.7.2
BackreferenceMatcher (
rer
direction
22.2.2.7.3
Canonicalize (
rer
ch
22.2.2.8
RS: CompileCharacterClass
22.2.2.9
RS: CompileToCharSet
22.2.2.9.1
CharacterRange (
22.2.2.9.2
WordCharacters (
rer
22.2.2.9.3
UnicodeMatchProperty (
22.2.2.9.4
UnicodeMatchPropertyValue (
22.2.3
Abstract Operations for RegExp Creation
22.2.3.1
RegExpCreate (
22.2.3.2
RegExpAlloc (
newTarget
22.2.3.3
RegExpInitialize (
obj
pattern
flags
22.2.3.4
SS: ParsePattern (
patternText
22.2.4
The RegExp Constructor
22.2.4.1
RegExp (
pattern
flags
22.2.5
Properties of the RegExp Constructor
22.2.5.1
RegExp.prototype
22.2.5.2
get RegExp [ @@species ]
22.2.6
Properties of the RegExp Prototype Object
22.2.6.1
RegExp.prototype.constructor
22.2.6.2
RegExp.prototype.exec (
string
22.2.6.3
get RegExp.prototype.dotAll
22.2.6.4
get RegExp.prototype.flags
22.2.6.4.1
RegExpHasFlag (
codeUnit
22.2.6.5
get RegExp.prototype.global
22.2.6.6
get RegExp.prototype.hasIndices
22.2.6.7
get RegExp.prototype.ignoreCase
22.2.6.8
RegExp.prototype [ @@match ] (
string
22.2.6.9
RegExp.prototype [ @@matchAll ] (
string
22.2.6.10
get RegExp.prototype.multiline
22.2.6.11
RegExp.prototype [ @@replace ] (
string
replaceValue
22.2.6.12
RegExp.prototype [ @@search ] (
string
22.2.6.13
get RegExp.prototype.source
22.2.6.13.1
EscapeRegExpPattern (
22.2.6.14
RegExp.prototype [ @@split ] (
string
limit
22.2.6.15
get RegExp.prototype.sticky
22.2.6.16
RegExp.prototype.test (
22.2.6.17
RegExp.prototype.toString ( )
22.2.6.18
get RegExp.prototype.unicode
22.2.7
Abstract Operations for RegExp Matching
22.2.7.1
RegExpExec (
22.2.7.2
RegExpBuiltinExec (
22.2.7.3
AdvanceStringIndex (
index
unicode
22.2.7.4
GetStringIndex (
codePointIndex
22.2.7.5
Match Records
22.2.7.6
GetMatchString (
match
22.2.7.7
GetMatchIndexPair (
match
22.2.7.8
MakeMatchIndicesIndexPairArray (
indices
groupNames
hasGroups
22.2.8
Properties of RegExp Instances
22.2.8.1
lastIndex
22.2.9
RegExp String Iterator Objects
22.2.9.1
CreateRegExpStringIterator (
global
fullUnicode
22.2.9.2
The %RegExpStringIteratorPrototype% Object
22.2.9.2.1
%RegExpStringIteratorPrototype%.next ( )
22.2.9.2.2
%RegExpStringIteratorPrototype% [ @@toStringTag ]
23
Indexed Collections
23.1
Array Objects
23.1.1
The Array Constructor
23.1.1.1
Array ( ...
values
23.1.2
Properties of the Array Constructor
23.1.2.1
Array.from (
items
[ ,
mapfn
[ ,
thisArg
] ] )
23.1.2.2
Array.isArray (
arg
23.1.2.3
Array.of ( ...
items
23.1.2.4
Array.prototype
23.1.2.5
get Array [ @@species ]
23.1.3
Properties of the Array Prototype Object
23.1.3.1
Array.prototype.at (
index
23.1.3.2
Array.prototype.concat ( ...
items
23.1.3.2.1
IsConcatSpreadable (
23.1.3.3
Array.prototype.constructor
23.1.3.4
Array.prototype.copyWithin (
target
start
[ ,
end
] )
23.1.3.5
Array.prototype.entries ( )
23.1.3.6
Array.prototype.every (
callbackfn
[ ,
thisArg
] )
23.1.3.7
Array.prototype.fill (
value
[ ,
start
[ ,
end
] ] )
23.1.3.8
Array.prototype.filter (
callbackfn
[ ,
thisArg
] )
23.1.3.9
Array.prototype.find (
predicate
[ ,
thisArg
] )
23.1.3.10
Array.prototype.findIndex (
predicate
[ ,
thisArg
] )
23.1.3.11
Array.prototype.findLast (
predicate
[ ,
thisArg
] )
23.1.3.12
Array.prototype.findLastIndex (
predicate
[ ,
thisArg
] )
23.1.3.12.1
FindViaPredicate (
len
direction
predicate
thisArg
23.1.3.13
Array.prototype.flat ( [
depth
] )
23.1.3.13.1
FlattenIntoArray (
target
source
sourceLen
start
depth
[ ,
mapperFunction
[ ,
thisArg
] ] )
23.1.3.14
Array.prototype.flatMap (
mapperFunction
[ ,
thisArg
] )
23.1.3.15
Array.prototype.forEach (
callbackfn
[ ,
thisArg
] )
23.1.3.16
Array.prototype.includes (
searchElement
[ ,
fromIndex
] )
23.1.3.17
Array.prototype.indexOf (
searchElement
[ ,
fromIndex
] )
23.1.3.18
Array.prototype.join (
separator
23.1.3.19
Array.prototype.keys ( )
23.1.3.20
Array.prototype.lastIndexOf (
searchElement
[ ,
fromIndex
] )
23.1.3.21
Array.prototype.map (
callbackfn
[ ,
thisArg
] )
23.1.3.22
Array.prototype.pop ( )
23.1.3.23
Array.prototype.push ( ...
items
23.1.3.24
Array.prototype.reduce (
callbackfn
[ ,
initialValue
] )
23.1.3.25
Array.prototype.reduceRight (
callbackfn
[ ,
initialValue
] )
23.1.3.26
Array.prototype.reverse ( )
23.1.3.27
Array.prototype.shift ( )
23.1.3.28
Array.prototype.slice (
start
end
23.1.3.29
Array.prototype.some (
callbackfn
[ ,
thisArg
] )
23.1.3.30
Array.prototype.sort (
comparefn
23.1.3.30.1
SortIndexedProperties (
obj
len
SortCompare
holes
23.1.3.30.2
CompareArrayElements (
comparefn
23.1.3.31
Array.prototype.splice (
start
deleteCount
, ...
items
23.1.3.32
Array.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
23.1.3.33
Array.prototype.toReversed ( )
23.1.3.34
Array.prototype.toSorted (
comparefn
23.1.3.35
Array.prototype.toSpliced (
start
skipCount
, ...
items
23.1.3.36
Array.prototype.toString ( )
23.1.3.37
Array.prototype.unshift ( ...
items
23.1.3.38
Array.prototype.values ( )
23.1.3.39
Array.prototype.with (
index
value
23.1.3.40
Array.prototype [ @@iterator ] ( )
23.1.3.41
Array.prototype [ @@unscopables ]
23.1.4
Properties of Array Instances
23.1.4.1
length
23.1.5
Array Iterator Objects
23.1.5.1
CreateArrayIterator (
array
kind
23.1.5.2
The %ArrayIteratorPrototype% Object
23.1.5.2.1
%ArrayIteratorPrototype%.next ( )
23.1.5.2.2
%ArrayIteratorPrototype% [ @@toStringTag ]
23.2
TypedArray Objects
23.2.1
The %TypedArray% Intrinsic Object
23.2.1.1
%TypedArray% ( )
23.2.2
Properties of the %TypedArray% Intrinsic Object
23.2.2.1
%TypedArray%.from (
source
[ ,
mapfn
[ ,
thisArg
] ] )
23.2.2.2
%TypedArray%.of ( ...
items
23.2.2.3
%TypedArray%.prototype
23.2.2.4
get %TypedArray% [ @@species ]
23.2.3
Properties of the %TypedArray% Prototype Object
23.2.3.1
%TypedArray%.prototype.at (
index
23.2.3.2
get %TypedArray%.prototype.buffer
23.2.3.3
get %TypedArray%.prototype.byteLength
23.2.3.4
get %TypedArray%.prototype.byteOffset
23.2.3.5
%TypedArray%.prototype.constructor
23.2.3.6
%TypedArray%.prototype.copyWithin (
target
start
[ ,
end
] )
23.2.3.7
%TypedArray%.prototype.entries ( )
23.2.3.8
%TypedArray%.prototype.every (
callbackfn
[ ,
thisArg
] )
23.2.3.9
%TypedArray%.prototype.fill (
value
[ ,
start
[ ,
end
] ] )
23.2.3.10
%TypedArray%.prototype.filter (
callbackfn
[ ,
thisArg
] )
23.2.3.11
%TypedArray%.prototype.find (
predicate
[ ,
thisArg
] )
23.2.3.12
%TypedArray%.prototype.findIndex (
predicate
[ ,
thisArg
] )
23.2.3.13
%TypedArray%.prototype.findLast (
predicate
[ ,
thisArg
] )
23.2.3.14
%TypedArray%.prototype.findLastIndex (
predicate
[ ,
thisArg
] )
23.2.3.15
%TypedArray%.prototype.forEach (
callbackfn
[ ,
thisArg
] )
23.2.3.16
%TypedArray%.prototype.includes (
searchElement
[ ,
fromIndex
] )
23.2.3.17
%TypedArray%.prototype.indexOf (
searchElement
[ ,
fromIndex
] )
23.2.3.18
%TypedArray%.prototype.join (
separator
23.2.3.19
%TypedArray%.prototype.keys ( )
23.2.3.20
%TypedArray%.prototype.lastIndexOf (
searchElement
[ ,
fromIndex
] )
23.2.3.21
get %TypedArray%.prototype.length
23.2.3.22
%TypedArray%.prototype.map (
callbackfn
[ ,
thisArg
] )
23.2.3.23
%TypedArray%.prototype.reduce (
callbackfn
[ ,
initialValue
] )
23.2.3.24
%TypedArray%.prototype.reduceRight (
callbackfn
[ ,
initialValue
] )
23.2.3.25
%TypedArray%.prototype.reverse ( )
23.2.3.26
%TypedArray%.prototype.set (
source
[ ,
offset
] )
23.2.3.26.1
SetTypedArrayFromTypedArray (
target
targetOffset
source
23.2.3.26.2
SetTypedArrayFromArrayLike (
target
targetOffset
source
23.2.3.27
%TypedArray%.prototype.slice (
start
end
23.2.3.28
%TypedArray%.prototype.some (
callbackfn
[ ,
thisArg
] )
23.2.3.29
%TypedArray%.prototype.sort (
comparefn
23.2.3.30
%TypedArray%.prototype.subarray (
begin
end
23.2.3.31
%TypedArray%.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
23.2.3.32
%TypedArray%.prototype.toReversed ( )
23.2.3.33
%TypedArray%.prototype.toSorted (
comparefn
23.2.3.34
%TypedArray%.prototype.toString ( )
23.2.3.35
%TypedArray%.prototype.values ( )
23.2.3.36
%TypedArray%.prototype.with (
index
value
23.2.3.37
%TypedArray%.prototype [ @@iterator ] ( )
23.2.3.38
get %TypedArray%.prototype [ @@toStringTag ]
23.2.4
Abstract Operations for TypedArray Objects
23.2.4.1
TypedArraySpeciesCreate (
exemplar
argumentList
23.2.4.2
TypedArrayCreate (
constructor
argumentList
23.2.4.3
TypedArrayCreateSameType (
exemplar
argumentList
23.2.4.4
ValidateTypedArray (
23.2.4.5
TypedArrayElementSize (
23.2.4.6
TypedArrayElementType (
23.2.4.7
CompareTypedArrayElements (
comparefn
23.2.5
The
TypedArray
Constructors
23.2.5.1
TypedArray
( ...
args
23.2.5.1.1
AllocateTypedArray (
constructorName
newTarget
defaultProto
[ ,
length
] )
23.2.5.1.2
InitializeTypedArrayFromTypedArray (
srcArray
23.2.5.1.3
InitializeTypedArrayFromArrayBuffer (
buffer
byteOffset
length
23.2.5.1.4
InitializeTypedArrayFromList (
values
23.2.5.1.5
InitializeTypedArrayFromArrayLike (
arrayLike
23.2.5.1.6
AllocateTypedArrayBuffer (
length
23.2.6
Properties of the
TypedArray
Constructors
23.2.6.1
TypedArray
.BYTES_PER_ELEMENT
23.2.6.2
TypedArray
.prototype
23.2.7
Properties of the
TypedArray
Prototype Objects
23.2.7.1
TypedArray
.prototype.BYTES_PER_ELEMENT
23.2.7.2
TypedArray
.prototype.constructor
23.2.8
Properties of
TypedArray
Instances
24
Keyed Collections
24.1
Map Objects
24.1.1
The Map Constructor
24.1.1.1
Map ( [
iterable
] )
24.1.1.2
AddEntriesFromIterable (
target
iterable
adder
24.1.2
Properties of the Map Constructor
24.1.2.1
Map.prototype
24.1.2.2
get Map [ @@species ]
24.1.3
Properties of the Map Prototype Object
24.1.3.1
Map.prototype.clear ( )
24.1.3.2
Map.prototype.constructor
24.1.3.3
Map.prototype.delete (
key
24.1.3.4
Map.prototype.entries ( )
24.1.3.5
Map.prototype.forEach (
callbackfn
[ ,
thisArg
] )
24.1.3.6
Map.prototype.get (
key
24.1.3.7
Map.prototype.has (
key
24.1.3.8
Map.prototype.keys ( )
24.1.3.9
Map.prototype.set (
key
value
24.1.3.10
get Map.prototype.size
24.1.3.11
Map.prototype.values ( )
24.1.3.12
Map.prototype [ @@iterator ] ( )
24.1.3.13
Map.prototype [ @@toStringTag ]
24.1.4
Properties of Map Instances
24.1.5
Map Iterator Objects
24.1.5.1
CreateMapIterator (
map
kind
24.1.5.2
The %MapIteratorPrototype% Object
24.1.5.2.1
%MapIteratorPrototype%.next ( )
24.1.5.2.2
%MapIteratorPrototype% [ @@toStringTag ]
24.2
Set Objects
24.2.1
The Set Constructor
24.2.1.1
Set ( [
iterable
] )
24.2.2
Properties of the Set Constructor
24.2.2.1
Set.prototype
24.2.2.2
get Set [ @@species ]
24.2.3
Properties of the Set Prototype Object
24.2.3.1
Set.prototype.add (
value
24.2.3.2
Set.prototype.clear ( )
24.2.3.3
Set.prototype.constructor
24.2.3.4
Set.prototype.delete (
value
24.2.3.5
Set.prototype.entries ( )
24.2.3.6
Set.prototype.forEach (
callbackfn
[ ,
thisArg
] )
24.2.3.7
Set.prototype.has (
value
24.2.3.8
Set.prototype.keys ( )
24.2.3.9
get Set.prototype.size
24.2.3.10
Set.prototype.values ( )
24.2.3.11
Set.prototype [ @@iterator ] ( )
24.2.3.12
Set.prototype [ @@toStringTag ]
24.2.4
Properties of Set Instances
24.2.5
Set Iterator Objects
24.2.5.1
CreateSetIterator (
set
kind
24.2.5.2
The %SetIteratorPrototype% Object
24.2.5.2.1
%SetIteratorPrototype%.next ( )
24.2.5.2.2
%SetIteratorPrototype% [ @@toStringTag ]
24.3
WeakMap Objects
24.3.1
The WeakMap Constructor
24.3.1.1
WeakMap ( [
iterable
] )
24.3.2
Properties of the WeakMap Constructor
24.3.2.1
WeakMap.prototype
24.3.3
Properties of the WeakMap Prototype Object
24.3.3.1
WeakMap.prototype.constructor
24.3.3.2
WeakMap.prototype.delete (
key
24.3.3.3
WeakMap.prototype.get (
key
24.3.3.4
WeakMap.prototype.has (
key
24.3.3.5
WeakMap.prototype.set (
key
value
24.3.3.6
WeakMap.prototype [ @@toStringTag ]
24.3.4
Properties of WeakMap Instances
24.4
WeakSet Objects
24.4.1
The WeakSet Constructor
24.4.1.1
WeakSet ( [
iterable
] )
24.4.2
Properties of the WeakSet Constructor
24.4.2.1
WeakSet.prototype
24.4.3
Properties of the WeakSet Prototype Object
24.4.3.1
WeakSet.prototype.add (
value
24.4.3.2
WeakSet.prototype.constructor
24.4.3.3
WeakSet.prototype.delete (
value
24.4.3.4
WeakSet.prototype.has (
value
24.4.3.5
WeakSet.prototype [ @@toStringTag ]
24.4.4
Properties of WeakSet Instances
25
Structured Data
25.1
ArrayBuffer Objects
25.1.1
Notation
25.1.2
Abstract Operations For ArrayBuffer Objects
25.1.2.1
AllocateArrayBuffer (
constructor
byteLength
25.1.2.2
IsDetachedBuffer (
arrayBuffer
25.1.2.3
DetachArrayBuffer (
arrayBuffer
[ ,
key
] )
25.1.2.4
CloneArrayBuffer (
srcBuffer
srcByteOffset
srcLength
25.1.2.5
IsUnsignedElementType (
type
25.1.2.6
IsUnclampedIntegerElementType (
type
25.1.2.7
IsBigIntElementType (
type
25.1.2.8
IsNoTearConfiguration (
type
order
25.1.2.9
RawBytesToNumeric (
type
rawBytes
isLittleEndian
25.1.2.10
GetValueFromBuffer (
arrayBuffer
byteIndex
type
isTypedArray
order
[ ,
isLittleEndian
] )
25.1.2.11
NumericToRawBytes (
type
value
isLittleEndian
25.1.2.12
SetValueInBuffer (
arrayBuffer
byteIndex
type
value
isTypedArray
order
[ ,
isLittleEndian
] )
25.1.2.13
GetModifySetValueInBuffer (
arrayBuffer
byteIndex
type
value
op
[ ,
isLittleEndian
] )
25.1.3
The ArrayBuffer Constructor
25.1.3.1
ArrayBuffer (
length
25.1.4
Properties of the ArrayBuffer Constructor
25.1.4.1
ArrayBuffer.isView (
arg
25.1.4.2
ArrayBuffer.prototype
25.1.4.3
get ArrayBuffer [ @@species ]
25.1.5
Properties of the ArrayBuffer Prototype Object
25.1.5.1
get ArrayBuffer.prototype.byteLength
25.1.5.2
ArrayBuffer.prototype.constructor
25.1.5.3
ArrayBuffer.prototype.slice (
start
end
25.1.5.4
ArrayBuffer.prototype [ @@toStringTag ]
25.1.6
Properties of ArrayBuffer Instances
25.2
SharedArrayBuffer Objects
25.2.1
Abstract Operations for SharedArrayBuffer Objects
25.2.1.1
AllocateSharedArrayBuffer (
constructor
byteLength
25.2.1.2
IsSharedArrayBuffer (
obj
25.2.2
The SharedArrayBuffer Constructor
25.2.2.1
SharedArrayBuffer (
length
25.2.3
Properties of the SharedArrayBuffer Constructor
25.2.3.1
SharedArrayBuffer.prototype
25.2.3.2
get SharedArrayBuffer [ @@species ]
25.2.4
Properties of the SharedArrayBuffer Prototype Object
25.2.4.1
get SharedArrayBuffer.prototype.byteLength
25.2.4.2
SharedArrayBuffer.prototype.constructor
25.2.4.3
SharedArrayBuffer.prototype.slice (
start
end
25.2.4.4
SharedArrayBuffer.prototype [ @@toStringTag ]
25.2.5
Properties of SharedArrayBuffer Instances
25.3
DataView Objects
25.3.1
Abstract Operations For DataView Objects
25.3.1.1
GetViewValue (
view
requestIndex
isLittleEndian
type
25.3.1.2
SetViewValue (
view
requestIndex
isLittleEndian
type
value
25.3.2
The DataView Constructor
25.3.2.1
DataView (
buffer
[ ,
byteOffset
[ ,
byteLength
] ] )
25.3.3
Properties of the DataView Constructor
25.3.3.1
DataView.prototype
25.3.4
Properties of the DataView Prototype Object
25.3.4.1
get DataView.prototype.buffer
25.3.4.2
get DataView.prototype.byteLength
25.3.4.3
get DataView.prototype.byteOffset
25.3.4.4
DataView.prototype.constructor
25.3.4.5
DataView.prototype.getBigInt64 (
byteOffset
[ ,
littleEndian
] )
25.3.4.6
DataView.prototype.getBigUint64 (
byteOffset
[ ,
littleEndian
] )
25.3.4.7
DataView.prototype.getFloat32 (
byteOffset
[ ,
littleEndian
] )
25.3.4.8
DataView.prototype.getFloat64 (
byteOffset
[ ,
littleEndian
] )
25.3.4.9
DataView.prototype.getInt8 (
byteOffset
25.3.4.10
DataView.prototype.getInt16 (
byteOffset
[ ,
littleEndian
] )
25.3.4.11
DataView.prototype.getInt32 (
byteOffset
[ ,
littleEndian
] )
25.3.4.12
DataView.prototype.getUint8 (
byteOffset
25.3.4.13
DataView.prototype.getUint16 (
byteOffset
[ ,
littleEndian
] )
25.3.4.14
DataView.prototype.getUint32 (
byteOffset
[ ,
littleEndian
] )
25.3.4.15
DataView.prototype.setBigInt64 (
byteOffset
value
[ ,
littleEndian
] )
25.3.4.16
DataView.prototype.setBigUint64 (
byteOffset
value
[ ,
littleEndian
] )
25.3.4.17
DataView.prototype.setFloat32 (
byteOffset
value
[ ,
littleEndian
] )
25.3.4.18
DataView.prototype.setFloat64 (
byteOffset
value
[ ,
littleEndian
] )
25.3.4.19
DataView.prototype.setInt8 (
byteOffset
value
25.3.4.20
DataView.prototype.setInt16 (
byteOffset
value
[ ,
littleEndian
] )
25.3.4.21
DataView.prototype.setInt32 (
byteOffset
value
[ ,
littleEndian
] )
25.3.4.22
DataView.prototype.setUint8 (
byteOffset
value
25.3.4.23
DataView.prototype.setUint16 (
byteOffset
value
[ ,
littleEndian
] )
25.3.4.24
DataView.prototype.setUint32 (
byteOffset
value
[ ,
littleEndian
] )
25.3.4.25
DataView.prototype [ @@toStringTag ]
25.3.5
Properties of DataView Instances
25.4
The Atomics Object
25.4.1
WaiterList Objects
25.4.2
Abstract Operations for Atomics
25.4.2.1
ValidateIntegerTypedArray (
typedArray
[ ,
waitable
] )
25.4.2.2
ValidateAtomicAccess (
typedArray
requestIndex
25.4.2.3
GetWaiterList (
block
25.4.2.4
EnterCriticalSection (
WL
25.4.2.5
LeaveCriticalSection (
WL
25.4.2.6
AddWaiter (
WL
25.4.2.7
RemoveWaiter (
WL
25.4.2.8
RemoveWaiters (
WL
25.4.2.9
SuspendAgent (
WL
minimumTimeout
25.4.2.10
NotifyWaiter (
WL
25.4.2.11
AtomicReadModifyWrite (
typedArray
index
value
op
25.4.2.12
ByteListBitwiseOp (
op
xBytes
yBytes
25.4.2.13
ByteListEqual (
xBytes
yBytes
25.4.3
Atomics.add (
typedArray
index
value
25.4.4
Atomics.and (
typedArray
index
value
25.4.5
Atomics.compareExchange (
typedArray
index
expectedValue
replacementValue
25.4.6
Atomics.exchange (
typedArray
index
value
25.4.7
Atomics.isLockFree (
size
25.4.8
Atomics.load (
typedArray
index
25.4.9
Atomics.or (
typedArray
index
value
25.4.10
Atomics.store (
typedArray
index
value
25.4.11
Atomics.sub (
typedArray
index
value
25.4.12
Atomics.wait (
typedArray
index
value
timeout
25.4.13
Atomics.notify (
typedArray
index
count
25.4.14
Atomics.xor (
typedArray
index
value
25.4.15
Atomics [ @@toStringTag ]
25.5
The JSON Object
25.5.1
JSON.parse (
text
[ ,
reviver
] )
25.5.1.1
InternalizeJSONProperty (
holder
name
reviver
25.5.2
JSON.stringify (
value
[ ,
replacer
[ ,
space
] ] )
25.5.2.1
JSON Serialization Record
25.5.2.2
SerializeJSONProperty (
state
key
holder
25.5.2.3
QuoteJSONString (
value
25.5.2.4
UnicodeEscape (
25.5.2.5
SerializeJSONObject (
state
value
25.5.2.6
SerializeJSONArray (
state
value
25.5.3
JSON [ @@toStringTag ]
26
Managing Memory
26.1
WeakRef Objects
26.1.1
The WeakRef Constructor
26.1.1.1
WeakRef (
target
26.1.2
Properties of the WeakRef Constructor
26.1.2.1
WeakRef.prototype
26.1.3
Properties of the WeakRef Prototype Object
26.1.3.1
WeakRef.prototype.constructor
26.1.3.2
WeakRef.prototype.deref ( )
26.1.3.3
WeakRef.prototype [ @@toStringTag ]
26.1.4
WeakRef Abstract Operations
26.1.4.1
WeakRefDeref (
weakRef
26.1.5
Properties of WeakRef Instances
26.2
FinalizationRegistry Objects
26.2.1
The FinalizationRegistry Constructor
26.2.1.1
FinalizationRegistry (
cleanupCallback
26.2.2
Properties of the FinalizationRegistry Constructor
26.2.2.1
FinalizationRegistry.prototype
26.2.3
Properties of the FinalizationRegistry Prototype Object
26.2.3.1
FinalizationRegistry.prototype.constructor
26.2.3.2
FinalizationRegistry.prototype.register (
target
heldValue
[ ,
unregisterToken
] )
26.2.3.3
FinalizationRegistry.prototype.unregister (
unregisterToken
26.2.3.4
FinalizationRegistry.prototype [ @@toStringTag ]
26.2.4
Properties of FinalizationRegistry Instances
27
Control Abstraction Objects
27.1
Iteration
27.1.1
Common Iteration Interfaces
27.1.1.1
The
Iterable
Interface
27.1.1.2
The
Iterator
Interface
27.1.1.3
The
AsyncIterable
Interface
27.1.1.4
The
AsyncIterator
Interface
27.1.1.5
The
IteratorResult
Interface
27.1.2
The %IteratorPrototype% Object
27.1.2.1
%IteratorPrototype% [ @@iterator ] ( )
27.1.3
The %AsyncIteratorPrototype% Object
27.1.3.1
%AsyncIteratorPrototype% [ @@asyncIterator ] ( )
27.1.4
Async-from-Sync Iterator Objects
27.1.4.1
CreateAsyncFromSyncIterator (
syncIteratorRecord
27.1.4.2
The %AsyncFromSyncIteratorPrototype% Object
27.1.4.2.1
%AsyncFromSyncIteratorPrototype%.next ( [
value
] )
27.1.4.2.2
%AsyncFromSyncIteratorPrototype%.return ( [
value
] )
27.1.4.2.3
%AsyncFromSyncIteratorPrototype%.throw ( [
value
] )
27.1.4.3
Properties of Async-from-Sync Iterator Instances
27.1.4.4
AsyncFromSyncIteratorContinuation (
result
promiseCapability
27.2
Promise Objects
27.2.1
Promise Abstract Operations
27.2.1.1
PromiseCapability Records
27.2.1.1.1
IfAbruptRejectPromise (
value
capability
27.2.1.2
PromiseReaction Records
27.2.1.3
CreateResolvingFunctions (
promise
27.2.1.3.1
Promise Reject Functions
27.2.1.3.2
Promise Resolve Functions
27.2.1.4
FulfillPromise (
promise
value
27.2.1.5
NewPromiseCapability (
27.2.1.6
IsPromise (
27.2.1.7
RejectPromise (
promise
reason
27.2.1.8
TriggerPromiseReactions (
reactions
argument
27.2.1.9
HostPromiseRejectionTracker (
promise
operation
27.2.2
Promise Jobs
27.2.2.1
NewPromiseReactionJob (
reaction
argument
27.2.2.2
NewPromiseResolveThenableJob (
promiseToResolve
thenable
then
27.2.3
The Promise Constructor
27.2.3.1
Promise (
executor
27.2.4
Properties of the Promise Constructor
27.2.4.1
Promise.all (
iterable
27.2.4.1.1
GetPromiseResolve (
promiseConstructor
27.2.4.1.2
PerformPromiseAll (
iteratorRecord
constructor
resultCapability
promiseResolve
27.2.4.1.3
Promise.all
Resolve Element Functions
27.2.4.2
Promise.allSettled (
iterable
27.2.4.2.1
PerformPromiseAllSettled (
iteratorRecord
constructor
resultCapability
promiseResolve
27.2.4.2.2
Promise.allSettled
Resolve Element Functions
27.2.4.2.3
Promise.allSettled
Reject Element Functions
27.2.4.3
Promise.any (
iterable
27.2.4.3.1
PerformPromiseAny (
iteratorRecord
constructor
resultCapability
promiseResolve
27.2.4.3.2
Promise.any
Reject Element Functions
27.2.4.4
Promise.prototype
27.2.4.5
Promise.race (
iterable
27.2.4.5.1
PerformPromiseRace (
iteratorRecord
constructor
resultCapability
promiseResolve
27.2.4.6
Promise.reject (
27.2.4.7
Promise.resolve (
27.2.4.7.1
PromiseResolve (
27.2.4.8
get Promise [ @@species ]
27.2.5
Properties of the Promise Prototype Object
27.2.5.1
Promise.prototype.catch (
onRejected
27.2.5.2
Promise.prototype.constructor
27.2.5.3
Promise.prototype.finally (
onFinally
27.2.5.4
Promise.prototype.then (
onFulfilled
onRejected
27.2.5.4.1
PerformPromiseThen (
promise
onFulfilled
onRejected
[ ,
resultCapability
] )
27.2.5.5
Promise.prototype [ @@toStringTag ]
27.2.6
Properties of Promise Instances
27.3
GeneratorFunction Objects
27.3.1
The GeneratorFunction Constructor
27.3.1.1
GeneratorFunction ( ...
parameterArgs
bodyArg
27.3.2
Properties of the GeneratorFunction Constructor
27.3.2.1
GeneratorFunction.length
27.3.2.2
GeneratorFunction.prototype
27.3.3
Properties of the GeneratorFunction Prototype Object
27.3.3.1
GeneratorFunction.prototype.constructor
27.3.3.2
GeneratorFunction.prototype.prototype
27.3.3.3
GeneratorFunction.prototype [ @@toStringTag ]
27.3.4
GeneratorFunction Instances
27.3.4.1
length
27.3.4.2
name
27.3.4.3
prototype
27.4
AsyncGeneratorFunction Objects
27.4.1
The AsyncGeneratorFunction Constructor
27.4.1.1
AsyncGeneratorFunction ( ...
parameterArgs
bodyArg
27.4.2
Properties of the AsyncGeneratorFunction Constructor
27.4.2.1
AsyncGeneratorFunction.length
27.4.2.2
AsyncGeneratorFunction.prototype
27.4.3
Properties of the AsyncGeneratorFunction Prototype Object
27.4.3.1
AsyncGeneratorFunction.prototype.constructor
27.4.3.2
AsyncGeneratorFunction.prototype.prototype
27.4.3.3
AsyncGeneratorFunction.prototype [ @@toStringTag ]
27.4.4
AsyncGeneratorFunction Instances
27.4.4.1
length
27.4.4.2
name
27.4.4.3
prototype
27.5
Generator Objects
27.5.1
Properties of the Generator Prototype Object
27.5.1.1
Generator.prototype.constructor
27.5.1.2
Generator.prototype.next (
value
27.5.1.3
Generator.prototype.return (
value
27.5.1.4
Generator.prototype.throw (
exception
27.5.1.5
Generator.prototype [ @@toStringTag ]
27.5.2
Properties of Generator Instances
27.5.3
Generator Abstract Operations
27.5.3.1
GeneratorStart (
generator
generatorBody
27.5.3.2
GeneratorValidate (
generator
generatorBrand
27.5.3.3
GeneratorResume (
generator
value
generatorBrand
27.5.3.4
GeneratorResumeAbrupt (
generator
abruptCompletion
generatorBrand
27.5.3.5
GetGeneratorKind ( )
27.5.3.6
GeneratorYield (
iterNextObj
27.5.3.7
Yield (
value
27.5.3.8
CreateIteratorFromClosure (
closure
generatorBrand
generatorPrototype
27.6
AsyncGenerator Objects
27.6.1
Properties of the AsyncGenerator Prototype Object
27.6.1.1
AsyncGenerator.prototype.constructor
27.6.1.2
AsyncGenerator.prototype.next (
value
27.6.1.3
AsyncGenerator.prototype.return (
value
27.6.1.4
AsyncGenerator.prototype.throw (
exception
27.6.1.5
AsyncGenerator.prototype [ @@toStringTag ]
27.6.2
Properties of AsyncGenerator Instances
27.6.3
AsyncGenerator Abstract Operations
27.6.3.1
AsyncGeneratorRequest Records
27.6.3.2
AsyncGeneratorStart (
generator
generatorBody
27.6.3.3
AsyncGeneratorValidate (
generator
generatorBrand
27.6.3.4
AsyncGeneratorEnqueue (
generator
completion
promiseCapability
27.6.3.5
AsyncGeneratorCompleteStep (
generator
completion
done
[ ,
realm
] )
27.6.3.6
AsyncGeneratorResume (
generator
completion
27.6.3.7
AsyncGeneratorUnwrapYieldResumption (
resumptionValue
27.6.3.8
AsyncGeneratorYield (
value
27.6.3.9
AsyncGeneratorAwaitReturn (
generator
27.6.3.10
AsyncGeneratorDrainQueue (
generator
27.6.3.11
CreateAsyncIteratorFromClosure (
closure
generatorBrand
generatorPrototype
27.7
AsyncFunction Objects
27.7.1
The AsyncFunction Constructor
27.7.1.1
AsyncFunction ( ...
parameterArgs
bodyArg
27.7.2
Properties of the AsyncFunction Constructor
27.7.2.1
AsyncFunction.length
27.7.2.2
AsyncFunction.prototype
27.7.3
Properties of the AsyncFunction Prototype Object
27.7.3.1
AsyncFunction.prototype.constructor
27.7.3.2
AsyncFunction.prototype [ @@toStringTag ]
27.7.4
AsyncFunction Instances
27.7.4.1
length
27.7.4.2
name
27.7.5
Async Functions Abstract Operations
27.7.5.1
AsyncFunctionStart (
promiseCapability
asyncFunctionBody
27.7.5.2
AsyncBlockStart (
promiseCapability
asyncBody
asyncContext
27.7.5.3
Await (
value
28
Reflection
28.1
The Reflect Object
28.1.1
Reflect.apply (
target
thisArgument
argumentsList
28.1.2
Reflect.construct (
target
argumentsList
[ ,
newTarget
] )
28.1.3
Reflect.defineProperty (
target
propertyKey
attributes
28.1.4
Reflect.deleteProperty (
target
propertyKey
28.1.5
Reflect.get (
target
propertyKey
[ ,
receiver
] )
28.1.6
Reflect.getOwnPropertyDescriptor (
target
propertyKey
28.1.7
Reflect.getPrototypeOf (
target
28.1.8
Reflect.has (
target
propertyKey
28.1.9
Reflect.isExtensible (
target
28.1.10
Reflect.ownKeys (
target
28.1.11
Reflect.preventExtensions (
target
28.1.12
Reflect.set (
target
propertyKey
[ ,
receiver
] )
28.1.13
Reflect.setPrototypeOf (
target
proto
28.1.14
Reflect [ @@toStringTag ]
28.2
Proxy Objects
28.2.1
The Proxy Constructor
28.2.1.1
Proxy (
target
handler
28.2.2
Properties of the Proxy Constructor
28.2.2.1
Proxy.revocable (
target
handler
28.3
Module Namespace Objects
28.3.1
@@toStringTag
29
Memory Model
29.1
Memory Model Fundamentals
29.2
Agent Events Records
29.3
Chosen Value Records
29.4
Candidate Executions
29.5
Abstract Operations for the Memory Model
29.5.1
EventSet (
execution
29.5.2
SharedDataBlockEventSet (
execution
29.5.3
HostEventSet (
execution
29.5.4
ComposeWriteEventBytes (
execution
byteIndex
Ws
29.5.5
ValueOfReadEvent (
execution
29.6
Relations of Candidate Executions
29.6.1
agent-order
29.6.2
reads-bytes-from
29.6.3
reads-from
29.6.4
host-synchronizes-with
29.6.5
synchronizes-with
29.6.6
happens-before
29.7
Properties of Valid Executions
29.7.1
Valid Chosen Reads
29.7.2
Coherent Reads
29.7.3
Tear Free Reads
29.7.4
Sequentially Consistent Atomics
29.7.5
Valid Executions
29.8
Races
29.9
Data Races
29.10
Data Race Freedom
29.11
Shared Memory Guidelines
Grammar Summary
A.1
Lexical Grammar
A.2
Expressions
A.3
Statements
A.4
Functions and Classes
A.5
Scripts and Modules
A.6
Number Conversions
A.7
Time Zone Offset String Format
A.8
Regular Expressions
Additional ECMAScript Features for Web Browsers
B.1
Additional Syntax
B.1.1
HTML-like Comments
B.1.2
Regular Expressions Patterns
B.1.2.1
SS: Early Errors
B.1.2.2
SS: CountLeftCapturingParensWithin and CountLeftCapturingParensBefore
B.1.2.3
SS: IsCharacterClass
B.1.2.4
SS: CharacterValue
B.1.2.5
RS: CompileSubpattern
B.1.2.6
RS: CompileAssertion
B.1.2.7
RS: CompileAtom
B.1.2.8
RS: CompileToCharSet
B.1.2.8.1
CharacterRangeOrUnion (
rer
B.1.2.9
SS: ParsePattern (
patternText
B.2
Additional Built-in Properties
B.2.1
Additional Properties of the Global Object
B.2.1.1
escape (
string
B.2.1.2
unescape (
string
B.2.2
Additional Properties of the String.prototype Object
B.2.2.1
String.prototype.substr (
start
length
B.2.2.2
String.prototype.anchor (
name
B.2.2.2.1
CreateHTML (
string
tag
attribute
value
B.2.2.3
String.prototype.big ( )
B.2.2.4
String.prototype.blink ( )
B.2.2.5
String.prototype.bold ( )
B.2.2.6
String.prototype.fixed ( )
B.2.2.7
String.prototype.fontcolor (
color
B.2.2.8
String.prototype.fontsize (
size
B.2.2.9
String.prototype.italics ( )
B.2.2.10
String.prototype.link (
url
B.2.2.11
String.prototype.small ( )
B.2.2.12
String.prototype.strike ( )
B.2.2.13
String.prototype.sub ( )
B.2.2.14
String.prototype.sup ( )
B.2.2.15
String.prototype.trimLeft ( )
B.2.2.16
String.prototype.trimRight ( )
B.2.3
Additional Properties of the Date.prototype Object
B.2.3.1
Date.prototype.getYear ( )
B.2.3.2
Date.prototype.setYear (
year
B.2.3.3
Date.prototype.toGMTString ( )
B.2.4
Additional Properties of the RegExp.prototype Object
B.2.4.1
RegExp.prototype.compile (
pattern
flags
B.3
Other Additional Features
B.3.1
Labelled Function Declarations
B.3.2
Block-Level Function Declarations Web Legacy Compatibility Semantics
B.3.2.1
Changes to FunctionDeclarationInstantiation
B.3.2.2
Changes to GlobalDeclarationInstantiation
B.3.2.3
Changes to EvalDeclarationInstantiation
B.3.2.4
Changes to Block SS: Early Errors
B.3.2.5
Changes to
switch
Statement SS: Early Errors
B.3.2.6
Changes to BlockDeclarationInstantiation
B.3.3
FunctionDeclarations in IfStatement Statement Clauses
B.3.4
VariableStatements in Catch Blocks
B.3.5
Initializers in ForIn Statement Heads
B.3.6
The [[IsHTMLDDA]] Internal Slot
B.3.6.1
Changes to ToBoolean
B.3.6.2
Changes to IsLooselyEqual
B.3.6.3
Changes to the
typeof
Operator
B.3.7
Non-default behaviour in HostMakeJobCallback
B.3.8
Non-default behaviour in HostEnsureCanAddPrivateElement
The Strict Mode of ECMAScript
Host Layering Points
D.1
Host Hooks
D.2
Host-defined Fields
D.3
Host-defined Objects
D.4
Running Jobs
D.5
Internal Methods of Exotic Objects
D.6
Built-in Objects and Methods
Corrections and Clarifications in ECMAScript 2015 with Possible Compatibility Impact
Additions and Changes That Introduce Incompatibilities with Prior Editions
Colophon
Bibliography
Copyright & Software License
ECMA-262, 14
th
edition, June 2023
ECMAScript® 2023 Language Specification
About this Specification
The document at
is the most accurate and up-to-date ECMAScript specification. It
contains the content of the most recent yearly snapshot plus any
finished proposals
(those that have reached Stage 4 in the
proposal process
and thus are implemented in several implementations and will be in the next practical revision) since that snapshot was taken.
This document is available as
a single page
and as
multiple pages
Contributing to this Specification
This specification is developed on GitHub with the help of the
ECMAScript community. There are a number of ways to contribute to the
development of this specification:
GitHub Repository:
Issues:
All Issues
File a New Issue
Pull Requests:
All Pull Requests
Create a New Pull Request
Test Suite:
Test262
Editors:
Shu-yu Guo
@_shu
Michael Ficarra
@smooshMap
Kevin Gibbons
@bakkoting
Community:
Discourse:
Chat:
Matrix
Mailing
List
Archives:
Refer to the
colophon
for more information on how this document is created.
Introduction
This Ecma Standard defines the ECMAScript 2023 Language. It is the
fourteenth edition of the ECMAScript Language Specification. Since
publication of the first edition in 1997, ECMAScript has grown to be one
of the world's most widely used general-purpose programming languages.
It is best known as the language embedded in web browsers but has also
been widely adopted for server and embedded applications.
ECMAScript is based on several originating technologies, the most
well-known being JavaScript (Netscape) and JScript (Microsoft). The
language was invented by Brendan Eich at Netscape and first appeared in
that company's Navigator 2.0 browser. It has appeared in all subsequent
browsers from Netscape and in all browsers from Microsoft starting with
Internet Explorer 3.0.
The development of the ECMAScript Language Specification started in
November 1996. The first edition of this Ecma Standard was adopted by
the Ecma General Assembly of June 1997.
That Ecma Standard was submitted to ISO/IEC JTC 1 for adoption
under the fast-track procedure, and approved as international standard
ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998
approved the second edition of ECMA-262 to keep it fully aligned with
ISO/IEC 16262. Changes between the first and the second edition are
editorial in nature.
The third edition of the Standard introduced powerful regular
expressions, better string handling, new control statements, try/catch
exception handling, tighter definition of errors, formatting for numeric
output and minor changes in anticipation of future language growth. The
third edition of the ECMAScript standard was adopted by the Ecma
General Assembly of December 1999 and published as ISO/IEC 16262:2002 in
June 2002.
After publication of the third edition, ECMAScript achieved massive
adoption in conjunction with the World Wide Web where it has become the
programming language that is supported by essentially all web browsers.
Significant work was done to develop a fourth edition of ECMAScript.
However, that work was not completed and not published as the fourth
edition of ECMAScript but some of it was incorporated into the
development of the sixth edition.
The fifth edition of ECMAScript (published as ECMA-262 5
th
edition) codified de facto interpretations of the language
specification that have become common among browser implementations and
added support for new features that had emerged since the publication of
the third edition. Such features include
accessor properties
reflective creation and inspection of objects, program control of
property attributes, additional array manipulation functions, support
for the JSON object encoding format, and a strict mode that provides
enhanced error checking and program security. The fifth edition was
adopted by the Ecma General Assembly of December 2009.
The fifth edition was submitted to ISO/IEC JTC 1 for adoption under
the fast-track procedure, and approved as international standard
ISO/IEC 16262:2011. Edition 5.1 of the ECMAScript Standard incorporated
minor corrections and is the same text as ISO/IEC 16262:2011. The 5.1
Edition was adopted by the Ecma General Assembly of June 2011.
Focused development of the sixth edition started in 2009, as the
fifth edition was being prepared for publication. However, this was
preceded by significant experimentation and language enhancement design
efforts dating to the publication of the third edition in 1999. In a
very real sense, the completion of the sixth edition is the culmination
of a fifteen year effort. The goals for this edition included providing
better support for large applications, library creation, and for use of
ECMAScript as a compilation target for other languages. Some of its
major enhancements included modules, class declarations, lexical block
scoping, iterators and generators, promises for asynchronous
programming, destructuring patterns, and proper tail calls. The
ECMAScript library of built-ins was expanded to support additional data
abstractions including maps, sets, and arrays of binary numeric values
as well as additional support for Unicode supplementary characters in
strings and regular expressions. The built-ins were also made extensible
via subclassing. The sixth edition provides the foundation for regular,
incremental language and library enhancements. The sixth edition was
adopted by the General Assembly of June 2015.
ECMAScript 2016 was the first ECMAScript edition released under
Ecma TC39's new yearly release cadence and open development process. A
plain-text source document was built from the ECMAScript 2015 source
document to serve as the base for further development entirely on
GitHub. Over the year of this standard's development, hundreds of pull
requests and issues were filed representing thousands of bug fixes,
editorial fixes and other improvements. Additionally, numerous software
tools were developed to aid in this effort including Ecmarkup,
Ecmarkdown, and Grammarkdown. ES2016 also included support for a new
exponentiation operator and adds a new method to
Array.prototype
called
includes
ECMAScript 2017 introduced Async Functions, Shared Memory, and
Atomics along with smaller language and library enhancements, bug fixes,
and editorial updates. Async functions improve the asynchronous
programming experience by providing syntax for promise-returning
functions. Shared Memory and Atomics introduce a new
memory model
that allows multi-
agent
programs to communicate using atomic operations that ensure a
well-defined execution order even on parallel CPUs. It also included new
static methods on Object:
Object.values
Object.entries
, and
Object.getOwnPropertyDescriptors
ECMAScript 2018 introduced support for asynchronous iteration via
the AsyncIterator protocol and async generators. It also included four
new regular expression features: the
dotAll
flag, named
capture groups, Unicode property escapes, and look-behind assertions.
Lastly it included object rest and spread properties.
ECMAScript 2019 introduced a few new built-in functions:
flat
and
flatMap
on
Array.prototype
for flattening arrays,
Object.fromEntries
for directly turning the return value of
Object.entries
into a new Object, and
trimStart
and
trimEnd
on
String.prototype
as better-named alternatives to the widely implemented but non-standard
String.prototype.trimLeft
and
trimRight
built-ins. In addition, it included a few minor updates to syntax and
semantics. Updated syntax included optional catch binding parameters and
allowing U+2028 (LINE SEPARATOR) and U+2029 (PARAGRAPH SEPARATOR) in
string literals to align with JSON. Other updates included requiring
that
Array.prototype.sort
be a stable sort, requiring that
JSON.stringify
return well-formed UTF-8 regardless of input, and clarifying
Function.prototype.toString
by requiring that it either return the corresponding original source text or a standard placeholder.
ECMAScript 2020, the 11
th
edition, introduced the
matchAll
method for Strings, to produce an iterator for all match objects generated by a global regular expression;
import()
, a syntax to asynchronously import Modules with a dynamic specifier;
BigInt
, a new number primitive for working with arbitrary precision
integers
Promise.allSettled
, a new Promise combinator that does not short-circuit;
globalThis
, a universal way to access the global
this
value; dedicated
export * as ns from 'module'
syntax for use within modules; increased standardization of
for-in
enumeration order;
import.meta
, a
host
-populated
object available in Modules that may contain contextual information
about the Module; as well as adding two new syntax features to improve
working with “nullish” values (
null
or
undefined
):
nullish coalescing, a value selection operator; and optional chaining, a
property access and function invocation operator that short-circuits if
the value to access/invoke is nullish.
ECMAScript 2021, the 12
th
edition, introduced the
replaceAll
method for Strings;
Promise.any
, a Promise combinator that short-circuits when an input value is fulfilled;
AggregateError
, a new Error type to represent multiple errors at once; logical assignment operators (
??=
&&=
||=
);
WeakRef
, for referring to a target object without preserving it from garbage collection, and
FinalizationRegistry
to manage registration and unregistration of cleanup operations
performed when target objects are garbage collected; separators for
numeric literals (
1_000
); and
Array.prototype.sort
was made more precise, reducing the amount of cases that result in an
implementation-defined
sort order
ECMAScript 2022, the 13
th
edition, introduced top-level
await
, allowing the
keyword
to be used at the top level of modules; new class elements: public and
private instance fields, public and private static fields, private
instance methods and accessors, and private static methods and
accessors; static blocks inside classes, to perform per-class evaluation
initialization; the
#x in obj
syntax, to test for presence of private fields on objects; regular expression match indices via the
/d
flag, which provides start and end indices for matched substrings; the
cause
property on
Error
objects, which can be used to record a causation chain in errors; the
at
method for Strings, Arrays, and TypedArrays, which allows relative indexing; and
Object.hasOwn
, a convenient alternative to
Object.prototype.hasOwnProperty
ECMAScript 2023, the 14
th
edition, introduced the
toSorted
toReversed
with
findLast
, and
findLastIndex
methods on
Array.prototype
and
TypedArray.prototype
, as well as the
toSpliced
method on
Array.prototype
; added support for
#!
comments at the beginning of files to better facilitate executable
ECMAScript files; and allowed the use of most Symbols as keys in weak
collections.
Dozens of individuals representing many organizations have made
very significant contributions within Ecma TC39 to the development of
this edition and to the prior editions. In addition, a vibrant community
has emerged supporting TC39's ECMAScript efforts. This community has
reviewed numerous drafts, filed thousands of bug reports, performed
implementation experiments, contributed test suites, and educated the
world-wide developer community about ECMAScript. Unfortunately, it is
impossible to identify and acknowledge every person and organization who
has contributed to this effort.
Allen Wirfs-Brock
ECMA-262, Project Editor, 6
th
Edition
Brian Terlson
ECMA-262, Project Editor, 7
th
through 10
th
Editions
Jordan Harband
ECMA-262, Project Editor, 10
th
through 12
th
Editions
Shu-yu Guo
ECMA-262, Project Editor, 12
th
through 14
th
Editions
Michael Ficarra
ECMA-262, Project Editor, 12
th
through 14
th
Editions
Kevin Gibbons
ECMA-262, Project Editor, 12
th
through 14
th
Editions
Scope
This Standard defines the ECMAScript 2023 general-purpose programming language.
Conformance
A conforming implementation of ECMAScript must provide and support
all the types, values, objects, properties, functions, and program
syntax and semantics described in this specification.
A conforming implementation of ECMAScript must interpret source
text input in conformance with the latest version of the Unicode
Standard and ISO/IEC 10646.
A conforming implementation of ECMAScript that provides an
application programming interface (API) that supports programs that need
to adapt to the linguistic and cultural conventions used by different
human languages and countries must implement the interface defined by
the most recent edition of ECMA-402 that is compatible with this
specification.
A conforming implementation of ECMAScript may provide additional
types, values, objects, properties, and functions beyond those described
in this specification. In particular, a conforming implementation of
ECMAScript may provide properties not described in this specification,
and values for those properties, for objects that are described in this
specification.
A conforming implementation of ECMAScript may support program and
regular expression syntax not described in this specification. In
particular, a conforming implementation of ECMAScript may support
program syntax that makes use of any “future
reserved words
” noted in subclause
12.7.2
of this specification.
A conforming implementation of ECMAScript must not implement any extension that is listed as a Forbidden Extension in subclause
17.1
A conforming implementation of ECMAScript must not redefine any facilities that are not
implementation-defined
implementation-approximated
, or
host-defined
A conforming implementation of ECMAScript may choose to implement or not implement
Normative Optional
subclauses. If any Normative Optional behaviour is implemented, all of
the behaviour in the containing Normative Optional clause must be
implemented. A Normative Optional clause is denoted in this
specification with the words "Normative Optional" in a coloured box, as
shown below.
Normative Optional
2.1
Example Normative Optional Clause Heading
Example clause contents.
A conforming implementation of ECMAScript must implement
Legacy
subclauses, unless they are also marked as Normative Optional. All of
the language features and behaviours specified within Legacy subclauses
have one or more undesirable characteristics. However, their continued
usage in existing applications prevents their removal from this
specification. These features are not considered part of the core
ECMAScript language. Programmers should not use or assume the existence
of these features and behaviours when writing new ECMAScript code.
Legacy
2.2
Example Legacy Clause Heading
Example clause contents.
Normative Optional
Legacy
2.3
Example Legacy Normative Optional Clause Heading
Example clause contents.
Normative References
The following referenced documents are indispensable for the
application of this document. For dated references, only the edition
cited applies. For undated references, the latest edition of the
referenced document (including any amendments) applies.
ISO/IEC 10646
Information Technology — Universal Multiple-Octet
Coded Character Set (UCS) plus Amendment 1:2005, Amendment 2:2006,
Amendment 3:2008, and Amendment 4:2008
, plus additional amendments and corrigenda, or successor
ECMA-402,
ECMAScript 2015 Internationalization API Specification
ECMA-404,
The JSON Data Interchange Format
Overview
This section contains a non-normative overview of the ECMAScript language.
ECMAScript is an object-oriented programming language for
performing computations and manipulating computational objects within a
host environment
ECMAScript as defined here is not intended to be computationally
self-sufficient; indeed, there are no provisions in this specification
for input of external data or output of computed results. Instead, it is
expected that the computational environment of an ECMAScript program
will provide not only the objects and other facilities described in this
specification but also certain environment-specific objects, whose
description and behaviour are beyond the scope of this specification
except to indicate that they may provide certain properties that can be
accessed and certain functions that can be called from an ECMAScript
program.
ECMAScript was originally designed to be used as a scripting
language, but has become widely used as a general-purpose programming
language. A
scripting language
is a programming language that
is used to manipulate, customize, and automate the facilities of an
existing system. In such systems, useful functionality is already
available through a user interface, and the scripting language is a
mechanism for exposing that functionality to program control. In this
way, the existing system is said to provide a
host environment
of objects and facilities, which completes the capabilities of the
scripting language. A scripting language is intended for use by both
professional and non-professional programmers.
ECMAScript was originally designed to be a
Web scripting language
providing a mechanism to enliven Web pages in browsers and to perform
server computation as part of a Web-based client-server architecture.
ECMAScript is now used to provide core scripting capabilities for a
variety of
host environments
. Therefore the core language is specified in this document apart from any particular
host environment
ECMAScript usage has moved beyond simple scripting and it is now
used for the full spectrum of programming tasks in many different
environments and scales. As the usage of ECMAScript has expanded, so
have the features and facilities it provides. ECMAScript is now a fully
featured general-purpose programming language.
4.1
Web Scripting
A web browser provides an ECMAScript
host environment
for client-side computation including, for instance, objects that
represent windows, menus, pop-ups, dialog boxes, text areas, anchors,
frames, history, cookies, and input/output. Further, the
host environment
provides a means to attach scripting code to events such as change of
focus, page and image loading, unloading, error and abort, selection,
form submission, and mouse actions. Scripting code appears within the
HTML and the displayed page is a combination of user interface elements
and fixed and computed text and images. The scripting code is reactive
to user interaction, and there is no need for a main program.
A web server provides a different
host environment
for server-side computation including objects representing requests,
clients, and files; and mechanisms to lock and share data. By using
browser-side and server-side scripting together, it is possible to
distribute computation between the client and server while providing a
customized user interface for a Web-based application.
Each Web browser and server that supports ECMAScript supplies its own
host environment
, completing the ECMAScript execution environment.
4.2
Hosts and Implementations
To aid integrating ECMAScript into
host environments
, this specification defers the definition of certain facilities (e.g.,
abstract operations
),
either in whole or in part, to a source outside of this specification.
Editorially, this specification distinguishes the following kinds of
deferrals.
An
implementation
is an external source that further defines facilities enumerated in Annex
or those that are marked as
implementation-defined
or
implementation-approximated
. In informal use, an implementation refers to a concrete artefact, such as a particular web browser.
An
implementation-defined
facility is one that defers its definition to an external source without
further qualification. This specification does not make any
recommendations for particular behaviours, and conforming
implementations are free to choose any behaviour within the constraints
put forth by this specification.
An
implementation-approximated
facility is one that defers its definition to an external source while
recommending an ideal behaviour. While conforming implementations are
free to choose any behaviour within the constraints put forth by this
specification, they are encouraged to strive to approximate the ideal.
Some mathematical operations, such as
Math.exp
, are
implementation-approximated
host
is an external source that further defines facilities listed in Annex
but does not further define other
implementation-defined
or
implementation-approximated
facilities. In informal use, a
host
refers to the set of all implementations, such as the set of all web
browsers, that interface with this specification in the same way via
Annex
. A
host
is often an external specification, such as WHATWG HTML (
). In other words, facilities that are
host-defined
are often further defined in external specifications.
host hook
is an abstract operation that is defined in whole or in part by an external source. All
host hooks
must be listed in Annex
. A
host hook
must conform to at least the following requirements:
It must return either a
normal completion
or a
throw completion
host-defined
facility is one that defers its definition to an external source without further qualification and is listed in Annex
. Implementations that are not
hosts
may also provide definitions for
host-defined
facilities.
host environment
is a particular choice of definition for all
host-defined
facilities. A
host environment
typically includes objects or functions which allow obtaining input and providing output as
host-defined
properties of the
global object
This specification follows the editorial convention of always using the most specific term. For example, if a facility is
host-defined
, it should not be referred to as
implementation-defined
Both
hosts
and implementations may interface with this specification via the language types, specification types,
abstract operations
, grammar productions, intrinsic objects, and intrinsic symbols defined herein.
4.3
ECMAScript Overview
The following is an informal overview of ECMAScript—not all parts
of the language are described. This overview is not part of the
standard proper.
ECMAScript is object-based: basic language and
host
facilities are provided by objects, and an ECMAScript program is a cluster of communicating objects. In ECMAScript, an
object
is a collection of zero or more
properties
each with
attributes
that determine how each property can be used—for example, when the Writable attribute for a property is set to
false
any attempt by executed ECMAScript code to assign a different value to
the property fails. Properties are containers that hold other objects,
primitive values
, or
functions
. A primitive value is a member of one of the following built-in types:
Undefined
Null
Boolean
Number
BigInt
String
, and
Symbol;
an object is a member of the built-in type
Object
; and a function is a callable object. A function that is associated with an object via a property is called a
method
ECMAScript defines a collection of
built-in objects
that round out the definition of ECMAScript entities. These built-in objects include the
global object
; objects that are fundamental to the
runtime semantics
of the language including
Object
Function
Boolean
Symbol
, and various
Error
objects; objects that represent and manipulate numeric values including
Math
Number
, and
Date
; the text processing objects
String
and
RegExp
; objects that are indexed collections of values including
Array
and nine different kinds of Typed Arrays whose elements all have a
specific numeric data representation; keyed collections including
Map
and
Set
objects; objects supporting structured data including the
JSON
object,
ArrayBuffer
SharedArrayBuffer
, and
DataView
; objects supporting control abstractions including generator functions and
Promise
objects; and reflection objects including
Proxy
and
Reflect
ECMAScript also defines a set of built-in
operators
ECMAScript operators include various unary operations, multiplicative
operators, additive operators, bitwise shift operators, relational
operators, equality operators, binary bitwise operators, binary logical
operators, assignment operators, and the comma operator.
Large ECMAScript programs are supported by
modules
which
allow a program to be divided into multiple sequences of statements and
declarations. Each module explicitly identifies declarations it uses
that need to be provided by other modules and which of its declarations
are available for use by other modules.
ECMAScript syntax intentionally resembles Java syntax. ECMAScript
syntax is relaxed to enable it to serve as an easy-to-use scripting
language. For example, a variable is not required to have its type
declared nor are types associated with properties, and defined functions
are not required to have their declarations appear textually before
calls to them.
4.3.1
Objects
Even though ECMAScript includes syntax for class definitions,
ECMAScript objects are not fundamentally class-based such as those in
C++, Smalltalk, or Java. Instead objects may be created in various ways
including via a literal notation or via
constructors
which create objects and then execute code that initializes all or part
of them by assigning initial values to their properties. Each
constructor
is a function that has a property named
"prototype"
that is used to implement
prototype-based inheritance
and
shared properties
. Objects are created by using
constructors
in
new
expressions; for example,
new Date(2009, 11)
creates a new Date object. Invoking a
constructor
without using
new
has consequences that depend on the
constructor
. For example,
Date()
produces a string representation of the current date and time rather than an object.
Every object created by a
constructor
has an implicit reference (called the object's
prototype
) to the value of its
constructor
's
"prototype"
property. Furthermore, a prototype may have a non-
null
implicit reference to its prototype, and so on; this is called the
prototype chain
When a reference is made to a property in an object, that reference is
to the property of that name in the first object in the prototype chain
that contains a property of that name. In other words, first the object
mentioned directly is examined for such a property; if that object
contains the named property, that is the property to which the reference
refers; if that object does not contain the named property, the
prototype for that object is examined next; and so on.
Figure 1: Object/Prototype Relationships
In a class-based object-oriented language, in general, state is
carried by instances, methods are carried by classes, and inheritance
is only of structure and behaviour. In ECMAScript, the state and methods
are carried by objects, while structure, behaviour, and state are all
inherited.
All objects that do not directly contain a particular property
that their prototype contains share that property and its value. Figure 1
illustrates this:
CF
is a
constructor
(and also an object). Five objects have been created by using
new
expressions:
cf
cf
cf
cf
, and
cf
. Each of these objects contains properties named
"q1"
and
"q2"
. The dashed lines represent the implicit prototype relationship; so, for example,
cf
's prototype is
CF
. The
constructor
CF
, has two properties itself, named
"P1"
and
"P2"
, which are not visible to
CF
cf
cf
cf
cf
, or
cf
. The property named
"CFP1"
in
CF
is shared by
cf
cf
cf
cf
, and
cf
(but not by
CF
), as are any properties found in
CF
's implicit prototype chain that are not named
"q1"
"q2"
, or
"CFP1"
. Notice that there is no implicit prototype link between
CF
and
CF
Unlike most class-based object languages, properties can be added to objects dynamically by assigning values to them. That is,
constructors
are not required to name or assign values to all or any of the
constructed object's properties. In the above diagram, one could add a
new shared property for
cf
cf
cf
cf
, and
cf
by assigning a new value to the property in
CF
Although ECMAScript objects are not inherently class-based, it
is often convenient to define class-like abstractions based upon a
common pattern of
constructor
functions, prototype objects, and methods. The ECMAScript built-in
objects themselves follow such a class-like pattern. Beginning with
ECMAScript 2015, the ECMAScript language includes syntactic class
definitions that permit programmers to concisely define objects that
conform to the same class-like abstraction pattern used by the built-in
objects.
4.3.2
The Strict Variant of ECMAScript
The ECMAScript Language recognizes the possibility that some
users of the language may wish to restrict their usage of some features
available in the language. They might do so in the interests of
security, to avoid what they consider to be error-prone features, to get
enhanced error checking, or for other reasons of their choosing. In
support of this possibility, ECMAScript defines a strict variant of the
language. The strict variant of the language excludes some specific
syntactic and semantic features of the regular ECMAScript language and
modifies the detailed semantics of some features. The strict variant
also specifies additional error conditions that must be reported by
throwing error exceptions in situations that are not specified as errors
by the non-strict form of the language.
The strict variant of ECMAScript is commonly referred to as the
strict mode
of the language. Strict mode selection and use of the strict mode
syntax and semantics of ECMAScript is explicitly made at the level of
individual
ECMAScript source text
units as described in
11.2.2
Because strict mode is selected at the level of a syntactic source text
unit, strict mode only imposes restrictions that have local effect
within such a source text unit. Strict mode does not restrict or modify
any aspect of the ECMAScript semantics that must operate consistently
across multiple source text units. A complete ECMAScript program may be
composed of both strict mode and non-strict mode
ECMAScript source text
units. In this case, strict mode only applies when actually executing
code that is defined within a strict mode source text unit.
In order to conform to this specification, an ECMAScript
implementation must implement both the full unrestricted ECMAScript
language and the strict variant of the ECMAScript language as defined by
this specification. In addition, an implementation must support the
combination of unrestricted and strict mode source text units into a
single composite program.
4.4
Terms and Definitions
For the purposes of this document, the following terms and definitions apply.
4.4.1
implementation-approximated
an
implementation-approximated
facility is defined in whole or in part by an external source but has a recommended, ideal behaviour in this specification
4.4.2
implementation-defined
an
implementation-defined
facility is defined in whole or in part by an external source to this specification
4.4.3
host-defined
same as
implementation-defined
Note
Editorially, see clause
4.2
4.4.4
type
set of data values as defined in clause
4.4.5
primitive value
member of one of the types Undefined, Null, Boolean, Number, BigInt, Symbol, or String as defined in clause
Note
A primitive value is a datum that is represented directly at the lowest level of the language implementation.
4.4.6
object
member of the type Object
Note
An object is a collection of properties and has a single prototype object. The prototype may be
null
4.4.7
constructor
function object
that creates and initializes objects
Note
The value of a
constructor
's
"prototype"
property is a prototype object that is used to implement inheritance and shared properties.
4.4.8
prototype
object that provides shared properties for other objects
Note
When a
constructor
creates an object, that object implicitly references the
constructor
's
"prototype"
property for the purpose of resolving property references. The
constructor
's
"prototype"
property can be referenced by the program expression
constructor
.prototype
and properties added to an object's prototype are shared, through
inheritance, by all objects sharing the prototype. Alternatively, a new
object may be created with an explicitly specified prototype by using
the
Object.create
built-in function.
4.4.9
ordinary object
object that has the default behaviour for the essential internal methods that must be supported by all objects
4.4.10
exotic object
object that does not have the default behaviour for one or more of the essential internal methods
Note
Any object that is not an
ordinary object
is an
exotic object
4.4.11
standard object
object whose semantics are defined by this specification
4.4.12
built-in object
object specified and supplied by an ECMAScript implementation
Note
Standard built-in objects are defined in this specification.
An ECMAScript implementation may specify and supply additional kinds of
built-in objects. A
built-in
constructor
is a built-in object that is also a
constructor
4.4.13
undefined value
primitive value used when a variable has not been assigned a value
4.4.14
Undefined type
type whose sole value is the
undefined
value
4.4.15
null value
primitive value that represents the intentional absence of any object value
4.4.16
Null type
type whose sole value is the
null
value
4.4.17
Boolean value
member of the
Boolean type
Note
There are only two Boolean values,
true
and
false
4.4.18
Boolean type
type consisting of the primitive values
true
and
false
4.4.19
Boolean object
member of the Object type that is an instance of the standard built-in Boolean
constructor
Note
A Boolean object is created by using the Boolean
constructor
in a
new
expression, supplying a Boolean value as an argument. The resulting
object has an internal slot whose value is the Boolean value. A Boolean
object can be coerced to a Boolean value.
4.4.20
String value
primitive value that is a
finite
ordered sequence of zero or more 16-bit unsigned
integer
values
Note
A String value is a member of the
String type
. Each
integer
value in the sequence usually represents a single 16-bit unit of UTF-16
text. However, ECMAScript does not place any restrictions or
requirements on the values except that they must be 16-bit unsigned
integers
4.4.21
String type
set of all possible String values
4.4.22
String object
member of the Object type that is an instance of the standard built-in String
constructor
Note
A String object is created by using the String
constructor
in a
new
expression, supplying a String value as an argument. The resulting
object has an internal slot whose value is the String value. A String
object can be coerced to a String value by calling the String
constructor
as a function (
22.1.1.1
).
4.4.23
Number value
primitive value corresponding to a double-precision 64-bit binary format
IEEE 754-2019
value
Note
A Number value is a member of the
Number type
and is a direct representation of a number.
4.4.24
Number type
set of all possible Number values including the special “Not-a-Number” (NaN) value, positive infinity, and negative infinity
4.4.25
Number object
member of the Object type that is an instance of the standard built-in Number
constructor
Note
A Number object is created by using the Number
constructor
in a
new
expression, supplying a Number value as an argument. The resulting
object has an internal slot whose value is the Number value. A Number
object can be coerced to a Number value by calling the Number
constructor
as a function (
21.1.1.1
).
4.4.26
Infinity
Number value that is the positive infinite Number value
4.4.27
NaN
Number value that is an
IEEE 754-2019
“Not-a-Number” value
4.4.28
BigInt value
primitive value corresponding to an arbitrary-precision
integer
value
4.4.29
BigInt type
set of all possible BigInt values
4.4.30
BigInt object
member of the Object type that is an instance of the standard built-in BigInt
constructor
4.4.31
Symbol value
primitive value that represents a unique, non-String Object
property key
4.4.32
Symbol type
set of all possible Symbol values
4.4.33
Symbol object
member of the Object type that is an instance of the standard built-in Symbol
constructor
4.4.34
function
member of the Object type that may be invoked as a subroutine
Note
In addition to its properties, a function contains executable
code and state that determine how it behaves when invoked. A function's
code may or may not be written in ECMAScript.
4.4.35
built-in function
built-in object that is a function
Note
Examples of built-in functions include
parseInt
and
Math.exp
. A
host
or implementation may provide additional built-in functions that are not described in this specification.
4.4.36
property
part of an object that associates a key (either a String value or a Symbol value) and a value
Note
Depending upon the form of the property the value may be
represented either directly as a data value (a primitive value, an
object, or a
function object
) or indirectly by a pair of accessor functions.
4.4.37
method
function that is the value of a property
Note
When a function is called as a method of an object, the object is passed to the function as its
this
value.
4.4.38
built-in method
method that is a built-in function
Note
Standard built-in methods are defined in this specification. A
host
or implementation may provide additional built-in methods that are not described in this specification.
4.4.39
attribute
internal value that defines some characteristic of a property
4.4.40
own property
property that is directly contained by its object
4.4.41
inherited property
property of an object that is not an own property but is a property (either own or inherited) of the object's prototype
4.5
Organization of This Specification
The remainder of this specification is organized as follows:
Clause
defines the notational conventions used throughout the specification.
Clauses
through
10
define the execution environment within which ECMAScript programs operate.
Clauses
11
through
17
define the actual ECMAScript programming language including its
syntactic encoding and the execution semantics of all language features.
Clauses
18
through
28
define the ECMAScript standard library. They include the definitions of
all of the standard objects that are available for use by ECMAScript
programs as they execute.
Clause
29
describes the memory consistency model of accesses on SharedArrayBuffer-backed memory and methods of the Atomics object.
Notational Conventions
5.1
Syntactic and Lexical Grammars
5.1.1
Context-Free Grammars
context-free grammar
consists of a number of
productions
. Each production has an abstract symbol called a
nonterminal
as its
left-hand side
, and a sequence of zero or more nonterminal and
terminal
symbols as its
right-hand side
. For each grammar, the terminal symbols are drawn from a specified alphabet.
chain production
is a production that has exactly one nonterminal symbol on its right-hand side along with zero or more terminal symbols.
Starting from a sentence consisting of a single distinguished nonterminal, called the
goal symbol
, a given context-free grammar specifies a
language
namely, the (perhaps infinite) set of possible sequences of terminal
symbols that can result from repeatedly replacing any nonterminal in the
sequence with a right-hand side of a production for which the
nonterminal is the left-hand side.
5.1.2
The Lexical and RegExp Grammars
lexical grammar
for ECMAScript is given in clause
12
. This grammar has as its terminal symbols Unicode code points that conform to the rules for
SourceCharacter
defined in
11.1
. It defines a set of productions, starting from the
goal symbol
InputElementDiv
InputElementTemplateTail
InputElementRegExp
InputElementRegExpOrTemplateTail
, or
InputElementHashbangOrRegExp
, that describe how sequences of such code points are translated into a sequence of input elements.
Input elements other than white space and comments form the
terminal symbols for the syntactic grammar for ECMAScript and are called
ECMAScript
tokens
. These tokens are the
reserved words
identifiers, literals, and punctuators of the ECMAScript language.
Moreover, line terminators, although not considered to be tokens, also
become part of the stream of input elements and guide the process of
automatic semicolon insertion (
12.10
).
Simple white space and single-line comments are discarded and do not
appear in the stream of input elements for the syntactic grammar. A
MultiLineComment
(that is, a comment of the form
/*
*/
regardless of whether it spans more than one line) is likewise simply discarded if it contains no line terminator; but if a
MultiLineComment
contains one or more line terminators, then it is replaced by a single
line terminator, which becomes part of the stream of input elements for
the syntactic grammar.
RegExp grammar
for ECMAScript is given in
22.2.1
. This grammar also has as its terminal symbols the code points as defined by
SourceCharacter
. It defines a set of productions, starting from the
goal symbol
Pattern
, that describe how sequences of code points are translated into regular expression patterns.
Productions of the lexical and RegExp grammars are distinguished by having two colons “
::
” as separating punctuation. The lexical and RegExp grammars share some productions.
5.1.3
The Numeric String Grammar
numeric string grammar
appears in
7.1.4.1
. It has as its terminal symbols
SourceCharacter
, and is used for translating Strings into numeric values starting from the
goal symbol
StringNumericLiteral
(which is similar to but distinct from the
lexical grammar for numeric literals
).
Productions of the numeric string grammar are distinguished by having three colons “
:::
” as punctuation, and are never used for parsing source text.
5.1.4
The Syntactic Grammar
The
syntactic grammar
for ECMAScript is given in clauses
13
through
16
. This grammar has ECMAScript tokens defined by the lexical grammar as its terminal symbols (
5.1.2
). It defines a set of productions, starting from two alternative
goal symbols
Script
and
Module
, that describe how sequences of tokens form syntactically correct independent components of ECMAScript programs.
When a stream of code points is to be parsed as an ECMAScript
Script
or
Module
it is first converted to a stream of input elements by repeated
application of the lexical grammar; this stream of input elements is
then parsed by a single application of the syntactic grammar. The input
stream is syntactically in error if the tokens in the stream of input
elements cannot be parsed as a single instance of the goal nonterminal (
Script
or
Module
), with no tokens left over.
When a parse is successful, it constructs a
parse tree
, a rooted tree structure in which each node is a
Parse Node
. Each Parse Node is an
instance
of a symbol in the grammar; it represents a span of the source text
that can be derived from that symbol. The root node of the parse tree,
representing the whole of the source text, is an instance of the parse's
goal symbol
When a Parse Node is an instance of a nonterminal, it is also an
instance of some production that has that nonterminal as its left-hand
side. Moreover, it has zero or more
children
, one for each
symbol on the production's right-hand side: each child is a Parse Node
that is an instance of the corresponding symbol.
New Parse Nodes are instantiated for each invocation of the
parser and never reused between parses even of identical source text.
Parse Nodes are considered
the same Parse Node
if and only if
they represent the same span of source text, are instances of the same
grammar symbol, and resulted from the same parser invocation.
Note 1
Parsing the same String multiple times will lead to different Parse Nodes. For example, consider:
let
str =
"1 + 1;"
eval
(str);
eval
(str);
Each call to
eval
converts the value of
str
into
ECMAScript source text
and performs an independent parse that creates its own separate tree of
Parse Nodes. The trees are distinct even though each parse operates
upon a source text that was derived from the same String value.
Note 2
Parse Nodes are specification artefacts, and implementations are not required to use an analogous data structure.
Productions of the syntactic grammar are distinguished by having just one colon “
” as punctuation.
The syntactic grammar as presented in clauses
13
through
16
is not a complete account of which token sequences are accepted as a correct ECMAScript
Script
or
Module
Certain additional token sequences are also accepted, namely, those
that would be described by the grammar if only semicolons were added to
the sequence in certain places (such as before line terminator
characters). Furthermore, certain token sequences that are described by
the grammar are not considered acceptable if a line terminator character
appears in certain “awkward” places.
In certain cases, in order to avoid ambiguities, the syntactic
grammar uses generalized productions that permit token sequences that do
not form a valid ECMAScript
Script
or
Module
. For example, this technique is used for object literals and object destructuring patterns. In such cases a more restrictive
supplemental grammar
is provided that further restricts the acceptable token sequences. Typically, an
early error
rule will then state that, in certain contexts, "
must cover
an
", where
is a Parse Node (an instance of the generalized production) and
is a nonterminal from the supplemental grammar. This means:
The sequence of tokens originally matched by
is parsed again using
as the
goal symbol
. If
takes grammatical parameters, then they are set to the same values used when
was originally parsed.
If the sequence of tokens can be parsed as a single instance of
, with no tokens left over, then:
We refer to that instance of
(a Parse Node, unique for a given
) as "the
that is
covered
by
".
All Early Error rules for
and its derived productions also apply to the
that is covered by
Otherwise (if the parse fails), it is an early Syntax Error.
5.1.5
Grammar Notation
5.1.5.1
Terminal Symbols
In the ECMAScript grammars, some terminal symbols are shown in
fixed-width
font. These are to appear in a source text exactly as written. All
terminal symbol code points specified in this way are to be understood
as the appropriate Unicode code points from the Basic Latin block, as
opposed to any similar-looking code points from other Unicode ranges. A
code point in a terminal symbol cannot be expressed by a
UnicodeEscapeSequence
In grammars whose terminal symbols are individual Unicode
code points (i.e., the lexical, RegExp, and numeric string grammars), a
contiguous run of multiple fixed-width code points appearing in a
production is a simple shorthand for the same sequence of code points,
written as standalone terminal symbols.
For example, the production:
HexIntegerLiteral
::
0x
HexDigits
is a shorthand for:
HexIntegerLiteral
::
HexDigits
In contrast, in the syntactic grammar, a contiguous run of fixed-width code points is a single terminal symbol.
Terminal symbols come in two other forms:
In the lexical and RegExp grammars, Unicode code points
without a conventional printed representation are instead shown in the
form "" where "ABBREV" is a mnemonic for the code point or
set of code points. These forms are defined in
Unicode Format-Control Characters
White Space
, and
Line Terminators
In the syntactic grammar, certain terminal symbols (e.g.
IdentifierName
and
RegularExpressionLiteral
) are shown in italics, as they refer to the nonterminals of the same name in the lexical grammar.
5.1.5.2
Nonterminal Symbols and Productions
Nonterminal symbols are shown in
italic
type. The
definition of a nonterminal (also called a “production”) is introduced
by the name of the nonterminal being defined followed by one or more
colons. (The number of colons indicates to which grammar the production
belongs.) One or more alternative right-hand sides for the nonterminal
then follow on succeeding lines. For example, the syntactic definition:
WhileStatement
while
Expression
Statement
states that the nonterminal
WhileStatement
represents the token
while
, followed by a left parenthesis token, followed by an
Expression
, followed by a right parenthesis token, followed by a
Statement
. The occurrences of
Expression
and
Statement
are themselves nonterminals. As another example, the syntactic definition:
ArgumentList
AssignmentExpression
ArgumentList
AssignmentExpression
states that an
ArgumentList
may represent either a single
AssignmentExpression
or an
ArgumentList
, followed by a comma, followed by an
AssignmentExpression
. This definition of
ArgumentList
is recursive, that is, it is defined in terms of itself. The result is that an
ArgumentList
may contain any positive number of arguments, separated by commas, where each argument expression is an
AssignmentExpression
. Such recursive definitions of nonterminals are common.
5.1.5.3
Optional Symbols
The subscripted suffix “
opt
”, which may appear
after a terminal or nonterminal, indicates an optional symbol. The
alternative containing the optional symbol actually specifies two
right-hand sides, one that omits the optional element and one that
includes it. This means that:
VariableDeclaration
BindingIdentifier
Initializer
opt
is a convenient abbreviation for:
VariableDeclaration
BindingIdentifier
BindingIdentifier
Initializer
and that:
ForStatement
for
LexicalDeclaration
Expression
opt
Expression
opt
Statement
is a convenient abbreviation for:
ForStatement
for
LexicalDeclaration
Expression
opt
Statement
for
LexicalDeclaration
Expression
Expression
opt
Statement
which in turn is an abbreviation for:
ForStatement
for
LexicalDeclaration
Statement
for
LexicalDeclaration
Expression
Statement
for
LexicalDeclaration
Expression
Statement
for
LexicalDeclaration
Expression
Expression
Statement
so, in this example, the nonterminal
ForStatement
actually has four alternative right-hand sides.
5.1.5.4
Grammatical Parameters
A production may be parameterized by a subscripted annotation of the form “
[parameters]
”, which may appear as a suffix to the nonterminal symbol defined by the production. “
parameters
may be either a single name or a comma separated list of names. A
parameterized production is shorthand for a set of productions defining
all combinations of the parameter names, preceded by an underscore,
appended to the parameterized nonterminal symbol. This means that:
StatementList
[Return]
ReturnStatement
ExpressionStatement
is a convenient abbreviation for:
StatementList
ReturnStatement
ExpressionStatement
StatementList_Return
ReturnStatement
ExpressionStatement
and that:
StatementList
[Return, In]
ReturnStatement
ExpressionStatement
is an abbreviation for:
StatementList
ReturnStatement
ExpressionStatement
StatementList_Return
ReturnStatement
ExpressionStatement
StatementList_In
ReturnStatement
ExpressionStatement
StatementList_Return_In
ReturnStatement
ExpressionStatement
Multiple parameters produce a combinatory number of
productions, not all of which are necessarily referenced in a complete
grammar.
References to nonterminals on the right-hand side of a production can also be parameterized. For example:
StatementList
ReturnStatement
ExpressionStatement
[+In]
is equivalent to saying:
StatementList
ReturnStatement
ExpressionStatement_In
and:
StatementList
ReturnStatement
ExpressionStatement
[~In]
is equivalent to:
StatementList
ReturnStatement
ExpressionStatement
A nonterminal reference may have both a parameter list and an “
opt
” suffix. For example:
VariableDeclaration
BindingIdentifier
Initializer
[+In]
opt
is an abbreviation for:
VariableDeclaration
BindingIdentifier
BindingIdentifier
Initializer_In
Prefixing a parameter name with “
” on a
right-hand side nonterminal reference makes that parameter value
dependent upon the occurrence of the parameter name on the reference to
the current production's left-hand side symbol. For example:
VariableDeclaration
[In]
BindingIdentifier
Initializer
[?In]
is an abbreviation for:
VariableDeclaration
BindingIdentifier
Initializer
VariableDeclaration_In
BindingIdentifier
Initializer_In
If a right-hand side alternative is prefixed with
“[+parameter]” that alternative is only available if the named parameter
was used in referencing the production's nonterminal symbol. If a
right-hand side alternative is prefixed with “[~parameter]” that
alternative is only available if the named parameter was
not
used in referencing the production's nonterminal symbol. This means that:
StatementList
[Return]
[+Return]
ReturnStatement
ExpressionStatement
is an abbreviation for:
StatementList
ExpressionStatement
StatementList_Return
ReturnStatement
ExpressionStatement
and that:
StatementList
[Return]
[~Return]
ReturnStatement
ExpressionStatement
is an abbreviation for:
StatementList
ReturnStatement
ExpressionStatement
StatementList_Return
ExpressionStatement
5.1.5.5
one of
When the words “
one of
” follow the colon(s) in a
grammar definition, they signify that each of the terminal symbols on
the following line or lines is an alternative definition. For example,
the lexical grammar for ECMAScript contains the production:
NonZeroDigit
::
one of
which is merely a convenient abbreviation for:
NonZeroDigit
::
5.1.5.6
[empty]
If the phrase “[empty]” appears as the right-hand side of a
production, it indicates that the production's right-hand side contains
no terminals or nonterminals.
5.1.5.7
Lookahead Restrictions
If the phrase “[lookahead =
seq
]” appears in the right-hand side of a production, it indicates that the production may only be used if the token sequence
seq
is a prefix of the immediately following input token sequence. Similarly, “[lookahead ∈
set
]”, where
set
is a
finite
non-empty set of token sequences, indicates that the production may only be used if some element of
set
is a prefix of the immediately following token sequence. For
convenience, the set can also be written as a nonterminal, in which case
it represents the set of all token sequences to which that nonterminal
could expand. It is considered an editorial error if the nonterminal
could expand to infinitely many distinct token sequences.
These conditions may be negated. “[lookahead ≠
seq
]” indicates that the containing production may only be used if
seq
is
not
a prefix of the immediately following input token sequence, and “[lookahead ∉
set
]” indicates that the production may only be used if
no
element of
set
is a prefix of the immediately following token sequence.
As an example, given the definitions:
DecimalDigit
::
one of
DecimalDigits
::
DecimalDigit
DecimalDigits
DecimalDigit
the definition:
LookaheadExample
::
[lookahead ∉ {
}]
DecimalDigits
DecimalDigit
[lookahead ∉
DecimalDigit
matches either the letter
followed by one or more decimal digits the first of which is even, or a decimal digit not followed by another decimal digit.
Note that when these phrases are used in the syntactic
grammar, it may not be possible to unambiguously identify the
immediately following token sequence because determining later tokens
requires knowing which lexical
goal symbol
to use at later positions. As such, when these are used in the
syntactic grammar, it is considered an editorial error for a token
sequence
seq
to appear in a lookahead restriction (including as part of a set of sequences) if the choices of lexical
goal symbols
to use could change whether or not
seq
would be a prefix of the resulting token sequence.
5.1.5.8
[no
LineTerminator
here]
If the phrase “[no
LineTerminator
here]” appears in the right-hand side of a production of the syntactic grammar, it indicates that the production is
a restricted production
: it may not be used if a
LineTerminator
occurs in the input stream at the indicated position. For example, the production:
ThrowStatement
throw
[no
LineTerminator
here]
Expression
indicates that the production may not be used if a
LineTerminator
occurs in the script between the
throw
token and the
Expression
Unless the presence of a
LineTerminator
is forbidden by a restricted production, any number of occurrences of
LineTerminator
may appear between any two consecutive tokens in the stream of input
elements without affecting the syntactic acceptability of the script.
5.1.5.9
but not
The right-hand side of a production may specify that certain expansions are not permitted by using the phrase “
but not
” and then indicating the expansions to be excluded. For example, the production:
Identifier
::
IdentifierName
but not
ReservedWord
means that the nonterminal
Identifier
may be replaced by any sequence of code points that could replace
IdentifierName
provided that the same sequence of code points could not replace
ReservedWord
5.1.5.10
Descriptive Phrases
Finally, a few nonterminal symbols are described by a
descriptive phrase in sans-serif type in cases where it would be
impractical to list all the alternatives:
SourceCharacter
::
any Unicode code point
5.2
Algorithm Conventions
The specification often uses a numbered list to specify steps in
an algorithm. These algorithms are used to precisely specify the
required semantics of ECMAScript language constructs. The algorithms are
not intended to imply the use of any specific implementation technique.
In practice, there may be more efficient algorithms available to
implement a given feature.
Algorithms may be explicitly parameterized with an ordered,
comma-separated sequence of alias names which may be used within the
algorithm steps to reference the argument passed in that position.
Optional parameters are denoted with surrounding brackets ([ ,
name
]) and are no different from required parameters within algorithm
steps. A rest parameter may appear at the end of a parameter list,
denoted with leading ellipsis (, ...
name
). The rest parameter captures all of the arguments provided following the required and optional parameters into a
List
. If there are no such additional arguments, that
List
is empty.
Algorithm steps may be subdivided into sequential substeps.
Substeps are indented and may themselves be further divided into
indented substeps. Outline numbering conventions are used to identify
substeps with the first level of substeps labelled with lowercase
alphabetic characters and the second level of substeps labelled with
lowercase roman numerals. If more than three levels are required these
rules repeat with the fourth level using numeric labels. For example:
1.
Top-level step
a.
Substep.
b.
Substep.
i.
Subsubstep.
1.
Subsubsubstep
a.
Subsubsubsubstep
i.
Subsubsubsubsubstep
A step or substep may be written as an “if” predicate that
conditions its substeps. In this case, the substeps are only applied if
the predicate is true. If a step or substep begins with the word “else”,
it is a predicate that is the negation of the preceding “if” predicate
step at the same level.
A step may specify the iterative application of its substeps.
A step that begins with “
Assert
:” asserts
an invariant condition of its algorithm. Such assertions are used to
make explicit algorithmic invariants that would otherwise be implicit.
Such assertions add no additional semantic requirements and hence need
not be checked by an implementation. They are used simply to clarify
algorithms.
Algorithm steps may declare named aliases for any value using the form “Let
be
someValue
”. These aliases are reference-like in that both
and
someValue
refer to the same underlying data and modifications to either are
visible to both. Algorithm steps that want to avoid this reference-like
behaviour should explicitly make a copy of the right-hand side: “Let
be a copy of
someValue
” creates a shallow copy of
someValue
Once declared, an alias may be referenced in any subsequent steps
and must not be referenced from steps prior to the alias's declaration.
Aliases may be modified using the form “Set
to
someOtherValue
”.
5.2.1
Abstract Operations
In order to facilitate their use in multiple parts of this specification, some algorithms, called
abstract operations
are named and written in parameterized functional form so that they may
be referenced by name from within other algorithms. Abstract operations
are typically referenced using a functional application style such as
OperationName(
arg1
arg2
). Some abstract
operations are treated as polymorphically dispatched methods of
class-like specification abstractions. Such method-like abstract
operations are typically referenced using a method application style
such as
someValue
.OperationName(
arg1
arg2
).
5.2.2
Syntax-Directed Operations
syntax-directed operation
is a named operation whose definition consists of algorithms, each of
which is associated with one or more productions from one of the
ECMAScript grammars. A production that has multiple alternative
definitions will typically have a distinct algorithm for each
alternative. When an algorithm is associated with a grammar production,
it may reference the terminal and nonterminal symbols of the production
alternative as if they were parameters of the algorithm. When used in
this manner, nonterminal symbols refer to the actual alternative
definition that is matched when parsing the source text. The
source text matched by
a grammar production or
Parse Node
derived from it is the portion of the source text that starts at the
beginning of the first terminal that participated in the match and ends
at the end of the last terminal that participated in the match.
When an algorithm is associated with a production alternative,
the alternative is typically shown without any “[ ]” grammar
annotations. Such annotations should only affect the syntactic
recognition of the alternative and have no effect on the associated
semantics for the alternative.
Syntax-directed operations are invoked with a parse node and, optionally, other parameters by using the conventions on steps
, and
in the following algorithm:
1.
Let
status
be SyntaxDirectedOperation of
SomeNonTerminal
2.
Let
someParseNode
be the parse of some source text.
3.
Perform SyntaxDirectedOperation of
someParseNode
4.
Perform SyntaxDirectedOperation of
someParseNode
with argument
"value"
Unless explicitly specified otherwise, all
chain productions
have an implicit definition for every operation that might be applied
to that production's left-hand side nonterminal. The implicit definition
simply reapplies the same operation with the same parameters, if any,
to the
chain production
's
sole right-hand side nonterminal and then returns the result. For
example, assume that some algorithm has a step of the form: “Return
Evaluation
of
Block
” and that there is a production:
Block
StatementList
but the
Evaluation
operation does not associate an algorithm with that production. In that case, the
Evaluation
operation implicitly includes an association of the form:
Runtime Semantics:
Evaluation
Block
StatementList
1.
Return
Evaluation
of
StatementList
5.2.3
Runtime Semantics
Algorithms which specify semantics that must be called at runtime are called
runtime semantics
. Runtime semantics are defined by
abstract operations
or
syntax-directed operations
5.2.3.1
Completion (
completionRecord
The abstract operation Completion takes argument
completionRecord
(a
Completion Record
) and returns a
Completion Record
. It is used to emphasize that a
Completion Record
is being returned. It performs the following steps when called:
1.
Assert
completionRecord
is a
Completion Record
2.
Return
completionRecord
5.2.3.2
Throw an Exception
Algorithms steps that say to throw an exception, such as
1.
Throw a
TypeError
exception.
mean the same things as:
1.
Return
ThrowCompletion
(a newly created
TypeError
object).
5.2.3.3
ReturnIfAbrupt
Algorithms steps that say or are otherwise equivalent to:
1.
ReturnIfAbrupt
argument
).
mean the same thing as:
1.
Assert
argument
is a
Completion Record
2.
If
argument
is an
abrupt completion
, return
Completion
argument
).
3.
Else, set
argument
to
argument
.[[Value]].
Algorithms steps that say or are otherwise equivalent to:
1.
ReturnIfAbrupt
(AbstractOperation()).
mean the same thing as:
1.
Let
hygienicTemp
be AbstractOperation().
2.
Assert
hygienicTemp
is a
Completion Record
3.
If
hygienicTemp
is an
abrupt completion
, return
Completion
hygienicTemp
).
4.
Else, set
hygienicTemp
to
hygienicTemp
.[[Value]].
Where
hygienicTemp
is ephemeral and visible only in the steps pertaining to ReturnIfAbrupt.
Algorithms steps that say or are otherwise equivalent to:
1.
Let
result
be AbstractOperation(
ReturnIfAbrupt
argument
)).
mean the same thing as:
1.
Assert
argument
is a
Completion Record
2.
If
argument
is an
abrupt completion
, return
Completion
argument
).
3.
Else, set
argument
to
argument
.[[Value]].
4.
Let
result
be AbstractOperation(
argument
).
5.2.3.4
ReturnIfAbrupt Shorthands
Invocations of
abstract operations
and
syntax-directed operations
that are prefixed by
indicate that
ReturnIfAbrupt
should be applied to the resulting
Completion Record
. For example, the step:
1.
? OperationName().
is equivalent to the following step:
1.
ReturnIfAbrupt
(OperationName()).
Similarly, for method application style, the step:
1.
someValue
.OperationName().
is equivalent to:
1.
ReturnIfAbrupt
someValue
.OperationName()).
Similarly, prefix
is used to indicate that the following invocation of an abstract or
syntax-directed operation
will never return an
abrupt completion
and that the resulting
Completion Record
's [[Value]] field should be used in place of the return value of the operation. For example, the step:
1.
Let
val
be ! OperationName().
is equivalent to the following steps:
1.
Let
val
be OperationName().
2.
Assert
val
is a
normal completion
3.
Set
val
to
val
.[[Value]].
Syntax-directed operations
for
runtime semantics
make use of this shorthand by placing
or
before the invocation of the operation:
1.
Perform ! SyntaxDirectedOperation of
NonTerminal
5.2.3.5
Implicit Normal Completion
In algorithms within
abstract operations
which are declared to return a
Completion Record
, and within all built-in functions, the returned value is first passed to
NormalCompletion
, and the result is used instead. This rule does not apply within the
Completion
algorithm or when the value being returned is clearly marked as a
Completion Record
in that step; these cases are:
when the result of applying
Completion
NormalCompletion
, or
ThrowCompletion
is directly returned
when the result of constructing a
Completion Record
is directly returned
It is an editorial error if a
Completion Record
is returned from such an abstract operation through any other means. For example, within these
abstract operations
1.
Return
true
means the same things as any of
1.
Return
NormalCompletion
true
).
or
1.
Let
completion
be
NormalCompletion
true
).
2.
Return
Completion
completion
).
or
1.
Return
Completion Record
{ [[Type]]:
normal
, [[Value]]:
true
, [[Target]]:
empty
}.
Note that, through the
ReturnIfAbrupt
expansion, the following example is allowed, as within the expanded steps, the result of applying
Completion
is returned directly in the abrupt case and the implicit
NormalCompletion
application occurs after unwrapping in the normal case.
1.
Return ?
completion
The following example would be an editorial error because a
Completion Record
is being returned without being annotated in that step.
1.
Let
completion
be
NormalCompletion
true
).
2.
Return
completion
5.2.4
Static Semantics
Context-free grammars are not sufficiently powerful to express
all the rules that define whether a stream of input elements form a
valid ECMAScript
Script
or
Module
that may be evaluated. In some situations additional rules are needed
that may be expressed using either ECMAScript algorithm conventions or
prose requirements. Such rules are always associated with a production
of a grammar and are called the
static semantics
of the production.
Static Semantic Rules have names and typically are defined
using an algorithm. Named Static Semantic Rules are associated with
grammar productions and a production that has multiple alternative
definitions will typically have for each alternative a distinct
algorithm for each applicable named static semantic rule.
A special kind of static semantic rule is an
Early Error Rule
Early error
rules define
early error
conditions (see clause
17
) that are associated with specific grammar productions.
Evaluation
of most
early error
rules are not explicitly invoked within the algorithms of this
specification. A conforming implementation must, prior to the first
evaluation of a
Script
or
Module
, validate all of the
early error
rules of the productions used to parse that
Script
or
Module
. If any of the
early error
rules are violated the
Script
or
Module
is invalid and cannot be evaluated.
5.2.5
Mathematical Operations
This specification makes reference to these kinds of numeric values:
Mathematical values
: Arbitrary real numbers, used as the default numeric type.
Extended mathematical values
Mathematical values
together with +∞ and -∞.
Numbers
IEEE 754-2019
double-precision floating point values.
BigInts
ECMAScript language values
representing arbitrary
integers
in a one-to-one correspondence.
In the language of this specification, numerical values are
distinguished among different numeric kinds using subscript suffixes.
The subscript
refers to Numbers, and the subscript
refers to BigInts. Numeric values without a subscript suffix refer to
mathematical values
Numeric operators such as +, ×, =, and ≥ refer to those operations as determined by the type of the operands. When applied to
mathematical values
, the operators refer to the usual mathematical operations. When applied to
extended mathematical values
the operators refer to the usual mathematical operations over the
extended real numbers; indeterminate forms are not defined and their use
in this specification should be considered an editorial error. When
applied to Numbers, the operators refer to the relevant operations
within
IEEE 754-2019
. When applied to BigInts, the operators refer to the usual mathematical operations applied to the
mathematical value of
the BigInt.
In general, when this specification refers to a numerical value, such as in the phrase, "the length of
" or "the
integer
represented by the four hexadecimal digits ...", without explicitly specifying a numeric kind, the phrase refers to a
mathematical value
. Phrases which refer to a Number or a BigInt value are explicitly annotated as such; for example, "the
Number value for
the number of code points in …" or "the
BigInt value for
…".
Numeric operators applied to mixed-type operands (such as a Number and a
mathematical value
) are not defined and should be considered an editorial error in this specification.
This specification denotes most numeric values in base 10; it
also uses numeric values of the form 0x followed by digits 0-9 or A-F as
base-16 values.
When the term
integer
is used in this specification, it refers to a
mathematical value
which is in the set of
integers
, unless otherwise stated. When the term
integral Number
is used in this specification, it refers to a Number value whose
mathematical value
is in the set of
integers
Conversions between
mathematical values
and Numbers or BigInts are always explicit in this document. A conversion from a
mathematical value
or
extended mathematical value
to a Number is denoted as "the
Number value for
" or
𝔽(
, and is defined in
6.1.6.1
. A conversion from an
integer
to a BigInt is denoted as "the
BigInt value for
" or
ℤ(
. A conversion from a Number or BigInt
to a
mathematical value
is denoted as "the
mathematical value of
", or
ℝ(
. The
mathematical value of
+0
and
-0
is the
mathematical value
0. The
mathematical value of
non-
finite
values is not defined. The
extended mathematical value of
is the
mathematical value of
for
finite
values, and is +∞ and -∞ for
+∞
and
-∞
respectively; it is not defined for
NaN
The mathematical function
abs(
produces the absolute value of
, which is
if
< 0 and otherwise is
itself.
The mathematical function
min(
x1
x2
, … ,
xN
produces the mathematically smallest of
x1
through
xN
. The mathematical function
max(
x1
x2
, ...,
xN
produces the mathematically largest of
x1
through
xN
. The domain and range of these mathematical functions are the
extended mathematical values
The notation “
modulo
” (
must be
finite
and non-zero) computes a value
of the same sign as
(or zero) such that
abs
) <
abs
) and
for some
integer
The phrase "the result of
clamping
between
lower
and
upper
" (where
is an
extended mathematical value
and
lower
and
upper
are
mathematical values
such that
lower
upper
) produces
lower
if
lower
, produces
upper
if
upper
, and otherwise produces
The mathematical function
floor(
produces the largest
integer
(closest to +∞) that is not larger than
The mathematical function
truncate(
removes the fractional part of
by rounding towards zero, producing
floor
(-
if
< 0 and otherwise producing
floor
Mathematical functions
min
max
abs
floor
, and
truncate
are not defined for Numbers and BigInts, and any usage of those methods that have non-
mathematical value
arguments would be an editorial error in this specification.
Note
floor
) =
- (
modulo
1)
An
interval
from lower bound
to upper bound
is a possibly-infinite, possibly-empty set of numeric values of the
same numeric type. Each bound will be described as either inclusive or
exclusive, but not both. There are four kinds of intervals, as follows:
An
interval
from
(inclusive) to
(inclusive), also called an
inclusive interval
from
to
, includes all values
of the same numeric type such that
, and no others.
An
interval
from
(inclusive) to
(exclusive) includes all values
of the same numeric type such that
, and no others.
An
interval
from
(exclusive) to
(inclusive) includes all values
of the same numeric type such that
, and no others.
An
interval
from
(exclusive) to
(exclusive) includes all values
of the same numeric type such that
, and no others.
For example, the
interval
from 1 (inclusive) to 2 (exclusive) consists of all
mathematical values
between 1 and 2, including 1 and not including 2. For the purpose of defining intervals,
-0
+0
, so, for example, an
inclusive interval
with a lower bound of
+0
includes
+0
but not
-0
NaN
is never included in an
interval
5.2.6
Value Notation
In this specification,
ECMAScript language values
are displayed in
bold
. Examples include
null
true
, or
"hello"
. These are distinguished from
ECMAScript source text
such as
Function.prototype.apply
or
let n = 42;
5.2.7
Identity
In this specification, both specification values and
ECMAScript language values
are compared for equality. When comparing for equality, values fall into one of two categories.
Values without identity
are equal to other values without identity if all of their innate
characteristics are the same — characteristics such as the magnitude of
an
integer
or the length of a sequence. Values without identity may be manifest
without prior reference by fully describing their characteristics. In
contrast, each
value with identity
is unique and therefore only equal to itself. Values with identity are
like values without identity but with an additional unguessable,
unchangeable, universally-unique characteristic called
identity
References to existing values with identity cannot be manifest simply
by describing them, as the identity itself is indescribable; instead,
references to these values must be explicitly passed from one place to
another. Some values with identity are mutable and therefore can have
their characteristics (except their identity) changed in-place, causing
all holders of the value to observe the new characteristics. A value
without identity is never equal to a value with identity.
From the perspective of this specification, the word “is” is used to compare two values for equality, as in “If
bool
is
true
, then ...”, and the word “contains” is used to search for a value inside lists using equality comparisons, as in "If
list
contains a
Record
such that
.[[Foo]] is
true
, then ...". The
specification identity
of values determines the result of these comparisons and is axiomatic in this specification.
From the perspective of the ECMAScript language, language values are compared for equality using the
SameValue
abstract operation and the
abstract operations
it transitively calls. The algorithms of these comparison
abstract operations
determine
language identity
of
ECMAScript language values
For specification values, examples of values without specification identity include, but are not limited to:
mathematical values
and
extended mathematical values
ECMAScript source text
surrogate pairs
Directive Prologues
, etc; UTF-16 code units; Unicode code points;
enums
abstract operations
, including
syntax-directed operations
host hooks
etc; and ordered pairs. Examples of specification values with
specification identity include, but are not limited to: any kind of
Records
, including
Property Descriptors
PrivateElements
, etc;
Parse Nodes
Lists
Sets
and
Relations
Abstract Closures
Data Blocks
Private Names
execution contexts
and
execution context stacks
agent signifiers
; and
WaiterLists
Specification identity agrees with language identity for all
ECMAScript language values
except Symbol values produced by
Symbol.for
. The
ECMAScript language values
without specification identity and without language identity are
undefined
null
Booleans
Strings
Numbers
, and
BigInts
. The
ECMAScript language values
with specification identity and language identity are
Symbols
not produced by
Symbol.for
and
Objects
. Symbol values produced by
Symbol.for
have specification identity, but not language identity.
ECMAScript Data Types and Values
Algorithms within this specification manipulate values each of
which has an associated type. The possible value types are exactly those
defined in this clause. Types are further subclassified into
ECMAScript language types
and specification types.
Within this specification, the notation “Type(
)” is used as shorthand for “the
type
of
” where “type” refers to the ECMAScript language and specification types defined in this clause.
6.1
ECMAScript Language Types
An
ECMAScript language type
corresponds to values that are directly manipulated by an ECMAScript
programmer using the ECMAScript language. The ECMAScript language types
are Undefined, Null, Boolean, String, Symbol, Number, BigInt, and
Object. An
ECMAScript language value
is a value that is characterized by an ECMAScript language type.
6.1.1
The Undefined Type
The Undefined type has exactly one value, called
undefined
. Any variable that has not been assigned a value has the value
undefined
6.1.2
The Null Type
The Null type has exactly one value, called
null
6.1.3
The Boolean Type
The
Boolean type
represents a logical entity having two values, called
true
and
false
6.1.4
The String Type
The
String type
is the set of all ordered sequences of zero or more 16-bit unsigned
integer
values (“elements”) up to a maximum length of 2
53
- 1 elements. The String type is generally used to represent textual
data in a running ECMAScript program, in which case each element in the
String is treated as a UTF-16 code unit value. Each element is regarded
as occupying a position within the sequence. These positions are indexed
with non-negative
integers
The first element (if any) is at index 0, the next element (if any) at
index 1, and so on. The length of a String is the number of elements
(i.e., 16-bit values) within it. The empty String has length zero and
therefore contains no elements.
ECMAScript operations that do not interpret String contents
apply no further semantics. Operations that do interpret String values
treat each element as a single UTF-16 code unit. However, ECMAScript
does not restrict the value of or relationships between these code
units, so operations that further interpret String contents as sequences
of Unicode code points encoded in UTF-16 must account for ill-formed
subsequences. Such operations apply special treatment to every code unit
with a numeric value in the
inclusive interval
from 0xD800 to 0xDBFF (defined by the Unicode Standard as a
leading surrogate
, or more formally as a
high-surrogate code unit
) and every code unit with a numeric value in the
inclusive interval
from 0xDC00 to 0xDFFF (defined as a
trailing surrogate
, or more formally as a
low-surrogate code unit
) using the following rules:
A code unit that is not a
leading surrogate
and not a
trailing surrogate
is interpreted as a code point with the same value.
A sequence of two code units, where the first code unit
c1
is a
leading surrogate
and the second code unit
c2
trailing surrogate
, is a
surrogate pair
and is interpreted as a code point with the value (
c1
- 0xD800) × 0x400 + (
c2
- 0xDC00) + 0x10000. (See
11.1.3
A code unit that is a
leading surrogate
or
trailing surrogate
, but is not part of a
surrogate pair
, is interpreted as a code point with the same value.
The function
String.prototype.normalize
(see
22.1.3.14
) can be used to explicitly normalize a String value.
String.prototype.localeCompare
(see
22.1.3.11
internally normalizes String values, but no other operations implicitly
normalize the strings upon which they operate. Operation results are
not language- and/or locale-sensitive unless stated otherwise.
Note
The rationale behind this design was to keep the implementation of Strings as simple and high-performing as possible. If
ECMAScript source text
is in Normalized Form C, string literals are guaranteed to also be
normalized, as long as they do not contain any Unicode escape sequences.
In this specification, the phrase "the
string-concatenation
of
..." (where each argument is a String value, a code unit, or a sequence
of code units) denotes the String value whose sequence of code units is
the concatenation of the code units (in order) of each of the arguments
(in order).
The phrase "the
substring
of
from
inclusiveStart
to
exclusiveEnd
" (where
is a String value or a sequence of code units and
inclusiveStart
and
exclusiveEnd
are
integers
) denotes the String value consisting of the consecutive code units of
beginning at index
inclusiveStart
and ending immediately before index
exclusiveEnd
(which is the empty String when
inclusiveStart
exclusiveEnd
). If the "to" suffix is omitted, the length of
is used as the value of
exclusiveEnd
The phrase "
the ASCII word characters
denotes the following String value, which consists solely of every
letter and number in the Unicode Basic Latin block along with U+005F
(LOW LINE):
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_"
For historical reasons, it has significance to various algorithms.
6.1.4.1
StringIndexOf (
string
searchValue
fromIndex
The abstract operation StringIndexOf takes arguments
string
(a String),
searchValue
(a String), and
fromIndex
(a non-negative
integer
) and returns an
integer
. It performs the following steps when called:
1.
Let
len
be the length of
string
2.
If
searchValue
is the empty String and
fromIndex
len
, return
fromIndex
3.
Let
searchLen
be the length of
searchValue
4.
For each
integer
such that
fromIndex
len
searchLen
, in ascending order, do
a.
Let
candidate
be the
substring
of
string
from
to
searchLen
b.
If
candidate
is
searchValue
, return
5.
Return -1.
Note 1
If
searchValue
is the empty String and
fromIndex
≤ the length of
string
, this algorithm returns
fromIndex
. The empty String is effectively found at every position within a string, including after the last code unit.
Note 2
This algorithm always returns -1 if
fromIndex
+ the length of
searchValue
> the length of
string
6.1.5
The Symbol Type
The
Symbol type
is the set of all non-String values that may be used as the key of an Object property (
6.1.7
).
Each possible Symbol value is unique and immutable.
Each Symbol value immutably holds an associated value called [[Description]] that is either
undefined
or a String value.
6.1.5.1
Well-Known Symbols
Well-known symbols are built-in Symbol values that are
explicitly referenced by algorithms of this specification. They are
typically used as the keys of properties whose values serve as extension
points of a specification algorithm. Unless otherwise specified,
well-known symbols values are shared by all
realms
9.3
).
Within this specification a well-known symbol is referred to
by using a notation of the form @@name, where “name” is one of the
values listed in
Table 1
Table 1: Well-known Symbols
Specification Name
[[Description]]
Value and Purpose
@@asyncIterator
"Symbol.asyncIterator"
A method that returns the default AsyncIterator for an object. Called by the semantics of the
for
await
of
statement.
@@hasInstance
"Symbol.hasInstance"
A method that determines if a
constructor
object recognizes an object as one of the
constructor
's instances. Called by the semantics of the
instanceof
operator.
@@isConcatSpreadable
"Symbol.isConcatSpreadable"
A Boolean valued property that if true indicates that an object should be flattened to its array elements by
Array.prototype.concat
@@iterator
"Symbol.iterator"
A method that returns the default Iterator for an object. Called by the semantics of the for-of statement.
@@match
"Symbol.match"
A regular expression method that matches the regular expression against a string. Called by the
String.prototype.match
method.
@@matchAll
"Symbol.matchAll"
A regular expression method that returns an iterator,
that yields matches of the regular expression against a string. Called
by the
String.prototype.matchAll
method.
@@replace
"Symbol.replace"
A regular expression method that replaces matched substrings of a string. Called by the
String.prototype.replace
method.
@@search
"Symbol.search"
A regular expression method that returns the index
within a string that matches the regular expression. Called by the
String.prototype.search
method.
@@species
"Symbol.species"
A function valued property that is the
constructor
function that is used to create derived objects.
@@split
"Symbol.split"
A regular expression method that splits a string at the
indices that match the regular expression. Called by the
String.prototype.split
method.
@@toPrimitive
"Symbol.toPrimitive"
A method that converts an object to a corresponding primitive value. Called by the
ToPrimitive
abstract operation.
@@toStringTag
"Symbol.toStringTag"
A String valued property that is used in the creation of
the default string description of an object. Accessed by the built-in
method
Object.prototype.toString
@@unscopables
"Symbol.unscopables"
An object valued property whose own and inherited property names are property names that are excluded from the
with
environment bindings of the associated object.
6.1.6
Numeric Types
ECMAScript has two built-in numeric types: Number and BigInt. The following
abstract operations
are defined over these numeric types. The "Result" column shows the
return type, along with an indication if it is possible for some
invocations of the operation to return an
abrupt completion
Table 2: Numeric Type Operations
Operation
Example source
Invoked by the
Evaluation
semantics of ...
Result
Number::unaryMinus
-x
Unary
Operator
Number
BigInt::unaryMinus
BigInt
Number::bitwiseNOT
~x
Bitwise NOT Operator (
Number
BigInt::bitwiseNOT
BigInt
Number::exponentiate
x ** y
Exponentiation Operator
and
Math.pow (
base
exponent
Number
BigInt::exponentiate
either a
normal completion containing
a BigInt or a
throw completion
Number::multiply
x * y
Multiplicative Operators
Number
BigInt::multiply
BigInt
Number::divide
x / y
Multiplicative Operators
Number
BigInt::divide
either a
normal completion containing
a BigInt or a
throw completion
Number::remainder
x % y
Multiplicative Operators
Number
BigInt::remainder
either a
normal completion containing
a BigInt or a
throw completion
Number::add
x ++
++ x
x + y
Postfix Increment Operator
Prefix Increment Operator
and
The Addition Operator (
Number
BigInt::add
BigInt
Number::subtract
x --
-- x
x - y
Postfix Decrement Operator
Prefix Decrement Operator
and
The Subtraction Operator (
Number
BigInt::subtract
BigInt
Number::leftShift
x << y
The Left Shift Operator (
<<
Number
BigInt::leftShift
BigInt
Number::signedRightShift
x >> y
The Signed Right Shift Operator (
>>
Number
BigInt::signedRightShift
BigInt
Number::unsignedRightShift
x >>> y
The Unsigned Right Shift Operator (
>>>
Number
BigInt::unsignedRightShift
throw completion
Number::lessThan
x < y
x > y
x <= y
x >= y
Relational Operators
via
IsLessThan (
LeftFirst
Boolean or
undefined
(for unordered inputs)
BigInt::lessThan
Boolean
Number::equal
x == y
x != y
x === y
x !== y
Equality Operators
via
IsStrictlyEqual (
Boolean
BigInt::equal
Number::sameValue
Object.is(x, y)
Object internal methods,
via
SameValue (
to test exact value equality
Boolean
Number::sameValueZero
[x].includes(y)
Array, Map, and Set methods,
via
SameValueZero (
to test value equality, ignoring the difference between
+0
and
-0
Boolean
Number::bitwiseAND
x & y
Binary Bitwise Operators
Number
BigInt::bitwiseAND
BigInt
Number::bitwiseXOR
x ^ y
Number
BigInt::bitwiseXOR
BigInt
Number::bitwiseOR
x | y
Number
BigInt::bitwiseOR
BigInt
Number::toString
String(x)
Many expressions and built-in functions, via
ToString (
argument
String
BigInt::toString
Because the numeric types are in general not convertible
without loss of precision or truncation, the ECMAScript language
provides no implicit conversion among these types. Programmers must
explicitly call
Number
and
BigInt
functions to convert among types when calling a function which requires another type.
Note
The first and subsequent editions of ECMAScript have
provided, for certain operators, implicit numeric conversions that could
lose precision or
truncate
These legacy implicit conversions are maintained for backward
compatibility, but not provided for BigInt in order to minimize
opportunity for programmer error, and to leave open the option of
generalized
value types
in a future edition.
6.1.6.1
The Number Type
The
Number type
has exactly 18,437,736,874,454,810,627 (that is,
64
- 2
53
+ 3
) values, representing the double-precision 64-bit format
IEEE 754-2019
values as specified in the IEEE Standard for Binary Floating-Point Arithmetic, except that the 9,007,199,254,740,990 (that is,
53
- 2
) distinct “Not-a-Number” values of the IEEE Standard are represented in ECMAScript as a single special
NaN
value. (Note that the
NaN
value is produced by the program expression
NaN
.)
In some implementations, external code might be able to detect a
difference between various Not-a-Number values, but such behaviour is
implementation-defined
; to ECMAScript code, all
NaN
values are indistinguishable from each other.
Note
The bit pattern that might be observed in an ArrayBuffer (see
25.1
) or a SharedArrayBuffer (see
25.2
after a Number value has been stored into it is not necessarily the
same as the internal representation of that Number value used by the
ECMAScript implementation.
There are two other special values, called
positive Infinity
and
negative Infinity
. For brevity, these values are also referred to for expository purposes by the symbols
+∞
and
-∞
, respectively. (Note that these two infinite Number values are produced by the program expressions
+Infinity
(or simply
Infinity
) and
-Infinity
.)
The other 18,437,736,874,454,810,624 (that is,
64
- 2
53
) values are called the
finite
numbers. Half of these are positive numbers and half are negative numbers; for every
finite
positive Number value there is a corresponding negative value having the same magnitude.
Note that there is both a
positive zero
and a
negative zero
. For brevity, these values are also referred to for expository purposes by the symbols
+0
and
-0
, respectively. (Note that these two different zero Number values are produced by the program expressions
+0
(or simply
) and
-0
.)
The 18,437,736,874,454,810,622 (that is,
64
- 2
53
- 2
finite
non-zero values are of two kinds:
18,428,729,675,200,069,632 (that is,
64
- 2
54
) of them are normalized, having the form
× 2
where
is 1 or -1,
is an
integer
in the
interval
from 2
52
(inclusive) to 2
53
(exclusive), and
is an
integer
in the
inclusive interval
from -1074 to 971.
The remaining 9,007,199,254,740,990 (that is,
53
- 2
) values are denormalized, having the form
× 2
where
is 1 or -1,
is an
integer
in the
interval
from 0 (exclusive) to 2
52
(exclusive), and
is -1074.
Note that all the positive and negative
integers
whose magnitude is no greater than 2
53
are representable in the Number type. The
integer
0 has two representations in the Number type:
+0
and
-0
finite
number has an
odd significand
if it is non-zero and the
integer
used to express it (in one of the two forms shown above) is odd. Otherwise, it has an
even significand
In this specification, the phrase “the
Number value for
” where
represents an exact real mathematical quantity (which might even be an
irrational number such as π) means a Number value chosen in the
following manner. Consider the set of all
finite
values of the Number type, with
-0
removed and with two additional values added to it that are not representable in the Number type, namely 2
1024
(which is
+1 × 2
53
× 2
971
) and
-2
1024
(which is
-1 × 2
53
× 2
971
). Choose the member of this set that is closest in value to
If two values of the set are equally close, then the one with an even
significand is chosen; for this purpose, the two extra values 2
1024
and
-2
1024
are considered to have even significands. Finally, if 2
1024
was chosen, replace it with
+∞
; if
-2
1024
was chosen, replace it with
-∞
; if
+0
was chosen, replace it with
-0
if and only if
< 0; any other chosen value is used unchanged. The result is the
Number value for
. (This procedure corresponds exactly to the behaviour of the
IEEE 754-2019
roundTiesToEven mode.)
The
Number value for
+∞ is
+∞
, and the
Number value for
-∞ is
-∞
Some ECMAScript operators deal only with
integers
in specific ranges such as the
inclusive interval
from
-2
31
to
31
- 1
or the
inclusive interval
from 0 to
16
- 1
. These operators accept any value of the Number type but first convert each such value to an
integer
value in the expected range. See the descriptions of the numeric conversion operations in
7.1
6.1.6.1.1
Number::unaryMinus (
The abstract operation Number::unaryMinus takes argument
(a Number) and returns a Number. It performs the following steps when called:
1.
If
is
NaN
, return
NaN
2.
Return the result of negating
; that is, compute a Number with the same magnitude but opposite sign.
6.1.6.1.2
Number::bitwiseNOT (
The abstract operation Number::bitwiseNOT takes argument
(a Number) and returns an
integral Number
. It performs the following steps when called:
1.
Let
oldValue
be !
ToInt32
).
2.
Return the result of applying bitwise complement to
oldValue
. The
mathematical value of
the result is exactly representable as a 32-bit two's complement bit string.
6.1.6.1.3
Number::exponentiate (
base
exponent
The abstract operation Number::exponentiate takes arguments
base
(a Number) and
exponent
(a Number) and returns a Number. It returns an
implementation-approximated
value representing the result of raising
base
to the
exponent
power. It performs the following steps when called:
1.
If
exponent
is
NaN
, return
NaN
2.
If
exponent
is either
+0
or
-0
, return
3.
If
base
is
NaN
, return
NaN
4.
If
base
is
+∞
, then
a.
If
exponent
+0
, return
+∞
. Otherwise, return
+0
5.
If
base
is
-∞
, then
a.
If
exponent
+0
, then
i.
If
exponent
is an odd
integral Number
, return
-∞
. Otherwise, return
+∞
b.
Else,
i.
If
exponent
is an odd
integral Number
, return
-0
. Otherwise, return
+0
6.
If
base
is
+0
, then
a.
If
exponent
+0
, return
+0
. Otherwise, return
+∞
7.
If
base
is
-0
, then
a.
If
exponent
+0
, then
i.
If
exponent
is an odd
integral Number
, return
-0
. Otherwise, return
+0
b.
Else,
i.
If
exponent
is an odd
integral Number
, return
-∞
. Otherwise, return
+∞
8.
Assert
base
is
finite
and is neither
+0
nor
-0
9.
If
exponent
is
+∞
, then
a.
If
abs
base
)) > 1, return
+∞
b.
If
abs
base
)) = 1, return
NaN
c.
If
abs
base
)) < 1, return
+0
10.
If
exponent
is
-∞
, then
a.
If
abs
base
)) > 1, return
+0
b.
If
abs
base
)) = 1, return
NaN
c.
If
abs
base
)) < 1, return
+∞
11.
Assert
exponent
is
finite
and is neither
+0
nor
-0
12.
If
base
-0
and
exponent
is not an
integral Number
, return
NaN
13.
Return an
implementation-approximated
Number value representing the result of raising
base
) to the
exponent
) power.
Note
The result of
base
**
exponent
when
base
is
or
-1
and
exponent
is
+∞
or
-∞
, or when
base
is
and
exponent
is
NaN
, differs from
IEEE 754-2019
. The first edition of ECMAScript specified a result of
NaN
for this operation, whereas later revisions of IEEE 754 specified
. The historical ECMAScript behaviour is preserved for compatibility reasons.
6.1.6.1.4
Number::multiply (
The abstract operation Number::multiply takes arguments
(a Number) and
(a Number) and returns a Number. It performs multiplication according to the rules of
IEEE 754-2019
binary double-precision arithmetic, producing the product of
and
. It performs the following steps when called:
1.
If
is
NaN
or
is
NaN
, return
NaN
2.
If
is either
+∞
or
-∞
, then
a.
If
is either
+0
or
-0
, return
NaN
b.
If
+0
, return
c.
Return -
3.
If
is either
+∞
or
-∞
, then
a.
If
is either
+0
or
-0
, return
NaN
b.
If
+0
, return
c.
Return -
4.
If
is
-0
, then
a.
If
is
-0
or
-0
, return
+0
b.
Else, return
-0
5.
If
is
-0
, then
a.
If
-0
, return
+0
b.
Else, return
-0
6.
Return
) ×
)).
Note
Finite
-precision multiplication is commutative, but not always associative.
6.1.6.1.5
Number::divide (
The abstract operation Number::divide takes arguments
(a Number) and
(a Number) and returns a Number. It performs division according to the rules of
IEEE 754-2019
binary double-precision arithmetic, producing the quotient of
and
where
is the dividend and
is the divisor. It performs the following steps when called:
1.
If
is
NaN
or
is
NaN
, return
NaN
2.
If
is either
+∞
or
-∞
, then
a.
If
is either
+∞
or
-∞
, return
NaN
b.
If
is
+0
or
+0
, return
c.
Return -
3.
If
is
+∞
, then
a.
If
is
+0
or
+0
, return
+0
. Otherwise, return
-0
4.
If
is
-∞
, then
a.
If
is
+0
or
+0
, return
-0
. Otherwise, return
+0
5.
If
is either
+0
or
-0
, then
a.
If
is either
+0
or
-0
, return
NaN
b.
If
+0
, return
c.
Return -
6.
If
is
+0
, then
a.
If
+0
, return
+∞
. Otherwise, return
-∞
7.
If
is
-0
, then
a.
If
+0
, return
-∞
. Otherwise, return
+∞
8.
Return
) /
)).
6.1.6.1.6
Number::remainder (
The abstract operation Number::remainder takes arguments
(a Number) and
(a Number) and returns a Number. It yields the remainder from an implied division of its operands where
is the dividend and
is the divisor. It performs the following steps when called:
1.
If
is
NaN
or
is
NaN
, return
NaN
2.
If
is either
+∞
or
-∞
, return
NaN
3.
If
is either
+∞
or
-∞
, return
4.
If
is either
+0
or
-0
, return
NaN
5.
If
is either
+0
or
-0
, return
6.
Assert
and
are
finite
and non-zero.
7.
Let
quotient
be
) /
).
8.
Let
be
truncate
quotient
).
9.
Let
be
) - (
) ×
).
10.
If
= 0 and
-0
, return
-0
11.
Return
).
Note 1
In C and C++, the remainder operator accepts only integral operands; in ECMAScript, it also accepts floating-point operands.
Note 2
The result of a floating-point remainder operation as computed by the
operator is not the same as the “remainder” operation defined by
IEEE 754-2019
. The
IEEE 754-2019
“remainder” operation computes the remainder from a rounding division,
not a truncating division, and so its behaviour is not analogous to that
of the usual
integer
remainder operator. Instead the ECMAScript language defines
on floating-point operations to behave in a manner analogous to that of the Java
integer
remainder operator; this may be compared with the C library function fmod.
6.1.6.1.7
Number::add (
The abstract operation Number::add takes arguments
(a Number) and
(a Number) and returns a Number. It performs addition according to the rules of
IEEE 754-2019
binary double-precision arithmetic, producing the sum of its arguments. It performs the following steps when called:
1.
If
is
NaN
or
is
NaN
, return
NaN
2.
If
is
+∞
and
is
-∞
, return
NaN
3.
If
is
-∞
and
is
+∞
, return
NaN
4.
If
is either
+∞
or
-∞
, return
5.
If
is either
+∞
or
-∞
, return
6.
Assert
and
are both
finite
7.
If
is
-0
and
is
-0
, return
-0
8.
Return
) +
)).
Note
Finite
-precision addition is commutative, but not always associative.
6.1.6.1.8
Number::subtract (
The abstract operation Number::subtract takes arguments
(a Number) and
(a Number) and returns a Number. It performs subtraction, producing the difference of its operands;
is the minuend and
is the subtrahend. It performs the following steps when called:
1.
Return
Number::add
Number::unaryMinus
)).
Note
It is always the case that
x - y
produces the same result as
x + (-y)
6.1.6.1.9
Number::leftShift (
The abstract operation Number::leftShift takes arguments
(a Number) and
(a Number) and returns an
integral Number
. It performs the following steps when called:
1.
Let
lnum
be !
ToInt32
).
2.
Let
rnum
be !
ToUint32
).
3.
Let
shiftCount
be
rnum
modulo
32.
4.
Return the result of left shifting
lnum
by
shiftCount
bits. The
mathematical value of
the result is exactly representable as a 32-bit two's complement bit string.
6.1.6.1.10
Number::signedRightShift (
The abstract operation Number::signedRightShift takes arguments
(a Number) and
(a Number) and returns an
integral Number
. It performs the following steps when called:
1.
Let
lnum
be !
ToInt32
).
2.
Let
rnum
be !
ToUint32
).
3.
Let
shiftCount
be
rnum
modulo
32.
4.
Return the result of performing a sign-extending right shift of
lnum
by
shiftCount
bits. The most significant bit is propagated. The
mathematical value of
the result is exactly representable as a 32-bit two's complement bit string.
6.1.6.1.11
Number::unsignedRightShift (
The abstract operation Number::unsignedRightShift takes arguments
(a Number) and
(a Number) and returns an
integral Number
. It performs the following steps when called:
1.
Let
lnum
be !
ToUint32
).
2.
Let
rnum
be !
ToUint32
).
3.
Let
shiftCount
be
rnum
modulo
32.
4.
Return the result of performing a zero-filling right shift of
lnum
by
shiftCount
bits. Vacated bits are filled with zero. The
mathematical value of
the result is exactly representable as a 32-bit unsigned bit string.
6.1.6.1.12
Number::lessThan (
The abstract operation Number::lessThan takes arguments
(a Number) and
(a Number) and returns a Boolean or
undefined
. It performs the following steps when called:
1.
If
is
NaN
, return
undefined
2.
If
is
NaN
, return
undefined
3.
If
is
, return
false
4.
If
is
+0
and
is
-0
, return
false
5.
If
is
-0
and
is
+0
, return
false
6.
If
is
+∞
, return
false
7.
If
is
+∞
, return
true
8.
If
is
-∞
, return
false
9.
If
is
-∞
, return
true
10.
Assert
and
are
finite
and non-zero.
11.
If
) <
), return
true
. Otherwise, return
false
6.1.6.1.13
Number::equal (
The abstract operation Number::equal takes arguments
(a Number) and
(a Number) and returns a Boolean. It performs the following steps when called:
1.
If
is
NaN
, return
false
2.
If
is
NaN
, return
false
3.
If
is
, return
true
4.
If
is
+0
and
is
-0
, return
true
5.
If
is
-0
and
is
+0
, return
true
6.
Return
false
6.1.6.1.14
Number::sameValue (
The abstract operation Number::sameValue takes arguments
(a Number) and
(a Number) and returns a Boolean. It performs the following steps when called:
1.
If
is
NaN
and
is
NaN
, return
true
2.
If
is
+0
and
is
-0
, return
false
3.
If
is
-0
and
is
+0
, return
false
4.
If
is
, return
true
5.
Return
false
6.1.6.1.15
Number::sameValueZero (
The abstract operation Number::sameValueZero takes arguments
(a Number) and
(a Number) and returns a Boolean. It performs the following steps when called:
1.
If
is
NaN
and
is
NaN
, return
true
2.
If
is
+0
and
is
-0
, return
true
3.
If
is
-0
and
is
+0
, return
true
4.
If
is
, return
true
5.
Return
false
6.1.6.1.16
NumberBitwiseOp (
op
The abstract operation NumberBitwiseOp takes arguments
op
, or
),
(a Number), and
(a Number) and returns an
integral Number
. It performs the following steps when called:
1.
Let
lnum
be !
ToInt32
).
2.
Let
rnum
be !
ToInt32
).
3.
Let
lbits
be the 32-bit two's complement bit string representing
lnum
).
4.
Let
rbits
be the 32-bit two's complement bit string representing
rnum
).
5.
If
op
is
, let
result
be the result of applying the bitwise AND operation to
lbits
and
rbits
6.
Else if
op
is
, let
result
be the result of applying the bitwise exclusive OR (XOR) operation to
lbits
and
rbits
7.
Else,
op
is
. Let
result
be the result of applying the bitwise inclusive OR operation to
lbits
and
rbits
8.
Return the
Number value for
the
integer
represented by the 32-bit two's complement bit string
result
6.1.6.1.17
Number::bitwiseAND (
The abstract operation Number::bitwiseAND takes arguments
(a Number) and
(a Number) and returns an
integral Number
. It performs the following steps when called:
1.
Return
NumberBitwiseOp
).
6.1.6.1.18
Number::bitwiseXOR (
The abstract operation Number::bitwiseXOR takes arguments
(a Number) and
(a Number) and returns an
integral Number
. It performs the following steps when called:
1.
Return
NumberBitwiseOp
).
6.1.6.1.19
Number::bitwiseOR (
The abstract operation Number::bitwiseOR takes arguments
(a Number) and
(a Number) and returns an
integral Number
. It performs the following steps when called:
1.
Return
NumberBitwiseOp
).
6.1.6.1.20
Number::toString (
radix
The abstract operation Number::toString takes arguments
(a Number) and
radix
(an
integer
in the
inclusive interval
from 2 to 36) and returns a String. It represents
as a String using a positional numeral system with radix
radix
. The digits used in the representation of a number using radix
are taken from the first
code units of
"0123456789abcdefghijklmnopqrstuvwxyz"
in order. The representation of numbers with magnitude greater than or equal to
never includes leading zeroes. It performs the following steps when called:
1.
If
is
NaN
, return
"NaN"
2.
If
is either
+0
or
-0
, return
"0"
3.
If
-0
, return the
string-concatenation
of
"-"
and
Number::toString
(-
radix
).
4.
If
is
+∞
, return
"Infinity"
5.
Let
, and
be
integers
such that
≥ 1,
radix
- 1
radix
radix
) is
, and
is as small as possible. Note that
is the number of digits in the representation of
using radix
radix
, that
is not divisible by
radix
, and that the least significant digit of
is not necessarily uniquely determined by these criteria.
6.
If
radix
≠ 10 or
is in the
inclusive interval
from -5 to 21, then
a.
If
, then
i.
Return the
string-concatenation
of:
the code units of the
digits of the representation of
using radix
radix
occurrences of the code unit 0x0030 (DIGIT ZERO)
b.
Else if
> 0, then
i.
Return the
string-concatenation
of:
the code units of the most significant
digits of the representation of
using radix
radix
the code unit 0x002E (FULL STOP)
the code units of the remaining
digits of the representation of
using radix
radix
c.
Else,
i.
Assert
≤ 0.
ii.
Return the
string-concatenation
of:
the code unit 0x0030 (DIGIT ZERO)
the code unit 0x002E (FULL STOP)
occurrences of the code unit 0x0030 (DIGIT ZERO)
the code units of the
digits of the representation of
using radix
radix
7.
NOTE: In this case, the input will be represented using scientific E notation, such as
1.2e+3
8.
Assert
radix
is 10.
9.
If
< 0, then
a.
Let
exponentSign
be the code unit 0x002D (HYPHEN-MINUS).
10.
Else,
a.
Let
exponentSign
be the code unit 0x002B (PLUS SIGN).
11.
If
= 1, then
a.
Return the
string-concatenation
of:
the code unit of the single digit of
the code unit 0x0065 (LATIN SMALL LETTER E)
exponentSign
the code units of the decimal representation of
abs
- 1)
12.
Return the
string-concatenation
of:
the code unit of the most significant digit of the decimal representation of
the code unit 0x002E (FULL STOP)
the code units of the remaining
- 1 digits of the decimal representation of
the code unit 0x0065 (LATIN SMALL LETTER E)
exponentSign
the code units of the decimal representation of
abs
- 1)
Note 1
The following observations may be useful as guidelines
for implementations, but are not part of the normative requirements of
this Standard:
If x is any Number value other than
-0
, then
ToNumber
ToString
(x)) is x.
The least significant digit of s is not always uniquely determined by the requirements listed in step
Note 2
For implementations that provide more accurate
conversions than required by the rules above, it is recommended that the
following alternative version of step
be used as a guideline:
5.
Let
, and
be
integers
such that
≥ 1,
radix
- 1
radix
radix
) is
, and
is as small as possible. If there are multiple possibilities for
, choose the value of
for which
radix
is closest in value to
). If there are two such possible values of
, choose the one that is even. Note that
is the number of digits in the representation of
using radix
radix
and that
is not divisible by
radix
Note 3
Implementers of ECMAScript may find useful the paper and
code written by David M. Gay for binary-to-decimal conversion of
floating-point numbers:
Gay, David M. Correctly Rounded Binary-Decimal and
Decimal-Binary Conversions. Numerical Analysis, Manuscript 90-10.
AT&T Bell Laboratories (Murray Hill, New Jersey). 30 November 1990.
Available as
. Associated code available as
and as
and may also be found at the various
netlib
mirror sites.
6.1.6.2
The BigInt Type
The
BigInt type
represents an
integer
value. The value may be any size and is not limited to a particular
bit-width. Generally, where not otherwise noted, operations are designed
to return exact mathematically-based answers. For binary operations,
BigInts act as two's complement binary strings, with negative numbers
treated as having bits set infinitely to the left.
6.1.6.2.1
BigInt::unaryMinus (
The abstract operation BigInt::unaryMinus takes argument
(a BigInt) and returns a BigInt. It performs the following steps when called:
1.
If
is
, return
2.
Return the BigInt value that represents the negation of
).
6.1.6.2.2
BigInt::bitwiseNOT (
The abstract operation BigInt::bitwiseNOT takes argument
(a BigInt) and returns a BigInt. It returns the one's complement of
. It performs the following steps when called:
1.
Return -
6.1.6.2.3
BigInt::exponentiate (
base
exponent
The abstract operation BigInt::exponentiate takes arguments
base
(a BigInt) and
exponent
(a BigInt) and returns either a
normal completion containing
a BigInt or a
throw completion
. It performs the following steps when called:
1.
If
exponent
, throw a
RangeError
exception.
2.
If
base
is
and
exponent
is
, return
3.
Return the BigInt value that represents
base
) raised to the power
exponent
).
6.1.6.2.4
BigInt::multiply (
The abstract operation BigInt::multiply takes arguments
(a BigInt) and
(a BigInt) and returns a BigInt. It performs the following steps when called:
1.
Return the BigInt value that represents the product of
and
Note
Even if the result has a much larger bit width than the input, the exact mathematical answer is given.
6.1.6.2.5
BigInt::divide (
The abstract operation BigInt::divide takes arguments
(a BigInt) and
(a BigInt) and returns either a
normal completion containing
a BigInt or a
throw completion
. It performs the following steps when called:
1.
If
is
, throw a
RangeError
exception.
2.
Let
quotient
be
) /
).
3.
Return
truncate
quotient
)).
6.1.6.2.6
BigInt::remainder (
The abstract operation BigInt::remainder takes arguments
(a BigInt) and
(a BigInt) and returns either a
normal completion containing
a BigInt or a
throw completion
. It performs the following steps when called:
1.
If
is
, throw a
RangeError
exception.
2.
If
is
, return
3.
Let
quotient
be
) /
).
4.
Let
be
truncate
quotient
)).
5.
Return
- (
).
Note
The sign of the result is the sign of the dividend.
6.1.6.2.7
BigInt::add (
The abstract operation BigInt::add takes arguments
(a BigInt) and
(a BigInt) and returns a BigInt. It performs the following steps when called:
1.
Return the BigInt value that represents the sum of
and
6.1.6.2.8
BigInt::subtract (
The abstract operation BigInt::subtract takes arguments
(a BigInt) and
(a BigInt) and returns a BigInt. It performs the following steps when called:
1.
Return the BigInt value that represents the difference
minus
6.1.6.2.9
BigInt::leftShift (
The abstract operation BigInt::leftShift takes arguments
(a BigInt) and
(a BigInt) and returns a BigInt. It performs the following steps when called:
1.
If
, then
a.
Return the BigInt value that represents
) / 2
, rounding down to the nearest
integer
, including for negative numbers.
2.
Return the BigInt value that represents
) × 2
Note
Semantics
here should be equivalent to a bitwise shift, treating the BigInt as an
infinite length string of binary two's complement digits.
6.1.6.2.10
BigInt::signedRightShift (
The abstract operation BigInt::signedRightShift takes arguments
(a BigInt) and
(a BigInt) and returns a BigInt. It performs the following steps when called:
1.
Return
BigInt::leftShift
, -
).
6.1.6.2.11
BigInt::unsignedRightShift (
The abstract operation BigInt::unsignedRightShift takes arguments
(a BigInt) and
(a BigInt) and returns a
throw completion
. It performs the following steps when called:
1.
Throw a
TypeError
exception.
6.1.6.2.12
BigInt::lessThan (
The abstract operation BigInt::lessThan takes arguments
(a BigInt) and
(a BigInt) and returns a Boolean. It performs the following steps when called:
1.
If
) <
), return
true
; otherwise return
false
6.1.6.2.13
BigInt::equal (
The abstract operation BigInt::equal takes arguments
(a BigInt) and
(a BigInt) and returns a Boolean. It performs the following steps when called:
1.
If
) =
), return
true
; otherwise return
false
6.1.6.2.14
BinaryAnd (
The abstract operation BinaryAnd takes arguments
(0 or 1) and
(0 or 1) and returns 0 or 1. It performs the following steps when called:
1.
If
= 1 and
= 1, return 1.
2.
Else, return 0.
6.1.6.2.15
BinaryOr (
The abstract operation BinaryOr takes arguments
(0 or 1) and
(0 or 1) and returns 0 or 1. It performs the following steps when called:
1.
If
= 1 or
= 1, return 1.
2.
Else, return 0.
6.1.6.2.16
BinaryXor (
The abstract operation BinaryXor takes arguments
(0 or 1) and
(0 or 1) and returns 0 or 1. It performs the following steps when called:
1.
If
= 1 and
= 0, return 1.
2.
Else if
= 0 and
= 1, return 1.
3.
Else, return 0.
6.1.6.2.17
BigIntBitwiseOp (
op
The abstract operation BigIntBitwiseOp takes arguments
op
, or
),
(a BigInt), and
(a BigInt) and returns a BigInt. It performs the following steps when called:
1.
Set
to
).
2.
Set
to
).
3.
Let
result
be 0.
4.
Let
shift
be 0.
5.
Repeat, until (
= 0 or
= -1) and (
= 0 or
= -1),
a.
Let
xDigit
be
modulo
2.
b.
Let
yDigit
be
modulo
2.
c.
If
op
is
, set
result
to
result
+ 2
shift
BinaryAnd
xDigit
yDigit
).
d.
Else if
op
is
, set
result
to
result
+ 2
shift
BinaryOr
xDigit
yDigit
).
e.
Else,
i.
Assert
op
is
ii.
Set
result
to
result
+ 2
shift
BinaryXor
xDigit
yDigit
).
f.
Set
shift
to
shift
+ 1.
g.
Set
to (
xDigit
) / 2.
h.
Set
to (
yDigit
) / 2.
6.
If
op
is
, let
tmp
be
BinaryAnd
modulo
2,
modulo
2).
7.
Else if
op
is
, let
tmp
be
BinaryOr
modulo
2,
modulo
2).
8.
Else,
a.
Assert
op
is
b.
Let
tmp
be
BinaryXor
modulo
2,
modulo
2).
9.
If
tmp
≠ 0, then
a.
Set
result
to
result
- 2
shift
b.
NOTE: This extends the sign.
10.
Return the
BigInt value for
result
6.1.6.2.18
BigInt::bitwiseAND (
The abstract operation BigInt::bitwiseAND takes arguments
(a BigInt) and
(a BigInt) and returns a BigInt. It performs the following steps when called:
1.
Return
BigIntBitwiseOp
).
6.1.6.2.19
BigInt::bitwiseXOR (
The abstract operation BigInt::bitwiseXOR takes arguments
(a BigInt) and
(a BigInt) and returns a BigInt. It performs the following steps when called:
1.
Return
BigIntBitwiseOp
).
6.1.6.2.20
BigInt::bitwiseOR (
The abstract operation BigInt::bitwiseOR takes arguments
(a BigInt) and
(a BigInt) and returns a BigInt. It performs the following steps when called:
1.
Return
BigIntBitwiseOp
).
6.1.6.2.21
BigInt::toString (
radix
The abstract operation BigInt::toString takes arguments
(a BigInt) and
radix
(an
integer
in the
inclusive interval
from 2 to 36) and returns a String. It represents
as a String using a positional numeral system with radix
radix
. The digits used in the representation of a BigInt using radix
are taken from the first
code units of
"0123456789abcdefghijklmnopqrstuvwxyz"
in order. The representation of BigInts other than
never includes leading zeroes. It performs the following steps when called:
1.
If
, return the
string-concatenation
of
"-"
and
BigInt::toString
(-
radix
).
2.
Return the String value consisting of the representation of
using radix
radix
6.1.7
The
Object Type
An Object is logically a collection of properties. Each property is either a data property, or an accessor property:
data property
associates a key value with an
ECMAScript language value
and a set of Boolean attributes.
An
accessor property
associates a key value with one or two accessor functions, and a set of
Boolean attributes. The accessor functions are used to store or
retrieve an
ECMAScript language value
that is associated with the property.
Properties are identified using key values. A
property key
value is either an ECMAScript String value or a Symbol value. All
String and Symbol values, including the empty String, are valid as
property keys. A
property name
is a property key that
is a String
value.
An
integer index
is a String
-valued property key that is a
canonical numeric string
and whose numeric value is either
+0
or a positive
integral Number
(2
53
- 1). An
array index
is an
integer index
whose numeric value
is in the range
+0
(2
32
- 1)
Property keys are used to access properties and their values. There are two kinds of access for properties:
get
and
set
, corresponding to value retrieval and assignment, respectively. The properties accessible via get and set access includes both
own properties
that are a direct part of an object and
inherited properties
which are provided by another associated object via a property
inheritance relationship. Inherited properties may be either own or
inherited properties of the associated object. Each own property of an
object must each have a key value that is distinct from the key values
of the other own properties of that object.
All objects are logically collections of properties, but there
are multiple forms of objects that differ in their semantics for
accessing and manipulating their properties. Please see
6.1.7.2
for definitions of the multiple forms of objects.
6.1.7.1
Property Attributes
Attributes are used in this specification to define and explain the state of Object properties as described in
Table 3
. Unless specified explicitly, the initial value of each attribute is its Default Value.
Table 3: Attributes of an Object property
Attribute Name
Types of property for which it is present
Value Domain
Default Value
Description
[[Value]]
data property
an
ECMAScript language value
undefined
The value retrieved by a get access of the property.
[[Writable]]
data property
a Boolean
false
If
false
, attempts by ECMAScript code to change the property's [[Value]] attribute using [[Set]] will not succeed.
[[Get]]
accessor property
an Object or
undefined
undefined
If the value
is an Object
it must be a
function object
. The function's [[Call]] internal method (
Table 5
) is called with an empty arguments list to retrieve the property value each time a get access of the property is performed.
[[Set]]
accessor property
an Object or
undefined
undefined
If the value
is an Object
it must be a
function object
. The function's [[Call]] internal method (
Table 5
is called with an arguments list containing the assigned value as its
sole argument each time a set access of the property is performed. The
effect of a property's [[Set]] internal method may, but is not required
to, have an effect on the value returned by subsequent calls to the
property's [[Get]] internal method.
[[Enumerable]]
data property
or
accessor property
a Boolean
false
If
true
, the property will be enumerated by a for-in enumeration (see
14.7.5
). Otherwise, the property is said to be non-enumerable.
[[Configurable]]
data property
or
accessor property
a Boolean
false
If
false
, attempts to delete the property, change it from a
data property
to an
accessor property
or from an
accessor property
to a
data property
, or make any changes to its attributes (other than replacing an existing [[Value]] or setting [[Writable]] to
false
) will fail.
6.1.7.2
Object Internal Methods and Internal Slots
The actual semantics of objects, in ECMAScript, are specified via algorithms called
internal methods
Each object in an ECMAScript engine is associated with a set of
internal methods that defines its runtime behaviour. These internal
methods are not part of the ECMAScript language. They are defined by
this specification purely for expository purposes. However, each object
within an implementation of ECMAScript must behave as specified by the
internal methods associated with it. The exact manner in which this is
accomplished is determined by the implementation.
Internal method names are polymorphic. This means that
different object values may perform different algorithms when a common
internal method name is invoked upon them. That actual object upon which
an internal method is invoked is the “target” of the invocation. If, at
runtime, the implementation of an algorithm attempts to use an internal
method of an object that the object does not support, a
TypeError
exception is thrown.
Internal slots correspond to internal state that is
associated with objects and used by various ECMAScript specification
algorithms. Internal slots are not object properties and they are not
inherited. Depending upon the specific internal slot specification, such
state may consist of values of any
ECMAScript language type
or of specific ECMAScript specification type values. Unless explicitly
specified otherwise, internal slots are allocated as part of the process
of creating an object and may not be dynamically added to an object.
Unless specified otherwise, the initial value of an internal slot is the
value
undefined
. Various algorithms within this
specification create objects that have internal slots. However, the
ECMAScript language provides no direct way to associate internal slots
with an object.
All objects have an internal slot named [[PrivateElements]], which is a
List
of
PrivateElements
. This
List
represents the values of the private fields, methods, and accessors for the object. Initially, it is an empty
List
Internal methods and internal slots are identified within
this specification using names enclosed in double square brackets [[ ]].
Table 4
summarizes the
essential internal methods
used by this specification that are applicable to all objects created
or manipulated by ECMAScript code. Every object must have algorithms for
all of the essential internal methods. However, all objects do not
necessarily use the same algorithms for those methods.
An
ordinary object
is an object that satisfies all of the following criteria:
For the internal methods listed in
Table 4
, the object uses those defined in
10.1
If the object has a [[Call]] internal method, it uses either the one defined in
10.2.1
or the one defined in
10.3.1
If the object has a [[Construct]] internal method, it uses either the one defined in
10.2.2
or the one defined in
10.3.2
An
exotic object
is an object that is not an
ordinary object
This specification recognizes different kinds of
exotic objects
by those objects' internal methods. An object that is behaviourally equivalent to a particular kind of
exotic object
(such as an
Array exotic object
or a
bound function exotic object
), but does not have the same collection of internal methods specified for that kind, is not recognized as that kind of
exotic object
The “Signature” column of
Table 4
and other similar tables describes the invocation pattern for each
internal method. The invocation pattern always includes a parenthesized
list of descriptive parameter names. If a parameter name is the same as
an ECMAScript type name then the name describes the required type of the
parameter value. If an internal method explicitly returns a value, its
parameter list is followed by the symbol “→” and the type name of the
returned value. The type names used in signatures refer to the types
defined in clause
augmented by the following additional names. “
any
” means the value may be any
ECMAScript language type
In addition to its parameters, an internal method always has access to the object that is the target of the method invocation.
An internal method implicitly returns a
Completion Record
, either a
normal completion
that wraps a value of the return type shown in its invocation pattern, or a
throw completion
Table 4: Essential Internal Methods
Internal Method
Signature
Description
[[GetPrototypeOf]]
( )
Object | Null
Determine the object that provides inherited properties for this object. A
null
value indicates that there are no inherited properties.
[[SetPrototypeOf]]
(Object | Null)
Boolean
Associate this object with another object that provides inherited properties. Passing
null
indicates that there are no inherited properties. Returns
true
indicating that the operation was completed successfully or
false
indicating that the operation was not successful.
[[IsExtensible]]
( )
Boolean
Determine whether it is permitted to add additional properties to this object.
[[PreventExtensions]]
( )
Boolean
Control whether new properties may be added to this object. Returns
true
if the operation was successful or
false
if the operation was unsuccessful.
[[GetOwnProperty]]
propertyKey
Undefined |
Property Descriptor
Return a
Property Descriptor
for the own property of this object whose key is
propertyKey
, or
undefined
if no such property exists.
[[DefineOwnProperty]]
propertyKey
PropertyDescriptor
Boolean
Create or alter the own property, whose key is
propertyKey
, to have the state described by
PropertyDescriptor
. Return
true
if that property was successfully created/updated or
false
if the property could not be created or updated.
[[HasProperty]]
propertyKey
Boolean
Return a Boolean value indicating whether this object
already has either an own or inherited property whose key is
propertyKey
[[Get]]
propertyKey
Receiver
any
Return the value of the property whose key is
propertyKey
from this object. If any ECMAScript code must be executed to retrieve the property value,
Receiver
is used as the
this
value when evaluating the code.
[[Set]]
propertyKey
value
Receiver
Boolean
Set the value of the property whose key is
propertyKey
to
value
. If any ECMAScript code must be executed to set the property value,
Receiver
is used as the
this
value when evaluating the code. Returns
true
if the property value was set or
false
if it could not be set.
[[Delete]]
propertyKey
Boolean
Remove the own property whose key is
propertyKey
from this object. Return
false
if the property was not deleted and is still present. Return
true
if the property was deleted or is not present.
[[OwnPropertyKeys]]
( )
List
of
property keys
Return a
List
whose elements are all of the own
property keys
for the object.
Table 5
summarizes additional essential internal methods that are supported by objects that may be called as functions. A
function object
is an object that supports the [[Call]] internal method. A
constructor
is an object that supports the [[Construct]] internal method. Every
object that supports [[Construct]] must support [[Call]]; that is, every
constructor
must be a
function object
. Therefore, a
constructor
may also be referred to as a
constructor
function
or
constructor
function object
Table 5: Additional Essential Internal Methods of Function Objects
Internal Method
Signature
Description
[[Call]]
any
, a
List
of
any
any
Executes code associated with this object. Invoked via a
function call expression. The arguments to the internal method are a
this
value and a
List
whose elements are the arguments passed to the function by a call expression. Objects that implement this internal method are
callable
[[Construct]]
(a
List
of
any
, Object)
Object
Creates an object. Invoked via the
new
operator or a
super
call. The first argument to the internal method is a
List
whose elements are the arguments of the
constructor
invocation or the
super
call. The second argument is the object to which the
new
operator was initially applied. Objects that implement this internal method are called
constructors
. A
function object
is not necessarily a
constructor
and such non-
constructor
function objects
do not have a [[Construct]] internal method.
The semantics of the essential internal methods for
ordinary objects
and standard
exotic objects
are specified in clause
10
. If any specified use of an internal method of an
exotic object
is not supported by an implementation, that usage must throw a
TypeError
exception when attempted.
6.1.7.3
Invariants of the Essential Internal Methods
The Internal Methods of Objects of an ECMAScript engine must
conform to the list of invariants specified below. Ordinary ECMAScript
Objects as well as all standard
exotic objects
in this specification maintain these invariants. ECMAScript Proxy
objects maintain these invariants by means of runtime checks on the
result of traps invoked on the [[ProxyHandler]] object.
Any implementation provided
exotic objects
must also maintain these invariants for those objects. Violation of
these invariants may cause ECMAScript code to have unpredictable
behaviour and create security issues. However, violation of these
invariants must never compromise the memory safety of an implementation.
An implementation must not allow these invariants to be
circumvented in any manner such as by providing alternative interfaces
that implement the functionality of the essential internal methods
without enforcing their invariants.
Definitions:
The
target
of an internal method is the object upon which the internal method is called.
A target is
non-extensible
if it has been observed to return
false
from its [[IsExtensible]] internal method, or
true
from its [[PreventExtensions]] internal method.
non-existent
property is a property that does not exist as an own property on a non-extensible target.
All references to
SameValue
are according to the definition of the
SameValue
algorithm.
Return value:
The value returned by any internal method must be a
Completion Record
with either:
[[Type]] =
normal
, [[Target]] =
empty
, and [[Value]] = a value of the "normal return type" shown below for that internal method, or
[[Type]] =
throw
, [[Target]] =
empty
, and [[Value]] = any
ECMAScript language value
Note 1
An internal method must not return a
continue completion
, a
break completion
, or a
return completion
[[GetPrototypeOf]] ( )
The normal return type is either Object or Null.
If target is non-extensible, and [[GetPrototypeOf]] returns a value
, then any future calls to [[GetPrototypeOf]] should return the
SameValue
as
Note 2
An object's prototype chain should have
finite
length (that is, starting from any object, recursively applying the
[[GetPrototypeOf]] internal method to its result should eventually lead
to the value
null
). However, this requirement is not enforceable as an object level invariant if the prototype chain includes any
exotic objects
that do not use the
ordinary object
definition of [[GetPrototypeOf]]. Such a circular prototype chain may
result in infinite loops when accessing object properties.
[[SetPrototypeOf]] (
The normal return type is Boolean.
If target is non-extensible, [[SetPrototypeOf]] must return
false
, unless
is the
SameValue
as the target's observed [[GetPrototypeOf]] value.
[[IsExtensible]] ( )
The normal return type is Boolean.
If [[IsExtensible]] returns
false
, all future calls to [[IsExtensible]] on the target must return
false
[[PreventExtensions]] ( )
The normal return type is Boolean.
If [[PreventExtensions]] returns
true
, all future calls to [[IsExtensible]] on the target must return
false
and the target is now considered non-extensible.
[[GetOwnProperty]] (
The normal return type is either
Property Descriptor
or Undefined.
If the Type of the return value is
Property Descriptor
, the return value must be a
fully populated Property Descriptor
If
is described as a non-configurable, non-writable own
data property
, all future calls to [[GetOwnProperty]] (
) must return
Property Descriptor
whose [[Value]] is
SameValue
as
's [[Value]] attribute.
If
's attributes other than [[Writable]] may change over time or if the property might be deleted, then
's [[Configurable]] attribute must be
true
If the [[Writable]] attribute may change from
false
to
true
, then the [[Configurable]] attribute must be
true
If the target is non-extensible and
is non-existent, then all future calls to [[GetOwnProperty]] (
) on the target must describe
as non-existent (i.e. [[GetOwnProperty]] (
) must return
undefined
).
Note 3
As a consequence of the third invariant, if a property is described as a
data property
and it may return different values over time, then either or both of the [[Writable]] and [[Configurable]] attributes must be
true
even if no mechanism to change the value is exposed via the other essential internal methods.
[[DefineOwnProperty]] (
Desc
The normal return type is Boolean.
[[DefineOwnProperty]] must return
false
if
has previously been observed as a non-configurable own property of the target, unless either:
is a writable
data property
. A non-configurable writable
data property
can be changed into a non-configurable non-writable
data property
All attributes of
Desc
are the
SameValue
as
's attributes.
[[DefineOwnProperty]] (
Desc
) must return
false
if target is non-extensible and
is a non-existent own property. That is, a non-extensible target object cannot be extended with new properties.
[[HasProperty]] (
The normal return type is Boolean.
If
was previously observed as a non-configurable own data or
accessor property
of the target, [[HasProperty]] must return
true
[[Get]] (
Receiver
The normal return type is any
ECMAScript language type
If
was previously observed as a non-configurable, non-writable own
data property
of the target with value
, then [[Get]] must return the
SameValue
as
If
was previously observed as a non-configurable own
accessor property
of the target whose [[Get]] attribute is
undefined
, the [[Get]] operation must return
undefined
[[Set]] (
Receiver
The normal return type is Boolean.
If
was previously observed as a non-configurable, non-writable own
data property
of the target, then [[Set]] must return
false
unless
is the
SameValue
as
's [[Value]] attribute.
If
was previously observed as a non-configurable own
accessor property
of the target whose [[Set]] attribute is
undefined
, the [[Set]] operation must return
false
[[Delete]] (
The normal return type is Boolean.
If
was previously observed as a non-configurable own data or
accessor property
of the target, [[Delete]] must return
false
[[OwnPropertyKeys]] ( )
The normal return type is
List
The returned
List
must not contain any duplicate entries.
The Type of each element of the returned
List
is either String or Symbol.
The returned
List
must contain at least the keys of all non-configurable own properties that have previously been observed.
If the target is non-extensible, the returned
List
must contain only the keys of all own properties of the target that are observable using [[GetOwnProperty]].
[[Call]] ( )
The normal return type is any
ECMAScript language type
[[Construct]] ( )
The normal return type is Object.
The target must also have a [[Call]] internal method.
6.1.7.4
Well-Known Intrinsic Objects
Well-known intrinsics are built-in objects that are
explicitly referenced by the algorithms of this specification and which
usually have
realm
-specific
identities. Unless otherwise specified each intrinsic object actually
corresponds to a set of similar objects, one per
realm
Within this specification a reference such as %name% means the intrinsic object, associated with the current
realm
, corresponding to the name. A reference such as %name.a.b% means, as if the
"b"
property of the value of the
"a"
property of the intrinsic object %name% was accessed prior to any
ECMAScript code being evaluated. Determination of the current
realm
and its intrinsics is described in
9.4
. The well-known intrinsics are listed in
Table 6
Table 6: Well-Known Intrinsic Objects
Intrinsic Name
Global Name
ECMAScript Language Association
%AggregateError%
AggregateError
The
AggregateError
constructor
20.5.7.1
%Array%
Array
The Array
constructor
23.1.1
%ArrayBuffer%
ArrayBuffer
The ArrayBuffer
constructor
25.1.3
%ArrayIteratorPrototype%
The prototype of Array iterator objects (
23.1.5
%AsyncFromSyncIteratorPrototype%
The prototype of async-from-sync iterator objects (
27.1.4
%AsyncFunction%
The
constructor
of async
function objects
27.7.1
%AsyncGeneratorFunction%
The
constructor
of async iterator objects (
27.4.1
%AsyncIteratorPrototype%
An object that all standard built-in async iterator objects indirectly inherit from
%Atomics%
Atomics
The
Atomics
object (
25.4
%BigInt%
BigInt
The BigInt
constructor
21.2.1
%BigInt64Array%
BigInt64Array
The BigInt64Array
constructor
23.2
%BigUint64Array%
BigUint64Array
The BigUint64Array
constructor
23.2
%Boolean%
Boolean
The Boolean
constructor
20.3.1
%DataView%
DataView
The DataView
constructor
25.3.2
%Date%
Date
The Date
constructor
21.4.2
%decodeURI%
decodeURI
The
decodeURI
function (
19.2.6.1
%decodeURIComponent%
decodeURIComponent
The
decodeURIComponent
function (
19.2.6.2
%encodeURI%
encodeURI
The
encodeURI
function (
19.2.6.3
%encodeURIComponent%
encodeURIComponent
The
encodeURIComponent
function (
19.2.6.4
%Error%
Error
The Error
constructor
20.5.1
%eval%
eval
The
eval
function (
19.2.1
%EvalError%
EvalError
The EvalError
constructor
20.5.5.1
%FinalizationRegistry%
FinalizationRegistry
The
FinalizationRegistry
constructor
26.2.1
%Float32Array%
Float32Array
The Float32Array
constructor
23.2
%Float64Array%
Float64Array
The Float64Array
constructor
23.2
%ForInIteratorPrototype%
The prototype of For-In iterator objects (
14.7.5.10
%Function%
Function
The Function
constructor
20.2.1
%GeneratorFunction%
The
constructor
of Generators (
27.3.1
%Int8Array%
Int8Array
The Int8Array
constructor
23.2
%Int16Array%
Int16Array
The Int16Array
constructor
23.2
%Int32Array%
Int32Array
The Int32Array
constructor
23.2
%isFinite%
isFinite
The
isFinite
function (
19.2.2
%isNaN%
isNaN
The
isNaN
function (
19.2.3
%IteratorPrototype%
An object that all standard built-in iterator objects indirectly inherit from
%JSON%
JSON
The
JSON
object (
25.5
%Map%
Map
The Map
constructor
24.1.1
%MapIteratorPrototype%
The prototype of Map iterator objects (
24.1.5
%Math%
Math
The
Math
object (
21.3
%Number%
Number
The Number
constructor
21.1.1
%Object%
Object
The Object
constructor
20.1.1
%parseFloat%
parseFloat
The
parseFloat
function (
19.2.4
%parseInt%
parseInt
The
parseInt
function (
19.2.5
%Promise%
Promise
The Promise
constructor
27.2.3
%Proxy%
Proxy
The Proxy
constructor
28.2.1
%RangeError%
RangeError
The RangeError
constructor
20.5.5.2
%ReferenceError%
ReferenceError
The ReferenceError
constructor
20.5.5.3
%Reflect%
Reflect
The
Reflect
object (
28.1
%RegExp%
RegExp
The RegExp
constructor
22.2.4
%RegExpStringIteratorPrototype%
The prototype of RegExp String Iterator objects (
22.2.9
%Set%
Set
The Set
constructor
24.2.1
%SetIteratorPrototype%
The prototype of Set iterator objects (
24.2.5
%SharedArrayBuffer%
SharedArrayBuffer
The SharedArrayBuffer
constructor
25.2.2
%String%
String
The String
constructor
22.1.1
%StringIteratorPrototype%
The prototype of String iterator objects (
22.1.5
%Symbol%
Symbol
The Symbol
constructor
20.4.1
%SyntaxError%
SyntaxError
The SyntaxError
constructor
20.5.5.4
%ThrowTypeError%
function object
that unconditionally throws a new instance of
%TypeError%
%TypedArray%
The super class of all typed Array
constructors
23.2.1
%TypeError%
TypeError
The TypeError
constructor
20.5.5.5
%Uint8Array%
Uint8Array
The Uint8Array
constructor
23.2
%Uint8ClampedArray%
Uint8ClampedArray
The Uint8ClampedArray
constructor
23.2
%Uint16Array%
Uint16Array
The Uint16Array
constructor
23.2
%Uint32Array%
Uint32Array
The Uint32Array
constructor
23.2
%URIError%
URIError
The URIError
constructor
20.5.5.6
%WeakMap%
WeakMap
The WeakMap
constructor
24.3.1
%WeakRef%
WeakRef
The
WeakRef
constructor
26.1.1
%WeakSet%
WeakSet
The WeakSet
constructor
24.4.1
Note
Additional entries in
Table 91
6.2
ECMAScript Specification Types
A specification type corresponds to meta-values that are used
within algorithms to describe the semantics of ECMAScript language
constructs and
ECMAScript language types
. The specification types include Reference,
List
Completion Record
Property Descriptor
Environment Record
Abstract Closure
, and
Data Block
Specification type values are specification artefacts that do not
necessarily correspond to any specific entity within an ECMAScript
implementation. Specification type values may be used to describe
intermediate results of ECMAScript expression evaluation but such values
cannot be stored as properties of objects or values of ECMAScript
language variables.
6.2.1
The Enum Specification Type
Enums
are values which are internal to the specification and not directly observable from ECMAScript code. Enums are denoted using a
sans-serif
typeface. For instance, a
Completion Record
's [[Type]] field takes on values like
normal
return
, or
throw
Enums have no characteristics other than their name. The name of an
enum serves no purpose other than to distinguish it from other enums,
and implies nothing about its usage or meaning in context.
6.2.2
The List and Record Specification Types
The
List
type is used to explain the evaluation of argument lists (see
13.3.8
) in
new
expressions, in function calls, and in other algorithms where a simple
ordered list of values is needed. Values of the List type are simply
ordered sequences of list elements containing the individual values.
These sequences may be of any length. The elements of a list may be
randomly accessed using 0-origin indices. For notational convenience an
array-like syntax can be used to access List elements. For example,
arguments
[2] is shorthand for saying the 3
rd
element of the List
arguments
When an algorithm iterates over the elements of a List without
specifying an order, the order used is the order of the elements in the
List.
For notational convenience within this specification, a literal
syntax can be used to express a new List value. For example, « 1, 2 »
defines a List value that has two elements each of which is initialized
to a specific value. A new empty List can be expressed as « ».
In this specification, the phrase "the
list-concatenation
of
..." (where each argument is a possibly empty List) denotes a new List
value whose elements are the concatenation of the elements (in order) of
each of the arguments (in order).
The
Record
type is used to
describe data aggregations within the algorithms of this specification. A
Record type value consists of one or more named fields. The value of
each field is an
ECMAScript language value
or specification value. Field names are always enclosed in double brackets, for example [[Value]].
For notational convenience within this specification, an object
literal-like syntax can be used to express a Record value. For example,
{ [[Field1]]: 42, [[Field2]]:
false
, [[Field3]]:
empty
} defines a Record value that has three fields, each of which is
initialized to a specific value. Field name order is not significant.
Any fields that are not explicitly listed are considered to be absent.
In specification text and algorithms, dot notation may be used
to refer to a specific field of a Record value. For example, if R is the
record shown in the previous paragraph then R.[[Field2]] is shorthand
for “the field of R named [[Field2]]”.
Schema for commonly used Record field combinations may be
named, and that name may be used as a prefix to a literal Record value
to identify the specific kind of aggregations that is being described.
For example: PropertyDescriptor { [[Value]]: 42, [[Writable]]:
false
, [[Configurable]]:
true
}.
6.2.3
The Set and Relation Specification Types
The
Set
type is used to explain a collection of unordered elements for use in the
memory model
It is distinct from the ECMAScript collection type of the same name. To
disambiguate, instances of the ECMAScript collection are consistently
referred to as "Set objects" within this specification. Values of the
Set type are simple collections of elements, where no element appears
more than once. Elements may be added to and removed from Sets. Sets may
be unioned, intersected, or subtracted from each other.
The
Relation
type is used to
explain constraints on Sets. Values of the Relation type are Sets of
ordered pairs of values from its value domain. For example, a Relation
on events is a set of ordered pairs of events. For a Relation
and two values
and
in the value domain of
is shorthand for saying the ordered pair (
) is a member of
. A Relation is least with respect to some conditions when it is the smallest Relation that satisfies those conditions.
strict partial order
is a Relation value
that satisfies the following.
For all
, and
in
's domain:
It is not the case that
, and
If
and
, then
Note 1
The two properties above are called irreflexivity and transitivity, respectively.
strict total order
is a Relation value
that satisfies the following.
For all
, and
in
's domain:
is
or
or
, and
It is not the case that
, and
If
and
, then
Note 2
The three properties above are called totality, irreflexivity, and transitivity, respectively.
6.2.4
The Completion Record Specification Type
The
Completion Record
specification type is used to explain the runtime propagation of values and control flow such as the behaviour of statements (
break
continue
return
and
throw
) that perform nonlocal transfers of control.
Completion Records have the fields defined in
Table 7
Table 7:
Completion Record
Fields
Field Name
Value
Meaning
[[Type]]
normal
break
continue
return
, or
throw
The type of completion that occurred.
[[Value]]
any value except a
Completion Record
The value that was produced.
[[Target]]
a String or
empty
The target label for directed control transfers.
The following shorthand terms are sometimes used to refer to Completion Records.
normal completion
refers to any Completion Record with a [[Type]] value of
normal
break completion
refers to any Completion Record with a [[Type]] value of
break
continue completion
refers to any Completion Record with a [[Type]] value of
continue
return completion
refers to any Completion Record with a [[Type]] value of
return
throw completion
refers to any Completion Record with a [[Type]] value of
throw
abrupt completion
refers to any Completion Record with a [[Type]] value other than
normal
normal completion containing
some type of value refers to a normal completion that has a value of that type in its [[Value]] field.
Callable objects that are defined in this specification only
return a normal completion or a throw completion. Returning any other
kind of Completion Record is considered an editorial error.
Implementation-defined
callable objects must return either a normal completion or a throw completion.
6.2.4.1
NormalCompletion (
value
The abstract operation NormalCompletion takes argument
value
(any value except a
Completion Record
) and returns a
normal completion
. It performs the following steps when called:
1.
Return
Completion Record
{ [[Type]]:
normal
, [[Value]]:
value
, [[Target]]:
empty
}.
6.2.4.2
ThrowCompletion (
value
The abstract operation ThrowCompletion takes argument
value
(an
ECMAScript language value
) and returns a
throw completion
. It performs the following steps when called:
1.
Return
Completion Record
{ [[Type]]:
throw
, [[Value]]:
value
, [[Target]]:
empty
}.
6.2.4.3
UpdateEmpty (
completionRecord
value
The abstract operation UpdateEmpty takes arguments
completionRecord
(a
Completion Record
) and
value
(any value except a
Completion Record
) and returns a
Completion Record
. It performs the following steps when called:
1.
Assert
: If
completionRecord
.[[Type]] is either
return
or
throw
, then
completionRecord
.[[Value]] is not
empty
2.
If
completionRecord
.[[Value]] is not
empty
, return ?
completionRecord
3.
Return
Completion Record
{ [[Type]]:
completionRecord
.[[Type]], [[Value]]:
value
, [[Target]]:
completionRecord
.[[Target]] }.
6.2.5
The Reference Record Specification Type
The
Reference Record
type is used to explain the behaviour of such operators as
delete
typeof
, the assignment operators, the
super
keyword
and other language features. For example, the left-hand operand of an assignment is expected to produce a Reference Record.
A Reference Record is a resolved name or property binding; its fields are defined by
Table 8
Table 8:
Reference Record
Fields
Field Name
Value
Meaning
[[Base]]
an
ECMAScript language value
, an
Environment Record
, or
unresolvable
The value or
Environment Record
which holds the binding. A [[Base]] of
unresolvable
indicates that the binding could not be resolved.
[[ReferencedName]]
a String, a Symbol, or a
Private Name
The name of the binding. Always a String if [[Base]] value is an
Environment Record
[[Strict]]
a Boolean
true
if the
Reference Record
originated in
strict mode code
false
otherwise.
[[ThisValue]]
an
ECMAScript language value
or
empty
If not
empty
, the
Reference Record
represents a property binding that was expressed using the
super
keyword
; it is called a
Super Reference Record
and its [[Base]] value will never be an
Environment Record
. In that case, the [[ThisValue]] field holds the
this
value at the time the
Reference Record
was created.
The following
abstract operations
are used in this specification to operate upon Reference Records:
6.2.5.1
IsPropertyReference (
The abstract operation IsPropertyReference takes argument
(a
Reference Record
) and returns a Boolean. It performs the following steps when called:
1.
If
.[[Base]] is
unresolvable
, return
false
2.
If
.[[Base]] is an
Environment Record
, return
false
; otherwise return
true
6.2.5.2
IsUnresolvableReference (
The abstract operation IsUnresolvableReference takes argument
(a
Reference Record
) and returns a Boolean. It performs the following steps when called:
1.
If
.[[Base]] is
unresolvable
, return
true
; otherwise return
false
6.2.5.3
IsSuperReference (
The abstract operation IsSuperReference takes argument
(a
Reference Record
) and returns a Boolean. It performs the following steps when called:
1.
If
.[[ThisValue]] is not
empty
, return
true
; otherwise return
false
6.2.5.4
IsPrivateReference (
The abstract operation IsPrivateReference takes argument
(a
Reference Record
) and returns a Boolean. It performs the following steps when called:
1.
If
.[[ReferencedName]] is a
Private Name
, return
true
; otherwise return
false
6.2.5.5
GetValue (
The abstract operation GetValue takes argument
(a
Reference Record
or an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
If
is not a
Reference Record
, return
2.
If
IsUnresolvableReference
) is
true
, throw a
ReferenceError
exception.
3.
If
IsPropertyReference
) is
true
, then
a.
Let
baseObj
be ?
ToObject
.[[Base]]).
b.
If
IsPrivateReference
) is
true
, then
i.
Return ?
PrivateGet
baseObj
.[[ReferencedName]]).
c.
Return ?
baseObj
.[[Get]]
.[[ReferencedName]],
GetThisValue
)).
4.
Else,
a.
Let
base
be
.[[Base]].
b.
Assert
base
is an
Environment Record
c.
Return ?
base
.GetBindingValue
.[[ReferencedName]],
.[[Strict]]) (see
9.1
).
Note
The object that may be created in step
3.a
is not accessible outside of the above abstract operation and the
ordinary object
[[Get]] internal method. An implementation might choose to avoid the actual creation of the object.
6.2.5.6
PutValue (
The abstract operation PutValue takes arguments
(a
Reference Record
or an
ECMAScript language value
) and
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or an
abrupt completion
. It performs the following steps when called:
1.
If
is not a
Reference Record
, throw a
ReferenceError
exception.
2.
If
IsUnresolvableReference
) is
true
, then
a.
If
.[[Strict]] is
true
, throw a
ReferenceError
exception.
b.
Let
globalObj
be
GetGlobalObject
().
c.
Perform ?
Set
globalObj
.[[ReferencedName]],
false
).
d.
Return
unused
3.
If
IsPropertyReference
) is
true
, then
a.
Let
baseObj
be ?
ToObject
.[[Base]]).
b.
If
IsPrivateReference
) is
true
, then
i.
Return ?
PrivateSet
baseObj
.[[ReferencedName]],
).
c.
Let
succeeded
be ?
baseObj
.[[Set]]
.[[ReferencedName]],
GetThisValue
)).
d.
If
succeeded
is
false
and
.[[Strict]] is
true
, throw a
TypeError
exception.
e.
Return
unused
4.
Else,
a.
Let
base
be
.[[Base]].
b.
Assert
base
is an
Environment Record
c.
Return ?
base
.SetMutableBinding
.[[ReferencedName]],
.[[Strict]]) (see
9.1
).
Note
The object that may be created in step
3.a
is not accessible outside of the above abstract operation and the
ordinary object
[[Set]] internal method. An implementation might choose to avoid the actual creation of that object.
6.2.5.7
GetThisValue (
The abstract operation GetThisValue takes argument
(a
Reference Record
) and returns an
ECMAScript language value
. It performs the following steps when called:
1.
Assert
IsPropertyReference
) is
true
2.
If
IsSuperReference
) is
true
, return
.[[ThisValue]]; otherwise return
.[[Base]].
6.2.5.8
InitializeReferencedBinding (
The abstract operation InitializeReferencedBinding takes arguments
(a
Reference Record
) and
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or an
abrupt completion
. It performs the following steps when called:
1.
Assert
IsUnresolvableReference
) is
false
2.
Let
base
be
.[[Base]].
3.
Assert
base
is an
Environment Record
4.
Return ?
base
.InitializeBinding(
.[[ReferencedName]],
).
6.2.5.9
MakePrivateReference (
baseValue
privateIdentifier
The abstract operation MakePrivateReference takes arguments
baseValue
(an
ECMAScript language value
) and
privateIdentifier
(a String) and returns a
Reference Record
. It performs the following steps when called:
1.
Let
privEnv
be the
running execution context
's PrivateEnvironment.
2.
Assert
privEnv
is not
null
3.
Let
privateName
be
ResolvePrivateIdentifier
privEnv
privateIdentifier
).
4.
Return the
Reference Record
{ [[Base]]:
baseValue
, [[ReferencedName]]:
privateName
, [[Strict]]:
true
, [[ThisValue]]:
empty
}.
6.2.6
The Property Descriptor Specification Type
The
Property Descriptor
type is used to explain the manipulation and reification of Object property attributes. A Property Descriptor is a
Record
with zero or more fields, where each field's name is an attribute name
and its value is a corresponding attribute value as specified in
6.1.7.1
The schema name used within this specification to tag literal
descriptions of Property Descriptor records is “PropertyDescriptor”.
Property Descriptor values may be further classified as data
Property Descriptors and accessor Property Descriptors based upon the
existence or use of certain fields. A data Property Descriptor is one
that includes any fields named either [[Value]] or [[Writable]]. An
accessor Property Descriptor is one that includes any fields named
either [[Get]] or [[Set]]. Any Property Descriptor may have fields named
[[Enumerable]] and [[Configurable]]. A Property Descriptor value may
not be both a data Property Descriptor and an accessor Property
Descriptor; however, it may be neither (in which case it is a generic
Property Descriptor). A
fully populated Property Descriptor
is one that is either an accessor Property Descriptor or a data Property
Descriptor and that has all of the corresponding fields defined in
Table 3
The following
abstract operations
are used in this specification to operate upon Property Descriptor values:
6.2.6.1
IsAccessorDescriptor (
Desc
The abstract operation IsAccessorDescriptor takes argument
Desc
(a
Property Descriptor
or
undefined
) and returns a Boolean. It performs the following steps when called:
1.
If
Desc
is
undefined
, return
false
2.
If
Desc
has a [[Get]] field, return
true
3.
If
Desc
has a [[Set]] field, return
true
4.
Return
false
6.2.6.2
IsDataDescriptor (
Desc
The abstract operation IsDataDescriptor takes argument
Desc
(a
Property Descriptor
or
undefined
) and returns a Boolean. It performs the following steps when called:
1.
If
Desc
is
undefined
, return
false
2.
If
Desc
has a [[Value]] field, return
true
3.
If
Desc
has a [[Writable]] field, return
true
4.
Return
false
6.2.6.3
IsGenericDescriptor (
Desc
The abstract operation IsGenericDescriptor takes argument
Desc
(a
Property Descriptor
or
undefined
) and returns a Boolean. It performs the following steps when called:
1.
If
Desc
is
undefined
, return
false
2.
If
IsAccessorDescriptor
Desc
) is
true
, return
false
3.
If
IsDataDescriptor
Desc
) is
true
, return
false
4.
Return
true
6.2.6.4
FromPropertyDescriptor (
Desc
The abstract operation FromPropertyDescriptor takes argument
Desc
(a
Property Descriptor
or
undefined
) and returns an Object or
undefined
. It performs the following steps when called:
1.
If
Desc
is
undefined
, return
undefined
2.
Let
obj
be
OrdinaryObjectCreate
%Object.prototype%
).
3.
Assert
obj
is an extensible
ordinary object
with no own properties.
4.
If
Desc
has a [[Value]] field, then
a.
Perform !
CreateDataPropertyOrThrow
obj
"value"
Desc
.[[Value]]).
5.
If
Desc
has a [[Writable]] field, then
a.
Perform !
CreateDataPropertyOrThrow
obj
"writable"
Desc
.[[Writable]]).
6.
If
Desc
has a [[Get]] field, then
a.
Perform !
CreateDataPropertyOrThrow
obj
"get"
Desc
.[[Get]]).
7.
If
Desc
has a [[Set]] field, then
a.
Perform !
CreateDataPropertyOrThrow
obj
"set"
Desc
.[[Set]]).
8.
If
Desc
has an [[Enumerable]] field, then
a.
Perform !
CreateDataPropertyOrThrow
obj
"enumerable"
Desc
.[[Enumerable]]).
9.
If
Desc
has a [[Configurable]] field, then
a.
Perform !
CreateDataPropertyOrThrow
obj
"configurable"
Desc
.[[Configurable]]).
10.
Return
obj
6.2.6.5
ToPropertyDescriptor (
Obj
The abstract operation ToPropertyDescriptor takes argument
Obj
(an
ECMAScript language value
) and returns either a
normal completion containing
Property Descriptor
or a
throw completion
. It performs the following steps when called:
1.
If
Obj
is not an Object
, throw a
TypeError
exception.
2.
Let
desc
be a new
Property Descriptor
that initially has no fields.
3.
Let
hasEnumerable
be ?
HasProperty
Obj
"enumerable"
).
4.
If
hasEnumerable
is
true
, then
a.
Let
enumerable
be
ToBoolean
(?
Get
Obj
"enumerable"
)).
b.
Set
desc
.[[Enumerable]] to
enumerable
5.
Let
hasConfigurable
be ?
HasProperty
Obj
"configurable"
).
6.
If
hasConfigurable
is
true
, then
a.
Let
configurable
be
ToBoolean
(?
Get
Obj
"configurable"
)).
b.
Set
desc
.[[Configurable]] to
configurable
7.
Let
hasValue
be ?
HasProperty
Obj
"value"
).
8.
If
hasValue
is
true
, then
a.
Let
value
be ?
Get
Obj
"value"
).
b.
Set
desc
.[[Value]] to
value
9.
Let
hasWritable
be ?
HasProperty
Obj
"writable"
).
10.
If
hasWritable
is
true
, then
a.
Let
writable
be
ToBoolean
(?
Get
Obj
"writable"
)).
b.
Set
desc
.[[Writable]] to
writable
11.
Let
hasGet
be ?
HasProperty
Obj
"get"
).
12.
If
hasGet
is
true
, then
a.
Let
getter
be ?
Get
Obj
"get"
).
b.
If
IsCallable
getter
) is
false
and
getter
is not
undefined
, throw a
TypeError
exception.
c.
Set
desc
.[[Get]] to
getter
13.
Let
hasSet
be ?
HasProperty
Obj
"set"
).
14.
If
hasSet
is
true
, then
a.
Let
setter
be ?
Get
Obj
"set"
).
b.
If
IsCallable
setter
) is
false
and
setter
is not
undefined
, throw a
TypeError
exception.
c.
Set
desc
.[[Set]] to
setter
15.
If
desc
has a [[Get]] field or
desc
has a [[Set]] field, then
a.
If
desc
has a [[Value]] field or
desc
has a [[Writable]] field, throw a
TypeError
exception.
16.
Return
desc
6.2.6.6
CompletePropertyDescriptor (
Desc
The abstract operation CompletePropertyDescriptor takes argument
Desc
(a
Property Descriptor
) and returns
unused
. It performs the following steps when called:
1.
Let
like
be the
Record
{ [[Value]]:
undefined
, [[Writable]]:
false
, [[Get]]:
undefined
, [[Set]]:
undefined
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
2.
If
IsGenericDescriptor
Desc
) is
true
or
IsDataDescriptor
Desc
) is
true
, then
a.
If
Desc
does not have a [[Value]] field, set
Desc
.[[Value]] to
like
.[[Value]].
b.
If
Desc
does not have a [[Writable]] field, set
Desc
.[[Writable]] to
like
.[[Writable]].
3.
Else,
a.
If
Desc
does not have a [[Get]] field, set
Desc
.[[Get]] to
like
.[[Get]].
b.
If
Desc
does not have a [[Set]] field, set
Desc
.[[Set]] to
like
.[[Set]].
4.
If
Desc
does not have an [[Enumerable]] field, set
Desc
.[[Enumerable]] to
like
.[[Enumerable]].
5.
If
Desc
does not have a [[Configurable]] field, set
Desc
.[[Configurable]] to
like
.[[Configurable]].
6.
Return
unused
6.2.7
The Environment Record Specification Type
The
Environment Record
type is used to explain the behaviour of name resolution in nested
functions and blocks. This type and the operations upon it are defined
in
9.1
6.2.8
The Abstract Closure Specification Type
The
Abstract Closure
specification type is used to refer to algorithm steps together with a
collection of values. Abstract Closures are meta-values and are invoked
using function application style such as
closure
arg1
arg2
). Like
abstract operations
, invocations perform the algorithm steps described by the Abstract Closure.
In algorithm steps that create an Abstract Closure, values are
captured with the verb "capture" followed by a list of aliases. When an
Abstract Closure is created, it captures the value that is associated
with each alias at that time. In steps that specify the algorithm to be
performed when an Abstract Closure is called, each captured value is
referred to by the alias that was used to capture the value.
If an Abstract Closure returns a
Completion Record
, that
Completion Record
's [[Type]] must be either
normal
or
throw
Abstract Closures are created inline as part of other algorithms, shown in the following example.
1.
Let
addend
be 41.
2.
Let
closure
be a new
Abstract Closure
with parameters (
) that captures
addend
and performs the following steps when called:
a.
Return
addend
3.
Let
val
be
closure
(1).
4.
Assert
val
is 42.
6.2.9
Data Blocks
The
Data Block
specification type is used to describe a distinct and mutable sequence of byte-sized (8 bit) numeric values. A
byte value
is an
integer
in the
inclusive interval
from 0 to 255. A Data Block value is created with a fixed number of bytes that each have the initial value 0.
For notational convenience within this specification, an
array-like syntax can be used to access the individual bytes of a Data
Block value. This notation presents a Data Block value as a 0-origined
integer
-indexed sequence of bytes. For example, if
db
is a 5 byte Data Block value then
db
[2] can be used to access its 3
rd
byte.
A data block that resides in memory that can be referenced from multiple
agents
concurrently is designated a
Shared Data Block
. A Shared Data Block has an identity (for the purposes of equality testing Shared Data Block values) that is
address-free
it is tied not to the virtual addresses the block is mapped to in any
process, but to the set of locations in memory that the block
represents. Two data blocks are equal only if the sets of the locations
they contain are equal; otherwise, they are not equal and the
intersection of the sets of locations they contain is empty. Finally,
Shared Data Blocks can be distinguished from Data Blocks.
The semantics of Shared Data Blocks is defined using
Shared Data Block events
by the
memory model
Abstract operations
below introduce
Shared Data Block events
and act as the interface between evaluation semantics and the event semantics of the
memory model
. The events form a
candidate execution
, on which the
memory model
acts as a filter. Please consult the
memory model
for full semantics.
Shared Data Block events
are modeled by
Records
, defined in the
memory model
The following
abstract operations
are used in this specification to operate upon Data Block values:
6.2.9.1
CreateByteDataBlock (
size
The abstract operation CreateByteDataBlock takes argument
size
(a non-negative
integer
) and returns either a
normal completion containing
Data Block
or a
throw completion
. It performs the following steps when called:
1.
Let
db
be a new
Data Block
value consisting of
size
bytes. If it is impossible to create such a
Data Block
, throw a
RangeError
exception.
2.
Set all of the bytes of
db
to 0.
3.
Return
db
6.2.9.2
CreateSharedByteDataBlock (
size
The abstract operation CreateSharedByteDataBlock takes argument
size
(a non-negative
integer
) and returns either a
normal completion containing
Shared Data Block
or a
throw completion
. It performs the following steps when called:
1.
Let
db
be a new
Shared Data Block
value consisting of
size
bytes. If it is impossible to create such a
Shared Data Block
, throw a
RangeError
exception.
2.
Let
execution
be the [[CandidateExecution]] field of the
surrounding agent
's
Agent Record
3.
Let
eventsRecord
be the
Agent Events Record
of
execution
.[[EventsRecords]] whose [[AgentSignifier]] is
AgentSignifier
().
4.
Let
zero
be « 0 ».
5.
For each index
of
db
, do
a.
Append
WriteSharedMemory
{ [[Order]]:
Init
, [[NoTear]]:
true
, [[Block]]:
db
, [[ByteIndex]]:
, [[ElementSize]]: 1, [[Payload]]:
zero
} to
eventsRecord
.[[EventList]].
6.
Return
db
6.2.9.3
CopyDataBlockBytes (
toBlock
toIndex
fromBlock
fromIndex
count
The abstract operation CopyDataBlockBytes takes arguments
toBlock
(a
Data Block
or a
Shared Data Block
),
toIndex
(a non-negative
integer
),
fromBlock
(a
Data Block
or a
Shared Data Block
),
fromIndex
(a non-negative
integer
), and
count
(a non-negative
integer
) and returns
unused
. It performs the following steps when called:
1.
Assert
fromBlock
and
toBlock
are distinct values.
2.
Let
fromSize
be the number of bytes in
fromBlock
3.
Assert
fromIndex
count
fromSize
4.
Let
toSize
be the number of bytes in
toBlock
5.
Assert
toIndex
count
toSize
6.
Repeat, while
count
> 0,
a.
If
fromBlock
is a
Shared Data Block
, then
i.
Let
execution
be the [[CandidateExecution]] field of the
surrounding agent
's
Agent Record
ii.
Let
eventsRecord
be the
Agent Events Record
of
execution
.[[EventsRecords]] whose [[AgentSignifier]] is
AgentSignifier
().
iii.
Let
bytes
be a
List
whose sole element is a nondeterministically chosen
byte value
iv.
NOTE: In implementations,
bytes
is the result of a non-atomic read instruction on the underlying
hardware. The nondeterminism is a semantic prescription of the
memory model
to describe observable behaviour of hardware with weak consistency.
v.
Let
readEvent
be
ReadSharedMemory
{ [[Order]]:
Unordered
, [[NoTear]]:
true
, [[Block]]:
fromBlock
, [[ByteIndex]]:
fromIndex
, [[ElementSize]]: 1 }.
vi.
Append
readEvent
to
eventsRecord
.[[EventList]].
vii.
Append
Chosen Value Record
{ [[Event]]:
readEvent
, [[ChosenValue]]:
bytes
} to
execution
.[[ChosenValues]].
viii.
If
toBlock
is a
Shared Data Block
, then
1.
Append
WriteSharedMemory
{ [[Order]]:
Unordered
, [[NoTear]]:
true
, [[Block]]:
toBlock
, [[ByteIndex]]:
toIndex
, [[ElementSize]]: 1, [[Payload]]:
bytes
} to
eventsRecord
.[[EventList]].
ix.
Else,
1.
Set
toBlock
toIndex
] to
bytes
[0].
b.
Else,
i.
Assert
toBlock
is not a
Shared Data Block
ii.
Set
toBlock
toIndex
] to
fromBlock
fromIndex
].
c.
Set
toIndex
to
toIndex
+ 1.
d.
Set
fromIndex
to
fromIndex
+ 1.
e.
Set
count
to
count
- 1.
7.
Return
unused
6.2.10
The PrivateElement Specification Type
The PrivateElement type is a
Record
used in the specification of private class fields, methods, and accessors. Although
Property Descriptors
are not used for private elements, private fields behave similarly to non-configurable, non-enumerable, writable
data properties
, private methods behave similarly to non-configurable, non-enumerable, non-writable
data properties
, and private accessors behave similarly to non-configurable, non-enumerable
accessor properties
Values of the PrivateElement type are
Record
values whose fields are defined by
Table 9
. Such values are referred to as
PrivateElements
Table 9:
PrivateElement
Fields
Field Name
Values of the [[Kind]] field for which it is present
Value
Meaning
[[Key]]
All
Private Name
The name of the field, method, or accessor.
[[Kind]]
All
field
method
, or
accessor
The kind of the element.
[[Value]]
field
and
method
an
ECMAScript language value
The value of the field.
[[Get]]
accessor
function object
or
undefined
The getter for a private accessor.
[[Set]]
accessor
function object
or
undefined
The setter for a private accessor.
6.2.11
The ClassFieldDefinition Record Specification Type
The ClassFieldDefinition type is a
Record
used in the specification of class fields.
Values of the ClassFieldDefinition type are
Record
values whose fields are defined by
Table 10
. Such values are referred to as
ClassFieldDefinition Records
Table 10:
ClassFieldDefinition Record
Fields
Field Name
Value
Meaning
[[Name]]
Private Name
, a String, or a Symbol
The name of the field.
[[Initializer]]
function object
or
empty
The initializer of the field, if any.
6.2.12
Private Names
The
Private Name
specification type is used to describe a globally unique value (one
which differs from any other Private Name, even if they are otherwise
indistinguishable) which represents the key of a private class element
(field, method, or accessor). Each Private Name has an associated
immutable [[Description]] which
is a String
value. A Private Name may be installed on any ECMAScript object with
PrivateFieldAdd
or
PrivateMethodOrAccessorAdd
, and then read or written using
PrivateGet
and
PrivateSet
6.2.13
The ClassStaticBlockDefinition Record Specification Type
ClassStaticBlockDefinition Record
is a
Record
value used to encapsulate the executable code for a class static initialization block.
ClassStaticBlockDefinition Records have the fields listed in
Table 11
Table 11:
ClassStaticBlockDefinition Record
Fields
Field Name
Value
Meaning
[[BodyFunction]]
function object
The
function object
to be called during static initialization of a class.
Abstract Operations
These operations are not a part of the ECMAScript language; they
are defined here solely to aid the specification of the semantics of the
ECMAScript language. Other, more specialized
abstract operations
are defined throughout this specification.
7.1
Type Conversion
The ECMAScript language implicitly performs automatic type
conversion as needed. To clarify the semantics of certain constructs it
is useful to define a set of conversion
abstract operations
. The conversion
abstract operations
are polymorphic; they can accept a value of any
ECMAScript language type
. But no other specification types are used with these operations.
The
BigInt type
has no implicit conversions in the ECMAScript language; programmers
must call BigInt explicitly to convert values from other types.
7.1.1
ToPrimitive (
input
[ ,
preferredType
] )
The abstract operation ToPrimitive takes argument
input
(an
ECMAScript language value
) and optional argument
preferredType
string
or
number
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It converts its
input
argument to a non-Object type. If an object is capable of converting to
more than one primitive type, it may use the optional hint
preferredType
to favour that type. It performs the following steps when called:
1.
If
input
is an Object
, then
a.
Let
exoticToPrim
be ?
GetMethod
input
@@toPrimitive
).
b.
If
exoticToPrim
is not
undefined
, then
i.
If
preferredType
is not present, let
hint
be
"default"
ii.
Else if
preferredType
is
string
, let
hint
be
"string"
iii.
Else,
1.
Assert
preferredType
is
number
2.
Let
hint
be
"number"
iv.
Let
result
be ?
Call
exoticToPrim
input
, «
hint
»).
v.
If
result
is not an Object
, return
result
vi.
Throw a
TypeError
exception.
c.
If
preferredType
is not present, let
preferredType
be
number
d.
Return ?
OrdinaryToPrimitive
input
preferredType
).
2.
Return
input
Note
When ToPrimitive is called without a hint, then it generally behaves as if the hint were
number
. However, objects may over-ride this behaviour by defining a
@@toPrimitive
method. Of the objects defined in this specification only Dates (see
21.4.4.45
) and Symbol objects (see
20.4.3.5
) over-ride the default ToPrimitive behaviour. Dates treat the absence of a hint as if the hint were
string
7.1.1.1
OrdinaryToPrimitive (
hint
The abstract operation OrdinaryToPrimitive takes arguments
(an Object) and
hint
string
or
number
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
If
hint
is
string
, then
a.
Let
methodNames
be «
"toString"
"valueOf"
».
2.
Else,
a.
Let
methodNames
be «
"valueOf"
"toString"
».
3.
For each element
name
of
methodNames
, do
a.
Let
method
be ?
Get
name
).
b.
If
IsCallable
method
) is
true
, then
i.
Let
result
be ?
Call
method
).
ii.
If
result
is not an Object
, return
result
4.
Throw a
TypeError
exception.
7.1.2
ToBoolean (
argument
The abstract operation ToBoolean takes argument
argument
(an
ECMAScript language value
) and returns a Boolean. It converts
argument
to a value of type Boolean. It performs the following steps when called:
1.
If
argument
is a Boolean
, return
argument
2.
If
argument
is one of
undefined
null
+0
-0
NaN
, or the empty String, return
false
3.
NOTE: This step is replaced in section
B.3.6.1
4.
Return
true
7.1.3
ToNumeric (
value
The abstract operation ToNumeric takes argument
value
(an
ECMAScript language value
) and returns either a
normal completion containing
either a Number or a BigInt, or a
throw completion
. It returns
value
converted to a Number or a BigInt. It performs the following steps when called:
1.
Let
primValue
be ?
ToPrimitive
value
number
).
2.
If
primValue
is a BigInt
, return
primValue
3.
Return ?
ToNumber
primValue
).
7.1.4
ToNumber (
argument
The abstract operation ToNumber takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
a Number or a
throw completion
. It converts
argument
to a value of type Number. It performs the following steps when called:
1.
If
argument
is a Number
, return
argument
2.
If
argument
is either a Symbol or a BigInt, throw a
TypeError
exception.
3.
If
argument
is
undefined
, return
NaN
4.
If
argument
is either
null
or
false
, return
+0
5.
If
argument
is
true
, return
6.
If
argument
is a String
, return
StringToNumber
argument
).
7.
Assert
argument
is an Object
8.
Let
primValue
be ?
ToPrimitive
argument
number
).
9.
Assert
primValue
is not an Object
10.
Return ?
ToNumber
primValue
).
7.1.4.1
ToNumber Applied to the String Type
The abstract operation
StringToNumber
specifies how to convert a String value to a Number value, using the following grammar.
Syntax
StringNumericLiteral
:::
StrWhiteSpace
opt
StrWhiteSpace
opt
StrNumericLiteral
StrWhiteSpace
opt
StrWhiteSpace
:::
StrWhiteSpaceChar
StrWhiteSpace
opt
StrWhiteSpaceChar
:::
WhiteSpace
LineTerminator
StrNumericLiteral
:::
StrDecimalLiteral
NonDecimalIntegerLiteral
[~Sep]
StrDecimalLiteral
:::
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral
:::
Infinity
DecimalDigits
[~Sep]
DecimalDigits
[~Sep]
opt
ExponentPart
[~Sep]
opt
DecimalDigits
[~Sep]
ExponentPart
[~Sep]
opt
DecimalDigits
[~Sep]
ExponentPart
[~Sep]
opt
All grammar symbols not explicitly defined above have the definitions used in the Lexical Grammar for numeric literals (
12.9.3
Note
Some differences should be noted between the syntax of a
StringNumericLiteral
and a
NumericLiteral
StringNumericLiteral
may include leading and/or trailing white space and/or line terminators.
StringNumericLiteral
that is decimal may have any number of leading
digits.
StringNumericLiteral
that is decimal may include a
or
to indicate its sign.
StringNumericLiteral
that is empty or contains only white space is converted to
+0
Infinity
and
-Infinity
are recognized as a
StringNumericLiteral
but not as a
NumericLiteral
StringNumericLiteral
cannot include a
BigIntLiteralSuffix
StringNumericLiteral
cannot include a
NumericLiteralSeparator
7.1.4.1.1
StringToNumber (
str
The abstract operation StringToNumber takes argument
str
(a String) and returns a Number. It performs the following steps when called:
1.
Let
text
be
StringToCodePoints
str
).
2.
Let
literal
be
ParseText
text
StringNumericLiteral
).
3.
If
literal
is a
List
of errors, return
NaN
4.
Return
StringNumericValue
of
literal
7.1.4.1.2
Runtime Semantics: StringNumericValue
The
syntax-directed operation
StringNumericValue takes no arguments and returns a Number.
Note
The conversion of a
StringNumericLiteral
to a Number value is similar overall to the determination of the
NumericValue
of a
NumericLiteral
(see
12.9.3
), but some of the details are different.
It is defined piecewise over the following productions:
StringNumericLiteral
:::
StrWhiteSpace
opt
1.
Return
+0
StringNumericLiteral
:::
StrWhiteSpace
opt
StrNumericLiteral
StrWhiteSpace
opt
1.
Return
StringNumericValue
of
StrNumericLiteral
StrNumericLiteral
:::
NonDecimalIntegerLiteral
1.
Return
(MV of
NonDecimalIntegerLiteral
).
StrDecimalLiteral
:::
StrUnsignedDecimalLiteral
1.
Let
be
StringNumericValue
of
StrUnsignedDecimalLiteral
2.
If
is
+0
, return
-0
3.
Return -
StrUnsignedDecimalLiteral
:::
Infinity
1.
Return
+∞
StrUnsignedDecimalLiteral
:::
DecimalDigits
DecimalDigits
opt
ExponentPart
opt
1.
Let
be MV of the first
DecimalDigits
2.
If the second
DecimalDigits
is present, then
a.
Let
be MV of the second
DecimalDigits
b.
Let
be the number of code points in the second
DecimalDigits
3.
Else,
a.
Let
be 0.
b.
Let
be 0.
4.
If
ExponentPart
is present, let
be MV of
ExponentPart
. Otherwise, let
be 0.
5.
Return
RoundMVResult
((
+ (
× 10
)) × 10
).
StrUnsignedDecimalLiteral
:::
DecimalDigits
ExponentPart
opt
1.
Let
be MV of
DecimalDigits
2.
If
ExponentPart
is present, let
be MV of
ExponentPart
. Otherwise, let
be 0.
3.
Let
be the number of code points in
DecimalDigits
4.
Return
RoundMVResult
× 10
).
StrUnsignedDecimalLiteral
:::
DecimalDigits
ExponentPart
opt
1.
Let
be MV of
DecimalDigits
2.
If
ExponentPart
is present, let
be MV of
ExponentPart
. Otherwise, let
be 0.
3.
Return
RoundMVResult
× 10
).
7.1.4.1.3
RoundMVResult (
The abstract operation RoundMVResult takes argument
(a
mathematical value
) and returns a Number. It converts
to a Number in an
implementation-defined
manner. For the purposes of this abstract operation, a digit is
significant if it is not zero or there is a non-zero digit to its left
and there is a non-zero digit to its right. For the purposes of this
abstract operation, "the
mathematical value
denoted by" a representation of a
mathematical value
is the inverse of "the decimal representation of" a
mathematical value
. It performs the following steps when called:
1.
If the decimal representation of
has 20 or fewer significant digits, return
).
2.
Let
option1
be the
mathematical value
denoted by the result of replacing each significant digit in the decimal representation of
after the 20th with a 0 digit.
3.
Let
option2
be the
mathematical value
denoted by the result of replacing each significant digit in the decimal representation of
after the 20th with a 0 digit and then incrementing it at the 20th position (with carrying as necessary).
4.
Let
chosen
be an
implementation-defined
choice of either
option1
or
option2
5.
Return
chosen
).
7.1.5
ToIntegerOrInfinity (
argument
The abstract operation ToIntegerOrInfinity takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
either an
integer
, +∞, or -∞, or a
throw completion
. It converts
argument
to an
integer
representing its Number value with fractional part truncated, or to +∞
or -∞ when that Number value is infinite. It performs the following
steps when called:
1.
Let
number
be ?
ToNumber
argument
).
2.
If
number
is one of
NaN
+0
, or
-0
, return 0.
3.
If
number
is
+∞
, return +∞.
4.
If
number
is
-∞
, return -∞.
5.
Return
truncate
number
)).
Note
(ToIntegerOrInfinity(
)) never returns
-0
for any value of
. The truncation of the fractional part is performed after converting
to a
mathematical value
7.1.6
ToInt32 (
argument
The abstract operation ToInt32 takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an
integral Number
or a
throw completion
. It converts
argument
to one of 2
32
integral Number
values in the
inclusive interval
from
-2
31
) to
31
- 1
). It performs the following steps when called:
1.
Let
number
be ?
ToNumber
argument
).
2.
If
number
is not
finite
or
number
is either
+0
or
-0
, return
+0
3.
Let
int
be
truncate
number
)).
4.
Let
int32bit
be
int
modulo
32
5.
If
int32bit
≥ 2
31
, return
int32bit
- 2
32
); otherwise return
int32bit
).
Note
Given the above definition of ToInt32:
The ToInt32 abstract operation is idempotent: if applied to a
result that it produced, the second application leaves that value
unchanged.
ToInt32(
ToUint32
)) is the same value as ToInt32(
) for all values of
. (It is to preserve this latter property that
+∞
and
-∞
are mapped to
+0
.)
ToInt32 maps
-0
to
+0
7.1.7
ToUint32 (
argument
The abstract operation ToUint32 takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an
integral Number
or a
throw completion
. It converts
argument
to one of 2
32
integral Number
values in the
inclusive interval
from
+0
to
32
- 1
). It performs the following steps when called:
1.
Let
number
be ?
ToNumber
argument
).
2.
If
number
is not
finite
or
number
is either
+0
or
-0
, return
+0
3.
Let
int
be
truncate
number
)).
4.
Let
int32bit
be
int
modulo
32
5.
Return
int32bit
).
Note
Given the above definition of ToUint32:
Step
is the only difference between ToUint32 and
ToInt32
The ToUint32 abstract operation is idempotent: if applied to
a result that it produced, the second application leaves that value
unchanged.
ToUint32(
ToInt32
)) is the same value as ToUint32(
) for all values of
. (It is to preserve this latter property that
+∞
and
-∞
are mapped to
+0
.)
ToUint32 maps
-0
to
+0
7.1.8
ToInt16 (
argument
The abstract operation ToInt16 takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an
integral Number
or a
throw completion
. It converts
argument
to one of 2
16
integral Number
values in the
inclusive interval
from
-2
15
) to
15
- 1
). It performs the following steps when called:
1.
Let
number
be ?
ToNumber
argument
).
2.
If
number
is not
finite
or
number
is either
+0
or
-0
, return
+0
3.
Let
int
be
truncate
number
)).
4.
Let
int16bit
be
int
modulo
16
5.
If
int16bit
≥ 2
15
, return
int16bit
- 2
16
); otherwise return
int16bit
).
7.1.9
ToUint16 (
argument
The abstract operation ToUint16 takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an
integral Number
or a
throw completion
. It converts
argument
to one of 2
16
integral Number
values in the
inclusive interval
from
+0
to
16
- 1
). It performs the following steps when called:
1.
Let
number
be ?
ToNumber
argument
).
2.
If
number
is not
finite
or
number
is either
+0
or
-0
, return
+0
3.
Let
int
be
truncate
number
)).
4.
Let
int16bit
be
int
modulo
16
5.
Return
int16bit
).
Note
Given the above definition of ToUint16:
The substitution of 2
16
for 2
32
in step
is the only difference between
ToUint32
and ToUint16.
ToUint16 maps
-0
to
+0
7.1.10
ToInt8 (
argument
The abstract operation ToInt8 takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an
integral Number
or a
throw completion
. It converts
argument
to one of 2
integral Number
values in the
inclusive interval
from
-128
to
127
. It performs the following steps when called:
1.
Let
number
be ?
ToNumber
argument
).
2.
If
number
is not
finite
or
number
is either
+0
or
-0
, return
+0
3.
Let
int
be
truncate
number
)).
4.
Let
int8bit
be
int
modulo
5.
If
int8bit
≥ 2
, return
int8bit
- 2
); otherwise return
int8bit
).
7.1.11
ToUint8 (
argument
The abstract operation ToUint8 takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an
integral Number
or a
throw completion
. It converts
argument
to one of 2
integral Number
values in the
inclusive interval
from
+0
to
255
. It performs the following steps when called:
1.
Let
number
be ?
ToNumber
argument
).
2.
If
number
is not
finite
or
number
is either
+0
or
-0
, return
+0
3.
Let
int
be
truncate
number
)).
4.
Let
int8bit
be
int
modulo
5.
Return
int8bit
).
7.1.12
ToUint8Clamp (
argument
The abstract operation ToUint8Clamp takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an
integral Number
or a
throw completion
. It converts
argument
to one of 2
integral Number
values in the
inclusive interval
from
+0
to
255
. It performs the following steps when called:
1.
Let
number
be ?
ToNumber
argument
).
2.
If
number
is
NaN
, return
+0
3.
If
number
) ≤ 0, return
+0
4.
If
number
) ≥ 255, return
255
5.
Let
be
floor
number
)).
6.
If
+ 0.5 <
number
), return
+ 1).
7.
If
number
) <
+ 0.5, return
).
8.
If
is odd, return
+ 1).
9.
Return
).
Note
Unlike the other ECMAScript
integer
conversion abstract operation, ToUint8Clamp rounds rather than truncates non-integral values and does not convert
+∞
to
+0
. ToUint8Clamp does “round half to even” tie-breaking. This differs from
Math.round
which does “round half up” tie-breaking.
7.1.13
ToBigInt (
argument
The abstract operation ToBigInt takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
a BigInt or a
throw completion
. It converts
argument
to a BigInt value, or throws if an implicit conversion from Number
would be required. It performs the following steps when called:
1.
Let
prim
be ?
ToPrimitive
argument
number
).
2.
Return the value that
prim
corresponds to in
Table 12
Table 12: BigInt Conversions
Argument Type
Result
Undefined
Throw a
TypeError
exception.
Null
Throw a
TypeError
exception.
Boolean
Return
1n
if
prim
is
true
and
0n
if
prim
is
false
BigInt
Return
prim
Number
Throw a
TypeError
exception.
String
1.
Let
be
StringToBigInt
prim
).
2.
If
is
undefined
, throw a
SyntaxError
exception.
3.
Return
Symbol
Throw a
TypeError
exception.
7.1.14
StringToBigInt (
str
The abstract operation StringToBigInt takes argument
str
(a String) and returns a BigInt or
undefined
. It performs the following steps when called:
1.
Let
text
be
StringToCodePoints
str
).
2.
Let
literal
be
ParseText
text
StringIntegerLiteral
).
3.
If
literal
is a
List
of errors, return
undefined
4.
Let
mv
be the MV of
literal
5.
Assert
mv
is an
integer
6.
Return
mv
).
7.1.14.1
StringIntegerLiteral Grammar
StringToBigInt
uses the following grammar.
Syntax
StringIntegerLiteral
:::
StrWhiteSpace
opt
StrWhiteSpace
opt
StrIntegerLiteral
StrWhiteSpace
opt
StrIntegerLiteral
:::
SignedInteger
[~Sep]
NonDecimalIntegerLiteral
[~Sep]
7.1.14.2
Runtime Semantics: MV
The MV of
StringIntegerLiteral
:::
StrWhiteSpace
opt
is 0.
The MV of
StringIntegerLiteral
:::
StrWhiteSpace
opt
StrIntegerLiteral
StrWhiteSpace
opt
is the MV of
StrIntegerLiteral
7.1.15
ToBigInt64 (
argument
The abstract operation ToBigInt64 takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
a BigInt or a
throw completion
. It converts
argument
to one of 2
64
BigInt values in the
inclusive interval
from
(-2
63
) to
(2
63
-1). It performs the following steps when called:
1.
Let
be ?
ToBigInt
argument
).
2.
Let
int64bit
be
modulo
64
3.
If
int64bit
≥ 2
63
, return
int64bit
- 2
64
); otherwise return
int64bit
).
7.1.16
ToBigUint64 (
argument
The abstract operation ToBigUint64 takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
a BigInt or a
throw completion
. It converts
argument
to one of 2
64
BigInt values in the
inclusive interval
from
to
(2
64
-1). It performs the following steps when called:
1.
Let
be ?
ToBigInt
argument
).
2.
Let
int64bit
be
modulo
64
3.
Return
int64bit
).
7.1.17
ToString (
argument
The abstract operation ToString takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
a String or a
throw completion
. It converts
argument
to a value of type String. It performs the following steps when called:
1.
If
argument
is a String
, return
argument
2.
If
argument
is a Symbol
, throw a
TypeError
exception.
3.
If
argument
is
undefined
, return
"undefined"
4.
If
argument
is
null
, return
"null"
5.
If
argument
is
true
, return
"true"
6.
If
argument
is
false
, return
"false"
7.
If
argument
is a Number
, return
Number::toString
argument
, 10).
8.
If
argument
is a BigInt
, return
BigInt::toString
argument
, 10).
9.
Assert
argument
is an Object
10.
Let
primValue
be ?
ToPrimitive
argument
string
).
11.
Assert
primValue
is not an Object
12.
Return ?
ToString
primValue
).
7.1.18
ToObject (
argument
The abstract operation ToObject takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an Object or a
throw completion
. It converts
argument
to a value of type Object according to
Table 13
Table 13:
ToObject
Conversions
Argument Type
Result
Undefined
Throw a
TypeError
exception.
Null
Throw a
TypeError
exception.
Boolean
Return a new Boolean object whose [[BooleanData]] internal slot is set to
argument
. See
20.3
for a description of Boolean objects.
Number
Return a new Number object whose [[NumberData]] internal slot is set to
argument
. See
21.1
for a description of Number objects.
String
Return a new String object whose [[StringData]] internal slot is set to
argument
. See
22.1
for a description of String objects.
Symbol
Return a new Symbol object whose [[SymbolData]] internal slot is set to
argument
. See
20.4
for a description of Symbol objects.
BigInt
Return a new BigInt object whose [[BigIntData]] internal slot is set to
argument
. See
21.2
for a description of BigInt objects.
Object
Return
argument
7.1.19
ToPropertyKey (
argument
The abstract operation ToPropertyKey takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
property key
or a
throw completion
. It converts
argument
to a value that can be used as a
property key
. It performs the following steps when called:
1.
Let
key
be ?
ToPrimitive
argument
string
).
2.
If
key
is a Symbol
, then
a.
Return
key
3.
Return !
ToString
key
).
7.1.20
ToLength (
argument
The abstract operation ToLength takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an
integral Number
or a
throw completion
. It clamps
argument
to an
integral Number
suitable for use as the length of an
array-like object
. It performs the following steps when called:
1.
Let
len
be ?
ToIntegerOrInfinity
argument
).
2.
If
len
≤ 0, return
+0
3.
Return
min
len
, 2
53
- 1)).
7.1.21
CanonicalNumericIndexString (
argument
The abstract operation CanonicalNumericIndexString takes argument
argument
(a String) and returns a Number or
undefined
. If
argument
is either
"-0"
or exactly matches the result of
ToString
) for some Number value
, it returns the respective Number value. Otherwise, it returns
undefined
. It performs the following steps when called:
1.
If
argument
is
"-0"
, return
-0
2.
Let
be !
ToNumber
argument
).
3.
If !
ToString
) is
argument
, return
4.
Return
undefined
canonical numeric string
is any String value for which the CanonicalNumericIndexString abstract operation does not return
undefined
7.1.22
ToIndex (
value
The abstract operation ToIndex takes argument
value
(an
ECMAScript language value
) and returns either a
normal completion containing
a non-negative
integer
or a
throw completion
. It converts
value
to a non-negative
integer
if the corresponding decimal representation, as a String, is an
integer index
. It performs the following steps when called:
1.
If
value
is
undefined
, then
a.
Return 0.
2.
Else,
a.
Let
integer
be ?
ToIntegerOrInfinity
value
).
b.
Let
clamped
be !
ToLength
integer
)).
c.
If
SameValue
integer
),
clamped
) is
false
, throw a
RangeError
exception.
d.
Assert
: 0 ≤
integer
≤ 2
53
- 1.
e.
Return
integer
7.2
Testing and Comparison Operations
7.2.1
RequireObjectCoercible (
argument
The abstract operation RequireObjectCoercible takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It throws an error if
argument
is a value that cannot be converted to an Object using
ToObject
. It is defined by
Table 14
Table 14:
RequireObjectCoercible
Results
Argument Type
Result
Undefined
Throw a
TypeError
exception.
Null
Throw a
TypeError
exception.
Boolean
Return
argument
Number
Return
argument
String
Return
argument
Symbol
Return
argument
BigInt
Return
argument
Object
Return
argument
7.2.2
IsArray (
argument
The abstract operation IsArray takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
argument
is not an Object
, return
false
2.
If
argument
is an
Array exotic object
, return
true
3.
If
argument
is a
Proxy exotic object
, then
a.
Perform ?
ValidateNonRevokedProxy
argument
).
b.
Let
proxyTarget
be
argument
.[[ProxyTarget]].
c.
Return ?
IsArray
proxyTarget
).
4.
Return
false
7.2.3
IsCallable (
argument
The abstract operation IsCallable takes argument
argument
(an
ECMAScript language value
) and returns a Boolean. It determines if
argument
is a callable function with a [[Call]] internal method. It performs the following steps when called:
1.
If
argument
is not an Object
, return
false
2.
If
argument
has a [[Call]] internal method, return
true
3.
Return
false
7.2.4
IsConstructor (
argument
The abstract operation IsConstructor takes argument
argument
(an
ECMAScript language value
) and returns a Boolean. It determines if
argument
is a
function object
with a [[Construct]] internal method. It performs the following steps when called:
1.
If
argument
is not an Object
, return
false
2.
If
argument
has a [[Construct]] internal method, return
true
3.
Return
false
7.2.5
IsExtensible (
The abstract operation IsExtensible takes argument
(an Object) and returns either a
normal completion containing
a Boolean or a
throw completion
. It is used to determine whether additional properties can be added to
. It performs the following steps when called:
1.
Return ?
.[[IsExtensible]]
().
7.2.6
IsIntegralNumber (
argument
The abstract operation IsIntegralNumber takes argument
argument
(an
ECMAScript language value
) and returns a Boolean. It determines if
argument
is a
finite
integral Number
value. It performs the following steps when called:
1.
If
argument
is not a Number
, return
false
2.
If
argument
is not
finite
, return
false
3.
If
truncate
argument
)) ≠
argument
), return
false
4.
Return
true
7.2.7
IsPropertyKey (
argument
The abstract operation IsPropertyKey takes argument
argument
(an
ECMAScript language value
) and returns a Boolean. It determines if
argument
is a value that may be used as a
property key
. It performs the following steps when called:
1.
If
argument
is a String
, return
true
2.
If
argument
is a Symbol
, return
true
3.
Return
false
7.2.8
IsRegExp (
argument
The abstract operation IsRegExp takes argument
argument
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
argument
is not an Object
, return
false
2.
Let
matcher
be ?
Get
argument
@@match
).
3.
If
matcher
is not
undefined
, return
ToBoolean
matcher
).
4.
If
argument
has a [[RegExpMatcher]] internal slot, return
true
5.
Return
false
7.2.9
Static Semantics: IsStringWellFormedUnicode (
string
The abstract operation IsStringWellFormedUnicode takes argument
string
(a String) and returns a Boolean. It interprets
string
as a sequence of UTF-16 encoded code points, as described in
6.1.4
, and determines whether it is a
well formed
UTF-16 sequence. It performs the following steps when called:
1.
Let
len
be the length of
string
2.
Let
be 0.
3.
Repeat, while
len
a.
Let
cp
be
CodePointAt
string
).
b.
If
cp
.[[IsUnpairedSurrogate]] is
true
, return
false
c.
Set
to
cp
.[[CodeUnitCount]].
4.
Return
true
7.2.10
SameValue (
The abstract operation SameValue takes arguments
(an
ECMAScript language value
) and
(an
ECMAScript language value
and returns a Boolean. It determines whether or not the two arguments
are the same value. It performs the following steps when called:
1.
If
Type
) is not
Type
), return
false
2.
If
is a Number
, then
a.
Return
Number::sameValue
).
3.
Return
SameValueNonNumber
).
Note
This algorithm differs from the
IsStrictlyEqual
Algorithm by treating all
NaN
values as equivalent and by differentiating
+0
from
-0
7.2.11
SameValueZero (
The abstract operation SameValueZero takes arguments
(an
ECMAScript language value
) and
(an
ECMAScript language value
) and returns a Boolean. It determines whether or not the two arguments are the same value (ignoring the difference between
+0
and
-0
). It performs the following steps when called:
1.
If
Type
) is not
Type
), return
false
2.
If
is a Number
, then
a.
Return
Number::sameValueZero
).
3.
Return
SameValueNonNumber
).
Note
SameValueZero differs from
SameValue
only in that it treats
+0
and
-0
as equivalent.
7.2.12
SameValueNonNumber (
The abstract operation SameValueNonNumber takes arguments
(an
ECMAScript language value
, but not a Number) and
(an
ECMAScript language value
, but not a Number) and returns a Boolean. It performs the following steps when called:
1.
Assert
Type
) is
Type
).
2.
If
is either
null
or
undefined
, return
true
3.
If
is a BigInt
, then
a.
Return
BigInt::equal
).
4.
If
is a String
, then
a.
If
and
have the same length and the same code units in the same positions, return
true
; otherwise, return
false
5.
If
is a Boolean
, then
a.
If
and
are both
true
or both
false
, return
true
; otherwise, return
false
6.
NOTE: All other
ECMAScript language values
are compared by identity.
7.
If
is
, return
true
; otherwise, return
false
Note 1
For expository purposes, some cases are handled separately within this algorithm even if it is unnecessary to do so.
Note 2
The specifics of what "
is
" means are detailed in
5.2.7
7.2.13
IsLessThan (
LeftFirst
The abstract operation IsLessThan takes arguments
(an
ECMAScript language value
),
(an
ECMAScript language value
), and
LeftFirst
(a Boolean) and returns either a
normal completion containing
either a Boolean or
undefined
, or a
throw completion
. It provides the semantics for the comparison
, returning
true
false
, or
undefined
(which indicates that at least one operand is
NaN
). The
LeftFirst
flag is used to control the order in which operations with potentially visible side-effects are performed upon
and
. It is necessary because ECMAScript specifies left to right evaluation of expressions. If
LeftFirst
is
true
, the
parameter corresponds to an expression that occurs to the left of the
parameter's corresponding expression. If
LeftFirst
is
false
, the reverse is the case and operations must be performed upon
before
. It performs the following steps when called:
1.
If
LeftFirst
is
true
, then
a.
Let
px
be ?
ToPrimitive
number
).
b.
Let
py
be ?
ToPrimitive
number
).
2.
Else,
a.
NOTE: The order of evaluation needs to be reversed to preserve left to right evaluation.
b.
Let
py
be ?
ToPrimitive
number
).
c.
Let
px
be ?
ToPrimitive
number
).
3.
If
px
is a String
and
py
is a String
, then
a.
Let
lx
be the length of
px
b.
Let
ly
be the length of
py
c.
For each
integer
such that 0 ≤
min
lx
ly
), in ascending order, do
i.
Let
cx
be the numeric value of the code unit at index
within
px
ii.
Let
cy
be the numeric value of the code unit at index
within
py
iii.
If
cx
cy
, return
true
iv.
If
cx
cy
, return
false
d.
If
lx
ly
, return
true
. Otherwise, return
false
4.
Else,
a.
If
px
is a BigInt
and
py
is a String
, then
i.
Let
ny
be
StringToBigInt
py
).
ii.
If
ny
is
undefined
, return
undefined
iii.
Return
BigInt::lessThan
px
ny
).
b.
If
px
is a String
and
py
is a BigInt
, then
i.
Let
nx
be
StringToBigInt
px
).
ii.
If
nx
is
undefined
, return
undefined
iii.
Return
BigInt::lessThan
nx
py
).
c.
NOTE: Because
px
and
py
are primitive values, evaluation order is not important.
d.
Let
nx
be ?
ToNumeric
px
).
e.
Let
ny
be ?
ToNumeric
py
).
f.
If
Type
nx
) is
Type
ny
), then
i.
If
nx
is a Number
, then
1.
Return
Number::lessThan
nx
ny
).
ii.
Else,
1.
Assert
nx
is a BigInt
2.
Return
BigInt::lessThan
nx
ny
).
g.
Assert
nx
is a BigInt
and
ny
is a Number
, or
nx
is a Number
and
ny
is a BigInt
h.
If
nx
or
ny
is
NaN
, return
undefined
i.
If
nx
is
-∞
or
ny
is
+∞
, return
true
j.
If
nx
is
+∞
or
ny
is
-∞
, return
false
k.
If
nx
) <
ny
), return
true
; otherwise return
false
Note 1
Step
differs from step
1.c
in the algorithm that handles the addition operator
13.15.3
) by using the logical-and operation instead of the logical-or operation.
Note 2
The comparison of Strings uses a simple lexicographic
ordering on sequences of UTF-16 code unit values. There is no attempt to
use the more complex, semantically oriented definitions of character or
string equality and collating order defined in the Unicode
specification. Therefore String values that are canonically equal
according to the Unicode Standard but not in the same normalization form
could test as unequal. Also note that lexicographic ordering by
code unit
differs from ordering by
code point
for Strings containing
surrogate pairs
7.2.14
IsLooselyEqual (
The abstract operation IsLooselyEqual takes arguments
(an
ECMAScript language value
) and
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It provides the semantics for the
==
operator. It performs the following steps when called:
1.
If
Type
) is
Type
), then
a.
Return
IsStrictlyEqual
).
2.
If
is
null
and
is
undefined
, return
true
3.
If
is
undefined
and
is
null
, return
true
4.
NOTE: This step is replaced in section
B.3.6.2
5.
If
is a Number
and
is a String
, return !
IsLooselyEqual
, !
ToNumber
)).
6.
If
is a String
and
is a Number
, return !
IsLooselyEqual
(!
ToNumber
),
).
7.
If
is a BigInt
and
is a String
, then
a.
Let
be
StringToBigInt
).
b.
If
is
undefined
, return
false
c.
Return !
IsLooselyEqual
).
8.
If
is a String
and
is a BigInt
, return !
IsLooselyEqual
).
9.
If
is a Boolean
, return !
IsLooselyEqual
(!
ToNumber
),
).
10.
If
is a Boolean
, return !
IsLooselyEqual
, !
ToNumber
)).
11.
If
is either a String, a Number, a BigInt, or a Symbol and
is an Object
, return !
IsLooselyEqual
, ?
ToPrimitive
)).
12.
If
is an Object
and
is either a String, a Number, a BigInt, or a Symbol, return !
IsLooselyEqual
(?
ToPrimitive
),
).
13.
If
is a BigInt
and
is a Number
, or if
is a Number
and
is a BigInt
, then
a.
If
is not
finite
or
is not
finite
, return
false
b.
If
) =
), return
true
; otherwise return
false
14.
Return
false
7.2.15
IsStrictlyEqual (
The abstract operation IsStrictlyEqual takes arguments
(an
ECMAScript language value
) and
(an
ECMAScript language value
) and returns a Boolean. It provides the semantics for the
===
operator. It performs the following steps when called:
1.
If
Type
) is not
Type
), return
false
2.
If
is a Number
, then
a.
Return
Number::equal
).
3.
Return
SameValueNonNumber
).
Note
This algorithm differs from the
SameValue
Algorithm in its treatment of signed zeroes and NaNs.
7.3
Operations on Objects
7.3.1
MakeBasicObject (
internalSlotsList
The abstract operation MakeBasicObject takes argument
internalSlotsList
(a
List
of internal slot names) and returns an Object. It is the source of all
ECMAScript objects that are created algorithmically, including both
ordinary objects
and
exotic objects
It factors out common steps used in creating all objects, and
centralizes object creation. It performs the following steps when
called:
1.
Let
obj
be a newly created object with an internal slot for each name in
internalSlotsList
2.
Set
obj
's essential internal methods to the default
ordinary object
definitions specified in
10.1
3.
Assert
: If the caller will not be overriding both
obj
's [[GetPrototypeOf]] and [[SetPrototypeOf]] essential internal methods, then
internalSlotsList
contains [[Prototype]].
4.
Assert
: If the caller will not be overriding all of
obj
's [[SetPrototypeOf]], [[IsExtensible]], and [[PreventExtensions]] essential internal methods, then
internalSlotsList
contains [[Extensible]].
5.
If
internalSlotsList
contains [[Extensible]], set
obj
.[[Extensible]] to
true
6.
Return
obj
Note
Within this specification,
exotic objects
are created in
abstract operations
such as
ArrayCreate
and
BoundFunctionCreate
by first calling MakeBasicObject to obtain a basic, foundational
object, and then overriding some or all of that object's internal
methods. In order to encapsulate
exotic object
creation, the object's essential internal methods are never modified outside those operations.
7.3.2
Get (
The abstract operation Get takes arguments
(an Object) and
(a
property key
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It is used to retrieve the value of a specific property of an object. It performs the following steps when called:
1.
Return ?
.[[Get]]
).
7.3.3
GetV (
The abstract operation GetV takes arguments
(an
ECMAScript language value
) and
(a
property key
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It is used to retrieve the value of a specific property of an
ECMAScript language value
If the value is not an object, the property lookup is performed using a
wrapper object appropriate for the type of the value. It performs the
following steps when called:
1.
Let
be ?
ToObject
).
2.
Return ?
.[[Get]]
).
7.3.4
Set (
Throw
The abstract operation Set takes arguments
(an Object),
(a
property key
),
(an
ECMAScript language value
), and
Throw
(a Boolean) and returns either a
normal completion containing
unused
or a
throw completion
. It is used to set the value of a specific property of an object.
is the new value for the property. It performs the following steps when called:
1.
Let
success
be ?
.[[Set]]
).
2.
If
success
is
false
and
Throw
is
true
, throw a
TypeError
exception.
3.
Return
unused
7.3.5
CreateDataProperty (
The abstract operation CreateDataProperty takes arguments
(an Object),
(a
property key
), and
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It is used to create a new own property of an object. It performs the following steps when called:
1.
Let
newDesc
be the PropertyDescriptor { [[Value]]:
, [[Writable]]:
true
, [[Enumerable]]:
true
, [[Configurable]]:
true
}.
2.
Return ?
.[[DefineOwnProperty]]
newDesc
).
Note
This abstract operation creates a property whose attributes
are set to the same defaults used for properties created by the
ECMAScript language assignment operator. Normally, the property will not
already exist. If it does exist and is not configurable or if
is not extensible, [[DefineOwnProperty]] will return
false
7.3.6
CreateMethodProperty (
The abstract operation CreateMethodProperty takes arguments
(an Object),
(a
property key
), and
(an
ECMAScript language value
) and returns
unused
. It is used to create a new own property of an
ordinary object
. It performs the following steps when called:
1.
Assert
is an ordinary, extensible object with no non-configurable properties.
2.
Let
newDesc
be the PropertyDescriptor { [[Value]]:
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
3.
Perform !
DefinePropertyOrThrow
newDesc
).
4.
Return
unused
Note
This abstract operation creates a property whose attributes
are set to the same defaults used for built-in methods and methods
defined using class declaration syntax. Normally, the property will not
already exist. If it does exist,
DefinePropertyOrThrow
is guaranteed to complete normally.
7.3.7
CreateDataPropertyOrThrow (
The abstract operation CreateDataPropertyOrThrow takes arguments
(an Object),
(a
property key
), and
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or a
throw completion
. It is used to create a new own property of an object. It throws a
TypeError
exception if the requested property update cannot be performed. It performs the following steps when called:
1.
Let
success
be ?
CreateDataProperty
).
2.
If
success
is
false
, throw a
TypeError
exception.
3.
Return
unused
Note
This abstract operation creates a property whose attributes
are set to the same defaults used for properties created by the
ECMAScript language assignment operator. Normally, the property will not
already exist. If it does exist and is not configurable or if
is not extensible, [[DefineOwnProperty]] will return
false
causing this operation to throw a
TypeError
exception.
7.3.8
CreateNonEnumerableDataPropertyOrThrow (
The abstract operation CreateNonEnumerableDataPropertyOrThrow takes arguments
(an Object),
(a
property key
), and
(an
ECMAScript language value
) and returns
unused
. It is used to create a new non-enumerable own property of an
ordinary object
. It performs the following steps when called:
1.
Assert
is an ordinary, extensible object with no non-configurable properties.
2.
Let
newDesc
be the PropertyDescriptor { [[Value]]:
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
3.
Perform !
DefinePropertyOrThrow
newDesc
).
4.
Return
unused
Note
This abstract operation creates a property whose attributes
are set to the same defaults used for properties created by the
ECMAScript language assignment operator except it is not enumerable.
Normally, the property will not already exist. If it does exist,
DefinePropertyOrThrow
is guaranteed to complete normally.
7.3.9
DefinePropertyOrThrow (
desc
The abstract operation DefinePropertyOrThrow takes arguments
(an Object),
(a
property key
), and
desc
(a
Property Descriptor
) and returns either a
normal completion containing
unused
or a
throw completion
. It is used to call the [[DefineOwnProperty]] internal method of an object in a manner that will throw a
TypeError
exception if the requested property update cannot be performed. It performs the following steps when called:
1.
Let
success
be ?
.[[DefineOwnProperty]]
desc
).
2.
If
success
is
false
, throw a
TypeError
exception.
3.
Return
unused
7.3.10
DeletePropertyOrThrow (
The abstract operation DeletePropertyOrThrow takes arguments
(an Object) and
(a
property key
) and returns either a
normal completion containing
unused
or a
throw completion
It is used to remove a specific own property of an object. It throws an
exception if the property is not configurable. It performs the
following steps when called:
1.
Let
success
be ?
.[[Delete]]
).
2.
If
success
is
false
, throw a
TypeError
exception.
3.
Return
unused
7.3.11
GetMethod (
The abstract operation GetMethod takes arguments
(an
ECMAScript language value
) and
(a
property key
) and returns either a
normal completion containing
either a
function object
or
undefined
, or a
throw completion
. It is used to get the value of a specific property of an
ECMAScript language value
when the value of the property is expected to be a function. It performs the following steps when called:
1.
Let
func
be ?
GetV
).
2.
If
func
is either
undefined
or
null
, return
undefined
3.
If
IsCallable
func
) is
false
, throw a
TypeError
exception.
4.
Return
func
7.3.12
HasProperty (
The abstract operation HasProperty takes arguments
(an Object) and
(a
property key
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It is used to determine whether an object has a property with the specified
property key
. The property may be either own or inherited. It performs the following steps when called:
1.
Return ?
.[[HasProperty]]
).
7.3.13
HasOwnProperty (
The abstract operation HasOwnProperty takes arguments
(an Object) and
(a
property key
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It is used to determine whether an object has an own property with the specified
property key
. It performs the following steps when called:
1.
Let
desc
be ?
.[[GetOwnProperty]]
).
2.
If
desc
is
undefined
, return
false
3.
Return
true
7.3.14
Call (
[ ,
argumentsList
] )
The abstract operation Call takes arguments
(an
ECMAScript language value
) and
(an
ECMAScript language value
) and optional argument
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It is used to call the [[Call]] internal method of a
function object
is the
function object
is an
ECMAScript language value
that is the
this
value of the [[Call]], and
argumentsList
is the value passed to the corresponding argument of the internal method. If
argumentsList
is not present, a new empty
List
is used as its value. It performs the following steps when called:
1.
If
argumentsList
is not present, set
argumentsList
to a new empty
List
2.
If
IsCallable
) is
false
, throw a
TypeError
exception.
3.
Return ?
.[[Call]]
argumentsList
).
7.3.15
Construct (
[ ,
argumentsList
[ ,
newTarget
] ] )
The abstract operation Construct takes argument
(a
constructor
) and optional arguments
argumentsList
(a
List
of
ECMAScript language values
) and
newTarget
(a
constructor
) and returns either a
normal completion containing
an Object or a
throw completion
. It is used to call the [[Construct]] internal method of a
function object
argumentsList
and
newTarget
are the values to be passed as the corresponding arguments of the internal method. If
argumentsList
is not present, a new empty
List
is used as its value. If
newTarget
is not present,
is used as its value. It performs the following steps when called:
1.
If
newTarget
is not present, set
newTarget
to
2.
If
argumentsList
is not present, set
argumentsList
to a new empty
List
3.
Return ?
.[[Construct]]
argumentsList
newTarget
).
Note
If
newTarget
is not present, this operation is equivalent to:
new F(...argumentsList)
7.3.16
SetIntegrityLevel (
level
The abstract operation SetIntegrityLevel takes arguments
(an Object) and
level
sealed
or
frozen
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It is used to fix the set of own properties of an object. It performs the following steps when called:
1.
Let
status
be ?
.[[PreventExtensions]]().
2.
If
status
is
false
, return
false
3.
Let
keys
be ?
.[[OwnPropertyKeys]]().
4.
If
level
is
sealed
, then
a.
For each element
of
keys
, do
i.
Perform ?
DefinePropertyOrThrow
, PropertyDescriptor { [[Configurable]]:
false
}).
5.
Else,
a.
Assert
level
is
frozen
b.
For each element
of
keys
, do
i.
Let
currentDesc
be ?
.[[GetOwnProperty]]
).
ii.
If
currentDesc
is not
undefined
, then
1.
If
IsAccessorDescriptor
currentDesc
) is
true
, then
a.
Let
desc
be the PropertyDescriptor { [[Configurable]]:
false
}.
2.
Else,
a.
Let
desc
be the PropertyDescriptor { [[Configurable]]:
false
, [[Writable]]:
false
}.
3.
Perform ?
DefinePropertyOrThrow
desc
).
6.
Return
true
7.3.17
TestIntegrityLevel (
level
The abstract operation TestIntegrityLevel takes arguments
(an Object) and
level
sealed
or
frozen
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It is used to determine if the set of own properties of an object are fixed. It performs the following steps when called:
1.
Let
extensible
be ?
IsExtensible
).
2.
If
extensible
is
true
, return
false
3.
NOTE: If the object is extensible, none of its properties are examined.
4.
Let
keys
be ?
.[[OwnPropertyKeys]]().
5.
For each element
of
keys
, do
a.
Let
currentDesc
be ?
.[[GetOwnProperty]]
).
b.
If
currentDesc
is not
undefined
, then
i.
If
currentDesc
.[[Configurable]] is
true
, return
false
ii.
If
level
is
frozen
and
IsDataDescriptor
currentDesc
) is
true
, then
1.
If
currentDesc
.[[Writable]] is
true
, return
false
6.
Return
true
7.3.18
CreateArrayFromList (
elements
The abstract operation CreateArrayFromList takes argument
elements
(a
List
of
ECMAScript language values
) and returns an Array. It is used to create an Array whose elements are provided by
elements
. It performs the following steps when called:
1.
Let
array
be !
ArrayCreate
(0).
2.
Let
be 0.
3.
For each element
of
elements
, do
a.
Perform !
CreateDataPropertyOrThrow
array
, !
ToString
)),
).
b.
Set
to
+ 1.
4.
Return
array
7.3.19
LengthOfArrayLike (
obj
The abstract operation LengthOfArrayLike takes argument
obj
(an Object) and returns either a
normal completion containing
a non-negative
integer
or a
throw completion
. It returns the value of the
"length"
property of an array-like object. It performs the following steps when called:
1.
Return
(?
ToLength
(?
Get
obj
"length"
))).
An
array-like object
is any object for which this operation returns a
normal completion
Note 1
Typically, an array-like object would also have some properties with
integer index
names. However, that is not a requirement of this definition.
Note 2
Arrays and String objects are examples of array-like objects.
7.3.20
CreateListFromArrayLike (
obj
[ ,
elementTypes
] )
The abstract operation CreateListFromArrayLike takes argument
obj
(an
ECMAScript language value
) and optional argument
elementTypes
(a
List
of names of ECMAScript Language Types) and returns either a
normal completion containing
List
of
ECMAScript language values
or a
throw completion
. It is used to create a
List
value whose elements are provided by the indexed properties of
obj
elementTypes
contains the names of ECMAScript Language Types that are allowed for element values of the
List
that is created. It performs the following steps when called:
1.
If
elementTypes
is not present, set
elementTypes
to « Undefined, Null, Boolean, String, Symbol, Number, BigInt, Object ».
2.
If
obj
is not an Object
, throw a
TypeError
exception.
3.
Let
len
be ?
LengthOfArrayLike
obj
).
4.
Let
list
be a new empty
List
5.
Let
index
be 0.
6.
Repeat, while
index
len
a.
Let
indexName
be !
ToString
index
)).
b.
Let
next
be ?
Get
obj
indexName
).
c.
If
elementTypes
does not contain
Type
next
), throw a
TypeError
exception.
d.
Append
next
to
list
e.
Set
index
to
index
+ 1.
7.
Return
list
7.3.21
Invoke (
[ ,
argumentsList
] )
The abstract operation Invoke takes arguments
(an
ECMAScript language value
) and
(a
property key
) and optional argument
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It is used to call a method property of an
ECMAScript language value
serves as both the lookup point for the property and the
this
value of the call.
argumentsList
is the list of arguments values passed to the method. If
argumentsList
is not present, a new empty
List
is used as its value. It performs the following steps when called:
1.
If
argumentsList
is not present, set
argumentsList
to a new empty
List
2.
Let
func
be ?
GetV
).
3.
Return ?
Call
func
argumentsList
).
7.3.22
OrdinaryHasInstance (
The abstract operation OrdinaryHasInstance takes arguments
(an
ECMAScript language value
) and
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It implements the default algorithm for determining if
inherits from the instance object inheritance path provided by
. It performs the following steps when called:
1.
If
IsCallable
) is
false
, return
false
2.
If
has a [[BoundTargetFunction]] internal slot, then
a.
Let
BC
be
.[[BoundTargetFunction]].
b.
Return ?
InstanceofOperator
BC
).
3.
If
is not an Object
, return
false
4.
Let
be ?
Get
"prototype"
).
5.
If
is not an Object
, throw a
TypeError
exception.
6.
Repeat,
a.
Set
to ?
.[[GetPrototypeOf]]
().
b.
If
is
null
, return
false
c.
If
SameValue
) is
true
, return
true
7.3.23
SpeciesConstructor (
defaultConstructor
The abstract operation SpeciesConstructor takes arguments
(an Object) and
defaultConstructor
(a
constructor
) and returns either a
normal completion containing
constructor
or a
throw completion
. It is used to retrieve the
constructor
that should be used to create new objects that are derived from
defaultConstructor
is the
constructor
to use if a
constructor
@@species
property cannot be found starting from
. It performs the following steps when called:
1.
Let
be ?
Get
"constructor"
).
2.
If
is
undefined
, return
defaultConstructor
3.
If
is not an Object
, throw a
TypeError
exception.
4.
Let
be ?
Get
@@species
).
5.
If
is either
undefined
or
null
, return
defaultConstructor
6.
If
IsConstructor
) is
true
, return
7.
Throw a
TypeError
exception.
7.3.24
EnumerableOwnProperties (
kind
The abstract operation EnumerableOwnProperties takes arguments
(an Object) and
kind
key
value
, or
key+value
) and returns either a
normal completion containing
List
of
ECMAScript language values
or a
throw completion
. It performs the following steps when called:
1.
Let
ownKeys
be ?
.[[OwnPropertyKeys]]
().
2.
Let
results
be a new empty
List
3.
For each element
key
of
ownKeys
, do
a.
If
key
is a String
, then
i.
Let
desc
be ?
.[[GetOwnProperty]]
key
).
ii.
If
desc
is not
undefined
and
desc
.[[Enumerable]] is
true
, then
1.
If
kind
is
key
, append
key
to
results
2.
Else,
a.
Let
value
be ?
Get
key
).
b.
If
kind
is
value
, append
value
to
results
c.
Else,
i.
Assert
kind
is
key+value
ii.
Let
entry
be
CreateArrayFromList

key
value
»).
iii.
Append
entry
to
results
4.
Return
results
7.3.25
GetFunctionRealm (
obj
The abstract operation GetFunctionRealm takes argument
obj
(a
function object
) and returns either a
normal completion containing
Realm Record
or a
throw completion
. It performs the following steps when called:
1.
If
obj
has a [[Realm]] internal slot, then
a.
Return
obj
.[[Realm]].
2.
If
obj
is a
bound function exotic object
, then
a.
Let
boundTargetFunction
be
obj
.[[BoundTargetFunction]].
b.
Return ?
GetFunctionRealm
boundTargetFunction
).
3.
If
obj
is a
Proxy exotic object
, then
a.
Perform ?
ValidateNonRevokedProxy
obj
).
b.
Let
proxyTarget
be
obj
.[[ProxyTarget]].
c.
Return ?
GetFunctionRealm
proxyTarget
).
4.
Return
the current Realm Record
Note
Step
will only be reached if
obj
is a non-standard function
exotic object
that does not have a [[Realm]] internal slot.
7.3.26
CopyDataProperties (
target
source
excludedItems
The abstract operation CopyDataProperties takes arguments
target
(an Object),
source
(an
ECMAScript language value
), and
excludedItems
(a
List
of
property keys
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
If
source
is either
undefined
or
null
, return
unused
2.
Let
from
be !
ToObject
source
).
3.
Let
keys
be ?
from
.[[OwnPropertyKeys]]
().
4.
For each element
nextKey
of
keys
, do
a.
Let
excluded
be
false
b.
For each element
of
excludedItems
, do
i.
If
SameValue
nextKey
) is
true
, then
1.
Set
excluded
to
true
c.
If
excluded
is
false
, then
i.
Let
desc
be ?
from
.[[GetOwnProperty]]
nextKey
).
ii.
If
desc
is not
undefined
and
desc
.[[Enumerable]] is
true
, then
1.
Let
propValue
be ?
Get
from
nextKey
).
2.
Perform !
CreateDataPropertyOrThrow
target
nextKey
propValue
).
5.
Return
unused
Note
The target passed in here is always a newly created object which is not directly accessible in case of an error being thrown.
7.3.27
PrivateElementFind (
The abstract operation PrivateElementFind takes arguments
(an Object) and
(a
Private Name
) and returns a
PrivateElement
or
empty
. It performs the following steps when called:
1.
If
.[[PrivateElements]] contains a
PrivateElement
pe
such that
pe
.[[Key]] is
, then
a.
Return
pe
2.
Return
empty
7.3.28
PrivateFieldAdd (
value
The abstract operation PrivateFieldAdd takes arguments
(an Object),
(a
Private Name
), and
value
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
If the
host
is a web browser, then
a.
Perform ?
HostEnsureCanAddPrivateElement
).
2.
Let
entry
be
PrivateElementFind
).
3.
If
entry
is not
empty
, throw a
TypeError
exception.
4.
Append
PrivateElement
{ [[Key]]:
, [[Kind]]:
field
, [[Value]]:
value
} to
.[[PrivateElements]].
5.
Return
unused
7.3.29
PrivateMethodOrAccessorAdd (
method
The abstract operation PrivateMethodOrAccessorAdd takes arguments
(an Object) and
method
(a
PrivateElement
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Assert
method
.[[Kind]] is either
method
or
accessor
2.
If the
host
is a web browser, then
a.
Perform ?
HostEnsureCanAddPrivateElement
).
3.
Let
entry
be
PrivateElementFind
method
.[[Key]]).
4.
If
entry
is not
empty
, throw a
TypeError
exception.
5.
Append
method
to
.[[PrivateElements]].
6.
Return
unused
Note
The values for private methods and accessors are shared
across instances. This operation does not create a new copy of the
method or accessor.
7.3.30
HostEnsureCanAddPrivateElement (
The
host-defined
abstract operation HostEnsureCanAddPrivateElement takes argument
(an Object) and returns either a
normal completion containing
unused
or a
throw completion
. It allows
host environments
to prevent the addition of private elements to particular
host-defined
exotic objects
An implementation of HostEnsureCanAddPrivateElement must conform to the following requirements:
If
is not a
host-defined
exotic object
, this abstract operation must return
NormalCompletion
unused
) and perform no other steps.
Any two calls of this abstract operation with the same argument must return the same kind of
Completion Record
The default implementation of HostEnsureCanAddPrivateElement is to return
NormalCompletion
unused
).
This abstract operation is only invoked by ECMAScript
hosts
that are web browsers.
7.3.31
PrivateGet (
The abstract operation PrivateGet takes arguments
(an Object) and
(a
Private Name
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
entry
be
PrivateElementFind
).
2.
If
entry
is
empty
, throw a
TypeError
exception.
3.
If
entry
.[[Kind]] is either
field
or
method
, then
a.
Return
entry
.[[Value]].
4.
Assert
entry
.[[Kind]] is
accessor
5.
If
entry
.[[Get]] is
undefined
, throw a
TypeError
exception.
6.
Let
getter
be
entry
.[[Get]].
7.
Return ?
Call
getter
).
7.3.32
PrivateSet (
value
The abstract operation PrivateSet takes arguments
(an Object),
(a
Private Name
), and
value
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
entry
be
PrivateElementFind
).
2.
If
entry
is
empty
, throw a
TypeError
exception.
3.
If
entry
.[[Kind]] is
field
, then
a.
Set
entry
.[[Value]] to
value
4.
Else if
entry
.[[Kind]] is
method
, then
a.
Throw a
TypeError
exception.
5.
Else,
a.
Assert
entry
.[[Kind]] is
accessor
b.
If
entry
.[[Set]] is
undefined
, throw a
TypeError
exception.
c.
Let
setter
be
entry
.[[Set]].
d.
Perform ?
Call
setter
, «
value
»).
6.
Return
unused
7.3.33
DefineField (
receiver
fieldRecord
The abstract operation DefineField takes arguments
receiver
(an Object) and
fieldRecord
(a
ClassFieldDefinition Record
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
fieldName
be
fieldRecord
.[[Name]].
2.
Let
initializer
be
fieldRecord
.[[Initializer]].
3.
If
initializer
is not
empty
, then
a.
Let
initValue
be ?
Call
initializer
receiver
).
4.
Else, let
initValue
be
undefined
5.
If
fieldName
is a
Private Name
, then
a.
Perform ?
PrivateFieldAdd
receiver
fieldName
initValue
).
6.
Else,
a.
Assert
IsPropertyKey
fieldName
) is
true
b.
Perform ?
CreateDataPropertyOrThrow
receiver
fieldName
initValue
).
7.
Return
unused
7.3.34
InitializeInstanceElements (
constructor
The abstract operation InitializeInstanceElements takes arguments
(an Object) and
constructor
(an ECMAScript
function object
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
methods
be the value of
constructor
.[[PrivateMethods]].
2.
For each
PrivateElement
method
of
methods
, do
a.
Perform ?
PrivateMethodOrAccessorAdd
method
).
3.
Let
fields
be the value of
constructor
.[[Fields]].
4.
For each element
fieldRecord
of
fields
, do
a.
Perform ?
DefineField
fieldRecord
).
5.
Return
unused
7.4
Operations on Iterator Objects
See Common Iteration Interfaces (
27.1
).
7.4.1
Iterator Records
An
Iterator Record
is a
Record
value used to encapsulate an Iterator or AsyncIterator along with the
next
method.
Iterator Records have the fields listed in
Table 15
Table 15:
Iterator Record
Fields
Field Name
Value
Meaning
[[Iterator]]
an Object
An object that conforms to the
Iterator
or
AsyncIterator
interface.
[[NextMethod]]
function object
The
next
method of the [[Iterator]] object.
[[Done]]
a Boolean
Whether the iterator has been closed.
7.4.2
GetIteratorFromMethod (
obj
method
The abstract operation GetIteratorFromMethod takes arguments
obj
(an
ECMAScript language value
) and
method
(a
function object
) and returns either a
normal completion containing
an
Iterator Record
or a
throw completion
. It performs the following steps when called:
1.
Let
iterator
be ?
Call
method
obj
).
2.
If
iterator
is not an Object
, throw a
TypeError
exception.
3.
Let
nextMethod
be ?
GetV
iterator
"next"
).
4.
Let
iteratorRecord
be the
Iterator Record
{ [[Iterator]]:
iterator
, [[NextMethod]]:
nextMethod
, [[Done]]:
false
}.
5.
Return
iteratorRecord
7.4.3
GetIterator (
obj
kind
The abstract operation GetIterator takes arguments
obj
(an
ECMAScript language value
) and
kind
sync
or
async
) and returns either a
normal completion containing
an
Iterator Record
or a
throw completion
. It performs the following steps when called:
1.
If
kind
is
async
, then
a.
Let
method
be ?
GetMethod
obj
@@asyncIterator
).
b.
If
method
is
undefined
, then
i.
Let
syncMethod
be ?
GetMethod
obj
@@iterator
).
ii.
If
syncMethod
is
undefined
, throw a
TypeError
exception.
iii.
Let
syncIteratorRecord
be ?
GetIteratorFromMethod
obj
syncMethod
).
iv.
Return
CreateAsyncFromSyncIterator
syncIteratorRecord
).
2.
Otherwise, let
method
be ?
GetMethod
obj
@@iterator
).
3.
If
method
is
undefined
, throw a
TypeError
exception.
4.
Return ?
GetIteratorFromMethod
obj
method
).
7.4.4
IteratorNext (
iteratorRecord
[ ,
value
] )
The abstract operation IteratorNext takes argument
iteratorRecord
(an
Iterator Record
) and optional argument
value
(an
ECMAScript language value
) and returns either a
normal completion containing
an Object or a
throw completion
. It performs the following steps when called:
1.
If
value
is not present, then
a.
Let
result
be ?
Call
iteratorRecord
.[[NextMethod]],
iteratorRecord
.[[Iterator]]).
2.
Else,
a.
Let
result
be ?
Call
iteratorRecord
.[[NextMethod]],
iteratorRecord
.[[Iterator]], «
value
»).
3.
If
result
is not an Object
, throw a
TypeError
exception.
4.
Return
result
7.4.5
IteratorComplete (
iterResult
The abstract operation IteratorComplete takes argument
iterResult
(an Object) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Return
ToBoolean
(?
Get
iterResult
"done"
)).
7.4.6
IteratorValue (
iterResult
The abstract operation IteratorValue takes argument
iterResult
(an Object) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Return ?
Get
iterResult
"value"
).
7.4.7
IteratorStep (
iteratorRecord
The abstract operation IteratorStep takes argument
iteratorRecord
(an
Iterator Record
) and returns either a
normal completion containing
either an Object or
false
, or a
throw completion
. It requests the next value from
iteratorRecord
.[[Iterator]] by calling
iteratorRecord
.[[NextMethod]] and returns either
false
indicating that the iterator has reached its end or the IteratorResult
object if a next value is available. It performs the following steps
when called:
1.
Let
result
be ?
IteratorNext
iteratorRecord
).
2.
Let
done
be ?
IteratorComplete
result
).
3.
If
done
is
true
, return
false
4.
Return
result
7.4.8
IteratorClose (
iteratorRecord
completion
The abstract operation IteratorClose takes arguments
iteratorRecord
(an
Iterator Record
) and
completion
(a
Completion Record
) and returns a
Completion Record
It is used to notify an iterator that it should perform any actions it
would normally perform when it has reached its completed state. It
performs the following steps when called:
1.
Assert
iteratorRecord
.[[Iterator]]
is an Object
2.
Let
iterator
be
iteratorRecord
.[[Iterator]].
3.
Let
innerResult
be
Completion
GetMethod
iterator
"return"
)).
4.
If
innerResult
.[[Type]] is
normal
, then
a.
Let
return
be
innerResult
.[[Value]].
b.
If
return
is
undefined
, return ?
completion
c.
Set
innerResult
to
Completion
Call
return
iterator
)).
5.
If
completion
.[[Type]] is
throw
, return ?
completion
6.
If
innerResult
.[[Type]] is
throw
, return ?
innerResult
7.
If
innerResult
.[[Value]]
is not an Object
, throw a
TypeError
exception.
8.
Return ?
completion
7.4.9
IfAbruptCloseIterator (
value
iteratorRecord
IfAbruptCloseIterator is a shorthand for a sequence of algorithm steps that use an
Iterator Record
. An algorithm step of the form:
1.
IfAbruptCloseIterator
value
iteratorRecord
).
means the same thing as:
1.
Assert
value
is a
Completion Record
2.
If
value
is an
abrupt completion
, return ?
IteratorClose
iteratorRecord
value
).
3.
Else, set
value
to
value
.[[Value]].
7.4.10
AsyncIteratorClose (
iteratorRecord
completion
The abstract operation AsyncIteratorClose takes arguments
iteratorRecord
(an
Iterator Record
) and
completion
(a
Completion Record
) and returns a
Completion Record
It is used to notify an async iterator that it should perform any
actions it would normally perform when it has reached its completed
state. It performs the following steps when called:
1.
Assert
iteratorRecord
.[[Iterator]]
is an Object
2.
Let
iterator
be
iteratorRecord
.[[Iterator]].
3.
Let
innerResult
be
Completion
GetMethod
iterator
"return"
)).
4.
If
innerResult
.[[Type]] is
normal
, then
a.
Let
return
be
innerResult
.[[Value]].
b.
If
return
is
undefined
, return ?
completion
c.
Set
innerResult
to
Completion
Call
return
iterator
)).
d.
If
innerResult
.[[Type]] is
normal
, set
innerResult
to
Completion
Await
innerResult
.[[Value]])).
5.
If
completion
.[[Type]] is
throw
, return ?
completion
6.
If
innerResult
.[[Type]] is
throw
, return ?
innerResult
7.
If
innerResult
.[[Value]]
is not an Object
, throw a
TypeError
exception.
8.
Return ?
completion
7.4.11
CreateIterResultObject (
value
done
The abstract operation CreateIterResultObject takes arguments
value
(an
ECMAScript language value
) and
done
(a Boolean) and returns an Object that conforms to the
IteratorResult
interface. It creates an object that conforms to the
IteratorResult
interface. It performs the following steps when called:
1.
Let
obj
be
OrdinaryObjectCreate
%Object.prototype%
).
2.
Perform !
CreateDataPropertyOrThrow
obj
"value"
value
).
3.
Perform !
CreateDataPropertyOrThrow
obj
"done"
done
).
4.
Return
obj
7.4.12
CreateListIteratorRecord (
list
The abstract operation CreateListIteratorRecord takes argument
list
(a
List
of
ECMAScript language values
) and returns an
Iterator Record
. It creates an Iterator (
27.1.1.2
) object record whose
next
method returns the successive elements of
list
. It performs the following steps when called:
1.
Let
closure
be a new
Abstract Closure
with no parameters that captures
list
and performs the following steps when called:
a.
For each element
of
list
, do
i.
Perform ?
GeneratorYield
CreateIterResultObject
false
)).
b.
Return
NormalCompletion
undefined
).
2.
Let
iterator
be
CreateIteratorFromClosure
closure
empty
%IteratorPrototype%
).
3.
Return the
Iterator Record
{ [[Iterator]]:
iterator
, [[NextMethod]]: %GeneratorFunction.prototype.prototype.next%, [[Done]]:
false
}.
Note
The list iterator object is never directly accessible to ECMAScript code.
7.4.13
IteratorToList (
iteratorRecord
The abstract operation IteratorToList takes argument
iteratorRecord
(an
Iterator Record
) and returns either a
normal completion containing
List
of
ECMAScript language values
or a
throw completion
. It performs the following steps when called:
1.
Let
values
be a new empty
List
2.
Let
next
be
true
3.
Repeat, while
next
is not
false
a.
Set
next
to ?
IteratorStep
iteratorRecord
).
b.
If
next
is not
false
, then
i.
Let
nextValue
be ?
IteratorValue
next
).
ii.
Append
nextValue
to
values
4.
Return
values
Syntax-Directed Operations
In addition to those defined in this section, specialized
syntax-directed operations
are defined throughout this specification.
8.1
Runtime Semantics: Evaluation
The
syntax-directed operation
Evaluation takes no arguments and returns a
Completion Record
Note
The definitions for this operation are distributed over the
"ECMAScript Language" sections of this specification. Each definition
appears after the defining occurrence of the relevant productions.
8.2
Scope Analysis
8.2.1
Static Semantics: BoundNames
The
syntax-directed operation
BoundNames takes no arguments and returns a
List
of Strings.
Note
"*default*"
is used within this
specification as a synthetic name for a module's default export when it
does not have another name. An entry in the module's [[Environment]] is
created with that name and holds the corresponding value, and resolving
the export named
"default"
by calling
ResolveExport (
exportName
[ ,
resolveSet
] )
for the module will return a
ResolvedBinding Record
whose [[BindingName]] is
"*default*"
which will then resolve in the module's [[Environment]] to the
above-mentioned value. This is done only for ease of specification, so
that anonymous default exports can be resolved like any other export.
This
"*default*"
string is never accessible to ECMAScript code or to the module linking algorithm.
It is defined piecewise over the following productions:
BindingIdentifier
Identifier
1.
Return a
List
whose sole element is the
StringValue
of
Identifier
BindingIdentifier
yield
1.
Return «
"yield"
».
BindingIdentifier
await
1.
Return «
"await"
».
LexicalDeclaration
LetOrConst
BindingList
1.
Return the
BoundNames
of
BindingList
BindingList
BindingList
LexicalBinding
1.
Let
names1
be the
BoundNames
of
BindingList
2.
Let
names2
be the
BoundNames
of
LexicalBinding
3.
Return the
list-concatenation
of
names1
and
names2
LexicalBinding
BindingIdentifier
Initializer
opt
1.
Return the
BoundNames
of
BindingIdentifier
LexicalBinding
BindingPattern
Initializer
1.
Return the
BoundNames
of
BindingPattern
VariableDeclarationList
VariableDeclarationList
VariableDeclaration
1.
Let
names1
be
BoundNames
of
VariableDeclarationList
2.
Let
names2
be
BoundNames
of
VariableDeclaration
3.
Return the
list-concatenation
of
names1
and
names2
VariableDeclaration
BindingIdentifier
Initializer
opt
1.
Return the
BoundNames
of
BindingIdentifier
VariableDeclaration
BindingPattern
Initializer
1.
Return the
BoundNames
of
BindingPattern
ObjectBindingPattern
1.
Return a new empty
List
ObjectBindingPattern
BindingPropertyList
BindingRestProperty
1.
Let
names1
be
BoundNames
of
BindingPropertyList
2.
Let
names2
be
BoundNames
of
BindingRestProperty
3.
Return the
list-concatenation
of
names1
and
names2
ArrayBindingPattern
Elision
opt
1.
Return a new empty
List
ArrayBindingPattern
Elision
opt
BindingRestElement
1.
Return the
BoundNames
of
BindingRestElement
ArrayBindingPattern
BindingElementList
Elision
opt
1.
Return the
BoundNames
of
BindingElementList
ArrayBindingPattern
BindingElementList
Elision
opt
BindingRestElement
1.
Let
names1
be
BoundNames
of
BindingElementList
2.
Let
names2
be
BoundNames
of
BindingRestElement
3.
Return the
list-concatenation
of
names1
and
names2
BindingPropertyList
BindingPropertyList
BindingProperty
1.
Let
names1
be
BoundNames
of
BindingPropertyList
2.
Let
names2
be
BoundNames
of
BindingProperty
3.
Return the
list-concatenation
of
names1
and
names2
BindingElementList
BindingElementList
BindingElisionElement
1.
Let
names1
be
BoundNames
of
BindingElementList
2.
Let
names2
be
BoundNames
of
BindingElisionElement
3.
Return the
list-concatenation
of
names1
and
names2
BindingElisionElement
Elision
opt
BindingElement
1.
Return
BoundNames
of
BindingElement
BindingProperty
PropertyName
BindingElement
1.
Return the
BoundNames
of
BindingElement
SingleNameBinding
BindingIdentifier
Initializer
opt
1.
Return the
BoundNames
of
BindingIdentifier
BindingElement
BindingPattern
Initializer
opt
1.
Return the
BoundNames
of
BindingPattern
ForDeclaration
LetOrConst
ForBinding
1.
Return the
BoundNames
of
ForBinding
FunctionDeclaration
function
BindingIdentifier
FormalParameters
FunctionBody
1.
Return the
BoundNames
of
BindingIdentifier
FunctionDeclaration
function
FormalParameters
FunctionBody
1.
Return «
"*default*"
».
FormalParameters
[empty]
1.
Return a new empty
List
FormalParameters
FormalParameterList
FunctionRestParameter
1.
Let
names1
be
BoundNames
of
FormalParameterList
2.
Let
names2
be
BoundNames
of
FunctionRestParameter
3.
Return the
list-concatenation
of
names1
and
names2
FormalParameterList
FormalParameterList
FormalParameter
1.
Let
names1
be
BoundNames
of
FormalParameterList
2.
Let
names2
be
BoundNames
of
FormalParameter
3.
Return the
list-concatenation
of
names1
and
names2
ArrowParameters
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
formals
be the
ArrowFormalParameters
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return the
BoundNames
of
formals
GeneratorDeclaration
function
BindingIdentifier
FormalParameters
GeneratorBody
1.
Return the
BoundNames
of
BindingIdentifier
GeneratorDeclaration
function
FormalParameters
GeneratorBody
1.
Return «
"*default*"
».
AsyncGeneratorDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncGeneratorBody
1.
Return the
BoundNames
of
BindingIdentifier
AsyncGeneratorDeclaration
async
function
FormalParameters
AsyncGeneratorBody
1.
Return «
"*default*"
».
ClassDeclaration
class
BindingIdentifier
ClassTail
1.
Return the
BoundNames
of
BindingIdentifier
ClassDeclaration
class
ClassTail
1.
Return «
"*default*"
».
AsyncFunctionDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncFunctionBody
1.
Return the
BoundNames
of
BindingIdentifier
AsyncFunctionDeclaration
async
function
FormalParameters
AsyncFunctionBody
1.
Return «
"*default*"
».
CoverCallExpressionAndAsyncArrowHead
MemberExpression
Arguments
1.
Let
head
be the
AsyncArrowHead
that is
covered
by
CoverCallExpressionAndAsyncArrowHead
2.
Return the
BoundNames
of
head
ImportDeclaration
import
ImportClause
FromClause
1.
Return the
BoundNames
of
ImportClause
ImportDeclaration
import
ModuleSpecifier
1.
Return a new empty
List
ImportClause
ImportedDefaultBinding
NameSpaceImport
1.
Let
names1
be the
BoundNames
of
ImportedDefaultBinding
2.
Let
names2
be the
BoundNames
of
NameSpaceImport
3.
Return the
list-concatenation
of
names1
and
names2
ImportClause
ImportedDefaultBinding
NamedImports
1.
Let
names1
be the
BoundNames
of
ImportedDefaultBinding
2.
Let
names2
be the
BoundNames
of
NamedImports
3.
Return the
list-concatenation
of
names1
and
names2
NamedImports
1.
Return a new empty
List
ImportsList
ImportsList
ImportSpecifier
1.
Let
names1
be the
BoundNames
of
ImportsList
2.
Let
names2
be the
BoundNames
of
ImportSpecifier
3.
Return the
list-concatenation
of
names1
and
names2
ImportSpecifier
ModuleExportName
as
ImportedBinding
1.
Return the
BoundNames
of
ImportedBinding
ExportDeclaration
export
ExportFromClause
FromClause
export
NamedExports
1.
Return a new empty
List
ExportDeclaration
export
VariableStatement
1.
Return the
BoundNames
of
VariableStatement
ExportDeclaration
export
Declaration
1.
Return the
BoundNames
of
Declaration
ExportDeclaration
export
default
HoistableDeclaration
1.
Let
declarationNames
be the
BoundNames
of
HoistableDeclaration
2.
If
declarationNames
does not include the element
"*default*"
, append
"*default*"
to
declarationNames
3.
Return
declarationNames
ExportDeclaration
export
default
ClassDeclaration
1.
Let
declarationNames
be the
BoundNames
of
ClassDeclaration
2.
If
declarationNames
does not include the element
"*default*"
, append
"*default*"
to
declarationNames
3.
Return
declarationNames
ExportDeclaration
export
default
AssignmentExpression
1.
Return «
"*default*"
».
8.2.2
Static Semantics: DeclarationPart
The
syntax-directed operation
DeclarationPart takes no arguments and returns a
Parse Node
. It is defined piecewise over the following productions:
HoistableDeclaration
FunctionDeclaration
1.
Return
FunctionDeclaration
HoistableDeclaration
GeneratorDeclaration
1.
Return
GeneratorDeclaration
HoistableDeclaration
AsyncFunctionDeclaration
1.
Return
AsyncFunctionDeclaration
HoistableDeclaration
AsyncGeneratorDeclaration
1.
Return
AsyncGeneratorDeclaration
Declaration
ClassDeclaration
1.
Return
ClassDeclaration
Declaration
LexicalDeclaration
1.
Return
LexicalDeclaration
8.2.3
Static Semantics: IsConstantDeclaration
The
syntax-directed operation
IsConstantDeclaration takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
LexicalDeclaration
LetOrConst
BindingList
1.
Return
IsConstantDeclaration
of
LetOrConst
LetOrConst
let
1.
Return
false
LetOrConst
const
1.
Return
true
FunctionDeclaration
function
BindingIdentifier
FormalParameters
FunctionBody
function
FormalParameters
FunctionBody
GeneratorDeclaration
function
BindingIdentifier
FormalParameters
GeneratorBody
function
FormalParameters
GeneratorBody
AsyncGeneratorDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncGeneratorBody
async
function
FormalParameters
AsyncGeneratorBody
AsyncFunctionDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncFunctionBody
async
function
FormalParameters
AsyncFunctionBody
1.
Return
false
ClassDeclaration
class
BindingIdentifier
ClassTail
class
ClassTail
1.
Return
false
ExportDeclaration
export
ExportFromClause
FromClause
export
NamedExports
export
default
AssignmentExpression
1.
Return
false
Note
It is not necessary to treat
export default
AssignmentExpression
as a constant declaration because there is no syntax that permits
assignment to the internal bound name used to reference a module's
default object.
8.2.4
Static Semantics: LexicallyDeclaredNames
The
syntax-directed operation
LexicallyDeclaredNames takes no arguments and returns a
List
of Strings. It is defined piecewise over the following productions:
Block
1.
Return a new empty
List
StatementList
StatementList
StatementListItem
1.
Let
names1
be
LexicallyDeclaredNames
of
StatementList
2.
Let
names2
be
LexicallyDeclaredNames
of
StatementListItem
3.
Return the
list-concatenation
of
names1
and
names2
StatementListItem
Statement
1.
If
Statement
is
Statement
LabelledStatement
, return
LexicallyDeclaredNames
of
LabelledStatement
2.
Return a new empty
List
StatementListItem
Declaration
1.
Return the
BoundNames
of
Declaration
CaseBlock
1.
Return a new empty
List
CaseBlock
CaseClauses
opt
DefaultClause
CaseClauses
opt
1.
If the first
CaseClauses
is present, let
names1
be the
LexicallyDeclaredNames
of the first
CaseClauses
2.
Else, let
names1
be a new empty
List
3.
Let
names2
be
LexicallyDeclaredNames
of
DefaultClause
4.
If the second
CaseClauses
is present, let
names3
be the
LexicallyDeclaredNames
of the second
CaseClauses
5.
Else, let
names3
be a new empty
List
6.
Return the
list-concatenation
of
names1
names2
, and
names3
CaseClauses
CaseClauses
CaseClause
1.
Let
names1
be
LexicallyDeclaredNames
of
CaseClauses
2.
Let
names2
be
LexicallyDeclaredNames
of
CaseClause
3.
Return the
list-concatenation
of
names1
and
names2
CaseClause
case
Expression
StatementList
opt
1.
If the
StatementList
is present, return the
LexicallyDeclaredNames
of
StatementList
2.
Return a new empty
List
DefaultClause
default
StatementList
opt
1.
If the
StatementList
is present, return the
LexicallyDeclaredNames
of
StatementList
2.
Return a new empty
List
LabelledStatement
LabelIdentifier
LabelledItem
1.
Return the
LexicallyDeclaredNames
of
LabelledItem
LabelledItem
Statement
1.
Return a new empty
List
LabelledItem
FunctionDeclaration
1.
Return
BoundNames
of
FunctionDeclaration
FunctionStatementList
[empty]
1.
Return a new empty
List
FunctionStatementList
StatementList
1.
Return
TopLevelLexicallyDeclaredNames
of
StatementList
ClassStaticBlockStatementList
[empty]
1.
Return a new empty
List
ClassStaticBlockStatementList
StatementList
1.
Return the
TopLevelLexicallyDeclaredNames
of
StatementList
ConciseBody
ExpressionBody
1.
Return a new empty
List
AsyncConciseBody
ExpressionBody
1.
Return a new empty
List
Script
[empty]
1.
Return a new empty
List
ScriptBody
StatementList
1.
Return
TopLevelLexicallyDeclaredNames
of
StatementList
Note 1
At the top level of a
Script
, function declarations are treated like var declarations rather than like lexical declarations.
Note 2
The LexicallyDeclaredNames of a
Module
includes the names of all of its imported bindings.
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
names1
be
LexicallyDeclaredNames
of
ModuleItemList
2.
Let
names2
be
LexicallyDeclaredNames
of
ModuleItem
3.
Return the
list-concatenation
of
names1
and
names2
ModuleItem
ImportDeclaration
1.
Return the
BoundNames
of
ImportDeclaration
ModuleItem
ExportDeclaration
1.
If
ExportDeclaration
is
export
VariableStatement
, return a new empty
List
2.
Return the
BoundNames
of
ExportDeclaration
ModuleItem
StatementListItem
1.
Return
LexicallyDeclaredNames
of
StatementListItem
Note 3
At the top level of a
Module
, function declarations are treated like lexical declarations rather than like var declarations.
8.2.5
Static Semantics: LexicallyScopedDeclarations
The
syntax-directed operation
LexicallyScopedDeclarations takes no arguments and returns a
List
of
Parse Nodes
. It is defined piecewise over the following productions:
StatementList
StatementList
StatementListItem
1.
Let
declarations1
be
LexicallyScopedDeclarations
of
StatementList
2.
Let
declarations2
be
LexicallyScopedDeclarations
of
StatementListItem
3.
Return the
list-concatenation
of
declarations1
and
declarations2
StatementListItem
Statement
1.
If
Statement
is
Statement
LabelledStatement
, return
LexicallyScopedDeclarations
of
LabelledStatement
2.
Return a new empty
List
StatementListItem
Declaration
1.
Return a
List
whose sole element is
DeclarationPart
of
Declaration
CaseBlock
1.
Return a new empty
List
CaseBlock
CaseClauses
opt
DefaultClause
CaseClauses
opt
1.
If the first
CaseClauses
is present, let
declarations1
be the
LexicallyScopedDeclarations
of the first
CaseClauses
2.
Else, let
declarations1
be a new empty
List
3.
Let
declarations2
be
LexicallyScopedDeclarations
of
DefaultClause
4.
If the second
CaseClauses
is present, let
declarations3
be the
LexicallyScopedDeclarations
of the second
CaseClauses
5.
Else, let
declarations3
be a new empty
List
6.
Return the
list-concatenation
of
declarations1
declarations2
, and
declarations3
CaseClauses
CaseClauses
CaseClause
1.
Let
declarations1
be
LexicallyScopedDeclarations
of
CaseClauses
2.
Let
declarations2
be
LexicallyScopedDeclarations
of
CaseClause
3.
Return the
list-concatenation
of
declarations1
and
declarations2
CaseClause
case
Expression
StatementList
opt
1.
If the
StatementList
is present, return the
LexicallyScopedDeclarations
of
StatementList
2.
Return a new empty
List
DefaultClause
default
StatementList
opt
1.
If the
StatementList
is present, return the
LexicallyScopedDeclarations
of
StatementList
2.
Return a new empty
List
LabelledStatement
LabelIdentifier
LabelledItem
1.
Return the
LexicallyScopedDeclarations
of
LabelledItem
LabelledItem
Statement
1.
Return a new empty
List
LabelledItem
FunctionDeclaration
1.
Return «
FunctionDeclaration
».
FunctionStatementList
[empty]
1.
Return a new empty
List
FunctionStatementList
StatementList
1.
Return the
TopLevelLexicallyScopedDeclarations
of
StatementList
ClassStaticBlockStatementList
[empty]
1.
Return a new empty
List
ClassStaticBlockStatementList
StatementList
1.
Return the
TopLevelLexicallyScopedDeclarations
of
StatementList
ConciseBody
ExpressionBody
1.
Return a new empty
List
AsyncConciseBody
ExpressionBody
1.
Return a new empty
List
Script
[empty]
1.
Return a new empty
List
ScriptBody
StatementList
1.
Return
TopLevelLexicallyScopedDeclarations
of
StatementList
Module
[empty]
1.
Return a new empty
List
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
declarations1
be
LexicallyScopedDeclarations
of
ModuleItemList
2.
Let
declarations2
be
LexicallyScopedDeclarations
of
ModuleItem
3.
Return the
list-concatenation
of
declarations1
and
declarations2
ModuleItem
ImportDeclaration
1.
Return a new empty
List
ExportDeclaration
export
ExportFromClause
FromClause
export
NamedExports
export
VariableStatement
1.
Return a new empty
List
ExportDeclaration
export
Declaration
1.
Return a
List
whose sole element is
DeclarationPart
of
Declaration
ExportDeclaration
export
default
HoistableDeclaration
1.
Return a
List
whose sole element is
DeclarationPart
of
HoistableDeclaration
ExportDeclaration
export
default
ClassDeclaration
1.
Return a
List
whose sole element is
ClassDeclaration
ExportDeclaration
export
default
AssignmentExpression
1.
Return a
List
whose sole element is this
ExportDeclaration
8.2.6
Static Semantics: VarDeclaredNames
The
syntax-directed operation
VarDeclaredNames takes no arguments and returns a
List
of Strings. It is defined piecewise over the following productions:
Statement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
1.
Return a new empty
List
Block
1.
Return a new empty
List
StatementList
StatementList
StatementListItem
1.
Let
names1
be
VarDeclaredNames
of
StatementList
2.
Let
names2
be
VarDeclaredNames
of
StatementListItem
3.
Return the
list-concatenation
of
names1
and
names2
StatementListItem
Declaration
1.
Return a new empty
List
VariableStatement
var
VariableDeclarationList
1.
Return
BoundNames
of
VariableDeclarationList
IfStatement
if
Expression
Statement
else
Statement
1.
Let
names1
be
VarDeclaredNames
of the first
Statement
2.
Let
names2
be
VarDeclaredNames
of the second
Statement
3.
Return the
list-concatenation
of
names1
and
names2
IfStatement
if
Expression
Statement
1.
Return the
VarDeclaredNames
of
Statement
DoWhileStatement
do
Statement
while
Expression
1.
Return the
VarDeclaredNames
of
Statement
WhileStatement
while
Expression
Statement
1.
Return the
VarDeclaredNames
of
Statement
ForStatement
for
Expression
opt
Expression
opt
Expression
opt
Statement
1.
Return the
VarDeclaredNames
of
Statement
ForStatement
for
var
VariableDeclarationList
Expression
opt
Expression
opt
Statement
1.
Let
names1
be
BoundNames
of
VariableDeclarationList
2.
Let
names2
be
VarDeclaredNames
of
Statement
3.
Return the
list-concatenation
of
names1
and
names2
ForStatement
for
LexicalDeclaration
Expression
opt
Expression
opt
Statement
1.
Return the
VarDeclaredNames
of
Statement
ForInOfStatement
for
LeftHandSideExpression
in
Expression
Statement
for
ForDeclaration
in
Expression
Statement
for
LeftHandSideExpression
of
AssignmentExpression
Statement
for
ForDeclaration
of
AssignmentExpression
Statement
for
await
LeftHandSideExpression
of
AssignmentExpression
Statement
for
await
ForDeclaration
of
AssignmentExpression
Statement
1.
Return the
VarDeclaredNames
of
Statement
ForInOfStatement
for
var
ForBinding
in
Expression
Statement
for
var
ForBinding
of
AssignmentExpression
Statement
for
await
var
ForBinding
of
AssignmentExpression
Statement
1.
Let
names1
be the
BoundNames
of
ForBinding
2.
Let
names2
be the
VarDeclaredNames
of
Statement
3.
Return the
list-concatenation
of
names1
and
names2
Note
This section is extended by Annex
B.3.5
WithStatement
with
Expression
Statement
1.
Return the
VarDeclaredNames
of
Statement
SwitchStatement
switch
Expression
CaseBlock
1.
Return the
VarDeclaredNames
of
CaseBlock
CaseBlock
1.
Return a new empty
List
CaseBlock
CaseClauses
opt
DefaultClause
CaseClauses
opt
1.
If the first
CaseClauses
is present, let
names1
be the
VarDeclaredNames
of the first
CaseClauses
2.
Else, let
names1
be a new empty
List
3.
Let
names2
be
VarDeclaredNames
of
DefaultClause
4.
If the second
CaseClauses
is present, let
names3
be the
VarDeclaredNames
of the second
CaseClauses
5.
Else, let
names3
be a new empty
List
6.
Return the
list-concatenation
of
names1
names2
, and
names3
CaseClauses
CaseClauses
CaseClause
1.
Let
names1
be
VarDeclaredNames
of
CaseClauses
2.
Let
names2
be
VarDeclaredNames
of
CaseClause
3.
Return the
list-concatenation
of
names1
and
names2
CaseClause
case
Expression
StatementList
opt
1.
If the
StatementList
is present, return the
VarDeclaredNames
of
StatementList
2.
Return a new empty
List
DefaultClause
default
StatementList
opt
1.
If the
StatementList
is present, return the
VarDeclaredNames
of
StatementList
2.
Return a new empty
List
LabelledStatement
LabelIdentifier
LabelledItem
1.
Return the
VarDeclaredNames
of
LabelledItem
LabelledItem
FunctionDeclaration
1.
Return a new empty
List
TryStatement
try
Block
Catch
1.
Let
names1
be
VarDeclaredNames
of
Block
2.
Let
names2
be
VarDeclaredNames
of
Catch
3.
Return the
list-concatenation
of
names1
and
names2
TryStatement
try
Block
Finally
1.
Let
names1
be
VarDeclaredNames
of
Block
2.
Let
names2
be
VarDeclaredNames
of
Finally
3.
Return the
list-concatenation
of
names1
and
names2
TryStatement
try
Block
Catch
Finally
1.
Let
names1
be
VarDeclaredNames
of
Block
2.
Let
names2
be
VarDeclaredNames
of
Catch
3.
Let
names3
be
VarDeclaredNames
of
Finally
4.
Return the
list-concatenation
of
names1
names2
, and
names3
Catch
catch
CatchParameter
Block
1.
Return the
VarDeclaredNames
of
Block
FunctionStatementList
[empty]
1.
Return a new empty
List
FunctionStatementList
StatementList
1.
Return
TopLevelVarDeclaredNames
of
StatementList
ClassStaticBlockStatementList
[empty]
1.
Return a new empty
List
ClassStaticBlockStatementList
StatementList
1.
Return the
TopLevelVarDeclaredNames
of
StatementList
ConciseBody
ExpressionBody
1.
Return a new empty
List
AsyncConciseBody
ExpressionBody
1.
Return a new empty
List
Script
[empty]
1.
Return a new empty
List
ScriptBody
StatementList
1.
Return
TopLevelVarDeclaredNames
of
StatementList
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
names1
be
VarDeclaredNames
of
ModuleItemList
2.
Let
names2
be
VarDeclaredNames
of
ModuleItem
3.
Return the
list-concatenation
of
names1
and
names2
ModuleItem
ImportDeclaration
1.
Return a new empty
List
ModuleItem
ExportDeclaration
1.
If
ExportDeclaration
is
export
VariableStatement
, return
BoundNames
of
ExportDeclaration
2.
Return a new empty
List
8.2.7
Static Semantics: VarScopedDeclarations
The
syntax-directed operation
VarScopedDeclarations takes no arguments and returns a
List
of
Parse Nodes
. It is defined piecewise over the following productions:
Statement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
1.
Return a new empty
List
Block
1.
Return a new empty
List
StatementList
StatementList
StatementListItem
1.
Let
declarations1
be
VarScopedDeclarations
of
StatementList
2.
Let
declarations2
be
VarScopedDeclarations
of
StatementListItem
3.
Return the
list-concatenation
of
declarations1
and
declarations2
StatementListItem
Declaration
1.
Return a new empty
List
VariableDeclarationList
VariableDeclaration
1.
Return «
VariableDeclaration
».
VariableDeclarationList
VariableDeclarationList
VariableDeclaration
1.
Let
declarations1
be
VarScopedDeclarations
of
VariableDeclarationList
2.
Return the
list-concatenation
of
declarations1
and «
VariableDeclaration
».
IfStatement
if
Expression
Statement
else
Statement
1.
Let
declarations1
be
VarScopedDeclarations
of the first
Statement
2.
Let
declarations2
be
VarScopedDeclarations
of the second
Statement
3.
Return the
list-concatenation
of
declarations1
and
declarations2
IfStatement
if
Expression
Statement
1.
Return the
VarScopedDeclarations
of
Statement
DoWhileStatement
do
Statement
while
Expression
1.
Return the
VarScopedDeclarations
of
Statement
WhileStatement
while
Expression
Statement
1.
Return the
VarScopedDeclarations
of
Statement
ForStatement
for
Expression
opt
Expression
opt
Expression
opt
Statement
1.
Return the
VarScopedDeclarations
of
Statement
ForStatement
for
var
VariableDeclarationList
Expression
opt
Expression
opt
Statement
1.
Let
declarations1
be
VarScopedDeclarations
of
VariableDeclarationList
2.
Let
declarations2
be
VarScopedDeclarations
of
Statement
3.
Return the
list-concatenation
of
declarations1
and
declarations2
ForStatement
for
LexicalDeclaration
Expression
opt
Expression
opt
Statement
1.
Return the
VarScopedDeclarations
of
Statement
ForInOfStatement
for
LeftHandSideExpression
in
Expression
Statement
for
ForDeclaration
in
Expression
Statement
for
LeftHandSideExpression
of
AssignmentExpression
Statement
for
ForDeclaration
of
AssignmentExpression
Statement
for
await
LeftHandSideExpression
of
AssignmentExpression
Statement
for
await
ForDeclaration
of
AssignmentExpression
Statement
1.
Return the
VarScopedDeclarations
of
Statement
ForInOfStatement
for
var
ForBinding
in
Expression
Statement
for
var
ForBinding
of
AssignmentExpression
Statement
for
await
var
ForBinding
of
AssignmentExpression
Statement
1.
Let
declarations1
be «
ForBinding
».
2.
Let
declarations2
be
VarScopedDeclarations
of
Statement
3.
Return the
list-concatenation
of
declarations1
and
declarations2
Note
This section is extended by Annex
B.3.5
WithStatement
with
Expression
Statement
1.
Return the
VarScopedDeclarations
of
Statement
SwitchStatement
switch
Expression
CaseBlock
1.
Return the
VarScopedDeclarations
of
CaseBlock
CaseBlock
1.
Return a new empty
List
CaseBlock
CaseClauses
opt
DefaultClause
CaseClauses
opt
1.
If the first
CaseClauses
is present, let
declarations1
be the
VarScopedDeclarations
of the first
CaseClauses
2.
Else, let
declarations1
be a new empty
List
3.
Let
declarations2
be
VarScopedDeclarations
of
DefaultClause
4.
If the second
CaseClauses
is present, let
declarations3
be the
VarScopedDeclarations
of the second
CaseClauses
5.
Else, let
declarations3
be a new empty
List
6.
Return the
list-concatenation
of
declarations1
declarations2
, and
declarations3
CaseClauses
CaseClauses
CaseClause
1.
Let
declarations1
be
VarScopedDeclarations
of
CaseClauses
2.
Let
declarations2
be
VarScopedDeclarations
of
CaseClause
3.
Return the
list-concatenation
of
declarations1
and
declarations2
CaseClause
case
Expression
StatementList
opt
1.
If the
StatementList
is present, return the
VarScopedDeclarations
of
StatementList
2.
Return a new empty
List
DefaultClause
default
StatementList
opt
1.
If the
StatementList
is present, return the
VarScopedDeclarations
of
StatementList
2.
Return a new empty
List
LabelledStatement
LabelIdentifier
LabelledItem
1.
Return the
VarScopedDeclarations
of
LabelledItem
LabelledItem
FunctionDeclaration
1.
Return a new empty
List
TryStatement
try
Block
Catch
1.
Let
declarations1
be
VarScopedDeclarations
of
Block
2.
Let
declarations2
be
VarScopedDeclarations
of
Catch
3.
Return the
list-concatenation
of
declarations1
and
declarations2
TryStatement
try
Block
Finally
1.
Let
declarations1
be
VarScopedDeclarations
of
Block
2.
Let
declarations2
be
VarScopedDeclarations
of
Finally
3.
Return the
list-concatenation
of
declarations1
and
declarations2
TryStatement
try
Block
Catch
Finally
1.
Let
declarations1
be
VarScopedDeclarations
of
Block
2.
Let
declarations2
be
VarScopedDeclarations
of
Catch
3.
Let
declarations3
be
VarScopedDeclarations
of
Finally
4.
Return the
list-concatenation
of
declarations1
declarations2
, and
declarations3
Catch
catch
CatchParameter
Block
1.
Return the
VarScopedDeclarations
of
Block
FunctionStatementList
[empty]
1.
Return a new empty
List
FunctionStatementList
StatementList
1.
Return the
TopLevelVarScopedDeclarations
of
StatementList
ClassStaticBlockStatementList
[empty]
1.
Return a new empty
List
ClassStaticBlockStatementList
StatementList
1.
Return the
TopLevelVarScopedDeclarations
of
StatementList
ConciseBody
ExpressionBody
1.
Return a new empty
List
AsyncConciseBody
ExpressionBody
1.
Return a new empty
List
Script
[empty]
1.
Return a new empty
List
ScriptBody
StatementList
1.
Return
TopLevelVarScopedDeclarations
of
StatementList
Module
[empty]
1.
Return a new empty
List
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
declarations1
be
VarScopedDeclarations
of
ModuleItemList
2.
Let
declarations2
be
VarScopedDeclarations
of
ModuleItem
3.
Return the
list-concatenation
of
declarations1
and
declarations2
ModuleItem
ImportDeclaration
1.
Return a new empty
List
ModuleItem
ExportDeclaration
1.
If
ExportDeclaration
is
export
VariableStatement
, return
VarScopedDeclarations
of
VariableStatement
2.
Return a new empty
List
8.2.8
Static Semantics: TopLevelLexicallyDeclaredNames
The
syntax-directed operation
TopLevelLexicallyDeclaredNames takes no arguments and returns a
List
of Strings. It is defined piecewise over the following productions:
StatementList
StatementList
StatementListItem
1.
Let
names1
be
TopLevelLexicallyDeclaredNames
of
StatementList
2.
Let
names2
be
TopLevelLexicallyDeclaredNames
of
StatementListItem
3.
Return the
list-concatenation
of
names1
and
names2
StatementListItem
Statement
1.
Return a new empty
List
StatementListItem
Declaration
1.
If
Declaration
is
Declaration
HoistableDeclaration
, then
a.
Return a new empty
List
2.
Return the
BoundNames
of
Declaration
Note
At the top level of a function, or script, function
declarations are treated like var declarations rather than like lexical
declarations.
8.2.9
Static Semantics: TopLevelLexicallyScopedDeclarations
The
syntax-directed operation
TopLevelLexicallyScopedDeclarations takes no arguments and returns a
List
of
Parse Nodes
. It is defined piecewise over the following productions:
StatementList
StatementList
StatementListItem
1.
Let
declarations1
be
TopLevelLexicallyScopedDeclarations
of
StatementList
2.
Let
declarations2
be
TopLevelLexicallyScopedDeclarations
of
StatementListItem
3.
Return the
list-concatenation
of
declarations1
and
declarations2
StatementListItem
Statement
1.
Return a new empty
List
StatementListItem
Declaration
1.
If
Declaration
is
Declaration
HoistableDeclaration
, then
a.
Return a new empty
List
2.
Return «
Declaration
».
8.2.10
Static Semantics: TopLevelVarDeclaredNames
The
syntax-directed operation
TopLevelVarDeclaredNames takes no arguments and returns a
List
of Strings. It is defined piecewise over the following productions:
StatementList
StatementList
StatementListItem
1.
Let
names1
be
TopLevelVarDeclaredNames
of
StatementList
2.
Let
names2
be
TopLevelVarDeclaredNames
of
StatementListItem
3.
Return the
list-concatenation
of
names1
and
names2
StatementListItem
Declaration
1.
If
Declaration
is
Declaration
HoistableDeclaration
, then
a.
Return the
BoundNames
of
HoistableDeclaration
2.
Return a new empty
List
StatementListItem
Statement
1.
If
Statement
is
Statement
LabelledStatement
, return
TopLevelVarDeclaredNames
of
Statement
2.
Return
VarDeclaredNames
of
Statement
Note
At the top level of a function or script, inner function declarations are treated like var declarations.
LabelledStatement
LabelIdentifier
LabelledItem
1.
Return the
TopLevelVarDeclaredNames
of
LabelledItem
LabelledItem
Statement
1.
If
Statement
is
Statement
LabelledStatement
, return
TopLevelVarDeclaredNames
of
Statement
2.
Return
VarDeclaredNames
of
Statement
LabelledItem
FunctionDeclaration
1.
Return
BoundNames
of
FunctionDeclaration
8.2.11
Static Semantics: TopLevelVarScopedDeclarations
The
syntax-directed operation
TopLevelVarScopedDeclarations takes no arguments and returns a
List
of
Parse Nodes
. It is defined piecewise over the following productions:
StatementList
StatementList
StatementListItem
1.
Let
declarations1
be
TopLevelVarScopedDeclarations
of
StatementList
2.
Let
declarations2
be
TopLevelVarScopedDeclarations
of
StatementListItem
3.
Return the
list-concatenation
of
declarations1
and
declarations2
StatementListItem
Statement
1.
If
Statement
is
Statement
LabelledStatement
, return
TopLevelVarScopedDeclarations
of
Statement
2.
Return
VarScopedDeclarations
of
Statement
StatementListItem
Declaration
1.
If
Declaration
is
Declaration
HoistableDeclaration
, then
a.
Let
declaration
be
DeclarationPart
of
HoistableDeclaration
b.
Return «
declaration
».
2.
Return a new empty
List
LabelledStatement
LabelIdentifier
LabelledItem
1.
Return the
TopLevelVarScopedDeclarations
of
LabelledItem
LabelledItem
Statement
1.
If
Statement
is
Statement
LabelledStatement
, return
TopLevelVarScopedDeclarations
of
Statement
2.
Return
VarScopedDeclarations
of
Statement
LabelledItem
FunctionDeclaration
1.
Return «
FunctionDeclaration
».
8.3
Labels
8.3.1
Static Semantics: ContainsDuplicateLabels
The
syntax-directed operation
ContainsDuplicateLabels takes argument
labelSet
(a
List
of Strings) and returns a Boolean. It is defined piecewise over the following productions:
Statement
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block
StatementListItem
Declaration
1.
Return
false
StatementList
StatementList
StatementListItem
1.
Let
hasDuplicates
be
ContainsDuplicateLabels
of
StatementList
with argument
labelSet
2.
If
hasDuplicates
is
true
, return
true
3.
Return
ContainsDuplicateLabels
of
StatementListItem
with argument
labelSet
IfStatement
if
Expression
Statement
else
Statement
1.
Let
hasDuplicate
be
ContainsDuplicateLabels
of the first
Statement
with argument
labelSet
2.
If
hasDuplicate
is
true
, return
true
3.
Return
ContainsDuplicateLabels
of the second
Statement
with argument
labelSet
IfStatement
if
Expression
Statement
1.
Return
ContainsDuplicateLabels
of
Statement
with argument
labelSet
DoWhileStatement
do
Statement
while
Expression
1.
Return
ContainsDuplicateLabels
of
Statement
with argument
labelSet
WhileStatement
while
Expression
Statement
1.
Return
ContainsDuplicateLabels
of
Statement
with argument
labelSet
ForStatement
for
Expression
opt
Expression
opt
Expression
opt
Statement
for
var
VariableDeclarationList
Expression
opt
Expression
opt
Statement
for
LexicalDeclaration
Expression
opt
Expression
opt
Statement
1.
Return
ContainsDuplicateLabels
of
Statement
with argument
labelSet
ForInOfStatement
for
LeftHandSideExpression
in
Expression
Statement
for
var
ForBinding
in
Expression
Statement
for
ForDeclaration
in
Expression
Statement
for
LeftHandSideExpression
of
AssignmentExpression
Statement
for
var
ForBinding
of
AssignmentExpression
Statement
for
ForDeclaration
of
AssignmentExpression
Statement
for
await
LeftHandSideExpression
of
AssignmentExpression
Statement
for
await
var
ForBinding
of
AssignmentExpression
Statement
for
await
ForDeclaration
of
AssignmentExpression
Statement
1.
Return
ContainsDuplicateLabels
of
Statement
with argument
labelSet
Note
This section is extended by Annex
B.3.5
WithStatement
with
Expression
Statement
1.
Return
ContainsDuplicateLabels
of
Statement
with argument
labelSet
SwitchStatement
switch
Expression
CaseBlock
1.
Return
ContainsDuplicateLabels
of
CaseBlock
with argument
labelSet
CaseBlock
1.
Return
false
CaseBlock
CaseClauses
opt
DefaultClause
CaseClauses
opt
1.
If the first
CaseClauses
is present, then
a.
If
ContainsDuplicateLabels
of the first
CaseClauses
with argument
labelSet
is
true
, return
true
2.
If
ContainsDuplicateLabels
of
DefaultClause
with argument
labelSet
is
true
, return
true
3.
If the second
CaseClauses
is not present, return
false
4.
Return
ContainsDuplicateLabels
of the second
CaseClauses
with argument
labelSet
CaseClauses
CaseClauses
CaseClause
1.
Let
hasDuplicates
be
ContainsDuplicateLabels
of
CaseClauses
with argument
labelSet
2.
If
hasDuplicates
is
true
, return
true
3.
Return
ContainsDuplicateLabels
of
CaseClause
with argument
labelSet
CaseClause
case
Expression
StatementList
opt
1.
If the
StatementList
is present, return
ContainsDuplicateLabels
of
StatementList
with argument
labelSet
2.
Return
false
DefaultClause
default
StatementList
opt
1.
If the
StatementList
is present, return
ContainsDuplicateLabels
of
StatementList
with argument
labelSet
2.
Return
false
LabelledStatement
LabelIdentifier
LabelledItem
1.
Let
label
be the
StringValue
of
LabelIdentifier
2.
If
labelSet
contains
label
, return
true
3.
Let
newLabelSet
be the
list-concatenation
of
labelSet
and «
label
».
4.
Return
ContainsDuplicateLabels
of
LabelledItem
with argument
newLabelSet
LabelledItem
FunctionDeclaration
1.
Return
false
TryStatement
try
Block
Catch
1.
Let
hasDuplicates
be
ContainsDuplicateLabels
of
Block
with argument
labelSet
2.
If
hasDuplicates
is
true
, return
true
3.
Return
ContainsDuplicateLabels
of
Catch
with argument
labelSet
TryStatement
try
Block
Finally
1.
Let
hasDuplicates
be
ContainsDuplicateLabels
of
Block
with argument
labelSet
2.
If
hasDuplicates
is
true
, return
true
3.
Return
ContainsDuplicateLabels
of
Finally
with argument
labelSet
TryStatement
try
Block
Catch
Finally
1.
If
ContainsDuplicateLabels
of
Block
with argument
labelSet
is
true
, return
true
2.
If
ContainsDuplicateLabels
of
Catch
with argument
labelSet
is
true
, return
true
3.
Return
ContainsDuplicateLabels
of
Finally
with argument
labelSet
Catch
catch
CatchParameter
Block
1.
Return
ContainsDuplicateLabels
of
Block
with argument
labelSet
FunctionStatementList
[empty]
1.
Return
false
ClassStaticBlockStatementList
[empty]
1.
Return
false
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
hasDuplicates
be
ContainsDuplicateLabels
of
ModuleItemList
with argument
labelSet
2.
If
hasDuplicates
is
true
, return
true
3.
Return
ContainsDuplicateLabels
of
ModuleItem
with argument
labelSet
ModuleItem
ImportDeclaration
ExportDeclaration
1.
Return
false
8.3.2
Static Semantics: ContainsUndefinedBreakTarget
The
syntax-directed operation
ContainsUndefinedBreakTarget takes argument
labelSet
(a
List
of Strings) and returns a Boolean. It is defined piecewise over the following productions:
Statement
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block
StatementListItem
Declaration
1.
Return
false
StatementList
StatementList
StatementListItem
1.
Let
hasUndefinedLabels
be
ContainsUndefinedBreakTarget
of
StatementList
with argument
labelSet
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedBreakTarget
of
StatementListItem
with argument
labelSet
IfStatement
if
Expression
Statement
else
Statement
1.
Let
hasUndefinedLabels
be
ContainsUndefinedBreakTarget
of the first
Statement
with argument
labelSet
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedBreakTarget
of the second
Statement
with argument
labelSet
IfStatement
if
Expression
Statement
1.
Return
ContainsUndefinedBreakTarget
of
Statement
with argument
labelSet
DoWhileStatement
do
Statement
while
Expression
1.
Return
ContainsUndefinedBreakTarget
of
Statement
with argument
labelSet
WhileStatement
while
Expression
Statement
1.
Return
ContainsUndefinedBreakTarget
of
Statement
with argument
labelSet
ForStatement
for
Expression
opt
Expression
opt
Expression
opt
Statement
for
var
VariableDeclarationList
Expression
opt
Expression
opt
Statement
for
LexicalDeclaration
Expression
opt
Expression
opt
Statement
1.
Return
ContainsUndefinedBreakTarget
of
Statement
with argument
labelSet
ForInOfStatement
for
LeftHandSideExpression
in
Expression
Statement
for
var
ForBinding
in
Expression
Statement
for
ForDeclaration
in
Expression
Statement
for
LeftHandSideExpression
of
AssignmentExpression
Statement
for
var
ForBinding
of
AssignmentExpression
Statement
for
ForDeclaration
of
AssignmentExpression
Statement
for
await
LeftHandSideExpression
of
AssignmentExpression
Statement
for
await
var
ForBinding
of
AssignmentExpression
Statement
for
await
ForDeclaration
of
AssignmentExpression
Statement
1.
Return
ContainsUndefinedBreakTarget
of
Statement
with argument
labelSet
Note
This section is extended by Annex
B.3.5
BreakStatement
break
1.
Return
false
BreakStatement
break
LabelIdentifier
1.
If
labelSet
does not contain the
StringValue
of
LabelIdentifier
, return
true
2.
Return
false
WithStatement
with
Expression
Statement
1.
Return
ContainsUndefinedBreakTarget
of
Statement
with argument
labelSet
SwitchStatement
switch
Expression
CaseBlock
1.
Return
ContainsUndefinedBreakTarget
of
CaseBlock
with argument
labelSet
CaseBlock
1.
Return
false
CaseBlock
CaseClauses
opt
DefaultClause
CaseClauses
opt
1.
If the first
CaseClauses
is present, then
a.
If
ContainsUndefinedBreakTarget
of the first
CaseClauses
with argument
labelSet
is
true
, return
true
2.
If
ContainsUndefinedBreakTarget
of
DefaultClause
with argument
labelSet
is
true
, return
true
3.
If the second
CaseClauses
is not present, return
false
4.
Return
ContainsUndefinedBreakTarget
of the second
CaseClauses
with argument
labelSet
CaseClauses
CaseClauses
CaseClause
1.
Let
hasUndefinedLabels
be
ContainsUndefinedBreakTarget
of
CaseClauses
with argument
labelSet
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedBreakTarget
of
CaseClause
with argument
labelSet
CaseClause
case
Expression
StatementList
opt
1.
If the
StatementList
is present, return
ContainsUndefinedBreakTarget
of
StatementList
with argument
labelSet
2.
Return
false
DefaultClause
default
StatementList
opt
1.
If the
StatementList
is present, return
ContainsUndefinedBreakTarget
of
StatementList
with argument
labelSet
2.
Return
false
LabelledStatement
LabelIdentifier
LabelledItem
1.
Let
label
be the
StringValue
of
LabelIdentifier
2.
Let
newLabelSet
be the
list-concatenation
of
labelSet
and «
label
».
3.
Return
ContainsUndefinedBreakTarget
of
LabelledItem
with argument
newLabelSet
LabelledItem
FunctionDeclaration
1.
Return
false
TryStatement
try
Block
Catch
1.
Let
hasUndefinedLabels
be
ContainsUndefinedBreakTarget
of
Block
with argument
labelSet
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedBreakTarget
of
Catch
with argument
labelSet
TryStatement
try
Block
Finally
1.
Let
hasUndefinedLabels
be
ContainsUndefinedBreakTarget
of
Block
with argument
labelSet
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedBreakTarget
of
Finally
with argument
labelSet
TryStatement
try
Block
Catch
Finally
1.
If
ContainsUndefinedBreakTarget
of
Block
with argument
labelSet
is
true
, return
true
2.
If
ContainsUndefinedBreakTarget
of
Catch
with argument
labelSet
is
true
, return
true
3.
Return
ContainsUndefinedBreakTarget
of
Finally
with argument
labelSet
Catch
catch
CatchParameter
Block
1.
Return
ContainsUndefinedBreakTarget
of
Block
with argument
labelSet
FunctionStatementList
[empty]
1.
Return
false
ClassStaticBlockStatementList
[empty]
1.
Return
false
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
hasUndefinedLabels
be
ContainsUndefinedBreakTarget
of
ModuleItemList
with argument
labelSet
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedBreakTarget
of
ModuleItem
with argument
labelSet
ModuleItem
ImportDeclaration
ExportDeclaration
1.
Return
false
8.3.3
Static Semantics: ContainsUndefinedContinueTarget
The
syntax-directed operation
ContainsUndefinedContinueTarget takes arguments
iterationSet
(a
List
of Strings) and
labelSet
(a
List
of Strings) and returns a Boolean. It is defined piecewise over the following productions:
Statement
VariableStatement
EmptyStatement
ExpressionStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block
StatementListItem
Declaration
1.
Return
false
Statement
BlockStatement
1.
Return
ContainsUndefinedContinueTarget
of
BlockStatement
with arguments
iterationSet
and « ».
BreakableStatement
IterationStatement
1.
Let
newIterationSet
be the
list-concatenation
of
iterationSet
and
labelSet
2.
Return
ContainsUndefinedContinueTarget
of
IterationStatement
with arguments
newIterationSet
and « ».
StatementList
StatementList
StatementListItem
1.
Let
hasUndefinedLabels
be
ContainsUndefinedContinueTarget
of
StatementList
with arguments
iterationSet
and « ».
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedContinueTarget
of
StatementListItem
with arguments
iterationSet
and « ».
IfStatement
if
Expression
Statement
else
Statement
1.
Let
hasUndefinedLabels
be
ContainsUndefinedContinueTarget
of the first
Statement
with arguments
iterationSet
and « ».
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedContinueTarget
of the second
Statement
with arguments
iterationSet
and « ».
IfStatement
if
Expression
Statement
1.
Return
ContainsUndefinedContinueTarget
of
Statement
with arguments
iterationSet
and « ».
DoWhileStatement
do
Statement
while
Expression
1.
Return
ContainsUndefinedContinueTarget
of
Statement
with arguments
iterationSet
and « ».
WhileStatement
while
Expression
Statement
1.
Return
ContainsUndefinedContinueTarget
of
Statement
with arguments
iterationSet
and « ».
ForStatement
for
Expression
opt
Expression
opt
Expression
opt
Statement
for
var
VariableDeclarationList
Expression
opt
Expression
opt
Statement
for
LexicalDeclaration
Expression
opt
Expression
opt
Statement
1.
Return
ContainsUndefinedContinueTarget
of
Statement
with arguments
iterationSet
and « ».
ForInOfStatement
for
LeftHandSideExpression
in
Expression
Statement
for
var
ForBinding
in
Expression
Statement
for
ForDeclaration
in
Expression
Statement
for
LeftHandSideExpression
of
AssignmentExpression
Statement
for
var
ForBinding
of
AssignmentExpression
Statement
for
ForDeclaration
of
AssignmentExpression
Statement
for
await
LeftHandSideExpression
of
AssignmentExpression
Statement
for
await
var
ForBinding
of
AssignmentExpression
Statement
for
await
ForDeclaration
of
AssignmentExpression
Statement
1.
Return
ContainsUndefinedContinueTarget
of
Statement
with arguments
iterationSet
and « ».
Note
This section is extended by Annex
B.3.5
ContinueStatement
continue
1.
Return
false
ContinueStatement
continue
LabelIdentifier
1.
If
iterationSet
does not contain the
StringValue
of
LabelIdentifier
, return
true
2.
Return
false
WithStatement
with
Expression
Statement
1.
Return
ContainsUndefinedContinueTarget
of
Statement
with arguments
iterationSet
and « ».
SwitchStatement
switch
Expression
CaseBlock
1.
Return
ContainsUndefinedContinueTarget
of
CaseBlock
with arguments
iterationSet
and « ».
CaseBlock
1.
Return
false
CaseBlock
CaseClauses
opt
DefaultClause
CaseClauses
opt
1.
If the first
CaseClauses
is present, then
a.
If
ContainsUndefinedContinueTarget
of the first
CaseClauses
with arguments
iterationSet
and « » is
true
, return
true
2.
If
ContainsUndefinedContinueTarget
of
DefaultClause
with arguments
iterationSet
and « » is
true
, return
true
3.
If the second
CaseClauses
is not present, return
false
4.
Return
ContainsUndefinedContinueTarget
of the second
CaseClauses
with arguments
iterationSet
and « ».
CaseClauses
CaseClauses
CaseClause
1.
Let
hasUndefinedLabels
be
ContainsUndefinedContinueTarget
of
CaseClauses
with arguments
iterationSet
and « ».
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedContinueTarget
of
CaseClause
with arguments
iterationSet
and « ».
CaseClause
case
Expression
StatementList
opt
1.
If the
StatementList
is present, return
ContainsUndefinedContinueTarget
of
StatementList
with arguments
iterationSet
and « ».
2.
Return
false
DefaultClause
default
StatementList
opt
1.
If the
StatementList
is present, return
ContainsUndefinedContinueTarget
of
StatementList
with arguments
iterationSet
and « ».
2.
Return
false
LabelledStatement
LabelIdentifier
LabelledItem
1.
Let
label
be the
StringValue
of
LabelIdentifier
2.
Let
newLabelSet
be the
list-concatenation
of
labelSet
and «
label
».
3.
Return
ContainsUndefinedContinueTarget
of
LabelledItem
with arguments
iterationSet
and
newLabelSet
LabelledItem
FunctionDeclaration
1.
Return
false
TryStatement
try
Block
Catch
1.
Let
hasUndefinedLabels
be
ContainsUndefinedContinueTarget
of
Block
with arguments
iterationSet
and « ».
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedContinueTarget
of
Catch
with arguments
iterationSet
and « ».
TryStatement
try
Block
Finally
1.
Let
hasUndefinedLabels
be
ContainsUndefinedContinueTarget
of
Block
with arguments
iterationSet
and « ».
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedContinueTarget
of
Finally
with arguments
iterationSet
and « ».
TryStatement
try
Block
Catch
Finally
1.
If
ContainsUndefinedContinueTarget
of
Block
with arguments
iterationSet
and « » is
true
, return
true
2.
If
ContainsUndefinedContinueTarget
of
Catch
with arguments
iterationSet
and « » is
true
, return
true
3.
Return
ContainsUndefinedContinueTarget
of
Finally
with arguments
iterationSet
and « ».
Catch
catch
CatchParameter
Block
1.
Return
ContainsUndefinedContinueTarget
of
Block
with arguments
iterationSet
and « ».
FunctionStatementList
[empty]
1.
Return
false
ClassStaticBlockStatementList
[empty]
1.
Return
false
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
hasUndefinedLabels
be
ContainsUndefinedContinueTarget
of
ModuleItemList
with arguments
iterationSet
and « ».
2.
If
hasUndefinedLabels
is
true
, return
true
3.
Return
ContainsUndefinedContinueTarget
of
ModuleItem
with arguments
iterationSet
and « ».
ModuleItem
ImportDeclaration
ExportDeclaration
1.
Return
false
8.4
Function Name Inference
8.4.1
Static Semantics: HasName
The
syntax-directed operation
HasName takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
PrimaryExpression
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
expr
be the
ParenthesizedExpression
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
If
IsFunctionDefinition
of
expr
is
false
, return
false
3.
Return
HasName
of
expr
FunctionExpression
function
FormalParameters
FunctionBody
GeneratorExpression
function
FormalParameters
GeneratorBody
AsyncGeneratorExpression
async
function
FormalParameters
AsyncGeneratorBody
AsyncFunctionExpression
async
function
FormalParameters
AsyncFunctionBody
ArrowFunction
ArrowParameters
=>
ConciseBody
AsyncArrowFunction
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
ClassExpression
class
ClassTail
1.
Return
false
FunctionExpression
function
BindingIdentifier
FormalParameters
FunctionBody
GeneratorExpression
function
BindingIdentifier
FormalParameters
GeneratorBody
AsyncGeneratorExpression
async
function
BindingIdentifier
FormalParameters
AsyncGeneratorBody
AsyncFunctionExpression
async
function
BindingIdentifier
FormalParameters
AsyncFunctionBody
ClassExpression
class
BindingIdentifier
ClassTail
1.
Return
true
8.4.2
Static Semantics: IsFunctionDefinition
The
syntax-directed operation
IsFunctionDefinition takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
PrimaryExpression
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
expr
be the
ParenthesizedExpression
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return
IsFunctionDefinition
of
expr
PrimaryExpression
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
RegularExpressionLiteral
TemplateLiteral
MemberExpression
MemberExpression
Expression
MemberExpression
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
PrivateIdentifier
NewExpression
new
NewExpression
LeftHandSideExpression
CallExpression
OptionalExpression
UpdateExpression
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
UnaryExpression
UnaryExpression
UnaryExpression
UnaryExpression
AwaitExpression
ExponentiationExpression
UpdateExpression
**
ExponentiationExpression
MultiplicativeExpression
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
AdditiveExpression
AdditiveExpression
MultiplicativeExpression
AdditiveExpression
MultiplicativeExpression
ShiftExpression
ShiftExpression
<<
AdditiveExpression
ShiftExpression
>>
AdditiveExpression
ShiftExpression
>>>
AdditiveExpression
RelationalExpression
RelationalExpression
ShiftExpression
RelationalExpression
ShiftExpression
RelationalExpression
<=
ShiftExpression
RelationalExpression
>=
ShiftExpression
RelationalExpression
instanceof
ShiftExpression
RelationalExpression
in
ShiftExpression
PrivateIdentifier
in
ShiftExpression
EqualityExpression
EqualityExpression
==
RelationalExpression
EqualityExpression
!=
RelationalExpression
EqualityExpression
===
RelationalExpression
EqualityExpression
!==
RelationalExpression
BitwiseANDExpression
BitwiseANDExpression
EqualityExpression
BitwiseXORExpression
BitwiseXORExpression
BitwiseANDExpression
BitwiseORExpression
BitwiseORExpression
BitwiseXORExpression
LogicalANDExpression
LogicalANDExpression
&&
BitwiseORExpression
LogicalORExpression
LogicalORExpression
||
LogicalANDExpression
CoalesceExpression
CoalesceExpressionHead
??
BitwiseORExpression
ConditionalExpression
ShortCircuitExpression
AssignmentExpression
AssignmentExpression
AssignmentExpression
YieldExpression
LeftHandSideExpression
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
Expression
Expression
AssignmentExpression
1.
Return
false
AssignmentExpression
ArrowFunction
AsyncArrowFunction
FunctionExpression
function
BindingIdentifier
opt
FormalParameters
FunctionBody
GeneratorExpression
function
BindingIdentifier
opt
FormalParameters
GeneratorBody
AsyncGeneratorExpression
async
function
BindingIdentifier
opt
FormalParameters
AsyncGeneratorBody
AsyncFunctionExpression
async
function
BindingIdentifier
opt
FormalParameters
AsyncFunctionBody
ClassExpression
class
BindingIdentifier
opt
ClassTail
1.
Return
true
8.4.3
Static Semantics: IsAnonymousFunctionDefinition (
expr
The abstract operation IsAnonymousFunctionDefinition takes argument
expr
(an
AssignmentExpression
Parse Node
or an
Initializer
Parse Node
and returns a Boolean. It determines if its argument is a function
definition that does not bind a name. It performs the following steps
when called:
1.
If
IsFunctionDefinition
of
expr
is
false
, return
false
2.
Let
hasName
be
HasName
of
expr
3.
If
hasName
is
true
, return
false
4.
Return
true
8.4.4
Static Semantics: IsIdentifierRef
The
syntax-directed operation
IsIdentifierRef takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
PrimaryExpression
IdentifierReference
1.
Return
true
PrimaryExpression
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CoverParenthesizedExpressionAndArrowParameterList
MemberExpression
MemberExpression
Expression
MemberExpression
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
PrivateIdentifier
NewExpression
new
NewExpression
LeftHandSideExpression
CallExpression
OptionalExpression
1.
Return
false
8.4.5
Runtime Semantics: NamedEvaluation
The
syntax-directed operation
NamedEvaluation takes argument
name
(a
property key
or a
Private Name
) and returns either a
normal completion containing
function object
or an
abrupt completion
. It is defined piecewise over the following productions:
PrimaryExpression
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
expr
be the
ParenthesizedExpression
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return ?
NamedEvaluation
of
expr
with argument
name
ParenthesizedExpression
Expression
1.
Assert
IsAnonymousFunctionDefinition
Expression
) is
true
2.
Return ?
NamedEvaluation
of
Expression
with argument
name
FunctionExpression
function
FormalParameters
FunctionBody
1.
Return
InstantiateOrdinaryFunctionExpression
of
FunctionExpression
with argument
name
GeneratorExpression
function
FormalParameters
GeneratorBody
1.
Return
InstantiateGeneratorFunctionExpression
of
GeneratorExpression
with argument
name
AsyncGeneratorExpression
async
function
FormalParameters
AsyncGeneratorBody
1.
Return
InstantiateAsyncGeneratorFunctionExpression
of
AsyncGeneratorExpression
with argument
name
AsyncFunctionExpression
async
function
FormalParameters
AsyncFunctionBody
1.
Return
InstantiateAsyncFunctionExpression
of
AsyncFunctionExpression
with argument
name
ArrowFunction
ArrowParameters
=>
ConciseBody
1.
Return
InstantiateArrowFunctionExpression
of
ArrowFunction
with argument
name
AsyncArrowFunction
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
1.
Return
InstantiateAsyncArrowFunctionExpression
of
AsyncArrowFunction
with argument
name
ClassExpression
class
ClassTail
1.
Let
value
be ?
ClassDefinitionEvaluation
of
ClassTail
with arguments
undefined
and
name
2.
Set
value
.[[SourceText]] to the
source text matched by
ClassExpression
3.
Return
value
8.5
Contains
8.5.1
Static Semantics: Contains
The
syntax-directed operation
Contains takes argument
symbol
(a grammar symbol) and returns a Boolean.
Every grammar production alternative in this specification
which is not listed below implicitly has the following default
definition of Contains:
1.
For each child node
child
of this
Parse Node
, do
a.
If
child
is an instance of
symbol
, return
true
b.
If
child
is an instance of a nonterminal, then
i.
Let
contained
be the result of
child
Contains
symbol
ii.
If
contained
is
true
, return
true
2.
Return
false
FunctionDeclaration
function
BindingIdentifier
FormalParameters
FunctionBody
function
FormalParameters
FunctionBody
FunctionExpression
function
BindingIdentifier
opt
FormalParameters
FunctionBody
GeneratorDeclaration
function
BindingIdentifier
FormalParameters
GeneratorBody
function
FormalParameters
GeneratorBody
GeneratorExpression
function
BindingIdentifier
opt
FormalParameters
GeneratorBody
AsyncGeneratorDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncGeneratorBody
async
function
FormalParameters
AsyncGeneratorBody
AsyncGeneratorExpression
async
function
BindingIdentifier
opt
FormalParameters
AsyncGeneratorBody
AsyncFunctionDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncFunctionBody
async
function
FormalParameters
AsyncFunctionBody
AsyncFunctionExpression
async
function
BindingIdentifier
opt
FormalParameters
AsyncFunctionBody
1.
Return
false
Note 1
Static semantic rules that depend upon substructure generally do not look into function definitions.
ClassTail
ClassHeritage
opt
ClassBody
1.
If
symbol
is
ClassBody
, return
true
2.
If
symbol
is
ClassHeritage
, then
a.
If
ClassHeritage
is present, return
true
; otherwise return
false
3.
If
ClassHeritage
is present, then
a.
If
ClassHeritage
Contains
symbol
is
true
, return
true
4.
Return the result of
ComputedPropertyContains
of
ClassBody
with argument
symbol
Note 2
Static semantic rules that depend upon substructure generally do not look into class bodies except for
PropertyName
s.
ClassStaticBlock
static
ClassStaticBlockBody
1.
Return
false
Note 3
Static semantic rules that depend upon substructure generally do not look into
static
initialization blocks.
ArrowFunction
ArrowParameters
=>
ConciseBody
1.
If
symbol
is not one of
NewTarget
SuperProperty
SuperCall
super
, or
this
, return
false
2.
If
ArrowParameters
Contains
symbol
is
true
, return
true
3.
Return
ConciseBody
Contains
symbol
ArrowParameters
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
formals
be the
ArrowFormalParameters
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return
formals
Contains
symbol
AsyncArrowFunction
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
1.
If
symbol
is not one of
NewTarget
SuperProperty
SuperCall
super
, or
this
, return
false
2.
Return
AsyncConciseBody
Contains
symbol
AsyncArrowFunction
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
1.
If
symbol
is not one of
NewTarget
SuperProperty
SuperCall
super
, or
this
, return
false
2.
Let
head
be the
AsyncArrowHead
that is
covered
by
CoverCallExpressionAndAsyncArrowHead
3.
If
head
Contains
symbol
is
true
, return
true
4.
Return
AsyncConciseBody
Contains
symbol
Note 4
Contains is used to detect
new.target
this
, and
super
usage within an
ArrowFunction
or
AsyncArrowFunction
PropertyDefinition
MethodDefinition
1.
If
symbol
is
MethodDefinition
, return
true
2.
Return the result of
ComputedPropertyContains
of
MethodDefinition
with argument
symbol
LiteralPropertyName
IdentifierName
1.
Return
false
MemberExpression
MemberExpression
IdentifierName
1.
If
MemberExpression
Contains
symbol
is
true
, return
true
2.
Return
false
SuperProperty
super
IdentifierName
1.
If
symbol
is the
ReservedWord
super
, return
true
2.
Return
false
CallExpression
CallExpression
IdentifierName
1.
If
CallExpression
Contains
symbol
is
true
, return
true
2.
Return
false
OptionalChain
?.
IdentifierName
1.
Return
false
OptionalChain
OptionalChain
IdentifierName
1.
If
OptionalChain
Contains
symbol
is
true
, return
true
2.
Return
false
8.5.2
Static Semantics: ComputedPropertyContains
The
syntax-directed operation
ComputedPropertyContains takes argument
symbol
(a grammar symbol) and returns a Boolean. It is defined piecewise over the following productions:
ClassElementName
PrivateIdentifier
PropertyName
LiteralPropertyName
1.
Return
false
PropertyName
ComputedPropertyName
1.
Return the result of
ComputedPropertyName
Contains
symbol
MethodDefinition
ClassElementName
UniqueFormalParameters
FunctionBody
get
ClassElementName
FunctionBody
set
ClassElementName
PropertySetParameterList
FunctionBody
1.
Return the result of
ComputedPropertyContains
of
ClassElementName
with argument
symbol
GeneratorMethod
ClassElementName
UniqueFormalParameters
GeneratorBody
1.
Return the result of
ComputedPropertyContains
of
ClassElementName
with argument
symbol
AsyncGeneratorMethod
async
ClassElementName
UniqueFormalParameters
AsyncGeneratorBody
1.
Return the result of
ComputedPropertyContains
of
ClassElementName
with argument
symbol
ClassElementList
ClassElementList
ClassElement
1.
Let
inList
be
ComputedPropertyContains
of
ClassElementList
with argument
symbol
2.
If
inList
is
true
, return
true
3.
Return the result of
ComputedPropertyContains
of
ClassElement
with argument
symbol
ClassElement
ClassStaticBlock
1.
Return
false
ClassElement
1.
Return
false
AsyncMethod
async
ClassElementName
UniqueFormalParameters
AsyncFunctionBody
1.
Return the result of
ComputedPropertyContains
of
ClassElementName
with argument
symbol
FieldDefinition
ClassElementName
Initializer
opt
1.
Return the result of
ComputedPropertyContains
of
ClassElementName
with argument
symbol
8.6
Miscellaneous
These operations are used in multiple places throughout the specification.
8.6.1
Runtime Semantics: InstantiateFunctionObject
The
syntax-directed operation
InstantiateFunctionObject takes arguments
env
(an
Environment Record
) and
privateEnv
(a
PrivateEnvironment Record
or
null
) and returns a
function object
. It is defined piecewise over the following productions:
FunctionDeclaration
function
BindingIdentifier
FormalParameters
FunctionBody
function
FormalParameters
FunctionBody
1.
Return
InstantiateOrdinaryFunctionObject
of
FunctionDeclaration
with arguments
env
and
privateEnv
GeneratorDeclaration
function
BindingIdentifier
FormalParameters
GeneratorBody
function
FormalParameters
GeneratorBody
1.
Return
InstantiateGeneratorFunctionObject
of
GeneratorDeclaration
with arguments
env
and
privateEnv
AsyncGeneratorDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncGeneratorBody
async
function
FormalParameters
AsyncGeneratorBody
1.
Return
InstantiateAsyncGeneratorFunctionObject
of
AsyncGeneratorDeclaration
with arguments
env
and
privateEnv
AsyncFunctionDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncFunctionBody
async
function
FormalParameters
AsyncFunctionBody
1.
Return
InstantiateAsyncFunctionObject
of
AsyncFunctionDeclaration
with arguments
env
and
privateEnv
8.6.2
Runtime Semantics: BindingInitialization
The
syntax-directed operation
BindingInitialization takes arguments
value
(an
ECMAScript language value
) and
environment
(an
Environment Record
or
undefined
) and returns either a
normal completion containing
unused
or an
abrupt completion
Note
undefined
is passed for
environment
to indicate that a
PutValue
operation should be used to assign the initialization value. This is the case for
var
statements and formal parameter lists of some
non-strict functions
(See
10.2.11
). In those cases a lexical binding is hoisted and preinitialized prior to evaluation of its initializer.
It is defined piecewise over the following productions:
BindingIdentifier
Identifier
1.
Let
name
be
StringValue
of
Identifier
2.
Return ?
InitializeBoundName
name
value
environment
).
BindingIdentifier
yield
1.
Return ?
InitializeBoundName
"yield"
value
environment
).
BindingIdentifier
await
1.
Return ?
InitializeBoundName
"await"
value
environment
).
BindingPattern
ObjectBindingPattern
1.
Perform ?
RequireObjectCoercible
value
).
2.
Return ?
BindingInitialization
of
ObjectBindingPattern
with arguments
value
and
environment
BindingPattern
ArrayBindingPattern
1.
Let
iteratorRecord
be ?
GetIterator
value
sync
).
2.
Let
result
be
Completion
IteratorBindingInitialization
of
ArrayBindingPattern
with arguments
iteratorRecord
and
environment
).
3.
If
iteratorRecord
.[[Done]] is
false
, return ?
IteratorClose
iteratorRecord
result
).
4.
Return ?
result
ObjectBindingPattern
1.
Return
unused
ObjectBindingPattern
BindingPropertyList
BindingPropertyList
1.
Perform ?
PropertyBindingInitialization
of
BindingPropertyList
with arguments
value
and
environment
2.
Return
unused
ObjectBindingPattern
BindingRestProperty
1.
Let
excludedNames
be a new empty
List
2.
Return ?
RestBindingInitialization
of
BindingRestProperty
with arguments
value
environment
, and
excludedNames
ObjectBindingPattern
BindingPropertyList
BindingRestProperty
1.
Let
excludedNames
be ?
PropertyBindingInitialization
of
BindingPropertyList
with arguments
value
and
environment
2.
Return ?
RestBindingInitialization
of
BindingRestProperty
with arguments
value
environment
, and
excludedNames
8.6.2.1
InitializeBoundName (
name
value
environment
The abstract operation InitializeBoundName takes arguments
name
(a String),
value
(an
ECMAScript language value
), and
environment
(an
Environment Record
or
undefined
) and returns either a
normal completion containing
unused
or an
abrupt completion
. It performs the following steps when called:
1.
If
environment
is not
undefined
, then
a.
Perform !
environment
.InitializeBinding(
name
value
).
b.
Return
unused
2.
Else,
a.
Let
lhs
be ?
ResolveBinding
name
).
b.
Return ?
PutValue
lhs
value
).
8.6.3
Runtime Semantics: IteratorBindingInitialization
The
syntax-directed operation
IteratorBindingInitialization takes arguments
iteratorRecord
(an
Iterator Record
) and
environment
(an
Environment Record
or
undefined
) and returns either a
normal completion containing
unused
or an
abrupt completion
Note
When
undefined
is passed for
environment
it indicates that a
PutValue
operation should be used to assign the initialization value. This is the case for formal parameter lists of
non-strict functions
In that case the formal parameter bindings are preinitialized in order
to deal with the possibility of multiple parameters with the same name.
It is defined piecewise over the following productions:
ArrayBindingPattern
1.
Return
unused
ArrayBindingPattern
Elision
1.
Return ?
IteratorDestructuringAssignmentEvaluation
of
Elision
with argument
iteratorRecord
ArrayBindingPattern
Elision
opt
BindingRestElement
1.
If
Elision
is present, then
a.
Perform ?
IteratorDestructuringAssignmentEvaluation
of
Elision
with argument
iteratorRecord
2.
Return ?
IteratorBindingInitialization
of
BindingRestElement
with arguments
iteratorRecord
and
environment
ArrayBindingPattern
BindingElementList
Elision
1.
Perform ?
IteratorBindingInitialization
of
BindingElementList
with arguments
iteratorRecord
and
environment
2.
Return ?
IteratorDestructuringAssignmentEvaluation
of
Elision
with argument
iteratorRecord
ArrayBindingPattern
BindingElementList
Elision
opt
BindingRestElement
1.
Perform ?
IteratorBindingInitialization
of
BindingElementList
with arguments
iteratorRecord
and
environment
2.
If
Elision
is present, then
a.
Perform ?
IteratorDestructuringAssignmentEvaluation
of
Elision
with argument
iteratorRecord
3.
Return ?
IteratorBindingInitialization
of
BindingRestElement
with arguments
iteratorRecord
and
environment
BindingElementList
BindingElementList
BindingElisionElement
1.
Perform ?
IteratorBindingInitialization
of
BindingElementList
with arguments
iteratorRecord
and
environment
2.
Return ?
IteratorBindingInitialization
of
BindingElisionElement
with arguments
iteratorRecord
and
environment
BindingElisionElement
Elision
BindingElement
1.
Perform ?
IteratorDestructuringAssignmentEvaluation
of
Elision
with argument
iteratorRecord
2.
Return ?
IteratorBindingInitialization
of
BindingElement
with arguments
iteratorRecord
and
environment
SingleNameBinding
BindingIdentifier
Initializer
opt
1.
Let
bindingId
be
StringValue
of
BindingIdentifier
2.
Let
lhs
be ?
ResolveBinding
bindingId
environment
).
3.
Let
be
undefined
4.
If
iteratorRecord
.[[Done]] is
false
, then
a.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
b.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
next
).
d.
If
next
is
false
, set
iteratorRecord
.[[Done]] to
true
e.
Else,
i.
Set
to
Completion
IteratorValue
next
)).
ii.
If
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
iii.
ReturnIfAbrupt
).
5.
If
Initializer
is present and
is
undefined
, then
a.
If
IsAnonymousFunctionDefinition
Initializer
) is
true
, then
i.
Set
to ?
NamedEvaluation
of
Initializer
with argument
bindingId
b.
Else,
i.
Let
defaultValue
be ?
Evaluation
of
Initializer
ii.
Set
to ?
GetValue
defaultValue
).
6.
If
environment
is
undefined
, return ?
PutValue
lhs
).
7.
Return ?
InitializeReferencedBinding
lhs
).
BindingElement
BindingPattern
Initializer
opt
1.
Let
be
undefined
2.
If
iteratorRecord
.[[Done]] is
false
, then
a.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
b.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
next
).
d.
If
next
is
false
, set
iteratorRecord
.[[Done]] to
true
e.
Else,
i.
Set
to
Completion
IteratorValue
next
)).
ii.
If
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
iii.
ReturnIfAbrupt
).
3.
If
Initializer
is present and
is
undefined
, then
a.
Let
defaultValue
be ?
Evaluation
of
Initializer
b.
Set
to ?
GetValue
defaultValue
).
4.
Return ?
BindingInitialization
of
BindingPattern
with arguments
and
environment
BindingRestElement
...
BindingIdentifier
1.
Let
lhs
be ?
ResolveBinding
StringValue
of
BindingIdentifier
environment
).
2.
Let
be !
ArrayCreate
(0).
3.
Let
be 0.
4.
Repeat,
a.
If
iteratorRecord
.[[Done]] is
false
, then
i.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
ii.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
iii.
ReturnIfAbrupt
next
).
iv.
If
next
is
false
, set
iteratorRecord
.[[Done]] to
true
b.
If
iteratorRecord
.[[Done]] is
true
, then
i.
If
environment
is
undefined
, return ?
PutValue
lhs
).
ii.
Return ?
InitializeReferencedBinding
lhs
).
c.
Let
nextValue
be
Completion
IteratorValue
next
)).
d.
If
nextValue
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
e.
ReturnIfAbrupt
nextValue
).
f.
Perform !
CreateDataPropertyOrThrow
, !
ToString
)),
nextValue
).
g.
Set
to
+ 1.
BindingRestElement
...
BindingPattern
1.
Let
be !
ArrayCreate
(0).
2.
Let
be 0.
3.
Repeat,
a.
If
iteratorRecord
.[[Done]] is
false
, then
i.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
ii.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
iii.
ReturnIfAbrupt
next
).
iv.
If
next
is
false
, set
iteratorRecord
.[[Done]] to
true
b.
If
iteratorRecord
.[[Done]] is
true
, then
i.
Return ?
BindingInitialization
of
BindingPattern
with arguments
and
environment
c.
Let
nextValue
be
Completion
IteratorValue
next
)).
d.
If
nextValue
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
e.
ReturnIfAbrupt
nextValue
).
f.
Perform !
CreateDataPropertyOrThrow
, !
ToString
)),
nextValue
).
g.
Set
to
+ 1.
FormalParameters
[empty]
1.
Return
unused
FormalParameters
FormalParameterList
FunctionRestParameter
1.
Perform ?
IteratorBindingInitialization
of
FormalParameterList
with arguments
iteratorRecord
and
environment
2.
Return ?
IteratorBindingInitialization
of
FunctionRestParameter
with arguments
iteratorRecord
and
environment
FormalParameterList
FormalParameterList
FormalParameter
1.
Perform ?
IteratorBindingInitialization
of
FormalParameterList
with arguments
iteratorRecord
and
environment
2.
Return ?
IteratorBindingInitialization
of
FormalParameter
with arguments
iteratorRecord
and
environment
ArrowParameters
BindingIdentifier
1.
Let
be
undefined
2.
Assert
iteratorRecord
.[[Done]] is
false
3.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
4.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
5.
ReturnIfAbrupt
next
).
6.
If
next
is
false
, set
iteratorRecord
.[[Done]] to
true
7.
Else,
a.
Set
to
Completion
IteratorValue
next
)).
b.
If
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
).
8.
Return ?
BindingInitialization
of
BindingIdentifier
with arguments
and
environment
ArrowParameters
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
formals
be the
ArrowFormalParameters
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return ?
IteratorBindingInitialization
of
formals
with arguments
iteratorRecord
and
environment
AsyncArrowBindingIdentifier
BindingIdentifier
1.
Let
be
undefined
2.
Assert
iteratorRecord
.[[Done]] is
false
3.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
4.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
5.
ReturnIfAbrupt
next
).
6.
If
next
is
false
, set
iteratorRecord
.[[Done]] to
true
7.
Else,
a.
Set
to
Completion
IteratorValue
next
)).
b.
If
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
).
8.
Return ?
BindingInitialization
of
BindingIdentifier
with arguments
and
environment
8.6.4
Static Semantics: AssignmentTargetType
The
syntax-directed operation
AssignmentTargetType takes no arguments and returns
simple
or
invalid
. It is defined piecewise over the following productions:
IdentifierReference
Identifier
1.
If this
IdentifierReference
is contained in
strict mode code
and
StringValue
of
Identifier
is either
"eval"
or
"arguments"
, return
invalid
2.
Return
simple
IdentifierReference
yield
await
CallExpression
CallExpression
Expression
CallExpression
IdentifierName
CallExpression
PrivateIdentifier
MemberExpression
MemberExpression
Expression
MemberExpression
IdentifierName
SuperProperty
MemberExpression
PrivateIdentifier
1.
Return
simple
PrimaryExpression
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
expr
be the
ParenthesizedExpression
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return
AssignmentTargetType
of
expr
PrimaryExpression
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CallExpression
CoverCallExpressionAndAsyncArrowHead
SuperCall
ImportCall
CallExpression
Arguments
CallExpression
TemplateLiteral
NewExpression
new
NewExpression
MemberExpression
MemberExpression
TemplateLiteral
new
MemberExpression
Arguments
NewTarget
new
target
ImportMeta
import
meta
LeftHandSideExpression
OptionalExpression
UpdateExpression
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
UnaryExpression
UnaryExpression
UnaryExpression
UnaryExpression
AwaitExpression
ExponentiationExpression
UpdateExpression
**
ExponentiationExpression
MultiplicativeExpression
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
AdditiveExpression
AdditiveExpression
MultiplicativeExpression
AdditiveExpression
MultiplicativeExpression
ShiftExpression
ShiftExpression
<<
AdditiveExpression
ShiftExpression
>>
AdditiveExpression
ShiftExpression
>>>
AdditiveExpression
RelationalExpression
RelationalExpression
ShiftExpression
RelationalExpression
ShiftExpression
RelationalExpression
<=
ShiftExpression
RelationalExpression
>=
ShiftExpression
RelationalExpression
instanceof
ShiftExpression
RelationalExpression
in
ShiftExpression
PrivateIdentifier
in
ShiftExpression
EqualityExpression
EqualityExpression
==
RelationalExpression
EqualityExpression
!=
RelationalExpression
EqualityExpression
===
RelationalExpression
EqualityExpression
!==
RelationalExpression
BitwiseANDExpression
BitwiseANDExpression
EqualityExpression
BitwiseXORExpression
BitwiseXORExpression
BitwiseANDExpression
BitwiseORExpression
BitwiseORExpression
BitwiseXORExpression
LogicalANDExpression
LogicalANDExpression
&&
BitwiseORExpression
LogicalORExpression
LogicalORExpression
||
LogicalANDExpression
CoalesceExpression
CoalesceExpressionHead
??
BitwiseORExpression
ConditionalExpression
ShortCircuitExpression
AssignmentExpression
AssignmentExpression
AssignmentExpression
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
Expression
Expression
AssignmentExpression
1.
Return
invalid
8.6.5
Static Semantics: PropName
The
syntax-directed operation
PropName takes no arguments and returns a String or
empty
. It is defined piecewise over the following productions:
PropertyDefinition
IdentifierReference
1.
Return
StringValue
of
IdentifierReference
PropertyDefinition
...
AssignmentExpression
1.
Return
empty
PropertyDefinition
PropertyName
AssignmentExpression
1.
Return
PropName
of
PropertyName
LiteralPropertyName
IdentifierName
1.
Return
StringValue
of
IdentifierName
LiteralPropertyName
StringLiteral
1.
Return the
SV
of
StringLiteral
LiteralPropertyName
NumericLiteral
1.
Let
nbr
be the
NumericValue
of
NumericLiteral
2.
Return !
ToString
nbr
).
ComputedPropertyName
AssignmentExpression
1.
Return
empty
MethodDefinition
ClassElementName
UniqueFormalParameters
FunctionBody
get
ClassElementName
FunctionBody
set
ClassElementName
PropertySetParameterList
FunctionBody
1.
Return
PropName
of
ClassElementName
GeneratorMethod
ClassElementName
UniqueFormalParameters
GeneratorBody
1.
Return
PropName
of
ClassElementName
AsyncGeneratorMethod
async
ClassElementName
UniqueFormalParameters
AsyncGeneratorBody
1.
Return
PropName
of
ClassElementName
ClassElement
ClassStaticBlock
1.
Return
empty
ClassElement
1.
Return
empty
AsyncMethod
async
ClassElementName
UniqueFormalParameters
AsyncFunctionBody
1.
Return
PropName
of
ClassElementName
FieldDefinition
ClassElementName
Initializer
opt
1.
Return
PropName
of
ClassElementName
ClassElementName
PrivateIdentifier
1.
Return
empty
Executable Code and Execution Contexts
9.1
Environment Records
Environment Record
is a specification type used to define the association of
Identifier
to specific variables and functions, based upon the lexical nesting
structure of ECMAScript code. Usually an Environment Record is
associated with some specific syntactic structure of ECMAScript code
such as a
FunctionDeclaration
, a
BlockStatement
, or a
Catch
clause of a
TryStatement
Each time such code is evaluated, a new Environment Record is created
to record the identifier bindings that are created by that code.
Every Environment Record has an [[OuterEnv]] field, which is either
null
or a reference to an outer Environment Record. This is used to model
the logical nesting of Environment Record values. The outer reference of
an (inner) Environment Record is a reference to the Environment Record
that logically surrounds the inner Environment Record. An outer
Environment Record may, of course, have its own outer Environment
Record. An Environment Record may serve as the outer environment for
multiple inner Environment Records. For example, if a
FunctionDeclaration
contains two nested
FunctionDeclaration
then the Environment Records of each of the nested functions will have
as their outer Environment Record the Environment Record of the current
evaluation of the surrounding function.
Environment Records are purely specification mechanisms and need
not correspond to any specific artefact of an ECMAScript implementation.
It is impossible for an ECMAScript program to directly access or
manipulate such values.
9.1.1
The Environment Record Type Hierarchy
Environment Records
can be thought of as existing in a simple object-oriented hierarchy where
Environment Record
is an abstract class with three concrete subclasses:
Declarative Environment Record
Object Environment Record
, and
Global Environment Record
Function Environment Records
and
Module Environment Records
are subclasses of
Declarative Environment Record
Environment Record
(abstract)
Declarative Environment Record
is used to define the effect of ECMAScript language syntactic elements such as
FunctionDeclaration
s,
VariableDeclaration
s, and
Catch
clauses that directly associate identifier bindings with
ECMAScript language values
Function Environment Record
corresponds to the invocation of an ECMAScript
function object
, and contains bindings for the top-level declarations within that function. It may establish a new
this
binding. It also captures the state necessary to support
super
method invocations.
Module Environment Record
contains the bindings for the top-level declarations of a
Module
. It also contains the bindings that are explicitly imported by the
Module
. Its [[OuterEnv]] is a
Global Environment Record
An
Object Environment Record
is used to define the effect of ECMAScript elements such as
WithStatement
that associate identifier bindings with the properties of some object.
Global Environment Record
is used for
Script
global declarations. It does not have an outer environment; its [[OuterEnv]] is
null
. It may be prepopulated with identifier bindings and it includes an associated
global object
whose properties provide some of the global environment's identifier
bindings. As ECMAScript code is executed, additional properties may be
added to the
global object
and the initial properties may be modified.
The
Environment Record
abstract class includes the abstract specification methods defined in
Table 16
. These abstract methods have distinct concrete algorithms for each of the concrete subclasses.
Table 16: Abstract Methods of
Environment Records
Method
Purpose
HasBinding(N)
Determine if an
Environment Record
has a binding for the String value
. Return
true
if it does and
false
if it does not.
CreateMutableBinding(N, D)
Create a new but uninitialized mutable binding in an
Environment Record
. The String value
is the text of the bound name. If the Boolean argument
is
true
the binding may be subsequently deleted.
CreateImmutableBinding(N, S)
Create a new but uninitialized immutable binding in an
Environment Record
. The String value
is the text of the bound name. If
is
true
then attempts to set it after it has been initialized will always throw
an exception, regardless of the strict mode setting of operations that
reference that binding.
InitializeBinding(N, V)
Set the value of an already existing but uninitialized binding in an
Environment Record
. The String value
is the text of the bound name.
is the value for the binding and is a value of any
ECMAScript language type
SetMutableBinding(N, V, S)
Set the value of an already existing mutable binding in an
Environment Record
. The String value
is the text of the bound name.
is the value for the binding and may be a value of any
ECMAScript language type
is a Boolean
flag. If
is
true
and the binding cannot be set throw a
TypeError
exception.
GetBindingValue(N, S)
Returns the value of an already existing binding from an
Environment Record
. The String value
is the text of the bound name.
is used to identify references originating in
strict mode code
or that otherwise require strict mode reference semantics. If
is
true
and the binding does not exist throw a
ReferenceError
exception. If the binding exists but is uninitialized a
ReferenceError
is thrown, regardless of the value of
DeleteBinding(N)
Delete a binding from an
Environment Record
. The String value
is the text of the bound name. If a binding for
exists, remove the binding and return
true
. If the binding exists but cannot be removed return
false
. If the binding does not exist return
true
HasThisBinding()
Determine if an
Environment Record
establishes a
this
binding. Return
true
if it does and
false
if it does not.
HasSuperBinding()
Determine if an
Environment Record
establishes a
super
method binding. Return
true
if it does and
false
if it does not.
WithBaseObject()
If this
Environment Record
is associated with a
with
statement, return the with object. Otherwise, return
undefined
9.1.1.1
Declarative Environment Records
Each
Declarative Environment Record
is associated with an ECMAScript program scope containing variable,
constant, let, class, module, import, and/or function declarations. A
Declarative Environment Record binds the set of identifiers defined by
the declarations contained within its scope.
The behaviour of the concrete specification methods for Declarative Environment Records is defined by the following algorithms.
9.1.1.1.1
HasBinding (
The HasBinding concrete method of a
Declarative Environment Record
envRec
takes argument
(a String) and returns a
normal completion containing
a Boolean. It determines if the argument identifier is one of the
identifiers bound by the record. It performs the following steps when
called:
1.
If
envRec
has a binding for
, return
true
2.
Return
false
9.1.1.1.2
CreateMutableBinding (
The CreateMutableBinding concrete method of a
Declarative Environment Record
envRec
takes arguments
(a String) and
(a Boolean) and returns a
normal completion containing
unused
. It creates a new mutable binding for the name
that is uninitialized. A binding must not already exist in this
Environment Record
for
. If
is
true
, the new binding is marked as being subject to deletion. It performs the following steps when called:
1.
Assert
envRec
does not already have a binding for
2.
Create a mutable binding in
envRec
for
and record that it is uninitialized. If
is
true
, record that the newly created binding may be deleted by a subsequent DeleteBinding call.
3.
Return
unused
9.1.1.1.3
CreateImmutableBinding (
The CreateImmutableBinding concrete method of a
Declarative Environment Record
envRec
takes arguments
(a String) and
(a Boolean) and returns a
normal completion containing
unused
. It creates a new immutable binding for the name
that is uninitialized. A binding must not already exist in this
Environment Record
for
. If
is
true
, the new binding is marked as a strict binding. It performs the following steps when called:
1.
Assert
envRec
does not already have a binding for
2.
Create an immutable binding in
envRec
for
and record that it is uninitialized. If
is
true
, record that the newly created binding is a strict binding.
3.
Return
unused
9.1.1.1.4
InitializeBinding (
The InitializeBinding concrete method of a
Declarative Environment Record
envRec
takes arguments
(a String) and
(an
ECMAScript language value
) and returns a
normal completion containing
unused
. It is used to set the bound value of the current binding of the identifier whose name is
to the value
. An uninitialized binding for
must already exist. It performs the following steps when called:
1.
Assert
envRec
must have an uninitialized binding for
2.
Set the bound value for
in
envRec
to
3.
Record
that the binding for
in
envRec
has been initialized.
4.
Return
unused
9.1.1.1.5
SetMutableBinding (
The SetMutableBinding concrete method of a
Declarative Environment Record
envRec
takes arguments
(a String),
(an
ECMAScript language value
), and
(a Boolean) and returns either a
normal completion containing
unused
or a
throw completion
. It attempts to change the bound value of the current binding of the identifier whose name is
to the value
. A binding for
normally already exists, but in rare cases it may not. If the binding is an immutable binding, a
TypeError
is thrown if
is
true
. It performs the following steps when called:
1.
If
envRec
does not have a binding for
, then
a.
If
is
true
, throw a
ReferenceError
exception.
b.
Perform !
envRec
.CreateMutableBinding(
true
).
c.
Perform !
envRec
.InitializeBinding(
).
d.
Return
unused
2.
If the binding for
in
envRec
is a strict binding, set
to
true
3.
If the binding for
in
envRec
has not yet been initialized, throw a
ReferenceError
exception.
4.
Else if the binding for
in
envRec
is a mutable binding, change its bound value to
5.
Else,
a.
Assert
: This is an attempt to change the value of an immutable binding.
b.
If
is
true
, throw a
TypeError
exception.
6.
Return
unused
Note
An example of ECMAScript code that results in a missing binding at step
is:
function
) {
eval
"var x; x = (delete x, 0);"
); }
9.1.1.1.6
GetBindingValue (
The GetBindingValue concrete method of a
Declarative Environment Record
envRec
takes arguments
(a String) and
(a Boolean) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It returns the value of its bound identifier whose name is
. If the binding exists but is uninitialized a
ReferenceError
is thrown, regardless of the value of
. It performs the following steps when called:
1.
Assert
envRec
has a binding for
2.
If the binding for
in
envRec
is an uninitialized binding, throw a
ReferenceError
exception.
3.
Return the value currently bound to
in
envRec
9.1.1.1.7
DeleteBinding (
The DeleteBinding concrete method of a
Declarative Environment Record
envRec
takes argument
(a String) and returns a
normal completion containing
a Boolean. It can only delete bindings that have been explicitly
designated as being subject to deletion. It performs the following steps
when called:
1.
Assert
envRec
has a binding for
2.
If the binding for
in
envRec
cannot be deleted, return
false
3.
Remove the binding for
from
envRec
4.
Return
true
9.1.1.1.8
HasThisBinding ( )
The HasThisBinding concrete method of a
Declarative Environment Record
envRec
takes no arguments and returns
false
. It performs the following steps when called:
1.
Return
false
Note
A regular
Declarative Environment Record
(i.e., one that is neither a
Function Environment Record
nor a
Module Environment Record
) does not provide a
this
binding.
9.1.1.1.9
HasSuperBinding ( )
The HasSuperBinding concrete method of a
Declarative Environment Record
envRec
takes no arguments and returns
false
. It performs the following steps when called:
1.
Return
false
Note
A regular
Declarative Environment Record
(i.e., one that is neither a
Function Environment Record
nor a
Module Environment Record
) does not provide a
super
binding.
9.1.1.1.10
WithBaseObject ( )
The WithBaseObject concrete method of a
Declarative Environment Record
envRec
takes no arguments and returns
undefined
. It performs the following steps when called:
1.
Return
undefined
9.1.1.2
Object Environment Records
Each
Object Environment Record
is associated with an object called its
binding object
An Object Environment Record binds the set of string identifier names
that directly correspond to the property names of its binding object.
Property keys
that are not strings in the form of an
IdentifierName
are not included in the set of bound identifiers. Both own and
inherited properties are included in the set regardless of the setting
of their [[Enumerable]] attribute. Because properties can be dynamically
added and deleted from objects, the set of identifiers bound by an
Object Environment Record may potentially change as a side-effect of any
operation that adds or deletes properties. Any bindings that are
created as a result of such a side-effect are considered to be a mutable
binding even if the Writable attribute of the corresponding property is
false
. Immutable bindings do not exist for Object Environment Records.
Object Environment Records created for
with
statements (
14.11
) can provide their binding object as an implicit
this
value for use in function calls. The capability is controlled by a Boolean [[IsWithEnvironment]] field.
Object Environment Records have the additional state fields listed in
Table 17
Table 17: Additional Fields of
Object Environment Records
Field Name
Value
Meaning
[[BindingObject]]
an Object
The binding object of this
Environment Record
[[IsWithEnvironment]]
a Boolean
Indicates whether this
Environment Record
is created for a
with
statement.
The behaviour of the concrete specification methods for Object Environment Records is defined by the following algorithms.
9.1.1.2.1
HasBinding (
The HasBinding concrete method of an
Object Environment Record
envRec
takes argument
(a String) and returns either a
normal completion containing
a Boolean or a
throw completion
. It determines if its associated binding object has a property whose name is
. It performs the following steps when called:
1.
Let
bindingObject
be
envRec
.[[BindingObject]].
2.
Let
foundBinding
be ?
HasProperty
bindingObject
).
3.
If
foundBinding
is
false
, return
false
4.
If
envRec
.[[IsWithEnvironment]] is
false
, return
true
5.
Let
unscopables
be ?
Get
bindingObject
@@unscopables
).
6.
If
unscopables
is an Object
, then
a.
Let
blocked
be
ToBoolean
(?
Get
unscopables
)).
b.
If
blocked
is
true
, return
false
7.
Return
true
9.1.1.2.2
CreateMutableBinding (
The CreateMutableBinding concrete method of an
Object Environment Record
envRec
takes arguments
(a String) and
(a Boolean) and returns either a
normal completion containing
unused
or a
throw completion
. It creates in an
Environment Record
's associated binding object a property whose name is
and initializes it to the value
undefined
. If
is
true
, the new property's [[Configurable]] attribute is set to
true
; otherwise it is set to
false
. It performs the following steps when called:
1.
Let
bindingObject
be
envRec
.[[BindingObject]].
2.
Perform ?
DefinePropertyOrThrow
bindingObject
, PropertyDescriptor { [[Value]]:
undefined
, [[Writable]]:
true
, [[Enumerable]]:
true
, [[Configurable]]:
}).
3.
Return
unused
Note
Normally
envRec
will not have a binding for
but if it does, the semantics of
DefinePropertyOrThrow
may result in an existing binding being replaced or shadowed or cause an
abrupt completion
to be returned.
9.1.1.2.3
CreateImmutableBinding (
The CreateImmutableBinding concrete method of an
Object Environment Record
is never used within this specification.
9.1.1.2.4
InitializeBinding (
The InitializeBinding concrete method of an
Object Environment Record
envRec
takes arguments
(a String) and
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or a
throw completion
. It is used to set the bound value of the current binding of the identifier whose name is
to the value
. It performs the following steps when called:
1.
Perform ?
envRec
.SetMutableBinding
false
).
2.
Return
unused
Note
In this specification, all uses of CreateMutableBinding for
Object Environment Records
are immediately followed by a call to InitializeBinding for the same
name. Hence, this specification does not explicitly track the
initialization state of bindings in
Object Environment Records
9.1.1.2.5
SetMutableBinding (
The SetMutableBinding concrete method of an
Object Environment Record
envRec
takes arguments
(a String),
(an
ECMAScript language value
), and
(a Boolean) and returns either a
normal completion containing
unused
or a
throw completion
. It attempts to set the value of the
Environment Record
's associated binding object's property whose name is
to the value
. A property named
normally already exists but if it does not or is not currently writable, error handling is determined by
. It performs the following steps when called:
1.
Let
bindingObject
be
envRec
.[[BindingObject]].
2.
Let
stillExists
be ?
HasProperty
bindingObject
).
3.
If
stillExists
is
false
and
is
true
, throw a
ReferenceError
exception.
4.
Perform ?
Set
bindingObject
).
5.
Return
unused
9.1.1.2.6
GetBindingValue (
The GetBindingValue concrete method of an
Object Environment Record
envRec
takes arguments
(a String) and
(a Boolean) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It returns the value of its associated binding object's property whose name is
. The property should already exist but if it does not the result depends upon
. It performs the following steps when called:
1.
Let
bindingObject
be
envRec
.[[BindingObject]].
2.
Let
value
be ?
HasProperty
bindingObject
).
3.
If
value
is
false
, then
a.
If
is
false
, return
undefined
; otherwise throw a
ReferenceError
exception.
4.
Return ?
Get
bindingObject
).
9.1.1.2.7
DeleteBinding (
The DeleteBinding concrete method of an
Object Environment Record
envRec
takes argument
(a String) and returns either a
normal completion containing
a Boolean or a
throw completion
It can only delete bindings that correspond to properties of the
environment object whose [[Configurable]] attribute have the value
true
. It performs the following steps when called:
1.
Let
bindingObject
be
envRec
.[[BindingObject]].
2.
Return ?
bindingObject
.[[Delete]]
).
9.1.1.2.8
HasThisBinding ( )
The HasThisBinding concrete method of an
Object Environment Record
envRec
takes no arguments and returns
false
. It performs the following steps when called:
1.
Return
false
Note
Object Environment Records
do not provide a
this
binding.
9.1.1.2.9
HasSuperBinding ( )
The HasSuperBinding concrete method of an
Object Environment Record
envRec
takes no arguments and returns
false
. It performs the following steps when called:
1.
Return
false
Note
Object Environment Records
do not provide a
super
binding.
9.1.1.2.10
WithBaseObject ( )
The WithBaseObject concrete method of an
Object Environment Record
envRec
takes no arguments and returns an Object or
undefined
. It performs the following steps when called:
1.
If
envRec
.[[IsWithEnvironment]] is
true
, return
envRec
.[[BindingObject]].
2.
Otherwise, return
undefined
9.1.1.3
Function Environment Records
Function Environment Record
is a
Declarative Environment Record
that is used to represent the top-level scope of a function and, if the function is not an
ArrowFunction
, provides a
this
binding. If a function is not an
ArrowFunction
function and references
super
, its Function Environment Record also contains the state that is used to perform
super
method invocations from within the function.
Function Environment Records have the additional state fields listed in
Table 18
Table 18: Additional Fields of
Function Environment Records
Field Name
Value
Meaning
[[ThisValue]]
an
ECMAScript language value
This is the
this
value used for this invocation of the function.
[[ThisBindingStatus]]
lexical
initialized
, or
uninitialized
If the value is
lexical
, this is an
ArrowFunction
and does not have a local
this
value.
[[FunctionObject]]
an ECMAScript
function object
The
function object
whose invocation caused this
Environment Record
to be created.
[[NewTarget]]
an Object or
undefined
If this
Environment Record
was created by the [[Construct]] internal method, [[NewTarget]] is the value of the [[Construct]]
newTarget
parameter. Otherwise, its value is
undefined
Function Environment Records support all of the
Declarative Environment Record
methods listed in
Table 16
and share the same specifications for all of those methods except for
HasThisBinding and HasSuperBinding. In addition, Function Environment
Records support the methods listed in
Table 19
Table 19: Additional Methods of
Function Environment Records
Method
Purpose
BindThisValue(V)
Set the [[ThisValue]] and record that it has been initialized.
GetThisBinding()
Return the value of this
Environment Record
's
this
binding. Throws a
ReferenceError
if the
this
binding has not been initialized.
GetSuperBase()
Return the object that is the base for
super
property accesses bound in this
Environment Record
. The value
undefined
indicates that such accesses will produce runtime errors.
The behaviour of the additional concrete specification
methods for Function Environment Records is defined by the following
algorithms:
9.1.1.3.1
BindThisValue (
The BindThisValue concrete method of a
Function Environment Record
envRec
takes argument
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Assert
envRec
.[[ThisBindingStatus]] is not
lexical
2.
If
envRec
.[[ThisBindingStatus]] is
initialized
, throw a
ReferenceError
exception.
3.
Set
envRec
.[[ThisValue]] to
4.
Set
envRec
.[[ThisBindingStatus]] to
initialized
5.
Return
9.1.1.3.2
HasThisBinding ( )
The HasThisBinding concrete method of a
Function Environment Record
envRec
takes no arguments and returns a Boolean. It performs the following steps when called:
1.
If
envRec
.[[ThisBindingStatus]] is
lexical
, return
false
; otherwise, return
true
9.1.1.3.3
HasSuperBinding ( )
The HasSuperBinding concrete method of a
Function Environment Record
envRec
takes no arguments and returns a Boolean. It performs the following steps when called:
1.
If
envRec
.[[ThisBindingStatus]] is
lexical
, return
false
2.
If
envRec
.[[FunctionObject]].[[HomeObject]] is
undefined
, return
false
; otherwise, return
true
9.1.1.3.4
GetThisBinding ( )
The GetThisBinding concrete method of a
Function Environment Record
envRec
takes no arguments and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Assert
envRec
.[[ThisBindingStatus]] is not
lexical
2.
If
envRec
.[[ThisBindingStatus]] is
uninitialized
, throw a
ReferenceError
exception.
3.
Return
envRec
.[[ThisValue]].
9.1.1.3.5
GetSuperBase ( )
The GetSuperBase concrete method of a
Function Environment Record
envRec
takes no arguments and returns either a
normal completion containing
either an Object,
null
, or
undefined
, or a
throw completion
. It performs the following steps when called:
1.
Let
be
envRec
.[[FunctionObject]].[[HomeObject]].
2.
If
is
undefined
, return
undefined
3.
Assert
is an Object
4.
Return ?
.[[GetPrototypeOf]]
().
9.1.1.4
Global Environment Records
Global Environment Record
is used to represent the outer most scope that is shared by all of the ECMAScript
Script
elements that are processed in a common
realm
. A Global Environment Record provides the bindings for built-in globals (clause
19
), properties of the
global object
, and for all top-level declarations (
8.2.9
8.2.11
) that occur within a
Script
A Global Environment Record is logically a single record but it is specified as a composite encapsulating an
Object Environment Record
and a
Declarative Environment Record
. The
Object Environment Record
has as its base object the
global object
of the associated
Realm Record
. This
global object
is the value returned by the Global Environment Record's GetThisBinding concrete method. The
Object Environment Record
component of a Global Environment Record contains the bindings for all built-in globals (clause
19
) and all bindings introduced by a
FunctionDeclaration
GeneratorDeclaration
AsyncFunctionDeclaration
AsyncGeneratorDeclaration
, or
VariableStatement
contained in global code. The bindings for all other ECMAScript declarations in global code are contained in the
Declarative Environment Record
component of the Global Environment Record.
Properties may be created directly on a
global object
. Hence, the
Object Environment Record
component of a Global Environment Record may contain both bindings created explicitly by
FunctionDeclaration
GeneratorDeclaration
AsyncFunctionDeclaration
AsyncGeneratorDeclaration
, or
VariableDeclaration
declarations and bindings created implicitly as properties of the
global object
In order to identify which bindings were explicitly created using
declarations, a Global Environment Record maintains a list of the names
bound using its CreateGlobalVarBinding and CreateGlobalFunctionBinding
concrete methods.
Global Environment Records have the additional fields listed in
Table 20
and the additional methods listed in
Table 21
Table 20: Additional Fields of
Global Environment Records
Field Name
Value
Meaning
[[ObjectRecord]]
an
Object Environment Record
Binding object is the
global object
. It contains global built-in bindings as well as
FunctionDeclaration
GeneratorDeclaration
AsyncFunctionDeclaration
AsyncGeneratorDeclaration
, and
VariableDeclaration
bindings in global code for the associated
realm
[[GlobalThisValue]]
an Object
The value returned by
this
in global scope.
Hosts
may provide any ECMAScript Object value.
[[DeclarativeRecord]]
Declarative Environment Record
Contains
bindings for all declarations in global code for the associated
realm
code except for
FunctionDeclaration
GeneratorDeclaration
AsyncFunctionDeclaration
AsyncGeneratorDeclaration
, and
VariableDeclaration
bindings.
[[VarNames]]
List
of Strings
The string names bound by
FunctionDeclaration
GeneratorDeclaration
AsyncFunctionDeclaration
AsyncGeneratorDeclaration
, and
VariableDeclaration
declarations in global code for the associated
realm
Table 21: Additional Methods of
Global Environment Records
Method
Purpose
GetThisBinding()
Return the value of this
Environment Record
's
this
binding.
HasVarDeclaration (N)
Determines if the argument identifier has a binding in this
Environment Record
that was created using a
VariableDeclaration
FunctionDeclaration
GeneratorDeclaration
AsyncFunctionDeclaration
, or
AsyncGeneratorDeclaration
HasLexicalDeclaration (N)
Determines if the argument identifier has a binding in this
Environment Record
that was created using a lexical declaration such as a
LexicalDeclaration
or a
ClassDeclaration
HasRestrictedGlobalProperty (N)
Determines if the argument is the name of a
global object
property that may not be shadowed by a global lexical binding.
CanDeclareGlobalVar (N)
Determines if a corresponding CreateGlobalVarBinding call would succeed if called for the same argument
CanDeclareGlobalFunction (N)
Determines if a corresponding CreateGlobalFunctionBinding call would succeed if called for the same argument
CreateGlobalVarBinding(N, D)
Used to create and initialize to
undefined
a global
var
binding in the [[ObjectRecord]] component of a
Global Environment Record
. The binding will be a mutable binding. The corresponding
global object
property will have attribute values appropriate for a
var
. The String value
is the bound name. If
is
true
the binding may be deleted. Logically equivalent to
CreateMutableBinding followed by a SetMutableBinding but it allows var
declarations to receive special treatment.
CreateGlobalFunctionBinding(N, V, D)
Create and initialize a global
function
binding in the [[ObjectRecord]] component of a
Global Environment Record
. The binding will be a mutable binding. The corresponding
global object
property will have attribute values appropriate for a
function
. The String value
is the bound name.
is the initialization value. If the Boolean argument
is
true
the binding may be deleted. Logically equivalent to
CreateMutableBinding followed by a SetMutableBinding but it allows
function declarations to receive special treatment.
The behaviour of the concrete specification methods for Global Environment Records is defined by the following algorithms.
9.1.1.4.1
HasBinding (
The HasBinding concrete method of a
Global Environment Record
envRec
takes argument
(a String) and returns either a
normal completion containing
a Boolean or a
throw completion
It determines if the argument identifier is one of the identifiers
bound by the record. It performs the following steps when called:
1.
Let
DclRec
be
envRec
.[[DeclarativeRecord]].
2.
If !
DclRec
.HasBinding(
) is
true
, return
true
3.
Let
ObjRec
be
envRec
.[[ObjectRecord]].
4.
Return ?
ObjRec
.HasBinding
).
9.1.1.4.2
CreateMutableBinding (
The CreateMutableBinding concrete method of a
Global Environment Record
envRec
takes arguments
(a String) and
(a Boolean) and returns either a
normal completion containing
unused
or a
throw completion
. It creates a new mutable binding for the name
that is uninitialized. The binding is created in the associated DeclarativeRecord. A binding for
must not already exist in the DeclarativeRecord. If
is
true
, the new binding is marked as being subject to deletion. It performs the following steps when called:
1.
Let
DclRec
be
envRec
.[[DeclarativeRecord]].
2.
If !
DclRec
.HasBinding(
) is
true
, throw a
TypeError
exception.
3.
Return !
DclRec
.CreateMutableBinding(
).
9.1.1.4.3
CreateImmutableBinding (
The CreateImmutableBinding concrete method of a
Global Environment Record
envRec
takes arguments
(a String) and
(a Boolean) and returns either a
normal completion containing
unused
or a
throw completion
. It creates a new immutable binding for the name
that is uninitialized. A binding must not already exist in this
Environment Record
for
. If
is
true
, the new binding is marked as a strict binding. It performs the following steps when called:
1.
Let
DclRec
be
envRec
.[[DeclarativeRecord]].
2.
If !
DclRec
.HasBinding(
) is
true
, throw a
TypeError
exception.
3.
Return !
DclRec
.CreateImmutableBinding(
).
9.1.1.4.4
InitializeBinding (
The InitializeBinding concrete method of a
Global Environment Record
envRec
takes arguments
(a String) and
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or a
throw completion
. It is used to set the bound value of the current binding of the identifier whose name is
to the value
. An uninitialized binding for
must already exist. It performs the following steps when called:
1.
Let
DclRec
be
envRec
.[[DeclarativeRecord]].
2.
If !
DclRec
.HasBinding(
) is
true
, then
a.
Return !
DclRec
.InitializeBinding(
).
3.
Assert
: If the binding exists, it must be in the
Object Environment Record
4.
Let
ObjRec
be
envRec
.[[ObjectRecord]].
5.
Return ?
ObjRec
.InitializeBinding
).
9.1.1.4.5
SetMutableBinding (
The SetMutableBinding concrete method of a
Global Environment Record
envRec
takes arguments
(a String),
(an
ECMAScript language value
), and
(a Boolean) and returns either a
normal completion containing
unused
or a
throw completion
. It attempts to change the bound value of the current binding of the identifier whose name is
to the value
. If the binding is an immutable binding and
is
true
, a
TypeError
is thrown. A property named
normally already exists but if it does not or is not currently writable, error handling is determined by
. It performs the following steps when called:
1.
Let
DclRec
be
envRec
.[[DeclarativeRecord]].
2.
If !
DclRec
.HasBinding(
) is
true
, then
a.
Return ?
DclRec
.SetMutableBinding(
).
3.
Let
ObjRec
be
envRec
.[[ObjectRecord]].
4.
Return ?
ObjRec
.SetMutableBinding
).
9.1.1.4.6
GetBindingValue (
The GetBindingValue concrete method of a
Global Environment Record
envRec
takes arguments
(a String) and
(a Boolean) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It returns the value of its bound identifier whose name is
. If the binding is an uninitialized binding throw a
ReferenceError
exception. A property named
normally already exists but if it does not or is not currently writable, error handling is determined by
. It performs the following steps when called:
1.
Let
DclRec
be
envRec
.[[DeclarativeRecord]].
2.
If !
DclRec
.HasBinding(
) is
true
, then
a.
Return ?
DclRec
.GetBindingValue(
).
3.
Let
ObjRec
be
envRec
.[[ObjectRecord]].
4.
Return ?
ObjRec
.GetBindingValue
).
9.1.1.4.7
DeleteBinding (
The DeleteBinding concrete method of a
Global Environment Record
envRec
takes argument
(a String) and returns either a
normal completion containing
a Boolean or a
throw completion
It can only delete bindings that have been explicitly designated as
being subject to deletion. It performs the following steps when called:
1.
Let
DclRec
be
envRec
.[[DeclarativeRecord]].
2.
If !
DclRec
.HasBinding(
) is
true
, then
a.
Return !
DclRec
.DeleteBinding(
).
3.
Let
ObjRec
be
envRec
.[[ObjectRecord]].
4.
Let
globalObject
be
ObjRec
.[[BindingObject]].
5.
Let
existingProp
be ?
HasOwnProperty
globalObject
).
6.
If
existingProp
is
true
, then
a.
Let
status
be ?
ObjRec
.DeleteBinding
).
b.
If
status
is
true
and
envRec
.[[VarNames]] contains
, then
i.
Remove
from
envRec
.[[VarNames]].
c.
Return
status
7.
Return
true
9.1.1.4.8
HasThisBinding ( )
The HasThisBinding concrete method of a
Global Environment Record
envRec
takes no arguments and returns
true
. It performs the following steps when called:
1.
Return
true
Note
Global Environment Records
always provide a
this
binding.
9.1.1.4.9
HasSuperBinding ( )
The HasSuperBinding concrete method of a
Global Environment Record
envRec
takes no arguments and returns
false
. It performs the following steps when called:
1.
Return
false
Note
Global Environment Records
do not provide a
super
binding.
9.1.1.4.10
WithBaseObject ( )
The WithBaseObject concrete method of a
Global Environment Record
envRec
takes no arguments and returns
undefined
. It performs the following steps when called:
1.
Return
undefined
9.1.1.4.11
GetThisBinding ( )
The GetThisBinding concrete method of a
Global Environment Record
envRec
takes no arguments and returns a
normal completion containing
an Object. It performs the following steps when called:
1.
Return
envRec
.[[GlobalThisValue]].
9.1.1.4.12
HasVarDeclaration (
The HasVarDeclaration concrete method of a
Global Environment Record
envRec
takes argument
(a String) and returns a Boolean. It determines if the argument
identifier has a binding in this record that was created using a
VariableStatement
or a
FunctionDeclaration
. It performs the following steps when called:
1.
Let
varDeclaredNames
be
envRec
.[[VarNames]].
2.
If
varDeclaredNames
contains
, return
true
3.
Return
false
9.1.1.4.13
HasLexicalDeclaration (
The HasLexicalDeclaration concrete method of a
Global Environment Record
envRec
takes argument
(a String) and returns a Boolean. It determines if the argument
identifier has a binding in this record that was created using a lexical
declaration such as a
LexicalDeclaration
or a
ClassDeclaration
. It performs the following steps when called:
1.
Let
DclRec
be
envRec
.[[DeclarativeRecord]].
2.
Return !
DclRec
.HasBinding(
).
9.1.1.4.14
HasRestrictedGlobalProperty (
The HasRestrictedGlobalProperty concrete method of a
Global Environment Record
envRec
takes argument
(a String) and returns either a
normal completion containing
a Boolean or a
throw completion
. It determines if the argument identifier is the name of a property of the
global object
that must not be shadowed by a global lexical binding. It performs the following steps when called:
1.
Let
ObjRec
be
envRec
.[[ObjectRecord]].
2.
Let
globalObject
be
ObjRec
.[[BindingObject]].
3.
Let
existingProp
be ?
globalObject
.[[GetOwnProperty]]
).
4.
If
existingProp
is
undefined
, return
false
5.
If
existingProp
.[[Configurable]] is
true
, return
false
6.
Return
true
Note
Properties may exist upon a
global object
that were directly created rather than being declared using a var or
function declaration. A global lexical binding may not be created that
has the same name as a non-configurable property of the
global object
. The global property
"undefined"
is an example of such a property.
9.1.1.4.15
CanDeclareGlobalVar (
The CanDeclareGlobalVar concrete method of a
Global Environment Record
envRec
takes argument
(a String) and returns either a
normal completion containing
a Boolean or a
throw completion
. It determines if a corresponding CreateGlobalVarBinding call would succeed if called for the same argument
. Redundant var declarations and var declarations for pre-existing
global object
properties are allowed. It performs the following steps when called:
1.
Let
ObjRec
be
envRec
.[[ObjectRecord]].
2.
Let
globalObject
be
ObjRec
.[[BindingObject]].
3.
Let
hasProperty
be ?
HasOwnProperty
globalObject
).
4.
If
hasProperty
is
true
, return
true
5.
Return ?
IsExtensible
globalObject
).
9.1.1.4.16
CanDeclareGlobalFunction (
The CanDeclareGlobalFunction concrete method of a
Global Environment Record
envRec
takes argument
(a String) and returns either a
normal completion containing
a Boolean or a
throw completion
. It determines if a corresponding CreateGlobalFunctionBinding call would succeed if called for the same argument
. It performs the following steps when called:
1.
Let
ObjRec
be
envRec
.[[ObjectRecord]].
2.
Let
globalObject
be
ObjRec
.[[BindingObject]].
3.
Let
existingProp
be ?
globalObject
.[[GetOwnProperty]]
).
4.
If
existingProp
is
undefined
, return ?
IsExtensible
globalObject
).
5.
If
existingProp
.[[Configurable]] is
true
, return
true
6.
If
IsDataDescriptor
existingProp
) is
true
and
existingProp
has attribute values { [[Writable]]:
true
, [[Enumerable]]:
true
}, return
true
7.
Return
false
9.1.1.4.17
CreateGlobalVarBinding (
The CreateGlobalVarBinding concrete method of a
Global Environment Record
envRec
takes arguments
(a String) and
(a Boolean) and returns either a
normal completion containing
unused
or a
throw completion
. It creates and initializes a mutable binding in the associated
Object Environment Record
and records the bound name in the associated [[VarNames]]
List
. If a binding already exists, it is reused and assumed to be initialized. It performs the following steps when called:
1.
Let
ObjRec
be
envRec
.[[ObjectRecord]].
2.
Let
globalObject
be
ObjRec
.[[BindingObject]].
3.
Let
hasProperty
be ?
HasOwnProperty
globalObject
).
4.
Let
extensible
be ?
IsExtensible
globalObject
).
5.
If
hasProperty
is
false
and
extensible
is
true
, then
a.
Perform ?
ObjRec
.CreateMutableBinding
).
b.
Perform ?
ObjRec
.InitializeBinding
undefined
).
6.
If
envRec
.[[VarNames]] does not contain
, then
a.
Append
to
envRec
.[[VarNames]].
7.
Return
unused
9.1.1.4.18
CreateGlobalFunctionBinding (
The CreateGlobalFunctionBinding concrete method of a
Global Environment Record
envRec
takes arguments
(a String),
(an
ECMAScript language value
), and
(a Boolean) and returns either a
normal completion containing
unused
or a
throw completion
. It creates and initializes a mutable binding in the associated
Object Environment Record
and records the bound name in the associated [[VarNames]]
List
. If a binding already exists, it is replaced. It performs the following steps when called:
1.
Let
ObjRec
be
envRec
.[[ObjectRecord]].
2.
Let
globalObject
be
ObjRec
.[[BindingObject]].
3.
Let
existingProp
be ?
globalObject
.[[GetOwnProperty]]
).
4.
If
existingProp
is
undefined
or
existingProp
.[[Configurable]] is
true
, then
a.
Let
desc
be the PropertyDescriptor { [[Value]]:
, [[Writable]]:
true
, [[Enumerable]]:
true
, [[Configurable]]:
}.
5.
Else,
a.
Let
desc
be the PropertyDescriptor { [[Value]]:
}.
6.
Perform ?
DefinePropertyOrThrow
globalObject
desc
).
7.
Perform ?
Set
globalObject
false
).
8.
If
envRec
.[[VarNames]] does not contain
, then
a.
Append
to
envRec
.[[VarNames]].
9.
Return
unused
Note
Global function declarations are always represented as own properties of the
global object
. If possible, an existing own property is reconfigured to have a standard set of attribute values. Step
is equivalent to what calling the InitializeBinding concrete method would do and if
globalObject
is a Proxy will produce the same sequence of Proxy trap calls.
9.1.1.5
Module Environment Records
Module Environment Record
is a
Declarative Environment Record
that is used to represent the outer scope of an ECMAScript
Module
In additional to normal mutable and immutable bindings, Module
Environment Records also provide immutable import bindings which are
bindings that provide indirect access to a target binding that exists in
another
Environment Record
Module Environment Records support all of the
Declarative Environment Record
methods listed in
Table 16
and share the same specifications for all of those methods except for
GetBindingValue, DeleteBinding, HasThisBinding and GetThisBinding. In
addition, Module Environment Records support the methods listed in
Table 22
Table 22: Additional Methods of
Module Environment Records
Method
Purpose
CreateImportBinding(N, M, N2)
Create an immutable indirect binding in a
Module Environment Record
. The String value
is the text of the bound name.
is a
Module Record
, and
N2
is a binding that exists in
's
Module Environment Record
GetThisBinding()
Return the value of this
Environment Record
's
this
binding.
The behaviour of the additional concrete specification
methods for Module Environment Records are defined by the following
algorithms:
9.1.1.5.1
GetBindingValue (
The GetBindingValue concrete method of a
Module Environment Record
envRec
takes arguments
(a String) and
(a Boolean) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It returns the value of its bound identifier whose name is
However, if the binding is an indirect binding the value of the target
binding is returned. If the binding exists but is uninitialized a
ReferenceError
is thrown. It performs the following steps when called:
1.
Assert
is
true
2.
Assert
envRec
has a binding for
3.
If the binding for
is an indirect binding, then
a.
Let
and
N2
be the indirection values provided when this binding for
was created.
b.
Let
targetEnv
be
.[[Environment]].
c.
If
targetEnv
is
empty
, throw a
ReferenceError
exception.
d.
Return ?
targetEnv
.GetBindingValue
N2
true
).
4.
If the binding for
in
envRec
is an uninitialized binding, throw a
ReferenceError
exception.
5.
Return the value currently bound to
in
envRec
Note
will always be
true
because a
Module
is always
strict mode code
9.1.1.5.2
DeleteBinding (
The DeleteBinding concrete method of a
Module Environment Record
is never used within this specification.
Note
Module Environment Records
are only used within strict code and an
early error
rule prevents the delete operator, in strict code, from being applied to a
Reference Record
that would resolve to a
Module Environment Record
binding. See
13.5.1.1
9.1.1.5.3
HasThisBinding ( )
The HasThisBinding concrete method of a
Module Environment Record
envRec
takes no arguments and returns
true
. It performs the following steps when called:
1.
Return
true
Note
Module Environment Records
always provide a
this
binding.
9.1.1.5.4
GetThisBinding ( )
The GetThisBinding concrete method of a
Module Environment Record
envRec
takes no arguments and returns a
normal completion containing
undefined
. It performs the following steps when called:
1.
Return
undefined
9.1.1.5.5
CreateImportBinding (
N2
The CreateImportBinding concrete method of a
Module Environment Record
envRec
takes arguments
(a String),
(a
Module Record
), and
N2
(a String) and returns
unused
. It creates a new initialized immutable indirect binding for the name
. A binding must not already exist in this
Environment Record
for
N2
is the name of a binding that exists in
's
Module Environment Record
Accesses to the value of the new binding will indirectly access the
bound value of the target binding. It performs the following steps when
called:
1.
Assert
envRec
does not already have a binding for
2.
Assert
: When
.[[Environment]] is instantiated, it will have a direct binding for
N2
3.
Create an immutable indirect binding in
envRec
for
that references
and
N2
as its target binding and record that the binding is initialized.
4.
Return
unused
9.1.2
Environment Record Operations
The following
abstract operations
are used in this specification to operate upon
Environment Records
9.1.2.1
GetIdentifierReference (
env
name
strict
The abstract operation GetIdentifierReference takes arguments
env
(an
Environment Record
or
null
),
name
(a String), and
strict
(a Boolean) and returns either a
normal completion containing
Reference Record
or a
throw completion
. It performs the following steps when called:
1.
If
env
is
null
, then
a.
Return the
Reference Record
{ [[Base]]:
unresolvable
, [[ReferencedName]]:
name
, [[Strict]]:
strict
, [[ThisValue]]:
empty
}.
2.
Let
exists
be ?
env
.HasBinding
name
).
3.
If
exists
is
true
, then
a.
Return the
Reference Record
{ [[Base]]:
env
, [[ReferencedName]]:
name
, [[Strict]]:
strict
, [[ThisValue]]:
empty
}.
4.
Else,
a.
Let
outer
be
env
.[[OuterEnv]].
b.
Return ?
GetIdentifierReference
outer
name
strict
).
9.1.2.2
NewDeclarativeEnvironment (
The abstract operation NewDeclarativeEnvironment takes argument
(an
Environment Record
or
null
) and returns a
Declarative Environment Record
. It performs the following steps when called:
1.
Let
env
be a new
Declarative Environment Record
containing no bindings.
2.
Set
env
.[[OuterEnv]] to
3.
Return
env
9.1.2.3
NewObjectEnvironment (
The abstract operation NewObjectEnvironment takes arguments
(an Object),
(a Boolean), and
(an
Environment Record
or
null
) and returns an
Object Environment Record
. It performs the following steps when called:
1.
Let
env
be a new
Object Environment Record
2.
Set
env
.[[BindingObject]] to
3.
Set
env
.[[IsWithEnvironment]] to
4.
Set
env
.[[OuterEnv]] to
5.
Return
env
9.1.2.4
NewFunctionEnvironment (
newTarget
The abstract operation NewFunctionEnvironment takes arguments
(an ECMAScript function) and
newTarget
(an Object or
undefined
) and returns a
Function Environment Record
. It performs the following steps when called:
1.
Let
env
be a new
Function Environment Record
containing no bindings.
2.
Set
env
.[[FunctionObject]] to
3.
If
.[[ThisMode]] is
lexical
, set
env
.[[ThisBindingStatus]] to
lexical
4.
Else, set
env
.[[ThisBindingStatus]] to
uninitialized
5.
Set
env
.[[NewTarget]] to
newTarget
6.
Set
env
.[[OuterEnv]] to
.[[Environment]].
7.
Return
env
9.1.2.5
NewGlobalEnvironment (
thisValue
The abstract operation NewGlobalEnvironment takes arguments
(an Object) and
thisValue
(an Object) and returns a
Global Environment Record
. It performs the following steps when called:
1.
Let
objRec
be
NewObjectEnvironment
false
null
).
2.
Let
dclRec
be
NewDeclarativeEnvironment
null
).
3.
Let
env
be a new
Global Environment Record
4.
Set
env
.[[ObjectRecord]] to
objRec
5.
Set
env
.[[GlobalThisValue]] to
thisValue
6.
Set
env
.[[DeclarativeRecord]] to
dclRec
7.
Set
env
.[[VarNames]] to a new empty
List
8.
Set
env
.[[OuterEnv]] to
null
9.
Return
env
9.1.2.6
NewModuleEnvironment (
The abstract operation NewModuleEnvironment takes argument
(an
Environment Record
) and returns a
Module Environment Record
. It performs the following steps when called:
1.
Let
env
be a new
Module Environment Record
containing no bindings.
2.
Set
env
.[[OuterEnv]] to
3.
Return
env
9.2
PrivateEnvironment Records
PrivateEnvironment Record
is a specification mechanism used to track
Private Names
based upon the lexical nesting structure of
ClassDeclaration
s and
ClassExpression
s in ECMAScript code. They are similar to, but distinct from,
Environment Records
. Each
PrivateEnvironment Record
is associated with a
ClassDeclaration
or
ClassExpression
. Each time such a class is evaluated, a new
PrivateEnvironment Record
is created to record the
Private Names
declared by that class.
Each
PrivateEnvironment Record
has the fields defined in
Table 23
Table 23:
PrivateEnvironment Record
Fields
Field Name
Value Type
Meaning
[[OuterPrivateEnvironment]]
PrivateEnvironment Record
or
null
The
PrivateEnvironment Record
of the nearest containing class.
null
if the class with which this
PrivateEnvironment Record
is associated is not contained in any other class.
[[Names]]
List
of
Private Names
The
Private Names
declared by this class.
9.2.1
PrivateEnvironment Record Operations
The following
abstract operations
are used in this specification to operate upon
PrivateEnvironment Records
9.2.1.1
NewPrivateEnvironment (
outerPrivEnv
The abstract operation NewPrivateEnvironment takes argument
outerPrivEnv
(a
PrivateEnvironment Record
or
null
) and returns a
PrivateEnvironment Record
. It performs the following steps when called:
1.
Let
names
be a new empty
List
2.
Return the
PrivateEnvironment Record
{ [[OuterPrivateEnvironment]]:
outerPrivEnv
, [[Names]]:
names
}.
9.2.1.2
ResolvePrivateIdentifier (
privEnv
identifier
The abstract operation ResolvePrivateIdentifier takes arguments
privEnv
(a
PrivateEnvironment Record
) and
identifier
(a String) and returns a
Private Name
. It performs the following steps when called:
1.
Let
names
be
privEnv
.[[Names]].
2.
For each
Private Name
pn
of
names
, do
a.
If
pn
.[[Description]] is
identifier
, then
i.
Return
pn
3.
Let
outerPrivEnv
be
privEnv
.[[OuterPrivateEnvironment]].
4.
Assert
outerPrivEnv
is not
null
5.
Return
ResolvePrivateIdentifier
outerPrivEnv
identifier
).
9.3
Realms
Before it is evaluated, all ECMAScript code must be associated with a
realm
. Conceptually, a
realm
consists of a set of intrinsic objects, an ECMAScript global
environment, all of the ECMAScript code that is loaded within the scope
of that global environment, and other associated state and resources.
realm
is represented in this specification as a
Realm Record
with the fields specified in
Table 24
Table 24:
Realm Record
Fields
Field Name
Value
Meaning
[[Intrinsics]]
Record
whose field names are intrinsic keys and whose values are objects
The intrinsic values used by code associated with this
realm
[[GlobalObject]]
an Object or
undefined
The
global object
for this
realm
[[GlobalEnv]]
Global Environment Record
The global environment for this
realm
[[TemplateMap]]
List
of
Records
with fields [[Site]] (a
TemplateLiteral
Parse Node
) and [[Array]] (an Array)
Template objects are canonicalized separately for each
realm
using its
Realm Record
's [[TemplateMap]]. Each [[Site]] value is a
Parse Node
that is a
TemplateLiteral
. The associated [[Array]] value is the corresponding template object that is passed to a tag function.
Note 1
Once a
Parse Node
becomes unreachable, the corresponding [[Array]] is also unreachable,
and it would be unobservable if an implementation removed the pair from
the [[TemplateMap]] list.
[[LoadedModules]]
List
of
Records
with fields [[Specifier]] (a String) and [[Module]] (a
Module Record
A map from the specifier strings imported by this
realm
to the resolved
Module Record
. The list does not contain two different
Records
with the same [[Specifier]].
Note 2
As mentioned in
HostLoadImportedModule
16.2.1.8 Note 1
), [[LoadedModules]] in
Realm Records
is only used when running an
import()
expression in a context where there is no
active script or module
[[HostDefined]]
anything (default value is
undefined
Field reserved for use by
hosts
that need to associate additional information with a
Realm Record
9.3.1
CreateRealm ( )
The abstract operation CreateRealm takes no arguments and returns a
Realm Record
. It performs the following steps when called:
1.
Let
realmRec
be a new
Realm Record
2.
Perform
CreateIntrinsics
realmRec
).
3.
Set
realmRec
.[[GlobalObject]] to
undefined
4.
Set
realmRec
.[[GlobalEnv]] to
undefined
5.
Set
realmRec
.[[TemplateMap]] to a new empty
List
6.
Return
realmRec
9.3.2
CreateIntrinsics (
realmRec
The abstract operation CreateIntrinsics takes argument
realmRec
(a
Realm Record
) and returns
unused
. It performs the following steps when called:
1.
Set
realmRec
.[[Intrinsics]] to a new
Record
2.
Set fields of
realmRec
.[[Intrinsics]] with the values listed in
Table 6
The field names are the names listed in column one of the table. The
value of each field is a new object value fully and recursively
populated with property values as defined by the specification of each
object in clauses
19
through
28
. All object property values are newly created object values. All values that are built-in
function objects
are created by performing
CreateBuiltinFunction
steps
length
name
slots
realmRec
prototype
) where
steps
is the definition of that function provided by this specification,
name
is the initial value of the function's
"name"
property,
length
is the initial value of the function's
"length"
property,
slots
is a list of the names, if any, of the function's specified internal slots, and
prototype
is the specified value of the function's [[Prototype]] internal slot.
The creation of the intrinsics and their properties must be ordered to
avoid any dependencies upon objects that have not yet been created.
3.
Perform
AddRestrictedFunctionProperties
realmRec
.[[Intrinsics]].[[
%Function.prototype%
]],
realmRec
).
4.
Return
unused
9.3.3
SetRealmGlobalObject (
realmRec
globalObj
thisValue
The abstract operation SetRealmGlobalObject takes arguments
realmRec
(a
Realm Record
),
globalObj
(an Object or
undefined
), and
thisValue
(an Object or
undefined
) and returns
unused
. It performs the following steps when called:
1.
If
globalObj
is
undefined
, then
a.
Let
intrinsics
be
realmRec
.[[Intrinsics]].
b.
Set
globalObj
to
OrdinaryObjectCreate
intrinsics
.[[
%Object.prototype%
]]).
2.
Assert
globalObj
is an Object
3.
If
thisValue
is
undefined
, set
thisValue
to
globalObj
4.
Set
realmRec
.[[GlobalObject]] to
globalObj
5.
Let
newGlobalEnv
be
NewGlobalEnvironment
globalObj
thisValue
).
6.
Set
realmRec
.[[GlobalEnv]] to
newGlobalEnv
7.
Return
unused
9.3.4
SetDefaultGlobalBindings (
realmRec
The abstract operation SetDefaultGlobalBindings takes argument
realmRec
(a
Realm Record
) and returns either a
normal completion containing
an Object or a
throw completion
. It performs the following steps when called:
1.
Let
global
be
realmRec
.[[GlobalObject]].
2.
For each property of the Global Object specified in clause
19
, do
a.
Let
name
be the String value of the
property name
b.
Let
desc
be the fully populated data
Property Descriptor
for the property, containing the specified attributes for the property. For properties listed in
19.2
19.3
, or
19.4
the value of the [[Value]] attribute is the corresponding intrinsic object from
realmRec
c.
Perform ?
DefinePropertyOrThrow
global
name
desc
).
3.
Return
global
9.4
Execution Contexts
An
execution context
is a
specification device that is used to track the runtime evaluation of
code by an ECMAScript implementation. At any point in time, there is at
most one execution context per
agent
that is actually executing code. This is known as the
agent
's
running execution context
. All references to the
running execution context
in this specification denote the
running execution context
of the
surrounding agent
The
execution context stack
is used to track execution contexts. The
running execution context
is always the top element of this stack. A new execution context is
created whenever control is transferred from the executable code
associated with the currently
running execution context
to executable code that is not associated with that execution context.
The newly created execution context is pushed onto the stack and becomes
the
running execution context
An execution context contains whatever implementation specific
state is necessary to track the execution progress of its associated
code. Each execution context has at least the state components listed in
Table 25
Table 25: State Components for All Execution Contexts
Component
Purpose
code evaluation state
Any state needed to perform, suspend, and resume evaluation of the code associated with this
execution context
Function
If this
execution context
is evaluating the code of a
function object
, then the value of this component is that
function object
. If the context is evaluating the code of a
Script
or
Module
, the value is
null
Realm
The
Realm Record
from which associated code accesses ECMAScript resources.
ScriptOrModule
The
Module Record
or
Script Record
from which associated code originates. If there is no originating script or module, as is the case for the original
execution context
created in
InitializeHostDefinedRealm
, the value is
null
Evaluation
of code by the
running execution context
may be suspended at various points defined within this specification. Once the
running execution context
has been suspended a different execution context may become the
running execution context
and commence evaluating its code. At some later time a suspended execution context may again become the
running execution context
and continue evaluating its code at the point where it had previously been suspended. Transition of the
running execution context
status among execution contexts usually occurs in stack-like
last-in/first-out manner. However, some ECMAScript features require
non-LIFO transitions of the
running execution context
The value of the
Realm
component of the
running execution context
is also called
the current Realm Record
. The value of the Function component of the
running execution context
is also called the
active function object
ECMAScript code execution contexts
have the additional state components listed in
Table 26
Table 26: Additional State Components for ECMAScript Code Execution Contexts
Component
Purpose
LexicalEnvironment
Identifies the
Environment Record
used to resolve identifier references made by code within this
execution context
VariableEnvironment
Identifies the
Environment Record
that holds bindings created by
VariableStatement
s within this
execution context
PrivateEnvironment
Identifies the
PrivateEnvironment Record
that holds
Private Names
created by
ClassElement
s in the nearest containing class.
null
if there is no containing class.
The LexicalEnvironment and VariableEnvironment components of an execution context are always
Environment Records
Execution contexts representing the evaluation of Generators have the additional state components listed in
Table 27
Table 27: Additional State Components for Generator Execution Contexts
Component
Purpose
Generator
The Generator that this
execution context
is evaluating.
In most situations only the
running execution context
(the top of the
execution context stack
is directly manipulated by algorithms within this specification. Hence
when the terms “LexicalEnvironment”, and “VariableEnvironment” are used
without qualification they are in reference to those components of the
running execution context
An execution context is purely a specification mechanism and need
not correspond to any particular artefact of an ECMAScript
implementation. It is impossible for ECMAScript code to directly access
or observe an execution context.
9.4.1
GetActiveScriptOrModule ( )
The abstract operation GetActiveScriptOrModule takes no arguments and returns a
Script Record
, a
Module Record
, or
null
. It is used to determine the running script or module, based on the
running execution context
. It performs the following steps when called:
1.
If the
execution context stack
is empty, return
null
2.
Let
ec
be the topmost
execution context
on the
execution context stack
whose ScriptOrModule component is not
null
3.
If no such
execution context
exists, return
null
. Otherwise, return
ec
's ScriptOrModule.
9.4.2
ResolveBinding (
name
[ ,
env
] )
The abstract operation ResolveBinding takes argument
name
(a String) and optional argument
env
(an
Environment Record
or
undefined
) and returns either a
normal completion containing
Reference Record
or a
throw completion
. It is used to determine the binding of
name
env
can be used to explicitly provide the
Environment Record
that is to be searched for the binding. It performs the following steps when called:
1.
If
env
is not present or
env
is
undefined
, then
a.
Set
env
to the
running execution context
's LexicalEnvironment.
2.
Assert
env
is an
Environment Record
3.
If the
source text matched by
the syntactic production that is being evaluated is contained in
strict mode code
, let
strict
be
true
; else let
strict
be
false
4.
Return ?
GetIdentifierReference
env
name
strict
).
Note
The result of ResolveBinding is always a
Reference Record
whose [[ReferencedName]] field is
name
9.4.3
GetThisEnvironment ( )
The abstract operation GetThisEnvironment takes no arguments and returns an
Environment Record
. It finds the
Environment Record
that currently supplies the binding of the
keyword
this
. It performs the following steps when called:
1.
Let
env
be the
running execution context
's LexicalEnvironment.
2.
Repeat,
a.
Let
exists
be
env
.HasThisBinding().
b.
If
exists
is
true
, return
env
c.
Let
outer
be
env
.[[OuterEnv]].
d.
Assert
outer
is not
null
e.
Set
env
to
outer
Note
The loop in step
will always terminate because the list of environments always ends with the global environment which has a
this
binding.
9.4.4
ResolveThisBinding ( )
The abstract operation ResolveThisBinding takes no arguments and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It determines the binding of the
keyword
this
using the LexicalEnvironment of the
running execution context
. It performs the following steps when called:
1.
Let
envRec
be
GetThisEnvironment
().
2.
Return ?
envRec
.GetThisBinding().
9.4.5
GetNewTarget ( )
The abstract operation GetNewTarget takes no arguments and returns an Object or
undefined
. It determines the NewTarget value using the LexicalEnvironment of the
running execution context
. It performs the following steps when called:
1.
Let
envRec
be
GetThisEnvironment
().
2.
Assert
envRec
has a [[NewTarget]] field.
3.
Return
envRec
.[[NewTarget]].
9.4.6
GetGlobalObject ( )
The abstract operation GetGlobalObject takes no arguments and returns an Object. It returns the
global object
used by the currently
running execution context
. It performs the following steps when called:
1.
Let
currentRealm
be
the current Realm Record
2.
Return
currentRealm
.[[GlobalObject]].
9.5
Jobs and Host Operations to Enqueue Jobs
Job
is an
Abstract Closure
with no parameters that initiates an ECMAScript computation when no other ECMAScript computation is currently in progress.
Jobs
are scheduled for execution by ECMAScript
host environments
. This specification describes the
host hook
HostEnqueuePromiseJob
to schedule one kind of job;
hosts
may define additional
abstract operations
which schedule jobs. Such operations accept a
Job
Abstract Closure
as the parameter and schedule it to be performed at some future time.
Their implementations must conform to the following requirements:
At some future point in time, when there is no
running execution context
and the
execution context stack
is empty, the implementation must:
Perform any
host-defined
preparation steps.
Invoke
the
Job
Abstract Closure
Perform any
host-defined
cleanup steps, after which the
execution context stack
must be empty.
Only one
Job
may be actively undergoing evaluation at any point in time.
Once evaluation of a
Job
starts, it must run to completion before evaluation of any other
Job
starts.
The
Abstract Closure
must return a
normal completion
, implementing its own handling of errors.
Note 1
Host environments
are not required to treat
Jobs
uniformly with respect to scheduling. For example, web browsers and Node.js treat Promise-handling
Jobs
as a higher priority than other work; future features may add
Jobs
that are not treated at such a high priority.
At any particular time,
scriptOrModule
(a
Script Record
, a
Module Record
, or
null
) is the
active script or module
if all of the following conditions are true:
GetActiveScriptOrModule
() is
scriptOrModule
If
scriptOrModule
is a
Script Record
or
Module Record
, let
ec
be the topmost
execution context
on the
execution context stack
whose ScriptOrModule component is
scriptOrModule
. The
Realm
component of
ec
is
scriptOrModule
.[[Realm]].
At any particular time, an execution is
prepared to evaluate ECMAScript code
if all of the following conditions are true:
The
execution context stack
is not empty.
The
Realm
component of the topmost
execution context
on the
execution context stack
is a
Realm Record
Note 2
Host environments
may prepare an execution to evaluate code by pushing
execution contexts
onto the
execution context stack
. The specific steps are
implementation-defined
The specific choice of
Realm
is up to the
host environment
. This initial
execution context
and
Realm
is only in use before any callback function is invoked. When a callback function related to a
Job
, like a Promise handler, is invoked, the invocation pushes its own
execution context
and
Realm
Particular kinds of
Jobs
have additional conformance requirements.
9.5.1
JobCallback Records
JobCallback Record
is a
Record
value used to store a
function object
and a
host-defined
value.
Function objects
that are invoked via a
Job
enqueued by the
host
may have additional
host-defined
context. To propagate the state,
Job
Abstract Closures
should not capture and call
function objects
directly. Instead, use
HostMakeJobCallback
and
HostCallJobCallback
Note
The WHATWG HTML specification (
), for example, uses the
host-defined
value to propagate the incumbent settings object for Promise callbacks.
JobCallback Records have the fields listed in
Table 28
Table 28:
JobCallback Record
Fields
Field Name
Value
Meaning
[[Callback]]
function object
The function to invoke when the
Job
is invoked.
[[HostDefined]]
anything (default value is
empty
Field reserved for use by
hosts
9.5.2
HostMakeJobCallback (
callback
The
host-defined
abstract operation HostMakeJobCallback takes argument
callback
(a
function object
) and returns a
JobCallback Record
An implementation of HostMakeJobCallback must conform to the following requirements:
It must return a
JobCallback Record
whose [[Callback]] field is
callback
The default implementation of HostMakeJobCallback performs the following steps when called:
1.
Return the
JobCallback Record
{ [[Callback]]:
callback
, [[HostDefined]]:
empty
}.
ECMAScript
hosts
that are not web browsers must use the default implementation of HostMakeJobCallback.
Note
This is called at the time that the callback is passed to the
function that is responsible for its being eventually scheduled and
run. For example,
promise.then(thenAction)
calls MakeJobCallback on
thenAction
at the time of invoking
Promise.prototype.then
, not at the time of scheduling the reaction
Job
9.5.3
HostCallJobCallback (
jobCallback
argumentsList
The
host-defined
abstract operation HostCallJobCallback takes arguments
jobCallback
(a
JobCallback Record
),
(an
ECMAScript language value
), and
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
An implementation of HostCallJobCallback must conform to the following requirements:
It must perform and return the result of
Call
jobCallback
.[[Callback]],
argumentsList
).
Note
This requirement means that
hosts
cannot change the [[Call]] behaviour of
function objects
defined in this specification.
The default implementation of HostCallJobCallback performs the following steps when called:
1.
Assert
IsCallable
jobCallback
.[[Callback]]) is
true
2.
Return ?
Call
jobCallback
.[[Callback]],
argumentsList
).
ECMAScript
hosts
that are not web browsers must use the default implementation of HostCallJobCallback.
9.5.4
HostEnqueuePromiseJob (
job
realm
The
host-defined
abstract operation HostEnqueuePromiseJob takes arguments
job
(a
Job
Abstract Closure
) and
realm
(a
Realm Record
or
null
) and returns
unused
. It schedules
job
to be performed at some future time. The
Abstract Closures
used with this algorithm are intended to be related to the handling of
Promises, or otherwise, to be scheduled with equal priority to Promise
handling operations.
An implementation of HostEnqueuePromiseJob must conform to the requirements in
9.5
as well as the following:
If
realm
is not
null
, each time
job
is invoked the implementation must perform
implementation-defined
steps such that execution is
prepared to evaluate ECMAScript code
at the time of
job
's invocation.
Let
scriptOrModule
be
GetActiveScriptOrModule
() at the time HostEnqueuePromiseJob is invoked. If
realm
is not
null
, each time
job
is invoked the implementation must perform
implementation-defined
steps such that
scriptOrModule
is the
active script or module
at the time of
job
's invocation.
Jobs
must run in the same order as the HostEnqueuePromiseJob invocations that scheduled them.
Note
The
realm
for
Jobs
returned by
NewPromiseResolveThenableJob
is usually the result of calling
GetFunctionRealm
on the
then
function object
. The
realm
for
Jobs
returned by
NewPromiseReactionJob
is usually the result of calling
GetFunctionRealm
on the handler if the handler is not
undefined
. If the handler is
undefined
realm
is
null
. For both kinds of
Jobs
, when
GetFunctionRealm
completes abnormally (i.e. called on a revoked Proxy),
realm
is the current
Realm
at the time of the
GetFunctionRealm
call. When the
realm
is
null
no user ECMAScript code will be evaluated and no new ECMAScript objects
(e.g. Error objects) will be created. The WHATWG HTML specification (
), for example, uses
realm
to check for the ability to run script and for the
entry
concept.
9.6
InitializeHostDefinedRealm ( )
The abstract operation InitializeHostDefinedRealm takes no arguments and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
realm
be
CreateRealm
().
2.
Let
newContext
be a new
execution context
3.
Set the Function of
newContext
to
null
4.
Set the
Realm
of
newContext
to
realm
5.
Set the ScriptOrModule of
newContext
to
null
6.
Push
newContext
onto the
execution context stack
newContext
is now the
running execution context
7.
If the
host
requires use of an
exotic object
to serve as
realm
's
global object
, let
global
be such an object created in a
host-defined
manner. Otherwise, let
global
be
undefined
, indicating that an
ordinary object
should be created as the
global object
8.
If the
host
requires that the
this
binding in
realm
's global scope return an object other than the
global object
, let
thisValue
be such an object created in a
host-defined
manner. Otherwise, let
thisValue
be
undefined
, indicating that
realm
's global
this
binding should be the
global object
9.
Perform
SetRealmGlobalObject
realm
global
thisValue
).
10.
Let
globalObj
be ?
SetDefaultGlobalBindings
realm
).
11.
Create any
host-defined
global object
properties on
globalObj
12.
Return
unused
9.7
Agents
An
agent
comprises a set of ECMAScript
execution contexts
, an
execution context stack
, a
running execution context
, an
Agent Record
, and an
executing thread
. Except for the
executing thread
, the constituents of an
agent
belong exclusively to that
agent
An
agent
's
executing thread
executes a job on the
agent
's
execution contexts
independently of other
agents
, except that an
executing thread
may be used as the
executing thread
by multiple
agents
, provided none of the
agents
sharing the thread have an
Agent Record
whose [[CanBlock]] field is
true
Note 1
Some web browsers share a single
executing thread
across multiple unrelated tabs of a browser window, for example.
While an
agent
's
executing thread
executes jobs, the
agent
is the
surrounding agent
for the code in those jobs. The code uses the
surrounding agent
to access the specification-level execution objects held within the
agent
: the
running execution context
, the
execution context stack
, and the
Agent Record
's fields.
An
agent signifier
is a globally-unique opaque value used to identify an
Agent
Table 29:
Agent Record
Fields
Field Name
Value
Meaning
[[LittleEndian]]
a Boolean
The default value computed for the
isLittleEndian
parameter when it is needed by the algorithms
GetValueFromBuffer
and
SetValueInBuffer
. The choice is
implementation-defined
and should be the alternative that is most efficient for the implementation. Once the value has been observed it cannot change.
[[CanBlock]]
a Boolean
Determines whether the
agent
can block or not.
[[Signifier]]
an
agent signifier
Uniquely identifies the
agent
within its
agent cluster
[[IsLockFree1]]
a Boolean
true
if atomic operations on one-
byte values
are lock-free,
false
otherwise.
[[IsLockFree2]]
a Boolean
true
if atomic operations on two-
byte values
are lock-free,
false
otherwise.
[[IsLockFree8]]
a Boolean
true
if atomic operations on eight-
byte values
are lock-free,
false
otherwise.
[[CandidateExecution]]
candidate execution
Record
See the
memory model
[[KeptAlive]]
List
of either Objects or Symbols
Initially a new empty
List
, representing the list of objects and/or symbols to be kept alive until the end of the current
Job
Once the values of [[Signifier]], [[IsLockFree1]], and [[IsLockFree2]] have been observed by any
agent
in the
agent cluster
they cannot change.
Note 2
The values of [[IsLockFree1]] and [[IsLockFree2]] are not
necessarily determined by the hardware, but may also reflect
implementation choices that can vary over time and between ECMAScript
implementations.
There is no [[IsLockFree4]] field: 4-byte atomic operations are always lock-free.
In practice, if an atomic operation is implemented with any
type of lock the operation is not lock-free. Lock-free does not imply
wait-free: there is no upper bound on how many machine steps may be
required to complete a lock-free atomic operation.
That an atomic access of size
is lock-free does not imply anything about the (perceived) atomicity of non-atomic accesses of size
, specifically, non-atomic accesses may still be performed as a sequence of several separate memory accesses. See
ReadSharedMemory
and
WriteSharedMemory
for details.
Note 3
An
agent
is a specification mechanism and need not correspond to any particular artefact of an ECMAScript implementation.
9.7.1
AgentSignifier ( )
The abstract operation AgentSignifier takes no arguments and returns an
agent signifier
. It performs the following steps when called:
1.
Let
AR
be the
Agent Record
of the
surrounding agent
2.
Return
AR
.[[Signifier]].
9.7.2
AgentCanSuspend ( )
The abstract operation AgentCanSuspend takes no arguments and returns a Boolean. It performs the following steps when called:
1.
Let
AR
be the
Agent Record
of the
surrounding agent
2.
Return
AR
.[[CanBlock]].
Note
In some environments it may not be reasonable for a given
agent
to suspend. For example, in a web browser environment, it may be
reasonable to disallow suspending a document's main event handling
thread, while still allowing workers' event handling threads to suspend.
9.8
Agent Clusters
An
agent cluster
is a maximal set of
agents
that can communicate by operating on shared memory.
Note 1
Programs within different
agents
may share memory by unspecified means. At a minimum, the backing memory for SharedArrayBuffers can be shared among the
agents
in the cluster.
There may be
agents
that can communicate by message passing that cannot share memory; they are never in the same agent cluster.
Every
agent
belongs to exactly one agent cluster.
Note 2
The
agents
in a cluster need not all be alive at some particular point in time. If
agent
creates another
agent
, after which
terminates and
creates
agent
, the three
agents
are in the same cluster if
could share some memory with
and
could share some memory with
All
agents
within a cluster must have the same value for the [[LittleEndian]] field in their respective
Agent Records
Note 3
If different
agents
within an agent cluster have different values of [[LittleEndian]] it becomes hard to use shared memory for multi-byte data.
All
agents
within a cluster must have the same values for the [[IsLockFree1]] field in their respective
Agent Records
; similarly for the [[IsLockFree2]] field.
All
agents
within a cluster must have different values for the [[Signifier]] field in their respective
Agent Records
An embedding may deactivate (stop forward progress) or activate (resume forward progress) an
agent
without the
agent
's knowledge or cooperation. If the embedding does so, it must not leave some
agents
in the cluster active while other
agents
in the cluster are deactivated indefinitely.
Note 4
The purpose of the preceding restriction is to avoid a situation where an
agent
deadlocks or starves because another
agent
has been deactivated. For example, if an HTML shared worker that has a
lifetime independent of documents in any windows were allowed to share
memory with the dedicated worker of such an independent document, and
the document and its dedicated worker were to be deactivated while the
dedicated worker holds a lock (say, the document is pushed into its
window's history), and the shared worker then tries to acquire the lock,
then the shared worker will be blocked until the dedicated worker is
activated again, if ever. Meanwhile other workers trying to access the
shared worker from other windows will starve.
The implication of the restriction is that it will not be possible to share memory between
agents
that don't belong to the same suspend/wake collective within the embedding.
An embedding may terminate an
agent
without any of the
agent
's cluster's other
agents
' prior knowledge or cooperation. If an
agent
is terminated not by programmatic action of its own or of another
agent
in the cluster but by forces external to the cluster, then the
embedding must choose one of two strategies: Either terminate all the
agents
in the cluster, or provide reliable APIs that allow the
agents
in the cluster to coordinate so that at least one remaining member of
the cluster will be able to detect the termination, with the termination
data containing enough information to identify the
agent
that was terminated.
Note 5
Examples of that type of termination are: operating systems or users terminating
agents
that are running in separate processes; the embedding itself terminating an
agent
that is running in-process with the other
agents
when per-
agent
resource accounting indicates that the
agent
is runaway.
Prior to any evaluation of any ECMAScript code by any
agent
in a cluster, the [[CandidateExecution]] field of the
Agent Record
for all
agents
in the cluster is set to the initial
candidate execution
. The initial
candidate execution
is an
empty candidate execution
whose [[EventsRecords]] field is a
List
containing, for each
agent
, an
Agent Events Record
whose [[AgentSignifier]] field is that
agent
's
agent signifier
, and whose [[EventList]] and [[AgentSynchronizesWith]] fields are empty
Lists
Note 6
All
agents
in an agent cluster share the same
candidate execution
in its
Agent Record
's [[CandidateExecution]] field. The
candidate execution
is a specification mechanism used by the
memory model
Note 7
An agent cluster is a specification mechanism and need not
correspond to any particular artefact of an ECMAScript implementation.
9.9
Forward Progress
For an
agent
to
make forward progress
is for it to perform an evaluation step according to this specification.
An
agent
becomes
blocked
when its
running execution context
waits synchronously and indefinitely for an external event. Only
agents
whose
Agent Record
's [[CanBlock]] field is
true
can become blocked in this sense. An
unblocked
agent
is one that is not blocked.
Implementations must ensure that:
every unblocked
agent
with a dedicated
executing thread
eventually makes forward progress
in a set of
agents
that share an
executing thread
, one
agent
eventually makes forward progress
an
agent
does not cause another
agent
to become blocked except via explicit APIs that provide blocking.
Note
This, along with the liveness guarantee in the
memory model
, ensures that all
SeqCst
writes eventually become observable to all
agents
9.10
Processing Model of WeakRef and FinalizationRegistry Targets
9.10.1
Objectives
This specification does not make any guarantees that any object
or symbol will be garbage collected. Objects or symbols which are not
live
may be released after long periods of time, or never at all. For this
reason, this specification uses the term "may" when describing behaviour
triggered by garbage collection.
The semantics of
WeakRefs
and
FinalizationRegistrys
is based on two operations which happen at particular points in time:
When
WeakRef.prototype.deref
is called, the referent (if
undefined
is not returned) is kept alive so that subsequent, synchronous accesses
also return the same value. This list is reset when synchronous work is
done using the
ClearKeptObjects
abstract operation.
When an object or symbol which is registered with a
FinalizationRegistry
becomes unreachable, a call of the
FinalizationRegistry
's cleanup callback may eventually be made, after synchronous ECMAScript execution completes. The
FinalizationRegistry
cleanup is performed with the
CleanupFinalizationRegistry
abstract operation.
Neither of these actions (
ClearKeptObjects
or
CleanupFinalizationRegistry
) may interrupt synchronous ECMAScript execution. Because
hosts
may assemble longer, synchronous ECMAScript execution runs, this specification defers the scheduling of
ClearKeptObjects
and
CleanupFinalizationRegistry
to the
host environment
Some ECMAScript implementations include garbage collector
implementations which run in the background, including when ECMAScript
is idle. Letting the
host environment
schedule
CleanupFinalizationRegistry
allows it to resume ECMAScript execution in order to run finalizer
work, which may free up held values, reducing overall memory usage.
9.10.2
Liveness
For some set of objects and/or symbols
hypothetical WeakRef-oblivious
execution with respect to
is an execution whereby the abstract operation
WeakRefDeref
of a
WeakRef
whose referent is an element of
always returns
undefined
Note 1
WeakRef
-obliviousness, together with liveness, capture two notions. One, that a
WeakRef
itself does not keep its referent alive. Two, that cycles in liveness
does not imply that a value is live. To be concrete, if determining
's liveness depends on determining the liveness of a
WeakRef
referent,
's liveness cannot assume
's liveness, which would be circular reasoning.
Note 2
WeakRef
-obliviousness
is defined on sets of objects or symbols instead of individual values
to account for cycles. If it were defined on individual values, then a
WeakRef
referent in a cycle will be considered live even though its identity is only observed via other
WeakRef
referents in the cycle.
Note 3
Colloquially, we say that an individual object or symbol is live if every set containing it is live.
At any point during evaluation, a set of objects and/or symbols
is considered
live
if either of the following conditions is met:
Any element in
is included in any
agent
's [[KeptAlive]]
List
There exists a valid future hypothetical WeakRef-oblivious execution with respect to
that observes the identity of any value in
Note 4
The second condition above intends to capture the intuition that a value is live if its identity is observable via non-
WeakRef
means. A value's identity may be observed by observing a strict
equality comparison or observing the value being used as key in a Map.
Note 5
Presence of an object or a symbol in a field, an internal
slot, or a property does not imply that the value is live. For example
if the value in question is never passed back to the program, then it
cannot be observed.
This is the case for keys in a WeakMap, members of a WeakSet,
as well as the [[WeakRefTarget]] and [[UnregisterToken]] fields of a
FinalizationRegistry
Cell record.
The above definition implies that, if a key in a WeakMap is
not live, then its corresponding value is not necessarily live either.
Note 6
Liveness is the lower bound for guaranteeing which
WeakRefs
engines must not empty. Liveness as defined here is undecidable. In
practice, engines use conservative approximations such as reachability.
There is expected to be significant implementation leeway.
9.10.3
Execution
At any time, if a set of objects and/or symbols
is not
live
, an ECMAScript implementation may perform the following steps atomically:
1.
For each element
value
of
, do
a.
For each
WeakRef
ref
such that
ref
.[[WeakRefTarget]] is
value
, do
i.
Set
ref
.[[WeakRefTarget]] to
empty
b.
For each
FinalizationRegistry
fg
such that
fg
.[[Cells]] contains a
Record
cell
such that
cell
.[[WeakRefTarget]] is
value
, do
i.
Set
cell
.[[WeakRefTarget]] to
empty
ii.
Optionally, perform
HostEnqueueFinalizationRegistryCleanupJob
fg
).
c.
For each WeakMap
map
such that
map
.[[WeakMapData]] contains a
Record
such that
.[[Key]] is
value
, do
i.
Set
.[[Key]] to
empty
ii.
Set
.[[Value]] to
empty
d.
For each WeakSet
set
such that
set
.[[WeakSetData]] contains
value
, do
i.
Replace the element of
set
.[[WeakSetData]] whose value is
value
with an element whose value is
empty
Note 1
Together with the definition of liveness, this clause prescribes optimizations that an implementation may apply regarding
WeakRefs
It is possible to access an object without observing its
identity. Optimizations such as dead variable elimination and scalar
replacement on properties of non-escaping objects whose identity is not
observed are allowed. These optimizations are thus allowed to observably
empty
WeakRefs
that point to such objects.
On the other hand, if an object's identity is observable, and that object is in the [[WeakRefTarget]] internal slot of a
WeakRef
, optimizations such as rematerialization that observably empty the
WeakRef
are prohibited.
Because calling
HostEnqueueFinalizationRegistryCleanupJob
is optional, registered objects in a
FinalizationRegistry
do not necessarily hold that
FinalizationRegistry
live
. Implementations may omit
FinalizationRegistry
callbacks for any reason, e.g., if the
FinalizationRegistry
itself becomes dead, or if the application is shutting down.
Note 2
Implementations are not obligated to empty
WeakRefs
for maximal sets of non-
live
objects or symbols.
If an implementation chooses a non-
live
set
in which to empty
WeakRefs
, this definition requires that it empties
WeakRefs
for all values in
simultaneously. In other words, it is not conformant for an implementation to empty a
WeakRef
pointing to a value
without emptying out other
WeakRefs
that, if not emptied, could result in an execution that observes the value of
9.10.4
Host Hooks
9.10.4.1
HostEnqueueFinalizationRegistryCleanupJob (
finalizationRegistry
The
host-defined
abstract operation HostEnqueueFinalizationRegistryCleanupJob takes argument
finalizationRegistry
(a
FinalizationRegistry
) and returns
unused
Let
cleanupJob
be a new
Job
Abstract Closure
with no parameters that captures
finalizationRegistry
and performs the following steps when called:
1.
Let
cleanupResult
be
Completion
CleanupFinalizationRegistry
finalizationRegistry
)).
2.
If
cleanupResult
is an
abrupt completion
, perform any
host-defined
steps for reporting the error.
3.
Return
unused
An implementation of HostEnqueueFinalizationRegistryCleanupJob schedules
cleanupJob
to be performed at some future time, if possible. It must also conform to the requirements in
9.5
9.11
ClearKeptObjects ( )
The abstract operation ClearKeptObjects takes no arguments and returns
unused
ECMAScript implementations are expected to call ClearKeptObjects when a
synchronous sequence of ECMAScript executions completes. It performs
the following steps when called:
1.
Let
agentRecord
be the
surrounding agent
's
Agent Record
2.
Set
agentRecord
.[[KeptAlive]] to a new empty
List
3.
Return
unused
9.12
AddToKeptObjects (
value
The abstract operation AddToKeptObjects takes argument
value
(an Object or a Symbol) and returns
unused
. It performs the following steps when called:
1.
Let
agentRecord
be the
surrounding agent
's
Agent Record
2.
Append
value
to
agentRecord
.[[KeptAlive]].
3.
Return
unused
Note
When the abstract operation AddToKeptObjects is called with a
target object or symbol, it adds the target to a list that will point
strongly at the target until
ClearKeptObjects
is called.
9.13
CleanupFinalizationRegistry (
finalizationRegistry
The abstract operation CleanupFinalizationRegistry takes argument
finalizationRegistry
(a
FinalizationRegistry
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Assert
finalizationRegistry
has [[Cells]] and [[CleanupCallback]] internal slots.
2.
Let
callback
be
finalizationRegistry
.[[CleanupCallback]].
3.
While
finalizationRegistry
.[[Cells]] contains a
Record
cell
such that
cell
.[[WeakRefTarget]] is
empty
, an implementation may perform the following steps:
a.
Choose any such
cell
b.
Remove
cell
from
finalizationRegistry
.[[Cells]].
c.
Perform ?
HostCallJobCallback
callback
undefined
, «
cell
.[[HeldValue]] »).
4.
Return
unused
9.14
CanBeHeldWeakly (
The abstract operation CanBeHeldWeakly takes argument
(an
ECMAScript language value
) and returns a Boolean. It returns
true
if and only if
is suitable for use as a weak reference. Only values that are suitable
for use as a weak reference may be a key of a WeakMap, an element of a
WeakSet, the target of a
WeakRef
, or one of the targets of a
FinalizationRegistry
. It performs the following steps when called:
1.
If
is an Object
, return
true
2.
If
is a Symbol
and
KeyForSymbol
) is
undefined
, return
true
3.
Return
false
Note
A language value without
language identity
can be manifested without prior reference and is unsuitable for use as a weak reference. A Symbol value produced by
Symbol.for
, unlike other Symbol values, does not have language identity and is unsuitable for use as a weak reference.
Well-known symbols
are likely to never be collected, but are nonetheless treated as
suitable for use as a weak reference because they are limited in number
and therefore manageable by a variety of implementation approaches.
However, any value associated to a well-known symbol in a
live
WeakMap is unlikely to be collected and could “leak” memory resources in implementations.
10
Ordinary and Exotic Objects Behaviours
10.1
Ordinary Object Internal Methods and Internal Slots
All
ordinary objects
have an internal slot called [[Prototype]]. The value of this internal slot is either
null
or an object and is used for implementing inheritance. Assume a property named
is missing from an
ordinary object
but exists on its [[Prototype]] object. If
refers to a
data property
on the [[Prototype]] object,
inherits it for get access, making it behave as if
was a property of
. If
refers to a writable
data property
on the [[Prototype]] object, set access of
on
creates a new
data property
named
on
. If
refers to a non-writable
data property
on the [[Prototype]] object, set access of
on
fails. If
refers to an
accessor property
on the [[Prototype]] object, the accessor is inherited by
for both get access and set access.
Every
ordinary object
has a Boolean-valued [[Extensible]] internal slot which is used to
fulfill the extensibility-related internal method invariants specified
in
6.1.7.3
. Namely, once the value of an object's [[Extensible]] internal slot has been set to
false
it is no longer possible to add properties to the object, to modify the
value of the object's [[Prototype]] internal slot, or to subsequently
change the value of [[Extensible]] to
true
In the following algorithm descriptions, assume
is an
ordinary object
is a
property key
value,
is any
ECMAScript language value
, and
Desc
is a
Property Descriptor
record.
Each
ordinary object
internal method delegates to a similarly-named abstract operation. If
such an abstract operation depends on another internal method, then the
internal method is invoked on
rather than calling the similarly-named abstract operation directly. These semantics ensure that
exotic objects
have their overridden internal methods invoked when
ordinary object
internal methods are applied to them.
10.1.1
[[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of an
ordinary object
takes no arguments and returns a
normal completion containing
either an Object or
null
. It performs the following steps when called:
1.
Return
OrdinaryGetPrototypeOf
).
10.1.1.1
OrdinaryGetPrototypeOf (
The abstract operation OrdinaryGetPrototypeOf takes argument
(an Object) and returns an Object or
null
. It performs the following steps when called:
1.
Return
.[[Prototype]].
10.1.2
[[SetPrototypeOf]] (
The [[SetPrototypeOf]] internal method of an
ordinary object
takes argument
(an Object or
null
) and returns a
normal completion containing
a Boolean. It performs the following steps when called:
1.
Return
OrdinarySetPrototypeOf
).
10.1.2.1
OrdinarySetPrototypeOf (
The abstract operation OrdinarySetPrototypeOf takes arguments
(an Object) and
(an Object or
null
) and returns a Boolean. It performs the following steps when called:
1.
Let
current
be
.[[Prototype]].
2.
If
SameValue
current
) is
true
, return
true
3.
Let
extensible
be
.[[Extensible]].
4.
If
extensible
is
false
, return
false
5.
Let
be
6.
Let
done
be
false
7.
Repeat, while
done
is
false
a.
If
is
null
, set
done
to
true
b.
Else if
SameValue
) is
true
, return
false
c.
Else,
i.
If
.[[GetPrototypeOf]] is not the
ordinary object
internal method defined in
10.1.1
, set
done
to
true
ii.
Else, set
to
.[[Prototype]].
8.
Set
.[[Prototype]] to
9.
Return
true
Note
The loop in step
guarantees that there will be no circularities in any prototype chain that only includes objects that use the
ordinary object
definitions for [[GetPrototypeOf]] and [[SetPrototypeOf]].
10.1.3
[[IsExtensible]] ( )
The [[IsExtensible]] internal method of an
ordinary object
takes no arguments and returns a
normal completion containing
a Boolean. It performs the following steps when called:
1.
Return
OrdinaryIsExtensible
).
10.1.3.1
OrdinaryIsExtensible (
The abstract operation OrdinaryIsExtensible takes argument
(an Object) and returns a Boolean. It performs the following steps when called:
1.
Return
.[[Extensible]].
10.1.4
[[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of an
ordinary object
takes no arguments and returns a
normal completion containing
true
. It performs the following steps when called:
1.
Return
OrdinaryPreventExtensions
).
10.1.4.1
OrdinaryPreventExtensions (
The abstract operation OrdinaryPreventExtensions takes argument
(an Object) and returns
true
. It performs the following steps when called:
1.
Set
.[[Extensible]] to
false
2.
Return
true
10.1.5
[[GetOwnProperty]] (
The [[GetOwnProperty]] internal method of an
ordinary object
takes argument
(a
property key
) and returns a
normal completion containing
either a
Property Descriptor
or
undefined
. It performs the following steps when called:
1.
Return
OrdinaryGetOwnProperty
).
10.1.5.1
OrdinaryGetOwnProperty (
The abstract operation OrdinaryGetOwnProperty takes arguments
(an Object) and
(a
property key
) and returns a
Property Descriptor
or
undefined
. It performs the following steps when called:
1.
If
does not have an own property with key
, return
undefined
2.
Let
be a newly created
Property Descriptor
with no fields.
3.
Let
be
's own property whose key is
4.
If
is a
data property
, then
a.
Set
.[[Value]] to the value of
's [[Value]] attribute.
b.
Set
.[[Writable]] to the value of
's [[Writable]] attribute.
5.
Else,
a.
Assert
is an
accessor property
b.
Set
.[[Get]] to the value of
's [[Get]] attribute.
c.
Set
.[[Set]] to the value of
's [[Set]] attribute.
6.
Set
.[[Enumerable]] to the value of
's [[Enumerable]] attribute.
7.
Set
.[[Configurable]] to the value of
's [[Configurable]] attribute.
8.
Return
10.1.6
[[DefineOwnProperty]] (
Desc
The [[DefineOwnProperty]] internal method of an
ordinary object
takes arguments
(a
property key
) and
Desc
(a
Property Descriptor
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Return ?
OrdinaryDefineOwnProperty
Desc
).
10.1.6.1
OrdinaryDefineOwnProperty (
Desc
The abstract operation OrdinaryDefineOwnProperty takes arguments
(an Object),
(a
property key
), and
Desc
(a
Property Descriptor
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Let
current
be ?
.[[GetOwnProperty]]
).
2.
Let
extensible
be ?
IsExtensible
).
3.
Return
ValidateAndApplyPropertyDescriptor
extensible
Desc
current
).
10.1.6.2
IsCompatiblePropertyDescriptor (
Extensible
Desc
Current
The abstract operation IsCompatiblePropertyDescriptor takes arguments
Extensible
(a Boolean),
Desc
(a
Property Descriptor
), and
Current
(a
Property Descriptor
) and returns a Boolean. It performs the following steps when called:
1.
Return
ValidateAndApplyPropertyDescriptor
undefined
""
Extensible
Desc
Current
).
10.1.6.3
ValidateAndApplyPropertyDescriptor (
extensible
Desc
current
The abstract operation ValidateAndApplyPropertyDescriptor takes arguments
(an Object or
undefined
),
(a
property key
),
extensible
(a Boolean),
Desc
(a
Property Descriptor
), and
current
(a
Property Descriptor
or
undefined
) and returns a Boolean. It returns
true
if and only if
Desc
can be applied as the property of an object with specified
extensibility
and current property
current
while upholding
invariants
. When such application is possible and
is not
undefined
, it is performed for the property named
(which is created if necessary). It performs the following steps when called:
1.
Assert
IsPropertyKey
) is
true
2.
If
current
is
undefined
, then
a.
If
extensible
is
false
, return
false
b.
If
is
undefined
, return
true
c.
If
IsAccessorDescriptor
Desc
) is
true
, then
i.
Create an own
accessor property
named
of object
whose [[Get]], [[Set]], [[Enumerable]], and [[Configurable]] attributes are set to the value of the corresponding field in
Desc
if
Desc
has that field, or to the attribute's
default value
otherwise.
d.
Else,
i.
Create an own
data property
named
of object
whose [[Value]], [[Writable]], [[Enumerable]], and [[Configurable]]
attributes are set to the value of the corresponding field in
Desc
if
Desc
has that field, or to the attribute's
default value
otherwise.
e.
Return
true
3.
Assert
current
is a
fully populated Property Descriptor
4.
If
Desc
does not have any fields, return
true
5.
If
current
.[[Configurable]] is
false
, then
a.
If
Desc
has a [[Configurable]] field and
Desc
.[[Configurable]] is
true
, return
false
b.
If
Desc
has an [[Enumerable]] field and
SameValue
Desc
.[[Enumerable]],
current
.[[Enumerable]]) is
false
, return
false
c.
If
IsGenericDescriptor
Desc
) is
false
and
SameValue
IsAccessorDescriptor
Desc
),
IsAccessorDescriptor
current
)) is
false
, return
false
d.
If
IsAccessorDescriptor
current
) is
true
, then
i.
If
Desc
has a [[Get]] field and
SameValue
Desc
.[[Get]],
current
.[[Get]]) is
false
, return
false
ii.
If
Desc
has a [[Set]] field and
SameValue
Desc
.[[Set]],
current
.[[Set]]) is
false
, return
false
e.
Else if
current
.[[Writable]] is
false
, then
i.
If
Desc
has a [[Writable]] field and
Desc
.[[Writable]] is
true
, return
false
ii.
If
Desc
has a [[Value]] field and
SameValue
Desc
.[[Value]],
current
.[[Value]]) is
false
, return
false
6.
If
is not
undefined
, then
a.
If
IsDataDescriptor
current
) is
true
and
IsAccessorDescriptor
Desc
) is
true
, then
i.
If
Desc
has a [[Configurable]] field, let
configurable
be
Desc
.[[Configurable]]; else let
configurable
be
current
.[[Configurable]].
ii.
If
Desc
has a [[Enumerable]] field, let
enumerable
be
Desc
.[[Enumerable]]; else let
enumerable
be
current
.[[Enumerable]].
iii.
Replace the property named
of object
with an
accessor property
whose [[Configurable]] and [[Enumerable]] attributes are set to
configurable
and
enumerable
, respectively, and whose [[Get]] and [[Set]] attributes are set to the value of the corresponding field in
Desc
if
Desc
has that field, or to the attribute's
default value
otherwise.
b.
Else if
IsAccessorDescriptor
current
) is
true
and
IsDataDescriptor
Desc
) is
true
, then
i.
If
Desc
has a [[Configurable]] field, let
configurable
be
Desc
.[[Configurable]]; else let
configurable
be
current
.[[Configurable]].
ii.
If
Desc
has a [[Enumerable]] field, let
enumerable
be
Desc
.[[Enumerable]]; else let
enumerable
be
current
.[[Enumerable]].
iii.
Replace the property named
of object
with a
data property
whose [[Configurable]] and [[Enumerable]] attributes are set to
configurable
and
enumerable
, respectively, and whose [[Value]] and [[Writable]] attributes are set to the value of the corresponding field in
Desc
if
Desc
has that field, or to the attribute's
default value
otherwise.
c.
Else,
i.
For each field of
Desc
, set the corresponding attribute of the property named
of object
to the value of the field.
7.
Return
true
10.1.7
[[HasProperty]] (
The [[HasProperty]] internal method of an
ordinary object
takes argument
(a
property key
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Return ?
OrdinaryHasProperty
).
10.1.7.1
OrdinaryHasProperty (
The abstract operation OrdinaryHasProperty takes arguments
(an Object) and
(a
property key
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Let
hasOwn
be ?
.[[GetOwnProperty]]
).
2.
If
hasOwn
is not
undefined
, return
true
3.
Let
parent
be ?
.[[GetPrototypeOf]]
().
4.
If
parent
is not
null
, then
a.
Return ?
parent
.[[HasProperty]]
).
5.
Return
false
10.1.8
[[Get]] (
Receiver
The [[Get]] internal method of an
ordinary object
takes arguments
(a
property key
) and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Return ?
OrdinaryGet
Receiver
).
10.1.8.1
OrdinaryGet (
Receiver
The abstract operation OrdinaryGet takes arguments
(an Object),
(a
property key
), and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
desc
be ?
.[[GetOwnProperty]]
).
2.
If
desc
is
undefined
, then
a.
Let
parent
be ?
.[[GetPrototypeOf]]
().
b.
If
parent
is
null
, return
undefined
c.
Return ?
parent
.[[Get]]
Receiver
).
3.
If
IsDataDescriptor
desc
) is
true
, return
desc
.[[Value]].
4.
Assert
IsAccessorDescriptor
desc
) is
true
5.
Let
getter
be
desc
.[[Get]].
6.
If
getter
is
undefined
, return
undefined
7.
Return ?
Call
getter
Receiver
).
10.1.9
[[Set]] (
Receiver
The [[Set]] internal method of an
ordinary object
takes arguments
(a
property key
),
(an
ECMAScript language value
), and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Return ?
OrdinarySet
Receiver
).
10.1.9.1
OrdinarySet (
Receiver
The abstract operation OrdinarySet takes arguments
(an Object),
(a
property key
),
(an
ECMAScript language value
), and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Let
ownDesc
be ?
.[[GetOwnProperty]]
).
2.
Return ?
OrdinarySetWithOwnDescriptor
Receiver
ownDesc
).
10.1.9.2
OrdinarySetWithOwnDescriptor (
Receiver
ownDesc
The abstract operation OrdinarySetWithOwnDescriptor takes arguments
(an Object),
(a
property key
),
(an
ECMAScript language value
),
Receiver
(an
ECMAScript language value
), and
ownDesc
(a
Property Descriptor
or
undefined
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
ownDesc
is
undefined
, then
a.
Let
parent
be ?
.[[GetPrototypeOf]]
().
b.
If
parent
is not
null
, then
i.
Return ?
parent
.[[Set]]
Receiver
).
c.
Else,
i.
Set
ownDesc
to the PropertyDescriptor { [[Value]]:
undefined
, [[Writable]]:
true
, [[Enumerable]]:
true
, [[Configurable]]:
true
}.
2.
If
IsDataDescriptor
ownDesc
) is
true
, then
a.
If
ownDesc
.[[Writable]] is
false
, return
false
b.
If
Receiver
is not an Object
, return
false
c.
Let
existingDescriptor
be ?
Receiver
.[[GetOwnProperty]]
).
d.
If
existingDescriptor
is not
undefined
, then
i.
If
IsAccessorDescriptor
existingDescriptor
) is
true
, return
false
ii.
If
existingDescriptor
.[[Writable]] is
false
, return
false
iii.
Let
valueDesc
be the PropertyDescriptor { [[Value]]:
}.
iv.
Return ?
Receiver
.[[DefineOwnProperty]]
valueDesc
).
e.
Else,
i.
Assert
Receiver
does not currently have a property
ii.
Return ?
CreateDataProperty
Receiver
).
3.
Assert
IsAccessorDescriptor
ownDesc
) is
true
4.
Let
setter
be
ownDesc
.[[Set]].
5.
If
setter
is
undefined
, return
false
6.
Perform ?
Call
setter
Receiver
, «
»).
7.
Return
true
10.1.10
[[Delete]] (
The [[Delete]] internal method of an
ordinary object
takes argument
(a
property key
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Return ?
OrdinaryDelete
).
10.1.10.1
OrdinaryDelete (
The abstract operation OrdinaryDelete takes arguments
(an Object) and
(a
property key
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Let
desc
be ?
.[[GetOwnProperty]]
).
2.
If
desc
is
undefined
, return
true
3.
If
desc
.[[Configurable]] is
true
, then
a.
Remove the own property with name
from
b.
Return
true
4.
Return
false
10.1.11
[[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of an
ordinary object
takes no arguments and returns a
normal completion containing
List
of
property keys
. It performs the following steps when called:
1.
Return
OrdinaryOwnPropertyKeys
).
10.1.11.1
OrdinaryOwnPropertyKeys (
The abstract operation OrdinaryOwnPropertyKeys takes argument
(an Object) and returns a
List
of
property keys
. It performs the following steps when called:
1.
Let
keys
be a new empty
List
2.
For each own
property key
of
such that
is an
array index
, in ascending numeric index order, do
a.
Append
to
keys
3.
For each own
property key
of
such that
is a String
and
is not an
array index
, in ascending chronological order of property creation, do
a.
Append
to
keys
4.
For each own
property key
of
such that
is a Symbol
, in ascending chronological order of property creation, do
a.
Append
to
keys
5.
Return
keys
10.1.12
OrdinaryObjectCreate (
proto
[ ,
additionalInternalSlotsList
] )
The abstract operation OrdinaryObjectCreate takes argument
proto
(an Object or
null
) and optional argument
additionalInternalSlotsList
(a
List
of names of internal slots) and returns an Object. It is used to specify the runtime creation of new
ordinary objects
additionalInternalSlotsList
contains the names of additional internal slots that must be defined as
part of the object, beyond [[Prototype]] and [[Extensible]]. If
additionalInternalSlotsList
is not provided, a new empty
List
is used. It performs the following steps when called:
1.
Let
internalSlotsList
be « [[Prototype]], [[Extensible]] ».
2.
If
additionalInternalSlotsList
is present, set
internalSlotsList
to the
list-concatenation
of
internalSlotsList
and
additionalInternalSlotsList
3.
Let
be
MakeBasicObject
internalSlotsList
).
4.
Set
.[[Prototype]] to
proto
5.
Return
Note
Although OrdinaryObjectCreate does little more than call
MakeBasicObject
, its use communicates the intention to create an
ordinary object
and not an exotic one. Thus, within this specification, it is not
called by any algorithm that subsequently modifies the internal methods
of the object in ways that would make the result non-ordinary.
Operations that create
exotic objects
invoke
MakeBasicObject
directly.
10.1.13
OrdinaryCreateFromConstructor (
constructor
intrinsicDefaultProto
[ ,
internalSlotsList
] )
The abstract operation OrdinaryCreateFromConstructor takes arguments
constructor
(a
constructor
) and
intrinsicDefaultProto
(a String) and optional argument
internalSlotsList
(a
List
of names of internal slots) and returns either a
normal completion containing
an Object or a
throw completion
. It creates an
ordinary object
whose [[Prototype]] value is retrieved from a
constructor
's
"prototype"
property, if it exists. Otherwise the intrinsic named by
intrinsicDefaultProto
is used for [[Prototype]].
internalSlotsList
contains the names of additional internal slots that must be defined as part of the object. If
internalSlotsList
is not provided, a new empty
List
is used. It performs the following steps when called:
1.
Assert
intrinsicDefaultProto
is this specification's name of an intrinsic object. The corresponding
object must be an intrinsic that is intended to be used as the
[[Prototype]] value of an object.
2.
Let
proto
be ?
GetPrototypeFromConstructor
constructor
intrinsicDefaultProto
).
3.
If
internalSlotsList
is present, let
slotsList
be
internalSlotsList
4.
Else, let
slotsList
be a new empty
List
5.
Return
OrdinaryObjectCreate
proto
slotsList
).
10.1.14
GetPrototypeFromConstructor (
constructor
intrinsicDefaultProto
The abstract operation GetPrototypeFromConstructor takes arguments
constructor
(a
function object
) and
intrinsicDefaultProto
(a String) and returns either a
normal completion containing
an Object or a
throw completion
. It determines the [[Prototype]] value that should be used to create an object corresponding to a specific
constructor
. The value is retrieved from the
constructor
's
"prototype"
property, if it exists. Otherwise the intrinsic named by
intrinsicDefaultProto
is used for [[Prototype]]. It performs the following steps when called:
1.
Assert
intrinsicDefaultProto
is this specification's name of an intrinsic object. The corresponding
object must be an intrinsic that is intended to be used as the
[[Prototype]] value of an object.
2.
Let
proto
be ?
Get
constructor
"prototype"
).
3.
If
proto
is not an Object
, then
a.
Let
realm
be ?
GetFunctionRealm
constructor
).
b.
Set
proto
to
realm
's intrinsic object named
intrinsicDefaultProto
4.
Return
proto
Note
If
constructor
does not supply a [[Prototype]] value, the default value that is used is obtained from the
realm
of the
constructor
function rather than from the
running execution context
10.1.15
RequireInternalSlot (
internalSlot
The abstract operation RequireInternalSlot takes arguments
(an
ECMAScript language value
) and
internalSlot
(an internal slot name) and returns either a
normal completion containing
unused
or a
throw completion
. It throws an exception unless
is an Object
and has the given internal slot. It performs the following steps when called:
1.
If
is not an Object
, throw a
TypeError
exception.
2.
If
does not have an
internalSlot
internal slot, throw a
TypeError
exception.
3.
Return
unused
10.2
ECMAScript Function Objects
ECMAScript
function objects
encapsulate parameterized ECMAScript code closed over a lexical
environment and support the dynamic evaluation of that code. An
ECMAScript
function object
is an
ordinary object
and has the same internal slots and the same internal methods as other
ordinary objects
. The code of an ECMAScript
function object
may be either
strict mode code
11.2.2
) or
non-strict code
. An ECMAScript
function object
whose code is
strict mode code
is called a
strict function
. One whose code is not
strict mode code
is called a
non-strict function
In addition to [[Extensible]] and [[Prototype]], ECMAScript
function objects
also have the internal slots listed in
Table 30
Table 30: Internal Slots of ECMAScript Function Objects
Internal Slot
Type
Description
[[Environment]]
an
Environment Record
The
Environment Record
that the function was closed over. Used as the outer environment when evaluating the code of the function.
[[PrivateEnvironment]]
PrivateEnvironment Record
or
null
The
PrivateEnvironment Record
for
Private Names
that the function was closed over.
null
if this function is not syntactically contained within a class. Used as
the outer PrivateEnvironment for inner classes when evaluating the code
of the function.
[[FormalParameters]]
Parse Node
The root parse node of the source text that defines the function's formal parameter list.
[[ECMAScriptCode]]
Parse Node
The root parse node of the source text that defines the function's body.
[[ConstructorKind]]
base
or
derived
Whether or not the function is a derived class
constructor
[[Realm]]
Realm Record
The
realm
in which the function was created and which provides any intrinsic objects that are accessed when evaluating the function.
[[ScriptOrModule]]
Script Record
or a
Module Record
The script or module in which the function was created.
[[ThisMode]]
lexical
strict
, or
global
Defines how
this
references are interpreted within the formal parameters and code body of the function.
lexical
means that
this
refers to the
this
value of a lexically enclosing function.
strict
means that the
this
value is used exactly as provided by an invocation of the function.
global
means that a
this
value of
undefined
or
null
is interpreted as a reference to the
global object
, and any other
this
value is first passed to
ToObject
[[Strict]]
a Boolean
true
if this is a
strict function
false
if this is a
non-strict function
[[HomeObject]]
an Object
If the function uses
super
, this is the object whose [[GetPrototypeOf]] provides the object where
super
property lookups begin.
[[SourceText]]
a sequence of Unicode code points
The
source text
that defines the function.
[[Fields]]
List
of
ClassFieldDefinition Records
If the function is a class, this is a list of
Records
representing the non-static fields and corresponding initializers of the class.
[[PrivateMethods]]
List
of
PrivateElements
If the function is a class, this is a list representing the non-static private methods and accessors of the class.
[[ClassFieldInitializerName]]
a String, a Symbol, a
Private Name
, or
empty
If the function is created as the initializer of a class field, the name to use for
NamedEvaluation
of the field;
empty
otherwise.
[[IsClassConstructor]]
a Boolean
Indicates whether the function is a class
constructor
. (If
true
, invoking the function's [[Call]] will immediately throw a
TypeError
exception.)
All ECMAScript
function objects
have the [[Call]] internal method defined here. ECMAScript functions that are also
constructors
in addition have the [[Construct]] internal method.
10.2.1
[[Call]] (
thisArgument
argumentsList
The [[Call]] internal method of an ECMAScript
function object
takes arguments
thisArgument
(an
ECMAScript language value
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
callerContext
be the
running execution context
2.
Let
calleeContext
be
PrepareForOrdinaryCall
undefined
).
3.
Assert
calleeContext
is now the
running execution context
4.
If
.[[IsClassConstructor]] is
true
, then
a.
Let
error
be a newly created
TypeError
object.
b.
NOTE:
error
is created in
calleeContext
with
's associated
Realm Record
c.
Remove
calleeContext
from the
execution context stack
and restore
callerContext
as the
running execution context
d.
Return
ThrowCompletion
error
).
5.
Perform
OrdinaryCallBindThis
calleeContext
thisArgument
).
6.
Let
result
be
Completion
OrdinaryCallEvaluateBody
argumentsList
)).
7.
Remove
calleeContext
from the
execution context stack
and restore
callerContext
as the
running execution context
8.
If
result
.[[Type]] is
return
, return
result
.[[Value]].
9.
ReturnIfAbrupt
result
).
10.
Return
undefined
Note
When
calleeContext
is removed from the
execution context stack
in step
it must not be destroyed if it is suspended and retained for later resumption by an accessible Generator.
10.2.1.1
PrepareForOrdinaryCall (
newTarget
The abstract operation PrepareForOrdinaryCall takes arguments
(a
function object
) and
newTarget
(an Object or
undefined
) and returns an
execution context
. It performs the following steps when called:
1.
Let
callerContext
be the
running execution context
2.
Let
calleeContext
be a new
ECMAScript code execution context
3.
Set the Function of
calleeContext
to
4.
Let
calleeRealm
be
.[[Realm]].
5.
Set the
Realm
of
calleeContext
to
calleeRealm
6.
Set the ScriptOrModule of
calleeContext
to
.[[ScriptOrModule]].
7.
Let
localEnv
be
NewFunctionEnvironment
newTarget
).
8.
Set the LexicalEnvironment of
calleeContext
to
localEnv
9.
Set the VariableEnvironment of
calleeContext
to
localEnv
10.
Set the PrivateEnvironment of
calleeContext
to
.[[PrivateEnvironment]].
11.
If
callerContext
is not already suspended, suspend
callerContext
12.
Push
calleeContext
onto the
execution context stack
calleeContext
is now the
running execution context
13.
NOTE: Any exception objects produced after this point are associated with
calleeRealm
14.
Return
calleeContext
10.2.1.2
OrdinaryCallBindThis (
calleeContext
thisArgument
The abstract operation OrdinaryCallBindThis takes arguments
(a
function object
),
calleeContext
(an
execution context
), and
thisArgument
(an
ECMAScript language value
) and returns
unused
. It performs the following steps when called:
1.
Let
thisMode
be
.[[ThisMode]].
2.
If
thisMode
is
lexical
, return
unused
3.
Let
calleeRealm
be
.[[Realm]].
4.
Let
localEnv
be the LexicalEnvironment of
calleeContext
5.
If
thisMode
is
strict
, let
thisValue
be
thisArgument
6.
Else,
a.
If
thisArgument
is either
undefined
or
null
, then
i.
Let
globalEnv
be
calleeRealm
.[[GlobalEnv]].
ii.
Assert
globalEnv
is a
Global Environment Record
iii.
Let
thisValue
be
globalEnv
.[[GlobalThisValue]].
b.
Else,
i.
Let
thisValue
be !
ToObject
thisArgument
).
ii.
NOTE:
ToObject
produces wrapper objects using
calleeRealm
7.
Assert
localEnv
is a
Function Environment Record
8.
Assert
: The next step never returns an
abrupt completion
because
localEnv
.[[ThisBindingStatus]] is not
initialized
9.
Perform !
localEnv
.BindThisValue(
thisValue
).
10.
Return
unused
10.2.1.3
Runtime Semantics: EvaluateBody
The
syntax-directed operation
EvaluateBody takes arguments
functionObject
(a
function object
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
FunctionBody
FunctionStatementList
1.
Return ?
EvaluateFunctionBody
of
FunctionBody
with arguments
functionObject
and
argumentsList
ConciseBody
ExpressionBody
1.
Return ?
EvaluateConciseBody
of
ConciseBody
with arguments
functionObject
and
argumentsList
GeneratorBody
FunctionBody
1.
Return ?
EvaluateGeneratorBody
of
GeneratorBody
with arguments
functionObject
and
argumentsList
AsyncGeneratorBody
FunctionBody
1.
Return ?
EvaluateAsyncGeneratorBody
of
AsyncGeneratorBody
with arguments
functionObject
and
argumentsList
AsyncFunctionBody
FunctionBody
1.
Return ?
EvaluateAsyncFunctionBody
of
AsyncFunctionBody
with arguments
functionObject
and
argumentsList
AsyncConciseBody
ExpressionBody
1.
Return ?
EvaluateAsyncConciseBody
of
AsyncConciseBody
with arguments
functionObject
and
argumentsList
Initializer
AssignmentExpression
1.
Assert
argumentsList
is empty.
2.
Assert
functionObject
.[[ClassFieldInitializerName]] is not
empty
3.
If
IsAnonymousFunctionDefinition
AssignmentExpression
) is
true
, then
a.
Let
value
be ?
NamedEvaluation
of
Initializer
with argument
functionObject
.[[ClassFieldInitializerName]].
4.
Else,
a.
Let
rhs
be ?
Evaluation
of
AssignmentExpression
b.
Let
value
be ?
GetValue
rhs
).
5.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
value
, [[Target]]:
empty
}.
Note
Even though field initializers constitute a function boundary, calling
FunctionDeclarationInstantiation
does not have any observable effect and so is omitted.
ClassStaticBlockBody
ClassStaticBlockStatementList
1.
Assert
argumentsList
is empty.
2.
Return ?
EvaluateClassStaticBlockBody
of
ClassStaticBlockBody
with argument
functionObject
10.2.1.4
OrdinaryCallEvaluateBody (
argumentsList
The abstract operation OrdinaryCallEvaluateBody takes arguments
(a
function object
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
Return ?
EvaluateBody
of
.[[ECMAScriptCode]] with arguments
and
argumentsList
10.2.2
[[Construct]] (
argumentsList
newTarget
The [[Construct]] internal method of an ECMAScript
function object
takes arguments
argumentsList
(a
List
of
ECMAScript language values
) and
newTarget
(a
constructor
) and returns either a
normal completion containing
an Object or a
throw completion
. It performs the following steps when called:
1.
Let
callerContext
be the
running execution context
2.
Let
kind
be
.[[ConstructorKind]].
3.
If
kind
is
base
, then
a.
Let
thisArgument
be ?
OrdinaryCreateFromConstructor
newTarget
"%Object.prototype%"
).
4.
Let
calleeContext
be
PrepareForOrdinaryCall
newTarget
).
5.
Assert
calleeContext
is now the
running execution context
6.
If
kind
is
base
, then
a.
Perform
OrdinaryCallBindThis
calleeContext
thisArgument
).
b.
Let
initializeResult
be
Completion
InitializeInstanceElements
thisArgument
)).
c.
If
initializeResult
is an
abrupt completion
, then
i.
Remove
calleeContext
from the
execution context stack
and restore
callerContext
as the
running execution context
ii.
Return ?
initializeResult
7.
Let
constructorEnv
be the LexicalEnvironment of
calleeContext
8.
Let
result
be
Completion
OrdinaryCallEvaluateBody
argumentsList
)).
9.
Remove
calleeContext
from the
execution context stack
and restore
callerContext
as the
running execution context
10.
If
result
.[[Type]] is
return
, then
a.
If
result
.[[Value]]
is an Object
, return
result
.[[Value]].
b.
If
kind
is
base
, return
thisArgument
c.
If
result
.[[Value]] is not
undefined
, throw a
TypeError
exception.
11.
Else,
ReturnIfAbrupt
result
).
12.
Let
thisBinding
be ?
constructorEnv
.GetThisBinding().
13.
Assert
thisBinding
is an Object
14.
Return
thisBinding
10.2.3
OrdinaryFunctionCreate (
functionPrototype
sourceText
ParameterList
Body
thisMode
env
privateEnv
The abstract operation OrdinaryFunctionCreate takes arguments
functionPrototype
(an Object),
sourceText
(a sequence of Unicode code points),
ParameterList
(a
Parse Node
),
Body
(a
Parse Node
),
thisMode
lexical-this
or
non-lexical-this
),
env
(an
Environment Record
), and
privateEnv
(a
PrivateEnvironment Record
or
null
) and returns a
function object
It is used to specify the runtime creation of a new function with a
default [[Call]] internal method and no [[Construct]] internal method
(although one may be subsequently added by an operation such as
MakeConstructor
).
sourceText
is the source text of the syntactic definition of the function to be created. It performs the following steps when called:
1.
Let
internalSlotsList
be the internal slots listed in
Table 30
2.
Let
be
OrdinaryObjectCreate
functionPrototype
internalSlotsList
).
3.
Set
.[[Call]] to the definition specified in
10.2.1
4.
Set
.[[SourceText]] to
sourceText
5.
Set
.[[FormalParameters]] to
ParameterList
6.
Set
.[[ECMAScriptCode]] to
Body
7.
If the
source text matched by
Body
is
strict mode code
, let
Strict
be
true
; else let
Strict
be
false
8.
Set
.[[Strict]] to
Strict
9.
If
thisMode
is
lexical-this
, set
.[[ThisMode]] to
lexical
10.
Else if
Strict
is
true
, set
.[[ThisMode]] to
strict
11.
Else, set
.[[ThisMode]] to
global
12.
Set
.[[IsClassConstructor]] to
false
13.
Set
.[[Environment]] to
env
14.
Set
.[[PrivateEnvironment]] to
privateEnv
15.
Set
.[[ScriptOrModule]] to
GetActiveScriptOrModule
().
16.
Set
.[[Realm]] to
the current Realm Record
17.
Set
.[[HomeObject]] to
undefined
18.
Set
.[[Fields]] to a new empty
List
19.
Set
.[[PrivateMethods]] to a new empty
List
20.
Set
.[[ClassFieldInitializerName]] to
empty
21.
Let
len
be the
ExpectedArgumentCount
of
ParameterList
22.
Perform
SetFunctionLength
len
).
23.
Return
10.2.4
AddRestrictedFunctionProperties (
realm
The abstract operation AddRestrictedFunctionProperties takes arguments
(a
function object
) and
realm
(a
Realm Record
) and returns
unused
. It performs the following steps when called:
1.
Assert
realm
.[[Intrinsics]].[[
%ThrowTypeError%
]] exists and has been initialized.
2.
Let
thrower
be
realm
.[[Intrinsics]].[[
%ThrowTypeError%
]].
3.
Perform !
DefinePropertyOrThrow
"caller"
, PropertyDescriptor { [[Get]]:
thrower
, [[Set]]:
thrower
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
4.
Perform !
DefinePropertyOrThrow
"arguments"
, PropertyDescriptor { [[Get]]:
thrower
, [[Set]]:
thrower
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
5.
Return
unused
10.2.4.1
%ThrowTypeError% ( )
This function is the
%ThrowTypeError%
intrinsic object.
It is an anonymous built-in
function object
that is defined once for each
realm
It performs the following steps when called:
1.
Throw a
TypeError
exception.
The value of the [[Extensible]] internal slot of this function is
false
The
"length"
property of this function has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
The
"name"
property of this function has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
10.2.5
MakeConstructor (
[ ,
writablePrototype
[ ,
prototype
] ] )
The abstract operation MakeConstructor takes argument
(an ECMAScript
function object
or a built-in
function object
) and optional arguments
writablePrototype
(a Boolean) and
prototype
(an Object) and returns
unused
. It converts
into a
constructor
. It performs the following steps when called:
1.
If
is an ECMAScript
function object
, then
a.
Assert
IsConstructor
) is
false
b.
Assert
is an extensible object that does not have a
"prototype"
own property.
c.
Set
.[[Construct]] to the definition specified in
10.2.2
2.
Else,
a.
Set
.[[Construct]] to the definition specified in
10.3.2
3.
Set
.[[ConstructorKind]] to
base
4.
If
writablePrototype
is not present, set
writablePrototype
to
true
5.
If
prototype
is not present, then
a.
Set
prototype
to
OrdinaryObjectCreate
%Object.prototype%
).
b.
Perform !
DefinePropertyOrThrow
prototype
"constructor"
, PropertyDescriptor { [[Value]]:
, [[Writable]]:
writablePrototype
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
6.
Perform !
DefinePropertyOrThrow
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
writablePrototype
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
7.
Return
unused
10.2.6
MakeClassConstructor (
The abstract operation MakeClassConstructor takes argument
(an ECMAScript
function object
) and returns
unused
. It performs the following steps when called:
1.
Assert
.[[IsClassConstructor]] is
false
2.
Set
.[[IsClassConstructor]] to
true
3.
Return
unused
10.2.7
MakeMethod (
homeObject
The abstract operation MakeMethod takes arguments
(an ECMAScript
function object
) and
homeObject
(an Object) and returns
unused
. It configures
as a method. It performs the following steps when called:
1.
Set
.[[HomeObject]] to
homeObject
2.
Return
unused
10.2.8
DefineMethodProperty (
homeObject
key
closure
enumerable
The abstract operation DefineMethodProperty takes arguments
homeObject
(an Object),
key
(a
property key
or
Private Name
),
closure
(a
function object
), and
enumerable
(a Boolean) and returns a
PrivateElement
or
unused
. It performs the following steps when called:
1.
Assert
homeObject
is an ordinary, extensible object with no non-configurable properties.
2.
If
key
is a
Private Name
, then
a.
Return
PrivateElement
{ [[Key]]:
key
, [[Kind]]:
method
, [[Value]]:
closure
}.
3.
Else,
a.
Let
desc
be the PropertyDescriptor { [[Value]]:
closure
, [[Writable]]:
true
, [[Enumerable]]:
enumerable
, [[Configurable]]:
true
}.
b.
Perform !
DefinePropertyOrThrow
homeObject
key
desc
).
c.
Return
unused
10.2.9
SetFunctionName (
name
[ ,
prefix
] )
The abstract operation SetFunctionName takes arguments
(a
function object
) and
name
(a
property key
or
Private Name
) and optional argument
prefix
(a String) and returns
unused
. It adds a
"name"
property to
. It performs the following steps when called:
1.
Assert
is an extensible object that does not have a
"name"
own property.
2.
If
name
is a Symbol
, then
a.
Let
description
be
name
's [[Description]] value.
b.
If
description
is
undefined
, set
name
to the empty String.
c.
Else, set
name
to the
string-concatenation
of
"["
description
, and
"]"
3.
Else if
name
is a
Private Name
, then
a.
Set
name
to
name
.[[Description]].
4.
If
has an [[InitialName]] internal slot, then
a.
Set
.[[InitialName]] to
name
5.
If
prefix
is present, then
a.
Set
name
to the
string-concatenation
of
prefix
, the code unit 0x0020 (SPACE), and
name
b.
If
has an [[InitialName]] internal slot, then
i.
Optionally, set
.[[InitialName]] to
name
6.
Perform !
DefinePropertyOrThrow
"name"
, PropertyDescriptor { [[Value]]:
name
, [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
7.
Return
unused
10.2.10
SetFunctionLength (
length
The abstract operation SetFunctionLength takes arguments
(a
function object
) and
length
(a non-negative
integer
or +∞) and returns
unused
. It adds a
"length"
property to
. It performs the following steps when called:
1.
Assert
is an extensible object that does not have a
"length"
own property.
2.
Perform !
DefinePropertyOrThrow
"length"
, PropertyDescriptor { [[Value]]:
length
), [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
3.
Return
unused
10.2.11
FunctionDeclarationInstantiation (
func
argumentsList
The abstract operation FunctionDeclarationInstantiation takes arguments
func
(a
function object
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
unused
or an
abrupt completion
func
is the
function object
for which the
execution context
is being established.
Note 1
When an
execution context
is established for evaluating an ECMAScript function a new
Function Environment Record
is created and bindings for each formal parameter are instantiated in that
Environment Record
Each declaration in the function body is also instantiated. If the
function's formal parameters do not include any default value
initializers then the body declarations are instantiated in the same
Environment Record
as the parameters. If default value parameter initializers exist, a second
Environment Record
is created for the body declarations. Formal parameters and functions
are initialized as part of FunctionDeclarationInstantiation. All other
bindings are initialized during evaluation of the function body.
It performs the following steps when called:
1.
Let
calleeContext
be the
running execution context
2.
Let
code
be
func
.[[ECMAScriptCode]].
3.
Let
strict
be
func
.[[Strict]].
4.
Let
formals
be
func
.[[FormalParameters]].
5.
Let
parameterNames
be the
BoundNames
of
formals
6.
If
parameterNames
has any duplicate entries, let
hasDuplicates
be
true
. Otherwise, let
hasDuplicates
be
false
7.
Let
simpleParameterList
be
IsSimpleParameterList
of
formals
8.
Let
hasParameterExpressions
be
ContainsExpression
of
formals
9.
Let
varNames
be the
VarDeclaredNames
of
code
10.
Let
varDeclarations
be the
VarScopedDeclarations
of
code
11.
Let
lexicalNames
be the
LexicallyDeclaredNames
of
code
12.
Let
functionNames
be a new empty
List
13.
Let
functionsToInitialize
be a new empty
List
14.
For each element
of
varDeclarations
, in reverse
List
order, do
a.
If
is neither a
VariableDeclaration
nor a
ForBinding
nor a
BindingIdentifier
, then
i.
Assert
is either a
FunctionDeclaration
, a
GeneratorDeclaration
, an
AsyncFunctionDeclaration
, or an
AsyncGeneratorDeclaration
ii.
Let
fn
be the sole element of the
BoundNames
of
iii.
If
functionNames
does not contain
fn
, then
1.
Insert
fn
as the first element of
functionNames
2.
NOTE: If there are multiple function declarations for the same name, the last declaration is used.
3.
Insert
as the first element of
functionsToInitialize
15.
Let
argumentsObjectNeeded
be
true
16.
If
func
.[[ThisMode]] is
lexical
, then
a.
NOTE: Arrow functions never have an arguments object.
b.
Set
argumentsObjectNeeded
to
false
17.
Else if
parameterNames
contains
"arguments"
, then
a.
Set
argumentsObjectNeeded
to
false
18.
Else if
hasParameterExpressions
is
false
, then
a.
If
functionNames
contains
"arguments"
or
lexicalNames
contains
"arguments"
, then
i.
Set
argumentsObjectNeeded
to
false
19.
If
strict
is
true
or
hasParameterExpressions
is
false
, then
a.
NOTE: Only a single
Environment Record
is needed for the parameters, since calls to
eval
in
strict mode code
cannot create new bindings which are visible outside of the
eval
b.
Let
env
be the LexicalEnvironment of
calleeContext
20.
Else,
a.
NOTE: A separate
Environment Record
is needed to ensure that bindings created by
direct eval
calls in the formal parameter list are outside the environment where parameters are declared.
b.
Let
calleeEnv
be the LexicalEnvironment of
calleeContext
c.
Let
env
be
NewDeclarativeEnvironment
calleeEnv
).
d.
Assert
: The VariableEnvironment of
calleeContext
is
calleeEnv
e.
Set the LexicalEnvironment of
calleeContext
to
env
21.
For each String
paramName
of
parameterNames
, do
a.
Let
alreadyDeclared
be !
env
.HasBinding(
paramName
).
b.
NOTE:
Early errors
ensure that duplicate parameter names can only occur in
non-strict functions
that do not have parameter default values or rest parameters.
c.
If
alreadyDeclared
is
false
, then
i.
Perform !
env
.CreateMutableBinding(
paramName
false
).
ii.
If
hasDuplicates
is
true
, then
1.
Perform !
env
.InitializeBinding(
paramName
undefined
).
22.
If
argumentsObjectNeeded
is
true
, then
a.
If
strict
is
true
or
simpleParameterList
is
false
, then
i.
Let
ao
be
CreateUnmappedArgumentsObject
argumentsList
).
b.
Else,
i.
NOTE: A mapped argument object is only provided for
non-strict functions
that don't have a rest parameter, any parameter default value initializers, or any destructured parameters.
ii.
Let
ao
be
CreateMappedArgumentsObject
func
formals
argumentsList
env
).
c.
If
strict
is
true
, then
i.
Perform !
env
.CreateImmutableBinding(
"arguments"
false
).
ii.
NOTE: In
strict mode code
early errors
prevent attempting to assign to this binding, so its mutability is not observable.
d.
Else,
i.
Perform !
env
.CreateMutableBinding(
"arguments"
false
).
e.
Perform !
env
.InitializeBinding(
"arguments"
ao
).
f.
Let
parameterBindings
be the
list-concatenation
of
parameterNames
and «
"arguments"
».
23.
Else,
a.
Let
parameterBindings
be
parameterNames
24.
Let
iteratorRecord
be
CreateListIteratorRecord
argumentsList
).
25.
If
hasDuplicates
is
true
, then
a.
Perform ?
IteratorBindingInitialization
of
formals
with arguments
iteratorRecord
and
undefined
26.
Else,
a.
Perform ?
IteratorBindingInitialization
of
formals
with arguments
iteratorRecord
and
env
27.
If
hasParameterExpressions
is
false
, then
a.
NOTE: Only a single
Environment Record
is needed for the parameters and top-level vars.
b.
Let
instantiatedVarNames
be a copy of the
List
parameterBindings
c.
For each element
of
varNames
, do
i.
If
instantiatedVarNames
does not contain
, then
1.
Append
to
instantiatedVarNames
2.
Perform !
env
.CreateMutableBinding(
false
).
3.
Perform !
env
.InitializeBinding(
undefined
).
d.
Let
varEnv
be
env
28.
Else,
a.
NOTE: A separate
Environment Record
is needed to ensure that closures created by expressions in the formal
parameter list do not have visibility of declarations in the function
body.
b.
Let
varEnv
be
NewDeclarativeEnvironment
env
).
c.
Set the VariableEnvironment of
calleeContext
to
varEnv
d.
Let
instantiatedVarNames
be a new empty
List
e.
For each element
of
varNames
, do
i.
If
instantiatedVarNames
does not contain
, then
1.
Append
to
instantiatedVarNames
2.
Perform !
varEnv
.CreateMutableBinding(
false
).
3.
If
parameterBindings
does not contain
, or if
functionNames
contains
, let
initialValue
be
undefined
4.
Else,
a.
Let
initialValue
be !
env
.GetBindingValue(
false
).
5.
Perform !
varEnv
.InitializeBinding(
initialValue
).
6.
NOTE: A var with the same name as a formal parameter initially has the same value as the corresponding initialized parameter.
29.
NOTE: Annex
B.3.2.1
adds additional steps at this point.
30.
If
strict
is
false
, then
a.
Let
lexEnv
be
NewDeclarativeEnvironment
varEnv
).
b.
NOTE:
Non-strict functions
use a separate
Environment Record
for top-level lexical declarations so that a
direct eval
can determine whether any var scoped declarations introduced by the
eval code conflict with pre-existing top-level lexically scoped
declarations. This is not needed for
strict functions
because a strict
direct eval
always places all declarations into a new
Environment Record
31.
Else, let
lexEnv
be
varEnv
32.
Set the LexicalEnvironment of
calleeContext
to
lexEnv
33.
Let
lexDeclarations
be the
LexicallyScopedDeclarations
of
code
34.
For each element
of
lexDeclarations
, do
a.
NOTE:
A lexically declared name cannot be the same as a function/generator
declaration, formal parameter, or a var name. Lexically declared names
are only instantiated here but not initialized.
b.
For each element
dn
of the
BoundNames
of
, do
i.
If
IsConstantDeclaration
of
is
true
, then
1.
Perform !
lexEnv
.CreateImmutableBinding(
dn
true
).
ii.
Else,
1.
Perform !
lexEnv
.CreateMutableBinding(
dn
false
).
35.
Let
privateEnv
be the PrivateEnvironment of
calleeContext
36.
For each
Parse Node
of
functionsToInitialize
, do
a.
Let
fn
be the sole element of the
BoundNames
of
b.
Let
fo
be
InstantiateFunctionObject
of
with arguments
lexEnv
and
privateEnv
c.
Perform !
varEnv
.SetMutableBinding(
fn
fo
false
).
37.
Return
unused
Note 2
B.3.2
provides an extension to the above algorithm that is necessary for
backwards compatibility with web browser implementations of ECMAScript
that predate ECMAScript 2015.
10.3
Built-in Function Objects
The built-in
function objects
defined in this specification may be implemented as either ECMAScript
function objects
10.2
) whose behaviour is provided using ECMAScript code or as
function objects
whose behaviour is provided in some other manner. In either case, the
effect of calling such functions must conform to their specifications.
An implementation may also provide additional built-in
function objects
that are not defined in this specification.
If a built-in
function object
is implemented as an ECMAScript
function object
, it must have all the internal slots described in
10.2
([[Prototype]], [[Extensible]], and the slots listed in
Table 30
), and [[InitialName]]. The value of the [[InitialName]] internal slot
is a String
value that is the initial name of the function. It is used by
20.2.3.5
Built-in
function objects
must have the
ordinary object
behaviour specified in
10.1
. All such
function objects
have [[Prototype]], [[Extensible]], [[Realm]], and [[InitialName]] internal slots, with the same meanings as above.
Unless otherwise specified every built-in
function object
has the
%Function.prototype%
object as the initial value of its [[Prototype]] internal slot.
The behaviour specified for each built-in function via algorithm
steps or other means is the specification of the function body behaviour
for both [[Call]] and [[Construct]] invocations of the function.
However, [[Construct]] invocation is not supported by all built-in
functions. For each built-in function, when invoked with [[Call]], the
[[Call]]
thisArgument
provides the
this
value, the [[Call]]
argumentsList
provides the named parameters, and the NewTarget value is
undefined
. When invoked with [[Construct]], the
this
value is uninitialized, the [[Construct]]
argumentsList
provides the named parameters, and the [[Construct]]
newTarget
parameter provides the NewTarget value. If the built-in function is implemented as an ECMAScript
function object
then this specified behaviour must be implemented by the ECMAScript
code that is the body of the function. Built-in functions that are
ECMAScript
function objects
must be
strict functions
. If a built-in
constructor
has any [[Call]] behaviour other than throwing a
TypeError
exception, an ECMAScript implementation of the function must be done in
a manner that does not cause the function's [[IsClassConstructor]]
internal slot to have the value
true
Built-in
function objects
that are not identified as
constructors
do not implement the [[Construct]] internal method unless otherwise
specified in the description of a particular function. When a built-in
constructor
is called as part of a
new
expression the
argumentsList
parameter of the invoked [[Construct]] internal method provides the values for the built-in
constructor
's named parameters.
Built-in functions that are not
constructors
do not have a
"prototype"
property unless otherwise specified in the description of a particular function.
If a built-in
function object
is not implemented as an ECMAScript function it must provide [[Call]]
and [[Construct]] internal methods that conform to the following
definitions:
10.3.1
[[Call]] (
thisArgument
argumentsList
The [[Call]] internal method of a built-in
function object
takes arguments
thisArgument
(an
ECMAScript language value
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
callerContext
be the
running execution context
2.
If
callerContext
is not already suspended, suspend
callerContext
3.
Let
calleeContext
be a new
execution context
4.
Set the Function of
calleeContext
to
5.
Let
calleeRealm
be
.[[Realm]].
6.
Set the
Realm
of
calleeContext
to
calleeRealm
7.
Set the ScriptOrModule of
calleeContext
to
null
8.
Perform any necessary
implementation-defined
initialization of
calleeContext
9.
Push
calleeContext
onto the
execution context stack
calleeContext
is now the
running execution context
10.
Let
result
be the
Completion Record
that is
the result of evaluating
in a manner that conforms to the specification of
thisArgument
is the
this
value,
argumentsList
provides the named parameters, and the NewTarget value is
undefined
11.
Remove
calleeContext
from the
execution context stack
and restore
callerContext
as the
running execution context
12.
Return ?
result
Note
When
calleeContext
is removed from the
execution context stack
it must not be destroyed if it has been suspended and retained by an accessible Generator for later resumption.
10.3.2
[[Construct]] (
argumentsList
newTarget
The [[Construct]] internal method of a built-in
function object
(when the method is present) takes arguments
argumentsList
(a
List
of
ECMAScript language values
) and
newTarget
(a
constructor
) and returns either a
normal completion containing
an Object or a
throw completion
. The steps performed are the same as [[Call]] (see
10.3.1
) except that step
10
is replaced by:
10.
Let
result
be the
Completion Record
that is
the result of evaluating
in a manner that conforms to the specification of
. The
this
value is uninitialized,
argumentsList
provides the named parameters, and
newTarget
provides the NewTarget value.
10.3.3
CreateBuiltinFunction (
behaviour
length
name
additionalInternalSlotsList
[ ,
realm
[ ,
prototype
[ ,
prefix
] ] ] )
The abstract operation CreateBuiltinFunction takes arguments
behaviour
(an
Abstract Closure
, a set of algorithm steps, or some other definition of a function's behaviour provided in this specification),
length
(a non-negative
integer
or +∞),
name
(a
property key
or a
Private Name
), and
additionalInternalSlotsList
(a
List
of names of internal slots) and optional arguments
realm
(a
Realm Record
),
prototype
(an Object or
null
), and
prefix
(a String) and returns a
function object
additionalInternalSlotsList
contains the names of additional internal slots that must be defined as part of the object. This operation creates a built-in
function object
. It performs the following steps when called:
1.
If
realm
is not present, set
realm
to
the current Realm Record
2.
If
prototype
is not present, set
prototype
to
realm
.[[Intrinsics]].[[
%Function.prototype%
]].
3.
Let
internalSlotsList
be a
List
containing the names of all the internal slots that
10.3
requires for the built-in
function object
that is about to be created.
4.
Append to
internalSlotsList
the elements of
additionalInternalSlotsList
5.
Let
func
be a new built-in
function object
that, when called, performs the action described by
behaviour
using the provided arguments as the values of the corresponding parameters specified by
behaviour
. The new
function object
has internal slots whose names are the elements of
internalSlotsList
, and an [[InitialName]] internal slot.
6.
Set
func
.[[Prototype]] to
prototype
7.
Set
func
.[[Extensible]] to
true
8.
Set
func
.[[Realm]] to
realm
9.
Set
func
.[[InitialName]] to
null
10.
Perform
SetFunctionLength
func
length
).
11.
If
prefix
is not present, then
a.
Perform
SetFunctionName
func
name
).
12.
Else,
a.
Perform
SetFunctionName
func
name
prefix
).
13.
Return
func
Each built-in function defined in this specification is created by calling the CreateBuiltinFunction abstract operation.
10.4
Built-in Exotic Object Internal Methods and Slots
This specification defines several kinds of built-in
exotic objects
. These objects generally behave similar to
ordinary objects
except for a few specific situations. The following
exotic objects
use the
ordinary object
internal methods except where it is explicitly specified otherwise below:
10.4.1
Bound Function Exotic Objects
bound function exotic object
is an
exotic object
that wraps another
function object
. A
bound function exotic object
is callable (it has a [[Call]] internal method and may have a [[Construct]] internal method). Calling a
bound function exotic object
generally results in a call of its wrapped function.
An object is a
bound function exotic object
if its [[Call]] and (if applicable) [[Construct]] internal methods use
the following implementations, and its other essential internal methods
use the definitions found in
10.1
. These methods are installed in
BoundFunctionCreate
Bound function exotic objects
do not have the internal slots of ECMAScript
function objects
listed in
Table 30
. Instead they have the internal slots listed in
Table 31
, in addition to [[Prototype]] and [[Extensible]].
Table 31: Internal Slots of Bound Function Exotic Objects
Internal Slot
Type
Description
[[BoundTargetFunction]]
a callable Object
The wrapped
function object
[[BoundThis]]
an
ECMAScript language value
The value that is always passed as the
this
value when calling the wrapped function.
[[BoundArguments]]
List
of
ECMAScript language values
A list of values whose elements are used as the first arguments to any call to the wrapped function.
10.4.1.1
[[Call]] (
thisArgument
argumentsList
The [[Call]] internal method of a
bound function exotic object
takes arguments
thisArgument
(an
ECMAScript language value
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
target
be
.[[BoundTargetFunction]].
2.
Let
boundThis
be
.[[BoundThis]].
3.
Let
boundArgs
be
.[[BoundArguments]].
4.
Let
args
be the
list-concatenation
of
boundArgs
and
argumentsList
5.
Return ?
Call
target
boundThis
args
).
10.4.1.2
[[Construct]] (
argumentsList
newTarget
The [[Construct]] internal method of a
bound function exotic object
takes arguments
argumentsList
(a
List
of
ECMAScript language values
) and
newTarget
(a
constructor
) and returns either a
normal completion containing
an Object or a
throw completion
. It performs the following steps when called:
1.
Let
target
be
.[[BoundTargetFunction]].
2.
Assert
IsConstructor
target
) is
true
3.
Let
boundArgs
be
.[[BoundArguments]].
4.
Let
args
be the
list-concatenation
of
boundArgs
and
argumentsList
5.
If
SameValue
newTarget
) is
true
, set
newTarget
to
target
6.
Return ?
Construct
target
args
newTarget
).
10.4.1.3
BoundFunctionCreate (
targetFunction
boundThis
boundArgs
The abstract operation BoundFunctionCreate takes arguments
targetFunction
(a
function object
),
boundThis
(an
ECMAScript language value
), and
boundArgs
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
function object
or a
throw completion
. It is used to specify the creation of new
bound function exotic objects
. It performs the following steps when called:
1.
Let
proto
be ?
targetFunction
.[[GetPrototypeOf]]
().
2.
Let
internalSlotsList
be the
list-concatenation
of « [[Prototype]], [[Extensible]] » and the internal slots listed in
Table 31
3.
Let
obj
be
MakeBasicObject
internalSlotsList
).
4.
Set
obj
.[[Prototype]] to
proto
5.
Set
obj
.[[Call]] as described in
10.4.1.1
6.
If
IsConstructor
targetFunction
) is
true
, then
a.
Set
obj
.[[Construct]] as described in
10.4.1.2
7.
Set
obj
.[[BoundTargetFunction]] to
targetFunction
8.
Set
obj
.[[BoundThis]] to
boundThis
9.
Set
obj
.[[BoundArguments]] to
boundArgs
10.
Return
obj
10.4.2
Array Exotic Objects
An Array is an
exotic object
that gives special treatment to
array index
property keys
(see
6.1.7
). A property whose
property name
is an
array index
is also called an
element
. Every Array has a non-configurable
"length"
property whose value is always a non-negative
integral Number
whose
mathematical value
is strictly less than 2
32
. The value of the
"length"
property is numerically greater than the name of every own property whose name is an
array index
whenever an own property of an Array is created or changed, other
properties are adjusted as necessary to maintain this invariant.
Specifically, whenever an own property is added whose name is an
array index
, the value of the
"length"
property is changed, if necessary, to be one more than the numeric value of that
array index
; and whenever the value of the
"length"
property is changed, every own property whose name is an
array index
whose value is not smaller than the new length is deleted. This
constraint applies only to own properties of an Array and is unaffected
by
"length"
or
array index
properties that may be inherited from its prototypes.
Note
A String
property name
is an
array index
if and only if
ToString
ToUint32
)) is
and
ToUint32
) is not
32
- 1
).
An object is an
Array exotic object
(or simply, an Array) if its [[DefineOwnProperty]] internal method uses
the following implementation, and its other essential internal methods
use the definitions found in
10.1
. These methods are installed in
ArrayCreate
10.4.2.1
[[DefineOwnProperty]] (
Desc
The [[DefineOwnProperty]] internal method of an
Array exotic object
takes arguments
(a
property key
) and
Desc
(a
Property Descriptor
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
is
"length"
, then
a.
Return ?
ArraySetLength
Desc
).
2.
Else if
is an
array index
, then
a.
Let
lengthDesc
be
OrdinaryGetOwnProperty
"length"
).
b.
Assert
IsDataDescriptor
lengthDesc
) is
true
c.
Assert
lengthDesc
.[[Configurable]] is
false
d.
Let
length
be
lengthDesc
.[[Value]].
e.
Assert
length
is a non-negative
integral Number
f.
Let
index
be !
ToUint32
).
g.
If
index
length
and
lengthDesc
.[[Writable]] is
false
, return
false
h.
Let
succeeded
be !
OrdinaryDefineOwnProperty
Desc
).
i.
If
succeeded
is
false
, return
false
j.
If
index
length
, then
i.
Set
lengthDesc
.[[Value]] to
index
ii.
Set
succeeded
to !
OrdinaryDefineOwnProperty
"length"
lengthDesc
).
iii.
Assert
succeeded
is
true
k.
Return
true
3.
Return ?
OrdinaryDefineOwnProperty
Desc
).
10.4.2.2
ArrayCreate (
length
[ ,
proto
] )
The abstract operation ArrayCreate takes argument
length
(a non-negative
integer
) and optional argument
proto
(an Object) and returns either a
normal completion containing
an
Array exotic object
or a
throw completion
. It is used to specify the creation of new Arrays. It performs the following steps when called:
1.
If
length
> 2
32
- 1, throw a
RangeError
exception.
2.
If
proto
is not present, set
proto
to
%Array.prototype%
3.
Let
be
MakeBasicObject
(« [[Prototype]], [[Extensible]] »).
4.
Set
.[[Prototype]] to
proto
5.
Set
.[[DefineOwnProperty]] as specified in
10.4.2.1
6.
Perform !
OrdinaryDefineOwnProperty
"length"
, PropertyDescriptor { [[Value]]:
length
), [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
7.
Return
10.4.2.3
ArraySpeciesCreate (
originalArray
length
The abstract operation ArraySpeciesCreate takes arguments
originalArray
(an Object) and
length
(a non-negative
integer
) and returns either a
normal completion containing
an Object or a
throw completion
. It is used to specify the creation of a new Array or similar object using a
constructor
function that is derived from
originalArray
. It does not enforce that the
constructor
function returns an Array. It performs the following steps when called:
1.
Let
isArray
be ?
IsArray
originalArray
).
2.
If
isArray
is
false
, return ?
ArrayCreate
length
).
3.
Let
be ?
Get
originalArray
"constructor"
).
4.
If
IsConstructor
) is
true
, then
a.
Let
thisRealm
be
the current Realm Record
b.
Let
realmC
be ?
GetFunctionRealm
).
c.
If
thisRealm
and
realmC
are not the same
Realm Record
, then
i.
If
SameValue
realmC
.[[Intrinsics]].[[
%Array%
]]) is
true
, set
to
undefined
5.
If
is an Object
, then
a.
Set
to ?
Get
@@species
).
b.
If
is
null
, set
to
undefined
6.
If
is
undefined
, return ?
ArrayCreate
length
).
7.
If
IsConstructor
) is
false
, throw a
TypeError
exception.
8.
Return ?
Construct
, «
length
) »).
Note
If
originalArray
was created using the standard built-in Array
constructor
for a
realm
that is not the
realm
of the
running execution context
, then a new Array is created using the
realm
of the
running execution context
. This maintains compatibility with Web browsers that have historically had that behaviour for the
Array.prototype
methods that now are defined using ArraySpeciesCreate.
10.4.2.4
ArraySetLength (
Desc
The abstract operation ArraySetLength takes arguments
(an Array) and
Desc
(a
Property Descriptor
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
Desc
does not have a [[Value]] field, then
a.
Return !
OrdinaryDefineOwnProperty
"length"
Desc
).
2.
Let
newLenDesc
be a copy of
Desc
3.
Let
newLen
be ?
ToUint32
Desc
.[[Value]]).
4.
Let
numberLen
be ?
ToNumber
Desc
.[[Value]]).
5.
If
SameValueZero
newLen
numberLen
) is
false
, throw a
RangeError
exception.
6.
Set
newLenDesc
.[[Value]] to
newLen
7.
Let
oldLenDesc
be
OrdinaryGetOwnProperty
"length"
).
8.
Assert
IsDataDescriptor
oldLenDesc
) is
true
9.
Assert
oldLenDesc
.[[Configurable]] is
false
10.
Let
oldLen
be
oldLenDesc
.[[Value]].
11.
If
newLen
oldLen
, then
a.
Return !
OrdinaryDefineOwnProperty
"length"
newLenDesc
).
12.
If
oldLenDesc
.[[Writable]] is
false
, return
false
13.
If
newLenDesc
does not have a [[Writable]] field or
newLenDesc
.[[Writable]] is
true
, let
newWritable
be
true
14.
Else,
a.
NOTE: Setting the [[Writable]] attribute to
false
is deferred in case any elements cannot be deleted.
b.
Let
newWritable
be
false
c.
Set
newLenDesc
.[[Writable]] to
true
15.
Let
succeeded
be !
OrdinaryDefineOwnProperty
"length"
newLenDesc
).
16.
If
succeeded
is
false
, return
false
17.
For each own
property key
of
such that
is an
array index
and !
ToUint32
) ≥
newLen
, in descending numeric index order, do
a.
Let
deleteSucceeded
be !
.[[Delete]](
).
b.
If
deleteSucceeded
is
false
, then
i.
Set
newLenDesc
.[[Value]] to !
ToUint32
) +
ii.
If
newWritable
is
false
, set
newLenDesc
.[[Writable]] to
false
iii.
Perform !
OrdinaryDefineOwnProperty
"length"
newLenDesc
).
iv.
Return
false
18.
If
newWritable
is
false
, then
a.
Set
succeeded
to !
OrdinaryDefineOwnProperty
"length"
, PropertyDescriptor { [[Writable]]:
false
}).
b.
Assert
succeeded
is
true
19.
Return
true
Note
In steps
and
, if
Desc
.[[Value]] is an object then its
valueOf
method is called twice. This is legacy behaviour that was specified with this effect starting with the 2
nd
Edition of this specification.
10.4.3
String Exotic Objects
A String object is an
exotic object
that encapsulates a String value and exposes virtual
integer
-indexed
data properties
corresponding to the individual code unit elements of the String value.
String exotic objects
always have a
data property
named
"length"
whose value is the length of the encapsulated String value. Both the code unit
data properties
and the
"length"
property are non-writable and non-configurable.
An object is a
String exotic object
(or simply, a String object) if its [[GetOwnProperty]],
[[DefineOwnProperty]], and [[OwnPropertyKeys]] internal methods use the
following implementations, and its other essential internal methods use
the definitions found in
10.1
. These methods are installed in
StringCreate
String exotic objects
have the same internal slots as
ordinary objects
. They also have a [[StringData]] internal slot.
10.4.3.1
[[GetOwnProperty]] (
The [[GetOwnProperty]] internal method of a
String exotic object
takes argument
(a
property key
) and returns a
normal completion containing
either a
Property Descriptor
or
undefined
. It performs the following steps when called:
1.
Let
desc
be
OrdinaryGetOwnProperty
).
2.
If
desc
is not
undefined
, return
desc
3.
Return
StringGetOwnProperty
).
10.4.3.2
[[DefineOwnProperty]] (
Desc
The [[DefineOwnProperty]] internal method of a
String exotic object
takes arguments
(a
property key
) and
Desc
(a
Property Descriptor
) and returns a
normal completion containing
a Boolean. It performs the following steps when called:
1.
Let
stringDesc
be
StringGetOwnProperty
).
2.
If
stringDesc
is not
undefined
, then
a.
Let
extensible
be
.[[Extensible]].
b.
Return
IsCompatiblePropertyDescriptor
extensible
Desc
stringDesc
).
3.
Return !
OrdinaryDefineOwnProperty
Desc
).
10.4.3.3
[[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of a
String exotic object
takes no arguments and returns a
normal completion containing
List
of
property keys
. It performs the following steps when called:
1.
Let
keys
be a new empty
List
2.
Let
str
be
.[[StringData]].
3.
Assert
str
is a String
4.
Let
len
be the length of
str
5.
For each
integer
such that 0 ≤
len
, in ascending order, do
a.
Append !
ToString
)) to
keys
6.
For each own
property key
of
such that
is an
array index
and !
ToIntegerOrInfinity
) ≥
len
, in ascending numeric index order, do
a.
Append
to
keys
7.
For each own
property key
of
such that
is a String
and
is not an
array index
, in ascending chronological order of property creation, do
a.
Append
to
keys
8.
For each own
property key
of
such that
is a Symbol
, in ascending chronological order of property creation, do
a.
Append
to
keys
9.
Return
keys
10.4.3.4
StringCreate (
value
prototype
The abstract operation StringCreate takes arguments
value
(a String) and
prototype
(an Object) and returns a
String exotic object
. It is used to specify the creation of new
String exotic objects
. It performs the following steps when called:
1.
Let
be
MakeBasicObject
(« [[Prototype]], [[Extensible]], [[StringData]] »).
2.
Set
.[[Prototype]] to
prototype
3.
Set
.[[StringData]] to
value
4.
Set
.[[GetOwnProperty]] as specified in
10.4.3.1
5.
Set
.[[DefineOwnProperty]] as specified in
10.4.3.2
6.
Set
.[[OwnPropertyKeys]] as specified in
10.4.3.3
7.
Let
length
be the length of
value
8.
Perform !
DefinePropertyOrThrow
"length"
, PropertyDescriptor { [[Value]]:
length
), [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
9.
Return
10.4.3.5
StringGetOwnProperty (
The abstract operation StringGetOwnProperty takes arguments
(an Object that has a [[StringData]] internal slot) and
(a
property key
) and returns a
Property Descriptor
or
undefined
. It performs the following steps when called:
1.
If
is not a String
, return
undefined
2.
Let
index
be
CanonicalNumericIndexString
).
3.
If
index
is
undefined
, return
undefined
4.
If
IsIntegralNumber
index
) is
false
, return
undefined
5.
If
index
is
-0
, return
undefined
6.
Let
str
be
.[[StringData]].
7.
Assert
str
is a String
8.
Let
len
be the length of
str
9.
If
index
) < 0 or
len
index
), return
undefined
10.
Let
resultStr
be the
substring
of
str
from
index
) to
index
) + 1.
11.
Return the PropertyDescriptor { [[Value]]:
resultStr
, [[Writable]]:
false
, [[Enumerable]]:
true
, [[Configurable]]:
false
}.
10.4.4
Arguments Exotic Objects
Most ECMAScript functions make an arguments object available to
their code. Depending upon the characteristics of the function
definition, its arguments object is either an
ordinary object
or an
arguments exotic object
. An
arguments exotic object
is an
exotic object
whose
array index
properties map to the formal parameters bindings of an invocation of its associated ECMAScript function.
An object is an
arguments exotic object
if its internal methods use the following implementations, with the ones not specified here using those found in
10.1
. These methods are installed in
CreateMappedArgumentsObject
Note 1
While
CreateUnmappedArgumentsObject
is grouped into this clause, it creates an
ordinary object
, not an
arguments exotic object
Arguments exotic objects
have the same internal slots as
ordinary objects
They also have a [[ParameterMap]] internal slot. Ordinary arguments
objects also have a [[ParameterMap]] internal slot whose value is always
undefined. For ordinary argument objects the [[ParameterMap]] internal
slot is only used by
Object.prototype.toString
20.1.3.6
) to identify them as such.
Note 2
The
integer
-indexed
data properties
of an
arguments exotic object
whose numeric name values are less than the number of formal parameters of the corresponding
function object
initially share their values with the corresponding argument bindings in the function's
execution context
This means that changing the property changes the corresponding value
of the argument binding and vice-versa. This correspondence is broken if
such a property is deleted and then redefined or if the property is
changed into an
accessor property
. If the arguments object is an
ordinary object
the values of its properties are simply a copy of the arguments passed
to the function and there is no dynamic linkage between the property
values and the formal parameter values.
Note 3
The ParameterMap object and its property values are used as a
device for specifying the arguments object correspondence to argument
bindings. The ParameterMap object and the objects that are the values of
its properties are not directly observable from ECMAScript code. An
ECMAScript implementation does not need to actually create or use such
objects to implement the specified semantics.
Note 4
Ordinary arguments objects define a non-configurable
accessor property
named
"callee"
which throws a
TypeError
exception on access. The
"callee"
property has a more specific meaning for
arguments exotic objects
, which are created only for some class of
non-strict functions
The definition of this property in the ordinary variant exists to
ensure that it is not defined in any other manner by conforming
ECMAScript implementations.
Note 5
ECMAScript implementations of
arguments exotic objects
have historically contained an
accessor property
named
"caller"
. Prior to ECMAScript 2017, this specification included the definition of a throwing
"caller"
property on ordinary arguments objects. Since implementations do not
contain this extension any longer, ECMAScript 2017 dropped the
requirement for a throwing
"caller"
accessor.
10.4.4.1
[[GetOwnProperty]] (
The [[GetOwnProperty]] internal method of an
arguments exotic object
args
takes argument
(a
property key
) and returns a
normal completion containing
either a
Property Descriptor
or
undefined
. It performs the following steps when called:
1.
Let
desc
be
OrdinaryGetOwnProperty
args
).
2.
If
desc
is
undefined
, return
desc
3.
Let
map
be
args
.[[ParameterMap]].
4.
Let
isMapped
be !
HasOwnProperty
map
).
5.
If
isMapped
is
true
, then
a.
Set
desc
.[[Value]] to !
Get
map
).
6.
Return
desc
10.4.4.2
[[DefineOwnProperty]] (
Desc
The [[DefineOwnProperty]] internal method of an
arguments exotic object
args
takes arguments
(a
property key
) and
Desc
(a
Property Descriptor
) and returns a
normal completion containing
a Boolean. It performs the following steps when called:
1.
Let
map
be
args
.[[ParameterMap]].
2.
Let
isMapped
be !
HasOwnProperty
map
).
3.
Let
newArgDesc
be
Desc
4.
If
isMapped
is
true
and
IsDataDescriptor
Desc
) is
true
, then
a.
If
Desc
does not have a [[Value]] field,
Desc
has a [[Writable]] field, and
Desc
.[[Writable]] is
false
, then
i.
Set
newArgDesc
to a copy of
Desc
ii.
Set
newArgDesc
.[[Value]] to !
Get
map
).
5.
Let
allowed
be !
OrdinaryDefineOwnProperty
args
newArgDesc
).
6.
If
allowed
is
false
, return
false
7.
If
isMapped
is
true
, then
a.
If
IsAccessorDescriptor
Desc
) is
true
, then
i.
Perform !
map
.[[Delete]](
).
b.
Else,
i.
If
Desc
has a [[Value]] field, then
1.
Assert
: The following Set will succeed, since formal parameters mapped by arguments objects are always writable.
2.
Perform !
Set
map
Desc
.[[Value]],
false
).
ii.
If
Desc
has a [[Writable]] field and
Desc
.[[Writable]] is
false
, then
1.
Perform !
map
.[[Delete]](
).
8.
Return
true
10.4.4.3
[[Get]] (
Receiver
The [[Get]] internal method of an
arguments exotic object
args
takes arguments
(a
property key
) and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
map
be
args
.[[ParameterMap]].
2.
Let
isMapped
be !
HasOwnProperty
map
).
3.
If
isMapped
is
false
, then
a.
Return ?
OrdinaryGet
args
Receiver
).
4.
Else,
a.
Assert
map
contains a formal parameter mapping for
b.
Return !
Get
map
).
10.4.4.4
[[Set]] (
Receiver
The [[Set]] internal method of an
arguments exotic object
args
takes arguments
(a
property key
),
(an
ECMAScript language value
), and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
SameValue
args
Receiver
) is
false
, then
a.
Let
isMapped
be
false
2.
Else,
a.
Let
map
be
args
.[[ParameterMap]].
b.
Let
isMapped
be !
HasOwnProperty
map
).
3.
If
isMapped
is
true
, then
a.
Assert
: The following Set will succeed, since formal parameters mapped by arguments objects are always writable.
b.
Perform !
Set
map
false
).
4.
Return ?
OrdinarySet
args
Receiver
).
10.4.4.5
[[Delete]] (
The [[Delete]] internal method of an
arguments exotic object
args
takes argument
(a
property key
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Let
map
be
args
.[[ParameterMap]].
2.
Let
isMapped
be !
HasOwnProperty
map
).
3.
Let
result
be ?
OrdinaryDelete
args
).
4.
If
result
is
true
and
isMapped
is
true
, then
a.
Perform !
map
.[[Delete]](
).
5.
Return
result
10.4.4.6
CreateUnmappedArgumentsObject (
argumentsList
The abstract operation CreateUnmappedArgumentsObject takes argument
argumentsList
(a
List
of
ECMAScript language values
) and returns an
ordinary object
. It performs the following steps when called:
1.
Let
len
be the number of elements in
argumentsList
2.
Let
obj
be
OrdinaryObjectCreate
%Object.prototype%
, « [[ParameterMap]] »).
3.
Set
obj
.[[ParameterMap]] to
undefined
4.
Perform !
DefinePropertyOrThrow
obj
"length"
, PropertyDescriptor { [[Value]]:
len
), [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
5.
Let
index
be 0.
6.
Repeat, while
index
len
a.
Let
val
be
argumentsList
index
].
b.
Perform !
CreateDataPropertyOrThrow
obj
, !
ToString
index
)),
val
).
c.
Set
index
to
index
+ 1.
7.
Perform !
DefinePropertyOrThrow
obj
@@iterator
, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
8.
Perform !
DefinePropertyOrThrow
obj
"callee"
, PropertyDescriptor { [[Get]]:
%ThrowTypeError%
, [[Set]]:
%ThrowTypeError%
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
9.
Return
obj
10.4.4.7
CreateMappedArgumentsObject (
func
formals
argumentsList
env
The abstract operation CreateMappedArgumentsObject takes arguments
func
(an Object),
formals
(a
Parse Node
),
argumentsList
(a
List
of
ECMAScript language values
), and
env
(an
Environment Record
) and returns an
arguments exotic object
. It performs the following steps when called:
1.
Assert
formals
does not contain a rest parameter, any binding patterns, or any initializers. It may contain duplicate identifiers.
2.
Let
len
be the number of elements in
argumentsList
3.
Let
obj
be
MakeBasicObject
(« [[Prototype]], [[Extensible]], [[ParameterMap]] »).
4.
Set
obj
.[[GetOwnProperty]] as specified in
10.4.4.1
5.
Set
obj
.[[DefineOwnProperty]] as specified in
10.4.4.2
6.
Set
obj
.[[Get]] as specified in
10.4.4.3
7.
Set
obj
.[[Set]] as specified in
10.4.4.4
8.
Set
obj
.[[Delete]] as specified in
10.4.4.5
9.
Set
obj
.[[Prototype]] to
%Object.prototype%
10.
Let
map
be
OrdinaryObjectCreate
null
).
11.
Set
obj
.[[ParameterMap]] to
map
12.
Let
parameterNames
be the
BoundNames
of
formals
13.
Let
numberOfParameters
be the number of elements in
parameterNames
14.
Let
index
be 0.
15.
Repeat, while
index
len
a.
Let
val
be
argumentsList
index
].
b.
Perform !
CreateDataPropertyOrThrow
obj
, !
ToString
index
)),
val
).
c.
Set
index
to
index
+ 1.
16.
Perform !
DefinePropertyOrThrow
obj
"length"
, PropertyDescriptor { [[Value]]:
len
), [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
17.
Let
mappedNames
be a new empty
List
18.
Set
index
to
numberOfParameters
- 1.
19.
Repeat, while
index
≥ 0,
a.
Let
name
be
parameterNames
index
].
b.
If
mappedNames
does not contain
name
, then
i.
Append
name
to
mappedNames
ii.
If
index
len
, then
1.
Let
be
MakeArgGetter
name
env
).
2.
Let
be
MakeArgSetter
name
env
).
3.
Perform !
map
.[[DefineOwnProperty]](!
ToString
index
)), PropertyDescriptor { [[Set]]:
, [[Get]]:
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
c.
Set
index
to
index
- 1.
20.
Perform !
DefinePropertyOrThrow
obj
@@iterator
, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
21.
Perform !
DefinePropertyOrThrow
obj
"callee"
, PropertyDescriptor { [[Value]]:
func
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
true
}).
22.
Return
obj
10.4.4.7.1
MakeArgGetter (
name
env
The abstract operation MakeArgGetter takes arguments
name
(a String) and
env
(an
Environment Record
) and returns a
function object
. It creates a built-in
function object
that when executed returns the value bound for
name
in
env
. It performs the following steps when called:
1.
Let
getterClosure
be a new
Abstract Closure
with no parameters that captures
name
and
env
and performs the following steps when called:
a.
Return
env
.GetBindingValue(
name
false
).
2.
Let
getter
be
CreateBuiltinFunction
getterClosure
, 0,
""
, « »).
3.
NOTE:
getter
is never directly accessible to ECMAScript code.
4.
Return
getter
10.4.4.7.2
MakeArgSetter (
name
env
The abstract operation MakeArgSetter takes arguments
name
(a String) and
env
(an
Environment Record
) and returns a
function object
. It creates a built-in
function object
that when executed sets the value bound for
name
in
env
. It performs the following steps when called:
1.
Let
setterClosure
be a new
Abstract Closure
with parameters (
value
) that captures
name
and
env
and performs the following steps when called:
a.
Return !
env
.SetMutableBinding(
name
value
false
).
2.
Let
setter
be
CreateBuiltinFunction
setterClosure
, 1,
""
, « »).
3.
NOTE:
setter
is never directly accessible to ECMAScript code.
4.
Return
setter
10.4.5
Integer-Indexed Exotic Objects
An
Integer-Indexed exotic object
is an
exotic object
that performs special handling of
integer index
property keys
Integer-Indexed exotic objects
have the same internal slots as
ordinary objects
and additionally [[ViewedArrayBuffer]], [[ArrayLength]],
[[ByteOffset]], [[ContentType]], and [[TypedArrayName]] internal slots.
An object is an
Integer-Indexed exotic object
if its [[GetOwnProperty]], [[HasProperty]], [[DefineOwnProperty]],
[[Get]], [[Set]], [[Delete]], and [[OwnPropertyKeys]] internal methods
use the definitions in this section, and its other essential internal
methods use the definitions found in
10.1
. These methods are installed by
IntegerIndexedObjectCreate
10.4.5.1
[[GetOwnProperty]] (
The [[GetOwnProperty]] internal method of an
Integer-Indexed exotic object
takes argument
(a
property key
) and returns a
normal completion containing
either a
Property Descriptor
or
undefined
. It performs the following steps when called:
1.
If
is a String
, then
a.
Let
numericIndex
be
CanonicalNumericIndexString
).
b.
If
numericIndex
is not
undefined
, then
i.
Let
value
be
IntegerIndexedElementGet
numericIndex
).
ii.
If
value
is
undefined
, return
undefined
iii.
Return the PropertyDescriptor { [[Value]]:
value
, [[Writable]]:
true
, [[Enumerable]]:
true
, [[Configurable]]:
true
}.
2.
Return
OrdinaryGetOwnProperty
).
10.4.5.2
[[HasProperty]] (
The [[HasProperty]] internal method of an
Integer-Indexed exotic object
takes argument
(a
property key
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
is a String
, then
a.
Let
numericIndex
be
CanonicalNumericIndexString
).
b.
If
numericIndex
is not
undefined
, return
IsValidIntegerIndex
numericIndex
).
2.
Return ?
OrdinaryHasProperty
).
10.4.5.3
[[DefineOwnProperty]] (
Desc
The [[DefineOwnProperty]] internal method of an
Integer-Indexed exotic object
takes arguments
(a
property key
) and
Desc
(a
Property Descriptor
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
is a String
, then
a.
Let
numericIndex
be
CanonicalNumericIndexString
).
b.
If
numericIndex
is not
undefined
, then
i.
If
IsValidIntegerIndex
numericIndex
) is
false
, return
false
ii.
If
Desc
has a [[Configurable]] field and
Desc
.[[Configurable]] is
false
, return
false
iii.
If
Desc
has an [[Enumerable]] field and
Desc
.[[Enumerable]] is
false
, return
false
iv.
If
IsAccessorDescriptor
Desc
) is
true
, return
false
v.
If
Desc
has a [[Writable]] field and
Desc
.[[Writable]] is
false
, return
false
vi.
If
Desc
has a [[Value]] field, perform ?
IntegerIndexedElementSet
numericIndex
Desc
.[[Value]]).
vii.
Return
true
2.
Return !
OrdinaryDefineOwnProperty
Desc
).
10.4.5.4
[[Get]] (
Receiver
The [[Get]] internal method of an
Integer-Indexed exotic object
takes arguments
(a
property key
) and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
If
is a String
, then
a.
Let
numericIndex
be
CanonicalNumericIndexString
).
b.
If
numericIndex
is not
undefined
, then
i.
Return
IntegerIndexedElementGet
numericIndex
).
2.
Return ?
OrdinaryGet
Receiver
).
10.4.5.5
[[Set]] (
Receiver
The [[Set]] internal method of an
Integer-Indexed exotic object
takes arguments
(a
property key
),
(an
ECMAScript language value
), and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
is a String
, then
a.
Let
numericIndex
be
CanonicalNumericIndexString
).
b.
If
numericIndex
is not
undefined
, then
i.
If
SameValue
Receiver
) is
true
, then
1.
Perform ?
IntegerIndexedElementSet
numericIndex
).
2.
Return
true
ii.
If
IsValidIntegerIndex
numericIndex
) is
false
, return
true
2.
Return ?
OrdinarySet
Receiver
).
10.4.5.6
[[Delete]] (
The [[Delete]] internal method of an
Integer-Indexed exotic object
takes argument
(a
property key
) and returns a
normal completion containing
a Boolean. It performs the following steps when called:
1.
If
is a String
, then
a.
Let
numericIndex
be
CanonicalNumericIndexString
).
b.
If
numericIndex
is not
undefined
, then
i.
If
IsValidIntegerIndex
numericIndex
) is
false
, return
true
; else return
false
2.
Return !
OrdinaryDelete
).
10.4.5.7
[[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of an
Integer-Indexed exotic object
takes no arguments and returns a
normal completion containing
List
of
property keys
. It performs the following steps when called:
1.
Let
keys
be a new empty
List
2.
If
IsDetachedBuffer
.[[ViewedArrayBuffer]]) is
false
, then
a.
For each
integer
such that 0 ≤
.[[ArrayLength]], in ascending order, do
i.
Append !
ToString
)) to
keys
3.
For each own
property key
of
such that
is a String
and
is not an
integer index
, in ascending chronological order of property creation, do
a.
Append
to
keys
4.
For each own
property key
of
such that
is a Symbol
, in ascending chronological order of property creation, do
a.
Append
to
keys
5.
Return
keys
10.4.5.8
IntegerIndexedObjectCreate (
prototype
The abstract operation IntegerIndexedObjectCreate takes argument
prototype
(an Object) and returns an
Integer-Indexed exotic object
. It is used to specify the creation of new
Integer-Indexed exotic objects
. It performs the following steps when called:
1.
Let
internalSlotsList
be « [[Prototype]], [[Extensible]], [[ViewedArrayBuffer]],
[[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]],
[[ArrayLength]] ».
2.
Let
be
MakeBasicObject
internalSlotsList
).
3.
Set
.[[GetOwnProperty]] as specified in
10.4.5.1
4.
Set
.[[HasProperty]] as specified in
10.4.5.2
5.
Set
.[[DefineOwnProperty]] as specified in
10.4.5.3
6.
Set
.[[Get]] as specified in
10.4.5.4
7.
Set
.[[Set]] as specified in
10.4.5.5
8.
Set
.[[Delete]] as specified in
10.4.5.6
9.
Set
.[[OwnPropertyKeys]] as specified in
10.4.5.7
10.
Set
.[[Prototype]] to
prototype
11.
Return
10.4.5.9
IsValidIntegerIndex (
index
The abstract operation IsValidIntegerIndex takes arguments
(an
Integer-Indexed exotic object
) and
index
(a Number) and returns a Boolean. It performs the following steps when called:
1.
If
IsDetachedBuffer
.[[ViewedArrayBuffer]]) is
true
, return
false
2.
If
IsIntegralNumber
index
) is
false
, return
false
3.
If
index
is
-0
, return
false
4.
If
index
) < 0 or
index
) ≥
.[[ArrayLength]], return
false
5.
Return
true
10.4.5.10
IntegerIndexedElementGet (
index
The abstract operation IntegerIndexedElementGet takes arguments
(an
Integer-Indexed exotic object
) and
index
(a Number) and returns a Number, a BigInt, or
undefined
. It performs the following steps when called:
1.
If
IsValidIntegerIndex
index
) is
false
, return
undefined
2.
Let
offset
be
.[[ByteOffset]].
3.
Let
elementSize
be
TypedArrayElementSize
).
4.
Let
indexedPosition
be (
index
) ×
elementSize
) +
offset
5.
Let
elementType
be
TypedArrayElementType
).
6.
Return
GetValueFromBuffer
.[[ViewedArrayBuffer]],
indexedPosition
elementType
true
Unordered
).
10.4.5.11
IntegerIndexedElementSet (
index
value
The abstract operation IntegerIndexedElementSet takes arguments
(an
Integer-Indexed exotic object
),
index
(a Number), and
value
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
If
.[[ContentType]] is
BigInt
, let
numValue
be ?
ToBigInt
value
).
2.
Otherwise, let
numValue
be ?
ToNumber
value
).
3.
If
IsValidIntegerIndex
index
) is
true
, then
a.
Let
offset
be
.[[ByteOffset]].
b.
Let
elementSize
be
TypedArrayElementSize
).
c.
Let
indexedPosition
be (
index
) ×
elementSize
) +
offset
d.
Let
elementType
be
TypedArrayElementType
).
e.
Perform
SetValueInBuffer
.[[ViewedArrayBuffer]],
indexedPosition
elementType
numValue
true
Unordered
).
4.
Return
unused
Note
This operation always appears to succeed, but it has no
effect when attempting to write past the end of a TypedArray or to a
TypedArray which is backed by a detached ArrayBuffer.
10.4.6
Module Namespace Exotic Objects
module namespace exotic object
is an
exotic object
that exposes the bindings exported from an ECMAScript
Module
(See
16.2.3
). There is a one-to-one correspondence between the String-keyed own properties of a
module namespace exotic object
and the binding names exported by the
Module
. The exported bindings include any bindings that are indirectly exported using
export *
export items. Each String-valued own
property key
is the
StringValue
of the corresponding exported binding name. These are the only String-keyed properties of a
module namespace exotic object
. Each such property has the attributes { [[Writable]]:
true
, [[Enumerable]]:
true
, [[Configurable]]:
false
}.
Module namespace exotic objects
are not extensible.
An object is a
module namespace exotic object
if its [[GetPrototypeOf]], [[SetPrototypeOf]], [[IsExtensible]],
[[PreventExtensions]], [[GetOwnProperty]], [[DefineOwnProperty]],
[[HasProperty]], [[Get]], [[Set]], [[Delete]], and [[OwnPropertyKeys]]
internal methods use the definitions in this section, and its other
essential internal methods use the definitions found in
10.1
. These methods are installed by
ModuleNamespaceCreate
Module namespace exotic objects
have the internal slots defined in
Table 32
Table 32: Internal Slots of Module Namespace Exotic Objects
Internal Slot
Type
Description
[[Module]]
Module Record
The
Module Record
whose exports this namespace exposes.
[[Exports]]
List
of Strings
List
whose elements are the String values of the exported names exposed as
own properties of this object. The list is ordered as if an Array of
those String values had been sorted using %Array.prototype.sort% using
undefined
as
comparefn
10.4.6.1
[[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of a
module namespace exotic object
takes no arguments and returns a
normal completion containing
null
. It performs the following steps when called:
1.
Return
null
10.4.6.2
[[SetPrototypeOf]] (
The [[SetPrototypeOf]] internal method of a
module namespace exotic object
takes argument
(an Object or
null
) and returns a
normal completion containing
a Boolean. It performs the following steps when called:
1.
Return !
SetImmutablePrototype
).
10.4.6.3
[[IsExtensible]] ( )
The [[IsExtensible]] internal method of a
module namespace exotic object
takes no arguments and returns a
normal completion containing
false
. It performs the following steps when called:
1.
Return
false
10.4.6.4
[[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of a
module namespace exotic object
takes no arguments and returns a
normal completion containing
true
. It performs the following steps when called:
1.
Return
true
10.4.6.5
[[GetOwnProperty]] (
The [[GetOwnProperty]] internal method of a
module namespace exotic object
takes argument
(a
property key
) and returns either a
normal completion containing
either a
Property Descriptor
or
undefined
, or a
throw completion
. It performs the following steps when called:
1.
If
is a Symbol
, return
OrdinaryGetOwnProperty
).
2.
Let
exports
be
.[[Exports]].
3.
If
exports
does not contain
, return
undefined
4.
Let
value
be ?
.[[Get]](
).
5.
Return PropertyDescriptor { [[Value]]:
value
, [[Writable]]:
true
, [[Enumerable]]:
true
, [[Configurable]]:
false
}.
10.4.6.6
[[DefineOwnProperty]] (
Desc
The [[DefineOwnProperty]] internal method of a
module namespace exotic object
takes arguments
(a
property key
) and
Desc
(a
Property Descriptor
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
is a Symbol
, return !
OrdinaryDefineOwnProperty
Desc
).
2.
Let
current
be ?
.[[GetOwnProperty]](
).
3.
If
current
is
undefined
, return
false
4.
If
Desc
has a [[Configurable]] field and
Desc
.[[Configurable]] is
true
, return
false
5.
If
Desc
has an [[Enumerable]] field and
Desc
.[[Enumerable]] is
false
, return
false
6.
If
IsAccessorDescriptor
Desc
) is
true
, return
false
7.
If
Desc
has a [[Writable]] field and
Desc
.[[Writable]] is
false
, return
false
8.
If
Desc
has a [[Value]] field, return
SameValue
Desc
.[[Value]],
current
.[[Value]]).
9.
Return
true
10.4.6.7
[[HasProperty]] (
The [[HasProperty]] internal method of a
module namespace exotic object
takes argument
(a
property key
) and returns a
normal completion containing
a Boolean. It performs the following steps when called:
1.
If
is a Symbol
, return !
OrdinaryHasProperty
).
2.
Let
exports
be
.[[Exports]].
3.
If
exports
contains
, return
true
4.
Return
false
10.4.6.8
[[Get]] (
Receiver
The [[Get]] internal method of a
module namespace exotic object
takes arguments
(a
property key
) and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
If
is a Symbol
, then
a.
Return !
OrdinaryGet
Receiver
).
2.
Let
exports
be
.[[Exports]].
3.
If
exports
does not contain
, return
undefined
4.
Let
be
.[[Module]].
5.
Let
binding
be
.ResolveExport(
).
6.
Assert
binding
is a
ResolvedBinding Record
7.
Let
targetModule
be
binding
.[[Module]].
8.
Assert
targetModule
is not
undefined
9.
If
binding
.[[BindingName]] is
namespace
, then
a.
Return
GetModuleNamespace
targetModule
).
10.
Let
targetEnv
be
targetModule
.[[Environment]].
11.
If
targetEnv
is
empty
, throw a
ReferenceError
exception.
12.
Return ?
targetEnv
.GetBindingValue(
binding
.[[BindingName]],
true
).
Note
ResolveExport is side-effect free. Each time this operation is called with a specific
exportName
resolveSet
pair as arguments it must return the same result. An implementation
might choose to pre-compute or cache the ResolveExport results for the
[[Exports]] of each
module namespace exotic object
10.4.6.9
[[Set]] (
Receiver
The [[Set]] internal method of a
module namespace exotic object
takes arguments
(a
property key
),
(an
ECMAScript language value
), and
Receiver
(an
ECMAScript language value
) and returns a
normal completion containing
false
. It performs the following steps when called:
1.
Return
false
10.4.6.10
[[Delete]] (
The [[Delete]] internal method of a
module namespace exotic object
takes argument
(a
property key
) and returns a
normal completion containing
a Boolean. It performs the following steps when called:
1.
If
is a Symbol
, then
a.
Return !
OrdinaryDelete
).
2.
Let
exports
be
.[[Exports]].
3.
If
exports
contains
, return
false
4.
Return
true
10.4.6.11
[[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of a
module namespace exotic object
takes no arguments and returns a
normal completion containing
List
of
property keys
. It performs the following steps when called:
1.
Let
exports
be
.[[Exports]].
2.
Let
symbolKeys
be
OrdinaryOwnPropertyKeys
).
3.
Return the
list-concatenation
of
exports
and
symbolKeys
10.4.6.12
ModuleNamespaceCreate (
module
exports
The abstract operation ModuleNamespaceCreate takes arguments
module
(a
Module Record
) and
exports
(a
List
of Strings) and returns a
module namespace exotic object
. It is used to specify the creation of new
module namespace exotic objects
. It performs the following steps when called:
1.
Assert
module
.[[Namespace]] is
empty
2.
Let
internalSlotsList
be the internal slots listed in
Table 32
3.
Let
be
MakeBasicObject
internalSlotsList
).
4.
Set
's essential internal methods to the definitions specified in
10.4.6
5.
Set
.[[Module]] to
module
6.
Let
sortedExports
be a
List
whose elements are the elements of
exports
ordered as if an Array of the same values had been sorted using %Array.prototype.sort% using
undefined
as
comparefn
7.
Set
.[[Exports]] to
sortedExports
8.
Create own properties of
corresponding to the definitions in
28.3
9.
Set
module
.[[Namespace]] to
10.
Return
10.4.7
Immutable Prototype Exotic Objects
An
immutable prototype exotic object
is an
exotic object
that has a [[Prototype]] internal slot that will not change once it is initialized.
An object is an
immutable prototype exotic object
if its [[SetPrototypeOf]] internal method uses the following
implementation. (Its other essential internal methods may use any
implementation, depending on the specific
immutable prototype exotic object
in question.)
Note
Unlike other
exotic objects
, there is not a dedicated creation abstract operation provided for
immutable prototype exotic objects
. This is because they are only used by
%Object.prototype%
and by
host environments
, and in
host environments
, the relevant objects are potentially exotic in other ways and thus need their own dedicated creation operation.
10.4.7.1
[[SetPrototypeOf]] (
The [[SetPrototypeOf]] internal method of an
immutable prototype exotic object
takes argument
(an Object or
null
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Return ?
SetImmutablePrototype
).
10.4.7.2
SetImmutablePrototype (
The abstract operation SetImmutablePrototype takes arguments
(an Object) and
(an Object or
null
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Let
current
be ?
.[[GetPrototypeOf]]
().
2.
If
SameValue
current
) is
true
, return
true
3.
Return
false
10.5
Proxy Object Internal Methods and Internal Slots
A Proxy object is an
exotic object
whose essential internal methods are partially implemented using
ECMAScript code. Every Proxy object has an internal slot called
[[ProxyHandler]]. The value of [[ProxyHandler]] is an object, called the
proxy's
handler object
, or
null
. Methods (see
Table 33
of a handler object may be used to augment the implementation for one
or more of the Proxy object's internal methods. Every Proxy object also
has an internal slot called [[ProxyTarget]] whose value is either an
object or the
null
value. This object is called the proxy's
target object
An object is a
Proxy exotic object
if its essential internal methods (including [[Call]] and
[[Construct]], if applicable) use the definitions in this section. These
internal methods are installed in
ProxyCreate
Table 33: Proxy Handler Methods
Internal Method
Handler Method
[[GetPrototypeOf]]
getPrototypeOf
[[SetPrototypeOf]]
setPrototypeOf
[[IsExtensible]]
isExtensible
[[PreventExtensions]]
preventExtensions
[[GetOwnProperty]]
getOwnPropertyDescriptor
[[DefineOwnProperty]]
defineProperty
[[HasProperty]]
has
[[Get]]
get
[[Set]]
set
[[Delete]]
deleteProperty
[[OwnPropertyKeys]]
ownKeys
[[Call]]
apply
[[Construct]]
construct
When a handler method is called to provide the implementation of a
Proxy object internal method, the handler method is passed the proxy's
target object as a parameter. A proxy's handler object does not
necessarily have a method corresponding to every essential internal
method. Invoking an internal method on the proxy results in the
invocation of the corresponding internal method on the proxy's target
object if the handler object does not have a method corresponding to the
internal trap.
The [[ProxyHandler]] and [[ProxyTarget]] internal slots of a
Proxy object are always initialized when the object is created and
typically may not be modified. Some Proxy objects are created in a
manner that permits them to be subsequently
revoked
. When a proxy is revoked, its [[ProxyHandler]] and [[ProxyTarget]] internal slots are set to
null
causing subsequent invocations of internal methods on that Proxy object to throw a
TypeError
exception.
Because Proxy objects permit the implementation of internal
methods to be provided by arbitrary ECMAScript code, it is possible to
define a Proxy object whose handler methods violates the invariants
defined in
6.1.7.3
. Some of the internal method invariants defined in
6.1.7.3
are essential integrity invariants. These invariants are explicitly
enforced by the Proxy object internal methods specified in this section.
An ECMAScript implementation must be robust in the presence of all
possible invariant violations.
In the following algorithm descriptions, assume
is an ECMAScript Proxy object,
is a
property key
value,
is any
ECMAScript language value
and
Desc
is a
Property Descriptor
record.
10.5.1
[[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of a
Proxy exotic object
takes no arguments and returns either a
normal completion containing
either an Object or
null
, or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"getPrototypeOf"
).
6.
If
trap
is
undefined
, then
a.
Return ?
target
.[[GetPrototypeOf]]
().
7.
Let
handlerProto
be ?
Call
trap
handler
, «
target
»).
8.
If
handlerProto
is not an Object
and
handlerProto
is not
null
, throw a
TypeError
exception.
9.
Let
extensibleTarget
be ?
IsExtensible
target
).
10.
If
extensibleTarget
is
true
, return
handlerProto
11.
Let
targetProto
be ?
target
.[[GetPrototypeOf]]
().
12.
If
SameValue
handlerProto
targetProto
) is
false
, throw a
TypeError
exception.
13.
Return
handlerProto
Note
[[GetPrototypeOf]] for Proxy objects enforces the following invariants:
The result of [[GetPrototypeOf]] must be either an Object or
null
If the target object is not extensible, [[GetPrototypeOf]]
applied to the Proxy object must return the same value as
[[GetPrototypeOf]] applied to the Proxy object's target object.
10.5.2
[[SetPrototypeOf]] (
The [[SetPrototypeOf]] internal method of a
Proxy exotic object
takes argument
(an Object or
null
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"setPrototypeOf"
).
6.
If
trap
is
undefined
, then
a.
Return ?
target
.[[SetPrototypeOf]]
).
7.
Let
booleanTrapResult
be
ToBoolean
(?
Call
trap
handler
, «
target
»)).
8.
If
booleanTrapResult
is
false
, return
false
9.
Let
extensibleTarget
be ?
IsExtensible
target
).
10.
If
extensibleTarget
is
true
, return
true
11.
Let
targetProto
be ?
target
.[[GetPrototypeOf]]
().
12.
If
SameValue
targetProto
) is
false
, throw a
TypeError
exception.
13.
Return
true
Note
[[SetPrototypeOf]] for Proxy objects enforces the following invariants:
The result of [[SetPrototypeOf]]
is a Boolean
value.
If the target object is not extensible, the argument value
must be the same as the result of [[GetPrototypeOf]] applied to target
object.
10.5.3
[[IsExtensible]] ( )
The [[IsExtensible]] internal method of a
Proxy exotic object
takes no arguments and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"isExtensible"
).
6.
If
trap
is
undefined
, then
a.
Return ?
IsExtensible
target
).
7.
Let
booleanTrapResult
be
ToBoolean
(?
Call
trap
handler
, «
target
»)).
8.
Let
targetResult
be ?
IsExtensible
target
).
9.
If
SameValue
booleanTrapResult
targetResult
) is
false
, throw a
TypeError
exception.
10.
Return
booleanTrapResult
Note
[[IsExtensible]] for Proxy objects enforces the following invariants:
The result of [[IsExtensible]]
is a Boolean
value.
[[IsExtensible]] applied to the Proxy object must return the
same value as [[IsExtensible]] applied to the Proxy object's target
object with the same argument.
10.5.4
[[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of a
Proxy exotic object
takes no arguments and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"preventExtensions"
).
6.
If
trap
is
undefined
, then
a.
Return ?
target
.[[PreventExtensions]]()
7.
Let
booleanTrapResult
be
ToBoolean
(?
Call
trap
handler
, «
target
»)).
8.
If
booleanTrapResult
is
true
, then
a.
Let
extensibleTarget
be ?
IsExtensible
target
).
b.
If
extensibleTarget
is
true
, throw a
TypeError
exception.
9.
Return
booleanTrapResult
Note
[[PreventExtensions]] for Proxy objects enforces the following invariants:
The result of [[PreventExtensions]]
is a Boolean
value.
[[PreventExtensions]] applied to the Proxy object only returns
true
if [[IsExtensible]] applied to the Proxy object's target object is
false
10.5.5
[[GetOwnProperty]] (
The [[GetOwnProperty]] internal method of a
Proxy exotic object
takes argument
(a
property key
) and returns either a
normal completion containing
either a
Property Descriptor
or
undefined
, or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"getOwnPropertyDescriptor"
).
6.
If
trap
is
undefined
, then
a.
Return ?
target
.[[GetOwnProperty]]
).
7.
Let
trapResultObj
be ?
Call
trap
handler
, «
target
»).
8.
If
trapResultObj
is not an Object
and
trapResultObj
is not
undefined
, throw a
TypeError
exception.
9.
Let
targetDesc
be ?
target
.[[GetOwnProperty]]
).
10.
If
trapResultObj
is
undefined
, then
a.
If
targetDesc
is
undefined
, return
undefined
b.
If
targetDesc
.[[Configurable]] is
false
, throw a
TypeError
exception.
c.
Let
extensibleTarget
be ?
IsExtensible
target
).
d.
If
extensibleTarget
is
false
, throw a
TypeError
exception.
e.
Return
undefined
11.
Let
extensibleTarget
be ?
IsExtensible
target
).
12.
Let
resultDesc
be ?
ToPropertyDescriptor
trapResultObj
).
13.
Perform
CompletePropertyDescriptor
resultDesc
).
14.
Let
valid
be
IsCompatiblePropertyDescriptor
extensibleTarget
resultDesc
targetDesc
).
15.
If
valid
is
false
, throw a
TypeError
exception.
16.
If
resultDesc
.[[Configurable]] is
false
, then
a.
If
targetDesc
is
undefined
or
targetDesc
.[[Configurable]] is
true
, then
i.
Throw a
TypeError
exception.
b.
If
resultDesc
has a [[Writable]] field and
resultDesc
.[[Writable]] is
false
, then
i.
Assert
targetDesc
has a [[Writable]] field.
ii.
If
targetDesc
.[[Writable]] is
true
, throw a
TypeError
exception.
17.
Return
resultDesc
Note
[[GetOwnProperty]] for Proxy objects enforces the following invariants:
The result of [[GetOwnProperty]] must be either an Object or
undefined
A property cannot be reported as non-existent, if it exists as a non-configurable own property of the target object.
A property cannot be reported as non-existent, if it exists as an own property of a non-extensible target object.
A property cannot be reported as existent, if it does not
exist as an own property of the target object and the target object is
not extensible.
A property cannot be reported as non-configurable, unless it
exists as a non-configurable own property of the target object.
A property cannot be reported as both non-configurable and
non-writable, unless it exists as a non-configurable, non-writable own
property of the target object.
10.5.6
[[DefineOwnProperty]] (
Desc
The [[DefineOwnProperty]] internal method of a
Proxy exotic object
takes arguments
(a
property key
) and
Desc
(a
Property Descriptor
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"defineProperty"
).
6.
If
trap
is
undefined
, then
a.
Return ?
target
.[[DefineOwnProperty]]
Desc
).
7.
Let
descObj
be
FromPropertyDescriptor
Desc
).
8.
Let
booleanTrapResult
be
ToBoolean
(?
Call
trap
handler
, «
target
descObj
»)).
9.
If
booleanTrapResult
is
false
, return
false
10.
Let
targetDesc
be ?
target
.[[GetOwnProperty]]
).
11.
Let
extensibleTarget
be ?
IsExtensible
target
).
12.
If
Desc
has a [[Configurable]] field and
Desc
.[[Configurable]] is
false
, then
a.
Let
settingConfigFalse
be
true
13.
Else, let
settingConfigFalse
be
false
14.
If
targetDesc
is
undefined
, then
a.
If
extensibleTarget
is
false
, throw a
TypeError
exception.
b.
If
settingConfigFalse
is
true
, throw a
TypeError
exception.
15.
Else,
a.
If
IsCompatiblePropertyDescriptor
extensibleTarget
Desc
targetDesc
) is
false
, throw a
TypeError
exception.
b.
If
settingConfigFalse
is
true
and
targetDesc
.[[Configurable]] is
true
, throw a
TypeError
exception.
c.
If
IsDataDescriptor
targetDesc
) is
true
targetDesc
.[[Configurable]] is
false
, and
targetDesc
.[[Writable]] is
true
, then
i.
If
Desc
has a [[Writable]] field and
Desc
.[[Writable]] is
false
, throw a
TypeError
exception.
16.
Return
true
Note
[[DefineOwnProperty]] for Proxy objects enforces the following invariants:
The result of [[DefineOwnProperty]]
is a Boolean
value.
A property cannot be added, if the target object is not extensible.
A property cannot be non-configurable, unless there exists a
corresponding non-configurable own property of the target object.
A non-configurable property cannot be non-writable, unless
there exists a corresponding non-configurable, non-writable own property
of the target object.
If a property has a corresponding target object property then applying the
Property Descriptor
of the property to the target object using [[DefineOwnProperty]] will not throw an exception.
10.5.7
[[HasProperty]] (
The [[HasProperty]] internal method of a
Proxy exotic object
takes argument
(a
property key
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"has"
).
6.
If
trap
is
undefined
, then
a.
Return ?
target
.[[HasProperty]]
).
7.
Let
booleanTrapResult
be
ToBoolean
(?
Call
trap
handler
, «
target
»)).
8.
If
booleanTrapResult
is
false
, then
a.
Let
targetDesc
be ?
target
.[[GetOwnProperty]]
).
b.
If
targetDesc
is not
undefined
, then
i.
If
targetDesc
.[[Configurable]] is
false
, throw a
TypeError
exception.
ii.
Let
extensibleTarget
be ?
IsExtensible
target
).
iii.
If
extensibleTarget
is
false
, throw a
TypeError
exception.
9.
Return
booleanTrapResult
Note
[[HasProperty]] for Proxy objects enforces the following invariants:
The result of [[HasProperty]]
is a Boolean
value.
A property cannot be reported as non-existent, if it exists as a non-configurable own property of the target object.
A property cannot be reported as non-existent, if it exists
as an own property of the target object and the target object is not
extensible.
10.5.8
[[Get]] (
Receiver
The [[Get]] internal method of a
Proxy exotic object
takes arguments
(a
property key
) and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"get"
).
6.
If
trap
is
undefined
, then
a.
Return ?
target
.[[Get]]
Receiver
).
7.
Let
trapResult
be ?
Call
trap
handler
, «
target
Receiver
»).
8.
Let
targetDesc
be ?
target
.[[GetOwnProperty]]
).
9.
If
targetDesc
is not
undefined
and
targetDesc
.[[Configurable]] is
false
, then
a.
If
IsDataDescriptor
targetDesc
) is
true
and
targetDesc
.[[Writable]] is
false
, then
i.
If
SameValue
trapResult
targetDesc
.[[Value]]) is
false
, throw a
TypeError
exception.
b.
If
IsAccessorDescriptor
targetDesc
) is
true
and
targetDesc
.[[Get]] is
undefined
, then
i.
If
trapResult
is not
undefined
, throw a
TypeError
exception.
10.
Return
trapResult
Note
[[Get]] for Proxy objects enforces the following invariants:
The value reported for a property must be the same as the
value of the corresponding target object property if the target object
property is a non-writable, non-configurable own
data property
The value reported for a property must be
undefined
if the corresponding target object property is a non-configurable own
accessor property
that has
undefined
as its [[Get]] attribute.
10.5.9
[[Set]] (
Receiver
The [[Set]] internal method of a
Proxy exotic object
takes arguments
(a
property key
),
(an
ECMAScript language value
), and
Receiver
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"set"
).
6.
If
trap
is
undefined
, then
a.
Return ?
target
.[[Set]]
Receiver
).
7.
Let
booleanTrapResult
be
ToBoolean
(?
Call
trap
handler
, «
target
Receiver
»)).
8.
If
booleanTrapResult
is
false
, return
false
9.
Let
targetDesc
be ?
target
.[[GetOwnProperty]]
).
10.
If
targetDesc
is not
undefined
and
targetDesc
.[[Configurable]] is
false
, then
a.
If
IsDataDescriptor
targetDesc
) is
true
and
targetDesc
.[[Writable]] is
false
, then
i.
If
SameValue
targetDesc
.[[Value]]) is
false
, throw a
TypeError
exception.
b.
If
IsAccessorDescriptor
targetDesc
) is
true
, then
i.
If
targetDesc
.[[Set]] is
undefined
, throw a
TypeError
exception.
11.
Return
true
Note
[[Set]] for Proxy objects enforces the following invariants:
The result of [[Set]]
is a Boolean
value.
Cannot change the value of a property to be different from
the value of the corresponding target object property if the
corresponding target object property is a non-writable, non-configurable
own
data property
Cannot set the value of a property if the corresponding target object property is a non-configurable own
accessor property
that has
undefined
as its [[Set]] attribute.
10.5.10
[[Delete]] (
The [[Delete]] internal method of a
Proxy exotic object
takes argument
(a
property key
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"deleteProperty"
).
6.
If
trap
is
undefined
, then
a.
Return ?
target
.[[Delete]]
).
7.
Let
booleanTrapResult
be
ToBoolean
(?
Call
trap
handler
, «
target
»)).
8.
If
booleanTrapResult
is
false
, return
false
9.
Let
targetDesc
be ?
target
.[[GetOwnProperty]]
).
10.
If
targetDesc
is
undefined
, return
true
11.
If
targetDesc
.[[Configurable]] is
false
, throw a
TypeError
exception.
12.
Let
extensibleTarget
be ?
IsExtensible
target
).
13.
If
extensibleTarget
is
false
, throw a
TypeError
exception.
14.
Return
true
Note
[[Delete]] for Proxy objects enforces the following invariants:
The result of [[Delete]]
is a Boolean
value.
A property cannot be reported as deleted, if it exists as a non-configurable own property of the target object.
A property cannot be reported as deleted, if it exists as an
own property of the target object and the target object is
non-extensible.
10.5.11
[[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of a
Proxy exotic object
takes no arguments and returns either a
normal completion containing
List
of
property keys
or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"ownKeys"
).
6.
If
trap
is
undefined
, then
a.
Return ?
target
.[[OwnPropertyKeys]]()
7.
Let
trapResultArray
be ?
Call
trap
handler
, «
target
»).
8.
Let
trapResult
be ?
CreateListFromArrayLike
trapResultArray
, « String, Symbol »).
9.
If
trapResult
contains any duplicate entries, throw a
TypeError
exception.
10.
Let
extensibleTarget
be ?
IsExtensible
target
).
11.
Let
targetKeys
be ?
target
.[[OwnPropertyKeys]]()
12.
Assert
targetKeys
is a
List
of
property keys
13.
Assert
targetKeys
contains no duplicate entries.
14.
Let
targetConfigurableKeys
be a new empty
List
15.
Let
targetNonconfigurableKeys
be a new empty
List
16.
For each element
key
of
targetKeys
, do
a.
Let
desc
be ?
target
.[[GetOwnProperty]]
key
).
b.
If
desc
is not
undefined
and
desc
.[[Configurable]] is
false
, then
i.
Append
key
to
targetNonconfigurableKeys
c.
Else,
i.
Append
key
to
targetConfigurableKeys
17.
If
extensibleTarget
is
true
and
targetNonconfigurableKeys
is empty, then
a.
Return
trapResult
18.
Let
uncheckedResultKeys
be a
List
whose elements are the elements of
trapResult
19.
For each element
key
of
targetNonconfigurableKeys
, do
a.
If
uncheckedResultKeys
does not contain
key
, throw a
TypeError
exception.
b.
Remove
key
from
uncheckedResultKeys
20.
If
extensibleTarget
is
true
, return
trapResult
21.
For each element
key
of
targetConfigurableKeys
, do
a.
If
uncheckedResultKeys
does not contain
key
, throw a
TypeError
exception.
b.
Remove
key
from
uncheckedResultKeys
22.
If
uncheckedResultKeys
is not empty, throw a
TypeError
exception.
23.
Return
trapResult
Note
[[OwnPropertyKeys]] for Proxy objects enforces the following invariants:
The result of [[OwnPropertyKeys]] is a
List
The returned
List
contains no duplicate entries.
The Type of each result
List
element is either String or Symbol.
The result
List
must contain the keys of all non-configurable own properties of the target object.
If the target object is not extensible, then the result
List
must contain all the keys of the own properties of the target object and no other values.
10.5.12
[[Call]] (
thisArgument
argumentsList
The [[Call]] internal method of a
Proxy exotic object
takes arguments
thisArgument
(an
ECMAScript language value
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Let
handler
be
.[[ProxyHandler]].
4.
Assert
handler
is an Object
5.
Let
trap
be ?
GetMethod
handler
"apply"
).
6.
If
trap
is
undefined
, then
a.
Return ?
Call
target
thisArgument
argumentsList
).
7.
Let
argArray
be
CreateArrayFromList
argumentsList
).
8.
Return ?
Call
trap
handler
, «
target
thisArgument
argArray
»).
Note
Proxy exotic object
only has a [[Call]] internal method if the initial value of its
[[ProxyTarget]] internal slot is an object that has a [[Call]] internal
method.
10.5.13
[[Construct]] (
argumentsList
newTarget
The [[Construct]] internal method of a
Proxy exotic object
takes arguments
argumentsList
(a
List
of
ECMAScript language values
) and
newTarget
(a
constructor
) and returns either a
normal completion containing
an Object or a
throw completion
. It performs the following steps when called:
1.
Perform ?
ValidateNonRevokedProxy
).
2.
Let
target
be
.[[ProxyTarget]].
3.
Assert
IsConstructor
target
) is
true
4.
Let
handler
be
.[[ProxyHandler]].
5.
Assert
handler
is an Object
6.
Let
trap
be ?
GetMethod
handler
"construct"
).
7.
If
trap
is
undefined
, then
a.
Return ?
Construct
target
argumentsList
newTarget
).
8.
Let
argArray
be
CreateArrayFromList
argumentsList
).
9.
Let
newObj
be ?
Call
trap
handler
, «
target
argArray
newTarget
»).
10.
If
newObj
is not an Object
, throw a
TypeError
exception.
11.
Return
newObj
Note 1
Proxy exotic object
only has a [[Construct]] internal method if the initial value of its
[[ProxyTarget]] internal slot is an object that has a [[Construct]]
internal method.
Note 2
[[Construct]] for Proxy objects enforces the following invariants:
The result of [[Construct]] must be an Object.
10.5.14
ValidateNonRevokedProxy (
proxy
The abstract operation ValidateNonRevokedProxy takes argument
proxy
(a
Proxy exotic object
) and returns either a
normal completion containing
unused
or a
throw completion
. It throws a
TypeError
exception if
proxy
has been revoked. It performs the following steps when called:
1.
If
proxy
.[[ProxyTarget]] is
null
, throw a
TypeError
exception.
2.
Assert
proxy
.[[ProxyHandler]] is not
null
3.
Return
unused
10.5.15
ProxyCreate (
target
handler
The abstract operation ProxyCreate takes arguments
target
(an
ECMAScript language value
) and
handler
(an
ECMAScript language value
) and returns either a
normal completion containing
Proxy exotic object
or a
throw completion
. It is used to specify the creation of new Proxy objects. It performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
If
handler
is not an Object
, throw a
TypeError
exception.
3.
Let
be
MakeBasicObject
(« [[ProxyHandler]], [[ProxyTarget]] »).
4.
Set
's essential internal methods, except for [[Call]] and [[Construct]], to the definitions specified in
10.5
5.
If
IsCallable
target
) is
true
, then
a.
Set
.[[Call]] as specified in
10.5.12
b.
If
IsConstructor
target
) is
true
, then
i.
Set
.[[Construct]] as specified in
10.5.13
6.
Set
.[[ProxyTarget]] to
target
7.
Set
.[[ProxyHandler]] to
handler
8.
Return
11
ECMAScript Language: Source Text
11.1
Source Text
Syntax
SourceCharacter
::
any Unicode code point
ECMAScript source text
is a sequence of Unicode code
points. All Unicode code point values from U+0000 to U+10FFFF, including
surrogate code points, may occur in ECMAScript source text where
permitted by the ECMAScript grammars. The actual encodings used to store
and interchange ECMAScript source text is not relevant to this
specification. Regardless of the external source text encoding, a
conforming ECMAScript implementation processes the source text as if it
was an equivalent sequence of
SourceCharacter
values, each
SourceCharacter
being a Unicode code point. Conforming ECMAScript implementations are
not required to perform any normalization of source text, or behave as
though they were performing normalization of source text.
The components of a combining character sequence are treated as
individual Unicode code points even though a user might think of the
whole sequence as a single character.
Note
In string literals, regular expression literals, template
literals and identifiers, any Unicode code point may also be expressed
using Unicode escape sequences that explicitly express a code point's
numeric value. Within a comment, such an escape sequence is effectively
ignored as part of the comment.
ECMAScript differs from the Java programming language in the
behaviour of Unicode escape sequences. In a Java program, if the Unicode
escape sequence
\u000A
, for example, occurs within a
single-line comment, it is interpreted as a line terminator (Unicode
code point U+000A is LINE FEED (LF)) and therefore the next code point
is not part of the comment. Similarly, if the Unicode escape sequence
\u000A
occurs within a string literal in a Java program, it is likewise
interpreted as a line terminator, which is not allowed within a string
literal—one must write
\n
instead of
\u000A
to
cause a LINE FEED (LF) to be part of the String value of a string
literal. In an ECMAScript program, a Unicode escape sequence occurring
within a comment is never interpreted and therefore cannot contribute to
termination of the comment. Similarly, a Unicode escape sequence
occurring within a string literal in an ECMAScript program always
contributes to the literal and is never interpreted as a line terminator
or as a code point that might terminate the string literal.
11.1.1
Static Semantics: UTF16EncodeCodePoint (
cp
The abstract operation UTF16EncodeCodePoint takes argument
cp
(a Unicode code point) and returns a String. It performs the following steps when called:
1.
Assert
: 0 ≤
cp
≤ 0x10FFFF.
2.
If
cp
≤ 0xFFFF, return the String value consisting of the code unit whose numeric value is
cp
3.
Let
cu1
be the code unit whose numeric value is
floor
((
cp
- 0x10000) / 0x400) + 0xD800.
4.
Let
cu2
be the code unit whose numeric value is ((
cp
- 0x10000)
modulo
0x400) + 0xDC00.
5.
Return the
string-concatenation
of
cu1
and
cu2
11.1.2
Static Semantics: CodePointsToString (
text
The abstract operation CodePointsToString takes argument
text
(a sequence of Unicode code points) and returns a String. It converts
text
into a String value, as described in
6.1.4
. It performs the following steps when called:
1.
Let
result
be the empty String.
2.
For each code point
cp
of
text
, do
a.
Set
result
to the
string-concatenation
of
result
and
UTF16EncodeCodePoint
cp
).
3.
Return
result
11.1.3
Static Semantics: UTF16SurrogatePairToCodePoint (
lead
trail
The abstract operation UTF16SurrogatePairToCodePoint takes arguments
lead
(a code unit) and
trail
(a code unit) and returns a code point. Two code units that form a UTF-16
surrogate pair
are converted to a code point. It performs the following steps when called:
1.
Assert
lead
is a
leading surrogate
and
trail
is a
trailing surrogate
2.
Let
cp
be (
lead
- 0xD800) × 0x400 + (
trail
- 0xDC00) + 0x10000.
3.
Return the code point
cp
11.1.4
Static Semantics: CodePointAt (
string
position
The abstract operation CodePointAt takes arguments
string
(a String) and
position
(a non-negative
integer
) and returns a
Record
with fields [[CodePoint]] (a code point), [[CodeUnitCount]] (a positive
integer
), and [[IsUnpairedSurrogate]] (a Boolean). It interprets
string
as a sequence of UTF-16 encoded code points, as described in
6.1.4
, and reads from it a single code point starting with the code unit at index
position
. It performs the following steps when called:
1.
Let
size
be the length of
string
2.
Assert
position
≥ 0 and
position
size
3.
Let
first
be the code unit at index
position
within
string
4.
Let
cp
be the code point whose numeric value is the numeric value of
first
5.
If
first
is neither a
leading surrogate
nor a
trailing surrogate
, then
a.
Return the
Record
{ [[CodePoint]]:
cp
, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]:
false
}.
6.
If
first
is a
trailing surrogate
or
position
+ 1 =
size
, then
a.
Return the
Record
{ [[CodePoint]]:
cp
, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]:
true
}.
7.
Let
second
be the code unit at index
position
+ 1 within
string
8.
If
second
is not a
trailing surrogate
, then
a.
Return the
Record
{ [[CodePoint]]:
cp
, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]:
true
}.
9.
Set
cp
to
UTF16SurrogatePairToCodePoint
first
second
).
10.
Return the
Record
{ [[CodePoint]]:
cp
, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]:
false
}.
11.1.5
Static Semantics: StringToCodePoints (
string
The abstract operation StringToCodePoints takes argument
string
(a String) and returns a
List
of code points. It returns the sequence of Unicode code points that results from interpreting
string
as UTF-16 encoded Unicode text as described in
6.1.4
. It performs the following steps when called:
1.
Let
codePoints
be a new empty
List
2.
Let
size
be the length of
string
3.
Let
position
be 0.
4.
Repeat, while
position
size
a.
Let
cp
be
CodePointAt
string
position
).
b.
Append
cp
.[[CodePoint]] to
codePoints
c.
Set
position
to
position
cp
.[[CodeUnitCount]].
5.
Return
codePoints
11.1.6
Static Semantics: ParseText (
sourceText
goalSymbol
The abstract operation ParseText takes arguments
sourceText
(a sequence of Unicode code points) and
goalSymbol
(a nonterminal in one of the ECMAScript grammars) and returns a
Parse Node
or a non-empty
List
of
SyntaxError
objects. It performs the following steps when called:
1.
Attempt to parse
sourceText
using
goalSymbol
as the
goal symbol
, and analyse the parse result for any
early error
conditions. Parsing and
early error
detection may be interleaved in an
implementation-defined
manner.
2.
If the parse succeeded and no
early errors
were found, return the
Parse Node
(an instance of
goalSymbol
) at the root of the parse tree resulting from the parse.
3.
Otherwise, return a
List
of one or more
SyntaxError
objects representing the parsing errors and/or
early errors
. If more than one parsing error or
early error
is present, the number and ordering of error objects in the list is
implementation-defined
, but at least one must be present.
Note 1
Consider a text that has an
early error
at a particular point, and also a syntax error at a later point. An implementation that does a parse pass followed by an
early errors
pass might report the syntax error and not proceed to the
early errors
pass. An implementation that interleaves the two activities might report the
early error
and not proceed to find the syntax error. A third implementation might
report both errors. All of these behaviours are conformant.
Note 2
See also clause
17
11.2
Types of Source Code
There are four types of ECMAScript code:
Global code
is source text that is treated as an ECMAScript
Script
. The global code of a particular
Script
does not include any source text that is parsed as part of a
FunctionDeclaration
FunctionExpression
GeneratorDeclaration
GeneratorExpression
AsyncFunctionDeclaration
AsyncFunctionExpression
AsyncGeneratorDeclaration
AsyncGeneratorExpression
MethodDefinition
ArrowFunction
AsyncArrowFunction
ClassDeclaration
, or
ClassExpression
Eval code
is the source text supplied to the built-in
eval
function. More precisely, if the parameter to the built-in
eval
function
is a String
, it is treated as an ECMAScript
Script
. The eval code for a particular invocation of
eval
is the global code portion of that
Script
Function code
is source text that is parsed to supply the value of the [[ECMAScriptCode]] and [[FormalParameters]] internal slots (see
10.2
) of an ECMAScript
function object
The function code of a particular ECMAScript function does not include
any source text that is parsed as the function code of a nested
FunctionDeclaration
FunctionExpression
GeneratorDeclaration
GeneratorExpression
AsyncFunctionDeclaration
AsyncFunctionExpression
AsyncGeneratorDeclaration
AsyncGeneratorExpression
MethodDefinition
ArrowFunction
AsyncArrowFunction
ClassDeclaration
, or
ClassExpression
In addition, if the source text referred to above is parsed as:
the
FormalParameters
and
FunctionBody
of a
FunctionDeclaration
or
FunctionExpression
the
FormalParameters
and
GeneratorBody
of a
GeneratorDeclaration
or
GeneratorExpression
the
FormalParameters
and
AsyncFunctionBody
of an
AsyncFunctionDeclaration
or
AsyncFunctionExpression
, or
the
FormalParameters
and
AsyncGeneratorBody
of an
AsyncGeneratorDeclaration
or
AsyncGeneratorExpression
then the
source text matched by
the
BindingIdentifier
(if any) of that declaration or expression is also included in the function code of the corresponding function.
Module code
is source text that is code that is provided as a
ModuleBody
It is the code that is directly evaluated when a module is initialized.
The module code of a particular module does not include any source text
that is parsed as part of a nested
FunctionDeclaration
FunctionExpression
GeneratorDeclaration
GeneratorExpression
AsyncFunctionDeclaration
AsyncFunctionExpression
AsyncGeneratorDeclaration
AsyncGeneratorExpression
MethodDefinition
ArrowFunction
AsyncArrowFunction
ClassDeclaration
, or
ClassExpression
Note 1
Function code is generally provided as the bodies of Function Definitions (
15.2
), Arrow Function Definitions (
15.3
), Method Definitions (
15.4
), Generator Function Definitions (
15.5
), Async Function Definitions (
15.8
), Async Generator Function Definitions (
15.6
), and Async Arrow Functions (
15.9
). Function code is also derived from the arguments to the Function
constructor
20.2.1.1
), the GeneratorFunction
constructor
27.3.1.1
), and the AsyncFunction
constructor
27.7.1.1
).
Note 2
The practical effect of including the
BindingIdentifier
in function code is that the Early Errors for
strict mode code
are applied to a
BindingIdentifier
that is the name of a function whose body contains a "use strict" directive, even if the surrounding code is not
strict mode code
11.2.1
Directive Prologues and the Use Strict Directive
Directive Prologue
is the longest sequence of
ExpressionStatement
s occurring as the initial
StatementListItem
s or
ModuleItem
s of a
FunctionBody
, a
ScriptBody
, or a
ModuleBody
and where each
ExpressionStatement
in the sequence consists entirely of a
StringLiteral
token followed by a semicolon. The semicolon may appear explicitly or may be inserted by automatic semicolon insertion (
12.10
). A
Directive Prologue
may be an empty sequence.
Use Strict Directive
is an
ExpressionStatement
in a
Directive Prologue
whose
StringLiteral
is either of the exact code point sequences
"use strict"
or
'use strict'
. A
Use Strict Directive
may not contain an
EscapeSequence
or
LineContinuation
Directive Prologue
may contain more than one
Use Strict Directive
. However, an implementation may issue a warning if this occurs.
Note
The
ExpressionStatement
s of a
Directive Prologue
are evaluated normally during evaluation of the containing production.
Implementations may define implementation specific meanings for
ExpressionStatement
s which are not a
Use Strict Directive
and which occur in a
Directive Prologue
. If an appropriate notification mechanism exists, an implementation should issue a warning if it encounters in a
Directive Prologue
an
ExpressionStatement
that is not a
Use Strict Directive
and which does not have a meaning defined by the implementation.
11.2.2
Strict Mode Code
An ECMAScript syntactic unit may be processed using either unrestricted or strict mode syntax and semantics (
4.3.2
). Code is interpreted as
strict mode code
in the following situations:
Global code
is strict mode code if it begins with a
Directive Prologue
that contains a
Use Strict Directive
Module code
is always strict mode code.
All parts of a
ClassDeclaration
or a
ClassExpression
are strict mode code.
Eval code
is strict mode code if it begins with a
Directive Prologue
that contains a
Use Strict Directive
or if the call to
eval
is a
direct eval
that is contained in strict mode code.
Function code
is strict mode code if the associated
FunctionDeclaration
FunctionExpression
GeneratorDeclaration
GeneratorExpression
AsyncFunctionDeclaration
AsyncFunctionExpression
AsyncGeneratorDeclaration
AsyncGeneratorExpression
MethodDefinition
ArrowFunction
, or
AsyncArrowFunction
is contained in strict mode code or if the code that produces the value
of the function's [[ECMAScriptCode]] internal slot begins with a
Directive Prologue
that contains a
Use Strict Directive
Function code
that is supplied as the arguments to the built-in Function, Generator, AsyncFunction, and AsyncGenerator
constructors
is strict mode code if the last argument
is a String
that when processed is a
FunctionBody
that begins with a
Directive Prologue
that contains a
Use Strict Directive
ECMAScript code that is not strict mode code is called
non-strict code
11.2.3
Non-ECMAScript Functions
An ECMAScript implementation may support the evaluation of function
exotic objects
whose evaluative behaviour is expressed in some
host-defined
form of executable code other than
ECMAScript source text
. Whether a
function object
is defined within ECMAScript code or is a built-in function is not
observable from the perspective of ECMAScript code that calls or is
called by such a
function object
12
ECMAScript Language: Lexical Grammar
The source text of an ECMAScript
Script
or
Module
is first converted into a sequence of input elements, which are tokens,
line terminators, comments, or white space. The source text is scanned
from left to right, repeatedly taking the longest possible sequence of
code points as the next input element.
There are several situations where the identification of lexical
input elements is sensitive to the syntactic grammar context that is
consuming the input elements. This requires multiple
goal symbols
for the lexical grammar. The
InputElementHashbangOrRegExp
goal is used at the start of a
Script
or
Module
. The
InputElementRegExpOrTemplateTail
goal is used in syntactic grammar contexts where a
RegularExpressionLiteral
, a
TemplateMiddle
, or a
TemplateTail
is permitted. The
InputElementRegExp
goal symbol
is used in all syntactic grammar contexts where a
RegularExpressionLiteral
is permitted but neither a
TemplateMiddle
, nor a
TemplateTail
is permitted. The
InputElementTemplateTail
goal is used in all syntactic grammar contexts where a
TemplateMiddle
or a
TemplateTail
is permitted but a
RegularExpressionLiteral
is not permitted. In all other contexts,
InputElementDiv
is used as the lexical
goal symbol
Note
The use of multiple lexical goals ensures that there are no
lexical ambiguities that would affect automatic semicolon insertion. For
example, there are no syntactic grammar contexts where both a leading
division or division-assignment, and a leading
RegularExpressionLiteral
are permitted. This is not affected by semicolon insertion (see
12.10
); in examples such as the following:
a = b
/hi/g.
exec
(c).
map
(d);
where the first non-whitespace, non-comment code point after a
LineTerminator
is U+002F (SOLIDUS) and the syntactic context allows division or division-assignment, no semicolon is inserted at the
LineTerminator
. That is, the above example is interpreted in the same way as:
a = b / hi / g.
exec
(c).
map
(d);
Syntax
InputElementDiv
::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
RightBracePunctuator
InputElementRegExp
::
WhiteSpace
LineTerminator
Comment
CommonToken
RightBracePunctuator
RegularExpressionLiteral
InputElementRegExpOrTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
InputElementTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
InputElementHashbangOrRegExp
::
WhiteSpace
LineTerminator
Comment
CommonToken
HashbangComment
RegularExpressionLiteral
12.1
Unicode Format-Control Characters
The Unicode format-control characters (i.e., the characters in
category “Cf” in the Unicode Character Database such as LEFT-TO-RIGHT
MARK or RIGHT-TO-LEFT MARK) are control codes used to control the
formatting of a range of text in the absence of higher-level protocols
for this (such as mark-up languages).
It is useful to allow format-control characters in source text to
facilitate editing and display. All format control characters may be
used within comments, and within string literals, template literals, and
regular expression literals.
U+200C (ZERO WIDTH NON-JOINER) and U+200D (ZERO WIDTH JOINER) are
format-control characters that are used to make necessary distinctions
when forming words or phrases in certain languages. In
ECMAScript source text
these code points may also be used in an
IdentifierName
after the first character.
U+FEFF (ZERO WIDTH NO-BREAK SPACE) is a format-control character
used primarily at the start of a text to mark it as Unicode and to allow
detection of the text's encoding and byte order.
characters intended for this purpose can sometimes also appear after the
start of a text, for example as a result of concatenating files. In
ECMAScript source text
code points are treated as white space characters (see
12.2
).
The special treatment of certain format-control characters
outside of comments, string literals, and regular expression literals is
summarized in
Table 34
Table 34: Format-Control Code Point Usage
Code Point
Name
Abbreviation
Usage
U+200C
ZERO WIDTH NON-JOINER

IdentifierPart
U+200D
ZERO WIDTH JOINER

IdentifierPart
U+FEFF
ZERO WIDTH NO-BREAK SPACE

WhiteSpace
12.2
White Space
White space code points are used to improve source text
readability and to separate tokens (indivisible lexical units) from each
other, but are otherwise insignificant. White space code points may
occur between any two tokens and at the start or end of input. White
space code points may occur within a
StringLiteral
, a
RegularExpressionLiteral
, a
Template
, or a
TemplateSubstitutionTail
where they are considered significant code points forming part of a literal value. They may also occur within a
Comment
, but cannot appear within any other kind of token.
The ECMAScript white space code points are listed in
Table 35
Table 35: White Space Code Points
Code Points
Name
Abbreviation
U+0009
CHARACTER TABULATION

U+000B
LINE TABULATION

U+000C
FORM FEED (FF)

U+FEFF
ZERO WIDTH NO-BREAK SPACE

any code point in general category “Space_Separator”

Note 1
U+0020 (SPACE) and U+00A0 (NO-BREAK SPACE) code points are part of .
Note 2
Other than for the code points listed in
Table 35
, ECMAScript
WhiteSpace
intentionally excludes all code points that have the Unicode
“White_Space” property but which are not classified in general category
“Space_Separator” (“Zs”).
Syntax
WhiteSpace
::





12.3
Line Terminators
Like white space code points, line terminator code points are
used to improve source text readability and to separate tokens
(indivisible lexical units) from each other. However, unlike white space
code points, line terminators have some influence over the behaviour of
the syntactic grammar. In general, line terminators may occur between
any two tokens, but there are a few places where they are forbidden by
the syntactic grammar. Line terminators also affect the process of
automatic semicolon insertion (
12.10
). A line terminator cannot occur within any token except a
StringLiteral
Template
, or
TemplateSubstitutionTail
. and line terminators cannot occur within a
StringLiteral
token except as part of a
LineContinuation
A line terminator can occur within a
MultiLineComment
but cannot occur within a
SingleLineComment
Line terminators are included in the set of white space code points that are matched by the
\s
class in regular expressions.
The ECMAScript line terminator code points are listed in
Table 36
Table 36: Line Terminator Code Points
Code Point
Unicode Name
Abbreviation
U+000A
LINE FEED (LF)

U+000D
CARRIAGE RETURN (CR)

U+2028
LINE SEPARATOR

U+2029
PARAGRAPH SEPARATOR

Only the Unicode code points in
Table 36
are treated as line terminators. Other new line or line breaking
Unicode code points are not treated as line terminators but are treated
as white space if they meet the requirements listed in
Table 35
. The sequence is commonly used as a line terminator. It should be considered a single
SourceCharacter
for the purpose of reporting line numbers.
Syntax
LineTerminator
::




LineTerminatorSequence
::


[lookahead ≠





12.4
Comments
Comments can be either single or multi-line. Multi-line comments cannot nest.
Because a single-line comment can contain any Unicode code point except a
LineTerminator
code point, and because of the general rule that a token is always as
long as possible, a single-line comment always consists of all code
points from the
//
marker to the end of the line. However, the
LineTerminator
at the end of the line is not considered to be part of the single-line
comment; it is recognized separately by the lexical grammar and becomes
part of the stream of input elements for the syntactic grammar. This
point is very important, because it implies that the presence or absence
of single-line comments does not affect the process of automatic
semicolon insertion (see
12.10
).
Comments behave like white space and are discarded except that, if a
MultiLineComment
contains a line terminator code point, then the entire comment is considered to be a
LineTerminator
for purposes of parsing by the syntactic grammar.
Syntax
Comment
::
MultiLineComment
SingleLineComment
MultiLineComment
::
/*
MultiLineCommentChars
opt
*/
MultiLineCommentChars
::
MultiLineNotAsteriskChar
MultiLineCommentChars
opt
PostAsteriskCommentChars
opt
PostAsteriskCommentChars
::
MultiLineNotForwardSlashOrAsteriskChar
MultiLineCommentChars
opt
PostAsteriskCommentChars
opt
MultiLineNotAsteriskChar
::
SourceCharacter
but not
MultiLineNotForwardSlashOrAsteriskChar
::
SourceCharacter
but not one of
or
SingleLineComment
::
//
SingleLineCommentChars
opt
SingleLineCommentChars
::
SingleLineCommentChar
SingleLineCommentChars
opt
SingleLineCommentChar
::
SourceCharacter
but not
LineTerminator
A number of productions in this section are given alternative definitions in section
B.1.1
12.5
Hashbang Comments
Hashbang Comments are location-sensitive and like other types of
comments are discarded from the stream of input elements for the
syntactic grammar.
Syntax
HashbangComment
::
#!
SingleLineCommentChars
opt
12.6
Tokens
Syntax
CommonToken
::
IdentifierName
PrivateIdentifier
Punctuator
NumericLiteral
StringLiteral
Template
Note
The
DivPunctuator
RegularExpressionLiteral
RightBracePunctuator
, and
TemplateSubstitutionTail
productions derive additional tokens that are not included in the
CommonToken
production.
12.7
Names and Keywords
IdentifierName
and
ReservedWord
are tokens that are interpreted according to the Default Identifier
Syntax given in Unicode Standard Annex #31, Identifier and Pattern
Syntax, with some small modifications.
ReservedWord
is an enumerated subset of
IdentifierName
. The syntactic grammar defines
Identifier
as an
IdentifierName
that is not a
ReservedWord
The Unicode identifier grammar is based on character properties
specified by the Unicode Standard. The Unicode code points in the
specified categories in the latest version of the Unicode Standard must
be treated as in those categories by all conforming ECMAScript
implementations. ECMAScript implementations may recognize identifier
code points defined in later editions of the Unicode Standard.
Note 1
This standard specifies specific code point additions: U+0024 (DOLLAR SIGN) and U+005F (LOW LINE) are permitted anywhere in an
IdentifierName
and the code points U+200C (ZERO WIDTH NON-JOINER) and U+200D (ZERO
WIDTH JOINER) are permitted anywhere after the first code point of an
IdentifierName
Syntax
PrivateIdentifier
::
IdentifierName
IdentifierName
::
IdentifierStart
IdentifierName
IdentifierPart
IdentifierStart
::
IdentifierStartChar
UnicodeEscapeSequence
IdentifierPart
::
IdentifierPartChar
UnicodeEscapeSequence
IdentifierStartChar
::
UnicodeIDStart
IdentifierPartChar
::
UnicodeIDContinue


AsciiLetter
::
one of
UnicodeIDStart
::
any Unicode code point with the Unicode property “ID_Start”
UnicodeIDContinue
::
any Unicode code point with the Unicode property “ID_Continue”
The definitions of the nonterminal
UnicodeEscapeSequence
is given in
12.9.4
Note 2
The nonterminal
IdentifierPart
derives
via
UnicodeIDContinue
Note 3
The sets of code points with Unicode properties “ID_Start” and
“ID_Continue” include, respectively, the code points with Unicode
properties “Other_ID_Start” and “Other_ID_Continue”.
12.7.1
Identifier Names
Unicode escape sequences are permitted in an
IdentifierName
, where they contribute a single Unicode code point equal to the
IdentifierCodePoint
of the
UnicodeEscapeSequence
. The
preceding the
UnicodeEscapeSequence
does not contribute any code points. A
UnicodeEscapeSequence
cannot be used to contribute a code point to an
IdentifierName
that would otherwise be invalid. In other words, if a
UnicodeEscapeSequence
sequence were replaced by the
SourceCharacter
it contributes, the result must still be a valid
IdentifierName
that has the exact same sequence of
SourceCharacter
elements as the original
IdentifierName
. All interpretations of
IdentifierName
within this specification are based upon their actual code points
regardless of whether or not an escape sequence was used to contribute
any particular code point.
Two
IdentifierName
s that are canonically equivalent according to the Unicode Standard are
not
equal unless, after replacement of each
UnicodeEscapeSequence
, they are represented by the exact same sequence of code points.
12.7.1.1
Static Semantics: Early Errors
IdentifierStart
::
UnicodeEscapeSequence
It is a Syntax Error if
IdentifierCodePoint
of
UnicodeEscapeSequence
is not some Unicode code point matched by the
IdentifierStartChar
lexical grammar production.
IdentifierPart
::
UnicodeEscapeSequence
It is a Syntax Error if
IdentifierCodePoint
of
UnicodeEscapeSequence
is not some Unicode code point matched by the
IdentifierPartChar
lexical grammar production.
12.7.1.2
Static Semantics: IdentifierCodePoints
The
syntax-directed operation
IdentifierCodePoints takes no arguments and returns a
List
of code points. It is defined piecewise over the following productions:
IdentifierName
::
IdentifierStart
1.
Let
cp
be
IdentifierCodePoint
of
IdentifierStart
2.
Return «
cp
».
IdentifierName
::
IdentifierName
IdentifierPart
1.
Let
cps
be
IdentifierCodePoints
of the derived
IdentifierName
2.
Let
cp
be
IdentifierCodePoint
of
IdentifierPart
3.
Return the
list-concatenation
of
cps
and «
cp
».
12.7.1.3
Static Semantics: IdentifierCodePoint
The
syntax-directed operation
IdentifierCodePoint takes no arguments and returns a code point. It is defined piecewise over the following productions:
IdentifierStart
::
IdentifierStartChar
1.
Return the code point matched by
IdentifierStartChar
IdentifierPart
::
IdentifierPartChar
1.
Return the code point matched by
IdentifierPartChar
UnicodeEscapeSequence
::
Hex4Digits
1.
Return the code point whose numeric value is the MV of
Hex4Digits
UnicodeEscapeSequence
::
u{
CodePoint
1.
Return the code point whose numeric value is the MV of
CodePoint
12.7.2
Keywords and Reserved Words
keyword
is a token that matches
IdentifierName
, but also has a syntactic use; that is, it appears literally, in a
fixed width
font, in some syntactic production. The keywords of ECMAScript include
if
while
async
await
, and many others.
reserved word
is an
IdentifierName
that cannot be used as an identifier. Many keywords are reserved words,
but some are not, and some are reserved only in certain contexts.
if
and
while
are reserved words.
await
is reserved only inside async functions and modules.
async
is not reserved; it can be used as a variable name or statement label without restriction.
This specification uses a combination of grammatical productions and
early error
rules to specify which names are valid identifiers and which are reserved words. All tokens in the
ReservedWord
list below, except for
await
and
yield
, are unconditionally reserved. Exceptions for
await
and
yield
are specified in
13.1
, using parameterized syntactic productions. Lastly, several
early error
rules restrict the set of valid identifiers. See
13.1.1
14.3.1.1
14.7.5.1
, and
15.7.1
. In summary, there are five categories of identifier names:
Those that are always allowed as identifiers, and are not keywords, such as
Math
window
toString
, and
Those that are never allowed as identifiers, namely the
ReservedWord
s listed below except
await
and
yield
Those that are contextually allowed as identifiers, namely
await
and
yield
Those that are contextually disallowed as identifiers, in
strict mode code
let
static
implements
interface
package
private
protected
, and
public
Those that are always allowed as identifiers, but also appear as keywords within certain syntactic productions, at places where
Identifier
is not allowed:
as
async
from
get
meta
of
set
, and
target
The term
conditional keyword
, or
contextual keyword
is sometimes used to refer to the keywords that fall in the last three
categories, and thus can be used as identifiers in some contexts and as
keywords in others.
Syntax
ReservedWord
::
one of
await
break
case
catch
class
const
continue
debugger
default
delete
do
else
enum
export
extends
false
finally
for
function
if
import
in
instanceof
new
null
return
super
switch
this
throw
true
try
typeof
var
void
while
with
yield
Note 1
Per
5.1.5
, keywords in the grammar match literal sequences of specific
SourceCharacter
elements. A code point in a keyword cannot be expressed by a
UnicodeEscapeSequence
An
IdentifierName
can contain
UnicodeEscapeSequence
s, but it is not possible to declare a variable named "else" by spelling it
els\u{65}
. The
early error
rules in
13.1.1
rule out identifiers with the same
StringValue
as a reserved word.
Note 2
enum
is not currently used as a keyword in this specification. It is a
future reserved word
, set aside for use as a keyword in future language extensions.
Similarly,
implements
interface
package
private
protected
, and
public
are future reserved words in
strict mode code
Note 3
The names
arguments
and
eval
are not keywords, but they are subject to some restrictions in
strict mode code
. See
13.1.1
8.6.4
15.2.1
15.5.1
15.6.1
, and
15.8.1
12.8
Punctuators
Syntax
Punctuator
::
OptionalChainingPunctuator
OtherPunctuator
OptionalChainingPunctuator
::
?.
[lookahead ∉
DecimalDigit
OtherPunctuator
::
one of
...
<=
>=
==
!=
===
!==
**
++
--
<<
>>
>>>
&&
||
??
+=
-=
*=
%=
**=
<<=
>>=
>>>=
&=
|=
^=
&&=
||=
??=
=>
DivPunctuator
::
/=
RightBracePunctuator
::
12.9
Literals
12.9.1
Null Literals
Syntax
NullLiteral
::
null
12.9.2
Boolean Literals
Syntax
BooleanLiteral
::
true
false
12.9.3
Numeric Literals
Syntax
NumericLiteralSeparator
::
NumericLiteral
::
DecimalLiteral
DecimalBigIntegerLiteral
NonDecimalIntegerLiteral
[+Sep]
NonDecimalIntegerLiteral
[+Sep]
BigIntLiteralSuffix
LegacyOctalIntegerLiteral
DecimalBigIntegerLiteral
::
BigIntLiteralSuffix
NonZeroDigit
DecimalDigits
[+Sep]
opt
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits
[+Sep]
BigIntLiteralSuffix
NonDecimalIntegerLiteral
[Sep]
::
BinaryIntegerLiteral
[?Sep]
OctalIntegerLiteral
[?Sep]
HexIntegerLiteral
[?Sep]
BigIntLiteralSuffix
::
DecimalLiteral
::
DecimalIntegerLiteral
DecimalDigits
[+Sep]
opt
ExponentPart
[+Sep]
opt
DecimalDigits
[+Sep]
ExponentPart
[+Sep]
opt
DecimalIntegerLiteral
ExponentPart
[+Sep]
opt
DecimalIntegerLiteral
::
NonZeroDigit
NonZeroDigit
NumericLiteralSeparator
opt
DecimalDigits
[+Sep]
NonOctalDecimalIntegerLiteral
DecimalDigits
[Sep]
::
DecimalDigit
DecimalDigits
[?Sep]
DecimalDigit
[+Sep]
DecimalDigits
[+Sep]
NumericLiteralSeparator
DecimalDigit
DecimalDigit
::
one of
NonZeroDigit
::
one of
ExponentPart
[Sep]
::
ExponentIndicator
SignedInteger
[?Sep]
ExponentIndicator
::
one of
SignedInteger
[Sep]
::
DecimalDigits
[?Sep]
DecimalDigits
[?Sep]
DecimalDigits
[?Sep]
BinaryIntegerLiteral
[Sep]
::
0b
BinaryDigits
[?Sep]
0B
BinaryDigits
[?Sep]
BinaryDigits
[Sep]
::
BinaryDigit
BinaryDigits
[?Sep]
BinaryDigit
[+Sep]
BinaryDigits
[+Sep]
NumericLiteralSeparator
BinaryDigit
BinaryDigit
::
one of
OctalIntegerLiteral
[Sep]
::
0o
OctalDigits
[?Sep]
0O
OctalDigits
[?Sep]
OctalDigits
[Sep]
::
OctalDigit
OctalDigits
[?Sep]
OctalDigit
[+Sep]
OctalDigits
[+Sep]
NumericLiteralSeparator
OctalDigit
LegacyOctalIntegerLiteral
::
OctalDigit
LegacyOctalIntegerLiteral
OctalDigit
NonOctalDecimalIntegerLiteral
::
NonOctalDigit
LegacyOctalLikeDecimalIntegerLiteral
NonOctalDigit
NonOctalDecimalIntegerLiteral
DecimalDigit
LegacyOctalLikeDecimalIntegerLiteral
::
OctalDigit
LegacyOctalLikeDecimalIntegerLiteral
OctalDigit
OctalDigit
::
one of
NonOctalDigit
::
one of
HexIntegerLiteral
[Sep]
::
0x
HexDigits
[?Sep]
0X
HexDigits
[?Sep]
HexDigits
[Sep]
::
HexDigit
HexDigits
[?Sep]
HexDigit
[+Sep]
HexDigits
[+Sep]
NumericLiteralSeparator
HexDigit
HexDigit
::
one of
The
SourceCharacter
immediately following a
NumericLiteral
must not be an
IdentifierStart
or
DecimalDigit
Note
For example:
3in
is an error and not the two input elements
and
in
12.9.3.1
Static Semantics: Early Errors
NumericLiteral
::
LegacyOctalIntegerLiteral
DecimalIntegerLiteral
::
NonOctalDecimalIntegerLiteral
It is a Syntax Error if the
source text matched by
this production is
strict mode code
Note
In
non-strict code
, this syntax is
Legacy
12.9.3.2
Static Semantics: MV
A numeric literal stands for a value of the
Number type
or the
BigInt type
The MV of
DecimalLiteral
::
DecimalIntegerLiteral
DecimalDigits
is the MV of
DecimalIntegerLiteral
plus (the MV of
DecimalDigits
× 10
), where
is the number of code points in
DecimalDigits
, excluding all occurrences of
NumericLiteralSeparator
The MV of
DecimalLiteral
::
DecimalIntegerLiteral
ExponentPart
is the MV of
DecimalIntegerLiteral
× 10
, where
is the MV of
ExponentPart
The MV of
DecimalLiteral
::
DecimalIntegerLiteral
DecimalDigits
ExponentPart
is (the MV of
DecimalIntegerLiteral
plus (the MV of
DecimalDigits
× 10
)) × 10
, where
is the number of code points in
DecimalDigits
, excluding all occurrences of
NumericLiteralSeparator
and
is the MV of
ExponentPart
The MV of
DecimalLiteral
::
DecimalDigits
is the MV of
DecimalDigits
× 10
, where
is the number of code points in
DecimalDigits
, excluding all occurrences of
NumericLiteralSeparator
The MV of
DecimalLiteral
::
DecimalDigits
ExponentPart
is the MV of
DecimalDigits
× 10
, where
is the number of code points in
DecimalDigits
, excluding all occurrences of
NumericLiteralSeparator
, and
is the MV of
ExponentPart
The MV of
DecimalLiteral
::
DecimalIntegerLiteral
ExponentPart
is the MV of
DecimalIntegerLiteral
× 10
, where
is the MV of
ExponentPart
The MV of
DecimalIntegerLiteral
::
is 0.
The MV of
DecimalIntegerLiteral
::
NonZeroDigit
NumericLiteralSeparator
opt
DecimalDigits
is (the MV of
NonZeroDigit
× 10
) plus the MV of
DecimalDigits
, where
is the number of code points in
DecimalDigits
, excluding all occurrences of
NumericLiteralSeparator
The MV of
DecimalDigits
::
DecimalDigits
DecimalDigit
is (the MV of
DecimalDigits
× 10) plus the MV of
DecimalDigit
The MV of
DecimalDigits
::
DecimalDigits
NumericLiteralSeparator
DecimalDigit
is (the MV of
DecimalDigits
× 10) plus the MV of
DecimalDigit
The MV of
ExponentPart
::
ExponentIndicator
SignedInteger
is the MV of
SignedInteger
The MV of
SignedInteger
::
DecimalDigits
is the negative of the MV of
DecimalDigits
The MV of
DecimalDigit
::
or of
HexDigit
::
or of
OctalDigit
::
or of
LegacyOctalEscapeSequence
::
or of
BinaryDigit
::
is 0.
The MV of
DecimalDigit
::
or of
NonZeroDigit
::
or of
HexDigit
::
or of
OctalDigit
::
or of
BinaryDigit
::
is 1.
The MV of
DecimalDigit
::
or of
NonZeroDigit
::
or of
HexDigit
::
or of
OctalDigit
::
is 2.
The MV of
DecimalDigit
::
or of
NonZeroDigit
::
or of
HexDigit
::
or of
OctalDigit
::
is 3.
The MV of
DecimalDigit
::
or of
NonZeroDigit
::
or of
HexDigit
::
or of
OctalDigit
::
is 4.
The MV of
DecimalDigit
::
or of
NonZeroDigit
::
or of
HexDigit
::
or of
OctalDigit
::
is 5.
The MV of
DecimalDigit
::
or of
NonZeroDigit
::
or of
HexDigit
::
or of
OctalDigit
::
is 6.
The MV of
DecimalDigit
::
or of
NonZeroDigit
::
or of
HexDigit
::
or of
OctalDigit
::
is 7.
The MV of
DecimalDigit
::
or of
NonZeroDigit
::
or of
NonOctalDigit
::
or of
HexDigit
::
is 8.
The MV of
DecimalDigit
::
or of
NonZeroDigit
::
or of
NonOctalDigit
::
or of
HexDigit
::
is 9.
The MV of
HexDigit
::
or of
HexDigit
::
is 10.
The MV of
HexDigit
::
or of
HexDigit
::
is 11.
The MV of
HexDigit
::
or of
HexDigit
::
is 12.
The MV of
HexDigit
::
or of
HexDigit
::
is 13.
The MV of
HexDigit
::
or of
HexDigit
::
is 14.
The MV of
HexDigit
::
or of
HexDigit
::
is 15.
The MV of
BinaryDigits
::
BinaryDigits
BinaryDigit
is (the MV of
BinaryDigits
× 2) plus the MV of
BinaryDigit
The MV of
BinaryDigits
::
BinaryDigits
NumericLiteralSeparator
BinaryDigit
is (the MV of
BinaryDigits
× 2) plus the MV of
BinaryDigit
The MV of
OctalDigits
::
OctalDigits
OctalDigit
is (the MV of
OctalDigits
× 8) plus the MV of
OctalDigit
The MV of
OctalDigits
::
OctalDigits
NumericLiteralSeparator
OctalDigit
is (the MV of
OctalDigits
× 8) plus the MV of
OctalDigit
The MV of
LegacyOctalIntegerLiteral
::
LegacyOctalIntegerLiteral
OctalDigit
is (the MV of
LegacyOctalIntegerLiteral
times 8) plus the MV of
OctalDigit
The MV of
NonOctalDecimalIntegerLiteral
::
LegacyOctalLikeDecimalIntegerLiteral
NonOctalDigit
is (the MV of
LegacyOctalLikeDecimalIntegerLiteral
times 10) plus the MV of
NonOctalDigit
The MV of
NonOctalDecimalIntegerLiteral
::
NonOctalDecimalIntegerLiteral
DecimalDigit
is (the MV of
NonOctalDecimalIntegerLiteral
times 10) plus the MV of
DecimalDigit
The MV of
LegacyOctalLikeDecimalIntegerLiteral
::
LegacyOctalLikeDecimalIntegerLiteral
OctalDigit
is (the MV of
LegacyOctalLikeDecimalIntegerLiteral
times 10) plus the MV of
OctalDigit
The MV of
HexDigits
::
HexDigits
HexDigit
is (the MV of
HexDigits
× 16) plus the MV of
HexDigit
The MV of
HexDigits
::
HexDigits
NumericLiteralSeparator
HexDigit
is (the MV of
HexDigits
× 16) plus the MV of
HexDigit
12.9.3.3
Static Semantics: NumericValue
The
syntax-directed operation
NumericValue takes no arguments and returns a Number or a BigInt. It is defined piecewise over the following productions:
NumericLiteral
::
DecimalLiteral
1.
Return
RoundMVResult
(MV of
DecimalLiteral
).
NumericLiteral
::
NonDecimalIntegerLiteral
1.
Return
(MV of
NonDecimalIntegerLiteral
).
NumericLiteral
::
LegacyOctalIntegerLiteral
1.
Return
(MV of
LegacyOctalIntegerLiteral
).
NumericLiteral
::
NonDecimalIntegerLiteral
BigIntLiteralSuffix
1.
Return the BigInt value that represents the MV of
NonDecimalIntegerLiteral
DecimalBigIntegerLiteral
::
BigIntLiteralSuffix
1.
Return
DecimalBigIntegerLiteral
::
NonZeroDigit
BigIntLiteralSuffix
1.
Return the BigInt value that represents the MV of
NonZeroDigit
DecimalBigIntegerLiteral
::
NonZeroDigit
DecimalDigits
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits
BigIntLiteralSuffix
1.
Let
be the number of code points in
DecimalDigits
, excluding all occurrences of
NumericLiteralSeparator
2.
Let
mv
be (the MV of
NonZeroDigit
× 10
) plus the MV of
DecimalDigits
3.
Return
mv
).
12.9.4
String Literals
Note 1
A string literal is 0 or more Unicode code points enclosed in
single or double quotes. Unicode code points may also be represented by
an escape sequence. All code points may appear literally in a string
literal except for the closing quote code points, U+005C (REVERSE
SOLIDUS), U+000D (CARRIAGE RETURN), and U+000A (LINE FEED). Any code
points may appear in the form of an escape sequence. String literals
evaluate to ECMAScript String values. When generating these String
values Unicode code points are UTF-16 encoded as defined in
11.1.1
Code points belonging to the Basic Multilingual Plane are encoded as a
single code unit element of the string. All other code points are
encoded as two code unit elements of the string.
Syntax
StringLiteral
::
DoubleStringCharacters
opt
SingleStringCharacters
opt
DoubleStringCharacters
::
DoubleStringCharacter
DoubleStringCharacters
opt
SingleStringCharacters
::
SingleStringCharacter
SingleStringCharacters
opt
DoubleStringCharacter
::
SourceCharacter
but not one of
or
or
LineTerminator


EscapeSequence
LineContinuation
SingleStringCharacter
::
SourceCharacter
but not one of
or
or
LineTerminator


EscapeSequence
LineContinuation
LineContinuation
::
LineTerminatorSequence
EscapeSequence
::
CharacterEscapeSequence
[lookahead ∉
DecimalDigit
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence
::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter
::
one of
NonEscapeCharacter
::
SourceCharacter
but not one of
EscapeCharacter
or
LineTerminator
EscapeCharacter
::
SingleEscapeCharacter
DecimalDigit
LegacyOctalEscapeSequence
::
[lookahead ∈ {
}]
NonZeroOctalDigit
[lookahead ∉
OctalDigit
ZeroToThree
OctalDigit
[lookahead ∉
OctalDigit
FourToSeven
OctalDigit
ZeroToThree
OctalDigit
OctalDigit
NonZeroOctalDigit
::
OctalDigit
but not
ZeroToThree
::
one of
FourToSeven
::
one of
NonOctalDecimalEscapeSequence
::
one of
HexEscapeSequence
::
HexDigit
HexDigit
UnicodeEscapeSequence
::
Hex4Digits
u{
CodePoint
Hex4Digits
::
HexDigit
HexDigit
HexDigit
HexDigit
The definition of the nonterminal
HexDigit
is given in
12.9.3
SourceCharacter
is defined in
11.1
Note 2
and cannot appear in a string literal, except as part of a
LineContinuation
to produce the empty code points sequence. The proper way to include
either in the String value of a string literal is to use an escape
sequence such as
\n
or
\u000A
12.9.4.1
Static Semantics: Early Errors
EscapeSequence
::
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
It is a Syntax Error if the
source text matched by
this production is
strict mode code
Note 1
In
non-strict code
, this syntax is
Legacy
Note 2
It is possible for string literals to precede a
Use Strict Directive
that places the enclosing code in
strict mode
and implementations must take care to enforce the above rules for such
literals. For example, the following source text contains a Syntax
Error:
function
invalid
) {
"\7"
"use strict"
; }
12.9.4.2
Static Semantics: SV
The
syntax-directed operation
SV takes no arguments and returns a String.
A string literal stands for a value of the
String type
SV produces String values for string literals through recursive
application on the various parts of the string literal. As part of this
process, some Unicode code points within the string literal are
interpreted as having a
mathematical value
, as described below or in
12.9.3
The SV of
StringLiteral
::
is the empty String.
The SV of
StringLiteral
::
is the empty String.
The SV of
DoubleStringCharacters
::
DoubleStringCharacter
DoubleStringCharacters
is the
string-concatenation
of the SV of
DoubleStringCharacter
and the SV of
DoubleStringCharacters
The SV of
SingleStringCharacters
::
SingleStringCharacter
SingleStringCharacters
is the
string-concatenation
of the SV of
SingleStringCharacter
and the SV of
SingleStringCharacters
The SV of
DoubleStringCharacter
::
SourceCharacter
but not one of
or
or
LineTerminator
is the result of performing
UTF16EncodeCodePoint
on the code point matched by
SourceCharacter
The SV of
DoubleStringCharacter
::

is the String value consisting of the code unit 0x2028 (LINE SEPARATOR).
The SV of
DoubleStringCharacter
::

is the String value consisting of the code unit 0x2029 (PARAGRAPH SEPARATOR).
The SV of
DoubleStringCharacter
::
LineContinuation
is the empty String.
The SV of
SingleStringCharacter
::
SourceCharacter
but not one of
or
or
LineTerminator
is the result of performing
UTF16EncodeCodePoint
on the code point matched by
SourceCharacter
The SV of
SingleStringCharacter
::

is the String value consisting of the code unit 0x2028 (LINE SEPARATOR).
The SV of
SingleStringCharacter
::

is the String value consisting of the code unit 0x2029 (PARAGRAPH SEPARATOR).
The SV of
SingleStringCharacter
::
LineContinuation
is the empty String.
The SV of
EscapeSequence
::
is the String value consisting of the code unit 0x0000 (NULL).
The SV of
CharacterEscapeSequence
::
SingleEscapeCharacter
is the String value consisting of the code unit whose numeric value is determined by the
SingleEscapeCharacter
according to
Table 37
Table 37: String Single Character Escape Sequences
Escape Sequence
Code Unit Value
Unicode Character Name
Symbol
\b
0x0008
BACKSPACE

\t
0x0009
CHARACTER TABULATION

\n
0x000A
LINE FEED (LF)

\v
0x000B
LINE TABULATION

\f
0x000C
FORM FEED (FF)

\r
0x000D
CARRIAGE RETURN (CR)

\"
0x0022
QUOTATION MARK
\'
0x0027
APOSTROPHE
\\
0x005C
REVERSE SOLIDUS
The SV of
NonEscapeCharacter
::
SourceCharacter
but not one of
EscapeCharacter
or
LineTerminator
is the result of performing
UTF16EncodeCodePoint
on the code point matched by
SourceCharacter
The SV of
EscapeSequence
::
LegacyOctalEscapeSequence
is the String value consisting of the code unit whose numeric value is the MV of
LegacyOctalEscapeSequence
The SV of
NonOctalDecimalEscapeSequence
::
is the String value consisting of the code unit 0x0038 (DIGIT EIGHT).
The SV of
NonOctalDecimalEscapeSequence
::
is the String value consisting of the code unit 0x0039 (DIGIT NINE).
The SV of
HexEscapeSequence
::
HexDigit
HexDigit
is the String value consisting of the code unit whose numeric value is the MV of
HexEscapeSequence
The SV of
Hex4Digits
::
HexDigit
HexDigit
HexDigit
HexDigit
is the String value consisting of the code unit whose numeric value is the MV of
Hex4Digits
The SV of
UnicodeEscapeSequence
::
u{
CodePoint
is the result of performing
UTF16EncodeCodePoint
on the MV of
CodePoint
The SV of
TemplateEscapeSequence
::
is the String value consisting of the code unit 0x0000 (NULL).
12.9.4.3
Static Semantics: MV
The MV of
LegacyOctalEscapeSequence
::
ZeroToThree
OctalDigit
is (8 times the MV of
ZeroToThree
) plus the MV of
OctalDigit
The MV of
LegacyOctalEscapeSequence
::
FourToSeven
OctalDigit
is (8 times the MV of
FourToSeven
) plus the MV of
OctalDigit
The MV of
LegacyOctalEscapeSequence
::
ZeroToThree
OctalDigit
OctalDigit
is (64 (that is, 8
) times the MV of
ZeroToThree
) plus (8 times the MV of the first
OctalDigit
) plus the MV of the second
OctalDigit
The MV of
ZeroToThree
::
is 0.
The MV of
ZeroToThree
::
is 1.
The MV of
ZeroToThree
::
is 2.
The MV of
ZeroToThree
::
is 3.
The MV of
FourToSeven
::
is 4.
The MV of
FourToSeven
::
is 5.
The MV of
FourToSeven
::
is 6.
The MV of
FourToSeven
::
is 7.
The MV of
HexEscapeSequence
::
HexDigit
HexDigit
is (16 times the MV of the first
HexDigit
) plus the MV of the second
HexDigit
The MV of
Hex4Digits
::
HexDigit
HexDigit
HexDigit
HexDigit
is (0x1000 × the MV of the first
HexDigit
) plus (0x100 × the MV of the second
HexDigit
) plus (0x10 × the MV of the third
HexDigit
) plus the MV of the fourth
HexDigit
12.9.5
Regular Expression Literals
Note 1
A regular expression literal is an input element that is converted to a RegExp object (see
22.2
each time the literal is evaluated. Two regular expression literals in a
program evaluate to regular expression objects that never compare as
===
to each other even if the two literals' contents are identical. A RegExp object may also be created at runtime by
new RegExp
or calling the RegExp
constructor
as a function (see
22.2.4
).
The productions below describe the syntax for a regular
expression literal and are used by the input element scanner to find the
end of the regular expression literal. The source text comprising the
RegularExpressionBody
and the
RegularExpressionFlags
are subsequently parsed again using the more stringent ECMAScript Regular Expression grammar (
22.2.1
).
An implementation may extend the ECMAScript Regular Expression grammar defined in
22.2.1
, but it must not extend the
RegularExpressionBody
and
RegularExpressionFlags
productions defined below or the productions used by these productions.
Syntax
RegularExpressionLiteral
::
RegularExpressionBody
RegularExpressionFlags
RegularExpressionBody
::
RegularExpressionFirstChar
RegularExpressionChars
RegularExpressionChars
::
[empty]
RegularExpressionChars
RegularExpressionChar
RegularExpressionFirstChar
::
RegularExpressionNonTerminator
but not one of
or
or
or
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar
::
RegularExpressionNonTerminator
but not one of
or
or
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence
::
RegularExpressionNonTerminator
RegularExpressionNonTerminator
::
SourceCharacter
but not
LineTerminator
RegularExpressionClass
::
RegularExpressionClassChars
RegularExpressionClassChars
::
[empty]
RegularExpressionClassChars
RegularExpressionClassChar
RegularExpressionClassChar
::
RegularExpressionNonTerminator
but not one of
or
RegularExpressionBackslashSequence
RegularExpressionFlags
::
[empty]
RegularExpressionFlags
IdentifierPartChar
Note 2
Regular expression literals may not be empty; instead of
representing an empty regular expression literal, the code unit sequence
//
starts a single-line comment. To specify an empty regular expression, use:
/(?:)/
12.9.5.1
Static Semantics: BodyText
The
syntax-directed operation
BodyText takes no arguments and returns source text. It is defined piecewise over the following productions:
RegularExpressionLiteral
::
RegularExpressionBody
RegularExpressionFlags
1.
Return the source text that was recognized as
RegularExpressionBody
12.9.5.2
Static Semantics: FlagText
The
syntax-directed operation
FlagText takes no arguments and returns source text. It is defined piecewise over the following productions:
RegularExpressionLiteral
::
RegularExpressionBody
RegularExpressionFlags
1.
Return the source text that was recognized as
RegularExpressionFlags
12.9.6
Template Literal Lexical Components
Syntax
Template
::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate
::
TemplateCharacters
opt
TemplateHead
::
TemplateCharacters
opt
${
TemplateSubstitutionTail
::
TemplateMiddle
TemplateTail
TemplateMiddle
::
TemplateCharacters
opt
${
TemplateTail
::
TemplateCharacters
opt
TemplateCharacters
::
TemplateCharacter
TemplateCharacters
opt
TemplateCharacter
::
[lookahead ≠
TemplateEscapeSequence
NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter
but not one of
or
or
or
LineTerminator
TemplateEscapeSequence
::
CharacterEscapeSequence
[lookahead ∉
DecimalDigit
HexEscapeSequence
UnicodeEscapeSequence
NotEscapeSequence
::
DecimalDigit
DecimalDigit
but not
[lookahead ∉
HexDigit
HexDigit
[lookahead ∉
HexDigit
[lookahead ∉
HexDigit
[lookahead ≠
HexDigit
[lookahead ∉
HexDigit
HexDigit
HexDigit
[lookahead ∉
HexDigit
HexDigit
HexDigit
HexDigit
[lookahead ∉
HexDigit
[lookahead ∉
HexDigit
NotCodePoint
[lookahead ∉
HexDigit
CodePoint
[lookahead ∉
HexDigit
[lookahead ≠
NotCodePoint
::
HexDigits
[~Sep]
but only if MV of
HexDigits
> 0x10FFFF
CodePoint
::
HexDigits
[~Sep]
but only if MV of
HexDigits
≤ 0x10FFFF
Note
TemplateSubstitutionTail
is used by the
InputElementTemplateTail
alternative lexical goal.
12.9.6.1
Static Semantics: TV
The
syntax-directed operation
TV takes no arguments and returns a String or
undefined
. A template literal component is interpreted by TV as a value of the
String type
TV is used to construct the indexed components of a template object
(colloquially, the template values). In TV, escape sequences are
replaced by the UTF-16 code unit(s) of the Unicode code point
represented by the escape sequence.
The TV of
NoSubstitutionTemplate
::
is the empty String.
The TV of
TemplateHead
::
${
is the empty String.
The TV of
TemplateMiddle
::
${
is the empty String.
The TV of
TemplateTail
::
is the empty String.
The TV of
TemplateCharacters
::
TemplateCharacter
TemplateCharacters
is
undefined
if the TV of
TemplateCharacter
is
undefined
or the TV of
TemplateCharacters
is
undefined
. Otherwise, it is the
string-concatenation
of the TV of
TemplateCharacter
and the TV of
TemplateCharacters
The TV of
TemplateCharacter
::
SourceCharacter
but not one of
or
or
or
LineTerminator
is the result of performing
UTF16EncodeCodePoint
on the code point matched by
SourceCharacter
The TV of
TemplateCharacter
::
is the String value consisting of the code unit 0x0024 (DOLLAR SIGN).
The TV of
TemplateCharacter
::
TemplateEscapeSequence
is the
SV
of
TemplateEscapeSequence
The TV of
TemplateCharacter
::
NotEscapeSequence
is
undefined
The TV of
TemplateCharacter
::
LineTerminatorSequence
is the
TRV
of
LineTerminatorSequence
The TV of
LineContinuation
::
LineTerminatorSequence
is the empty String.
12.9.6.2
Static Semantics: TRV
The
syntax-directed operation
TRV takes no arguments and returns a String. A template literal component is interpreted by TRV as a value of the
String type
. TRV is used to construct the raw components of a template object (colloquially, the template raw values). TRV is similar to
TV
with the difference being that in TRV, escape sequences are interpreted as they appear in the literal.
The TRV of
NoSubstitutionTemplate
::
is the empty String.
The TRV of
TemplateHead
::
${
is the empty String.
The TRV of
TemplateMiddle
::
${
is the empty String.
The TRV of
TemplateTail
::
is the empty String.
The TRV of
TemplateCharacters
::
TemplateCharacter
TemplateCharacters
is the
string-concatenation
of the TRV of
TemplateCharacter
and the TRV of
TemplateCharacters
The TRV of
TemplateCharacter
::
SourceCharacter
but not one of
or
or
or
LineTerminator
is the result of performing
UTF16EncodeCodePoint
on the code point matched by
SourceCharacter
The TRV of
TemplateCharacter
::
is the String value consisting of the code unit 0x0024 (DOLLAR SIGN).
The TRV of
TemplateCharacter
::
TemplateEscapeSequence
is the
string-concatenation
of the code unit 0x005C (REVERSE SOLIDUS) and the TRV of
TemplateEscapeSequence
The TRV of
TemplateCharacter
::
NotEscapeSequence
is the
string-concatenation
of the code unit 0x005C (REVERSE SOLIDUS) and the TRV of
NotEscapeSequence
The TRV of
TemplateEscapeSequence
::
is the String value consisting of the code unit 0x0030 (DIGIT ZERO).
The TRV of
NotEscapeSequence
::
DecimalDigit
is the
string-concatenation
of the code unit 0x0030 (DIGIT ZERO) and the TRV of
DecimalDigit
The TRV of
NotEscapeSequence
::
[lookahead ∉
HexDigit
is the String value consisting of the code unit 0x0078 (LATIN SMALL LETTER X).
The TRV of
NotEscapeSequence
::
HexDigit
[lookahead ∉
HexDigit
is the
string-concatenation
of the code unit 0x0078 (LATIN SMALL LETTER X) and the TRV of
HexDigit
The TRV of
NotEscapeSequence
::
[lookahead ∉
HexDigit
[lookahead ≠
is the String value consisting of the code unit 0x0075 (LATIN SMALL LETTER U).
The TRV of
NotEscapeSequence
::
HexDigit
[lookahead ∉
HexDigit
is the
string-concatenation
of the code unit 0x0075 (LATIN SMALL LETTER U) and the TRV of
HexDigit
The TRV of
NotEscapeSequence
::
HexDigit
HexDigit
[lookahead ∉
HexDigit
is the
string-concatenation
of the code unit 0x0075 (LATIN SMALL LETTER U), the TRV of the first
HexDigit
, and the TRV of the second
HexDigit
The TRV of
NotEscapeSequence
::
HexDigit
HexDigit
HexDigit
[lookahead ∉
HexDigit
is the
string-concatenation
of the code unit 0x0075 (LATIN SMALL LETTER U), the TRV of the first
HexDigit
, the TRV of the second
HexDigit
, and the TRV of the third
HexDigit
The TRV of
NotEscapeSequence
::
[lookahead ∉
HexDigit
is the
string-concatenation
of the code unit 0x0075 (LATIN SMALL LETTER U) and the code unit 0x007B (LEFT CURLY BRACKET).
The TRV of
NotEscapeSequence
::
NotCodePoint
[lookahead ∉
HexDigit
is the
string-concatenation
of the code unit 0x0075 (LATIN SMALL LETTER U), the code unit 0x007B (LEFT CURLY BRACKET), and the TRV of
NotCodePoint
The TRV of
NotEscapeSequence
::
CodePoint
[lookahead ∉
HexDigit
[lookahead ≠
is the
string-concatenation
of the code unit 0x0075 (LATIN SMALL LETTER U), the code unit 0x007B (LEFT CURLY BRACKET), and the TRV of
CodePoint
The TRV of
DecimalDigit
::
one of
is the result of performing
UTF16EncodeCodePoint
on the single code point matched by this production.
The TRV of
CharacterEscapeSequence
::
NonEscapeCharacter
is the
SV
of
NonEscapeCharacter
The TRV of
SingleEscapeCharacter
::
one of
is the result of performing
UTF16EncodeCodePoint
on the single code point matched by this production.
The TRV of
HexEscapeSequence
::
HexDigit
HexDigit
is the
string-concatenation
of the code unit 0x0078 (LATIN SMALL LETTER X), the TRV of the first
HexDigit
, and the TRV of the second
HexDigit
The TRV of
UnicodeEscapeSequence
::
Hex4Digits
is the
string-concatenation
of the code unit 0x0075 (LATIN SMALL LETTER U) and the TRV of
Hex4Digits
The TRV of
UnicodeEscapeSequence
::
u{
CodePoint
is the
string-concatenation
of the code unit 0x0075 (LATIN SMALL LETTER U), the code unit 0x007B (LEFT CURLY BRACKET), the TRV of
CodePoint
, and the code unit 0x007D (RIGHT CURLY BRACKET).
The TRV of
Hex4Digits
::
HexDigit
HexDigit
HexDigit
HexDigit
is the
string-concatenation
of the TRV of the first
HexDigit
, the TRV of the second
HexDigit
, the TRV of the third
HexDigit
, and the TRV of the fourth
HexDigit
The TRV of
HexDigits
::
HexDigits
HexDigit
is the
string-concatenation
of the TRV of
HexDigits
and the TRV of
HexDigit
The TRV of
HexDigit
::
one of
is the result of performing
UTF16EncodeCodePoint
on the single code point matched by this production.
The TRV of
LineContinuation
::
LineTerminatorSequence
is the
string-concatenation
of the code unit 0x005C (REVERSE SOLIDUS) and the TRV of
LineTerminatorSequence
The TRV of
LineTerminatorSequence
::

is the String value consisting of the code unit 0x000A (LINE FEED).
The TRV of
LineTerminatorSequence
::

is the String value consisting of the code unit 0x000A (LINE FEED).
The TRV of
LineTerminatorSequence
::

is the String value consisting of the code unit 0x2028 (LINE SEPARATOR).
The TRV of
LineTerminatorSequence
::

is the String value consisting of the code unit 0x2029 (PARAGRAPH SEPARATOR).
The TRV of
LineTerminatorSequence
::


is the String value consisting of the code unit 0x000A (LINE FEED).
Note
TV
excludes the code units of
LineContinuation
while TRV includes them. and
LineTerminatorSequence
s are normalized to for both
TV
and TRV. An explicit
TemplateEscapeSequence
is needed to include a or sequence.
12.10
Automatic Semicolon Insertion
Most ECMAScript statements and declarations must be terminated
with a semicolon. Such semicolons may always appear explicitly in the
source text. For convenience, however, such semicolons may be omitted
from the source text in certain situations. These situations are
described by saying that semicolons are automatically inserted into the
source code token stream in those situations.
12.10.1
Rules of Automatic Semicolon Insertion
In the following rules, “token” means the actual recognized lexical token determined using the current lexical
goal symbol
as described in clause
12
There are three basic rules of semicolon insertion:
When, as the source text is parsed from left to right, a token (called the
offending token
is encountered that is not allowed by any production of the grammar,
then a semicolon is automatically inserted before the offending token if
one or more of the following conditions is true:
The offending token is separated from the previous token by at least one
LineTerminator
The offending token is
The previous token is
and the inserted semicolon would then be parsed as the terminating semicolon of a do-while statement (
14.7.2
).
When, as the source text is parsed from left to right, the end
of the input stream of tokens is encountered and the parser is unable
to parse the input token stream as a single instance of the goal
nonterminal, then a semicolon is automatically inserted at the end of
the input stream.
When, as the source text is parsed from left to right, a token
is encountered that is allowed by some production of the grammar, but
the production is a
restricted production
and the token would be the first token for a terminal or nonterminal immediately following the annotation “[no
LineTerminator
here]” within the restricted production (and therefore such a token is
called a restricted token), and the restricted token is separated from
the previous token by at least one
LineTerminator
, then a semicolon is automatically inserted before the restricted token.
However, there is an additional overriding condition on the
preceding rules: a semicolon is never inserted automatically if the
semicolon would then be parsed as an empty statement or if that
semicolon would become one of the two semicolons in the header of a
for
statement (see
14.7.4
).
Note
The following are the only restricted productions in the grammar:
UpdateExpression
[Yield, Await]
LeftHandSideExpression
[?Yield, ?Await]
[no
LineTerminator
here]
++
LeftHandSideExpression
[?Yield, ?Await]
[no
LineTerminator
here]
--
ContinueStatement
[Yield, Await]
continue
continue
[no
LineTerminator
here]
LabelIdentifier
[?Yield, ?Await]
BreakStatement
[Yield, Await]
break
break
[no
LineTerminator
here]
LabelIdentifier
[?Yield, ?Await]
ReturnStatement
[Yield, Await]
return
return
[no
LineTerminator
here]
Expression
[+In, ?Yield, ?Await]
ThrowStatement
[Yield, Await]
throw
[no
LineTerminator
here]
Expression
[+In, ?Yield, ?Await]
YieldExpression
[In, Await]
yield
yield
[no
LineTerminator
here]
AssignmentExpression
[?In, +Yield, ?Await]
yield
[no
LineTerminator
here]
AssignmentExpression
[?In, +Yield, ?Await]
ArrowFunction
[In, Yield, Await]
ArrowParameters
[?Yield, ?Await]
[no
LineTerminator
here]
=>
ConciseBody
[?In]
AsyncFunctionDeclaration
[Yield, Await, Default]
async
[no
LineTerminator
here]
function
BindingIdentifier
[?Yield, ?Await]
FormalParameters
[~Yield, +Await]
AsyncFunctionBody
[+Default]
async
[no
LineTerminator
here]
function
FormalParameters
[~Yield, +Await]
AsyncFunctionBody
AsyncFunctionExpression
async
[no
LineTerminator
here]
function
BindingIdentifier
[~Yield, +Await]
opt
FormalParameters
[~Yield, +Await]
AsyncFunctionBody
AsyncMethod
[Yield, Await]
async
[no
LineTerminator
here]
ClassElementName
[?Yield, ?Await]
UniqueFormalParameters
[~Yield, +Await]
AsyncFunctionBody
AsyncGeneratorDeclaration
[Yield, Await, Default]
async
[no
LineTerminator
here]
function
BindingIdentifier
[?Yield, ?Await]
FormalParameters
[+Yield, +Await]
AsyncGeneratorBody
[+Default]
async
[no
LineTerminator
here]
function
FormalParameters
[+Yield, +Await]
AsyncGeneratorBody
AsyncGeneratorExpression
async
[no
LineTerminator
here]
function
BindingIdentifier
[+Yield, +Await]
opt
FormalParameters
[+Yield, +Await]
AsyncGeneratorBody
AsyncGeneratorMethod
[Yield, Await]
async
[no
LineTerminator
here]
ClassElementName
[?Yield, ?Await]
UniqueFormalParameters
[+Yield, +Await]
AsyncGeneratorBody
AsyncArrowFunction
[In, Yield, Await]
async
[no
LineTerminator
here]
AsyncArrowBindingIdentifier
[?Yield]
[no
LineTerminator
here]
=>
AsyncConciseBody
[?In]
CoverCallExpressionAndAsyncArrowHead
[?Yield, ?Await]
[no
LineTerminator
here]
=>
AsyncConciseBody
[?In]
AsyncArrowHead
async
[no
LineTerminator
here]
ArrowFormalParameters
[~Yield, +Await]
The practical effect of these restricted productions is as follows:
When a
++
or
--
token is encountered where the parser would treat it as a postfix operator, and at least one
LineTerminator
occurred between the preceding token and the
++
or
--
token, then a semicolon is automatically inserted before the
++
or
--
token.
When a
continue
break
return
throw
, or
yield
token is encountered and a
LineTerminator
is encountered before the next token, a semicolon is automatically inserted after the
continue
break
return
throw
, or
yield
token.
When arrow function parameter(s) are followed by a
LineTerminator
before a
=>
token, a semicolon is automatically inserted and the punctuator causes a syntax error.
When an
async
token is followed by a
LineTerminator
before a
function
or
IdentifierName
or
token, a semicolon is automatically inserted and the
async
token is not treated as part of the same expression or class element as the following tokens.
When an
async
token is followed by a
LineTerminator
before a
token, a semicolon is automatically inserted and the punctuator causes a syntax error.
The resulting practical advice to ECMAScript programmers is:
A postfix
++
or
--
operator should be on the same line as its operand.
An
Expression
in a
return
or
throw
statement or an
AssignmentExpression
in a
yield
expression should start on the same line as the
return
throw
, or
yield
token.
LabelIdentifier
in a
break
or
continue
statement should be on the same line as the
break
or
continue
token.
The end of an arrow function's parameter(s) and its
=>
should be on the same line.
The
async
token preceding an asynchronous function or method should be on the same line as the immediately following token.
12.10.2
Examples of Automatic Semicolon Insertion
This section is non-normative.
The source
is not a valid sentence in the ECMAScript grammar, even with the automatic semicolon insertion rules. In contrast, the source
is also not a valid ECMAScript sentence, but is transformed by automatic semicolon insertion into the following:
;}
which is a valid ECMAScript sentence.
The source
for
(a; b
is not a valid ECMAScript sentence and is not altered by
automatic semicolon insertion because the semicolon is needed for the
header of a
for
statement. Automatic semicolon insertion never inserts one of the two semicolons in the header of a
for
statement.
The source
return
a + b
is transformed by automatic semicolon insertion into the following:
return
a + b;
Note 1
The expression
a + b
is not treated as a value to be returned by the
return
statement, because a
LineTerminator
separates it from the token
return
The source
a = b
++c
is transformed by automatic semicolon insertion into the following:
a = b;
++c;
Note 2
The token
++
is not treated as a postfix operator applying to the variable
, because a
LineTerminator
occurs between
and
++
The source
if
(a > b)
else
c = d
is not a valid ECMAScript sentence and is not altered by automatic semicolon insertion before the
else
token, even though no production of the grammar applies at that point,
because an automatically inserted semicolon would then be parsed as an
empty statement.
The source
a = b + c
(d + e).
()
is
not
transformed by automatic semicolon insertion,
because the parenthesized expression that begins the second line can be
interpreted as an argument list for a function call:
a = b +
(d + e).
()
In the circumstance that an assignment statement must begin
with a left parenthesis, it is a good idea for the programmer to provide
an explicit semicolon at the end of the preceding statement rather than
to rely on automatic semicolon insertion.
12.10.3
Interesting Cases of Automatic Semicolon Insertion
This section is non-normative.
ECMAScript programs can be written in a style with very few
semicolons by relying on automatic semicolon insertion. As described
above, semicolons are not inserted at every newline, and automatic
semicolon insertion can depend on multiple tokens across line
terminators.
As new syntactic features are added to ECMAScript, additional
grammar productions could be added that cause lines relying on automatic
semicolon insertion preceding them to change grammar productions when
parsed.
For the purposes of this section, a case of automatic semicolon
insertion is considered interesting if it is a place where a semicolon
may or may not be inserted, depending on the source text which precedes
it. The rest of this section describes a number of interesting cases of
automatic semicolon insertion in this version of ECMAScript.
12.10.3.1
Interesting Cases of Automatic Semicolon Insertion in Statement Lists
In a
StatementList
, many
StatementListItem
end in semicolons, which may be omitted using automatic semicolon
insertion. As a consequence of the rules above, at the end of a line
ending an expression, a semicolon is required if the following line
begins with any of the following:
An opening parenthesis (
. Without a semicolon, the two lines together are treated as a
CallExpression
An opening square bracket (
. Without a semicolon, the two lines together are treated as property access, rather than an
ArrayLiteral
or
ArrayAssignmentPattern
A template literal (
. Without a semicolon, the two lines together are interpreted as a tagged Template (
13.3.11
), with the previous expression as the
MemberExpression
Unary
or
. Without a semicolon, the two lines together are interpreted as a usage of the corresponding binary operator.
A RegExp literal
. Without a semicolon, the two lines together may be parsed instead as the
MultiplicativeOperator
, for example if the RegExp has flags.
12.10.3.2
Cases of Automatic Semicolon Insertion and “[no
LineTerminator
here]”
This section is non-normative.
ECMAScript contains grammar productions which include “[no
LineTerminator
here]”. These productions are sometimes a means to have optional operands in the grammar. Introducing a
LineTerminator
in these locations would change the grammar production of a source text
by using the grammar production without the optional operand.
The rest of this section describes a number of productions using “[no
LineTerminator
here]” in this version of ECMAScript.
12.10.3.2.1
List of Grammar Productions with Optional Operands and “[no
LineTerminator
here]”
UpdateExpression
ContinueStatement
BreakStatement
ReturnStatement
YieldExpression
Async Function Definitions (
15.8
) with relation to Function Definitions (
15.2
13
ECMAScript Language: Expressions
13.1
Identifiers
Syntax
IdentifierReference
[Yield, Await]
Identifier
[~Yield]
yield
[~Await]
await
BindingIdentifier
[Yield, Await]
Identifier
yield
await
LabelIdentifier
[Yield, Await]
Identifier
[~Yield]
yield
[~Await]
await
Identifier
IdentifierName
but not
ReservedWord
Note
yield
and
await
are permitted as
BindingIdentifier
in the grammar, and prohibited with
static semantics
below, to prohibit automatic semicolon insertion in cases such as
let
await
13.1.1
Static Semantics: Early Errors
BindingIdentifier
Identifier
It is a Syntax Error if the
source text matched by
this production is contained in
strict mode code
and the
StringValue
of
Identifier
is either
"arguments"
or
"eval"
IdentifierReference
yield
BindingIdentifier
yield
LabelIdentifier
yield
It is a Syntax Error if the
source text matched by
this production is contained in
strict mode code
IdentifierReference
await
BindingIdentifier
await
LabelIdentifier
await
It is a Syntax Error if the
goal symbol
of the syntactic grammar is
Module
BindingIdentifier
[Yield, Await]
yield
It is a Syntax Error if this production has a
[Yield]
parameter.
BindingIdentifier
[Yield, Await]
await
It is a Syntax Error if this production has an
[Await]
parameter.
IdentifierReference
[Yield, Await]
Identifier
BindingIdentifier
[Yield, Await]
Identifier
LabelIdentifier
[Yield, Await]
Identifier
It is a Syntax Error if this production has a
[Yield]
parameter and
StringValue
of
Identifier
is
"yield"
It is a Syntax Error if this production has an
[Await]
parameter and
StringValue
of
Identifier
is
"await"
Identifier
IdentifierName
but not
ReservedWord
It is a Syntax Error if this phrase is contained in
strict mode code
and the
StringValue
of
IdentifierName
is one of
"implements"
"interface"
"let"
"package"
"private"
"protected"
"public"
"static"
, or
"yield"
It is a Syntax Error if the
goal symbol
of the syntactic grammar is
Module
and the
StringValue
of
IdentifierName
is
"await"
It is a Syntax Error if the
StringValue
of
IdentifierName
is the
StringValue
of any
ReservedWord
except for
yield
or
await
Note
StringValue
of
IdentifierName
normalizes any Unicode escape sequences in
IdentifierName
hence such escapes cannot be used to write an
Identifier
whose code point sequence is the same as a
ReservedWord
13.1.2
Static Semantics: StringValue
The
syntax-directed operation
StringValue takes no arguments and returns a String. It is defined piecewise over the following productions:
IdentifierName
::
IdentifierStart
IdentifierName
IdentifierPart
1.
Let
idTextUnescaped
be
IdentifierCodePoints
of
IdentifierName
2.
Return
CodePointsToString
idTextUnescaped
).
IdentifierReference
yield
BindingIdentifier
yield
LabelIdentifier
yield
1.
Return
"yield"
IdentifierReference
await
BindingIdentifier
await
LabelIdentifier
await
1.
Return
"await"
Identifier
IdentifierName
but not
ReservedWord
1.
Return the
StringValue
of
IdentifierName
PrivateIdentifier
::
IdentifierName
1.
Return the
string-concatenation
of 0x0023 (NUMBER SIGN) and the
StringValue
of
IdentifierName
ModuleExportName
StringLiteral
1.
Return the
SV
of
StringLiteral
13.1.3
Runtime Semantics: Evaluation
IdentifierReference
Identifier
1.
Return ?
ResolveBinding
StringValue
of
Identifier
).
IdentifierReference
yield
1.
Return ?
ResolveBinding
"yield"
).
IdentifierReference
await
1.
Return ?
ResolveBinding
"await"
).
Note 1
The result of evaluating an
IdentifierReference
is always a value of type Reference.
Note 2
In
non-strict code
, the
keyword
yield
may be used as an identifier. Evaluating the
IdentifierReference
resolves the binding of
yield
as if it was an
Identifier
. Early Error restriction ensures that such an evaluation only can occur for
non-strict code
13.2
Primary Expression
Syntax
PrimaryExpression
[Yield, Await]
this
IdentifierReference
[?Yield, ?Await]
Literal
ArrayLiteral
[?Yield, ?Await]
ObjectLiteral
[?Yield, ?Await]
FunctionExpression
ClassExpression
[?Yield, ?Await]
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
[?Yield, ?Await, ~Tagged]
CoverParenthesizedExpressionAndArrowParameterList
[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList
[Yield, Await]
Expression
[+In, ?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
...
BindingIdentifier
[?Yield, ?Await]
...
BindingPattern
[?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
...
BindingIdentifier
[?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
...
BindingPattern
[?Yield, ?Await]
Supplemental Syntax
When processing an instance of the production
PrimaryExpression
[Yield, Await]
CoverParenthesizedExpressionAndArrowParameterList
[?Yield, ?Await]
the interpretation of
CoverParenthesizedExpressionAndArrowParameterList
is refined using the following grammar:
ParenthesizedExpression
[Yield, Await]
Expression
[+In, ?Yield, ?Await]
13.2.1
The
this
Keyword
13.2.1.1
Runtime Semantics: Evaluation
PrimaryExpression
this
1.
Return ?
ResolveThisBinding
().
13.2.2
Identifier Reference
See
13.1
for
IdentifierReference
13.2.3
Literals
Syntax
Literal
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
13.2.3.1
Runtime Semantics: Evaluation
Literal
NullLiteral
1.
Return
null
Literal
BooleanLiteral
1.
If
BooleanLiteral
is the token
false
, return
false
2.
If
BooleanLiteral
is the token
true
, return
true
Literal
NumericLiteral
1.
Return the
NumericValue
of
NumericLiteral
as defined in
12.9.3
Literal
StringLiteral
1.
Return the
SV
of
StringLiteral
as defined in
12.9.4.2
13.2.4
Array Initializer
Note
An
ArrayLiteral
is an expression describing the initialization of an Array, using a
list, of zero or more expressions each of which represents an array
element, enclosed in square brackets. The elements need not be literals;
they are evaluated each time the array initializer is evaluated.
Array elements may be elided at the beginning, middle or end of
the element list. Whenever a comma in the element list is not preceded
by an
AssignmentExpression
(i.e., a comma at the beginning or after another comma), the missing
array element contributes to the length of the Array and increases the
index of subsequent elements. Elided array elements are not defined. If
an element is elided at the end of an array, that element does not
contribute to the length of the Array.
Syntax
ArrayLiteral
[Yield, Await]
Elision
opt
ElementList
[?Yield, ?Await]
ElementList
[?Yield, ?Await]
Elision
opt
ElementList
[Yield, Await]
Elision
opt
AssignmentExpression
[+In, ?Yield, ?Await]
Elision
opt
SpreadElement
[?Yield, ?Await]
ElementList
[?Yield, ?Await]
Elision
opt
AssignmentExpression
[+In, ?Yield, ?Await]
ElementList
[?Yield, ?Await]
Elision
opt
SpreadElement
[?Yield, ?Await]
Elision
Elision
SpreadElement
[Yield, Await]
...
AssignmentExpression
[+In, ?Yield, ?Await]
13.2.4.1
Runtime Semantics: ArrayAccumulation
The
syntax-directed operation
ArrayAccumulation takes arguments
array
(an Array) and
nextIndex
(an
integer
) and returns either a
normal completion containing
an
integer
or an
abrupt completion
. It is defined piecewise over the following productions:
Elision
1.
Let
len
be
nextIndex
+ 1.
2.
Perform ?
Set
array
"length"
len
),
true
).
3.
NOTE: The above step throws if
len
exceeds 2
32
-1.
4.
Return
len
Elision
Elision
1.
Return ?
ArrayAccumulation
of
Elision
with arguments
array
and (
nextIndex
+ 1).
ElementList
Elision
opt
AssignmentExpression
1.
If
Elision
is present, then
a.
Set
nextIndex
to ?
ArrayAccumulation
of
Elision
with arguments
array
and
nextIndex
2.
Let
initResult
be ?
Evaluation
of
AssignmentExpression
3.
Let
initValue
be ?
GetValue
initResult
).
4.
Perform !
CreateDataPropertyOrThrow
array
, !
ToString
nextIndex
)),
initValue
).
5.
Return
nextIndex
+ 1.
ElementList
Elision
opt
SpreadElement
1.
If
Elision
is present, then
a.
Set
nextIndex
to ?
ArrayAccumulation
of
Elision
with arguments
array
and
nextIndex
2.
Return ?
ArrayAccumulation
of
SpreadElement
with arguments
array
and
nextIndex
ElementList
ElementList
Elision
opt
AssignmentExpression
1.
Set
nextIndex
to ?
ArrayAccumulation
of
ElementList
with arguments
array
and
nextIndex
2.
If
Elision
is present, then
a.
Set
nextIndex
to ?
ArrayAccumulation
of
Elision
with arguments
array
and
nextIndex
3.
Let
initResult
be ?
Evaluation
of
AssignmentExpression
4.
Let
initValue
be ?
GetValue
initResult
).
5.
Perform !
CreateDataPropertyOrThrow
array
, !
ToString
nextIndex
)),
initValue
).
6.
Return
nextIndex
+ 1.
ElementList
ElementList
Elision
opt
SpreadElement
1.
Set
nextIndex
to ?
ArrayAccumulation
of
ElementList
with arguments
array
and
nextIndex
2.
If
Elision
is present, then
a.
Set
nextIndex
to ?
ArrayAccumulation
of
Elision
with arguments
array
and
nextIndex
3.
Return ?
ArrayAccumulation
of
SpreadElement
with arguments
array
and
nextIndex
SpreadElement
...
AssignmentExpression
1.
Let
spreadRef
be ?
Evaluation
of
AssignmentExpression
2.
Let
spreadObj
be ?
GetValue
spreadRef
).
3.
Let
iteratorRecord
be ?
GetIterator
spreadObj
sync
).
4.
Repeat,
a.
Let
next
be ?
IteratorStep
iteratorRecord
).
b.
If
next
is
false
, return
nextIndex
c.
Let
nextValue
be ?
IteratorValue
next
).
d.
Perform !
CreateDataPropertyOrThrow
array
, !
ToString
nextIndex
)),
nextValue
).
e.
Set
nextIndex
to
nextIndex
+ 1.
Note
CreateDataPropertyOrThrow
is used to ensure that own properties are defined for the array even if the standard built-in
Array prototype object
has been modified in a manner that would preclude the creation of new own properties using [[Set]].
13.2.4.2
Runtime Semantics: Evaluation
ArrayLiteral
Elision
opt
1.
Let
array
be !
ArrayCreate
(0).
2.
If
Elision
is present, then
a.
Perform ?
ArrayAccumulation
of
Elision
with arguments
array
and 0.
3.
Return
array
ArrayLiteral
ElementList
1.
Let
array
be !
ArrayCreate
(0).
2.
Perform ?
ArrayAccumulation
of
ElementList
with arguments
array
and 0.
3.
Return
array
ArrayLiteral
ElementList
Elision
opt
1.
Let
array
be !
ArrayCreate
(0).
2.
Let
nextIndex
be ?
ArrayAccumulation
of
ElementList
with arguments
array
and 0.
3.
If
Elision
is present, then
a.
Perform ?
ArrayAccumulation
of
Elision
with arguments
array
and
nextIndex
4.
Return
array
13.2.5
Object Initializer
Note 1
An object initializer is an expression describing the
initialization of an Object, written in a form resembling a literal. It
is a list of zero or more pairs of
property keys
and associated values, enclosed in curly brackets. The values need not
be literals; they are evaluated each time the object initializer is
evaluated.
Syntax
ObjectLiteral
[Yield, Await]
PropertyDefinitionList
[?Yield, ?Await]
PropertyDefinitionList
[?Yield, ?Await]
PropertyDefinitionList
[Yield, Await]
PropertyDefinition
[?Yield, ?Await]
PropertyDefinitionList
[?Yield, ?Await]
PropertyDefinition
[?Yield, ?Await]
PropertyDefinition
[Yield, Await]
IdentifierReference
[?Yield, ?Await]
CoverInitializedName
[?Yield, ?Await]
PropertyName
[?Yield, ?Await]
AssignmentExpression
[+In, ?Yield, ?Await]
MethodDefinition
[?Yield, ?Await]
...
AssignmentExpression
[+In, ?Yield, ?Await]
PropertyName
[Yield, Await]
LiteralPropertyName
ComputedPropertyName
[?Yield, ?Await]
LiteralPropertyName
IdentifierName
StringLiteral
NumericLiteral
ComputedPropertyName
[Yield, Await]
AssignmentExpression
[+In, ?Yield, ?Await]
CoverInitializedName
[Yield, Await]
IdentifierReference
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
Initializer
[In, Yield, Await]
AssignmentExpression
[?In, ?Yield, ?Await]
Note 2
MethodDefinition
is defined in
15.4
Note 3
In certain contexts,
ObjectLiteral
is used as a cover grammar for a more restricted secondary grammar. The
CoverInitializedName
production is necessary to fully cover these secondary grammars.
However, use of this production results in an early Syntax Error in
normal contexts where an actual
ObjectLiteral
is expected.
13.2.5.1
Static Semantics: Early Errors
PropertyDefinition
MethodDefinition
It is a Syntax Error if
HasDirectSuper
of
MethodDefinition
is
true
It is a Syntax Error if
PrivateBoundIdentifiers
of
MethodDefinition
is not empty.
In addition to describing an actual object initializer the
ObjectLiteral
productions are also used as a cover grammar for
ObjectAssignmentPattern
and may be recognized as part of a
CoverParenthesizedExpressionAndArrowParameterList
. When
ObjectLiteral
appears in a context where
ObjectAssignmentPattern
is required the following Early Error rules are
not
applied. In addition, they are not applied when initially parsing a
CoverParenthesizedExpressionAndArrowParameterList
or
CoverCallExpressionAndAsyncArrowHead
PropertyDefinition
CoverInitializedName
It is a Syntax Error if any source text is matched by this production.
Note 1
This production exists so that
ObjectLiteral
can serve as a cover grammar for
ObjectAssignmentPattern
. It cannot occur in an actual object initializer.
ObjectLiteral
PropertyDefinitionList
PropertyDefinitionList
It is a Syntax Error if
PropertyNameList
of
PropertyDefinitionList
contains any duplicate entries for
"__proto__"
and at least two of those entries were obtained from productions of the form
PropertyDefinition
PropertyName
AssignmentExpression
. This rule is not applied if this
ObjectLiteral
is contained within a
Script
that is being parsed for JSON.parse (see step
of
JSON.parse
).
Note 2
The
List
returned by
PropertyNameList
does not include property names defined using a
ComputedPropertyName
13.2.5.2
Static Semantics: IsComputedPropertyKey
The
syntax-directed operation
IsComputedPropertyKey takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
PropertyName
LiteralPropertyName
1.
Return
false
PropertyName
ComputedPropertyName
1.
Return
true
13.2.5.3
Static Semantics: PropertyNameList
The
syntax-directed operation
PropertyNameList takes no arguments and returns a
List
of Strings. It is defined piecewise over the following productions:
PropertyDefinitionList
PropertyDefinition
1.
Let
propName
be
PropName
of
PropertyDefinition
2.
If
propName
is
empty
, return a new empty
List
3.
Return «
propName
».
PropertyDefinitionList
PropertyDefinitionList
PropertyDefinition
1.
Let
list
be
PropertyNameList
of
PropertyDefinitionList
2.
Let
propName
be
PropName
of
PropertyDefinition
3.
If
propName
is
empty
, return
list
4.
Return the
list-concatenation
of
list
and «
propName
».
13.2.5.4
Runtime Semantics: Evaluation
ObjectLiteral
1.
Return
OrdinaryObjectCreate
%Object.prototype%
).
ObjectLiteral
PropertyDefinitionList
PropertyDefinitionList
1.
Let
obj
be
OrdinaryObjectCreate
%Object.prototype%
).
2.
Perform ?
PropertyDefinitionEvaluation
of
PropertyDefinitionList
with argument
obj
3.
Return
obj
LiteralPropertyName
IdentifierName
1.
Return
StringValue
of
IdentifierName
LiteralPropertyName
StringLiteral
1.
Return the
SV
of
StringLiteral
LiteralPropertyName
NumericLiteral
1.
Let
nbr
be the
NumericValue
of
NumericLiteral
2.
Return !
ToString
nbr
).
ComputedPropertyName
AssignmentExpression
1.
Let
exprValue
be ?
Evaluation
of
AssignmentExpression
2.
Let
propName
be ?
GetValue
exprValue
).
3.
Return ?
ToPropertyKey
propName
).
13.2.5.5
Runtime Semantics: PropertyDefinitionEvaluation
The
syntax-directed operation
PropertyDefinitionEvaluation takes argument
object
(an Object) and returns either a
normal completion containing
unused
or an
abrupt completion
. It is defined piecewise over the following productions:
PropertyDefinitionList
PropertyDefinitionList
PropertyDefinition
1.
Perform ?
PropertyDefinitionEvaluation
of
PropertyDefinitionList
with argument
object
2.
Perform ?
PropertyDefinitionEvaluation
of
PropertyDefinition
with argument
object
3.
Return
unused
PropertyDefinition
...
AssignmentExpression
1.
Let
exprValue
be ?
Evaluation
of
AssignmentExpression
2.
Let
fromValue
be ?
GetValue
exprValue
).
3.
Let
excludedNames
be a new empty
List
4.
Perform ?
CopyDataProperties
object
fromValue
excludedNames
).
5.
Return
unused
PropertyDefinition
IdentifierReference
1.
Let
propName
be
StringValue
of
IdentifierReference
2.
Let
exprValue
be ?
Evaluation
of
IdentifierReference
3.
Let
propValue
be ?
GetValue
exprValue
).
4.
Assert
object
is an ordinary, extensible object with no non-configurable properties.
5.
Perform !
CreateDataPropertyOrThrow
object
propName
propValue
).
6.
Return
unused
PropertyDefinition
PropertyName
AssignmentExpression
1.
Let
propKey
be ?
Evaluation
of
PropertyName
2.
If this
PropertyDefinition
is contained within a
Script
that is being evaluated for JSON.parse (see step
of
JSON.parse
), then
a.
Let
isProtoSetter
be
false
3.
Else if
propKey
is
"__proto__"
and
IsComputedPropertyKey
of
PropertyName
is
false
, then
a.
Let
isProtoSetter
be
true
4.
Else,
a.
Let
isProtoSetter
be
false
5.
If
IsAnonymousFunctionDefinition
AssignmentExpression
) is
true
and
isProtoSetter
is
false
, then
a.
Let
propValue
be ?
NamedEvaluation
of
AssignmentExpression
with argument
propKey
6.
Else,
a.
Let
exprValueRef
be ?
Evaluation
of
AssignmentExpression
b.
Let
propValue
be ?
GetValue
exprValueRef
).
7.
If
isProtoSetter
is
true
, then
a.
If
propValue
is an Object
or
propValue
is
null
, then
i.
Perform !
object
.[[SetPrototypeOf]]
propValue
).
b.
Return
unused
8.
Assert
object
is an ordinary, extensible object with no non-configurable properties.
9.
Perform !
CreateDataPropertyOrThrow
object
propKey
propValue
).
10.
Return
unused
PropertyDefinition
MethodDefinition
1.
Perform ?
MethodDefinitionEvaluation
of
MethodDefinition
with arguments
object
and
true
2.
Return
unused
13.2.6
Function Defining Expressions
See
15.2
for
PrimaryExpression
FunctionExpression
See
15.5
for
PrimaryExpression
GeneratorExpression
See
15.7
for
PrimaryExpression
ClassExpression
See
15.8
for
PrimaryExpression
AsyncFunctionExpression
See
15.6
for
PrimaryExpression
AsyncGeneratorExpression
13.2.7
Regular Expression Literals
Syntax
See
12.9.5
13.2.7.1
Static Semantics: Early Errors
PrimaryExpression
RegularExpressionLiteral
It is a Syntax Error if
IsValidRegularExpressionLiteral
RegularExpressionLiteral
) is
false
13.2.7.2
Static Semantics: IsValidRegularExpressionLiteral (
literal
The abstract operation IsValidRegularExpressionLiteral takes argument
literal
(a
RegularExpressionLiteral
Parse Node
and returns a Boolean. It determines if its argument is a valid regular
expression literal. It performs the following steps when called:
1.
Let
flags
be
FlagText
of
literal
2.
If
flags
contains any code points other than
, or
, or if
flags
contains any code point more than once, return
false
3.
If
flags
contains
, let
be
true
; else let
be
false
4.
Let
patternText
be
BodyText
of
literal
5.
If
is
false
, then
a.
Let
stringValue
be
CodePointsToString
patternText
).
b.
Set
patternText
to the sequence of code points resulting from interpreting each of the 16-bit elements of
stringValue
as a Unicode BMP code point. UTF-16 decoding is not applied to the elements.
6.
Let
parseResult
be
ParsePattern
patternText
).
7.
If
parseResult
is a
Parse Node
, return
true
; else return
false
13.2.7.3
Runtime Semantics: Evaluation
PrimaryExpression
RegularExpressionLiteral
1.
Let
pattern
be
CodePointsToString
BodyText
of
RegularExpressionLiteral
).
2.
Let
flags
be
CodePointsToString
FlagText
of
RegularExpressionLiteral
).
3.
Return !
RegExpCreate
pattern
flags
).
13.2.8
Template Literals
Syntax
TemplateLiteral
[Yield, Await, Tagged]
NoSubstitutionTemplate
SubstitutionTemplate
[?Yield, ?Await, ?Tagged]
SubstitutionTemplate
[Yield, Await, Tagged]
TemplateHead
Expression
[+In, ?Yield, ?Await]
TemplateSpans
[?Yield, ?Await, ?Tagged]
TemplateSpans
[Yield, Await, Tagged]
TemplateTail
TemplateMiddleList
[?Yield, ?Await, ?Tagged]
TemplateTail
TemplateMiddleList
[Yield, Await, Tagged]
TemplateMiddle
Expression
[+In, ?Yield, ?Await]
TemplateMiddleList
[?Yield, ?Await, ?Tagged]
TemplateMiddle
Expression
[+In, ?Yield, ?Await]
13.2.8.1
Static Semantics: Early Errors
TemplateLiteral
[Yield, Await, Tagged]
NoSubstitutionTemplate
It is a Syntax Error if the
[Tagged]
parameter was not set and
NoSubstitutionTemplate
Contains
NotEscapeSequence
TemplateLiteral
[Yield, Await, Tagged]
SubstitutionTemplate
[?Yield, ?Await, ?Tagged]
It is a Syntax Error if the number of elements in the result of
TemplateStrings
of
TemplateLiteral
with argument
false
is greater than or equal to 2
32
SubstitutionTemplate
[Yield, Await, Tagged]
TemplateHead
Expression
[+In, ?Yield, ?Await]
TemplateSpans
[?Yield, ?Await, ?Tagged]
It is a Syntax Error if the
[Tagged]
parameter was not set and
TemplateHead
Contains
NotEscapeSequence
TemplateSpans
[Yield, Await, Tagged]
TemplateTail
It is a Syntax Error if the
[Tagged]
parameter was not set and
TemplateTail
Contains
NotEscapeSequence
TemplateMiddleList
[Yield, Await, Tagged]
TemplateMiddle
Expression
[+In, ?Yield, ?Await]
TemplateMiddleList
[?Yield, ?Await, ?Tagged]
TemplateMiddle
Expression
[+In, ?Yield, ?Await]
It is a Syntax Error if the
[Tagged]
parameter was not set and
TemplateMiddle
Contains
NotEscapeSequence
13.2.8.2
Static Semantics: TemplateStrings
The
syntax-directed operation
TemplateStrings takes argument
raw
(a Boolean) and returns a
List
of Strings. It is defined piecewise over the following productions:
TemplateLiteral
NoSubstitutionTemplate
1.
Return «
TemplateString
NoSubstitutionTemplate
raw
) ».
SubstitutionTemplate
TemplateHead
Expression
TemplateSpans
1.
Let
head
be «
TemplateString
TemplateHead
raw
) ».
2.
Let
tail
be
TemplateStrings
of
TemplateSpans
with argument
raw
3.
Return the
list-concatenation
of
head
and
tail
TemplateSpans
TemplateTail
1.
Return «
TemplateString
TemplateTail
raw
) ».
TemplateSpans
TemplateMiddleList
TemplateTail
1.
Let
middle
be
TemplateStrings
of
TemplateMiddleList
with argument
raw
2.
Let
tail
be «
TemplateString
TemplateTail
raw
) ».
3.
Return the
list-concatenation
of
middle
and
tail
TemplateMiddleList
TemplateMiddle
Expression
1.
Return «
TemplateString
TemplateMiddle
raw
) ».
TemplateMiddleList
TemplateMiddleList
TemplateMiddle
Expression
1.
Let
front
be
TemplateStrings
of
TemplateMiddleList
with argument
raw
2.
Let
last
be «
TemplateString
TemplateMiddle
raw
) ».
3.
Return the
list-concatenation
of
front
and
last
13.2.8.3
Static Semantics: TemplateString (
templateToken
raw
The abstract operation TemplateString takes arguments
templateToken
(a
NoSubstitutionTemplate
Parse Node
, a
TemplateHead
Parse Node
, a
TemplateMiddle
Parse Node
, or a
TemplateTail
Parse Node
) and
raw
(a Boolean) and returns a String. It performs the following steps when called:
1.
If
raw
is
true
, then
a.
Let
string
be the
TRV
of
templateToken
2.
Else,
a.
Let
string
be the
TV
of
templateToken
3.
Return
string
13.2.8.4
GetTemplateObject (
templateLiteral
The abstract operation GetTemplateObject takes argument
templateLiteral
(a
Parse Node
) and returns an Array. It performs the following steps when called:
1.
Let
realm
be
the current Realm Record
2.
Let
templateRegistry
be
realm
.[[TemplateMap]].
3.
For each element
of
templateRegistry
, do
a.
If
.[[Site]] is
the same Parse Node
as
templateLiteral
, then
i.
Return
.[[Array]].
4.
Let
rawStrings
be
TemplateStrings
of
templateLiteral
with argument
true
5.
Let
cookedStrings
be
TemplateStrings
of
templateLiteral
with argument
false
6.
Let
count
be the number of elements in the
List
cookedStrings
7.
Assert
count
≤ 2
32
- 1.
8.
Let
template
be !
ArrayCreate
count
).
9.
Let
rawObj
be !
ArrayCreate
count
).
10.
Let
index
be 0.
11.
Repeat, while
index
count
a.
Let
prop
be !
ToString
index
)).
b.
Let
cookedValue
be
cookedStrings
index
].
c.
Perform !
DefinePropertyOrThrow
template
prop
, PropertyDescriptor { [[Value]]:
cookedValue
, [[Writable]]:
false
, [[Enumerable]]:
true
, [[Configurable]]:
false
}).
d.
Let
rawValue
be the String value
rawStrings
index
].
e.
Perform !
DefinePropertyOrThrow
rawObj
prop
, PropertyDescriptor { [[Value]]:
rawValue
, [[Writable]]:
false
, [[Enumerable]]:
true
, [[Configurable]]:
false
}).
f.
Set
index
to
index
+ 1.
12.
Perform !
SetIntegrityLevel
rawObj
frozen
).
13.
Perform !
DefinePropertyOrThrow
template
"raw"
, PropertyDescriptor { [[Value]]:
rawObj
, [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
14.
Perform !
SetIntegrityLevel
template
frozen
).
15.
Append the
Record
{ [[Site]]:
templateLiteral
, [[Array]]:
template
} to
realm
.[[TemplateMap]].
16.
Return
template
Note 1
The creation of a template object cannot result in an
abrupt completion
Note 2
Each
TemplateLiteral
in the program code of a
realm
is associated with a unique template object that is used in the evaluation of tagged Templates (
13.2.8.6
).
The template objects are frozen and the same template object is used
each time a specific tagged Template is evaluated. Whether template
objects are created lazily upon first evaluation of the
TemplateLiteral
or eagerly prior to first evaluation is an implementation choice that is not observable to ECMAScript code.
Note 3
Future editions of this specification may define additional non-enumerable properties of template objects.
13.2.8.5
Runtime Semantics: SubstitutionEvaluation
The
syntax-directed operation
SubstitutionEvaluation takes no arguments and returns either a
normal completion containing
List
of
ECMAScript language values
or an
abrupt completion
. It is defined piecewise over the following productions:
TemplateSpans
TemplateTail
1.
Return a new empty
List
TemplateSpans
TemplateMiddleList
TemplateTail
1.
Return ?
SubstitutionEvaluation
of
TemplateMiddleList
TemplateMiddleList
TemplateMiddle
Expression
1.
Let
subRef
be ?
Evaluation
of
Expression
2.
Let
sub
be ?
GetValue
subRef
).
3.
Return «
sub
».
TemplateMiddleList
TemplateMiddleList
TemplateMiddle
Expression
1.
Let
preceding
be ?
SubstitutionEvaluation
of
TemplateMiddleList
2.
Let
nextRef
be ?
Evaluation
of
Expression
3.
Let
next
be ?
GetValue
nextRef
).
4.
Return the
list-concatenation
of
preceding
and «
next
».
13.2.8.6
Runtime Semantics: Evaluation
TemplateLiteral
NoSubstitutionTemplate
1.
Return the
TV
of
NoSubstitutionTemplate
as defined in
12.9.6
SubstitutionTemplate
TemplateHead
Expression
TemplateSpans
1.
Let
head
be the
TV
of
TemplateHead
as defined in
12.9.6
2.
Let
subRef
be ?
Evaluation
of
Expression
3.
Let
sub
be ?
GetValue
subRef
).
4.
Let
middle
be ?
ToString
sub
).
5.
Let
tail
be ?
Evaluation
of
TemplateSpans
6.
Return the
string-concatenation
of
head
middle
, and
tail
Note 1
The string conversion semantics applied to the
Expression
value are like
String.prototype.concat
rather than the
operator.
TemplateSpans
TemplateTail
1.
Return the
TV
of
TemplateTail
as defined in
12.9.6
TemplateSpans
TemplateMiddleList
TemplateTail
1.
Let
head
be ?
Evaluation
of
TemplateMiddleList
2.
Let
tail
be the
TV
of
TemplateTail
as defined in
12.9.6
3.
Return the
string-concatenation
of
head
and
tail
TemplateMiddleList
TemplateMiddle
Expression
1.
Let
head
be the
TV
of
TemplateMiddle
as defined in
12.9.6
2.
Let
subRef
be ?
Evaluation
of
Expression
3.
Let
sub
be ?
GetValue
subRef
).
4.
Let
middle
be ?
ToString
sub
).
5.
Return the
string-concatenation
of
head
and
middle
Note 2
The string conversion semantics applied to the
Expression
value are like
String.prototype.concat
rather than the
operator.
TemplateMiddleList
TemplateMiddleList
TemplateMiddle
Expression
1.
Let
rest
be ?
Evaluation
of
TemplateMiddleList
2.
Let
middle
be the
TV
of
TemplateMiddle
as defined in
12.9.6
3.
Let
subRef
be ?
Evaluation
of
Expression
4.
Let
sub
be ?
GetValue
subRef
).
5.
Let
last
be ?
ToString
sub
).
6.
Return the
string-concatenation
of
rest
middle
, and
last
Note 3
The string conversion semantics applied to the
Expression
value are like
String.prototype.concat
rather than the
operator.
13.2.9
The Grouping Operator
13.2.9.1
Static Semantics: Early Errors
PrimaryExpression
CoverParenthesizedExpressionAndArrowParameterList
CoverParenthesizedExpressionAndArrowParameterList
must cover
ParenthesizedExpression
13.2.9.2
Runtime Semantics: Evaluation
PrimaryExpression
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
expr
be the
ParenthesizedExpression
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return ?
Evaluation
of
expr
ParenthesizedExpression
Expression
1.
Return ?
Evaluation
of
Expression
. This may be of type Reference.
Note
This algorithm does not apply
GetValue
to
Evaluation
of
Expression
. The principal motivation for this is so that operators such as
delete
and
typeof
may be applied to parenthesized expressions.
13.3
Left-Hand-Side Expressions
Syntax
MemberExpression
[Yield, Await]
PrimaryExpression
[?Yield, ?Await]
MemberExpression
[?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
MemberExpression
[?Yield, ?Await]
IdentifierName
MemberExpression
[?Yield, ?Await]
TemplateLiteral
[?Yield, ?Await, +Tagged]
SuperProperty
[?Yield, ?Await]
MetaProperty
new
MemberExpression
[?Yield, ?Await]
Arguments
[?Yield, ?Await]
MemberExpression
[?Yield, ?Await]
PrivateIdentifier
SuperProperty
[Yield, Await]
super
Expression
[+In, ?Yield, ?Await]
super
IdentifierName
MetaProperty
NewTarget
ImportMeta
NewTarget
new
target
ImportMeta
import
meta
NewExpression
[Yield, Await]
MemberExpression
[?Yield, ?Await]
new
NewExpression
[?Yield, ?Await]
CallExpression
[Yield, Await]
CoverCallExpressionAndAsyncArrowHead
[?Yield, ?Await]
SuperCall
[?Yield, ?Await]
ImportCall
[?Yield, ?Await]
CallExpression
[?Yield, ?Await]
Arguments
[?Yield, ?Await]
CallExpression
[?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
CallExpression
[?Yield, ?Await]
IdentifierName
CallExpression
[?Yield, ?Await]
TemplateLiteral
[?Yield, ?Await, +Tagged]
CallExpression
[?Yield, ?Await]
PrivateIdentifier
SuperCall
[Yield, Await]
super
Arguments
[?Yield, ?Await]
ImportCall
[Yield, Await]
import
AssignmentExpression
[+In, ?Yield, ?Await]
Arguments
[Yield, Await]
ArgumentList
[?Yield, ?Await]
ArgumentList
[?Yield, ?Await]
ArgumentList
[Yield, Await]
AssignmentExpression
[+In, ?Yield, ?Await]
...
AssignmentExpression
[+In, ?Yield, ?Await]
ArgumentList
[?Yield, ?Await]
AssignmentExpression
[+In, ?Yield, ?Await]
ArgumentList
[?Yield, ?Await]
...
AssignmentExpression
[+In, ?Yield, ?Await]
OptionalExpression
[Yield, Await]
MemberExpression
[?Yield, ?Await]
OptionalChain
[?Yield, ?Await]
CallExpression
[?Yield, ?Await]
OptionalChain
[?Yield, ?Await]
OptionalExpression
[?Yield, ?Await]
OptionalChain
[?Yield, ?Await]
OptionalChain
[Yield, Await]
?.
Arguments
[?Yield, ?Await]
?.
Expression
[+In, ?Yield, ?Await]
?.
IdentifierName
?.
TemplateLiteral
[?Yield, ?Await, +Tagged]
?.
PrivateIdentifier
OptionalChain
[?Yield, ?Await]
Arguments
[?Yield, ?Await]
OptionalChain
[?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
OptionalChain
[?Yield, ?Await]
IdentifierName
OptionalChain
[?Yield, ?Await]
TemplateLiteral
[?Yield, ?Await, +Tagged]
OptionalChain
[?Yield, ?Await]
PrivateIdentifier
LeftHandSideExpression
[Yield, Await]
NewExpression
[?Yield, ?Await]
CallExpression
[?Yield, ?Await]
OptionalExpression
[?Yield, ?Await]
Supplemental Syntax
When processing an instance of the production
CallExpression
CoverCallExpressionAndAsyncArrowHead
the interpretation of
CoverCallExpressionAndAsyncArrowHead
is refined using the following grammar:
CallMemberExpression
[Yield, Await]
MemberExpression
[?Yield, ?Await]
Arguments
[?Yield, ?Await]
13.3.1
Static Semantics
13.3.1.1
Static Semantics: Early Errors
OptionalChain
?.
TemplateLiteral
OptionalChain
TemplateLiteral
It is a Syntax Error if any source text is matched by this production.
Note
This production exists in order to prevent automatic semicolon insertion rules (
12.10
) from being applied to the following code:
a?.
`c`
so that it would be interpreted as two valid statements.
The purpose is to maintain consistency with similar code without
optional chaining:
a.
`c`
which is a valid statement and where automatic semicolon insertion does not apply.
ImportMeta
import
meta
It is a Syntax Error if the syntactic
goal symbol
is not
Module
13.3.2
Property Accessors
Note
Properties are accessed by name, using either the dot notation:
MemberExpression
IdentifierName
CallExpression
IdentifierName
or the bracket notation:
MemberExpression
Expression
CallExpression
Expression
The dot notation is explained by the following syntactic conversion:
MemberExpression
IdentifierName
is identical in its behaviour to
MemberExpression
identifier-name-string
and similarly
CallExpression
IdentifierName
is identical in its behaviour to
CallExpression
identifier-name-string
where <
identifier-name-string
> is the result of evaluating
StringValue
of
IdentifierName
13.3.2.1
Runtime Semantics: Evaluation
MemberExpression
MemberExpression
Expression
1.
Let
baseReference
be ?
Evaluation
of
MemberExpression
2.
Let
baseValue
be ?
GetValue
baseReference
).
3.
If the
source text matched by
this
MemberExpression
is
strict mode code
, let
strict
be
true
; else let
strict
be
false
4.
Return ?
EvaluatePropertyAccessWithExpressionKey
baseValue
Expression
strict
).
MemberExpression
MemberExpression
IdentifierName
1.
Let
baseReference
be ?
Evaluation
of
MemberExpression
2.
Let
baseValue
be ?
GetValue
baseReference
).
3.
If the
source text matched by
this
MemberExpression
is
strict mode code
, let
strict
be
true
; else let
strict
be
false
4.
Return
EvaluatePropertyAccessWithIdentifierKey
baseValue
IdentifierName
strict
).
MemberExpression
MemberExpression
PrivateIdentifier
1.
Let
baseReference
be ?
Evaluation
of
MemberExpression
2.
Let
baseValue
be ?
GetValue
baseReference
).
3.
Let
fieldNameString
be the
StringValue
of
PrivateIdentifier
4.
Return
MakePrivateReference
baseValue
fieldNameString
).
CallExpression
CallExpression
Expression
1.
Let
baseReference
be ?
Evaluation
of
CallExpression
2.
Let
baseValue
be ?
GetValue
baseReference
).
3.
If the
source text matched by
this
CallExpression
is
strict mode code
, let
strict
be
true
; else let
strict
be
false
4.
Return ?
EvaluatePropertyAccessWithExpressionKey
baseValue
Expression
strict
).
CallExpression
CallExpression
IdentifierName
1.
Let
baseReference
be ?
Evaluation
of
CallExpression
2.
Let
baseValue
be ?
GetValue
baseReference
).
3.
If the
source text matched by
this
CallExpression
is
strict mode code
, let
strict
be
true
; else let
strict
be
false
4.
Return
EvaluatePropertyAccessWithIdentifierKey
baseValue
IdentifierName
strict
).
CallExpression
CallExpression
PrivateIdentifier
1.
Let
baseReference
be ?
Evaluation
of
CallExpression
2.
Let
baseValue
be ?
GetValue
baseReference
).
3.
Let
fieldNameString
be the
StringValue
of
PrivateIdentifier
4.
Return
MakePrivateReference
baseValue
fieldNameString
).
13.3.3
EvaluatePropertyAccessWithExpressionKey (
baseValue
expression
strict
The abstract operation EvaluatePropertyAccessWithExpressionKey takes arguments
baseValue
(an
ECMAScript language value
),
expression
(a
Parse Node
), and
strict
(a Boolean) and returns either a
normal completion containing
Reference Record
or an
abrupt completion
. It performs the following steps when called:
1.
Let
propertyNameReference
be ?
Evaluation
of
expression
2.
Let
propertyNameValue
be ?
GetValue
propertyNameReference
).
3.
Let
propertyKey
be ?
ToPropertyKey
propertyNameValue
).
4.
Return the
Reference Record
{ [[Base]]:
baseValue
, [[ReferencedName]]:
propertyKey
, [[Strict]]:
strict
, [[ThisValue]]:
empty
}.
13.3.4
EvaluatePropertyAccessWithIdentifierKey (
baseValue
identifierName
strict
The abstract operation EvaluatePropertyAccessWithIdentifierKey takes arguments
baseValue
(an
ECMAScript language value
),
identifierName
(an
IdentifierName
Parse Node
), and
strict
(a Boolean) and returns a
Reference Record
. It performs the following steps when called:
1.
Let
propertyNameString
be
StringValue
of
identifierName
2.
Return the
Reference Record
{ [[Base]]:
baseValue
, [[ReferencedName]]:
propertyNameString
, [[Strict]]:
strict
, [[ThisValue]]:
empty
}.
13.3.5
The
new
Operator
13.3.5.1
Runtime Semantics: Evaluation
NewExpression
new
NewExpression
1.
Return ?
EvaluateNew
NewExpression
empty
).
MemberExpression
new
MemberExpression
Arguments
1.
Return ?
EvaluateNew
MemberExpression
Arguments
).
13.3.5.1.1
EvaluateNew (
constructExpr
arguments
The abstract operation EvaluateNew takes arguments
constructExpr
(a
NewExpression
Parse Node
or a
MemberExpression
Parse Node
) and
arguments
empty
or an
Arguments
Parse Node
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
Let
ref
be ?
Evaluation
of
constructExpr
2.
Let
constructor
be ?
GetValue
ref
).
3.
If
arguments
is
empty
, let
argList
be a new empty
List
4.
Else,
a.
Let
argList
be ?
ArgumentListEvaluation
of
arguments
5.
If
IsConstructor
constructor
) is
false
, throw a
TypeError
exception.
6.
Return ?
Construct
constructor
argList
).
13.3.6
Function Calls
13.3.6.1
Runtime Semantics: Evaluation
CallExpression
CoverCallExpressionAndAsyncArrowHead
1.
Let
expr
be the
CallMemberExpression
that is
covered
by
CoverCallExpressionAndAsyncArrowHead
2.
Let
memberExpr
be the
MemberExpression
of
expr
3.
Let
arguments
be the
Arguments
of
expr
4.
Let
ref
be ?
Evaluation
of
memberExpr
5.
Let
func
be ?
GetValue
ref
).
6.
If
ref
is a
Reference Record
IsPropertyReference
ref
) is
false
, and
ref
.[[ReferencedName]] is
"eval"
, then
a.
If
SameValue
func
%eval%
) is
true
, then
i.
Let
argList
be ?
ArgumentListEvaluation
of
arguments
ii.
If
argList
has no elements, return
undefined
iii.
Let
evalArg
be the first element of
argList
iv.
If the
source text matched by
this
CallExpression
is
strict mode code
, let
strictCaller
be
true
. Otherwise let
strictCaller
be
false
v.
Return ?
PerformEval
evalArg
strictCaller
true
).
7.
Let
thisCall
be this
CallExpression
8.
Let
tailCall
be
IsInTailPosition
thisCall
).
9.
Return ?
EvaluateCall
func
ref
arguments
tailCall
).
CallExpression
evaluation that executes step
6.a.v
is a
direct eval
CallExpression
CallExpression
Arguments
1.
Let
ref
be ?
Evaluation
of
CallExpression
2.
Let
func
be ?
GetValue
ref
).
3.
Let
thisCall
be this
CallExpression
4.
Let
tailCall
be
IsInTailPosition
thisCall
).
5.
Return ?
EvaluateCall
func
ref
Arguments
tailCall
).
13.3.6.2
EvaluateCall (
func
ref
arguments
tailPosition
The abstract operation EvaluateCall takes arguments
func
(an
ECMAScript language value
),
ref
(an
ECMAScript language value
or a
Reference Record
),
arguments
(a
Parse Node
), and
tailPosition
(a Boolean) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
If
ref
is a
Reference Record
, then
a.
If
IsPropertyReference
ref
) is
true
, then
i.
Let
thisValue
be
GetThisValue
ref
).
b.
Else,
i.
Let
refEnv
be
ref
.[[Base]].
ii.
Assert
refEnv
is an
Environment Record
iii.
Let
thisValue
be
refEnv
.WithBaseObject().
2.
Else,
a.
Let
thisValue
be
undefined
3.
Let
argList
be ?
ArgumentListEvaluation
of
arguments
4.
If
func
is not an Object
, throw a
TypeError
exception.
5.
If
IsCallable
func
) is
false
, throw a
TypeError
exception.
6.
If
tailPosition
is
true
, perform
PrepareForTailCall
().
7.
Return ?
Call
func
thisValue
argList
).
13.3.7
The
super
Keyword
13.3.7.1
Runtime Semantics: Evaluation
SuperProperty
super
Expression
1.
Let
env
be
GetThisEnvironment
().
2.
Let
actualThis
be ?
env
.GetThisBinding().
3.
Let
propertyNameReference
be ?
Evaluation
of
Expression
4.
Let
propertyNameValue
be ?
GetValue
propertyNameReference
).
5.
Let
propertyKey
be ?
ToPropertyKey
propertyNameValue
).
6.
If the
source text matched by
this
SuperProperty
is
strict mode code
, let
strict
be
true
; else let
strict
be
false
7.
Return ?
MakeSuperPropertyReference
actualThis
propertyKey
strict
).
SuperProperty
super
IdentifierName
1.
Let
env
be
GetThisEnvironment
().
2.
Let
actualThis
be ?
env
.GetThisBinding().
3.
Let
propertyKey
be
StringValue
of
IdentifierName
4.
If the
source text matched by
this
SuperProperty
is
strict mode code
, let
strict
be
true
; else let
strict
be
false
5.
Return ?
MakeSuperPropertyReference
actualThis
propertyKey
strict
).
SuperCall
super
Arguments
1.
Let
newTarget
be
GetNewTarget
().
2.
Assert
newTarget
is an Object
3.
Let
func
be
GetSuperConstructor
().
4.
Let
argList
be ?
ArgumentListEvaluation
of
Arguments
5.
If
IsConstructor
func
) is
false
, throw a
TypeError
exception.
6.
Let
result
be ?
Construct
func
argList
newTarget
).
7.
Let
thisER
be
GetThisEnvironment
().
8.
Perform ?
thisER
.BindThisValue(
result
).
9.
Let
be
thisER
.[[FunctionObject]].
10.
Assert
is an ECMAScript
function object
11.
Perform ?
InitializeInstanceElements
result
).
12.
Return
result
13.3.7.2
GetSuperConstructor ( )
The abstract operation GetSuperConstructor takes no arguments and returns an
ECMAScript language value
. It performs the following steps when called:
1.
Let
envRec
be
GetThisEnvironment
().
2.
Assert
envRec
is a
Function Environment Record
3.
Let
activeFunction
be
envRec
.[[FunctionObject]].
4.
Assert
activeFunction
is an ECMAScript
function object
5.
Let
superConstructor
be !
activeFunction
.[[GetPrototypeOf]]().
6.
Return
superConstructor
13.3.7.3
MakeSuperPropertyReference (
actualThis
propertyKey
strict
The abstract operation MakeSuperPropertyReference takes arguments
actualThis
(an
ECMAScript language value
),
propertyKey
(a
property key
), and
strict
(a Boolean) and returns either a
normal completion containing
Super Reference Record
or a
throw completion
. It performs the following steps when called:
1.
Let
env
be
GetThisEnvironment
().
2.
Assert
env
.HasSuperBinding() is
true
3.
Let
baseValue
be ?
env
.GetSuperBase().
4.
Return the
Reference Record
{ [[Base]]:
baseValue
, [[ReferencedName]]:
propertyKey
, [[Strict]]:
strict
, [[ThisValue]]:
actualThis
}.
13.3.8
Argument Lists
Note
The evaluation of an argument list produces a
List
of values.
13.3.8.1
Runtime Semantics: ArgumentListEvaluation
The
syntax-directed operation
ArgumentListEvaluation takes no arguments and returns either a
normal completion containing
List
of
ECMAScript language values
or an
abrupt completion
. It is defined piecewise over the following productions:
Arguments
1.
Return a new empty
List
ArgumentList
AssignmentExpression
1.
Let
ref
be ?
Evaluation
of
AssignmentExpression
2.
Let
arg
be ?
GetValue
ref
).
3.
Return «
arg
».
ArgumentList
...
AssignmentExpression
1.
Let
list
be a new empty
List
2.
Let
spreadRef
be ?
Evaluation
of
AssignmentExpression
3.
Let
spreadObj
be ?
GetValue
spreadRef
).
4.
Let
iteratorRecord
be ?
GetIterator
spreadObj
sync
).
5.
Repeat,
a.
Let
next
be ?
IteratorStep
iteratorRecord
).
b.
If
next
is
false
, return
list
c.
Let
nextArg
be ?
IteratorValue
next
).
d.
Append
nextArg
to
list
ArgumentList
ArgumentList
AssignmentExpression
1.
Let
precedingArgs
be ?
ArgumentListEvaluation
of
ArgumentList
2.
Let
ref
be ?
Evaluation
of
AssignmentExpression
3.
Let
arg
be ?
GetValue
ref
).
4.
Return the
list-concatenation
of
precedingArgs
and «
arg
».
ArgumentList
ArgumentList
...
AssignmentExpression
1.
Let
precedingArgs
be ?
ArgumentListEvaluation
of
ArgumentList
2.
Let
spreadRef
be ?
Evaluation
of
AssignmentExpression
3.
Let
iteratorRecord
be ?
GetIterator
(?
GetValue
spreadRef
),
sync
).
4.
Repeat,
a.
Let
next
be ?
IteratorStep
iteratorRecord
).
b.
If
next
is
false
, return
precedingArgs
c.
Let
nextArg
be ?
IteratorValue
next
).
d.
Append
nextArg
to
precedingArgs
TemplateLiteral
NoSubstitutionTemplate
1.
Let
templateLiteral
be this
TemplateLiteral
2.
Let
siteObj
be
GetTemplateObject
templateLiteral
).
3.
Return «
siteObj
».
TemplateLiteral
SubstitutionTemplate
1.
Let
templateLiteral
be this
TemplateLiteral
2.
Let
siteObj
be
GetTemplateObject
templateLiteral
).
3.
Let
remaining
be ?
ArgumentListEvaluation
of
SubstitutionTemplate
4.
Return the
list-concatenation
of «
siteObj
» and
remaining
SubstitutionTemplate
TemplateHead
Expression
TemplateSpans
1.
Let
firstSubRef
be ?
Evaluation
of
Expression
2.
Let
firstSub
be ?
GetValue
firstSubRef
).
3.
Let
restSub
be ?
SubstitutionEvaluation
of
TemplateSpans
4.
Assert
restSub
is a possibly empty
List
5.
Return the
list-concatenation
of «
firstSub
» and
restSub
13.3.9
Optional Chains
Note
An optional chain is a chain of one or more property accesses and function calls, the first of which begins with the token
?.
13.3.9.1
Runtime Semantics: Evaluation
OptionalExpression
MemberExpression
OptionalChain
1.
Let
baseReference
be ?
Evaluation
of
MemberExpression
2.
Let
baseValue
be ?
GetValue
baseReference
).
3.
If
baseValue
is either
undefined
or
null
, then
a.
Return
undefined
4.
Return ?
ChainEvaluation
of
OptionalChain
with arguments
baseValue
and
baseReference
OptionalExpression
CallExpression
OptionalChain
1.
Let
baseReference
be ?
Evaluation
of
CallExpression
2.
Let
baseValue
be ?
GetValue
baseReference
).
3.
If
baseValue
is either
undefined
or
null
, then
a.
Return
undefined
4.
Return ?
ChainEvaluation
of
OptionalChain
with arguments
baseValue
and
baseReference
OptionalExpression
OptionalExpression
OptionalChain
1.
Let
baseReference
be ?
Evaluation
of
OptionalExpression
2.
Let
baseValue
be ?
GetValue
baseReference
).
3.
If
baseValue
is either
undefined
or
null
, then
a.
Return
undefined
4.
Return ?
ChainEvaluation
of
OptionalChain
with arguments
baseValue
and
baseReference
13.3.9.2
Runtime Semantics: ChainEvaluation
The
syntax-directed operation
ChainEvaluation takes arguments
baseValue
(an
ECMAScript language value
) and
baseReference
(an
ECMAScript language value
or a
Reference Record
) and returns either a
normal completion containing
either an
ECMAScript language value
or a
Reference Record
, or an
abrupt completion
. It is defined piecewise over the following productions:
OptionalChain
?.
Arguments
1.
Let
thisChain
be this
OptionalChain
2.
Let
tailCall
be
IsInTailPosition
thisChain
).
3.
Return ?
EvaluateCall
baseValue
baseReference
Arguments
tailCall
).
OptionalChain
?.
Expression
1.
If the
source text matched by
this
OptionalChain
is
strict mode code
, let
strict
be
true
; else let
strict
be
false
2.
Return ?
EvaluatePropertyAccessWithExpressionKey
baseValue
Expression
strict
).
OptionalChain
?.
IdentifierName
1.
If the
source text matched by
this
OptionalChain
is
strict mode code
, let
strict
be
true
; else let
strict
be
false
2.
Return
EvaluatePropertyAccessWithIdentifierKey
baseValue
IdentifierName
strict
).
OptionalChain
?.
PrivateIdentifier
1.
Let
fieldNameString
be the
StringValue
of
PrivateIdentifier
2.
Return
MakePrivateReference
baseValue
fieldNameString
).
OptionalChain
OptionalChain
Arguments
1.
Let
optionalChain
be
OptionalChain
2.
Let
newReference
be ?
ChainEvaluation
of
optionalChain
with arguments
baseValue
and
baseReference
3.
Let
newValue
be ?
GetValue
newReference
).
4.
Let
thisChain
be this
OptionalChain
5.
Let
tailCall
be
IsInTailPosition
thisChain
).
6.
Return ?
EvaluateCall
newValue
newReference
Arguments
tailCall
).
OptionalChain
OptionalChain
Expression
1.
Let
optionalChain
be
OptionalChain
2.
Let
newReference
be ?
ChainEvaluation
of
optionalChain
with arguments
baseValue
and
baseReference
3.
Let
newValue
be ?
GetValue
newReference
).
4.
If the
source text matched by
this
OptionalChain
is
strict mode code
, let
strict
be
true
; else let
strict
be
false
5.
Return ?
EvaluatePropertyAccessWithExpressionKey
newValue
Expression
strict
).
OptionalChain
OptionalChain
IdentifierName
1.
Let
optionalChain
be
OptionalChain
2.
Let
newReference
be ?
ChainEvaluation
of
optionalChain
with arguments
baseValue
and
baseReference
3.
Let
newValue
be ?
GetValue
newReference
).
4.
If the
source text matched by
this
OptionalChain
is
strict mode code
, let
strict
be
true
; else let
strict
be
false
5.
Return
EvaluatePropertyAccessWithIdentifierKey
newValue
IdentifierName
strict
).
OptionalChain
OptionalChain
PrivateIdentifier
1.
Let
optionalChain
be
OptionalChain
2.
Let
newReference
be ?
ChainEvaluation
of
optionalChain
with arguments
baseValue
and
baseReference
3.
Let
newValue
be ?
GetValue
newReference
).
4.
Let
fieldNameString
be the
StringValue
of
PrivateIdentifier
5.
Return
MakePrivateReference
newValue
fieldNameString
).
13.3.10
Import Calls
13.3.10.1
Runtime Semantics: Evaluation
ImportCall
import
AssignmentExpression
1.
Let
referrer
be
GetActiveScriptOrModule
().
2.
If
referrer
is
null
, set
referrer
to
the current Realm Record
3.
Let
argRef
be ?
Evaluation
of
AssignmentExpression
4.
Let
specifier
be ?
GetValue
argRef
).
5.
Let
promiseCapability
be !
NewPromiseCapability
%Promise%
).
6.
Let
specifierString
be
Completion
ToString
specifier
)).
7.
IfAbruptRejectPromise
specifierString
promiseCapability
).
8.
Perform
HostLoadImportedModule
referrer
specifierString
empty
promiseCapability
).
9.
Return
promiseCapability
.[[Promise]].
13.3.10.1.1
ContinueDynamicImport (
promiseCapability
moduleCompletion
The abstract operation ContinueDynamicImport takes arguments
promiseCapability
(a
PromiseCapability Record
) and
moduleCompletion
(either a
normal completion containing
Module Record
or a
throw completion
) and returns
unused
. It completes the process of a dynamic import originally started by an
import()
call, resolving or rejecting the promise returned by that call as appropriate. It performs the following steps when called:
1.
If
moduleCompletion
is an
abrupt completion
, then
a.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, «
moduleCompletion
.[[Value]] »).
b.
Return
unused
2.
Let
module
be
moduleCompletion
.[[Value]].
3.
Let
loadPromise
be
module
.LoadRequestedModules().
4.
Let
rejectedClosure
be a new
Abstract Closure
with parameters (
reason
) that captures
promiseCapability
and performs the following steps when called:
a.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, «
reason
»).
b.
Return
unused
5.
Let
onRejected
be
CreateBuiltinFunction
rejectedClosure
, 1,
""
, « »).
6.
Let
linkAndEvaluateClosure
be a new
Abstract Closure
with no parameters that captures
module
promiseCapability
, and
onRejected
and performs the following steps when called:
a.
Let
link
be
Completion
module
.Link()).
b.
If
link
is an
abrupt completion
, then
i.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, «
link
.[[Value]] »).
ii.
Return
unused
c.
Let
evaluatePromise
be
module
.Evaluate().
d.
Let
fulfilledClosure
be a new
Abstract Closure
with no parameters that captures
module
and
promiseCapability
and performs the following steps when called:
i.
Let
namespace
be
GetModuleNamespace
module
).
ii.
Perform !
Call
promiseCapability
.[[Resolve]],
undefined
, «
namespace
»).
iii.
Return
unused
e.
Let
onFulfilled
be
CreateBuiltinFunction
fulfilledClosure
, 0,
""
, « »).
f.
Perform
PerformPromiseThen
evaluatePromise
onFulfilled
onRejected
).
g.
Return
unused
7.
Let
linkAndEvaluate
be
CreateBuiltinFunction
linkAndEvaluateClosure
, 0,
""
, « »).
8.
Perform
PerformPromiseThen
loadPromise
linkAndEvaluate
onRejected
).
9.
Return
unused
13.3.11
Tagged Templates
Note
A tagged template is a function call where the arguments of the call are derived from a
TemplateLiteral
13.2.8
). The actual arguments include a template object (
13.2.8.4
) and the values produced by evaluating the expressions embedded within the
TemplateLiteral
13.3.11.1
Runtime Semantics: Evaluation
MemberExpression
MemberExpression
TemplateLiteral
1.
Let
tagRef
be ?
Evaluation
of
MemberExpression
2.
Let
tagFunc
be ?
GetValue
tagRef
).
3.
Let
thisCall
be this
MemberExpression
4.
Let
tailCall
be
IsInTailPosition
thisCall
).
5.
Return ?
EvaluateCall
tagFunc
tagRef
TemplateLiteral
tailCall
).
CallExpression
CallExpression
TemplateLiteral
1.
Let
tagRef
be ?
Evaluation
of
CallExpression
2.
Let
tagFunc
be ?
GetValue
tagRef
).
3.
Let
thisCall
be this
CallExpression
4.
Let
tailCall
be
IsInTailPosition
thisCall
).
5.
Return ?
EvaluateCall
tagFunc
tagRef
TemplateLiteral
tailCall
).
13.3.12
Meta Properties
13.3.12.1
Runtime Semantics: Evaluation
NewTarget
new
target
1.
Return
GetNewTarget
().
ImportMeta
import
meta
1.
Let
module
be
GetActiveScriptOrModule
().
2.
Assert
module
is a
Source Text Module Record
3.
Let
importMeta
be
module
.[[ImportMeta]].
4.
If
importMeta
is
empty
, then
a.
Set
importMeta
to
OrdinaryObjectCreate
null
).
b.
Let
importMetaValues
be
HostGetImportMetaProperties
module
).
c.
For each
Record
{ [[Key]], [[Value]] }
of
importMetaValues
, do
i.
Perform !
CreateDataPropertyOrThrow
importMeta
.[[Key]],
.[[Value]]).
d.
Perform
HostFinalizeImportMeta
importMeta
module
).
e.
Set
module
.[[ImportMeta]] to
importMeta
f.
Return
importMeta
5.
Else,
a.
Assert
importMeta
is an Object
b.
Return
importMeta
13.3.12.1.1
HostGetImportMetaProperties (
moduleRecord
The
host-defined
abstract operation HostGetImportMetaProperties takes argument
moduleRecord
(a
Module Record
) and returns a
List
of
Records
with fields [[Key]] (a
property key
) and [[Value]] (an
ECMAScript language value
). It allows
hosts
to provide
property keys
and values for the object returned from
import.meta
An implementation of HostGetImportMetaProperties must conform to the following requirements:
It must return a
List
whose values are all
Records
with two fields, [[Key]] and [[Value]].
Each such
Record
's [[Key]] field must be a
property key
, i.e.,
IsPropertyKey
must return
true
when applied to it.
Each such
Record
's [[Value]] field must be an
ECMAScript language value
The default implementation of HostGetImportMetaProperties is to return a new empty
List
13.3.12.1.2
HostFinalizeImportMeta (
importMeta
moduleRecord
The
host-defined
abstract operation HostFinalizeImportMeta takes arguments
importMeta
(an Object) and
moduleRecord
(a
Module Record
) and returns
unused
. It allows
hosts
to perform any extraordinary operations to prepare the object returned from
import.meta
Most
hosts
will be able to simply define
HostGetImportMetaProperties
, and leave HostFinalizeImportMeta with its default behaviour. However, HostFinalizeImportMeta provides an "escape hatch" for
hosts
which need to directly manipulate the object before it is exposed to ECMAScript code.
An implementation of HostFinalizeImportMeta must conform to the following requirements:
It must return
unused
The default implementation of HostFinalizeImportMeta is to return
unused
13.4
Update Expressions
Syntax
UpdateExpression
[Yield, Await]
LeftHandSideExpression
[?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
[no
LineTerminator
here]
++
LeftHandSideExpression
[?Yield, ?Await]
[no
LineTerminator
here]
--
++
UnaryExpression
[?Yield, ?Await]
--
UnaryExpression
[?Yield, ?Await]
13.4.1
Static Semantics: Early Errors
UpdateExpression
LeftHandSideExpression
++
LeftHandSideExpression
--
It is an early Syntax Error if
AssignmentTargetType
of
LeftHandSideExpression
is not
simple
UpdateExpression
++
UnaryExpression
--
UnaryExpression
It is an early Syntax Error if
AssignmentTargetType
of
UnaryExpression
is not
simple
13.4.2
Postfix Increment Operator
13.4.2.1
Runtime Semantics: Evaluation
UpdateExpression
LeftHandSideExpression
++
1.
Let
lhs
be ?
Evaluation
of
LeftHandSideExpression
2.
Let
oldValue
be ?
ToNumeric
(?
GetValue
lhs
)).
3.
If
oldValue
is a Number
, then
a.
Let
newValue
be
Number::add
oldValue
).
4.
Else,
a.
Assert
oldValue
is a BigInt
b.
Let
newValue
be
BigInt::add
oldValue
).
5.
Perform ?
PutValue
lhs
newValue
).
6.
Return
oldValue
13.4.3
Postfix Decrement Operator
13.4.3.1
Runtime Semantics: Evaluation
UpdateExpression
LeftHandSideExpression
--
1.
Let
lhs
be ?
Evaluation
of
LeftHandSideExpression
2.
Let
oldValue
be ?
ToNumeric
(?
GetValue
lhs
)).
3.
If
oldValue
is a Number
, then
a.
Let
newValue
be
Number::subtract
oldValue
).
4.
Else,
a.
Assert
oldValue
is a BigInt
b.
Let
newValue
be
BigInt::subtract
oldValue
).
5.
Perform ?
PutValue
lhs
newValue
).
6.
Return
oldValue
13.4.4
Prefix Increment Operator
13.4.4.1
Runtime Semantics: Evaluation
UpdateExpression
++
UnaryExpression
1.
Let
expr
be ?
Evaluation
of
UnaryExpression
2.
Let
oldValue
be ?
ToNumeric
(?
GetValue
expr
)).
3.
If
oldValue
is a Number
, then
a.
Let
newValue
be
Number::add
oldValue
).
4.
Else,
a.
Assert
oldValue
is a BigInt
b.
Let
newValue
be
BigInt::add
oldValue
).
5.
Perform ?
PutValue
expr
newValue
).
6.
Return
newValue
13.4.5
Prefix Decrement Operator
13.4.5.1
Runtime Semantics: Evaluation
UpdateExpression
--
UnaryExpression
1.
Let
expr
be ?
Evaluation
of
UnaryExpression
2.
Let
oldValue
be ?
ToNumeric
(?
GetValue
expr
)).
3.
If
oldValue
is a Number
, then
a.
Let
newValue
be
Number::subtract
oldValue
).
4.
Else,
a.
Assert
oldValue
is a BigInt
b.
Let
newValue
be
BigInt::subtract
oldValue
).
5.
Perform ?
PutValue
expr
newValue
).
6.
Return
newValue
13.5
Unary Operators
Syntax
UnaryExpression
[Yield, Await]
UpdateExpression
[?Yield, ?Await]
delete
UnaryExpression
[?Yield, ?Await]
void
UnaryExpression
[?Yield, ?Await]
typeof
UnaryExpression
[?Yield, ?Await]
UnaryExpression
[?Yield, ?Await]
UnaryExpression
[?Yield, ?Await]
UnaryExpression
[?Yield, ?Await]
UnaryExpression
[?Yield, ?Await]
[+Await]
AwaitExpression
[?Yield]
13.5.1
The
delete
Operator
13.5.1.1
Static Semantics: Early Errors
UnaryExpression
delete
UnaryExpression
It is a Syntax Error if the
UnaryExpression
is contained in
strict mode code
and the derived
UnaryExpression
is
PrimaryExpression
IdentifierReference
MemberExpression
MemberExpression
PrivateIdentifier
CallExpression
CallExpression
PrivateIdentifier
OptionalChain
?.
PrivateIdentifier
, or
OptionalChain
OptionalChain
PrivateIdentifier
It is a Syntax Error if the derived
UnaryExpression
is
PrimaryExpression
CoverParenthesizedExpressionAndArrowParameterList
and
CoverParenthesizedExpressionAndArrowParameterList
ultimately derives a phrase that, if used in place of
UnaryExpression
, would produce a Syntax Error according to these rules. This rule is recursively applied.
Note
The last rule means that expressions such as
delete (((foo)))
produce
early errors
because of recursive application of the first rule.
13.5.1.2
Runtime Semantics: Evaluation
UnaryExpression
delete
UnaryExpression
1.
Let
ref
be ?
Evaluation
of
UnaryExpression
2.
If
ref
is not a
Reference Record
, return
true
3.
If
IsUnresolvableReference
ref
) is
true
, then
a.
Assert
ref
.[[Strict]] is
false
b.
Return
true
4.
If
IsPropertyReference
ref
) is
true
, then
a.
Assert
IsPrivateReference
ref
) is
false
b.
If
IsSuperReference
ref
) is
true
, throw a
ReferenceError
exception.
c.
Let
baseObj
be ?
ToObject
ref
.[[Base]]).
d.
Let
deleteStatus
be ?
baseObj
.[[Delete]]
ref
.[[ReferencedName]]).
e.
If
deleteStatus
is
false
and
ref
.[[Strict]] is
true
, throw a
TypeError
exception.
f.
Return
deleteStatus
5.
Else,
a.
Let
base
be
ref
.[[Base]].
b.
Assert
base
is an
Environment Record
c.
Return ?
base
.DeleteBinding
ref
.[[ReferencedName]]).
Note 1
When a
delete
operator occurs within
strict mode code
, a
SyntaxError
exception is thrown if its
UnaryExpression
is a direct reference to a variable, function argument, or function name. In addition, if a
delete
operator occurs within
strict mode code
and the property to be deleted has the attribute { [[Configurable]]:
false
} (or otherwise cannot be deleted), a
TypeError
exception is thrown.
Note 2
The object that may be created in step
4.c
is not accessible outside of the above abstract operation and the
ordinary object
[[Delete]] internal method. An implementation might choose to avoid the actual creation of that object.
13.5.2
The
void
Operator
13.5.2.1
Runtime Semantics: Evaluation
UnaryExpression
void
UnaryExpression
1.
Let
expr
be ?
Evaluation
of
UnaryExpression
2.
Perform ?
GetValue
expr
).
3.
Return
undefined
Note
GetValue
must be called even though its value is not used because it may have observable side-effects.
13.5.3
The
typeof
Operator
13.5.3.1
Runtime Semantics: Evaluation
UnaryExpression
typeof
UnaryExpression
1.
Let
val
be ?
Evaluation
of
UnaryExpression
2.
If
val
is a
Reference Record
, then
a.
If
IsUnresolvableReference
val
) is
true
, return
"undefined"
3.
Set
val
to ?
GetValue
val
).
4.
If
val
is
undefined
, return
"undefined"
5.
If
val
is
null
, return
"object"
6.
If
val
is a String
, return
"string"
7.
If
val
is a Symbol
, return
"symbol"
8.
If
val
is a Boolean
, return
"boolean"
9.
If
val
is a Number
, return
"number"
10.
If
val
is a BigInt
, return
"bigint"
11.
Assert
val
is an Object
12.
NOTE: This step is replaced in section
B.3.6.3
13.
If
val
has a [[Call]] internal slot, return
"function"
14.
Return
"object"
13.5.4
Unary
Operator
Note
The unary + operator converts its operand to
Number type
13.5.4.1
Runtime Semantics: Evaluation
UnaryExpression
UnaryExpression
1.
Let
expr
be ?
Evaluation
of
UnaryExpression
2.
Return ?
ToNumber
(?
GetValue
expr
)).
13.5.5
Unary
Operator
Note
The unary
operator converts its operand to a numeric value and then negates it. Negating
+0
produces
-0
, and negating
-0
produces
+0
13.5.5.1
Runtime Semantics: Evaluation
UnaryExpression
UnaryExpression
1.
Let
expr
be ?
Evaluation
of
UnaryExpression
2.
Let
oldValue
be ?
ToNumeric
(?
GetValue
expr
)).
3.
If
oldValue
is a Number
, then
a.
Return
Number::unaryMinus
oldValue
).
4.
Else,
a.
Assert
oldValue
is a BigInt
b.
Return
BigInt::unaryMinus
oldValue
).
13.5.6
Bitwise NOT Operator (
13.5.6.1
Runtime Semantics: Evaluation
UnaryExpression
UnaryExpression
1.
Let
expr
be ?
Evaluation
of
UnaryExpression
2.
Let
oldValue
be ?
ToNumeric
(?
GetValue
expr
)).
3.
If
oldValue
is a Number
, then
a.
Return
Number::bitwiseNOT
oldValue
).
4.
Else,
a.
Assert
oldValue
is a BigInt
b.
Return
BigInt::bitwiseNOT
oldValue
).
13.5.7
Logical NOT Operator (
13.5.7.1
Runtime Semantics: Evaluation
UnaryExpression
UnaryExpression
1.
Let
expr
be ?
Evaluation
of
UnaryExpression
2.
Let
oldValue
be
ToBoolean
(?
GetValue
expr
)).
3.
If
oldValue
is
true
, return
false
4.
Return
true
13.6
Exponentiation Operator
Syntax
ExponentiationExpression
[Yield, Await]
UnaryExpression
[?Yield, ?Await]
UpdateExpression
[?Yield, ?Await]
**
ExponentiationExpression
[?Yield, ?Await]
13.6.1
Runtime Semantics: Evaluation
ExponentiationExpression
UpdateExpression
**
ExponentiationExpression
1.
Return ?
EvaluateStringOrNumericBinaryExpression
UpdateExpression
**
ExponentiationExpression
).
13.7
Multiplicative Operators
Syntax
MultiplicativeExpression
[Yield, Await]
ExponentiationExpression
[?Yield, ?Await]
MultiplicativeExpression
[?Yield, ?Await]
MultiplicativeOperator
ExponentiationExpression
[?Yield, ?Await]
MultiplicativeOperator
one of
Note
The
operator performs multiplication, producing the product of its operands.
The
operator performs division, producing the quotient of its operands.
The
operator yields the remainder of its operands from an implied division.
13.7.1
Runtime Semantics: Evaluation
MultiplicativeExpression
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
1.
Let
opText
be the
source text matched by
MultiplicativeOperator
2.
Return ?
EvaluateStringOrNumericBinaryExpression
MultiplicativeExpression
opText
ExponentiationExpression
).
13.8
Additive Operators
Syntax
AdditiveExpression
[Yield, Await]
MultiplicativeExpression
[?Yield, ?Await]
AdditiveExpression
[?Yield, ?Await]
MultiplicativeExpression
[?Yield, ?Await]
AdditiveExpression
[?Yield, ?Await]
MultiplicativeExpression
[?Yield, ?Await]
13.8.1
The Addition Operator (
Note
The addition operator either performs string concatenation or numeric addition.
13.8.1.1
Runtime Semantics: Evaluation
AdditiveExpression
AdditiveExpression
MultiplicativeExpression
1.
Return ?
EvaluateStringOrNumericBinaryExpression
AdditiveExpression
MultiplicativeExpression
).
13.8.2
The Subtraction Operator (
Note
The
operator performs subtraction, producing the difference of its operands.
13.8.2.1
Runtime Semantics: Evaluation
AdditiveExpression
AdditiveExpression
MultiplicativeExpression
1.
Return ?
EvaluateStringOrNumericBinaryExpression
AdditiveExpression
MultiplicativeExpression
).
13.9
Bitwise Shift Operators
Syntax
ShiftExpression
[Yield, Await]
AdditiveExpression
[?Yield, ?Await]
ShiftExpression
[?Yield, ?Await]
<<
AdditiveExpression
[?Yield, ?Await]
ShiftExpression
[?Yield, ?Await]
>>
AdditiveExpression
[?Yield, ?Await]
ShiftExpression
[?Yield, ?Await]
>>>
AdditiveExpression
[?Yield, ?Await]
13.9.1
The Left Shift Operator (
<<
Note
Performs a bitwise left shift operation on the left operand by the amount specified by the right operand.
13.9.1.1
Runtime Semantics: Evaluation
ShiftExpression
ShiftExpression
<<
AdditiveExpression
1.
Return ?
EvaluateStringOrNumericBinaryExpression
ShiftExpression
<<
AdditiveExpression
).
13.9.2
The Signed Right Shift Operator (
>>
Note
Performs a sign-filling bitwise right shift operation on the left operand by the amount specified by the right operand.
13.9.2.1
Runtime Semantics: Evaluation
ShiftExpression
ShiftExpression
>>
AdditiveExpression
1.
Return ?
EvaluateStringOrNumericBinaryExpression
ShiftExpression
>>
AdditiveExpression
).
13.9.3
The Unsigned Right Shift Operator (
>>>
Note
Performs a zero-filling bitwise right shift operation on the left operand by the amount specified by the right operand.
13.9.3.1
Runtime Semantics: Evaluation
ShiftExpression
ShiftExpression
>>>
AdditiveExpression
1.
Return ?
EvaluateStringOrNumericBinaryExpression
ShiftExpression
>>>
AdditiveExpression
).
13.10
Relational Operators
Note 1
The result of evaluating a relational operator is always of
type Boolean, reflecting whether the relationship named by the operator
holds between its two operands.
Syntax
RelationalExpression
[In, Yield, Await]
ShiftExpression
[?Yield, ?Await]
RelationalExpression
[?In, ?Yield, ?Await]
ShiftExpression
[?Yield, ?Await]
RelationalExpression
[?In, ?Yield, ?Await]
ShiftExpression
[?Yield, ?Await]
RelationalExpression
[?In, ?Yield, ?Await]
<=
ShiftExpression
[?Yield, ?Await]
RelationalExpression
[?In, ?Yield, ?Await]
>=
ShiftExpression
[?Yield, ?Await]
RelationalExpression
[?In, ?Yield, ?Await]
instanceof
ShiftExpression
[?Yield, ?Await]
[+In]
RelationalExpression
[+In, ?Yield, ?Await]
in
ShiftExpression
[?Yield, ?Await]
[+In]
PrivateIdentifier
in
ShiftExpression
[?Yield, ?Await]
Note 2
The
[In]
grammar parameter is needed to avoid confusing the
in
operator in a relational expression with the
in
operator in a
for
statement.
13.10.1
Runtime Semantics: Evaluation
RelationalExpression
RelationalExpression
ShiftExpression
1.
Let
lref
be ?
Evaluation
of
RelationalExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
ShiftExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Let
be ?
IsLessThan
lval
rval
true
).
6.
If
is
undefined
, return
false
. Otherwise, return
RelationalExpression
RelationalExpression
ShiftExpression
1.
Let
lref
be ?
Evaluation
of
RelationalExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
ShiftExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Let
be ?
IsLessThan
rval
lval
false
).
6.
If
is
undefined
, return
false
. Otherwise, return
RelationalExpression
RelationalExpression
<=
ShiftExpression
1.
Let
lref
be ?
Evaluation
of
RelationalExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
ShiftExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Let
be ?
IsLessThan
rval
lval
false
).
6.
If
is either
true
or
undefined
, return
false
. Otherwise, return
true
RelationalExpression
RelationalExpression
>=
ShiftExpression
1.
Let
lref
be ?
Evaluation
of
RelationalExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
ShiftExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Let
be ?
IsLessThan
lval
rval
true
).
6.
If
is either
true
or
undefined
, return
false
. Otherwise, return
true
RelationalExpression
RelationalExpression
instanceof
ShiftExpression
1.
Let
lref
be ?
Evaluation
of
RelationalExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
ShiftExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Return ?
InstanceofOperator
lval
rval
).
RelationalExpression
RelationalExpression
in
ShiftExpression
1.
Let
lref
be ?
Evaluation
of
RelationalExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
ShiftExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
If
rval
is not an Object
, throw a
TypeError
exception.
6.
Return ?
HasProperty
rval
, ?
ToPropertyKey
lval
)).
RelationalExpression
PrivateIdentifier
in
ShiftExpression
1.
Let
privateIdentifier
be the
StringValue
of
PrivateIdentifier
2.
Let
rref
be ?
Evaluation
of
ShiftExpression
3.
Let
rval
be ?
GetValue
rref
).
4.
If
rval
is not an Object
, throw a
TypeError
exception.
5.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
6.
Let
privateName
be
ResolvePrivateIdentifier
privateEnv
privateIdentifier
).
7.
If
PrivateElementFind
rval
privateName
) is not
empty
, return
true
8.
Return
false
13.10.2
InstanceofOperator (
target
The abstract operation InstanceofOperator takes arguments
(an
ECMAScript language value
) and
target
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It implements the generic algorithm for determining if
is an instance of
target
either by consulting
target
's
@@hasInstance
method or, if absent, determining whether the value of
target
's
"prototype"
property is present in
's prototype chain. It performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Let
instOfHandler
be ?
GetMethod
target
@@hasInstance
).
3.
If
instOfHandler
is not
undefined
, then
a.
Return
ToBoolean
(?
Call
instOfHandler
target
, «
»)).
4.
If
IsCallable
target
) is
false
, throw a
TypeError
exception.
5.
Return ?
OrdinaryHasInstance
target
).
Note
Steps
and
provide compatibility with previous editions of ECMAScript that did not use a
@@hasInstance
method to define the
instanceof
operator semantics. If an object does not define or inherit
@@hasInstance
it uses the default
instanceof
semantics.
13.11
Equality Operators
Note
The result of evaluating an equality operator is always of type
Boolean, reflecting whether the relationship named by the operator
holds between its two operands.
Syntax
EqualityExpression
[In, Yield, Await]
RelationalExpression
[?In, ?Yield, ?Await]
EqualityExpression
[?In, ?Yield, ?Await]
==
RelationalExpression
[?In, ?Yield, ?Await]
EqualityExpression
[?In, ?Yield, ?Await]
!=
RelationalExpression
[?In, ?Yield, ?Await]
EqualityExpression
[?In, ?Yield, ?Await]
===
RelationalExpression
[?In, ?Yield, ?Await]
EqualityExpression
[?In, ?Yield, ?Await]
!==
RelationalExpression
[?In, ?Yield, ?Await]
13.11.1
Runtime Semantics: Evaluation
EqualityExpression
EqualityExpression
==
RelationalExpression
1.
Let
lref
be ?
Evaluation
of
EqualityExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
RelationalExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Return ?
IsLooselyEqual
rval
lval
).
EqualityExpression
EqualityExpression
!=
RelationalExpression
1.
Let
lref
be ?
Evaluation
of
EqualityExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
RelationalExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Let
be ?
IsLooselyEqual
rval
lval
).
6.
If
is
true
, return
false
. Otherwise, return
true
EqualityExpression
EqualityExpression
===
RelationalExpression
1.
Let
lref
be ?
Evaluation
of
EqualityExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
RelationalExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Return
IsStrictlyEqual
rval
lval
).
EqualityExpression
EqualityExpression
!==
RelationalExpression
1.
Let
lref
be ?
Evaluation
of
EqualityExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
RelationalExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Let
be
IsStrictlyEqual
rval
lval
).
6.
If
is
true
, return
false
. Otherwise, return
true
Note 1
Given the above definition of equality:
String comparison can be forced by:
`${a}` == `${b}`
Numeric comparison can be forced by:
+a == +b
Boolean comparison can be forced by:
!a == !b
Note 2
The equality operators maintain the following invariants:
A != B
is equivalent to
!(A == B)
A == B
is equivalent to
B == A
, except in the order of evaluation of
and
Note 3
The equality operator is not always transitive. For example,
there might be two distinct String objects, each representing the same
String value; each String object would be considered equal to the String
value by the
==
operator, but the two String objects would not be equal to each other. For example:
new String("a") == "a"
and
"a" == new String("a")
are both
true
new String("a") == new String("a")
is
false
Note 4
Comparison of Strings uses a simple equality test on
sequences of code unit values. There is no attempt to use the more
complex, semantically oriented definitions of character or string
equality and collating order defined in the Unicode specification.
Therefore Strings values that are canonically equal according to the
Unicode Standard could test as unequal. In effect this algorithm assumes
that both Strings are already in normalized form.
13.12
Binary Bitwise Operators
Syntax
BitwiseANDExpression
[In, Yield, Await]
EqualityExpression
[?In, ?Yield, ?Await]
BitwiseANDExpression
[?In, ?Yield, ?Await]
EqualityExpression
[?In, ?Yield, ?Await]
BitwiseXORExpression
[In, Yield, Await]
BitwiseANDExpression
[?In, ?Yield, ?Await]
BitwiseXORExpression
[?In, ?Yield, ?Await]
BitwiseANDExpression
[?In, ?Yield, ?Await]
BitwiseORExpression
[In, Yield, Await]
BitwiseXORExpression
[?In, ?Yield, ?Await]
BitwiseORExpression
[?In, ?Yield, ?Await]
BitwiseXORExpression
[?In, ?Yield, ?Await]
13.12.1
Runtime Semantics: Evaluation
BitwiseANDExpression
BitwiseANDExpression
EqualityExpression
1.
Return ?
EvaluateStringOrNumericBinaryExpression
BitwiseANDExpression
EqualityExpression
).
BitwiseXORExpression
BitwiseXORExpression
BitwiseANDExpression
1.
Return ?
EvaluateStringOrNumericBinaryExpression
BitwiseXORExpression
BitwiseANDExpression
).
BitwiseORExpression
BitwiseORExpression
BitwiseXORExpression
1.
Return ?
EvaluateStringOrNumericBinaryExpression
BitwiseORExpression
BitwiseXORExpression
).
13.13
Binary Logical Operators
Syntax
LogicalANDExpression
[In, Yield, Await]
BitwiseORExpression
[?In, ?Yield, ?Await]
LogicalANDExpression
[?In, ?Yield, ?Await]
&&
BitwiseORExpression
[?In, ?Yield, ?Await]
LogicalORExpression
[In, Yield, Await]
LogicalANDExpression
[?In, ?Yield, ?Await]
LogicalORExpression
[?In, ?Yield, ?Await]
||
LogicalANDExpression
[?In, ?Yield, ?Await]
CoalesceExpression
[In, Yield, Await]
CoalesceExpressionHead
[?In, ?Yield, ?Await]
??
BitwiseORExpression
[?In, ?Yield, ?Await]
CoalesceExpressionHead
[In, Yield, Await]
CoalesceExpression
[?In, ?Yield, ?Await]
BitwiseORExpression
[?In, ?Yield, ?Await]
ShortCircuitExpression
[In, Yield, Await]
LogicalORExpression
[?In, ?Yield, ?Await]
CoalesceExpression
[?In, ?Yield, ?Await]
Note
The value produced by a
&&
or
||
operator is not necessarily of type Boolean. The value produced will always be the value of one of the two operand expressions.
13.13.1
Runtime Semantics: Evaluation
LogicalANDExpression
LogicalANDExpression
&&
BitwiseORExpression
1.
Let
lref
be ?
Evaluation
of
LogicalANDExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
lbool
be
ToBoolean
lval
).
4.
If
lbool
is
false
, return
lval
5.
Let
rref
be ?
Evaluation
of
BitwiseORExpression
6.
Return ?
GetValue
rref
).
LogicalORExpression
LogicalORExpression
||
LogicalANDExpression
1.
Let
lref
be ?
Evaluation
of
LogicalORExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
lbool
be
ToBoolean
lval
).
4.
If
lbool
is
true
, return
lval
5.
Let
rref
be ?
Evaluation
of
LogicalANDExpression
6.
Return ?
GetValue
rref
).
CoalesceExpression
CoalesceExpressionHead
??
BitwiseORExpression
1.
Let
lref
be ?
Evaluation
of
CoalesceExpressionHead
2.
Let
lval
be ?
GetValue
lref
).
3.
If
lval
is either
undefined
or
null
, then
a.
Let
rref
be ?
Evaluation
of
BitwiseORExpression
b.
Return ?
GetValue
rref
).
4.
Otherwise, return
lval
13.14
Conditional Operator (
? :
Syntax
ConditionalExpression
[In, Yield, Await]
ShortCircuitExpression
[?In, ?Yield, ?Await]
ShortCircuitExpression
[?In, ?Yield, ?Await]
AssignmentExpression
[+In, ?Yield, ?Await]
AssignmentExpression
[?In, ?Yield, ?Await]
Note
The grammar for a
ConditionalExpression
in ECMAScript is slightly different from that in C and Java, which each allow the second subexpression to be an
Expression
but restrict the third expression to be a
ConditionalExpression
The motivation for this difference in ECMAScript is to allow an
assignment expression to be governed by either arm of a conditional and
to eliminate the confusing and fairly useless case of a comma expression
as the centre expression.
13.14.1
Runtime Semantics: Evaluation
ConditionalExpression
ShortCircuitExpression
AssignmentExpression
AssignmentExpression
1.
Let
lref
be ?
Evaluation
of
ShortCircuitExpression
2.
Let
lval
be
ToBoolean
(?
GetValue
lref
)).
3.
If
lval
is
true
, then
a.
Let
trueRef
be ?
Evaluation
of the first
AssignmentExpression
b.
Return ?
GetValue
trueRef
).
4.
Else,
a.
Let
falseRef
be ?
Evaluation
of the second
AssignmentExpression
b.
Return ?
GetValue
falseRef
).
13.15
Assignment Operators
Syntax
AssignmentExpression
[In, Yield, Await]
ConditionalExpression
[?In, ?Yield, ?Await]
[+Yield]
YieldExpression
[?In, ?Await]
ArrowFunction
[?In, ?Yield, ?Await]
AsyncArrowFunction
[?In, ?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
AssignmentExpression
[?In, ?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
AssignmentOperator
AssignmentExpression
[?In, ?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
&&=
AssignmentExpression
[?In, ?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
||=
AssignmentExpression
[?In, ?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
??=
AssignmentExpression
[?In, ?Yield, ?Await]
AssignmentOperator
one of
*=
/=
%=
+=
-=
<<=
>>=
>>>=
&=
^=
|=
**=
13.15.1
Static Semantics: Early Errors
AssignmentExpression
LeftHandSideExpression
AssignmentExpression
If
LeftHandSideExpression
is either an
ObjectLiteral
or an
ArrayLiteral
, the following Early Error rules are applied:
LeftHandSideExpression
must cover
an
AssignmentPattern
If
LeftHandSideExpression
is neither an
ObjectLiteral
nor an
ArrayLiteral
, the following Early Error rule is applied:
It is a Syntax Error if
AssignmentTargetType
of
LeftHandSideExpression
is not
simple
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
It is a Syntax Error if
AssignmentTargetType
of
LeftHandSideExpression
is not
simple
13.15.2
Runtime Semantics: Evaluation
AssignmentExpression
LeftHandSideExpression
AssignmentExpression
1.
If
LeftHandSideExpression
is neither an
ObjectLiteral
nor an
ArrayLiteral
, then
a.
Let
lref
be ?
Evaluation
of
LeftHandSideExpression
b.
If
IsAnonymousFunctionDefinition
AssignmentExpression
) and
IsIdentifierRef
of
LeftHandSideExpression
are both
true
, then
i.
Let
rval
be ?
NamedEvaluation
of
AssignmentExpression
with argument
lref
.[[ReferencedName]].
c.
Else,
i.
Let
rref
be ?
Evaluation
of
AssignmentExpression
ii.
Let
rval
be ?
GetValue
rref
).
d.
Perform ?
PutValue
lref
rval
).
e.
Return
rval
2.
Let
assignmentPattern
be the
AssignmentPattern
that is
covered
by
LeftHandSideExpression
3.
Let
rref
be ?
Evaluation
of
AssignmentExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Perform ?
DestructuringAssignmentEvaluation
of
assignmentPattern
with argument
rval
6.
Return
rval
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
1.
Let
lref
be ?
Evaluation
of
LeftHandSideExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
AssignmentExpression
4.
Let
rval
be ?
GetValue
rref
).
5.
Let
assignmentOpText
be the
source text matched by
AssignmentOperator
6.
Let
opText
be the sequence of Unicode code points associated with
assignmentOpText
in the following table:
assignmentOpText
opText
**=
**
*=
/=
%=
+=
-=
<<=
<<
>>=
>>
>>>=
>>>
&=
^=
|=
7.
Let
be ?
ApplyStringOrNumericBinaryOperator
lval
opText
rval
).
8.
Perform ?
PutValue
lref
).
9.
Return
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
1.
Let
lref
be ?
Evaluation
of
LeftHandSideExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
lbool
be
ToBoolean
lval
).
4.
If
lbool
is
false
, return
lval
5.
If
IsAnonymousFunctionDefinition
AssignmentExpression
) is
true
and
IsIdentifierRef
of
LeftHandSideExpression
is
true
, then
a.
Let
rval
be ?
NamedEvaluation
of
AssignmentExpression
with argument
lref
.[[ReferencedName]].
6.
Else,
a.
Let
rref
be ?
Evaluation
of
AssignmentExpression
b.
Let
rval
be ?
GetValue
rref
).
7.
Perform ?
PutValue
lref
rval
).
8.
Return
rval
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
1.
Let
lref
be ?
Evaluation
of
LeftHandSideExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
lbool
be
ToBoolean
lval
).
4.
If
lbool
is
true
, return
lval
5.
If
IsAnonymousFunctionDefinition
AssignmentExpression
) is
true
and
IsIdentifierRef
of
LeftHandSideExpression
is
true
, then
a.
Let
rval
be ?
NamedEvaluation
of
AssignmentExpression
with argument
lref
.[[ReferencedName]].
6.
Else,
a.
Let
rref
be ?
Evaluation
of
AssignmentExpression
b.
Let
rval
be ?
GetValue
rref
).
7.
Perform ?
PutValue
lref
rval
).
8.
Return
rval
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
1.
Let
lref
be ?
Evaluation
of
LeftHandSideExpression
2.
Let
lval
be ?
GetValue
lref
).
3.
If
lval
is neither
undefined
nor
null
, return
lval
4.
If
IsAnonymousFunctionDefinition
AssignmentExpression
) is
true
and
IsIdentifierRef
of
LeftHandSideExpression
is
true
, then
a.
Let
rval
be ?
NamedEvaluation
of
AssignmentExpression
with argument
lref
.[[ReferencedName]].
5.
Else,
a.
Let
rref
be ?
Evaluation
of
AssignmentExpression
b.
Let
rval
be ?
GetValue
rref
).
6.
Perform ?
PutValue
lref
rval
).
7.
Return
rval
Note
When this expression occurs within
strict mode code
, it is a runtime error if
lref
in step
1.d
is an unresolvable reference. If it is, a
ReferenceError
exception is thrown. Additionally, it is a runtime error if the
lref
in step
is a reference to a
data property
with the attribute value { [[Writable]]:
false
}, to an
accessor property
with the attribute value { [[Set]]:
undefined
}, or to a non-existent property of an object for which the
IsExtensible
predicate returns the value
false
. In these cases a
TypeError
exception is thrown.
13.15.3
ApplyStringOrNumericBinaryOperator (
lval
opText
rval
The abstract operation ApplyStringOrNumericBinaryOperator takes arguments
lval
(an
ECMAScript language value
),
opText
**
<<
>>
>>>
, or
), and
rval
(an
ECMAScript language value
) and returns either a
normal completion containing
either a String, a BigInt, or a Number, or a
throw completion
. It performs the following steps when called:
1.
If
opText
is
, then
a.
Let
lprim
be ?
ToPrimitive
lval
).
b.
Let
rprim
be ?
ToPrimitive
rval
).
c.
If
lprim
is a String
or
rprim
is a String
, then
i.
Let
lstr
be ?
ToString
lprim
).
ii.
Let
rstr
be ?
ToString
rprim
).
iii.
Return the
string-concatenation
of
lstr
and
rstr
d.
Set
lval
to
lprim
e.
Set
rval
to
rprim
2.
NOTE: At this point, it must be a numeric operation.
3.
Let
lnum
be ?
ToNumeric
lval
).
4.
Let
rnum
be ?
ToNumeric
rval
).
5.
If
Type
lnum
) is not
Type
rnum
), throw a
TypeError
exception.
6.
If
lnum
is a BigInt
, then
a.
If
opText
is
**
, return ?
BigInt::exponentiate
lnum
rnum
).
b.
If
opText
is
, return ?
BigInt::divide
lnum
rnum
).
c.
If
opText
is
, return ?
BigInt::remainder
lnum
rnum
).
d.
If
opText
is
>>>
, return ?
BigInt::unsignedRightShift
lnum
rnum
).
7.
Let
operation
be the abstract operation associated with
opText
and
Type
lnum
) in the following table:
opText
Type
lnum
operation
**
Number
Number::exponentiate
Number
Number::multiply
BigInt
BigInt::multiply
Number
Number::divide
Number
Number::remainder
Number
Number::add
BigInt
BigInt::add
Number
Number::subtract
BigInt
BigInt::subtract
<<
Number
Number::leftShift
<<
BigInt
BigInt::leftShift
>>
Number
Number::signedRightShift
>>
BigInt
BigInt::signedRightShift
>>>
Number
Number::unsignedRightShift
Number
Number::bitwiseAND
BigInt
BigInt::bitwiseAND
Number
Number::bitwiseXOR
BigInt
BigInt::bitwiseXOR
Number
Number::bitwiseOR
BigInt
BigInt::bitwiseOR
8.
Return
operation
lnum
rnum
).
Note 1
No hint is provided in the calls to
ToPrimitive
in steps
1.a
and
1.b
. All standard objects except Dates handle the absence of a hint as if
number
were given; Dates handle the absence of a hint as if
string
were given.
Exotic objects
may handle the absence of a hint in some other manner.
Note 2
Step
1.c
differs from step
of the
IsLessThan
algorithm, by using the logical-or operation instead of the logical-and operation.
13.15.4
EvaluateStringOrNumericBinaryExpression (
leftOperand
opText
rightOperand
The abstract operation EvaluateStringOrNumericBinaryExpression takes arguments
leftOperand
(a
Parse Node
),
opText
(a sequence of Unicode code points), and
rightOperand
(a
Parse Node
) and returns either a
normal completion containing
either a String, a BigInt, or a Number, or an
abrupt completion
. It performs the following steps when called:
1.
Let
lref
be ?
Evaluation
of
leftOperand
2.
Let
lval
be ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
rightOperand
4.
Let
rval
be ?
GetValue
rref
).
5.
Return ?
ApplyStringOrNumericBinaryOperator
lval
opText
rval
).
13.15.5
Destructuring Assignment
Supplemental Syntax
In certain circumstances when processing an instance of the production
AssignmentExpression
LeftHandSideExpression
AssignmentExpression
the interpretation of
LeftHandSideExpression
is refined using the following grammar:
AssignmentPattern
[Yield, Await]
ObjectAssignmentPattern
[?Yield, ?Await]
ArrayAssignmentPattern
[?Yield, ?Await]
ObjectAssignmentPattern
[Yield, Await]
AssignmentRestProperty
[?Yield, ?Await]
AssignmentPropertyList
[?Yield, ?Await]
AssignmentPropertyList
[?Yield, ?Await]
AssignmentRestProperty
[?Yield, ?Await]
opt
ArrayAssignmentPattern
[Yield, Await]
Elision
opt
AssignmentRestElement
[?Yield, ?Await]
opt
AssignmentElementList
[?Yield, ?Await]
AssignmentElementList
[?Yield, ?Await]
Elision
opt
AssignmentRestElement
[?Yield, ?Await]
opt
AssignmentRestProperty
[Yield, Await]
...
DestructuringAssignmentTarget
[?Yield, ?Await]
AssignmentPropertyList
[Yield, Await]
AssignmentProperty
[?Yield, ?Await]
AssignmentPropertyList
[?Yield, ?Await]
AssignmentProperty
[?Yield, ?Await]
AssignmentElementList
[Yield, Await]
AssignmentElisionElement
[?Yield, ?Await]
AssignmentElementList
[?Yield, ?Await]
AssignmentElisionElement
[?Yield, ?Await]
AssignmentElisionElement
[Yield, Await]
Elision
opt
AssignmentElement
[?Yield, ?Await]
AssignmentProperty
[Yield, Await]
IdentifierReference
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
opt
PropertyName
[?Yield, ?Await]
AssignmentElement
[?Yield, ?Await]
AssignmentElement
[Yield, Await]
DestructuringAssignmentTarget
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
opt
AssignmentRestElement
[Yield, Await]
...
DestructuringAssignmentTarget
[?Yield, ?Await]
DestructuringAssignmentTarget
[Yield, Await]
LeftHandSideExpression
[?Yield, ?Await]
13.15.5.1
Static Semantics: Early Errors
AssignmentProperty
IdentifierReference
Initializer
opt
It is a Syntax Error if
AssignmentTargetType
of
IdentifierReference
is not
simple
AssignmentRestProperty
...
DestructuringAssignmentTarget
It is a Syntax Error if
DestructuringAssignmentTarget
is either an
ArrayLiteral
or an
ObjectLiteral
DestructuringAssignmentTarget
LeftHandSideExpression
If
LeftHandSideExpression
is either an
ObjectLiteral
or an
ArrayLiteral
, the following Early Error rules are applied:
LeftHandSideExpression
must cover
an
AssignmentPattern
If
LeftHandSideExpression
is neither an
ObjectLiteral
nor an
ArrayLiteral
, the following Early Error rule is applied:
It is a Syntax Error if
AssignmentTargetType
of
LeftHandSideExpression
is not
simple
13.15.5.2
Runtime Semantics: DestructuringAssignmentEvaluation
The
syntax-directed operation
DestructuringAssignmentEvaluation takes argument
value
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or an
abrupt completion
. It is defined piecewise over the following productions:
ObjectAssignmentPattern
1.
Perform ?
RequireObjectCoercible
value
).
2.
Return
unused
ObjectAssignmentPattern
AssignmentPropertyList
AssignmentPropertyList
1.
Perform ?
RequireObjectCoercible
value
).
2.
Perform ?
PropertyDestructuringAssignmentEvaluation
of
AssignmentPropertyList
with argument
value
3.
Return
unused
ObjectAssignmentPattern
AssignmentRestProperty
1.
Perform ?
RequireObjectCoercible
value
).
2.
Let
excludedNames
be a new empty
List
3.
Return ?
RestDestructuringAssignmentEvaluation
of
AssignmentRestProperty
with arguments
value
and
excludedNames
ObjectAssignmentPattern
AssignmentPropertyList
AssignmentRestProperty
1.
Perform ?
RequireObjectCoercible
value
).
2.
Let
excludedNames
be ?
PropertyDestructuringAssignmentEvaluation
of
AssignmentPropertyList
with argument
value
3.
Return ?
RestDestructuringAssignmentEvaluation
of
AssignmentRestProperty
with arguments
value
and
excludedNames
ArrayAssignmentPattern
1.
Let
iteratorRecord
be ?
GetIterator
value
sync
).
2.
Return ?
IteratorClose
iteratorRecord
NormalCompletion
unused
)).
ArrayAssignmentPattern
Elision
1.
Let
iteratorRecord
be ?
GetIterator
value
sync
).
2.
Let
result
be
Completion
IteratorDestructuringAssignmentEvaluation
of
Elision
with argument
iteratorRecord
).
3.
If
iteratorRecord
.[[Done]] is
false
, return ?
IteratorClose
iteratorRecord
result
).
4.
Return
result
ArrayAssignmentPattern
Elision
opt
AssignmentRestElement
1.
Let
iteratorRecord
be ?
GetIterator
value
sync
).
2.
If
Elision
is present, then
a.
Let
status
be
Completion
IteratorDestructuringAssignmentEvaluation
of
Elision
with argument
iteratorRecord
).
b.
If
status
is an
abrupt completion
, then
i.
Assert
iteratorRecord
.[[Done]] is
true
ii.
Return ?
status
3.
Let
result
be
Completion
IteratorDestructuringAssignmentEvaluation
of
AssignmentRestElement
with argument
iteratorRecord
).
4.
If
iteratorRecord
.[[Done]] is
false
, return ?
IteratorClose
iteratorRecord
result
).
5.
Return
result
ArrayAssignmentPattern
AssignmentElementList
1.
Let
iteratorRecord
be ?
GetIterator
value
sync
).
2.
Let
result
be
Completion
IteratorDestructuringAssignmentEvaluation
of
AssignmentElementList
with argument
iteratorRecord
).
3.
If
iteratorRecord
.[[Done]] is
false
, return ?
IteratorClose
iteratorRecord
result
).
4.
Return
result
ArrayAssignmentPattern
AssignmentElementList
Elision
opt
AssignmentRestElement
opt
1.
Let
iteratorRecord
be ?
GetIterator
value
sync
).
2.
Let
status
be
Completion
IteratorDestructuringAssignmentEvaluation
of
AssignmentElementList
with argument
iteratorRecord
).
3.
If
status
is an
abrupt completion
, then
a.
If
iteratorRecord
.[[Done]] is
false
, return ?
IteratorClose
iteratorRecord
status
).
b.
Return ?
status
4.
If
Elision
is present, then
a.
Set
status
to
Completion
IteratorDestructuringAssignmentEvaluation
of
Elision
with argument
iteratorRecord
).
b.
If
status
is an
abrupt completion
, then
i.
Assert
iteratorRecord
.[[Done]] is
true
ii.
Return ?
status
5.
If
AssignmentRestElement
is present, then
a.
Set
status
to
Completion
IteratorDestructuringAssignmentEvaluation
of
AssignmentRestElement
with argument
iteratorRecord
).
6.
If
iteratorRecord
.[[Done]] is
false
, return ?
IteratorClose
iteratorRecord
status
).
7.
Return ?
status
13.15.5.3
Runtime Semantics: PropertyDestructuringAssignmentEvaluation
The
syntax-directed operation
PropertyDestructuringAssignmentEvaluation takes argument
value
(an
ECMAScript language value
) and returns either a
normal completion containing
List
of
property keys
or an
abrupt completion
. It collects a list of all destructured
property keys
. It is defined piecewise over the following productions:
AssignmentPropertyList
AssignmentPropertyList
AssignmentProperty
1.
Let
propertyNames
be ?
PropertyDestructuringAssignmentEvaluation
of
AssignmentPropertyList
with argument
value
2.
Let
nextNames
be ?
PropertyDestructuringAssignmentEvaluation
of
AssignmentProperty
with argument
value
3.
Return the
list-concatenation
of
propertyNames
and
nextNames
AssignmentProperty
IdentifierReference
Initializer
opt
1.
Let
be
StringValue
of
IdentifierReference
2.
Let
lref
be ?
ResolveBinding
).
3.
Let
be ?
GetV
value
).
4.
If
Initializer
opt
is present and
is
undefined
, then
a.
If
IsAnonymousFunctionDefinition
Initializer
) is
true
, then
i.
Set
to ?
NamedEvaluation
of
Initializer
with argument
b.
Else,
i.
Let
defaultValue
be ?
Evaluation
of
Initializer
ii.
Set
to ?
GetValue
defaultValue
).
5.
Perform ?
PutValue
lref
).
6.
Return «
».
AssignmentProperty
PropertyName
AssignmentElement
1.
Let
name
be ?
Evaluation
of
PropertyName
2.
Perform ?
KeyedDestructuringAssignmentEvaluation
of
AssignmentElement
with arguments
value
and
name
3.
Return «
name
».
13.15.5.4
Runtime Semantics: RestDestructuringAssignmentEvaluation
The
syntax-directed operation
RestDestructuringAssignmentEvaluation takes arguments
value
(an
ECMAScript language value
) and
excludedNames
(a
List
of
property keys
) and returns either a
normal completion containing
unused
or an
abrupt completion
. It is defined piecewise over the following productions:
AssignmentRestProperty
...
DestructuringAssignmentTarget
1.
Let
lref
be ?
Evaluation
of
DestructuringAssignmentTarget
2.
Let
restObj
be
OrdinaryObjectCreate
%Object.prototype%
).
3.
Perform ?
CopyDataProperties
restObj
value
excludedNames
).
4.
Return ?
PutValue
lref
restObj
).
13.15.5.5
Runtime Semantics: IteratorDestructuringAssignmentEvaluation
The
syntax-directed operation
IteratorDestructuringAssignmentEvaluation takes argument
iteratorRecord
(an
Iterator Record
) and returns either a
normal completion containing
unused
or an
abrupt completion
. It is defined piecewise over the following productions:
AssignmentElementList
AssignmentElisionElement
1.
Return ?
IteratorDestructuringAssignmentEvaluation
of
AssignmentElisionElement
with argument
iteratorRecord
AssignmentElementList
AssignmentElementList
AssignmentElisionElement
1.
Perform ?
IteratorDestructuringAssignmentEvaluation
of
AssignmentElementList
with argument
iteratorRecord
2.
Return ?
IteratorDestructuringAssignmentEvaluation
of
AssignmentElisionElement
with argument
iteratorRecord
AssignmentElisionElement
AssignmentElement
1.
Return ?
IteratorDestructuringAssignmentEvaluation
of
AssignmentElement
with argument
iteratorRecord
AssignmentElisionElement
Elision
AssignmentElement
1.
Perform ?
IteratorDestructuringAssignmentEvaluation
of
Elision
with argument
iteratorRecord
2.
Return ?
IteratorDestructuringAssignmentEvaluation
of
AssignmentElement
with argument
iteratorRecord
Elision
1.
If
iteratorRecord
.[[Done]] is
false
, then
a.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
b.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
next
).
d.
If
next
is
false
, set
iteratorRecord
.[[Done]] to
true
2.
Return
unused
Elision
Elision
1.
Perform ?
IteratorDestructuringAssignmentEvaluation
of
Elision
with argument
iteratorRecord
2.
If
iteratorRecord
.[[Done]] is
false
, then
a.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
b.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
next
).
d.
If
next
is
false
, set
iteratorRecord
.[[Done]] to
true
3.
Return
unused
AssignmentElement
DestructuringAssignmentTarget
Initializer
opt
1.
If
DestructuringAssignmentTarget
is neither an
ObjectLiteral
nor an
ArrayLiteral
, then
a.
Let
lref
be ?
Evaluation
of
DestructuringAssignmentTarget
2.
If
iteratorRecord
.[[Done]] is
false
, then
a.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
b.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
next
).
d.
If
next
is
false
, set
iteratorRecord
.[[Done]] to
true
e.
Else,
i.
Let
value
be
Completion
IteratorValue
next
)).
ii.
If
value
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
iii.
ReturnIfAbrupt
value
).
3.
If
iteratorRecord
.[[Done]] is
true
, let
value
be
undefined
4.
If
Initializer
is present and
value
is
undefined
, then
a.
If
IsAnonymousFunctionDefinition
Initializer
) is
true
and
IsIdentifierRef
of
DestructuringAssignmentTarget
is
true
, then
i.
Let
be ?
NamedEvaluation
of
Initializer
with argument
lref
.[[ReferencedName]].
b.
Else,
i.
Let
defaultValue
be ?
Evaluation
of
Initializer
ii.
Let
be ?
GetValue
defaultValue
).
5.
Else, let
be
value
6.
If
DestructuringAssignmentTarget
is either an
ObjectLiteral
or an
ArrayLiteral
, then
a.
Let
nestedAssignmentPattern
be the
AssignmentPattern
that is
covered
by
DestructuringAssignmentTarget
b.
Return ?
DestructuringAssignmentEvaluation
of
nestedAssignmentPattern
with argument
7.
Return ?
PutValue
lref
).
Note
Left to right evaluation order is maintained by evaluating a
DestructuringAssignmentTarget
that is not a destructuring pattern prior to accessing the iterator or evaluating the
Initializer
AssignmentRestElement
...
DestructuringAssignmentTarget
1.
If
DestructuringAssignmentTarget
is neither an
ObjectLiteral
nor an
ArrayLiteral
, then
a.
Let
lref
be ?
Evaluation
of
DestructuringAssignmentTarget
2.
Let
be !
ArrayCreate
(0).
3.
Let
be 0.
4.
Repeat, while
iteratorRecord
.[[Done]] is
false
a.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
b.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
next
).
d.
If
next
is
false
, set
iteratorRecord
.[[Done]] to
true
e.
Else,
i.
Let
nextValue
be
Completion
IteratorValue
next
)).
ii.
If
nextValue
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
iii.
ReturnIfAbrupt
nextValue
).
iv.
Perform !
CreateDataPropertyOrThrow
, !
ToString
)),
nextValue
).
v.
Set
to
+ 1.
5.
If
DestructuringAssignmentTarget
is neither an
ObjectLiteral
nor an
ArrayLiteral
, then
a.
Return ?
PutValue
lref
).
6.
Let
nestedAssignmentPattern
be the
AssignmentPattern
that is
covered
by
DestructuringAssignmentTarget
7.
Return ?
DestructuringAssignmentEvaluation
of
nestedAssignmentPattern
with argument
13.15.5.6
Runtime Semantics: KeyedDestructuringAssignmentEvaluation
The
syntax-directed operation
KeyedDestructuringAssignmentEvaluation takes arguments
value
(an
ECMAScript language value
) and
propertyName
(a
property key
) and returns either a
normal completion containing
unused
or an
abrupt completion
. It is defined piecewise over the following productions:
AssignmentElement
DestructuringAssignmentTarget
Initializer
opt
1.
If
DestructuringAssignmentTarget
is neither an
ObjectLiteral
nor an
ArrayLiteral
, then
a.
Let
lref
be ?
Evaluation
of
DestructuringAssignmentTarget
2.
Let
be ?
GetV
value
propertyName
).
3.
If
Initializer
is present and
is
undefined
, then
a.
If
IsAnonymousFunctionDefinition
Initializer
) and
IsIdentifierRef
of
DestructuringAssignmentTarget
are both
true
, then
i.
Let
rhsValue
be ?
NamedEvaluation
of
Initializer
with argument
lref
.[[ReferencedName]].
b.
Else,
i.
Let
defaultValue
be ?
Evaluation
of
Initializer
ii.
Let
rhsValue
be ?
GetValue
defaultValue
).
4.
Else, let
rhsValue
be
5.
If
DestructuringAssignmentTarget
is either an
ObjectLiteral
or an
ArrayLiteral
, then
a.
Let
assignmentPattern
be the
AssignmentPattern
that is
covered
by
DestructuringAssignmentTarget
b.
Return ?
DestructuringAssignmentEvaluation
of
assignmentPattern
with argument
rhsValue
6.
Return ?
PutValue
lref
rhsValue
).
13.16
Comma Operator (
Syntax
Expression
[In, Yield, Await]
AssignmentExpression
[?In, ?Yield, ?Await]
Expression
[?In, ?Yield, ?Await]
AssignmentExpression
[?In, ?Yield, ?Await]
13.16.1
Runtime Semantics: Evaluation
Expression
Expression
AssignmentExpression
1.
Let
lref
be ?
Evaluation
of
Expression
2.
Perform ?
GetValue
lref
).
3.
Let
rref
be ?
Evaluation
of
AssignmentExpression
4.
Return ?
GetValue
rref
).
Note
GetValue
must be called even though its value is not used because it may have observable side-effects.
14
ECMAScript Language: Statements and Declarations
Syntax
Statement
[Yield, Await, Return]
BlockStatement
[?Yield, ?Await, ?Return]
VariableStatement
[?Yield, ?Await]
EmptyStatement
ExpressionStatement
[?Yield, ?Await]
IfStatement
[?Yield, ?Await, ?Return]
BreakableStatement
[?Yield, ?Await, ?Return]
ContinueStatement
[?Yield, ?Await]
BreakStatement
[?Yield, ?Await]
[+Return]
ReturnStatement
[?Yield, ?Await]
WithStatement
[?Yield, ?Await, ?Return]
LabelledStatement
[?Yield, ?Await, ?Return]
ThrowStatement
[?Yield, ?Await]
TryStatement
[?Yield, ?Await, ?Return]
DebuggerStatement
Declaration
[Yield, Await]
HoistableDeclaration
[?Yield, ?Await, ~Default]
ClassDeclaration
[?Yield, ?Await, ~Default]
LexicalDeclaration
[+In, ?Yield, ?Await]
HoistableDeclaration
[Yield, Await, Default]
FunctionDeclaration
[?Yield, ?Await, ?Default]
GeneratorDeclaration
[?Yield, ?Await, ?Default]
AsyncFunctionDeclaration
[?Yield, ?Await, ?Default]
AsyncGeneratorDeclaration
[?Yield, ?Await, ?Default]
BreakableStatement
[Yield, Await, Return]
IterationStatement
[?Yield, ?Await, ?Return]
SwitchStatement
[?Yield, ?Await, ?Return]
14.1
Statement Semantics
14.1.1
Runtime Semantics: Evaluation
HoistableDeclaration
GeneratorDeclaration
AsyncFunctionDeclaration
AsyncGeneratorDeclaration
1.
Return
empty
HoistableDeclaration
FunctionDeclaration
1.
Return ?
Evaluation
of
FunctionDeclaration
BreakableStatement
IterationStatement
SwitchStatement
1.
Let
newLabelSet
be a new empty
List
2.
Return ?
LabelledEvaluation
of this
BreakableStatement
with argument
newLabelSet
14.2
Block
Syntax
BlockStatement
[Yield, Await, Return]
Block
[?Yield, ?Await, ?Return]
Block
[Yield, Await, Return]
StatementList
[?Yield, ?Await, ?Return]
opt
StatementList
[Yield, Await, Return]
StatementListItem
[?Yield, ?Await, ?Return]
StatementList
[?Yield, ?Await, ?Return]
StatementListItem
[?Yield, ?Await, ?Return]
StatementListItem
[Yield, Await, Return]
Statement
[?Yield, ?Await, ?Return]
Declaration
[?Yield, ?Await]
14.2.1
Static Semantics: Early Errors
Block
StatementList
It is a Syntax Error if the
LexicallyDeclaredNames
of
StatementList
contains any duplicate entries.
It is a Syntax Error if any element of the
LexicallyDeclaredNames
of
StatementList
also occurs in the
VarDeclaredNames
of
StatementList
14.2.2
Runtime Semantics: Evaluation
Block
1.
Return
empty
Block
StatementList
1.
Let
oldEnv
be the
running execution context
's LexicalEnvironment.
2.
Let
blockEnv
be
NewDeclarativeEnvironment
oldEnv
).
3.
Perform
BlockDeclarationInstantiation
StatementList
blockEnv
).
4.
Set the
running execution context
's LexicalEnvironment to
blockEnv
5.
Let
blockValue
be
Completion
Evaluation
of
StatementList
).
6.
Set the
running execution context
's LexicalEnvironment to
oldEnv
7.
Return ?
blockValue
Note 1
No matter how control leaves the
Block
the LexicalEnvironment is always restored to its former state.
StatementList
StatementList
StatementListItem
1.
Let
sl
be ?
Evaluation
of
StatementList
2.
Let
be
Completion
Evaluation
of
StatementListItem
).
3.
Return ?
UpdateEmpty
sl
).
Note 2
The value of a
StatementList
is the value of the last value-producing item in the
StatementList
. For example, the following calls to the
eval
function all return the value 1:
eval
"1;;;;;"
eval
"1;{}"
eval
"1;var a;"
14.2.3
BlockDeclarationInstantiation (
code
env
The abstract operation BlockDeclarationInstantiation takes arguments
code
(a
Parse Node
) and
env
(a
Declarative Environment Record
) and returns
unused
code
is the
Parse Node
corresponding to the body of the block.
env
is the
Environment Record
in which bindings are to be created.
Note
When a
Block
or
CaseBlock
is evaluated a new
Declarative Environment Record
is created and bindings for each block scoped variable, constant,
function, or class declared in the block are instantiated in the
Environment Record
It performs the following steps when called:
1.
Let
declarations
be the
LexicallyScopedDeclarations
of
code
2.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
3.
For each element
of
declarations
, do
a.
For each element
dn
of the
BoundNames
of
, do
i.
If
IsConstantDeclaration
of
is
true
, then
1.
Perform !
env
.CreateImmutableBinding(
dn
true
).
ii.
Else,
1.
Perform !
env
.CreateMutableBinding(
dn
false
). NOTE: This step is replaced in section
B.3.2.6
b.
If
is either a
FunctionDeclaration
, a
GeneratorDeclaration
, an
AsyncFunctionDeclaration
, or an
AsyncGeneratorDeclaration
, then
i.
Let
fn
be the sole element of the
BoundNames
of
ii.
Let
fo
be
InstantiateFunctionObject
of
with arguments
env
and
privateEnv
iii.
Perform !
env
.InitializeBinding(
fn
fo
). NOTE: This step is replaced in section
B.3.2.6
4.
Return
unused
14.3
Declarations and the Variable Statement
14.3.1
Let and Const Declarations
Note
let
and
const
declarations define variables that are scoped to the
running execution context
's LexicalEnvironment. The variables are created when their containing
Environment Record
is instantiated but may not be accessed in any way until the variable's
LexicalBinding
is evaluated. A variable defined by a
LexicalBinding
with an
Initializer
is assigned the value of its
Initializer
's
AssignmentExpression
when the
LexicalBinding
is evaluated, not when the variable is created. If a
LexicalBinding
in a
let
declaration does not have an
Initializer
the variable is assigned the value
undefined
when the
LexicalBinding
is evaluated.
Syntax
LexicalDeclaration
[In, Yield, Await]
LetOrConst
BindingList
[?In, ?Yield, ?Await]
LetOrConst
let
const
BindingList
[In, Yield, Await]
LexicalBinding
[?In, ?Yield, ?Await]
BindingList
[?In, ?Yield, ?Await]
LexicalBinding
[?In, ?Yield, ?Await]
LexicalBinding
[In, Yield, Await]
BindingIdentifier
[?Yield, ?Await]
Initializer
[?In, ?Yield, ?Await]
opt
BindingPattern
[?Yield, ?Await]
Initializer
[?In, ?Yield, ?Await]
14.3.1.1
Static Semantics: Early Errors
LexicalDeclaration
LetOrConst
BindingList
It is a Syntax Error if the
BoundNames
of
BindingList
contains
"let"
It is a Syntax Error if the
BoundNames
of
BindingList
contains any duplicate entries.
LexicalBinding
BindingIdentifier
Initializer
opt
It is a Syntax Error if
Initializer
is not present and
IsConstantDeclaration
of the
LexicalDeclaration
containing this
LexicalBinding
is
true
14.3.1.2
Runtime Semantics: Evaluation
LexicalDeclaration
LetOrConst
BindingList
1.
Perform ?
Evaluation
of
BindingList
2.
Return
empty
BindingList
BindingList
LexicalBinding
1.
Perform ?
Evaluation
of
BindingList
2.
Return ?
Evaluation
of
LexicalBinding
LexicalBinding
BindingIdentifier
1.
Let
lhs
be !
ResolveBinding
StringValue
of
BindingIdentifier
).
2.
Perform !
InitializeReferencedBinding
lhs
undefined
).
3.
Return
empty
Note
static semantics
rule ensures that this form of
LexicalBinding
never occurs in a
const
declaration.
LexicalBinding
BindingIdentifier
Initializer
1.
Let
bindingId
be
StringValue
of
BindingIdentifier
2.
Let
lhs
be !
ResolveBinding
bindingId
).
3.
If
IsAnonymousFunctionDefinition
Initializer
) is
true
, then
a.
Let
value
be ?
NamedEvaluation
of
Initializer
with argument
bindingId
4.
Else,
a.
Let
rhs
be ?
Evaluation
of
Initializer
b.
Let
value
be ?
GetValue
rhs
).
5.
Perform !
InitializeReferencedBinding
lhs
value
).
6.
Return
empty
LexicalBinding
BindingPattern
Initializer
1.
Let
rhs
be ?
Evaluation
of
Initializer
2.
Let
value
be ?
GetValue
rhs
).
3.
Let
env
be the
running execution context
's LexicalEnvironment.
4.
Return ?
BindingInitialization
of
BindingPattern
with arguments
value
and
env
14.3.2
Variable Statement
Note
var
statement declares variables that are scoped to the
running execution context
's VariableEnvironment. Var variables are created when their containing
Environment Record
is instantiated and are initialized to
undefined
when created. Within the scope of any VariableEnvironment a common
BindingIdentifier
may appear in more than one
VariableDeclaration
but those declarations collectively define only one variable. A variable defined by a
VariableDeclaration
with an
Initializer
is assigned the value of its
Initializer
's
AssignmentExpression
when the
VariableDeclaration
is executed, not when the variable is created.
Syntax
VariableStatement
[Yield, Await]
var
VariableDeclarationList
[+In, ?Yield, ?Await]
VariableDeclarationList
[In, Yield, Await]
VariableDeclaration
[?In, ?Yield, ?Await]
VariableDeclarationList
[?In, ?Yield, ?Await]
VariableDeclaration
[?In, ?Yield, ?Await]
VariableDeclaration
[In, Yield, Await]
BindingIdentifier
[?Yield, ?Await]
Initializer
[?In, ?Yield, ?Await]
opt
BindingPattern
[?Yield, ?Await]
Initializer
[?In, ?Yield, ?Await]
14.3.2.1
Runtime Semantics: Evaluation
VariableStatement
var
VariableDeclarationList
1.
Perform ?
Evaluation
of
VariableDeclarationList
2.
Return
empty
VariableDeclarationList
VariableDeclarationList
VariableDeclaration
1.
Perform ?
Evaluation
of
VariableDeclarationList
2.
Return ?
Evaluation
of
VariableDeclaration
VariableDeclaration
BindingIdentifier
1.
Return
empty
VariableDeclaration
BindingIdentifier
Initializer
1.
Let
bindingId
be
StringValue
of
BindingIdentifier
2.
Let
lhs
be ?
ResolveBinding
bindingId
).
3.
If
IsAnonymousFunctionDefinition
Initializer
) is
true
, then
a.
Let
value
be ?
NamedEvaluation
of
Initializer
with argument
bindingId
4.
Else,
a.
Let
rhs
be ?
Evaluation
of
Initializer
b.
Let
value
be ?
GetValue
rhs
).
5.
Perform ?
PutValue
lhs
value
).
6.
Return
empty
Note
If a
VariableDeclaration
is nested within a with statement and the
BindingIdentifier
in the
VariableDeclaration
is the same as a
property name
of the binding object of the with statement's
Object Environment Record
, then step
will assign
value
to the property instead of assigning to the VariableEnvironment binding of the
Identifier
VariableDeclaration
BindingPattern
Initializer
1.
Let
rhs
be ?
Evaluation
of
Initializer
2.
Let
rval
be ?
GetValue
rhs
).
3.
Return ?
BindingInitialization
of
BindingPattern
with arguments
rval
and
undefined
14.3.3
Destructuring Binding Patterns
Syntax
BindingPattern
[Yield, Await]
ObjectBindingPattern
[?Yield, ?Await]
ArrayBindingPattern
[?Yield, ?Await]
ObjectBindingPattern
[Yield, Await]
BindingRestProperty
[?Yield, ?Await]
BindingPropertyList
[?Yield, ?Await]
BindingPropertyList
[?Yield, ?Await]
BindingRestProperty
[?Yield, ?Await]
opt
ArrayBindingPattern
[Yield, Await]
Elision
opt
BindingRestElement
[?Yield, ?Await]
opt
BindingElementList
[?Yield, ?Await]
BindingElementList
[?Yield, ?Await]
Elision
opt
BindingRestElement
[?Yield, ?Await]
opt
BindingRestProperty
[Yield, Await]
...
BindingIdentifier
[?Yield, ?Await]
BindingPropertyList
[Yield, Await]
BindingProperty
[?Yield, ?Await]
BindingPropertyList
[?Yield, ?Await]
BindingProperty
[?Yield, ?Await]
BindingElementList
[Yield, Await]
BindingElisionElement
[?Yield, ?Await]
BindingElementList
[?Yield, ?Await]
BindingElisionElement
[?Yield, ?Await]
BindingElisionElement
[Yield, Await]
Elision
opt
BindingElement
[?Yield, ?Await]
BindingProperty
[Yield, Await]
SingleNameBinding
[?Yield, ?Await]
PropertyName
[?Yield, ?Await]
BindingElement
[?Yield, ?Await]
BindingElement
[Yield, Await]
SingleNameBinding
[?Yield, ?Await]
BindingPattern
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
opt
SingleNameBinding
[Yield, Await]
BindingIdentifier
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
opt
BindingRestElement
[Yield, Await]
...
BindingIdentifier
[?Yield, ?Await]
...
BindingPattern
[?Yield, ?Await]
14.3.3.1
Runtime Semantics: PropertyBindingInitialization
The
syntax-directed operation
PropertyBindingInitialization takes arguments
value
(an
ECMAScript language value
) and
environment
(an
Environment Record
or
undefined
) and returns either a
normal completion containing
List
of
property keys
or an
abrupt completion
. It collects a list of all bound property names. It is defined piecewise over the following productions:
BindingPropertyList
BindingPropertyList
BindingProperty
1.
Let
boundNames
be ?
PropertyBindingInitialization
of
BindingPropertyList
with arguments
value
and
environment
2.
Let
nextNames
be ?
PropertyBindingInitialization
of
BindingProperty
with arguments
value
and
environment
3.
Return the
list-concatenation
of
boundNames
and
nextNames
BindingProperty
SingleNameBinding
1.
Let
name
be the sole element of the
BoundNames
of
SingleNameBinding
2.
Perform ?
KeyedBindingInitialization
of
SingleNameBinding
with arguments
value
environment
, and
name
3.
Return «
name
».
BindingProperty
PropertyName
BindingElement
1.
Let
be ?
Evaluation
of
PropertyName
2.
Perform ?
KeyedBindingInitialization
of
BindingElement
with arguments
value
environment
, and
3.
Return «
».
14.3.3.2
Runtime Semantics: RestBindingInitialization
The
syntax-directed operation
RestBindingInitialization takes arguments
value
(an
ECMAScript language value
),
environment
(an
Environment Record
or
undefined
), and
excludedNames
(a
List
of
property keys
) and returns either a
normal completion containing
unused
or an
abrupt completion
. It is defined piecewise over the following productions:
BindingRestProperty
...
BindingIdentifier
1.
Let
lhs
be ?
ResolveBinding
StringValue
of
BindingIdentifier
environment
).
2.
Let
restObj
be
OrdinaryObjectCreate
%Object.prototype%
).
3.
Perform ?
CopyDataProperties
restObj
value
excludedNames
).
4.
If
environment
is
undefined
, return ?
PutValue
lhs
restObj
).
5.
Return ?
InitializeReferencedBinding
lhs
restObj
).
14.3.3.3
Runtime Semantics: KeyedBindingInitialization
The
syntax-directed operation
KeyedBindingInitialization takes arguments
value
(an
ECMAScript language value
),
environment
(an
Environment Record
or
undefined
), and
propertyName
(a
property key
) and returns either a
normal completion containing
unused
or an
abrupt completion
Note
When
undefined
is passed for
environment
it indicates that a
PutValue
operation should be used to assign the initialization value. This is the case for formal parameter lists of
non-strict functions
In that case the formal parameter bindings are preinitialized in order
to deal with the possibility of multiple parameters with the same name.
It is defined piecewise over the following productions:
BindingElement
BindingPattern
Initializer
opt
1.
Let
be ?
GetV
value
propertyName
).
2.
If
Initializer
is present and
is
undefined
, then
a.
Let
defaultValue
be ?
Evaluation
of
Initializer
b.
Set
to ?
GetValue
defaultValue
).
3.
Return ?
BindingInitialization
of
BindingPattern
with arguments
and
environment
SingleNameBinding
BindingIdentifier
Initializer
opt
1.
Let
bindingId
be
StringValue
of
BindingIdentifier
2.
Let
lhs
be ?
ResolveBinding
bindingId
environment
).
3.
Let
be ?
GetV
value
propertyName
).
4.
If
Initializer
is present and
is
undefined
, then
a.
If
IsAnonymousFunctionDefinition
Initializer
) is
true
, then
i.
Set
to ?
NamedEvaluation
of
Initializer
with argument
bindingId
b.
Else,
i.
Let
defaultValue
be ?
Evaluation
of
Initializer
ii.
Set
to ?
GetValue
defaultValue
).
5.
If
environment
is
undefined
, return ?
PutValue
lhs
).
6.
Return ?
InitializeReferencedBinding
lhs
).
14.4
Empty Statement
Syntax
EmptyStatement
14.4.1
Runtime Semantics: Evaluation
EmptyStatement
1.
Return
empty
14.5
Expression Statement
Syntax
ExpressionStatement
[Yield, Await]
[lookahead ∉ {
function
async
[no
LineTerminator
here]
function
class
let
}]
Expression
[+In, ?Yield, ?Await]
Note
An
ExpressionStatement
cannot start with a U+007B (LEFT CURLY BRACKET) because that might make it ambiguous with a
Block
. An
ExpressionStatement
cannot start with the
function
or
class
keywords
because that would make it ambiguous with a
FunctionDeclaration
, a
GeneratorDeclaration
, or a
ClassDeclaration
. An
ExpressionStatement
cannot start with
async function
because that would make it ambiguous with an
AsyncFunctionDeclaration
or a
AsyncGeneratorDeclaration
. An
ExpressionStatement
cannot start with the two token sequence
let [
because that would make it ambiguous with a
let
LexicalDeclaration
whose first
LexicalBinding
was an
ArrayBindingPattern
14.5.1
Runtime Semantics: Evaluation
ExpressionStatement
Expression
1.
Let
exprRef
be ?
Evaluation
of
Expression
2.
Return ?
GetValue
exprRef
).
14.6
The
if
Statement
Syntax
IfStatement
[Yield, Await, Return]
if
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
else
Statement
[?Yield, ?Await, ?Return]
if
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
[lookahead ≠
else
Note
The lookahead-restriction [lookahead ≠
else
] resolves the classic "dangling else" problem in the usual way. That is, when the choice of associated
if
is otherwise ambiguous, the
else
is associated with the nearest (innermost) of the candidate
if
14.6.1
Static Semantics: Early Errors
IfStatement
if
Expression
Statement
else
Statement
It is a Syntax Error if
IsLabelledFunction
(the first
Statement
) is
true
It is a Syntax Error if
IsLabelledFunction
(the second
Statement
) is
true
IfStatement
if
Expression
Statement
It is a Syntax Error if
IsLabelledFunction
Statement
) is
true
Note
It is only necessary to apply this rule if the extension specified in
B.3.1
is implemented.
14.6.2
Runtime Semantics: Evaluation
IfStatement
if
Expression
Statement
else
Statement
1.
Let
exprRef
be ?
Evaluation
of
Expression
2.
Let
exprValue
be
ToBoolean
(?
GetValue
exprRef
)).
3.
If
exprValue
is
true
, then
a.
Let
stmtCompletion
be
Completion
Evaluation
of the first
Statement
).
4.
Else,
a.
Let
stmtCompletion
be
Completion
Evaluation
of the second
Statement
).
5.
Return ?
UpdateEmpty
stmtCompletion
undefined
).
IfStatement
if
Expression
Statement
1.
Let
exprRef
be ?
Evaluation
of
Expression
2.
Let
exprValue
be
ToBoolean
(?
GetValue
exprRef
)).
3.
If
exprValue
is
false
, then
a.
Return
undefined
4.
Else,
a.
Let
stmtCompletion
be
Completion
Evaluation
of
Statement
).
b.
Return ?
UpdateEmpty
stmtCompletion
undefined
).
14.7
Iteration Statements
Syntax
IterationStatement
[Yield, Await, Return]
DoWhileStatement
[?Yield, ?Await, ?Return]
WhileStatement
[?Yield, ?Await, ?Return]
ForStatement
[?Yield, ?Await, ?Return]
ForInOfStatement
[?Yield, ?Await, ?Return]
14.7.1
Semantics
14.7.1.1
LoopContinues (
completion
labelSet
The abstract operation LoopContinues takes arguments
completion
(a
Completion Record
) and
labelSet
(a
List
of Strings) and returns a Boolean. It performs the following steps when called:
1.
If
completion
.[[Type]] is
normal
, return
true
2.
If
completion
.[[Type]] is not
continue
, return
false
3.
If
completion
.[[Target]] is
empty
, return
true
4.
If
labelSet
contains
completion
.[[Target]], return
true
5.
Return
false
Note
Within the
Statement
part of an
IterationStatement
ContinueStatement
may be used to begin a new iteration.
14.7.1.2
Runtime Semantics: LoopEvaluation
The
syntax-directed operation
LoopEvaluation takes argument
labelSet
(a
List
of Strings) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
IterationStatement
DoWhileStatement
1.
Return ?
DoWhileLoopEvaluation
of
DoWhileStatement
with argument
labelSet
IterationStatement
WhileStatement
1.
Return ?
WhileLoopEvaluation
of
WhileStatement
with argument
labelSet
IterationStatement
ForStatement
1.
Return ?
ForLoopEvaluation
of
ForStatement
with argument
labelSet
IterationStatement
ForInOfStatement
1.
Return ?
ForInOfLoopEvaluation
of
ForInOfStatement
with argument
labelSet
14.7.2
The
do
while
Statement
Syntax
DoWhileStatement
[Yield, Await, Return]
do
Statement
[?Yield, ?Await, ?Return]
while
Expression
[+In, ?Yield, ?Await]
14.7.2.1
Static Semantics: Early Errors
DoWhileStatement
do
Statement
while
Expression
It is a Syntax Error if
IsLabelledFunction
Statement
) is
true
Note
It is only necessary to apply this rule if the extension specified in
B.3.1
is implemented.
14.7.2.2
Runtime Semantics: DoWhileLoopEvaluation
The
syntax-directed operation
DoWhileLoopEvaluation takes argument
labelSet
(a
List
of Strings) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
DoWhileStatement
do
Statement
while
Expression
1.
Let
be
undefined
2.
Repeat,
a.
Let
stmtResult
be
Completion
Evaluation
of
Statement
).
b.
If
LoopContinues
stmtResult
labelSet
) is
false
, return ?
UpdateEmpty
stmtResult
).
c.
If
stmtResult
.[[Value]] is not
empty
, set
to
stmtResult
.[[Value]].
d.
Let
exprRef
be ?
Evaluation
of
Expression
e.
Let
exprValue
be ?
GetValue
exprRef
).
f.
If
ToBoolean
exprValue
) is
false
, return
14.7.3
The
while
Statement
Syntax
WhileStatement
[Yield, Await, Return]
while
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
14.7.3.1
Static Semantics: Early Errors
WhileStatement
while
Expression
Statement
It is a Syntax Error if
IsLabelledFunction
Statement
) is
true
Note
It is only necessary to apply this rule if the extension specified in
B.3.1
is implemented.
14.7.3.2
Runtime Semantics: WhileLoopEvaluation
The
syntax-directed operation
WhileLoopEvaluation takes argument
labelSet
(a
List
of Strings) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
WhileStatement
while
Expression
Statement
1.
Let
be
undefined
2.
Repeat,
a.
Let
exprRef
be ?
Evaluation
of
Expression
b.
Let
exprValue
be ?
GetValue
exprRef
).
c.
If
ToBoolean
exprValue
) is
false
, return
d.
Let
stmtResult
be
Completion
Evaluation
of
Statement
).
e.
If
LoopContinues
stmtResult
labelSet
) is
false
, return ?
UpdateEmpty
stmtResult
).
f.
If
stmtResult
.[[Value]] is not
empty
, set
to
stmtResult
.[[Value]].
14.7.4
The
for
Statement
Syntax
ForStatement
[Yield, Await, Return]
for
[lookahead ≠
let
Expression
[~In, ?Yield, ?Await]
opt
Expression
[+In, ?Yield, ?Await]
opt
Expression
[+In, ?Yield, ?Await]
opt
Statement
[?Yield, ?Await, ?Return]
for
var
VariableDeclarationList
[~In, ?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
opt
Expression
[+In, ?Yield, ?Await]
opt
Statement
[?Yield, ?Await, ?Return]
for
LexicalDeclaration
[~In, ?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
opt
Expression
[+In, ?Yield, ?Await]
opt
Statement
[?Yield, ?Await, ?Return]
14.7.4.1
Static Semantics: Early Errors
ForStatement
for
Expression
opt
Expression
opt
Expression
opt
Statement
for
var
VariableDeclarationList
Expression
opt
Expression
opt
Statement
for
LexicalDeclaration
Expression
opt
Expression
opt
Statement
It is a Syntax Error if
IsLabelledFunction
Statement
) is
true
Note
It is only necessary to apply this rule if the extension specified in
B.3.1
is implemented.
ForStatement
for
LexicalDeclaration
Expression
opt
Expression
opt
Statement
It is a Syntax Error if any element of the
BoundNames
of
LexicalDeclaration
also occurs in the
VarDeclaredNames
of
Statement
14.7.4.2
Runtime Semantics: ForLoopEvaluation
The
syntax-directed operation
ForLoopEvaluation takes argument
labelSet
(a
List
of Strings) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
ForStatement
for
Expression
opt
Expression
opt
Expression
opt
Statement
1.
If the first
Expression
is present, then
a.
Let
exprRef
be ?
Evaluation
of the first
Expression
b.
Perform ?
GetValue
exprRef
).
2.
If the second
Expression
is present, let
test
be the second
Expression
; otherwise, let
test
be
empty
3.
If the third
Expression
is present, let
increment
be the third
Expression
; otherwise, let
increment
be
empty
4.
Return ?
ForBodyEvaluation
test
increment
Statement
, « »,
labelSet
).
ForStatement
for
var
VariableDeclarationList
Expression
opt
Expression
opt
Statement
1.
Perform ?
Evaluation
of
VariableDeclarationList
2.
If the first
Expression
is present, let
test
be the first
Expression
; otherwise, let
test
be
empty
3.
If the second
Expression
is present, let
increment
be the second
Expression
; otherwise, let
increment
be
empty
4.
Return ?
ForBodyEvaluation
test
increment
Statement
, « »,
labelSet
).
ForStatement
for
LexicalDeclaration
Expression
opt
Expression
opt
Statement
1.
Let
oldEnv
be the
running execution context
's LexicalEnvironment.
2.
Let
loopEnv
be
NewDeclarativeEnvironment
oldEnv
).
3.
Let
isConst
be
IsConstantDeclaration
of
LexicalDeclaration
4.
Let
boundNames
be the
BoundNames
of
LexicalDeclaration
5.
For each element
dn
of
boundNames
, do
a.
If
isConst
is
true
, then
i.
Perform !
loopEnv
.CreateImmutableBinding(
dn
true
).
b.
Else,
i.
Perform !
loopEnv
.CreateMutableBinding(
dn
false
).
6.
Set the
running execution context
's LexicalEnvironment to
loopEnv
7.
Let
forDcl
be
Completion
Evaluation
of
LexicalDeclaration
).
8.
If
forDcl
is an
abrupt completion
, then
a.
Set the
running execution context
's LexicalEnvironment to
oldEnv
b.
Return ?
forDcl
9.
If
isConst
is
false
, let
perIterationLets
be
boundNames
; otherwise let
perIterationLets
be a new empty
List
10.
If the first
Expression
is present, let
test
be the first
Expression
; otherwise, let
test
be
empty
11.
If the second
Expression
is present, let
increment
be the second
Expression
; otherwise, let
increment
be
empty
12.
Let
bodyResult
be
Completion
ForBodyEvaluation
test
increment
Statement
perIterationLets
labelSet
)).
13.
Set the
running execution context
's LexicalEnvironment to
oldEnv
14.
Return ?
bodyResult
14.7.4.3
ForBodyEvaluation (
test
increment
stmt
perIterationBindings
labelSet
The abstract operation ForBodyEvaluation takes arguments
test
(an
Expression
Parse Node
or
empty
),
increment
(an
Expression
Parse Node
or
empty
),
stmt
(a
Statement
Parse Node
),
perIterationBindings
(a
List
of Strings), and
labelSet
(a
List
of Strings) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
Let
be
undefined
2.
Perform ?
CreatePerIterationEnvironment
perIterationBindings
).
3.
Repeat,
a.
If
test
is not
empty
, then
i.
Let
testRef
be ?
Evaluation
of
test
ii.
Let
testValue
be ?
GetValue
testRef
).
iii.
If
ToBoolean
testValue
) is
false
, return
b.
Let
result
be
Completion
Evaluation
of
stmt
).
c.
If
LoopContinues
result
labelSet
) is
false
, return ?
UpdateEmpty
result
).
d.
If
result
.[[Value]] is not
empty
, set
to
result
.[[Value]].
e.
Perform ?
CreatePerIterationEnvironment
perIterationBindings
).
f.
If
increment
is not
empty
, then
i.
Let
incRef
be ?
Evaluation
of
increment
ii.
Perform ?
GetValue
incRef
).
14.7.4.4
CreatePerIterationEnvironment (
perIterationBindings
The abstract operation CreatePerIterationEnvironment takes argument
perIterationBindings
(a
List
of Strings) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
If
perIterationBindings
has any elements, then
a.
Let
lastIterationEnv
be the
running execution context
's LexicalEnvironment.
b.
Let
outer
be
lastIterationEnv
.[[OuterEnv]].
c.
Assert
outer
is not
null
d.
Let
thisIterationEnv
be
NewDeclarativeEnvironment
outer
).
e.
For each element
bn
of
perIterationBindings
, do
i.
Perform !
thisIterationEnv
.CreateMutableBinding(
bn
false
).
ii.
Let
lastValue
be ?
lastIterationEnv
.GetBindingValue(
bn
true
).
iii.
Perform !
thisIterationEnv
.InitializeBinding(
bn
lastValue
).
f.
Set the
running execution context
's LexicalEnvironment to
thisIterationEnv
2.
Return
unused
14.7.5
The
for
in
for
of
, and
for
await
of
Statements
Syntax
ForInOfStatement
[Yield, Await, Return]
for
[lookahead ≠
let
LeftHandSideExpression
[?Yield, ?Await]
in
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
for
var
ForBinding
[?Yield, ?Await]
in
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
for
ForDeclaration
[?Yield, ?Await]
in
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
for
[lookahead ∉ {
let
async
of
}]
LeftHandSideExpression
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
for
var
ForBinding
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
for
ForDeclaration
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
[+Await]
for
await
[lookahead ≠
let
LeftHandSideExpression
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
[+Await]
for
await
var
ForBinding
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
[+Await]
for
await
ForDeclaration
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
ForDeclaration
[Yield, Await]
LetOrConst
ForBinding
[?Yield, ?Await]
ForBinding
[Yield, Await]
BindingIdentifier
[?Yield, ?Await]
BindingPattern
[?Yield, ?Await]
Note
This section is extended by Annex
B.3.5
14.7.5.1
Static Semantics: Early Errors
ForInOfStatement
for
LeftHandSideExpression
in
Expression
Statement
for
var
ForBinding
in
Expression
Statement
for
ForDeclaration
in
Expression
Statement
for
LeftHandSideExpression
of
AssignmentExpression
Statement
for
var
ForBinding
of
AssignmentExpression
Statement
for
ForDeclaration
of
AssignmentExpression
Statement
for
await
LeftHandSideExpression
of
AssignmentExpression
Statement
for
await
var
ForBinding
of
AssignmentExpression
Statement
for
await
ForDeclaration
of
AssignmentExpression
Statement
It is a Syntax Error if
IsLabelledFunction
Statement
) is
true
Note
It is only necessary to apply this rule if the extension specified in
B.3.1
is implemented.
ForInOfStatement
for
LeftHandSideExpression
in
Expression
Statement
for
LeftHandSideExpression
of
AssignmentExpression
Statement
for
await
LeftHandSideExpression
of
AssignmentExpression
Statement
If
LeftHandSideExpression
is either an
ObjectLiteral
or an
ArrayLiteral
, the following Early Error rules are applied:
LeftHandSideExpression
must cover
an
AssignmentPattern
If
LeftHandSideExpression
is neither an
ObjectLiteral
nor an
ArrayLiteral
, the following Early Error rule is applied:
It is a Syntax Error if
AssignmentTargetType
of
LeftHandSideExpression
is not
simple
ForInOfStatement
for
ForDeclaration
in
Expression
Statement
for
ForDeclaration
of
AssignmentExpression
Statement
for
await
ForDeclaration
of
AssignmentExpression
Statement
It is a Syntax Error if the
BoundNames
of
ForDeclaration
contains
"let"
It is a Syntax Error if any element of the
BoundNames
of
ForDeclaration
also occurs in the
VarDeclaredNames
of
Statement
It is a Syntax Error if the
BoundNames
of
ForDeclaration
contains any duplicate entries.
14.7.5.2
Static Semantics: IsDestructuring
The
syntax-directed operation
IsDestructuring takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
MemberExpression
PrimaryExpression
1.
If
PrimaryExpression
is either an
ObjectLiteral
or an
ArrayLiteral
, return
true
2.
Return
false
MemberExpression
MemberExpression
Expression
MemberExpression
IdentifierName
MemberExpression
TemplateLiteral
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
PrivateIdentifier
NewExpression
new
NewExpression
LeftHandSideExpression
CallExpression
OptionalExpression
1.
Return
false
ForDeclaration
LetOrConst
ForBinding
1.
Return
IsDestructuring
of
ForBinding
ForBinding
BindingIdentifier
1.
Return
false
ForBinding
BindingPattern
1.
Return
true
Note
This section is extended by Annex
B.3.5
14.7.5.3
Runtime Semantics: ForDeclarationBindingInitialization
The
syntax-directed operation
ForDeclarationBindingInitialization takes arguments
value
(an
ECMAScript language value
) and
environment
(an
Environment Record
or
undefined
) and returns either a
normal completion containing
unused
or an
abrupt completion
Note
undefined
is passed for
environment
to indicate that a
PutValue
operation should be used to assign the initialization value. This is the case for
var
statements and the formal parameter lists of some
non-strict functions
(see
10.2.11
). In those cases a lexical binding is hoisted and preinitialized prior to evaluation of its initializer.
It is defined piecewise over the following productions:
ForDeclaration
LetOrConst
ForBinding
1.
Return ?
BindingInitialization
of
ForBinding
with arguments
value
and
environment
14.7.5.4
Runtime Semantics: ForDeclarationBindingInstantiation
The
syntax-directed operation
ForDeclarationBindingInstantiation takes argument
environment
(a
Declarative Environment Record
) and returns
unused
. It is defined piecewise over the following productions:
ForDeclaration
LetOrConst
ForBinding
1.
For each element
name
of the
BoundNames
of
ForBinding
, do
a.
If
IsConstantDeclaration
of
LetOrConst
is
true
, then
i.
Perform !
environment
.CreateImmutableBinding(
name
true
).
b.
Else,
i.
Perform !
environment
.CreateMutableBinding(
name
false
).
2.
Return
unused
14.7.5.5
Runtime Semantics: ForInOfLoopEvaluation
The
syntax-directed operation
ForInOfLoopEvaluation takes argument
labelSet
(a
List
of Strings) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
ForInOfStatement
for
LeftHandSideExpression
in
Expression
Statement
1.
Let
keyResult
be ?
ForIn/OfHeadEvaluation
(« »,
Expression
enumerate
).
2.
Return ?
ForIn/OfBodyEvaluation
LeftHandSideExpression
Statement
keyResult
enumerate
assignment
labelSet
).
ForInOfStatement
for
var
ForBinding
in
Expression
Statement
1.
Let
keyResult
be ?
ForIn/OfHeadEvaluation
(« »,
Expression
enumerate
).
2.
Return ?
ForIn/OfBodyEvaluation
ForBinding
Statement
keyResult
enumerate
varBinding
labelSet
).
ForInOfStatement
for
ForDeclaration
in
Expression
Statement
1.
Let
keyResult
be ?
ForIn/OfHeadEvaluation
BoundNames
of
ForDeclaration
Expression
enumerate
).
2.
Return ?
ForIn/OfBodyEvaluation
ForDeclaration
Statement
keyResult
enumerate
lexicalBinding
labelSet
).
ForInOfStatement
for
LeftHandSideExpression
of
AssignmentExpression
Statement
1.
Let
keyResult
be ?
ForIn/OfHeadEvaluation
(« »,
AssignmentExpression
iterate
).
2.
Return ?
ForIn/OfBodyEvaluation
LeftHandSideExpression
Statement
keyResult
iterate
assignment
labelSet
).
ForInOfStatement
for
var
ForBinding
of
AssignmentExpression
Statement
1.
Let
keyResult
be ?
ForIn/OfHeadEvaluation
(« »,
AssignmentExpression
iterate
).
2.
Return ?
ForIn/OfBodyEvaluation
ForBinding
Statement
keyResult
iterate
varBinding
labelSet
).
ForInOfStatement
for
ForDeclaration
of
AssignmentExpression
Statement
1.
Let
keyResult
be ?
ForIn/OfHeadEvaluation
BoundNames
of
ForDeclaration
AssignmentExpression
iterate
).
2.
Return ?
ForIn/OfBodyEvaluation
ForDeclaration
Statement
keyResult
iterate
lexicalBinding
labelSet
).
ForInOfStatement
for
await
LeftHandSideExpression
of
AssignmentExpression
Statement
1.
Let
keyResult
be ?
ForIn/OfHeadEvaluation
(« »,
AssignmentExpression
async-iterate
).
2.
Return ?
ForIn/OfBodyEvaluation
LeftHandSideExpression
Statement
keyResult
iterate
assignment
labelSet
async
).
ForInOfStatement
for
await
var
ForBinding
of
AssignmentExpression
Statement
1.
Let
keyResult
be ?
ForIn/OfHeadEvaluation
(« »,
AssignmentExpression
async-iterate
).
2.
Return ?
ForIn/OfBodyEvaluation
ForBinding
Statement
keyResult
iterate
varBinding
labelSet
async
).
ForInOfStatement
for
await
ForDeclaration
of
AssignmentExpression
Statement
1.
Let
keyResult
be ?
ForIn/OfHeadEvaluation
BoundNames
of
ForDeclaration
AssignmentExpression
async-iterate
).
2.
Return ?
ForIn/OfBodyEvaluation
ForDeclaration
Statement
keyResult
iterate
lexicalBinding
labelSet
async
).
Note
This section is extended by Annex
B.3.5
14.7.5.6
ForIn/OfHeadEvaluation (
uninitializedBoundNames
expr
iterationKind
The abstract operation ForIn/OfHeadEvaluation takes arguments
uninitializedBoundNames
(a
List
of Strings),
expr
(an
Expression
Parse Node
or an
AssignmentExpression
Parse Node
), and
iterationKind
enumerate
iterate
, or
async-iterate
) and returns either a
normal completion containing
an
Iterator Record
or an
abrupt completion
. It performs the following steps when called:
1.
Let
oldEnv
be the
running execution context
's LexicalEnvironment.
2.
If
uninitializedBoundNames
is not empty, then
a.
Assert
uninitializedBoundNames
has no duplicate entries.
b.
Let
newEnv
be
NewDeclarativeEnvironment
oldEnv
).
c.
For each String
name
of
uninitializedBoundNames
, do
i.
Perform !
newEnv
.CreateMutableBinding(
name
false
).
d.
Set the
running execution context
's LexicalEnvironment to
newEnv
3.
Let
exprRef
be
Completion
Evaluation
of
expr
).
4.
Set the
running execution context
's LexicalEnvironment to
oldEnv
5.
Let
exprValue
be ?
GetValue
(?
exprRef
).
6.
If
iterationKind
is
enumerate
, then
a.
If
exprValue
is either
undefined
or
null
, then
i.
Return
Completion Record
{ [[Type]]:
break
, [[Value]]:
empty
, [[Target]]:
empty
}.
b.
Let
obj
be !
ToObject
exprValue
).
c.
Let
iterator
be
EnumerateObjectProperties
obj
).
d.
Let
nextMethod
be !
GetV
iterator
"next"
).
e.
Return the
Iterator Record
{ [[Iterator]]:
iterator
, [[NextMethod]]:
nextMethod
, [[Done]]:
false
}.
7.
Else,
a.
Assert
iterationKind
is either
iterate
or
async-iterate
b.
If
iterationKind
is
async-iterate
, let
iteratorKind
be
async
c.
Else, let
iteratorKind
be
sync
d.
Return ?
GetIterator
exprValue
iteratorKind
).
14.7.5.7
ForIn/OfBodyEvaluation (
lhs
stmt
iteratorRecord
iterationKind
lhsKind
labelSet
[ ,
iteratorKind
] )
The abstract operation ForIn/OfBodyEvaluation takes arguments
lhs
(a
Parse Node
),
stmt
(a
Statement
Parse Node
),
iteratorRecord
(an
Iterator Record
),
iterationKind
enumerate
or
iterate
),
lhsKind
assignment
varBinding
, or
lexicalBinding
), and
labelSet
(a
List
of Strings) and optional argument
iteratorKind
sync
or
async
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
If
iteratorKind
is not present, set
iteratorKind
to
sync
2.
Let
oldEnv
be the
running execution context
's LexicalEnvironment.
3.
Let
be
undefined
4.
Let
destructuring
be
IsDestructuring
of
lhs
5.
If
destructuring
is
true
and
lhsKind
is
assignment
, then
a.
Assert
lhs
is a
LeftHandSideExpression
b.
Let
assignmentPattern
be the
AssignmentPattern
that is
covered
by
lhs
6.
Repeat,
a.
Let
nextResult
be ?
Call
iteratorRecord
.[[NextMethod]],
iteratorRecord
.[[Iterator]]).
b.
If
iteratorKind
is
async
, set
nextResult
to ?
Await
nextResult
).
c.
If
nextResult
is not an Object
, throw a
TypeError
exception.
d.
Let
done
be ?
IteratorComplete
nextResult
).
e.
If
done
is
true
, return
f.
Let
nextValue
be ?
IteratorValue
nextResult
).
g.
If
lhsKind
is either
assignment
or
varBinding
, then
i.
If
destructuring
is
true
, then
1.
If
lhsKind
is
assignment
, then
a.
Let
status
be
Completion
DestructuringAssignmentEvaluation
of
assignmentPattern
with argument
nextValue
).
2.
Else,
a.
Assert
lhsKind
is
varBinding
b.
Assert
lhs
is a
ForBinding
c.
Let
status
be
Completion
BindingInitialization
of
lhs
with arguments
nextValue
and
undefined
).
ii.
Else,
1.
Let
lhsRef
be
Completion
Evaluation
of
lhs
). (It may be evaluated repeatedly.)
2.
If
lhsRef
is an
abrupt completion
, then
a.
Let
status
be
lhsRef
3.
Else,
a.
Let
status
be
Completion
PutValue
lhsRef
.[[Value]],
nextValue
)).
h.
Else,
i.
Assert
lhsKind
is
lexicalBinding
ii.
Assert
lhs
is a
ForDeclaration
iii.
Let
iterationEnv
be
NewDeclarativeEnvironment
oldEnv
).
iv.
Perform
ForDeclarationBindingInstantiation
of
lhs
with argument
iterationEnv
v.
Set the
running execution context
's LexicalEnvironment to
iterationEnv
vi.
If
destructuring
is
true
, then
1.
Let
status
be
Completion
ForDeclarationBindingInitialization
of
lhs
with arguments
nextValue
and
iterationEnv
).
vii.
Else,
1.
Assert
lhs
binds a single name.
2.
Let
lhsName
be the sole element of
BoundNames
of
lhs
3.
Let
lhsRef
be !
ResolveBinding
lhsName
).
4.
Let
status
be
Completion
InitializeReferencedBinding
lhsRef
nextValue
)).
i.
If
status
is an
abrupt completion
, then
i.
Set the
running execution context
's LexicalEnvironment to
oldEnv
ii.
If
iteratorKind
is
async
, return ?
AsyncIteratorClose
iteratorRecord
status
).
iii.
If
iterationKind
is
enumerate
, then
1.
Return ?
status
iv.
Else,
1.
Assert
iterationKind
is
iterate
2.
Return ?
IteratorClose
iteratorRecord
status
).
j.
Let
result
be
Completion
Evaluation
of
stmt
).
k.
Set the
running execution context
's LexicalEnvironment to
oldEnv
l.
If
LoopContinues
result
labelSet
) is
false
, then
i.
If
iterationKind
is
enumerate
, then
1.
Return ?
UpdateEmpty
result
).
ii.
Else,
1.
Assert
iterationKind
is
iterate
2.
Set
status
to
Completion
UpdateEmpty
result
)).
3.
If
iteratorKind
is
async
, return ?
AsyncIteratorClose
iteratorRecord
status
).
4.
Return ?
IteratorClose
iteratorRecord
status
).
m.
If
result
.[[Value]] is not
empty
, set
to
result
.[[Value]].
14.7.5.8
Runtime Semantics: Evaluation
BindingIdentifier
Identifier
yield
await
1.
Let
bindingId
be
StringValue
of
BindingIdentifier
2.
Return ?
ResolveBinding
bindingId
).
14.7.5.9
EnumerateObjectProperties (
The abstract operation EnumerateObjectProperties takes argument
(an Object) and returns an Iterator. It performs the following steps when called:
1.
Return an Iterator object (
27.1.1.2
) whose
next
method iterates over all the String-valued keys of enumerable properties of
The iterator object is never directly accessible to ECMAScript code.
The mechanics and order of enumerating the properties is not specified
but must conform to the rules specified below.
The iterator's
throw
and
return
methods are
null
and are never invoked. The iterator's
next
method processes object properties to determine whether the
property key
should be returned as an iterator value. Returned
property keys
do not include keys that are Symbols. Properties of the target object
may be deleted during enumeration. A property that is deleted before it
is processed by the iterator's
next
method is ignored. If
new properties are added to the target object during enumeration, the
newly added properties are not guaranteed to be processed in the active
enumeration. A
property name
will be returned by the iterator's
next
method at most once in any enumeration.
Enumerating the properties of the target object includes
enumerating properties of its prototype, and the prototype of the
prototype, and so on, recursively; but a property of a prototype is not
processed if it has the same name as a property that has already been
processed by the iterator's
next
method. The values of
[[Enumerable]] attributes are not considered when determining if a
property of a prototype object has already been processed. The
enumerable property names of prototype objects must be obtained by
invoking EnumerateObjectProperties passing the prototype object as the
argument. EnumerateObjectProperties must obtain the own
property keys
of the target object by calling its [[OwnPropertyKeys]] internal
method. Property attributes of the target object must be obtained by
calling its [[GetOwnProperty]] internal method.
In addition, if neither
nor any object in its prototype chain is a
Proxy exotic object
Integer-Indexed exotic object
module namespace exotic object
, or implementation provided
exotic object
, then the iterator must behave as would the iterator given by
CreateForInIterator
) until one of the following occurs:
the value of the [[Prototype]] internal slot of
or an object in its prototype chain changes,
a property is removed from
or an object in its prototype chain,
a property is added to an object in
's prototype chain, or
the value of the [[Enumerable]] attribute of a property of
or an object in its prototype chain changes.
Note 1
ECMAScript implementations are not required to implement the algorithm in
14.7.5.10.2.1
directly. They may choose any implementation whose behaviour will not
deviate from that algorithm unless one of the constraints in the
previous paragraph is violated.
The following is an informative definition of an ECMAScript generator function that conforms to these rules:
function
EnumerateObjectProperties
(obj) {
const
visited =
new
Set
();
for
const
key
of
Reflect
ownKeys
(obj)) {
if
typeof
key ===
"symbol"
continue
const
desc =
Reflect
getOwnPropertyDescriptor
(obj, key);
if
(desc) {
visited.
add
(key);
if
(desc.
enumerable
yield
key;
const
proto =
Reflect
getPrototypeOf
(obj);
if
(proto ===
null
return
for
const
protoKey
of
EnumerateObjectProperties
(proto)) {
if
(!visited.
has
(protoKey))
yield
protoKey;
Note 2
The list of
exotic objects
for which implementations are not required to match
CreateForInIterator
was chosen because implementations historically differed in behaviour for those cases, and agreed in all others.
14.7.5.10
For-In Iterator Objects
A For-In Iterator is an object that represents a specific
iteration over some specific object. For-In Iterator objects are never
directly accessible to ECMAScript code; they exist solely to illustrate
the behaviour of
EnumerateObjectProperties
14.7.5.10.1
CreateForInIterator (
object
The abstract operation CreateForInIterator takes argument
object
(an Object) and returns a For-In Iterator. It is used to create a
For-In Iterator object which iterates over the own and inherited
enumerable string properties of
object
in a specific order. It performs the following steps when called:
1.
Let
iterator
be
OrdinaryObjectCreate
%ForInIteratorPrototype%
, « [[Object]], [[ObjectWasVisited]], [[VisitedKeys]], [[RemainingKeys]] »).
2.
Set
iterator
.[[Object]] to
object
3.
Set
iterator
.[[ObjectWasVisited]] to
false
4.
Set
iterator
.[[VisitedKeys]] to a new empty
List
5.
Set
iterator
.[[RemainingKeys]] to a new empty
List
6.
Return
iterator
14.7.5.10.2
The %ForInIteratorPrototype% Object
The
%ForInIteratorPrototype%
object:
has properties that are inherited by all For-In Iterator Objects.
is an
ordinary object
has a [[Prototype]] internal slot whose value is
%IteratorPrototype%
is never directly accessible to ECMAScript code.
has the following properties:
14.7.5.10.2.1
%ForInIteratorPrototype%.next ( )
1.
Let
be the
this
value.
2.
Assert
is an Object
3.
Assert
has all of the internal slots of a For-In Iterator Instance (
14.7.5.10.3
).
4.
Let
object
be
.[[Object]].
5.
Repeat,
a.
If
.[[ObjectWasVisited]] is
false
, then
i.
Let
keys
be ?
object
.[[OwnPropertyKeys]]()
ii.
For each element
key
of
keys
, do
1.
If
key
is a String
, then
a.
Append
key
to
.[[RemainingKeys]].
iii.
Set
.[[ObjectWasVisited]] to
true
b.
Repeat, while
.[[RemainingKeys]] is not empty,
i.
Let
be the first element of
.[[RemainingKeys]].
ii.
Remove the first element from
.[[RemainingKeys]].
iii.
If there does not exist an element
of
.[[VisitedKeys]] such that
SameValue
) is
true
, then
1.
Let
desc
be ?
object
.[[GetOwnProperty]]
).
2.
If
desc
is not
undefined
, then
a.
Append
to
.[[VisitedKeys]].
b.
If
desc
.[[Enumerable]] is
true
, return
CreateIterResultObject
false
).
c.
Set
object
to ?
object
.[[GetPrototypeOf]]()
d.
Set
.[[Object]] to
object
e.
Set
.[[ObjectWasVisited]] to
false
f.
If
object
is
null
, return
CreateIterResultObject
undefined
true
).
14.7.5.10.3
Properties of For-In Iterator Instances
For-In Iterator instances are
ordinary objects
that inherit properties from the
%ForInIteratorPrototype%
intrinsic object. For-In Iterator instances are initially created with the internal slots listed in
Table 38
Table 38: Internal Slots of For-In Iterator Instances
Internal Slot
Type
Description
[[Object]]
an Object
The Object value whose properties are being iterated.
[[ObjectWasVisited]]
a Boolean
true
if the iterator has invoked [[OwnPropertyKeys]] on [[Object]],
false
otherwise.
[[VisitedKeys]]
List
of Strings
The values that have been emitted by this iterator thus far.
[[RemainingKeys]]
List
of Strings
The values remaining to be emitted for the current
object, before iterating the properties of its prototype (if its
prototype is not
null
).
14.8
The
continue
Statement
Syntax
ContinueStatement
[Yield, Await]
continue
continue
[no
LineTerminator
here]
LabelIdentifier
[?Yield, ?Await]
14.8.1
Static Semantics: Early Errors
ContinueStatement
continue
continue
LabelIdentifier
It is a Syntax Error if this
ContinueStatement
is not nested, directly or indirectly (but not crossing function or
static
initialization block boundaries), within an
IterationStatement
14.8.2
Runtime Semantics: Evaluation
ContinueStatement
continue
1.
Return
Completion Record
{ [[Type]]:
continue
, [[Value]]:
empty
, [[Target]]:
empty
}.
ContinueStatement
continue
LabelIdentifier
1.
Let
label
be the
StringValue
of
LabelIdentifier
2.
Return
Completion Record
{ [[Type]]:
continue
, [[Value]]:
empty
, [[Target]]:
label
}.
14.9
The
break
Statement
Syntax
BreakStatement
[Yield, Await]
break
break
[no
LineTerminator
here]
LabelIdentifier
[?Yield, ?Await]
14.9.1
Static Semantics: Early Errors
BreakStatement
break
It is a Syntax Error if this
BreakStatement
is not nested, directly or indirectly (but not crossing function or
static
initialization block boundaries), within an
IterationStatement
or a
SwitchStatement
14.9.2
Runtime Semantics: Evaluation
BreakStatement
break
1.
Return
Completion Record
{ [[Type]]:
break
, [[Value]]:
empty
, [[Target]]:
empty
}.
BreakStatement
break
LabelIdentifier
1.
Let
label
be the
StringValue
of
LabelIdentifier
2.
Return
Completion Record
{ [[Type]]:
break
, [[Value]]:
empty
, [[Target]]:
label
}.
14.10
The
return
Statement
Syntax
ReturnStatement
[Yield, Await]
return
return
[no
LineTerminator
here]
Expression
[+In, ?Yield, ?Await]
Note
return
statement causes a function to cease execution and, in most cases, returns a value to the caller. If
Expression
is omitted, the return value is
undefined
. Otherwise, the return value is the value of
Expression
. A
return
statement may not actually return a value to the caller depending on surrounding context. For example, in a
try
block, a
return
statement's
Completion Record
may be replaced with another
Completion Record
during evaluation of the
finally
block.
14.10.1
Runtime Semantics: Evaluation
ReturnStatement
return
1.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
undefined
, [[Target]]:
empty
}.
ReturnStatement
return
Expression
1.
Let
exprRef
be ?
Evaluation
of
Expression
2.
Let
exprValue
be ?
GetValue
exprRef
).
3.
If
GetGeneratorKind
() is
async
, set
exprValue
to ?
Await
exprValue
).
4.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
exprValue
, [[Target]]:
empty
}.
Legacy
14.11
The
with
Statement
Note 1
Use of the
Legacy
with
statement is discouraged in new ECMAScript code. Consider alternatives that are permitted in both
strict mode code
and
non-strict code
, such as
destructuring assignment
Syntax
WithStatement
[Yield, Await, Return]
with
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
Note 2
The
with
statement adds an
Object Environment Record
for a computed object to the lexical environment of the
running execution context
. It then executes a statement using this augmented lexical environment. Finally, it restores the original lexical environment.
14.11.1
Static Semantics: Early Errors
WithStatement
with
Expression
Statement
It is a Syntax Error if the
source text matched by
this production is contained in
strict mode code
It is a Syntax Error if
IsLabelledFunction
Statement
) is
true
Note
It is only necessary to apply the second rule if the extension specified in
B.3.1
is implemented.
14.11.2
Runtime Semantics: Evaluation
WithStatement
with
Expression
Statement
1.
Let
val
be ?
Evaluation
of
Expression
2.
Let
obj
be ?
ToObject
(?
GetValue
val
)).
3.
Let
oldEnv
be the
running execution context
's LexicalEnvironment.
4.
Let
newEnv
be
NewObjectEnvironment
obj
true
oldEnv
).
5.
Set the
running execution context
's LexicalEnvironment to
newEnv
6.
Let
be
Completion
Evaluation
of
Statement
).
7.
Set the
running execution context
's LexicalEnvironment to
oldEnv
8.
Return ?
UpdateEmpty
undefined
).
Note
No matter how control leaves the embedded
Statement
, whether normally or by some form of
abrupt completion
or exception, the LexicalEnvironment is always restored to its former state.
14.12
The
switch
Statement
Syntax
SwitchStatement
[Yield, Await, Return]
switch
Expression
[+In, ?Yield, ?Await]
CaseBlock
[?Yield, ?Await, ?Return]
CaseBlock
[Yield, Await, Return]
CaseClauses
[?Yield, ?Await, ?Return]
opt
CaseClauses
[?Yield, ?Await, ?Return]
opt
DefaultClause
[?Yield, ?Await, ?Return]
CaseClauses
[?Yield, ?Await, ?Return]
opt
CaseClauses
[Yield, Await, Return]
CaseClause
[?Yield, ?Await, ?Return]
CaseClauses
[?Yield, ?Await, ?Return]
CaseClause
[?Yield, ?Await, ?Return]
CaseClause
[Yield, Await, Return]
case
Expression
[+In, ?Yield, ?Await]
StatementList
[?Yield, ?Await, ?Return]
opt
DefaultClause
[Yield, Await, Return]
default
StatementList
[?Yield, ?Await, ?Return]
opt
14.12.1
Static Semantics: Early Errors
SwitchStatement
switch
Expression
CaseBlock
It is a Syntax Error if the
LexicallyDeclaredNames
of
CaseBlock
contains any duplicate entries.
It is a Syntax Error if any element of the
LexicallyDeclaredNames
of
CaseBlock
also occurs in the
VarDeclaredNames
of
CaseBlock
14.12.2
Runtime Semantics: CaseBlockEvaluation
The
syntax-directed operation
CaseBlockEvaluation takes argument
input
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
CaseBlock
1.
Return
undefined
CaseBlock
CaseClauses
1.
Let
be
undefined
2.
Let
be the
List
of
CaseClause
items in
CaseClauses
, in source text order.
3.
Let
found
be
false
4.
For each
CaseClause
of
, do
a.
If
found
is
false
, then
i.
Set
found
to ?
CaseClauseIsSelected
input
).
b.
If
found
is
true
, then
i.
Let
be
Completion
Evaluation
of
).
ii.
If
.[[Value]] is not
empty
, set
to
.[[Value]].
iii.
If
is an
abrupt completion
, return ?
UpdateEmpty
).
5.
Return
CaseBlock
CaseClauses
opt
DefaultClause
CaseClauses
opt
1.
Let
be
undefined
2.
If the first
CaseClauses
is present, then
a.
Let
be the
List
of
CaseClause
items in the first
CaseClauses
, in source text order.
3.
Else,
a.
Let
be a new empty
List
4.
Let
found
be
false
5.
For each
CaseClause
of
, do
a.
If
found
is
false
, then
i.
Set
found
to ?
CaseClauseIsSelected
input
).
b.
If
found
is
true
, then
i.
Let
be
Completion
Evaluation
of
).
ii.
If
.[[Value]] is not
empty
, set
to
.[[Value]].
iii.
If
is an
abrupt completion
, return ?
UpdateEmpty
).
6.
Let
foundInB
be
false
7.
If the second
CaseClauses
is present, then
a.
Let
be the
List
of
CaseClause
items in the second
CaseClauses
, in source text order.
8.
Else,
a.
Let
be a new empty
List
9.
If
found
is
false
, then
a.
For each
CaseClause
of
, do
i.
If
foundInB
is
false
, then
1.
Set
foundInB
to ?
CaseClauseIsSelected
input
).
ii.
If
foundInB
is
true
, then
1.
Let
be
Completion
Evaluation
of
CaseClause
).
2.
If
.[[Value]] is not
empty
, set
to
.[[Value]].
3.
If
is an
abrupt completion
, return ?
UpdateEmpty
).
10.
If
foundInB
is
true
, return
11.
Let
be
Completion
Evaluation
of
DefaultClause
).
12.
If
.[[Value]] is not
empty
, set
to
.[[Value]].
13.
If
is an
abrupt completion
, return ?
UpdateEmpty
).
14.
NOTE: The following is another complete iteration of the second
CaseClauses
15.
For each
CaseClause
of
, do
a.
Let
be
Completion
Evaluation
of
CaseClause
).
b.
If
.[[Value]] is not
empty
, set
to
.[[Value]].
c.
If
is an
abrupt completion
, return ?
UpdateEmpty
).
16.
Return
14.12.3
CaseClauseIsSelected (
input
The abstract operation CaseClauseIsSelected takes arguments
(a
CaseClause
Parse Node
) and
input
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or an
abrupt completion
. It determines whether
matches
input
. It performs the following steps when called:
1.
Assert
is an instance of the production
CaseClause
case
Expression
StatementList
opt
2.
Let
exprRef
be ?
Evaluation
of the
Expression
of
3.
Let
clauseSelector
be ?
GetValue
exprRef
).
4.
Return
IsStrictlyEqual
input
clauseSelector
).
Note
This operation does not execute
's
StatementList
(if any). The
CaseBlock
algorithm uses its return value to determine which
StatementList
to start executing.
14.12.4
Runtime Semantics: Evaluation
SwitchStatement
switch
Expression
CaseBlock
1.
Let
exprRef
be ?
Evaluation
of
Expression
2.
Let
switchValue
be ?
GetValue
exprRef
).
3.
Let
oldEnv
be the
running execution context
's LexicalEnvironment.
4.
Let
blockEnv
be
NewDeclarativeEnvironment
oldEnv
).
5.
Perform
BlockDeclarationInstantiation
CaseBlock
blockEnv
).
6.
Set the
running execution context
's LexicalEnvironment to
blockEnv
7.
Let
be
Completion
CaseBlockEvaluation
of
CaseBlock
with argument
switchValue
).
8.
Set the
running execution context
's LexicalEnvironment to
oldEnv
9.
Return
Note
No matter how control leaves the
SwitchStatement
the LexicalEnvironment is always restored to its former state.
CaseClause
case
Expression
1.
Return
empty
CaseClause
case
Expression
StatementList
1.
Return ?
Evaluation
of
StatementList
DefaultClause
default
1.
Return
empty
DefaultClause
default
StatementList
1.
Return ?
Evaluation
of
StatementList
14.13
Labelled Statements
Syntax
LabelledStatement
[Yield, Await, Return]
LabelIdentifier
[?Yield, ?Await]
LabelledItem
[?Yield, ?Await, ?Return]
LabelledItem
[Yield, Await, Return]
Statement
[?Yield, ?Await, ?Return]
FunctionDeclaration
[?Yield, ?Await, ~Default]
Note
Statement
may be prefixed by a label. Labelled statements are only used in conjunction with labelled
break
and
continue
statements. ECMAScript has no
goto
statement. A
Statement
can be part of a
LabelledStatement
, which itself can be part of a
LabelledStatement
and so on. The labels introduced this way are collectively referred to
as the “current label set” when describing the semantics of individual
statements.
14.13.1
Static Semantics: Early Errors
LabelledItem
FunctionDeclaration
It is a Syntax Error if any source text is matched by this production.
Note
An alternative definition for this rule is provided in
B.3.1
14.13.2
Static Semantics: IsLabelledFunction (
stmt
The abstract operation IsLabelledFunction takes argument
stmt
(a
Statement
Parse Node
) and returns a Boolean. It performs the following steps when called:
1.
If
stmt
is not a
LabelledStatement
, return
false
2.
Let
item
be the
LabelledItem
of
stmt
3.
If
item
is
LabelledItem
FunctionDeclaration
, return
true
4.
Let
subStmt
be the
Statement
of
item
5.
Return
IsLabelledFunction
subStmt
).
14.13.3
Runtime Semantics: Evaluation
LabelledStatement
LabelIdentifier
LabelledItem
1.
Return ?
LabelledEvaluation
of this
LabelledStatement
with argument « ».
14.13.4
Runtime Semantics: LabelledEvaluation
The
syntax-directed operation
LabelledEvaluation takes argument
labelSet
(a
List
of Strings) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
BreakableStatement
IterationStatement
1.
Let
stmtResult
be
Completion
LoopEvaluation
of
IterationStatement
with argument
labelSet
).
2.
If
stmtResult
.[[Type]] is
break
, then
a.
If
stmtResult
.[[Target]] is
empty
, then
i.
If
stmtResult
.[[Value]] is
empty
, set
stmtResult
to
NormalCompletion
undefined
).
ii.
Else, set
stmtResult
to
NormalCompletion
stmtResult
.[[Value]]).
3.
Return ?
stmtResult
BreakableStatement
SwitchStatement
1.
Let
stmtResult
be
Completion
Evaluation
of
SwitchStatement
).
2.
If
stmtResult
.[[Type]] is
break
, then
a.
If
stmtResult
.[[Target]] is
empty
, then
i.
If
stmtResult
.[[Value]] is
empty
, set
stmtResult
to
NormalCompletion
undefined
).
ii.
Else, set
stmtResult
to
NormalCompletion
stmtResult
.[[Value]]).
3.
Return ?
stmtResult
Note 1
BreakableStatement
is one that can be exited via an unlabelled
BreakStatement
LabelledStatement
LabelIdentifier
LabelledItem
1.
Let
label
be the
StringValue
of
LabelIdentifier
2.
Let
newLabelSet
be the
list-concatenation
of
labelSet
and «
label
».
3.
Let
stmtResult
be
Completion
LabelledEvaluation
of
LabelledItem
with argument
newLabelSet
).
4.
If
stmtResult
.[[Type]] is
break
and
SameValue
stmtResult
.[[Target]],
label
) is
true
, then
a.
Set
stmtResult
to
NormalCompletion
stmtResult
.[[Value]]).
5.
Return ?
stmtResult
LabelledItem
FunctionDeclaration
1.
Return ?
Evaluation
of
FunctionDeclaration
Statement
BlockStatement
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
ThrowStatement
TryStatement
DebuggerStatement
1.
Return ?
Evaluation
of
Statement
Note 2
The only two productions of
Statement
which have special semantics for LabelledEvaluation are
BreakableStatement
and
LabelledStatement
14.14
The
throw
Statement
Syntax
ThrowStatement
[Yield, Await]
throw
[no
LineTerminator
here]
Expression
[+In, ?Yield, ?Await]
14.14.1
Runtime Semantics: Evaluation
ThrowStatement
throw
Expression
1.
Let
exprRef
be ?
Evaluation
of
Expression
2.
Let
exprValue
be ?
GetValue
exprRef
).
3.
Return
ThrowCompletion
exprValue
).
14.15
The
try
Statement
Syntax
TryStatement
[Yield, Await, Return]
try
Block
[?Yield, ?Await, ?Return]
Catch
[?Yield, ?Await, ?Return]
try
Block
[?Yield, ?Await, ?Return]
Finally
[?Yield, ?Await, ?Return]
try
Block
[?Yield, ?Await, ?Return]
Catch
[?Yield, ?Await, ?Return]
Finally
[?Yield, ?Await, ?Return]
Catch
[Yield, Await, Return]
catch
CatchParameter
[?Yield, ?Await]
Block
[?Yield, ?Await, ?Return]
catch
Block
[?Yield, ?Await, ?Return]
Finally
[Yield, Await, Return]
finally
Block
[?Yield, ?Await, ?Return]
CatchParameter
[Yield, Await]
BindingIdentifier
[?Yield, ?Await]
BindingPattern
[?Yield, ?Await]
Note
The
try
statement encloses a block of code in which an exceptional condition can occur, such as a runtime error or a
throw
statement. The
catch
clause provides the exception-handling code. When a catch clause catches an exception, its
CatchParameter
is bound to that exception.
14.15.1
Static Semantics: Early Errors
Catch
catch
CatchParameter
Block
It is a Syntax Error if
BoundNames
of
CatchParameter
contains any duplicate elements.
It is a Syntax Error if any element of the
BoundNames
of
CatchParameter
also occurs in the
LexicallyDeclaredNames
of
Block
It is a Syntax Error if any element of the
BoundNames
of
CatchParameter
also occurs in the
VarDeclaredNames
of
Block
Note
An alternative
static semantics
for this production is given in
B.3.4
14.15.2
Runtime Semantics: CatchClauseEvaluation
The
syntax-directed operation
CatchClauseEvaluation takes argument
thrownValue
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
Catch
catch
CatchParameter
Block
1.
Let
oldEnv
be the
running execution context
's LexicalEnvironment.
2.
Let
catchEnv
be
NewDeclarativeEnvironment
oldEnv
).
3.
For each element
argName
of the
BoundNames
of
CatchParameter
, do
a.
Perform !
catchEnv
.CreateMutableBinding(
argName
false
).
4.
Set the
running execution context
's LexicalEnvironment to
catchEnv
5.
Let
status
be
Completion
BindingInitialization
of
CatchParameter
with arguments
thrownValue
and
catchEnv
).
6.
If
status
is an
abrupt completion
, then
a.
Set the
running execution context
's LexicalEnvironment to
oldEnv
b.
Return ?
status
7.
Let
be
Completion
Evaluation
of
Block
).
8.
Set the
running execution context
's LexicalEnvironment to
oldEnv
9.
Return ?
Catch
catch
Block
1.
Return ?
Evaluation
of
Block
Note
No matter how control leaves the
Block
the LexicalEnvironment is always restored to its former state.
14.15.3
Runtime Semantics: Evaluation
TryStatement
try
Block
Catch
1.
Let
be
Completion
Evaluation
of
Block
).
2.
If
.[[Type]] is
throw
, let
be
Completion
CatchClauseEvaluation
of
Catch
with argument
.[[Value]]).
3.
Else, let
be
4.
Return ?
UpdateEmpty
undefined
).
TryStatement
try
Block
Finally
1.
Let
be
Completion
Evaluation
of
Block
).
2.
Let
be
Completion
Evaluation
of
Finally
).
3.
If
.[[Type]] is
normal
, set
to
4.
Return ?
UpdateEmpty
undefined
).
TryStatement
try
Block
Catch
Finally
1.
Let
be
Completion
Evaluation
of
Block
).
2.
If
.[[Type]] is
throw
, let
be
Completion
CatchClauseEvaluation
of
Catch
with argument
.[[Value]]).
3.
Else, let
be
4.
Let
be
Completion
Evaluation
of
Finally
).
5.
If
.[[Type]] is
normal
, set
to
6.
Return ?
UpdateEmpty
undefined
).
14.16
The
debugger
Statement
Syntax
DebuggerStatement
debugger
14.16.1
Runtime Semantics: Evaluation
Note
Evaluating a
DebuggerStatement
may allow an implementation to cause a breakpoint when run under a
debugger. If a debugger is not present or active this statement has no
observable effect.
DebuggerStatement
debugger
1.
If an
implementation-defined
debugging facility is available and enabled, then
a.
Perform an
implementation-defined
debugging action.
b.
Return a new
implementation-defined
Completion Record
2.
Else,
a.
Return
empty
15
ECMAScript Language: Functions and Classes
Note
Various ECMAScript language elements cause the creation of ECMAScript
function objects
10.2
).
Evaluation
of such functions starts with the execution of their [[Call]] internal method (
10.2.1
).
15.1
Parameter Lists
Syntax
UniqueFormalParameters
[Yield, Await]
FormalParameters
[?Yield, ?Await]
FormalParameters
[Yield, Await]
[empty]
FunctionRestParameter
[?Yield, ?Await]
FormalParameterList
[?Yield, ?Await]
FormalParameterList
[?Yield, ?Await]
FormalParameterList
[?Yield, ?Await]
FunctionRestParameter
[?Yield, ?Await]
FormalParameterList
[Yield, Await]
FormalParameter
[?Yield, ?Await]
FormalParameterList
[?Yield, ?Await]
FormalParameter
[?Yield, ?Await]
FunctionRestParameter
[Yield, Await]
BindingRestElement
[?Yield, ?Await]
FormalParameter
[Yield, Await]
BindingElement
[?Yield, ?Await]
15.1.1
Static Semantics: Early Errors
UniqueFormalParameters
FormalParameters
It is a Syntax Error if
BoundNames
of
FormalParameters
contains any duplicate elements.
FormalParameters
FormalParameterList
It is a Syntax Error if
IsSimpleParameterList
of
FormalParameterList
is
false
and
BoundNames
of
FormalParameterList
contains any duplicate elements.
Note
Multiple occurrences of the same
BindingIdentifier
in a
FormalParameterList
is only allowed for functions which have simple parameter lists and which are not defined in
strict mode code
15.1.2
Static Semantics: ContainsExpression
The
syntax-directed operation
ContainsExpression takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
ObjectBindingPattern
BindingRestProperty
1.
Return
false
ObjectBindingPattern
BindingPropertyList
BindingRestProperty
1.
Return
ContainsExpression
of
BindingPropertyList
ArrayBindingPattern
Elision
opt
1.
Return
false
ArrayBindingPattern
Elision
opt
BindingRestElement
1.
Return
ContainsExpression
of
BindingRestElement
ArrayBindingPattern
BindingElementList
Elision
opt
1.
Return
ContainsExpression
of
BindingElementList
ArrayBindingPattern
BindingElementList
Elision
opt
BindingRestElement
1.
Let
has
be
ContainsExpression
of
BindingElementList
2.
If
has
is
true
, return
true
3.
Return
ContainsExpression
of
BindingRestElement
BindingPropertyList
BindingPropertyList
BindingProperty
1.
Let
has
be
ContainsExpression
of
BindingPropertyList
2.
If
has
is
true
, return
true
3.
Return
ContainsExpression
of
BindingProperty
BindingElementList
BindingElementList
BindingElisionElement
1.
Let
has
be
ContainsExpression
of
BindingElementList
2.
If
has
is
true
, return
true
3.
Return
ContainsExpression
of
BindingElisionElement
BindingElisionElement
Elision
opt
BindingElement
1.
Return
ContainsExpression
of
BindingElement
BindingProperty
PropertyName
BindingElement
1.
Let
has
be
IsComputedPropertyKey
of
PropertyName
2.
If
has
is
true
, return
true
3.
Return
ContainsExpression
of
BindingElement
BindingElement
BindingPattern
Initializer
1.
Return
true
SingleNameBinding
BindingIdentifier
1.
Return
false
SingleNameBinding
BindingIdentifier
Initializer
1.
Return
true
BindingRestElement
...
BindingIdentifier
1.
Return
false
BindingRestElement
...
BindingPattern
1.
Return
ContainsExpression
of
BindingPattern
FormalParameters
[empty]
1.
Return
false
FormalParameters
FormalParameterList
FunctionRestParameter
1.
If
ContainsExpression
of
FormalParameterList
is
true
, return
true
2.
Return
ContainsExpression
of
FunctionRestParameter
FormalParameterList
FormalParameterList
FormalParameter
1.
If
ContainsExpression
of
FormalParameterList
is
true
, return
true
2.
Return
ContainsExpression
of
FormalParameter
ArrowParameters
BindingIdentifier
1.
Return
false
ArrowParameters
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
formals
be the
ArrowFormalParameters
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return
ContainsExpression
of
formals
AsyncArrowBindingIdentifier
BindingIdentifier
1.
Return
false
15.1.3
Static Semantics: IsSimpleParameterList
The
syntax-directed operation
IsSimpleParameterList takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
BindingElement
BindingPattern
1.
Return
false
BindingElement
BindingPattern
Initializer
1.
Return
false
SingleNameBinding
BindingIdentifier
1.
Return
true
SingleNameBinding
BindingIdentifier
Initializer
1.
Return
false
FormalParameters
[empty]
1.
Return
true
FormalParameters
FunctionRestParameter
1.
Return
false
FormalParameters
FormalParameterList
FunctionRestParameter
1.
Return
false
FormalParameterList
FormalParameterList
FormalParameter
1.
If
IsSimpleParameterList
of
FormalParameterList
is
false
, return
false
2.
Return
IsSimpleParameterList
of
FormalParameter
FormalParameter
BindingElement
1.
Return
IsSimpleParameterList
of
BindingElement
ArrowParameters
BindingIdentifier
1.
Return
true
ArrowParameters
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
formals
be the
ArrowFormalParameters
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return
IsSimpleParameterList
of
formals
AsyncArrowBindingIdentifier
BindingIdentifier
1.
Return
true
CoverCallExpressionAndAsyncArrowHead
MemberExpression
Arguments
1.
Let
head
be the
AsyncArrowHead
that is
covered
by
CoverCallExpressionAndAsyncArrowHead
2.
Return
IsSimpleParameterList
of
head
15.1.4
Static Semantics: HasInitializer
The
syntax-directed operation
HasInitializer takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
BindingElement
BindingPattern
1.
Return
false
BindingElement
BindingPattern
Initializer
1.
Return
true
SingleNameBinding
BindingIdentifier
1.
Return
false
SingleNameBinding
BindingIdentifier
Initializer
1.
Return
true
FormalParameterList
FormalParameterList
FormalParameter
1.
If
HasInitializer
of
FormalParameterList
is
true
, return
true
2.
Return
HasInitializer
of
FormalParameter
15.1.5
Static Semantics: ExpectedArgumentCount
The
syntax-directed operation
ExpectedArgumentCount takes no arguments and returns an
integer
. It is defined piecewise over the following productions:
FormalParameters
[empty]
FunctionRestParameter
1.
Return 0.
FormalParameters
FormalParameterList
FunctionRestParameter
1.
Return
ExpectedArgumentCount
of
FormalParameterList
Note
The ExpectedArgumentCount of a
FormalParameterList
is the number of
FormalParameters
to the left of either the rest parameter or the first
FormalParameter
with an Initializer. A
FormalParameter
without an initializer is allowed after the first parameter with an
initializer but such parameters are considered to be optional with
undefined
as their default value.
FormalParameterList
FormalParameter
1.
If
HasInitializer
of
FormalParameter
is
true
, return 0.
2.
Return 1.
FormalParameterList
FormalParameterList
FormalParameter
1.
Let
count
be
ExpectedArgumentCount
of
FormalParameterList
2.
If
HasInitializer
of
FormalParameterList
is
true
or
HasInitializer
of
FormalParameter
is
true
, return
count
3.
Return
count
+ 1.
ArrowParameters
BindingIdentifier
1.
Return 1.
ArrowParameters
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
formals
be the
ArrowFormalParameters
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return
ExpectedArgumentCount
of
formals
PropertySetParameterList
FormalParameter
1.
If
HasInitializer
of
FormalParameter
is
true
, return 0.
2.
Return 1.
AsyncArrowBindingIdentifier
BindingIdentifier
1.
Return 1.
15.2
Function Definitions
Syntax
FunctionDeclaration
[Yield, Await, Default]
function
BindingIdentifier
[?Yield, ?Await]
FormalParameters
[~Yield, ~Await]
FunctionBody
[~Yield, ~Await]
[+Default]
function
FormalParameters
[~Yield, ~Await]
FunctionBody
[~Yield, ~Await]
FunctionExpression
function
BindingIdentifier
[~Yield, ~Await]
opt
FormalParameters
[~Yield, ~Await]
FunctionBody
[~Yield, ~Await]
FunctionBody
[Yield, Await]
FunctionStatementList
[?Yield, ?Await]
FunctionStatementList
[Yield, Await]
StatementList
[?Yield, ?Await, +Return]
opt
15.2.1
Static Semantics: Early Errors
FunctionDeclaration
function
BindingIdentifier
FormalParameters
FunctionBody
function
FormalParameters
FunctionBody
FunctionExpression
function
BindingIdentifier
opt
FormalParameters
FunctionBody
If the
source text matched by
FormalParameters
is
strict mode code
, the Early Error rules for
UniqueFormalParameters
FormalParameters
are applied.
If
BindingIdentifier
is present and the
source text matched by
BindingIdentifier
is
strict mode code
, it is a Syntax Error if the
StringValue
of
BindingIdentifier
is either
"eval"
or
"arguments"
It is a Syntax Error if
FunctionBodyContainsUseStrict
of
FunctionBody
is
true
and
IsSimpleParameterList
of
FormalParameters
is
false
It is a Syntax Error if any element of the
BoundNames
of
FormalParameters
also occurs in the
LexicallyDeclaredNames
of
FunctionBody
It is a Syntax Error if
FormalParameters
Contains
SuperProperty
is
true
It is a Syntax Error if
FunctionBody
Contains
SuperProperty
is
true
It is a Syntax Error if
FormalParameters
Contains
SuperCall
is
true
It is a Syntax Error if
FunctionBody
Contains
SuperCall
is
true
Note
The
LexicallyDeclaredNames
of a
FunctionBody
does not include identifiers bound using var or function declarations.
FunctionBody
FunctionStatementList
It is a Syntax Error if the
LexicallyDeclaredNames
of
FunctionStatementList
contains any duplicate entries.
It is a Syntax Error if any element of the
LexicallyDeclaredNames
of
FunctionStatementList
also occurs in the
VarDeclaredNames
of
FunctionStatementList
It is a Syntax Error if
ContainsDuplicateLabels
of
FunctionStatementList
with argument « » is
true
It is a Syntax Error if
ContainsUndefinedBreakTarget
of
FunctionStatementList
with argument « » is
true
It is a Syntax Error if
ContainsUndefinedContinueTarget
of
FunctionStatementList
with arguments « » and « » is
true
15.2.2
Static Semantics: FunctionBodyContainsUseStrict
The
syntax-directed operation
FunctionBodyContainsUseStrict takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
FunctionBody
FunctionStatementList
1.
If the
Directive Prologue
of
FunctionBody
contains a
Use Strict Directive
, return
true
; otherwise, return
false
15.2.3
Runtime Semantics: EvaluateFunctionBody
The
syntax-directed operation
EvaluateFunctionBody takes arguments
functionObject
(a
function object
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
FunctionBody
FunctionStatementList
1.
Perform ?
FunctionDeclarationInstantiation
functionObject
argumentsList
).
2.
Return ?
Evaluation
of
FunctionStatementList
15.2.4
Runtime Semantics: InstantiateOrdinaryFunctionObject
The
syntax-directed operation
InstantiateOrdinaryFunctionObject takes arguments
env
(an
Environment Record
) and
privateEnv
(a
PrivateEnvironment Record
or
null
) and returns a
function object
. It is defined piecewise over the following productions:
FunctionDeclaration
function
BindingIdentifier
FormalParameters
FunctionBody
1.
Let
name
be
StringValue
of
BindingIdentifier
2.
Let
sourceText
be the
source text matched by
FunctionDeclaration
3.
Let
be
OrdinaryFunctionCreate
%Function.prototype%
sourceText
FormalParameters
FunctionBody
non-lexical-this
env
privateEnv
).
4.
Perform
SetFunctionName
name
).
5.
Perform
MakeConstructor
).
6.
Return
FunctionDeclaration
function
FormalParameters
FunctionBody
1.
Let
sourceText
be the
source text matched by
FunctionDeclaration
2.
Let
be
OrdinaryFunctionCreate
%Function.prototype%
sourceText
FormalParameters
FunctionBody
non-lexical-this
env
privateEnv
).
3.
Perform
SetFunctionName
"default"
).
4.
Perform
MakeConstructor
).
5.
Return
Note
An anonymous
FunctionDeclaration
can only occur as part of an
export default
declaration, and its function code is therefore always
strict mode code
15.2.5
Runtime Semantics: InstantiateOrdinaryFunctionExpression
The
syntax-directed operation
InstantiateOrdinaryFunctionExpression takes optional argument
name
(a
property key
or a
Private Name
) and returns a
function object
. It is defined piecewise over the following productions:
FunctionExpression
function
FormalParameters
FunctionBody
1.
If
name
is not present, set
name
to
""
2.
Let
env
be the LexicalEnvironment of the
running execution context
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
FunctionExpression
5.
Let
closure
be
OrdinaryFunctionCreate
%Function.prototype%
sourceText
FormalParameters
FunctionBody
non-lexical-this
env
privateEnv
).
6.
Perform
SetFunctionName
closure
name
).
7.
Perform
MakeConstructor
closure
).
8.
Return
closure
FunctionExpression
function
BindingIdentifier
FormalParameters
FunctionBody
1.
Assert
name
is not present.
2.
Set
name
to
StringValue
of
BindingIdentifier
3.
Let
outerEnv
be the
running execution context
's LexicalEnvironment.
4.
Let
funcEnv
be
NewDeclarativeEnvironment
outerEnv
).
5.
Perform !
funcEnv
.CreateImmutableBinding(
name
false
).
6.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
7.
Let
sourceText
be the
source text matched by
FunctionExpression
8.
Let
closure
be
OrdinaryFunctionCreate
%Function.prototype%
sourceText
FormalParameters
FunctionBody
non-lexical-this
funcEnv
privateEnv
).
9.
Perform
SetFunctionName
closure
name
).
10.
Perform
MakeConstructor
closure
).
11.
Perform !
funcEnv
.InitializeBinding(
name
closure
).
12.
Return
closure
Note
The
BindingIdentifier
in a
FunctionExpression
can be referenced from inside the
FunctionExpression
's
FunctionBody
to allow the function to call itself recursively. However, unlike in a
FunctionDeclaration
, the
BindingIdentifier
in a
FunctionExpression
cannot be referenced from and does not affect the scope enclosing the
FunctionExpression
15.2.6
Runtime Semantics: Evaluation
FunctionDeclaration
function
BindingIdentifier
FormalParameters
FunctionBody
1.
Return
empty
Note 1
An alternative semantics is provided in
B.3.2
FunctionDeclaration
function
FormalParameters
FunctionBody
1.
Return
empty
FunctionExpression
function
BindingIdentifier
opt
FormalParameters
FunctionBody
1.
Return
InstantiateOrdinaryFunctionExpression
of
FunctionExpression
Note 2
"prototype"
property is automatically created for every function defined using a
FunctionDeclaration
or
FunctionExpression
, to allow for the possibility that the function will be used as a
constructor
FunctionStatementList
[empty]
1.
Return
undefined
15.3
Arrow Function Definitions
Syntax
ArrowFunction
[In, Yield, Await]
ArrowParameters
[?Yield, ?Await]
[no
LineTerminator
here]
=>
ConciseBody
[?In]
ArrowParameters
[Yield, Await]
BindingIdentifier
[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList
[?Yield, ?Await]
ConciseBody
[In]
[lookahead ≠
ExpressionBody
[?In, ~Await]
FunctionBody
[~Yield, ~Await]
ExpressionBody
[In, Await]
AssignmentExpression
[?In, ~Yield, ?Await]
Supplemental Syntax
When processing an instance of the production
ArrowParameters
[Yield, Await]
CoverParenthesizedExpressionAndArrowParameterList
[?Yield, ?Await]
the interpretation of
CoverParenthesizedExpressionAndArrowParameterList
is refined using the following grammar:
ArrowFormalParameters
[Yield, Await]
UniqueFormalParameters
[?Yield, ?Await]
15.3.1
Static Semantics: Early Errors
ArrowFunction
ArrowParameters
=>
ConciseBody
It is a Syntax Error if
ArrowParameters
Contains
YieldExpression
is
true
It is a Syntax Error if
ArrowParameters
Contains
AwaitExpression
is
true
It is a Syntax Error if
ConciseBodyContainsUseStrict
of
ConciseBody
is
true
and
IsSimpleParameterList
of
ArrowParameters
is
false
It is a Syntax Error if any element of the
BoundNames
of
ArrowParameters
also occurs in the
LexicallyDeclaredNames
of
ConciseBody
ArrowParameters
CoverParenthesizedExpressionAndArrowParameterList
CoverParenthesizedExpressionAndArrowParameterList
must cover
an
ArrowFormalParameters
15.3.2
Static Semantics: ConciseBodyContainsUseStrict
The
syntax-directed operation
ConciseBodyContainsUseStrict takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
ConciseBody
ExpressionBody
1.
Return
false
ConciseBody
FunctionBody
1.
Return
FunctionBodyContainsUseStrict
of
FunctionBody
15.3.3
Runtime Semantics: EvaluateConciseBody
The
syntax-directed operation
EvaluateConciseBody takes arguments
functionObject
(a
function object
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
ConciseBody
ExpressionBody
1.
Perform ?
FunctionDeclarationInstantiation
functionObject
argumentsList
).
2.
Return ?
Evaluation
of
ExpressionBody
15.3.4
Runtime Semantics: InstantiateArrowFunctionExpression
The
syntax-directed operation
InstantiateArrowFunctionExpression takes optional argument
name
(a
property key
or a
Private Name
) and returns a
function object
. It is defined piecewise over the following productions:
ArrowFunction
ArrowParameters
=>
ConciseBody
1.
If
name
is not present, set
name
to
""
2.
Let
env
be the LexicalEnvironment of the
running execution context
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
ArrowFunction
5.
Let
closure
be
OrdinaryFunctionCreate
%Function.prototype%
sourceText
ArrowParameters
ConciseBody
lexical-this
env
privateEnv
).
6.
Perform
SetFunctionName
closure
name
).
7.
Return
closure
Note
An
ArrowFunction
does not define local bindings for
arguments
super
this
, or
new.target
. Any reference to
arguments
super
this
, or
new.target
within an
ArrowFunction
must resolve to a binding in a lexically enclosing environment.
Typically this will be the Function Environment of an immediately
enclosing function. Even though an
ArrowFunction
may contain references to
super
, the
function object
created in step
is not made into a method by performing
MakeMethod
. An
ArrowFunction
that references
super
is always contained within a non-
ArrowFunction
and the necessary state to implement
super
is accessible via the
env
that is captured by the
function object
of the
ArrowFunction
15.3.5
Runtime Semantics: Evaluation
ArrowFunction
ArrowParameters
=>
ConciseBody
1.
Return
InstantiateArrowFunctionExpression
of
ArrowFunction
ExpressionBody
AssignmentExpression
1.
Let
exprRef
be ?
Evaluation
of
AssignmentExpression
2.
Let
exprValue
be ?
GetValue
exprRef
).
3.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
exprValue
, [[Target]]:
empty
}.
15.4
Method Definitions
Syntax
MethodDefinition
[Yield, Await]
ClassElementName
[?Yield, ?Await]
UniqueFormalParameters
[~Yield, ~Await]
FunctionBody
[~Yield, ~Await]
GeneratorMethod
[?Yield, ?Await]
AsyncMethod
[?Yield, ?Await]
AsyncGeneratorMethod
[?Yield, ?Await]
get
ClassElementName
[?Yield, ?Await]
FunctionBody
[~Yield, ~Await]
set
ClassElementName
[?Yield, ?Await]
PropertySetParameterList
FunctionBody
[~Yield, ~Await]
PropertySetParameterList
FormalParameter
[~Yield, ~Await]
15.4.1
Static Semantics: Early Errors
MethodDefinition
ClassElementName
UniqueFormalParameters
FunctionBody
It is a Syntax Error if
FunctionBodyContainsUseStrict
of
FunctionBody
is
true
and
IsSimpleParameterList
of
UniqueFormalParameters
is
false
It is a Syntax Error if any element of the
BoundNames
of
UniqueFormalParameters
also occurs in the
LexicallyDeclaredNames
of
FunctionBody
MethodDefinition
set
ClassElementName
PropertySetParameterList
FunctionBody
It is a Syntax Error if
BoundNames
of
PropertySetParameterList
contains any duplicate elements.
It is a Syntax Error if
FunctionBodyContainsUseStrict
of
FunctionBody
is
true
and
IsSimpleParameterList
of
PropertySetParameterList
is
false
It is a Syntax Error if any element of the
BoundNames
of
PropertySetParameterList
also occurs in the
LexicallyDeclaredNames
of
FunctionBody
15.4.2
Static Semantics: HasDirectSuper
The
syntax-directed operation
HasDirectSuper takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
MethodDefinition
ClassElementName
UniqueFormalParameters
FunctionBody
1.
If
UniqueFormalParameters
Contains
SuperCall
is
true
, return
true
2.
Return
FunctionBody
Contains
SuperCall
MethodDefinition
get
ClassElementName
FunctionBody
1.
Return
FunctionBody
Contains
SuperCall
MethodDefinition
set
ClassElementName
PropertySetParameterList
FunctionBody
1.
If
PropertySetParameterList
Contains
SuperCall
is
true
, return
true
2.
Return
FunctionBody
Contains
SuperCall
GeneratorMethod
ClassElementName
UniqueFormalParameters
GeneratorBody
1.
If
UniqueFormalParameters
Contains
SuperCall
is
true
, return
true
2.
Return
GeneratorBody
Contains
SuperCall
AsyncGeneratorMethod
async
ClassElementName
UniqueFormalParameters
AsyncGeneratorBody
1.
If
UniqueFormalParameters
Contains
SuperCall
is
true
, return
true
2.
Return
AsyncGeneratorBody
Contains
SuperCall
AsyncMethod
async
ClassElementName
UniqueFormalParameters
AsyncFunctionBody
1.
If
UniqueFormalParameters
Contains
SuperCall
is
true
, return
true
2.
Return
AsyncFunctionBody
Contains
SuperCall
15.4.3
Static Semantics: SpecialMethod
The
syntax-directed operation
SpecialMethod takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
MethodDefinition
ClassElementName
UniqueFormalParameters
FunctionBody
1.
Return
false
MethodDefinition
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get
ClassElementName
FunctionBody
set
ClassElementName
PropertySetParameterList
FunctionBody
1.
Return
true
15.4.4
Runtime Semantics: DefineMethod
The
syntax-directed operation
DefineMethod takes argument
object
(an Object) and optional argument
functionPrototype
(an Object) and returns either a
normal completion containing
Record
with fields [[Key]] (a
property key
) and [[Closure]] (a
function object
) or an
abrupt completion
. It is defined piecewise over the following productions:
MethodDefinition
ClassElementName
UniqueFormalParameters
FunctionBody
1.
Let
propKey
be ?
Evaluation
of
ClassElementName
2.
Let
env
be the
running execution context
's LexicalEnvironment.
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
If
functionPrototype
is present, then
a.
Let
prototype
be
functionPrototype
5.
Else,
a.
Let
prototype
be
%Function.prototype%
6.
Let
sourceText
be the
source text matched by
MethodDefinition
7.
Let
closure
be
OrdinaryFunctionCreate
prototype
sourceText
UniqueFormalParameters
FunctionBody
non-lexical-this
env
privateEnv
).
8.
Perform
MakeMethod
closure
object
).
9.
Return the
Record
{ [[Key]]:
propKey
, [[Closure]]:
closure
}.
15.4.5
Runtime Semantics: MethodDefinitionEvaluation
The
syntax-directed operation
MethodDefinitionEvaluation takes arguments
object
(an Object) and
enumerable
(a Boolean) and returns either a
normal completion containing
either a
PrivateElement
or
unused
, or an
abrupt completion
. It is defined piecewise over the following productions:
MethodDefinition
ClassElementName
UniqueFormalParameters
FunctionBody
1.
Let
methodDef
be ?
DefineMethod
of
MethodDefinition
with argument
object
2.
Perform
SetFunctionName
methodDef
.[[Closure]],
methodDef
.[[Key]]).
3.
Return
DefineMethodProperty
object
methodDef
.[[Key]],
methodDef
.[[Closure]],
enumerable
).
MethodDefinition
get
ClassElementName
FunctionBody
1.
Let
propKey
be ?
Evaluation
of
ClassElementName
2.
Let
env
be the
running execution context
's LexicalEnvironment.
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
MethodDefinition
5.
Let
formalParameterList
be an instance of the production
FormalParameters
[empty]
6.
Let
closure
be
OrdinaryFunctionCreate
%Function.prototype%
sourceText
formalParameterList
FunctionBody
non-lexical-this
env
privateEnv
).
7.
Perform
MakeMethod
closure
object
).
8.
Perform
SetFunctionName
closure
propKey
"get"
).
9.
If
propKey
is a
Private Name
, then
a.
Return
PrivateElement
{ [[Key]]:
propKey
, [[Kind]]:
accessor
, [[Get]]:
closure
, [[Set]]:
undefined
}.
10.
Else,
a.
Let
desc
be the PropertyDescriptor { [[Get]]:
closure
, [[Enumerable]]:
enumerable
, [[Configurable]]:
true
}.
b.
Perform ?
DefinePropertyOrThrow
object
propKey
desc
).
c.
Return
unused
MethodDefinition
set
ClassElementName
PropertySetParameterList
FunctionBody
1.
Let
propKey
be ?
Evaluation
of
ClassElementName
2.
Let
env
be the
running execution context
's LexicalEnvironment.
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
MethodDefinition
5.
Let
closure
be
OrdinaryFunctionCreate
%Function.prototype%
sourceText
PropertySetParameterList
FunctionBody
non-lexical-this
env
privateEnv
).
6.
Perform
MakeMethod
closure
object
).
7.
Perform
SetFunctionName
closure
propKey
"set"
).
8.
If
propKey
is a
Private Name
, then
a.
Return
PrivateElement
{ [[Key]]:
propKey
, [[Kind]]:
accessor
, [[Get]]:
undefined
, [[Set]]:
closure
}.
9.
Else,
a.
Let
desc
be the PropertyDescriptor { [[Set]]:
closure
, [[Enumerable]]:
enumerable
, [[Configurable]]:
true
}.
b.
Perform ?
DefinePropertyOrThrow
object
propKey
desc
).
c.
Return
unused
GeneratorMethod
ClassElementName
UniqueFormalParameters
GeneratorBody
1.
Let
propKey
be ?
Evaluation
of
ClassElementName
2.
Let
env
be the
running execution context
's LexicalEnvironment.
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
GeneratorMethod
5.
Let
closure
be
OrdinaryFunctionCreate
%GeneratorFunction.prototype%
sourceText
UniqueFormalParameters
GeneratorBody
non-lexical-this
env
privateEnv
).
6.
Perform
MakeMethod
closure
object
).
7.
Perform
SetFunctionName
closure
propKey
).
8.
Let
prototype
be
OrdinaryObjectCreate
%GeneratorFunction.prototype.prototype%
).
9.
Perform !
DefinePropertyOrThrow
closure
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
10.
Return
DefineMethodProperty
object
propKey
closure
enumerable
).
AsyncGeneratorMethod
async
ClassElementName
UniqueFormalParameters
AsyncGeneratorBody
1.
Let
propKey
be ?
Evaluation
of
ClassElementName
2.
Let
env
be the
running execution context
's LexicalEnvironment.
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
AsyncGeneratorMethod
5.
Let
closure
be
OrdinaryFunctionCreate
%AsyncGeneratorFunction.prototype%
sourceText
UniqueFormalParameters
AsyncGeneratorBody
non-lexical-this
env
privateEnv
).
6.
Perform
MakeMethod
closure
object
).
7.
Perform
SetFunctionName
closure
propKey
).
8.
Let
prototype
be
OrdinaryObjectCreate
%AsyncGeneratorFunction.prototype.prototype%
).
9.
Perform !
DefinePropertyOrThrow
closure
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
10.
Return
DefineMethodProperty
object
propKey
closure
enumerable
).
AsyncMethod
async
ClassElementName
UniqueFormalParameters
AsyncFunctionBody
1.
Let
propKey
be ?
Evaluation
of
ClassElementName
2.
Let
env
be the LexicalEnvironment of the
running execution context
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
AsyncMethod
5.
Let
closure
be
OrdinaryFunctionCreate
%AsyncFunction.prototype%
sourceText
UniqueFormalParameters
AsyncFunctionBody
non-lexical-this
env
privateEnv
).
6.
Perform
MakeMethod
closure
object
).
7.
Perform
SetFunctionName
closure
propKey
).
8.
Return
DefineMethodProperty
object
propKey
closure
enumerable
).
15.5
Generator Function Definitions
Syntax
GeneratorDeclaration
[Yield, Await, Default]
function
BindingIdentifier
[?Yield, ?Await]
FormalParameters
[+Yield, ~Await]
GeneratorBody
[+Default]
function
FormalParameters
[+Yield, ~Await]
GeneratorBody
GeneratorExpression
function
BindingIdentifier
[+Yield, ~Await]
opt
FormalParameters
[+Yield, ~Await]
GeneratorBody
GeneratorMethod
[Yield, Await]
ClassElementName
[?Yield, ?Await]
UniqueFormalParameters
[+Yield, ~Await]
GeneratorBody
GeneratorBody
FunctionBody
[+Yield, ~Await]
YieldExpression
[In, Await]
yield
yield
[no
LineTerminator
here]
AssignmentExpression
[?In, +Yield, ?Await]
yield
[no
LineTerminator
here]
AssignmentExpression
[?In, +Yield, ?Await]
Note 1
The syntactic context immediately following
yield
requires use of the
InputElementRegExpOrTemplateTail
lexical goal.
Note 2
YieldExpression
cannot be used within the
FormalParameters
of a generator function because any expressions that are part of
FormalParameters
are evaluated before the resulting Generator is in a resumable state.
Note 3
Abstract operations
relating to Generators are defined in
27.5.3
15.5.1
Static Semantics: Early Errors
GeneratorMethod
ClassElementName
UniqueFormalParameters
GeneratorBody
It is a Syntax Error if
HasDirectSuper
of
GeneratorMethod
is
true
It is a Syntax Error if
UniqueFormalParameters
Contains
YieldExpression
is
true
It is a Syntax Error if
FunctionBodyContainsUseStrict
of
GeneratorBody
is
true
and
IsSimpleParameterList
of
UniqueFormalParameters
is
false
It is a Syntax Error if any element of the
BoundNames
of
UniqueFormalParameters
also occurs in the
LexicallyDeclaredNames
of
GeneratorBody
GeneratorDeclaration
function
BindingIdentifier
FormalParameters
GeneratorBody
function
FormalParameters
GeneratorBody
GeneratorExpression
function
BindingIdentifier
opt
FormalParameters
GeneratorBody
If the
source text matched by
FormalParameters
is
strict mode code
, the Early Error rules for
UniqueFormalParameters
FormalParameters
are applied.
If
BindingIdentifier
is present and the
source text matched by
BindingIdentifier
is
strict mode code
, it is a Syntax Error if the
StringValue
of
BindingIdentifier
is either
"eval"
or
"arguments"
It is a Syntax Error if
FunctionBodyContainsUseStrict
of
GeneratorBody
is
true
and
IsSimpleParameterList
of
FormalParameters
is
false
It is a Syntax Error if any element of the
BoundNames
of
FormalParameters
also occurs in the
LexicallyDeclaredNames
of
GeneratorBody
It is a Syntax Error if
FormalParameters
Contains
YieldExpression
is
true
It is a Syntax Error if
FormalParameters
Contains
SuperProperty
is
true
It is a Syntax Error if
GeneratorBody
Contains
SuperProperty
is
true
It is a Syntax Error if
FormalParameters
Contains
SuperCall
is
true
It is a Syntax Error if
GeneratorBody
Contains
SuperCall
is
true
15.5.2
Runtime Semantics: EvaluateGeneratorBody
The
syntax-directed operation
EvaluateGeneratorBody takes arguments
functionObject
(a
function object
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns a
throw completion
or a
return completion
. It is defined piecewise over the following productions:
GeneratorBody
FunctionBody
1.
Perform ?
FunctionDeclarationInstantiation
functionObject
argumentsList
).
2.
Let
be ?
OrdinaryCreateFromConstructor
functionObject
"%GeneratorFunction.prototype.prototype%"
, « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] »).
3.
Set
.[[GeneratorBrand]] to
empty
4.
Perform
GeneratorStart
FunctionBody
).
5.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
, [[Target]]:
empty
}.
15.5.3
Runtime Semantics: InstantiateGeneratorFunctionObject
The
syntax-directed operation
InstantiateGeneratorFunctionObject takes arguments
env
(an
Environment Record
) and
privateEnv
(a
PrivateEnvironment Record
or
null
) and returns a
function object
. It is defined piecewise over the following productions:
GeneratorDeclaration
function
BindingIdentifier
FormalParameters
GeneratorBody
1.
Let
name
be
StringValue
of
BindingIdentifier
2.
Let
sourceText
be the
source text matched by
GeneratorDeclaration
3.
Let
be
OrdinaryFunctionCreate
%GeneratorFunction.prototype%
sourceText
FormalParameters
GeneratorBody
non-lexical-this
env
privateEnv
).
4.
Perform
SetFunctionName
name
).
5.
Let
prototype
be
OrdinaryObjectCreate
%GeneratorFunction.prototype.prototype%
).
6.
Perform !
DefinePropertyOrThrow
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
7.
Return
GeneratorDeclaration
function
FormalParameters
GeneratorBody
1.
Let
sourceText
be the
source text matched by
GeneratorDeclaration
2.
Let
be
OrdinaryFunctionCreate
%GeneratorFunction.prototype%
sourceText
FormalParameters
GeneratorBody
non-lexical-this
env
privateEnv
).
3.
Perform
SetFunctionName
"default"
).
4.
Let
prototype
be
OrdinaryObjectCreate
%GeneratorFunction.prototype.prototype%
).
5.
Perform !
DefinePropertyOrThrow
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
6.
Return
Note
An anonymous
GeneratorDeclaration
can only occur as part of an
export default
declaration, and its function code is therefore always
strict mode code
15.5.4
Runtime Semantics: InstantiateGeneratorFunctionExpression
The
syntax-directed operation
InstantiateGeneratorFunctionExpression takes optional argument
name
(a
property key
or a
Private Name
) and returns a
function object
. It is defined piecewise over the following productions:
GeneratorExpression
function
FormalParameters
GeneratorBody
1.
If
name
is not present, set
name
to
""
2.
Let
env
be the LexicalEnvironment of the
running execution context
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
GeneratorExpression
5.
Let
closure
be
OrdinaryFunctionCreate
%GeneratorFunction.prototype%
sourceText
FormalParameters
GeneratorBody
non-lexical-this
env
privateEnv
).
6.
Perform
SetFunctionName
closure
name
).
7.
Let
prototype
be
OrdinaryObjectCreate
%GeneratorFunction.prototype.prototype%
).
8.
Perform !
DefinePropertyOrThrow
closure
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
9.
Return
closure
GeneratorExpression
function
BindingIdentifier
FormalParameters
GeneratorBody
1.
Assert
name
is not present.
2.
Set
name
to
StringValue
of
BindingIdentifier
3.
Let
outerEnv
be the
running execution context
's LexicalEnvironment.
4.
Let
funcEnv
be
NewDeclarativeEnvironment
outerEnv
).
5.
Perform !
funcEnv
.CreateImmutableBinding(
name
false
).
6.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
7.
Let
sourceText
be the
source text matched by
GeneratorExpression
8.
Let
closure
be
OrdinaryFunctionCreate
%GeneratorFunction.prototype%
sourceText
FormalParameters
GeneratorBody
non-lexical-this
funcEnv
privateEnv
).
9.
Perform
SetFunctionName
closure
name
).
10.
Let
prototype
be
OrdinaryObjectCreate
%GeneratorFunction.prototype.prototype%
).
11.
Perform !
DefinePropertyOrThrow
closure
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
12.
Perform !
funcEnv
.InitializeBinding(
name
closure
).
13.
Return
closure
Note
The
BindingIdentifier
in a
GeneratorExpression
can be referenced from inside the
GeneratorExpression
's
FunctionBody
to allow the generator code to call itself recursively. However, unlike in a
GeneratorDeclaration
, the
BindingIdentifier
in a
GeneratorExpression
cannot be referenced from and does not affect the scope enclosing the
GeneratorExpression
15.5.5
Runtime Semantics: Evaluation
GeneratorExpression
function
BindingIdentifier
opt
FormalParameters
GeneratorBody
1.
Return
InstantiateGeneratorFunctionExpression
of
GeneratorExpression
YieldExpression
yield
1.
Return ?
Yield
undefined
).
YieldExpression
yield
AssignmentExpression
1.
Let
exprRef
be ?
Evaluation
of
AssignmentExpression
2.
Let
value
be ?
GetValue
exprRef
).
3.
Return ?
Yield
value
).
YieldExpression
yield
AssignmentExpression
1.
Let
generatorKind
be
GetGeneratorKind
().
2.
Let
exprRef
be ?
Evaluation
of
AssignmentExpression
3.
Let
value
be ?
GetValue
exprRef
).
4.
Let
iteratorRecord
be ?
GetIterator
value
generatorKind
).
5.
Let
iterator
be
iteratorRecord
.[[Iterator]].
6.
Let
received
be
NormalCompletion
undefined
).
7.
Repeat,
a.
If
received
.[[Type]] is
normal
, then
i.
Let
innerResult
be ?
Call
iteratorRecord
.[[NextMethod]],
iteratorRecord
.[[Iterator]], «
received
.[[Value]] »).
ii.
If
generatorKind
is
async
, set
innerResult
to ?
Await
innerResult
).
iii.
If
innerResult
is not an Object
, throw a
TypeError
exception.
iv.
Let
done
be ?
IteratorComplete
innerResult
).
v.
If
done
is
true
, then
1.
Return ?
IteratorValue
innerResult
).
vi.
If
generatorKind
is
async
, set
received
to
Completion
AsyncGeneratorYield
(?
IteratorValue
innerResult
))).
vii.
Else, set
received
to
Completion
GeneratorYield
innerResult
)).
b.
Else if
received
.[[Type]] is
throw
, then
i.
Let
throw
be ?
GetMethod
iterator
"throw"
).
ii.
If
throw
is not
undefined
, then
1.
Let
innerResult
be ?
Call
throw
iterator
, «
received
.[[Value]] »).
2.
If
generatorKind
is
async
, set
innerResult
to ?
Await
innerResult
).
3.
NOTE: Exceptions from the inner iterator
throw
method are propagated.
Normal completions
from an inner
throw
method are processed similarly to an inner
next
4.
If
innerResult
is not an Object
, throw a
TypeError
exception.
5.
Let
done
be ?
IteratorComplete
innerResult
).
6.
If
done
is
true
, then
a.
Return ?
IteratorValue
innerResult
).
7.
If
generatorKind
is
async
, set
received
to
Completion
AsyncGeneratorYield
(?
IteratorValue
innerResult
))).
8.
Else, set
received
to
Completion
GeneratorYield
innerResult
)).
iii.
Else,
1.
NOTE: If
iterator
does not have a
throw
method, this throw is going to terminate the
yield*
loop. But first we need to give
iterator
a chance to clean up.
2.
Let
closeCompletion
be
Completion Record
{ [[Type]]:
normal
, [[Value]]:
empty
, [[Target]]:
empty
}.
3.
If
generatorKind
is
async
, perform ?
AsyncIteratorClose
iteratorRecord
closeCompletion
).
4.
Else, perform ?
IteratorClose
iteratorRecord
closeCompletion
).
5.
NOTE: The next step throws a
TypeError
to indicate that there was a
yield*
protocol violation:
iterator
does not have a
throw
method.
6.
Throw a
TypeError
exception.
c.
Else,
i.
Assert
received
.[[Type]] is
return
ii.
Let
return
be ?
GetMethod
iterator
"return"
).
iii.
If
return
is
undefined
, then
1.
Let
value
be
received
.[[Value]].
2.
If
generatorKind
is
async
, then
a.
Set
value
to ?
Await
value
).
3.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
value
, [[Target]]:
empty
}.
iv.
Let
innerReturnResult
be ?
Call
return
iterator
, «
received
.[[Value]] »).
v.
If
generatorKind
is
async
, set
innerReturnResult
to ?
Await
innerReturnResult
).
vi.
If
innerReturnResult
is not an Object
, throw a
TypeError
exception.
vii.
Let
done
be ?
IteratorComplete
innerReturnResult
).
viii.
If
done
is
true
, then
1.
Let
value
be ?
IteratorValue
innerReturnResult
).
2.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
value
, [[Target]]:
empty
}.
ix.
If
generatorKind
is
async
, set
received
to
Completion
AsyncGeneratorYield
(?
IteratorValue
innerReturnResult
))).
x.
Else, set
received
to
Completion
GeneratorYield
innerReturnResult
)).
15.6
Async Generator Function Definitions
Syntax
AsyncGeneratorDeclaration
[Yield, Await, Default]
async
[no
LineTerminator
here]
function
BindingIdentifier
[?Yield, ?Await]
FormalParameters
[+Yield, +Await]
AsyncGeneratorBody
[+Default]
async
[no
LineTerminator
here]
function
FormalParameters
[+Yield, +Await]
AsyncGeneratorBody
AsyncGeneratorExpression
async
[no
LineTerminator
here]
function
BindingIdentifier
[+Yield, +Await]
opt
FormalParameters
[+Yield, +Await]
AsyncGeneratorBody
AsyncGeneratorMethod
[Yield, Await]
async
[no
LineTerminator
here]
ClassElementName
[?Yield, ?Await]
UniqueFormalParameters
[+Yield, +Await]
AsyncGeneratorBody
AsyncGeneratorBody
FunctionBody
[+Yield, +Await]
Note 1
YieldExpression
and
AwaitExpression
cannot be used within the
FormalParameters
of an async generator function because any expressions that are part of
FormalParameters
are evaluated before the resulting AsyncGenerator is in a resumable state.
Note 2
Abstract operations
relating to AsyncGenerators are defined in
27.6.3
15.6.1
Static Semantics: Early Errors
AsyncGeneratorMethod
async
ClassElementName
UniqueFormalParameters
AsyncGeneratorBody
It is a Syntax Error if
HasDirectSuper
of
AsyncGeneratorMethod
is
true
It is a Syntax Error if
UniqueFormalParameters
Contains
YieldExpression
is
true
It is a Syntax Error if
UniqueFormalParameters
Contains
AwaitExpression
is
true
It is a Syntax Error if
FunctionBodyContainsUseStrict
of
AsyncGeneratorBody
is
true
and
IsSimpleParameterList
of
UniqueFormalParameters
is
false
It is a Syntax Error if any element of the
BoundNames
of
UniqueFormalParameters
also occurs in the
LexicallyDeclaredNames
of
AsyncGeneratorBody
AsyncGeneratorDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncGeneratorBody
async
function
FormalParameters
AsyncGeneratorBody
AsyncGeneratorExpression
async
function
BindingIdentifier
opt
FormalParameters
AsyncGeneratorBody
If the
source text matched by
FormalParameters
is
strict mode code
, the Early Error rules for
UniqueFormalParameters
FormalParameters
are applied.
If
BindingIdentifier
is present and the
source text matched by
BindingIdentifier
is
strict mode code
, it is a Syntax Error if the
StringValue
of
BindingIdentifier
is either
"eval"
or
"arguments"
It is a Syntax Error if
FunctionBodyContainsUseStrict
of
AsyncGeneratorBody
is
true
and
IsSimpleParameterList
of
FormalParameters
is
false
It is a Syntax Error if any element of the
BoundNames
of
FormalParameters
also occurs in the
LexicallyDeclaredNames
of
AsyncGeneratorBody
It is a Syntax Error if
FormalParameters
Contains
YieldExpression
is
true
It is a Syntax Error if
FormalParameters
Contains
AwaitExpression
is
true
It is a Syntax Error if
FormalParameters
Contains
SuperProperty
is
true
It is a Syntax Error if
AsyncGeneratorBody
Contains
SuperProperty
is
true
It is a Syntax Error if
FormalParameters
Contains
SuperCall
is
true
It is a Syntax Error if
AsyncGeneratorBody
Contains
SuperCall
is
true
15.6.2
Runtime Semantics: EvaluateAsyncGeneratorBody
The
syntax-directed operation
EvaluateAsyncGeneratorBody takes arguments
functionObject
(a
function object
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns a
throw completion
or a
return completion
. It is defined piecewise over the following productions:
AsyncGeneratorBody
FunctionBody
1.
Perform ?
FunctionDeclarationInstantiation
functionObject
argumentsList
).
2.
Let
generator
be ?
OrdinaryCreateFromConstructor
functionObject
"%AsyncGeneratorFunction.prototype.prototype%"
, « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] »).
3.
Set
generator
.[[GeneratorBrand]] to
empty
4.
Perform
AsyncGeneratorStart
generator
FunctionBody
).
5.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
generator
, [[Target]]:
empty
}.
15.6.3
Runtime Semantics: InstantiateAsyncGeneratorFunctionObject
The
syntax-directed operation
InstantiateAsyncGeneratorFunctionObject takes arguments
env
(an
Environment Record
) and
privateEnv
(a
PrivateEnvironment Record
or
null
) and returns a
function object
. It is defined piecewise over the following productions:
AsyncGeneratorDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncGeneratorBody
1.
Let
name
be
StringValue
of
BindingIdentifier
2.
Let
sourceText
be the
source text matched by
AsyncGeneratorDeclaration
3.
Let
be
OrdinaryFunctionCreate
%AsyncGeneratorFunction.prototype%
sourceText
FormalParameters
AsyncGeneratorBody
non-lexical-this
env
privateEnv
).
4.
Perform
SetFunctionName
name
).
5.
Let
prototype
be
OrdinaryObjectCreate
%AsyncGeneratorFunction.prototype.prototype%
).
6.
Perform !
DefinePropertyOrThrow
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
7.
Return
AsyncGeneratorDeclaration
async
function
FormalParameters
AsyncGeneratorBody
1.
Let
sourceText
be the
source text matched by
AsyncGeneratorDeclaration
2.
Let
be
OrdinaryFunctionCreate
%AsyncGeneratorFunction.prototype%
sourceText
FormalParameters
AsyncGeneratorBody
non-lexical-this
env
privateEnv
).
3.
Perform
SetFunctionName
"default"
).
4.
Let
prototype
be
OrdinaryObjectCreate
%AsyncGeneratorFunction.prototype.prototype%
).
5.
Perform !
DefinePropertyOrThrow
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
6.
Return
Note
An anonymous
AsyncGeneratorDeclaration
can only occur as part of an
export default
declaration.
15.6.4
Runtime Semantics: InstantiateAsyncGeneratorFunctionExpression
The
syntax-directed operation
InstantiateAsyncGeneratorFunctionExpression takes optional argument
name
(a
property key
or a
Private Name
) and returns a
function object
. It is defined piecewise over the following productions:
AsyncGeneratorExpression
async
function
FormalParameters
AsyncGeneratorBody
1.
If
name
is not present, set
name
to
""
2.
Let
env
be the LexicalEnvironment of the
running execution context
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
AsyncGeneratorExpression
5.
Let
closure
be
OrdinaryFunctionCreate
%AsyncGeneratorFunction.prototype%
sourceText
FormalParameters
AsyncGeneratorBody
non-lexical-this
env
privateEnv
).
6.
Perform
SetFunctionName
closure
name
).
7.
Let
prototype
be
OrdinaryObjectCreate
%AsyncGeneratorFunction.prototype.prototype%
).
8.
Perform !
DefinePropertyOrThrow
closure
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
9.
Return
closure
AsyncGeneratorExpression
async
function
BindingIdentifier
FormalParameters
AsyncGeneratorBody
1.
Assert
name
is not present.
2.
Set
name
to
StringValue
of
BindingIdentifier
3.
Let
outerEnv
be the
running execution context
's LexicalEnvironment.
4.
Let
funcEnv
be
NewDeclarativeEnvironment
outerEnv
).
5.
Perform !
funcEnv
.CreateImmutableBinding(
name
false
).
6.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
7.
Let
sourceText
be the
source text matched by
AsyncGeneratorExpression
8.
Let
closure
be
OrdinaryFunctionCreate
%AsyncGeneratorFunction.prototype%
sourceText
FormalParameters
AsyncGeneratorBody
non-lexical-this
funcEnv
privateEnv
).
9.
Perform
SetFunctionName
closure
name
).
10.
Let
prototype
be
OrdinaryObjectCreate
%AsyncGeneratorFunction.prototype.prototype%
).
11.
Perform !
DefinePropertyOrThrow
closure
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
12.
Perform !
funcEnv
.InitializeBinding(
name
closure
).
13.
Return
closure
Note
The
BindingIdentifier
in an
AsyncGeneratorExpression
can be referenced from inside the
AsyncGeneratorExpression
's
AsyncGeneratorBody
to allow the generator code to call itself recursively. However, unlike in an
AsyncGeneratorDeclaration
, the
BindingIdentifier
in an
AsyncGeneratorExpression
cannot be referenced from and does not affect the scope enclosing the
AsyncGeneratorExpression
15.6.5
Runtime Semantics: Evaluation
AsyncGeneratorExpression
async
function
BindingIdentifier
opt
FormalParameters
AsyncGeneratorBody
1.
Return
InstantiateAsyncGeneratorFunctionExpression
of
AsyncGeneratorExpression
15.7
Class Definitions
Syntax
ClassDeclaration
[Yield, Await, Default]
class
BindingIdentifier
[?Yield, ?Await]
ClassTail
[?Yield, ?Await]
[+Default]
class
ClassTail
[?Yield, ?Await]
ClassExpression
[Yield, Await]
class
BindingIdentifier
[?Yield, ?Await]
opt
ClassTail
[?Yield, ?Await]
ClassTail
[Yield, Await]
ClassHeritage
[?Yield, ?Await]
opt
ClassBody
[?Yield, ?Await]
opt
ClassHeritage
[Yield, Await]
extends
LeftHandSideExpression
[?Yield, ?Await]
ClassBody
[Yield, Await]
ClassElementList
[?Yield, ?Await]
ClassElementList
[Yield, Await]
ClassElement
[?Yield, ?Await]
ClassElementList
[?Yield, ?Await]
ClassElement
[?Yield, ?Await]
ClassElement
[Yield, Await]
MethodDefinition
[?Yield, ?Await]
static
MethodDefinition
[?Yield, ?Await]
FieldDefinition
[?Yield, ?Await]
static
FieldDefinition
[?Yield, ?Await]
ClassStaticBlock
FieldDefinition
[Yield, Await]
ClassElementName
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
opt
ClassElementName
[Yield, Await]
PropertyName
[?Yield, ?Await]
PrivateIdentifier
ClassStaticBlock
static
ClassStaticBlockBody
ClassStaticBlockBody
ClassStaticBlockStatementList
ClassStaticBlockStatementList
StatementList
[~Yield, +Await, ~Return]
opt
Note
A class definition is always
strict mode code
15.7.1
Static Semantics: Early Errors
ClassTail
ClassHeritage
opt
ClassBody
It is a Syntax Error if
ClassHeritage
is not present and the following algorithm returns
true
1.
Let
constructor
be
ConstructorMethod
of
ClassBody
2.
If
constructor
is
empty
, return
false
3.
Return
HasDirectSuper
of
constructor
ClassBody
ClassElementList
It is a Syntax Error if
PrototypePropertyNameList
of
ClassElementList
contains more than one occurrence of
"constructor"
It is a Syntax Error if
PrivateBoundIdentifiers
of
ClassElementList
contains any duplicate entries, unless the name is used once for a
getter and once for a setter and in no other entries, and the getter and
setter are either both static or both non-static.
ClassElement
MethodDefinition
It is a Syntax Error if
PropName
of
MethodDefinition
is not
"constructor"
and
HasDirectSuper
of
MethodDefinition
is
true
It is a Syntax Error if
PropName
of
MethodDefinition
is
"constructor"
and
SpecialMethod
of
MethodDefinition
is
true
ClassElement
static
MethodDefinition
It is a Syntax Error if
HasDirectSuper
of
MethodDefinition
is
true
It is a Syntax Error if
PropName
of
MethodDefinition
is
"prototype"
ClassElement
FieldDefinition
It is a Syntax Error if
PropName
of
FieldDefinition
is
"constructor"
ClassElement
static
FieldDefinition
It is a Syntax Error if
PropName
of
FieldDefinition
is either
"prototype"
or
"constructor"
FieldDefinition
ClassElementName
Initializer
opt
It is a Syntax Error if
Initializer
is present and
ContainsArguments
of
Initializer
is
true
It is a Syntax Error if
Initializer
is present and
Initializer
Contains
SuperCall
is
true
ClassElementName
PrivateIdentifier
It is a Syntax Error if
StringValue
of
PrivateIdentifier
is
"#constructor"
ClassStaticBlockBody
ClassStaticBlockStatementList
It is a Syntax Error if the
LexicallyDeclaredNames
of
ClassStaticBlockStatementList
contains any duplicate entries.
It is a Syntax Error if any element of the
LexicallyDeclaredNames
of
ClassStaticBlockStatementList
also occurs in the
VarDeclaredNames
of
ClassStaticBlockStatementList
It is a Syntax Error if
ContainsDuplicateLabels
of
ClassStaticBlockStatementList
with argument « » is
true
It is a Syntax Error if
ContainsUndefinedBreakTarget
of
ClassStaticBlockStatementList
with argument « » is
true
It is a Syntax Error if
ContainsUndefinedContinueTarget
of
ClassStaticBlockStatementList
with arguments « » and « » is
true
It is a Syntax Error if
ContainsArguments
of
ClassStaticBlockStatementList
is
true
It is a Syntax Error if
ClassStaticBlockStatementList
Contains
SuperCall
is
true
It is a Syntax Error if
ClassStaticBlockStatementList
Contains
await
is
true
15.7.2
Static Semantics: ClassElementKind
The
syntax-directed operation
ClassElementKind takes no arguments and returns
ConstructorMethod
NonConstructorMethod
, or
empty
. It is defined piecewise over the following productions:
ClassElement
MethodDefinition
1.
If
PropName
of
MethodDefinition
is
"constructor"
, return
ConstructorMethod
2.
Return
NonConstructorMethod
ClassElement
static
MethodDefinition
FieldDefinition
static
FieldDefinition
1.
Return
NonConstructorMethod
ClassElement
ClassStaticBlock
1.
Return
NonConstructorMethod
ClassElement
1.
Return
empty
15.7.3
Static Semantics: ConstructorMethod
The
syntax-directed operation
ConstructorMethod takes no arguments and returns a
ClassElement
Parse Node
or
empty
. It is defined piecewise over the following productions:
ClassElementList
ClassElement
1.
If
ClassElementKind
of
ClassElement
is
ConstructorMethod
, return
ClassElement
2.
Return
empty
ClassElementList
ClassElementList
ClassElement
1.
Let
head
be
ConstructorMethod
of
ClassElementList
2.
If
head
is not
empty
, return
head
3.
If
ClassElementKind
of
ClassElement
is
ConstructorMethod
, return
ClassElement
4.
Return
empty
Note
Early Error rules ensure that there is only one method definition named
"constructor"
and that it is not an
accessor property
or generator definition.
15.7.4
Static Semantics: IsStatic
The
syntax-directed operation
IsStatic takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
ClassElement
MethodDefinition
1.
Return
false
ClassElement
static
MethodDefinition
1.
Return
true
ClassElement
FieldDefinition
1.
Return
false
ClassElement
static
FieldDefinition
1.
Return
true
ClassElement
ClassStaticBlock
1.
Return
true
ClassElement
1.
Return
false
15.7.5
Static Semantics: NonConstructorElements
The
syntax-directed operation
NonConstructorElements takes no arguments and returns a
List
of
ClassElement
Parse Nodes
. It is defined piecewise over the following productions:
ClassElementList
ClassElement
1.
If
ClassElementKind
of
ClassElement
is
NonConstructorMethod
, then
a.
Return «
ClassElement
».
2.
Return a new empty
List
ClassElementList
ClassElementList
ClassElement
1.
Let
list
be
NonConstructorElements
of
ClassElementList
2.
If
ClassElementKind
of
ClassElement
is
NonConstructorMethod
, then
a.
Append
ClassElement
to the end of
list
3.
Return
list
15.7.6
Static Semantics: PrototypePropertyNameList
The
syntax-directed operation
PrototypePropertyNameList takes no arguments and returns a
List
of
property keys
. It is defined piecewise over the following productions:
ClassElementList
ClassElement
1.
Let
propName
be
PropName
of
ClassElement
2.
If
propName
is
empty
, return a new empty
List
3.
If
IsStatic
of
ClassElement
is
true
, return a new empty
List
4.
Return «
propName
».
ClassElementList
ClassElementList
ClassElement
1.
Let
list
be
PrototypePropertyNameList
of
ClassElementList
2.
Let
propName
be
PropName
of
ClassElement
3.
If
propName
is
empty
, return
list
4.
If
IsStatic
of
ClassElement
is
true
, return
list
5.
Return the
list-concatenation
of
list
and «
propName
».
15.7.7
Static Semantics: AllPrivateIdentifiersValid
The
syntax-directed operation
AllPrivateIdentifiersValid takes argument
names
(a
List
of Strings) and returns a Boolean.
Every grammar production alternative in this specification
which is not listed below implicitly has the following default
definition of AllPrivateIdentifiersValid:
1.
For each child node
child
of this
Parse Node
, do
a.
If
child
is an instance of a nonterminal, then
i.
If
AllPrivateIdentifiersValid
of
child
with argument
names
is
false
, return
false
2.
Return
true
MemberExpression
MemberExpression
PrivateIdentifier
1.
If
names
contains the
StringValue
of
PrivateIdentifier
, then
a.
Return
AllPrivateIdentifiersValid
of
MemberExpression
with argument
names
2.
Return
false
CallExpression
CallExpression
PrivateIdentifier
1.
If
names
contains the
StringValue
of
PrivateIdentifier
, then
a.
Return
AllPrivateIdentifiersValid
of
CallExpression
with argument
names
2.
Return
false
OptionalChain
?.
PrivateIdentifier
1.
If
names
contains the
StringValue
of
PrivateIdentifier
, return
true
2.
Return
false
OptionalChain
OptionalChain
PrivateIdentifier
1.
If
names
contains the
StringValue
of
PrivateIdentifier
, then
a.
Return
AllPrivateIdentifiersValid
of
OptionalChain
with argument
names
2.
Return
false
ClassBody
ClassElementList
1.
Let
newNames
be the
list-concatenation
of
names
and
PrivateBoundIdentifiers
of
ClassBody
2.
Return
AllPrivateIdentifiersValid
of
ClassElementList
with argument
newNames
RelationalExpression
PrivateIdentifier
in
ShiftExpression
1.
If
names
contains the
StringValue
of
PrivateIdentifier
, then
a.
Return
AllPrivateIdentifiersValid
of
ShiftExpression
with argument
names
2.
Return
false
15.7.8
Static Semantics: PrivateBoundIdentifiers
The
syntax-directed operation
PrivateBoundIdentifiers takes no arguments and returns a
List
of Strings. It is defined piecewise over the following productions:
FieldDefinition
ClassElementName
Initializer
opt
1.
Return
PrivateBoundIdentifiers
of
ClassElementName
ClassElementName
PrivateIdentifier
1.
Return a
List
whose sole element is the
StringValue
of
PrivateIdentifier
ClassElementName
PropertyName
ClassElement
ClassStaticBlock
1.
Return a new empty
List
ClassElementList
ClassElementList
ClassElement
1.
Let
names1
be
PrivateBoundIdentifiers
of
ClassElementList
2.
Let
names2
be
PrivateBoundIdentifiers
of
ClassElement
3.
Return the
list-concatenation
of
names1
and
names2
MethodDefinition
ClassElementName
UniqueFormalParameters
FunctionBody
get
ClassElementName
FunctionBody
set
ClassElementName
PropertySetParameterList
FunctionBody
GeneratorMethod
ClassElementName
UniqueFormalParameters
GeneratorBody
AsyncMethod
async
ClassElementName
UniqueFormalParameters
AsyncFunctionBody
AsyncGeneratorMethod
async
ClassElementName
UniqueFormalParameters
AsyncGeneratorBody
1.
Return
PrivateBoundIdentifiers
of
ClassElementName
15.7.9
Static Semantics: ContainsArguments
The
syntax-directed operation
ContainsArguments takes no arguments and returns a Boolean.
Every grammar production alternative in this specification
which is not listed below implicitly has the following default
definition of ContainsArguments:
1.
For each child node
child
of this
Parse Node
, do
a.
If
child
is an instance of a nonterminal, then
i.
If
ContainsArguments
of
child
is
true
, return
true
2.
Return
false
IdentifierReference
Identifier
1.
If the
StringValue
of
Identifier
is
"arguments"
, return
true
2.
Return
false
FunctionDeclaration
function
BindingIdentifier
FormalParameters
FunctionBody
function
FormalParameters
FunctionBody
FunctionExpression
function
BindingIdentifier
opt
FormalParameters
FunctionBody
GeneratorDeclaration
function
BindingIdentifier
FormalParameters
GeneratorBody
function
FormalParameters
GeneratorBody
GeneratorExpression
function
BindingIdentifier
opt
FormalParameters
GeneratorBody
AsyncGeneratorDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncGeneratorBody
async
function
FormalParameters
AsyncGeneratorBody
AsyncGeneratorExpression
async
function
BindingIdentifier
opt
FormalParameters
AsyncGeneratorBody
AsyncFunctionDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncFunctionBody
async
function
FormalParameters
AsyncFunctionBody
AsyncFunctionExpression
async
function
BindingIdentifier
opt
FormalParameters
AsyncFunctionBody
1.
Return
false
MethodDefinition
ClassElementName
UniqueFormalParameters
FunctionBody
get
ClassElementName
FunctionBody
set
ClassElementName
PropertySetParameterList
FunctionBody
GeneratorMethod
ClassElementName
UniqueFormalParameters
GeneratorBody
AsyncGeneratorMethod
async
ClassElementName
UniqueFormalParameters
AsyncGeneratorBody
AsyncMethod
async
ClassElementName
UniqueFormalParameters
AsyncFunctionBody
1.
Return
ContainsArguments
of
ClassElementName
15.7.10
Runtime Semantics: ClassFieldDefinitionEvaluation
The
syntax-directed operation
ClassFieldDefinitionEvaluation takes argument
homeObject
(an Object) and returns either a
normal completion containing
ClassFieldDefinition Record
or an
abrupt completion
. It is defined piecewise over the following productions:
FieldDefinition
ClassElementName
Initializer
opt
1.
Let
name
be ?
Evaluation
of
ClassElementName
2.
If
Initializer
opt
is present, then
a.
Let
formalParameterList
be an instance of the production
FormalParameters
[empty]
b.
Let
env
be the LexicalEnvironment of the
running execution context
c.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
d.
Let
sourceText
be the empty sequence of Unicode code points.
e.
Let
initializer
be
OrdinaryFunctionCreate
%Function.prototype%
sourceText
formalParameterList
Initializer
non-lexical-this
env
privateEnv
).
f.
Perform
MakeMethod
initializer
homeObject
).
g.
Set
initializer
.[[ClassFieldInitializerName]] to
name
3.
Else,
a.
Let
initializer
be
empty
4.
Return the
ClassFieldDefinition Record
{ [[Name]]:
name
, [[Initializer]]:
initializer
}.
Note
The function created for
initializer
is never directly accessible to ECMAScript code.
15.7.11
Runtime Semantics: ClassStaticBlockDefinitionEvaluation
The
syntax-directed operation
ClassStaticBlockDefinitionEvaluation takes argument
homeObject
(an Object) and returns a
ClassStaticBlockDefinition Record
. It is defined piecewise over the following productions:
ClassStaticBlock
static
ClassStaticBlockBody
1.
Let
lex
be the
running execution context
's LexicalEnvironment.
2.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
3.
Let
sourceText
be the empty sequence of Unicode code points.
4.
Let
formalParameters
be an instance of the production
FormalParameters
[empty]
5.
Let
bodyFunction
be
OrdinaryFunctionCreate
%Function.prototype%
sourceText
formalParameters
ClassStaticBlockBody
non-lexical-this
lex
privateEnv
).
6.
Perform
MakeMethod
bodyFunction
homeObject
).
7.
Return the
ClassStaticBlockDefinition Record
{ [[BodyFunction]]:
bodyFunction
}.
Note
The function
bodyFunction
is never directly accessible to ECMAScript code.
15.7.12
Runtime Semantics: EvaluateClassStaticBlockBody
The
syntax-directed operation
EvaluateClassStaticBlockBody takes argument
functionObject
(a
function object
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It is defined piecewise over the following productions:
ClassStaticBlockBody
ClassStaticBlockStatementList
1.
Perform ?
FunctionDeclarationInstantiation
functionObject
, « »).
2.
Return ?
Evaluation
of
ClassStaticBlockStatementList
15.7.13
Runtime Semantics: ClassElementEvaluation
The
syntax-directed operation
ClassElementEvaluation takes argument
object
(an Object) and returns either a
normal completion containing
either a
ClassFieldDefinition Record
, a
ClassStaticBlockDefinition Record
, a
PrivateElement
, or
unused
, or an
abrupt completion
. It is defined piecewise over the following productions:
ClassElement
FieldDefinition
static
FieldDefinition
1.
Return ?
ClassFieldDefinitionEvaluation
of
FieldDefinition
with argument
object
ClassElement
MethodDefinition
static
MethodDefinition
1.
Return ?
MethodDefinitionEvaluation
of
MethodDefinition
with arguments
object
and
false
ClassElement
ClassStaticBlock
1.
Return
ClassStaticBlockDefinitionEvaluation
of
ClassStaticBlock
with argument
object
ClassElement
1.
Return
unused
15.7.14
Runtime Semantics: ClassDefinitionEvaluation
The
syntax-directed operation
ClassDefinitionEvaluation takes arguments
classBinding
(a String or
undefined
) and
className
(a
property key
or a
Private Name
) and returns either a
normal completion containing
function object
or an
abrupt completion
Note
For ease of specification, private methods and accessors are
included alongside private fields in the [[PrivateElements]] slot of
class instances. However, any given object has either all or none of the
private methods and accessors defined by a given class. This feature
has been designed so that implementations may choose to implement
private methods and accessors using a strategy which does not require
tracking each method or accessor individually.
For example, an implementation could directly associate instance private methods with their corresponding
Private Name
and track, for each object, which class
constructors
have run with that object as their
this
value. Looking up an instance private method on an object then consists of checking that the class
constructor
which defines the method has been used to initialize the object, then returning the method associated with the
Private Name
This differs from private fields: because field initializers
can throw during class instantiation, an individual object may have some
proper subset of the private fields of a given class, and so private
fields must in general be tracked individually.
It is defined piecewise over the following productions:
ClassTail
ClassHeritage
opt
ClassBody
opt
1.
Let
env
be the LexicalEnvironment of the
running execution context
2.
Let
classEnv
be
NewDeclarativeEnvironment
env
).
3.
If
classBinding
is not
undefined
, then
a.
Perform !
classEnv
.CreateImmutableBinding(
classBinding
true
).
4.
Let
outerPrivateEnvironment
be the
running execution context
's PrivateEnvironment.
5.
Let
classPrivateEnvironment
be
NewPrivateEnvironment
outerPrivateEnvironment
).
6.
If
ClassBody
opt
is present, then
a.
For each String
dn
of the
PrivateBoundIdentifiers
of
ClassBody
opt
, do
i.
If
classPrivateEnvironment
.[[Names]] contains a
Private Name
pn
such that
pn
.[[Description]] is
dn
, then
1.
Assert
: This is only possible for getter/setter pairs.
ii.
Else,
1.
Let
name
be a new
Private Name
whose [[Description]] is
dn
2.
Append
name
to
classPrivateEnvironment
.[[Names]].
7.
If
ClassHeritage
opt
is not present, then
a.
Let
protoParent
be
%Object.prototype%
b.
Let
constructorParent
be
%Function.prototype%
8.
Else,
a.
Set the
running execution context
's LexicalEnvironment to
classEnv
b.
NOTE: The
running execution context
's PrivateEnvironment is
outerPrivateEnvironment
when evaluating
ClassHeritage
c.
Let
superclassRef
be
Completion
Evaluation
of
ClassHeritage
).
d.
Set the
running execution context
's LexicalEnvironment to
env
e.
Let
superclass
be ?
GetValue
(?
superclassRef
).
f.
If
superclass
is
null
, then
i.
Let
protoParent
be
null
ii.
Let
constructorParent
be
%Function.prototype%
g.
Else if
IsConstructor
superclass
) is
false
, throw a
TypeError
exception.
h.
Else,
i.
Let
protoParent
be ?
Get
superclass
"prototype"
).
ii.
If
protoParent
is not an Object
and
protoParent
is not
null
, throw a
TypeError
exception.
iii.
Let
constructorParent
be
superclass
9.
Let
proto
be
OrdinaryObjectCreate
protoParent
).
10.
If
ClassBody
opt
is not present, let
constructor
be
empty
11.
Else, let
constructor
be
ConstructorMethod
of
ClassBody
12.
Set the
running execution context
's LexicalEnvironment to
classEnv
13.
Set the
running execution context
's PrivateEnvironment to
classPrivateEnvironment
14.
If
constructor
is
empty
, then
a.
Let
defaultConstructor
be a new
Abstract Closure
with no parameters that captures nothing and performs the following steps when called:
i.
Let
args
be the
List
of arguments that was passed to this function by [[Call]] or [[Construct]].
ii.
If NewTarget is
undefined
, throw a
TypeError
exception.
iii.
Let
be the
active function object
iv.
If
.[[ConstructorKind]] is
derived
, then
1.
NOTE: This branch behaves similarly to
constructor(...args) { super(...args); }
. The most notable distinction is that while the aforementioned
ECMAScript source text
observably calls the
@@iterator
method on
%Array.prototype%
, this function does not.
2.
Let
func
be !
.[[GetPrototypeOf]]().
3.
If
IsConstructor
func
) is
false
, throw a
TypeError
exception.
4.
Let
result
be ?
Construct
func
args
, NewTarget).
v.
Else,
1.
NOTE: This branch behaves similarly to
constructor() {}
2.
Let
result
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%Object.prototype%"
).
vi.
Perform ?
InitializeInstanceElements
result
).
vii.
Return
result
b.
Let
be
CreateBuiltinFunction
defaultConstructor
, 0,
className
, « [[ConstructorKind]], [[SourceText]] »,
the current Realm Record
constructorParent
).
15.
Else,
a.
Let
constructorInfo
be !
DefineMethod
of
constructor
with arguments
proto
and
constructorParent
b.
Let
be
constructorInfo
.[[Closure]].
c.
Perform
MakeClassConstructor
).
d.
Perform
SetFunctionName
className
).
16.
Perform
MakeConstructor
false
proto
).
17.
If
ClassHeritage
opt
is present, set
.[[ConstructorKind]] to
derived
18.
Perform
CreateMethodProperty
proto
"constructor"
).
19.
If
ClassBody
opt
is not present, let
elements
be a new empty
List
20.
Else, let
elements
be
NonConstructorElements
of
ClassBody
21.
Let
instancePrivateMethods
be a new empty
List
22.
Let
staticPrivateMethods
be a new empty
List
23.
Let
instanceFields
be a new empty
List
24.
Let
staticElements
be a new empty
List
25.
For each
ClassElement
of
elements
, do
a.
If
IsStatic
of
is
false
, then
i.
Let
element
be
Completion
ClassElementEvaluation
of
with argument
proto
).
b.
Else,
i.
Let
element
be
Completion
ClassElementEvaluation
of
with argument
).
c.
If
element
is an
abrupt completion
, then
i.
Set the
running execution context
's LexicalEnvironment to
env
ii.
Set the
running execution context
's PrivateEnvironment to
outerPrivateEnvironment
iii.
Return ?
element
d.
Set
element
to
element
.[[Value]].
e.
If
element
is a
PrivateElement
, then
i.
Assert
element
.[[Kind]] is either
method
or
accessor
ii.
If
IsStatic
of
is
false
, let
container
be
instancePrivateMethods
iii.
Else, let
container
be
staticPrivateMethods
iv.
If
container
contains a
PrivateElement
pe
such that
pe
.[[Key]] is
element
.[[Key]], then
1.
Assert
element
.[[Kind]] and
pe
.[[Kind]] are both
accessor
2.
If
element
.[[Get]] is
undefined
, then
a.
Let
combined
be
PrivateElement
{ [[Key]]:
element
.[[Key]], [[Kind]]:
accessor
, [[Get]]:
pe
.[[Get]], [[Set]]:
element
.[[Set]] }.
3.
Else,
a.
Let
combined
be
PrivateElement
{ [[Key]]:
element
.[[Key]], [[Kind]]:
accessor
, [[Get]]:
element
.[[Get]], [[Set]]:
pe
.[[Set]] }.
4.
Replace
pe
in
container
with
combined
v.
Else,
1.
Append
element
to
container
f.
Else if
element
is a
ClassFieldDefinition Record
, then
i.
If
IsStatic
of
is
false
, append
element
to
instanceFields
ii.
Else, append
element
to
staticElements
g.
Else if
element
is a
ClassStaticBlockDefinition Record
, then
i.
Append
element
to
staticElements
26.
Set the
running execution context
's LexicalEnvironment to
env
27.
If
classBinding
is not
undefined
, then
a.
Perform !
classEnv
.InitializeBinding(
classBinding
).
28.
Set
.[[PrivateMethods]] to
instancePrivateMethods
29.
Set
.[[Fields]] to
instanceFields
30.
For each
PrivateElement
method
of
staticPrivateMethods
, do
a.
Perform !
PrivateMethodOrAccessorAdd
method
).
31.
For each element
elementRecord
of
staticElements
, do
a.
If
elementRecord
is a
ClassFieldDefinition Record
, then
i.
Let
result
be
Completion
DefineField
elementRecord
)).
b.
Else,
i.
Assert
elementRecord
is a
ClassStaticBlockDefinition Record
ii.
Let
result
be
Completion
Call
elementRecord
.[[BodyFunction]],
)).
c.
If
result
is an
abrupt completion
, then
i.
Set the
running execution context
's PrivateEnvironment to
outerPrivateEnvironment
ii.
Return ?
result
32.
Set the
running execution context
's PrivateEnvironment to
outerPrivateEnvironment
33.
Return
15.7.15
Runtime Semantics: BindingClassDeclarationEvaluation
The
syntax-directed operation
BindingClassDeclarationEvaluation takes no arguments and returns either a
normal completion containing
function object
or an
abrupt completion
. It is defined piecewise over the following productions:
ClassDeclaration
class
BindingIdentifier
ClassTail
1.
Let
className
be
StringValue
of
BindingIdentifier
2.
Let
value
be ?
ClassDefinitionEvaluation
of
ClassTail
with arguments
className
and
className
3.
Set
value
.[[SourceText]] to the
source text matched by
ClassDeclaration
4.
Let
env
be the
running execution context
's LexicalEnvironment.
5.
Perform ?
InitializeBoundName
className
value
env
).
6.
Return
value
ClassDeclaration
class
ClassTail
1.
Let
value
be ?
ClassDefinitionEvaluation
of
ClassTail
with arguments
undefined
and
"default"
2.
Set
value
.[[SourceText]] to the
source text matched by
ClassDeclaration
3.
Return
value
Note
ClassDeclaration
class
ClassTail
only occurs as part of an
ExportDeclaration
and establishing its binding is handled as part of the evaluation action for that production. See
16.2.3.7
15.7.16
Runtime Semantics: Evaluation
ClassDeclaration
class
BindingIdentifier
ClassTail
1.
Perform ?
BindingClassDeclarationEvaluation
of this
ClassDeclaration
2.
Return
empty
Note
ClassDeclaration
class
ClassTail
only occurs as part of an
ExportDeclaration
and is never directly evaluated.
ClassExpression
class
ClassTail
1.
Let
value
be ?
ClassDefinitionEvaluation
of
ClassTail
with arguments
undefined
and
""
2.
Set
value
.[[SourceText]] to the
source text matched by
ClassExpression
3.
Return
value
ClassExpression
class
BindingIdentifier
ClassTail
1.
Let
className
be
StringValue
of
BindingIdentifier
2.
Let
value
be ?
ClassDefinitionEvaluation
of
ClassTail
with arguments
className
and
className
3.
Set
value
.[[SourceText]] to the
source text matched by
ClassExpression
4.
Return
value
ClassElementName
PrivateIdentifier
1.
Let
privateIdentifier
be
StringValue
of
PrivateIdentifier
2.
Let
privateEnvRec
be the
running execution context
's PrivateEnvironment.
3.
Let
names
be
privateEnvRec
.[[Names]].
4.
Assert
: Exactly one element of
names
is a
Private Name
whose [[Description]] is
privateIdentifier
5.
Let
privateName
be the
Private Name
in
names
whose [[Description]] is
privateIdentifier
6.
Return
privateName
ClassStaticBlockStatementList
[empty]
1.
Return
undefined
15.8
Async Function Definitions
Syntax
AsyncFunctionDeclaration
[Yield, Await, Default]
async
[no
LineTerminator
here]
function
BindingIdentifier
[?Yield, ?Await]
FormalParameters
[~Yield, +Await]
AsyncFunctionBody
[+Default]
async
[no
LineTerminator
here]
function
FormalParameters
[~Yield, +Await]
AsyncFunctionBody
AsyncFunctionExpression
async
[no
LineTerminator
here]
function
BindingIdentifier
[~Yield, +Await]
opt
FormalParameters
[~Yield, +Await]
AsyncFunctionBody
AsyncMethod
[Yield, Await]
async
[no
LineTerminator
here]
ClassElementName
[?Yield, ?Await]
UniqueFormalParameters
[~Yield, +Await]
AsyncFunctionBody
AsyncFunctionBody
FunctionBody
[~Yield, +Await]
AwaitExpression
[Yield]
await
UnaryExpression
[?Yield, +Await]
Note 1
await
is parsed as a
keyword
of an
AwaitExpression
when the
[Await]
parameter is present. The
[Await]
parameter is present in the top level of the following contexts,
although the parameter may be absent in some contexts depending on the
nonterminals, such as
FunctionBody
In an
AsyncFunctionBody
In the
FormalParameters
of an
AsyncFunctionDeclaration
AsyncFunctionExpression
AsyncGeneratorDeclaration
, or
AsyncGeneratorExpression
AwaitExpression
in this position is a Syntax error via
static semantics
In a
Module
When
Script
is the syntactic
goal symbol
await
may be parsed as an identifier when the
[Await]
parameter is absent. This includes the following contexts:
Anywhere outside of an
AsyncFunctionBody
or
FormalParameters
of an
AsyncFunctionDeclaration
AsyncFunctionExpression
AsyncGeneratorDeclaration
, or
AsyncGeneratorExpression
In the
BindingIdentifier
of a
FunctionExpression
GeneratorExpression
, or
AsyncGeneratorExpression
Note 2
Unlike
YieldExpression
, it is a Syntax Error to omit the operand of an
AwaitExpression
. You must await something.
15.8.1
Static Semantics: Early Errors
AsyncMethod
async
ClassElementName
UniqueFormalParameters
AsyncFunctionBody
It is a Syntax Error if
FunctionBodyContainsUseStrict
of
AsyncFunctionBody
is
true
and
IsSimpleParameterList
of
UniqueFormalParameters
is
false
It is a Syntax Error if
HasDirectSuper
of
AsyncMethod
is
true
It is a Syntax Error if
UniqueFormalParameters
Contains
AwaitExpression
is
true
It is a Syntax Error if any element of the
BoundNames
of
UniqueFormalParameters
also occurs in the
LexicallyDeclaredNames
of
AsyncFunctionBody
AsyncFunctionDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncFunctionBody
async
function
FormalParameters
AsyncFunctionBody
AsyncFunctionExpression
async
function
BindingIdentifier
opt
FormalParameters
AsyncFunctionBody
It is a Syntax Error if
FunctionBodyContainsUseStrict
of
AsyncFunctionBody
is
true
and
IsSimpleParameterList
of
FormalParameters
is
false
It is a Syntax Error if
FormalParameters
Contains
AwaitExpression
is
true
If the
source text matched by
FormalParameters
is
strict mode code
, the Early Error rules for
UniqueFormalParameters
FormalParameters
are applied.
If
BindingIdentifier
is present and the
source text matched by
BindingIdentifier
is
strict mode code
, it is a Syntax Error if the
StringValue
of
BindingIdentifier
is either
"eval"
or
"arguments"
It is a Syntax Error if any element of the
BoundNames
of
FormalParameters
also occurs in the
LexicallyDeclaredNames
of
AsyncFunctionBody
It is a Syntax Error if
FormalParameters
Contains
SuperProperty
is
true
It is a Syntax Error if
AsyncFunctionBody
Contains
SuperProperty
is
true
It is a Syntax Error if
FormalParameters
Contains
SuperCall
is
true
It is a Syntax Error if
AsyncFunctionBody
Contains
SuperCall
is
true
15.8.2
Runtime Semantics: InstantiateAsyncFunctionObject
The
syntax-directed operation
InstantiateAsyncFunctionObject takes arguments
env
(an
Environment Record
) and
privateEnv
(a
PrivateEnvironment Record
or
null
) and returns a
function object
. It is defined piecewise over the following productions:
AsyncFunctionDeclaration
async
function
BindingIdentifier
FormalParameters
AsyncFunctionBody
1.
Let
name
be
StringValue
of
BindingIdentifier
2.
Let
sourceText
be the
source text matched by
AsyncFunctionDeclaration
3.
Let
be
OrdinaryFunctionCreate
%AsyncFunction.prototype%
sourceText
FormalParameters
AsyncFunctionBody
non-lexical-this
env
privateEnv
).
4.
Perform
SetFunctionName
name
).
5.
Return
AsyncFunctionDeclaration
async
function
FormalParameters
AsyncFunctionBody
1.
Let
sourceText
be the
source text matched by
AsyncFunctionDeclaration
2.
Let
be
OrdinaryFunctionCreate
%AsyncFunction.prototype%
sourceText
FormalParameters
AsyncFunctionBody
non-lexical-this
env
privateEnv
).
3.
Perform
SetFunctionName
"default"
).
4.
Return
15.8.3
Runtime Semantics: InstantiateAsyncFunctionExpression
The
syntax-directed operation
InstantiateAsyncFunctionExpression takes optional argument
name
(a
property key
or a
Private Name
) and returns a
function object
. It is defined piecewise over the following productions:
AsyncFunctionExpression
async
function
FormalParameters
AsyncFunctionBody
1.
If
name
is not present, set
name
to
""
2.
Let
env
be the LexicalEnvironment of the
running execution context
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
AsyncFunctionExpression
5.
Let
closure
be
OrdinaryFunctionCreate
%AsyncFunction.prototype%
sourceText
FormalParameters
AsyncFunctionBody
non-lexical-this
env
privateEnv
).
6.
Perform
SetFunctionName
closure
name
).
7.
Return
closure
AsyncFunctionExpression
async
function
BindingIdentifier
FormalParameters
AsyncFunctionBody
1.
Assert
name
is not present.
2.
Set
name
to
StringValue
of
BindingIdentifier
3.
Let
outerEnv
be the LexicalEnvironment of the
running execution context
4.
Let
funcEnv
be
NewDeclarativeEnvironment
outerEnv
).
5.
Perform !
funcEnv
.CreateImmutableBinding(
name
false
).
6.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
7.
Let
sourceText
be the
source text matched by
AsyncFunctionExpression
8.
Let
closure
be
OrdinaryFunctionCreate
%AsyncFunction.prototype%
sourceText
FormalParameters
AsyncFunctionBody
non-lexical-this
funcEnv
privateEnv
).
9.
Perform
SetFunctionName
closure
name
).
10.
Perform !
funcEnv
.InitializeBinding(
name
closure
).
11.
Return
closure
Note
The
BindingIdentifier
in an
AsyncFunctionExpression
can be referenced from inside the
AsyncFunctionExpression
's
AsyncFunctionBody
to allow the function to call itself recursively. However, unlike in a
FunctionDeclaration
, the
BindingIdentifier
in a
AsyncFunctionExpression
cannot be referenced from and does not affect the scope enclosing the
AsyncFunctionExpression
15.8.4
Runtime Semantics: EvaluateAsyncFunctionBody
The
syntax-directed operation
EvaluateAsyncFunctionBody takes arguments
functionObject
(a
function object
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns a
return completion
. It is defined piecewise over the following productions:
AsyncFunctionBody
FunctionBody
1.
Let
promiseCapability
be !
NewPromiseCapability
%Promise%
).
2.
Let
declResult
be
Completion
FunctionDeclarationInstantiation
functionObject
argumentsList
)).
3.
If
declResult
is an
abrupt completion
, then
a.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, «
declResult
.[[Value]] »).
4.
Else,
a.
Perform
AsyncFunctionStart
promiseCapability
FunctionBody
).
5.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
promiseCapability
.[[Promise]], [[Target]]:
empty
}.
15.8.5
Runtime Semantics: Evaluation
AsyncFunctionExpression
async
function
BindingIdentifier
opt
FormalParameters
AsyncFunctionBody
1.
Return
InstantiateAsyncFunctionExpression
of
AsyncFunctionExpression
AwaitExpression
await
UnaryExpression
1.
Let
exprRef
be ?
Evaluation
of
UnaryExpression
2.
Let
value
be ?
GetValue
exprRef
).
3.
Return ?
Await
value
).
15.9
Async Arrow Function Definitions
Syntax
AsyncArrowFunction
[In, Yield, Await]
async
[no
LineTerminator
here]
AsyncArrowBindingIdentifier
[?Yield]
[no
LineTerminator
here]
=>
AsyncConciseBody
[?In]
CoverCallExpressionAndAsyncArrowHead
[?Yield, ?Await]
[no
LineTerminator
here]
=>
AsyncConciseBody
[?In]
AsyncConciseBody
[In]
[lookahead ≠
ExpressionBody
[?In, +Await]
AsyncFunctionBody
AsyncArrowBindingIdentifier
[Yield]
BindingIdentifier
[?Yield, +Await]
CoverCallExpressionAndAsyncArrowHead
[Yield, Await]
MemberExpression
[?Yield, ?Await]
Arguments
[?Yield, ?Await]
Supplemental Syntax
When processing an instance of the production
AsyncArrowFunction
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
the interpretation of
CoverCallExpressionAndAsyncArrowHead
is refined using the following grammar:
AsyncArrowHead
async
[no
LineTerminator
here]
ArrowFormalParameters
[~Yield, +Await]
15.9.1
Static Semantics: Early Errors
AsyncArrowFunction
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
It is a Syntax Error if any element of the
BoundNames
of
AsyncArrowBindingIdentifier
also occurs in the
LexicallyDeclaredNames
of
AsyncConciseBody
AsyncArrowFunction
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
must cover
an
AsyncArrowHead
It is a Syntax Error if
CoverCallExpressionAndAsyncArrowHead
Contains
YieldExpression
is
true
It is a Syntax Error if
CoverCallExpressionAndAsyncArrowHead
Contains
AwaitExpression
is
true
It is a Syntax Error if any element of the
BoundNames
of
CoverCallExpressionAndAsyncArrowHead
also occurs in the
LexicallyDeclaredNames
of
AsyncConciseBody
It is a Syntax Error if
AsyncConciseBodyContainsUseStrict
of
AsyncConciseBody
is
true
and
IsSimpleParameterList
of
CoverCallExpressionAndAsyncArrowHead
is
false
15.9.2
Static Semantics: AsyncConciseBodyContainsUseStrict
The
syntax-directed operation
AsyncConciseBodyContainsUseStrict takes no arguments and returns a
Boolean. It is defined piecewise over the following productions:
AsyncConciseBody
ExpressionBody
1.
Return
false
AsyncConciseBody
AsyncFunctionBody
1.
Return
FunctionBodyContainsUseStrict
of
AsyncFunctionBody
15.9.3
Runtime Semantics: EvaluateAsyncConciseBody
The
syntax-directed operation
EvaluateAsyncConciseBody takes arguments
functionObject
(a
function object
) and
argumentsList
(a
List
of
ECMAScript language values
) and returns a
return completion
. It is defined piecewise over the following productions:
AsyncConciseBody
ExpressionBody
1.
Let
promiseCapability
be !
NewPromiseCapability
%Promise%
).
2.
Let
declResult
be
Completion
FunctionDeclarationInstantiation
functionObject
argumentsList
)).
3.
If
declResult
is an
abrupt completion
, then
a.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, «
declResult
.[[Value]] »).
4.
Else,
a.
Perform
AsyncFunctionStart
promiseCapability
ExpressionBody
).
5.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
promiseCapability
.[[Promise]], [[Target]]:
empty
}.
15.9.4
Runtime Semantics: InstantiateAsyncArrowFunctionExpression
The
syntax-directed operation
InstantiateAsyncArrowFunctionExpression takes optional argument
name
(a
property key
or a
Private Name
) and returns a
function object
. It is defined piecewise over the following productions:
AsyncArrowFunction
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
1.
If
name
is not present, set
name
to
""
2.
Let
env
be the LexicalEnvironment of the
running execution context
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
AsyncArrowFunction
5.
Let
parameters
be
AsyncArrowBindingIdentifier
6.
Let
closure
be
OrdinaryFunctionCreate
%AsyncFunction.prototype%
sourceText
parameters
AsyncConciseBody
lexical-this
env
privateEnv
).
7.
Perform
SetFunctionName
closure
name
).
8.
Return
closure
AsyncArrowFunction
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
1.
If
name
is not present, set
name
to
""
2.
Let
env
be the LexicalEnvironment of the
running execution context
3.
Let
privateEnv
be the
running execution context
's PrivateEnvironment.
4.
Let
sourceText
be the
source text matched by
AsyncArrowFunction
5.
Let
head
be the
AsyncArrowHead
that is
covered
by
CoverCallExpressionAndAsyncArrowHead
6.
Let
parameters
be the
ArrowFormalParameters
of
head
7.
Let
closure
be
OrdinaryFunctionCreate
%AsyncFunction.prototype%
sourceText
parameters
AsyncConciseBody
lexical-this
env
privateEnv
).
8.
Perform
SetFunctionName
closure
name
).
9.
Return
closure
15.9.5
Runtime Semantics: Evaluation
AsyncArrowFunction
async
AsyncArrowBindingIdentifier
=>
AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead
=>
AsyncConciseBody
1.
Return
InstantiateAsyncArrowFunctionExpression
of
AsyncArrowFunction
15.10
Tail Position Calls
15.10.1
Static Semantics: IsInTailPosition (
call
The abstract operation IsInTailPosition takes argument
call
(a
CallExpression
Parse Node
, a
MemberExpression
Parse Node
, or an
OptionalChain
Parse Node
) and returns a Boolean. It performs the following steps when called:
1.
If the
source text matched by
call
is
non-strict code
, return
false
2.
If
call
is not contained within a
FunctionBody
, a
ConciseBody
, or an
AsyncConciseBody
, return
false
3.
Let
body
be the
FunctionBody
ConciseBody
, or
AsyncConciseBody
that most closely contains
call
4.
If
body
is the
FunctionBody
of a
GeneratorBody
, return
false
5.
If
body
is the
FunctionBody
of an
AsyncFunctionBody
, return
false
6.
If
body
is the
FunctionBody
of an
AsyncGeneratorBody
, return
false
7.
If
body
is an
AsyncConciseBody
, return
false
8.
Return the result of
HasCallInTailPosition
of
body
with argument
call
Note
Tail Position calls are only defined in
strict mode code
because of a common non-standard language extension (see
10.2.4
) that enables observation of the chain of caller contexts.
15.10.2
Static Semantics: HasCallInTailPosition
The
syntax-directed operation
HasCallInTailPosition takes argument
call
(a
CallExpression
Parse Node
, a
MemberExpression
Parse Node
, or an
OptionalChain
Parse Node
) and returns a Boolean.
Note 1
call
is a
Parse Node
that represents a specific range of source text. When the following algorithms compare
call
to another
Parse Node
, it is a test of whether they represent the same source text.
Note 2
A potential tail position call that is immediately followed by return
GetValue
of the call result is also a possible tail position call. A function call cannot return a
Reference Record
, so such a
GetValue
operation will always return the same value as the actual function call result.
It is defined piecewise over the following productions:
StatementList
StatementList
StatementListItem
1.
Let
has
be
HasCallInTailPosition
of
StatementList
with argument
call
2.
If
has
is
true
, return
true
3.
Return
HasCallInTailPosition
of
StatementListItem
with argument
call
FunctionStatementList
[empty]
StatementListItem
Declaration
Statement
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ThrowStatement
DebuggerStatement
Block
ReturnStatement
return
LabelledItem
FunctionDeclaration
ForInOfStatement
for
LeftHandSideExpression
of
AssignmentExpression
Statement
for
var
ForBinding
of
AssignmentExpression
Statement
for
ForDeclaration
of
AssignmentExpression
Statement
CaseBlock
1.
Return
false
IfStatement
if
Expression
Statement
else
Statement
1.
Let
has
be
HasCallInTailPosition
of the first
Statement
with argument
call
2.
If
has
is
true
, return
true
3.
Return
HasCallInTailPosition
of the second
Statement
with argument
call
IfStatement
if
Expression
Statement
DoWhileStatement
do
Statement
while
Expression
WhileStatement
while
Expression
Statement
ForStatement
for
Expression
opt
Expression
opt
Expression
opt
Statement
for
var
VariableDeclarationList
Expression
opt
Expression
opt
Statement
for
LexicalDeclaration
Expression
opt
Expression
opt
Statement
ForInOfStatement
for
LeftHandSideExpression
in
Expression
Statement
for
var
ForBinding
in
Expression
Statement
for
ForDeclaration
in
Expression
Statement
WithStatement
with
Expression
Statement
1.
Return
HasCallInTailPosition
of
Statement
with argument
call
LabelledStatement
LabelIdentifier
LabelledItem
1.
Return
HasCallInTailPosition
of
LabelledItem
with argument
call
ReturnStatement
return
Expression
1.
Return
HasCallInTailPosition
of
Expression
with argument
call
SwitchStatement
switch
Expression
CaseBlock
1.
Return
HasCallInTailPosition
of
CaseBlock
with argument
call
CaseBlock
CaseClauses
opt
DefaultClause
CaseClauses
opt
1.
Let
has
be
false
2.
If the first
CaseClauses
is present, let
has
be
HasCallInTailPosition
of the first
CaseClauses
with argument
call
3.
If
has
is
true
, return
true
4.
Let
has
be
HasCallInTailPosition
of
DefaultClause
with argument
call
5.
If
has
is
true
, return
true
6.
If the second
CaseClauses
is present, let
has
be
HasCallInTailPosition
of the second
CaseClauses
with argument
call
7.
Return
has
CaseClauses
CaseClauses
CaseClause
1.
Let
has
be
HasCallInTailPosition
of
CaseClauses
with argument
call
2.
If
has
is
true
, return
true
3.
Return
HasCallInTailPosition
of
CaseClause
with argument
call
CaseClause
case
Expression
StatementList
opt
DefaultClause
default
StatementList
opt
1.
If
StatementList
is present, return
HasCallInTailPosition
of
StatementList
with argument
call
2.
Return
false
TryStatement
try
Block
Catch
1.
Return
HasCallInTailPosition
of
Catch
with argument
call
TryStatement
try
Block
Finally
try
Block
Catch
Finally
1.
Return
HasCallInTailPosition
of
Finally
with argument
call
Catch
catch
CatchParameter
Block
1.
Return
HasCallInTailPosition
of
Block
with argument
call
AssignmentExpression
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression
AssignmentExpression
LeftHandSideExpression
AssignmentOperator
AssignmentExpression
LeftHandSideExpression
&&=
AssignmentExpression
LeftHandSideExpression
||=
AssignmentExpression
LeftHandSideExpression
??=
AssignmentExpression
BitwiseANDExpression
BitwiseANDExpression
EqualityExpression
BitwiseXORExpression
BitwiseXORExpression
BitwiseANDExpression
BitwiseORExpression
BitwiseORExpression
BitwiseXORExpression
EqualityExpression
EqualityExpression
==
RelationalExpression
EqualityExpression
!=
RelationalExpression
EqualityExpression
===
RelationalExpression
EqualityExpression
!==
RelationalExpression
RelationalExpression
RelationalExpression
ShiftExpression
RelationalExpression
ShiftExpression
RelationalExpression
<=
ShiftExpression
RelationalExpression
>=
ShiftExpression
RelationalExpression
instanceof
ShiftExpression
RelationalExpression
in
ShiftExpression
PrivateIdentifier
in
ShiftExpression
ShiftExpression
ShiftExpression
<<
AdditiveExpression
ShiftExpression
>>
AdditiveExpression
ShiftExpression
>>>
AdditiveExpression
AdditiveExpression
AdditiveExpression
MultiplicativeExpression
AdditiveExpression
MultiplicativeExpression
MultiplicativeExpression
MultiplicativeExpression
MultiplicativeOperator
ExponentiationExpression
ExponentiationExpression
UpdateExpression
**
ExponentiationExpression
UpdateExpression
LeftHandSideExpression
++
LeftHandSideExpression
--
++
UnaryExpression
--
UnaryExpression
UnaryExpression
delete
UnaryExpression
void
UnaryExpression
typeof
UnaryExpression
UnaryExpression
UnaryExpression
UnaryExpression
UnaryExpression
AwaitExpression
CallExpression
SuperCall
CallExpression
Expression
CallExpression
IdentifierName
CallExpression
PrivateIdentifier
NewExpression
new
NewExpression
MemberExpression
MemberExpression
Expression
MemberExpression
IdentifierName
SuperProperty
MetaProperty
new
MemberExpression
Arguments
MemberExpression
PrivateIdentifier
PrimaryExpression
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
1.
Return
false
Expression
AssignmentExpression
Expression
AssignmentExpression
1.
Return
HasCallInTailPosition
of
AssignmentExpression
with argument
call
ConditionalExpression
ShortCircuitExpression
AssignmentExpression
AssignmentExpression
1.
Let
has
be
HasCallInTailPosition
of the first
AssignmentExpression
with argument
call
2.
If
has
is
true
, return
true
3.
Return
HasCallInTailPosition
of the second
AssignmentExpression
with argument
call
LogicalANDExpression
LogicalANDExpression
&&
BitwiseORExpression
1.
Return
HasCallInTailPosition
of
BitwiseORExpression
with argument
call
LogicalORExpression
LogicalORExpression
||
LogicalANDExpression
1.
Return
HasCallInTailPosition
of
LogicalANDExpression
with argument
call
CoalesceExpression
CoalesceExpressionHead
??
BitwiseORExpression
1.
Return
HasCallInTailPosition
of
BitwiseORExpression
with argument
call
CallExpression
CoverCallExpressionAndAsyncArrowHead
CallExpression
Arguments
CallExpression
TemplateLiteral
1.
If this
CallExpression
is
call
, return
true
2.
Return
false
OptionalExpression
MemberExpression
OptionalChain
CallExpression
OptionalChain
OptionalExpression
OptionalChain
1.
Return
HasCallInTailPosition
of
OptionalChain
with argument
call
OptionalChain
?.
Expression
?.
IdentifierName
?.
PrivateIdentifier
OptionalChain
Expression
OptionalChain
IdentifierName
OptionalChain
PrivateIdentifier
1.
Return
false
OptionalChain
?.
Arguments
OptionalChain
Arguments
1.
If this
OptionalChain
is
call
, return
true
2.
Return
false
MemberExpression
MemberExpression
TemplateLiteral
1.
If this
MemberExpression
is
call
, return
true
2.
Return
false
PrimaryExpression
CoverParenthesizedExpressionAndArrowParameterList
1.
Let
expr
be the
ParenthesizedExpression
that is
covered
by
CoverParenthesizedExpressionAndArrowParameterList
2.
Return
HasCallInTailPosition
of
expr
with argument
call
ParenthesizedExpression
Expression
1.
Return
HasCallInTailPosition
of
Expression
with argument
call
15.10.3
PrepareForTailCall ( )
The abstract operation PrepareForTailCall takes no arguments and returns
unused
. It performs the following steps when called:
1.
Assert
: The current
execution context
will not subsequently be used for the evaluation of any ECMAScript code
or built-in functions. The invocation of Call subsequent to the
invocation of this abstract operation will create and push a new
execution context
before performing any such evaluation.
2.
Discard all resources associated with the current
execution context
3.
Return
unused
A tail position call must either release any transient internal resources associated with the currently executing function
execution context
before invoking the target function or reuse those resources in support of the target function.
Note
For example, a tail position call should only grow an
implementation's activation record stack by the amount that the size of
the target function's activation record exceeds the size of the calling
function's activation record. If the target function's activation record
is smaller, then the total size of the stack should decrease.
16
ECMAScript Language: Scripts and Modules
16.1
Scripts
Syntax
Script
ScriptBody
opt
ScriptBody
StatementList
[~Yield, ~Await, ~Return]
16.1.1
Static Semantics: Early Errors
Script
ScriptBody
It is a Syntax Error if the
LexicallyDeclaredNames
of
ScriptBody
contains any duplicate entries.
It is a Syntax Error if any element of the
LexicallyDeclaredNames
of
ScriptBody
also occurs in the
VarDeclaredNames
of
ScriptBody
ScriptBody
StatementList
It is a Syntax Error if
StatementList
Contains
super
unless the source text containing
super
is eval code that is being processed by a
direct eval
. Additional
early error
rules for
super
within
direct eval
are defined in
19.2.1.1
It is a Syntax Error if
StatementList
Contains
NewTarget
unless the source text containing
NewTarget
is eval code that is being processed by a
direct eval
. Additional
early error
rules for
NewTarget
in
direct eval
are defined in
19.2.1.1
It is a Syntax Error if
ContainsDuplicateLabels
of
StatementList
with argument « » is
true
It is a Syntax Error if
ContainsUndefinedBreakTarget
of
StatementList
with argument « » is
true
It is a Syntax Error if
ContainsUndefinedContinueTarget
of
StatementList
with arguments « » and « » is
true
It is a Syntax Error if
AllPrivateIdentifiersValid
of
StatementList
with argument « » is
false
unless the source text containing
ScriptBody
is eval code that is being processed by a
direct eval
16.1.2
Static Semantics: IsStrict
The
syntax-directed operation
IsStrict takes no arguments and returns a Boolean. It is defined piecewise over the following productions:
Script
ScriptBody
opt
1.
If
ScriptBody
is present and the
Directive Prologue
of
ScriptBody
contains a
Use Strict Directive
, return
true
; otherwise, return
false
16.1.3
Runtime Semantics: Evaluation
Script
[empty]
1.
Return
undefined
16.1.4
Script Records
Script Record
encapsulates information about a script being evaluated. Each script record contains the fields listed in
Table 39
Table 39:
Script Record
Fields
Field Name
Value Type
Meaning
[[Realm]]
Realm Record
or
undefined
The
realm
within which this script was created.
undefined
if not yet assigned.
[[ECMAScriptCode]]
Script
Parse Node
The result of parsing the source text of this script.
[[LoadedModules]]
List
of
Records
with fields [[Specifier]] (a String) and [[Module]] (a
Module Record
A map from the specifier strings imported by this script to the resolved
Module Record
. The list does not contain two different
Records
with the same [[Specifier]].
[[HostDefined]]
anything (default value is
empty
Field reserved for use by
host environments
that need to associate additional information with a script.
16.1.5
ParseScript (
sourceText
realm
hostDefined
The abstract operation ParseScript takes arguments
sourceText
ECMAScript source text
),
realm
(a
Realm Record
or
undefined
), and
hostDefined
(anything) and returns a
Script Record
or a non-empty
List
of
SyntaxError
objects. It creates a
Script Record
based upon the result of parsing
sourceText
as a
Script
. It performs the following steps when called:
1.
Let
script
be
ParseText
sourceText
Script
).
2.
If
script
is a
List
of errors, return
script
3.
Return
Script Record
{ [[Realm]]:
realm
, [[ECMAScriptCode]]:
script
, [[LoadedModules]]: « », [[HostDefined]]:
hostDefined
}.
Note
An implementation may parse script source text and analyse it
for Early Error conditions prior to evaluation of ParseScript for that
script source text. However, the reporting of any errors must be
deferred until the point where this specification actually performs
ParseScript upon that source text.
16.1.6
ScriptEvaluation (
scriptRecord
The abstract operation ScriptEvaluation takes argument
scriptRecord
(a
Script Record
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
Let
globalEnv
be
scriptRecord
.[[Realm]].[[GlobalEnv]].
2.
Let
scriptContext
be a new
ECMAScript code execution context
3.
Set the Function of
scriptContext
to
null
4.
Set the
Realm
of
scriptContext
to
scriptRecord
.[[Realm]].
5.
Set the ScriptOrModule of
scriptContext
to
scriptRecord
6.
Set the VariableEnvironment of
scriptContext
to
globalEnv
7.
Set the LexicalEnvironment of
scriptContext
to
globalEnv
8.
Set the PrivateEnvironment of
scriptContext
to
null
9.
Suspend the
running execution context
10.
Push
scriptContext
onto the
execution context stack
scriptContext
is now the
running execution context
11.
Let
script
be
scriptRecord
.[[ECMAScriptCode]].
12.
Let
result
be
Completion
GlobalDeclarationInstantiation
script
globalEnv
)).
13.
If
result
.[[Type]] is
normal
, then
a.
Set
result
to
Completion
Evaluation
of
script
).
b.
If
result
.[[Type]] is
normal
and
result
.[[Value]] is
empty
, then
i.
Set
result
to
NormalCompletion
undefined
).
14.
Suspend
scriptContext
and remove it from the
execution context stack
15.
Assert
: The
execution context stack
is not empty.
16.
Resume the context that is now on the top of the
execution context stack
as the
running execution context
17.
Return ?
result
16.1.7
GlobalDeclarationInstantiation (
script
env
The abstract operation GlobalDeclarationInstantiation takes arguments
script
(a
Script
Parse Node
) and
env
(a
Global Environment Record
) and returns either a
normal completion containing
unused
or a
throw completion
script
is the
Script
for which the
execution context
is being established.
env
is the global environment in which bindings are to be created.
Note 1
When an
execution context
is established for evaluating scripts, declarations are instantiated in
the current global environment. Each global binding declared in the
code is instantiated.
It performs the following steps when called:
1.
Let
lexNames
be the
LexicallyDeclaredNames
of
script
2.
Let
varNames
be the
VarDeclaredNames
of
script
3.
For each element
name
of
lexNames
, do
a.
If
env
.HasVarDeclaration(
name
) is
true
, throw a
SyntaxError
exception.
b.
If
env
.HasLexicalDeclaration(
name
) is
true
, throw a
SyntaxError
exception.
c.
Let
hasRestrictedGlobal
be ?
env
.HasRestrictedGlobalProperty(
name
).
d.
If
hasRestrictedGlobal
is
true
, throw a
SyntaxError
exception.
4.
For each element
name
of
varNames
, do
a.
If
env
.HasLexicalDeclaration(
name
) is
true
, throw a
SyntaxError
exception.
5.
Let
varDeclarations
be the
VarScopedDeclarations
of
script
6.
Let
functionsToInitialize
be a new empty
List
7.
Let
declaredFunctionNames
be a new empty
List
8.
For each element
of
varDeclarations
, in reverse
List
order, do
a.
If
is not either a
VariableDeclaration
, a
ForBinding
, or a
BindingIdentifier
, then
i.
Assert
is either a
FunctionDeclaration
, a
GeneratorDeclaration
, an
AsyncFunctionDeclaration
, or an
AsyncGeneratorDeclaration
ii.
NOTE: If there are multiple function declarations for the same name, the last declaration is used.
iii.
Let
fn
be the sole element of the
BoundNames
of
iv.
If
declaredFunctionNames
does not contain
fn
, then
1.
Let
fnDefinable
be ?
env
.CanDeclareGlobalFunction(
fn
).
2.
If
fnDefinable
is
false
, throw a
TypeError
exception.
3.
Append
fn
to
declaredFunctionNames
4.
Insert
as the first element of
functionsToInitialize
9.
Let
declaredVarNames
be a new empty
List
10.
For each element
of
varDeclarations
, do
a.
If
is either a
VariableDeclaration
, a
ForBinding
, or a
BindingIdentifier
, then
i.
For each String
vn
of the
BoundNames
of
, do
1.
If
declaredFunctionNames
does not contain
vn
, then
a.
Let
vnDefinable
be ?
env
.CanDeclareGlobalVar(
vn
).
b.
If
vnDefinable
is
false
, throw a
TypeError
exception.
c.
If
declaredVarNames
does not contain
vn
, then
i.
Append
vn
to
declaredVarNames
11.
NOTE: No abnormal terminations occur after this algorithm step if the
global object
is an
ordinary object
. However, if the
global object
is a
Proxy exotic object
it may exhibit behaviours that cause abnormal terminations in some of the following steps.
12.
NOTE: Annex
B.3.2.2
adds additional steps at this point.
13.
Let
lexDeclarations
be the
LexicallyScopedDeclarations
of
script
14.
Let
privateEnv
be
null
15.
For each element
of
lexDeclarations
, do
a.
NOTE: Lexically declared names are only instantiated here but not initialized.
b.
For each element
dn
of the
BoundNames
of
, do
i.
If
IsConstantDeclaration
of
is
true
, then
1.
Perform ?
env
.CreateImmutableBinding
dn
true
).
ii.
Else,
1.
Perform ?
env
.CreateMutableBinding
dn
false
).
16.
For each
Parse Node
of
functionsToInitialize
, do
a.
Let
fn
be the sole element of the
BoundNames
of
b.
Let
fo
be
InstantiateFunctionObject
of
with arguments
env
and
privateEnv
c.
Perform ?
env
.CreateGlobalFunctionBinding
fn
fo
false
).
17.
For each String
vn
of
declaredVarNames
, do
a.
Perform ?
env
.CreateGlobalVarBinding
vn
false
).
18.
Return
unused
Note 2
Early errors
specified in
16.1.1
prevent name conflicts between function/var declarations and
let/const/class declarations as well as redeclaration of let/const/class
bindings for declaration contained within a single
Script
. However, such conflicts and redeclarations that span more than one
Script
are detected as runtime errors during GlobalDeclarationInstantiation.
If any such errors are detected, no bindings are instantiated for the
script. However, if the
global object
is defined using
Proxy exotic objects
then the runtime tests for conflicting declarations may be unreliable resulting in an
abrupt completion
and some global declarations not being instantiated. If this occurs, the code for the
Script
is not evaluated.
Unlike explicit var or function declarations, properties that are directly created on the
global object
result in global bindings that may be shadowed by let/const/class declarations.
16.2
Modules
Syntax
Module
ModuleBody
opt
ModuleBody
ModuleItemList
ModuleItemList
ModuleItem
ModuleItemList
ModuleItem
ModuleItem
ImportDeclaration
ExportDeclaration
StatementListItem
[~Yield, +Await, ~Return]
ModuleExportName
IdentifierName
StringLiteral
16.2.1
Module Semantics
16.2.1.1
Static Semantics: Early Errors
ModuleBody
ModuleItemList
It is a Syntax Error if the
LexicallyDeclaredNames
of
ModuleItemList
contains any duplicate entries.
It is a Syntax Error if any element of the
LexicallyDeclaredNames
of
ModuleItemList
also occurs in the
VarDeclaredNames
of
ModuleItemList
It is a Syntax Error if the
ExportedNames
of
ModuleItemList
contains any duplicate entries.
It is a Syntax Error if any element of the
ExportedBindings
of
ModuleItemList
does not also occur in either the
VarDeclaredNames
of
ModuleItemList
, or the
LexicallyDeclaredNames
of
ModuleItemList
It is a Syntax Error if
ModuleItemList
Contains
super
It is a Syntax Error if
ModuleItemList
Contains
NewTarget
It is a Syntax Error if
ContainsDuplicateLabels
of
ModuleItemList
with argument « » is
true
It is a Syntax Error if
ContainsUndefinedBreakTarget
of
ModuleItemList
with argument « » is
true
It is a Syntax Error if
ContainsUndefinedContinueTarget
of
ModuleItemList
with arguments « » and « » is
true
It is a Syntax Error if
AllPrivateIdentifiersValid
of
ModuleItemList
with argument « » is
false
Note
The duplicate
ExportedNames
rule implies that multiple
export default
ExportDeclaration
items within a
ModuleBody
is a Syntax Error. Additional error conditions relating to conflicting
or duplicate declarations are checked during module linking prior to
evaluation of a
Module
. If any such errors are detected the
Module
is not evaluated.
ModuleExportName
StringLiteral
It is a Syntax Error if
IsStringWellFormedUnicode
(the
SV
of
StringLiteral
) is
false
16.2.1.2
Static Semantics: ImportedLocalNames (
importEntries
The abstract operation ImportedLocalNames takes argument
importEntries
(a
List
of
ImportEntry Records
) and returns a
List
of Strings. It creates a
List
of all of the local name bindings defined by
importEntries
. It performs the following steps when called:
1.
Let
localNames
be a new empty
List
2.
For each
ImportEntry Record
of
importEntries
, do
a.
Append
.[[LocalName]] to
localNames
3.
Return
localNames
16.2.1.3
Static Semantics: ModuleRequests
The
syntax-directed operation
ModuleRequests takes no arguments and returns a
List
of Strings. It is defined piecewise over the following productions:
Module
[empty]
1.
Return a new empty
List
ModuleItemList
ModuleItem
1.
Return
ModuleRequests
of
ModuleItem
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
moduleNames
be
ModuleRequests
of
ModuleItemList
2.
Let
additionalNames
be
ModuleRequests
of
ModuleItem
3.
For each String
name
of
additionalNames
, do
a.
If
moduleNames
does not contain
name
, then
i.
Append
name
to
moduleNames
4.
Return
moduleNames
ModuleItem
StatementListItem
1.
Return a new empty
List
ImportDeclaration
import
ImportClause
FromClause
1.
Return
ModuleRequests
of
FromClause
ModuleSpecifier
StringLiteral
1.
Return a
List
whose sole element is the
SV
of
StringLiteral
ExportDeclaration
export
ExportFromClause
FromClause
1.
Return the
ModuleRequests
of
FromClause
ExportDeclaration
export
NamedExports
export
VariableStatement
export
Declaration
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
1.
Return a new empty
List
16.2.1.4
Abstract Module Records
Module Record
encapsulates structural information about the imports and exports of a
single module. This information is used to link the imports and exports
of sets of connected modules. A Module Record includes four fields that
are only used when evaluating a module.
For specification purposes Module Record values are values of the
Record
specification type and can be thought of as existing in a simple
object-oriented hierarchy where Module Record is an abstract class with
both abstract and concrete subclasses. This specification defines the
abstract subclass named
Cyclic Module Record
and its concrete subclass named
Source Text Module Record
Other specifications and implementations may define additional Module
Record subclasses corresponding to alternative module definition
facilities that they defined.
Module Record defines the fields listed in
Table 40
. All Module Definition subclasses include at least those fields. Module Record also defines the abstract method list in
Table 41
. All Module definition subclasses must provide concrete implementations of these abstract methods.
Table 40:
Module Record
Fields
Field Name
Value Type
Meaning
[[Realm]]
Realm Record
The
Realm
within which this module was created.
[[Environment]]
Module Environment Record
or
empty
The
Environment Record
containing the top level bindings for this module. This field is set when the module is linked.
[[Namespace]]
an Object or
empty
The Module Namespace Object (
28.3
) if one has been created for this module.
[[HostDefined]]
anything (default value is
undefined
Field reserved for use by
host environments
that need to associate additional information with a module.
Table 41: Abstract Methods of
Module Records
Method
Purpose
LoadRequestedModules( [
hostDefined
] )
Prepares the module for linking by recursively loading all its dependencies, and returns a promise.
GetExportedNames([
exportStarSet
])
Return a list of all names that are either directly or indirectly exported from this module.
LoadRequestedModules must have completed successfully prior to invoking this method.
ResolveExport(
exportName
[,
resolveSet
])
Return the binding of a name exported by this module. Bindings are represented by a
ResolvedBinding Record
, of the form { [[Module]]:
Module Record
, [[BindingName]]: String |
namespace
}. If the export is a Module Namespace Object without a direct binding in any module, [[BindingName]] will be set to
namespace
. Return
null
if the name cannot be resolved, or
ambiguous
if multiple bindings were found.
Each time this operation is called with a specific
exportName
resolveSet
pair as arguments it must return the same result.
LoadRequestedModules must have completed successfully prior to invoking this method.
Link()
Prepare the module for evaluation by transitively resolving all module dependencies and creating a
Module Environment Record
LoadRequestedModules must have completed successfully prior to invoking this method.
Evaluate()
Returns a promise for the evaluation of this module
and its dependencies, resolving on successful evaluation or if it has
already been evaluated successfully, and rejecting for an evaluation
error or if it has already been evaluated unsuccessfully. If the promise
is rejected,
hosts
are expected to handle the promise rejection and rethrow the evaluation error.
Link must have completed successfully prior to invoking this method.
16.2.1.5
Cyclic Module Records
Cyclic Module Record
is used to represent information about a module that can participate in
dependency cycles with other modules that are subclasses of the
Cyclic Module Record
type.
Module Records
that are not subclasses of the
Cyclic Module Record
type must not participate in dependency cycles with
Source Text Module Records
In addition to the fields defined in
Table 40
Cyclic Module Records
have the additional fields listed in
Table 42
Table 42: Additional Fields of
Cyclic Module Records
Field Name
Value Type
Meaning
[[Status]]
new
unlinked
linking
linked
evaluating
evaluating-async
, or
evaluated
Initially
new
. Transitions to
unlinked
linking
linked
evaluating
, possibly
evaluating-async
evaluated
(in that order) as the module progresses throughout its lifecycle.
evaluating-async
indicates this module is queued to execute on completion of its
asynchronous dependencies or it is a module whose [[HasTLA]] field is
true
that has been executed and is pending top-level completion.
[[EvaluationError]]
throw completion
or
empty
throw completion
representing the exception that occurred during evaluation.
undefined
if no exception occurred or if [[Status]] is not
evaluated
[[DFSIndex]]
an
integer
or
empty
Auxiliary field used during Link and Evaluate only. If [[Status]] is either
linking
or
evaluating
this non-negative number records the point at which the module was
first visited during the depth-first traversal of the dependency graph.
[[DFSAncestorIndex]]
an
integer
or
empty
Auxiliary field used during Link and Evaluate only. If [[Status]] is either
linking
or
evaluating
, this is either the module's own [[DFSIndex]] or that of an "earlier" module in the same strongly connected component.
[[RequestedModules]]
List
of Strings
List
of all the
ModuleSpecifier
strings used by the module represented by this record to request the importation of a module. The
List
is in source text occurrence order.
[[LoadedModules]]
List
of
Records
with fields [[Specifier]] (a String) and [[Module]] (a
Module Record
A map from the specifier strings used by the module
represented by this record to request the importation of a module to the
resolved
Module Record
. The list does not contain two different
Records
with the same [[Specifier]].
[[CycleRoot]]
Cyclic Module Record
or
empty
The first visited module of the cycle, the root DFS
ancestor of the strongly connected component. For a module not in a
cycle, this would be the module itself. Once Evaluate has completed, a
module's [[DFSAncestorIndex]] is the [[DFSIndex]] of its [[CycleRoot]].
[[HasTLA]]
a Boolean
Whether this module is individually asynchronous (for example, if it's a
Source Text Module Record
containing a top-level await). Having an asynchronous dependency does not mean this field is
true
. This field must not change after the module is parsed.
[[AsyncEvaluation]]
a Boolean
Whether this module is either itself asynchronous or has
an asynchronous dependency. Note: The order in which this field is set
is used to order queued executions, see
16.2.1.5.3.4
[[TopLevelCapability]]
PromiseCapability Record
or
empty
If this module is the [[CycleRoot]] of some cycle, and
Evaluate() was called on some module in that cycle, this field contains
the
PromiseCapability Record
for that entire evaluation. It is used to settle the Promise object
that is returned from the Evaluate() abstract method. This field will be
empty
for any dependencies of that module, unless a top-level Evaluate() has been initiated for some of those dependencies.
[[AsyncParentModules]]
List
of
Cyclic Module Records
If this module or a dependency has [[HasTLA]]
true
and execution is in progress, this tracks the parent importers of this
module for the top-level execution job. These parent modules will not
start executing before this module has successfully completed execution.
[[PendingAsyncDependencies]]
an
integer
or
empty
If this module has any asynchronous dependencies, this
tracks the number of asynchronous dependency modules remaining to
execute for this module. A module with asynchronous dependencies will be
executed when this field reaches 0 and there are no execution errors.
In addition to the methods defined in
Table 41
Cyclic Module Records
have the additional methods listed in
Table 43
Table 43: Additional Abstract Methods of
Cyclic Module Records
Method
Purpose
InitializeEnvironment()
Initialize the
Environment Record
of the module, including resolving all imported bindings, and create the module's
execution context
ExecuteModule( [
promiseCapability
] )
Evaluate the module's code within its
execution context
. If this module has
true
in [[HasTLA]], then a
PromiseCapability Record
is passed as an argument, and the method is expected to resolve or
reject the given capability. In this case, the method must not throw an
exception, but instead reject the
PromiseCapability Record
if necessary.
GraphLoadingState Record
is a
Record
that contains information about the loading process of a module graph. It's used to continue loading after a call to
HostLoadImportedModule
. Each
GraphLoadingState Record
has the fields defined in
Table 44
Table 44:
GraphLoadingState Record
Fields
Field Name
Value Type
Meaning
[[PromiseCapability]]
PromiseCapability Record
The promise to resolve when the loading process finishes.
[[IsLoading]]
a Boolean
It is true if the loading process has not finished yet, neither successfully nor with an error.
[[PendingModulesCount]]
a non-negative
integer
It tracks the number of pending
HostLoadImportedModule
calls.
[[Visited]]
List
of
Cyclic Module Records
It is a list of the
Cyclic Module Records
that have been already loaded by the current loading process, to avoid infinite loops with circular dependencies.
[[HostDefined]]
anything (default value is
empty
It contains
host-defined
data to pass from the LoadRequestedModules caller to
HostLoadImportedModule
16.2.1.5.1
LoadRequestedModules ( [
hostDefined
] )
The LoadRequestedModules concrete method of a
Cyclic Module Record
module
takes optional argument
hostDefined
(anything) and returns a Promise. It populates the [[LoadedModules]] of all the
Module Records
in the dependency graph of
module
(most of the work is done by the auxiliary function
InnerModuleLoading
). It takes an optional
hostDefined
parameter that is passed to the
HostLoadImportedModule
hook. It performs the following steps when called:
1.
If
hostDefined
is not present, let
hostDefined
be
empty
2.
Let
pc
be !
NewPromiseCapability
%Promise%
).
3.
Let
state
be the
GraphLoadingState Record
{ [[IsLoading]]:
true
, [[PendingModulesCount]]: 1, [[Visited]]: « », [[PromiseCapability]]:
pc
, [[HostDefined]]:
hostDefined
}.
4.
Perform
InnerModuleLoading
state
module
).
5.
Return
pc
.[[Promise]].
Note
The
hostDefined
parameter can be used to pass
additional information necessary to fetch the imported modules. It is
used, for example, by HTML to set the correct fetch destination for

tags.
import()
expressions never set the
hostDefined
parameter.
16.2.1.5.1.1
InnerModuleLoading (
state
module
The abstract operation InnerModuleLoading takes arguments
state
(a
GraphLoadingState Record
) and
module
(a
Module Record
) and returns
unused
. It is used by LoadRequestedModules to recursively perform the actual loading process for
module
's dependency graph. It performs the following steps when called:
1.
Assert
state
.[[IsLoading]] is
true
2.
If
module
is a
Cyclic Module Record
module
.[[Status]] is
new
, and
state
.[[Visited]] does not contain
module
, then
a.
Append
module
to
state
.[[Visited]].
b.
Let
requestedModulesCount
be the number of elements in
module
.[[RequestedModules]].
c.
Set
state
.[[PendingModulesCount]] to
state
.[[PendingModulesCount]] +
requestedModulesCount
d.
For each String
required
of
module
.[[RequestedModules]], do
i.
If
module
.[[LoadedModules]] contains a
Record
whose [[Specifier]] is
required
, then
1.
Let
record
be that
Record
2.
Perform
InnerModuleLoading
state
record
.[[Module]]).
ii.
Else,
1.
Perform
HostLoadImportedModule
module
required
state
.[[HostDefined]],
state
).
2.
NOTE:
HostLoadImportedModule
will call
FinishLoadingImportedModule
, which re-enters the graph loading process through
ContinueModuleLoading
iii.
If
state
.[[IsLoading]] is
false
, return
unused
3.
Assert
state
.[[PendingModulesCount]] ≥ 1.
4.
Set
state
.[[PendingModulesCount]] to
state
.[[PendingModulesCount]] - 1.
5.
If
state
.[[PendingModulesCount]] = 0, then
a.
Set
state
.[[IsLoading]] to
false
b.
For each
Cyclic Module Record
loaded
of
state
.[[Visited]], do
i.
If
loaded
.[[Status]] is
new
, set
loaded
.[[Status]] to
unlinked
c.
Perform !
Call
state
.[[PromiseCapability]].[[Resolve]],
undefined
, «
undefined
»).
6.
Return
unused
16.2.1.5.1.2
ContinueModuleLoading (
state
moduleCompletion
The abstract operation ContinueModuleLoading takes arguments
state
(a
GraphLoadingState Record
) and
moduleCompletion
(either a
normal completion containing
Module Record
or a
throw completion
) and returns
unused
. It is used to re-enter the loading process after a call to
HostLoadImportedModule
. It performs the following steps when called:
1.
If
state
.[[IsLoading]] is
false
, return
unused
2.
If
moduleCompletion
is a
normal completion
, then
a.
Perform
InnerModuleLoading
state
moduleCompletion
.[[Value]]).
3.
Else,
a.
Set
state
.[[IsLoading]] to
false
b.
Perform !
Call
state
.[[PromiseCapability]].[[Reject]],
undefined
, «
moduleCompletion
.[[Value]] »).
4.
Return
unused
16.2.1.5.2
Link ( )
The Link concrete method of a
Cyclic Module Record
module
takes no arguments and returns either a
normal completion containing
unused
or a
throw completion
. On success, Link transitions this module's [[Status]] from
unlinked
to
linked
. On failure, an exception is thrown and this module's [[Status]] remains
unlinked
. (Most of the work is done by the auxiliary function
InnerModuleLinking
.) It performs the following steps when called:
1.
Assert
module
.[[Status]] is one of
unlinked
linked
evaluating-async
, or
evaluated
2.
Let
stack
be a new empty
List
3.
Let
result
be
Completion
InnerModuleLinking
module
stack
, 0)).
4.
If
result
is an
abrupt completion
, then
a.
For each
Cyclic Module Record
of
stack
, do
i.
Assert
.[[Status]] is
linking
ii.
Set
.[[Status]] to
unlinked
b.
Assert
module
.[[Status]] is
unlinked
c.
Return ?
result
5.
Assert
module
.[[Status]] is one of
linked
evaluating-async
, or
evaluated
6.
Assert
stack
is empty.
7.
Return
unused
16.2.1.5.2.1
InnerModuleLinking (
module
stack
index
The abstract operation InnerModuleLinking takes arguments
module
(a
Module Record
),
stack
(a
List
of
Cyclic Module Records
), and
index
(a non-negative
integer
) and returns either a
normal completion containing
a non-negative
integer
or a
throw completion
. It is used by Link to perform the actual linking process for
module
, as well as recursively on all other modules in the dependency graph. The
stack
and
index
parameters, as well as a module's [[DFSIndex]] and [[DFSAncestorIndex]]
fields, keep track of the depth-first search (DFS) traversal. In
particular, [[DFSAncestorIndex]] is used to discover strongly connected
components (SCCs), such that all modules in an SCC transition to
linked
together. It performs the following steps when called:
1.
If
module
is not a
Cyclic Module Record
, then
a.
Perform ?
module
.Link().
b.
Return
index
2.
If
module
.[[Status]] is one of
linking
linked
evaluating-async
, or
evaluated
, then
a.
Return
index
3.
Assert
module
.[[Status]] is
unlinked
4.
Set
module
.[[Status]] to
linking
5.
Set
module
.[[DFSIndex]] to
index
6.
Set
module
.[[DFSAncestorIndex]] to
index
7.
Set
index
to
index
+ 1.
8.
Append
module
to
stack
9.
For each String
required
of
module
.[[RequestedModules]], do
a.
Let
requiredModule
be
GetImportedModule
module
required
).
b.
Set
index
to ?
InnerModuleLinking
requiredModule
stack
index
).
c.
If
requiredModule
is a
Cyclic Module Record
, then
i.
Assert
requiredModule
.[[Status]] is one of
linking
linked
evaluating-async
, or
evaluated
ii.
Assert
requiredModule
.[[Status]] is
linking
if and only if
stack
contains
requiredModule
iii.
If
requiredModule
.[[Status]] is
linking
, then
1.
Set
module
.[[DFSAncestorIndex]] to
min
module
.[[DFSAncestorIndex]],
requiredModule
.[[DFSAncestorIndex]]).
10.
Perform ?
module
.InitializeEnvironment().
11.
Assert
module
occurs exactly once in
stack
12.
Assert
module
.[[DFSAncestorIndex]] ≤
module
.[[DFSIndex]].
13.
If
module
.[[DFSAncestorIndex]] =
module
.[[DFSIndex]], then
a.
Let
done
be
false
b.
Repeat, while
done
is
false
i.
Let
requiredModule
be the last element of
stack
ii.
Remove the last element of
stack
iii.
Assert
requiredModule
is a
Cyclic Module Record
iv.
Set
requiredModule
.[[Status]] to
linked
v.
If
requiredModule
and
module
are the same
Module Record
, set
done
to
true
14.
Return
index
16.2.1.5.3
Evaluate ( )
The Evaluate concrete method of a
Cyclic Module Record
module
takes no arguments and returns a Promise. Evaluate transitions this module's [[Status]] from
linked
to either
evaluating-async
or
evaluated
The first time it is called on a module in a given strongly connected
component, Evaluate creates and returns a Promise which resolves when
the module has finished evaluating. This Promise is stored in the
[[TopLevelCapability]] field of the [[CycleRoot]] for the component.
Future invocations of Evaluate on any module in the component return the
same Promise. (Most of the work is done by the auxiliary function
InnerModuleEvaluation
.) It performs the following steps when called:
1.
Assert
: This call to Evaluate is not happening at the same time as another call to Evaluate within the
surrounding agent
2.
Assert
module
.[[Status]] is one of
linked
evaluating-async
, or
evaluated
3.
If
module
.[[Status]] is either
evaluating-async
or
evaluated
, set
module
to
module
.[[CycleRoot]].
4.
If
module
.[[TopLevelCapability]] is not
empty
, then
a.
Return
module
.[[TopLevelCapability]].[[Promise]].
5.
Let
stack
be a new empty
List
6.
Let
capability
be !
NewPromiseCapability
%Promise%
).
7.
Set
module
.[[TopLevelCapability]] to
capability
8.
Let
result
be
Completion
InnerModuleEvaluation
module
stack
, 0)).
9.
If
result
is an
abrupt completion
, then
a.
For each
Cyclic Module Record
of
stack
, do
i.
Assert
.[[Status]] is
evaluating
ii.
Set
.[[Status]] to
evaluated
iii.
Set
.[[EvaluationError]] to
result
b.
Assert
module
.[[Status]] is
evaluated
c.
Assert
module
.[[EvaluationError]] is
result
d.
Perform !
Call
capability
.[[Reject]],
undefined
, «
result
.[[Value]] »).
10.
Else,
a.
Assert
module
.[[Status]] is either
evaluating-async
or
evaluated
b.
Assert
module
.[[EvaluationError]] is
empty
c.
If
module
.[[AsyncEvaluation]] is
false
, then
i.
Assert
module
.[[Status]] is
evaluated
ii.
Perform !
Call
capability
.[[Resolve]],
undefined
, «
undefined
»).
d.
Assert
stack
is empty.
11.
Return
capability
.[[Promise]].
16.2.1.5.3.1
InnerModuleEvaluation (
module
stack
index
The abstract operation InnerModuleEvaluation takes arguments
module
(a
Module Record
),
stack
(a
List
of
Cyclic Module Records
), and
index
(a non-negative
integer
) and returns either a
normal completion containing
a non-negative
integer
or a
throw completion
. It is used by Evaluate to perform the actual evaluation process for
module
, as well as recursively on all other modules in the dependency graph. The
stack
and
index
parameters, as well as
module
's [[DFSIndex]] and [[DFSAncestorIndex]] fields, are used the same way as in
InnerModuleLinking
. It performs the following steps when called:
1.
If
module
is not a
Cyclic Module Record
, then
a.
Let
promise
be !
module
.Evaluate().
b.
Assert
promise
.[[PromiseState]] is not
pending
c.
If
promise
.[[PromiseState]] is
rejected
, then
i.
Return
ThrowCompletion
promise
.[[PromiseResult]]).
d.
Return
index
2.
If
module
.[[Status]] is either
evaluating-async
or
evaluated
, then
a.
If
module
.[[EvaluationError]] is
empty
, return
index
b.
Otherwise, return ?
module
.[[EvaluationError]].
3.
If
module
.[[Status]] is
evaluating
, return
index
4.
Assert
module
.[[Status]] is
linked
5.
Set
module
.[[Status]] to
evaluating
6.
Set
module
.[[DFSIndex]] to
index
7.
Set
module
.[[DFSAncestorIndex]] to
index
8.
Set
module
.[[PendingAsyncDependencies]] to 0.
9.
Set
index
to
index
+ 1.
10.
Append
module
to
stack
11.
For each String
required
of
module
.[[RequestedModules]], do
a.
Let
requiredModule
be
GetImportedModule
module
required
).
b.
Set
index
to ?
InnerModuleEvaluation
requiredModule
stack
index
).
c.
If
requiredModule
is a
Cyclic Module Record
, then
i.
Assert
requiredModule
.[[Status]] is one of
evaluating
evaluating-async
, or
evaluated
ii.
Assert
requiredModule
.[[Status]] is
evaluating
if and only if
stack
contains
requiredModule
iii.
If
requiredModule
.[[Status]] is
evaluating
, then
1.
Set
module
.[[DFSAncestorIndex]] to
min
module
.[[DFSAncestorIndex]],
requiredModule
.[[DFSAncestorIndex]]).
iv.
Else,
1.
Set
requiredModule
to
requiredModule
.[[CycleRoot]].
2.
Assert
requiredModule
.[[Status]] is either
evaluating-async
or
evaluated
3.
If
requiredModule
.[[EvaluationError]] is not
empty
, return ?
requiredModule
.[[EvaluationError]].
v.
If
requiredModule
.[[AsyncEvaluation]] is
true
, then
1.
Set
module
.[[PendingAsyncDependencies]] to
module
.[[PendingAsyncDependencies]] + 1.
2.
Append
module
to
requiredModule
.[[AsyncParentModules]].
12.
If
module
.[[PendingAsyncDependencies]] > 0 or
module
.[[HasTLA]] is
true
, then
a.
Assert
module
.[[AsyncEvaluation]] is
false
and was never previously set to
true
b.
Set
module
.[[AsyncEvaluation]] to
true
c.
NOTE: The order in which module records have their [[AsyncEvaluation]] fields transition to
true
is significant. (See
16.2.1.5.3.4
.)
d.
If
module
.[[PendingAsyncDependencies]] = 0, perform
ExecuteAsyncModule
module
).
13.
Otherwise, perform ?
module
.ExecuteModule()
14.
Assert
module
occurs exactly once in
stack
15.
Assert
module
.[[DFSAncestorIndex]] ≤
module
.[[DFSIndex]].
16.
If
module
.[[DFSAncestorIndex]] =
module
.[[DFSIndex]], then
a.
Let
done
be
false
b.
Repeat, while
done
is
false
i.
Let
requiredModule
be the last element of
stack
ii.
Remove the last element of
stack
iii.
Assert
requiredModule
is a
Cyclic Module Record
iv.
If
requiredModule
.[[AsyncEvaluation]] is
false
, set
requiredModule
.[[Status]] to
evaluated
v.
Otherwise, set
requiredModule
.[[Status]] to
evaluating-async
vi.
If
requiredModule
and
module
are the same
Module Record
, set
done
to
true
vii.
Set
requiredModule
.[[CycleRoot]] to
module
17.
Return
index
Note 1
A module is
evaluating
while it is being traversed by InnerModuleEvaluation. A module is
evaluated
on execution completion or
evaluating-async
during execution if its [[HasTLA]] field is
true
or if it has asynchronous dependencies.
Note 2
Any modules depending on a module of an asynchronous cycle when that cycle is not
evaluating
will instead depend on the execution of the root of the cycle via
[[CycleRoot]]. This ensures that the cycle state can be treated as a
single strongly connected component through its root module state.
16.2.1.5.3.2
ExecuteAsyncModule (
module
The abstract operation ExecuteAsyncModule takes argument
module
(a
Cyclic Module Record
) and returns
unused
. It performs the following steps when called:
1.
Assert
module
.[[Status]] is either
evaluating
or
evaluating-async
2.
Assert
module
.[[HasTLA]] is
true
3.
Let
capability
be !
NewPromiseCapability
%Promise%
).
4.
Let
fulfilledClosure
be a new
Abstract Closure
with no parameters that captures
module
and performs the following steps when called:
a.
Perform
AsyncModuleExecutionFulfilled
module
).
b.
Return
undefined
5.
Let
onFulfilled
be
CreateBuiltinFunction
fulfilledClosure
, 0,
""
, « »).
6.
Let
rejectedClosure
be a new
Abstract Closure
with parameters (
error
) that captures
module
and performs the following steps when called:
a.
Perform
AsyncModuleExecutionRejected
module
error
).
b.
Return
undefined
7.
Let
onRejected
be
CreateBuiltinFunction
rejectedClosure
, 0,
""
, « »).
8.
Perform
PerformPromiseThen
capability
.[[Promise]],
onFulfilled
onRejected
).
9.
Perform !
module
.ExecuteModule
capability
).
10.
Return
unused
16.2.1.5.3.3
GatherAvailableAncestors (
module
execList
The abstract operation GatherAvailableAncestors takes arguments
module
(a
Cyclic Module Record
) and
execList
(a
List
of
Cyclic Module Records
) and returns
unused
. It performs the following steps when called:
1.
For each
Cyclic Module Record
of
module
.[[AsyncParentModules]], do
a.
If
execList
does not contain
and
.[[CycleRoot]].[[EvaluationError]] is
empty
, then
i.
Assert
.[[Status]] is
evaluating-async
ii.
Assert
.[[EvaluationError]] is
empty
iii.
Assert
.[[AsyncEvaluation]] is
true
iv.
Assert
.[[PendingAsyncDependencies]] > 0.
v.
Set
.[[PendingAsyncDependencies]] to
.[[PendingAsyncDependencies]] - 1.
vi.
If
.[[PendingAsyncDependencies]] = 0, then
1.
Append
to
execList
2.
If
.[[HasTLA]] is
false
, perform
GatherAvailableAncestors
execList
).
2.
Return
unused
Note
When an asynchronous execution for a root
module
is fulfilled, this function determines the list of modules which are
able to synchronously execute together on this completion, populating
them in
execList
16.2.1.5.3.4
AsyncModuleExecutionFulfilled (
module
The abstract operation AsyncModuleExecutionFulfilled takes argument
module
(a
Cyclic Module Record
) and returns
unused
. It performs the following steps when called:
1.
If
module
.[[Status]] is
evaluated
, then
a.
Assert
module
.[[EvaluationError]] is not
empty
b.
Return
unused
2.
Assert
module
.[[Status]] is
evaluating-async
3.
Assert
module
.[[AsyncEvaluation]] is
true
4.
Assert
module
.[[EvaluationError]] is
empty
5.
Set
module
.[[AsyncEvaluation]] to
false
6.
Set
module
.[[Status]] to
evaluated
7.
If
module
.[[TopLevelCapability]] is not
empty
, then
a.
Assert
module
.[[CycleRoot]] is
module
b.
Perform !
Call
module
.[[TopLevelCapability]].[[Resolve]],
undefined
, «
undefined
»).
8.
Let
execList
be a new empty
List
9.
Perform
GatherAvailableAncestors
module
execList
).
10.
Let
sortedExecList
be a
List
whose elements are the elements of
execList
, in the order in which they had their [[AsyncEvaluation]] fields set to
true
in
InnerModuleEvaluation
11.
Assert
: All elements of
sortedExecList
have their [[AsyncEvaluation]] field set to
true
, [[PendingAsyncDependencies]] field set to 0, and [[EvaluationError]] field set to
empty
12.
For each
Cyclic Module Record
of
sortedExecList
, do
a.
If
.[[Status]] is
evaluated
, then
i.
Assert
.[[EvaluationError]] is not
empty
b.
Else if
.[[HasTLA]] is
true
, then
i.
Perform
ExecuteAsyncModule
).
c.
Else,
i.
Let
result
be
.ExecuteModule()
ii.
If
result
is an
abrupt completion
, then
1.
Perform
AsyncModuleExecutionRejected
result
.[[Value]]).
iii.
Else,
1.
Set
.[[Status]] to
evaluated
2.
If
.[[TopLevelCapability]] is not
empty
, then
a.
Assert
.[[CycleRoot]] is
b.
Perform !
Call
.[[TopLevelCapability]].[[Resolve]],
undefined
, «
undefined
»).
13.
Return
unused
16.2.1.5.3.5
AsyncModuleExecutionRejected (
module
error
The abstract operation AsyncModuleExecutionRejected takes arguments
module
(a
Cyclic Module Record
) and
error
(an
ECMAScript language value
) and returns
unused
. It performs the following steps when called:
1.
If
module
.[[Status]] is
evaluated
, then
a.
Assert
module
.[[EvaluationError]] is not
empty
b.
Return
unused
2.
Assert
module
.[[Status]] is
evaluating-async
3.
Assert
module
.[[AsyncEvaluation]] is
true
4.
Assert
module
.[[EvaluationError]] is
empty
5.
Set
module
.[[EvaluationError]] to
ThrowCompletion
error
).
6.
Set
module
.[[Status]] to
evaluated
7.
For each
Cyclic Module Record
of
module
.[[AsyncParentModules]], do
a.
Perform
AsyncModuleExecutionRejected
error
).
8.
If
module
.[[TopLevelCapability]] is not
empty
, then
a.
Assert
module
.[[CycleRoot]] is
module
b.
Perform !
Call
module
.[[TopLevelCapability]].[[Reject]],
undefined
, «
error
»).
9.
Return
unused
16.2.1.5.4
Example Cyclic Module Record Graphs
This non-normative section gives a series of examples of
the linking and evaluation of a few common module graphs, with a
specific focus on how errors can occur.
First consider the following simple module graph:
Figure 2: A simple module graph
Let's first assume that there are no error conditions. When a
host
first calls
.LoadRequestedModules(), this will complete successfully by assumption, and recursively load the dependencies of
and
as well (respectively,
and none), and then set
.[[Status]] =
.[[Status]] =
.[[Status]] =
unlinked
. Then, when the
host
calls
.Link(), it will complete successfully (again by assumption) such that
.[[Status]] =
.[[Status]] =
.[[Status]] = linked. These preparatory steps can be performed at any time. Later, when the
host
is ready to incur any possible side effects of the modules, it can call
.Evaluate(), which will complete successfully, returning a Promise resolving to
undefined
(again by assumption), recursively having evaluated first
and then
. Each module's [[Status]] at this point will be
evaluated
Consider then cases involving linking errors, after a successful call to
.LoadRequestedModules(). If
InnerModuleLinking
of
succeeds but, thereafter, fails for
, for example because it imports something that
does not provide, then the original
.Link() will fail, and both
and
's [[Status]] remain
unlinked
's [[Status]] has become
linked
, though.
Finally, consider a case involving evaluation errors after a successful call to Link(). If
InnerModuleEvaluation
of
succeeds but, thereafter, fails for
, for example because
contains code that throws an exception, then the original
.Evaluate() will fail, returning a rejected Promise. The resulting exception will be recorded in both
and
's [[EvaluationError]] fields, and their [[Status]] will become
evaluated
will also become
evaluated
but, in contrast to
and
will remain without an [[EvaluationError]], as it successfully
completed evaluation. Storing the exception ensures that any time a
host
tries to reuse
or
by calling their Evaluate() method, it will encounter the same exception. (
Hosts
are not required to reuse
Cyclic Module Records
; similarly,
hosts
are not required to expose the exception objects thrown by these methods. However, the specification enables such uses.)
Now consider a different type of error condition:
Figure 3: A module graph with an unresolvable module
In this scenario, module
declares a dependency on some other module, but no
Module Record
exists for that module, i.e.
HostLoadImportedModule
calls
FinishLoadingImportedModule
with an exception when asked for it. This could occur for a variety of
reasons, such as the corresponding resource not existing, or the
resource existing but
ParseModule
returning some errors when trying to parse the resulting source text.
Hosts
can choose to expose the cause of failure via the completion they pass to
FinishLoadingImportedModule
. In any case, this exception causes a loading failure, which results in
's [[Status]] remaining
new
The difference here between loading, linking and evaluation errors is due to the following characteristic:
Evaluation
must be only performed once, as it can cause side effects; it is thus
important to remember whether evaluation has already been performed,
even if unsuccessfully. (In the error case, it makes sense to also
remember the exception because otherwise subsequent Evaluate() calls
would have to synthesize a new one.)
Linking, on the other hand, is side-effect-free, and thus even if it fails, it can be retried at a later time with no issues.
Loading closely interacts with the
host
and it may be desiderable for some of them to allow users to retry
failed loads (for example, if the failure is caused by temporarily bad
network conditions).
Now, consider a module graph with a cycle:
Figure 4: A cyclic module graph
Here we assume that the entry point is module
, so that the
host
proceeds by calling
.LoadRequestedModules(), which performs
InnerModuleLoading
on
. This in turn calls
InnerModuleLoading
on
and
. Because of the cycle, this again triggers
InnerModuleLoading
on
, but at this point it is a no-op since
's
dependencies loading has already been triggered during this
LoadRequestedModules process. When all the modules in the graph have
been successfully loaded, their [[Status]] transitions from
new
to
unlinked
at the same time.
Then the
host
proceeds by calling
.Link(), which performs
InnerModuleLinking
on
. This in turn calls
InnerModuleLinking
on
. Because of the cycle, this again triggers
InnerModuleLinking
on
, but at this point it is a no-op since
.[[Status]] is already
linking
.[[Status]] itself remains
linking
when control gets back to
and
InnerModuleLinking
is triggered on
. After this returns with
.[[Status]] being
linked
, both
and
transition from
linking
to
linked
together; this is by design, since they form a strongly connected
component. It's possible to transition the status of modules in the same
SCC at the same time because during this phase the module graph is
traversed with a depth-first search.
An analogous story occurs for the evaluation phase of a cyclic module graph, in the success case.
Now consider a case where
has a linking error; for example, it tries to import a binding from
that does not exist. In that case, the above steps still occur, including the early return from the second call to
InnerModuleLinking
on
. However, once we unwind back to the original
InnerModuleLinking
on
, it fails during InitializeEnvironment, namely right after
.ResolveExport(). The thrown
SyntaxError
exception propagates up to
.Link, which resets all modules that are currently on its
stack
(these are always exactly the modules that are still
linking
). Hence both
and
become
unlinked
. Note that
is left as
linked
Alternatively, consider a case where
has an
evaluation error; for example, its source code throws an exception. In
that case, the evaluation-time analog of the above steps still occurs,
including the early return from the second call to
InnerModuleEvaluation
on
. However, once we unwind back to the original
InnerModuleEvaluation
on
, it fails by assumption. The exception thrown propagates up to
.Evaluate(), which records the error in all modules that are currently on its
stack
(i.e., the modules that are still
evaluating
) as well as via [[AsyncParentModules]], which form a chain for modules which contain or depend on top-level
await
through the whole dependency graph through the
AsyncModuleExecutionRejected
algorithm. Hence both
and
become
evaluated
and the exception is recorded in both
and
's [[EvaluationError]] fields, while
is left as
evaluated
with no [[EvaluationError]].
Lastly, consider a module graph with a cycle, where all modules complete asynchronously:
Figure 5: An asynchronous cyclic module graph
Loading and linking happen as before, and all modules end up with [[Status]] set to
linked
Calling
.Evaluate() calls
InnerModuleEvaluation
on
, and
, which all transition to
evaluating
. Then
InnerModuleEvaluation
is called on
again, which is a no-op because it is already
evaluating
. At this point,
.[[PendingAsyncDependencies]] is 0, so
ExecuteAsyncModule
) is called and we call
.ExecuteModule with a new PromiseCapability tracking the asynchronous execution of
. We unwind back to the
InnerModuleEvaluation
on
, setting
.[[PendingAsyncDependencies]] to 1 and
.[[AsyncEvaluation]] to
true
. We unwind back to the original
InnerModuleEvaluation
on
, setting
.[[PendingAsyncDependencies]] to 1. In the next iteration of the loop over
's dependencies, we call
InnerModuleEvaluation
on
and thus on
(again a no-op) and
. As
has no dependencies and is not part of a cycle, we call
ExecuteAsyncModule
) in the same manner as
and
is immediately removed from the stack. We unwind once more to the original
InnerModuleEvaluation
on
, setting
.[[AsyncEvaluation]] to
true
. Now we finish the loop over
's dependencies, set
.[[AsyncEvaluation]] to
true
, and remove the entire strongly connected component from the stack, transitioning all of the modules to
evaluating-async
at once. At this point, the fields of the modules are as given in
Table 45
Table 45: Module fields after the initial Evaluate() call
Module
[[DFSIndex]]
[[DFSAncestorIndex]]
[[Status]]
[[AsyncEvaluation]]
[[AsyncParentModules]]
[[PendingAsyncDependencies]]
evaluating-async
true
« »
2 (
and
evaluating-async
true
1 (
evaluating-async
true
2 (
and
evaluating-async
true
evaluating-async
true
Let us assume that
finishes executing first. When that happens,
AsyncModuleExecutionFulfilled
is called,
.[[Status]] is set to
evaluated
and
.[[PendingAsyncDependencies]] is decremented to become 1. The fields of the updated modules are as given in
Table 46
Table 46: Module fields after module
finishes executing
Module
[[DFSIndex]]
[[DFSAncestorIndex]]
[[Status]]
[[AsyncEvaluation]]
[[AsyncParentModules]]
[[PendingAsyncDependencies]]
evaluating-async
true
1 (
evaluated
true
is next to finish (as it was the only module that was still executing). When that happens,
AsyncModuleExecutionFulfilled
is called again and
.[[Status]] is set to
evaluated
. Then
.[[PendingAsyncDependencies]] is decremented to become 0,
ExecuteAsyncModule
is called on
, and it starts executing.
.[[PendingAsyncDependencies]] is also decremented to become 0, and
starts executing (potentially in parallel to
if
contains an
await
). The fields of the updated modules are as given in
Table 47
Table 47: Module fields after module
finishes executing
Module
[[DFSIndex]]
[[DFSAncestorIndex]]
[[Status]]
[[AsyncEvaluation]]
[[AsyncParentModules]]
[[PendingAsyncDependencies]]
evaluating-async
true
evaluating-async
true
evaluated
true
Let us assume that
finishes executing next. When that happens,
AsyncModuleExecutionFulfilled
is called again,
.[[Status]] is set to
evaluated
and
.[[PendingAsyncDependencies]] is decremented to become 1. The fields of the updated modules are as given in
Table 48
Table 48: Module fields after module
finishes executing
Module
[[DFSIndex]]
[[DFSAncestorIndex]]
[[Status]]
[[AsyncEvaluation]]
[[AsyncParentModules]]
[[PendingAsyncDependencies]]
evaluating-async
true
« »
1 (
evaluated
true
Then,
finishes executing. When that happens,
AsyncModuleExecutionFulfilled
is called again and
.[[Status]] is set to
evaluated
.[[PendingAsyncDependencies]] is decremented to become 0, so
ExecuteAsyncModule
is called and it starts executing. The fields of the updated modules are as given in
Table 49
Table 49: Module fields after module
finishes executing
Module
[[DFSIndex]]
[[DFSAncestorIndex]]
[[Status]]
[[AsyncEvaluation]]
[[AsyncParentModules]]
[[PendingAsyncDependencies]]
evaluating-async
true
« »
evaluated
true
Finally,
finishes executing. When that happens,
AsyncModuleExecutionFulfilled
is called again and
.[[Status]] is set to
evaluated
. At this point, the Promise in
.[[TopLevelCapability]] (which was returned from
.Evaluate())
is resolved, and this concludes the handling of this module graph. The
fields of the updated module are as given in
Table 50
Table 50: Module fields after module
finishes executing
Module
[[DFSIndex]]
[[DFSAncestorIndex]]
[[Status]]
[[AsyncEvaluation]]
[[AsyncParentModules]]
[[PendingAsyncDependencies]]
evaluated
true
« »
Alternatively, consider a failure case where
fails execution and returns an error before
has finished executing. When that happens,
AsyncModuleExecutionRejected
is called, which sets
.[[Status]] to
evaluated
and
.[[EvaluationError]] to the error. It then propagates this error to all of the AsyncParentModules by performing
AsyncModuleExecutionRejected
on each of them. The fields of the updated modules are as given in
Table 51
Table 51: Module fields after module
finishes with an error
Module
[[DFSIndex]]
[[DFSAncestorIndex]]
[[Status]]
[[AsyncEvaluation]]
[[AsyncParentModules]]
[[PendingAsyncDependencies]]
[[EvaluationError]]
evaluated
true
« »
1 (
empty
evaluated
true
's evaluation error
will be rejected with the same error as
since
will call
AsyncModuleExecutionRejected
on
with
's error.
.[[Status]] is set to
evaluated
. At this point the Promise in
.[[TopLevelCapability]] (which was returned from
.Evaluate()) is rejected. The fields of the updated module are as given in
Table 52
Table 52: Module fields after module
is rejected
Module
[[DFSIndex]]
[[DFSAncestorIndex]]
[[Status]]
[[AsyncEvaluation]]
[[AsyncParentModules]]
[[PendingAsyncDependencies]]
[[EvaluationError]]
evaluated
true
« »
's
Evaluation
Error
Then,
finishes executing without an error. When that happens,
AsyncModuleExecutionFulfilled
is called again and
.[[Status]] is set to
evaluated
GatherAvailableAncestors
is called on
. However,
.[[CycleRoot]] is
which has an evaluation error, so it will not be added to the returned
sortedExecList
and
AsyncModuleExecutionFulfilled
will return without further processing. Any future importer of
will resolve the rejection of
.[[CycleRoot]].[[EvaluationError]] from the evaluation error from
that was set on the cycle root
. The fields of the updated modules are as given in
Table 53
Table 53: Module fields after module
finishes executing in an erroring graph
Module
[[DFSIndex]]
[[DFSAncestorIndex]]
[[Status]]
[[AsyncEvaluation]]
[[AsyncParentModules]]
[[PendingAsyncDependencies]]
[[EvaluationError]]
evaluated
true
« »
's
Evaluation
Error
evaluated
true
empty
16.2.1.6
Source Text Module Records
Source Text Module Record
is used to represent information about a module that was defined from
ECMAScript source text
11
) that was parsed using the
goal symbol
Module
Its fields contain digested information about the names that are
imported by the module and its concrete methods use this digest to link,
link, and evaluate the module.
Source Text Module Record
can exist in a module graph with other subclasses of the abstract
Module Record
type, and can participate in cycles with other subclasses of the
Cyclic Module Record
type.
In addition to the fields defined in
Table 42
Source Text Module Records
have the additional fields listed in
Table 54
. Each of these fields is initially set in
ParseModule
Table 54: Additional Fields of
Source Text Module Records
Field Name
Value Type
Meaning
[[ECMAScriptCode]]
Parse Node
The result of parsing the source text of this module using
Module
as the
goal symbol
[[Context]]
an
ECMAScript code execution context
or
empty
The
execution context
associated with this module. It is
empty
until the module's environment has been initialized.
[[ImportMeta]]
an Object or
empty
An object exposed through the
import.meta
meta property. It is
empty
until it is accessed by ECMAScript code.
[[ImportEntries]]
List
of
ImportEntry Records
List
of ImportEntry records derived from the code of this module.
[[LocalExportEntries]]
List
of
ExportEntry Records
List
of ExportEntry records derived from the code of this module that correspond to declarations that occur within the module.
[[IndirectExportEntries]]
List
of
ExportEntry Records
List
of ExportEntry records derived from the code of this module that
correspond to reexported imports that occur within the module or exports
from
export * as namespace
declarations.
[[StarExportEntries]]
List
of
ExportEntry Records
List
of ExportEntry records derived from the code of this module that correspond to
export *
declarations that occur within the module, not including
export * as namespace
declarations.
An
ImportEntry Record
is a
Record
that digests information about a single declarative import. Each
ImportEntry Record
has the fields defined in
Table 55
Table 55:
ImportEntry Record
Fields
Field Name
Value Type
Meaning
[[ModuleRequest]]
a String
String value of the
ModuleSpecifier
of the
ImportDeclaration
[[ImportName]]
a String or
namespace-object
The name under which the desired binding is exported by the module identified by [[ModuleRequest]]. The value
namespace-object
indicates that the import request is for the target module's namespace object.
[[LocalName]]
a String
The name that is used to locally access the imported value from within the importing module.
Note 1
Table 56
gives examples of ImportEntry records fields used to represent the syntactic import forms:
Table 56 (Informative): Import Forms Mappings to
ImportEntry Records
Import Statement Form
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
import v from "mod";
"mod"
"default"
"v"
import * as ns from "mod";
"mod"
namespace-object
"ns"
import {x} from "mod";
"mod"
"x"
"x"
import {x as v} from "mod";
"mod"
"x"
"v"
import "mod";
An
ImportEntry Record
is not created.
An
ExportEntry Record
is a
Record
that digests information about a single declarative export. Each
ExportEntry Record
has the fields defined in
Table 57
Table 57:
ExportEntry Record
Fields
Field Name
Value Type
Meaning
[[ExportName]]
a String or
null
The name used to export this binding by this module.
[[ModuleRequest]]
a String or
null
The String value of the
ModuleSpecifier
of the
ExportDeclaration
null
if the
ExportDeclaration
does not have a
ModuleSpecifier
[[ImportName]]
a String,
null
all
, or
all-but-default
The name under which the desired binding is exported by the module identified by [[ModuleRequest]].
null
if the
ExportDeclaration
does not have a
ModuleSpecifier
all
is used for
export * as ns from "mod"
declarations.
all-but-default
is used for
export * from "mod"
declarations.
[[LocalName]]
a String or
null
The name that is used to locally access the exported value from within the importing module.
null
if the exported value is not locally accessible from within the module.
Note 2
Table 58
gives examples of the ExportEntry record fields used to represent the syntactic export forms:
Table 58 (Informative): Export Forms Mappings to
ExportEntry Records
Export Statement Form
[[ExportName]]
[[ModuleRequest]]
[[ImportName]]
[[LocalName]]
export var v;
"v"
null
null
"v"
export default function f() {}
"default"
null
null
"f"
export default function () {}
"default"
null
null
"*default*"
export default 42;
"default"
null
null
"*default*"
export {x};
"x"
null
null
"x"
export {v as x};
"x"
null
null
"v"
export {x} from "mod";
"x"
"mod"
"x"
null
export {v as x} from "mod";
"x"
"mod"
"v"
null
export * from "mod";
null
"mod"
all-but-default
null
export * as ns from "mod";
"ns"
"mod"
all
null
The following definitions specify the required concrete methods and other
abstract operations
for
Source Text Module Records
16.2.1.6.1
ParseModule (
sourceText
realm
hostDefined
The abstract operation ParseModule takes arguments
sourceText
ECMAScript source text
),
realm
(a
Realm Record
), and
hostDefined
(anything) and returns a
Source Text Module Record
or a non-empty
List
of
SyntaxError
objects. It creates a
Source Text Module Record
based upon the result of parsing
sourceText
as a
Module
. It performs the following steps when called:
1.
Let
body
be
ParseText
sourceText
Module
).
2.
If
body
is a
List
of errors, return
body
3.
Let
requestedModules
be the
ModuleRequests
of
body
4.
Let
importEntries
be
ImportEntries
of
body
5.
Let
importedBoundNames
be
ImportedLocalNames
importEntries
).
6.
Let
indirectExportEntries
be a new empty
List
7.
Let
localExportEntries
be a new empty
List
8.
Let
starExportEntries
be a new empty
List
9.
Let
exportEntries
be
ExportEntries
of
body
10.
For each
ExportEntry Record
ee
of
exportEntries
, do
a.
If
ee
.[[ModuleRequest]] is
null
, then
i.
If
importedBoundNames
does not contain
ee
.[[LocalName]], then
1.
Append
ee
to
localExportEntries
ii.
Else,
1.
Let
ie
be the element of
importEntries
whose [[LocalName]] is
ee
.[[LocalName]].
2.
If
ie
.[[ImportName]] is
namespace-object
, then
a.
NOTE: This is a re-export of an imported module namespace object.
b.
Append
ee
to
localExportEntries
3.
Else,
a.
NOTE: This is a re-export of a single name.
b.
Append the
ExportEntry Record
{ [[ModuleRequest]]:
ie
.[[ModuleRequest]], [[ImportName]]:
ie
.[[ImportName]], [[LocalName]]:
null
, [[ExportName]]:
ee
.[[ExportName]] } to
indirectExportEntries
b.
Else if
ee
.[[ImportName]] is
all-but-default
, then
i.
Assert
ee
.[[ExportName]] is
null
ii.
Append
ee
to
starExportEntries
c.
Else,
i.
Append
ee
to
indirectExportEntries
11.
Let
async
be
body
Contains
await
12.
Return
Source Text Module Record
{ [[Realm]]:
realm
, [[Environment]]:
empty
, [[Namespace]]:
empty
, [[CycleRoot]]:
empty
, [[HasTLA]]:
async
, [[AsyncEvaluation]]:
false
, [[TopLevelCapability]]:
empty
, [[AsyncParentModules]]: « », [[PendingAsyncDependencies]]:
empty
, [[Status]]:
new
, [[EvaluationError]]:
empty
, [[HostDefined]]:
hostDefined
, [[ECMAScriptCode]]:
body
, [[Context]]:
empty
, [[ImportMeta]]:
empty
, [[RequestedModules]]:
requestedModules
, [[LoadedModules]]: « », [[ImportEntries]]:
importEntries
, [[LocalExportEntries]]:
localExportEntries
, [[IndirectExportEntries]]:
indirectExportEntries
, [[StarExportEntries]]:
starExportEntries
, [[DFSIndex]]:
empty
, [[DFSAncestorIndex]]:
empty
}.
Note
An implementation may parse module source text and
analyse it for Early Error conditions prior to the evaluation of
ParseModule for that module source text. However, the reporting of any
errors must be deferred until the point where this specification
actually performs ParseModule upon that source text.
16.2.1.6.2
GetExportedNames ( [
exportStarSet
] )
The GetExportedNames concrete method of a
Source Text Module Record
module
takes optional argument
exportStarSet
(a
List
of
Source Text Module Records
) and returns a
List
of either Strings or
null
. It performs the following steps when called:
1.
Assert
module
.[[Status]] is not
new
2.
If
exportStarSet
is not present, set
exportStarSet
to a new empty
List
3.
If
exportStarSet
contains
module
, then
a.
Assert
: We've reached the starting point of an
export *
circularity.
b.
Return a new empty
List
4.
Append
module
to
exportStarSet
5.
Let
exportedNames
be a new empty
List
6.
For each
ExportEntry Record
of
module
.[[LocalExportEntries]], do
a.
Assert
module
provides the direct binding for this export.
b.
Append
.[[ExportName]] to
exportedNames
7.
For each
ExportEntry Record
of
module
.[[IndirectExportEntries]], do
a.
Assert
module
imports a specific binding for this export.
b.
Append
.[[ExportName]] to
exportedNames
8.
For each
ExportEntry Record
of
module
.[[StarExportEntries]], do
a.
Let
requestedModule
be
GetImportedModule
module
.[[ModuleRequest]]).
b.
Let
starNames
be
requestedModule
.GetExportedNames(
exportStarSet
).
c.
For each element
of
starNames
, do
i.
If
SameValue
"default"
) is
false
, then
1.
If
exportedNames
does not contain
, then
a.
Append
to
exportedNames
9.
Return
exportedNames
Note
GetExportedNames does not filter out or throw an exception for names that have ambiguous star export bindings.
16.2.1.6.3
ResolveExport (
exportName
[ ,
resolveSet
] )
The ResolveExport concrete method of a
Source Text Module Record
module
takes argument
exportName
(a String) and optional argument
resolveSet
(a
List
of
Records
with fields [[Module]] (a
Module Record
) and [[ExportName]] (a String)) and returns a
ResolvedBinding Record
null
, or
ambiguous
ResolveExport attempts to resolve an imported binding
to the actual defining module and local binding name. The defining
module may be the module represented by the
Module Record
this method was invoked on or some other module that is imported by that module. The parameter
resolveSet
is used to detect unresolved circular import/export paths. If a pair consisting of specific
Module Record
and
exportName
is reached that is already in
resolveSet
, an import circularity has been encountered. Before recursively calling ResolveExport, a pair consisting of
module
and
exportName
is added to
resolveSet
If a defining module is found, a
ResolvedBinding Record
{ [[Module]], [[BindingName]] } is returned. This record identifies the
resolved binding of the originally requested export, unless this is the
export of a namespace with no local binding. In this case,
[[BindingName]] will be set to
namespace
. If no definition was found or the request is found to be circular,
null
is returned. If the request is found to be ambiguous,
ambiguous
is returned.
It performs the following steps when called:
1.
Assert
module
.[[Status]] is not
new
2.
If
resolveSet
is not present, set
resolveSet
to a new empty
List
3.
For each
Record
{ [[Module]], [[ExportName]] }
of
resolveSet
, do
a.
If
module
and
.[[Module]] are the same
Module Record
and
SameValue
exportName
.[[ExportName]]) is
true
, then
i.
Assert
: This is a circular import request.
ii.
Return
null
4.
Append the
Record
{ [[Module]]:
module
, [[ExportName]]:
exportName
} to
resolveSet
5.
For each
ExportEntry Record
of
module
.[[LocalExportEntries]], do
a.
If
SameValue
exportName
.[[ExportName]]) is
true
, then
i.
Assert
module
provides the direct binding for this export.
ii.
Return
ResolvedBinding Record
{ [[Module]]:
module
, [[BindingName]]:
.[[LocalName]] }.
6.
For each
ExportEntry Record
of
module
.[[IndirectExportEntries]], do
a.
If
SameValue
exportName
.[[ExportName]]) is
true
, then
i.
Let
importedModule
be
GetImportedModule
module
.[[ModuleRequest]]).
ii.
If
.[[ImportName]] is
all
, then
1.
Assert
module
does not provide the direct binding for this export.
2.
Return
ResolvedBinding Record
{ [[Module]]:
importedModule
, [[BindingName]]:
namespace
}.
iii.
Else,
1.
Assert
module
imports a specific binding for this export.
2.
Return
importedModule
.ResolveExport(
.[[ImportName]],
resolveSet
).
7.
If
SameValue
exportName
"default"
) is
true
, then
a.
Assert
: A
default
export was not explicitly defined by this module.
b.
Return
null
c.
NOTE: A
default
export cannot be provided by an
export * from "mod"
declaration.
8.
Let
starResolution
be
null
9.
For each
ExportEntry Record
of
module
.[[StarExportEntries]], do
a.
Let
importedModule
be
GetImportedModule
module
.[[ModuleRequest]]).
b.
Let
resolution
be
importedModule
.ResolveExport(
exportName
resolveSet
).
c.
If
resolution
is
ambiguous
, return
ambiguous
d.
If
resolution
is not
null
, then
i.
Assert
resolution
is a
ResolvedBinding Record
ii.
If
starResolution
is
null
, set
starResolution
to
resolution
iii.
Else,
1.
Assert
: There is more than one
import that includes the requested name.
2.
If
resolution
.[[Module]] and
starResolution
.[[Module]] are not the same
Module Record
, return
ambiguous
3.
If
resolution
.[[BindingName]] is not
starResolution
.[[BindingName]] and either
resolution
.[[BindingName]] or
starResolution
.[[BindingName]] is
namespace
, return
ambiguous
4.
If
resolution
.[[BindingName]]
is a String
starResolution
.[[BindingName]]
is a String
, and
SameValue
resolution
.[[BindingName]],
starResolution
.[[BindingName]]) is
false
, return
ambiguous
10.
Return
starResolution
16.2.1.6.4
InitializeEnvironment ( )
The InitializeEnvironment concrete method of a
Source Text Module Record
module
takes no arguments and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
For each
ExportEntry Record
of
module
.[[IndirectExportEntries]], do
a.
Let
resolution
be
module
.ResolveExport(
.[[ExportName]]).
b.
If
resolution
is either
null
or
ambiguous
, throw a
SyntaxError
exception.
c.
Assert
resolution
is a
ResolvedBinding Record
2.
Assert
: All named exports from
module
are resolvable.
3.
Let
realm
be
module
.[[Realm]].
4.
Assert
realm
is not
undefined
5.
Let
env
be
NewModuleEnvironment
realm
.[[GlobalEnv]]).
6.
Set
module
.[[Environment]] to
env
7.
For each
ImportEntry Record
in
of
module
.[[ImportEntries]], do
a.
Let
importedModule
be
GetImportedModule
module
in
.[[ModuleRequest]]).
b.
If
in
.[[ImportName]] is
namespace-object
, then
i.
Let
namespace
be
GetModuleNamespace
importedModule
).
ii.
Perform !
env
.CreateImmutableBinding(
in
.[[LocalName]],
true
).
iii.
Perform !
env
.InitializeBinding(
in
.[[LocalName]],
namespace
).
c.
Else,
i.
Let
resolution
be
importedModule
.ResolveExport(
in
.[[ImportName]]).
ii.
If
resolution
is either
null
or
ambiguous
, throw a
SyntaxError
exception.
iii.
If
resolution
.[[BindingName]] is
namespace
, then
1.
Let
namespace
be
GetModuleNamespace
resolution
.[[Module]]).
2.
Perform !
env
.CreateImmutableBinding(
in
.[[LocalName]],
true
).
3.
Perform !
env
.InitializeBinding(
in
.[[LocalName]],
namespace
).
iv.
Else,
1.
Perform
env
.CreateImportBinding(
in
.[[LocalName]],
resolution
.[[Module]],
resolution
.[[BindingName]]).
8.
Let
moduleContext
be a new
ECMAScript code execution context
9.
Set the Function of
moduleContext
to
null
10.
Assert
module
.[[Realm]] is not
undefined
11.
Set the
Realm
of
moduleContext
to
module
.[[Realm]].
12.
Set the ScriptOrModule of
moduleContext
to
module
13.
Set the VariableEnvironment of
moduleContext
to
module
.[[Environment]].
14.
Set the LexicalEnvironment of
moduleContext
to
module
.[[Environment]].
15.
Set the PrivateEnvironment of
moduleContext
to
null
16.
Set
module
.[[Context]] to
moduleContext
17.
Push
moduleContext
onto the
execution context stack
moduleContext
is now the
running execution context
18.
Let
code
be
module
.[[ECMAScriptCode]].
19.
Let
varDeclarations
be the
VarScopedDeclarations
of
code
20.
Let
declaredVarNames
be a new empty
List
21.
For each element
of
varDeclarations
, do
a.
For each element
dn
of the
BoundNames
of
, do
i.
If
declaredVarNames
does not contain
dn
, then
1.
Perform !
env
.CreateMutableBinding(
dn
false
).
2.
Perform !
env
.InitializeBinding(
dn
undefined
).
3.
Append
dn
to
declaredVarNames
22.
Let
lexDeclarations
be the
LexicallyScopedDeclarations
of
code
23.
Let
privateEnv
be
null
24.
For each element
of
lexDeclarations
, do
a.
For each element
dn
of the
BoundNames
of
, do
i.
If
IsConstantDeclaration
of
is
true
, then
1.
Perform !
env
.CreateImmutableBinding(
dn
true
).
ii.
Else,
1.
Perform !
env
.CreateMutableBinding(
dn
false
).
iii.
If
is either a
FunctionDeclaration
, a
GeneratorDeclaration
, an
AsyncFunctionDeclaration
, or an
AsyncGeneratorDeclaration
, then
1.
Let
fo
be
InstantiateFunctionObject
of
with arguments
env
and
privateEnv
2.
Perform !
env
.InitializeBinding(
dn
fo
).
25.
Remove
moduleContext
from the
execution context stack
26.
Return
unused
16.2.1.6.5
ExecuteModule ( [
capability
] )
The ExecuteModule concrete method of a
Source Text Module Record
module
takes optional argument
capability
(a
PromiseCapability Record
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
moduleContext
be a new
ECMAScript code execution context
2.
Set the Function of
moduleContext
to
null
3.
Set the
Realm
of
moduleContext
to
module
.[[Realm]].
4.
Set the ScriptOrModule of
moduleContext
to
module
5.
Assert
module
has been linked and declarations in its module environment have been instantiated.
6.
Set the VariableEnvironment of
moduleContext
to
module
.[[Environment]].
7.
Set the LexicalEnvironment of
moduleContext
to
module
.[[Environment]].
8.
Suspend the
running execution context
9.
If
module
.[[HasTLA]] is
false
, then
a.
Assert
capability
is not present.
b.
Push
moduleContext
onto the
execution context stack
moduleContext
is now the
running execution context
c.
Let
result
be
Completion
Evaluation
of
module
.[[ECMAScriptCode]]).
d.
Suspend
moduleContext
and remove it from the
execution context stack
e.
Resume the context that is now on the top of the
execution context stack
as the
running execution context
f.
If
result
is an
abrupt completion
, then
i.
Return ?
result
10.
Else,
a.
Assert
capability
is a
PromiseCapability Record
b.
Perform
AsyncBlockStart
capability
module
.[[ECMAScriptCode]],
moduleContext
).
11.
Return
unused
16.2.1.7
GetImportedModule (
referrer
specifier
The abstract operation GetImportedModule takes arguments
referrer
(a
Cyclic Module Record
) and
specifier
(a String) and returns a
Module Record
. It performs the following steps when called:
1.
Assert
: Exactly one element of
referrer
.[[LoadedModules]] is a
Record
whose [[Specifier]] is
specifier
, since LoadRequestedModules has completed successfully on
referrer
prior to invoking this abstract operation.
2.
Let
record
be the
Record
in
referrer
.[[LoadedModules]] whose [[Specifier]] is
specifier
3.
Return
record
.[[Module]].
16.2.1.8
HostLoadImportedModule (
referrer
specifier
hostDefined
payload
The
host-defined
abstract operation HostLoadImportedModule takes arguments
referrer
(a
Script Record
, a
Cyclic Module Record
, or a
Realm Record
),
specifier
(a String),
hostDefined
(anything), and
payload
(a
GraphLoadingState Record
or a
PromiseCapability Record
) and returns
unused
Note
An example of when
referrer
can be a
Realm Record
is in a web browser
host
. There, if a user clicks on a control given by
button
type
"button"
onclick
"import('./foo.mjs')"
Click me
button
there will be no
active script or module
at the time the
import()
expression runs. More generally, this can happen in any situation where the
host
pushes
execution contexts
with
null
ScriptOrModule components onto the
execution context stack
An implementation of HostLoadImportedModule must conform to the following requirements:
The
host environment
must perform
FinishLoadingImportedModule
referrer
specifier
payload
result
), where
result
is either a
normal completion containing
the loaded
Module Record
or a
throw completion
, either synchronously or asynchronously.
If this operation is called multiple times with the same (
referrer
specifier
) pair and it performs
FinishLoadingImportedModule
referrer
specifier
payload
result
) where
result
is a
normal completion
, then it must perform
FinishLoadingImportedModule
referrer
specifier
payload
result
) with the same
result
each time.
The operation must treat
payload
as an opaque value to be passed through to
FinishLoadingImportedModule
The actual process performed is
host-defined
, but typically consists of performing whatever I/O operations are necessary to load the appropriate
Module Record
. Multiple different (
referrer
specifier
) pairs may map to the same
Module Record
instance. The actual mapping semantics is
host-defined
but typically a normalization process is applied to
specifier
as part of the mapping process. A typical normalization process would
include actions such as expansion of relative and abbreviated path
specifiers.
16.2.1.9
FinishLoadingImportedModule (
referrer
specifier
payload
result
The abstract operation FinishLoadingImportedModule takes arguments
referrer
(a
Script Record
, a
Cyclic Module Record
, or a
Realm Record
),
specifier
(a String),
payload
(a
GraphLoadingState Record
or a
PromiseCapability Record
), and
result
(either a
normal completion containing
Module Record
or a
throw completion
) and returns
unused
. It performs the following steps when called:
1.
If
result
is a
normal completion
, then
a.
If
referrer
.[[LoadedModules]] contains a
Record
whose [[Specifier]] is
specifier
, then
i.
Assert
: That
Record
's [[Module]] is
result
.[[Value]].
b.
Else, append the
Record
{ [[Specifier]]:
specifier
, [[Module]]:
result
.[[Value]] } to
referrer
.[[LoadedModules]].
2.
If
payload
is a
GraphLoadingState Record
, then
a.
Perform
ContinueModuleLoading
payload
result
).
3.
Else,
a.
Perform
ContinueDynamicImport
payload
result
).
4.
Return
unused
16.2.1.10
GetModuleNamespace (
module
The abstract operation GetModuleNamespace takes argument
module
(an instance of a concrete subclass of
Module Record
) and returns a Module Namespace Object or
empty
. It retrieves the Module Namespace Object representing
module
's exports, lazily creating it the first time it was requested, and storing it in
module
.[[Namespace]] for future retrieval. It performs the following steps when called:
1.
Assert
: If
module
is a
Cyclic Module Record
, then
module
.[[Status]] is not
new
or
unlinked
2.
Let
namespace
be
module
.[[Namespace]].
3.
If
namespace
is
empty
, then
a.
Let
exportedNames
be
module
.GetExportedNames().
b.
Let
unambiguousNames
be a new empty
List
c.
For each element
name
of
exportedNames
, do
i.
Let
resolution
be
module
.ResolveExport(
name
).
ii.
If
resolution
is a
ResolvedBinding Record
, append
name
to
unambiguousNames
d.
Set
namespace
to
ModuleNamespaceCreate
module
unambiguousNames
).
4.
Return
namespace
Note
GetModuleNamespace never throws. Instead, unresolvable
names are simply excluded from the namespace at this point. They will
lead to a real linking error later unless they are all ambiguous star
exports that are not explicitly requested anywhere.
16.2.1.11
Runtime Semantics: Evaluation
Module
[empty]
1.
Return
undefined
ModuleBody
ModuleItemList
1.
Let
result
be
Completion
Evaluation
of
ModuleItemList
).
2.
If
result
.[[Type]] is
normal
and
result
.[[Value]] is
empty
, then
a.
Return
undefined
3.
Return ?
result
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
sl
be ?
Evaluation
of
ModuleItemList
2.
Let
be
Completion
Evaluation
of
ModuleItem
).
3.
Return ?
UpdateEmpty
sl
).
Note
The value of a
ModuleItemList
is the value of the last value-producing item in the
ModuleItemList
ModuleItem
ImportDeclaration
1.
Return
empty
16.2.2
Imports
Syntax
ImportDeclaration
import
ImportClause
FromClause
import
ModuleSpecifier
ImportClause
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding
NameSpaceImport
ImportedDefaultBinding
NamedImports
ImportedDefaultBinding
ImportedBinding
NameSpaceImport
as
ImportedBinding
NamedImports
ImportsList
ImportsList
FromClause
from
ModuleSpecifier
ImportsList
ImportSpecifier
ImportsList
ImportSpecifier
ImportSpecifier
ImportedBinding
ModuleExportName
as
ImportedBinding
ModuleSpecifier
StringLiteral
ImportedBinding
BindingIdentifier
[~Yield, +Await]
16.2.2.1
Static Semantics: Early Errors
ModuleItem
ImportDeclaration
It is a Syntax Error if the
BoundNames
of
ImportDeclaration
contains any duplicate entries.
16.2.2.2
Static Semantics: ImportEntries
The
syntax-directed operation
ImportEntries takes no arguments and returns a
List
of
ImportEntry Records
. It is defined piecewise over the following productions:
Module
[empty]
1.
Return a new empty
List
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
entries1
be
ImportEntries
of
ModuleItemList
2.
Let
entries2
be
ImportEntries
of
ModuleItem
3.
Return the
list-concatenation
of
entries1
and
entries2
ModuleItem
ExportDeclaration
StatementListItem
1.
Return a new empty
List
ImportDeclaration
import
ImportClause
FromClause
1.
Let
module
be the sole element of
ModuleRequests
of
FromClause
2.
Return
ImportEntriesForModule
of
ImportClause
with argument
module
ImportDeclaration
import
ModuleSpecifier
1.
Return a new empty
List
16.2.2.3
Static Semantics: ImportEntriesForModule
The
syntax-directed operation
ImportEntriesForModule takes argument
module
(a String) and returns a
List
of
ImportEntry Records
. It is defined piecewise over the following productions:
ImportClause
ImportedDefaultBinding
NameSpaceImport
1.
Let
entries1
be
ImportEntriesForModule
of
ImportedDefaultBinding
with argument
module
2.
Let
entries2
be
ImportEntriesForModule
of
NameSpaceImport
with argument
module
3.
Return the
list-concatenation
of
entries1
and
entries2
ImportClause
ImportedDefaultBinding
NamedImports
1.
Let
entries1
be
ImportEntriesForModule
of
ImportedDefaultBinding
with argument
module
2.
Let
entries2
be
ImportEntriesForModule
of
NamedImports
with argument
module
3.
Return the
list-concatenation
of
entries1
and
entries2
ImportedDefaultBinding
ImportedBinding
1.
Let
localName
be the sole element of
BoundNames
of
ImportedBinding
2.
Let
defaultEntry
be the
ImportEntry Record
{ [[ModuleRequest]]:
module
, [[ImportName]]:
"default"
, [[LocalName]]:
localName
}.
3.
Return «
defaultEntry
».
NameSpaceImport
as
ImportedBinding
1.
Let
localName
be the
StringValue
of
ImportedBinding
2.
Let
entry
be the
ImportEntry Record
{ [[ModuleRequest]]:
module
, [[ImportName]]:
namespace-object
, [[LocalName]]:
localName
}.
3.
Return «
entry
».
NamedImports
1.
Return a new empty
List
ImportsList
ImportsList
ImportSpecifier
1.
Let
specs1
be the
ImportEntriesForModule
of
ImportsList
with argument
module
2.
Let
specs2
be the
ImportEntriesForModule
of
ImportSpecifier
with argument
module
3.
Return the
list-concatenation
of
specs1
and
specs2
ImportSpecifier
ImportedBinding
1.
Let
localName
be the sole element of
BoundNames
of
ImportedBinding
2.
Let
entry
be the
ImportEntry Record
{ [[ModuleRequest]]:
module
, [[ImportName]]:
localName
, [[LocalName]]:
localName
}.
3.
Return «
entry
».
ImportSpecifier
ModuleExportName
as
ImportedBinding
1.
Let
importName
be the
StringValue
of
ModuleExportName
2.
Let
localName
be the
StringValue
of
ImportedBinding
3.
Let
entry
be the
ImportEntry Record
{ [[ModuleRequest]]:
module
, [[ImportName]]:
importName
, [[LocalName]]:
localName
}.
4.
Return «
entry
».
16.2.3
Exports
Syntax
ExportDeclaration
export
ExportFromClause
FromClause
export
NamedExports
export
VariableStatement
[~Yield, +Await]
export
Declaration
[~Yield, +Await]
export
default
HoistableDeclaration
[~Yield, +Await, +Default]
export
default
ClassDeclaration
[~Yield, +Await, +Default]
export
default
[lookahead ∉ {
function
async
[no
LineTerminator
here]
function
class
}]
AssignmentExpression
[+In, ~Yield, +Await]
ExportFromClause
as
ModuleExportName
NamedExports
NamedExports
ExportsList
ExportsList
ExportsList
ExportSpecifier
ExportsList
ExportSpecifier
ExportSpecifier
ModuleExportName
ModuleExportName
as
ModuleExportName
16.2.3.1
Static Semantics: Early Errors
ExportDeclaration
export
NamedExports
It is a Syntax Error if
ReferencedBindings
of
NamedExports
contains any
StringLiteral
s.
For each
IdentifierName
in
ReferencedBindings
of
NamedExports
: It is a Syntax Error if
StringValue
of
is a
ReservedWord
or the
StringValue
of
is one of
"implements"
"interface"
"let"
"package"
"private"
"protected"
"public"
, or
"static"
Note
The above rule means that each
ReferencedBindings
of
NamedExports
is treated as an
IdentifierReference
16.2.3.2
Static Semantics: ExportedBindings
The
syntax-directed operation
ExportedBindings takes no arguments and returns a
List
of Strings.
Note
ExportedBindings are the locally bound names that are explicitly associated with a
Module
's
ExportedNames
It is defined piecewise over the following productions:
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
names1
be
ExportedBindings
of
ModuleItemList
2.
Let
names2
be
ExportedBindings
of
ModuleItem
3.
Return the
list-concatenation
of
names1
and
names2
ModuleItem
ImportDeclaration
StatementListItem
1.
Return a new empty
List
ExportDeclaration
export
ExportFromClause
FromClause
1.
Return a new empty
List
ExportDeclaration
export
NamedExports
1.
Return the
ExportedBindings
of
NamedExports
ExportDeclaration
export
VariableStatement
1.
Return the
BoundNames
of
VariableStatement
ExportDeclaration
export
Declaration
1.
Return the
BoundNames
of
Declaration
ExportDeclaration
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
1.
Return the
BoundNames
of this
ExportDeclaration
NamedExports
1.
Return a new empty
List
ExportsList
ExportsList
ExportSpecifier
1.
Let
names1
be the
ExportedBindings
of
ExportsList
2.
Let
names2
be the
ExportedBindings
of
ExportSpecifier
3.
Return the
list-concatenation
of
names1
and
names2
ExportSpecifier
ModuleExportName
1.
Return a
List
whose sole element is the
StringValue
of
ModuleExportName
ExportSpecifier
ModuleExportName
as
ModuleExportName
1.
Return a
List
whose sole element is the
StringValue
of the first
ModuleExportName
16.2.3.3
Static Semantics: ExportedNames
The
syntax-directed operation
ExportedNames takes no arguments and returns a
List
of Strings.
Note
ExportedNames are the externally visible names that a
Module
explicitly maps to one of its local name bindings.
It is defined piecewise over the following productions:
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
names1
be
ExportedNames
of
ModuleItemList
2.
Let
names2
be
ExportedNames
of
ModuleItem
3.
Return the
list-concatenation
of
names1
and
names2
ModuleItem
ExportDeclaration
1.
Return the
ExportedNames
of
ExportDeclaration
ModuleItem
ImportDeclaration
StatementListItem
1.
Return a new empty
List
ExportDeclaration
export
ExportFromClause
FromClause
1.
Return the
ExportedNames
of
ExportFromClause
ExportFromClause
1.
Return a new empty
List
ExportFromClause
as
ModuleExportName
1.
Return a
List
whose sole element is the
StringValue
of
ModuleExportName
ExportFromClause
NamedExports
1.
Return the
ExportedNames
of
NamedExports
ExportDeclaration
export
VariableStatement
1.
Return the
BoundNames
of
VariableStatement
ExportDeclaration
export
Declaration
1.
Return the
BoundNames
of
Declaration
ExportDeclaration
export
default
HoistableDeclaration
export
default
ClassDeclaration
export
default
AssignmentExpression
1.
Return «
"default"
».
NamedExports
1.
Return a new empty
List
ExportsList
ExportsList
ExportSpecifier
1.
Let
names1
be the
ExportedNames
of
ExportsList
2.
Let
names2
be the
ExportedNames
of
ExportSpecifier
3.
Return the
list-concatenation
of
names1
and
names2
ExportSpecifier
ModuleExportName
1.
Return a
List
whose sole element is the
StringValue
of
ModuleExportName
ExportSpecifier
ModuleExportName
as
ModuleExportName
1.
Return a
List
whose sole element is the
StringValue
of the second
ModuleExportName
16.2.3.4
Static Semantics: ExportEntries
The
syntax-directed operation
ExportEntries takes no arguments and returns a
List
of
ExportEntry Records
. It is defined piecewise over the following productions:
Module
[empty]
1.
Return a new empty
List
ModuleItemList
ModuleItemList
ModuleItem
1.
Let
entries1
be
ExportEntries
of
ModuleItemList
2.
Let
entries2
be
ExportEntries
of
ModuleItem
3.
Return the
list-concatenation
of
entries1
and
entries2
ModuleItem
ImportDeclaration
StatementListItem
1.
Return a new empty
List
ExportDeclaration
export
ExportFromClause
FromClause
1.
Let
module
be the sole element of
ModuleRequests
of
FromClause
2.
Return
ExportEntriesForModule
of
ExportFromClause
with argument
module
ExportDeclaration
export
NamedExports
1.
Return
ExportEntriesForModule
of
NamedExports
with argument
null
ExportDeclaration
export
VariableStatement
1.
Let
entries
be a new empty
List
2.
Let
names
be the
BoundNames
of
VariableStatement
3.
For each element
name
of
names
, do
a.
Append the
ExportEntry Record
{ [[ModuleRequest]]:
null
, [[ImportName]]:
null
, [[LocalName]]:
name
, [[ExportName]]:
name
} to
entries
4.
Return
entries
ExportDeclaration
export
Declaration
1.
Let
entries
be a new empty
List
2.
Let
names
be the
BoundNames
of
Declaration
3.
For each element
name
of
names
, do
a.
Append the
ExportEntry Record
{ [[ModuleRequest]]:
null
, [[ImportName]]:
null
, [[LocalName]]:
name
, [[ExportName]]:
name
} to
entries
4.
Return
entries
ExportDeclaration
export
default
HoistableDeclaration
1.
Let
names
be
BoundNames
of
HoistableDeclaration
2.
Let
localName
be the sole element of
names
3.
Return a
List
whose sole element is a new
ExportEntry Record
{ [[ModuleRequest]]:
null
, [[ImportName]]:
null
, [[LocalName]]:
localName
, [[ExportName]]:
"default"
}.
ExportDeclaration
export
default
ClassDeclaration
1.
Let
names
be
BoundNames
of
ClassDeclaration
2.
Let
localName
be the sole element of
names
3.
Return a
List
whose sole element is a new
ExportEntry Record
{ [[ModuleRequest]]:
null
, [[ImportName]]:
null
, [[LocalName]]:
localName
, [[ExportName]]:
"default"
}.
ExportDeclaration
export
default
AssignmentExpression
1.
Let
entry
be the
ExportEntry Record
{ [[ModuleRequest]]:
null
, [[ImportName]]:
null
, [[LocalName]]:
"*default*"
, [[ExportName]]:
"default"
}.
2.
Return «
entry
».
Note
"*default*"
is used within this specification as a synthetic name for anonymous default export values. See
this note
for more details.
16.2.3.5
Static Semantics: ExportEntriesForModule
The
syntax-directed operation
ExportEntriesForModule takes argument
module
(a String or
null
) and returns a
List
of
ExportEntry Records
. It is defined piecewise over the following productions:
ExportFromClause
1.
Let
entry
be the
ExportEntry Record
{ [[ModuleRequest]]:
module
, [[ImportName]]:
all-but-default
, [[LocalName]]:
null
, [[ExportName]]:
null
}.
2.
Return «
entry
».
ExportFromClause
as
ModuleExportName
1.
Let
exportName
be the
StringValue
of
ModuleExportName
2.
Let
entry
be the
ExportEntry Record
{ [[ModuleRequest]]:
module
, [[ImportName]]:
all
, [[LocalName]]:
null
, [[ExportName]]:
exportName
}.
3.
Return «
entry
».
NamedExports
1.
Return a new empty
List
ExportsList
ExportsList
ExportSpecifier
1.
Let
specs1
be the
ExportEntriesForModule
of
ExportsList
with argument
module
2.
Let
specs2
be the
ExportEntriesForModule
of
ExportSpecifier
with argument
module
3.
Return the
list-concatenation
of
specs1
and
specs2
ExportSpecifier
ModuleExportName
1.
Let
sourceName
be the
StringValue
of
ModuleExportName
2.
If
module
is
null
, then
a.
Let
localName
be
sourceName
b.
Let
importName
be
null
3.
Else,
a.
Let
localName
be
null
b.
Let
importName
be
sourceName
4.
Return a
List
whose sole element is a new
ExportEntry Record
{ [[ModuleRequest]]:
module
, [[ImportName]]:
importName
, [[LocalName]]:
localName
, [[ExportName]]:
sourceName
}.
ExportSpecifier
ModuleExportName
as
ModuleExportName
1.
Let
sourceName
be the
StringValue
of the first
ModuleExportName
2.
Let
exportName
be the
StringValue
of the second
ModuleExportName
3.
If
module
is
null
, then
a.
Let
localName
be
sourceName
b.
Let
importName
be
null
4.
Else,
a.
Let
localName
be
null
b.
Let
importName
be
sourceName
5.
Return a
List
whose sole element is a new
ExportEntry Record
{ [[ModuleRequest]]:
module
, [[ImportName]]:
importName
, [[LocalName]]:
localName
, [[ExportName]]:
exportName
}.
16.2.3.6
Static Semantics: ReferencedBindings
The
syntax-directed operation
ReferencedBindings takes no arguments and returns a
List
of
Parse Nodes
. It is defined piecewise over the following productions:
NamedExports
1.
Return a new empty
List
ExportsList
ExportsList
ExportSpecifier
1.
Let
names1
be the
ReferencedBindings
of
ExportsList
2.
Let
names2
be the
ReferencedBindings
of
ExportSpecifier
3.
Return the
list-concatenation
of
names1
and
names2
ExportSpecifier
ModuleExportName
as
ModuleExportName
1.
Return the
ReferencedBindings
of the first
ModuleExportName
ModuleExportName
IdentifierName
1.
Return a
List
whose sole element is the
IdentifierName
ModuleExportName
StringLiteral
1.
Return a
List
whose sole element is the
StringLiteral
16.2.3.7
Runtime Semantics: Evaluation
ExportDeclaration
export
ExportFromClause
FromClause
export
NamedExports
1.
Return
empty
ExportDeclaration
export
VariableStatement
1.
Return ?
Evaluation
of
VariableStatement
ExportDeclaration
export
Declaration
1.
Return ?
Evaluation
of
Declaration
ExportDeclaration
export
default
HoistableDeclaration
1.
Return ?
Evaluation
of
HoistableDeclaration
ExportDeclaration
export
default
ClassDeclaration
1.
Let
value
be ?
BindingClassDeclarationEvaluation
of
ClassDeclaration
2.
Let
className
be the sole element of
BoundNames
of
ClassDeclaration
3.
If
className
is
"*default*"
, then
a.
Let
env
be the
running execution context
's LexicalEnvironment.
b.
Perform ?
InitializeBoundName
"*default*"
value
env
).
4.
Return
empty
ExportDeclaration
export
default
AssignmentExpression
1.
If
IsAnonymousFunctionDefinition
AssignmentExpression
) is
true
, then
a.
Let
value
be ?
NamedEvaluation
of
AssignmentExpression
with argument
"default"
2.
Else,
a.
Let
rhs
be ?
Evaluation
of
AssignmentExpression
b.
Let
value
be ?
GetValue
rhs
).
3.
Let
env
be the
running execution context
's LexicalEnvironment.
4.
Perform ?
InitializeBoundName
"*default*"
value
env
).
5.
Return
empty
17
Error Handling and Language Extensions
An implementation must report most errors at the time the relevant ECMAScript language construct is evaluated. An
early error
is an error that can be detected and reported prior to the evaluation of any construct in the
Script
containing the error. The presence of an
early error
prevents the evaluation of the construct. An implementation must report
early errors
in a
Script
as part of parsing that
Script
in
ParseScript
Early errors
in a
Module
are reported at the point when the
Module
would be evaluated and the
Module
is never initialized.
Early errors
in
eval
code are reported at the time
eval
is called and prevent evaluation of the
eval
code. All errors that are not
early errors
are runtime errors.
An implementation must report as an
early error
any occurrence of a condition that is listed in a “Static Semantics: Early Errors” subclause of this specification.
An implementation shall not treat other kinds of errors as
early errors
even if the compiler can prove that a construct cannot execute without
error under any circumstances. An implementation may issue an early
warning in such a case, but it should not report the error until the
relevant construct is actually executed.
An implementation shall report all errors as specified, except for the following:
Except as restricted in
17.1
, a
host
or implementation may extend
Script
syntax,
Module
syntax, and regular expression pattern or flag syntax. To permit this, all operations (such as calling
eval
, using a regular expression literal, or using the Function or RegExp
constructor
) that are allowed to throw
SyntaxError
are permitted to exhibit
host-defined
behaviour instead of throwing
SyntaxError
when they encounter a
host-defined
extension to the script syntax or regular expression pattern or flag syntax.
Except as restricted in
17.1
, a
host
or implementation may provide additional types, values, objects,
properties, and functions beyond those described in this specification.
This may cause constructs (such as looking up a variable in the global
scope) to have
host-defined
behaviour instead of throwing an error (such as
ReferenceError
).
17.1
Forbidden Extensions
An implementation must not extend this specification in the following ways:
ECMAScript
function objects
defined using syntactic
constructors
in
strict mode code
must not be created with own properties named
"caller"
or
"arguments"
. Such own properties also must not be created for
function objects
defined using an
ArrowFunction
MethodDefinition
GeneratorDeclaration
GeneratorExpression
AsyncGeneratorDeclaration
AsyncGeneratorExpression
ClassDeclaration
ClassExpression
AsyncFunctionDeclaration
AsyncFunctionExpression
, or
AsyncArrowFunction
regardless of whether the definition is contained in
strict mode code
. Built-in functions,
strict functions
created using the Function
constructor
, generator functions created using the Generator
constructor
, async functions created using the AsyncFunction
constructor
, and functions created using the
bind
method also must not be created with such own properties.
If an implementation extends any
function object
with an own property named
"caller"
the value of that property, as observed using [[Get]] or [[GetOwnProperty]], must not be a
strict function
object. If it is an
accessor property
, the function that is the value of the property's [[Get]] attribute must never return a
strict function
when called.
Neither mapped nor unmapped arguments objects may be created with an own property named
"caller"
The behaviour of built-in methods which are specified in ECMA-402, such as those named
toLocaleString
, must not be extended except as specified in ECMA-402.
The RegExp pattern grammars in
22.2.1
and
B.1.2
must not be extended to recognize any of the source characters A-Z or a-z as
IdentityEscape
[+UnicodeMode]
when the
[UnicodeMode]
grammar parameter is present.
The Syntactic Grammar must not be extended in any manner that allows the token
to immediately follow source text that is matched by the
BindingIdentifier
nonterminal symbol.
When processing
strict mode code
, an implementation must not relax the
early error
rules of
12.9.3.1
TemplateEscapeSequence
must not be extended to include
LegacyOctalEscapeSequence
or
NonOctalDecimalEscapeSequence
as defined in
12.9.4
When processing
strict mode code
, the extensions defined in
B.3.1
B.3.2
B.3.3
, and
B.3.5
must not be supported.
When parsing for the
Module
goal symbol
, the lexical grammar extensions defined in
B.1.1
must not be supported.
ImportCall
must not be extended.
18
ECMAScript Standard Built-in Objects
There are certain built-in objects available whenever an ECMAScript
Script
or
Module
begins execution. One, the
global object
, is part of the global environment of the executing program. Others are accessible as initial properties of the
global object
or indirectly as properties of accessible built-in objects.
Unless specified otherwise, a built-in object that is callable as a function is a built-in
function object
with the characteristics described in
10.3
. Unless specified otherwise, the [[Extensible]] internal slot of a built-in object initially has the value
true
. Every built-in
function object
has a [[Realm]] internal slot whose value is the
Realm Record
of the
realm
for which the object was initially created.
Many built-in objects are functions: they can be invoked with arguments. Some of them furthermore are
constructors
: they are functions intended for use with the
new
operator. For each built-in function, this specification describes the
arguments required by that function and the properties of that
function object
. For each built-in
constructor
, this specification furthermore describes properties of the prototype object of that
constructor
and properties of specific object instances returned by a
new
expression that invokes that
constructor
Unless otherwise specified in the description of a particular function, if a built-in function or
constructor
is given fewer arguments than the function is specified to require, the function or
constructor
shall behave exactly as if it had been given sufficient additional arguments, each such argument being the
undefined
value. Such missing arguments are considered to be “not present” and
may be identified in that manner by specification algorithms. In the
description of a particular function, the terms “
this
value” and “NewTarget” have the meanings given in
10.3
Unless otherwise specified in the description of a particular function, if a built-in function or
constructor
described is given more arguments than the function is specified to
allow, the extra arguments are evaluated by the call and then ignored by
the function. However, an implementation may define implementation
specific behaviour relating to such arguments as long as the behaviour
is not the throwing of a
TypeError
exception that is predicated simply on the presence of an extra argument.
Note 1
Implementations that add additional capabilities to the set of
built-in functions are encouraged to do so by adding new functions
rather than adding new parameters to existing functions.
Unless otherwise specified every built-in function and every built-in
constructor
has the
Function prototype object
, which is the initial value of the expression
Function.prototype
20.2.3
), as the value of its [[Prototype]] internal slot.
Unless otherwise specified every built-in prototype object has the
Object prototype object
, which is the initial value of the expression
Object.prototype
20.1.3
), as the value of its [[Prototype]] internal slot, except the
Object prototype object
itself.
Built-in
function objects
that are not identified as
constructors
do not implement the [[Construct]] internal method unless otherwise specified in the description of a particular function.
Each built-in function defined in this specification is created by calling the
CreateBuiltinFunction
abstract operation (
10.3.3
). The values of the
length
and
name
parameters are the initial values of the
"length"
and
"name"
properties as discussed below. The values of the
prefix
parameter are similarly discussed below.
Every built-in
function object
, including
constructors
, has a
"length"
property whose value is a non-negative
integral Number
Unless otherwise specified, this value is the number of required
parameters shown in the subclause heading for the function description.
Optional parameters and rest parameters are not included in the
parameter count.
Note 2
For example, the
function object
that is the initial value of the
"map"
property of the
Array prototype object
is described under the subclause heading «Array.prototype.map
(callbackFn [ , thisArg])» which shows the two named arguments
callbackFn and thisArg, the latter being optional; therefore the value
of the
"length"
property of that
function object
is
Unless otherwise specified, the
"length"
property of a built-in
function object
has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
Every built-in
function object
, including
constructors
, has a
"name"
property whose value
is a String
Unless otherwise specified, this value is the name that is given to the
function in this specification. Functions that are identified as
anonymous functions use the empty String as the value of the
"name"
property. For functions that are specified as properties of objects, the name value is the
property name
string used to access the function. Functions that are specified as get or set accessor functions of built-in properties have
"get"
or
"set"
(respectively) passed to the
prefix
parameter when calling
CreateBuiltinFunction
The value of the
"name"
property is explicitly specified for each built-in functions whose
property key
is a Symbol
value. If such an explicitly specified value starts with the prefix
"get "
or
"set "
and the function for which it is specified is a get or set accessor
function of a built-in property, the value without the prefix is passed
to the
name
parameter, and the value
"get"
or
"set"
(respectively) is passed to the
prefix
parameter when calling
CreateBuiltinFunction
Unless otherwise specified, the
"name"
property of a built-in
function object
has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
Every other
data property
described in clauses
19
through
28
and in Annex
B.2
has the attributes { [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
true
} unless otherwise specified.
Every
accessor property
described in clauses
19
through
28
and in Annex
B.2
has the attributes { [[Enumerable]]:
false
, [[Configurable]]:
true
} unless otherwise specified. If only a get accessor function is described, the set accessor function is the default value,
undefined
. If only a set accessor is described the get accessor is the default value,
undefined
19
The Global Object
The
global object
is created before control enters any
execution context
does not have a [[Construct]] internal method; it cannot be used as a
constructor
with the
new
operator.
does not have a [[Call]] internal method; it cannot be invoked as a function.
has a [[Prototype]] internal slot whose value is
host-defined
may have
host-defined
properties in addition to the properties defined in this specification.
This may include a property whose value is the global object itself.
19.1
Value Properties of the Global Object
19.1.1
globalThis
The initial value of the
"globalThis"
property of the
global object
in a
Realm Record
realm
is
realm
.[[GlobalEnv]].[[GlobalThisValue]].
This property has the attributes { [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
19.1.2
Infinity
The value of
Infinity
is
+∞
(see
6.1.6.1
). This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
19.1.3
NaN
The value of
NaN
is
NaN
(see
6.1.6.1
). This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
19.1.4
undefined
The value of
undefined
is
undefined
(see
6.1.1
). This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
19.2
Function Properties of the Global Object
19.2.1
eval (
This function is the
%eval%
intrinsic object.
It performs the following steps when called:
1.
Return ?
PerformEval
false
false
).
19.2.1.1
PerformEval (
strictCaller
direct
The abstract operation PerformEval takes arguments
(an
ECMAScript language value
),
strictCaller
(a Boolean), and
direct
(a Boolean) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Assert
: If
direct
is
false
, then
strictCaller
is also
false
2.
If
is not a String
, return
3.
Let
evalRealm
be
the current Realm Record
4.
NOTE: In the case of a
direct eval
evalRealm
is the
realm
of both the caller of
eval
and of the
eval
function itself.
5.
Perform ?
HostEnsureCanCompileStrings
evalRealm
).
6.
Let
inFunction
be
false
7.
Let
inMethod
be
false
8.
Let
inDerivedConstructor
be
false
9.
Let
inClassFieldInitializer
be
false
10.
If
direct
is
true
, then
a.
Let
thisEnvRec
be
GetThisEnvironment
().
b.
If
thisEnvRec
is a
Function Environment Record
, then
i.
Let
be
thisEnvRec
.[[FunctionObject]].
ii.
Set
inFunction
to
true
iii.
Set
inMethod
to
thisEnvRec
.HasSuperBinding().
iv.
If
.[[ConstructorKind]] is
derived
, set
inDerivedConstructor
to
true
v.
Let
classFieldInitializerName
be
.[[ClassFieldInitializerName]].
vi.
If
classFieldInitializerName
is not
empty
, set
inClassFieldInitializer
to
true
11.
Perform the following substeps in an
implementation-defined
order, possibly interleaving parsing and error detection:
a.
Let
script
be
ParseText
StringToCodePoints
),
Script
).
b.
If
script
is a
List
of errors, throw a
SyntaxError
exception.
c.
If
script
Contains
ScriptBody
is
false
, return
undefined
d.
Let
body
be the
ScriptBody
of
script
e.
If
inFunction
is
false
and
body
Contains
NewTarget
, throw a
SyntaxError
exception.
f.
If
inMethod
is
false
and
body
Contains
SuperProperty
, throw a
SyntaxError
exception.
g.
If
inDerivedConstructor
is
false
and
body
Contains
SuperCall
, throw a
SyntaxError
exception.
h.
If
inClassFieldInitializer
is
true
and
ContainsArguments
of
body
is
true
, throw a
SyntaxError
exception.
12.
If
strictCaller
is
true
, let
strictEval
be
true
13.
Else, let
strictEval
be
IsStrict
of
script
14.
Let
runningContext
be the
running execution context
15.
NOTE: If
direct
is
true
runningContext
will be the
execution context
that performed the
direct eval
. If
direct
is
false
runningContext
will be the
execution context
for the invocation of the
eval
function.
16.
If
direct
is
true
, then
a.
Let
lexEnv
be
NewDeclarativeEnvironment
runningContext
's LexicalEnvironment).
b.
Let
varEnv
be
runningContext
's VariableEnvironment.
c.
Let
privateEnv
be
runningContext
's PrivateEnvironment.
17.
Else,
a.
Let
lexEnv
be
NewDeclarativeEnvironment
evalRealm
.[[GlobalEnv]]).
b.
Let
varEnv
be
evalRealm
.[[GlobalEnv]].
c.
Let
privateEnv
be
null
18.
If
strictEval
is
true
, set
varEnv
to
lexEnv
19.
If
runningContext
is not already suspended, suspend
runningContext
20.
Let
evalContext
be a new
ECMAScript code execution context
21.
Set
evalContext
's Function to
null
22.
Set
evalContext
's
Realm
to
evalRealm
23.
Set
evalContext
's ScriptOrModule to
runningContext
's ScriptOrModule.
24.
Set
evalContext
's VariableEnvironment to
varEnv
25.
Set
evalContext
's LexicalEnvironment to
lexEnv
26.
Set
evalContext
's PrivateEnvironment to
privateEnv
27.
Push
evalContext
onto the
execution context stack
evalContext
is now the
running execution context
28.
Let
result
be
Completion
EvalDeclarationInstantiation
body
varEnv
lexEnv
privateEnv
strictEval
)).
29.
If
result
.[[Type]] is
normal
, then
a.
Set
result
to
Completion
Evaluation
of
body
).
30.
If
result
.[[Type]] is
normal
and
result
.[[Value]] is
empty
, then
a.
Set
result
to
NormalCompletion
undefined
).
31.
Suspend
evalContext
and remove it from the
execution context stack
32.
Resume the context that is now on the top of the
execution context stack
as the
running execution context
33.
Return ?
result
Note
The eval code cannot instantiate variable or function
bindings in the variable environment of the calling context that invoked
the eval if either the code of the calling context or the eval code is
strict mode code
Instead such bindings are instantiated in a new VariableEnvironment
that is only accessible to the eval code. Bindings introduced by
let
const
, or
class
declarations are always instantiated in a new LexicalEnvironment.
19.2.1.2
HostEnsureCanCompileStrings (
calleeRealm
The
host-defined
abstract operation HostEnsureCanCompileStrings takes argument
calleeRealm
(a
Realm Record
) and returns either a
normal completion containing
unused
or a
throw completion
. It allows
host environments
to block certain ECMAScript functions which allow developers to interpret and evaluate strings as ECMAScript code.
An implementation of HostEnsureCanCompileStrings must conform to the following requirements:
If the returned
Completion Record
is a
normal completion
, it must be a
normal completion containing
unused
The default implementation of HostEnsureCanCompileStrings is to return
NormalCompletion
unused
).
19.2.1.3
EvalDeclarationInstantiation (
body
varEnv
lexEnv
privateEnv
strict
The abstract operation EvalDeclarationInstantiation takes arguments
body
(a
ScriptBody
Parse Node
),
varEnv
(an
Environment Record
),
lexEnv
(a
Declarative Environment Record
),
privateEnv
(a
PrivateEnvironment Record
or
null
), and
strict
(a Boolean) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
varNames
be the
VarDeclaredNames
of
body
2.
Let
varDeclarations
be the
VarScopedDeclarations
of
body
3.
If
strict
is
false
, then
a.
If
varEnv
is a
Global Environment Record
, then
i.
For each element
name
of
varNames
, do
1.
If
varEnv
.HasLexicalDeclaration(
name
) is
true
, throw a
SyntaxError
exception.
2.
NOTE:
eval
will not create a global var declaration that would be shadowed by a global lexical declaration.
b.
Let
thisEnv
be
lexEnv
c.
Assert
: The following loop will terminate.
d.
Repeat, while
thisEnv
is not
varEnv
i.
If
thisEnv
is not an Object
Environment Record
, then
1.
NOTE:
The environment of with statements cannot contain any lexical
declaration so it doesn't need to be checked for var/let hoisting
conflicts.
2.
For each element
name
of
varNames
, do
a.
If !
thisEnv
.HasBinding(
name
) is
true
, then
i.
Throw a
SyntaxError
exception.
ii.
NOTE: Annex
B.3.4
defines alternate semantics for the above step.
b.
NOTE: A
direct eval
will not hoist var declaration over a like-named lexical declaration.
ii.
Set
thisEnv
to
thisEnv
.[[OuterEnv]].
4.
Let
privateIdentifiers
be a new empty
List
5.
Let
pointer
be
privateEnv
6.
Repeat, while
pointer
is not
null
a.
For each
Private Name
binding
of
pointer
.[[Names]], do
i.
If
privateIdentifiers
does not contain
binding
.[[Description]], append
binding
.[[Description]] to
privateIdentifiers
b.
Set
pointer
to
pointer
.[[OuterPrivateEnvironment]].
7.
If
AllPrivateIdentifiersValid
of
body
with argument
privateIdentifiers
is
false
, throw a
SyntaxError
exception.
8.
Let
functionsToInitialize
be a new empty
List
9.
Let
declaredFunctionNames
be a new empty
List
10.
For each element
of
varDeclarations
, in reverse
List
order, do
a.
If
is not either a
VariableDeclaration
, a
ForBinding
, or a
BindingIdentifier
, then
i.
Assert
is either a
FunctionDeclaration
, a
GeneratorDeclaration
, an
AsyncFunctionDeclaration
, or an
AsyncGeneratorDeclaration
ii.
NOTE: If there are multiple function declarations for the same name, the last declaration is used.
iii.
Let
fn
be the sole element of the
BoundNames
of
iv.
If
declaredFunctionNames
does not contain
fn
, then
1.
If
varEnv
is a
Global Environment Record
, then
a.
Let
fnDefinable
be ?
varEnv
.CanDeclareGlobalFunction(
fn
).
b.
If
fnDefinable
is
false
, throw a
TypeError
exception.
2.
Append
fn
to
declaredFunctionNames
3.
Insert
as the first element of
functionsToInitialize
11.
NOTE: Annex
B.3.2.3
adds additional steps at this point.
12.
Let
declaredVarNames
be a new empty
List
13.
For each element
of
varDeclarations
, do
a.
If
is either a
VariableDeclaration
, a
ForBinding
, or a
BindingIdentifier
, then
i.
For each String
vn
of the
BoundNames
of
, do
1.
If
declaredFunctionNames
does not contain
vn
, then
a.
If
varEnv
is a
Global Environment Record
, then
i.
Let
vnDefinable
be ?
varEnv
.CanDeclareGlobalVar(
vn
).
ii.
If
vnDefinable
is
false
, throw a
TypeError
exception.
b.
If
declaredVarNames
does not contain
vn
, then
i.
Append
vn
to
declaredVarNames
14.
NOTE: No abnormal terminations occur after this algorithm step unless
varEnv
is a
Global Environment Record
and the
global object
is a
Proxy exotic object
15.
Let
lexDeclarations
be the
LexicallyScopedDeclarations
of
body
16.
For each element
of
lexDeclarations
, do
a.
NOTE: Lexically declared names are only instantiated here but not initialized.
b.
For each element
dn
of the
BoundNames
of
, do
i.
If
IsConstantDeclaration
of
is
true
, then
1.
Perform ?
lexEnv
.CreateImmutableBinding(
dn
true
).
ii.
Else,
1.
Perform ?
lexEnv
.CreateMutableBinding(
dn
false
).
17.
For each
Parse Node
of
functionsToInitialize
, do
a.
Let
fn
be the sole element of the
BoundNames
of
b.
Let
fo
be
InstantiateFunctionObject
of
with arguments
lexEnv
and
privateEnv
c.
If
varEnv
is a
Global Environment Record
, then
i.
Perform ?
varEnv
.CreateGlobalFunctionBinding(
fn
fo
true
).
d.
Else,
i.
Let
bindingExists
be !
varEnv
.HasBinding(
fn
).
ii.
If
bindingExists
is
false
, then
1.
NOTE: The following invocation cannot return an
abrupt completion
because of the validation preceding step
14
2.
Perform !
varEnv
.CreateMutableBinding(
fn
true
).
3.
Perform !
varEnv
.InitializeBinding(
fn
fo
).
iii.
Else,
1.
Perform !
varEnv
.SetMutableBinding(
fn
fo
false
).
18.
For each String
vn
of
declaredVarNames
, do
a.
If
varEnv
is a
Global Environment Record
, then
i.
Perform ?
varEnv
.CreateGlobalVarBinding(
vn
true
).
b.
Else,
i.
Let
bindingExists
be !
varEnv
.HasBinding(
vn
).
ii.
If
bindingExists
is
false
, then
1.
NOTE: The following invocation cannot return an
abrupt completion
because of the validation preceding step
14
2.
Perform !
varEnv
.CreateMutableBinding(
vn
true
).
3.
Perform !
varEnv
.InitializeBinding(
vn
undefined
).
19.
Return
unused
Note
An alternative version of this algorithm is described in
B.3.4
19.2.2
isFinite (
number
This function is the
%isFinite%
intrinsic object.
It performs the following steps when called:
1.
Let
num
be ?
ToNumber
number
).
2.
If
num
is not
finite
, return
false
3.
Otherwise, return
true
19.2.3
isNaN (
number
This function is the
%isNaN%
intrinsic object.
It performs the following steps when called:
1.
Let
num
be ?
ToNumber
number
).
2.
If
num
is
NaN
, return
true
3.
Otherwise, return
false
Note
A reliable way for ECMAScript code to test if a value
is
NaN
is an expression of the form
X !== X
. The result will be
true
if and only if
is
NaN
19.2.4
parseFloat (
string
This function produces a Number value dictated by interpretation of the contents of the
string
argument as a decimal literal.
It is the
%parseFloat%
intrinsic object.
It performs the following steps when called:
1.
Let
inputString
be ?
ToString
string
).
2.
Let
trimmedString
be !
TrimString
inputString
start
).
3.
Let
trimmed
be
StringToCodePoints
trimmedString
).
4.
Let
trimmedPrefix
be the longest prefix of
trimmed
that satisfies the syntax of a
StrDecimalLiteral
, which might be
trimmed
itself. If there is no such prefix, return
NaN
5.
Let
parsedNumber
be
ParseText
trimmedPrefix
StrDecimalLiteral
).
6.
Assert
parsedNumber
is a
Parse Node
7.
Return
StringNumericValue
of
parsedNumber
Note
This function may interpret only a leading portion of
string
as a Number value; it ignores any code units that cannot be interpreted
as part of the notation of a decimal literal, and no indication is
given that any such code units were ignored.
19.2.5
parseInt (
string
radix
This function produces an
integral Number
dictated by interpretation of the contents of
string
according to the specified
radix
. Leading white space in
string
is ignored. If
radix
coerces to 0 (such as when it is
undefined
), it is assumed to be 10 except when the number representation begins with
"0x"
or
"0X"
, in which case it is assumed to be 16. If
radix
is 16, the number representation may optionally begin with
"0x"
or
"0X"
It is the
%parseInt%
intrinsic object.
It performs the following steps when called:
1.
Let
inputString
be ?
ToString
string
).
2.
Let
be !
TrimString
inputString
start
).
3.
Let
sign
be 1.
4.
If
is not empty and the first code unit of
is the code unit 0x002D (HYPHEN-MINUS), set
sign
to -1.
5.
If
is not empty and the first code unit of
is either the code unit 0x002B (PLUS SIGN) or the code unit 0x002D (HYPHEN-MINUS), set
to the
substring
of
from index 1.
6.
Let
be
(?
ToInt32
radix
)).
7.
Let
stripPrefix
be
true
8.
If
≠ 0, then
a.
If
< 2 or
> 36, return
NaN
b.
If
≠ 16, set
stripPrefix
to
false
9.
Else,
a.
Set
to 10.
10.
If
stripPrefix
is
true
, then
a.
If the length of
is at least 2 and the first two code units of
are either
"0x"
or
"0X"
, then
i.
Set
to the
substring
of
from index 2.
ii.
Set
to 16.
11.
If
contains a code unit that is not a radix-
digit, let
end
be the index within
of the first such code unit; otherwise, let
end
be the length of
12.
Let
be the
substring
of
from 0 to
end
13.
If
is empty, return
NaN
14.
Let
mathInt
be the
integer
value that is represented by
in radix-
notation, using the letters
and
for digits with values 10 through 35. (However, if
= 10 and
contains more than 20 significant digits, every significant digit after
the 20th may be replaced by a 0 digit, at the option of the
implementation; and if
is not one of 2, 4, 8, 10, 16, or 32, then
mathInt
may be an
implementation-approximated
integer
representing the
integer
value denoted by
in radix-
notation.)
15.
If
mathInt
= 0, then
a.
If
sign
= -1, return
-0
b.
Return
+0
16.
Return
sign
mathInt
).
Note
This function may interpret only a leading portion of
string
as an
integer
value; it ignores any code units that cannot be interpreted as part of the notation of an
integer
, and no indication is given that any such code units were ignored.
19.2.6
URI Handling Functions
Uniform Resource Identifiers, or URIs, are Strings that
identify resources (e.g. web pages or files) and transport protocols by
which to access them (e.g. HTTP or FTP) on the Internet. The ECMAScript
language itself does not provide any support for using URIs except for
functions that encode and decode URIs as described in this section.
encodeURI
and
decodeURI
are intended to work with complete URIs; they assume that any reserved
characters are intended to have special meaning (e.g., as delimiters)
and so are not encoded.
encodeURIComponent
and
decodeURIComponent
are intended to work with the individual components of a URI; they
assume that any reserved characters represent text and must be encoded
to avoid special meaning when the component is part of a complete URI.
Note 1
The set of reserved characters is based upon RFC 2396 and does not reflect changes introduced by the more recent RFC 3986.
Note 2
Many implementations of ECMAScript provide additional
functions and methods that manipulate web pages; these functions are
beyond the scope of this standard.
19.2.6.1
decodeURI (
encodedURI
This function computes a new version of a URI in which each
escape sequence and UTF-8 encoding of the sort that might be introduced
by the
encodeURI
function is replaced with the UTF-16
encoding of the code point that it represents. Escape sequences that
could not have been introduced by
encodeURI
are not replaced.
It is the
%decodeURI%
intrinsic object.
It performs the following steps when called:
1.
Let
uriString
be ?
ToString
encodedURI
).
2.
Let
preserveEscapeSet
be
";/?:@&=+$,#"
3.
Return ?
Decode
uriString
preserveEscapeSet
).
19.2.6.2
decodeURIComponent (
encodedURIComponent
This function computes a new version of a URI in which each
escape sequence and UTF-8 encoding of the sort that might be introduced
by the
encodeURIComponent
function is replaced with the UTF-16 encoding of the code point that it represents.
It is the
%decodeURIComponent%
intrinsic object.
It performs the following steps when called:
1.
Let
componentString
be ?
ToString
encodedURIComponent
).
2.
Let
preserveEscapeSet
be the empty String.
3.
Return ?
Decode
componentString
preserveEscapeSet
).
19.2.6.3
encodeURI (
uri
This function computes a new version of a UTF-16 encoded (
6.1.4
URI in which each instance of certain code points is replaced by one,
two, three, or four escape sequences representing the UTF-8 encoding of
the code point.
It is the
%encodeURI%
intrinsic object.
It performs the following steps when called:
1.
Let
uriString
be ?
ToString
uri
).
2.
Let
extraUnescaped
be
";/?:@&=+$,#"
3.
Return ?
Encode
uriString
extraUnescaped
).
19.2.6.4
encodeURIComponent (
uriComponent
This function computes a new version of a UTF-16 encoded (
6.1.4
URI in which each instance of certain code points is replaced by one,
two, three, or four escape sequences representing the UTF-8 encoding of
the code point.
It is the
%encodeURIComponent%
intrinsic object.
It performs the following steps when called:
1.
Let
componentString
be ?
ToString
uriComponent
).
2.
Let
extraUnescaped
be the empty String.
3.
Return ?
Encode
componentString
extraUnescaped
).
19.2.6.5
Encode (
string
extraUnescaped
The abstract operation Encode takes arguments
string
(a String) and
extraUnescaped
(a String) and returns either a
normal completion containing
a String or a
throw completion
. It performs URI encoding and escaping, interpreting
string
as a sequence of UTF-16 encoded code points as described in
6.1.4
. If a character is identified as unreserved in RFC 2396 or appears in
extraUnescaped
, it is not escaped. It performs the following steps when called:
1.
Let
len
be the length of
string
2.
Let
be the empty String.
3.
Let
alwaysUnescaped
be the
string-concatenation
of
the ASCII word characters
and
"-.!~*'()"
4.
Let
unescapedSet
be the
string-concatenation
of
alwaysUnescaped
and
extraUnescaped
5.
Let
be 0.
6.
Repeat, while
len
a.
Let
be the code unit at index
within
string
b.
If
unescapedSet
contains
, then
i.
Set
to
+ 1.
ii.
Set
to the
string-concatenation
of
and
c.
Else,
i.
Let
cp
be
CodePointAt
string
).
ii.
If
cp
.[[IsUnpairedSurrogate]] is
true
, throw a
URIError
exception.
iii.
Set
to
cp
.[[CodeUnitCount]].
iv.
Let
Octets
be the
List
of octets resulting by applying the UTF-8 transformation to
cp
.[[CodePoint]].
v.
For each element
octet
of
Octets
, do
1.
Let
hex
be the String representation of
octet
, formatted as an uppercase hexadecimal number.
2.
Set
to the
string-concatenation
of
"%"
, and !
StringPad
hex
"0"
start
).
7.
Return
Note
Because percent-encoding is used to represent individual
octets, a single code point may be expressed as multiple consecutive
escape sequences (one for each of its 8-bit UTF-8 code units).
19.2.6.6
Decode (
string
preserveEscapeSet
The abstract operation Decode takes arguments
string
(a String) and
preserveEscapeSet
(a String) and returns either a
normal completion containing
a String or a
throw completion
. It performs URI unescaping and decoding, preserving any escape sequences that correspond to Basic Latin characters in
preserveEscapeSet
. It performs the following steps when called:
1.
Let
len
be the length of
string
2.
Let
be the empty String.
3.
Let
be 0.
4.
Repeat, while
len
a.
Let
be the code unit at index
within
string
b.
Let
be
c.
If
is the code unit 0x0025 (PERCENT SIGN), then
i.
If
+ 3 >
len
, throw a
URIError
exception.
ii.
Let
escape
be the
substring
of
string
from
to
+ 3.
iii.
Let
be
ParseHexOctet
string
+ 1).
iv.
If
is not an
integer
, throw a
URIError
exception.
v.
Set
to
+ 2.
vi.
Let
be the number of leading 1 bits in
vii.
If
= 0, then
1.
Let
asciiChar
be the code unit whose numeric value is
2.
If
preserveEscapeSet
contains
asciiChar
, set
to
escape
. Otherwise, set
to
asciiChar
viii.
Else,
1.
If
= 1 or
> 4, throw a
URIError
exception.
2.
Let
Octets
be «
».
3.
Let
be 1.
4.
Repeat, while
a.
Set
to
+ 1.
b.
If
+ 3 >
len
, throw a
URIError
exception.
c.
If the code unit at index
within
string
is not the code unit 0x0025 (PERCENT SIGN), throw a
URIError
exception.
d.
Let
continuationByte
be
ParseHexOctet
string
+ 1).
e.
If
continuationByte
is not an
integer
, throw a
URIError
exception.
f.
Append
continuationByte
to
Octets
g.
Set
to
+ 2.
h.
Set
to
+ 1.
5.
Assert
: The length of
Octets
is
6.
If
Octets
does not contain a valid UTF-8 encoding of a Unicode code point, throw a
URIError
exception.
7.
Let
be the code point obtained by applying the UTF-8 transformation to
Octets
, that is, from a
List
of octets into a 21-bit value.
8.
Set
to
UTF16EncodeCodePoint
).
d.
Set
to the
string-concatenation
of
and
e.
Set
to
+ 1.
5.
Return
Note
RFC 3629 prohibits the decoding of invalid UTF-8 octet
sequences. For example, the invalid sequence 0xC0 0x80 must not decode
into the code unit 0x0000. Implementations of the Decode algorithm are
required to throw a
URIError
when encountering such invalid sequences.
19.2.6.7
ParseHexOctet (
string
position
The abstract operation ParseHexOctet takes arguments
string
(a String) and
position
(a non-negative
integer
) and returns either a non-negative
integer
or a non-empty
List
of
SyntaxError
objects. It parses a sequence of two hexadecimal characters at the specified
position
in
string
into an unsigned 8-bit
integer
. It performs the following steps when called:
1.
Let
len
be the length of
string
2.
Assert
position
+ 2 ≤
len
3.
Let
hexDigits
be the
substring
of
string
from
position
to
position
+ 2.
4.
Let
parseResult
be
ParseText
StringToCodePoints
hexDigits
),
HexDigits
[~Sep]
).
5.
If
parseResult
is not a
Parse Node
, return
parseResult
6.
Let
be the MV of
parseResult
7.
Assert
is in the
inclusive interval
from 0 to 255.
8.
Return
19.3
Constructor Properties of the Global Object
19.3.1
AggregateError ( . . . )
See
20.5.7.1
19.3.2
Array ( . . . )
See
23.1.1
19.3.3
ArrayBuffer ( . . . )
See
25.1.3
19.3.4
BigInt ( . . . )
See
21.2.1
19.3.5
BigInt64Array ( . . . )
See
23.2.5
19.3.6
BigUint64Array ( . . . )
See
23.2.5
19.3.7
Boolean ( . . . )
See
20.3.1
19.3.8
DataView ( . . . )
See
25.3.2
19.3.9
Date ( . . . )
See
21.4.2
19.3.10
Error ( . . . )
See
20.5.1
19.3.11
EvalError ( . . . )
See
20.5.5.1
19.3.12
FinalizationRegistry ( . . . )
See
26.2.1
19.3.13
Float32Array ( . . . )
See
23.2.5
19.3.14
Float64Array ( . . . )
See
23.2.5
19.3.15
Function ( . . . )
See
20.2.1
19.3.16
Int8Array ( . . . )
See
23.2.5
19.3.17
Int16Array ( . . . )
See
23.2.5
19.3.18
Int32Array ( . . . )
See
23.2.5
19.3.19
Map ( . . . )
See
24.1.1
19.3.20
Number ( . . . )
See
21.1.1
19.3.21
Object ( . . . )
See
20.1.1
19.3.22
Promise ( . . . )
See
27.2.3
19.3.23
Proxy ( . . . )
See
28.2.1
19.3.24
RangeError ( . . . )
See
20.5.5.2
19.3.25
ReferenceError ( . . . )
See
20.5.5.3
19.3.26
RegExp ( . . . )
See
22.2.4
19.3.27
Set ( . . . )
See
24.2.1
19.3.28
SharedArrayBuffer ( . . . )
See
25.2.2
19.3.29
String ( . . . )
See
22.1.1
19.3.30
Symbol ( . . . )
See
20.4.1
19.3.31
SyntaxError ( . . . )
See
20.5.5.4
19.3.32
TypeError ( . . . )
See
20.5.5.5
19.3.33
Uint8Array ( . . . )
See
23.2.5
19.3.34
Uint8ClampedArray ( . . . )
See
23.2.5
19.3.35
Uint16Array ( . . . )
See
23.2.5
19.3.36
Uint32Array ( . . . )
See
23.2.5
19.3.37
URIError ( . . . )
See
20.5.5.6
19.3.38
WeakMap ( . . . )
See
24.3.1
19.3.39
WeakRef ( . . . )
See
26.1.1
19.3.40
WeakSet ( . . . )
See
24.4
19.4
Other Properties of the Global Object
19.4.1
Atomics
See
25.4
19.4.2
JSON
See
25.5
19.4.3
Math
See
21.3
19.4.4
Reflect
See
28.1
20
Fundamental Objects
20.1
Object Objects
20.1.1
The Object Constructor
The Object
constructor
is
%Object%
is the initial value of the
"Object"
property of the
global object
creates a new
ordinary object
when called as a
constructor
performs a type conversion when called as a function rather than as a
constructor
may be used as the value of an
extends
clause of a class definition.
20.1.1.1
Object ( [
value
] )
This function performs the following steps when called:
1.
If NewTarget is neither
undefined
nor the
active function object
, then
a.
Return ?
OrdinaryCreateFromConstructor
(NewTarget,
"%Object.prototype%"
).
2.
If
value
is either
undefined
or
null
, return
OrdinaryObjectCreate
%Object.prototype%
).
3.
Return !
ToObject
value
).
The
"length"
property of this function is
20.1.2
Properties of the Object Constructor
The Object
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has a
"length"
property.
has the following additional properties:
20.1.2.1
Object.assign (
target
, ...
sources
This function copies the values of all of the enumerable own properties from one or more source objects to a
target
object.
It performs the following steps when called:
1.
Let
to
be ?
ToObject
target
).
2.
If only one argument was passed, return
to
3.
For each element
nextSource
of
sources
, do
a.
If
nextSource
is neither
undefined
nor
null
, then
i.
Let
from
be !
ToObject
nextSource
).
ii.
Let
keys
be ?
from
.[[OwnPropertyKeys]]()
iii.
For each element
nextKey
of
keys
, do
1.
Let
desc
be ?
from
.[[GetOwnProperty]]
nextKey
).
2.
If
desc
is not
undefined
and
desc
.[[Enumerable]] is
true
, then
a.
Let
propValue
be ?
Get
from
nextKey
).
b.
Perform ?
Set
to
nextKey
propValue
true
).
4.
Return
to
The
"length"
property of this function is
20.1.2.2
Object.create (
Properties
This function creates a new object with a specified prototype.
It performs the following steps when called:
1.
If
is not an Object
and
is not
null
, throw a
TypeError
exception.
2.
Let
obj
be
OrdinaryObjectCreate
).
3.
If
Properties
is not
undefined
, then
a.
Return ?
ObjectDefineProperties
obj
Properties
).
4.
Return
obj
20.1.2.3
Object.defineProperties (
Properties
This function adds own properties and/or updates the attributes of existing own properties of an object.
It performs the following steps when called:
1.
If
is not an Object
, throw a
TypeError
exception.
2.
Return ?
ObjectDefineProperties
Properties
).
20.1.2.3.1
ObjectDefineProperties (
Properties
The abstract operation ObjectDefineProperties takes arguments
(an Object) and
Properties
(an
ECMAScript language value
) and returns either a
normal completion containing
an Object or a
throw completion
. It performs the following steps when called:
1.
Let
props
be ?
ToObject
Properties
).
2.
Let
keys
be ?
props
.[[OwnPropertyKeys]]()
3.
Let
descriptors
be a new empty
List
4.
For each element
nextKey
of
keys
, do
a.
Let
propDesc
be ?
props
.[[GetOwnProperty]]
nextKey
).
b.
If
propDesc
is not
undefined
and
propDesc
.[[Enumerable]] is
true
, then
i.
Let
descObj
be ?
Get
props
nextKey
).
ii.
Let
desc
be ?
ToPropertyDescriptor
descObj
).
iii.
Append the pair (a two element
List
) consisting of
nextKey
and
desc
to the end of
descriptors
5.
For each element
pair
of
descriptors
, do
a.
Let
be the first element of
pair
b.
Let
desc
be the second element of
pair
c.
Perform ?
DefinePropertyOrThrow
desc
).
6.
Return
20.1.2.4
Object.defineProperty (
Attributes
This function adds an own property and/or updates the attributes of an existing own property of an object.
It performs the following steps when called:
1.
If
is not an Object
, throw a
TypeError
exception.
2.
Let
key
be ?
ToPropertyKey
).
3.
Let
desc
be ?
ToPropertyDescriptor
Attributes
).
4.
Perform ?
DefinePropertyOrThrow
key
desc
).
5.
Return
20.1.2.5
Object.entries (
This function performs the following steps when called:
1.
Let
obj
be ?
ToObject
).
2.
Let
entryList
be ?
EnumerableOwnProperties
obj
key+value
).
3.
Return
CreateArrayFromList
entryList
).
20.1.2.6
Object.freeze (
This function performs the following steps when called:
1.
If
is not an Object
, return
2.
Let
status
be ?
SetIntegrityLevel
frozen
).
3.
If
status
is
false
, throw a
TypeError
exception.
4.
Return
20.1.2.7
Object.fromEntries (
iterable
This function performs the following steps when called:
1.
Perform ?
RequireObjectCoercible
iterable
).
2.
Let
obj
be
OrdinaryObjectCreate
%Object.prototype%
).
3.
Assert
obj
is an extensible
ordinary object
with no own properties.
4.
Let
closure
be a new
Abstract Closure
with parameters (
key
value
) that captures
obj
and performs the following steps when called:
a.
Let
propertyKey
be ?
ToPropertyKey
key
).
b.
Perform !
CreateDataPropertyOrThrow
obj
propertyKey
value
).
c.
Return
undefined
5.
Let
adder
be
CreateBuiltinFunction
closure
, 2,
""
, « »).
6.
Return ?
AddEntriesFromIterable
obj
iterable
adder
).
Note
The function created for
adder
is never directly accessible to ECMAScript code.
20.1.2.8
Object.getOwnPropertyDescriptor (
This function performs the following steps when called:
1.
Let
obj
be ?
ToObject
).
2.
Let
key
be ?
ToPropertyKey
).
3.
Let
desc
be ?
obj
.[[GetOwnProperty]]
key
).
4.
Return
FromPropertyDescriptor
desc
).
20.1.2.9
Object.getOwnPropertyDescriptors (
This function performs the following steps when called:
1.
Let
obj
be ?
ToObject
).
2.
Let
ownKeys
be ?
obj
.[[OwnPropertyKeys]]()
3.
Let
descriptors
be
OrdinaryObjectCreate
%Object.prototype%
).
4.
For each element
key
of
ownKeys
, do
a.
Let
desc
be ?
obj
.[[GetOwnProperty]]
key
).
b.
Let
descriptor
be
FromPropertyDescriptor
desc
).
c.
If
descriptor
is not
undefined
, perform !
CreateDataPropertyOrThrow
descriptors
key
descriptor
).
5.
Return
descriptors
20.1.2.10
Object.getOwnPropertyNames (
This function performs the following steps when called:
1.
Return
CreateArrayFromList
(?
GetOwnPropertyKeys
string
)).
20.1.2.11
Object.getOwnPropertySymbols (
This function performs the following steps when called:
1.
Return
CreateArrayFromList
(?
GetOwnPropertyKeys
symbol
)).
20.1.2.11.1
GetOwnPropertyKeys (
type
The abstract operation GetOwnPropertyKeys takes arguments
(an
ECMAScript language value
) and
type
string
or
symbol
) and returns either a
normal completion containing
List
of
property keys
or a
throw completion
. It performs the following steps when called:
1.
Let
obj
be ?
ToObject
).
2.
Let
keys
be ?
obj
.[[OwnPropertyKeys]]()
3.
Let
nameList
be a new empty
List
4.
For each element
nextKey
of
keys
, do
a.
If
nextKey
is a Symbol
and
type
is
symbol
, or if
nextKey
is a String
and
type
is
string
, then
i.
Append
nextKey
to
nameList
5.
Return
nameList
20.1.2.12
Object.getPrototypeOf (
This function performs the following steps when called:
1.
Let
obj
be ?
ToObject
).
2.
Return ?
obj
.[[GetPrototypeOf]]()
20.1.2.13
Object.hasOwn (
This function performs the following steps when called:
1.
Let
obj
be ?
ToObject
).
2.
Let
key
be ?
ToPropertyKey
).
3.
Return ?
HasOwnProperty
obj
key
).
20.1.2.14
Object.is (
value1
value2
This function performs the following steps when called:
1.
Return
SameValue
value1
value2
).
20.1.2.15
Object.isExtensible (
This function performs the following steps when called:
1.
If
is not an Object
, return
false
2.
Return ?
IsExtensible
).
20.1.2.16
Object.isFrozen (
This function performs the following steps when called:
1.
If
is not an Object
, return
true
2.
Return ?
TestIntegrityLevel
frozen
).
20.1.2.17
Object.isSealed (
This function performs the following steps when called:
1.
If
is not an Object
, return
true
2.
Return ?
TestIntegrityLevel
sealed
).
20.1.2.18
Object.keys (
This function performs the following steps when called:
1.
Let
obj
be ?
ToObject
).
2.
Let
keyList
be ?
EnumerableOwnProperties
obj
key
).
3.
Return
CreateArrayFromList
keyList
).
20.1.2.19
Object.preventExtensions (
This function performs the following steps when called:
1.
If
is not an Object
, return
2.
Let
status
be ?
.[[PreventExtensions]]()
3.
If
status
is
false
, throw a
TypeError
exception.
4.
Return
20.1.2.20
Object.prototype
The initial value of
Object.prototype
is the
Object prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.1.2.21
Object.seal (
This function performs the following steps when called:
1.
If
is not an Object
, return
2.
Let
status
be ?
SetIntegrityLevel
sealed
).
3.
If
status
is
false
, throw a
TypeError
exception.
4.
Return
20.1.2.22
Object.setPrototypeOf (
proto
This function performs the following steps when called:
1.
Set
to ?
RequireObjectCoercible
).
2.
If
proto
is not an Object
and
proto
is not
null
, throw a
TypeError
exception.
3.
If
is not an Object
, return
4.
Let
status
be ?
.[[SetPrototypeOf]]
proto
).
5.
If
status
is
false
, throw a
TypeError
exception.
6.
Return
20.1.2.23
Object.values (
This function performs the following steps when called:
1.
Let
obj
be ?
ToObject
).
2.
Let
valueList
be ?
EnumerableOwnProperties
obj
value
).
3.
Return
CreateArrayFromList
valueList
).
20.1.3
Properties of the Object Prototype Object
The
Object prototype object
is
%Object.prototype%
has an [[Extensible]] internal slot whose value is
true
has the internal methods defined for
ordinary objects
, except for the [[SetPrototypeOf]] method, which is as defined in
10.4.7.1
. (Thus, it is an
immutable prototype exotic object
.)
has a [[Prototype]] internal slot whose value is
null
20.1.3.1
Object.prototype.constructor
The initial value of
Object.prototype.constructor
is
%Object%
20.1.3.2
Object.prototype.hasOwnProperty (
This method performs the following steps when called:
1.
Let
be ?
ToPropertyKey
).
2.
Let
be ?
ToObject
this
value).
3.
Return ?
HasOwnProperty
).
Note
The ordering of steps
and
is chosen to ensure that any exception that would have been thrown by step
in previous editions of this specification will continue to be thrown even if the
this
value is
undefined
or
null
20.1.3.3
Object.prototype.isPrototypeOf (
This method performs the following steps when called:
1.
If
is not an Object
, return
false
2.
Let
be ?
ToObject
this
value).
3.
Repeat,
a.
Set
to ?
.[[GetPrototypeOf]]()
b.
If
is
null
, return
false
c.
If
SameValue
) is
true
, return
true
Note
The ordering of steps
and
preserves the behaviour specified by previous editions of this specification for the case where
is not an object and the
this
value is
undefined
or
null
20.1.3.4
Object.prototype.propertyIsEnumerable (
This method performs the following steps when called:
1.
Let
be ?
ToPropertyKey
).
2.
Let
be ?
ToObject
this
value).
3.
Let
desc
be ?
.[[GetOwnProperty]]
).
4.
If
desc
is
undefined
, return
false
5.
Return
desc
.[[Enumerable]].
Note 1
This method does not consider objects in the prototype chain.
Note 2
The ordering of steps
and
is chosen to ensure that any exception that would have been thrown by step
in previous editions of this specification will continue to be thrown even if the
this
value is
undefined
or
null
20.1.3.5
Object.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
Invoke
"toString"
).
The optional parameters to this method are not used but are intended to correspond to the parameter pattern used by ECMA-402
toLocaleString
methods. Implementations that do not include ECMA-402 support must not use those parameter positions for other purposes.
Note 1
This method provides a generic
toLocaleString
implementation for objects that have no locale-sensitive
toString
behaviour.
Array
Number
Date
, and
%TypedArray%
provide their own locale-sensitive
toLocaleString
methods.
Note 2
ECMA-402 intentionally does not provide an alternative to this default implementation.
20.1.3.6
Object.prototype.toString ( )
This method performs the following steps when called:
1.
If the
this
value is
undefined
, return
"[object Undefined]"
2.
If the
this
value is
null
, return
"[object Null]"
3.
Let
be !
ToObject
this
value).
4.
Let
isArray
be ?
IsArray
).
5.
If
isArray
is
true
, let
builtinTag
be
"Array"
6.
Else if
has a [[ParameterMap]] internal slot, let
builtinTag
be
"Arguments"
7.
Else if
has a [[Call]] internal method, let
builtinTag
be
"Function"
8.
Else if
has an [[ErrorData]] internal slot, let
builtinTag
be
"Error"
9.
Else if
has a [[BooleanData]] internal slot, let
builtinTag
be
"Boolean"
10.
Else if
has a [[NumberData]] internal slot, let
builtinTag
be
"Number"
11.
Else if
has a [[StringData]] internal slot, let
builtinTag
be
"String"
12.
Else if
has a [[DateValue]] internal slot, let
builtinTag
be
"Date"
13.
Else if
has a [[RegExpMatcher]] internal slot, let
builtinTag
be
"RegExp"
14.
Else, let
builtinTag
be
"Object"
15.
Let
tag
be ?
Get
@@toStringTag
).
16.
If
tag
is not a String
, set
tag
to
builtinTag
17.
Return the
string-concatenation
of
"[object "
tag
, and
"]"
Note
Historically, this method was occasionally used to access
the String value of the [[Class]] internal slot that was used in
previous editions of this specification as a nominal type tag for
various built-in objects. The above definition of
toString
preserves compatibility for legacy code that uses
toString
as a test for those specific kinds of built-in objects. It does not
provide a reliable type testing mechanism for other kinds of built-in or
program defined objects. In addition, programs can use
@@toStringTag
in ways that will invalidate the reliability of such legacy type tests.
20.1.3.7
Object.prototype.valueOf ( )
This method performs the following steps when called:
1.
Return ?
ToObject
this
value).
Normative Optional
Legacy
20.1.3.8
Object.prototype.__proto__
Object.prototype.__proto__
is an
accessor property
with attributes { [[Enumerable]]:
false
, [[Configurable]]:
true
}. The [[Get]] and [[Set]] attributes are defined as follows:
20.1.3.8.1
get Object.prototype.__proto__
The value of the [[Get]] attribute is a built-in function
that requires no arguments. It performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Return ?
.[[GetPrototypeOf]]()
20.1.3.8.2
set Object.prototype.__proto__
The value of the [[Set]] attribute is a built-in function that takes an argument
proto
. It performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
If
proto
is not an Object
and
proto
is not
null
, return
undefined
3.
If
is not an Object
, return
undefined
4.
Let
status
be ?
.[[SetPrototypeOf]]
proto
).
5.
If
status
is
false
, throw a
TypeError
exception.
6.
Return
undefined
Normative Optional
Legacy
20.1.3.9
Legacy Object.prototype Accessor Methods
20.1.3.9.1
Object.prototype.__defineGetter__ (
getter
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
If
IsCallable
getter
) is
false
, throw a
TypeError
exception.
3.
Let
desc
be PropertyDescriptor { [[Get]]:
getter
, [[Enumerable]]:
true
, [[Configurable]]:
true
}.
4.
Let
key
be ?
ToPropertyKey
).
5.
Perform ?
DefinePropertyOrThrow
key
desc
).
6.
Return
undefined
20.1.3.9.2
Object.prototype.__defineSetter__ (
setter
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
If
IsCallable
setter
) is
false
, throw a
TypeError
exception.
3.
Let
desc
be PropertyDescriptor { [[Set]]:
setter
, [[Enumerable]]:
true
, [[Configurable]]:
true
}.
4.
Let
key
be ?
ToPropertyKey
).
5.
Perform ?
DefinePropertyOrThrow
key
desc
).
6.
Return
undefined
20.1.3.9.3
Object.prototype.__lookupGetter__ (
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
key
be ?
ToPropertyKey
).
3.
Repeat,
a.
Let
desc
be ?
.[[GetOwnProperty]]
key
).
b.
If
desc
is not
undefined
, then
i.
If
IsAccessorDescriptor
desc
) is
true
, return
desc
.[[Get]].
ii.
Return
undefined
c.
Set
to ?
.[[GetPrototypeOf]]()
d.
If
is
null
, return
undefined
20.1.3.9.4
Object.prototype.__lookupSetter__ (
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
key
be ?
ToPropertyKey
).
3.
Repeat,
a.
Let
desc
be ?
.[[GetOwnProperty]]
key
).
b.
If
desc
is not
undefined
, then
i.
If
IsAccessorDescriptor
desc
) is
true
, return
desc
.[[Set]].
ii.
Return
undefined
c.
Set
to ?
.[[GetPrototypeOf]]()
d.
If
is
null
, return
undefined
20.1.4
Properties of Object Instances
Object instances have no special properties beyond those inherited from the
Object prototype object
20.2
Function Objects
20.2.1
The Function Constructor
The Function
constructor
is
%Function%
is the initial value of the
"Function"
property of the
global object
creates and initializes a new
function object
when called as a function rather than as a
constructor
. Thus the function call
Function(…)
is equivalent to the object creation expression
new Function(…)
with the same arguments.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified Function behaviour must include a
super
call to the Function
constructor
to create and initialize a subclass instance with the internal slots
necessary for built-in function behaviour. All ECMAScript syntactic
forms for defining
function objects
create instances of Function. There is no syntactic means to create
instances of Function subclasses except for the built-in
GeneratorFunction, AsyncFunction, and AsyncGeneratorFunction subclasses.
20.2.1.1
Function ( ...
parameterArgs
bodyArg
The last argument (if any) specifies the body (executable
code) of a function; any preceding arguments specify formal parameters.
This function performs the following steps when called:
1.
Let
be the
active function object
2.
If
bodyArg
is not present, set
bodyArg
to the empty String.
3.
Return ?
CreateDynamicFunction
, NewTarget,
normal
parameterArgs
bodyArg
).
Note
It is permissible but not necessary to have one argument
for each formal parameter to be specified. For example, all three of the
following expressions produce the same result:
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"
20.2.1.1.1
CreateDynamicFunction (
constructor
newTarget
kind
parameterArgs
bodyArg
The abstract operation CreateDynamicFunction takes arguments
constructor
(a
constructor
),
newTarget
(a
constructor
),
kind
normal
generator
async
, or
asyncGenerator
),
parameterArgs
(a
List
of
ECMAScript language values
), and
bodyArg
(an
ECMAScript language value
) and returns either a
normal completion containing
function object
or a
throw completion
constructor
is the
constructor
function that is performing this action.
newTarget
is the
constructor
that
new
was initially applied to.
parameterArgs
and
bodyArg
reflect the argument values that were passed to
constructor
. It performs the following steps when called:
1.
Let
currentRealm
be
the current Realm Record
2.
Perform ?
HostEnsureCanCompileStrings
currentRealm
).
3.
If
newTarget
is
undefined
, set
newTarget
to
constructor
4.
If
kind
is
normal
, then
a.
Let
prefix
be
"function"
b.
Let
exprSym
be the grammar symbol
FunctionExpression
c.
Let
bodySym
be the grammar symbol
FunctionBody
[~Yield, ~Await]
d.
Let
parameterSym
be the grammar symbol
FormalParameters
[~Yield, ~Await]
e.
Let
fallbackProto
be
"%Function.prototype%"
5.
Else if
kind
is
generator
, then
a.
Let
prefix
be
"function*"
b.
Let
exprSym
be the grammar symbol
GeneratorExpression
c.
Let
bodySym
be the grammar symbol
GeneratorBody
d.
Let
parameterSym
be the grammar symbol
FormalParameters
[+Yield, ~Await]
e.
Let
fallbackProto
be
"%GeneratorFunction.prototype%"
6.
Else if
kind
is
async
, then
a.
Let
prefix
be
"async function"
b.
Let
exprSym
be the grammar symbol
AsyncFunctionExpression
c.
Let
bodySym
be the grammar symbol
AsyncFunctionBody
d.
Let
parameterSym
be the grammar symbol
FormalParameters
[~Yield, +Await]
e.
Let
fallbackProto
be
"%AsyncFunction.prototype%"
7.
Else,
a.
Assert
kind
is
asyncGenerator
b.
Let
prefix
be
"async function*"
c.
Let
exprSym
be the grammar symbol
AsyncGeneratorExpression
d.
Let
bodySym
be the grammar symbol
AsyncGeneratorBody
e.
Let
parameterSym
be the grammar symbol
FormalParameters
[+Yield, +Await]
f.
Let
fallbackProto
be
"%AsyncGeneratorFunction.prototype%"
8.
Let
argCount
be the number of elements in
parameterArgs
9.
Let
be the empty String.
10.
If
argCount
> 0, then
a.
Let
firstArg
be
parameterArgs
[0].
b.
Set
to ?
ToString
firstArg
).
c.
Let
be 1.
d.
Repeat, while
argCount
i.
Let
nextArg
be
parameterArgs
].
ii.
Let
nextArgString
be ?
ToString
nextArg
).
iii.
Set
to the
string-concatenation
of
","
(a comma), and
nextArgString
iv.
Set
to
+ 1.
11.
Let
bodyString
be the
string-concatenation
of 0x000A (LINE FEED), ?
ToString
bodyArg
), and 0x000A (LINE FEED).
12.
Let
sourceString
be the
string-concatenation
of
prefix
" anonymous("
, 0x000A (LINE FEED),
") {"
bodyString
, and
"}"
13.
Let
sourceText
be
StringToCodePoints
sourceString
).
14.
Let
parameters
be
ParseText
StringToCodePoints
),
parameterSym
).
15.
If
parameters
is a
List
of errors, throw a
SyntaxError
exception.
16.
Let
body
be
ParseText
StringToCodePoints
bodyString
),
bodySym
).
17.
If
body
is a
List
of errors, throw a
SyntaxError
exception.
18.
NOTE: The parameters and body are parsed separately to ensure that each is valid alone. For example,
new Function("/*", "*/ ) {")
does not evaluate to a function.
19.
NOTE: If this step is reached,
sourceText
must have the syntax of
exprSym
(although the reverse implication does not hold). The purpose of the
next two steps is to enforce any Early Error rules which apply to
exprSym
directly.
20.
Let
expr
be
ParseText
sourceText
exprSym
).
21.
If
expr
is a
List
of errors, throw a
SyntaxError
exception.
22.
Let
proto
be ?
GetPrototypeFromConstructor
newTarget
fallbackProto
).
23.
Let
realmF
be
the current Realm Record
24.
Let
env
be
realmF
.[[GlobalEnv]].
25.
Let
privateEnv
be
null
26.
Let
be
OrdinaryFunctionCreate
proto
sourceText
parameters
body
non-lexical-this
env
privateEnv
).
27.
Perform
SetFunctionName
"anonymous"
).
28.
If
kind
is
generator
, then
a.
Let
prototype
be
OrdinaryObjectCreate
%GeneratorFunction.prototype.prototype%
).
b.
Perform !
DefinePropertyOrThrow
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
29.
Else if
kind
is
asyncGenerator
, then
a.
Let
prototype
be
OrdinaryObjectCreate
%AsyncGeneratorFunction.prototype.prototype%
).
b.
Perform !
DefinePropertyOrThrow
"prototype"
, PropertyDescriptor { [[Value]]:
prototype
, [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
30.
Else if
kind
is
normal
, perform
MakeConstructor
).
31.
NOTE: Functions whose
kind
is
async
are not constructible and do not have a [[Construct]] internal method or a
"prototype"
property.
32.
Return
Note
CreateDynamicFunction defines a
"prototype"
property on any function it creates whose
kind
is not
async
to provide for the possibility that the function will be used as a
constructor
20.2.2
Properties of the Function Constructor
The Function
constructor
is itself a built-in
function object
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
20.2.2.1
Function.length
This is a
data property
with a value of 1. This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
20.2.2.2
Function.prototype
The value of
Function.prototype
is the
Function prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.2.3
Properties of the Function Prototype Object
The
Function prototype object
is
%Function.prototype%
is itself a built-in
function object
accepts any arguments and returns
undefined
when invoked.
does not have a [[Construct]] internal method; it cannot be used as a
constructor
with the
new
operator.
has a [[Prototype]] internal slot whose value is
%Object.prototype%
does not have a
"prototype"
property.
has a
"length"
property whose value is
+0
has a
"name"
property whose value is the empty String.
Note
The Function prototype object is specified to be a
function object
to ensure compatibility with ECMAScript code that was created prior to the ECMAScript 2015 specification.
20.2.3.1
Function.prototype.apply (
thisArg
argArray
This method performs the following steps when called:
1.
Let
func
be the
this
value.
2.
If
IsCallable
func
) is
false
, throw a
TypeError
exception.
3.
If
argArray
is either
undefined
or
null
, then
a.
Perform
PrepareForTailCall
().
b.
Return ?
Call
func
thisArg
).
4.
Let
argList
be ?
CreateListFromArrayLike
argArray
).
5.
Perform
PrepareForTailCall
().
6.
Return ?
Call
func
thisArg
argList
).
Note 1
The
thisArg
value is passed without modification as the
this
value. This is a change from Edition 3, where an
undefined
or
null
thisArg
is replaced with the
global object
and
ToObject
is applied to all other values and that result is passed as the
this
value. Even though the
thisArg
is passed without modification,
non-strict functions
still perform these transformations upon entry to the function.
Note 2
If
func
is either an arrow function or a
bound function exotic object
, then the
thisArg
will be ignored by the function [[Call]] in step
20.2.3.2
Function.prototype.bind (
thisArg
, ...
args
This method performs the following steps when called:
1.
Let
Target
be the
this
value.
2.
If
IsCallable
Target
) is
false
, throw a
TypeError
exception.
3.
Let
be ?
BoundFunctionCreate
Target
thisArg
args
).
4.
Let
be 0.
5.
Let
targetHasLength
be ?
HasOwnProperty
Target
"length"
).
6.
If
targetHasLength
is
true
, then
a.
Let
targetLen
be ?
Get
Target
"length"
).
b.
If
targetLen
is a Number
, then
i.
If
targetLen
is
+∞
, set
to +∞.
ii.
Else if
targetLen
is
-∞
, set
to 0.
iii.
Else,
1.
Let
targetLenAsInt
be !
ToIntegerOrInfinity
targetLen
).
2.
Assert
targetLenAsInt
is
finite
3.
Let
argCount
be the number of elements in
args
4.
Set
to
max
targetLenAsInt
argCount
, 0).
7.
Perform
SetFunctionLength
).
8.
Let
targetName
be ?
Get
Target
"name"
).
9.
If
targetName
is not a String
, set
targetName
to the empty String.
10.
Perform
SetFunctionName
targetName
"bound"
).
11.
Return
Note 1
Function objects
created using
Function.prototype.bind
are
exotic objects
. They also do not have a
"prototype"
property.
Note 2
If
Target
is either an arrow function or a
bound function exotic object
, then the
thisArg
passed to this method will not be used by subsequent calls to
20.2.3.3
Function.prototype.call (
thisArg
, ...
args
This method performs the following steps when called:
1.
Let
func
be the
this
value.
2.
If
IsCallable
func
) is
false
, throw a
TypeError
exception.
3.
Perform
PrepareForTailCall
().
4.
Return ?
Call
func
thisArg
args
).
Note 1
The
thisArg
value is passed without modification as the
this
value. This is a change from Edition 3, where an
undefined
or
null
thisArg
is replaced with the
global object
and
ToObject
is applied to all other values and that result is passed as the
this
value. Even though the
thisArg
is passed without modification,
non-strict functions
still perform these transformations upon entry to the function.
Note 2
If
func
is either an arrow function or a
bound function exotic object
, then the
thisArg
will be ignored by the function [[Call]] in step
20.2.3.4
Function.prototype.constructor
The initial value of
Function.prototype.constructor
is
%Function%
20.2.3.5
Function.prototype.toString ( )
This method performs the following steps when called:
1.
Let
func
be the
this
value.
2.
If
func
is an Object
func
has a [[SourceText]] internal slot,
func
.[[SourceText]] is a sequence of Unicode code points, and
HostHasSourceTextAvailable
func
) is
true
, then
a.
Return
CodePointsToString
func
.[[SourceText]]).
3.
If
func
is a
built-in function object
, return an
implementation-defined
String source code representation of
func
. The representation must have the syntax of a
NativeFunction
. Additionally, if
func
has an [[InitialName]] internal slot and
func
.[[InitialName]]
is a String
, the portion of the returned String that would be matched by
NativeFunctionAccessor
opt
PropertyName
must be the value of
func
.[[InitialName]].
4.
If
func
is an Object
and
IsCallable
func
) is
true
, return an
implementation-defined
String source code representation of
func
. The representation must have the syntax of a
NativeFunction
5.
Throw a
TypeError
exception.
NativeFunction
function
NativeFunctionAccessor
opt
PropertyName
[~Yield, ~Await]
opt
FormalParameters
[~Yield, ~Await]
native
code
NativeFunctionAccessor
get
set
20.2.3.6
Function.prototype [ @@hasInstance ] (
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
OrdinaryHasInstance
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
Note
This is the default implementation of
@@hasInstance
that most functions inherit.
@@hasInstance
is called by the
instanceof
operator to determine whether a value is an instance of a specific
constructor
. An expression such as
instanceof
evaluates as
F[@@hasInstance](v)
constructor
function can control which objects are recognized as its instances by
instanceof
by exposing a different
@@hasInstance
method on the function.
This property is non-writable and non-configurable to prevent
tampering that could be used to globally expose the target function of a
bound function.
The value of the
"name"
property of this method is
"[Symbol.hasInstance]"
20.2.4
Function Instances
Every Function instance is an ECMAScript
function object
and has the internal slots listed in
Table 30
Function objects
created using the
Function.prototype.bind
method (
20.2.3.2
) have the internal slots listed in
Table 31
Function instances have the following properties:
20.2.4.1
length
The value of the
"length"
property is an
integral Number
that indicates the typical number of arguments expected by the
function. However, the language permits the function to be invoked with
some other number of arguments. The behaviour of a function when invoked
on a number of arguments other than the number specified by its
"length"
property depends on the function. This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
20.2.4.2
name
The value of the
"name"
property
is a String
that is descriptive of the function. The name has no semantic significance but is typically a variable or
property name
that is used to refer to the function at its point of definition in
ECMAScript source text
. This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
Anonymous functions objects that do not have a contextual
name associated with them by this specification use the empty String as
the value of the
"name"
property.
20.2.4.3
prototype
Function instances that can be used as a
constructor
have a
"prototype"
property. Whenever such a Function instance is created another
ordinary object
is also created and is the initial value of the function's
"prototype"
property. Unless otherwise specified, the value of the
"prototype"
property is used to initialize the [[Prototype]] internal slot of the object created when that function is invoked as a
constructor
This property has the attributes { [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
Note
Function objects
created using
Function.prototype.bind
, or by evaluating a
MethodDefinition
(that is not a
GeneratorMethod
or
AsyncGeneratorMethod
) or an
ArrowFunction
do not have a
"prototype"
property.
20.2.5
HostHasSourceTextAvailable (
func
The
host-defined
abstract operation HostHasSourceTextAvailable takes argument
func
(a
function object
) and returns a Boolean. It allows
host environments
to prevent the source text from being provided for
func
An implementation of HostHasSourceTextAvailable must conform to the following requirements:
It must be deterministic with respect to its parameters. Each time it is called with a specific
func
as its argument, it must return the same result.
The default implementation of HostHasSourceTextAvailable is to return
true
20.3
Boolean Objects
20.3.1
The Boolean Constructor
The Boolean
constructor
is
%Boolean%
is the initial value of the
"Boolean"
property of the
global object
creates and initializes a new Boolean object when called as a
constructor
performs a type conversion when called as a function rather than as a
constructor
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified Boolean behaviour must include a
super
call to the Boolean
constructor
to create and initialize the subclass instance with a [[BooleanData]] internal slot.
20.3.1.1
Boolean (
value
This function performs the following steps when called:
1.
Let
be
ToBoolean
value
).
2.
If NewTarget is
undefined
, return
3.
Let
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%Boolean.prototype%"
, « [[BooleanData]] »).
4.
Set
.[[BooleanData]] to
5.
Return
20.3.2
Properties of the Boolean Constructor
The Boolean
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
20.3.2.1
Boolean.prototype
The initial value of
Boolean.prototype
is the
Boolean prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.3.3
Properties of the Boolean Prototype Object
The
Boolean prototype object
is
%Boolean.prototype%
is an
ordinary object
is itself a Boolean object; it has a [[BooleanData]] internal slot with the value
false
has a [[Prototype]] internal slot whose value is
%Object.prototype%
The abstract operation
thisBooleanValue
takes argument
value
. It performs the following steps when called:
1.
If
value
is a Boolean
, return
value
2.
If
value
is an Object
and
value
has a [[BooleanData]] internal slot, then
a.
Let
be
value
.[[BooleanData]].
b.
Assert
is a Boolean
c.
Return
3.
Throw a
TypeError
exception.
20.3.3.1
Boolean.prototype.constructor
The initial value of
Boolean.prototype.constructor
is
%Boolean%
20.3.3.2
Boolean.prototype.toString ( )
This method performs the following steps when called:
1.
Let
be ?
thisBooleanValue
this
value).
2.
If
is
true
, return
"true"
; else return
"false"
20.3.3.3
Boolean.prototype.valueOf ( )
This method performs the following steps when called:
1.
Return ?
thisBooleanValue
this
value).
20.3.4
Properties of Boolean Instances
Boolean instances are
ordinary objects
that inherit properties from the
Boolean prototype object
Boolean instances have a [[BooleanData]] internal slot. The
[[BooleanData]] internal slot is the Boolean value represented by this
Boolean object.
20.4
Symbol Objects
20.4.1
The Symbol Constructor
The Symbol
constructor
is
%Symbol%
is the initial value of the
"Symbol"
property of the
global object
returns a new Symbol value when called as a function.
is not intended to be used with the
new
operator.
is not intended to be subclassed.
may be used as the value of an
extends
clause of a class definition but a
super
call to it will cause an exception.
20.4.1.1
Symbol ( [
description
] )
This function performs the following steps when called:
1.
If NewTarget is not
undefined
, throw a
TypeError
exception.
2.
If
description
is
undefined
, let
descString
be
undefined
3.
Else, let
descString
be ?
ToString
description
).
4.
Return a new Symbol whose [[Description]] is
descString
20.4.2
Properties of the Symbol Constructor
The Symbol
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
20.4.2.1
Symbol.asyncIterator
The initial value of
Symbol.asyncIterator
is the well known symbol
@@asyncIterator
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.2
Symbol.for (
key
This function performs the following steps when called:
1.
Let
stringKey
be ?
ToString
key
).
2.
For each element
of the GlobalSymbolRegistry
List
, do
a.
If
SameValue
.[[Key]],
stringKey
) is
true
, return
.[[Symbol]].
3.
Assert
: GlobalSymbolRegistry does not currently contain an entry for
stringKey
4.
Let
newSymbol
be a new Symbol whose [[Description]] is
stringKey
5.
Append the
Record
{ [[Key]]:
stringKey
, [[Symbol]]:
newSymbol
} to the GlobalSymbolRegistry
List
6.
Return
newSymbol
The GlobalSymbolRegistry is an append-only
List
that is globally available. It is shared by all
realms
. Prior to the evaluation of any ECMAScript code, it is initialized as a new empty
List
. Elements of the GlobalSymbolRegistry are
Records
with the structure defined in
Table 59
Table 59: GlobalSymbolRegistry
Record
Fields
Field Name
Value
Usage
[[Key]]
a String
A string key used to globally identify a Symbol.
[[Symbol]]
a Symbol
A symbol that can be retrieved from any
realm
20.4.2.3
Symbol.hasInstance
The initial value of
Symbol.hasInstance
is the well-known symbol
@@hasInstance
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.4
Symbol.isConcatSpreadable
The initial value of
Symbol.isConcatSpreadable
is the well-known symbol
@@isConcatSpreadable
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.5
Symbol.iterator
The initial value of
Symbol.iterator
is the well-known symbol
@@iterator
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.6
Symbol.keyFor (
sym
This function performs the following steps when called:
1.
If
sym
is not a Symbol
, throw a
TypeError
exception.
2.
Return
KeyForSymbol
sym
).
20.4.2.7
Symbol.match
The initial value of
Symbol.match
is the well-known symbol
@@match
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.8
Symbol.matchAll
The initial value of
Symbol.matchAll
is the well-known symbol
@@matchAll
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.9
Symbol.prototype
The initial value of
Symbol.prototype
is the
Symbol prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.10
Symbol.replace
The initial value of
Symbol.replace
is the well-known symbol
@@replace
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.11
Symbol.search
The initial value of
Symbol.search
is the well-known symbol
@@search
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.12
Symbol.species
The initial value of
Symbol.species
is the well-known symbol
@@species
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.13
Symbol.split
The initial value of
Symbol.split
is the well-known symbol
@@split
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.14
Symbol.toPrimitive
The initial value of
Symbol.toPrimitive
is the well-known symbol
@@toPrimitive
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.15
Symbol.toStringTag
The initial value of
Symbol.toStringTag
is the well-known symbol
@@toStringTag
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.2.16
Symbol.unscopables
The initial value of
Symbol.unscopables
is the well-known symbol
@@unscopables
Table 1
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.4.3
Properties of the Symbol Prototype Object
The
Symbol prototype object
is
%Symbol.prototype%
is an
ordinary object
is not a Symbol
instance and does not have a [[SymbolData]] internal slot.
has a [[Prototype]] internal slot whose value is
%Object.prototype%
The abstract operation
thisSymbolValue
takes argument
value
. It performs the following steps when called:
1.
If
value
is a Symbol
, return
value
2.
If
value
is an Object
and
value
has a [[SymbolData]] internal slot, then
a.
Let
be
value
.[[SymbolData]].
b.
Assert
is a Symbol
c.
Return
3.
Throw a
TypeError
exception.
20.4.3.1
Symbol.prototype.constructor
The initial value of
Symbol.prototype.constructor
is
%Symbol%
20.4.3.2
get Symbol.prototype.description
Symbol.prototype.description
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Let
sym
be ?
thisSymbolValue
).
3.
Return
sym
.[[Description]].
20.4.3.3
Symbol.prototype.toString ( )
This method performs the following steps when called:
1.
Let
sym
be ?
thisSymbolValue
this
value).
2.
Return
SymbolDescriptiveString
sym
).
20.4.3.3.1
SymbolDescriptiveString (
sym
The abstract operation SymbolDescriptiveString takes argument
sym
(a Symbol) and returns a String. It performs the following steps when called:
1.
Let
desc
be
sym
's [[Description]] value.
2.
If
desc
is
undefined
, set
desc
to the empty String.
3.
Assert
desc
is a String
4.
Return the
string-concatenation
of
"Symbol("
desc
, and
")"
20.4.3.4
Symbol.prototype.valueOf ( )
This method performs the following steps when called:
1.
Return ?
thisSymbolValue
this
value).
20.4.3.5
Symbol.prototype [ @@toPrimitive ] (
hint
This method is called by ECMAScript language operators to convert a Symbol object to a primitive value.
It performs the following steps when called:
1.
Return ?
thisSymbolValue
this
value).
Note
The argument is ignored.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
The value of the
"name"
property of this method is
"[Symbol.toPrimitive]"
20.4.3.6
Symbol.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Symbol"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
20.4.4
Properties of Symbol Instances
Symbol instances are
ordinary objects
that inherit properties from the
Symbol prototype object
Symbol instances have a [[SymbolData]] internal slot. The
[[SymbolData]] internal slot is the Symbol value represented by this
Symbol object.
20.4.5
Abstract Operations for Symbols
20.4.5.1
KeyForSymbol (
sym
The abstract operation KeyForSymbol takes argument
sym
(a Symbol) and returns a String or
undefined
. If
sym
is in the GlobalSymbolRegistry (see
20.4.2.2
) the String used to register
sym
will be returned. It performs the following steps when called:
1.
For each element
of the GlobalSymbolRegistry
List
, do
a.
If
SameValue
.[[Symbol]],
sym
) is
true
, return
.[[Key]].
2.
Assert
: GlobalSymbolRegistry does not currently contain an entry for
sym
3.
Return
undefined
20.5
Error Objects
Instances of Error objects are thrown as exceptions when runtime
errors occur. The Error objects may also serve as base objects for
user-defined exception classes.
When an ECMAScript implementation detects a runtime error, it throws a new instance of one of the
NativeError
objects defined in
20.5.5
or a new instance of AggregateError object defined in
20.5.7
. Each of these objects has the structure described below, differing only in the name used as the
constructor
name instead of
NativeError
, in the
"name"
property of the prototype object, in the
implementation-defined
"message"
property of the prototype object, and in the presence of the
%AggregateError%
-specific
"errors"
property.
20.5.1
The Error Constructor
The Error
constructor
is
%Error%
is the initial value of the
"Error"
property of the
global object
creates and initializes a new Error object when called as a function rather than as a
constructor
. Thus the function call
Error(…)
is equivalent to the object creation expression
new Error(…)
with the same arguments.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified Error behaviour must include a
super
call to the Error
constructor
to create and initialize subclass instances with an [[ErrorData]] internal slot.
20.5.1.1
Error (
message
[ ,
options
] )
This function performs the following steps when called:
1.
If NewTarget is
undefined
, let
newTarget
be the
active function object
; else let
newTarget
be NewTarget.
2.
Let
be ?
OrdinaryCreateFromConstructor
newTarget
"%Error.prototype%"
, « [[ErrorData]] »).
3.
If
message
is not
undefined
, then
a.
Let
msg
be ?
ToString
message
).
b.
Perform
CreateNonEnumerableDataPropertyOrThrow
"message"
msg
).
4.
Perform ?
InstallErrorCause
options
).
5.
Return
20.5.2
Properties of the Error Constructor
The Error
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
20.5.2.1
Error.prototype
The initial value of
Error.prototype
is the
Error prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.5.3
Properties of the Error Prototype Object
The
Error prototype object
is
%Error.prototype%
is an
ordinary object
is not an Error instance and does not have an [[ErrorData]] internal slot.
has a [[Prototype]] internal slot whose value is
%Object.prototype%
20.5.3.1
Error.prototype.constructor
The initial value of
Error.prototype.constructor
is
%Error%
20.5.3.2
Error.prototype.message
The initial value of
Error.prototype.message
is the empty String.
20.5.3.3
Error.prototype.name
The initial value of
Error.prototype.name
is
"Error"
20.5.3.4
Error.prototype.toString ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
is not an Object
, throw a
TypeError
exception.
3.
Let
name
be ?
Get
"name"
).
4.
If
name
is
undefined
, set
name
to
"Error"
; otherwise set
name
to ?
ToString
name
).
5.
Let
msg
be ?
Get
"message"
).
6.
If
msg
is
undefined
, set
msg
to the empty String; otherwise set
msg
to ?
ToString
msg
).
7.
If
name
is the empty String, return
msg
8.
If
msg
is the empty String, return
name
9.
Return the
string-concatenation
of
name
, the code unit 0x003A (COLON), the code unit 0x0020 (SPACE), and
msg
20.5.4
Properties of Error Instances
Error instances are
ordinary objects
that inherit properties from the
Error prototype object
and have an [[ErrorData]] internal slot whose value is
undefined
. The only specified uses of [[ErrorData]] is to identify Error, AggregateError, and
NativeError
instances as Error objects within
Object.prototype.toString
20.5.5
Native Error Types Used in This Standard
A new instance of one of the
NativeError
objects below or of the AggregateError object is thrown when a runtime error is detected. All
NativeError
objects share the same structure, as described in
20.5.6
20.5.5.1
EvalError
The EvalError
constructor
is
%EvalError%
This exception is not currently used within this
specification. This object remains for compatibility with previous
editions of this specification.
20.5.5.2
RangeError
The RangeError
constructor
is
%RangeError%
Indicates a value that is not in the set or range of allowable values.
20.5.5.3
ReferenceError
The ReferenceError
constructor
is
%ReferenceError%
Indicate that an invalid reference has been detected.
20.5.5.4
SyntaxError
The SyntaxError
constructor
is
%SyntaxError%
Indicates that a parsing error has occurred.
20.5.5.5
TypeError
The TypeError
constructor
is
%TypeError%
TypeError is used to indicate an unsuccessful operation when none of the other
NativeError
objects are an appropriate indication of the failure cause.
20.5.5.6
URIError
The URIError
constructor
is
%URIError%
Indicates that one of the global URI handling functions was used in a way that is incompatible with its definition.
20.5.6
NativeError
Object Structure
When an ECMAScript implementation detects a runtime error, it throws a new instance of one of the
NativeError
objects defined in
20.5.5
. Each of these objects has the structure described below, differing only in the name used as the
constructor
name instead of
NativeError
, in the
"name"
property of the prototype object, and in the
implementation-defined
"message"
property of the prototype object.
For each error object, references to
NativeError
in the definition should be replaced with the appropriate error object name from
20.5.5
20.5.6.1
The
NativeError
Constructors
Each
NativeError
constructor
creates and initializes a new
NativeError
object when called as a function rather than as a
constructor
. A call of the object as a function is equivalent to calling it as a
constructor
with the same arguments. Thus the function call
NativeError
(…)
is equivalent to the object creation expression
new
NativeError
(…)
with the same arguments.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified
NativeError
behaviour must include a
super
call to the
NativeError
constructor
to create and initialize subclass instances with an [[ErrorData]] internal slot.
20.5.6.1.1
NativeError
message
[ ,
options
] )
Each
NativeError
function performs the following steps when called:
1.
If NewTarget is
undefined
, let
newTarget
be the
active function object
; else let
newTarget
be NewTarget.
2.
Let
be ?
OrdinaryCreateFromConstructor
newTarget
"%
NativeError
.prototype%"
, « [[ErrorData]] »).
3.
If
message
is not
undefined
, then
a.
Let
msg
be ?
ToString
message
).
b.
Perform
CreateNonEnumerableDataPropertyOrThrow
"message"
msg
).
4.
Perform ?
InstallErrorCause
options
).
5.
Return
The actual value of the string passed in step
is either
"%EvalError.prototype%"
"%RangeError.prototype%"
"%ReferenceError.prototype%"
"%SyntaxError.prototype%"
"%TypeError.prototype%"
, or
"%URIError.prototype%"
corresponding to which
NativeError
constructor
is being defined.
20.5.6.2
Properties of the
NativeError
Constructors
Each
NativeError
constructor
has a [[Prototype]] internal slot whose value is
%Error%
has a
"name"
property whose value is the String value
NativeError
has the following properties:
20.5.6.2.1
NativeError
.prototype
The initial value of
NativeError
.prototype
is a
NativeError
prototype object (
20.5.6.3
). Each
NativeError
constructor
has a distinct prototype object.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.5.6.3
Properties of the
NativeError
Prototype Objects
Each
NativeError
prototype object
is an
ordinary object
is not an Error instance and does not have an [[ErrorData]] internal slot.
has a [[Prototype]] internal slot whose value is
%Error.prototype%
20.5.6.3.1
NativeError
.prototype.constructor
The initial value of the
"constructor"
property of the prototype for a given
NativeError
constructor
is the corresponding intrinsic object %
NativeError
% (
20.5.6.1
).
20.5.6.3.2
NativeError
.prototype.message
The initial value of the
"message"
property of the prototype for a given
NativeError
constructor
is the empty String.
20.5.6.3.3
NativeError
.prototype.name
The initial value of the
"name"
property of the prototype for a given
NativeError
constructor
is the String value consisting of the name of the
constructor
(the name used instead of
NativeError
).
20.5.6.4
Properties of
NativeError
Instances
NativeError
instances are
ordinary objects
that inherit properties from their
NativeError
prototype object and have an [[ErrorData]] internal slot whose value is
undefined
. The only specified use of [[ErrorData]] is by
Object.prototype.toString
20.1.3.6
) to identify Error, AggregateError, or
NativeError
instances.
20.5.7
AggregateError Objects
20.5.7.1
The AggregateError Constructor
The AggregateError
constructor
is
%AggregateError%
is the initial value of the
"AggregateError"
property of the
global object
creates and initializes a new AggregateError object when called as a function rather than as a
constructor
. Thus the function call
AggregateError(…)
is equivalent to the object creation expression
new AggregateError(…)
with the same arguments.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified AggregateError behaviour must include a
super
call to the AggregateError
constructor
to create and initialize subclass instances with an [[ErrorData]] internal slot.
20.5.7.1.1
AggregateError (
errors
message
[ ,
options
] )
This function performs the following steps when called:
1.
If NewTarget is
undefined
, let
newTarget
be the
active function object
; else let
newTarget
be NewTarget.
2.
Let
be ?
OrdinaryCreateFromConstructor
newTarget
"%AggregateError.prototype%"
, « [[ErrorData]] »).
3.
If
message
is not
undefined
, then
a.
Let
msg
be ?
ToString
message
).
b.
Perform
CreateNonEnumerableDataPropertyOrThrow
"message"
msg
).
4.
Perform ?
InstallErrorCause
options
).
5.
Let
errorsList
be ?
IteratorToList
(?
GetIterator
errors
sync
)).
6.
Perform !
DefinePropertyOrThrow
"errors"
, PropertyDescriptor { [[Configurable]]:
true
, [[Enumerable]]:
false
, [[Writable]]:
true
, [[Value]]:
CreateArrayFromList
errorsList
) }).
7.
Return
20.5.7.2
Properties of the AggregateError Constructor
The AggregateError
constructor
has a [[Prototype]] internal slot whose value is
%Error%
has the following properties:
20.5.7.2.1
AggregateError.prototype
The initial value of
AggregateError.prototype
is
%AggregateError.prototype%
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
20.5.7.3
Properties of the AggregateError Prototype Object
The
AggregateError prototype object
is
%AggregateError.prototype%
is an
ordinary object
is not an Error instance or an AggregateError instance and does not have an [[ErrorData]] internal slot.
has a [[Prototype]] internal slot whose value is
%Error.prototype%
20.5.7.3.1
AggregateError.prototype.constructor
The initial value of
AggregateError.prototype.constructor
is
%AggregateError%
20.5.7.3.2
AggregateError.prototype.message
The initial value of
AggregateError.prototype.message
is the empty String.
20.5.7.3.3
AggregateError.prototype.name
The initial value of
AggregateError.prototype.name
is
"AggregateError"
20.5.7.4
Properties of AggregateError Instances
AggregateError instances are
ordinary objects
that inherit properties from their
AggregateError prototype object
and have an [[ErrorData]] internal slot whose value is
undefined
. The only specified use of [[ErrorData]] is by
Object.prototype.toString
20.1.3.6
) to identify Error, AggregateError, or
NativeError
instances.
20.5.8
Abstract Operations for Error Objects
20.5.8.1
InstallErrorCause (
options
The abstract operation InstallErrorCause takes arguments
(an Object) and
options
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or a
throw completion
. It is used to create a
"cause"
property on
when a
"cause"
property is present on
options
. It performs the following steps when called:
1.
If
options
is an Object
and ?
HasProperty
options
"cause"
) is
true
, then
a.
Let
cause
be ?
Get
options
"cause"
).
b.
Perform
CreateNonEnumerableDataPropertyOrThrow
"cause"
cause
).
2.
Return
unused
21
Numbers and Dates
21.1
Number Objects
21.1.1
The Number Constructor
The Number
constructor
is
%Number%
is the initial value of the
"Number"
property of the
global object
creates and initializes a new Number object when called as a
constructor
performs a type conversion when called as a function rather than as a
constructor
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified Number behaviour must include a
super
call to the Number
constructor
to create and initialize the subclass instance with a [[NumberData]] internal slot.
21.1.1.1
Number (
value
This function performs the following steps when called:
1.
If
value
is present, then
a.
Let
prim
be ?
ToNumeric
value
).
b.
If
prim
is a BigInt
, let
be
prim
)).
c.
Otherwise, let
be
prim
2.
Else,
a.
Let
be
+0
3.
If NewTarget is
undefined
, return
4.
Let
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%Number.prototype%"
, « [[NumberData]] »).
5.
Set
.[[NumberData]] to
6.
Return
21.1.2
Properties of the Number Constructor
The Number
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
21.1.2.1
Number.EPSILON
The value of
Number.EPSILON
is the
Number value for
the magnitude of the difference between 1 and the smallest value
greater than 1 that is representable as a Number value, which is
approximately 2.2204460492503130808472633361816 × 10
-16
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.1.2.2
Number.isFinite (
number
This function performs the following steps when called:
1.
If
number
is not a Number
, return
false
2.
If
number
is not
finite
, return
false
3.
Otherwise, return
true
21.1.2.3
Number.isInteger (
number
This function performs the following steps when called:
1.
Return
IsIntegralNumber
number
).
21.1.2.4
Number.isNaN (
number
This function performs the following steps when called:
1.
If
number
is not a Number
, return
false
2.
If
number
is
NaN
, return
true
3.
Otherwise, return
false
Note
This function differs from the global isNaN function (
19.2.3
) in that it does not convert its argument to a Number before determining whether it is
NaN
21.1.2.5
Number.isSafeInteger (
number
Note
An
integer
is considered "
safe
" if and only if the
Number value for
is not the
Number value for
any other
integer
This function performs the following steps when called:
1.
If
IsIntegralNumber
number
) is
true
, then
a.
If
abs
number
)) ≤ 2
53
- 1, return
true
2.
Return
false
21.1.2.6
Number.MAX_SAFE_INTEGER
Note
Due to rounding behaviour necessitated by precision limitations of
IEEE 754-2019
, the
Number value for
every
integer
greater than
Number.MAX_SAFE_INTEGER
is shared with at least one other
integer
. Such large-magnitude
integers
are therefore not
safe
and are not guaranteed to be exactly representable as Number values or
even to be distinguishable from each other. For example, both
9007199254740992
and
9007199254740993
evaluate to the Number value
9007199254740992
The value of
Number.MAX_SAFE_INTEGER
is
9007199254740991
(2
53
- 1)).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.1.2.7
Number.MAX_VALUE
The value of
Number.MAX_VALUE
is the largest positive
finite
value of the
Number type
, which is approximately
1.7976931348623157 × 10
308
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.1.2.8
Number.MIN_SAFE_INTEGER
Note
Due to rounding behaviour necessitated by precision limitations of
IEEE 754-2019
, the
Number value for
every
integer
less than
Number.MIN_SAFE_INTEGER
is shared with at least one other
integer
. Such large-magnitude
integers
are therefore not
safe
and are not guaranteed to be exactly representable as Number values or
even to be distinguishable from each other. For example, both
-9007199254740992
and
-9007199254740993
evaluate to the Number value
-9007199254740992
The value of
Number.MIN_SAFE_INTEGER
is
-9007199254740991
(-(2
53
- 1))).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.1.2.9
Number.MIN_VALUE
The value of
Number.MIN_VALUE
is the smallest positive value of the
Number type
, which is approximately
5 × 10
-324
In the
IEEE 754-2019
double precision binary representation, the smallest possible value is a
denormalized number. If an implementation does not support denormalized
values, the value of
Number.MIN_VALUE
must be the smallest non-zero positive value that can actually be represented by the implementation.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.1.2.10
Number.NaN
The value of
Number.NaN
is
NaN
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.1.2.11
Number.NEGATIVE_INFINITY
The value of
Number.NEGATIVE_INFINITY
is
-∞
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.1.2.12
Number.parseFloat (
string
The initial value of the
"parseFloat"
property is
%parseFloat%
21.1.2.13
Number.parseInt (
string
radix
The initial value of the
"parseInt"
property is
%parseInt%
21.1.2.14
Number.POSITIVE_INFINITY
The value of
Number.POSITIVE_INFINITY
is
+∞
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.1.2.15
Number.prototype
The initial value of
Number.prototype
is the
Number prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.1.3
Properties of the Number Prototype Object
The
Number prototype object
is
%Number.prototype%
is an
ordinary object
is itself a Number object; it has a [[NumberData]] internal slot with the value
+0
has a [[Prototype]] internal slot whose value is
%Object.prototype%
Unless explicitly stated otherwise, the methods of the Number prototype object defined below are not generic and the
this
value passed to them must be either a Number value or an object that
has a [[NumberData]] internal slot that has been initialized to a Number
value.
The abstract operation
thisNumberValue
takes argument
value
. It performs the following steps when called:
1.
If
value
is a Number
, return
value
2.
If
value
is an Object
and
value
has a [[NumberData]] internal slot, then
a.
Let
be
value
.[[NumberData]].
b.
Assert
is a Number
c.
Return
3.
Throw a
TypeError
exception.
The phrase “this Number value” within the specification of a
method refers to the result returned by calling the abstract operation
thisNumberValue
with the
this
value of the method invocation passed as the argument.
21.1.3.1
Number.prototype.constructor
The initial value of
Number.prototype.constructor
is
%Number%
21.1.3.2
Number.prototype.toExponential (
fractionDigits
This method returns a String containing this Number value
represented in decimal exponential notation with one digit before the
significand's decimal point and
fractionDigits
digits after the significand's decimal point. If
fractionDigits
is
undefined
, it includes as many significand digits as necessary to uniquely specify the Number (just like in
ToString
except that in this case the Number is always output in exponential notation).
It performs the following steps when called:
1.
Let
be ?
thisNumberValue
this
value).
2.
Let
be ?
ToIntegerOrInfinity
fractionDigits
).
3.
Assert
: If
fractionDigits
is
undefined
, then
is 0.
4.
If
is not
finite
, return
Number::toString
, 10).
5.
If
< 0 or
> 100, throw a
RangeError
exception.
6.
Set
to
).
7.
Let
be the empty String.
8.
If
< 0, then
a.
Set
to
"-"
b.
Set
to -
9.
If
= 0, then
a.
Let
be the String value consisting of
+ 1 occurrences of the code unit 0x0030 (DIGIT ZERO).
b.
Let
be 0.
10.
Else,
a.
If
fractionDigits
is not
undefined
, then
i.
Let
and
be
integers
such that 10
< 10
+ 1
and for which
× 10
is as close to zero as possible. If there are two such sets of
and
, pick the
and
for which
× 10
is larger.
b.
Else,
i.
Let
, and
be
integers
such that
≥ 0, 10
< 10
+ 1
× 10
) is
), and
is as small as possible. Note that the decimal representation of
has
+ 1 digits,
is not divisible by 10, and the least significant digit of
is not necessarily uniquely determined by these criteria.
c.
Let
be the String value consisting of the digits of the decimal representation of
(in order, with no leading zeroes).
11.
If
≠ 0, then
a.
Let
be the first code unit of
b.
Let
be the other
code units of
c.
Set
to the
string-concatenation
of
"."
, and
12.
If
= 0, then
a.
Let
be
"+"
b.
Let
be
"0"
13.
Else,
a.
If
> 0, let
be
"+"
b.
Else,
i.
Assert
< 0.
ii.
Let
be
"-"
iii.
Set
to -
c.
Let
be the String value consisting of the digits of the decimal representation of
(in order, with no leading zeroes).
14.
Set
to the
string-concatenation
of
"e"
, and
15.
Return the
string-concatenation
of
and
Note
For implementations that provide more accurate conversions
than required by the rules above, it is recommended that the following
alternative version of step
10.b.i
be used as a guideline:
i.
Let
, and
be
integers
such that
≥ 0, 10
< 10
+ 1
× 10
) is
), and
is as small as possible. If there are multiple possibilities for
, choose the value of
for which
× 10
) is closest in value to
). If there are two such possible values of
, choose the one that is even.
21.1.3.3
Number.prototype.toFixed (
fractionDigits
Note 1
This method returns a String containing this Number value represented in decimal fixed-point notation with
fractionDigits
digits after the decimal point. If
fractionDigits
is
undefined
, 0 is assumed.
It performs the following steps when called:
1.
Let
be ?
thisNumberValue
this
value).
2.
Let
be ?
ToIntegerOrInfinity
fractionDigits
).
3.
Assert
: If
fractionDigits
is
undefined
, then
is 0.
4.
If
is not
finite
, throw a
RangeError
exception.
5.
If
< 0 or
> 100, throw a
RangeError
exception.
6.
If
is not
finite
, return
Number::toString
, 10).
7.
Set
to
).
8.
Let
be the empty String.
9.
If
< 0, then
a.
Set
to
"-"
b.
Set
to -
10.
If
≥ 10
21
, then
a.
Let
be !
ToString
)).
11.
Else,
a.
Let
be an
integer
for which
/ 10
is as close to zero as possible. If there are two such
, pick the larger
b.
If
= 0, let
be
"0"
. Otherwise, let
be the String value consisting of the digits of the decimal representation of
(in order, with no leading zeroes).
c.
If
≠ 0, then
i.
Let
be the length of
ii.
If
, then
1.
Let
be the String value consisting of
+ 1 -
occurrences of the code unit 0x0030 (DIGIT ZERO).
2.
Set
to the
string-concatenation
of
and
3.
Set
to
+ 1.
iii.
Let
be the first
code units of
iv.
Let
be the other
code units of
v.
Set
to the
string-concatenation
of
"."
, and
12.
Return the
string-concatenation
of
and
Note 2
The output of
toFixed
may be more precise than
toString
for some values because toString only prints enough significant digits
to distinguish the number from adjacent Number values. For example,
(1000000000000000128).toString()
returns
"1000000000000000100"
, while
(1000000000000000128).toFixed(0)
returns
"1000000000000000128"
21.1.3.4
Number.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
An ECMAScript implementation that includes the ECMA-402
Internationalization API must implement this method as specified in the
ECMA-402 specification. If an ECMAScript implementation does not include
the ECMA-402 API the following specification of this method is used:
This method produces a String value that represents this Number value formatted according to the conventions of the
host environment
's current locale. This method is
implementation-defined
, and it is permissible, but not encouraged, for it to return the same thing as
toString
The meanings of the optional parameters to this method are
defined in the ECMA-402 specification; implementations that do not
include ECMA-402 support must not use those parameter positions for
anything else.
21.1.3.5
Number.prototype.toPrecision (
precision
This method returns a String containing this Number value
represented either in decimal exponential notation with one digit before
the significand's decimal point and
precision
- 1
digits after the significand's decimal point or in decimal fixed notation with
precision
significant digits. If
precision
is
undefined
, it calls
ToString
instead.
It performs the following steps when called:
1.
Let
be ?
thisNumberValue
this
value).
2.
If
precision
is
undefined
, return !
ToString
).
3.
Let
be ?
ToIntegerOrInfinity
precision
).
4.
If
is not
finite
, return
Number::toString
, 10).
5.
If
< 1 or
> 100, throw a
RangeError
exception.
6.
Set
to
).
7.
Let
be the empty String.
8.
If
< 0, then
a.
Set
to the code unit 0x002D (HYPHEN-MINUS).
b.
Set
to -
9.
If
= 0, then
a.
Let
be the String value consisting of
occurrences of the code unit 0x0030 (DIGIT ZERO).
b.
Let
be 0.
10.
Else,
a.
Let
and
be
integers
such that 10
- 1
< 10
and for which
× 10
+ 1
is as close to zero as possible. If there are two such sets of
and
, pick the
and
for which
× 10
+ 1
is larger.
b.
Let
be the String value consisting of the digits of the decimal representation of
(in order, with no leading zeroes).
c.
If
< -6 or
, then
i.
Assert
≠ 0.
ii.
If
≠ 1, then
1.
Let
be the first code unit of
2.
Let
be the other
- 1 code units of
3.
Set
to the
string-concatenation
of
"."
, and
iii.
If
> 0, then
1.
Let
be the code unit 0x002B (PLUS SIGN).
iv.
Else,
1.
Assert
< 0.
2.
Let
be the code unit 0x002D (HYPHEN-MINUS).
3.
Set
to -
v.
Let
be the String value consisting of the digits of the decimal representation of
(in order, with no leading zeroes).
vi.
Return the
string-concatenation
of
, the code unit 0x0065 (LATIN SMALL LETTER E),
, and
11.
If
- 1, return the
string-concatenation
of
and
12.
If
≥ 0, then
a.
Set
to the
string-concatenation
of the first
+ 1 code units of
, the code unit 0x002E (FULL STOP), and the remaining
- (
+ 1) code units of
13.
Else,
a.
Set
to the
string-concatenation
of the code unit 0x0030 (DIGIT ZERO), the code unit 0x002E (FULL STOP), -(
+ 1) occurrences of the code unit 0x0030 (DIGIT ZERO), and the String
14.
Return the
string-concatenation
of
and
21.1.3.6
Number.prototype.toString ( [
radix
] )
Note
The optional
radix
should be an
integral Number
value in the
inclusive interval
from
to
36
. If
radix
is
undefined
then
10
is used as the value of
radix
This method performs the following steps when called:
1.
Let
be ?
thisNumberValue
this
value).
2.
If
radix
is
undefined
, let
radixMV
be 10.
3.
Else, let
radixMV
be ?
ToIntegerOrInfinity
radix
).
4.
If
radixMV
is not in the
inclusive interval
from 2 to 36, throw a
RangeError
exception.
5.
Return
Number::toString
radixMV
).
This method is not generic; it throws a
TypeError
exception if its
this
value
is not a Number
or a Number object. Therefore, it cannot be transferred to other kinds of objects for use as a method.
The
"length"
property of this method is
21.1.3.7
Number.prototype.valueOf ( )
1.
Return ?
thisNumberValue
this
value).
21.1.4
Properties of Number Instances
Number instances are
ordinary objects
that inherit properties from the
Number prototype object
Number instances also have a [[NumberData]] internal slot. The
[[NumberData]] internal slot is the Number value represented by this
Number object.
21.2
BigInt Objects
21.2.1
The BigInt Constructor
The BigInt
constructor
is
%BigInt%
is the initial value of the
"BigInt"
property of the
global object
performs a type conversion when called as a function rather than as a
constructor
is not intended to be used with the
new
operator or to be subclassed. It may be used as the value of an
extends
clause of a class definition but a
super
call to the BigInt
constructor
will cause an exception.
21.2.1.1
BigInt (
value
This function performs the following steps when called:
1.
If NewTarget is not
undefined
, throw a
TypeError
exception.
2.
Let
prim
be ?
ToPrimitive
value
number
).
3.
If
prim
is a Number
, return ?
NumberToBigInt
prim
).
4.
Otherwise, return ?
ToBigInt
prim
).
21.2.1.1.1
NumberToBigInt (
number
The abstract operation NumberToBigInt takes argument
number
(a Number) and returns either a
normal completion containing
a BigInt or a
throw completion
. It performs the following steps when called:
1.
If
IsIntegralNumber
number
) is
false
, throw a
RangeError
exception.
2.
Return the BigInt value that represents
number
).
21.2.2
Properties of the BigInt Constructor
The BigInt
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
21.2.2.1
BigInt.asIntN (
bits
bigint
This function performs the following steps when called:
1.
Set
bits
to ?
ToIndex
bits
).
2.
Set
bigint
to ?
ToBigInt
bigint
).
3.
Let
mod
be
bigint
modulo
bits
4.
If
mod
≥ 2
bits
- 1
, return
mod
- 2
bits
); otherwise, return
mod
).
21.2.2.2
BigInt.asUintN (
bits
bigint
This function performs the following steps when called:
1.
Set
bits
to ?
ToIndex
bits
).
2.
Set
bigint
to ?
ToBigInt
bigint
).
3.
Return the BigInt value that represents
bigint
modulo
bits
21.2.2.3
BigInt.prototype
The initial value of
BigInt.prototype
is the
BigInt prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.2.3
Properties of the BigInt Prototype Object
The
BigInt prototype object
is
%BigInt.prototype%
is an
ordinary object
is not a BigInt
object; it does not have a [[BigIntData]] internal slot.
has a [[Prototype]] internal slot whose value is
%Object.prototype%
The abstract operation
thisBigIntValue
takes argument
value
. It performs the following steps when called:
1.
If
value
is a BigInt
, return
value
2.
If
value
is an Object
and
value
has a [[BigIntData]] internal slot, then
a.
Assert
value
.[[BigIntData]]
is a BigInt
b.
Return
value
.[[BigIntData]].
3.
Throw a
TypeError
exception.
The phrase “this BigInt value” within the specification of a
method refers to the result returned by calling the abstract operation
thisBigIntValue
with the
this
value of the method invocation passed as the argument.
21.2.3.1
BigInt.prototype.constructor
The initial value of
BigInt.prototype.constructor
is
%BigInt%
21.2.3.2
BigInt.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
An ECMAScript implementation that includes the ECMA-402
Internationalization API must implement this method as specified in the
ECMA-402 specification. If an ECMAScript implementation does not include
the ECMA-402 API the following specification of this method is used:
This method produces a String value that represents this BigInt value formatted according to the conventions of the
host environment
's current locale. This method is
implementation-defined
, and it is permissible, but not encouraged, for it to return the same thing as
toString
The meanings of the optional parameters to this method are
defined in the ECMA-402 specification; implementations that do not
include ECMA-402 support must not use those parameter positions for
anything else.
21.2.3.3
BigInt.prototype.toString ( [
radix
] )
Note
The optional
radix
should be an
integral Number
value in the
inclusive interval
from
to
36
. If
radix
is
undefined
then
10
is used as the value of
radix
This method performs the following steps when called:
1.
Let
be ?
thisBigIntValue
this
value).
2.
If
radix
is
undefined
, let
radixMV
be 10.
3.
Else, let
radixMV
be ?
ToIntegerOrInfinity
radix
).
4.
If
radixMV
is not in the
inclusive interval
from 2 to 36, throw a
RangeError
exception.
5.
Return
BigInt::toString
radixMV
).
This method is not generic; it throws a
TypeError
exception if its
this
value
is not a BigInt
or a BigInt object. Therefore, it cannot be transferred to other kinds of objects for use as a method.
21.2.3.4
BigInt.prototype.valueOf ( )
1.
Return ?
thisBigIntValue
this
value).
21.2.3.5
BigInt.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"BigInt"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
21.3
The Math Object
The Math object:
is
%Math%
is the initial value of the
"Math"
property of the
global object
is an
ordinary object
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is not a
function object
does not have a [[Construct]] internal method; it cannot be used as a
constructor
with the
new
operator.
does not have a [[Call]] internal method; it cannot be invoked as a function.
Note
In this specification, the phrase “the
Number value for
” has a technical meaning defined in
6.1.6.1
21.3.1
Value Properties of the Math Object
21.3.1.1
Math.E
The
Number value for
, the base of the natural logarithms, which is approximately 2.7182818284590452354.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.3.1.2
Math.LN10
The
Number value for
the natural logarithm of 10, which is approximately 2.302585092994046.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.3.1.3
Math.LN2
The
Number value for
the natural logarithm of 2, which is approximately 0.6931471805599453.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.3.1.4
Math.LOG10E
The
Number value for
the base-10 logarithm of
, the base of the natural logarithms; this value is approximately 0.4342944819032518.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
Note
The value of
Math.LOG10E
is approximately the reciprocal of the value of
Math.LN10
21.3.1.5
Math.LOG2E
The
Number value for
the base-2 logarithm of
, the base of the natural logarithms; this value is approximately 1.4426950408889634.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
Note
The value of
Math.LOG2E
is approximately the reciprocal of the value of
Math.LN2
21.3.1.6
Math.PI
The
Number value for
π, the ratio of the circumference of a circle to its diameter, which is approximately 3.1415926535897932.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.3.1.7
Math.SQRT1_2
The
Number value for
the square root of ½, which is approximately 0.7071067811865476.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
Note
The value of
Math.SQRT1_2
is approximately the reciprocal of the value of
Math.SQRT2
21.3.1.8
Math.SQRT2
The
Number value for
the square root of 2, which is approximately 1.4142135623730951.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.3.1.9
Math [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Math"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
21.3.2
Function Properties of the Math Object
Note
The behaviour of the functions
acos
acosh
asin
asinh
atan
atanh
atan2
cbrt
cos
cosh
exp
expm1
hypot
log
log1p
log2
log10
pow
random
sin
sinh
sqrt
tan
, and
tanh
is not precisely specified here except to require specific results for
certain argument values that represent boundary cases of interest. For
other argument values, these functions are intended to compute
approximations to the results of familiar mathematical functions, but
some latitude is allowed in the choice of approximation algorithms. The
general intent is that an implementer should be able to use the same
mathematical library for ECMAScript on a given hardware platform that is
available to C programmers on that platform.
Although the choice of algorithms is left to the
implementation, it is recommended (but not specified by this standard)
that implementations use the approximation algorithms for
IEEE 754-2019
arithmetic contained in
fdlibm
, the freely distributable mathematical library from Sun Microsystems (
).
21.3.2.1
Math.abs (
This function returns the absolute value of
; the result has the same magnitude as
but has positive sign.
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is
NaN
, return
NaN
3.
If
is
-0
, return
+0
4.
If
is
-∞
, return
+∞
5.
If
-0
, return -
6.
Return
21.3.2.2
Math.acos (
This function returns the inverse cosine of
. The result is expressed in radians and is in the
inclusive interval
from
+0
to
(π).
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is
NaN
, or
-1
, return
NaN
3.
If
is
, return
+0
4.
Return an
implementation-approximated
Number value representing the result of the inverse cosine of
).
21.3.2.3
Math.acosh (
This function returns the inverse hyperbolic cosine of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is either
NaN
or
+∞
, return
3.
If
is
, return
+0
4.
If
, return
NaN
5.
Return an
implementation-approximated
Number value representing the result of the inverse hyperbolic cosine of
).
21.3.2.4
Math.asin (
This function returns the inverse sine of
. The result is expressed in radians and is in the
inclusive interval
from
(-π / 2) to
(π / 2).
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is one of
NaN
+0
, or
-0
, return
3.
If
or
-1
, return
NaN
4.
Return an
implementation-approximated
Number value representing the result of the inverse sine of
).
21.3.2.5
Math.asinh (
This function returns the inverse hyperbolic sine of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is not
finite
or
is either
+0
or
-0
, return
3.
Return an
implementation-approximated
Number value representing the result of the inverse hyperbolic sine of
).
21.3.2.6
Math.atan (
This function returns the inverse tangent of
. The result is expressed in radians and is in the
inclusive interval
from
(-π / 2) to
(π / 2).
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is one of
NaN
+0
, or
-0
, return
3.
If
is
+∞
, return an
implementation-approximated
Number value representing π / 2.
4.
If
is
-∞
, return an
implementation-approximated
Number value representing -π / 2.
5.
Return an
implementation-approximated
Number value representing the result of the inverse tangent of
).
21.3.2.7
Math.atanh (
This function returns the inverse hyperbolic tangent of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is one of
NaN
+0
, or
-0
, return
3.
If
or
-1
, return
NaN
4.
If
is
, return
+∞
5.
If
is
-1
, return
-∞
6.
Return an
implementation-approximated
Number value representing the result of the inverse hyperbolic tangent of
).
21.3.2.8
Math.atan2 (
This function returns the inverse tangent of the quotient
of the arguments
and
, where the signs of
and
are used to determine the quadrant of the result. Note that it is
intentional and traditional for the two-argument inverse tangent
function that the argument named
be first and the argument named
be second. The result is expressed in radians and is in the
inclusive interval
from -π to +π.
It performs the following steps when called:
1.
Let
ny
be ?
ToNumber
).
2.
Let
nx
be ?
ToNumber
).
3.
If
ny
is
NaN
or
nx
is
NaN
, return
NaN
4.
If
ny
is
+∞
, then
a.
If
nx
is
+∞
, return an
implementation-approximated
Number value representing π / 4.
b.
If
nx
is
-∞
, return an
implementation-approximated
Number value representing 3π / 4.
c.
Return an
implementation-approximated
Number value representing π / 2.
5.
If
ny
is
-∞
, then
a.
If
nx
is
+∞
, return an
implementation-approximated
Number value representing -π / 4.
b.
If
nx
is
-∞
, return an
implementation-approximated
Number value representing -3π / 4.
c.
Return an
implementation-approximated
Number value representing -π / 2.
6.
If
ny
is
+0
, then
a.
If
nx
+0
or
nx
is
+0
, return
+0
b.
Return an
implementation-approximated
Number value representing π.
7.
If
ny
is
-0
, then
a.
If
nx
+0
or
nx
is
+0
, return
-0
b.
Return an
implementation-approximated
Number value representing -π.
8.
Assert
ny
is
finite
and is neither
+0
nor
-0
9.
If
ny
+0
, then
a.
If
nx
is
+∞
, return
+0
b.
If
nx
is
-∞
, return an
implementation-approximated
Number value representing π.
c.
If
nx
is either
+0
or
-0
, return an
implementation-approximated
Number value representing π / 2.
10.
If
ny
-0
, then
a.
If
nx
is
+∞
, return
-0
b.
If
nx
is
-∞
, return an
implementation-approximated
Number value representing -π.
c.
If
nx
is either
+0
or
-0
, return an
implementation-approximated
Number value representing -π / 2.
11.
Assert
nx
is
finite
and is neither
+0
nor
-0
12.
Return an
implementation-approximated
Number value representing the result of the inverse tangent of the quotient
ny
) /
nx
).
21.3.2.9
Math.cbrt (
This function returns the cube root of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is not
finite
or
is either
+0
or
-0
, return
3.
Return an
implementation-approximated
Number value representing the result of the cube root of
).
21.3.2.10
Math.ceil (
This function returns the smallest (closest to -∞)
integral Number
value that is not less than
. If
is already an
integral Number
, the result is
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is not
finite
or
is either
+0
or
-0
, return
3.
If
-0
and
-1
, return
-0
4.
If
is an
integral Number
, return
5.
Return the smallest (closest to -∞)
integral Number
value that is not less than
Note
The value of
Math.ceil(x)
is the same as the value of
-Math.floor(-x)
21.3.2.11
Math.clz32 (
This function performs the following steps when called:
1.
Let
be ?
ToUint32
).
2.
Let
be the number of leading zero bits in the unsigned 32-bit binary representation of
3.
Return
).
Note
If
is either
+0
or
-0
, this method returns
32
. If the most significant bit of the 32-bit binary encoding of
is 1, this method returns
+0
21.3.2.12
Math.cos (
This function returns the cosine of
. The argument is expressed in radians.
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is not
finite
, return
NaN
3.
If
is either
+0
or
-0
, return
4.
Return an
implementation-approximated
Number value representing the result of the cosine of
).
21.3.2.13
Math.cosh (
This function returns the hyperbolic cosine of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is
NaN
, return
NaN
3.
If
is either
+∞
or
-∞
, return
+∞
4.
If
is either
+0
or
-0
, return
5.
Return an
implementation-approximated
Number value representing the result of the hyperbolic cosine of
).
Note
The value of
Math.cosh(x)
is the same as the value of
(Math.exp(x) + Math.exp(-x)) / 2
21.3.2.14
Math.exp (
This function returns the exponential function of
raised to the power of
, where
is the base of the natural logarithms).
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is either
NaN
or
+∞
, return
3.
If
is either
+0
or
-0
, return
4.
If
is
-∞
, return
+0
5.
Return an
implementation-approximated
Number value representing the result of the exponential function of
).
21.3.2.15
Math.expm1 (
This function returns the result of subtracting 1 from the exponential function of
raised to the power of
, where
is the base of the natural logarithms). The result is computed in a way that is accurate even when the value of
is close to 0.
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is one of
NaN
+0
-0
, or
+∞
, return
3.
If
is
-∞
, return
-1
4.
Return an
implementation-approximated
Number value representing the result of subtracting 1 from the exponential function of
).
21.3.2.16
Math.floor (
This function returns the greatest (closest to +∞)
integral Number
value that is not greater than
. If
is already an
integral Number
, the result is
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is not
finite
or
is either
+0
or
-0
, return
3.
If
and
+0
, return
+0
4.
If
is an
integral Number
, return
5.
Return the greatest (closest to +∞)
integral Number
value that is not greater than
Note
The value of
Math.floor(x)
is the same as the value of
-Math.ceil(-x)
21.3.2.17
Math.fround (
This function performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is
NaN
, return
NaN
3.
If
is one of
+0
-0
+∞
, or
-∞
, return
4.
Let
n32
be the result of converting
to a value in
IEEE 754-2019
binary32 format using roundTiesToEven mode.
5.
Let
n64
be the result of converting
n32
to a value in
IEEE 754-2019
binary64 format.
6.
Return the ECMAScript Number value corresponding to
n64
21.3.2.18
Math.hypot ( ...
args
Given zero or more arguments, this function returns the square root of the sum of squares of its arguments.
It performs the following steps when called:
1.
Let
coerced
be a new empty
List
2.
For each element
arg
of
args
, do
a.
Let
be ?
ToNumber
arg
).
b.
Append
to
coerced
3.
For each element
number
of
coerced
, do
a.
If
number
is either
+∞
or
-∞
, return
+∞
4.
Let
onlyZero
be
true
5.
For each element
number
of
coerced
, do
a.
If
number
is
NaN
, return
NaN
b.
If
number
is neither
+0
nor
-0
, set
onlyZero
to
false
6.
If
onlyZero
is
true
, return
+0
7.
Return an
implementation-approximated
Number value representing the square root of the sum of squares of the
mathematical values
of the elements of
coerced
The
"length"
property of this function is
Note
Implementations should take care to avoid the loss of
precision from overflows and underflows that are prone to occur in naive
implementations when this function is called with two or more
arguments.
21.3.2.19
Math.imul (
This function performs the following steps when called:
1.
Let
be
(?
ToUint32
)).
2.
Let
be
(?
ToUint32
)).
3.
Let
product
be (
modulo
32
4.
If
product
≥ 2
31
, return
product
- 2
32
); otherwise return
product
).
21.3.2.20
Math.log (
This function returns the natural logarithm of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is either
NaN
or
+∞
, return
3.
If
is
, return
+0
4.
If
is either
+0
or
-0
, return
-∞
5.
If
-0
, return
NaN
6.
Return an
implementation-approximated
Number value representing the result of the natural logarithm of
).
21.3.2.21
Math.log1p (
This function returns the natural logarithm of 1 +
. The result is computed in a way that is accurate even when the value of x is close to zero.
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is one of
NaN
+0
-0
, or
+∞
, return
3.
If
is
-1
, return
-∞
4.
If
-1
, return
NaN
5.
Return an
implementation-approximated
Number value representing the result of the natural logarithm of 1 +
).
21.3.2.22
Math.log10 (
This function returns the base 10 logarithm of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is either
NaN
or
+∞
, return
3.
If
is
, return
+0
4.
If
is either
+0
or
-0
, return
-∞
5.
If
-0
, return
NaN
6.
Return an
implementation-approximated
Number value representing the result of the base 10 logarithm of
).
21.3.2.23
Math.log2 (
This function returns the base 2 logarithm of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is either
NaN
or
+∞
, return
3.
If
is
, return
+0
4.
If
is either
+0
or
-0
, return
-∞
5.
If
-0
, return
NaN
6.
Return an
implementation-approximated
Number value representing the result of the base 2 logarithm of
).
21.3.2.24
Math.max ( ...
args
Given zero or more arguments, this function calls
ToNumber
on each of the arguments and returns the largest of the resulting values.
It performs the following steps when called:
1.
Let
coerced
be a new empty
List
2.
For each element
arg
of
args
, do
a.
Let
be ?
ToNumber
arg
).
b.
Append
to
coerced
3.
Let
highest
be
-∞
4.
For each element
number
of
coerced
, do
a.
If
number
is
NaN
, return
NaN
b.
If
number
is
+0
and
highest
is
-0
, set
highest
to
+0
c.
If
number
highest
, set
highest
to
number
5.
Return
highest
Note
The comparison of values to determine the largest value is done using the
IsLessThan
algorithm except that
+0
is considered to be larger than
-0
The
"length"
property of this function is
21.3.2.25
Math.min ( ...
args
Given zero or more arguments, this function calls
ToNumber
on each of the arguments and returns the smallest of the resulting values.
It performs the following steps when called:
1.
Let
coerced
be a new empty
List
2.
For each element
arg
of
args
, do
a.
Let
be ?
ToNumber
arg
).
b.
Append
to
coerced
3.
Let
lowest
be
+∞
4.
For each element
number
of
coerced
, do
a.
If
number
is
NaN
, return
NaN
b.
If
number
is
-0
and
lowest
is
+0
, set
lowest
to
-0
c.
If
number
lowest
, set
lowest
to
number
5.
Return
lowest
Note
The comparison of values to determine the largest value is done using the
IsLessThan
algorithm except that
+0
is considered to be larger than
-0
The
"length"
property of this function is
21.3.2.26
Math.pow (
base
exponent
This function performs the following steps when called:
1.
Set
base
to ?
ToNumber
base
).
2.
Set
exponent
to ?
ToNumber
exponent
).
3.
Return
Number::exponentiate
base
exponent
).
21.3.2.27
Math.random ( )
This function returns a Number value with positive sign, greater than or equal to
+0
but strictly less than
, chosen randomly or pseudo randomly with approximately uniform distribution over that range, using an
implementation-defined
algorithm or strategy.
Each
Math.random
function created for distinct
realms
must produce a distinct sequence of values from successive calls.
21.3.2.28
Math.round (
This function returns the Number value that is closest to
and is integral. If two
integral Numbers
are equally close to
, then the result is the Number value that is closer to +∞. If
is already integral, the result is
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is not
finite
or
is an
integral Number
, return
3.
If
0.5
and
+0
, return
+0
4.
If
-0
and
-0.5
, return
-0
5.
Return the
integral Number
closest to
, preferring the Number closer to +∞ in the case of a tie.
Note 1
Math.round(3.5)
returns 4, but
Math.round(-3.5)
returns -3.
Note 2
The value of
Math.round(x)
is not always the same as the value of
Math.floor(x + 0.5)
. When
is
-0
or
is less than
+0
but greater than or equal to
-0.5
Math.round(x)
returns
-0
, but
Math.floor(x + 0.5)
returns
+0
Math.round(x)
may also differ from the value of
Math.floor(x + 0.5)
because of internal rounding when computing
x + 0.5
21.3.2.29
Math.sign (
This function returns the sign of
, indicating whether
is positive, negative, or zero.
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is one of
NaN
+0
, or
-0
, return
3.
If
-0
, return
-1
4.
Return
21.3.2.30
Math.sin (
This function returns the sine of
. The argument is expressed in radians.
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is one of
NaN
+0
, or
-0
, return
3.
If
is either
+∞
or
-∞
, return
NaN
4.
Return an
implementation-approximated
Number value representing the result of the sine of
).
21.3.2.31
Math.sinh (
This function returns the hyperbolic sine of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is not
finite
or
is either
+0
or
-0
, return
3.
Return an
implementation-approximated
Number value representing the result of the hyperbolic sine of
).
Note
The value of
Math.sinh(x)
is the same as the value of
(Math.exp(x) - Math.exp(-x)) / 2
21.3.2.32
Math.sqrt (
This function returns the square root of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is one of
NaN
+0
-0
, or
+∞
, return
3.
If
-0
, return
NaN
4.
Return an
implementation-approximated
Number value representing the result of the square root of
).
21.3.2.33
Math.tan (
This function returns the tangent of
. The argument is expressed in radians.
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is one of
NaN
+0
, or
-0
, return
3.
If
is either
+∞
or
-∞
, return
NaN
4.
Return an
implementation-approximated
Number value representing the result of the tangent of
).
21.3.2.34
Math.tanh (
This function returns the hyperbolic tangent of
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is one of
NaN
+0
, or
-0
, return
3.
If
is
+∞
, return
4.
If
is
-∞
, return
-1
5.
Return an
implementation-approximated
Number value representing the result of the hyperbolic tangent of
).
Note
The value of
Math.tanh(x)
is the same as the value of
(Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))
21.3.2.35
Math.trunc (
This function returns the integral part of the number
, removing any fractional digits. If
is already integral, the result is
It performs the following steps when called:
1.
Let
be ?
ToNumber
).
2.
If
is not
finite
or
is either
+0
or
-0
, return
3.
If
and
+0
, return
+0
4.
If
-0
and
-1
, return
-0
5.
Return the
integral Number
nearest
in the direction of
+0
21.4
Date Objects
21.4.1
Overview of Date Objects and Definitions of Abstract Operations
The following
abstract operations
operate on
time values
(defined in
21.4.1.1
). Note that, in every case, if any argument to one of these functions is
NaN
, the result will be
NaN
21.4.1.1
Time Values and Time Range
Time measurement in ECMAScript is analogous to time
measurement in POSIX, in particular sharing definition in terms of the
proleptic Gregorian calendar, an
epoch
of midnight
at the beginning of 1 January 1970 UTC, and an accounting of every day
as comprising exactly 86,400 seconds (each of which is 1000 milliseconds
long).
An ECMAScript
time value
is a Number
, either a
finite
integral Number
representing an instant in time to millisecond precision or
NaN
representing no specific instant. A time value that is a multiple of
24 × 60 × 60 × 1000 = 86,400,000
(i.e., is 86,400,000 ×
for some
integer
) represents the instant at the start of the UTC day that follows the
epoch
by
whole UTC days (preceding the
epoch
for negative
). Every other
finite
time value
is defined relative to the greatest preceding time value
that is such a multiple, and represents the instant that occurs within the same UTC day as
but follows it by (
) milliseconds.
Time values do not account for UTC leap seconds—there are no
time values representing instants within positive leap seconds, and
there are time values representing instants removed from the UTC
timeline by negative leap seconds. However, the definition of time
values nonetheless yields piecewise alignment with UTC, with
discontinuities only at leap second boundaries and zero difference
outside of leap seconds.
A Number can exactly represent all
integers
from -9,007,199,254,740,992 to 9,007,199,254,740,992 (
21.1.2.8
and
21.1.2.6
).
A time value supports a slightly smaller range of
-8,640,000,000,000,000 to 8,640,000,000,000,000 milliseconds. This
yields a supported time value range of exactly -100,000,000 days to
100,000,000 days relative to midnight at the beginning of 1 January 1970
UTC.
The exact moment of midnight at the beginning of 1 January 1970 UTC is represented by the time value
+0
Note
The 400 year cycle of the proleptic Gregorian calendar
contains 97 leap years. This yields an average of 365.2425 days per
year, which is 31,556,952,000 milliseconds. Therefore, the maximum range
a Number could represent exactly with millisecond precision is
approximately -285,426 to 285,426 years relative to 1970. The smaller
range supported by a time value as specified in this section is
approximately -273,790 to 273,790 years relative to 1970.
21.4.1.2
Day Number and Time within Day
A given
time value
belongs to day number
Day(
) =
floor
msPerDay
)))
where the number of milliseconds per day is
msPerDay =
86400000
The remainder is called the time within the day:
TimeWithinDay(
) =
modulo
msPerDay
))
21.4.1.3
Year Number
ECMAScript uses a proleptic Gregorian calendar to map a day
number to a year number and to determine the month and date within that
year. In this calendar, leap years are precisely those which are
(divisible by 4) and ((not divisible by 100) or (divisible by 400)). The
number of days in year number
is therefore defined by
DaysInYear(
365
if (
modulo
4) ≠ 0
366
if (
modulo
4) = 0 and (
modulo
100) ≠ 0
365
if (
modulo
100) = 0 and (
modulo
400) ≠ 0
366
if (
modulo
400) = 0
All non-leap years have 365 days with the usual number of
days per month and leap years have an extra day in February. The day
number of the first day of year
is given by:
DayFromYear(
) =
(365 × (
) - 1970) +
floor
((
) - 1969) / 4) -
floor
((
) - 1901) / 100) +
floor
((
) - 1601) / 400))
The
time value
of the start of a year is:
TimeFromYear(
) =
msPerDay
DayFromYear
time value
determines a year by:
YearFromTime(
) = the largest
integral Number
(closest to +∞) such that
TimeFromYear
) ≤
The leap-year function is
for a time within a leap year and otherwise is
+0
InLeapYear(
+0
if
DaysInYear
YearFromTime
)) is
365
if
DaysInYear
YearFromTime
)) is
366
21.4.1.4
Month Number
Months are identified by an
integral Number
in the
inclusive interval
from
+0
to
11
. The mapping
MonthFromTime
) from a
time value
to a month number is defined by:
MonthFromTime(
+0
if
+0
DayWithinYear
) <
31
if
31
DayWithinYear
) <
59
InLeapYear
if
59
InLeapYear
) ≤
DayWithinYear
) <
90
InLeapYear
if
90
InLeapYear
) ≤
DayWithinYear
) <
120
InLeapYear
if
120
InLeapYear
) ≤
DayWithinYear
) <
151
InLeapYear
if
151
InLeapYear
) ≤
DayWithinYear
) <
181
InLeapYear
if
181
InLeapYear
) ≤
DayWithinYear
) <
212
InLeapYear
if
212
InLeapYear
) ≤
DayWithinYear
) <
243
InLeapYear
if
243
InLeapYear
) ≤
DayWithinYear
) <
273
InLeapYear
if
273
InLeapYear
) ≤
DayWithinYear
) <
304
InLeapYear
10
if
304
InLeapYear
) ≤
DayWithinYear
) <
334
InLeapYear
11
if
334
InLeapYear
) ≤
DayWithinYear
) <
365
InLeapYear
where
DayWithinYear(
) =
Day
) -
DayFromYear
YearFromTime
))
A month value of
+0
specifies January;
specifies February;
specifies March;
specifies April;
specifies May;
specifies June;
specifies July;
specifies August;
specifies September;
specifies October;
10
specifies November; and
11
specifies December. Note that
MonthFromTime
+0
) =
+0
, corresponding to Thursday, 1 January 1970.
21.4.1.5
Date Number
A date number is identified by an
integral Number
in the
inclusive interval
from
to
31
. The mapping DateFromTime(
) from a
time value
to a date number is defined by:
DateFromTime(
DayWithinYear
) +
if
MonthFromTime
) is
+0
DayWithinYear
) -
30
if
MonthFromTime
) is
DayWithinYear
) -
58
InLeapYear
) if
MonthFromTime
) is
DayWithinYear
) -
89
InLeapYear
) if
MonthFromTime
) is
DayWithinYear
) -
119
InLeapYear
) if
MonthFromTime
) is
DayWithinYear
) -
150
InLeapYear
) if
MonthFromTime
) is
DayWithinYear
) -
180
InLeapYear
) if
MonthFromTime
) is
DayWithinYear
) -
211
InLeapYear
) if
MonthFromTime
) is
DayWithinYear
) -
242
InLeapYear
) if
MonthFromTime
) is
DayWithinYear
) -
272
InLeapYear
) if
MonthFromTime
) is
DayWithinYear
) -
303
InLeapYear
) if
MonthFromTime
) is
10
DayWithinYear
) -
333
InLeapYear
) if
MonthFromTime
) is
11
21.4.1.6
Week Day
The weekday for a particular
time value
is defined as
WeekDay(
) =
Day
) +
modulo
7)
A weekday value of
+0
specifies Sunday;
specifies Monday;
specifies Tuesday;
specifies Wednesday;
specifies Thursday;
specifies Friday; and
specifies Saturday. Note that
WeekDay(
+0
) =
, corresponding to Thursday, 1 January 1970.
21.4.1.7
GetUTCEpochNanoseconds (
year
month
day
hour
minute
second
millisecond
microsecond
nanosecond
The abstract operation GetUTCEpochNanoseconds takes arguments
year
(an
integer
),
month
(an
integer
in the
inclusive interval
from 1 to 12),
day
(an
integer
in the
inclusive interval
from 1 to 31),
hour
(an
integer
in the
inclusive interval
from 0 to 23),
minute
(an
integer
in the
inclusive interval
from 0 to 59),
second
(an
integer
in the
inclusive interval
from 0 to 59),
millisecond
(an
integer
in the
inclusive interval
from 0 to 999),
microsecond
(an
integer
in the
inclusive interval
from 0 to 999), and
nanosecond
(an
integer
in the
inclusive interval
from 0 to 999) and returns a BigInt. The returned value represents a number of nanoseconds since the
epoch
that corresponds to the given ISO 8601 calendar date and wall-clock time in UTC. It performs the following steps when called:
1.
Let
date
be
MakeDay
year
),
month
- 1),
day
)).
2.
Let
time
be
MakeTime
hour
),
minute
),
second
),
millisecond
)).
3.
Let
ms
be
MakeDate
date
time
).
4.
Assert
ms
is an
integral Number
5.
Return
ms
) × 10
microsecond
× 10
nanosecond
).
21.4.1.8
GetNamedTimeZoneEpochNanoseconds (
timeZoneIdentifier
year
month
day
hour
minute
second
millisecond
microsecond
nanosecond
The
implementation-defined
abstract operation GetNamedTimeZoneEpochNanoseconds takes arguments
timeZoneIdentifier
(a String),
year
(an
integer
),
month
(an
integer
in the
inclusive interval
from 1 to 12),
day
(an
integer
in the
inclusive interval
from 1 to 31),
hour
(an
integer
in the
inclusive interval
from 0 to 23),
minute
(an
integer
in the
inclusive interval
from 0 to 59),
second
(an
integer
in the
inclusive interval
from 0 to 59),
millisecond
(an
integer
in the
inclusive interval
from 0 to 999),
microsecond
(an
integer
in the
inclusive interval
from 0 to 999), and
nanosecond
(an
integer
in the
inclusive interval
from 0 to 999) and returns a
List
of BigInts.
Each value in the returned
List
represents a number of nanoseconds since the
epoch
that corresponds to the given ISO 8601 calendar date and wall-clock time in the named time zone identified by
timeZoneIdentifier
When the input represents a local time occurring more than
once because of a negative time zone transition (e.g. when daylight
saving time ends or the time zone offset is decreased due to a time zone
rule change), the returned
List
will have more than one element and will be sorted by ascending
numerical value.
When the input represents a local time skipped because of a
positive time zone transition (e.g. when daylight saving time begins or
the time zone offset is increased due to a time zone rule change), the
returned
List
will be empty.
Otherwise, the returned
List
will have one element.
The default implementation of
GetNamedTimeZoneEpochNanoseconds, to be used for ECMAScript
implementations that do not include local political rules for any time
zones, performs the following steps when called:
1.
Assert
timeZoneIdentifier
is
"UTC"
2.
Let
epochNanoseconds
be
GetUTCEpochNanoseconds
year
month
day
hour
minute
second
millisecond
microsecond
nanosecond
).
3.
Return «
epochNanoseconds
».
Note
It is recommended that implementations use the time zone information of the IANA Time Zone Database
1:30 AM on 5 November 2017 in America/New_York is repeated twice, so GetNamedTimeZoneEpochNanoseconds(
"America/New_York"
, 2017, 11, 5, 1, 30, 0, 0, 0, 0) would return a
List
of length 2 in which the first element represents 05:30 UTC
(corresponding with 01:30 US Eastern Daylight Time at UTC offset -04:00)
and the second element represents 06:30 UTC (corresponding with 01:30
US Eastern Standard Time at UTC offset -05:00).
2:30 AM on 12 March 2017 in America/New_York does not exist, so GetNamedTimeZoneEpochNanoseconds(
"America/New_York"
, 2017, 3, 12, 2, 30, 0, 0, 0, 0) would return an empty
List
21.4.1.9
GetNamedTimeZoneOffsetNanoseconds (
timeZoneIdentifier
epochNanoseconds
The
implementation-defined
abstract operation GetNamedTimeZoneOffsetNanoseconds takes arguments
timeZoneIdentifier
(a String) and
epochNanoseconds
(a BigInt) and returns an
integer
The returned
integer
represents the offset from UTC of the named time zone identified by
timeZoneIdentifier
, at the instant corresponding with
epochNanoseconds
relative to the
epoch
, both in nanoseconds.
The default implementation of
GetNamedTimeZoneOffsetNanoseconds, to be used for ECMAScript
implementations that do not include local political rules for any time
zones, performs the following steps when called:
1.
Assert
timeZoneIdentifier
is
"UTC"
2.
Return 0.
Note
Time zone offset values may be positive or negative.
21.4.1.10
DefaultTimeZone ( )
The
implementation-defined
abstract operation DefaultTimeZone takes no arguments and returns a String. It returns a String value representing the
host environment
's current time zone, which is either a String representing a UTC offset for which
IsTimeZoneOffsetString
returns
true
, or a String identifier accepted by
GetNamedTimeZoneEpochNanoseconds
and
GetNamedTimeZoneOffsetNanoseconds
An ECMAScript implementation that includes the ECMA-402
Internationalization API must implement the DefaultTimeZone abstract
operation as specified in the ECMA-402 specification.
The default implementation of DefaultTimeZone, to be used for
ECMAScript implementations that do not include local political rules
for any time zones, performs the following steps when called:
1.
Return
"UTC"
Note
To ensure the level of functionality that implementations
commonly provide in the methods of the Date object, it is recommended
that DefaultTimeZone return an IANA time zone name corresponding to the
host environment
's time zone setting, if such a thing exists.
GetNamedTimeZoneEpochNanoseconds
and
GetNamedTimeZoneOffsetNanoseconds
must reflect the local political rules for standard time and daylight saving time in that time zone, if such rules exist.
For example, if the
host environment
is a browser on a system where the user has chosen US Eastern Time as their time zone, DefaultTimeZone returns
"America/New_York"
21.4.1.11
LocalTime (
The abstract operation LocalTime takes argument
(a
finite
time value
) and returns an
integral Number
It converts
from UTC to local time.
The local political rules for standard time and daylight saving time in effect at
should be used to determine the result in the way specified in this section.
It performs the following steps when called:
1.
Let
localTimeZone
be
DefaultTimeZone
().
2.
If
IsTimeZoneOffsetString
localTimeZone
) is
true
, then
a.
Let
offsetNs
be
ParseTimeZoneOffsetString
localTimeZone
).
3.
Else,
a.
Let
offsetNs
be
GetNamedTimeZoneOffsetNanoseconds
localTimeZone
) × 10
)).
4.
Let
offsetMs
be
truncate
offsetNs
/ 10
).
5.
Return
offsetMs
).
If political rules for the local time
are not available within the implementation, the result is
because
DefaultTimeZone
returns
"UTC"
and
GetNamedTimeZoneOffsetNanoseconds
returns 0.
Note 1
It is recommended that implementations use the time zone information of the IANA Time Zone Database
Note 2
Two different input
time values
UTC
are converted to the same local time
local
at a negative time zone transition when there are repeated times (e.g.
the daylight saving time ends or the time zone adjustment is
decreased.).
LocalTime(
UTC
local
))
is not necessarily always equal to
local
. Correspondingly,
UTC
(LocalTime(
UTC
))
is not necessarily always equal to
UTC
21.4.1.12
UTC (
The abstract operation UTC takes argument
(a Number) and returns a
time value
It converts
from local time to a UTC
time value
The local political rules for standard time and daylight saving time in effect at
should be used to determine the result in the way specified in this section.
It performs the following steps when called:
1.
Let
localTimeZone
be
DefaultTimeZone
().
2.
If
IsTimeZoneOffsetString
localTimeZone
) is
true
, then
a.
Let
offsetNs
be
ParseTimeZoneOffsetString
localTimeZone
).
3.
Else,
a.
Let
possibleInstants
be
GetNamedTimeZoneEpochNanoseconds
localTimeZone
YearFromTime
)),
MonthFromTime
)) + 1,
DateFromTime
)),
HourFromTime
)),
MinFromTime
)),
SecFromTime
)),
msFromTime
)), 0, 0).
b.
NOTE: The following steps ensure that when
represents local time repeating multiple times at a negative time zone
transition (e.g. when the daylight saving time ends or the time zone
offset is decreased due to a time zone rule change) or skipped local
time at a positive time zone transition (e.g. when the daylight saving
time starts or the time zone offset is increased due to a time zone rule
change),
is interpreted using the time zone offset before the transition.
c.
If
possibleInstants
is not empty, then
i.
Let
disambiguatedInstant
be
possibleInstants
[0].
d.
Else,
i.
NOTE:
represents a local time skipped at a positive time zone transition
(e.g. due to daylight saving time starting or a time zone rule change
increasing the UTC offset).
ii.
Let
possibleInstantsBefore
be
GetNamedTimeZoneEpochNanoseconds
localTimeZone
YearFromTime
tBefore
)),
MonthFromTime
tBefore
)) + 1,
DateFromTime
tBefore
)),
HourFromTime
tBefore
)),
MinFromTime
tBefore
)),
SecFromTime
tBefore
)),
msFromTime
tBefore
)), 0, 0), where
tBefore
is the largest
integral Number
for which
possibleInstantsBefore
is not empty (i.e.,
tBefore
represents the last local time before the transition).
iii.
Let
disambiguatedInstant
be the last element of
possibleInstantsBefore
e.
Let
offsetNs
be
GetNamedTimeZoneOffsetNanoseconds
localTimeZone
disambiguatedInstant
).
4.
Let
offsetMs
be
truncate
offsetNs
/ 10
).
5.
Return
offsetMs
).
Input
is nominally a
time value
but may be any Number value.
The algorithm must not limit
to the
time value
range, so that inputs corresponding with a boundary of the
time value
range can be supported regardless of local UTC offset.
For example, the maximum
time value
is 8.64 × 10
15
, corresponding with
"+275760-09-13T00:00:00Z"
In an environment where the local time zone offset is ahead of
UTC by 1 hour at that instant, it is represented by the larger input of
8.64 × 10
15
+ 3.6 × 10
, corresponding with
"+275760-09-13T01:00:00+01:00"
If political rules for the local time
are not available within the implementation, the result is
because
DefaultTimeZone
returns
"UTC"
and
GetNamedTimeZoneOffsetNanoseconds
returns 0.
Note 1
It is recommended that implementations use the time zone information of the IANA Time Zone Database
1:30 AM on 5 November 2017 in America/New_York is repeated
twice (fall backward), but it must be interpreted as 1:30 AM UTC-04
instead of 1:30 AM UTC-05.
In UTC(
TimeClip
MakeDate
MakeDay
(2017, 10, 5),
MakeTime
(1, 30, 0, 0)))), the value of
offsetMs
is
-4 ×
msPerHour
2:30 AM on 12 March 2017 in America/New_York does not exist,
but it must be interpreted as 2:30 AM UTC-05 (equivalent to 3:30 AM
UTC-04).
In UTC(
TimeClip
MakeDate
MakeDay
(2017, 2, 12),
MakeTime
(2, 30, 0, 0)))), the value of
offsetMs
is
-5 ×
msPerHour
Note 2
UTC(
LocalTime
UTC
))
is not necessarily always equal to
UTC
. Correspondingly,
LocalTime
(UTC(
local
))
is not necessarily always equal to
local
21.4.1.13
Hours, Minutes, Second, and Milliseconds
The following
abstract operations
are useful in decomposing
time values
HourFromTime(
) =
floor
msPerHour
))
modulo
HoursPerDay
MinFromTime(
) =
floor
msPerMinute
))
modulo
MinutesPerHour
SecFromTime(
) =
floor
msPerSecond
))
modulo
SecondsPerMinute
msFromTime(
) =
modulo
msPerSecond
))
where
HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond =
1000
msPerMinute =
60000
msPerSecond
SecondsPerMinute
msPerHour =
3600000
msPerMinute
MinutesPerHour
21.4.1.14
MakeTime (
hour
min
sec
ms
The abstract operation MakeTime takes arguments
hour
(a Number),
min
(a Number),
sec
(a Number), and
ms
(a Number) and returns a Number. It calculates a number of milliseconds. It performs the following steps when called:
1.
If
hour
is not
finite
min
is not
finite
sec
is not
finite
, or
ms
is not
finite
, return
NaN
2.
Let
be
(!
ToIntegerOrInfinity
hour
)).
3.
Let
be
(!
ToIntegerOrInfinity
min
)).
4.
Let
be
(!
ToIntegerOrInfinity
sec
)).
5.
Let
milli
be
(!
ToIntegerOrInfinity
ms
)).
6.
Let
be ((
msPerHour
msPerMinute
msPerSecond
milli
, performing the arithmetic according to
IEEE 754-2019
rules (that is, as if using the ECMAScript operators
and
).
7.
Return
21.4.1.15
MakeDay (
year
month
date
The abstract operation MakeDay takes arguments
year
(a Number),
month
(a Number), and
date
(a Number) and returns a Number. It calculates a number of days. It performs the following steps when called:
1.
If
year
is not
finite
month
is not
finite
, or
date
is not
finite
, return
NaN
2.
Let
be
(!
ToIntegerOrInfinity
year
)).
3.
Let
be
(!
ToIntegerOrInfinity
month
)).
4.
Let
dt
be
(!
ToIntegerOrInfinity
date
)).
5.
Let
ym
be
floor
) / 12)).
6.
If
ym
is not
finite
, return
NaN
7.
Let
mn
be
modulo
12).
8.
Find a
finite
time value
such that
YearFromTime
) is
ym
MonthFromTime
) is
mn
, and
DateFromTime
) is
; but if this is not possible (because some argument is out of range), return
NaN
9.
Return
Day
) +
dt
21.4.1.16
MakeDate (
day
time
The abstract operation MakeDate takes arguments
day
(a Number) and
time
(a Number) and returns a Number. It calculates a number of milliseconds. It performs the following steps when called:
1.
If
day
is not
finite
or
time
is not
finite
, return
NaN
2.
Let
tv
be
day
msPerDay
time
3.
If
tv
is not
finite
, return
NaN
4.
Return
tv
21.4.1.17
TimeClip (
time
The abstract operation TimeClip takes argument
time
(a Number) and returns a Number. It calculates a number of milliseconds. It performs the following steps when called:
1.
If
time
is not
finite
, return
NaN
2.
If
abs
time
)) > 8.64 × 10
15
, return
NaN
3.
Return
(!
ToIntegerOrInfinity
time
)).
21.4.1.18
Date Time String Format
ECMAScript defines a string interchange format for date-times
based upon a simplification of the ISO 8601 calendar date extended
format. The format is as follows:
YYYY-MM-DDTHH:mm:ss.sssZ
Where the elements are as follows:
YYYY
is the year in the proleptic Gregorian calendar as four decimal digits from 0000 to 9999, or as an
expanded year
of
"+"
or
"-"
followed by six decimal digits.
"-"
(hyphen) appears literally twice in the string.
MM
is the month of the year as two decimal digits from 01 (January) to 12 (December).
DD
is the day of the month as two decimal digits from 01 to 31.
"T"
appears literally in the string, to indicate the beginning of the time element.
HH
is the number of complete hours that have passed since midnight as two decimal digits from 00 to 24.
":"
(colon) appears literally twice in the string.
mm
is the number of complete minutes since the start of the hour as two decimal digits from 00 to 59.
ss
is the number of complete seconds since the start of the minute as two decimal digits from 00 to 59.
"."
(dot) appears literally in the string.
sss
is the number of complete milliseconds since the start of the second as three decimal digits.
is the UTC offset representation specified as
"Z"
(for UTC with no offset) or as either
"+"
or
"-"
followed by a time expression
HH:mm
(a subset of the
time zone offset string format
for indicating local time ahead of or behind UTC, respectively)
This format includes date-only forms:
YYYY
YYYY-MM
YYYY-MM-DD
It also includes “date-time” forms that consist of one of the
above date-only forms immediately followed by one of the following time
forms with an optional UTC offset representation appended:
THH:mm
THH:mm:ss
THH:mm:ss.sss
A string containing out-of-bounds or nonconforming elements is not a valid instance of this format.
Note 1
As every day both starts and ends with midnight, the two notations
00:00
and
24:00
are available to distinguish the two midnights that can be associated
with one date. This means that the following two notations refer to
exactly the same point in time:
1995-02-04T24:00
and
1995-02-05T00:00
This interpretation of the latter form as "end of a calendar day" is
consistent with ISO 8601, even though that specification reserves it for
describing time intervals and does not permit it within representations
of single points in time.
Note 2
There exists no international standard that specifies
abbreviations for civil time zones like CET, EST, etc. and sometimes the
same abbreviation is even used for two very different time zones. For
this reason, both ISO 8601 and this format specify numeric
representations of time zone offsets.
21.4.1.18.1
Expanded Years
Covering the full
time value
range of approximately 273,790 years forward or backward from 1 January 1970 (
21.4.1.1
requires representing years before 0 or after 9999. ISO 8601 permits
expansion of the year representation, but only by mutual agreement of
the partners in information interchange. In the simplified ECMAScript
format, such an expanded year representation shall have 6 digits and is
always prefixed with a + or - sign. The year 0 is considered positive
and must be prefixed with a + sign. The representation of the year 0 as
-000000 is invalid. Strings matching the
Date Time String Format
with expanded years representing instants in time outside the range of a
time value
are treated as unrecognizable by
Date.parse
and cause that function to return
NaN
without falling back to implementation-specific behaviour or heuristics.
Note
Examples of date-
time values
with expanded years:
-271821-04-20T00:00:00Z
271822 B.C.
-000001-01-01T00:00:00Z
2 B.C.
+000000-01-01T00:00:00Z
1 B.C.
+000001-01-01T00:00:00Z
1 A.D.
+001970-01-01T00:00:00Z
1970 A.D.
+002009-12-15T00:00:00Z
2009 A.D.
+275760-09-13T00:00:00Z
275760 A.D.
21.4.1.19
Time Zone Offset String Format
ECMAScript defines a string interchange format for UTC offsets, derived from ISO 8601.
The format is described by the following grammar.
The usage of Unicode code points in this grammar is listed in
Table 60
Table 60: Time Zone Offset String Code Points
Code Point
Unicode Name
Abbreviation
U+2212
MINUS SIGN

Syntax
UTCOffset
:::
TemporalSign
Hour
TemporalSign
Hour
HourSubcomponents
[+Extended]
TemporalSign
Hour
HourSubcomponents
[~Extended]
TemporalSign
:::
ASCIISign

ASCIISign
:::
one of
Hour
:::
DecimalDigit
DecimalDigit
20
21
22
23
HourSubcomponents
[Extended]
:::
TimeSeparator
[?Extended]
MinuteSecond
TimeSeparator
[?Extended]
MinuteSecond
TimeSeparator
[?Extended]
MinuteSecond
TemporalDecimalFraction
opt
TimeSeparator
[Extended]
:::
[+Extended]
[~Extended]
[empty]
MinuteSecond
:::
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalFraction
:::
TemporalDecimalSeparator
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
:::
one of
21.4.1.19.1
IsTimeZoneOffsetString (
offsetString
The abstract operation IsTimeZoneOffsetString takes argument
offsetString
(a String) and returns a Boolean. The return value indicates whether
offsetString
conforms to the grammar given by
UTCOffset
. It performs the following steps when called:
1.
Let
parseResult
be
ParseText
StringToCodePoints
offsetString
),
UTCOffset
).
2.
If
parseResult
is a
List
of errors, return
false
3.
Return
true
21.4.1.19.2
ParseTimeZoneOffsetString (
offsetString
The abstract operation ParseTimeZoneOffsetString takes argument
offsetString
(a String) and returns an
integer
. The return value is the UTC offset, as a number of nanoseconds, that corresponds to the String
offsetString
. It performs the following steps when called:
1.
Let
parseResult
be
ParseText
StringToCodePoints
offsetString
),
UTCOffset
).
2.
Assert
parseResult
is not a
List
of errors.
3.
Assert
parseResult
contains a
TemporalSign
Parse Node
4.
Let
parsedSign
be the
source text matched by
the
TemporalSign
Parse Node
contained within
parseResult
5.
If
parsedSign
is the single code point U+002D (HYPHEN-MINUS) or U+2212 (MINUS SIGN), then
a.
Let
sign
be -1.
6.
Else,
a.
Let
sign
be 1.
7.
NOTE: Applications of
StringToNumber
below do not lose precision, since each of the parsed values is guaranteed to be a sufficiently short string of decimal digits.
8.
Assert
parseResult
contains an
Hour
Parse Node
9.
Let
parsedHours
be the
source text matched by
the
Hour
Parse Node
contained within
parseResult
10.
Let
hours
be
StringToNumber
CodePointsToString
parsedHours
))).
11.
If
parseResult
does not contain a
MinuteSecond
Parse Node
, then
a.
Let
minutes
be 0.
12.
Else,
a.
Let
parsedMinutes
be the
source text matched by
the first
MinuteSecond
Parse Node
contained within
parseResult
b.
Let
minutes
be
StringToNumber
CodePointsToString
parsedMinutes
))).
13.
If
parseResult
does not contain two
MinuteSecond
Parse Nodes
, then
a.
Let
seconds
be 0.
14.
Else,
a.
Let
parsedSeconds
be the
source text matched by
the second
MinuteSecond
Parse Node
contained within
parseResult
b.
Let
seconds
be
StringToNumber
CodePointsToString
parsedSeconds
))).
15.
If
parseResult
does not contain a
TemporalDecimalFraction
Parse Node
, then
a.
Let
nanoseconds
be 0.
16.
Else,
a.
Let
parsedFraction
be the
source text matched by
the
TemporalDecimalFraction
Parse Node
contained within
parseResult
b.
Let
fraction
be the
string-concatenation
of
CodePointsToString
parsedFraction
) and
"000000000"
c.
Let
nanosecondsString
be the
substring
of
fraction
from 1 to 10.
d.
Let
nanoseconds
be
StringToNumber
nanosecondsString
)).
17.
Return
sign
× (((
hours
× 60 +
minutes
) × 60 +
seconds
) × 10
nanoseconds
).
21.4.2
The Date Constructor
The Date
constructor
is
%Date%
is the initial value of the
"Date"
property of the
global object
creates and initializes a new Date when called as a
constructor
returns a String representing the current time (UTC) when called as a function rather than as a
constructor
is a function whose behaviour differs based upon the number and types of its arguments.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified Date behaviour must include a
super
call to the Date
constructor
to create and initialize the subclass instance with a [[DateValue]] internal slot.
has a
"length"
property whose value is
21.4.2.1
Date ( ...
values
This function performs the following steps when called:
1.
If NewTarget is
undefined
, then
a.
Let
now
be the
time value
(UTC) identifying the current time.
b.
Return
ToDateString
now
).
2.
Let
numberOfArgs
be the number of elements in
values
3.
If
numberOfArgs
= 0, then
a.
Let
dv
be the
time value
(UTC) identifying the current time.
4.
Else if
numberOfArgs
= 1, then
a.
Let
value
be
values
[0].
b.
If
value
is an Object
and
value
has a [[DateValue]] internal slot, then
i.
Let
tv
be !
thisTimeValue
value
).
c.
Else,
i.
Let
be ?
ToPrimitive
value
).
ii.
If
is a String
, then
1.
Assert
: The next step never returns an
abrupt completion
because
is a String
2.
Let
tv
be the result of parsing
as a date, in exactly the same manner as for the
parse
method (
21.4.3.2
).
iii.
Else,
1.
Let
tv
be ?
ToNumber
).
d.
Let
dv
be
TimeClip
tv
).
5.
Else,
a.
Assert
numberOfArgs
≥ 2.
b.
Let
be ?
ToNumber
values
[0]).
c.
Let
be ?
ToNumber
values
[1]).
d.
If
numberOfArgs
> 2, let
dt
be ?
ToNumber
values
[2]); else let
dt
be
e.
If
numberOfArgs
> 3, let
be ?
ToNumber
values
[3]); else let
be
+0
f.
If
numberOfArgs
> 4, let
min
be ?
ToNumber
values
[4]); else let
min
be
+0
g.
If
numberOfArgs
> 5, let
be ?
ToNumber
values
[5]); else let
be
+0
h.
If
numberOfArgs
> 6, let
milli
be ?
ToNumber
values
[6]); else let
milli
be
+0
i.
If
is
NaN
, let
yr
be
NaN
j.
Else,
i.
Let
yi
be !
ToIntegerOrInfinity
).
ii.
If 0 ≤
yi
≤ 99, let
yr
be
1900
yi
); otherwise, let
yr
be
k.
Let
finalDate
be
MakeDate
MakeDay
yr
dt
),
MakeTime
min
milli
)).
l.
Let
dv
be
TimeClip
UTC
finalDate
)).
6.
Let
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%Date.prototype%"
, « [[DateValue]] »).
7.
Set
.[[DateValue]] to
dv
8.
Return
21.4.3
Properties of the Date Constructor
The Date
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
21.4.3.1
Date.now ( )
This function returns the
time value
designating the UTC date and time of the occurrence of the call to it.
21.4.3.2
Date.parse (
string
This function applies the
ToString
operator to its argument. If
ToString
results in an
abrupt completion
the
Completion Record
is immediately returned. Otherwise, this function interprets the
resulting String as a date and time; it returns a Number, the UTC
time value
corresponding to the date and time. The String may be interpreted as a
local time, a UTC time, or a time in some other time zone, depending on
the contents of the String. The function first attempts to parse the
String according to the format described in Date Time String Format (
21.4.1.18
),
including expanded years. If the String does not conform to that format
the function may fall back to any implementation-specific heuristics or
implementation-specific date formats. Strings that are unrecognizable
or contain out-of-bounds format element values shall cause this function
to return
NaN
If the String conforms to the
Date Time String Format
, substitute values take the place of absent format elements. When the
MM
or
DD
elements are absent,
"01"
is used. When the
HH
mm
, or
ss
elements are absent,
"00"
is used. When the
sss
element is absent,
"000"
is used. When the UTC offset representation is absent, date-only forms
are interpreted as a UTC time and date-time forms are interpreted as a
local time.
If
is any Date whose milliseconds amount is
zero within a particular implementation of ECMAScript, then all of the
following expressions should produce the same numeric value in that
implementation, if all the properties referenced have their initial
values:
x.
valueOf
()
Date
parse
(x.
toString
())
Date
parse
(x.
toUTCString
())
Date
parse
(x.
toISOString
())
However, the expression
Date
parse
(x.
toLocaleString
())
is not required to produce the same Number value as the
preceding three expressions and, in general, the value produced by this
function is
implementation-defined
when given any String value that does not conform to the Date Time String Format (
21.4.1.18
) and that could not be produced in that implementation by the
toString
or
toUTCString
method.
21.4.3.3
Date.prototype
The initial value of
Date.prototype
is the
Date prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
21.4.3.4
Date.UTC (
year
[ ,
month
[ ,
date
[ ,
hours
[ ,
minutes
[ ,
seconds
[ ,
ms
] ] ] ] ] ] )
This function performs the following steps when called:
1.
Let
be ?
ToNumber
year
).
2.
If
month
is present, let
be ?
ToNumber
month
); else let
be
+0
3.
If
date
is present, let
dt
be ?
ToNumber
date
); else let
dt
be
4.
If
hours
is present, let
be ?
ToNumber
hours
); else let
be
+0
5.
If
minutes
is present, let
min
be ?
ToNumber
minutes
); else let
min
be
+0
6.
If
seconds
is present, let
be ?
ToNumber
seconds
); else let
be
+0
7.
If
ms
is present, let
milli
be ?
ToNumber
ms
); else let
milli
be
+0
8.
If
is
NaN
, let
yr
be
NaN
9.
Else,
a.
Let
yi
be !
ToIntegerOrInfinity
).
b.
If 0 ≤
yi
≤ 99, let
yr
be
1900
yi
); otherwise, let
yr
be
10.
Return
TimeClip
MakeDate
MakeDay
yr
dt
),
MakeTime
min
milli
))).
The
"length"
property of this function is
Note
This function differs from the Date
constructor
in two ways: it returns a
time value
as a Number, rather than creating a Date, and it interprets the arguments in UTC rather than as local time.
21.4.4
Properties of the Date Prototype Object
The
Date prototype object
is
%Date.prototype%
is itself an
ordinary object
is not a Date instance and does not have a [[DateValue]] internal slot.
has a [[Prototype]] internal slot whose value is
%Object.prototype%
Unless explicitly defined otherwise, the methods of the Date prototype object defined below are not generic and the
this
value passed to them must be an object that has a [[DateValue]] internal slot that has been initialized to a
time value
The abstract operation
thisTimeValue
takes argument
value
. It performs the following steps when called:
1.
If
value
is an Object
and
value
has a [[DateValue]] internal slot, then
a.
Return
value
.[[DateValue]].
2.
Throw a
TypeError
exception.
In following descriptions of functions that are properties of the Date prototype object, the phrase “
this Date object
” refers to the object that is the
this
value for the invocation of the function. If the Type of the
this
value is not Object, a
TypeError
exception is thrown. The phrase “
this time value
” within the specification of a method refers to the result returned by calling the abstract operation
thisTimeValue
with the
this
value of the method invocation passed as the argument.
21.4.4.1
Date.prototype.constructor
The initial value of
Date.prototype.constructor
is
%Date%
21.4.4.2
Date.prototype.getDate ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
DateFromTime
LocalTime
)).
21.4.4.3
Date.prototype.getDay ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
WeekDay
LocalTime
)).
21.4.4.4
Date.prototype.getFullYear ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
YearFromTime
LocalTime
)).
21.4.4.5
Date.prototype.getHours ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
HourFromTime
LocalTime
)).
21.4.4.6
Date.prototype.getMilliseconds ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
msFromTime
LocalTime
)).
21.4.4.7
Date.prototype.getMinutes ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
MinFromTime
LocalTime
)).
21.4.4.8
Date.prototype.getMonth ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
MonthFromTime
LocalTime
)).
21.4.4.9
Date.prototype.getSeconds ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
SecFromTime
LocalTime
)).
21.4.4.10
Date.prototype.getTime ( )
This method performs the following steps when called:
1.
Return ?
thisTimeValue
this
value).
21.4.4.11
Date.prototype.getTimezoneOffset ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return (
LocalTime
)) /
msPerMinute
21.4.4.12
Date.prototype.getUTCDate ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
DateFromTime
).
21.4.4.13
Date.prototype.getUTCDay ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
WeekDay
).
21.4.4.14
Date.prototype.getUTCFullYear ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
YearFromTime
).
21.4.4.15
Date.prototype.getUTCHours ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
HourFromTime
).
21.4.4.16
Date.prototype.getUTCMilliseconds ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
msFromTime
).
21.4.4.17
Date.prototype.getUTCMinutes ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
MinFromTime
).
21.4.4.18
Date.prototype.getUTCMonth ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
MonthFromTime
).
21.4.4.19
Date.prototype.getUTCSeconds ( )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
SecFromTime
).
21.4.4.20
Date.prototype.setDate (
date
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
dt
be ?
ToNumber
date
).
3.
If
is
NaN
, return
NaN
4.
Set
to
LocalTime
).
5.
Let
newDate
be
MakeDate
MakeDay
YearFromTime
),
MonthFromTime
),
dt
),
TimeWithinDay
)).
6.
Let
be
TimeClip
UTC
newDate
)).
7.
Set the [[DateValue]] internal slot of
this Date object
to
8.
Return
21.4.4.21
Date.prototype.setFullYear (
year
[ ,
month
[ ,
date
] ] )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
year
).
3.
If
is
NaN
, set
to
+0
; otherwise, set
to
LocalTime
).
4.
If
month
is not present, let
be
MonthFromTime
); otherwise, let
be ?
ToNumber
month
).
5.
If
date
is not present, let
dt
be
DateFromTime
); otherwise, let
dt
be ?
ToNumber
date
).
6.
Let
newDate
be
MakeDate
MakeDay
dt
),
TimeWithinDay
)).
7.
Let
be
TimeClip
UTC
newDate
)).
8.
Set the [[DateValue]] internal slot of
this Date object
to
9.
Return
The
"length"
property of this method is
Note
If
month
is not present, this method behaves as if
month
was present with the value
getMonth()
. If
date
is not present, it behaves as if
date
was present with the value
getDate()
21.4.4.22
Date.prototype.setHours (
hour
[ ,
min
[ ,
sec
[ ,
ms
] ] ] )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
hour
).
3.
If
min
is present, let
be ?
ToNumber
min
).
4.
If
sec
is present, let
be ?
ToNumber
sec
).
5.
If
ms
is present, let
milli
be ?
ToNumber
ms
).
6.
If
is
NaN
, return
NaN
7.
Set
to
LocalTime
).
8.
If
min
is not present, let
be
MinFromTime
).
9.
If
sec
is not present, let
be
SecFromTime
).
10.
If
ms
is not present, let
milli
be
msFromTime
).
11.
Let
date
be
MakeDate
Day
),
MakeTime
milli
)).
12.
Let
be
TimeClip
UTC
date
)).
13.
Set the [[DateValue]] internal slot of
this Date object
to
14.
Return
The
"length"
property of this method is
Note
If
min
is not present, this method behaves as if
min
was present with the value
getMinutes()
. If
sec
is not present, it behaves as if
sec
was present with the value
getSeconds()
. If
ms
is not present, it behaves as if
ms
was present with the value
getMilliseconds()
21.4.4.23
Date.prototype.setMilliseconds (
ms
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Set
ms
to ?
ToNumber
ms
).
3.
If
is
NaN
, return
NaN
4.
Set
to
LocalTime
).
5.
Let
time
be
MakeTime
HourFromTime
),
MinFromTime
),
SecFromTime
),
ms
).
6.
Let
be
TimeClip
UTC
MakeDate
Day
),
time
))).
7.
Set the [[DateValue]] internal slot of
this Date object
to
8.
Return
21.4.4.24
Date.prototype.setMinutes (
min
[ ,
sec
[ ,
ms
] ] )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
min
).
3.
If
sec
is present, let
be ?
ToNumber
sec
).
4.
If
ms
is present, let
milli
be ?
ToNumber
ms
).
5.
If
is
NaN
, return
NaN
6.
Set
to
LocalTime
).
7.
If
sec
is not present, let
be
SecFromTime
).
8.
If
ms
is not present, let
milli
be
msFromTime
).
9.
Let
date
be
MakeDate
Day
),
MakeTime
HourFromTime
),
milli
)).
10.
Let
be
TimeClip
UTC
date
)).
11.
Set the [[DateValue]] internal slot of
this Date object
to
12.
Return
The
"length"
property of this method is
Note
If
sec
is not present, this method behaves as if
sec
was present with the value
getSeconds()
. If
ms
is not present, this behaves as if
ms
was present with the value
getMilliseconds()
21.4.4.25
Date.prototype.setMonth (
month
[ ,
date
] )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
month
).
3.
If
date
is present, let
dt
be ?
ToNumber
date
).
4.
If
is
NaN
, return
NaN
5.
Set
to
LocalTime
).
6.
If
date
is not present, let
dt
be
DateFromTime
).
7.
Let
newDate
be
MakeDate
MakeDay
YearFromTime
),
dt
),
TimeWithinDay
)).
8.
Let
be
TimeClip
UTC
newDate
)).
9.
Set the [[DateValue]] internal slot of
this Date object
to
10.
Return
The
"length"
property of this method is
Note
If
date
is not present, this method behaves as if
date
was present with the value
getDate()
21.4.4.26
Date.prototype.setSeconds (
sec
[ ,
ms
] )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
sec
).
3.
If
ms
is present, let
milli
be ?
ToNumber
ms
).
4.
If
is
NaN
, return
NaN
5.
Set
to
LocalTime
).
6.
If
ms
is not present, let
milli
be
msFromTime
).
7.
Let
date
be
MakeDate
Day
),
MakeTime
HourFromTime
),
MinFromTime
),
milli
)).
8.
Let
be
TimeClip
UTC
date
)).
9.
Set the [[DateValue]] internal slot of
this Date object
to
10.
Return
The
"length"
property of this method is
Note
If
ms
is not present, this method behaves as if
ms
was present with the value
getMilliseconds()
21.4.4.27
Date.prototype.setTime (
time
This method performs the following steps when called:
1.
Perform ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
time
).
3.
Let
be
TimeClip
).
4.
Set the [[DateValue]] internal slot of
this Date object
to
5.
Return
21.4.4.28
Date.prototype.setUTCDate (
date
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
dt
be ?
ToNumber
date
).
3.
If
is
NaN
, return
NaN
4.
Let
newDate
be
MakeDate
MakeDay
YearFromTime
),
MonthFromTime
),
dt
),
TimeWithinDay
)).
5.
Let
be
TimeClip
newDate
).
6.
Set the [[DateValue]] internal slot of
this Date object
to
7.
Return
21.4.4.29
Date.prototype.setUTCFullYear (
year
[ ,
month
[ ,
date
] ] )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, set
to
+0
3.
Let
be ?
ToNumber
year
).
4.
If
month
is not present, let
be
MonthFromTime
); otherwise, let
be ?
ToNumber
month
).
5.
If
date
is not present, let
dt
be
DateFromTime
); otherwise, let
dt
be ?
ToNumber
date
).
6.
Let
newDate
be
MakeDate
MakeDay
dt
),
TimeWithinDay
)).
7.
Let
be
TimeClip
newDate
).
8.
Set the [[DateValue]] internal slot of
this Date object
to
9.
Return
The
"length"
property of this method is
Note
If
month
is not present, this method behaves as if
month
was present with the value
getUTCMonth()
. If
date
is not present, it behaves as if
date
was present with the value
getUTCDate()
21.4.4.30
Date.prototype.setUTCHours (
hour
[ ,
min
[ ,
sec
[ ,
ms
] ] ] )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
hour
).
3.
If
min
is present, let
be ?
ToNumber
min
).
4.
If
sec
is present, let
be ?
ToNumber
sec
).
5.
If
ms
is present, let
milli
be ?
ToNumber
ms
).
6.
If
is
NaN
, return
NaN
7.
If
min
is not present, let
be
MinFromTime
).
8.
If
sec
is not present, let
be
SecFromTime
).
9.
If
ms
is not present, let
milli
be
msFromTime
).
10.
Let
date
be
MakeDate
Day
),
MakeTime
milli
)).
11.
Let
be
TimeClip
date
).
12.
Set the [[DateValue]] internal slot of
this Date object
to
13.
Return
The
"length"
property of this method is
Note
If
min
is not present, this method behaves as if
min
was present with the value
getUTCMinutes()
. If
sec
is not present, it behaves as if
sec
was present with the value
getUTCSeconds()
. If
ms
is not present, it behaves as if
ms
was present with the value
getUTCMilliseconds()
21.4.4.31
Date.prototype.setUTCMilliseconds (
ms
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Set
ms
to ?
ToNumber
ms
).
3.
If
is
NaN
, return
NaN
4.
Let
time
be
MakeTime
HourFromTime
),
MinFromTime
),
SecFromTime
),
ms
).
5.
Let
be
TimeClip
MakeDate
Day
),
time
)).
6.
Set the [[DateValue]] internal slot of
this Date object
to
7.
Return
21.4.4.32
Date.prototype.setUTCMinutes (
min
[ ,
sec
[ ,
ms
] ] )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
min
).
3.
If
sec
is present, let
be ?
ToNumber
sec
).
4.
If
ms
is present, let
milli
be ?
ToNumber
ms
).
5.
If
is
NaN
, return
NaN
6.
If
sec
is not present, let
be
SecFromTime
).
7.
If
ms
is not present, let
milli
be
msFromTime
).
8.
Let
date
be
MakeDate
Day
),
MakeTime
HourFromTime
),
milli
)).
9.
Let
be
TimeClip
date
).
10.
Set the [[DateValue]] internal slot of
this Date object
to
11.
Return
The
"length"
property of this method is
Note
If
sec
is not present, this method behaves as if
sec
was present with the value
getUTCSeconds()
. If
ms
is not present, it behaves as if
ms
was present with the value return by
getUTCMilliseconds()
21.4.4.33
Date.prototype.setUTCMonth (
month
[ ,
date
] )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
month
).
3.
If
date
is present, let
dt
be ?
ToNumber
date
).
4.
If
is
NaN
, return
NaN
5.
If
date
is not present, let
dt
be
DateFromTime
).
6.
Let
newDate
be
MakeDate
MakeDay
YearFromTime
),
dt
),
TimeWithinDay
)).
7.
Let
be
TimeClip
newDate
).
8.
Set the [[DateValue]] internal slot of
this Date object
to
9.
Return
The
"length"
property of this method is
Note
If
date
is not present, this method behaves as if
date
was present with the value
getUTCDate()
21.4.4.34
Date.prototype.setUTCSeconds (
sec
[ ,
ms
] )
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
sec
).
3.
If
ms
is present, let
milli
be ?
ToNumber
ms
).
4.
If
is
NaN
, return
NaN
5.
If
ms
is not present, let
milli
be
msFromTime
).
6.
Let
date
be
MakeDate
Day
),
MakeTime
HourFromTime
),
MinFromTime
),
milli
)).
7.
Let
be
TimeClip
date
).
8.
Set the [[DateValue]] internal slot of
this Date object
to
9.
Return
The
"length"
property of this method is
Note
If
ms
is not present, this method behaves as if
ms
was present with the value
getUTCMilliseconds()
21.4.4.35
Date.prototype.toDateString ( )
This method performs the following steps when called:
1.
Let
be
this Date object
2.
Let
tv
be ?
thisTimeValue
).
3.
If
tv
is
NaN
, return
"Invalid Date"
4.
Let
be
LocalTime
tv
).
5.
Return
DateString
).
21.4.4.36
Date.prototype.toISOString ( )
If
this time value
is not a
finite
Number or if it corresponds with a year that cannot be represented in the
Date Time String Format
, this method throws a
RangeError
exception. Otherwise, it returns a String representation of
this time value
in that format on the UTC time scale, including all format elements and the UTC offset representation
"Z"
21.4.4.37
Date.prototype.toJSON (
key
This method provides a String representation of a Date for use by
JSON.stringify
25.5.2
).
It performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
tv
be ?
ToPrimitive
number
).
3.
If
tv
is a Number
and
tv
is not
finite
, return
null
4.
Return ?
Invoke
"toISOString"
).
Note 1
The argument is ignored.
Note 2
This method is intentionally generic; it does not require that its
this
value be a Date. Therefore, it can be transferred to other kinds of
objects for use as a method. However, it does require that any such
object have a
toISOString
method.
21.4.4.38
Date.prototype.toLocaleDateString ( [
reserved1
[ ,
reserved2
] ] )
An ECMAScript implementation that includes the ECMA-402
Internationalization API must implement this method as specified in the
ECMA-402 specification. If an ECMAScript implementation does not include
the ECMA-402 API the following specification of this method is used:
This method returns a String value. The contents of the String are
implementation-defined
but are intended to represent the “date” portion of the Date in the
current time zone in a convenient, human-readable form that corresponds
to the conventions of the
host environment
's current locale.
The meaning of the optional parameters to this method are
defined in the ECMA-402 specification; implementations that do not
include ECMA-402 support must not use those parameter positions for
anything else.
21.4.4.39
Date.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
An ECMAScript implementation that includes the ECMA-402
Internationalization API must implement this method as specified in the
ECMA-402 specification. If an ECMAScript implementation does not include
the ECMA-402 API the following specification of this method is used:
This method returns a String value. The contents of the String are
implementation-defined
but are intended to represent the Date in the current time zone in a
convenient, human-readable form that corresponds to the conventions of
the
host environment
's current locale.
The meaning of the optional parameters to this method are
defined in the ECMA-402 specification; implementations that do not
include ECMA-402 support must not use those parameter positions for
anything else.
21.4.4.40
Date.prototype.toLocaleTimeString ( [
reserved1
[ ,
reserved2
] ] )
An ECMAScript implementation that includes the ECMA-402
Internationalization API must implement this method as specified in the
ECMA-402 specification. If an ECMAScript implementation does not include
the ECMA-402 API the following specification of this method is used:
This method returns a String value. The contents of the String are
implementation-defined
but are intended to represent the “time” portion of the Date in the
current time zone in a convenient, human-readable form that corresponds
to the conventions of the
host environment
's current locale.
The meaning of the optional parameters to this method are
defined in the ECMA-402 specification; implementations that do not
include ECMA-402 support must not use those parameter positions for
anything else.
21.4.4.41
Date.prototype.toString ( )
This method performs the following steps when called:
1.
Let
tv
be ?
thisTimeValue
this
value).
2.
Return
ToDateString
tv
).
Note 1
For any Date
such that
d.[[DateValue]]
is evenly divisible by 1000, the result of
Date.parse(d.toString())
d.valueOf()
. See
21.4.3.2
Note 2
This method is not generic; it throws a
TypeError
exception if its
this
value is not a Date. Therefore, it cannot be transferred to other kinds of objects for use as a method.
21.4.4.41.1
TimeString (
tv
The abstract operation TimeString takes argument
tv
(a Number, but not
NaN
) and returns a String. It performs the following steps when called:
1.
Let
hour
be
ToZeroPaddedDecimalString
HourFromTime
tv
)), 2).
2.
Let
minute
be
ToZeroPaddedDecimalString
MinFromTime
tv
)), 2).
3.
Let
second
be
ToZeroPaddedDecimalString
SecFromTime
tv
)), 2).
4.
Return the
string-concatenation
of
hour
":"
minute
":"
second
, the code unit 0x0020 (SPACE), and
"GMT"
21.4.4.41.2
DateString (
tv
The abstract operation DateString takes argument
tv
(a Number, but not
NaN
) and returns a String. It performs the following steps when called:
1.
Let
weekday
be the Name of the entry in
Table 61
with the Number
WeekDay
tv
).
2.
Let
month
be the Name of the entry in
Table 62
with the Number
MonthFromTime
tv
).
3.
Let
day
be
ToZeroPaddedDecimalString
DateFromTime
tv
)), 2).
4.
Let
yv
be
YearFromTime
tv
).
5.
If
yv
is
+0
or
yv
+0
, let
yearSign
be the empty String; otherwise, let
yearSign
be
"-"
6.
Let
paddedYear
be
ToZeroPaddedDecimalString
abs
yv
)), 4).
7.
Return the
string-concatenation
of
weekday
, the code unit 0x0020 (SPACE),
month
, the code unit 0x0020 (SPACE),
day
, the code unit 0x0020 (SPACE),
yearSign
, and
paddedYear
Table 61: Names of days of the week
Number
Name
+0
"Sun"
"Mon"
"Tue"
"Wed"
"Thu"
"Fri"
"Sat"
Table 62: Names of months of the year
Number
Name
+0
"Jan"
"Feb"
"Mar"
"Apr"
"May"
"Jun"
"Jul"
"Aug"
"Sep"
"Oct"
10
"Nov"
11
"Dec"
21.4.4.41.3
TimeZoneString (
tv
The abstract operation TimeZoneString takes argument
tv
(an
integral Number
) and returns a String. It performs the following steps when called:
1.
Let
localTimeZone
be
DefaultTimeZone
().
2.
If
IsTimeZoneOffsetString
localTimeZone
) is
true
, then
a.
Let
offsetNs
be
ParseTimeZoneOffsetString
localTimeZone
).
3.
Else,
a.
Let
offsetNs
be
GetNamedTimeZoneOffsetNanoseconds
localTimeZone
tv
) × 10
)).
4.
Let
offset
be
truncate
offsetNs
/ 10
)).
5.
If
offset
is
+0
or
offset
+0
, then
a.
Let
offsetSign
be
"+"
b.
Let
absOffset
be
offset
6.
Else,
a.
Let
offsetSign
be
"-"
b.
Let
absOffset
be -
offset
7.
Let
offsetMin
be
ToZeroPaddedDecimalString
MinFromTime
absOffset
)), 2).
8.
Let
offsetHour
be
ToZeroPaddedDecimalString
HourFromTime
absOffset
)), 2).
9.
Let
tzName
be an
implementation-defined
string that is either the empty String or the
string-concatenation
of the code unit 0x0020 (SPACE), the code unit 0x0028 (LEFT PARENTHESIS), an
implementation-defined
timezone name, and the code unit 0x0029 (RIGHT PARENTHESIS).
10.
Return the
string-concatenation
of
offsetSign
offsetHour
offsetMin
, and
tzName
21.4.4.41.4
ToDateString (
tv
The abstract operation ToDateString takes argument
tv
(an
integral Number
or
NaN
) and returns a String. It performs the following steps when called:
1.
If
tv
is
NaN
, return
"Invalid Date"
2.
Let
be
LocalTime
tv
).
3.
Return the
string-concatenation
of
DateString
), the code unit 0x0020 (SPACE),
TimeString
), and
TimeZoneString
tv
).
21.4.4.42
Date.prototype.toTimeString ( )
This method performs the following steps when called:
1.
Let
be
this Date object
2.
Let
tv
be ?
thisTimeValue
).
3.
If
tv
is
NaN
, return
"Invalid Date"
4.
Let
be
LocalTime
tv
).
5.
Return the
string-concatenation
of
TimeString
) and
TimeZoneString
tv
).
21.4.4.43
Date.prototype.toUTCString ( )
This method returns a String value representing the instance in time corresponding to
this time value
The format of the String is based upon "HTTP-date" from RFC 7231,
generalized to support the full range of times supported by ECMAScript
Dates.
It performs the following steps when called:
1.
Let
be
this Date object
2.
Let
tv
be ?
thisTimeValue
).
3.
If
tv
is
NaN
, return
"Invalid Date"
4.
Let
weekday
be the Name of the entry in
Table 61
with the Number
WeekDay
tv
).
5.
Let
month
be the Name of the entry in
Table 62
with the Number
MonthFromTime
tv
).
6.
Let
day
be
ToZeroPaddedDecimalString
DateFromTime
tv
)), 2).
7.
Let
yv
be
YearFromTime
tv
).
8.
If
yv
is
+0
or
yv
+0
, let
yearSign
be the empty String; otherwise, let
yearSign
be
"-"
9.
Let
paddedYear
be
ToZeroPaddedDecimalString
abs
yv
)), 4).
10.
Return the
string-concatenation
of
weekday
","
, the code unit 0x0020 (SPACE),
day
, the code unit 0x0020 (SPACE),
month
, the code unit 0x0020 (SPACE),
yearSign
paddedYear
, the code unit 0x0020 (SPACE), and
TimeString
tv
).
21.4.4.44
Date.prototype.valueOf ( )
This method performs the following steps when called:
1.
Return ?
thisTimeValue
this
value).
21.4.4.45
Date.prototype [ @@toPrimitive ] (
hint
This method is called by ECMAScript language operators to convert a Date to a primitive value. The allowed values for
hint
are
"default"
"number"
, and
"string"
. Dates are unique among built-in ECMAScript object in that they treat
"default"
as being equivalent to
"string"
, All other built-in ECMAScript objects treat
"default"
as being equivalent to
"number"
It performs the following steps when called:
1.
Let
be the
this
value.
2.
If
is not an Object
, throw a
TypeError
exception.
3.
If
hint
is either
"string"
or
"default"
, then
a.
Let
tryFirst
be
string
4.
Else if
hint
is
"number"
, then
a.
Let
tryFirst
be
number
5.
Else, throw a
TypeError
exception.
6.
Return ?
OrdinaryToPrimitive
tryFirst
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
The value of the
"name"
property of this method is
"[Symbol.toPrimitive]"
21.4.5
Properties of Date Instances
Date instances are
ordinary objects
that inherit properties from the
Date prototype object
. Date instances also have a [[DateValue]] internal slot. The [[DateValue]] internal slot is the
time value
represented by this Date.
22
Text Processing
22.1
String Objects
22.1.1
The String Constructor
The String
constructor
is
%String%
is the initial value of the
"String"
property of the
global object
creates and initializes a new String object when called as a
constructor
performs a type conversion when called as a function rather than as a
constructor
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified String behaviour must include a
super
call to the String
constructor
to create and initialize the subclass instance with a [[StringData]] internal slot.
22.1.1.1
String (
value
This function performs the following steps when called:
1.
If
value
is not present, let
be the empty String.
2.
Else,
a.
If NewTarget is
undefined
and
value
is a Symbol
, return
SymbolDescriptiveString
value
).
b.
Let
be ?
ToString
value
).
3.
If NewTarget is
undefined
, return
4.
Return
StringCreate
, ?
GetPrototypeFromConstructor
(NewTarget,
"%String.prototype%"
)).
22.1.2
Properties of the String Constructor
The String
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
22.1.2.1
String.fromCharCode ( ...
codeUnits
This function may be called with any number of arguments which form the rest parameter
codeUnits
It performs the following steps when called:
1.
Let
result
be the empty String.
2.
For each element
next
of
codeUnits
, do
a.
Let
nextCU
be the code unit whose numeric value is
(?
ToUint16
next
)).
b.
Set
result
to the
string-concatenation
of
result
and
nextCU
3.
Return
result
The
"length"
property of this function is
22.1.2.2
String.fromCodePoint ( ...
codePoints
This function may be called with any number of arguments which form the rest parameter
codePoints
It performs the following steps when called:
1.
Let
result
be the empty String.
2.
For each element
next
of
codePoints
, do
a.
Let
nextCP
be ?
ToNumber
next
).
b.
If
IsIntegralNumber
nextCP
) is
false
, throw a
RangeError
exception.
c.
If
nextCP
) < 0 or
nextCP
) > 0x10FFFF, throw a
RangeError
exception.
d.
Set
result
to the
string-concatenation
of
result
and
UTF16EncodeCodePoint
nextCP
)).
3.
Assert
: If
codePoints
is empty, then
result
is the empty String.
4.
Return
result
The
"length"
property of this function is
22.1.2.3
String.prototype
The initial value of
String.prototype
is the
String prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
22.1.2.4
String.raw (
template
, ...
substitutions
This function may be called with a variable number of arguments. The first argument is
template
and the remainder of the arguments form the
List
substitutions
It performs the following steps when called:
1.
Let
substitutionCount
be the number of elements in
substitutions
2.
Let
cooked
be ?
ToObject
template
).
3.
Let
literals
be ?
ToObject
(?
Get
cooked
"raw"
)).
4.
Let
literalCount
be ?
LengthOfArrayLike
literals
).
5.
If
literalCount
≤ 0, return the empty String.
6.
Let
be the empty String.
7.
Let
nextIndex
be 0.
8.
Repeat,
a.
Let
nextLiteralVal
be ?
Get
literals
, !
ToString
nextIndex
))).
b.
Let
nextLiteral
be ?
ToString
nextLiteralVal
).
c.
Set
to the
string-concatenation
of
and
nextLiteral
d.
If
nextIndex
+ 1 =
literalCount
, return
e.
If
nextIndex
substitutionCount
, then
i.
Let
nextSubVal
be
substitutions
nextIndex
].
ii.
Let
nextSub
be ?
ToString
nextSubVal
).
iii.
Set
to the
string-concatenation
of
and
nextSub
f.
Set
nextIndex
to
nextIndex
+ 1.
Note
This function is intended for use as a tag function of a Tagged Template (
13.3.11
).
When called as such, the first argument will be a well formed template
object and the rest parameter will contain the substitution values.
22.1.3
Properties of the String Prototype Object
The
String prototype object
is
%String.prototype%
is a String
exotic object
and has the internal methods specified for such objects.
has a [[StringData]] internal slot whose value is the empty String.
has a
"length"
property whose initial value is
+0
and whose attributes are { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
has a [[Prototype]] internal slot whose value is
%Object.prototype%
Unless explicitly stated otherwise, the methods of the String prototype object defined below are not generic and the
this
value passed to them must be either a String value or an object that
has a [[StringData]] internal slot that has been initialized to a String
value.
The abstract operation
thisStringValue
takes argument
value
. It performs the following steps when called:
1.
If
value
is a String
, return
value
2.
If
value
is an Object
and
value
has a [[StringData]] internal slot, then
a.
Let
be
value
.[[StringData]].
b.
Assert
is a String
c.
Return
3.
Throw a
TypeError
exception.
22.1.3.1
String.prototype.at (
index
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
len
be the length of
4.
Let
relativeIndex
be ?
ToIntegerOrInfinity
index
).
5.
If
relativeIndex
≥ 0, then
a.
Let
be
relativeIndex
6.
Else,
a.
Let
be
len
relativeIndex
7.
If
< 0 or
len
, return
undefined
8.
Return the
substring
of
from
to
+ 1.
22.1.3.2
String.prototype.charAt (
pos
Note 1
This method returns a single element String containing the code unit at index
pos
within the String value resulting from converting this object to a
String. If there is no element at that index, the result is the empty
String. The result
is a String
value, not a String object.
If
pos
is an
integral Number
, then the result of
x.charAt(pos)
is equivalent to the result of
x.substring(pos, pos + 1)
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
position
be ?
ToIntegerOrInfinity
pos
).
4.
Let
size
be the length of
5.
If
position
< 0 or
position
size
, return the empty String.
6.
Return the
substring
of
from
position
to
position
+ 1.
Note 2
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.3
String.prototype.charCodeAt (
pos
Note 1
This method returns a Number (a non-negative
integral Number
less than 2
16
) that is the numeric value of the code unit at index
pos
within the String resulting from converting this object to a String. If there is no element at that index, the result is
NaN
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
position
be ?
ToIntegerOrInfinity
pos
).
4.
Let
size
be the length of
5.
If
position
< 0 or
position
size
, return
NaN
6.
Return the
Number value for
the numeric value of the code unit at index
position
within the String
Note 2
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
22.1.3.4
String.prototype.codePointAt (
pos
Note 1
This method returns a non-negative
integral Number
less than or equal to
0x10FFFF
that is the numeric value of the UTF-16 encoded code point (
6.1.4
) starting at the string element at index
pos
within the String resulting from converting this object to a String. If there is no element at that index, the result is
undefined
. If a valid UTF-16
surrogate pair
does not begin at
pos
, the result is the code unit at
pos
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
position
be ?
ToIntegerOrInfinity
pos
).
4.
Let
size
be the length of
5.
If
position
< 0 or
position
size
, return
undefined
6.
Let
cp
be
CodePointAt
position
).
7.
Return
cp
.[[CodePoint]]).
Note 2
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
22.1.3.5
String.prototype.concat ( ...
args
Note 1
When this method is called it returns the String value consisting of the code units of the
this
value (converted to a String) followed by the code units of each of the arguments converted to a String. The result
is a String
value, not a String object.
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
be
4.
For each element
next
of
args
, do
a.
Let
nextString
be ?
ToString
next
).
b.
Set
to the
string-concatenation
of
and
nextString
5.
Return
The
"length"
property of this method is
Note 2
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
22.1.3.6
String.prototype.constructor
The initial value of
String.prototype.constructor
is
%String%
22.1.3.7
String.prototype.endsWith (
searchString
[ ,
endPosition
] )
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
isRegExp
be ?
IsRegExp
searchString
).
4.
If
isRegExp
is
true
, throw a
TypeError
exception.
5.
Let
searchStr
be ?
ToString
searchString
).
6.
Let
len
be the length of
7.
If
endPosition
is
undefined
, let
pos
be
len
; else let
pos
be ?
ToIntegerOrInfinity
endPosition
).
8.
Let
end
be the result of
clamping
pos
between 0 and
len
9.
Let
searchLength
be the length of
searchStr
10.
If
searchLength
= 0, return
true
11.
Let
start
be
end
searchLength
12.
If
start
< 0, return
false
13.
Let
substring
be the
substring
of
from
start
to
end
14.
If
substring
is
searchStr
, return
true
15.
Return
false
Note 1
This method returns
true
if the sequence of code units of
searchString
converted to a String is the same as the corresponding code units of this object (converted to a String) starting at
endPosition
- length(this). Otherwise it returns
false
Note 2
Throwing an exception if the first argument is a RegExp is
specified in order to allow future editions to define extensions that
allow such argument values.
Note 3
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.8
String.prototype.includes (
searchString
[ ,
position
] )
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
isRegExp
be ?
IsRegExp
searchString
).
4.
If
isRegExp
is
true
, throw a
TypeError
exception.
5.
Let
searchStr
be ?
ToString
searchString
).
6.
Let
pos
be ?
ToIntegerOrInfinity
position
).
7.
Assert
: If
position
is
undefined
, then
pos
is 0.
8.
Let
len
be the length of
9.
Let
start
be the result of
clamping
pos
between 0 and
len
10.
Let
index
be
StringIndexOf
searchStr
start
).
11.
If
index
≠ -1, return
true
12.
Return
false
Note 1
If
searchString
appears as a
substring
of the result of converting this object to a String, at one or more indices that are greater than or equal to
position
, this function returns
true
; otherwise, it returns
false
. If
position
is
undefined
, 0 is assumed, so as to search all of the String.
Note 2
Throwing an exception if the first argument is a RegExp is
specified in order to allow future editions to define extensions that
allow such argument values.
Note 3
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.9
String.prototype.indexOf (
searchString
[ ,
position
] )
Note 1
If
searchString
appears as a
substring
of the result of converting this object to a String, at one or more indices that are greater than or equal to
position
, then the smallest such index is returned; otherwise,
-1
is returned. If
position
is
undefined
+0
is assumed, so as to search all of the String.
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
searchStr
be ?
ToString
searchString
).
4.
Let
pos
be ?
ToIntegerOrInfinity
position
).
5.
Assert
: If
position
is
undefined
, then
pos
is 0.
6.
Let
len
be the length of
7.
Let
start
be the result of
clamping
pos
between 0 and
len
8.
Return
StringIndexOf
searchStr
start
)).
Note 2
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.10
String.prototype.lastIndexOf (
searchString
[ ,
position
] )
Note 1
If
searchString
appears as a
substring
of the result of converting this object to a String at one or more indices that are smaller than or equal to
position
, then the greatest such index is returned; otherwise,
-1
is returned. If
position
is
undefined
, the length of the String value is assumed, so as to search all of the String.
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
searchStr
be ?
ToString
searchString
).
4.
Let
numPos
be ?
ToNumber
position
).
5.
Assert
: If
position
is
undefined
, then
numPos
is
NaN
6.
If
numPos
is
NaN
, let
pos
be +∞; otherwise, let
pos
be !
ToIntegerOrInfinity
numPos
).
7.
Let
len
be the length of
8.
Let
searchLen
be the length of
searchStr
9.
Let
start
be the result of
clamping
pos
between 0 and
len
searchLen
10.
If
searchStr
is the empty String, return
start
).
11.
For each
integer
such that 0 ≤
start
, in descending order, do
a.
Let
candidate
be the
substring
of
from
to
searchLen
b.
If
candidate
is
searchStr
, return
).
12.
Return
-1
Note 2
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.11
String.prototype.localeCompare (
that
[ ,
reserved1
[ ,
reserved2
] ] )
An ECMAScript implementation that includes the ECMA-402
Internationalization API must implement this method as specified in the
ECMA-402 specification. If an ECMAScript implementation does not include
the ECMA-402 API the following specification of this method is used:
This method returns a Number other than
NaN
representing the result of an
implementation-defined
locale-sensitive String comparison of the
this
value (converted to a String
) with
that
(converted to a String
thatValue
). The result is intended to correspond with a
sort order
of String values according to conventions of the
host environment
's current locale, and will be negative when
is ordered before
thatValue
, positive when
is ordered after
thatValue
, and zero in all other cases (representing no relative ordering between
and
thatValue
).
Before performing the comparisons, this method performs the following steps to prepare the Strings:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
thatValue
be ?
ToString
that
).
The meaning of the optional second and third parameters to
this method are defined in the ECMA-402 specification; implementations
that do not include ECMA-402 support must not assign any other
interpretation to those parameter positions.
The actual return values are
implementation-defined
to permit encoding additional information in them, but this method,
when considered as a method of two arguments, is required to be a
consistent comparator
defining a total ordering on the set of all Strings. This method is
also required to recognize and honour canonical equivalence according to
the Unicode Standard, including returning
+0
when comparing distinguishable Strings that are canonically equivalent.
Note 1
This method itself is not directly suitable as an argument to
Array.prototype.sort
because the latter requires a function of two arguments.
Note 2
This method may rely on whatever language- and/or
locale-sensitive comparison functionality is available to the ECMAScript
environment from the
host environment
, and is intended to compare according to the conventions of the
host environment
's
current locale. However, regardless of comparison capabilities, this
method must recognize and honour canonical equivalence according to the
Unicode Standard—for example, the following comparisons must all return
+0
// Å ANGSTROM SIGN vs.
// Å LATIN CAPITAL LETTER A + COMBINING RING ABOVE
"\u212B"
localeCompare
"A\u030A"
// Ω OHM SIGN vs.
// Ω GREEK CAPITAL LETTER OMEGA
"\u2126"
localeCompare
"\u03A9"
// ṩ LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE vs.
// ṩ LATIN SMALL LETTER S + COMBINING DOT ABOVE + COMBINING DOT BELOW
"\u1E69"
localeCompare
"s\u0307\u0323"
// ḍ̇ LATIN SMALL LETTER D WITH DOT ABOVE + COMBINING DOT BELOW vs.
// ḍ̇ LATIN SMALL LETTER D WITH DOT BELOW + COMBINING DOT ABOVE
"\u1E0B\u0323"
localeCompare
"\u1E0D\u0307"
// 가 HANGUL CHOSEONG KIYEOK + HANGUL JUNGSEONG A vs.
// 가 HANGUL SYLLABLE GA
"\u1100\u1161"
localeCompare
"\uAC00"
For a definition and discussion of canonical equivalence see the Unicode Standard, chapters 2 and 3, as well as
Unicode Standard Annex #15, Unicode Normalization Forms
and
Unicode Technical Note #5, Canonical Equivalence in Applications
. Also see
Unicode Technical Standard #10, Unicode Collation Algorithm
It is recommended that this method should not honour
Unicode compatibility equivalents or compatibility decompositions as
defined in the Unicode Standard, chapter 3, section 3.7.
Note 3
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.12
String.prototype.match (
regexp
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
If
regexp
is neither
undefined
nor
null
, then
a.
Let
matcher
be ?
GetMethod
regexp
@@match
).
b.
If
matcher
is not
undefined
, then
i.
Return ?
Call
matcher
regexp
, «
»).
3.
Let
be ?
ToString
).
4.
Let
rx
be ?
RegExpCreate
regexp
undefined
).
5.
Return ?
Invoke
rx
@@match
, «
»).
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.13
String.prototype.matchAll (
regexp
This method performs a regular expression match of the String representing the
this
value against
regexp
and returns an iterator. Each iteration result's value is an Array containing the results of the match, or
null
if the String did not match.
It performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
If
regexp
is neither
undefined
nor
null
, then
a.
Let
isRegExp
be ?
IsRegExp
regexp
).
b.
If
isRegExp
is
true
, then
i.
Let
flags
be ?
Get
regexp
"flags"
).
ii.
Perform ?
RequireObjectCoercible
flags
).
iii.
If ?
ToString
flags
) does not contain
"g"
, throw a
TypeError
exception.
c.
Let
matcher
be ?
GetMethod
regexp
@@matchAll
).
d.
If
matcher
is not
undefined
, then
i.
Return ?
Call
matcher
regexp
, «
»).
3.
Let
be ?
ToString
).
4.
Let
rx
be ?
RegExpCreate
regexp
"g"
).
5.
Return ?
Invoke
rx
@@matchAll
, «
»).
Note 1
This method is intentionally generic, it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
Note 2
Similarly to
String.prototype.split
String.prototype.matchAll
is designed to typically act without mutating its inputs.
22.1.3.14
String.prototype.normalize ( [
form
] )
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
If
form
is
undefined
, let
be
"NFC"
4.
Else, let
be ?
ToString
form
).
5.
If
is not one of
"NFC"
"NFD"
"NFKC"
, or
"NFKD"
, throw a
RangeError
exception.
6.
Let
ns
be the String value that is the result of normalizing
into the normalization form named by
as specified in
7.
Return
ns
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
22.1.3.15
String.prototype.padEnd (
maxLength
[ ,
fillString
] )
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Return ?
StringPad
maxLength
fillString
end
).
22.1.3.16
String.prototype.padStart (
maxLength
[ ,
fillString
] )
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Return ?
StringPad
maxLength
fillString
start
).
22.1.3.16.1
StringPad (
maxLength
fillString
placement
The abstract operation StringPad takes arguments
(an
ECMAScript language value
),
maxLength
(an
ECMAScript language value
),
fillString
(an
ECMAScript language value
), and
placement
start
or
end
) and returns either a
normal completion containing
a String or a
throw completion
. It performs the following steps when called:
1.
Let
be ?
ToString
).
2.
Let
intMaxLength
be
(?
ToLength
maxLength
)).
3.
Let
stringLength
be the length of
4.
If
intMaxLength
stringLength
, return
5.
If
fillString
is
undefined
, let
filler
be the String value consisting solely of the code unit 0x0020 (SPACE).
6.
Else, let
filler
be ?
ToString
fillString
).
7.
If
filler
is the empty String, return
8.
Let
fillLen
be
intMaxLength
stringLength
9.
Let
truncatedStringFiller
be the String value consisting of repeated concatenations of
filler
truncated to length
fillLen
10.
If
placement
is
start
, return the
string-concatenation
of
truncatedStringFiller
and
11.
Else, return the
string-concatenation
of
and
truncatedStringFiller
Note 1
The argument
maxLength
will be clamped such that it can be no smaller than the length of
Note 2
The argument
fillString
defaults to
" "
(the String value consisting of the code unit 0x0020 SPACE).
22.1.3.16.2
ToZeroPaddedDecimalString (
minLength
The abstract operation ToZeroPaddedDecimalString takes arguments
(a non-negative
integer
) and
minLength
(a non-negative
integer
) and returns a String. It performs the following steps when called:
1.
Let
be the String representation of
, formatted as a decimal number.
2.
Return !
StringPad
minLength
),
"0"
start
).
22.1.3.17
String.prototype.repeat (
count
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
be ?
ToIntegerOrInfinity
count
).
4.
If
< 0 or
= +∞, throw a
RangeError
exception.
5.
If
= 0, return the empty String.
6.
Return the String value that is made from
copies of
appended together.
Note 1
This method creates the String value consisting of the code units of the
this
value (converted to String) repeated
count
times.
Note 2
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.18
String.prototype.replace (
searchValue
replaceValue
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
If
searchValue
is neither
undefined
nor
null
, then
a.
Let
replacer
be ?
GetMethod
searchValue
@@replace
).
b.
If
replacer
is not
undefined
, then
i.
Return ?
Call
replacer
searchValue
, «
replaceValue
»).
3.
Let
string
be ?
ToString
).
4.
Let
searchString
be ?
ToString
searchValue
).
5.
Let
functionalReplace
be
IsCallable
replaceValue
).
6.
If
functionalReplace
is
false
, then
a.
Set
replaceValue
to ?
ToString
replaceValue
).
7.
Let
searchLength
be the length of
searchString
8.
Let
position
be
StringIndexOf
string
searchString
, 0).
9.
If
position
= -1, return
string
10.
Let
preceding
be the
substring
of
string
from 0 to
position
11.
Let
following
be the
substring
of
string
from
position
searchLength
12.
If
functionalReplace
is
true
, then
a.
Let
replacement
be ?
ToString
(?
Call
replaceValue
undefined
, «
searchString
position
),
string
»)).
13.
Else,
a.
Assert
replaceValue
is a String
b.
Let
captures
be a new empty
List
c.
Let
replacement
be !
GetSubstitution
searchString
string
position
captures
undefined
replaceValue
).
14.
Return the
string-concatenation
of
preceding
replacement
, and
following
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.18.1
GetSubstitution (
matched
str
position
captures
namedCaptures
replacementTemplate
The abstract operation GetSubstitution takes arguments
matched
(a String),
str
(a String),
position
(a non-negative
integer
),
captures
(a possibly empty
List
, each of whose elements
is a String
or
undefined
),
namedCaptures
(an Object or
undefined
), and
replacementTemplate
(a String) and returns either a
normal completion containing
a String or a
throw completion
. For the purposes of this abstract operation, a
decimal digit
is a code unit in the
inclusive interval
from 0x0030 (DIGIT ZERO) to 0x0039 (DIGIT NINE). It performs the following steps when called:
1.
Let
stringLength
be the length of
str
2.
Assert
position
stringLength
3.
Let
result
be the empty String.
4.
Let
templateRemainder
be
replacementTemplate
5.
Repeat, while
templateRemainder
is not the empty String,
a.
NOTE: The following steps isolate
ref
(a prefix of
templateRemainder
), determine
refReplacement
(its replacement), and then append that replacement to
result
b.
If
templateRemainder
starts with
"$$"
, then
i.
Let
ref
be
"$$"
ii.
Let
refReplacement
be
"$"
c.
Else if
templateRemainder
starts with
"$`"
, then
i.
Let
ref
be
"$`"
ii.
Let
refReplacement
be the
substring
of
str
from 0 to
position
d.
Else if
templateRemainder
starts with
"$&"
, then
i.
Let
ref
be
"$&"
ii.
Let
refReplacement
be
matched
e.
Else if
templateRemainder
starts with
"$'"
(0x0024 (DOLLAR SIGN) followed by 0x0027 (APOSTROPHE)), then
i.
Let
ref
be
"$'"
ii.
Let
matchLength
be the length of
matched
iii.
Let
tailPos
be
position
matchLength
iv.
Let
refReplacement
be the
substring
of
str
from
min
tailPos
stringLength
).
v.
NOTE:
tailPos
can exceed
stringLength
only if this abstract operation was invoked by a call to the intrinsic
@@replace
method of
%RegExp.prototype%
on an object whose
"exec"
property is not the intrinsic %RegExp.prototype.exec%.
f.
Else if
templateRemainder
starts with
"$"
followed by 1 or more decimal digits, then
i.
If
templateRemainder
starts with
"$"
followed by 2 or more decimal digits, let
digitCount
be 2. Otherwise, let
digitCount
be 1.
ii.
Let
ref
be the
substring
of
templateRemainder
from 0 to 1 +
digitCount
iii.
Let
digits
be the
substring
of
templateRemainder
from 1 to 1 +
digitCount
iv.
Let
index
be
StringToNumber
digits
)).
v.
Assert
: 0 ≤
index
≤ 99.
vi.
Let
captureLen
be the number of elements in
captures
vii.
If 1 ≤
index
captureLen
, then
1.
Let
capture
be
captures
index
- 1].
2.
If
capture
is
undefined
, then
a.
Let
refReplacement
be the empty String.
3.
Else,
a.
Let
refReplacement
be
capture
viii.
Else,
1.
Let
refReplacement
be
ref
g.
Else if
templateRemainder
starts with
"$<"
, then
i.
Let
gtPos
be
StringIndexOf
templateRemainder
">"
, 0).
ii.
If
gtPos
= -1 or
namedCaptures
is
undefined
, then
1.
Let
ref
be
"$<"
2.
Let
refReplacement
be
ref
iii.
Else,
1.
Let
ref
be the
substring
of
templateRemainder
from 0 to
gtPos
+ 1.
2.
Let
groupName
be the
substring
of
templateRemainder
from 2 to
gtPos
3.
Assert
namedCaptures
is an Object
4.
Let
capture
be ?
Get
namedCaptures
groupName
).
5.
If
capture
is
undefined
, then
a.
Let
refReplacement
be the empty String.
6.
Else,
a.
Let
refReplacement
be ?
ToString
capture
).
h.
Else,
i.
Let
ref
be the
substring
of
templateRemainder
from 0 to 1.
ii.
Let
refReplacement
be
ref
i.
Let
refLength
be the length of
ref
j.
Set
templateRemainder
to the
substring
of
templateRemainder
from
refLength
k.
Set
result
to the
string-concatenation
of
result
and
refReplacement
6.
Return
result
22.1.3.19
String.prototype.replaceAll (
searchValue
replaceValue
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
If
searchValue
is neither
undefined
nor
null
, then
a.
Let
isRegExp
be ?
IsRegExp
searchValue
).
b.
If
isRegExp
is
true
, then
i.
Let
flags
be ?
Get
searchValue
"flags"
).
ii.
Perform ?
RequireObjectCoercible
flags
).
iii.
If ?
ToString
flags
) does not contain
"g"
, throw a
TypeError
exception.
c.
Let
replacer
be ?
GetMethod
searchValue
@@replace
).
d.
If
replacer
is not
undefined
, then
i.
Return ?
Call
replacer
searchValue
, «
replaceValue
»).
3.
Let
string
be ?
ToString
).
4.
Let
searchString
be ?
ToString
searchValue
).
5.
Let
functionalReplace
be
IsCallable
replaceValue
).
6.
If
functionalReplace
is
false
, then
a.
Set
replaceValue
to ?
ToString
replaceValue
).
7.
Let
searchLength
be the length of
searchString
8.
Let
advanceBy
be
max
(1,
searchLength
).
9.
Let
matchPositions
be a new empty
List
10.
Let
position
be
StringIndexOf
string
searchString
, 0).
11.
Repeat, while
position
≠ -1,
a.
Append
position
to
matchPositions
b.
Set
position
to
StringIndexOf
string
searchString
position
advanceBy
).
12.
Let
endOfLastMatch
be 0.
13.
Let
result
be the empty String.
14.
For each element
of
matchPositions
, do
a.
Let
preserved
be the
substring
of
string
from
endOfLastMatch
to
b.
If
functionalReplace
is
true
, then
i.
Let
replacement
be ?
ToString
(?
Call
replaceValue
undefined
, «
searchString
),
string
»)).
c.
Else,
i.
Assert
replaceValue
is a String
ii.
Let
captures
be a new empty
List
iii.
Let
replacement
be !
GetSubstitution
searchString
string
captures
undefined
replaceValue
).
d.
Set
result
to the
string-concatenation
of
result
preserved
, and
replacement
e.
Set
endOfLastMatch
to
searchLength
15.
If
endOfLastMatch
< the length of
string
, then
a.
Set
result
to the
string-concatenation
of
result
and the
substring
of
string
from
endOfLastMatch
16.
Return
result
22.1.3.20
String.prototype.search (
regexp
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
If
regexp
is neither
undefined
nor
null
, then
a.
Let
searcher
be ?
GetMethod
regexp
@@search
).
b.
If
searcher
is not
undefined
, then
i.
Return ?
Call
searcher
regexp
, «
»).
3.
Let
string
be ?
ToString
).
4.
Let
rx
be ?
RegExpCreate
regexp
undefined
).
5.
Return ?
Invoke
rx
@@search
, «
string
»).
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.21
String.prototype.slice (
start
end
This method returns a
substring
of the result of converting this object to a String, starting from index
start
and running to, but not including, index
end
(or through the end of the String if
end
is
undefined
). If
start
is negative, it is treated as
sourceLength
start
where
sourceLength
is the length of the String. If
end
is negative, it is treated as
sourceLength
end
where
sourceLength
is the length of the String. The result
is a String
value, not a String object.
It performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
len
be the length of
4.
Let
intStart
be ?
ToIntegerOrInfinity
start
).
5.
If
intStart
= -∞, let
from
be 0.
6.
Else if
intStart
< 0, let
from
be
max
len
intStart
, 0).
7.
Else, let
from
be
min
intStart
len
).
8.
If
end
is
undefined
, let
intEnd
be
len
; else let
intEnd
be ?
ToIntegerOrInfinity
end
).
9.
If
intEnd
= -∞, let
to
be 0.
10.
Else if
intEnd
< 0, let
to
be
max
len
intEnd
, 0).
11.
Else, let
to
be
min
intEnd
len
).
12.
If
from
to
, return the empty String.
13.
Return the
substring
of
from
from
to
to
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
22.1.3.22
String.prototype.split (
separator
limit
This method returns an Array into which substrings of the
result of converting this object to a String have been stored. The
substrings are determined by searching from left to right for
occurrences of
separator
; these occurrences are not part of any String in the returned array, but serve to divide up the String value. The value of
separator
may be a String of any length or it may be an object, such as a RegExp, that has a
@@split
method.
It performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
If
separator
is neither
undefined
nor
null
, then
a.
Let
splitter
be ?
GetMethod
separator
@@split
).
b.
If
splitter
is not
undefined
, then
i.
Return ?
Call
splitter
separator
, «
limit
»).
3.
Let
be ?
ToString
).
4.
If
limit
is
undefined
, let
lim
be 2
32
- 1; else let
lim
be
(?
ToUint32
limit
)).
5.
Let
be ?
ToString
separator
).
6.
If
lim
= 0, then
a.
Return
CreateArrayFromList
(« »).
7.
If
separator
is
undefined
, then
a.
Return
CreateArrayFromList

»).
8.
Let
separatorLength
be the length of
9.
If
separatorLength
= 0, then
a.
Let
head
be the
substring
of
from 0 to
lim
b.
Let
codeUnits
be a
List
consisting of the sequence of code units that are the elements of
head
c.
Return
CreateArrayFromList
codeUnits
).
10.
If
is the empty String, return
CreateArrayFromList

»).
11.
Let
substrings
be a new empty
List
12.
Let
be 0.
13.
Let
be
StringIndexOf
, 0).
14.
Repeat, while
≠ -1,
a.
Let
be the
substring
of
from
to
b.
Append
to
substrings
c.
If the number of elements in
substrings
is
lim
, return
CreateArrayFromList
substrings
).
d.
Set
to
separatorLength
e.
Set
to
StringIndexOf
).
15.
Let
be the
substring
of
from
16.
Append
to
substrings
17.
Return
CreateArrayFromList
substrings
).
Note 1
The value of
separator
may be an empty String. In this case,
separator
does not match the empty
substring
at the beginning or end of the input String, nor does it match the empty
substring
at the end of the previous separator match. If
separator
is the empty String, the String is split up into individual code unit
elements; the length of the result array equals the length of the
String, and each
substring
contains one code unit.
If the
this
value is (or converts to) the empty String, the result depends on whether
separator
can match the empty String. If it can, the result array contains no
elements. Otherwise, the result array contains one element, which is the
empty String.
If
separator
is
undefined
, then the result array contains just one String, which is the
this
value (converted to a String). If
limit
is not
undefined
, then the output array is truncated so that it contains no more than
limit
elements.
Note 2
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.23
String.prototype.startsWith (
searchString
[ ,
position
] )
This method performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
isRegExp
be ?
IsRegExp
searchString
).
4.
If
isRegExp
is
true
, throw a
TypeError
exception.
5.
Let
searchStr
be ?
ToString
searchString
).
6.
Let
len
be the length of
7.
If
position
is
undefined
, let
pos
be 0; else let
pos
be ?
ToIntegerOrInfinity
position
).
8.
Let
start
be the result of
clamping
pos
between 0 and
len
9.
Let
searchLength
be the length of
searchStr
10.
If
searchLength
= 0, return
true
11.
Let
end
be
start
searchLength
12.
If
end
len
, return
false
13.
Let
substring
be the
substring
of
from
start
to
end
14.
If
substring
is
searchStr
, return
true
15.
Return
false
Note 1
This method returns
true
if the sequence of code units of
searchString
converted to a String is the same as the corresponding code units of this object (converted to a String) starting at index
position
. Otherwise it returns
false
Note 2
Throwing an exception if the first argument is a RegExp is
specified in order to allow future editions to define extensions that
allow such argument values.
Note 3
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.24
String.prototype.substring (
start
end
This method returns a
substring
of the result of converting this object to a String, starting from index
start
and running to, but not including, index
end
of the String (or through the end of the String if
end
is
undefined
). The result
is a String
value, not a String object.
If either argument is
NaN
or negative, it
is replaced with zero; if either argument is strictly greater than the
length of the String, it is replaced with the length of the String.
If
start
is strictly greater than
end
, they are swapped.
It performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
len
be the length of
4.
Let
intStart
be ?
ToIntegerOrInfinity
start
).
5.
If
end
is
undefined
, let
intEnd
be
len
; else let
intEnd
be ?
ToIntegerOrInfinity
end
).
6.
Let
finalStart
be the result of
clamping
intStart
between 0 and
len
7.
Let
finalEnd
be the result of
clamping
intEnd
between 0 and
len
8.
Let
from
be
min
finalStart
finalEnd
).
9.
Let
to
be
max
finalStart
finalEnd
).
10.
Return the
substring
of
from
from
to
to
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.25
String.prototype.toLocaleLowerCase ( [
reserved1
[ ,
reserved2
] ] )
An ECMAScript implementation that includes the ECMA-402
Internationalization API must implement this method as specified in the
ECMA-402 specification. If an ECMAScript implementation does not include
the ECMA-402 API the following specification of this method is used:
This method interprets a String value as a sequence of UTF-16 encoded code points, as described in
6.1.4
It works exactly the same as
toLowerCase
except that it is intended to yield a locale-sensitive result corresponding with conventions of the
host environment
's
current locale. There will only be a difference in the few cases (such
as Turkish) where the rules for that language conflict with the regular
Unicode case mappings.
The meaning of the optional parameters to this method are
defined in the ECMA-402 specification; implementations that do not
include ECMA-402 support must not use those parameter positions for
anything else.
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.26
String.prototype.toLocaleUpperCase ( [
reserved1
[ ,
reserved2
] ] )
An ECMAScript implementation that includes the ECMA-402
Internationalization API must implement this method as specified in the
ECMA-402 specification. If an ECMAScript implementation does not include
the ECMA-402 API the following specification of this method is used:
This method interprets a String value as a sequence of UTF-16 encoded code points, as described in
6.1.4
It works exactly the same as
toUpperCase
except that it is intended to yield a locale-sensitive result corresponding with conventions of the
host environment
's
current locale. There will only be a difference in the few cases (such
as Turkish) where the rules for that language conflict with the regular
Unicode case mappings.
The meaning of the optional parameters to this method are
defined in the ECMA-402 specification; implementations that do not
include ECMA-402 support must not use those parameter positions for
anything else.
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.27
String.prototype.toLowerCase ( )
This method interprets a String value as a sequence of UTF-16 encoded code points, as described in
6.1.4
It performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
sText
be
StringToCodePoints
).
4.
Let
lowerText
be the result of toLowercase(
sText
), according to the Unicode Default Case Conversion algorithm.
5.
Let
be
CodePointsToString
lowerText
).
6.
Return
The result must be derived according to the
locale-insensitive case mappings in the Unicode Character Database (this
explicitly includes not only the file
UnicodeData.txt
, but also all locale-insensitive mappings in the file
SpecialCasing.txt
that accompanies it).
Note 1
The case mapping of some code points may produce multiple
code points. In this case the result String may not be the same length
as the source String. Because both
toUpperCase
and
toLowerCase
have context-sensitive behaviour, the methods are not symmetrical. In other words,
s.toUpperCase().toLowerCase()
is not necessarily equal to
s.toLowerCase()
Note 2
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.28
String.prototype.toString ( )
This method performs the following steps when called:
1.
Return ?
thisStringValue
this
value).
Note
For a String object, this method happens to return the same thing as the
valueOf
method.
22.1.3.29
String.prototype.toUpperCase ( )
This method interprets a String value as a sequence of UTF-16 encoded code points, as described in
6.1.4
It behaves in exactly the same way as
String.prototype.toLowerCase
, except that the String is mapped using the toUppercase algorithm of the Unicode Default Case Conversion.
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.30
String.prototype.trim ( )
This method interprets a String value as a sequence of UTF-16 encoded code points, as described in
6.1.4
It performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
TrimString
start+end
).
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.30.1
TrimString (
string
where
The abstract operation TrimString takes arguments
string
(an
ECMAScript language value
) and
where
start
end
, or
start+end
) and returns either a
normal completion containing
a String or a
throw completion
. It interprets
string
as a sequence of UTF-16 encoded code points, as described in
6.1.4
. It performs the following steps when called:
1.
Let
str
be ?
RequireObjectCoercible
string
).
2.
Let
be ?
ToString
str
).
3.
If
where
is
start
, let
be the String value that is a copy of
with leading white space removed.
4.
Else if
where
is
end
, let
be the String value that is a copy of
with trailing white space removed.
5.
Else,
a.
Assert
where
is
start+end
b.
Let
be the String value that is a copy of
with both leading and trailing white space removed.
6.
Return
The definition of white space is the union of
WhiteSpace
and
LineTerminator
When determining whether a Unicode code point is in Unicode general
category “Space_Separator” (“Zs”), code unit sequences are interpreted
as UTF-16 encoded code point sequences as specified in
6.1.4
22.1.3.31
String.prototype.trimEnd ( )
This method interprets a String value as a sequence of UTF-16 encoded code points, as described in
6.1.4
It performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
TrimString
end
).
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.32
String.prototype.trimStart ( )
This method interprets a String value as a sequence of UTF-16 encoded code points, as described in
6.1.4
It performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
TrimString
start
).
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore, it can be transferred to other kinds of objects for use as a method.
22.1.3.33
String.prototype.valueOf ( )
This method performs the following steps when called:
1.
Return ?
thisStringValue
this
value).
22.1.3.34
String.prototype [ @@iterator ] ( )
This method returns an Iterator object (
27.1.1.2
) that iterates over the code points of a String value, returning each code point as a String value.
It performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
closure
be a new
Abstract Closure
with no parameters that captures
and performs the following steps when called:
a.
Let
len
be the length of
b.
Let
position
be 0.
c.
Repeat, while
position
len
i.
Let
cp
be
CodePointAt
position
).
ii.
Let
nextIndex
be
position
cp
.[[CodeUnitCount]].
iii.
Let
resultString
be the
substring
of
from
position
to
nextIndex
iv.
Set
position
to
nextIndex
v.
Perform ?
GeneratorYield
CreateIterResultObject
resultString
false
)).
d.
Return
undefined
4.
Return
CreateIteratorFromClosure
closure
"%StringIteratorPrototype%"
%StringIteratorPrototype%
).
The value of the
"name"
property of this method is
"[Symbol.iterator]"
22.1.4
Properties of String Instances
String instances are
String exotic objects
and have the internal methods specified for such objects. String instances inherit properties from the
String prototype object
. String instances also have a [[StringData]] internal slot.
String instances have a
"length"
property, and a set of enumerable properties with
integer
-indexed names.
22.1.4.1
length
The number of elements in the String value represented by this String object.
Once a String object is initialized, this property is unchanging. It has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
22.1.5
String Iterator Objects
A String Iterator is an object, that represents a specific
iteration over some specific String instance object. There is not a
named
constructor
for String Iterator objects. Instead, String iterator objects are
created by calling certain methods of String instance objects.
22.1.5.1
The %StringIteratorPrototype% Object
The
%StringIteratorPrototype%
object:
has properties that are inherited by all String Iterator Objects.
is an
ordinary object
has a [[Prototype]] internal slot whose value is
%IteratorPrototype%
has the following properties:
22.1.5.1.1
%StringIteratorPrototype%.next ( )
1.
Return ?
GeneratorResume
this
value,
empty
"%StringIteratorPrototype%"
).
22.1.5.1.2
%StringIteratorPrototype% [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"String Iterator"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
22.2
RegExp (Regular Expression) Objects
A RegExp object contains a regular expression and the associated flags.
Note
The form and functionality of regular expressions is modelled
after the regular expression facility in the Perl 5 programming
language.
22.2.1
Patterns
The RegExp
constructor
applies the following grammar to the input pattern String. An error
occurs if the grammar cannot interpret the String as an expansion of
Pattern
Syntax
Pattern
[UnicodeMode, N]
::
Disjunction
[?UnicodeMode, ?N]
Disjunction
[UnicodeMode, N]
::
Alternative
[?UnicodeMode, ?N]
Alternative
[?UnicodeMode, ?N]
Disjunction
[?UnicodeMode, ?N]
Alternative
[UnicodeMode, N]
::
[empty]
Alternative
[?UnicodeMode, ?N]
Term
[?UnicodeMode, ?N]
Term
[UnicodeMode, N]
::
Assertion
[?UnicodeMode, ?N]
Atom
[?UnicodeMode, ?N]
Atom
[?UnicodeMode, ?N]
Quantifier
Assertion
[UnicodeMode, N]
::
\b
\B
(?=
Disjunction
[?UnicodeMode, ?N]
(?!
Disjunction
[?UnicodeMode, ?N]
(?<=
Disjunction
[?UnicodeMode, ?N]
(?Disjunction
[?UnicodeMode, ?N]
Quantifier
::
QuantifierPrefix
QuantifierPrefix
QuantifierPrefix
::
DecimalDigits
[~Sep]
DecimalDigits
[~Sep]
,}
DecimalDigits
[~Sep]
DecimalDigits
[~Sep]
Atom
[UnicodeMode, N]
::
PatternCharacter
AtomEscape
[?UnicodeMode, ?N]
CharacterClass
[?UnicodeMode]
GroupSpecifier
[?UnicodeMode]
opt
Disjunction
[?UnicodeMode, ?N]
(?:
Disjunction
[?UnicodeMode, ?N]
SyntaxCharacter
::
one of
PatternCharacter
::
SourceCharacter
but not
SyntaxCharacter
AtomEscape
[UnicodeMode, N]
::
DecimalEscape
CharacterClassEscape
[?UnicodeMode]
CharacterEscape
[?UnicodeMode]
[+N]
GroupName
[?UnicodeMode]
CharacterEscape
[UnicodeMode]
::
ControlEscape
AsciiLetter
[lookahead ∉
DecimalDigit
HexEscapeSequence
RegExpUnicodeEscapeSequence
[?UnicodeMode]
IdentityEscape
[?UnicodeMode]
ControlEscape
::
one of
GroupSpecifier
[UnicodeMode]
::
GroupName
[?UnicodeMode]
GroupName
[UnicodeMode]
::
RegExpIdentifierName
[?UnicodeMode]
RegExpIdentifierName
[UnicodeMode]
::
RegExpIdentifierStart
[?UnicodeMode]
RegExpIdentifierName
[?UnicodeMode]
RegExpIdentifierPart
[?UnicodeMode]
RegExpIdentifierStart
[UnicodeMode]
::
IdentifierStartChar
RegExpUnicodeEscapeSequence
[+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart
[UnicodeMode]
::
IdentifierPartChar
RegExpUnicodeEscapeSequence
[+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpUnicodeEscapeSequence
[UnicodeMode]
::
[+UnicodeMode]
HexLeadSurrogate
\u
HexTrailSurrogate
[+UnicodeMode]
HexLeadSurrogate
[+UnicodeMode]
HexTrailSurrogate
[+UnicodeMode]
HexNonSurrogate
[~UnicodeMode]
Hex4Digits
[+UnicodeMode]
u{
CodePoint
UnicodeLeadSurrogate
::
any Unicode code point in the inclusive interval from U+D800 to U+DBFF
UnicodeTrailSurrogate
::
any Unicode code point in the inclusive interval from U+DC00 to U+DFFF
Each
\u
HexTrailSurrogate
for which the choice of associated
HexLeadSurrogate
is ambiguous shall be associated with the nearest possible
HexLeadSurrogate
that would otherwise have no corresponding
\u
HexTrailSurrogate
HexLeadSurrogate
::
Hex4Digits
but only if the MV of
Hex4Digits
is in the
inclusive interval
from 0xD800 to 0xDBFF
HexTrailSurrogate
::
Hex4Digits
but only if the MV of
Hex4Digits
is in the
inclusive interval
from 0xDC00 to 0xDFFF
HexNonSurrogate
::
Hex4Digits
but only if the MV of
Hex4Digits
is not in the
inclusive interval
from 0xD800 to 0xDFFF
IdentityEscape
[UnicodeMode]
::
[+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
[~UnicodeMode]
SourceCharacter
but not
UnicodeIDContinue
DecimalEscape
::
NonZeroDigit
DecimalDigits
[~Sep]
opt
[lookahead ∉
DecimalDigit
CharacterClassEscape
[UnicodeMode]
::
[+UnicodeMode]
p{
UnicodePropertyValueExpression
[+UnicodeMode]
P{
UnicodePropertyValueExpression
UnicodePropertyValueExpression
::
UnicodePropertyName
UnicodePropertyValue
LoneUnicodePropertyNameOrValue
UnicodePropertyName
::
UnicodePropertyNameCharacters
UnicodePropertyNameCharacters
::
UnicodePropertyNameCharacter
UnicodePropertyNameCharacters
opt
UnicodePropertyValue
::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue
::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters
::
UnicodePropertyValueCharacter
UnicodePropertyValueCharacters
opt
UnicodePropertyValueCharacter
::
UnicodePropertyNameCharacter
DecimalDigit
UnicodePropertyNameCharacter
::
AsciiLetter
CharacterClass
[UnicodeMode]
::
[lookahead ≠
ClassRanges
[?UnicodeMode]
[^
ClassRanges
[?UnicodeMode]
ClassRanges
[UnicodeMode]
::
[empty]
NonemptyClassRanges
[?UnicodeMode]
NonemptyClassRanges
[UnicodeMode]
::
ClassAtom
[?UnicodeMode]
ClassAtom
[?UnicodeMode]
NonemptyClassRangesNoDash
[?UnicodeMode]
ClassAtom
[?UnicodeMode]
ClassAtom
[?UnicodeMode]
ClassRanges
[?UnicodeMode]
NonemptyClassRangesNoDash
[UnicodeMode]
::
ClassAtom
[?UnicodeMode]
ClassAtomNoDash
[?UnicodeMode]
NonemptyClassRangesNoDash
[?UnicodeMode]
ClassAtomNoDash
[?UnicodeMode]
ClassAtom
[?UnicodeMode]
ClassRanges
[?UnicodeMode]
ClassAtom
[UnicodeMode]
::
ClassAtomNoDash
[?UnicodeMode]
ClassAtomNoDash
[UnicodeMode]
::
SourceCharacter
but not one of
or
or
ClassEscape
[?UnicodeMode]
ClassEscape
[UnicodeMode]
::
[+UnicodeMode]
CharacterClassEscape
[?UnicodeMode]
CharacterEscape
[?UnicodeMode]
Note
A number of productions in this section are given alternative definitions in section
B.1.2
22.2.1.1
Static Semantics: Early Errors
Note
This section is amended in
B.1.2.1
Pattern
::
Disjunction
It is a Syntax Error if
CountLeftCapturingParensWithin
Pattern
) ≥ 2
32
- 1.
It is a Syntax Error if
Pattern
contains two or more
GroupSpecifier
s for which
CapturingGroupName
of
GroupSpecifier
is the same.
QuantifierPrefix
::
DecimalDigits
DecimalDigits
It is a Syntax Error if the MV of the first
DecimalDigits
is strictly greater than the MV of the second
DecimalDigits
AtomEscape
::
GroupName
It is a Syntax Error if
GroupSpecifiersThatMatch
GroupName
) is empty.
AtomEscape
::
DecimalEscape
It is a Syntax Error if the
CapturingGroupNumber
of
DecimalEscape
is strictly greater than
CountLeftCapturingParensWithin
(the
Pattern
containing
AtomEscape
).
NonemptyClassRanges
::
ClassAtom
ClassAtom
ClassRanges
It is a Syntax Error if
IsCharacterClass
of the first
ClassAtom
is
true
or
IsCharacterClass
of the second
ClassAtom
is
true
It is a Syntax Error if
IsCharacterClass
of the first
ClassAtom
is
false
IsCharacterClass
of the second
ClassAtom
is
false
, and the
CharacterValue
of the first
ClassAtom
is strictly greater than the
CharacterValue
of the second
ClassAtom
NonemptyClassRangesNoDash
::
ClassAtomNoDash
ClassAtom
ClassRanges
It is a Syntax Error if
IsCharacterClass
of
ClassAtomNoDash
is
true
or
IsCharacterClass
of
ClassAtom
is
true
It is a Syntax Error if
IsCharacterClass
of
ClassAtomNoDash
is
false
IsCharacterClass
of
ClassAtom
is
false
, and the
CharacterValue
of
ClassAtomNoDash
is strictly greater than the
CharacterValue
of
ClassAtom
RegExpIdentifierStart
::
RegExpUnicodeEscapeSequence
It is a Syntax Error if the
CharacterValue
of
RegExpUnicodeEscapeSequence
is not the numeric value of some code point matched by the
IdentifierStartChar
lexical grammar production.
RegExpIdentifierStart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
It is a Syntax Error if
RegExpIdentifierCodePoint
of
RegExpIdentifierStart
is not matched by the
UnicodeIDStart
lexical grammar production.
RegExpIdentifierPart
::
RegExpUnicodeEscapeSequence
It is a Syntax Error if the
CharacterValue
of
RegExpUnicodeEscapeSequence
is not the numeric value of some code point matched by the
IdentifierPartChar
lexical grammar production.
RegExpIdentifierPart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
It is a Syntax Error if
RegExpIdentifierCodePoint
of
RegExpIdentifierPart
is not matched by the
UnicodeIDContinue
lexical grammar production.
UnicodePropertyValueExpression
::
UnicodePropertyName
UnicodePropertyValue
It is a Syntax Error if the
source text matched by
UnicodePropertyName
is not a Unicode
property name
or property alias listed in the “
Property name
and aliases” column of
Table 65
It is a Syntax Error if the
source text matched by
UnicodePropertyValue
is not a property value or property value alias for the Unicode property or property alias given by the
source text matched by
UnicodePropertyName
listed in
PropertyValueAliases.txt
UnicodePropertyValueExpression
::
LoneUnicodePropertyNameOrValue
It is a Syntax Error if the
source text matched by
LoneUnicodePropertyNameOrValue
is not a Unicode property value or property value alias for the General_Category (gc) property listed in
PropertyValueAliases.txt
, nor a binary property or binary property alias listed in the “
Property name
and aliases” column of
Table 66
22.2.1.2
Static Semantics: CountLeftCapturingParensWithin (
node
The abstract operation CountLeftCapturingParensWithin takes argument
node
(a
Parse Node
) and returns a non-negative
integer
. It returns the number of left-capturing parentheses in
node
. A
left-capturing parenthesis
is any
pattern character that is matched by the
terminal of the
Atom
::
GroupSpecifier
opt
Disjunction
production.
Note
This section is amended in
B.1.2.2
It performs the following steps when called:
1.
Assert
node
is an instance of a production in
the RegExp Pattern grammar
2.
Return the number of
Atom
::
GroupSpecifier
opt
Disjunction
Parse Nodes
contained within
node
22.2.1.3
Static Semantics: CountLeftCapturingParensBefore (
node
The abstract operation CountLeftCapturingParensBefore takes argument
node
(a
Parse Node
) and returns a non-negative
integer
. It returns the number of
left-capturing parentheses
within the enclosing pattern that occur to the left of
node
Note
This section is amended in
B.1.2.2
It performs the following steps when called:
1.
Assert
node
is an instance of a production in
the RegExp Pattern grammar
2.
Let
pattern
be the
Pattern
containing
node
3.
Return the number of
Atom
::
GroupSpecifier
opt
Disjunction
Parse Nodes
contained within
pattern
that either occur before
node
or contain
node
22.2.1.4
Static Semantics: CapturingGroupNumber
The
syntax-directed operation
CapturingGroupNumber takes no arguments and returns a positive
integer
Note
This section is amended in
B.1.2.1
It is defined piecewise over the following productions:
DecimalEscape
::
NonZeroDigit
1.
Return the MV of
NonZeroDigit
DecimalEscape
::
NonZeroDigit
DecimalDigits
1.
Let
be the number of code points in
DecimalDigits
2.
Return (the MV of
NonZeroDigit
× 10
plus the MV of
DecimalDigits
).
The definitions of “the MV of
NonZeroDigit
” and “the MV of
DecimalDigits
” are in
12.9.3
22.2.1.5
Static Semantics: IsCharacterClass
The
syntax-directed operation
IsCharacterClass takes no arguments and returns a Boolean.
Note
This section is amended in
B.1.2.3
It is defined piecewise over the following productions:
ClassAtom
::
ClassAtomNoDash
::
SourceCharacter
but not one of
or
or
ClassEscape
::
CharacterEscape
1.
Return
false
ClassEscape
::
CharacterClassEscape
1.
Return
true
22.2.1.6
Static Semantics: CharacterValue
The
syntax-directed operation
CharacterValue takes no arguments and returns a non-negative
integer
Note 1
This section is amended in
B.1.2.4
It is defined piecewise over the following productions:
ClassAtom
::
1.
Return the numeric value of U+002D (HYPHEN-MINUS).
ClassAtomNoDash
::
SourceCharacter
but not one of
or
or
1.
Let
ch
be the code point matched by
SourceCharacter
2.
Return the numeric value of
ch
ClassEscape
::
1.
Return the numeric value of U+0008 (BACKSPACE).
ClassEscape
::
1.
Return the numeric value of U+002D (HYPHEN-MINUS).
CharacterEscape
::
ControlEscape
1.
Return the numeric value according to
Table 63
Table 63: ControlEscape Code Point Values
ControlEscape
Numeric Value
Code Point
Unicode Name
Symbol
U+0009
CHARACTER TABULATION

10
U+000A
LINE FEED (LF)

11
U+000B
LINE TABULATION

12
U+000C
FORM FEED (FF)

13
U+000D
CARRIAGE RETURN (CR)

CharacterEscape
::
AsciiLetter
1.
Let
ch
be the code point matched by
AsciiLetter
2.
Let
be the numeric value of
ch
3.
Return the remainder of dividing
by 32.
CharacterEscape
::
[lookahead ∉
DecimalDigit
1.
Return the numeric value of U+0000 (NULL).
Note 2
\0
represents the character and cannot be followed by a decimal digit.
CharacterEscape
::
HexEscapeSequence
1.
Return the MV of
HexEscapeSequence
RegExpUnicodeEscapeSequence
::
HexLeadSurrogate
\u
HexTrailSurrogate
1.
Let
lead
be the
CharacterValue
of
HexLeadSurrogate
2.
Let
trail
be the
CharacterValue
of
HexTrailSurrogate
3.
Let
cp
be
UTF16SurrogatePairToCodePoint
lead
trail
).
4.
Return the numeric value of
cp
RegExpUnicodeEscapeSequence
::
Hex4Digits
1.
Return the MV of
Hex4Digits
RegExpUnicodeEscapeSequence
::
u{
CodePoint
1.
Return the MV of
CodePoint
HexLeadSurrogate
::
Hex4Digits
HexTrailSurrogate
::
Hex4Digits
HexNonSurrogate
::
Hex4Digits
1.
Return the MV of
Hex4Digits
CharacterEscape
::
IdentityEscape
1.
Let
ch
be the code point matched by
IdentityEscape
2.
Return the numeric value of
ch
22.2.1.7
Static Semantics: GroupSpecifiersThatMatch (
thisGroupName
The abstract operation GroupSpecifiersThatMatch takes argument
thisGroupName
(a
GroupName
Parse Node
) and returns a
List
of
GroupSpecifier
Parse Nodes
. It performs the following steps when called:
1.
Let
name
be the
CapturingGroupName
of
thisGroupName
2.
Let
pattern
be the
Pattern
containing
thisGroupName
3.
Let
result
be a new empty
List
4.
For each
GroupSpecifier
gs
that
pattern
contains, do
a.
If the
CapturingGroupName
of
gs
is
name
, then
i.
Append
gs
to
result
5.
Return
result
22.2.1.8
Static Semantics: CapturingGroupName
The
syntax-directed operation
CapturingGroupName takes no arguments and returns a String. It is defined piecewise over the following productions:
GroupName
::
RegExpIdentifierName
1.
Let
idTextUnescaped
be
RegExpIdentifierCodePoints
of
RegExpIdentifierName
2.
Return
CodePointsToString
idTextUnescaped
).
22.2.1.9
Static Semantics: RegExpIdentifierCodePoints
The
syntax-directed operation
RegExpIdentifierCodePoints takes no arguments and returns a
List
of code points. It is defined piecewise over the following productions:
RegExpIdentifierName
::
RegExpIdentifierStart
1.
Let
cp
be
RegExpIdentifierCodePoint
of
RegExpIdentifierStart
2.
Return «
cp
».
RegExpIdentifierName
::
RegExpIdentifierName
RegExpIdentifierPart
1.
Let
cps
be
RegExpIdentifierCodePoints
of the derived
RegExpIdentifierName
2.
Let
cp
be
RegExpIdentifierCodePoint
of
RegExpIdentifierPart
3.
Return the
list-concatenation
of
cps
and «
cp
».
22.2.1.10
Static Semantics: RegExpIdentifierCodePoint
The
syntax-directed operation
RegExpIdentifierCodePoint takes no arguments and returns a code point. It is defined piecewise over the following productions:
RegExpIdentifierStart
::
IdentifierStartChar
1.
Return the code point matched by
IdentifierStartChar
RegExpIdentifierPart
::
IdentifierPartChar
1.
Return the code point matched by
IdentifierPartChar
RegExpIdentifierStart
::
RegExpUnicodeEscapeSequence
RegExpIdentifierPart
::
RegExpUnicodeEscapeSequence
1.
Return the code point whose numeric value is the
CharacterValue
of
RegExpUnicodeEscapeSequence
RegExpIdentifierStart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart
::
UnicodeLeadSurrogate
UnicodeTrailSurrogate
1.
Let
lead
be the code unit whose numeric value is the numeric value of the code point matched by
UnicodeLeadSurrogate
2.
Let
trail
be the code unit whose numeric value is the numeric value of the code point matched by
UnicodeTrailSurrogate
3.
Return
UTF16SurrogatePairToCodePoint
lead
trail
).
22.2.2
Pattern Semantics
A regular expression pattern is converted into an
Abstract Closure
using the process described below. An implementation is encouraged to
use more efficient algorithms than the ones listed below, as long as the
results are the same. The
Abstract Closure
is used as the value of a RegExp object's [[RegExpMatcher]] internal slot.
Pattern
is either a BMP pattern or a Unicode pattern depending upon whether or not its associated flags contain a
A BMP pattern matches against a String interpreted as consisting of a
sequence of 16-bit values that are Unicode code points in the range of
the Basic Multilingual Plane. A Unicode pattern matches against a String
interpreted as consisting of Unicode code points encoded using UTF-16.
In the context of describing the behaviour of a BMP pattern “character”
means a single 16-bit Unicode BMP code point. In the context of
describing the behaviour of a Unicode pattern “character” means a UTF-16
encoded code point (
6.1.4
). In either context, “character value” means the numeric value of the corresponding non-encoded code point.
The syntax and semantics of
Pattern
is defined as if the source text for the
Pattern
was a
List
of
SourceCharacter
values where each
SourceCharacter
corresponds to a Unicode code point. If a BMP pattern contains a non-BMP
SourceCharacter
the entire pattern is encoded using UTF-16 and the individual code units of that encoding are used as the elements of the
List
Note
For example, consider a pattern expressed in source text as
the single non-BMP character U+1D11E (MUSICAL SYMBOL G CLEF).
Interpreted as a Unicode pattern, it would be a single element
(character)
List
consisting of the single code point U+1D11E. However, interpreted as a
BMP pattern, it is first UTF-16 encoded to produce a two element
List
consisting of the code units 0xD834 and 0xDD1E.
Patterns are passed to the RegExp
constructor
as ECMAScript String values in which non-BMP characters are UTF-16
encoded. For example, the single character MUSICAL SYMBOL G CLEF
pattern, expressed as a String value,
is a String
of length 2 whose elements were the code units 0xD834 and 0xDD1E. So no
further translation of the string would be necessary to process it as a
BMP pattern consisting of two pattern characters. However, to process
it as a Unicode pattern
UTF16SurrogatePairToCodePoint
must be used in producing a
List
whose sole element is a single pattern character, the code point U+1D11E.
An implementation may not actually perform such translations
to or from UTF-16, but the semantics of this specification requires that
the result of pattern matching be as if such translations were
performed.
22.2.2.1
Notation
The descriptions below use the following internal data structures:
CharSet
is a mathematical set of characters. In the context of a Unicode pattern, “all characters” means the
CharSet
containing all code point values; otherwise “all characters” means the
CharSet
containing all code unit values.
CaptureRange
is an ordered pair (
startIndex
endIndex
) that represents the range of characters included in a capture, where
startIndex
is an
integer
representing the start index (inclusive) of the range within
Input
, and
endIndex
is an
integer
representing the end index (exclusive) of the range within
Input
. For any
CaptureRange
, these indices must satisfy the invariant that
startIndex
endIndex
MatchState
is an ordered triple (
input
endIndex
captures
) where
input
is a
List
of characters representing the String being matched,
endIndex
is an
integer
, and
captures
is a
List
of values, one for each
left-capturing parenthesis
in the pattern. States are used to represent partial match states in the regular expression matching algorithms. The
endIndex
is one plus the index of the last input character matched so far by the pattern, while
captures
holds the results of capturing parentheses. The
th
element of
captures
is either a
CaptureRange
representing the range of characters captured by the
th
set of capturing parentheses, or
undefined
if the
th
set of capturing parentheses hasn't been reached yet. Due to
backtracking, many States may be in use at any time during the matching
process.
MatchResult
is either a
MatchState
or the special token
failure
that indicates that the match failed.
MatcherContinuation
is an
Abstract Closure
that takes one
MatchState
argument and returns a
MatchResult
result. The
MatcherContinuation
attempts to match the remaining portion (specified by the closure's captured values) of the pattern against
Input
, starting at the intermediate state given by its
MatchState
argument. If the match succeeds, the
MatcherContinuation
returns the final
MatchState
that it reached; if the match fails, the
MatcherContinuation
returns
failure
Matcher
is an
Abstract Closure
that takes two arguments—a
MatchState
and a
MatcherContinuation
—and returns a
MatchResult
result. A
Matcher
attempts to match a middle subpattern (specified by the closure's captured values) of the pattern against the
MatchState
's
input
, starting at the intermediate state given by its
MatchState
argument. The
MatcherContinuation
argument should be a closure that matches the rest of the pattern. After matching the subpattern of a pattern to obtain a new
MatchState
, the
Matcher
then calls
MatcherContinuation
on that new
MatchState
to test if the rest of the pattern can match as well. If it can, the
Matcher
returns the
MatchState
returned by
MatcherContinuation
; if not, the
Matcher
may try different choices at its choice points, repeatedly calling
MatcherContinuation
until it either succeeds or all possibilities have been exhausted.
22.2.2.1.1
RegExp Records
RegExp Record
is a
Record
value used to store information about a RegExp that is needed during compilation and possibly during matching.
It has the following fields:
Table 64:
RegExp Record
Fields
Field Name
Value
Meaning
[[IgnoreCase]]
a Boolean
indicates whether
"i"
appears in the RegExp's flags
[[Multiline]]
a Boolean
indicates whether
"m"
appears in the RegExp's flags
[[DotAll]]
a Boolean
indicates whether
"s"
appears in the RegExp's flags
[[Unicode]]
a Boolean
indicates whether
"u"
appears in the RegExp's flags
[[CapturingGroupsCount]]
a non-negative
integer
the number of
left-capturing parentheses
in the RegExp's pattern
22.2.2.2
Runtime Semantics: CompilePattern
The
syntax-directed operation
CompilePattern takes argument
rer
(a
RegExp Record
) and returns an
Abstract Closure
that takes a
List
of characters and a non-negative
integer
and returns a
MatchResult
. It is defined piecewise over the following productions:
Pattern
::
Disjunction
1.
Let
be
CompileSubpattern
of
Disjunction
with arguments
rer
and
forward
2.
Return a new
Abstract Closure
with parameters (
Input
index
) that captures
rer
and
and performs the following steps when called:
a.
Assert
Input
is a
List
of characters.
b.
Assert
: 0 ≤
index
≤ the number of elements in
Input
c.
Let
be a new
MatcherContinuation
with parameters (
) that captures nothing and performs the following steps when called:
i.
Assert
is a
MatchState
ii.
Return
d.
Let
cap
be a
List
of
rer
.[[CapturingGroupsCount]]
undefined
values, indexed 1 through
rer
.[[CapturingGroupsCount]].
e.
Let
be the
MatchState
Input
index
cap
).
f.
Return
).
Note
A Pattern compiles to an
Abstract Closure
value.
RegExpBuiltinExec
can then apply this procedure to a
List
of characters and an offset within that
List
to determine whether the pattern would match starting at exactly that offset within the
List
, and, if it does match, what the values of the capturing parentheses would be. The algorithms in
22.2.2
are designed so that compiling a pattern may throw a
SyntaxError
exception; on the other hand, once the pattern is successfully compiled, applying the resulting
Abstract Closure
to find a match in a
List
of characters cannot throw an exception (except for any
implementation-defined
exceptions that can occur anywhere such as out-of-memory).
22.2.2.3
Runtime Semantics: CompileSubpattern
The
syntax-directed operation
CompileSubpattern takes arguments
rer
(a
RegExp Record
) and
direction
forward
or
backward
) and returns a
Matcher
Note 1
This section is amended in
B.1.2.5
It is defined piecewise over the following productions:
Disjunction
::
Alternative
Disjunction
1.
Let
m1
be
CompileSubpattern
of
Alternative
with arguments
rer
and
direction
2.
Let
m2
be
CompileSubpattern
of
Disjunction
with arguments
rer
and
direction
3.
Return a new
Matcher
with parameters (
) that captures
m1
and
m2
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
be
m1
).
d.
If
is not
failure
, return
e.
Return
m2
).
Note 2
The
regular expression operator separates two alternatives. The pattern first tries to match the left
Alternative
(followed by the sequel of the regular expression); if it fails, it tries to match the right
Disjunction
(followed by the sequel of the regular expression). If the left
Alternative
, the right
Disjunction
, and the sequel all have choice points, all choices in the sequel are tried before moving on to the next choice in the left
Alternative
. If choices in the left
Alternative
are exhausted, the right
Disjunction
is tried instead of the left
Alternative
. Any capturing parentheses inside a portion of the pattern skipped by
produce
undefined
values instead of Strings. Thus, for example,
/a|ab/.
exec
"abc"
returns the result
"a"
and not
"ab"
. Moreover,
/((a)|(ab))((c)|(bc))/.
exec
"abc"
returns the array
"abc"
"a"
"a"
undefined
"bc"
undefined
"bc"
and not
"abc"
"ab"
undefined
"ab"
"c"
"c"
undefined
The order in which the two alternatives are tried is independent of the value of
direction
Alternative
::
[empty]
1.
Return a new
Matcher
with parameters (
) that captures nothing and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Return
).
Alternative
::
Alternative
Term
1.
Let
m1
be
CompileSubpattern
of
Alternative
with arguments
rer
and
direction
2.
Let
m2
be
CompileSubpattern
of
Term
with arguments
rer
and
direction
3.
If
direction
is
forward
, then
a.
Return a new
Matcher
with parameters (
) that captures
m1
and
m2
and performs the following steps when called:
i.
Assert
is a
MatchState
ii.
Assert
is a
MatcherContinuation
iii.
Let
be a new
MatcherContinuation
with parameters (
) that captures
and
m2
and performs the following steps when called:
1.
Assert
is a
MatchState
2.
Return
m2
).
iv.
Return
m1
).
4.
Else,
a.
Assert
direction
is
backward
b.
Return a new
Matcher
with parameters (
) that captures
m1
and
m2
and performs the following steps when called:
i.
Assert
is a
MatchState
ii.
Assert
is a
MatcherContinuation
iii.
Let
be a new
MatcherContinuation
with parameters (
) that captures
and
m1
and performs the following steps when called:
1.
Assert
is a
MatchState
2.
Return
m1
).
iv.
Return
m2
).
Note 3
Consecutive
Term
s try to simultaneously match consecutive portions of
Input
. When
direction
is
forward
, if the left
Alternative
, the right
Term
and the sequel of the regular expression all have choice points, all
choices in the sequel are tried before moving on to the next choice in
the right
Term
, and all choices in the right
Term
are tried before moving on to the next choice in the left
Alternative
. When
direction
is
backward
, the evaluation order of
Alternative
and
Term
are reversed.
Term
::
Assertion
1.
Return
CompileAssertion
of
Assertion
with argument
rer
Note 4
The resulting
Matcher
is independent of
direction
Term
::
Atom
1.
Return
CompileAtom
of
Atom
with arguments
rer
and
direction
Term
::
Atom
Quantifier
1.
Let
be
CompileAtom
of
Atom
with arguments
rer
and
direction
2.
Let
be
CompileQuantifier
of
Quantifier
3.
Assert
.[[Min]] ≤
.[[Max]].
4.
Let
parenIndex
be
CountLeftCapturingParensBefore
Term
).
5.
Let
parenCount
be
CountLeftCapturingParensWithin
Atom
).
6.
Return a new
Matcher
with parameters (
) that captures
parenIndex
, and
parenCount
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Return
RepeatMatcher
.[[Min]],
.[[Max]],
.[[Greedy]],
parenIndex
parenCount
).
22.2.2.3.1
RepeatMatcher (
min
max
greedy
parenIndex
parenCount
The abstract operation RepeatMatcher takes arguments
(a
Matcher
),
min
(a non-negative
integer
),
max
(a non-negative
integer
or +∞),
greedy
(a Boolean),
(a
MatchState
),
(a
MatcherContinuation
),
parenIndex
(a non-negative
integer
), and
parenCount
(a non-negative
integer
) and returns a
MatchResult
. It performs the following steps when called:
1.
If
max
= 0, return
).
2.
Let
be a new
MatcherContinuation
with parameters (
) that captures
min
max
greedy
parenIndex
, and
parenCount
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
If
min
= 0 and
's
endIndex
's
endIndex
, return
failure
c.
If
min
= 0, let
min2
be 0; otherwise let
min2
be
min
- 1.
d.
If
max
= +∞, let
max2
be +∞; otherwise let
max2
be
max
- 1.
e.
Return
RepeatMatcher
min2
max2
greedy
parenIndex
parenCount
).
3.
Let
cap
be a copy of
's
captures
List
4.
For each
integer
in the
inclusive interval
from
parenIndex
+ 1 to
parenIndex
parenCount
, set
cap
] to
undefined
5.
Let
Input
be
's
input
6.
Let
be
's
endIndex
7.
Let
xr
be the
MatchState
Input
cap
).
8.
If
min
≠ 0, return
xr
).
9.
If
greedy
is
false
, then
a.
Let
be
).
b.
If
is not
failure
, return
c.
Return
xr
).
10.
Let
be
xr
).
11.
If
is not
failure
, return
12.
Return
).
Note 1
An
Atom
followed by a
Quantifier
is repeated the number of times specified by the
Quantifier
. A
Quantifier
can be non-greedy, in which case the
Atom
pattern is repeated as few times as possible while still matching the sequel, or it can be greedy, in which case the
Atom
pattern is repeated as many times as possible while still matching the sequel. The
Atom
pattern is repeated rather than the input character sequence that it matches, so different repetitions of the
Atom
can match different input substrings.
Note 2
If the
Atom
and the sequel of the regular expression all have choice points, the
Atom
is first matched as many (or as few, if non-greedy) times as possible.
All choices in the sequel are tried before moving on to the next choice
in the last repetition of
Atom
. All choices in the last (n
th
) repetition of
Atom
are tried before moving on to the next choice in the next-to-last (n - 1)
st
repetition of
Atom
; at which point it may turn out that more or fewer repetitions of
Atom
are now possible; these are exhausted (again, starting with either as
few or as many as possible) before moving on to the next choice in the
(n - 1)
st
repetition of
Atom
and so on.
Compare
/a[a-z]{
}/.
exec
"abcdefghi"
which returns
"abcde"
with
/a[a-z]{
}?/.
exec
"abcdefghi"
which returns
"abc"
Consider also
/(aa|aabaac|ba|b|c)*/.
exec
"aabaac"
which, by the choice point ordering above, returns the array
"aaba"
"ba"
and not any of:
"aabaac"
"aabaac"
"aabaac"
"c"
The above ordering of choice points can be used to write a
regular expression that calculates the greatest common divisor of two
numbers (represented in unary notation). The following example
calculates the gcd of 10 and 15:
"aaaaaaaaaa,aaaaaaaaaaaaaaa"
replace
/^(a+)\1*,\1+$/
"$1"
which returns the gcd in unary notation
"aaaaa"
Note 3
Step
of the RepeatMatcher clears
Atom
's captures each time
Atom
is repeated. We can see its behaviour in the regular expression
/(z)((a+)?(b+)?(c))*/.
exec
"zaacbbbcac"
which returns the array
"zaacbbbcac"
"z"
"ac"
"a"
undefined
"c"
and not
"zaacbbbcac"
"z"
"ac"
"a"
"bbb"
"c"
because each iteration of the outermost
clears all captured Strings contained in the quantified
Atom
, which in this case includes capture Strings numbered 2, 3, 4, and 5.
Note 4
Step
2.b
of the RepeatMatcher states that once the minimum number of repetitions has been satisfied, any more expansions of
Atom
that match the empty character sequence are not considered for further
repetitions. This prevents the regular expression engine from falling
into an infinite loop on patterns such as:
/(a*)*/.
exec
"b"
or the slightly more complicated:
/(a*)b\
+/.
exec
"baaaac"
which returns the array
"b"
""
22.2.2.4
Runtime Semantics: CompileAssertion
The
syntax-directed operation
CompileAssertion takes argument
rer
(a
RegExp Record
) and returns a
Matcher
Note 1
This section is amended in
B.1.2.6
It is defined piecewise over the following productions:
Assertion
::
1.
Return a new
Matcher
with parameters (
) that captures
rer
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
Input
be
's
input
d.
Let
be
's
endIndex
e.
If
= 0, or if
rer
.[[Multiline]] is
true
and the character
Input
- 1] is matched by
LineTerminator
, then
i.
Return
).
f.
Return
failure
Note 2
Even when the
flag is used with a pattern,
always matches only at the beginning of
Input
, or (if
rer
.[[Multiline]] is
true
) at the beginning of a line.
Assertion
::
1.
Return a new
Matcher
with parameters (
) that captures
rer
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
Input
be
's
input
d.
Let
be
's
endIndex
e.
Let
InputLength
be the number of elements in
Input
f.
If
InputLength
, or if
rer
.[[Multiline]] is
true
and the character
Input
] is matched by
LineTerminator
, then
i.
Return
).
g.
Return
failure
Assertion
::
\b
1.
Return a new
Matcher
with parameters (
) that captures
rer
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
Input
be
's
input
d.
Let
be
's
endIndex
e.
Let
be
IsWordChar
rer
Input
- 1).
f.
Let
be
IsWordChar
rer
Input
).
g.
If
is
true
and
is
false
, or if
is
false
and
is
true
, return
).
h.
Return
failure
Assertion
::
\B
1.
Return a new
Matcher
with parameters (
) that captures
rer
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
Input
be
's
input
d.
Let
be
's
endIndex
e.
Let
be
IsWordChar
rer
Input
- 1).
f.
Let
be
IsWordChar
rer
Input
).
g.
If
is
true
and
is
true
, or if
is
false
and
is
false
, return
).
h.
Return
failure
Assertion
::
(?=
Disjunction
1.
Let
be
CompileSubpattern
of
Disjunction
with arguments
rer
and
forward
2.
Return a new
Matcher
with parameters (
) that captures
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
be a new
MatcherContinuation
with parameters (
) that captures nothing and performs the following steps when called:
i.
Assert
is a
MatchState
ii.
Return
d.
Let
be
).
e.
If
is
failure
, return
failure
f.
Let
be
's
MatchState
g.
Let
cap
be
's
captures
List
h.
Let
Input
be
's
input
i.
Let
xe
be
's
endIndex
j.
Let
be the
MatchState
Input
xe
cap
).
k.
Return
).
Note 3
The form
(?=
Disjunction
specifies a zero-width positive lookahead. In order for it to succeed, the pattern inside
Disjunction
must match at the current position, but the current position is not advanced before matching the sequel. If
Disjunction
can match at the current position in several ways, only the first one
is tried. Unlike other regular expression operators, there is no
backtracking into a
(?=
form (this unusual behaviour is inherited from Perl). This only matters when the
Disjunction
contains capturing parentheses and the sequel of the pattern contains backreferences to those captures.
For example,
/(?=(a+))/.
exec
"baaabac"
matches the empty String immediately after the first
and therefore returns the array:
""
"aaa"
To illustrate the lack of backtracking into the lookahead, consider:
/(?=(a+))a*b\
/.
exec
"baaabac"
This expression returns
"aba"
"a"
and not:
"aaaba"
"a"
Assertion
::
(?!
Disjunction
1.
Let
be
CompileSubpattern
of
Disjunction
with arguments
rer
and
forward
2.
Return a new
Matcher
with parameters (
) that captures
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
be a new
MatcherContinuation
with parameters (
) that captures nothing and performs the following steps when called:
i.
Assert
is a
MatchState
ii.
Return
d.
Let
be
).
e.
If
is not
failure
, return
failure
f.
Return
).
Note 4
The form
(?!
Disjunction
specifies a zero-width negative lookahead. In order for it to succeed, the pattern inside
Disjunction
must fail to match at the current position. The current position is not advanced before matching the sequel.
Disjunction
can contain capturing parentheses, but backreferences to them only make sense from within
Disjunction
itself. Backreferences to these capturing parentheses from elsewhere in the pattern always return
undefined
because the negative lookahead must fail for the pattern to succeed. For example,
/(.*?)
(?!(a+)b\2c)\
(.*)/.
exec
"baaabaac"
looks for an
not immediately followed by some positive number n of
's, a
, another n
's (specified by the first
\2
) and a
. The second
\2
is outside the negative lookahead, so it matches against
undefined
and therefore always succeeds. The whole expression returns the array:
"baaabaac"
"ba"
undefined
"abaac"
Assertion
::
(?<=
Disjunction
1.
Let
be
CompileSubpattern
of
Disjunction
with arguments
rer
and
backward
2.
Return a new
Matcher
with parameters (
) that captures
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
be a new
MatcherContinuation
with parameters (
) that captures nothing and performs the following steps when called:
i.
Assert
is a
MatchState
ii.
Return
d.
Let
be
).
e.
If
is
failure
, return
failure
f.
Let
be
's
MatchState
g.
Let
cap
be
's
captures
List
h.
Let
Input
be
's
input
i.
Let
xe
be
's
endIndex
j.
Let
be the
MatchState
Input
xe
cap
).
k.
Return
).
Assertion
::
(?Disjunction
1.
Let
be
CompileSubpattern
of
Disjunction
with arguments
rer
and
backward
2.
Return a new
Matcher
with parameters (
) that captures
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
be a new
MatcherContinuation
with parameters (
) that captures nothing and performs the following steps when called:
i.
Assert
is a
MatchState
ii.
Return
d.
Let
be
).
e.
If
is not
failure
, return
failure
f.
Return
).
22.2.2.4.1
IsWordChar (
rer
Input
The abstract operation IsWordChar takes arguments
rer
(a
RegExp Record
),
Input
(a
List
of characters), and
(an
integer
) and returns a Boolean. It performs the following steps when called:
1.
Let
InputLength
be the number of elements in
Input
2.
If
= -1 or
InputLength
, return
false
3.
Let
be the character
Input
].
4.
If
WordCharacters
rer
) contains
, return
true
5.
Return
false
22.2.2.5
Runtime Semantics: CompileQuantifier
The
syntax-directed operation
CompileQuantifier takes no arguments and returns a
Record
with fields [[Min]] (a non-negative
integer
), [[Max]] (a non-negative
integer
or +∞), and [[Greedy]] (a Boolean). It is defined piecewise over the following productions:
Quantifier
::
QuantifierPrefix
1.
Let
qp
be
CompileQuantifierPrefix
of
QuantifierPrefix
2.
Return the
Record
{ [[Min]]:
qp
.[[Min]], [[Max]]:
qp
.[[Max]], [[Greedy]]:
true
}.
Quantifier
::
QuantifierPrefix
1.
Let
qp
be
CompileQuantifierPrefix
of
QuantifierPrefix
2.
Return the
Record
{ [[Min]]:
qp
.[[Min]], [[Max]]:
qp
.[[Max]], [[Greedy]]:
false
}.
22.2.2.6
Runtime Semantics: CompileQuantifierPrefix
The
syntax-directed operation
CompileQuantifierPrefix takes no arguments and returns a
Record
with fields [[Min]] (a non-negative
integer
) and [[Max]] (a non-negative
integer
or +∞). It is defined piecewise over the following productions:
QuantifierPrefix
::
1.
Return the
Record
{ [[Min]]: 0, [[Max]]: +∞ }.
QuantifierPrefix
::
1.
Return the
Record
{ [[Min]]: 1, [[Max]]: +∞ }.
QuantifierPrefix
::
1.
Return the
Record
{ [[Min]]: 0, [[Max]]: 1 }.
QuantifierPrefix
::
DecimalDigits
1.
Let
be the MV of
DecimalDigits
(see
12.9.3
).
2.
Return the
Record
{ [[Min]]:
, [[Max]]:
}.
QuantifierPrefix
::
DecimalDigits
,}
1.
Let
be the MV of
DecimalDigits
2.
Return the
Record
{ [[Min]]:
, [[Max]]: +∞ }.
QuantifierPrefix
::
DecimalDigits
DecimalDigits
1.
Let
be the MV of the first
DecimalDigits
2.
Let
be the MV of the second
DecimalDigits
3.
Return the
Record
{ [[Min]]:
, [[Max]]:
}.
22.2.2.7
Runtime Semantics: CompileAtom
The
syntax-directed operation
CompileAtom takes arguments
rer
(a
RegExp Record
) and
direction
forward
or
backward
) and returns a
Matcher
Note 1
This section is amended in
B.1.2.7
It is defined piecewise over the following productions:
Atom
::
PatternCharacter
1.
Let
ch
be the character matched by
PatternCharacter
2.
Let
be a one-element
CharSet
containing the character
ch
3.
Return
CharacterSetMatcher
rer
false
direction
).
Atom
::
1.
Let
be the
CharSet
of all characters.
2.
If
rer
.[[DotAll]] is not
true
, then
a.
Remove from
all characters corresponding to a code point on the right-hand side of the
LineTerminator
production.
3.
Return
CharacterSetMatcher
rer
false
direction
).
Atom
::
CharacterClass
1.
Let
cc
be
CompileCharacterClass
of
CharacterClass
with argument
rer
2.
Return
CharacterSetMatcher
rer
cc
.[[CharSet]],
cc
.[[Invert]],
direction
).
Atom
::
GroupSpecifier
opt
Disjunction
1.
Let
be
CompileSubpattern
of
Disjunction
with arguments
rer
and
direction
2.
Let
parenIndex
be
CountLeftCapturingParensBefore
Atom
).
3.
Return a new
Matcher
with parameters (
) that captures
direction
, and
parenIndex
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
be a new
MatcherContinuation
with parameters (
) that captures
direction
, and
parenIndex
and performs the following steps when called:
i.
Assert
is a
MatchState
ii.
Let
cap
be a copy of
's
captures
List
iii.
Let
Input
be
's
input
iv.
Let
xe
be
's
endIndex
v.
Let
ye
be
's
endIndex
vi.
If
direction
is
forward
, then
1.
Assert
xe
ye
2.
Let
be the
CaptureRange
xe
ye
).
vii.
Else,
1.
Assert
direction
is
backward
2.
Assert
ye
xe
3.
Let
be the
CaptureRange
ye
xe
).
viii.
Set
cap
parenIndex
+ 1] to
ix.
Let
be the
MatchState
Input
ye
cap
).
x.
Return
).
d.
Return
).
Note 2
Parentheses of the form
Disjunction
serve both to group the components of the
Disjunction
pattern together and to save the result of the match. The result can be used either in a backreference (
followed by a non-zero decimal number), referenced in a replace String,
or returned as part of an array from the regular expression matching
Abstract Closure
. To inhibit the capturing behaviour of parentheses, use the form
(?:
Disjunction
instead.
Atom
::
(?:
Disjunction
1.
Return
CompileSubpattern
of
Disjunction
with arguments
rer
and
direction
AtomEscape
::
DecimalEscape
1.
Let
be the
CapturingGroupNumber
of
DecimalEscape
2.
Assert
rer
.[[CapturingGroupsCount]].
3.
Return
BackreferenceMatcher
rer
direction
).
Note 3
An escape sequence of the form
followed by a non-zero decimal number
matches the result of the
th
set of capturing parentheses (
22.2.2.1
). It is an error if the regular expression has fewer than
capturing parentheses. If the regular expression has
or more capturing parentheses but the
th
one is
undefined
because it has not captured anything, then the backreference always succeeds.
AtomEscape
::
CharacterEscape
1.
Let
cv
be the
CharacterValue
of
CharacterEscape
2.
Let
ch
be the character whose character value is
cv
3.
Let
be a one-element
CharSet
containing the character
ch
4.
Return
CharacterSetMatcher
rer
false
direction
).
AtomEscape
::
CharacterClassEscape
1.
Let
be
CompileToCharSet
of
CharacterClassEscape
with argument
rer
2.
Return
CharacterSetMatcher
rer
false
direction
).
AtomEscape
::
GroupName
1.
Let
matchingGroupSpecifiers
be
GroupSpecifiersThatMatch
GroupName
).
2.
Assert
matchingGroupSpecifiers
contains a single
GroupSpecifier
3.
Let
groupSpecifier
be the sole element of
matchingGroupSpecifiers
4.
Let
parenIndex
be
CountLeftCapturingParensBefore
groupSpecifier
).
5.
Return
BackreferenceMatcher
rer
parenIndex
direction
).
22.2.2.7.1
CharacterSetMatcher (
rer
invert
direction
The abstract operation CharacterSetMatcher takes arguments
rer
(a
RegExp Record
),
(a
CharSet
),
invert
(a Boolean), and
direction
forward
or
backward
) and returns a
Matcher
. It performs the following steps when called:
1.
Return a new
Matcher
with parameters (
) that captures
rer
invert
, and
direction
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
Input
be
's
input
d.
Let
be
's
endIndex
e.
If
direction
is
forward
, let
be
+ 1.
f.
Else, let
be
- 1.
g.
Let
InputLength
be the number of elements in
Input
h.
If
< 0 or
InputLength
, return
failure
i.
Let
index
be
min
).
j.
Let
ch
be the character
Input
index
].
k.
Let
cc
be
Canonicalize
rer
ch
).
l.
If there exists a member
of
such that
Canonicalize
rer
) is
cc
, let
found
be
true
. Otherwise, let
found
be
false
m.
If
invert
is
false
and
found
is
false
, return
failure
n.
If
invert
is
true
and
found
is
true
, return
failure
o.
Let
cap
be
's
captures
List
p.
Let
be the
MatchState
Input
cap
).
q.
Return
).
22.2.2.7.2
BackreferenceMatcher (
rer
direction
The abstract operation BackreferenceMatcher takes arguments
rer
(a
RegExp Record
),
(a positive
integer
), and
direction
forward
or
backward
) and returns a
Matcher
. It performs the following steps when called:
1.
Assert
≥ 1.
2.
Return a new
Matcher
with parameters (
) that captures
rer
, and
direction
and performs the following steps when called:
a.
Assert
is a
MatchState
b.
Assert
is a
MatcherContinuation
c.
Let
Input
be
's
input
d.
Let
cap
be
's
captures
List
e.
Let
be
cap
].
f.
If
is
undefined
, return
).
g.
Let
be
's
endIndex
h.
Let
rs
be
's
startIndex
i.
Let
re
be
's
endIndex
j.
Let
len
be
re
rs
k.
If
direction
is
forward
, let
be
len
l.
Else, let
be
len
m.
Let
InputLength
be the number of elements in
Input
n.
If
< 0 or
InputLength
, return
failure
o.
Let
be
min
).
p.
If there exists an
integer
in the
interval
from 0 (inclusive) to
len
(exclusive) such that
Canonicalize
rer
Input
rs
]) is not
Canonicalize
rer
Input
]), return
failure
q.
Let
be the
MatchState
Input
cap
).
r.
Return
).
22.2.2.7.3
Canonicalize (
rer
ch
The abstract operation Canonicalize takes arguments
rer
(a
RegExp Record
) and
ch
(a character) and returns a character. It performs the following steps when called:
1.
If
rer
.[[Unicode]] is
true
and
rer
.[[IgnoreCase]] is
true
, then
a.
If the file
CaseFolding.txt
of the Unicode Character Database provides a simple or common case folding mapping for
ch
, return the result of applying that mapping to
ch
b.
Return
ch
2.
If
rer
.[[IgnoreCase]] is
false
, return
ch
3.
Assert
ch
is a UTF-16 code unit.
4.
Let
cp
be the code point whose numeric value is the numeric value of
ch
5.
Let
be the result of toUppercase(«
cp
»), according to the Unicode Default Case Conversion algorithm.
6.
Let
uStr
be
CodePointsToString
).
7.
If the length of
uStr
≠ 1, return
ch
8.
Let
cu
be
uStr
's single code unit element.
9.
If the numeric value of
ch
≥ 128 and the numeric value of
cu
< 128, return
ch
10.
Return
cu
Note
In case-insignificant matches when
rer
.[[Unicode]] is
true
all characters are implicitly case-folded using the simple mapping
provided by the Unicode Standard immediately before they are compared.
The simple mapping always maps to a single code point, so it does not
map, for example,
(U+00DF LATIN SMALL LETTER SHARP S) to
ss
or
SS
. It may however map code points outside the Basic Latin block to code points within it—for example,
(U+017F LATIN SMALL LETTER LONG S) case-folds to
(U+0073 LATIN SMALL LETTER S) and
(U+212A KELVIN SIGN) case-folds to
(U+006B LATIN SMALL LETTER K). Strings containing those code points are matched by regular expressions such as
/[a-z]/ui
In case-insignificant matches when
rer
.[[Unicode]] is
false
the mapping is based on Unicode Default Case Conversion algorithm
toUppercase rather than toCasefold, which results in some subtle
differences. For example,
(U+2126 OHM SIGN) is mapped by toUppercase to itself but by toCasefold to
(U+03C9 GREEK SMALL LETTER OMEGA) along with
(U+03A9 GREEK CAPITAL LETTER OMEGA), so
"\u2126"
is matched by
/[ω]/ui
and
/[\u03A9]/ui
but not by
/[ω]/i
or
/[\u03A9]/i
. Also, no code point outside the Basic Latin block is mapped to a code point within it, so strings such as
"\u017F ſ"
and
"\u212A K"
are not matched by
/[a-z]/i
22.2.2.8
Runtime Semantics: CompileCharacterClass
The
syntax-directed operation
CompileCharacterClass takes argument
rer
(a
RegExp Record
) and returns a
Record
with fields [[CharSet]] (a
CharSet
) and [[Invert]] (a Boolean). It is defined piecewise over the following productions:
CharacterClass
::
ClassRanges
1.
Let
be
CompileToCharSet
of
ClassRanges
with argument
rer
2.
Return the
Record
{ [[CharSet]]:
, [[Invert]]:
false
}.
CharacterClass
::
[^
ClassRanges
1.
Let
be
CompileToCharSet
of
ClassRanges
with argument
rer
2.
Return the
Record
{ [[CharSet]]:
, [[Invert]]:
true
}.
22.2.2.9
Runtime Semantics: CompileToCharSet
The
syntax-directed operation
CompileToCharSet takes argument
rer
(a
RegExp Record
) and returns a
CharSet
Note 1
This section is amended in
B.1.2.8
It is defined piecewise over the following productions:
ClassRanges
::
[empty]
1.
Return the empty
CharSet
NonemptyClassRanges
::
ClassAtom
NonemptyClassRangesNoDash
1.
Let
be
CompileToCharSet
of
ClassAtom
with argument
rer
2.
Let
be
CompileToCharSet
of
NonemptyClassRangesNoDash
with argument
rer
3.
Return the union of
CharSets
and
NonemptyClassRanges
::
ClassAtom
ClassAtom
ClassRanges
1.
Let
be
CompileToCharSet
of the first
ClassAtom
with argument
rer
2.
Let
be
CompileToCharSet
of the second
ClassAtom
with argument
rer
3.
Let
be
CompileToCharSet
of
ClassRanges
with argument
rer
4.
Let
be
CharacterRange
).
5.
Return the union of
and
NonemptyClassRangesNoDash
::
ClassAtomNoDash
NonemptyClassRangesNoDash
1.
Let
be
CompileToCharSet
of
ClassAtomNoDash
with argument
rer
2.
Let
be
CompileToCharSet
of
NonemptyClassRangesNoDash
with argument
rer
3.
Return the union of
CharSets
and
NonemptyClassRangesNoDash
::
ClassAtomNoDash
ClassAtom
ClassRanges
1.
Let
be
CompileToCharSet
of
ClassAtomNoDash
with argument
rer
2.
Let
be
CompileToCharSet
of
ClassAtom
with argument
rer
3.
Let
be
CompileToCharSet
of
ClassRanges
with argument
rer
4.
Let
be
CharacterRange
).
5.
Return the union of
and
Note 2
ClassRanges
can expand into a single
ClassAtom
and/or ranges of two
ClassAtom
separated by dashes. In the latter case the
ClassRanges
includes all characters between the first
ClassAtom
and the second
ClassAtom
, inclusive; an error occurs if either
ClassAtom
does not represent a single character (for example, if one is \w) or if the first
ClassAtom
's character value is strictly greater than the second
ClassAtom
's character value.
Note 3
Even if the pattern ignores case, the case of the two ends
of a range is significant in determining which characters belong to the
range. Thus, for example, the pattern
/[E-F]/i
matches only the letters
, and
, while the pattern
/[E-f]/i
matches all uppercase and lowercase letters in the Unicode Basic Latin block as well as the symbols
, and
Note 4
character can be treated literally or it can denote a range. It is treated literally if it is the first or last character of
ClassRanges
, the beginning or end limit of a range specification, or immediately follows a range specification.
ClassAtom
::
1.
Return the
CharSet
containing the single character
U+002D (HYPHEN-MINUS).
ClassAtomNoDash
::
SourceCharacter
but not one of
or
or
1.
Return the
CharSet
containing the character matched by
SourceCharacter
ClassEscape
::
CharacterEscape
1.
Let
cv
be the
CharacterValue
of this
ClassEscape
2.
Let
be the character whose character value is
cv
3.
Return the
CharSet
containing the single character
Note 5
ClassAtom
can use any of the escape sequences that are allowed in the rest of the regular expression except for
\b
\B
, and backreferences. Inside a
CharacterClass
\b
means the backspace character, while
\B
and backreferences raise errors. Using a backreference inside a
ClassAtom
causes an error.
CharacterClassEscape
::
1.
Return the ten-element
CharSet
containing the characters
, and
CharacterClassEscape
::
1.
Return the
CharSet
containing all characters not in the
CharSet
returned by
CharacterClassEscape
::
CharacterClassEscape
::
1.
Return the
CharSet
containing all characters corresponding to a code point on the right-hand side of the
WhiteSpace
or
LineTerminator
productions.
CharacterClassEscape
::
1.
Return the
CharSet
containing all characters not in the
CharSet
returned by
CharacterClassEscape
::
CharacterClassEscape
::
1.
Return
WordCharacters
rer
).
CharacterClassEscape
::
1.
Return the
CharSet
containing all characters not in the
CharSet
returned by
CharacterClassEscape
::
CharacterClassEscape
::
p{
UnicodePropertyValueExpression
1.
Return the
CharSet
containing all Unicode code points included in
CompileToCharSet
of
UnicodePropertyValueExpression
with argument
rer
CharacterClassEscape
::
P{
UnicodePropertyValueExpression
1.
Return the
CharSet
containing all Unicode code points not included in
CompileToCharSet
of
UnicodePropertyValueExpression
with argument
rer
UnicodePropertyValueExpression
::
UnicodePropertyName
UnicodePropertyValue
1.
Let
ps
be the
source text matched by
UnicodePropertyName
2.
Let
be
UnicodeMatchProperty
ps
).
3.
Assert
is a Unicode
property name
or property alias listed in the “
Property name
and aliases” column of
Table 65
4.
Let
vs
be the
source text matched by
UnicodePropertyValue
5.
Let
be
UnicodeMatchPropertyValue
vs
).
6.
Return the
CharSet
containing all Unicode code points whose character database definition includes the property
with value
UnicodePropertyValueExpression
::
LoneUnicodePropertyNameOrValue
1.
Let
be the
source text matched by
LoneUnicodePropertyNameOrValue
2.
If
UnicodeMatchPropertyValue
General_Category
) is a Unicode property value or property value alias for the General_Category (gc) property listed in
PropertyValueAliases.txt
, then
a.
Return the
CharSet
containing all Unicode code points whose character database definition includes the property “General_Category” with value
3.
Let
be
UnicodeMatchProperty
).
4.
Assert
is a binary Unicode property or binary property alias listed in the “
Property name
and aliases” column of
Table 66
5.
Return the
CharSet
containing all Unicode code points whose character database definition includes the property
with value “True”.
22.2.2.9.1
CharacterRange (
The abstract operation CharacterRange takes arguments
(a
CharSet
) and
(a
CharSet
) and returns a
CharSet
. It performs the following steps when called:
1.
Assert
and
each contain exactly one character.
2.
Let
be the one character in
CharSet
3.
Let
be the one character in
CharSet
4.
Let
be the character value of character
5.
Let
be the character value of character
6.
Assert
7.
Return the
CharSet
containing all characters with a character value in the
inclusive interval
from
to
22.2.2.9.2
WordCharacters (
rer
The abstract operation WordCharacters takes argument
rer
(a
RegExp Record
) and returns a
CharSet
. Returns a
CharSet
containing the characters considered "word characters" for the purposes of
\b
\B
\w
, and
\W
It performs the following steps when called:
1.
Let
basicWordChars
be the
CharSet
containing every character in
the ASCII word characters
2.
Let
extraWordChars
be the
CharSet
containing all characters
such that
is not in
basicWordChars
but
Canonicalize
rer
) is in
basicWordChars
3.
Assert
extraWordChars
is empty unless
rer
.[[Unicode]] is
true
and
rer
.[[IgnoreCase]] is
true
4.
Return the union of
basicWordChars
and
extraWordChars
22.2.2.9.3
UnicodeMatchProperty (
The abstract operation UnicodeMatchProperty takes argument
ECMAScript source text
) and returns a Unicode
property name
. It performs the following steps when called:
1.
Assert
is a Unicode
property name
or property alias listed in the “
Property name
and aliases” column of
Table 65
or
Table 66
2.
Let
be the canonical
property name
of
as given in the “Canonical
property name
” column of the corresponding row.
3.
Return the
List
of Unicode code points
Implementations must support the Unicode property names and aliases listed in
Table 65
and
Table 66
. To ensure interoperability, implementations must not support any other property names or aliases.
Note 1
For example,
Script_Extensions
property name
) and
scx
(property alias) are valid, but
script_extensions
or
Scx
aren't.
Note 2
The listed properties form a superset of what
UTS18 RL1.2
requires.
Note 3
The spellings of entries in these tables (including casing) match the spellings used in the file
PropertyAliases.txt
in the Unicode Character Database. The precise spellings in that file are
guaranteed to be stable
Table 65: Non-binary Unicode property aliases and their canonical property names
Property name
and aliases
Canonical
property name
General_Category
General_Category
gc
Script
Script
sc
Script_Extensions
Script_Extensions
scx
Table 66: Binary Unicode property aliases and their canonical property names
Property name
and aliases
Canonical
property name
ASCII
ASCII
ASCII_Hex_Digit
ASCII_Hex_Digit
AHex
Alphabetic
Alphabetic
Alpha
Any
Any
Assigned
Assigned
Bidi_Control
Bidi_Control
Bidi_C
Bidi_Mirrored
Bidi_Mirrored
Bidi_M
Case_Ignorable
Case_Ignorable
CI
Cased
Cased
Changes_When_Casefolded
Changes_When_Casefolded
CWCF
Changes_When_Casemapped
Changes_When_Casemapped
CWCM
Changes_When_Lowercased
Changes_When_Lowercased
CWL
Changes_When_NFKC_Casefolded
Changes_When_NFKC_Casefolded
CWKCF
Changes_When_Titlecased
Changes_When_Titlecased
CWT
Changes_When_Uppercased
Changes_When_Uppercased
CWU
Dash
Dash
Default_Ignorable_Code_Point
Default_Ignorable_Code_Point
DI
Deprecated
Deprecated
Dep
Diacritic
Diacritic
Dia
Emoji
Emoji
Emoji_Component
Emoji_Component
EComp
Emoji_Modifier
Emoji_Modifier
EMod
Emoji_Modifier_Base
Emoji_Modifier_Base
EBase
Emoji_Presentation
Emoji_Presentation
EPres
Extended_Pictographic
Extended_Pictographic
ExtPict
Extender
Extender
Ext
Grapheme_Base
Grapheme_Base
Gr_Base
Grapheme_Extend
Grapheme_Extend
Gr_Ext
Hex_Digit
Hex_Digit
Hex
IDS_Binary_Operator
IDS_Binary_Operator
IDSB
IDS_Trinary_Operator
IDS_Trinary_Operator
IDST
ID_Continue
ID_Continue
IDC
ID_Start
ID_Start
IDS
Ideographic
Ideographic
Ideo
Join_Control
Join_Control
Join_C
Logical_Order_Exception
Logical_Order_Exception
LOE
Lowercase
Lowercase
Lower
Math
Math
Noncharacter_Code_Point
Noncharacter_Code_Point
NChar
Pattern_Syntax
Pattern_Syntax
Pat_Syn
Pattern_White_Space
Pattern_White_Space
Pat_WS
Quotation_Mark
Quotation_Mark
QMark
Radical
Radical
Regional_Indicator
Regional_Indicator
RI
Sentence_Terminal
Sentence_Terminal
STerm
Soft_Dotted
Soft_Dotted
SD
Terminal_Punctuation
Terminal_Punctuation
Term
Unified_Ideograph
Unified_Ideograph
UIdeo
Uppercase
Uppercase
Upper
Variation_Selector
Variation_Selector
VS
White_Space
White_Space
space
XID_Continue
XID_Continue
XIDC
XID_Start
XID_Start
XIDS
22.2.2.9.4
UnicodeMatchPropertyValue (
The abstract operation UnicodeMatchPropertyValue takes arguments
ECMAScript source text
) and
ECMAScript source text
) and returns a Unicode property value. It performs the following steps when called:
1.
Assert
is a canonical, unaliased Unicode
property name
listed in the “Canonical
property name
” column of
Table 65
2.
Assert
is a property value or property value alias for the Unicode property
listed in
PropertyValueAliases.txt
3.
Let
value
be the canonical property value of
as given in the “Canonical property value” column of the corresponding row.
4.
Return the
List
of Unicode code points
value
Implementations must support the Unicode property values and property value aliases listed in
PropertyValueAliases.txt
for the properties listed in
Table 65
. To ensure interoperability, implementations must not support any other property values or property value aliases.
Note 1
For example,
Xpeo
and
Old_Persian
are valid
Script_Extensions
values, but
xpeo
and
Old Persian
aren't.
Note 2
This algorithm differs from
the matching rules for symbolic values listed in UAX44
: case,
white space
, U+002D (HYPHEN-MINUS), and U+005F (LOW LINE) are not ignored, and the
Is
prefix is not supported.
22.2.3
Abstract Operations for RegExp Creation
22.2.3.1
RegExpCreate (
The abstract operation RegExpCreate takes arguments
(an
ECMAScript language value
) and
(a String or
undefined
) and returns either a
normal completion containing
an Object or a
throw completion
. It performs the following steps when called:
1.
Let
obj
be !
RegExpAlloc
%RegExp%
).
2.
Return ?
RegExpInitialize
obj
).
22.2.3.2
RegExpAlloc (
newTarget
The abstract operation RegExpAlloc takes argument
newTarget
(a
constructor
) and returns either a
normal completion containing
an Object or a
throw completion
. It performs the following steps when called:
1.
Let
obj
be ?
OrdinaryCreateFromConstructor
newTarget
"%RegExp.prototype%"
, « [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], [[RegExpMatcher]] »).
2.
Perform !
DefinePropertyOrThrow
obj
"lastIndex"
, PropertyDescriptor { [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}).
3.
Return
obj
22.2.3.3
RegExpInitialize (
obj
pattern
flags
The abstract operation RegExpInitialize takes arguments
obj
(an Object),
pattern
(an
ECMAScript language value
), and
flags
(an
ECMAScript language value
) and returns either a
normal completion containing
an Object or a
throw completion
. It performs the following steps when called:
1.
If
pattern
is
undefined
, let
be the empty String.
2.
Else, let
be ?
ToString
pattern
).
3.
If
flags
is
undefined
, let
be the empty String.
4.
Else, let
be ?
ToString
flags
).
5.
If
contains any code unit other than
"d"
"g"
"i"
"m"
"s"
"u"
, or
"y"
, or if
contains any code unit more than once, throw a
SyntaxError
exception.
6.
If
contains
"i"
, let
be
true
; else let
be
false
7.
If
contains
"m"
, let
be
true
; else let
be
false
8.
If
contains
"s"
, let
be
true
; else let
be
false
9.
If
contains
"u"
, let
be
true
; else let
be
false
10.
If
is
true
, then
a.
Let
patternText
be
StringToCodePoints
).
11.
Else,
a.
Let
patternText
be the result of interpreting each of
's 16-bit elements as a Unicode BMP code point. UTF-16 decoding is not applied to the elements.
12.
Let
parseResult
be
ParsePattern
patternText
).
13.
If
parseResult
is a non-empty
List
of
SyntaxError
objects, throw a
SyntaxError
exception.
14.
Assert
parseResult
is a
Pattern
Parse Node
15.
Set
obj
.[[OriginalSource]] to
16.
Set
obj
.[[OriginalFlags]] to
17.
Let
capturingGroupsCount
be
CountLeftCapturingParensWithin
parseResult
).
18.
Let
rer
be the
RegExp Record
{ [[IgnoreCase]]:
, [[Multiline]]:
, [[DotAll]]:
, [[Unicode]]:
, [[CapturingGroupsCount]]:
capturingGroupsCount
}.
19.
Set
obj
.[[RegExpRecord]] to
rer
20.
Set
obj
.[[RegExpMatcher]] to
CompilePattern
of
parseResult
with argument
rer
21.
Perform ?
Set
obj
"lastIndex"
+0
true
).
22.
Return
obj
22.2.3.4
Static Semantics: ParsePattern (
patternText
The abstract operation ParsePattern takes arguments
patternText
(a sequence of Unicode code points) and
(a Boolean) and returns a
Parse Node
or a non-empty
List
of
SyntaxError
objects.
Note
This section is amended in
B.1.2.9
It performs the following steps when called:
1.
If
is
true
, then
a.
Let
parseResult
be
ParseText
patternText
Pattern
[+UnicodeMode, +N]
).
2.
Else,
a.
Let
parseResult
be
ParseText
patternText
Pattern
[~UnicodeMode, +N]
).
3.
Return
parseResult
22.2.4
The RegExp Constructor
The RegExp
constructor
is
%RegExp%
is the initial value of the
"RegExp"
property of the
global object
creates and initializes a new RegExp object when called as a function rather than as a
constructor
. Thus the function call
RegExp(…)
is equivalent to the object creation expression
new RegExp(…)
with the same arguments.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified RegExp behaviour must include a
super
call to the RegExp
constructor
to create and initialize subclass instances with the necessary internal slots.
22.2.4.1
RegExp (
pattern
flags
This function performs the following steps when called:
1.
Let
patternIsRegExp
be ?
IsRegExp
pattern
).
2.
If NewTarget is
undefined
, then
a.
Let
newTarget
be the
active function object
b.
If
patternIsRegExp
is
true
and
flags
is
undefined
, then
i.
Let
patternConstructor
be ?
Get
pattern
"constructor"
).
ii.
If
SameValue
newTarget
patternConstructor
) is
true
, return
pattern
3.
Else, let
newTarget
be NewTarget.
4.
If
pattern
is an Object
and
pattern
has a [[RegExpMatcher]] internal slot, then
a.
Let
be
pattern
.[[OriginalSource]].
b.
If
flags
is
undefined
, let
be
pattern
.[[OriginalFlags]].
c.
Else, let
be
flags
5.
Else if
patternIsRegExp
is
true
, then
a.
Let
be ?
Get
pattern
"source"
).
b.
If
flags
is
undefined
, then
i.
Let
be ?
Get
pattern
"flags"
).
c.
Else, let
be
flags
6.
Else,
a.
Let
be
pattern
b.
Let
be
flags
7.
Let
be ?
RegExpAlloc
newTarget
).
8.
Return ?
RegExpInitialize
).
Note
If pattern is supplied using a
StringLiteral
the usual escape sequence substitutions are performed before the String
is processed by this function. If pattern must contain an escape
sequence to be recognized by this function, any U+005C (REVERSE SOLIDUS)
code points must be escaped within the
StringLiteral
to prevent them being removed when the contents of the
StringLiteral
are formed.
22.2.5
Properties of the RegExp Constructor
The RegExp
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
22.2.5.1
RegExp.prototype
The initial value of
RegExp.prototype
is the
RegExp prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
22.2.5.2
get RegExp [ @@species ]
RegExp[@@species]
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Return the
this
value.
The value of the
"name"
property of this function is
"get [Symbol.species]"
Note
RegExp prototype methods normally use their
this
value's
constructor
to create a derived object. However, a subclass
constructor
may over-ride that default behaviour by redefining its
@@species
property.
22.2.6
Properties of the RegExp Prototype Object
The
RegExp prototype object
is
%RegExp.prototype%
is an
ordinary object
is not a RegExp instance and does not have a
[[RegExpMatcher]] internal slot or any of the other internal slots of
RegExp instance objects.
has a [[Prototype]] internal slot whose value is
%Object.prototype%
Note
The RegExp prototype object does not have a
"valueOf"
property of its own; however, it inherits the
"valueOf"
property from the
Object prototype object
22.2.6.1
RegExp.prototype.constructor
The initial value of
RegExp.prototype.constructor
is
%RegExp%
22.2.6.2
RegExp.prototype.exec (
string
This method searches
string
for an occurrence of the regular expression pattern and returns an Array containing the results of the match, or
null
if
string
did not match.
It performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[RegExpMatcher]]).
3.
Let
be ?
ToString
string
).
4.
Return ?
RegExpBuiltinExec
).
22.2.6.3
get RegExp.prototype.dotAll
RegExp.prototype.dotAll
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Let
cu
be the code unit 0x0073 (LATIN SMALL LETTER S).
3.
Return ?
RegExpHasFlag
cu
).
22.2.6.4
get RegExp.prototype.flags
RegExp.prototype.flags
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
If
is not an Object
, throw a
TypeError
exception.
3.
Let
codeUnits
be a new empty
List
4.
Let
hasIndices
be
ToBoolean
(?
Get
"hasIndices"
)).
5.
If
hasIndices
is
true
, append the code unit 0x0064 (LATIN SMALL LETTER D) to
codeUnits
6.
Let
global
be
ToBoolean
(?
Get
"global"
)).
7.
If
global
is
true
, append the code unit 0x0067 (LATIN SMALL LETTER G) to
codeUnits
8.
Let
ignoreCase
be
ToBoolean
(?
Get
"ignoreCase"
)).
9.
If
ignoreCase
is
true
, append the code unit 0x0069 (LATIN SMALL LETTER I) to
codeUnits
10.
Let
multiline
be
ToBoolean
(?
Get
"multiline"
)).
11.
If
multiline
is
true
, append the code unit 0x006D (LATIN SMALL LETTER M) to
codeUnits
12.
Let
dotAll
be
ToBoolean
(?
Get
"dotAll"
)).
13.
If
dotAll
is
true
, append the code unit 0x0073 (LATIN SMALL LETTER S) to
codeUnits
14.
Let
unicode
be
ToBoolean
(?
Get
"unicode"
)).
15.
If
unicode
is
true
, append the code unit 0x0075 (LATIN SMALL LETTER U) to
codeUnits
16.
Let
sticky
be
ToBoolean
(?
Get
"sticky"
)).
17.
If
sticky
is
true
, append the code unit 0x0079 (LATIN SMALL LETTER Y) to
codeUnits
18.
Return the String value whose code units are the elements of the
List
codeUnits
. If
codeUnits
has no elements, the empty String is returned.
22.2.6.4.1
RegExpHasFlag (
codeUnit
The abstract operation RegExpHasFlag takes arguments
(an
ECMAScript language value
) and
codeUnit
(a code unit) and returns either a
normal completion containing
either a Boolean or
undefined
, or a
throw completion
. It performs the following steps when called:
1.
If
is not an Object
, throw a
TypeError
exception.
2.
If
does not have an [[OriginalFlags]] internal slot, then
a.
If
SameValue
%RegExp.prototype%
) is
true
, return
undefined
b.
Otherwise, throw a
TypeError
exception.
3.
Let
flags
be
.[[OriginalFlags]].
4.
If
flags
contains
codeUnit
, return
true
5.
Return
false
22.2.6.5
get RegExp.prototype.global
RegExp.prototype.global
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Let
cu
be the code unit 0x0067 (LATIN SMALL LETTER G).
3.
Return ?
RegExpHasFlag
cu
).
22.2.6.6
get RegExp.prototype.hasIndices
RegExp.prototype.hasIndices
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Let
cu
be the code unit 0x0064 (LATIN SMALL LETTER D).
3.
Return ?
RegExpHasFlag
cu
).
22.2.6.7
get RegExp.prototype.ignoreCase
RegExp.prototype.ignoreCase
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Let
cu
be the code unit 0x0069 (LATIN SMALL LETTER I).
3.
Return ?
RegExpHasFlag
cu
).
22.2.6.8
RegExp.prototype [ @@match ] (
string
This method performs the following steps when called:
1.
Let
rx
be the
this
value.
2.
If
rx
is not an Object
, throw a
TypeError
exception.
3.
Let
be ?
ToString
string
).
4.
Let
flags
be ?
ToString
(?
Get
rx
"flags"
)).
5.
If
flags
does not contain
"g"
, then
a.
Return ?
RegExpExec
rx
).
6.
Else,
a.
If
flags
contains
"u"
, let
fullUnicode
be
true
. Otherwise, let
fullUnicode
be
false
b.
Perform ?
Set
rx
"lastIndex"
+0
true
).
c.
Let
be !
ArrayCreate
(0).
d.
Let
be 0.
e.
Repeat,
i.
Let
result
be ?
RegExpExec
rx
).
ii.
If
result
is
null
, then
1.
If
= 0, return
null
2.
Return
iii.
Else,
1.
Let
matchStr
be ?
ToString
(?
Get
result
"0"
)).
2.
Perform !
CreateDataPropertyOrThrow
, !
ToString
)),
matchStr
).
3.
If
matchStr
is the empty String, then
a.
Let
thisIndex
be
(?
ToLength
(?
Get
rx
"lastIndex"
))).
b.
Let
nextIndex
be
AdvanceStringIndex
thisIndex
fullUnicode
).
c.
Perform ?
Set
rx
"lastIndex"
nextIndex
),
true
).
4.
Set
to
+ 1.
The value of the
"name"
property of this method is
"[Symbol.match]"
Note
The
@@match
property is used by the
IsRegExp
abstract operation to identify objects that have the basic behaviour of regular expressions. The absence of a
@@match
property or the existence of such a property whose value does not Boolean coerce to
true
indicates that the object is not intended to be used as a regular expression object.
22.2.6.9
RegExp.prototype [ @@matchAll ] (
string
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
is not an Object
, throw a
TypeError
exception.
3.
Let
be ?
ToString
string
).
4.
Let
be ?
SpeciesConstructor
%RegExp%
).
5.
Let
flags
be ?
ToString
(?
Get
"flags"
)).
6.
Let
matcher
be ?
Construct
, «
flags
»).
7.
Let
lastIndex
be ?
ToLength
(?
Get
"lastIndex"
)).
8.
Perform ?
Set
matcher
"lastIndex"
lastIndex
true
).
9.
If
flags
contains
"g"
, let
global
be
true
10.
Else, let
global
be
false
11.
If
flags
contains
"u"
, let
fullUnicode
be
true
12.
Else, let
fullUnicode
be
false
13.
Return
CreateRegExpStringIterator
matcher
global
fullUnicode
).
The value of the
"name"
property of this method is
"[Symbol.matchAll]"
22.2.6.10
get RegExp.prototype.multiline
RegExp.prototype.multiline
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Let
cu
be the code unit 0x006D (LATIN SMALL LETTER M).
3.
Return ?
RegExpHasFlag
cu
).
22.2.6.11
RegExp.prototype [ @@replace ] (
string
replaceValue
This method performs the following steps when called:
1.
Let
rx
be the
this
value.
2.
If
rx
is not an Object
, throw a
TypeError
exception.
3.
Let
be ?
ToString
string
).
4.
Let
lengthS
be the length of
5.
Let
functionalReplace
be
IsCallable
replaceValue
).
6.
If
functionalReplace
is
false
, then
a.
Set
replaceValue
to ?
ToString
replaceValue
).
7.
Let
flags
be ?
ToString
(?
Get
rx
"flags"
)).
8.
If
flags
contains
"g"
, let
global
be
true
. Otherwise, let
global
be
false
9.
If
global
is
true
, then
a.
If
flags
contains
"u"
, let
fullUnicode
be
true
. Otherwise, let
fullUnicode
be
false
b.
Perform ?
Set
rx
"lastIndex"
+0
true
).
10.
Let
results
be a new empty
List
11.
Let
done
be
false
12.
Repeat, while
done
is
false
a.
Let
result
be ?
RegExpExec
rx
).
b.
If
result
is
null
, set
done
to
true
c.
Else,
i.
Append
result
to
results
ii.
If
global
is
false
, set
done
to
true
iii.
Else,
1.
Let
matchStr
be ?
ToString
(?
Get
result
"0"
)).
2.
If
matchStr
is the empty String, then
a.
Let
thisIndex
be
(?
ToLength
(?
Get
rx
"lastIndex"
))).
b.
Let
nextIndex
be
AdvanceStringIndex
thisIndex
fullUnicode
).
c.
Perform ?
Set
rx
"lastIndex"
nextIndex
),
true
).
13.
Let
accumulatedResult
be the empty String.
14.
Let
nextSourcePosition
be 0.
15.
For each element
result
of
results
, do
a.
Let
resultLength
be ?
LengthOfArrayLike
result
).
b.
Let
nCaptures
be
max
resultLength
- 1, 0).
c.
Let
matched
be ?
ToString
(?
Get
result
"0"
)).
d.
Let
matchLength
be the length of
matched
e.
Let
position
be ?
ToIntegerOrInfinity
(?
Get
result
"index"
)).
f.
Set
position
to the result of
clamping
position
between 0 and
lengthS
g.
Let
captures
be a new empty
List
h.
Let
be 1.
i.
Repeat, while
nCaptures
i.
Let
capN
be ?
Get
result
, !
ToString
))).
ii.
If
capN
is not
undefined
, then
1.
Set
capN
to ?
ToString
capN
).
iii.
Append
capN
to
captures
iv.
NOTE: When
= 1, the preceding step puts the first element into
captures
(at index 0). More generally, the
th
capture (the characters captured by the
th
set of capturing parentheses) is at
captures
- 1].
v.
Set
to
+ 1.
j.
Let
namedCaptures
be ?
Get
result
"groups"
).
k.
If
functionalReplace
is
true
, then
i.
Let
replacerArgs
be the
list-concatenation
of «
matched
»,
captures
, and «
position
),
».
ii.
If
namedCaptures
is not
undefined
, then
1.
Append
namedCaptures
to
replacerArgs
iii.
Let
replValue
be ?
Call
replaceValue
undefined
replacerArgs
).
iv.
Let
replacement
be ?
ToString
replValue
).
l.
Else,
i.
If
namedCaptures
is not
undefined
, then
1.
Set
namedCaptures
to ?
ToObject
namedCaptures
).
ii.
Let
replacement
be ?
GetSubstitution
matched
position
captures
namedCaptures
replaceValue
).
m.
If
position
nextSourcePosition
, then
i.
NOTE:
position
should not normally move backwards. If it does, it is an indication of
an ill-behaving RegExp subclass or use of an access triggered
side-effect to change the global flag or other characteristics of
rx
. In such cases, the corresponding substitution is ignored.
ii.
Set
accumulatedResult
to the
string-concatenation
of
accumulatedResult
, the
substring
of
from
nextSourcePosition
to
position
, and
replacement
iii.
Set
nextSourcePosition
to
position
matchLength
16.
If
nextSourcePosition
lengthS
, return
accumulatedResult
17.
Return the
string-concatenation
of
accumulatedResult
and the
substring
of
from
nextSourcePosition
The value of the
"name"
property of this method is
"[Symbol.replace]"
22.2.6.12
RegExp.prototype [ @@search ] (
string
This method performs the following steps when called:
1.
Let
rx
be the
this
value.
2.
If
rx
is not an Object
, throw a
TypeError
exception.
3.
Let
be ?
ToString
string
).
4.
Let
previousLastIndex
be ?
Get
rx
"lastIndex"
).
5.
If
SameValue
previousLastIndex
+0
) is
false
, then
a.
Perform ?
Set
rx
"lastIndex"
+0
true
).
6.
Let
result
be ?
RegExpExec
rx
).
7.
Let
currentLastIndex
be ?
Get
rx
"lastIndex"
).
8.
If
SameValue
currentLastIndex
previousLastIndex
) is
false
, then
a.
Perform ?
Set
rx
"lastIndex"
previousLastIndex
true
).
9.
If
result
is
null
, return
-1
10.
Return ?
Get
result
"index"
).
The value of the
"name"
property of this method is
"[Symbol.search]"
Note
The
"lastIndex"
and
"global"
properties of this RegExp object are ignored when performing the search. The
"lastIndex"
property is left unchanged.
22.2.6.13
get RegExp.prototype.source
RegExp.prototype.source
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
If
is not an Object
, throw a
TypeError
exception.
3.
If
does not have an [[OriginalSource]] internal slot, then
a.
If
SameValue
%RegExp.prototype%
) is
true
, return
"(?:)"
b.
Otherwise, throw a
TypeError
exception.
4.
Assert
has an [[OriginalFlags]] internal slot.
5.
Let
src
be
.[[OriginalSource]].
6.
Let
flags
be
.[[OriginalFlags]].
7.
Return
EscapeRegExpPattern
src
flags
).
22.2.6.13.1
EscapeRegExpPattern (
The abstract operation EscapeRegExpPattern takes arguments
(a String) and
(a String) and returns a String. It performs the following steps when called:
1.
Let
be a String in the form of a
Pattern
[~UnicodeMode]
Pattern
[+UnicodeMode]
if
contains
"u"
) equivalent to
interpreted as UTF-16 encoded Unicode code points (
6.1.4
), in which certain code points are escaped as described below.
may or may not differ from
; however, the
Abstract Closure
that would result from evaluating
as a
Pattern
[~UnicodeMode]
Pattern
[+UnicodeMode]
if
contains
"u"
) must behave identically to the
Abstract Closure
given by the constructed object's [[RegExpMatcher]] internal slot.
Multiple calls to this abstract operation using the same values for
and
must produce identical results.
2.
The code points
or any
LineTerminator
occurring in the pattern shall be escaped in
as necessary to ensure that the
string-concatenation
of
"/"
"/"
, and
can be parsed (in an appropriate lexical context) as a
RegularExpressionLiteral
that behaves identically to the constructed regular expression. For example, if
is
"/"
, then
could be
"\/"
or
"\u002F"
, among other possibilities, but not
"/"
, because
///
followed by
would be parsed as a
SingleLineComment
rather than a
RegularExpressionLiteral
. If
is the empty String, this specification can be met by letting
be
"(?:)"
3.
Return
22.2.6.14
RegExp.prototype [ @@split ] (
string
limit
Note 1
This method returns an Array into which substrings of the result of converting
string
to a String have been stored. The substrings are determined by searching from left to right for matches of the
this
value regular expression; these occurrences are not part of any String
in the returned array, but serve to divide up the String value.
The
this
value may be an empty regular
expression or a regular expression that can match an empty String. In
this case, the regular expression does not match the empty
substring
at the beginning or end of the input String, nor does it match the empty
substring
at the end of the previous separator match. (For example, if the
regular expression matches the empty String, the String is split up into
individual code unit elements; the length of the result array equals
the length of the String, and each
substring
contains one code unit.) Only the first match at a given index of the
String is considered, even if backtracking could yield a non-empty
substring
match at that index. (For example,
/a*?/[Symbol.split]("ab")
evaluates to the array
["a", "b"]
, while
/a*/[Symbol.split]("ab")
evaluates to the array
["","b"]
.)
If
string
is (or converts to) the empty String,
the result depends on whether the regular expression can match the empty
String. If it can, the result array contains no elements. Otherwise,
the result array contains one element, which is the empty String.
If the regular expression contains capturing parentheses, then each time
separator
is matched the results (including any
undefined
results) of the capturing parentheses are spliced into the output array. For example,
/<(\/)?([^
<>
]+)>/[Symbol.split]("A
bold
and
CODE
coded
CODE
")
evaluates to the array
"A"
undefined
"B"
"bold"
"/"
"B"
"and"
undefined
"CODE"
"coded"
"/"
"CODE"
""
If
limit
is not
undefined
, then the output array is truncated so that it contains no more than
limit
elements.
This method performs the following steps when called:
1.
Let
rx
be the
this
value.
2.
If
rx
is not an Object
, throw a
TypeError
exception.
3.
Let
be ?
ToString
string
).
4.
Let
be ?
SpeciesConstructor
rx
%RegExp%
).
5.
Let
flags
be ?
ToString
(?
Get
rx
"flags"
)).
6.
If
flags
contains
"u"
, let
unicodeMatching
be
true
7.
Else, let
unicodeMatching
be
false
8.
If
flags
contains
"y"
, let
newFlags
be
flags
9.
Else, let
newFlags
be the
string-concatenation
of
flags
and
"y"
10.
Let
splitter
be ?
Construct
, «
rx
newFlags
»).
11.
Let
be !
ArrayCreate
(0).
12.
Let
lengthA
be 0.
13.
If
limit
is
undefined
, let
lim
be 2
32
- 1; else let
lim
be
(?
ToUint32
limit
)).
14.
If
lim
= 0, return
15.
If
is the empty String, then
a.
Let
be ?
RegExpExec
splitter
).
b.
If
is not
null
, return
c.
Perform !
CreateDataPropertyOrThrow
"0"
).
d.
Return
16.
Let
size
be the length of
17.
Let
be 0.
18.
Let
be
19.
Repeat, while
size
a.
Perform ?
Set
splitter
"lastIndex"
),
true
).
b.
Let
be ?
RegExpExec
splitter
).
c.
If
is
null
, set
to
AdvanceStringIndex
unicodeMatching
).
d.
Else,
i.
Let
be
(?
ToLength
(?
Get
splitter
"lastIndex"
))).
ii.
Set
to
min
size
).
iii.
If
, set
to
AdvanceStringIndex
unicodeMatching
).
iv.
Else,
1.
Let
be the
substring
of
from
to
2.
Perform !
CreateDataPropertyOrThrow
, !
ToString
lengthA
)),
).
3.
Set
lengthA
to
lengthA
+ 1.
4.
If
lengthA
lim
, return
5.
Set
to
6.
Let
numberOfCaptures
be ?
LengthOfArrayLike
).
7.
Set
numberOfCaptures
to
max
numberOfCaptures
- 1, 0).
8.
Let
be 1.
9.
Repeat, while
numberOfCaptures
a.
Let
nextCapture
be ?
Get
, !
ToString
))).
b.
Perform !
CreateDataPropertyOrThrow
, !
ToString
lengthA
)),
nextCapture
).
c.
Set
to
+ 1.
d.
Set
lengthA
to
lengthA
+ 1.
e.
If
lengthA
lim
, return
10.
Set
to
20.
Let
be the
substring
of
from
to
size
21.
Perform !
CreateDataPropertyOrThrow
, !
ToString
lengthA
)),
).
22.
Return
The value of the
"name"
property of this method is
"[Symbol.split]"
Note 2
This method ignores the value of the
"global"
and
"sticky"
properties of this RegExp object.
22.2.6.15
get RegExp.prototype.sticky
RegExp.prototype.sticky
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Let
cu
be the code unit 0x0079 (LATIN SMALL LETTER Y).
3.
Return ?
RegExpHasFlag
cu
).
22.2.6.16
RegExp.prototype.test (
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
is not an Object
, throw a
TypeError
exception.
3.
Let
string
be ?
ToString
).
4.
Let
match
be ?
RegExpExec
string
).
5.
If
match
is not
null
, return
true
; else return
false
22.2.6.17
RegExp.prototype.toString ( )
1.
Let
be the
this
value.
2.
If
is not an Object
, throw a
TypeError
exception.
3.
Let
pattern
be ?
ToString
(?
Get
"source"
)).
4.
Let
flags
be ?
ToString
(?
Get
"flags"
)).
5.
Let
result
be the
string-concatenation
of
"/"
pattern
"/"
, and
flags
6.
Return
result
Note
The returned String has the form of a
RegularExpressionLiteral
that evaluates to another RegExp object with the same behaviour as this object.
22.2.6.18
get RegExp.prototype.unicode
RegExp.prototype.unicode
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Let
cu
be the code unit 0x0075 (LATIN SMALL LETTER U).
3.
Return ?
RegExpHasFlag
cu
).
22.2.7
Abstract Operations for RegExp Matching
22.2.7.1
RegExpExec (
The abstract operation RegExpExec takes arguments
(an Object) and
(a String) and returns either a
normal completion containing
either an Object or
null
, or a
throw completion
. It performs the following steps when called:
1.
Let
exec
be ?
Get
"exec"
).
2.
If
IsCallable
exec
) is
true
, then
a.
Let
result
be ?
Call
exec
, «
»).
b.
If
result
is not an Object
and
result
is not
null
, throw a
TypeError
exception.
c.
Return
result
3.
Perform ?
RequireInternalSlot
, [[RegExpMatcher]]).
4.
Return ?
RegExpBuiltinExec
).
Note
If a callable
"exec"
property is not
found this algorithm falls back to attempting to use the built-in RegExp
matching algorithm. This provides compatible behaviour for code written
for prior editions where most built-in algorithms that use regular
expressions did not perform a dynamic property lookup of
"exec"
22.2.7.2
RegExpBuiltinExec (
The abstract operation RegExpBuiltinExec takes arguments
(an initialized RegExp instance) and
(a String) and returns either a
normal completion containing
either an
Array exotic object
or
null
, or a
throw completion
. It performs the following steps when called:
1.
Let
length
be the length of
2.
Let
lastIndex
be
(?
ToLength
(?
Get
"lastIndex"
))).
3.
Let
flags
be
.[[OriginalFlags]].
4.
If
flags
contains
"g"
, let
global
be
true
; else let
global
be
false
5.
If
flags
contains
"y"
, let
sticky
be
true
; else let
sticky
be
false
6.
If
flags
contains
"d"
, let
hasIndices
be
true
; else let
hasIndices
be
false
7.
If
global
is
false
and
sticky
is
false
, set
lastIndex
to 0.
8.
Let
matcher
be
.[[RegExpMatcher]].
9.
If
flags
contains
"u"
, let
fullUnicode
be
true
; else let
fullUnicode
be
false
10.
Let
matchSucceeded
be
false
11.
If
fullUnicode
is
true
, let
input
be
StringToCodePoints
). Otherwise, let
input
be a
List
whose elements are the code units that are the elements of
12.
NOTE: Each element of
input
is considered to be a character.
13.
Repeat, while
matchSucceeded
is
false
a.
If
lastIndex
length
, then
i.
If
global
is
true
or
sticky
is
true
, then
1.
Perform ?
Set
"lastIndex"
+0
true
).
ii.
Return
null
b.
Let
inputIndex
be the index into
input
of the character that was obtained from element
lastIndex
of
c.
Let
be
matcher
input
inputIndex
).
d.
If
is
failure
, then
i.
If
sticky
is
true
, then
1.
Perform ?
Set
"lastIndex"
+0
true
).
2.
Return
null
ii.
Set
lastIndex
to
AdvanceStringIndex
lastIndex
fullUnicode
).
e.
Else,
i.
Assert
is a
MatchState
ii.
Set
matchSucceeded
to
true
14.
Let
be
's
endIndex
value.
15.
If
fullUnicode
is
true
, set
to
GetStringIndex
).
16.
If
global
is
true
or
sticky
is
true
, then
a.
Perform ?
Set
"lastIndex"
),
true
).
17.
Let
be the number of elements in
's
captures
List
18.
Assert
.[[RegExpRecord]].[[CapturingGroupsCount]].
19.
Assert
< 2
32
- 1.
20.
Let
be !
ArrayCreate
+ 1).
21.
Assert
: The
mathematical value of
's
"length"
property is
+ 1.
22.
Perform !
CreateDataPropertyOrThrow
"index"
lastIndex
)).
23.
Perform !
CreateDataPropertyOrThrow
"input"
).
24.
Let
match
be the
Match Record
{ [[StartIndex]]:
lastIndex
, [[EndIndex]]:
}.
25.
Let
indices
be a new empty
List
26.
Let
groupNames
be a new empty
List
27.
Append
match
to
indices
28.
Let
matchedSubstr
be
GetMatchString
match
).
29.
Perform !
CreateDataPropertyOrThrow
"0"
matchedSubstr
).
30.
If
contains any
GroupName
, then
a.
Let
groups
be
OrdinaryObjectCreate
null
).
b.
Let
hasGroups
be
true
31.
Else,
a.
Let
groups
be
undefined
b.
Let
hasGroups
be
false
32.
Perform !
CreateDataPropertyOrThrow
"groups"
groups
).
33.
For each
integer
such that 1 ≤
, in ascending order, do
a.
Let
captureI
be
th
element of
's
captures
List
b.
If
captureI
is
undefined
, then
i.
Let
capturedValue
be
undefined
ii.
Append
undefined
to
indices
c.
Else,
i.
Let
captureStart
be
captureI
's
startIndex
ii.
Let
captureEnd
be
captureI
's
endIndex
iii.
If
fullUnicode
is
true
, then
1.
Set
captureStart
to
GetStringIndex
captureStart
).
2.
Set
captureEnd
to
GetStringIndex
captureEnd
).
iv.
Let
capture
be the
Match Record
{ [[StartIndex]]:
captureStart
, [[EndIndex]]:
captureEnd
}.
v.
Let
capturedValue
be
GetMatchString
capture
).
vi.
Append
capture
to
indices
d.
Perform !
CreateDataPropertyOrThrow
, !
ToString
)),
capturedValue
).
e.
If the
th
capture of
was defined with a
GroupName
, then
i.
Let
be the
CapturingGroupName
of that
GroupName
ii.
Perform !
CreateDataPropertyOrThrow
groups
capturedValue
).
iii.
Append
to
groupNames
f.
Else,
i.
Append
undefined
to
groupNames
34.
If
hasIndices
is
true
, then
a.
Let
indicesArray
be
MakeMatchIndicesIndexPairArray
indices
groupNames
hasGroups
).
b.
Perform !
CreateDataPropertyOrThrow
"indices"
indicesArray
).
35.
Return
22.2.7.3
AdvanceStringIndex (
index
unicode
The abstract operation AdvanceStringIndex takes arguments
(a String),
index
(a non-negative
integer
), and
unicode
(a Boolean) and returns an
integer
. It performs the following steps when called:
1.
Assert
index
≤ 2
53
- 1.
2.
If
unicode
is
false
, return
index
+ 1.
3.
Let
length
be the length of
4.
If
index
+ 1 ≥
length
, return
index
+ 1.
5.
Let
cp
be
CodePointAt
index
).
6.
Return
index
cp
.[[CodeUnitCount]].
22.2.7.4
GetStringIndex (
codePointIndex
The abstract operation GetStringIndex takes arguments
(a String) and
codePointIndex
(a non-negative
integer
) and returns a non-negative
integer
. It interprets
as a sequence of UTF-16 encoded code points, as described in
6.1.4
, and returns the code unit index corresponding to code point index
codePointIndex
when such an index exists. Otherwise, it returns the length of
. It performs the following steps when called:
1.
If
is the empty String, return 0.
2.
Let
len
be the length of
3.
Let
codeUnitCount
be 0.
4.
Let
codePointCount
be 0.
5.
Repeat, while
codeUnitCount
len
a.
If
codePointCount
codePointIndex
, return
codeUnitCount
b.
Let
cp
be
CodePointAt
codeUnitCount
).
c.
Set
codeUnitCount
to
codeUnitCount
cp
.[[CodeUnitCount]].
d.
Set
codePointCount
to
codePointCount
+ 1.
6.
Return
len
22.2.7.5
Match Records
Match Record
is a
Record
value used to encapsulate the start and end indices of a regular expression match or capture.
Match Records have the fields listed in
Table 67
Table 67:
Match Record
Fields
Field Name
Value
Meaning
[[StartIndex]]
a non-negative
integer
The number of code units from the start of a string at which the match begins (inclusive).
[[EndIndex]]
an
integer
≥ [[StartIndex]]
The number of code units from the start of a string at which the match ends (exclusive).
22.2.7.6
GetMatchString (
match
The abstract operation GetMatchString takes arguments
(a String) and
match
(a
Match Record
) and returns a String. It performs the following steps when called:
1.
Assert
match
.[[StartIndex]] ≤
match
.[[EndIndex]] ≤ the length of
2.
Return the
substring
of
from
match
.[[StartIndex]] to
match
.[[EndIndex]].
22.2.7.7
GetMatchIndexPair (
match
The abstract operation GetMatchIndexPair takes arguments
(a String) and
match
(a
Match Record
) and returns an Array. It performs the following steps when called:
1.
Assert
match
.[[StartIndex]] ≤
match
.[[EndIndex]] ≤ the length of
2.
Return
CreateArrayFromList

match
.[[StartIndex]]),
match
.[[EndIndex]]) »).
22.2.7.8
MakeMatchIndicesIndexPairArray (
indices
groupNames
hasGroups
The abstract operation MakeMatchIndicesIndexPairArray takes arguments
(a String),
indices
(a
List
of either
Match Records
or
undefined
),
groupNames
(a
List
of either Strings or
undefined
), and
hasGroups
(a Boolean) and returns an Array. It performs the following steps when called:
1.
Let
be the number of elements in
indices
2.
Assert
< 2
32
- 1.
3.
Assert
groupNames
has
- 1 elements.
4.
NOTE: The
groupNames
List
contains elements aligned with the
indices
List
starting at
indices
[1].
5.
Let
be !
ArrayCreate
).
6.
If
hasGroups
is
true
, then
a.
Let
groups
be
OrdinaryObjectCreate
null
).
7.
Else,
a.
Let
groups
be
undefined
8.
Perform !
CreateDataPropertyOrThrow
"groups"
groups
).
9.
For each
integer
such that 0 ≤
, in ascending order, do
a.
Let
matchIndices
be
indices
].
b.
If
matchIndices
is not
undefined
, then
i.
Let
matchIndexPair
be
GetMatchIndexPair
matchIndices
).
c.
Else,
i.
Let
matchIndexPair
be
undefined
d.
Perform !
CreateDataPropertyOrThrow
, !
ToString
)),
matchIndexPair
).
e.
If
> 0 and
groupNames
- 1] is not
undefined
, then
i.
Assert
groups
is not
undefined
ii.
Perform !
CreateDataPropertyOrThrow
groups
groupNames
- 1],
matchIndexPair
).
10.
Return
22.2.8
Properties of RegExp Instances
RegExp instances are
ordinary objects
that inherit properties from the
RegExp prototype object
RegExp instances have internal slots [[OriginalSource]],
[[OriginalFlags]], [[RegExpRecord]], and [[RegExpMatcher]]. The value of
the [[RegExpMatcher]] internal slot is an
Abstract Closure
representation of the
Pattern
of the RegExp object.
Note
Prior to ECMAScript 2015, RegExp instances were specified as having the own
data properties
"source"
"global"
"ignoreCase"
, and
"multiline"
. Those properties are now specified as
accessor properties
of
RegExp.prototype
RegExp instances also have the following property:
22.2.8.1
lastIndex
The value of the
"lastIndex"
property specifies the String index at which to start the next match. It is coerced to an
integral Number
when used (see
22.2.7.2
). This property shall have the attributes { [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
22.2.9
RegExp String Iterator Objects
A RegExp String Iterator is an object, that represents a
specific iteration over some specific String instance object, matching
against some specific RegExp instance object. There is not a named
constructor
for RegExp String Iterator objects. Instead, RegExp String Iterator
objects are created by calling certain methods of RegExp instance
objects.
22.2.9.1
CreateRegExpStringIterator (
global
fullUnicode
The abstract operation CreateRegExpStringIterator takes arguments
(an Object),
(a String),
global
(a Boolean), and
fullUnicode
(a Boolean) and returns a Generator. It performs the following steps when called:
1.
Let
closure
be a new
Abstract Closure
with no parameters that captures
global
, and
fullUnicode
and performs the following steps when called:
a.
Repeat,
i.
Let
match
be ?
RegExpExec
).
ii.
If
match
is
null
, return
undefined
iii.
If
global
is
false
, then
1.
Perform ?
GeneratorYield
CreateIterResultObject
match
false
)).
2.
Return
undefined
iv.
Let
matchStr
be ?
ToString
(?
Get
match
"0"
)).
v.
If
matchStr
is the empty String, then
1.
Let
thisIndex
be
(?
ToLength
(?
Get
"lastIndex"
))).
2.
Let
nextIndex
be
AdvanceStringIndex
thisIndex
fullUnicode
).
3.
Perform ?
Set
"lastIndex"
nextIndex
),
true
).
vi.
Perform ?
GeneratorYield
CreateIterResultObject
match
false
)).
2.
Return
CreateIteratorFromClosure
closure
"%RegExpStringIteratorPrototype%"
%RegExpStringIteratorPrototype%
).
22.2.9.2
The %RegExpStringIteratorPrototype% Object
The
%RegExpStringIteratorPrototype%
object:
has properties that are inherited by all RegExp String Iterator Objects.
is an
ordinary object
has a [[Prototype]] internal slot whose value is
%IteratorPrototype%
has the following properties:
22.2.9.2.1
%RegExpStringIteratorPrototype%.next ( )
1.
Return ?
GeneratorResume
this
value,
empty
"%RegExpStringIteratorPrototype%"
).
22.2.9.2.2
%RegExpStringIteratorPrototype% [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"RegExp String Iterator"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
23
Indexed Collections
23.1
Array Objects
Arrays are
exotic objects
that give special treatment to a certain class of property names. See
10.4.2
for a definition of this special treatment.
23.1.1
The Array Constructor
The Array
constructor
is
%Array%
is the initial value of the
"Array"
property of the
global object
creates and initializes a new Array when called as a
constructor
also creates and initializes a new Array when called as a function rather than as a
constructor
. Thus the function call
Array(…)
is equivalent to the object creation expression
new Array(…)
with the same arguments.
is a function whose behaviour differs based upon the number and types of its arguments.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the exotic Array behaviour must include a
super
call to the Array
constructor
to initialize subclass instances that are
Array exotic objects
. However, most of the
Array.prototype
methods are generic methods that are not dependent upon their
this
value being an
Array exotic object
has a
"length"
property whose value is
23.1.1.1
Array ( ...
values
This function performs the following steps when called:
1.
If NewTarget is
undefined
, let
newTarget
be the
active function object
; else let
newTarget
be NewTarget.
2.
Let
proto
be ?
GetPrototypeFromConstructor
newTarget
"%Array.prototype%"
).
3.
Let
numberOfArgs
be the number of elements in
values
4.
If
numberOfArgs
= 0, then
a.
Return !
ArrayCreate
(0,
proto
).
5.
Else if
numberOfArgs
= 1, then
a.
Let
len
be
values
[0].
b.
Let
array
be !
ArrayCreate
(0,
proto
).
c.
If
len
is not a Number
, then
i.
Perform !
CreateDataPropertyOrThrow
array
"0"
len
).
ii.
Let
intLen
be
d.
Else,
i.
Let
intLen
be !
ToUint32
len
).
ii.
If
SameValueZero
intLen
len
) is
false
, throw a
RangeError
exception.
e.
Perform !
Set
array
"length"
intLen
true
).
f.
Return
array
6.
Else,
a.
Assert
numberOfArgs
≥ 2.
b.
Let
array
be ?
ArrayCreate
numberOfArgs
proto
).
c.
Let
be 0.
d.
Repeat, while
numberOfArgs
i.
Let
Pk
be !
ToString
)).
ii.
Let
itemK
be
values
].
iii.
Perform !
CreateDataPropertyOrThrow
array
Pk
itemK
).
iv.
Set
to
+ 1.
e.
Assert
: The
mathematical value of
array
's
"length"
property is
numberOfArgs
f.
Return
array
23.1.2
Properties of the Array Constructor
The Array
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
23.1.2.1
Array.from (
items
[ ,
mapfn
[ ,
thisArg
] ] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
mapfn
is
undefined
, let
mapping
be
false
3.
Else,
a.
If
IsCallable
mapfn
) is
false
, throw a
TypeError
exception.
b.
Let
mapping
be
true
4.
Let
usingIterator
be ?
GetMethod
items
@@iterator
).
5.
If
usingIterator
is not
undefined
, then
a.
If
IsConstructor
) is
true
, then
i.
Let
be ?
Construct
).
b.
Else,
i.
Let
be !
ArrayCreate
(0).
c.
Let
iteratorRecord
be ?
GetIteratorFromMethod
items
usingIterator
).
d.
Let
be 0.
e.
Repeat,
i.
If
≥ 2
53
- 1, then
1.
Let
error
be
ThrowCompletion
(a newly created
TypeError
object).
2.
Return ?
IteratorClose
iteratorRecord
error
).
ii.
Let
Pk
be !
ToString
)).
iii.
Let
next
be ?
IteratorStep
iteratorRecord
).
iv.
If
next
is
false
, then
1.
Perform ?
Set
"length"
),
true
).
2.
Return
v.
Let
nextValue
be ?
IteratorValue
next
).
vi.
If
mapping
is
true
, then
1.
Let
mappedValue
be
Completion
Call
mapfn
thisArg
, «
nextValue
) »)).
2.
IfAbruptCloseIterator
mappedValue
iteratorRecord
).
vii.
Else, let
mappedValue
be
nextValue
viii.
Let
defineStatus
be
Completion
CreateDataPropertyOrThrow
Pk
mappedValue
)).
ix.
IfAbruptCloseIterator
defineStatus
iteratorRecord
).
x.
Set
to
+ 1.
6.
NOTE:
items
is not an Iterable so assume it is an
array-like object
7.
Let
arrayLike
be !
ToObject
items
).
8.
Let
len
be ?
LengthOfArrayLike
arrayLike
).
9.
If
IsConstructor
) is
true
, then
a.
Let
be ?
Construct
, «
len
) »).
10.
Else,
a.
Let
be ?
ArrayCreate
len
).
11.
Let
be 0.
12.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be ?
Get
arrayLike
Pk
).
c.
If
mapping
is
true
, then
i.
Let
mappedValue
be ?
Call
mapfn
thisArg
, «
kValue
) »).
d.
Else, let
mappedValue
be
kValue
e.
Perform ?
CreateDataPropertyOrThrow
Pk
mappedValue
).
f.
Set
to
+ 1.
13.
Perform ?
Set
"length"
len
),
true
).
14.
Return
Note
This method is an intentionally generic factory method; it does not require that its
this
value be the Array
constructor
. Therefore it can be transferred to or inherited by any other
constructors
that may be called with a single numeric argument.
23.1.2.2
Array.isArray (
arg
This function performs the following steps when called:
1.
Return ?
IsArray
arg
).
23.1.2.3
Array.of ( ...
items
This method performs the following steps when called:
1.
Let
len
be the number of elements in
items
2.
Let
lenNumber
be
len
).
3.
Let
be the
this
value.
4.
If
IsConstructor
) is
true
, then
a.
Let
be ?
Construct
, «
lenNumber
»).
5.
Else,
a.
Let
be ?
ArrayCreate
len
).
6.
Let
be 0.
7.
Repeat, while
len
a.
Let
kValue
be
items
].
b.
Let
Pk
be !
ToString
)).
c.
Perform ?
CreateDataPropertyOrThrow
Pk
kValue
).
d.
Set
to
+ 1.
8.
Perform ?
Set
"length"
lenNumber
true
).
9.
Return
Note
This method is an intentionally generic factory method; it does not require that its
this
value be the Array
constructor
. Therefore it can be transferred to or inherited by other
constructors
that may be called with a single numeric argument.
23.1.2.4
Array.prototype
The value of
Array.prototype
is the
Array prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
23.1.2.5
get Array [ @@species ]
Array[@@species]
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Return the
this
value.
The value of the
"name"
property of this function is
"get [Symbol.species]"
Note
Array prototype methods normally use their
this
value's
constructor
to create a derived object. However, a subclass
constructor
may over-ride that default behaviour by redefining its
@@species
property.
23.1.3
Properties of the Array Prototype Object
The
Array prototype object
is
%Array.prototype%
is an
Array exotic object
and has the internal methods specified for such objects.
has a
"length"
property whose initial value is
+0
and whose attributes are { [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
has a [[Prototype]] internal slot whose value is
%Object.prototype%
Note
The Array prototype object is specified to be an
Array exotic object
to ensure compatibility with ECMAScript code that was created prior to the ECMAScript 2015 specification.
23.1.3.1
Array.prototype.at (
index
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
relativeIndex
be ?
ToIntegerOrInfinity
index
).
4.
If
relativeIndex
≥ 0, then
a.
Let
be
relativeIndex
5.
Else,
a.
Let
be
len
relativeIndex
6.
If
< 0 or
len
, return
undefined
7.
Return ?
Get
, !
ToString
))).
23.1.3.2
Array.prototype.concat ( ...
items
This method returns an array containing the array elements of the object followed by the array elements of each argument.
It performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
be ?
ArraySpeciesCreate
, 0).
3.
Let
be 0.
4.
Prepend
to
items
5.
For each element
of
items
, do
a.
Let
spreadable
be ?
IsConcatSpreadable
).
b.
If
spreadable
is
true
, then
i.
Let
len
be ?
LengthOfArrayLike
).
ii.
If
len
> 2
53
- 1, throw a
TypeError
exception.
iii.
Let
be 0.
iv.
Repeat, while
len
1.
Let
be !
ToString
)).
2.
Let
exists
be ?
HasProperty
).
3.
If
exists
is
true
, then
a.
Let
subElement
be ?
Get
).
b.
Perform ?
CreateDataPropertyOrThrow
, !
ToString
)),
subElement
).
4.
Set
to
+ 1.
5.
Set
to
+ 1.
c.
Else,
i.
NOTE:
is added as a single item rather than spread.
ii.
If
≥ 2
53
- 1, throw a
TypeError
exception.
iii.
Perform ?
CreateDataPropertyOrThrow
, !
ToString
)),
).
iv.
Set
to
+ 1.
6.
Perform ?
Set
"length"
),
true
).
7.
Return
The
"length"
property of this method is
Note 1
The explicit setting of the
"length"
property in step
is necessary to ensure that its value is correct in situations where the trailing elements of the result Array are not present.
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.2.1
IsConcatSpreadable (
The abstract operation IsConcatSpreadable takes argument
(an
ECMAScript language value
) and returns either a
normal completion containing
a Boolean or a
throw completion
. It performs the following steps when called:
1.
If
is not an Object
, return
false
2.
Let
spreadable
be ?
Get
@@isConcatSpreadable
).
3.
If
spreadable
is not
undefined
, return
ToBoolean
spreadable
).
4.
Return ?
IsArray
).
23.1.3.3
Array.prototype.constructor
The initial value of
Array.prototype.constructor
is
%Array%
23.1.3.4
Array.prototype.copyWithin (
target
start
[ ,
end
] )
Note 1
The
end
argument is optional. If it is not provided, the length of the
this
value is used.
Note 2
If
target
is negative, it is treated as
length
target
where
length
is the length of the array. If
start
is negative, it is treated as
length
start
. If
end
is negative, it is treated as
length
end
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
relativeTarget
be ?
ToIntegerOrInfinity
target
).
4.
If
relativeTarget
= -∞, let
to
be 0.
5.
Else if
relativeTarget
< 0, let
to
be
max
len
relativeTarget
, 0).
6.
Else, let
to
be
min
relativeTarget
len
).
7.
Let
relativeStart
be ?
ToIntegerOrInfinity
start
).
8.
If
relativeStart
= -∞, let
from
be 0.
9.
Else if
relativeStart
< 0, let
from
be
max
len
relativeStart
, 0).
10.
Else, let
from
be
min
relativeStart
len
).
11.
If
end
is
undefined
, let
relativeEnd
be
len
; else let
relativeEnd
be ?
ToIntegerOrInfinity
end
).
12.
If
relativeEnd
= -∞, let
final
be 0.
13.
Else if
relativeEnd
< 0, let
final
be
max
len
relativeEnd
, 0).
14.
Else, let
final
be
min
relativeEnd
len
).
15.
Let
count
be
min
final
from
len
to
).
16.
If
from
to
and
to
from
count
, then
a.
Let
direction
be -1.
b.
Set
from
to
from
count
- 1.
c.
Set
to
to
to
count
- 1.
17.
Else,
a.
Let
direction
be 1.
18.
Repeat, while
count
> 0,
a.
Let
fromKey
be !
ToString
from
)).
b.
Let
toKey
be !
ToString
to
)).
c.
Let
fromPresent
be ?
HasProperty
fromKey
).
d.
If
fromPresent
is
true
, then
i.
Let
fromVal
be ?
Get
fromKey
).
ii.
Perform ?
Set
toKey
fromVal
true
).
e.
Else,
i.
Assert
fromPresent
is
false
ii.
Perform ?
DeletePropertyOrThrow
toKey
).
f.
Set
from
to
from
direction
g.
Set
to
to
to
direction
h.
Set
count
to
count
- 1.
19.
Return
Note 3
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.5
Array.prototype.entries ( )
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Return
CreateArrayIterator
key+value
).
23.1.3.6
Array.prototype.every (
callbackfn
[ ,
thisArg
] )
Note 1
callbackfn
should be a function that accepts three arguments and returns a value that is coercible to a Boolean value.
every
calls
callbackfn
once for each element present in the array, in ascending order, until it finds one where
callbackfn
returns
false
. If such an element is found,
every
immediately returns
false
. Otherwise, if
callbackfn
returned
true
for all elements,
every
will return
true
callbackfn
is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a
thisArg
parameter is provided, it will be used as the
this
value for each invocation of
callbackfn
. If it is not provided,
undefined
is used instead.
callbackfn
is called with three arguments: the value of the element, the index of the element, and the object being traversed.
every
does not directly mutate the object on which it is called but the object may be mutated by the calls to
callbackfn
The range of elements processed by
every
is set before the first call to
callbackfn
. Elements which are appended to the array after the call to
every
begins will not be visited by
callbackfn
. If existing elements of the array are changed, their value as passed to
callbackfn
will be the value at the time
every
visits them; elements that are deleted after the call to
every
begins and before being visited are not visited.
every
acts like the "for all" quantifier in mathematics. In particular, for an empty array, it returns
true
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
4.
Let
be 0.
5.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kPresent
be ?
HasProperty
Pk
).
c.
If
kPresent
is
true
, then
i.
Let
kValue
be ?
Get
Pk
).
ii.
Let
testResult
be
ToBoolean
(?
Call
callbackfn
thisArg
, «
kValue
),
»)).
iii.
If
testResult
is
false
, return
false
d.
Set
to
+ 1.
6.
Return
true
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.7
Array.prototype.fill (
value
[ ,
start
[ ,
end
] ] )
Note 1
The
start
argument is optional. If it is not provided,
+0
is used.
The
end
argument is optional. If it is not provided, the length of the
this
value is used.
Note 2
If
start
is negative, it is treated as
length
start
where
length
is the length of the array. If
end
is negative, it is treated as
length
end
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
relativeStart
be ?
ToIntegerOrInfinity
start
).
4.
If
relativeStart
= -∞, let
be 0.
5.
Else if
relativeStart
< 0, let
be
max
len
relativeStart
, 0).
6.
Else, let
be
min
relativeStart
len
).
7.
If
end
is
undefined
, let
relativeEnd
be
len
; else let
relativeEnd
be ?
ToIntegerOrInfinity
end
).
8.
If
relativeEnd
= -∞, let
final
be 0.
9.
Else if
relativeEnd
< 0, let
final
be
max
len
relativeEnd
, 0).
10.
Else, let
final
be
min
relativeEnd
len
).
11.
Repeat, while
final
a.
Let
Pk
be !
ToString
)).
b.
Perform ?
Set
Pk
value
true
).
c.
Set
to
+ 1.
12.
Return
Note 3
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.8
Array.prototype.filter (
callbackfn
[ ,
thisArg
] )
Note 1
callbackfn
should be a function that accepts three arguments and returns a value that is coercible to a Boolean value.
filter
calls
callbackfn
once for each element in the array, in ascending order, and constructs a new array of all the values for which
callbackfn
returns
true
callbackfn
is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a
thisArg
parameter is provided, it will be used as the
this
value for each invocation of
callbackfn
. If it is not provided,
undefined
is used instead.
callbackfn
is called with three arguments: the value of the element, the index of the element, and the object being traversed.
filter
does not directly mutate the object on which it is called but the object may be mutated by the calls to
callbackfn
The range of elements processed by
filter
is set before the first call to
callbackfn
. Elements which are appended to the array after the call to
filter
begins will not be visited by
callbackfn
. If existing elements of the array are changed their value as passed to
callbackfn
will be the value at the time
filter
visits them; elements that are deleted after the call to
filter
begins and before being visited are not visited.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
4.
Let
be ?
ArraySpeciesCreate
, 0).
5.
Let
be 0.
6.
Let
to
be 0.
7.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kPresent
be ?
HasProperty
Pk
).
c.
If
kPresent
is
true
, then
i.
Let
kValue
be ?
Get
Pk
).
ii.
Let
selected
be
ToBoolean
(?
Call
callbackfn
thisArg
, «
kValue
),
»)).
iii.
If
selected
is
true
, then
1.
Perform ?
CreateDataPropertyOrThrow
, !
ToString
to
)),
kValue
).
2.
Set
to
to
to
+ 1.
d.
Set
to
+ 1.
8.
Return
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.9
Array.prototype.find (
predicate
[ ,
thisArg
] )
Note 1
This method calls
predicate
once for each element of the array, in ascending index order, until it finds one where
predicate
returns a value that coerces to
true
. If such an element is found,
find
immediately returns that element value. Otherwise,
find
returns
undefined
See
FindViaPredicate
for additional information.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
findRec
be ?
FindViaPredicate
len
ascending
predicate
thisArg
).
4.
Return
findRec
.[[Value]].
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.10
Array.prototype.findIndex (
predicate
[ ,
thisArg
] )
Note 1
This method calls
predicate
once for each element of the array, in ascending index order, until it finds one where
predicate
returns a value that coerces to
true
. If such an element is found,
findIndex
immediately returns the index of that element value. Otherwise,
findIndex
returns -1.
See
FindViaPredicate
for additional information.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
findRec
be ?
FindViaPredicate
len
ascending
predicate
thisArg
).
4.
Return
findRec
.[[Index]].
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.11
Array.prototype.findLast (
predicate
[ ,
thisArg
] )
Note 1
This method calls
predicate
once for each element of the array, in descending index order, until it finds one where
predicate
returns a value that coerces to
true
. If such an element is found,
findLast
immediately returns that element value. Otherwise,
findLast
returns
undefined
See
FindViaPredicate
for additional information.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
findRec
be ?
FindViaPredicate
len
descending
predicate
thisArg
).
4.
Return
findRec
.[[Value]].
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.12
Array.prototype.findLastIndex (
predicate
[ ,
thisArg
] )
Note 1
This method calls
predicate
once for each element of the array, in descending index order, until it finds one where
predicate
returns a value that coerces to
true
. If such an element is found,
findLastIndex
immediately returns the index of that element value. Otherwise,
findLastIndex
returns -1.
See
FindViaPredicate
for additional information.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
findRec
be ?
FindViaPredicate
len
descending
predicate
thisArg
).
4.
Return
findRec
.[[Index]].
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.12.1
FindViaPredicate (
len
direction
predicate
thisArg
The abstract operation FindViaPredicate takes arguments
(an Object),
len
(a non-negative
integer
),
direction
ascending
or
descending
),
predicate
(an
ECMAScript language value
), and
thisArg
(an
ECMAScript language value
) and returns either a
normal completion containing
Record
with fields [[Index]] (an
integral Number
) and [[Value]] (an
ECMAScript language value
) or a
throw completion
should be an
array-like object
or a TypedArray. This operation calls
predicate
once for each element of
, in either ascending index order or descending index order (as indicated by
direction
), until it finds one where
predicate
returns a value that coerces to
true
. At that point, this operation returns a
Record
that gives the index and value of the element found. If no such element is found, this operation returns a
Record
that specifies
-1
for the index and
undefined
for the value.
predicate
should be a function. When called
for an element of the array, it is passed three arguments: the value of
the element, the index of the element, and the object being traversed.
Its return value will be coerced to a Boolean value.
thisArg
will be used as the
this
value for each invocation of
predicate
This operation does not directly mutate the object on which it is called, but the object may be mutated by the calls to
predicate
The range of elements processed is set before the first call to
predicate
, just before the traversal begins. Elements that are appended to the array after this will not be visited by
predicate
. If existing elements of the array are changed, their value as passed to
predicate
will be the value at the time that this operation visits them. Elements
that are deleted after traversal begins and before being visited are
still visited and are either looked up from the prototype or are
undefined
It performs the following steps when called:
1.
If
IsCallable
predicate
) is
false
, throw a
TypeError
exception.
2.
If
direction
is
ascending
, then
a.
Let
indices
be a
List
of the
integers
in the
interval
from 0 (inclusive) to
len
(exclusive), in ascending order.
3.
Else,
a.
Let
indices
be a
List
of the
integers
in the
interval
from 0 (inclusive) to
len
(exclusive), in descending order.
4.
For each
integer
of
indices
, do
a.
Let
Pk
be !
ToString
)).
b.
NOTE: If
is a TypedArray, the following invocation of
Get
will return a
normal completion
c.
Let
kValue
be ?
Get
Pk
).
d.
Let
testResult
be ?
Call
predicate
thisArg
, «
kValue
),
»).
e.
If
ToBoolean
testResult
) is
true
, return the
Record
{ [[Index]]:
), [[Value]]:
kValue
}.
5.
Return the
Record
{ [[Index]]:
-1
, [[Value]]:
undefined
}.
23.1.3.13
Array.prototype.flat ( [
depth
] )
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
sourceLen
be ?
LengthOfArrayLike
).
3.
Let
depthNum
be 1.
4.
If
depth
is not
undefined
, then
a.
Set
depthNum
to ?
ToIntegerOrInfinity
depth
).
b.
If
depthNum
< 0, set
depthNum
to 0.
5.
Let
be ?
ArraySpeciesCreate
, 0).
6.
Perform ?
FlattenIntoArray
sourceLen
, 0,
depthNum
).
7.
Return
23.1.3.13.1
FlattenIntoArray (
target
source
sourceLen
start
depth
[ ,
mapperFunction
[ ,
thisArg
] ] )
The abstract operation FlattenIntoArray takes arguments
target
(an Object),
source
(an Object),
sourceLen
(a non-negative
integer
),
start
(a non-negative
integer
), and
depth
(a non-negative
integer
or +∞) and optional arguments
mapperFunction
(a
function object
) and
thisArg
(an
ECMAScript language value
) and returns either a
normal completion containing
a non-negative
integer
or a
throw completion
. It performs the following steps when called:
1.
Assert
: If
mapperFunction
is present, then
IsCallable
mapperFunction
) is
true
thisArg
is present, and
depth
is 1.
2.
Let
targetIndex
be
start
3.
Let
sourceIndex
be
+0
4.
Repeat, while
sourceIndex
) <
sourceLen
a.
Let
be !
ToString
sourceIndex
).
b.
Let
exists
be ?
HasProperty
source
).
c.
If
exists
is
true
, then
i.
Let
element
be ?
Get
source
).
ii.
If
mapperFunction
is present, then
1.
Set
element
to ?
Call
mapperFunction
thisArg
, «
element
sourceIndex
source
»).
iii.
Let
shouldFlatten
be
false
iv.
If
depth
> 0, then
1.
Set
shouldFlatten
to ?
IsArray
element
).
v.
If
shouldFlatten
is
true
, then
1.
If
depth
= +∞, let
newDepth
be +∞.
2.
Else, let
newDepth
be
depth
- 1.
3.
Let
elementLen
be ?
LengthOfArrayLike
element
).
4.
Set
targetIndex
to ?
FlattenIntoArray
target
element
elementLen
targetIndex
newDepth
).
vi.
Else,
1.
If
targetIndex
≥ 2
53
- 1, throw a
TypeError
exception.
2.
Perform ?
CreateDataPropertyOrThrow
target
, !
ToString
targetIndex
)),
element
).
3.
Set
targetIndex
to
targetIndex
+ 1.
d.
Set
sourceIndex
to
sourceIndex
5.
Return
targetIndex
23.1.3.14
Array.prototype.flatMap (
mapperFunction
[ ,
thisArg
] )
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
sourceLen
be ?
LengthOfArrayLike
).
3.
If
IsCallable
mapperFunction
) is
false
, throw a
TypeError
exception.
4.
Let
be ?
ArraySpeciesCreate
, 0).
5.
Perform ?
FlattenIntoArray
sourceLen
, 0, 1,
mapperFunction
thisArg
).
6.
Return
23.1.3.15
Array.prototype.forEach (
callbackfn
[ ,
thisArg
] )
Note 1
callbackfn
should be a function that accepts three arguments.
forEach
calls
callbackfn
once for each element present in the array, in ascending order.
callbackfn
is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a
thisArg
parameter is provided, it will be used as the
this
value for each invocation of
callbackfn
. If it is not provided,
undefined
is used instead.
callbackfn
is called with three arguments: the value of the element, the index of the element, and the object being traversed.
forEach
does not directly mutate the object on which it is called but the object may be mutated by the calls to
callbackfn
The range of elements processed by
forEach
is set before the first call to
callbackfn
. Elements which are appended to the array after the call to
forEach
begins will not be visited by
callbackfn
. If existing elements of the array are changed, their value as passed to
callbackfn
will be the value at the time
forEach
visits them; elements that are deleted after the call to
forEach
begins and before being visited are not visited.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
4.
Let
be 0.
5.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kPresent
be ?
HasProperty
Pk
).
c.
If
kPresent
is
true
, then
i.
Let
kValue
be ?
Get
Pk
).
ii.
Perform ?
Call
callbackfn
thisArg
, «
kValue
),
»).
d.
Set
to
+ 1.
6.
Return
undefined
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.16
Array.prototype.includes (
searchElement
[ ,
fromIndex
] )
Note 1
This method compares
searchElement
to the elements of the array, in ascending order, using the
SameValueZero
algorithm, and if found at any position, returns
true
; otherwise, it returns
false
The optional second argument
fromIndex
defaults to
+0
(i.e. the whole array is searched). If it is greater than or equal to the length of the array,
false
is returned, i.e. the array will not be searched. If it is less than
-0
, it is used as the offset from the end of the array to compute
fromIndex
. If the computed index is less than or equal to
+0
, the whole array will be searched.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
len
= 0, return
false
4.
Let
be ?
ToIntegerOrInfinity
fromIndex
).
5.
Assert
: If
fromIndex
is
undefined
, then
is 0.
6.
If
= +∞, return
false
7.
Else if
= -∞, set
to 0.
8.
If
≥ 0, then
a.
Let
be
9.
Else,
a.
Let
be
len
b.
If
< 0, set
to 0.
10.
Repeat, while
len
a.
Let
elementK
be ?
Get
, !
ToString
))).
b.
If
SameValueZero
searchElement
elementK
) is
true
, return
true
c.
Set
to
+ 1.
11.
Return
false
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
Note 3
This method intentionally differs from the similar
indexOf
method in two ways. First, it uses the
SameValueZero
algorithm, instead of
IsStrictlyEqual
, allowing it to detect
NaN
array elements. Second, it does not skip missing array elements, instead treating them as
undefined
23.1.3.17
Array.prototype.indexOf (
searchElement
[ ,
fromIndex
] )
This method compares
searchElement
to the elements of the array, in ascending order, using the
IsStrictlyEqual
algorithm, and if found at one or more indices, returns the smallest such index; otherwise, it returns
-1
Note 1
The optional second argument
fromIndex
defaults to
+0
(i.e. the whole array is searched). If it is greater than or equal to the length of the array,
-1
is returned, i.e. the array will not be searched. If it is less than
-0
, it is used as the offset from the end of the array to compute
fromIndex
. If the computed index is less than or equal to
+0
, the whole array will be searched.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
len
= 0, return
-1
4.
Let
be ?
ToIntegerOrInfinity
fromIndex
).
5.
Assert
: If
fromIndex
is
undefined
, then
is 0.
6.
If
= +∞, return
-1
7.
Else if
= -∞, set
to 0.
8.
If
≥ 0, then
a.
Let
be
9.
Else,
a.
Let
be
len
b.
If
< 0, set
to 0.
10.
Repeat, while
len
a.
Let
kPresent
be ?
HasProperty
, !
ToString
))).
b.
If
kPresent
is
true
, then
i.
Let
elementK
be ?
Get
, !
ToString
))).
ii.
If
IsStrictlyEqual
searchElement
elementK
) is
true
, return
).
c.
Set
to
+ 1.
11.
Return
-1
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.18
Array.prototype.join (
separator
This method converts the elements of the array to Strings, and then concatenates these Strings, separated by occurrences of the
separator
. If no separator is provided, a single comma is used as the separator.
It performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
separator
is
undefined
, let
sep
be
","
4.
Else, let
sep
be ?
ToString
separator
).
5.
Let
be the empty String.
6.
Let
be 0.
7.
Repeat, while
len
a.
If
> 0, set
to the
string-concatenation
of
and
sep
b.
Let
element
be ?
Get
, !
ToString
))).
c.
If
element
is either
undefined
or
null
, let
next
be the empty String; otherwise, let
next
be ?
ToString
element
).
d.
Set
to the
string-concatenation
of
and
next
e.
Set
to
+ 1.
8.
Return
Note
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore, it can be transferred to other kinds of objects for use as a method.
23.1.3.19
Array.prototype.keys ( )
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Return
CreateArrayIterator
key
).
23.1.3.20
Array.prototype.lastIndexOf (
searchElement
[ ,
fromIndex
] )
Note 1
This method compares
searchElement
to the elements of the array in descending order using the
IsStrictlyEqual
algorithm, and if found at one or more indices, returns the largest such index; otherwise, it returns
-1
The optional second argument
fromIndex
defaults
to the array's length minus one (i.e. the whole array is searched). If
it is greater than or equal to the length of the array, the whole array
will be searched. If it is less than
-0
, it is used as the offset from the end of the array to compute
fromIndex
. If the computed index is less than or equal to
+0
-1
is returned.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
len
= 0, return
-1
4.
If
fromIndex
is present, let
be ?
ToIntegerOrInfinity
fromIndex
); else let
be
len
- 1.
5.
If
= -∞, return
-1
6.
If
≥ 0, then
a.
Let
be
min
len
- 1).
7.
Else,
a.
Let
be
len
8.
Repeat, while
≥ 0,
a.
Let
kPresent
be ?
HasProperty
, !
ToString
))).
b.
If
kPresent
is
true
, then
i.
Let
elementK
be ?
Get
, !
ToString
))).
ii.
If
IsStrictlyEqual
searchElement
elementK
) is
true
, return
).
c.
Set
to
- 1.
9.
Return
-1
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.21
Array.prototype.map (
callbackfn
[ ,
thisArg
] )
Note 1
callbackfn
should be a function that accepts three arguments.
map
calls
callbackfn
once for each element in the array, in ascending order, and constructs a new Array from the results.
callbackfn
is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a
thisArg
parameter is provided, it will be used as the
this
value for each invocation of
callbackfn
. If it is not provided,
undefined
is used instead.
callbackfn
is called with three arguments: the value of the element, the index of the element, and the object being traversed.
map
does not directly mutate the object on which it is called but the object may be mutated by the calls to
callbackfn
The range of elements processed by
map
is set before the first call to
callbackfn
. Elements which are appended to the array after the call to
map
begins will not be visited by
callbackfn
. If existing elements of the array are changed, their value as passed to
callbackfn
will be the value at the time
map
visits them; elements that are deleted after the call to
map
begins and before being visited are not visited.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
4.
Let
be ?
ArraySpeciesCreate
len
).
5.
Let
be 0.
6.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kPresent
be ?
HasProperty
Pk
).
c.
If
kPresent
is
true
, then
i.
Let
kValue
be ?
Get
Pk
).
ii.
Let
mappedValue
be ?
Call
callbackfn
thisArg
, «
kValue
),
»).
iii.
Perform ?
CreateDataPropertyOrThrow
Pk
mappedValue
).
d.
Set
to
+ 1.
7.
Return
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.22
Array.prototype.pop ( )
Note 1
This method removes the last element of the array and returns it.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
len
= 0, then
a.
Perform ?
Set
"length"
+0
true
).
b.
Return
undefined
4.
Else,
a.
Assert
len
> 0.
b.
Let
newLen
be
len
- 1).
c.
Let
index
be !
ToString
newLen
).
d.
Let
element
be ?
Get
index
).
e.
Perform ?
DeletePropertyOrThrow
index
).
f.
Perform ?
Set
"length"
newLen
true
).
g.
Return
element
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.23
Array.prototype.push ( ...
items
Note 1
This method appends the arguments to the end of the array,
in the order in which they appear. It returns the new length of the
array.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
argCount
be the number of elements in
items
4.
If
len
argCount
> 2
53
- 1, throw a
TypeError
exception.
5.
For each element
of
items
, do
a.
Perform ?
Set
, !
ToString
len
)),
true
).
b.
Set
len
to
len
+ 1.
6.
Perform ?
Set
"length"
len
),
true
).
7.
Return
len
).
The
"length"
property of this method is
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.24
Array.prototype.reduce (
callbackfn
[ ,
initialValue
] )
Note 1
callbackfn
should be a function that takes four arguments.
reduce
calls the callback, as a function, once for each element after the first element present in the array, in ascending order.
callbackfn
is called with four arguments: the
previousValue
(value from the previous call to
callbackfn
), the
currentValue
(value of the current element), the
currentIndex
, and the object being traversed. The first time that callback is called, the
previousValue
and
currentValue
can be one of two values. If an
initialValue
was supplied in the call to
reduce
, then
previousValue
will be
initialValue
and
currentValue
will be the first value in the array. If no
initialValue
was supplied, then
previousValue
will be the first value in the array and
currentValue
will be the second. It is a
TypeError
if the array contains no elements and
initialValue
is not provided.
reduce
does not directly mutate the object on which it is called but the object may be mutated by the calls to
callbackfn
The range of elements processed by
reduce
is set before the first call to
callbackfn
. Elements that are appended to the array after the call to
reduce
begins will not be visited by
callbackfn
. If existing elements of the array are changed, their value as passed to
callbackfn
will be the value at the time
reduce
visits them; elements that are deleted after the call to
reduce
begins and before being visited are not visited.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
4.
If
len
= 0 and
initialValue
is not present, throw a
TypeError
exception.
5.
Let
be 0.
6.
Let
accumulator
be
undefined
7.
If
initialValue
is present, then
a.
Set
accumulator
to
initialValue
8.
Else,
a.
Let
kPresent
be
false
b.
Repeat, while
kPresent
is
false
and
len
i.
Let
Pk
be !
ToString
)).
ii.
Set
kPresent
to ?
HasProperty
Pk
).
iii.
If
kPresent
is
true
, then
1.
Set
accumulator
to ?
Get
Pk
).
iv.
Set
to
+ 1.
c.
If
kPresent
is
false
, throw a
TypeError
exception.
9.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kPresent
be ?
HasProperty
Pk
).
c.
If
kPresent
is
true
, then
i.
Let
kValue
be ?
Get
Pk
).
ii.
Set
accumulator
to ?
Call
callbackfn
undefined
, «
accumulator
kValue
),
»).
d.
Set
to
+ 1.
10.
Return
accumulator
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.25
Array.prototype.reduceRight (
callbackfn
[ ,
initialValue
] )
Note 1
callbackfn
should be a function that takes four arguments.
reduceRight
calls the callback, as a function, once for each element after the first element present in the array, in descending order.
callbackfn
is called with four arguments: the
previousValue
(value from the previous call to
callbackfn
), the
currentValue
(value of the current element), the
currentIndex
, and the object being traversed. The first time the function is called, the
previousValue
and
currentValue
can be one of two values. If an
initialValue
was supplied in the call to
reduceRight
, then
previousValue
will be
initialValue
and
currentValue
will be the last value in the array. If no
initialValue
was supplied, then
previousValue
will be the last value in the array and
currentValue
will be the second-to-last value. It is a
TypeError
if the array contains no elements and
initialValue
is not provided.
reduceRight
does not directly mutate the object on which it is called but the object may be mutated by the calls to
callbackfn
The range of elements processed by
reduceRight
is set before the first call to
callbackfn
. Elements that are appended to the array after the call to
reduceRight
begins will not be visited by
callbackfn
. If existing elements of the array are changed by
callbackfn
, their value as passed to
callbackfn
will be the value at the time
reduceRight
visits them; elements that are deleted after the call to
reduceRight
begins and before being visited are not visited.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
4.
If
len
= 0 and
initialValue
is not present, throw a
TypeError
exception.
5.
Let
be
len
- 1.
6.
Let
accumulator
be
undefined
7.
If
initialValue
is present, then
a.
Set
accumulator
to
initialValue
8.
Else,
a.
Let
kPresent
be
false
b.
Repeat, while
kPresent
is
false
and
≥ 0,
i.
Let
Pk
be !
ToString
)).
ii.
Set
kPresent
to ?
HasProperty
Pk
).
iii.
If
kPresent
is
true
, then
1.
Set
accumulator
to ?
Get
Pk
).
iv.
Set
to
- 1.
c.
If
kPresent
is
false
, throw a
TypeError
exception.
9.
Repeat, while
≥ 0,
a.
Let
Pk
be !
ToString
)).
b.
Let
kPresent
be ?
HasProperty
Pk
).
c.
If
kPresent
is
true
, then
i.
Let
kValue
be ?
Get
Pk
).
ii.
Set
accumulator
to ?
Call
callbackfn
undefined
, «
accumulator
kValue
),
»).
d.
Set
to
- 1.
10.
Return
accumulator
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.26
Array.prototype.reverse ( )
Note 1
This method rearranges the elements of the array so as to reverse their order. It returns the object as the result of the call.
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
middle
be
floor
len
/ 2).
4.
Let
lower
be 0.
5.
Repeat, while
lower
middle
a.
Let
upper
be
len
lower
- 1.
b.
Let
upperP
be !
ToString
upper
)).
c.
Let
lowerP
be !
ToString
lower
)).
d.
Let
lowerExists
be ?
HasProperty
lowerP
).
e.
If
lowerExists
is
true
, then
i.
Let
lowerValue
be ?
Get
lowerP
).
f.
Let
upperExists
be ?
HasProperty
upperP
).
g.
If
upperExists
is
true
, then
i.
Let
upperValue
be ?
Get
upperP
).
h.
If
lowerExists
is
true
and
upperExists
is
true
, then
i.
Perform ?
Set
lowerP
upperValue
true
).
ii.
Perform ?
Set
upperP
lowerValue
true
).
i.
Else if
lowerExists
is
false
and
upperExists
is
true
, then
i.
Perform ?
Set
lowerP
upperValue
true
).
ii.
Perform ?
DeletePropertyOrThrow
upperP
).
j.
Else if
lowerExists
is
true
and
upperExists
is
false
, then
i.
Perform ?
DeletePropertyOrThrow
lowerP
).
ii.
Perform ?
Set
upperP
lowerValue
true
).
k.
Else,
i.
Assert
lowerExists
and
upperExists
are both
false
ii.
NOTE: No action is required.
l.
Set
lower
to
lower
+ 1.
6.
Return
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore, it can be transferred to other kinds of objects for use as a method.
23.1.3.27
Array.prototype.shift ( )
This method removes the first element of the array and returns it.
It performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
len
= 0, then
a.
Perform ?
Set
"length"
+0
true
).
b.
Return
undefined
4.
Let
first
be ?
Get
"0"
).
5.
Let
be 1.
6.
Repeat, while
len
a.
Let
from
be !
ToString
)).
b.
Let
to
be !
ToString
- 1)).
c.
Let
fromPresent
be ?
HasProperty
from
).
d.
If
fromPresent
is
true
, then
i.
Let
fromVal
be ?
Get
from
).
ii.
Perform ?
Set
to
fromVal
true
).
e.
Else,
i.
Assert
fromPresent
is
false
ii.
Perform ?
DeletePropertyOrThrow
to
).
f.
Set
to
+ 1.
7.
Perform ?
DeletePropertyOrThrow
, !
ToString
len
- 1))).
8.
Perform ?
Set
"length"
len
- 1),
true
).
9.
Return
first
Note
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.28
Array.prototype.slice (
start
end
This method returns an array containing the elements of the array from element
start
up to, but not including, element
end
(or through the end of the array if
end
is
undefined
). If
start
is negative, it is treated as
length
start
where
length
is the length of the array. If
end
is negative, it is treated as
length
end
where
length
is the length of the array.
It performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
relativeStart
be ?
ToIntegerOrInfinity
start
).
4.
If
relativeStart
= -∞, let
be 0.
5.
Else if
relativeStart
< 0, let
be
max
len
relativeStart
, 0).
6.
Else, let
be
min
relativeStart
len
).
7.
If
end
is
undefined
, let
relativeEnd
be
len
; else let
relativeEnd
be ?
ToIntegerOrInfinity
end
).
8.
If
relativeEnd
= -∞, let
final
be 0.
9.
Else if
relativeEnd
< 0, let
final
be
max
len
relativeEnd
, 0).
10.
Else, let
final
be
min
relativeEnd
len
).
11.
Let
count
be
max
final
, 0).
12.
Let
be ?
ArraySpeciesCreate
count
).
13.
Let
be 0.
14.
Repeat, while
final
a.
Let
Pk
be !
ToString
)).
b.
Let
kPresent
be ?
HasProperty
Pk
).
c.
If
kPresent
is
true
, then
i.
Let
kValue
be ?
Get
Pk
).
ii.
Perform ?
CreateDataPropertyOrThrow
, !
ToString
)),
kValue
).
d.
Set
to
+ 1.
e.
Set
to
+ 1.
15.
Perform ?
Set
"length"
),
true
).
16.
Return
Note 1
The explicit setting of the
"length"
property of the result Array in step
15
was necessary in previous editions of ECMAScript to ensure that its
length was correct in situations where the trailing elements of the
result Array were not present. Setting
"length"
became unnecessary starting in ES2015 when the result Array was
initialized to its proper length rather than an empty Array but is
carried forward to preserve backward compatibility.
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.29
Array.prototype.some (
callbackfn
[ ,
thisArg
] )
Note 1
callbackfn
should be a function that accepts three arguments and returns a value that is coercible to a Boolean value.
some
calls
callbackfn
once for each element present in the array, in ascending order, until it finds one where
callbackfn
returns
true
. If such an element is found,
some
immediately returns
true
. Otherwise,
some
returns
false
callbackfn
is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a
thisArg
parameter is provided, it will be used as the
this
value for each invocation of
callbackfn
. If it is not provided,
undefined
is used instead.
callbackfn
is called with three arguments: the value of the element, the index of the element, and the object being traversed.
some
does not directly mutate the object on which it is called but the object may be mutated by the calls to
callbackfn
The range of elements processed by
some
is set before the first call to
callbackfn
. Elements that are appended to the array after the call to
some
begins will not be visited by
callbackfn
. If existing elements of the array are changed, their value as passed to
callbackfn
will be the value at the time that
some
visits them; elements that are deleted after the call to
some
begins and before being visited are not visited.
some
acts like the "exists" quantifier in mathematics. In particular, for an empty array, it returns
false
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
4.
Let
be 0.
5.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kPresent
be ?
HasProperty
Pk
).
c.
If
kPresent
is
true
, then
i.
Let
kValue
be ?
Get
Pk
).
ii.
Let
testResult
be
ToBoolean
(?
Call
callbackfn
thisArg
, «
kValue
),
»)).
iii.
If
testResult
is
true
, return
true
d.
Set
to
+ 1.
6.
Return
false
Note 2
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.30
Array.prototype.sort (
comparefn
This method sorts the elements of this array. The sort must
be stable (that is, elements that compare equal must remain in their
original order). If
comparefn
is not
undefined
, it should be a function that accepts two arguments
and
and returns a negative Number if
, a positive Number if
, or a zero otherwise.
It performs the following steps when called:
1.
If
comparefn
is not
undefined
and
IsCallable
comparefn
) is
false
, throw a
TypeError
exception.
2.
Let
obj
be ?
ToObject
this
value).
3.
Let
len
be ?
LengthOfArrayLike
obj
).
4.
Let
SortCompare
be a new
Abstract Closure
with parameters (
) that captures
comparefn
and performs the following steps when called:
a.
Return ?
CompareArrayElements
comparefn
).
5.
Let
sortedList
be ?
SortIndexedProperties
obj
len
SortCompare
skip-holes
).
6.
Let
itemCount
be the number of elements in
sortedList
7.
Let
be 0.
8.
Repeat, while
itemCount
a.
Perform ?
Set
obj
, !
ToString
)),
sortedList
],
true
).
b.
Set
to
+ 1.
9.
NOTE: The call to
SortIndexedProperties
in step
uses
skip-holes
. The remaining indices are deleted to preserve the number of holes that were detected and excluded from the sort.
10.
Repeat, while
len
a.
Perform ?
DeletePropertyOrThrow
obj
, !
ToString
))).
b.
Set
to
+ 1.
11.
Return
obj
Note 1
Because non-existent property values always compare greater than
undefined
property values, and
undefined
always compares greater than any other value (see
CompareArrayElements
),
undefined
property values always sort to the end of the result, followed by non-existent property values.
Note 2
Method calls performed by the
ToString
abstract operations
in steps
and
have the potential to cause
SortCompare
to not behave as a
consistent comparator
Note 3
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore, it can be transferred to other kinds of objects for use as a method.
23.1.3.30.1
SortIndexedProperties (
obj
len
SortCompare
holes
The abstract operation SortIndexedProperties takes arguments
obj
(an Object),
len
(a non-negative
integer
),
SortCompare
(an
Abstract Closure
with two parameters), and
holes
skip-holes
or
read-through-holes
) and returns either a
normal completion containing
List
of
ECMAScript language values
or a
throw completion
. It performs the following steps when called:
1.
Let
items
be a new empty
List
2.
Let
be 0.
3.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
If
holes
is
skip-holes
, then
i.
Let
kRead
be ?
HasProperty
obj
Pk
).
c.
Else,
i.
Assert
holes
is
read-through-holes
ii.
Let
kRead
be
true
d.
If
kRead
is
true
, then
i.
Let
kValue
be ?
Get
obj
Pk
).
ii.
Append
kValue
to
items
e.
Set
to
+ 1.
4.
Sort
items
using an
implementation-defined
sequence of
calls to
SortCompare
. If any such call returns an
abrupt completion
, stop before performing any further calls to
SortCompare
and return that
Completion Record
5.
Return
items
The
sort order
is the ordering of
items
after completion of step
of the algorithm above. The
sort order
is
implementation-defined
if
SortCompare
is not a
consistent comparator
for the elements of
items
. When SortIndexedProperties is invoked by
Array.prototype.sort
, the
sort order
is also
implementation-defined
if
comparefn
is
undefined
, and all applications of
ToString
, to any specific value passed as an argument to
SortCompare
, do not produce the same result.
Unless the
sort order
is specified to be
implementation-defined
, it must satisfy all of the following conditions:
There must be some mathematical permutation π of the non-negative
integers
less than
itemCount
, such that for every non-negative
integer
less than
itemCount
, the element
old[
is exactly the same as
new[π(
)]
Then for all non-negative
integers
and
, each less than
itemCount
, if
SortCompare
(old[
], old[
])) < 0
, then
π(
) < π(
Here the notation
old[
is used to refer to
items
before step
is executed, and the notation
new[
to refer to
items
after step
has been executed.
An abstract closure or function
comparator
is a
consistent comparator
for a set of values
if all of the requirements below are met for all values
, and
(possibly the same value) in the set
: The notation
means
comparator
)) < 0
means
comparator
)) = 0
; and
means
comparator
)) > 0
Calling
comparator
) always returns the same value
when given a specific pair of values
and
as its two arguments. Furthermore,
is a Number
, and
is not
NaN
. Note that this implies that exactly one of
, and
will be true for a given pair of
and
Calling
comparator
) does not modify
obj
or any object on
obj
's prototype chain.
(reflexivity)
If
, then
(symmetry)
If
and
, then
(transitivity of =
If
and
, then
(transitivity of <
If
and
, then
(transitivity of >
Note
The above conditions are necessary and sufficient to ensure that
comparator
divides the set
into equivalence classes and that these equivalence classes are totally ordered.
23.1.3.30.2
CompareArrayElements (
comparefn
The abstract operation CompareArrayElements takes arguments
(an
ECMAScript language value
),
(an
ECMAScript language value
), and
comparefn
(a
function object
or
undefined
) and returns either a
normal completion containing
a Number or an
abrupt completion
. It performs the following steps when called:
1.
If
and
are both
undefined
, return
+0
2.
If
is
undefined
, return
3.
If
is
undefined
, return
-1
4.
If
comparefn
is not
undefined
, then
a.
Let
be ?
ToNumber
(?
Call
comparefn
undefined
, «
»)).
b.
If
is
NaN
, return
+0
c.
Return
5.
Let
xString
be ?
ToString
).
6.
Let
yString
be ?
ToString
).
7.
Let
xSmaller
be !
IsLessThan
xString
yString
true
).
8.
If
xSmaller
is
true
, return
-1
9.
Let
ySmaller
be !
IsLessThan
yString
xString
true
).
10.
If
ySmaller
is
true
, return
11.
Return
+0
23.1.3.31
Array.prototype.splice (
start
deleteCount
, ...
items
Note 1
This method deletes the
deleteCount
elements of the array starting at
integer index
start
and replaces them with the elements of
items
. It returns an Array containing the deleted elements (if any).
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
relativeStart
be ?
ToIntegerOrInfinity
start
).
4.
If
relativeStart
= -∞, let
actualStart
be 0.
5.
Else if
relativeStart
< 0, let
actualStart
be
max
len
relativeStart
, 0).
6.
Else, let
actualStart
be
min
relativeStart
len
).
7.
Let
itemCount
be the number of elements in
items
8.
If
start
is not present, then
a.
Let
actualDeleteCount
be 0.
9.
Else if
deleteCount
is not present, then
a.
Let
actualDeleteCount
be
len
actualStart
10.
Else,
a.
Let
dc
be ?
ToIntegerOrInfinity
deleteCount
).
b.
Let
actualDeleteCount
be the result of
clamping
dc
between 0 and
len
actualStart
11.
If
len
itemCount
actualDeleteCount
> 2
53
- 1, throw a
TypeError
exception.
12.
Let
be ?
ArraySpeciesCreate
actualDeleteCount
).
13.
Let
be 0.
14.
Repeat, while
actualDeleteCount
a.
Let
from
be !
ToString
actualStart
)).
b.
If ?
HasProperty
from
) is
true
, then
i.
Let
fromValue
be ?
Get
from
).
ii.
Perform ?
CreateDataPropertyOrThrow
, !
ToString
)),
fromValue
).
c.
Set
to
+ 1.
15.
Perform ?
Set
"length"
actualDeleteCount
),
true
).
16.
If
itemCount
actualDeleteCount
, then
a.
Set
to
actualStart
b.
Repeat, while
< (
len
actualDeleteCount
),
i.
Let
from
be !
ToString
actualDeleteCount
)).
ii.
Let
to
be !
ToString
itemCount
)).
iii.
If ?
HasProperty
from
) is
true
, then
1.
Let
fromValue
be ?
Get
from
).
2.
Perform ?
Set
to
fromValue
true
).
iv.
Else,
1.
Perform ?
DeletePropertyOrThrow
to
).
v.
Set
to
+ 1.
c.
Set
to
len
d.
Repeat, while
> (
len
actualDeleteCount
itemCount
),
i.
Perform ?
DeletePropertyOrThrow
, !
ToString
- 1))).
ii.
Set
to
- 1.
17.
Else if
itemCount
actualDeleteCount
, then
a.
Set
to (
len
actualDeleteCount
).
b.
Repeat, while
actualStart
i.
Let
from
be !
ToString
actualDeleteCount
- 1)).
ii.
Let
to
be !
ToString
itemCount
- 1)).
iii.
If ?
HasProperty
from
) is
true
, then
1.
Let
fromValue
be ?
Get
from
).
2.
Perform ?
Set
to
fromValue
true
).
iv.
Else,
1.
Perform ?
DeletePropertyOrThrow
to
).
v.
Set
to
- 1.
18.
Set
to
actualStart
19.
For each element
of
items
, do
a.
Perform ?
Set
, !
ToString
)),
true
).
b.
Set
to
+ 1.
20.
Perform ?
Set
"length"
len
actualDeleteCount
itemCount
),
true
).
21.
Return
Note 2
The explicit setting of the
"length"
property of the result Array in step
20
was necessary in previous editions of ECMAScript to ensure that its
length was correct in situations where the trailing elements of the
result Array were not present. Setting
"length"
became unnecessary starting in ES2015 when the result Array was
initialized to its proper length rather than an empty Array but is
carried forward to preserve backward compatibility.
Note 3
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.32
Array.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
An ECMAScript implementation that includes the ECMA-402
Internationalization API must implement this method as specified in the
ECMA-402 specification. If an ECMAScript implementation does not include
the ECMA-402 API the following specification of this method is used.
Note 1
The first edition of ECMA-402 did not include a replacement specification for this method.
The meanings of the optional parameters to this method are
defined in the ECMA-402 specification; implementations that do not
include ECMA-402 support must not use those parameter positions for
anything else.
This method performs the following steps when called:
1.
Let
array
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
array
).
3.
Let
separator
be the
implementation-defined
list-separator String value appropriate for the
host environment
's current locale (such as
", "
).
4.
Let
be the empty String.
5.
Let
be 0.
6.
Repeat, while
len
a.
If
> 0, then
i.
Set
to the
string-concatenation
of
and
separator
b.
Let
nextElement
be ?
Get
array
, !
ToString
))).
c.
If
nextElement
is neither
undefined
nor
null
, then
i.
Let
be ?
ToString
(?
Invoke
nextElement
"toLocaleString"
)).
ii.
Set
to the
string-concatenation
of
and
d.
Set
to
+ 1.
7.
Return
Note 2
This method converts the elements of the array to Strings using their
toLocaleString
methods, and then concatenates these Strings, separated by occurrences of an
implementation-defined
locale-sensitive separator String. This method is analogous to
toString
except that it is intended to yield a locale-sensitive result corresponding with conventions of the
host environment
's current locale.
Note 3
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.33
Array.prototype.toReversed ( )
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
be ?
ArrayCreate
len
).
4.
Let
be 0.
5.
Repeat, while
len
a.
Let
from
be !
ToString
len
- 1)).
b.
Let
Pk
be !
ToString
)).
c.
Let
fromValue
be ?
Get
from
).
d.
Perform !
CreateDataPropertyOrThrow
Pk
fromValue
).
e.
Set
to
+ 1.
6.
Return
23.1.3.34
Array.prototype.toSorted (
comparefn
This method performs the following steps when called:
1.
If
comparefn
is not
undefined
and
IsCallable
comparefn
) is
false
, throw a
TypeError
exception.
2.
Let
be ?
ToObject
this
value).
3.
Let
len
be ?
LengthOfArrayLike
).
4.
Let
be ?
ArrayCreate
len
).
5.
Let
SortCompare
be a new
Abstract Closure
with parameters (
) that captures
comparefn
and performs the following steps when called:
a.
Return ?
CompareArrayElements
comparefn
).
6.
Let
sortedList
be ?
SortIndexedProperties
len
SortCompare
read-through-holes
).
7.
Let
be 0.
8.
Repeat, while
len
a.
Perform !
CreateDataPropertyOrThrow
, !
ToString
)),
sortedList
]).
b.
Set
to
+ 1.
9.
Return
23.1.3.35
Array.prototype.toSpliced (
start
skipCount
, ...
items
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
relativeStart
be ?
ToIntegerOrInfinity
start
).
4.
If
relativeStart
is -∞, let
actualStart
be 0.
5.
Else if
relativeStart
< 0, let
actualStart
be
max
len
relativeStart
, 0).
6.
Else, let
actualStart
be
min
relativeStart
len
).
7.
Let
insertCount
be the number of elements in
items
8.
If
start
is not present, then
a.
Let
actualSkipCount
be 0.
9.
Else if
skipCount
is not present, then
a.
Let
actualSkipCount
be
len
actualStart
10.
Else,
a.
Let
sc
be ?
ToIntegerOrInfinity
skipCount
).
b.
Let
actualSkipCount
be the result of
clamping
sc
between 0 and
len
actualStart
11.
Let
newLen
be
len
insertCount
actualSkipCount
12.
If
newLen
> 2
53
- 1, throw a
TypeError
exception.
13.
Let
be ?
ArrayCreate
newLen
).
14.
Let
be 0.
15.
Let
be
actualStart
actualSkipCount
16.
Repeat, while
actualStart
a.
Let
Pi
be !
ToString
)).
b.
Let
iValue
be ?
Get
Pi
).
c.
Perform !
CreateDataPropertyOrThrow
Pi
iValue
).
d.
Set
to
+ 1.
17.
For each element
of
items
, do
a.
Let
Pi
be !
ToString
)).
b.
Perform !
CreateDataPropertyOrThrow
Pi
).
c.
Set
to
+ 1.
18.
Repeat, while
newLen
a.
Let
Pi
be !
ToString
)).
b.
Let
from
be !
ToString
)).
c.
Let
fromValue
be ?
Get
from
).
d.
Perform !
CreateDataPropertyOrThrow
Pi
fromValue
).
e.
Set
to
+ 1.
f.
Set
to
+ 1.
19.
Return
23.1.3.36
Array.prototype.toString ( )
This method performs the following steps when called:
1.
Let
array
be ?
ToObject
this
value).
2.
Let
func
be ?
Get
array
"join"
).
3.
If
IsCallable
func
) is
false
, set
func
to the intrinsic function %Object.prototype.toString%.
4.
Return ?
Call
func
array
).
Note
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.37
Array.prototype.unshift ( ...
items
This method prepends the arguments to the start of the array,
such that their order within the array is the same as the order in
which they appear in the argument list.
It performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
argCount
be the number of elements in
items
4.
If
argCount
> 0, then
a.
If
len
argCount
> 2
53
- 1, throw a
TypeError
exception.
b.
Let
be
len
c.
Repeat, while
> 0,
i.
Let
from
be !
ToString
- 1)).
ii.
Let
to
be !
ToString
argCount
- 1)).
iii.
Let
fromPresent
be ?
HasProperty
from
).
iv.
If
fromPresent
is
true
, then
1.
Let
fromValue
be ?
Get
from
).
2.
Perform ?
Set
to
fromValue
true
).
v.
Else,
1.
Assert
fromPresent
is
false
2.
Perform ?
DeletePropertyOrThrow
to
).
vi.
Set
to
- 1.
d.
Let
be
+0
e.
For each element
of
items
, do
i.
Perform ?
Set
, !
ToString
),
true
).
ii.
Set
to
5.
Perform ?
Set
"length"
len
argCount
),
true
).
6.
Return
len
argCount
).
The
"length"
property of this method is
Note
This method is intentionally generic; it does not require that its
this
value be an Array. Therefore it can be transferred to other kinds of objects for use as a method.
23.1.3.38
Array.prototype.values ( )
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Return
CreateArrayIterator
value
).
23.1.3.39
Array.prototype.with (
index
value
This method performs the following steps when called:
1.
Let
be ?
ToObject
this
value).
2.
Let
len
be ?
LengthOfArrayLike
).
3.
Let
relativeIndex
be ?
ToIntegerOrInfinity
index
).
4.
If
relativeIndex
≥ 0, let
actualIndex
be
relativeIndex
5.
Else, let
actualIndex
be
len
relativeIndex
6.
If
actualIndex
len
or
actualIndex
< 0, throw a
RangeError
exception.
7.
Let
be ?
ArrayCreate
len
).
8.
Let
be 0.
9.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
If
is
actualIndex
, let
fromValue
be
value
c.
Else, let
fromValue
be ?
Get
Pk
).
d.
Perform !
CreateDataPropertyOrThrow
Pk
fromValue
).
e.
Set
to
+ 1.
10.
Return
23.1.3.40
Array.prototype [ @@iterator ] ( )
The initial value of the
@@iterator
property is %Array.prototype.values%, defined in
23.1.3.38
23.1.3.41
Array.prototype [ @@unscopables ]
The initial value of the
@@unscopables
data property
is an object created by the following steps:
1.
Let
unscopableList
be
OrdinaryObjectCreate
null
).
2.
Perform !
CreateDataPropertyOrThrow
unscopableList
"at"
true
).
3.
Perform !
CreateDataPropertyOrThrow
unscopableList
"copyWithin"
true
).
4.
Perform !
CreateDataPropertyOrThrow
unscopableList
"entries"
true
).
5.
Perform !
CreateDataPropertyOrThrow
unscopableList
"fill"
true
).
6.
Perform !
CreateDataPropertyOrThrow
unscopableList
"find"
true
).
7.
Perform !
CreateDataPropertyOrThrow
unscopableList
"findIndex"
true
).
8.
Perform !
CreateDataPropertyOrThrow
unscopableList
"findLast"
true
).
9.
Perform !
CreateDataPropertyOrThrow
unscopableList
"findLastIndex"
true
).
10.
Perform !
CreateDataPropertyOrThrow
unscopableList
"flat"
true
).
11.
Perform !
CreateDataPropertyOrThrow
unscopableList
"flatMap"
true
).
12.
Perform !
CreateDataPropertyOrThrow
unscopableList
"includes"
true
).
13.
Perform !
CreateDataPropertyOrThrow
unscopableList
"keys"
true
).
14.
Perform !
CreateDataPropertyOrThrow
unscopableList
"toReversed"
true
).
15.
Perform !
CreateDataPropertyOrThrow
unscopableList
"toSorted"
true
).
16.
Perform !
CreateDataPropertyOrThrow
unscopableList
"toSpliced"
true
).
17.
Perform !
CreateDataPropertyOrThrow
unscopableList
"values"
true
).
18.
Return
unscopableList
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
Note
The own property names of this object are property names that were not included as standard properties of
Array.prototype
prior to the ECMAScript 2015 specification. These names are ignored for
with
statement binding purposes in order to preserve the behaviour of
existing code that might use one of these names as a binding in an outer
scope that is shadowed by a
with
statement whose binding object is an Array.
The reason that
"with"
is not included in the
unscopableList
is because it is already a
reserved word
23.1.4
Properties of Array Instances
Array instances are
Array exotic objects
and have the internal methods specified for such objects. Array instances inherit properties from the
Array prototype object
Array instances have a
"length"
property, and a set of enumerable properties with
array index
names.
23.1.4.1
length
The
"length"
property of an Array instance is a
data property
whose value is always numerically greater than the name of every configurable own property whose name is an
array index
The
"length"
property initially has the attributes { [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
Note
Reducing the value of the
"length"
property has the side-effect of deleting own array elements whose
array index
is between the old and new length values. However, non-configurable properties can not be deleted. Attempting to set the
"length"
property of an Array to a value that is numerically less than or equal to the largest numeric own
property name
of an existing non-configurable
array-indexed
property of the array will result in the length being set to a numeric
value that is one greater than that non-configurable numeric own
property name
. See
10.4.2.1
23.1.5
Array Iterator Objects
An Array Iterator is an object, that represents a specific
iteration over some specific Array instance object. There is not a named
constructor
for Array Iterator objects. Instead, Array iterator objects are created by calling certain methods of Array instance objects.
23.1.5.1
CreateArrayIterator (
array
kind
The abstract operation CreateArrayIterator takes arguments
array
(an Object) and
kind
key+value
key
, or
value
and returns a Generator. It is used to create iterator objects for
Array methods that return such iterators. It performs the following
steps when called:
1.
Let
closure
be a new
Abstract Closure
with no parameters that captures
kind
and
array
and performs the following steps when called:
a.
Let
index
be 0.
b.
Repeat,
i.
If
array
has a [[TypedArrayName]] internal slot, then
1.
If
IsDetachedBuffer
array
.[[ViewedArrayBuffer]]) is
true
, throw a
TypeError
exception.
2.
Let
len
be
array
.[[ArrayLength]].
ii.
Else,
1.
Let
len
be ?
LengthOfArrayLike
array
).
iii.
If
index
len
, return
NormalCompletion
undefined
).
iv.
If
kind
is
key
, perform ?
GeneratorYield
CreateIterResultObject
index
),
false
)).
v.
Else,
1.
Let
elementKey
be !
ToString
index
)).
2.
Let
elementValue
be ?
Get
array
elementKey
).
3.
If
kind
is
value
, perform ?
GeneratorYield
CreateIterResultObject
elementValue
false
)).
4.
Else,
a.
Assert
kind
is
key+value
b.
Let
result
be
CreateArrayFromList

index
),
elementValue
»).
c.
Perform ?
GeneratorYield
CreateIterResultObject
result
false
)).
vi.
Set
index
to
index
+ 1.
2.
Return
CreateIteratorFromClosure
closure
"%ArrayIteratorPrototype%"
%ArrayIteratorPrototype%
).
23.1.5.2
The %ArrayIteratorPrototype% Object
The
%ArrayIteratorPrototype%
object:
has properties that are inherited by all Array Iterator Objects.
is an
ordinary object
has a [[Prototype]] internal slot whose value is
%IteratorPrototype%
has the following properties:
23.1.5.2.1
%ArrayIteratorPrototype%.next ( )
1.
Return ?
GeneratorResume
this
value,
empty
"%ArrayIteratorPrototype%"
).
23.1.5.2.2
%ArrayIteratorPrototype% [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Array Iterator"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
23.2
TypedArray Objects
TypedArray
presents an array-like view of an underlying binary data buffer (
25.1
). A
TypedArray element type
is the underlying binary scalar data type that all elements of a
TypedArray
instance have. There is a distinct
TypedArray
constructor
, listed in
Table 68
, for each of the supported element types. Each
constructor
in
Table 68
has a corresponding distinct prototype object.
Table 68: The TypedArray
Constructors
Constructor
Name and Intrinsic
Element Type
Element Size
Conversion Operation
Description
Int8Array
%Int8Array%
Int8
ToInt8
8-bit two's complement signed
integer
Uint8Array
%Uint8Array%
Uint8
ToUint8
8-bit unsigned
integer
Uint8ClampedArray
%Uint8ClampedArray%
Uint8C
ToUint8Clamp
8-bit unsigned
integer
(clamped conversion)
Int16Array
%Int16Array%
Int16
ToInt16
16-bit two's complement signed
integer
Uint16Array
%Uint16Array%
Uint16
ToUint16
16-bit unsigned
integer
Int32Array
%Int32Array%
Int32
ToInt32
32-bit two's complement signed
integer
Uint32Array
%Uint32Array%
Uint32
ToUint32
32-bit unsigned
integer
BigInt64Array
%BigInt64Array%
BigInt64
ToBigInt64
64-bit two's complement signed
integer
BigUint64Array
%BigUint64Array%
BigUint64
ToBigUint64
64-bit unsigned
integer
Float32Array
%Float32Array%
Float32
32-bit IEEE floating point
Float64Array
%Float64Array%
Float64
64-bit IEEE floating point
In the definitions below, references to
TypedArray
should be replaced with the appropriate
constructor
name from the above table.
23.2.1
The %TypedArray% Intrinsic Object
The
%TypedArray%
intrinsic object:
is a
constructor
function object
that all of the
TypedArray
constructor
objects inherit from.
along with its corresponding prototype object, provides common properties that are inherited by all
TypedArray
constructors
and their instances.
does not have a global name or appear as a property of the
global object
acts as the abstract superclass of the various
TypedArray
constructors
will throw an error when invoked, because it is an abstract class
constructor
. The
TypedArray
constructors
do not perform a
super
call to it.
23.2.1.1
%TypedArray% ( )
This function performs the following steps when called:
1.
Throw a
TypeError
exception.
The
"length"
property of this function is
+0
23.2.2
Properties of the %TypedArray% Intrinsic Object
The
%TypedArray%
intrinsic object:
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has a
"name"
property whose value is
"TypedArray"
has the following properties:
23.2.2.1
%TypedArray%.from (
source
[ ,
mapfn
[ ,
thisArg
] ] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
IsConstructor
) is
false
, throw a
TypeError
exception.
3.
If
mapfn
is
undefined
, let
mapping
be
false
4.
Else,
a.
If
IsCallable
mapfn
) is
false
, throw a
TypeError
exception.
b.
Let
mapping
be
true
5.
Let
usingIterator
be ?
GetMethod
source
@@iterator
).
6.
If
usingIterator
is not
undefined
, then
a.
Let
values
be ?
IteratorToList
(?
GetIteratorFromMethod
source
usingIterator
)).
b.
Let
len
be the number of elements in
values
c.
Let
targetObj
be ?
TypedArrayCreate
, «
len
) »).
d.
Let
be 0.
e.
Repeat, while
len
i.
Let
Pk
be !
ToString
)).
ii.
Let
kValue
be the first element of
values
iii.
Remove the first element from
values
iv.
If
mapping
is
true
, then
1.
Let
mappedValue
be ?
Call
mapfn
thisArg
, «
kValue
) »).
v.
Else, let
mappedValue
be
kValue
vi.
Perform ?
Set
targetObj
Pk
mappedValue
true
).
vii.
Set
to
+ 1.
f.
Assert
values
is now an empty
List
g.
Return
targetObj
7.
NOTE:
source
is not an Iterable so assume it is already an
array-like object
8.
Let
arrayLike
be !
ToObject
source
).
9.
Let
len
be ?
LengthOfArrayLike
arrayLike
).
10.
Let
targetObj
be ?
TypedArrayCreate
, «
len
) »).
11.
Let
be 0.
12.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be ?
Get
arrayLike
Pk
).
c.
If
mapping
is
true
, then
i.
Let
mappedValue
be ?
Call
mapfn
thisArg
, «
kValue
) »).
d.
Else, let
mappedValue
be
kValue
e.
Perform ?
Set
targetObj
Pk
mappedValue
true
).
f.
Set
to
+ 1.
13.
Return
targetObj
23.2.2.2
%TypedArray%.of ( ...
items
This method performs the following steps when called:
1.
Let
len
be the number of elements in
items
2.
Let
be the
this
value.
3.
If
IsConstructor
) is
false
, throw a
TypeError
exception.
4.
Let
newObj
be ?
TypedArrayCreate
, «
len
) »).
5.
Let
be 0.
6.
Repeat, while
len
a.
Let
kValue
be
items
].
b.
Let
Pk
be !
ToString
)).
c.
Perform ?
Set
newObj
Pk
kValue
true
).
d.
Set
to
+ 1.
7.
Return
newObj
23.2.2.3
%TypedArray%.prototype
The initial value of
%TypedArray%
.prototype
is the
%TypedArray% prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
23.2.2.4
get %TypedArray% [ @@species ]
%TypedArray%
[@@species]
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Return the
this
value.
The value of the
"name"
property of this function is
"get [Symbol.species]"
Note
%TypedArray.prototype%
methods normally use their
this
value's
constructor
to create a derived object. However, a subclass
constructor
may over-ride that default behaviour by redefining its
@@species
property.
23.2.3
Properties of the %TypedArray% Prototype Object
The
%TypedArray% prototype object
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is
%TypedArray.prototype%
is an
ordinary object
does not have a [[ViewedArrayBuffer]] or any other of the internal slots that are specific to
TypedArray
instance objects.
23.2.3.1
%TypedArray%.prototype.at (
index
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
Let
relativeIndex
be ?
ToIntegerOrInfinity
index
).
5.
If
relativeIndex
≥ 0, then
a.
Let
be
relativeIndex
6.
Else,
a.
Let
be
len
relativeIndex
7.
If
< 0 or
len
, return
undefined
8.
Return !
Get
, !
ToString
))).
23.2.3.2
get %TypedArray%.prototype.buffer
%TypedArray%
.prototype.buffer
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[TypedArrayName]]).
3.
Assert
has a [[ViewedArrayBuffer]] internal slot.
4.
Let
buffer
be
.[[ViewedArrayBuffer]].
5.
Return
buffer
23.2.3.3
get %TypedArray%.prototype.byteLength
%TypedArray%
.prototype.byteLength
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[TypedArrayName]]).
3.
Assert
has a [[ViewedArrayBuffer]] internal slot.
4.
Let
buffer
be
.[[ViewedArrayBuffer]].
5.
If
IsDetachedBuffer
buffer
) is
true
, return
+0
6.
Let
size
be
.[[ByteLength]].
7.
Return
size
).
23.2.3.4
get %TypedArray%.prototype.byteOffset
%TypedArray%
.prototype.byteOffset
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[TypedArrayName]]).
3.
Assert
has a [[ViewedArrayBuffer]] internal slot.
4.
Let
buffer
be
.[[ViewedArrayBuffer]].
5.
If
IsDetachedBuffer
buffer
) is
true
, return
+0
6.
Let
offset
be
.[[ByteOffset]].
7.
Return
offset
).
23.2.3.5
%TypedArray%.prototype.constructor
The initial value of
%TypedArray%
.prototype.constructor
is
%TypedArray%
23.2.3.6
%TypedArray%.prototype.copyWithin (
target
start
[ ,
end
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.copyWithin
as defined in
23.1.3.4
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
Let
relativeTarget
be ?
ToIntegerOrInfinity
target
).
5.
If
relativeTarget
= -∞, let
to
be 0.
6.
Else if
relativeTarget
< 0, let
to
be
max
len
relativeTarget
, 0).
7.
Else, let
to
be
min
relativeTarget
len
).
8.
Let
relativeStart
be ?
ToIntegerOrInfinity
start
).
9.
If
relativeStart
= -∞, let
from
be 0.
10.
Else if
relativeStart
< 0, let
from
be
max
len
relativeStart
, 0).
11.
Else, let
from
be
min
relativeStart
len
).
12.
If
end
is
undefined
, let
relativeEnd
be
len
; else let
relativeEnd
be ?
ToIntegerOrInfinity
end
).
13.
If
relativeEnd
= -∞, let
final
be 0.
14.
Else if
relativeEnd
< 0, let
final
be
max
len
relativeEnd
, 0).
15.
Else, let
final
be
min
relativeEnd
len
).
16.
Let
count
be
min
final
from
len
to
).
17.
If
count
> 0, then
a.
NOTE: The copying must be performed in a manner that preserves the bit-level encoding of the source data.
b.
Let
buffer
be
.[[ViewedArrayBuffer]].
c.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
d.
Let
elementSize
be
TypedArrayElementSize
).
e.
Let
byteOffset
be
.[[ByteOffset]].
f.
Let
toByteIndex
be
to
elementSize
byteOffset
g.
Let
fromByteIndex
be
from
elementSize
byteOffset
h.
Let
countBytes
be
count
elementSize
i.
If
fromByteIndex
toByteIndex
and
toByteIndex
fromByteIndex
countBytes
, then
i.
Let
direction
be -1.
ii.
Set
fromByteIndex
to
fromByteIndex
countBytes
- 1.
iii.
Set
toByteIndex
to
toByteIndex
countBytes
- 1.
j.
Else,
i.
Let
direction
be 1.
k.
Repeat, while
countBytes
> 0,
i.
Let
value
be
GetValueFromBuffer
buffer
fromByteIndex
Uint8
true
Unordered
).
ii.
Perform
SetValueInBuffer
buffer
toByteIndex
Uint8
value
true
Unordered
).
iii.
Set
fromByteIndex
to
fromByteIndex
direction
iv.
Set
toByteIndex
to
toByteIndex
direction
v.
Set
countBytes
to
countBytes
- 1.
18.
Return
23.2.3.7
%TypedArray%.prototype.entries ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Return
CreateArrayIterator
key+value
).
23.2.3.8
%TypedArray%.prototype.every (
callbackfn
[ ,
thisArg
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.every
as defined in
23.1.3.6
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
5.
Let
be 0.
6.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be !
Get
Pk
).
c.
Let
testResult
be
ToBoolean
(?
Call
callbackfn
thisArg
, «
kValue
),
»)).
d.
If
testResult
is
false
, return
false
e.
Set
to
+ 1.
7.
Return
true
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.9
%TypedArray%.prototype.fill (
value
[ ,
start
[ ,
end
] ] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.fill
as defined in
23.1.3.7
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
.[[ContentType]] is
BigInt
, set
value
to ?
ToBigInt
value
).
5.
Otherwise, set
value
to ?
ToNumber
value
).
6.
Let
relativeStart
be ?
ToIntegerOrInfinity
start
).
7.
If
relativeStart
= -∞, let
be 0.
8.
Else if
relativeStart
< 0, let
be
max
len
relativeStart
, 0).
9.
Else, let
be
min
relativeStart
len
).
10.
If
end
is
undefined
, let
relativeEnd
be
len
; else let
relativeEnd
be ?
ToIntegerOrInfinity
end
).
11.
If
relativeEnd
= -∞, let
final
be 0.
12.
Else if
relativeEnd
< 0, let
final
be
max
len
relativeEnd
, 0).
13.
Else, let
final
be
min
relativeEnd
len
).
14.
If
IsDetachedBuffer
.[[ViewedArrayBuffer]]) is
true
, throw a
TypeError
exception.
15.
Repeat, while
final
a.
Let
Pk
be !
ToString
)).
b.
Perform !
Set
Pk
value
true
).
c.
Set
to
+ 1.
16.
Return
23.2.3.10
%TypedArray%.prototype.filter (
callbackfn
[ ,
thisArg
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.filter
as defined in
23.1.3.8
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
5.
Let
kept
be a new empty
List
6.
Let
captured
be 0.
7.
Let
be 0.
8.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be !
Get
Pk
).
c.
Let
selected
be
ToBoolean
(?
Call
callbackfn
thisArg
, «
kValue
),
»)).
d.
If
selected
is
true
, then
i.
Append
kValue
to
kept
ii.
Set
captured
to
captured
+ 1.
e.
Set
to
+ 1.
9.
Let
be ?
TypedArraySpeciesCreate
, «
captured
) »).
10.
Let
be 0.
11.
For each element
of
kept
, do
a.
Perform !
Set
, !
ToString
)),
true
).
b.
Set
to
+ 1.
12.
Return
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.11
%TypedArray%.prototype.find (
predicate
[ ,
thisArg
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.find
as defined in
23.1.3.9
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
Let
findRec
be ?
FindViaPredicate
len
ascending
predicate
thisArg
).
5.
Return
findRec
.[[Value]].
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.12
%TypedArray%.prototype.findIndex (
predicate
[ ,
thisArg
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.findIndex
as defined in
23.1.3.10
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
Let
findRec
be ?
FindViaPredicate
len
ascending
predicate
thisArg
).
5.
Return
findRec
.[[Index]].
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.13
%TypedArray%.prototype.findLast (
predicate
[ ,
thisArg
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.findLast
as defined in
23.1.3.11
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
Let
findRec
be ?
FindViaPredicate
len
descending
predicate
thisArg
).
5.
Return
findRec
.[[Value]].
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.14
%TypedArray%.prototype.findLastIndex (
predicate
[ ,
thisArg
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.findLastIndex
as defined in
23.1.3.12
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
Let
findRec
be ?
FindViaPredicate
len
descending
predicate
thisArg
).
5.
Return
findRec
.[[Index]].
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.15
%TypedArray%.prototype.forEach (
callbackfn
[ ,
thisArg
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.forEach
as defined in
23.1.3.15
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
5.
Let
be 0.
6.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be !
Get
Pk
).
c.
Perform ?
Call
callbackfn
thisArg
, «
kValue
),
»).
d.
Set
to
+ 1.
7.
Return
undefined
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.16
%TypedArray%.prototype.includes (
searchElement
[ ,
fromIndex
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.includes
as defined in
23.1.3.16
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
len
= 0, return
false
5.
Let
be ?
ToIntegerOrInfinity
fromIndex
).
6.
Assert
: If
fromIndex
is
undefined
, then
is 0.
7.
If
= +∞, return
false
8.
Else if
= -∞, set
to 0.
9.
If
≥ 0, then
a.
Let
be
10.
Else,
a.
Let
be
len
b.
If
< 0, set
to 0.
11.
Repeat, while
len
a.
Let
elementK
be !
Get
, !
ToString
))).
b.
If
SameValueZero
searchElement
elementK
) is
true
, return
true
c.
Set
to
+ 1.
12.
Return
false
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.17
%TypedArray%.prototype.indexOf (
searchElement
[ ,
fromIndex
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.indexOf
as defined in
23.1.3.17
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
len
= 0, return
-1
5.
Let
be ?
ToIntegerOrInfinity
fromIndex
).
6.
Assert
: If
fromIndex
is
undefined
, then
is 0.
7.
If
= +∞, return
-1
8.
Else if
= -∞, set
to 0.
9.
If
≥ 0, then
a.
Let
be
10.
Else,
a.
Let
be
len
b.
If
< 0, set
to 0.
11.
Repeat, while
len
a.
Let
kPresent
be !
HasProperty
, !
ToString
))).
b.
If
kPresent
is
true
, then
i.
Let
elementK
be !
Get
, !
ToString
))).
ii.
If
IsStrictlyEqual
searchElement
elementK
) is
true
, return
).
c.
Set
to
+ 1.
12.
Return
-1
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.18
%TypedArray%.prototype.join (
separator
The interpretation and use of the arguments of this method are the same as for
Array.prototype.join
as defined in
23.1.3.18
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
separator
is
undefined
, let
sep
be
","
5.
Else, let
sep
be ?
ToString
separator
).
6.
Let
be the empty String.
7.
Let
be 0.
8.
Repeat, while
len
a.
If
> 0, set
to the
string-concatenation
of
and
sep
b.
Let
element
be !
Get
, !
ToString
))).
c.
If
element
is
undefined
, let
next
be the empty String; otherwise, let
next
be !
ToString
element
).
d.
Set
to the
string-concatenation
of
and
next
e.
Set
to
+ 1.
9.
Return
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.19
%TypedArray%.prototype.keys ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Return
CreateArrayIterator
key
).
23.2.3.20
%TypedArray%.prototype.lastIndexOf (
searchElement
[ ,
fromIndex
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.lastIndexOf
as defined in
23.1.3.20
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
len
= 0, return
-1
5.
If
fromIndex
is present, let
be ?
ToIntegerOrInfinity
fromIndex
); else let
be
len
- 1.
6.
If
= -∞, return
-1
7.
If
≥ 0, then
a.
Let
be
min
len
- 1).
8.
Else,
a.
Let
be
len
9.
Repeat, while
≥ 0,
a.
Let
kPresent
be !
HasProperty
, !
ToString
))).
b.
If
kPresent
is
true
, then
i.
Let
elementK
be !
Get
, !
ToString
))).
ii.
If
IsStrictlyEqual
searchElement
elementK
) is
true
, return
).
c.
Set
to
- 1.
10.
Return
-1
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.21
get %TypedArray%.prototype.length
%TypedArray%
.prototype.length
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[TypedArrayName]]).
3.
Assert
has [[ViewedArrayBuffer]] and [[ArrayLength]] internal slots.
4.
Let
buffer
be
.[[ViewedArrayBuffer]].
5.
If
IsDetachedBuffer
buffer
) is
true
, return
+0
6.
Let
length
be
.[[ArrayLength]].
7.
Return
length
).
This function is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.22
%TypedArray%.prototype.map (
callbackfn
[ ,
thisArg
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.map
as defined in
23.1.3.21
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
5.
Let
be ?
TypedArraySpeciesCreate
, «
len
) »).
6.
Let
be 0.
7.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be !
Get
Pk
).
c.
Let
mappedValue
be ?
Call
callbackfn
thisArg
, «
kValue
),
»).
d.
Perform ?
Set
Pk
mappedValue
true
).
e.
Set
to
+ 1.
8.
Return
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.23
%TypedArray%.prototype.reduce (
callbackfn
[ ,
initialValue
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.reduce
as defined in
23.1.3.24
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
5.
If
len
= 0 and
initialValue
is not present, throw a
TypeError
exception.
6.
Let
be 0.
7.
Let
accumulator
be
undefined
8.
If
initialValue
is present, then
a.
Set
accumulator
to
initialValue
9.
Else,
a.
Let
Pk
be !
ToString
)).
b.
Set
accumulator
to !
Get
Pk
).
c.
Set
to
+ 1.
10.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be !
Get
Pk
).
c.
Set
accumulator
to ?
Call
callbackfn
undefined
, «
accumulator
kValue
),
»).
d.
Set
to
+ 1.
11.
Return
accumulator
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.24
%TypedArray%.prototype.reduceRight (
callbackfn
[ ,
initialValue
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.reduceRight
as defined in
23.1.3.25
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
5.
If
len
= 0 and
initialValue
is not present, throw a
TypeError
exception.
6.
Let
be
len
- 1.
7.
Let
accumulator
be
undefined
8.
If
initialValue
is present, then
a.
Set
accumulator
to
initialValue
9.
Else,
a.
Let
Pk
be !
ToString
)).
b.
Set
accumulator
to !
Get
Pk
).
c.
Set
to
- 1.
10.
Repeat, while
≥ 0,
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be !
Get
Pk
).
c.
Set
accumulator
to ?
Call
callbackfn
undefined
, «
accumulator
kValue
),
»).
d.
Set
to
- 1.
11.
Return
accumulator
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.25
%TypedArray%.prototype.reverse ( )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.reverse
as defined in
23.1.3.26
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
Let
middle
be
floor
len
/ 2).
5.
Let
lower
be 0.
6.
Repeat, while
lower
middle
a.
Let
upper
be
len
lower
- 1.
b.
Let
upperP
be !
ToString
upper
)).
c.
Let
lowerP
be !
ToString
lower
)).
d.
Let
lowerValue
be !
Get
lowerP
).
e.
Let
upperValue
be !
Get
upperP
).
f.
Perform !
Set
lowerP
upperValue
true
).
g.
Perform !
Set
upperP
lowerValue
true
).
h.
Set
lower
to
lower
+ 1.
7.
Return
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.26
%TypedArray%.prototype.set (
source
[ ,
offset
] )
This method sets multiple values in this
TypedArray
, reading the values from
source
. The details differ based upon the type of
source
. The optional
offset
value indicates the first element index in this
TypedArray
where values are written. If omitted, it is assumed to be 0.
It performs the following steps when called:
1.
Let
target
be the
this
value.
2.
Perform ?
RequireInternalSlot
target
, [[TypedArrayName]]).
3.
Assert
target
has a [[ViewedArrayBuffer]] internal slot.
4.
Let
targetOffset
be ?
ToIntegerOrInfinity
offset
).
5.
If
targetOffset
< 0, throw a
RangeError
exception.
6.
If
source
is an Object
that has a [[TypedArrayName]] internal slot, then
a.
Perform ?
SetTypedArrayFromTypedArray
target
targetOffset
source
).
7.
Else,
a.
Perform ?
SetTypedArrayFromArrayLike
target
targetOffset
source
).
8.
Return
undefined
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.26.1
SetTypedArrayFromTypedArray (
target
targetOffset
source
The abstract operation SetTypedArrayFromTypedArray takes arguments
target
(a TypedArray),
targetOffset
(a non-negative
integer
or +∞), and
source
(a TypedArray) and returns either a
normal completion containing
unused
or a
throw completion
. It sets multiple values in
target
, starting at index
targetOffset
, reading the values from
source
. It performs the following steps when called:
1.
Let
targetBuffer
be
target
.[[ViewedArrayBuffer]].
2.
If
IsDetachedBuffer
targetBuffer
) is
true
, throw a
TypeError
exception.
3.
Let
targetLength
be
target
.[[ArrayLength]].
4.
Let
srcBuffer
be
source
.[[ViewedArrayBuffer]].
5.
If
IsDetachedBuffer
srcBuffer
) is
true
, throw a
TypeError
exception.
6.
Let
targetType
be
TypedArrayElementType
target
).
7.
Let
targetElementSize
be
TypedArrayElementSize
target
).
8.
Let
targetByteOffset
be
target
.[[ByteOffset]].
9.
Let
srcType
be
TypedArrayElementType
source
).
10.
Let
srcElementSize
be
TypedArrayElementSize
source
).
11.
Let
srcLength
be
source
.[[ArrayLength]].
12.
Let
srcByteOffset
be
source
.[[ByteOffset]].
13.
If
targetOffset
= +∞, throw a
RangeError
exception.
14.
If
srcLength
targetOffset
targetLength
, throw a
RangeError
exception.
15.
If
target
.[[ContentType]] is not
source
.[[ContentType]], throw a
TypeError
exception.
16.
If
IsSharedArrayBuffer
srcBuffer
) is
true
IsSharedArrayBuffer
targetBuffer
) is
true
, and
srcBuffer
.[[ArrayBufferData]] is
targetBuffer
.[[ArrayBufferData]], let
sameSharedArrayBuffer
be
true
; otherwise, let
sameSharedArrayBuffer
be
false
17.
If
SameValue
srcBuffer
targetBuffer
) is
true
or
sameSharedArrayBuffer
is
true
, then
a.
Let
srcByteLength
be
source
.[[ByteLength]].
b.
Set
srcBuffer
to ?
CloneArrayBuffer
srcBuffer
srcByteOffset
srcByteLength
).
c.
Let
srcByteIndex
be 0.
18.
Else, let
srcByteIndex
be
srcByteOffset
19.
Let
targetByteIndex
be
targetOffset
targetElementSize
targetByteOffset
20.
Let
limit
be
targetByteIndex
targetElementSize
srcLength
21.
If
srcType
is
targetType
, then
a.
NOTE: The transfer must be performed in a manner that preserves the bit-level encoding of the source data.
b.
Repeat, while
targetByteIndex
limit
i.
Let
value
be
GetValueFromBuffer
srcBuffer
srcByteIndex
Uint8
true
Unordered
).
ii.
Perform
SetValueInBuffer
targetBuffer
targetByteIndex
Uint8
value
true
Unordered
).
iii.
Set
srcByteIndex
to
srcByteIndex
+ 1.
iv.
Set
targetByteIndex
to
targetByteIndex
+ 1.
22.
Else,
a.
Repeat, while
targetByteIndex
limit
i.
Let
value
be
GetValueFromBuffer
srcBuffer
srcByteIndex
srcType
true
Unordered
).
ii.
Perform
SetValueInBuffer
targetBuffer
targetByteIndex
targetType
value
true
Unordered
).
iii.
Set
srcByteIndex
to
srcByteIndex
srcElementSize
iv.
Set
targetByteIndex
to
targetByteIndex
targetElementSize
23.
Return
unused
23.2.3.26.2
SetTypedArrayFromArrayLike (
target
targetOffset
source
The abstract operation SetTypedArrayFromArrayLike takes arguments
target
(a TypedArray),
targetOffset
(a non-negative
integer
or +∞), and
source
(an
ECMAScript language value
, but not a TypedArray) and returns either a
normal completion containing
unused
or a
throw completion
. It sets multiple values in
target
, starting at index
targetOffset
, reading the values from
source
. It performs the following steps when called:
1.
Let
targetBuffer
be
target
.[[ViewedArrayBuffer]].
2.
If
IsDetachedBuffer
targetBuffer
) is
true
, throw a
TypeError
exception.
3.
Let
targetLength
be
target
.[[ArrayLength]].
4.
Let
src
be ?
ToObject
source
).
5.
Let
srcLength
be ?
LengthOfArrayLike
src
).
6.
If
targetOffset
= +∞, throw a
RangeError
exception.
7.
If
srcLength
targetOffset
targetLength
, throw a
RangeError
exception.
8.
Let
be 0.
9.
Repeat, while
srcLength
a.
Let
Pk
be !
ToString
)).
b.
Let
value
be ?
Get
src
Pk
).
c.
Let
targetIndex
be
targetOffset
).
d.
Perform ?
IntegerIndexedElementSet
target
targetIndex
value
).
e.
Set
to
+ 1.
10.
Return
unused
23.2.3.27
%TypedArray%.prototype.slice (
start
end
The interpretation and use of the arguments of this method are the same as for
Array.prototype.slice
as defined in
23.1.3.28
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
Let
relativeStart
be ?
ToIntegerOrInfinity
start
).
5.
If
relativeStart
= -∞, let
be 0.
6.
Else if
relativeStart
< 0, let
be
max
len
relativeStart
, 0).
7.
Else, let
be
min
relativeStart
len
).
8.
If
end
is
undefined
, let
relativeEnd
be
len
; else let
relativeEnd
be ?
ToIntegerOrInfinity
end
).
9.
If
relativeEnd
= -∞, let
final
be 0.
10.
Else if
relativeEnd
< 0, let
final
be
max
len
relativeEnd
, 0).
11.
Else, let
final
be
min
relativeEnd
len
).
12.
Let
count
be
max
final
, 0).
13.
Let
be ?
TypedArraySpeciesCreate
, «
count
) »).
14.
If
count
> 0, then
a.
If
IsDetachedBuffer
.[[ViewedArrayBuffer]]) is
true
, throw a
TypeError
exception.
b.
Let
srcType
be
TypedArrayElementType
).
c.
Let
targetType
be
TypedArrayElementType
).
d.
If
srcType
is
targetType
, then
i.
NOTE: The transfer must be performed in a manner that preserves the bit-level encoding of the source data.
ii.
Let
srcBuffer
be
.[[ViewedArrayBuffer]].
iii.
Let
targetBuffer
be
.[[ViewedArrayBuffer]].
iv.
Let
elementSize
be
TypedArrayElementSize
).
v.
Let
srcByteOffset
be
.[[ByteOffset]].
vi.
Let
srcByteIndex
be (
elementSize
) +
srcByteOffset
vii.
Let
targetByteIndex
be
.[[ByteOffset]].
viii.
Let
limit
be
targetByteIndex
count
elementSize
ix.
Repeat, while
targetByteIndex
limit
1.
Let
value
be
GetValueFromBuffer
srcBuffer
srcByteIndex
Uint8
true
Unordered
).
2.
Perform
SetValueInBuffer
targetBuffer
targetByteIndex
Uint8
value
true
Unordered
).
3.
Set
srcByteIndex
to
srcByteIndex
+ 1.
4.
Set
targetByteIndex
to
targetByteIndex
+ 1.
e.
Else,
i.
Let
be 0.
ii.
Repeat, while
final
1.
Let
Pk
be !
ToString
)).
2.
Let
kValue
be !
Get
Pk
).
3.
Perform !
Set
, !
ToString
)),
kValue
true
).
4.
Set
to
+ 1.
5.
Set
to
+ 1.
15.
Return
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.28
%TypedArray%.prototype.some (
callbackfn
[ ,
thisArg
] )
The interpretation and use of the arguments of this method are the same as for
Array.prototype.some
as defined in
23.1.3.29
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
5.
Let
be 0.
6.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be !
Get
Pk
).
c.
Let
testResult
be
ToBoolean
(?
Call
callbackfn
thisArg
, «
kValue
),
»)).
d.
If
testResult
is
true
, return
true
e.
Set
to
+ 1.
7.
Return
false
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.29
%TypedArray%.prototype.sort (
comparefn
This is a distinct method that, except as described below, implements the same requirements as those of
Array.prototype.sort
as defined in
23.1.3.30
. The implementation of this method may be optimized with the knowledge that the
this
value is an object that has a fixed length and whose
integer-indexed
properties are not sparse.
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
It performs the following steps when called:
1.
If
comparefn
is not
undefined
and
IsCallable
comparefn
) is
false
, throw a
TypeError
exception.
2.
Let
obj
be the
this
value.
3.
Perform ?
ValidateTypedArray
obj
).
4.
Let
len
be
obj
.[[ArrayLength]].
5.
NOTE: The following closure performs a numeric comparison rather than the string comparison used in
23.1.3.30
6.
Let
SortCompare
be a new
Abstract Closure
with parameters (
) that captures
comparefn
and performs the following steps when called:
a.
Return ?
CompareTypedArrayElements
comparefn
).
7.
Let
sortedList
be ?
SortIndexedProperties
obj
len
SortCompare
read-through-holes
).
8.
Let
be 0.
9.
Repeat, while
len
a.
Perform !
Set
obj
, !
ToString
)),
sortedList
],
true
).
b.
Set
to
+ 1.
10.
Return
obj
Note
Because
NaN
always compares greater than any other value (see
CompareTypedArrayElements
),
NaN
property values always sort to the end of the result when
comparefn
is not provided.
23.2.3.30
%TypedArray%.prototype.subarray (
begin
end
This method returns a new
TypedArray
whose element type is the element type of this
TypedArray
and whose ArrayBuffer is the ArrayBuffer of this
TypedArray
, referencing the elements in the
interval
from
begin
(inclusive) to
end
(exclusive). If either
begin
or
end
is negative, it refers to an index from the end of the array, as opposed to from the beginning.
It performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[TypedArrayName]]).
3.
Assert
has a [[ViewedArrayBuffer]] internal slot.
4.
Let
buffer
be
.[[ViewedArrayBuffer]].
5.
Let
srcLength
be
.[[ArrayLength]].
6.
Let
relativeBegin
be ?
ToIntegerOrInfinity
begin
).
7.
If
relativeBegin
= -∞, let
beginIndex
be 0.
8.
Else if
relativeBegin
< 0, let
beginIndex
be
max
srcLength
relativeBegin
, 0).
9.
Else, let
beginIndex
be
min
relativeBegin
srcLength
).
10.
If
end
is
undefined
, let
relativeEnd
be
srcLength
; else let
relativeEnd
be ?
ToIntegerOrInfinity
end
).
11.
If
relativeEnd
= -∞, let
endIndex
be 0.
12.
Else if
relativeEnd
< 0, let
endIndex
be
max
srcLength
relativeEnd
, 0).
13.
Else, let
endIndex
be
min
relativeEnd
srcLength
).
14.
Let
newLength
be
max
endIndex
beginIndex
, 0).
15.
Let
elementSize
be
TypedArrayElementSize
).
16.
Let
srcByteOffset
be
.[[ByteOffset]].
17.
Let
beginByteOffset
be
srcByteOffset
beginIndex
elementSize
18.
Let
argumentsList
be «
buffer
beginByteOffset
),
newLength
) ».
19.
Return ?
TypedArraySpeciesCreate
argumentsList
).
This method is not generic. The
this
value must be an object with a [[TypedArrayName]] internal slot.
23.2.3.31
%TypedArray%.prototype.toLocaleString ( [
reserved1
[ ,
reserved2
] ] )
This is a distinct method that implements the same algorithm as
Array.prototype.toLocaleString
as defined in
23.1.3.32
except that the
this
value's [[ArrayLength]] internal slot is accessed in place of performing a [[Get]] of
"length"
. The implementation of the algorithm may be optimized with the knowledge that the
this
value is an object that has a fixed length and whose
integer-indexed
properties are not sparse. However, such optimization must not
introduce any observable changes in the specified behaviour of the
algorithm.
This method is not generic.
ValidateTypedArray
is applied to the
this
value prior to evaluating the algorithm. If its result is an
abrupt completion
that exception is thrown instead of evaluating the algorithm.
Note
If the ECMAScript implementation includes the ECMA-402 Internationalization API this method is based upon the algorithm for
Array.prototype.toLocaleString
that is in the ECMA-402 specification.
23.2.3.32
%TypedArray%.prototype.toReversed ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
length
be
.[[ArrayLength]].
4.
Let
be ?
TypedArrayCreateSameType
, «
length
) »).
5.
Let
be 0.
6.
Repeat, while
length
a.
Let
from
be !
ToString
length
- 1)).
b.
Let
Pk
be !
ToString
)).
c.
Let
fromValue
be !
Get
from
).
d.
Perform !
Set
Pk
fromValue
true
).
e.
Set
to
+ 1.
7.
Return
23.2.3.33
%TypedArray%.prototype.toSorted (
comparefn
This method performs the following steps when called:
1.
If
comparefn
is not
undefined
and
IsCallable
comparefn
) is
false
, throw a
TypeError
exception.
2.
Let
be the
this
value.
3.
Perform ?
ValidateTypedArray
).
4.
Let
len
be
.[[ArrayLength]].
5.
Let
be ?
TypedArrayCreateSameType
, «
len
) »).
6.
NOTE: The following closure performs a numeric comparison rather than the string comparison used in
23.1.3.34
7.
Let
SortCompare
be a new
Abstract Closure
with parameters (
) that captures
comparefn
and performs the following steps when called:
a.
Return ?
CompareTypedArrayElements
comparefn
).
8.
Let
sortedList
be ?
SortIndexedProperties
len
SortCompare
read-through-holes
).
9.
Let
be 0.
10.
Repeat, while
len
a.
Perform !
Set
, !
ToString
)),
sortedList
],
true
).
b.
Set
to
+ 1.
11.
Return
23.2.3.34
%TypedArray%.prototype.toString ( )
The initial value of the
"toString"
property is %Array.prototype.toString%, defined in
23.1.3.36
23.2.3.35
%TypedArray%.prototype.values ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Return
CreateArrayIterator
value
).
23.2.3.36
%TypedArray%.prototype.with (
index
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
ValidateTypedArray
).
3.
Let
len
be
.[[ArrayLength]].
4.
Let
relativeIndex
be ?
ToIntegerOrInfinity
index
).
5.
If
relativeIndex
≥ 0, let
actualIndex
be
relativeIndex
6.
Else, let
actualIndex
be
len
relativeIndex
7.
If
.[[ContentType]] is
BigInt
, let
numericValue
be ?
ToBigInt
value
).
8.
Else, let
numericValue
be ?
ToNumber
value
).
9.
If
IsValidIntegerIndex
actualIndex
)) is
false
, throw a
RangeError
exception.
10.
Let
be ?
TypedArrayCreateSameType
, «
len
) »).
11.
Let
be 0.
12.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
If
is
actualIndex
, let
fromValue
be
numericValue
c.
Else, let
fromValue
be !
Get
Pk
).
d.
Perform !
Set
Pk
fromValue
true
).
e.
Set
to
+ 1.
13.
Return
23.2.3.37
%TypedArray%.prototype [ @@iterator ] ( )
The initial value of the
@@iterator
property is %TypedArray.prototype.values%, defined in
23.2.3.35
23.2.3.38
get %TypedArray%.prototype [ @@toStringTag ]
%TypedArray%
.prototype[@@toStringTag]
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
If
is not an Object
, return
undefined
3.
If
does not have a [[TypedArrayName]] internal slot, return
undefined
4.
Let
name
be
.[[TypedArrayName]].
5.
Assert
name
is a String
6.
Return
name
This property has the attributes { [[Enumerable]]:
false
, [[Configurable]]:
true
}.
The initial value of the
"name"
property of this function is
"get [Symbol.toStringTag]"
23.2.4
Abstract Operations for TypedArray Objects
23.2.4.1
TypedArraySpeciesCreate (
exemplar
argumentList
The abstract operation TypedArraySpeciesCreate takes arguments
exemplar
(a TypedArray) and
argumentList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
a TypedArray or a
throw completion
. It is used to specify the creation of a new TypedArray using a
constructor
function that is derived from
exemplar
. Unlike
ArraySpeciesCreate
, which can create non-Array objects through the use of
@@species
, this operation enforces that the
constructor
function creates an actual TypedArray. It performs the following steps when called:
1.
Let
defaultConstructor
be the intrinsic object associated with the
constructor
name
exemplar
.[[TypedArrayName]] in
Table 68
2.
Let
constructor
be ?
SpeciesConstructor
exemplar
defaultConstructor
).
3.
Let
result
be ?
TypedArrayCreate
constructor
argumentList
).
4.
Assert
result
has [[TypedArrayName]] and [[ContentType]] internal slots.
5.
If
result
.[[ContentType]] is not
exemplar
.[[ContentType]], throw a
TypeError
exception.
6.
Return
result
23.2.4.2
TypedArrayCreate (
constructor
argumentList
The abstract operation TypedArrayCreate takes arguments
constructor
(a
constructor
) and
argumentList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
a TypedArray or a
throw completion
. It is used to specify the creation of a new TypedArray using a
constructor
function. It performs the following steps when called:
1.
Let
newTypedArray
be ?
Construct
constructor
argumentList
).
2.
Perform ?
ValidateTypedArray
newTypedArray
).
3.
If the number of elements in
argumentList
is 1 and
argumentList
[0]
is a Number
, then
a.
If
newTypedArray
.[[ArrayLength]] <
argumentList
[0]), throw a
TypeError
exception.
4.
Return
newTypedArray
23.2.4.3
TypedArrayCreateSameType (
exemplar
argumentList
The abstract operation TypedArrayCreateSameType takes arguments
exemplar
(a TypedArray) and
argumentList
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
a TypedArray or a
throw completion
. It is used to specify the creation of a new TypedArray using a
constructor
function that is derived from
exemplar
. Unlike
TypedArraySpeciesCreate
, which can construct custom TypedArray subclasses through the use of
@@species
, this operation always uses one of the built-in TypedArray
constructors
. It performs the following steps when called:
1.
Let
constructor
be the intrinsic object associated with the
constructor
name
exemplar
.[[TypedArrayName]] in
Table 68
2.
Let
result
be ?
TypedArrayCreate
constructor
argumentList
).
3.
Assert
result
has [[TypedArrayName]] and [[ContentType]] internal slots.
4.
Assert
result
.[[ContentType]] is
exemplar
.[[ContentType]].
5.
Return
result
23.2.4.4
ValidateTypedArray (
The abstract operation ValidateTypedArray takes argument
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Perform ?
RequireInternalSlot
, [[TypedArrayName]]).
2.
Assert
has a [[ViewedArrayBuffer]] internal slot.
3.
Let
buffer
be
.[[ViewedArrayBuffer]].
4.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
5.
Return
unused
23.2.4.5
TypedArrayElementSize (
The abstract operation TypedArrayElementSize takes argument
(a TypedArray) and returns a non-negative
integer
. It performs the following steps when called:
1.
Return the Element Size value specified in
Table 68
for
.[[TypedArrayName]].
23.2.4.6
TypedArrayElementType (
The abstract operation TypedArrayElementType takes argument
(a TypedArray) and returns a
TypedArray element type
. It performs the following steps when called:
1.
Return the Element Type value specified in
Table 68
for
.[[TypedArrayName]].
23.2.4.7
CompareTypedArrayElements (
comparefn
The abstract operation CompareTypedArrayElements takes arguments
(a Number or a BigInt),
(a Number or a BigInt), and
comparefn
(a
function object
or
undefined
) and returns either a
normal completion containing
a Number or an
abrupt completion
. It performs the following steps when called:
1.
Assert
is a Number
and
is a Number
, or
is a BigInt
and
is a BigInt
2.
If
comparefn
is not
undefined
, then
a.
Let
be ?
ToNumber
(?
Call
comparefn
undefined
, «
»)).
b.
If
is
NaN
, return
+0
c.
Return
3.
If
and
are both
NaN
, return
+0
4.
If
is
NaN
, return
5.
If
is
NaN
, return
-1
6.
If
, return
-1
7.
If
, return
8.
If
is
-0
and
is
+0
, return
-1
9.
If
is
+0
and
is
-0
, return
10.
Return
+0
Note
This performs a numeric comparison rather than the string comparison used in
23.1.3.30.2
23.2.5
The
TypedArray
Constructors
Each
TypedArray
constructor
is an intrinsic object that has the structure described below, differing only in the name used as the
constructor
name instead of
TypedArray
, in
Table 68
is a function whose behaviour differs based upon the number and types of its arguments. The actual behaviour of a call of
TypedArray
depends upon the number and kind of arguments that are passed to it.
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified
TypedArray
behaviour must include a
super
call to the
TypedArray
constructor
to create and initialize the subclass instance with the internal state necessary to support the
%TypedArray%
.prototype
built-in methods.
has a
"length"
property whose value is
23.2.5.1
TypedArray
( ...
args
Each
TypedArray
constructor
performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
Let
constructorName
be the String value of the
Constructor
Name value specified in
Table 68
for this
TypedArray
constructor
3.
Let
proto
be
"%
TypedArray
.prototype%"
4.
Let
numberOfArgs
be the number of elements in
args
5.
If
numberOfArgs
= 0, then
a.
Return ?
AllocateTypedArray
constructorName
, NewTarget,
proto
, 0).
6.
Else,
a.
Let
firstArgument
be
args
[0].
b.
If
firstArgument
is an Object
, then
i.
Let
be ?
AllocateTypedArray
constructorName
, NewTarget,
proto
).
ii.
If
firstArgument
has a [[TypedArrayName]] internal slot, then
1.
Perform ?
InitializeTypedArrayFromTypedArray
firstArgument
).
iii.
Else if
firstArgument
has an [[ArrayBufferData]] internal slot, then
1.
If
numberOfArgs
> 1, let
byteOffset
be
args
[1]; else let
byteOffset
be
undefined
2.
If
numberOfArgs
> 2, let
length
be
args
[2]; else let
length
be
undefined
3.
Perform ?
InitializeTypedArrayFromArrayBuffer
firstArgument
byteOffset
length
).
iv.
Else,
1.
Assert
firstArgument
is an Object
and
firstArgument
does not have either a [[TypedArrayName]] or an [[ArrayBufferData]] internal slot.
2.
Let
usingIterator
be ?
GetMethod
firstArgument
@@iterator
).
3.
If
usingIterator
is not
undefined
, then
a.
Let
values
be ?
IteratorToList
(?
GetIteratorFromMethod
firstArgument
usingIterator
)).
b.
Perform ?
InitializeTypedArrayFromList
values
).
4.
Else,
a.
NOTE:
firstArgument
is not an Iterable so assume it is already an
array-like object
b.
Perform ?
InitializeTypedArrayFromArrayLike
firstArgument
).
v.
Return
c.
Else,
i.
Assert
firstArgument
is not an Object
ii.
Let
elementLength
be ?
ToIndex
firstArgument
).
iii.
Return ?
AllocateTypedArray
constructorName
, NewTarget,
proto
elementLength
).
23.2.5.1.1
AllocateTypedArray (
constructorName
newTarget
defaultProto
[ ,
length
] )
The abstract operation AllocateTypedArray takes arguments
constructorName
(a String which is the name of a TypedArray
constructor
in
Table 68
),
newTarget
(a
constructor
), and
defaultProto
(a String) and optional argument
length
(a non-negative
integer
) and returns either a
normal completion containing
a TypedArray or a
throw completion
. It is used to validate and create an instance of a TypedArray
constructor
. If the
length
argument is passed, an ArrayBuffer of that length is also allocated and
associated with the new TypedArray instance. AllocateTypedArray
provides common semantics that is used by
TypedArray
. It performs the following steps when called:
1.
Let
proto
be ?
GetPrototypeFromConstructor
newTarget
defaultProto
).
2.
Let
obj
be
IntegerIndexedObjectCreate
proto
).
3.
Assert
obj
.[[ViewedArrayBuffer]] is
undefined
4.
Set
obj
.[[TypedArrayName]] to
constructorName
5.
If
constructorName
is either
"BigInt64Array"
or
"BigUint64Array"
, set
obj
.[[ContentType]] to
BigInt
6.
Otherwise, set
obj
.[[ContentType]] to
Number
7.
If
length
is not present, then
a.
Set
obj
.[[ByteLength]] to 0.
b.
Set
obj
.[[ByteOffset]] to 0.
c.
Set
obj
.[[ArrayLength]] to 0.
8.
Else,
a.
Perform ?
AllocateTypedArrayBuffer
obj
length
).
9.
Return
obj
23.2.5.1.2
InitializeTypedArrayFromTypedArray (
srcArray
The abstract operation InitializeTypedArrayFromTypedArray takes arguments
(a TypedArray) and
srcArray
(a TypedArray) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
srcData
be
srcArray
.[[ViewedArrayBuffer]].
2.
If
IsDetachedBuffer
srcData
) is
true
, throw a
TypeError
exception.
3.
Let
elementType
be
TypedArrayElementType
).
4.
Let
elementSize
be
TypedArrayElementSize
).
5.
Let
srcType
be
TypedArrayElementType
srcArray
).
6.
Let
srcElementSize
be
TypedArrayElementSize
srcArray
).
7.
Let
srcByteOffset
be
srcArray
.[[ByteOffset]].
8.
Let
elementLength
be
srcArray
.[[ArrayLength]].
9.
Let
byteLength
be
elementSize
elementLength
10.
If
elementType
is
srcType
, then
a.
Let
data
be ?
CloneArrayBuffer
srcData
srcByteOffset
byteLength
).
11.
Else,
a.
Let
data
be ?
AllocateArrayBuffer
%ArrayBuffer%
byteLength
).
b.
If
srcArray
.[[ContentType]] is not
.[[ContentType]], throw a
TypeError
exception.
c.
Let
srcByteIndex
be
srcByteOffset
d.
Let
targetByteIndex
be 0.
e.
Let
count
be
elementLength
f.
Repeat, while
count
> 0,
i.
Let
value
be
GetValueFromBuffer
srcData
srcByteIndex
srcType
true
Unordered
).
ii.
Perform
SetValueInBuffer
data
targetByteIndex
elementType
value
true
Unordered
).
iii.
Set
srcByteIndex
to
srcByteIndex
srcElementSize
iv.
Set
targetByteIndex
to
targetByteIndex
elementSize
v.
Set
count
to
count
- 1.
12.
Set
.[[ViewedArrayBuffer]] to
data
13.
Set
.[[ByteLength]] to
byteLength
14.
Set
.[[ByteOffset]] to 0.
15.
Set
.[[ArrayLength]] to
elementLength
16.
Return
unused
23.2.5.1.3
InitializeTypedArrayFromArrayBuffer (
buffer
byteOffset
length
The abstract operation InitializeTypedArrayFromArrayBuffer takes arguments
(a TypedArray),
buffer
(an ArrayBuffer or a SharedArrayBuffer),
byteOffset
(an
ECMAScript language value
), and
length
(an
ECMAScript language value
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
elementSize
be
TypedArrayElementSize
).
2.
Let
offset
be ?
ToIndex
byteOffset
).
3.
If
offset
modulo
elementSize
≠ 0, throw a
RangeError
exception.
4.
If
length
is not
undefined
, then
a.
Let
newLength
be ?
ToIndex
length
).
5.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
6.
Let
bufferByteLength
be
buffer
.[[ArrayBufferByteLength]].
7.
If
length
is
undefined
, then
a.
If
bufferByteLength
modulo
elementSize
≠ 0, throw a
RangeError
exception.
b.
Let
newByteLength
be
bufferByteLength
offset
c.
If
newByteLength
< 0, throw a
RangeError
exception.
8.
Else,
a.
Let
newByteLength
be
newLength
elementSize
b.
If
offset
newByteLength
bufferByteLength
, throw a
RangeError
exception.
9.
Set
.[[ViewedArrayBuffer]] to
buffer
10.
Set
.[[ByteLength]] to
newByteLength
11.
Set
.[[ByteOffset]] to
offset
12.
Set
.[[ArrayLength]] to
newByteLength
elementSize
13.
Return
unused
23.2.5.1.4
InitializeTypedArrayFromList (
values
The abstract operation InitializeTypedArrayFromList takes arguments
(a TypedArray) and
values
(a
List
of
ECMAScript language values
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
len
be the number of elements in
values
2.
Perform ?
AllocateTypedArrayBuffer
len
).
3.
Let
be 0.
4.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be the first element of
values
c.
Remove the first element from
values
d.
Perform ?
Set
Pk
kValue
true
).
e.
Set
to
+ 1.
5.
Assert
values
is now an empty
List
6.
Return
unused
23.2.5.1.5
InitializeTypedArrayFromArrayLike (
arrayLike
The abstract operation InitializeTypedArrayFromArrayLike takes arguments
(a TypedArray) and
arrayLike
(an Object, but not a TypedArray or an ArrayBuffer) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
len
be ?
LengthOfArrayLike
arrayLike
).
2.
Perform ?
AllocateTypedArrayBuffer
len
).
3.
Let
be 0.
4.
Repeat, while
len
a.
Let
Pk
be !
ToString
)).
b.
Let
kValue
be ?
Get
arrayLike
Pk
).
c.
Perform ?
Set
Pk
kValue
true
).
d.
Set
to
+ 1.
5.
Return
unused
23.2.5.1.6
AllocateTypedArrayBuffer (
length
The abstract operation AllocateTypedArrayBuffer takes arguments
(a TypedArray) and
length
(a non-negative
integer
) and returns either a
normal completion containing
unused
or a
throw completion
. It allocates and associates an ArrayBuffer with
. It performs the following steps when called:
1.
Assert
.[[ViewedArrayBuffer]] is
undefined
2.
Let
elementSize
be
TypedArrayElementSize
).
3.
Let
byteLength
be
elementSize
length
4.
Let
data
be ?
AllocateArrayBuffer
%ArrayBuffer%
byteLength
).
5.
Set
.[[ViewedArrayBuffer]] to
data
6.
Set
.[[ByteLength]] to
byteLength
7.
Set
.[[ByteOffset]] to 0.
8.
Set
.[[ArrayLength]] to
length
9.
Return
unused
23.2.6
Properties of the
TypedArray
Constructors
Each
TypedArray
constructor
has a [[Prototype]] internal slot whose value is
%TypedArray%
has a
"name"
property whose value is the String value of the
constructor
name specified for it in
Table 68
has the following properties:
23.2.6.1
TypedArray
.BYTES_PER_ELEMENT
The value of
TypedArray
.BYTES_PER_ELEMENT
is the Element Size value specified in
Table 68
for
TypedArray
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
23.2.6.2
TypedArray
.prototype
The initial value of
TypedArray
.prototype
is the corresponding
TypedArray
prototype intrinsic object (
23.2.7
).
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
23.2.7
Properties of the
TypedArray
Prototype Objects
Each
TypedArray
prototype object:
has a [[Prototype]] internal slot whose value is
%TypedArray.prototype%
is an
ordinary object
does not have a [[ViewedArrayBuffer]] or any other of the internal slots that are specific to
TypedArray
instance objects.
23.2.7.1
TypedArray
.prototype.BYTES_PER_ELEMENT
The value of
TypedArray
.prototype.BYTES_PER_ELEMENT
is the Element Size value specified in
Table 68
for
TypedArray
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
23.2.7.2
TypedArray
.prototype.constructor
The initial value of a
TypedArray
.prototype.constructor
is the corresponding
%TypedArray%
intrinsic object.
23.2.8
Properties of
TypedArray
Instances
TypedArray
instances are
Integer-Indexed exotic objects
. Each
TypedArray
instance inherits properties from the corresponding
TypedArray
prototype object. Each
TypedArray
instance has the following internal slots: [[TypedArrayName]],
[[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]], and
[[ArrayLength]].
24
Keyed Collections
24.1
Map Objects
Maps are collections of key/value pairs where both the keys and values may be arbitrary
ECMAScript language values
A distinct key value may only occur in one key/value pair within the
Map's collection. Distinct key values are discriminated using the
SameValueZero
comparison algorithm.
Maps must be implemented using either hash tables or other
mechanisms that, on average, provide access times that are sublinear on
the number of elements in the collection. The data structure used in
this specification is only intended to describe the required observable
semantics of Maps. It is not intended to be a viable implementation
model.
24.1.1
The Map Constructor
The Map
constructor
is
%Map%
is the initial value of the
"Map"
property of the
global object
creates and initializes a new Map when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value in an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified Map behaviour must include a
super
call to the Map
constructor
to create and initialize the subclass instance with the internal state necessary to support the
Map.prototype
built-in methods.
24.1.1.1
Map ( [
iterable
] )
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
Let
map
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%Map.prototype%"
, « [[MapData]] »).
3.
Set
map
.[[MapData]] to a new empty
List
4.
If
iterable
is either
undefined
or
null
, return
map
5.
Let
adder
be ?
Get
map
"set"
).
6.
If
IsCallable
adder
) is
false
, throw a
TypeError
exception.
7.
Return ?
AddEntriesFromIterable
map
iterable
adder
).
Note
If the parameter
iterable
is present, it is expected to be an object that implements an
@@iterator
method that returns an iterator object that produces a two element
array-like object
whose first element is a value that will be used as a Map key and whose second element is the value to associate with that key.
24.1.1.2
AddEntriesFromIterable (
target
iterable
adder
The abstract operation AddEntriesFromIterable takes arguments
target
(an Object),
iterable
(an
ECMAScript language value
, but not
undefined
or
null
), and
adder
(a
function object
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
adder
will be invoked, with
target
as the receiver. It performs the following steps when called:
1.
Let
iteratorRecord
be ?
GetIterator
iterable
sync
).
2.
Repeat,
a.
Let
next
be ?
IteratorStep
iteratorRecord
).
b.
If
next
is
false
, return
target
c.
Let
nextItem
be ?
IteratorValue
next
).
d.
If
nextItem
is not an Object
, then
i.
Let
error
be
ThrowCompletion
(a newly created
TypeError
object).
ii.
Return ?
IteratorClose
iteratorRecord
error
).
e.
Let
be
Completion
Get
nextItem
"0"
)).
f.
IfAbruptCloseIterator
iteratorRecord
).
g.
Let
be
Completion
Get
nextItem
"1"
)).
h.
IfAbruptCloseIterator
iteratorRecord
).
i.
Let
status
be
Completion
Call
adder
target
, «
»)).
j.
IfAbruptCloseIterator
status
iteratorRecord
).
Note
The parameter
iterable
is expected to be an object that implements an
@@iterator
method that returns an iterator object that produces a two element
array-like object
whose first element is a value that will be used as a Map key and whose second element is the value to associate with that key.
24.1.2
Properties of the Map Constructor
The Map
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
24.1.2.1
Map.prototype
The initial value of
Map.prototype
is the
Map prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
24.1.2.2
get Map [ @@species ]
Map[@@species]
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Return the
this
value.
The value of the
"name"
property of this function is
"get [Symbol.species]"
Note
Methods that create derived collection objects should call
@@species
to determine the
constructor
to use to create the derived objects. Subclass
constructor
may over-ride
@@species
to change the default
constructor
assignment.
24.1.3
Properties of the Map Prototype Object
The
Map prototype object
is
%Map.prototype%
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
does not have a [[MapData]] internal slot.
24.1.3.1
Map.prototype.clear ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[MapData]]).
3.
For each
Record
{ [[Key]], [[Value]] }
of
.[[MapData]], do
a.
Set
.[[Key]] to
empty
b.
Set
.[[Value]] to
empty
4.
Return
undefined
Note
The existing [[MapData]]
List
is preserved because there may be existing Map Iterator objects that are suspended midway through iterating over that
List
24.1.3.2
Map.prototype.constructor
The initial value of
Map.prototype.constructor
is
%Map%
24.1.3.3
Map.prototype.delete (
key
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[MapData]]).
3.
For each
Record
{ [[Key]], [[Value]] }
of
.[[MapData]], do
a.
If
.[[Key]] is not
empty
and
SameValueZero
.[[Key]],
key
) is
true
, then
i.
Set
.[[Key]] to
empty
ii.
Set
.[[Value]] to
empty
iii.
Return
true
4.
Return
false
Note
The value
empty
is used as a
specification device to indicate that an entry has been deleted. Actual
implementations may take other actions such as physically removing the
entry from internal data structures.
24.1.3.4
Map.prototype.entries ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateMapIterator
key+value
).
24.1.3.5
Map.prototype.forEach (
callbackfn
[ ,
thisArg
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[MapData]]).
3.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
4.
Let
entries
be
.[[MapData]].
5.
Let
numEntries
be the number of elements in
entries
6.
Let
index
be 0.
7.
Repeat, while
index
numEntries
a.
Let
be
entries
index
].
b.
Set
index
to
index
+ 1.
c.
If
.[[Key]] is not
empty
, then
i.
Perform ?
Call
callbackfn
thisArg
, «
.[[Value]],
.[[Key]],
»).
ii.
NOTE: The number of elements in
entries
may have increased during execution of
callbackfn
iii.
Set
numEntries
to the number of elements in
entries
8.
Return
undefined
Note
callbackfn
should be a function that accepts three arguments.
forEach
calls
callbackfn
once for each key/value pair present in the Map, in key insertion order.
callbackfn
is called only for keys of the Map which actually exist; it is not called for keys that have been deleted from the Map.
If a
thisArg
parameter is provided, it will be used as the
this
value for each invocation of
callbackfn
. If it is not provided,
undefined
is used instead.
callbackfn
is called with three arguments: the value of the item, the key of the item, and the Map being traversed.
forEach
does not directly mutate the object on which it is called but the object may be mutated by the calls to
callbackfn
. Each entry of a map's [[MapData]] is only visited once. New keys added after the call to
forEach
begins are visited. A key will be revisited if it is deleted after it has been visited and then re-added before the
forEach
call completes. Keys that are deleted after the call to
forEach
begins and before being visited are not visited unless the key is added again before the
forEach
call completes.
24.1.3.6
Map.prototype.get (
key
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[MapData]]).
3.
For each
Record
{ [[Key]], [[Value]] }
of
.[[MapData]], do
a.
If
.[[Key]] is not
empty
and
SameValueZero
.[[Key]],
key
) is
true
, return
.[[Value]].
4.
Return
undefined
24.1.3.7
Map.prototype.has (
key
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[MapData]]).
3.
For each
Record
{ [[Key]], [[Value]] }
of
.[[MapData]], do
a.
If
.[[Key]] is not
empty
and
SameValueZero
.[[Key]],
key
) is
true
, return
true
4.
Return
false
24.1.3.8
Map.prototype.keys ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateMapIterator
key
).
24.1.3.9
Map.prototype.set (
key
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[MapData]]).
3.
For each
Record
{ [[Key]], [[Value]] }
of
.[[MapData]], do
a.
If
.[[Key]] is not
empty
and
SameValueZero
.[[Key]],
key
) is
true
, then
i.
Set
.[[Value]] to
value
ii.
Return
4.
If
key
is
-0
, set
key
to
+0
5.
Let
be the
Record
{ [[Key]]:
key
, [[Value]]:
value
}.
6.
Append
to
.[[MapData]].
7.
Return
24.1.3.10
get Map.prototype.size
Map.prototype.size
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[MapData]]).
3.
Let
count
be 0.
4.
For each
Record
{ [[Key]], [[Value]] }
of
.[[MapData]], do
a.
If
.[[Key]] is not
empty
, set
count
to
count
+ 1.
5.
Return
count
).
24.1.3.11
Map.prototype.values ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateMapIterator
value
).
24.1.3.12
Map.prototype [ @@iterator ] ( )
The initial value of the
@@iterator
property is %Map.prototype.entries%, defined in
24.1.3.4
24.1.3.13
Map.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Map"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
24.1.4
Properties of Map Instances
Map instances are
ordinary objects
that inherit properties from the Map prototype. Map instances also have a [[MapData]] internal slot.
24.1.5
Map Iterator Objects
A Map Iterator is an object, that represents a specific iteration over some specific Map instance object. There is not a named
constructor
for Map Iterator objects. Instead, map iterator objects are created by calling certain methods of Map instance objects.
24.1.5.1
CreateMapIterator (
map
kind
The abstract operation CreateMapIterator takes arguments
map
(an
ECMAScript language value
) and
kind
key+value
key
, or
value
) and returns either a
normal completion containing
a Generator or a
throw completion
. It is used to create iterator objects for Map methods that return such iterators. It performs the following steps when called:
1.
Perform ?
RequireInternalSlot
map
, [[MapData]]).
2.
Let
closure
be a new
Abstract Closure
with no parameters that captures
map
and
kind
and performs the following steps when called:
a.
Let
entries
be
map
.[[MapData]].
b.
Let
index
be 0.
c.
Let
numEntries
be the number of elements in
entries
d.
Repeat, while
index
numEntries
i.
Let
be
entries
index
].
ii.
Set
index
to
index
+ 1.
iii.
If
.[[Key]] is not
empty
, then
1.
If
kind
is
key
, let
result
be
.[[Key]].
2.
Else if
kind
is
value
, let
result
be
.[[Value]].
3.
Else,
a.
Assert
kind
is
key+value
b.
Let
result
be
CreateArrayFromList

.[[Key]],
.[[Value]] »).
4.
Perform ?
GeneratorYield
CreateIterResultObject
result
false
)).
5.
NOTE: The number of elements in
entries
may have increased while execution of this abstract operation was paused by
Yield
6.
Set
numEntries
to the number of elements in
entries
e.
Return
undefined
3.
Return
CreateIteratorFromClosure
closure
"%MapIteratorPrototype%"
%MapIteratorPrototype%
).
24.1.5.2
The %MapIteratorPrototype% Object
The
%MapIteratorPrototype%
object:
has properties that are inherited by all Map Iterator Objects.
is an
ordinary object
has a [[Prototype]] internal slot whose value is
%IteratorPrototype%
has the following properties:
24.1.5.2.1
%MapIteratorPrototype%.next ( )
1.
Return ?
GeneratorResume
this
value,
empty
"%MapIteratorPrototype%"
).
24.1.5.2.2
%MapIteratorPrototype% [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Map Iterator"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
24.2
Set Objects
Set objects are collections of
ECMAScript language values
. A distinct value may only occur once as an element of a Set's collection. Distinct values are discriminated using the
SameValueZero
comparison algorithm.
Set objects must be implemented using either hash tables or other
mechanisms that, on average, provide access times that are sublinear on
the number of elements in the collection. The data structure used in
this specification is only intended to describe the required observable
semantics of Set objects. It is not intended to be a viable
implementation model.
24.2.1
The Set Constructor
The Set
constructor
is
%Set%
is the initial value of the
"Set"
property of the
global object
creates and initializes a new Set object when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value in an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified Set behaviour must include a
super
call to the Set
constructor
to create and initialize the subclass instance with the internal state necessary to support the
Set.prototype
built-in methods.
24.2.1.1
Set ( [
iterable
] )
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
Let
set
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%Set.prototype%"
, « [[SetData]] »).
3.
Set
set
.[[SetData]] to a new empty
List
4.
If
iterable
is either
undefined
or
null
, return
set
5.
Let
adder
be ?
Get
set
"add"
).
6.
If
IsCallable
adder
) is
false
, throw a
TypeError
exception.
7.
Let
iteratorRecord
be ?
GetIterator
iterable
sync
).
8.
Repeat,
a.
Let
next
be ?
IteratorStep
iteratorRecord
).
b.
If
next
is
false
, return
set
c.
Let
nextValue
be ?
IteratorValue
next
).
d.
Let
status
be
Completion
Call
adder
set
, «
nextValue
»)).
e.
IfAbruptCloseIterator
status
iteratorRecord
).
24.2.2
Properties of the Set Constructor
The Set
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
24.2.2.1
Set.prototype
The initial value of
Set.prototype
is the
Set prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
24.2.2.2
get Set [ @@species ]
Set[@@species]
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Return the
this
value.
The value of the
"name"
property of this function is
"get [Symbol.species]"
Note
Methods that create derived collection objects should call
@@species
to determine the
constructor
to use to create the derived objects. Subclass
constructor
may over-ride
@@species
to change the default
constructor
assignment.
24.2.3
Properties of the Set Prototype Object
The
Set prototype object
is
%Set.prototype%
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
does not have a [[SetData]] internal slot.
24.2.3.1
Set.prototype.add (
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[SetData]]).
3.
For each element
of
.[[SetData]], do
a.
If
is not
empty
and
SameValueZero
value
) is
true
, then
i.
Return
4.
If
value
is
-0
, set
value
to
+0
5.
Append
value
to
.[[SetData]].
6.
Return
24.2.3.2
Set.prototype.clear ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[SetData]]).
3.
For each element
of
.[[SetData]], do
a.
Replace the element of
.[[SetData]] whose value is
with an element whose value is
empty
4.
Return
undefined
Note
The existing [[SetData]]
List
is preserved because there may be existing Set Iterator objects that are suspended midway through iterating over that
List
24.2.3.3
Set.prototype.constructor
The initial value of
Set.prototype.constructor
is
%Set%
24.2.3.4
Set.prototype.delete (
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[SetData]]).
3.
For each element
of
.[[SetData]], do
a.
If
is not
empty
and
SameValueZero
value
) is
true
, then
i.
Replace the element of
.[[SetData]] whose value is
with an element whose value is
empty
ii.
Return
true
4.
Return
false
Note
The value
empty
is used as a
specification device to indicate that an entry has been deleted. Actual
implementations may take other actions such as physically removing the
entry from internal data structures.
24.2.3.5
Set.prototype.entries ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateSetIterator
key+value
).
Note
For iteration purposes, a Set appears similar to a Map where each entry has the same value for its key and value.
24.2.3.6
Set.prototype.forEach (
callbackfn
[ ,
thisArg
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[SetData]]).
3.
If
IsCallable
callbackfn
) is
false
, throw a
TypeError
exception.
4.
Let
entries
be
.[[SetData]].
5.
Let
numEntries
be the number of elements in
entries
6.
Let
index
be 0.
7.
Repeat, while
index
numEntries
a.
Let
be
entries
index
].
b.
Set
index
to
index
+ 1.
c.
If
is not
empty
, then
i.
Perform ?
Call
callbackfn
thisArg
, «
»).
ii.
NOTE: The number of elements in
entries
may have increased during execution of
callbackfn
iii.
Set
numEntries
to the number of elements in
entries
8.
Return
undefined
Note
callbackfn
should be a function that accepts three arguments.
forEach
calls
callbackfn
once for each value present in the Set object, in value insertion order.
callbackfn
is called only for values of the Set which actually exist; it is not called for keys that have been deleted from the set.
If a
thisArg
parameter is provided, it will be used as the
this
value for each invocation of
callbackfn
. If it is not provided,
undefined
is used instead.
callbackfn
is called with three arguments: the
first two arguments are a value contained in the Set. The same value is
passed for both arguments. The Set object being traversed is passed as
the third argument.
The
callbackfn
is called with three arguments to be consistent with the call back functions used by
forEach
methods for Map and Array. For Sets, each item value is considered to be both the key and the value.
forEach
does not directly mutate the object on which it is called but the object may be mutated by the calls to
callbackfn
Each value is normally visited only once. However, a value
will be revisited if it is deleted after it has been visited and then
re-added before the
forEach
call completes. Values that are deleted after the call to
forEach
begins and before being visited are not visited unless the value is added again before the
forEach
call completes. New values added after the call to
forEach
begins are visited.
24.2.3.7
Set.prototype.has (
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[SetData]]).
3.
For each element
of
.[[SetData]], do
a.
If
is not
empty
and
SameValueZero
value
) is
true
, return
true
4.
Return
false
24.2.3.8
Set.prototype.keys ( )
The initial value of the
"keys"
property is %Set.prototype.values%, defined in
24.2.3.10
Note
For iteration purposes, a Set appears similar to a Map where each entry has the same value for its key and value.
24.2.3.9
get Set.prototype.size
Set.prototype.size
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[SetData]]).
3.
Let
count
be 0.
4.
For each element
of
.[[SetData]], do
a.
If
is not
empty
, set
count
to
count
+ 1.
5.
Return
count
).
24.2.3.10
Set.prototype.values ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateSetIterator
value
).
24.2.3.11
Set.prototype [ @@iterator ] ( )
The initial value of the
@@iterator
property is %Set.prototype.values%, defined in
24.2.3.10
24.2.3.12
Set.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Set"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
24.2.4
Properties of Set Instances
Set instances are
ordinary objects
that inherit properties from the Set prototype. Set instances also have a [[SetData]] internal slot.
24.2.5
Set Iterator Objects
A Set Iterator is an
ordinary object
with the structure defined below, that represents a specific iteration
over some specific Set instance object. There is not a named
constructor
for Set Iterator objects. Instead, set iterator objects are created by calling certain methods of Set instance objects.
24.2.5.1
CreateSetIterator (
set
kind
The abstract operation CreateSetIterator takes arguments
set
(an
ECMAScript language value
) and
kind
key+value
or
value
) and returns either a
normal completion containing
a Generator or a
throw completion
. It is used to create iterator objects for Set methods that return such iterators. It performs the following steps when called:
1.
Perform ?
RequireInternalSlot
set
, [[SetData]]).
2.
Let
closure
be a new
Abstract Closure
with no parameters that captures
set
and
kind
and performs the following steps when called:
a.
Let
index
be 0.
b.
Let
entries
be
set
.[[SetData]].
c.
Let
numEntries
be the number of elements in
entries
d.
Repeat, while
index
numEntries
i.
Let
be
entries
index
].
ii.
Set
index
to
index
+ 1.
iii.
If
is not
empty
, then
1.
If
kind
is
key+value
, then
a.
Let
result
be
CreateArrayFromList

»).
b.
Perform ?
GeneratorYield
CreateIterResultObject
result
false
)).
2.
Else,
a.
Assert
kind
is
value
b.
Perform ?
GeneratorYield
CreateIterResultObject
false
)).
3.
NOTE: The number of elements in
entries
may have increased while execution of this abstract operation was paused by
Yield
4.
Set
numEntries
to the number of elements in
entries
e.
Return
undefined
3.
Return
CreateIteratorFromClosure
closure
"%SetIteratorPrototype%"
%SetIteratorPrototype%
).
24.2.5.2
The %SetIteratorPrototype% Object
The
%SetIteratorPrototype%
object:
has properties that are inherited by all Set Iterator Objects.
is an
ordinary object
has a [[Prototype]] internal slot whose value is
%IteratorPrototype%
has the following properties:
24.2.5.2.1
%SetIteratorPrototype%.next ( )
1.
Return ?
GeneratorResume
this
value,
empty
"%SetIteratorPrototype%"
).
24.2.5.2.2
%SetIteratorPrototype% [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Set Iterator"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
24.3
WeakMap Objects
WeakMaps are collections of key/value pairs where the keys are objects and/or symbols and values may be arbitrary
ECMAScript language values
A WeakMap may be queried to see if it contains a key/value pair with a
specific key, but no mechanism is provided for enumerating the values it
holds as keys. In certain conditions, values which are not
live
are removed as WeakMap keys, as described in
9.10.3
An implementation may impose an arbitrarily determined latency
between the time a key/value pair of a WeakMap becomes inaccessible and
the time when the key/value pair is removed from the WeakMap. If this
latency was observable to ECMAScript program, it would be a source of
indeterminacy that could impact program execution. For that reason, an
ECMAScript implementation must not provide any means to observe a key of
a WeakMap that does not require the observer to present the observed
key.
WeakMaps must be implemented using either hash tables or other
mechanisms that, on average, provide access times that are sublinear on
the number of key/value pairs in the collection. The data structure used
in this specification is only intended to describe the required
observable semantics of WeakMaps. It is not intended to be a viable
implementation model.
Note
WeakMap and WeakSet are intended to provide mechanisms for
dynamically associating state with an object or symbol in a manner that
does not “leak” memory resources if, in the absence of the WeakMap or
WeakSet instance, the object or symbol otherwise became inaccessible and
subject to resource reclamation by the implementation's garbage
collection mechanisms. This characteristic can be achieved by using an
inverted per-object/symbol mapping of WeakMap or WeakSet instances to
keys. Alternatively, each WeakMap or WeakSet instance may internally
store its key and value data, but this approach requires coordination
between the WeakMap or WeakSet implementation and the garbage collector.
The following references describe mechanism that may be useful to
implementations of WeakMap and WeakSet:
Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In
Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (OOPSLA '97)
, A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183,
Alexandra Barros, Roberto Ierusalimschy, Eliminating Cycles in
Weak Tables. Journal of Universal Computer Science - J.UCS, vol. 14, no.
21, pp. 3481-3497, 2008,
24.3.1
The WeakMap Constructor
The WeakMap
constructor
is
%WeakMap%
is the initial value of the
"WeakMap"
property of the
global object
creates and initializes a new WeakMap when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value in an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified WeakMap behaviour must include a
super
call to the WeakMap
constructor
to create and initialize the subclass instance with the internal state necessary to support the
WeakMap.prototype
built-in methods.
24.3.1.1
WeakMap ( [
iterable
] )
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
Let
map
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%WeakMap.prototype%"
, « [[WeakMapData]] »).
3.
Set
map
.[[WeakMapData]] to a new empty
List
4.
If
iterable
is either
undefined
or
null
, return
map
5.
Let
adder
be ?
Get
map
"set"
).
6.
If
IsCallable
adder
) is
false
, throw a
TypeError
exception.
7.
Return ?
AddEntriesFromIterable
map
iterable
adder
).
Note
If the parameter
iterable
is present, it is expected to be an object that implements an
@@iterator
method that returns an iterator object that produces a two element
array-like object
whose first element is a value that will be used as a WeakMap key and
whose second element is the value to associate with that key.
24.3.2
Properties of the WeakMap Constructor
The WeakMap
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
24.3.2.1
WeakMap.prototype
The initial value of
WeakMap.prototype
is the
WeakMap prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
24.3.3
Properties of the WeakMap Prototype Object
The
WeakMap prototype object
is
%WeakMap.prototype%
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
does not have a [[WeakMapData]] internal slot.
24.3.3.1
WeakMap.prototype.constructor
The initial value of
WeakMap.prototype.constructor
is
%WeakMap%
24.3.3.2
WeakMap.prototype.delete (
key
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[WeakMapData]]).
3.
If
CanBeHeldWeakly
key
) is
false
, return
false
4.
For each
Record
{ [[Key]], [[Value]] }
of
.[[WeakMapData]], do
a.
If
.[[Key]] is not
empty
and
SameValue
.[[Key]],
key
) is
true
, then
i.
Set
.[[Key]] to
empty
ii.
Set
.[[Value]] to
empty
iii.
Return
true
5.
Return
false
Note
The value
empty
is used as a
specification device to indicate that an entry has been deleted. Actual
implementations may take other actions such as physically removing the
entry from internal data structures.
24.3.3.3
WeakMap.prototype.get (
key
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[WeakMapData]]).
3.
If
CanBeHeldWeakly
key
) is
false
, return
undefined
4.
For each
Record
{ [[Key]], [[Value]] }
of
.[[WeakMapData]], do
a.
If
.[[Key]] is not
empty
and
SameValue
.[[Key]],
key
) is
true
, return
.[[Value]].
5.
Return
undefined
24.3.3.4
WeakMap.prototype.has (
key
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[WeakMapData]]).
3.
If
CanBeHeldWeakly
key
) is
false
, return
false
4.
For each
Record
{ [[Key]], [[Value]] }
of
.[[WeakMapData]], do
a.
If
.[[Key]] is not
empty
and
SameValue
.[[Key]],
key
) is
true
, return
true
5.
Return
false
24.3.3.5
WeakMap.prototype.set (
key
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[WeakMapData]]).
3.
If
CanBeHeldWeakly
key
) is
false
, throw a
TypeError
exception.
4.
For each
Record
{ [[Key]], [[Value]] }
of
.[[WeakMapData]], do
a.
If
.[[Key]] is not
empty
and
SameValue
.[[Key]],
key
) is
true
, then
i.
Set
.[[Value]] to
value
ii.
Return
5.
Let
be the
Record
{ [[Key]]:
key
, [[Value]]:
value
}.
6.
Append
to
.[[WeakMapData]].
7.
Return
24.3.3.6
WeakMap.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"WeakMap"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
24.3.4
Properties of WeakMap Instances
WeakMap instances are
ordinary objects
that inherit properties from the WeakMap prototype. WeakMap instances also have a [[WeakMapData]] internal slot.
24.4
WeakSet Objects
WeakSets are collections of objects and/or symbols. A distinct
object or symbol may only occur once as an element of a WeakSet's
collection. A WeakSet may be queried to see if it contains a specific
value, but no mechanism is provided for enumerating the values it holds.
In certain conditions, values which are not
live
are removed as WeakSet elements, as described in
9.10.3
An implementation may impose an arbitrarily determined latency
between the time a value contained in a WeakSet becomes inaccessible and
the time when the value is removed from the WeakSet. If this latency
was observable to ECMAScript program, it would be a source of
indeterminacy that could impact program execution. For that reason, an
ECMAScript implementation must not provide any means to determine if a
WeakSet contains a particular value that does not require the observer
to present the observed value.
WeakSets must be implemented using either hash tables or other
mechanisms that, on average, provide access times that are sublinear on
the number of elements in the collection. The data structure used in
this specification is only intended to describe the required observable
semantics of WeakSets. It is not intended to be a viable implementation
model.
Note
See the NOTE in
24.3
24.4.1
The WeakSet Constructor
The WeakSet
constructor
is
%WeakSet%
is the initial value of the
"WeakSet"
property of the
global object
creates and initializes a new WeakSet when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value in an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified WeakSet behaviour must include a
super
call to the WeakSet
constructor
to create and initialize the subclass instance with the internal state necessary to support the
WeakSet.prototype
built-in methods.
24.4.1.1
WeakSet ( [
iterable
] )
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
Let
set
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%WeakSet.prototype%"
, « [[WeakSetData]] »).
3.
Set
set
.[[WeakSetData]] to a new empty
List
4.
If
iterable
is either
undefined
or
null
, return
set
5.
Let
adder
be ?
Get
set
"add"
).
6.
If
IsCallable
adder
) is
false
, throw a
TypeError
exception.
7.
Let
iteratorRecord
be ?
GetIterator
iterable
sync
).
8.
Repeat,
a.
Let
next
be ?
IteratorStep
iteratorRecord
).
b.
If
next
is
false
, return
set
c.
Let
nextValue
be ?
IteratorValue
next
).
d.
Let
status
be
Completion
Call
adder
set
, «
nextValue
»)).
e.
IfAbruptCloseIterator
status
iteratorRecord
).
24.4.2
Properties of the WeakSet Constructor
The WeakSet
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
24.4.2.1
WeakSet.prototype
The initial value of
WeakSet.prototype
is the
WeakSet prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
24.4.3
Properties of the WeakSet Prototype Object
The
WeakSet prototype object
is
%WeakSet.prototype%
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
does not have a [[WeakSetData]] internal slot.
24.4.3.1
WeakSet.prototype.add (
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[WeakSetData]]).
3.
If
CanBeHeldWeakly
value
) is
false
, throw a
TypeError
exception.
4.
For each element
of
.[[WeakSetData]], do
a.
If
is not
empty
and
SameValue
value
) is
true
, then
i.
Return
5.
Append
value
to
.[[WeakSetData]].
6.
Return
24.4.3.2
WeakSet.prototype.constructor
The initial value of
WeakSet.prototype.constructor
is
%WeakSet%
24.4.3.3
WeakSet.prototype.delete (
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[WeakSetData]]).
3.
If
CanBeHeldWeakly
value
) is
false
, return
false
4.
For each element
of
.[[WeakSetData]], do
a.
If
is not
empty
and
SameValue
value
) is
true
, then
i.
Replace the element of
.[[WeakSetData]] whose value is
with an element whose value is
empty
ii.
Return
true
5.
Return
false
Note
The value
empty
is used as a
specification device to indicate that an entry has been deleted. Actual
implementations may take other actions such as physically removing the
entry from internal data structures.
24.4.3.4
WeakSet.prototype.has (
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[WeakSetData]]).
3.
If
CanBeHeldWeakly
value
) is
false
, return
false
4.
For each element
of
.[[WeakSetData]], do
a.
If
is not
empty
and
SameValue
value
) is
true
, return
true
5.
Return
false
24.4.3.5
WeakSet.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"WeakSet"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
24.4.4
Properties of WeakSet Instances
WeakSet instances are
ordinary objects
that inherit properties from the WeakSet prototype. WeakSet instances also have a [[WeakSetData]] internal slot.
25
Structured Data
25.1
ArrayBuffer Objects
25.1.1
Notation
The descriptions below in this section,
25.4
, and
29
use the read-modify-write modification function internal data structure.
read-modify-write modification function
is a mathematical function that is notationally represented as an abstract closure that takes two
Lists
of
byte values
as arguments and returns a
List
of
byte values
. These abstract closures satisfy all of the following properties:
They perform all their algorithm steps atomically.
Their individual algorithm steps are not observable.
Note
To aid verifying that a read-modify-write modification
function's algorithm steps constitute a pure, mathematical function, the
following editorial conventions are recommended:
They do not access, directly or transitively via invoked
abstract operations
and abstract closures, any language or specification values except their parameters and captured values.
They do not return
Completion Records
25.1.2
Abstract Operations For ArrayBuffer Objects
25.1.2.1
AllocateArrayBuffer (
constructor
byteLength
The abstract operation AllocateArrayBuffer takes arguments
constructor
(a
constructor
) and
byteLength
(a non-negative
integer
) and returns either a
normal completion containing
an ArrayBuffer or a
throw completion
. It is used to create an ArrayBuffer. It performs the following steps when called:
1.
Let
obj
be ?
OrdinaryCreateFromConstructor
constructor
"%ArrayBuffer.prototype%"
, « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] »).
2.
Let
block
be ?
CreateByteDataBlock
byteLength
).
3.
Set
obj
.[[ArrayBufferData]] to
block
4.
Set
obj
.[[ArrayBufferByteLength]] to
byteLength
5.
Return
obj
25.1.2.2
IsDetachedBuffer (
arrayBuffer
The abstract operation IsDetachedBuffer takes argument
arrayBuffer
(an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It performs the following steps when called:
1.
If
arrayBuffer
.[[ArrayBufferData]] is
null
, return
true
2.
Return
false
25.1.2.3
DetachArrayBuffer (
arrayBuffer
[ ,
key
] )
The abstract operation DetachArrayBuffer takes argument
arrayBuffer
(an ArrayBuffer) and optional argument
key
(anything) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Assert
IsSharedArrayBuffer
arrayBuffer
) is
false
2.
If
key
is not present, set
key
to
undefined
3.
If
arrayBuffer
.[[ArrayBufferDetachKey]] is not
key
, throw a
TypeError
exception.
4.
Set
arrayBuffer
.[[ArrayBufferData]] to
null
5.
Set
arrayBuffer
.[[ArrayBufferByteLength]] to 0.
6.
Return
unused
Note
Detaching an ArrayBuffer instance disassociates the
Data Block
used as its backing store from the instance and sets the byte length of
the buffer to 0. No operations defined by this specification use the
DetachArrayBuffer abstract operation. However, an ECMAScript
host
or implementation may define such operations.
25.1.2.4
CloneArrayBuffer (
srcBuffer
srcByteOffset
srcLength
The abstract operation CloneArrayBuffer takes arguments
srcBuffer
(an ArrayBuffer or a SharedArrayBuffer),
srcByteOffset
(a non-negative
integer
), and
srcLength
(a non-negative
integer
) and returns either a
normal completion containing
an ArrayBuffer or a
throw completion
. It creates a new ArrayBuffer whose data is a copy of
srcBuffer
's data over the range starting at
srcByteOffset
and continuing for
srcLength
bytes. It performs the following steps when called:
1.
Assert
IsDetachedBuffer
srcBuffer
) is
false
2.
Let
targetBuffer
be ?
AllocateArrayBuffer
%ArrayBuffer%
srcLength
).
3.
Let
srcBlock
be
srcBuffer
.[[ArrayBufferData]].
4.
Let
targetBlock
be
targetBuffer
.[[ArrayBufferData]].
5.
Perform
CopyDataBlockBytes
targetBlock
, 0,
srcBlock
srcByteOffset
srcLength
).
6.
Return
targetBuffer
25.1.2.5
IsUnsignedElementType (
type
The abstract operation IsUnsignedElementType takes argument
type
(a
TypedArray element type
) and returns a Boolean. It verifies if the argument
type
is an unsigned
TypedArray element type
. It performs the following steps when called:
1.
If
type
is one of
Uint8
Uint8C
Uint16
Uint32
, or
BigUint64
, return
true
2.
Return
false
25.1.2.6
IsUnclampedIntegerElementType (
type
The abstract operation IsUnclampedIntegerElementType takes argument
type
(a
TypedArray element type
) and returns a Boolean. It verifies if the argument
type
is an
Integer
TypedArray element type
not including
Uint8C
. It performs the following steps when called:
1.
If
type
is one of
Int8
Uint8
Int16
Uint16
Int32
, or
Uint32
, return
true
2.
Return
false
25.1.2.7
IsBigIntElementType (
type
The abstract operation IsBigIntElementType takes argument
type
(a
TypedArray element type
) and returns a Boolean. It verifies if the argument
type
is a BigInt
TypedArray element type
. It performs the following steps when called:
1.
If
type
is either
BigUint64
or
BigInt64
, return
true
2.
Return
false
25.1.2.8
IsNoTearConfiguration (
type
order
The abstract operation IsNoTearConfiguration takes arguments
type
(a
TypedArray element type
) and
order
SeqCst
Unordered
, or
Init
) and returns a Boolean. It performs the following steps when called:
1.
If
IsUnclampedIntegerElementType
type
) is
true
, return
true
2.
If
IsBigIntElementType
type
) is
true
and
order
is neither
Init
nor
Unordered
, return
true
3.
Return
false
25.1.2.9
RawBytesToNumeric (
type
rawBytes
isLittleEndian
The abstract operation RawBytesToNumeric takes arguments
type
(a
TypedArray element type
),
rawBytes
(a
List
of
byte values
), and
isLittleEndian
(a Boolean) and returns a Number or a BigInt. It performs the following steps when called:
1.
Let
elementSize
be the Element Size value specified in
Table 68
for Element Type
type
2.
If
isLittleEndian
is
false
, reverse the order of the elements of
rawBytes
3.
If
type
is
Float32
, then
a.
Let
value
be the byte elements of
rawBytes
concatenated and interpreted as a little-endian bit string encoding of an
IEEE 754-2019
binary32 value.
b.
If
value
is an
IEEE 754-2019
binary32 NaN value, return the
NaN
Number value.
c.
Return the Number value that corresponds to
value
4.
If
type
is
Float64
, then
a.
Let
value
be the byte elements of
rawBytes
concatenated and interpreted as a little-endian bit string encoding of an
IEEE 754-2019
binary64 value.
b.
If
value
is an
IEEE 754-2019
binary64 NaN value, return the
NaN
Number value.
c.
Return the Number value that corresponds to
value
5.
If
IsUnsignedElementType
type
) is
true
, then
a.
Let
intValue
be the byte elements of
rawBytes
concatenated and interpreted as a bit string encoding of an unsigned little-endian binary number.
6.
Else,
a.
Let
intValue
be the byte elements of
rawBytes
concatenated and interpreted as a bit string encoding of a binary little-endian two's complement number of bit length
elementSize
× 8.
7.
If
IsBigIntElementType
type
) is
true
, return the BigInt value that corresponds to
intValue
8.
Otherwise, return the Number value that corresponds to
intValue
25.1.2.10
GetValueFromBuffer (
arrayBuffer
byteIndex
type
isTypedArray
order
[ ,
isLittleEndian
] )
The abstract operation GetValueFromBuffer takes arguments
arrayBuffer
(an ArrayBuffer or SharedArrayBuffer),
byteIndex
(a non-negative
integer
),
type
(a
TypedArray element type
),
isTypedArray
(a Boolean), and
order
SeqCst
or
Unordered
) and optional argument
isLittleEndian
(a Boolean) and returns a Number or a BigInt. It performs the following steps when called:
1.
Assert
IsDetachedBuffer
arrayBuffer
) is
false
2.
Assert
: There are sufficient bytes in
arrayBuffer
starting at
byteIndex
to represent a value of
type
3.
Let
block
be
arrayBuffer
.[[ArrayBufferData]].
4.
Let
elementSize
be the Element Size value specified in
Table 68
for Element Type
type
5.
If
IsSharedArrayBuffer
arrayBuffer
) is
true
, then
a.
Let
execution
be the [[CandidateExecution]] field of the
surrounding agent
's
Agent Record
b.
Let
eventsRecord
be the
Agent Events Record
of
execution
.[[EventsRecords]] whose [[AgentSignifier]] is
AgentSignifier
().
c.
If
isTypedArray
is
true
and
IsNoTearConfiguration
type
order
) is
true
, let
noTear
be
true
; otherwise let
noTear
be
false
d.
Let
rawValue
be a
List
of length
elementSize
whose elements are nondeterministically chosen
byte values
e.
NOTE: In implementations,
rawValue
is the result of a non-atomic or atomic read instruction on the
underlying hardware. The nondeterminism is a semantic prescription of
the
memory model
to describe observable behaviour of hardware with weak consistency.
f.
Let
readEvent
be
ReadSharedMemory
{ [[Order]]:
order
, [[NoTear]]:
noTear
, [[Block]]:
block
, [[ByteIndex]]:
byteIndex
, [[ElementSize]]:
elementSize
}.
g.
Append
readEvent
to
eventsRecord
.[[EventList]].
h.
Append
Chosen Value Record
{ [[Event]]:
readEvent
, [[ChosenValue]]:
rawValue
} to
execution
.[[ChosenValues]].
6.
Else, let
rawValue
be a
List
whose elements are bytes from
block
at indices in the
interval
from
byteIndex
(inclusive) to
byteIndex
elementSize
(exclusive).
7.
Assert
: The number of elements in
rawValue
is
elementSize
8.
If
isLittleEndian
is not present, set
isLittleEndian
to the value of the [[LittleEndian]] field of the
surrounding agent
's
Agent Record
9.
Return
RawBytesToNumeric
type
rawValue
isLittleEndian
).
25.1.2.11
NumericToRawBytes (
type
value
isLittleEndian
The abstract operation NumericToRawBytes takes arguments
type
(a
TypedArray element type
),
value
(a Number or a BigInt), and
isLittleEndian
(a Boolean) and returns a
List
of
byte values
. It performs the following steps when called:
1.
If
type
is
Float32
, then
a.
Let
rawBytes
be a
List
whose elements are the 4 bytes that are the result of converting
value
to
IEEE 754-2019
binary32 format using roundTiesToEven mode. The bytes are arranged in little endian order. If
value
is
NaN
rawBytes
may be set to any implementation chosen
IEEE 754-2019
binary32 format Not-a-Number encoding. An implementation must always
choose the same encoding for each implementation distinguishable
NaN
value.
2.
Else if
type
is
Float64
, then
a.
Let
rawBytes
be a
List
whose elements are the 8 bytes that are the
IEEE 754-2019
binary64 format encoding of
value
. The bytes are arranged in little endian order. If
value
is
NaN
rawBytes
may be set to any implementation chosen
IEEE 754-2019
binary64 format Not-a-Number encoding. An implementation must always
choose the same encoding for each implementation distinguishable
NaN
value.
3.
Else,
a.
Let
be the Element Size value specified in
Table 68
for Element Type
type
b.
Let
convOp
be the abstract operation named in the Conversion Operation column in
Table 68
for Element Type
type
c.
Let
intValue
be
convOp
value
)).
d.
If
intValue
≥ 0, then
i.
Let
rawBytes
be a
List
whose elements are the
-byte binary encoding of
intValue
. The bytes are ordered in little endian order.
e.
Else,
i.
Let
rawBytes
be a
List
whose elements are the
-byte binary two's complement encoding of
intValue
. The bytes are ordered in little endian order.
4.
If
isLittleEndian
is
false
, reverse the order of the elements of
rawBytes
5.
Return
rawBytes
25.1.2.12
SetValueInBuffer (
arrayBuffer
byteIndex
type
value
isTypedArray
order
[ ,
isLittleEndian
] )
The abstract operation SetValueInBuffer takes arguments
arrayBuffer
(an ArrayBuffer or SharedArrayBuffer),
byteIndex
(a non-negative
integer
),
type
(a
TypedArray element type
),
value
(a Number or a BigInt),
isTypedArray
(a Boolean), and
order
SeqCst
Unordered
, or
Init
) and optional argument
isLittleEndian
(a Boolean) and returns
unused
. It performs the following steps when called:
1.
Assert
IsDetachedBuffer
arrayBuffer
) is
false
2.
Assert
: There are sufficient bytes in
arrayBuffer
starting at
byteIndex
to represent a value of
type
3.
Assert
value
is a BigInt
if
IsBigIntElementType
type
) is
true
; otherwise,
value
is a Number
4.
Let
block
be
arrayBuffer
.[[ArrayBufferData]].
5.
Let
elementSize
be the Element Size value specified in
Table 68
for Element Type
type
6.
If
isLittleEndian
is not present, set
isLittleEndian
to the value of the [[LittleEndian]] field of the
surrounding agent
's
Agent Record
7.
Let
rawBytes
be
NumericToRawBytes
type
value
isLittleEndian
).
8.
If
IsSharedArrayBuffer
arrayBuffer
) is
true
, then
a.
Let
execution
be the [[CandidateExecution]] field of the
surrounding agent
's
Agent Record
b.
Let
eventsRecord
be the
Agent Events Record
of
execution
.[[EventsRecords]] whose [[AgentSignifier]] is
AgentSignifier
().
c.
If
isTypedArray
is
true
and
IsNoTearConfiguration
type
order
) is
true
, let
noTear
be
true
; otherwise let
noTear
be
false
d.
Append
WriteSharedMemory
{ [[Order]]:
order
, [[NoTear]]:
noTear
, [[Block]]:
block
, [[ByteIndex]]:
byteIndex
, [[ElementSize]]:
elementSize
, [[Payload]]:
rawBytes
} to
eventsRecord
.[[EventList]].
9.
Else, store the individual bytes of
rawBytes
into
block
, starting at
block
byteIndex
].
10.
Return
unused
25.1.2.13
GetModifySetValueInBuffer (
arrayBuffer
byteIndex
type
value
op
[ ,
isLittleEndian
] )
The abstract operation GetModifySetValueInBuffer takes arguments
arrayBuffer
(an ArrayBuffer or a SharedArrayBuffer),
byteIndex
(a non-negative
integer
),
type
(a
TypedArray element type
),
value
(a Number or a BigInt), and
op
(a
read-modify-write modification function
) and optional argument
isLittleEndian
(a Boolean) and returns a Number or a BigInt. It performs the following steps when called:
1.
Assert
IsDetachedBuffer
arrayBuffer
) is
false
2.
Assert
: There are sufficient bytes in
arrayBuffer
starting at
byteIndex
to represent a value of
type
3.
Assert
value
is a BigInt
if
IsBigIntElementType
type
) is
true
; otherwise,
value
is a Number
4.
Let
block
be
arrayBuffer
.[[ArrayBufferData]].
5.
Let
elementSize
be the Element Size value specified in
Table 68
for Element Type
type
6.
If
isLittleEndian
is not present, set
isLittleEndian
to the value of the [[LittleEndian]] field of the
surrounding agent
's
Agent Record
7.
Let
rawBytes
be
NumericToRawBytes
type
value
isLittleEndian
).
8.
If
IsSharedArrayBuffer
arrayBuffer
) is
true
, then
a.
Let
execution
be the [[CandidateExecution]] field of the
surrounding agent
's
Agent Record
b.
Let
eventsRecord
be the
Agent Events Record
of
execution
.[[EventsRecords]] whose [[AgentSignifier]] is
AgentSignifier
().
c.
Let
rawBytesRead
be a
List
of length
elementSize
whose elements are nondeterministically chosen
byte values
d.
NOTE: In implementations,
rawBytesRead
is the result of a load-link, of a load-exclusive, or of an operand of a
read-modify-write instruction on the underlying hardware. The
nondeterminism is a semantic prescription of the
memory model
to describe observable behaviour of hardware with weak consistency.
e.
Let
rmwEvent
be
ReadModifyWriteSharedMemory
{ [[Order]]:
SeqCst
, [[NoTear]]:
true
, [[Block]]:
block
, [[ByteIndex]]:
byteIndex
, [[ElementSize]]:
elementSize
, [[Payload]]:
rawBytes
, [[ModifyOp]]:
op
}.
f.
Append
rmwEvent
to
eventsRecord
.[[EventList]].
g.
Append
Chosen Value Record
{ [[Event]]:
rmwEvent
, [[ChosenValue]]:
rawBytesRead
} to
execution
.[[ChosenValues]].
9.
Else,
a.
Let
rawBytesRead
be a
List
of length
elementSize
whose elements are the sequence of
elementSize
bytes starting with
block
byteIndex
].
b.
Let
rawBytesModified
be
op
rawBytesRead
rawBytes
).
c.
Store the individual bytes of
rawBytesModified
into
block
, starting at
block
byteIndex
].
10.
Return
RawBytesToNumeric
type
rawBytesRead
isLittleEndian
).
25.1.3
The ArrayBuffer Constructor
The ArrayBuffer
constructor
is
%ArrayBuffer%
is the initial value of the
"ArrayBuffer"
property of the
global object
creates and initializes a new ArrayBuffer when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified ArrayBuffer behaviour must include a
super
call to the ArrayBuffer
constructor
to create and initialize subclass instances with the internal state necessary to support the
ArrayBuffer.prototype
built-in methods.
25.1.3.1
ArrayBuffer (
length
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
Let
byteLength
be ?
ToIndex
length
).
3.
Return ?
AllocateArrayBuffer
(NewTarget,
byteLength
).
25.1.4
Properties of the ArrayBuffer Constructor
The ArrayBuffer
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
25.1.4.1
ArrayBuffer.isView (
arg
This function performs the following steps when called:
1.
If
arg
is not an Object
, return
false
2.
If
arg
has a [[ViewedArrayBuffer]] internal slot, return
true
3.
Return
false
25.1.4.2
ArrayBuffer.prototype
The initial value of
ArrayBuffer.prototype
is the
ArrayBuffer prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
25.1.4.3
get ArrayBuffer [ @@species ]
ArrayBuffer[@@species]
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Return the
this
value.
The value of the
"name"
property of this function is
"get [Symbol.species]"
Note
ArrayBuffer prototype methods normally use their
this
value's
constructor
to create a derived object. However, a subclass
constructor
may over-ride that default behaviour by redefining its
@@species
property.
25.1.5
Properties of the ArrayBuffer Prototype Object
The
ArrayBuffer prototype object
is
%ArrayBuffer.prototype%
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
does not have an [[ArrayBufferData]] or [[ArrayBufferByteLength]] internal slot.
25.1.5.1
get ArrayBuffer.prototype.byteLength
ArrayBuffer.prototype.byteLength
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[ArrayBufferData]]).
3.
If
IsSharedArrayBuffer
) is
true
, throw a
TypeError
exception.
4.
If
IsDetachedBuffer
) is
true
, return
+0
5.
Let
length
be
.[[ArrayBufferByteLength]].
6.
Return
length
).
25.1.5.2
ArrayBuffer.prototype.constructor
The initial value of
ArrayBuffer.prototype.constructor
is
%ArrayBuffer%
25.1.5.3
ArrayBuffer.prototype.slice (
start
end
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[ArrayBufferData]]).
3.
If
IsSharedArrayBuffer
) is
true
, throw a
TypeError
exception.
4.
If
IsDetachedBuffer
) is
true
, throw a
TypeError
exception.
5.
Let
len
be
.[[ArrayBufferByteLength]].
6.
Let
relativeStart
be ?
ToIntegerOrInfinity
start
).
7.
If
relativeStart
= -∞, let
first
be 0.
8.
Else if
relativeStart
< 0, let
first
be
max
len
relativeStart
, 0).
9.
Else, let
first
be
min
relativeStart
len
).
10.
If
end
is
undefined
, let
relativeEnd
be
len
; else let
relativeEnd
be ?
ToIntegerOrInfinity
end
).
11.
If
relativeEnd
= -∞, let
final
be 0.
12.
Else if
relativeEnd
< 0, let
final
be
max
len
relativeEnd
, 0).
13.
Else, let
final
be
min
relativeEnd
len
).
14.
Let
newLen
be
max
final
first
, 0).
15.
Let
ctor
be ?
SpeciesConstructor
%ArrayBuffer%
).
16.
Let
new
be ?
Construct
ctor
, «
newLen
) »).
17.
Perform ?
RequireInternalSlot
new
, [[ArrayBufferData]]).
18.
If
IsSharedArrayBuffer
new
) is
true
, throw a
TypeError
exception.
19.
If
IsDetachedBuffer
new
) is
true
, throw a
TypeError
exception.
20.
If
SameValue
new
) is
true
, throw a
TypeError
exception.
21.
If
new
.[[ArrayBufferByteLength]] <
newLen
, throw a
TypeError
exception.
22.
NOTE: Side-effects of the above steps may have detached
23.
If
IsDetachedBuffer
) is
true
, throw a
TypeError
exception.
24.
Let
fromBuf
be
.[[ArrayBufferData]].
25.
Let
toBuf
be
new
.[[ArrayBufferData]].
26.
Perform
CopyDataBlockBytes
toBuf
, 0,
fromBuf
first
newLen
).
27.
Return
new
25.1.5.4
ArrayBuffer.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"ArrayBuffer"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
25.1.6
Properties of ArrayBuffer Instances
ArrayBuffer instances inherit properties from the
ArrayBuffer prototype object
ArrayBuffer instances each have an [[ArrayBufferData]] internal slot,
an [[ArrayBufferByteLength]] internal slot, and an
[[ArrayBufferDetachKey]] internal slot.
ArrayBuffer instances whose [[ArrayBufferData]] is
null
are considered to be detached and all operators to access or modify data contained in the ArrayBuffer instance will fail.
ArrayBuffer instances whose [[ArrayBufferDetachKey]] is set to a value other than
undefined
need to have all
DetachArrayBuffer
calls passing that same "detach key" as an argument, otherwise a
TypeError will result. This internal slot is only ever set by certain
embedding environments, not by algorithms in this specification.
25.2
SharedArrayBuffer Objects
25.2.1
Abstract Operations for SharedArrayBuffer Objects
25.2.1.1
AllocateSharedArrayBuffer (
constructor
byteLength
The abstract operation AllocateSharedArrayBuffer takes arguments
constructor
(a
constructor
) and
byteLength
(a non-negative
integer
) and returns either a
normal completion containing
a SharedArrayBuffer or a
throw completion
. It is used to create a SharedArrayBuffer. It performs the following steps when called:
1.
Let
obj
be ?
OrdinaryCreateFromConstructor
constructor
"%SharedArrayBuffer.prototype%"
, « [[ArrayBufferData]], [[ArrayBufferByteLength]] »).
2.
Let
block
be ?
CreateSharedByteDataBlock
byteLength
).
3.
Set
obj
.[[ArrayBufferData]] to
block
4.
Set
obj
.[[ArrayBufferByteLength]] to
byteLength
5.
Return
obj
25.2.1.2
IsSharedArrayBuffer (
obj
The abstract operation IsSharedArrayBuffer takes argument
obj
(an ArrayBuffer or a SharedArrayBuffer) and returns a Boolean. It tests
whether an object is an ArrayBuffer, a SharedArrayBuffer, or a subtype
of either. It performs the following steps when called:
1.
Let
bufferData
be
obj
.[[ArrayBufferData]].
2.
If
bufferData
is
null
, return
false
3.
If
bufferData
is a
Data Block
, return
false
4.
Assert
bufferData
is a
Shared Data Block
5.
Return
true
25.2.2
The SharedArrayBuffer Constructor
The SharedArrayBuffer
constructor
is
%SharedArrayBuffer%
is the initial value of the
"SharedArrayBuffer"
property of the
global object
, if that property is present (see below).
creates and initializes a new SharedArrayBuffer when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified SharedArrayBuffer behaviour must include a
super
call to the SharedArrayBuffer
constructor
to create and initialize subclass instances with the internal state necessary to support the
SharedArrayBuffer.prototype
built-in methods.
Whenever a
host
does not provide concurrent access to SharedArrayBuffers it may omit the
"SharedArrayBuffer"
property of the
global object
Note
Unlike an
ArrayBuffer
, a
SharedArrayBuffer
cannot become detached, and its internal [[ArrayBufferData]] slot is never
null
25.2.2.1
SharedArrayBuffer (
length
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
Let
byteLength
be ?
ToIndex
length
).
3.
Return ?
AllocateSharedArrayBuffer
(NewTarget,
byteLength
).
25.2.3
Properties of the SharedArrayBuffer Constructor
The SharedArrayBuffer
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
25.2.3.1
SharedArrayBuffer.prototype
The initial value of
SharedArrayBuffer.prototype
is the
SharedArrayBuffer prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
25.2.3.2
get SharedArrayBuffer [ @@species ]
SharedArrayBuffer[@@species]
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Return the
this
value.
The value of the
"name"
property of this function is
"get [Symbol.species]"
25.2.4
Properties of the SharedArrayBuffer Prototype Object
The
SharedArrayBuffer prototype object
is
%SharedArrayBuffer.prototype%
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
does not have an [[ArrayBufferData]] or [[ArrayBufferByteLength]] internal slot.
25.2.4.1
get SharedArrayBuffer.prototype.byteLength
SharedArrayBuffer.prototype.byteLength
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[ArrayBufferData]]).
3.
If
IsSharedArrayBuffer
) is
false
, throw a
TypeError
exception.
4.
Let
length
be
.[[ArrayBufferByteLength]].
5.
Return
length
).
25.2.4.2
SharedArrayBuffer.prototype.constructor
The initial value of
SharedArrayBuffer.prototype.constructor
is
%SharedArrayBuffer%
25.2.4.3
SharedArrayBuffer.prototype.slice (
start
end
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[ArrayBufferData]]).
3.
If
IsSharedArrayBuffer
) is
false
, throw a
TypeError
exception.
4.
Let
len
be
.[[ArrayBufferByteLength]].
5.
Let
relativeStart
be ?
ToIntegerOrInfinity
start
).
6.
If
relativeStart
= -∞, let
first
be 0.
7.
Else if
relativeStart
< 0, let
first
be
max
len
relativeStart
, 0).
8.
Else, let
first
be
min
relativeStart
len
).
9.
If
end
is
undefined
, let
relativeEnd
be
len
; else let
relativeEnd
be ?
ToIntegerOrInfinity
end
).
10.
If
relativeEnd
= -∞, let
final
be 0.
11.
Else if
relativeEnd
< 0, let
final
be
max
len
relativeEnd
, 0).
12.
Else, let
final
be
min
relativeEnd
len
).
13.
Let
newLen
be
max
final
first
, 0).
14.
Let
ctor
be ?
SpeciesConstructor
%SharedArrayBuffer%
).
15.
Let
new
be ?
Construct
ctor
, «
newLen
) »).
16.
Perform ?
RequireInternalSlot
new
, [[ArrayBufferData]]).
17.
If
IsSharedArrayBuffer
new
) is
false
, throw a
TypeError
exception.
18.
If
new
.[[ArrayBufferData]] is
.[[ArrayBufferData]], throw a
TypeError
exception.
19.
If
new
.[[ArrayBufferByteLength]] <
newLen
, throw a
TypeError
exception.
20.
Let
fromBuf
be
.[[ArrayBufferData]].
21.
Let
toBuf
be
new
.[[ArrayBufferData]].
22.
Perform
CopyDataBlockBytes
toBuf
, 0,
fromBuf
first
newLen
).
23.
Return
new
25.2.4.4
SharedArrayBuffer.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"SharedArrayBuffer"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
25.2.5
Properties of SharedArrayBuffer Instances
SharedArrayBuffer instances inherit properties from the
SharedArrayBuffer prototype object
. SharedArrayBuffer instances each have an [[ArrayBufferData]] internal slot and an [[ArrayBufferByteLength]] internal slot.
Note
SharedArrayBuffer instances, unlike ArrayBuffer instances, are never detached.
25.3
DataView Objects
25.3.1
Abstract Operations For DataView Objects
25.3.1.1
GetViewValue (
view
requestIndex
isLittleEndian
type
The abstract operation GetViewValue takes arguments
view
(an
ECMAScript language value
),
requestIndex
(an
ECMAScript language value
),
isLittleEndian
(an
ECMAScript language value
), and
type
(a
TypedArray element type
) and returns either a
normal completion containing
either a Number or a BigInt, or a
throw completion
It is used by functions on DataView instances to retrieve values from
the view's buffer. It performs the following steps when called:
1.
Perform ?
RequireInternalSlot
view
, [[DataView]]).
2.
Assert
view
has a [[ViewedArrayBuffer]] internal slot.
3.
Let
getIndex
be ?
ToIndex
requestIndex
).
4.
Set
isLittleEndian
to
ToBoolean
isLittleEndian
).
5.
Let
buffer
be
view
.[[ViewedArrayBuffer]].
6.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
7.
Let
viewOffset
be
view
.[[ByteOffset]].
8.
Let
viewSize
be
view
.[[ByteLength]].
9.
Let
elementSize
be the Element Size value specified in
Table 68
for Element Type
type
10.
If
getIndex
elementSize
viewSize
, throw a
RangeError
exception.
11.
Let
bufferIndex
be
getIndex
viewOffset
12.
Return
GetValueFromBuffer
buffer
bufferIndex
type
false
Unordered
isLittleEndian
).
25.3.1.2
SetViewValue (
view
requestIndex
isLittleEndian
type
value
The abstract operation SetViewValue takes arguments
view
(an
ECMAScript language value
),
requestIndex
(an
ECMAScript language value
),
isLittleEndian
(an
ECMAScript language value
),
type
(a
TypedArray element type
), and
value
(an
ECMAScript language value
) and returns either a
normal completion containing
undefined
or a
throw completion
It is used by functions on DataView instances to store values into the
view's buffer. It performs the following steps when called:
1.
Perform ?
RequireInternalSlot
view
, [[DataView]]).
2.
Assert
view
has a [[ViewedArrayBuffer]] internal slot.
3.
Let
getIndex
be ?
ToIndex
requestIndex
).
4.
If
IsBigIntElementType
type
) is
true
, let
numberValue
be ?
ToBigInt
value
).
5.
Otherwise, let
numberValue
be ?
ToNumber
value
).
6.
Set
isLittleEndian
to
ToBoolean
isLittleEndian
).
7.
Let
buffer
be
view
.[[ViewedArrayBuffer]].
8.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
9.
Let
viewOffset
be
view
.[[ByteOffset]].
10.
Let
viewSize
be
view
.[[ByteLength]].
11.
Let
elementSize
be the Element Size value specified in
Table 68
for Element Type
type
12.
If
getIndex
elementSize
viewSize
, throw a
RangeError
exception.
13.
Let
bufferIndex
be
getIndex
viewOffset
14.
Perform
SetValueInBuffer
buffer
bufferIndex
type
numberValue
false
Unordered
isLittleEndian
).
15.
Return
undefined
25.3.2
The DataView Constructor
The DataView
constructor
is
%DataView%
is the initial value of the
"DataView"
property of the
global object
creates and initializes a new DataView when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified DataView behaviour must include a
super
call to the DataView
constructor
to create and initialize subclass instances with the internal state necessary to support the
DataView.prototype
built-in methods.
25.3.2.1
DataView (
buffer
[ ,
byteOffset
[ ,
byteLength
] ] )
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
Perform ?
RequireInternalSlot
buffer
, [[ArrayBufferData]]).
3.
Let
offset
be ?
ToIndex
byteOffset
).
4.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
5.
Let
bufferByteLength
be
buffer
.[[ArrayBufferByteLength]].
6.
If
offset
bufferByteLength
, throw a
RangeError
exception.
7.
If
byteLength
is
undefined
, then
a.
Let
viewByteLength
be
bufferByteLength
offset
8.
Else,
a.
Let
viewByteLength
be ?
ToIndex
byteLength
).
b.
If
offset
viewByteLength
bufferByteLength
, throw a
RangeError
exception.
9.
Let
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%DataView.prototype%"
, « [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] »).
10.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
11.
Set
.[[ViewedArrayBuffer]] to
buffer
12.
Set
.[[ByteLength]] to
viewByteLength
13.
Set
.[[ByteOffset]] to
offset
14.
Return
25.3.3
Properties of the DataView Constructor
The DataView
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
25.3.3.1
DataView.prototype
The initial value of
DataView.prototype
is the
DataView prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
25.3.4
Properties of the DataView Prototype Object
The
DataView prototype object
is
%DataView.prototype%
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
does not have a [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], or [[ByteOffset]] internal slot.
25.3.4.1
get DataView.prototype.buffer
DataView.prototype.buffer
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[DataView]]).
3.
Assert
has a [[ViewedArrayBuffer]] internal slot.
4.
Let
buffer
be
.[[ViewedArrayBuffer]].
5.
Return
buffer
25.3.4.2
get DataView.prototype.byteLength
DataView.prototype.byteLength
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[DataView]]).
3.
Assert
has a [[ViewedArrayBuffer]] internal slot.
4.
Let
buffer
be
.[[ViewedArrayBuffer]].
5.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
6.
Let
size
be
.[[ByteLength]].
7.
Return
size
).
25.3.4.3
get DataView.prototype.byteOffset
DataView.prototype.byteOffset
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[DataView]]).
3.
Assert
has a [[ViewedArrayBuffer]] internal slot.
4.
Let
buffer
be
.[[ViewedArrayBuffer]].
5.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
6.
Let
offset
be
.[[ByteOffset]].
7.
Return
offset
).
25.3.4.4
DataView.prototype.constructor
The initial value of
DataView.prototype.constructor
is
%DataView%
25.3.4.5
DataView.prototype.getBigInt64 (
byteOffset
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
GetViewValue
byteOffset
littleEndian
BigInt64
).
25.3.4.6
DataView.prototype.getBigUint64 (
byteOffset
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
GetViewValue
byteOffset
littleEndian
BigUint64
).
25.3.4.7
DataView.prototype.getFloat32 (
byteOffset
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
GetViewValue
byteOffset
littleEndian
Float32
).
25.3.4.8
DataView.prototype.getFloat64 (
byteOffset
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
GetViewValue
byteOffset
littleEndian
Float64
).
25.3.4.9
DataView.prototype.getInt8 (
byteOffset
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
GetViewValue
byteOffset
true
Int8
).
25.3.4.10
DataView.prototype.getInt16 (
byteOffset
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
GetViewValue
byteOffset
littleEndian
Int16
).
25.3.4.11
DataView.prototype.getInt32 (
byteOffset
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
GetViewValue
byteOffset
littleEndian
Int32
).
25.3.4.12
DataView.prototype.getUint8 (
byteOffset
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
GetViewValue
byteOffset
true
Uint8
).
25.3.4.13
DataView.prototype.getUint16 (
byteOffset
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
GetViewValue
byteOffset
littleEndian
Uint16
).
25.3.4.14
DataView.prototype.getUint32 (
byteOffset
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
GetViewValue
byteOffset
littleEndian
Uint32
).
25.3.4.15
DataView.prototype.setBigInt64 (
byteOffset
value
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
SetViewValue
byteOffset
littleEndian
BigInt64
value
).
25.3.4.16
DataView.prototype.setBigUint64 (
byteOffset
value
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
SetViewValue
byteOffset
littleEndian
BigUint64
value
).
25.3.4.17
DataView.prototype.setFloat32 (
byteOffset
value
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
SetViewValue
byteOffset
littleEndian
Float32
value
).
25.3.4.18
DataView.prototype.setFloat64 (
byteOffset
value
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
SetViewValue
byteOffset
littleEndian
Float64
value
).
25.3.4.19
DataView.prototype.setInt8 (
byteOffset
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
SetViewValue
byteOffset
true
Int8
value
).
25.3.4.20
DataView.prototype.setInt16 (
byteOffset
value
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
SetViewValue
byteOffset
littleEndian
Int16
value
).
25.3.4.21
DataView.prototype.setInt32 (
byteOffset
value
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
SetViewValue
byteOffset
littleEndian
Int32
value
).
25.3.4.22
DataView.prototype.setUint8 (
byteOffset
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
SetViewValue
byteOffset
true
Uint8
value
).
25.3.4.23
DataView.prototype.setUint16 (
byteOffset
value
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
SetViewValue
byteOffset
littleEndian
Uint16
value
).
25.3.4.24
DataView.prototype.setUint32 (
byteOffset
value
[ ,
littleEndian
] )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
If
littleEndian
is not present, set
littleEndian
to
false
3.
Return ?
SetViewValue
byteOffset
littleEndian
Uint32
value
).
25.3.4.25
DataView.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"DataView"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
25.3.5
Properties of DataView Instances
DataView instances are
ordinary objects
that inherit properties from the
DataView prototype object
. DataView instances each have [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], and [[ByteOffset]] internal slots.
Note
The value of the [[DataView]] internal slot is not used
within this specification. The simple presence of that internal slot is
used within the specification to identify objects created using the
DataView
constructor
25.4
The Atomics Object
The Atomics object:
is
%Atomics%
is the initial value of the
"Atomics"
property of the
global object
is an
ordinary object
has a [[Prototype]] internal slot whose value is
%Object.prototype%
does not have a [[Construct]] internal method; it cannot be used as a
constructor
with the
new
operator.
does not have a [[Call]] internal method; it cannot be invoked as a function.
The Atomics object provides functions that operate indivisibly
(atomically) on shared memory array cells as well as functions that let
agents
wait for and dispatch primitive events. When used with discipline, the Atomics functions allow multi-
agent
programs that communicate through shared memory to execute in a
well-understood order even on parallel CPUs. The rules that govern
shared-memory communication are provided by the
memory model
, defined below.
Note
For informative guidelines for programming and implementing shared memory in ECMAScript, please see the notes at the end of the
memory model
section.
25.4.1
WaiterList Objects
WaiterList
is a semantic object that contains an ordered list of
agent signifiers
for those
agents
that are waiting on a location (
block
) in shared memory;
block
is a
Shared Data Block
and
a byte offset into the memory of
block
. A WaiterList object also optionally contains a
Synchronize event
denoting the previous leaving of its critical section.
Initially a WaiterList object has an empty list and no
Synchronize event
The
agent cluster
has a store of WaiterList objects; the store is indexed by (
block
). WaiterLists are
agent
-independent: a lookup in the store of WaiterLists by (
block
) will result in the same WaiterList object in any
agent
in the
agent cluster
Each WaiterList has a
critical section
that controls exclusive access to that WaiterList during evaluation. Only a single
agent
may enter a WaiterList's critical section at one time. Entering and
leaving a WaiterList's critical section is controlled by the
abstract operations
EnterCriticalSection
and
LeaveCriticalSection
. Operations on a WaiterList—adding and removing waiting
agents
, traversing the list of
agents
, suspending and notifying
agents
on the list, setting and retrieving the
Synchronize event
—may only be performed by
agents
that have entered the WaiterList's critical section.
25.4.2
Abstract Operations for Atomics
25.4.2.1
ValidateIntegerTypedArray (
typedArray
[ ,
waitable
] )
The abstract operation ValidateIntegerTypedArray takes argument
typedArray
(an
ECMAScript language value
) and optional argument
waitable
(a Boolean) and returns either a
normal completion containing
either an ArrayBuffer or a SharedArrayBuffer, or a
throw completion
. It performs the following steps when called:
1.
If
waitable
is not present, set
waitable
to
false
2.
Perform ?
ValidateTypedArray
typedArray
).
3.
Let
buffer
be
typedArray
.[[ViewedArrayBuffer]].
4.
If
waitable
is
true
, then
a.
If
typedArray
.[[TypedArrayName]] is neither
"Int32Array"
nor
"BigInt64Array"
, throw a
TypeError
exception.
5.
Else,
a.
Let
type
be
TypedArrayElementType
typedArray
).
b.
If
IsUnclampedIntegerElementType
type
) is
false
and
IsBigIntElementType
type
) is
false
, throw a
TypeError
exception.
6.
Return
buffer
25.4.2.2
ValidateAtomicAccess (
typedArray
requestIndex
The abstract operation ValidateAtomicAccess takes arguments
typedArray
(a TypedArray) and
requestIndex
(an
ECMAScript language value
) and returns either a
normal completion containing
an
integer
or a
throw completion
. It performs the following steps when called:
1.
Let
length
be
typedArray
.[[ArrayLength]].
2.
Let
accessIndex
be ?
ToIndex
requestIndex
).
3.
Assert
accessIndex
≥ 0.
4.
If
accessIndex
length
, throw a
RangeError
exception.
5.
Let
elementSize
be
TypedArrayElementSize
typedArray
).
6.
Let
offset
be
typedArray
.[[ByteOffset]].
7.
Return (
accessIndex
elementSize
) +
offset
25.4.2.3
GetWaiterList (
block
The abstract operation GetWaiterList takes arguments
block
(a
Shared Data Block
) and
(a non-negative
integer
that is evenly divisible by 4) and returns a
WaiterList
. It performs the following steps when called:
1.
Assert
and
+ 3 are valid byte offsets within the memory of
block
2.
Return the
WaiterList
that is referenced by the pair (
block
).
25.4.2.4
EnterCriticalSection (
WL
The abstract operation EnterCriticalSection takes argument
WL
(a
WaiterList
) and returns
unused
. It performs the following steps when called:
1.
Assert
: The
surrounding agent
is not in the
critical section
for any
WaiterList
2.
Wait until no
agent
is in the
critical section
for
WL
, then enter the
critical section
for
WL
(without allowing any other
agent
to enter).
3.
If
WL
has a
Synchronize event
, then
a.
NOTE: A
WL
whose
critical section
has been entered at least once has a
Synchronize event
set by
LeaveCriticalSection
b.
Let
execution
be the [[CandidateExecution]] field of the
surrounding agent
's
Agent Record
c.
Let
eventsRecord
be the
Agent Events Record
of
execution
.[[EventsRecords]] whose [[AgentSignifier]] is
AgentSignifier
().
d.
Let
enterEvent
be a new
Synchronize event
e.
Append
enterEvent
to
eventsRecord
.[[EventList]].
f.
Let
leaveEvent
be the
Synchronize event
in
WL
g.
Append (
leaveEvent
enterEvent
) to
eventsRecord
.[[AgentSynchronizesWith]].
4.
Return
unused
EnterCriticalSection has
contention
when an
agent
attempting to enter the
critical section
must wait for another
agent
to leave it. When there is no contention, FIFO order of
EnterCriticalSection calls is observable. When there is contention, an
implementation may choose an arbitrary order but may not cause an
agent
to wait indefinitely.
25.4.2.5
LeaveCriticalSection (
WL
The abstract operation LeaveCriticalSection takes argument
WL
(a
WaiterList
) and returns
unused
. It performs the following steps when called:
1.
Assert
: The
surrounding agent
is in the
critical section
for
WL
2.
Let
execution
be the [[CandidateExecution]] field of the
surrounding agent
's
Agent Record
3.
Let
eventsRecord
be the
Agent Events Record
of
execution
.[[EventsRecords]] whose [[AgentSignifier]] is
AgentSignifier
().
4.
Let
leaveEvent
be a new
Synchronize event
5.
Append
leaveEvent
to
eventsRecord
.[[EventList]].
6.
Set the
Synchronize event
in
WL
to
leaveEvent
7.
Leave the
critical section
for
WL
8.
Return
unused
25.4.2.6
AddWaiter (
WL
The abstract operation AddWaiter takes arguments
WL
(a
WaiterList
) and
(an
agent signifier
) and returns
unused
. It performs the following steps when called:
1.
Assert
: The
surrounding agent
is in the
critical section
for
WL
2.
Assert
is not on the list of waiters in any
WaiterList
3.
Append
to
WL
4.
Return
unused
25.4.2.7
RemoveWaiter (
WL
The abstract operation RemoveWaiter takes arguments
WL
(a
WaiterList
) and
(an
agent signifier
) and returns
unused
. It performs the following steps when called:
1.
Assert
: The
surrounding agent
is in the
critical section
for
WL
2.
Assert
is on the list of waiters in
WL
3.
Remove
from the list of waiters in
WL
4.
Return
unused
25.4.2.8
RemoveWaiters (
WL
The abstract operation RemoveWaiters takes arguments
WL
(a
WaiterList
) and
(a non-negative
integer
or +∞) and returns a
List
of
agent signifiers
. It performs the following steps when called:
1.
Assert
: The
surrounding agent
is in the
critical section
for
WL
2.
Let
be a reference to the list of waiters in
WL
3.
Let
len
be the number of elements in
4.
Let
be
min
len
).
5.
Let
be a
List
whose elements are the first
elements of
6.
Remove the first
elements of
7.
Return
25.4.2.9
SuspendAgent (
WL
minimumTimeout
The abstract operation SuspendAgent takes arguments
WL
(a
WaiterList
),
(an
agent signifier
), and
minimumTimeout
(a non-negative
extended mathematical value
) and returns a Boolean. It performs the following steps when called:
1.
Assert
: The
surrounding agent
is in the
critical section
for
WL
2.
Assert
is
AgentSignifier
().
3.
Assert
is on the list of waiters in
WL
4.
Assert
AgentCanSuspend
() is
true
5.
Let
additionalTimeout
be an
implementation-defined
non-negative
mathematical value
6.
Let
timeout
be
minimumTimeout
additionalTimeout
7.
NOTE: When
minimumTimeout
is +∞,
timeout
is also +∞ and the following step can terminate only by another
agent
calling
NotifyWaiter
8.
Perform
LeaveCriticalSection
WL
) and suspend
for up to
timeout
milliseconds, performing the combined operation in such a way that a notification that arrives after the
critical section
is exited but before the suspension takes effect is not lost.
can wake from suspension either because the timeout expired or because it was notified explicitly by another
agent
calling
NotifyWaiter
with arguments
WL
and
, and not for any other reasons at all.
9.
Perform
EnterCriticalSection
WL
).
10.
If
was notified explicitly by another
agent
calling
NotifyWaiter
with arguments
WL
and
, return
true
11.
Return
false
Note
additionalTimeout
allows implementations to pad
timeouts as necessary, such as for reducing power consumption or
coarsening timer resolution to mitigate timing attacks. This value may
differ from call to call of SuspendAgent.
25.4.2.10
NotifyWaiter (
WL
The abstract operation NotifyWaiter takes arguments
WL
(a
WaiterList
) and
(an
agent signifier
) and returns
unused
. It performs the following steps when called:
1.
Assert
: The
surrounding agent
is in the
critical section
for
WL
2.
Notify the
agent
3.
Return
unused
Note
The embedding may delay notifying
, e.g. for resource management reasons, but
must eventually be notified in order to guarantee forward progress.
25.4.2.11
AtomicReadModifyWrite (
typedArray
index
value
op
The abstract operation AtomicReadModifyWrite takes arguments
typedArray
(an
ECMAScript language value
),
index
(an
ECMAScript language value
),
value
(an
ECMAScript language value
), and
op
(a
read-modify-write modification function
) and returns either a
normal completion containing
either a Number or a BigInt, or a
throw completion
op
takes two
List
of
byte values
arguments and returns a
List
of
byte values
This operation atomically loads a value, combines it with another
value, and stores the result of the combination. It returns the loaded
value. It performs the following steps when called:
1.
Let
buffer
be ?
ValidateIntegerTypedArray
typedArray
).
2.
Let
indexedPosition
be ?
ValidateAtomicAccess
typedArray
index
).
3.
If
typedArray
.[[ContentType]] is
BigInt
, let
be ?
ToBigInt
value
).
4.
Otherwise, let
be
(?
ToIntegerOrInfinity
value
)).
5.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
6.
NOTE: The above check is not redundant with the check in
ValidateIntegerTypedArray
because the call to
ToBigInt
or
ToIntegerOrInfinity
on the preceding lines can have arbitrary side effects, which could cause the buffer to become detached.
7.
Let
elementType
be
TypedArrayElementType
typedArray
).
8.
Return
GetModifySetValueInBuffer
buffer
indexedPosition
elementType
op
).
25.4.2.12
ByteListBitwiseOp (
op
xBytes
yBytes
The abstract operation ByteListBitwiseOp takes arguments
op
, or
),
xBytes
(a
List
of
byte values
), and
yBytes
(a
List
of
byte values
) and returns a
List
of
byte values
. The operation atomically performs a bitwise operation on all
byte values
of the arguments and returns a
List
of
byte values
. It performs the following steps when called:
1.
Assert
xBytes
and
yBytes
have the same number of elements.
2.
Let
result
be a new empty
List
3.
Let
be 0.
4.
For each element
xByte
of
xBytes
, do
a.
Let
yByte
be
yBytes
].
b.
If
op
is
, let
resultByte
be the result of applying the bitwise AND operation to
xByte
and
yByte
c.
Else if
op
is
, let
resultByte
be the result of applying the bitwise exclusive OR (XOR) operation to
xByte
and
yByte
d.
Else,
op
is
. Let
resultByte
be the result of applying the bitwise inclusive OR operation to
xByte
and
yByte
e.
Set
to
+ 1.
f.
Append
resultByte
to
result
5.
Return
result
25.4.2.13
ByteListEqual (
xBytes
yBytes
The abstract operation ByteListEqual takes arguments
xBytes
(a
List
of
byte values
) and
yBytes
(a
List
of
byte values
) and returns a Boolean. It performs the following steps when called:
1.
If
xBytes
and
yBytes
do not have the same number of elements, return
false
2.
Let
be 0.
3.
For each element
xByte
of
xBytes
, do
a.
Let
yByte
be
yBytes
].
b.
If
xByte
yByte
, return
false
c.
Set
to
+ 1.
4.
Return
true
25.4.3
Atomics.add (
typedArray
index
value
This function performs the following steps when called:
1.
Let
type
be
TypedArrayElementType
typedArray
).
2.
Let
isLittleEndian
be the value of the [[LittleEndian]] field of the
surrounding agent
's
Agent Record
3.
Let
add
be a new
read-modify-write modification function
with parameters (
xBytes
yBytes
) that captures
type
and
isLittleEndian
and performs the following steps atomically when called:
a.
Let
be
RawBytesToNumeric
type
xBytes
isLittleEndian
).
b.
Let
be
RawBytesToNumeric
type
yBytes
isLittleEndian
).
c.
If
is a Number
, then
i.
Let
sum
be
Number::add
).
d.
Else,
i.
Assert
is a BigInt
ii.
Let
sum
be
BigInt::add
).
e.
Let
sumBytes
be
NumericToRawBytes
type
sum
isLittleEndian
).
f.
Assert
sumBytes
xBytes
, and
yBytes
have the same number of elements.
g.
Return
sumBytes
4.
Return ?
AtomicReadModifyWrite
typedArray
index
value
add
).
25.4.4
Atomics.and (
typedArray
index
value
This function performs the following steps when called:
1.
Let
and
be a new
read-modify-write modification function
with parameters (
xBytes
yBytes
) that captures nothing and performs the following steps atomically when called:
a.
Return
ByteListBitwiseOp
xBytes
yBytes
).
2.
Return ?
AtomicReadModifyWrite
typedArray
index
value
and
).
25.4.5
Atomics.compareExchange (
typedArray
index
expectedValue
replacementValue
This function performs the following steps when called:
1.
Let
buffer
be ?
ValidateIntegerTypedArray
typedArray
).
2.
Let
block
be
buffer
.[[ArrayBufferData]].
3.
Let
indexedPosition
be ?
ValidateAtomicAccess
typedArray
index
).
4.
If
typedArray
.[[ContentType]] is
BigInt
, then
a.
Let
expected
be ?
ToBigInt
expectedValue
).
b.
Let
replacement
be ?
ToBigInt
replacementValue
).
5.
Else,
a.
Let
expected
be
(?
ToIntegerOrInfinity
expectedValue
)).
b.
Let
replacement
be
(?
ToIntegerOrInfinity
replacementValue
)).
6.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
7.
NOTE: The above check is not redundant with the check in
ValidateIntegerTypedArray
because the call to
ToBigInt
or
ToIntegerOrInfinity
on the preceding lines can have arbitrary side effects, which could cause the buffer to become detached.
8.
Let
elementType
be
TypedArrayElementType
typedArray
).
9.
Let
elementSize
be
TypedArrayElementSize
typedArray
).
10.
Let
isLittleEndian
be the value of the [[LittleEndian]] field of the
surrounding agent
's
Agent Record
11.
Let
expectedBytes
be
NumericToRawBytes
elementType
expected
isLittleEndian
).
12.
Let
replacementBytes
be
NumericToRawBytes
elementType
replacement
isLittleEndian
).
13.
If
IsSharedArrayBuffer
buffer
) is
true
, then
a.
Let
execution
be the [[CandidateExecution]] field of the
surrounding agent
's
Agent Record
b.
Let
eventsRecord
be the
Agent Events Record
of
execution
.[[EventsRecords]] whose [[AgentSignifier]] is
AgentSignifier
().
c.
Let
rawBytesRead
be a
List
of length
elementSize
whose elements are nondeterministically chosen
byte values
d.
NOTE: In implementations,
rawBytesRead
is the result of a load-link, of a load-exclusive, or of an operand of a
read-modify-write instruction on the underlying hardware. The
nondeterminism is a semantic prescription of the
memory model
to describe observable behaviour of hardware with weak consistency.
e.
NOTE: The comparison of the expected value and the read value is performed outside of the
read-modify-write modification function
to avoid needlessly strong synchronization when the expected value is not equal to the read value.
f.
If
ByteListEqual
rawBytesRead
expectedBytes
) is
true
, then
i.
Let
second
be a new
read-modify-write modification function
with parameters (
oldBytes
newBytes
) that captures nothing and performs the following steps atomically when called:
1.
Return
newBytes
ii.
Let
event
be
ReadModifyWriteSharedMemory
{ [[Order]]:
SeqCst
, [[NoTear]]:
true
, [[Block]]:
block
, [[ByteIndex]]:
indexedPosition
, [[ElementSize]]:
elementSize
, [[Payload]]:
replacementBytes
, [[ModifyOp]]:
second
}.
g.
Else,
i.
Let
event
be
ReadSharedMemory
{ [[Order]]:
SeqCst
, [[NoTear]]:
true
, [[Block]]:
block
, [[ByteIndex]]:
indexedPosition
, [[ElementSize]]:
elementSize
}.
h.
Append
event
to
eventsRecord
.[[EventList]].
i.
Append
Chosen Value Record
{ [[Event]]:
event
, [[ChosenValue]]:
rawBytesRead
} to
execution
.[[ChosenValues]].
14.
Else,
a.
Let
rawBytesRead
be a
List
of length
elementSize
whose elements are the sequence of
elementSize
bytes starting with
block
indexedPosition
].
b.
If
ByteListEqual
rawBytesRead
expectedBytes
) is
true
, then
i.
Store the individual bytes of
replacementBytes
into
block
, starting at
block
indexedPosition
].
15.
Return
RawBytesToNumeric
elementType
rawBytesRead
isLittleEndian
).
25.4.6
Atomics.exchange (
typedArray
index
value
This function performs the following steps when called:
1.
Let
second
be a new
read-modify-write modification function
with parameters (
oldBytes
newBytes
) that captures nothing and performs the following steps atomically when called:
a.
Return
newBytes
2.
Return ?
AtomicReadModifyWrite
typedArray
index
value
second
).
25.4.7
Atomics.isLockFree (
size
This function performs the following steps when called:
1.
Let
be ?
ToIntegerOrInfinity
size
).
2.
Let
AR
be the
Agent Record
of the
surrounding agent
3.
If
= 1, return
AR
.[[IsLockFree1]].
4.
If
= 2, return
AR
.[[IsLockFree2]].
5.
If
= 4, return
true
6.
If
= 8, return
AR
.[[IsLockFree8]].
7.
Return
false
Note
This function is an optimization primitive. The intuition is that if the atomic step of an atomic primitive (
compareExchange
load
store
add
sub
and
or
xor
, or
exchange
) on a datum of size
bytes will be performed without the
surrounding agent
acquiring a lock outside the
bytes comprising the datum, then
Atomics.isLockFree
) will return
true
. High-performance algorithms will use this function to determine whether to use locks or atomic operations in
critical sections
. If an atomic primitive is not lock-free then it is often more efficient for an algorithm to provide its own locking.
Atomics.isLockFree
(4) always returns
true
as that can be supported on all known relevant hardware. Being able to assume this will generally simplify programs.
Regardless of the value returned by this function, all atomic
operations are guaranteed to be atomic. For example, they will never
have a visible operation take place in the middle of the operation
(e.g., "tearing").
25.4.8
Atomics.load (
typedArray
index
This function performs the following steps when called:
1.
Let
buffer
be ?
ValidateIntegerTypedArray
typedArray
).
2.
Let
indexedPosition
be ?
ValidateAtomicAccess
typedArray
index
).
3.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
4.
NOTE: The above check is not redundant with the check in
ValidateIntegerTypedArray
because the call to
ValidateAtomicAccess
on the preceding line can have arbitrary side effects, which could cause the buffer to become detached.
5.
Let
elementType
be
TypedArrayElementType
typedArray
).
6.
Return
GetValueFromBuffer
buffer
indexedPosition
elementType
true
SeqCst
).
25.4.9
Atomics.or (
typedArray
index
value
This function performs the following steps when called:
1.
Let
or
be a new
read-modify-write modification function
with parameters (
xBytes
yBytes
) that captures nothing and performs the following steps atomically when called:
a.
Return
ByteListBitwiseOp
xBytes
yBytes
).
2.
Return ?
AtomicReadModifyWrite
typedArray
index
value
or
).
25.4.10
Atomics.store (
typedArray
index
value
This function performs the following steps when called:
1.
Let
buffer
be ?
ValidateIntegerTypedArray
typedArray
).
2.
Let
indexedPosition
be ?
ValidateAtomicAccess
typedArray
index
).
3.
If
typedArray
.[[ContentType]] is
BigInt
, let
be ?
ToBigInt
value
).
4.
Otherwise, let
be
(?
ToIntegerOrInfinity
value
)).
5.
If
IsDetachedBuffer
buffer
) is
true
, throw a
TypeError
exception.
6.
NOTE: The above check is not redundant with the check in
ValidateIntegerTypedArray
because the call to
ToBigInt
or
ToIntegerOrInfinity
on the preceding lines can have arbitrary side effects, which could cause the buffer to become detached.
7.
Let
elementType
be
TypedArrayElementType
typedArray
).
8.
Perform
SetValueInBuffer
buffer
indexedPosition
elementType
true
SeqCst
).
9.
Return
25.4.11
Atomics.sub (
typedArray
index
value
This function performs the following steps when called:
1.
Let
type
be
TypedArrayElementType
typedArray
).
2.
Let
isLittleEndian
be the value of the [[LittleEndian]] field of the
surrounding agent
's
Agent Record
3.
Let
subtract
be a new
read-modify-write modification function
with parameters (
xBytes
yBytes
) that captures
type
and
isLittleEndian
and performs the following steps atomically when called:
a.
Let
be
RawBytesToNumeric
type
xBytes
isLittleEndian
).
b.
Let
be
RawBytesToNumeric
type
yBytes
isLittleEndian
).
c.
If
is a Number
, then
i.
Let
difference
be
Number::subtract
).
d.
Else,
i.
Assert
is a BigInt
ii.
Let
difference
be
BigInt::subtract
).
e.
Let
differenceBytes
be
NumericToRawBytes
type
difference
isLittleEndian
).
f.
Assert
differenceBytes
xBytes
, and
yBytes
have the same number of elements.
g.
Return
differenceBytes
4.
Return ?
AtomicReadModifyWrite
typedArray
index
value
subtract
).
25.4.12
Atomics.wait (
typedArray
index
value
timeout
This function puts the
surrounding agent
in a wait queue and suspends it until notified or until the wait times out, returning a String differentiating those cases.
It performs the following steps when called:
1.
Let
buffer
be ?
ValidateIntegerTypedArray
typedArray
true
).
2.
If
IsSharedArrayBuffer
buffer
) is
false
, throw a
TypeError
exception.
3.
Let
indexedPosition
be ?
ValidateAtomicAccess
typedArray
index
).
4.
If
typedArray
.[[TypedArrayName]] is
"BigInt64Array"
, let
be ?
ToBigInt64
value
).
5.
Otherwise, let
be ?
ToInt32
value
).
6.
Let
be ?
ToNumber
timeout
).
7.
If
is either
NaN
or
+∞
, let
be +∞; else if
is
-∞
, let
be 0; else let
be
max
), 0).
8.
Let
be
AgentCanSuspend
().
9.
If
is
false
, throw a
TypeError
exception.
10.
Let
block
be
buffer
.[[ArrayBufferData]].
11.
Let
WL
be
GetWaiterList
block
indexedPosition
).
12.
Perform
EnterCriticalSection
WL
).
13.
Let
elementType
be
TypedArrayElementType
typedArray
).
14.
Let
be
GetValueFromBuffer
buffer
indexedPosition
elementType
true
SeqCst
).
15.
If
, then
a.
Perform
LeaveCriticalSection
WL
).
b.
Return
"not-equal"
16.
Let
be
AgentSignifier
().
17.
Perform
AddWaiter
WL
).
18.
Let
notified
be
SuspendAgent
WL
).
19.
If
notified
is
true
, then
a.
Assert
is not on the list of waiters in
WL
20.
Else,
a.
Perform
RemoveWaiter
WL
).
21.
Perform
LeaveCriticalSection
WL
).
22.
If
notified
is
true
, return
"ok"
23.
Return
"timed-out"
25.4.13
Atomics.notify (
typedArray
index
count
This function notifies some
agents
that are sleeping in the wait queue.
It performs the following steps when called:
1.
Let
buffer
be ?
ValidateIntegerTypedArray
typedArray
true
).
2.
Let
indexedPosition
be ?
ValidateAtomicAccess
typedArray
index
).
3.
If
count
is
undefined
, let
be +∞.
4.
Else,
a.
Let
intCount
be ?
ToIntegerOrInfinity
count
).
b.
Let
be
max
intCount
, 0).
5.
Let
block
be
buffer
.[[ArrayBufferData]].
6.
If
IsSharedArrayBuffer
buffer
) is
false
, return
+0
7.
Let
WL
be
GetWaiterList
block
indexedPosition
).
8.
Perform
EnterCriticalSection
WL
).
9.
Let
be
RemoveWaiters
WL
).
10.
For each element
of
, do
a.
Perform
NotifyWaiter
WL
).
11.
Perform
LeaveCriticalSection
WL
).
12.
Let
be the number of elements in
13.
Return
).
25.4.14
Atomics.xor (
typedArray
index
value
This function performs the following steps when called:
1.
Let
xor
be a new
read-modify-write modification function
with parameters (
xBytes
yBytes
) that captures nothing and performs the following steps atomically when called:
a.
Return
ByteListBitwiseOp
xBytes
yBytes
).
2.
Return ?
AtomicReadModifyWrite
typedArray
index
value
xor
).
25.4.15
Atomics [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Atomics"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
25.5
The JSON Object
The JSON object:
is
%JSON%
is the initial value of the
"JSON"
property of the
global object
is an
ordinary object
contains two functions,
parse
and
stringify
, that are used to parse and construct JSON texts.
has a [[Prototype]] internal slot whose value is
%Object.prototype%
does not have a [[Construct]] internal method; it cannot be used as a
constructor
with the
new
operator.
does not have a [[Call]] internal method; it cannot be invoked as a function.
The JSON Data Interchange Format is defined in ECMA-404. The JSON
interchange format used in this specification is exactly that described
by ECMA-404. Conforming implementations of
JSON.parse
and
JSON.stringify
must support the exact interchange format described in the ECMA-404
specification without any deletions or extensions to the format.
25.5.1
JSON.parse (
text
[ ,
reviver
] )
This function parses a JSON text (a JSON-formatted String) and produces an
ECMAScript language value
The JSON format represents literals, arrays, and objects with a syntax
similar to the syntax for ECMAScript literals, Array Initializers, and
Object Initializers. After parsing, JSON objects are realized as
ECMAScript objects. JSON arrays are realized as ECMAScript Array
instances. JSON strings, numbers, booleans, and null are realized as
ECMAScript Strings, Numbers, Booleans, and
null
The optional
reviver
parameter is a function that takes two parameters,
key
and
value
. It can filter and transform the results. It is called with each of the
key
value
pairs produced by the parse, and its return value is used instead of
the original value. If it returns what it received, the structure is not
modified. If it returns
undefined
then the property is deleted from the result.
1.
Let
jsonString
be ?
ToString
text
).
2.
Parse
StringToCodePoints
jsonString
) as a JSON text as specified in ECMA-404. Throw a
SyntaxError
exception if it is not a valid JSON text as defined in that specification.
3.
Let
scriptString
be the
string-concatenation
of
"("
jsonString
, and
");"
4.
Let
script
be
ParseText
StringToCodePoints
scriptString
),
Script
).
5.
NOTE: The
early error
rules defined in
13.2.5.1
have special handling for the above invocation of
ParseText
6.
Assert
script
is a
Parse Node
7.
Let
completion
be
Completion
Evaluation
of
script
).
8.
NOTE: The
PropertyDefinitionEvaluation
semantics defined in
13.2.5.5
have special handling for the above evaluation.
9.
Let
unfiltered
be
completion
.[[Value]].
10.
Assert
unfiltered
is either a String, a Number, a Boolean, an Object that is defined by either an
ArrayLiteral
or an
ObjectLiteral
, or
null
11.
If
IsCallable
reviver
) is
true
, then
a.
Let
root
be
OrdinaryObjectCreate
%Object.prototype%
).
b.
Let
rootName
be the empty String.
c.
Perform !
CreateDataPropertyOrThrow
root
rootName
unfiltered
).
d.
Return ?
InternalizeJSONProperty
root
rootName
reviver
).
12.
Else,
a.
Return
unfiltered
The
"length"
property of this function is
Note
Valid JSON text is a subset of the ECMAScript
PrimaryExpression
syntax. Step
verifies that
jsonString
conforms to that subset, and step
10
asserts that that parsing and evaluation returns a value of an appropriate type.
However, because
13.2.5.5
behaves differently during
JSON.parse
, the same source text can produce different results when evaluated as a
PrimaryExpression
rather than as JSON. Furthermore, the Early Error for duplicate
"__proto__"
properties in object literals, which likewise does not apply during
JSON.parse
, means that not all texts accepted by
JSON.parse
are valid as a
PrimaryExpression
, despite matching the grammar.
25.5.1.1
InternalizeJSONProperty (
holder
name
reviver
The abstract operation InternalizeJSONProperty takes arguments
holder
(an Object),
name
(a String), and
reviver
(a
function object
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
Note 1
This algorithm intentionally does not throw an exception if either [[Delete]] or
CreateDataProperty
return
false
It performs the following steps when called:
1.
Let
val
be ?
Get
holder
name
).
2.
If
val
is an Object
, then
a.
Let
isArray
be ?
IsArray
val
).
b.
If
isArray
is
true
, then
i.
Let
len
be ?
LengthOfArrayLike
val
).
ii.
Let
be 0.
iii.
Repeat, while
len
1.
Let
prop
be !
ToString
)).
2.
Let
newElement
be ?
InternalizeJSONProperty
val
prop
reviver
).
3.
If
newElement
is
undefined
, then
a.
Perform ?
val
.[[Delete]]
prop
).
4.
Else,
a.
Perform ?
CreateDataProperty
val
prop
newElement
).
5.
Set
to
+ 1.
c.
Else,
i.
Let
keys
be ?
EnumerableOwnProperties
val
key
).
ii.
For each String
of
keys
, do
1.
Let
newElement
be ?
InternalizeJSONProperty
val
reviver
).
2.
If
newElement
is
undefined
, then
a.
Perform ?
val
.[[Delete]]
).
3.
Else,
a.
Perform ?
CreateDataProperty
val
newElement
).
3.
Return ?
Call
reviver
holder
, «
name
val
»).
It is not permitted for a conforming implementation of
JSON.parse
to extend the JSON grammars. If an implementation wishes to support a
modified or extended JSON interchange format it must do so by defining a
different parse function.
Note 2
In the case where there are duplicate name Strings within
an object, lexically preceding values for the same key shall be
overwritten.
25.5.2
JSON.stringify (
value
[ ,
replacer
[ ,
space
] ] )
This function returns a String in UTF-16 encoded JSON format representing an
ECMAScript language value
, or
undefined
. It can take three parameters. The
value
parameter is an
ECMAScript language value
, which is usually an object or array, although it can also be a String, Boolean, Number or
null
. The optional
replacer
parameter is either a function that alters the way objects and arrays
are stringified, or an array of Strings and Numbers that acts as an
inclusion list for selecting the object properties that will be
stringified. The optional
space
parameter
is a String
or Number that allows the result to have white space injected into it to improve human readability.
It performs the following steps when called:
1.
Let
stack
be a new empty
List
2.
Let
indent
be the empty String.
3.
Let
PropertyList
be
undefined
4.
Let
ReplacerFunction
be
undefined
5.
If
replacer
is an Object
, then
a.
If
IsCallable
replacer
) is
true
, then
i.
Set
ReplacerFunction
to
replacer
b.
Else,
i.
Let
isArray
be ?
IsArray
replacer
).
ii.
If
isArray
is
true
, then
1.
Set
PropertyList
to a new empty
List
2.
Let
len
be ?
LengthOfArrayLike
replacer
).
3.
Let
be 0.
4.
Repeat, while
len
a.
Let
prop
be !
ToString
)).
b.
Let
be ?
Get
replacer
prop
).
c.
Let
item
be
undefined
d.
If
is a String
, set
item
to
e.
Else if
is a Number
, set
item
to !
ToString
).
f.
Else if
is an Object
, then
i.
If
has a [[StringData]] or [[NumberData]] internal slot, set
item
to ?
ToString
).
g.
If
item
is not
undefined
and
PropertyList
does not contain
item
, then
i.
Append
item
to
PropertyList
h.
Set
to
+ 1.
6.
If
space
is an Object
, then
a.
If
space
has a [[NumberData]] internal slot, then
i.
Set
space
to ?
ToNumber
space
).
b.
Else if
space
has a [[StringData]] internal slot, then
i.
Set
space
to ?
ToString
space
).
7.
If
space
is a Number
, then
a.
Let
spaceMV
be !
ToIntegerOrInfinity
space
).
b.
Set
spaceMV
to
min
(10,
spaceMV
).
c.
If
spaceMV
< 1, let
gap
be the empty String; otherwise let
gap
be the String value containing
spaceMV
occurrences of the code unit 0x0020 (SPACE).
8.
Else if
space
is a String
, then
a.
If the length of
space
≤ 10, let
gap
be
space
; otherwise let
gap
be the
substring
of
space
from 0 to 10.
9.
Else,
a.
Let
gap
be the empty String.
10.
Let
wrapper
be
OrdinaryObjectCreate
%Object.prototype%
).
11.
Perform !
CreateDataPropertyOrThrow
wrapper
, the empty String,
value
).
12.
Let
state
be the
JSON Serialization Record
{ [[ReplacerFunction]]:
ReplacerFunction
, [[Stack]]:
stack
, [[Indent]]:
indent
, [[Gap]]:
gap
, [[PropertyList]]:
PropertyList
}.
13.
Return ?
SerializeJSONProperty
state
, the empty String,
wrapper
).
The
"length"
property of this function is
Note 1
JSON structures are allowed to be nested to any depth, but they must be acyclic. If
value
is or contains a cyclic structure, then this function must throw a
TypeError
exception. This is an example of a value that cannot be stringified:
a = [];
a[
] = a;
my_text =
JSON
stringify
(a);
// This must throw a TypeError.
Note 2
Symbolic primitive values are rendered as follows:
The
null
value is rendered in JSON text as the String value
"null"
The
undefined
value is not rendered.
The
true
value is rendered in JSON text as the String value
"true"
The
false
value is rendered in JSON text as the String value
"false"
Note 3
String values are wrapped in QUOTATION MARK (
) code units. The code units
and
are escaped with
prefixes. Control characters code units are replaced with escape sequences
\u
HHHH, or with the shorter forms,
\b
(BACKSPACE),
\f
(FORM FEED),
\n
(LINE FEED),
\r
(CARRIAGE RETURN),
\t
(CHARACTER TABULATION).
Note 4
Finite
numbers are stringified as if by calling
ToString
number
).
NaN
and
Infinity
regardless of sign are represented as the String value
"null"
Note 5
Values that do not have a JSON representation (such as
undefined
and functions) do not produce a String. Instead they produce the
undefined
value. In arrays these values are represented as the String value
"null"
. In objects an unrepresentable value causes the property to be excluded from stringification.
Note 6
An object is rendered as U+007B (LEFT CURLY BRACKET) followed
by zero or more properties, separated with a U+002C (COMMA), closed
with a U+007D (RIGHT CURLY BRACKET). A property is a quoted String
representing the
property name
a U+003A (COLON), and then the stringified property value. An array is
rendered as an opening U+005B (LEFT SQUARE BRACKET) followed by zero or
more values, separated with a U+002C (COMMA), closed with a U+005D
(RIGHT SQUARE BRACKET).
25.5.2.1
JSON Serialization Record
JSON Serialization Record
is a
Record
value used to enable serialization to the JSON format.
JSON Serialization Records have the fields listed in
Table 69
Table 69:
JSON Serialization Record
Fields
Field Name
Value
Meaning
[[ReplacerFunction]]
function object
or
undefined
A function that can supply replacement values for object properties (from JSON.stringify's
replacer
parameter).
[[PropertyList]]
either a
List
of Strings or
undefined
The names of properties to include when serializing a non-array object (from JSON.stringify's
replacer
parameter).
[[Gap]]
a String
The unit of indentation (from JSON.stringify's
space
parameter).
[[Stack]]
List
of Objects
The set of nested objects that are in the process of being serialized. Used to detect cyclic structures.
[[Indent]]
a String
The current indentation.
25.5.2.2
SerializeJSONProperty (
state
key
holder
The abstract operation SerializeJSONProperty takes arguments
state
(a
JSON Serialization Record
),
key
(a String), and
holder
(an Object) and returns either a
normal completion containing
either a String or
undefined
, or a
throw completion
. It performs the following steps when called:
1.
Let
value
be ?
Get
holder
key
).
2.
If
value
is an Object
or
value
is a BigInt
, then
a.
Let
toJSON
be ?
GetV
value
"toJSON"
).
b.
If
IsCallable
toJSON
) is
true
, then
i.
Set
value
to ?
Call
toJSON
value
, «
key
»).
3.
If
state
.[[ReplacerFunction]] is not
undefined
, then
a.
Set
value
to ?
Call
state
.[[ReplacerFunction]],
holder
, «
key
value
»).
4.
If
value
is an Object
, then
a.
If
value
has a [[NumberData]] internal slot, then
i.
Set
value
to ?
ToNumber
value
).
b.
Else if
value
has a [[StringData]] internal slot, then
i.
Set
value
to ?
ToString
value
).
c.
Else if
value
has a [[BooleanData]] internal slot, then
i.
Set
value
to
value
.[[BooleanData]].
d.
Else if
value
has a [[BigIntData]] internal slot, then
i.
Set
value
to
value
.[[BigIntData]].
5.
If
value
is
null
, return
"null"
6.
If
value
is
true
, return
"true"
7.
If
value
is
false
, return
"false"
8.
If
value
is a String
, return
QuoteJSONString
value
).
9.
If
value
is a Number
, then
a.
If
value
is
finite
, return !
ToString
value
).
b.
Return
"null"
10.
If
value
is a BigInt
, throw a
TypeError
exception.
11.
If
value
is an Object
and
IsCallable
value
) is
false
, then
a.
Let
isArray
be ?
IsArray
value
).
b.
If
isArray
is
true
, return ?
SerializeJSONArray
state
value
).
c.
Return ?
SerializeJSONObject
state
value
).
12.
Return
undefined
25.5.2.3
QuoteJSONString (
value
The abstract operation QuoteJSONString takes argument
value
(a String) and returns a String. It wraps
value
in 0x0022 (QUOTATION MARK) code units and escapes certain other code units within it. This operation interprets
value
as a sequence of UTF-16 encoded code points, as described in
6.1.4
. It performs the following steps when called:
1.
Let
product
be the String value consisting solely of the code unit 0x0022 (QUOTATION MARK).
2.
For each code point
of
StringToCodePoints
value
), do
a.
If
is listed in the “Code Point” column of
Table 70
, then
i.
Set
product
to the
string-concatenation
of
product
and the escape sequence for
as specified in the “Escape Sequence” column of the corresponding row.
b.
Else if
has a numeric value less than 0x0020 (SPACE) or
has the same numeric value as a
leading surrogate
or
trailing surrogate
, then
i.
Let
unit
be the code unit whose numeric value is the numeric value of
ii.
Set
product
to the
string-concatenation
of
product
and
UnicodeEscape
unit
).
c.
Else,
i.
Set
product
to the
string-concatenation
of
product
and
UTF16EncodeCodePoint
).
3.
Set
product
to the
string-concatenation
of
product
and the code unit 0x0022 (QUOTATION MARK).
4.
Return
product
Table 70: JSON Single Character Escape Sequences
Code Point
Unicode Character Name
Escape Sequence
U+0008
BACKSPACE
\b
U+0009
CHARACTER TABULATION
\t
U+000A
LINE FEED (LF)
\n
U+000C
FORM FEED (FF)
\f
U+000D
CARRIAGE RETURN (CR)
\r
U+0022
QUOTATION MARK
\"
U+005C
REVERSE SOLIDUS
\\
25.5.2.4
UnicodeEscape (
The abstract operation UnicodeEscape takes argument
(a code unit) and returns a String. It represents
as a Unicode escape sequence. It performs the following steps when called:
1.
Let
be the numeric value of
2.
Assert
≤ 0xFFFF.
3.
Let
hex
be the String representation of
, formatted as a lowercase hexadecimal number.
4.
Return the
string-concatenation
of the code unit 0x005C (REVERSE SOLIDUS),
"u"
, and !
StringPad
hex
"0"
start
).
25.5.2.5
SerializeJSONObject (
state
value
The abstract operation SerializeJSONObject takes arguments
state
(a
JSON Serialization Record
) and
value
(an Object) and returns either a
normal completion containing
a String or a
throw completion
. It serializes an object. It performs the following steps when called:
1.
If
state
.[[Stack]] contains
value
, throw a
TypeError
exception because the structure is cyclical.
2.
Append
value
to
state
.[[Stack]].
3.
Let
stepback
be
state
.[[Indent]].
4.
Set
state
.[[Indent]] to the
string-concatenation
of
state
.[[Indent]] and
state
.[[Gap]].
5.
If
state
.[[PropertyList]] is not
undefined
, then
a.
Let
be
state
.[[PropertyList]].
6.
Else,
a.
Let
be ?
EnumerableOwnProperties
value
key
).
7.
Let
partial
be a new empty
List
8.
For each element
of
, do
a.
Let
strP
be ?
SerializeJSONProperty
state
value
).
b.
If
strP
is not
undefined
, then
i.
Let
member
be
QuoteJSONString
).
ii.
Set
member
to the
string-concatenation
of
member
and
":"
iii.
If
state
.[[Gap]] is not the empty String, then
1.
Set
member
to the
string-concatenation
of
member
and the code unit 0x0020 (SPACE).
iv.
Set
member
to the
string-concatenation
of
member
and
strP
v.
Append
member
to
partial
9.
If
partial
is empty, then
a.
Let
final
be
"{}"
10.
Else,
a.
If
state
.[[Gap]] is the empty String, then
i.
Let
properties
be the String value formed by concatenating all the element Strings of
partial
with each adjacent pair of Strings separated with the code unit 0x002C
(COMMA). A comma is not inserted either before the first String or after
the last String.
ii.
Let
final
be the
string-concatenation
of
"{"
properties
, and
"}"
b.
Else,
i.
Let
separator
be the
string-concatenation
of the code unit 0x002C (COMMA), the code unit 0x000A (LINE FEED), and
state
.[[Indent]].
ii.
Let
properties
be the String value formed by concatenating all the element Strings of
partial
with each adjacent pair of Strings separated with
separator
. The
separator
String is not inserted either before the first String or after the last String.
iii.
Let
final
be the
string-concatenation
of
"{"
, the code unit 0x000A (LINE FEED),
state
.[[Indent]],
properties
, the code unit 0x000A (LINE FEED),
stepback
, and
"}"
11.
Remove the last element of
state
.[[Stack]].
12.
Set
state
.[[Indent]] to
stepback
13.
Return
final
25.5.2.6
SerializeJSONArray (
state
value
The abstract operation SerializeJSONArray takes arguments
state
(a
JSON Serialization Record
) and
value
(an
ECMAScript language value
) and returns either a
normal completion containing
a String or a
throw completion
. It serializes an array. It performs the following steps when called:
1.
If
state
.[[Stack]] contains
value
, throw a
TypeError
exception because the structure is cyclical.
2.
Append
value
to
state
.[[Stack]].
3.
Let
stepback
be
state
.[[Indent]].
4.
Set
state
.[[Indent]] to the
string-concatenation
of
state
.[[Indent]] and
state
.[[Gap]].
5.
Let
partial
be a new empty
List
6.
Let
len
be ?
LengthOfArrayLike
value
).
7.
Let
index
be 0.
8.
Repeat, while
index
len
a.
Let
strP
be ?
SerializeJSONProperty
state
, !
ToString
index
)),
value
).
b.
If
strP
is
undefined
, then
i.
Append
"null"
to
partial
c.
Else,
i.
Append
strP
to
partial
d.
Set
index
to
index
+ 1.
9.
If
partial
is empty, then
a.
Let
final
be
"[]"
10.
Else,
a.
If
state
.[[Gap]] is the empty String, then
i.
Let
properties
be the String value formed by concatenating all the element Strings of
partial
with each adjacent pair of Strings separated with the code unit 0x002C
(COMMA). A comma is not inserted either before the first String or after
the last String.
ii.
Let
final
be the
string-concatenation
of
"["
properties
, and
"]"
b.
Else,
i.
Let
separator
be the
string-concatenation
of the code unit 0x002C (COMMA), the code unit 0x000A (LINE FEED), and
state
.[[Indent]].
ii.
Let
properties
be the String value formed by concatenating all the element Strings of
partial
with each adjacent pair of Strings separated with
separator
. The
separator
String is not inserted either before the first String or after the last String.
iii.
Let
final
be the
string-concatenation
of
"["
, the code unit 0x000A (LINE FEED),
state
.[[Indent]],
properties
, the code unit 0x000A (LINE FEED),
stepback
, and
"]"
11.
Remove the last element of
state
.[[Stack]].
12.
Set
state
.[[Indent]] to
stepback
13.
Return
final
Note
The representation of arrays includes only the elements in the
interval
from
+0
(inclusive) to
array.length
(exclusive). Properties whose keys are not
array indices
are excluded from the stringification. An array is stringified as an
opening LEFT SQUARE BRACKET, elements separated by COMMA, and a closing
RIGHT SQUARE BRACKET.
25.5.3
JSON [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"JSON"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
26
Managing Memory
26.1
WeakRef Objects
WeakRef
is an object that is used to refer to a target object or symbol without preserving it from garbage collection.
WeakRefs
can be dereferenced to allow access to the target value, if the target hasn't been reclaimed by garbage collection.
26.1.1
The WeakRef Constructor
The
WeakRef
constructor
is
%WeakRef%
is the initial value of the
"WeakRef"
property of the
global object
creates and initializes a new WeakRef when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value in an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified
WeakRef
behaviour must include a
super
call to the
WeakRef
constructor
to create and initialize the subclass instance with the internal state necessary to support the
WeakRef.prototype
built-in methods.
26.1.1.1
WeakRef (
target
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
If
CanBeHeldWeakly
target
) is
false
, throw a
TypeError
exception.
3.
Let
weakRef
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%WeakRef.prototype%"
, « [[WeakRefTarget]] »).
4.
Perform
AddToKeptObjects
target
).
5.
Set
weakRef
.[[WeakRefTarget]] to
target
6.
Return
weakRef
26.1.2
Properties of the WeakRef Constructor
The
WeakRef
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
26.1.2.1
WeakRef.prototype
The initial value of
WeakRef.prototype
is the
WeakRef prototype
object.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
26.1.3
Properties of the WeakRef Prototype Object
The
WeakRef prototype
object:
is
%WeakRef.prototype%
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
does not have a [[WeakRefTarget]] internal slot.
Normative Optional
26.1.3.1
WeakRef.prototype.constructor
The initial value of
WeakRef.prototype.constructor
is
%WeakRef%
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
26.1.3.2
WeakRef.prototype.deref ( )
This method performs the following steps when called:
1.
Let
weakRef
be the
this
value.
2.
Perform ?
RequireInternalSlot
weakRef
, [[WeakRefTarget]]).
3.
Return
WeakRefDeref
weakRef
).
Note
If the
WeakRef
returns a
target
value that is not
undefined
, then this
target
value should not be garbage collected until the current execution of ECMAScript code has completed. The
AddToKeptObjects
operation makes sure read consistency is maintained.
let
target = {
foo
) {} };
let
weakRef =
new
WeakRef
(target);
// ... later ...
if
(weakRef.
deref
()) {
weakRef.
deref
().
foo
();
In the above example, if the first deref does not evaluate to
undefined
then the second deref cannot either.
26.1.3.3
WeakRef.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"WeakRef"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
26.1.4
WeakRef Abstract Operations
26.1.4.1
WeakRefDeref (
weakRef
The abstract operation WeakRefDeref takes argument
weakRef
(a
WeakRef
) and returns an
ECMAScript language value
. It performs the following steps when called:
1.
Let
target
be
weakRef
.[[WeakRefTarget]].
2.
If
target
is not
empty
, then
a.
Perform
AddToKeptObjects
target
).
b.
Return
target
3.
Return
undefined
Note
This abstract operation is defined separately from
WeakRef.prototype.deref strictly to make it possible to succinctly
define liveness.
26.1.5
Properties of WeakRef Instances
WeakRef
instances are
ordinary objects
that inherit properties from the
WeakRef prototype
WeakRef
instances also have a [[WeakRefTarget]] internal slot.
26.2
FinalizationRegistry Objects
FinalizationRegistry
is an object that manages registration and unregistration of cleanup
operations that are performed when target objects and symbols are
garbage collected.
26.2.1
The FinalizationRegistry Constructor
The
FinalizationRegistry
constructor
is
%FinalizationRegistry%
is the initial value of the
"FinalizationRegistry"
property of the
global object
creates and initializes a new FinalizationRegistry when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value in an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified
FinalizationRegistry
behaviour must include a
super
call to the
FinalizationRegistry
constructor
to create and initialize the subclass instance with the internal state necessary to support the
FinalizationRegistry.prototype
built-in methods.
26.2.1.1
FinalizationRegistry (
cleanupCallback
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
If
IsCallable
cleanupCallback
) is
false
, throw a
TypeError
exception.
3.
Let
finalizationRegistry
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%FinalizationRegistry.prototype%"
, « [[Realm]], [[CleanupCallback]], [[Cells]] »).
4.
Let
fn
be the
active function object
5.
Set
finalizationRegistry
.[[Realm]] to
fn
.[[Realm]].
6.
Set
finalizationRegistry
.[[CleanupCallback]] to
HostMakeJobCallback
cleanupCallback
).
7.
Set
finalizationRegistry
.[[Cells]] to a new empty
List
8.
Return
finalizationRegistry
26.2.2
Properties of the FinalizationRegistry Constructor
The
FinalizationRegistry
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
26.2.2.1
FinalizationRegistry.prototype
The initial value of
FinalizationRegistry.prototype
is the
FinalizationRegistry prototype
object.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
26.2.3
Properties of the FinalizationRegistry Prototype Object
The
FinalizationRegistry prototype
object:
is
%FinalizationRegistry.prototype%
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
does not have [[Cells]] and [[CleanupCallback]] internal slots.
26.2.3.1
FinalizationRegistry.prototype.constructor
The initial value of
FinalizationRegistry.prototype.constructor
is
%FinalizationRegistry%
26.2.3.2
FinalizationRegistry.prototype.register (
target
heldValue
[ ,
unregisterToken
] )
This method performs the following steps when called:
1.
Let
finalizationRegistry
be the
this
value.
2.
Perform ?
RequireInternalSlot
finalizationRegistry
, [[Cells]]).
3.
If
CanBeHeldWeakly
target
) is
false
, throw a
TypeError
exception.
4.
If
SameValue
target
heldValue
) is
true
, throw a
TypeError
exception.
5.
If
CanBeHeldWeakly
unregisterToken
) is
false
, then
a.
If
unregisterToken
is not
undefined
, throw a
TypeError
exception.
b.
Set
unregisterToken
to
empty
6.
Let
cell
be the
Record
{ [[WeakRefTarget]]:
target
, [[HeldValue]]:
heldValue
, [[UnregisterToken]]:
unregisterToken
}.
7.
Append
cell
to
finalizationRegistry
.[[Cells]].
8.
Return
undefined
Note
Based on the algorithms and definitions in this specification,
cell
.[[HeldValue]] is
live
when
finalizationRegistry
.[[Cells]] contains
cell
; however, this does not necessarily mean that
cell
.[[UnregisterToken]] or
cell
.[[Target]] are
live
. For example, registering an object with itself as its unregister token would not keep the object alive forever.
26.2.3.3
FinalizationRegistry.prototype.unregister (
unregisterToken
This method performs the following steps when called:
1.
Let
finalizationRegistry
be the
this
value.
2.
Perform ?
RequireInternalSlot
finalizationRegistry
, [[Cells]]).
3.
If
CanBeHeldWeakly
unregisterToken
) is
false
, throw a
TypeError
exception.
4.
Let
removed
be
false
5.
For each
Record
{ [[WeakRefTarget]], [[HeldValue]], [[UnregisterToken]] }
cell
of
finalizationRegistry
.[[Cells]], do
a.
If
cell
.[[UnregisterToken]] is not
empty
and
SameValue
cell
.[[UnregisterToken]],
unregisterToken
) is
true
, then
i.
Remove
cell
from
finalizationRegistry
.[[Cells]].
ii.
Set
removed
to
true
6.
Return
removed
26.2.3.4
FinalizationRegistry.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"FinalizationRegistry"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
26.2.4
Properties of FinalizationRegistry Instances
FinalizationRegistry
instances are
ordinary objects
that inherit properties from the
FinalizationRegistry prototype
FinalizationRegistry
instances also have [[Cells]] and [[CleanupCallback]] internal slots.
27
Control Abstraction Objects
27.1
Iteration
27.1.1
Common Iteration Interfaces
An interface is a set of
property keys
whose associated values match a specific specification. Any object that
provides all the properties as described by an interface's
specification
conforms
to that interface. An interface is not
represented by a distinct object. There may be many separately
implemented objects that conform to any interface. An individual object
may conform to multiple interfaces.
27.1.1.1
The
Iterable
Interface
The
Iterable
interface includes the property described in
Table 71
Table 71:
Iterable
Interface Required Properties
Property
Value
Requirements
@@iterator
a function that returns an
Iterator
object
The returned object must conform to the
Iterator
interface.
27.1.1.2
The
Iterator
Interface
An object that implements the
Iterator
interface must include the property in
Table 72
. Such objects may also implement the properties in
Table 73
Table 72:
Iterator
Interface Required Properties
Property
Value
Requirements
"next"
a function that returns an
IteratorResult
object
The returned object must conform to the
IteratorResult
interface. If a previous call to the
next
method of an
Iterator
has returned an
IteratorResult
object whose
"done"
property is
true
, then all subsequent calls to the
next
method of that object should also return an
IteratorResult
object whose
"done"
property is
true
. However, this requirement is not enforced.
Note 1
Arguments may be passed to the
next
function but their interpretation and validity is dependent upon the target
Iterator
. The for-of statement and other common users of
Iterators
do not pass any arguments, so
Iterator
objects that expect to be used in such a manner must be prepared to deal with being called with no arguments.
Table 73:
Iterator
Interface Optional Properties
Property
Value
Requirements
"return"
a function that returns an
IteratorResult
object
The returned object must conform to the
IteratorResult
interface. Invoking this method notifies the
Iterator
object that the caller does not intend to make any more
next
method calls to the
Iterator
. The returned
IteratorResult
object will typically have a
"done"
property whose value is
true
, and a
"value"
property with the value passed as the argument of the
return
method. However, this requirement is not enforced.
"throw"
a function that returns an
IteratorResult
object
The returned object must conform to the
IteratorResult
interface. Invoking this method notifies the
Iterator
object that the caller has detected an error condition. The argument
may be used to identify the error condition and typically will be an
exception object. A typical response is to
throw
the value passed as the argument. If the method does not
throw
, the returned
IteratorResult
object will typically have a
"done"
property whose value is
true
Note 2
Typically callers of these methods should check for their
existence before invoking them. Certain ECMAScript language features
including
for
of
yield*
, and array destructuring call these methods after performing an existence check. Most ECMAScript library functions that accept
Iterable
objects as arguments also conditionally call them.
27.1.1.3
The
AsyncIterable
Interface
The
AsyncIterable
interface includes the properties described in
Table 74
Table 74:
AsyncIterable
Interface Required Properties
Property
Value
Requirements
@@asyncIterator
a function that returns an
AsyncIterator
object
The returned object must conform to the
AsyncIterator
interface.
27.1.1.4
The
AsyncIterator
Interface
An object that implements the
AsyncIterator
interface must include the properties in
Table 75
. Such objects may also implement the properties in
Table 76
Table 75:
AsyncIterator
Interface Required Properties
Property
Value
Requirements
"next"
a function that returns a promise for an
IteratorResult
object
The returned promise, when fulfilled, must fulfill with an object that conforms to the
IteratorResult
interface. If a previous call to the
next
method of an
AsyncIterator
has returned a promise for an
IteratorResult
object whose
"done"
property is
true
, then all subsequent calls to the
next
method of that object should also return a promise for an
IteratorResult
object whose
"done"
property is
true
. However, this requirement is not enforced.
Additionally, the
IteratorResult
object that serves as a fulfillment value should have a
"value"
property whose value is not a promise (or "thenable"). However, this requirement is also not enforced.
Note 1
Arguments may be passed to the
next
function but their interpretation and validity is dependent upon the target
AsyncIterator
. The
for
await
of
statement and other common users of
AsyncIterators
do not pass any arguments, so
AsyncIterator
objects that expect to be used in such a manner must be prepared to deal with being called with no arguments.
Table 76:
AsyncIterator
Interface Optional Properties
Property
Value
Requirements
"return"
a function that returns a promise for an
IteratorResult
object
The returned promise, when fulfilled, must fulfill with an object that conforms to the
IteratorResult
interface. Invoking this method notifies the
AsyncIterator
object that the caller does not intend to make any more
next
method calls to the
AsyncIterator
. The returned promise will fulfill with an
IteratorResult
object which will typically have a
"done"
property whose value is
true
, and a
"value"
property with the value passed as the argument of the
return
method. However, this requirement is not enforced.
Additionally, the
IteratorResult
object that serves as a fulfillment value should have a
"value"
property whose value is not a promise (or "thenable"). If the argument
value is used in the typical manner, then if it is a rejected promise, a
promise rejected with the same reason should be returned; if it is a
fulfilled promise, then its fulfillment value should be used as the
"value"
property of the returned promise's
IteratorResult
object fulfillment value. However, these requirements are also not enforced.
"throw"
a function that returns a promise for an
IteratorResult
object
The returned promise, when fulfilled, must fulfill with an object that conforms to the
IteratorResult
interface. Invoking this method notifies the
AsyncIterator
object that the caller has detected an error condition. The argument
may be used to identify the error condition and typically will be an
exception object. A typical response is to return a rejected promise
which rejects with the value passed as the argument.
If the returned promise is fulfilled, the
IteratorResult
fulfillment value will typically have a
"done"
property whose value is
true
. Additionally, it should have a
"value"
property whose value is not a promise (or "thenable"), but this requirement is not enforced.
Note 2
Typically callers of these methods should check for their
existence before invoking them. Certain ECMAScript language features
including
for
await
of
and
yield*
call these methods after performing an existence check.
27.1.1.5
The
IteratorResult
Interface
The
IteratorResult
interface includes the properties listed in
Table 77
Table 77:
IteratorResult
Interface Properties
Property
Value
Requirements
"done"
a Boolean
This is the result status of an
iterator
next
method call. If the end of the iterator was reached
"done"
is
true
. If the end was not reached
"done"
is
false
and a value is available. If a
"done"
property (either own or inherited) does not exist, it is considered to have the value
false
"value"
an
ECMAScript language value
If done is
false
, this is the current iteration element value. If done is
true
, this is the return value of the iterator, if it supplied one. If the iterator does not have a return value,
"value"
is
undefined
. In that case, the
"value"
property may be absent from the conforming object if it does not inherit an explicit
"value"
property.
27.1.2
The %IteratorPrototype% Object
The
%IteratorPrototype%
object:
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
Note
All objects defined in this specification that implement the
Iterator interface also inherit from %IteratorPrototype%. ECMAScript
code may also define objects that inherit from %IteratorPrototype%. The
%IteratorPrototype% object provides a place where additional methods
that are applicable to all iterator objects may be added.
The following expression is one way that ECMAScript code can access the %IteratorPrototype% object:
Object
getPrototypeOf
Object
getPrototypeOf
([][
Symbol
iterator
]()))
27.1.2.1
%IteratorPrototype% [ @@iterator ] ( )
This function performs the following steps when called:
1.
Return the
this
value.
The value of the
"name"
property of this function is
"[Symbol.iterator]"
27.1.3
The %AsyncIteratorPrototype% Object
The
%AsyncIteratorPrototype%
object:
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
Note
All objects defined in this specification that implement the
AsyncIterator interface also inherit from %AsyncIteratorPrototype%.
ECMAScript code may also define objects that inherit from
%AsyncIteratorPrototype%. The %AsyncIteratorPrototype% object provides a
place where additional methods that are applicable to all async
iterator objects may be added.
27.1.3.1
%AsyncIteratorPrototype% [ @@asyncIterator ] ( )
This function performs the following steps when called:
1.
Return the
this
value.
The value of the
"name"
property of this function is
"[Symbol.asyncIterator]"
27.1.4
Async-from-Sync Iterator Objects
An Async-from-Sync Iterator object is an async iterator that adapts a specific synchronous iterator. There is not a named
constructor
for Async-from-Sync Iterator objects. Instead, Async-from-Sync iterator objects are created by the
CreateAsyncFromSyncIterator
abstract operation as needed.
27.1.4.1
CreateAsyncFromSyncIterator (
syncIteratorRecord
The abstract operation CreateAsyncFromSyncIterator takes argument
syncIteratorRecord
(an
Iterator Record
) and returns an
Iterator Record
. It is used to create an async
Iterator Record
from a synchronous
Iterator Record
. It performs the following steps when called:
1.
Let
asyncIterator
be
OrdinaryObjectCreate
%AsyncFromSyncIteratorPrototype%
, « [[SyncIteratorRecord]] »).
2.
Set
asyncIterator
.[[SyncIteratorRecord]] to
syncIteratorRecord
3.
Let
nextMethod
be !
Get
asyncIterator
"next"
).
4.
Let
iteratorRecord
be the
Iterator Record
{ [[Iterator]]:
asyncIterator
, [[NextMethod]]:
nextMethod
, [[Done]]:
false
}.
5.
Return
iteratorRecord
27.1.4.2
The %AsyncFromSyncIteratorPrototype% Object
The
%AsyncFromSyncIteratorPrototype%
object:
has properties that are inherited by all Async-from-Sync Iterator Objects.
is an
ordinary object
has a [[Prototype]] internal slot whose value is
%AsyncIteratorPrototype%
has the following properties:
27.1.4.2.1
%AsyncFromSyncIteratorPrototype%.next ( [
value
] )
1.
Let
be the
this
value.
2.
Assert
is an Object
that has a [[SyncIteratorRecord]] internal slot.
3.
Let
promiseCapability
be !
NewPromiseCapability
%Promise%
).
4.
Let
syncIteratorRecord
be
.[[SyncIteratorRecord]].
5.
If
value
is present, then
a.
Let
result
be
Completion
IteratorNext
syncIteratorRecord
value
)).
6.
Else,
a.
Let
result
be
Completion
IteratorNext
syncIteratorRecord
)).
7.
IfAbruptRejectPromise
result
promiseCapability
).
8.
Return
AsyncFromSyncIteratorContinuation
result
promiseCapability
).
27.1.4.2.2
%AsyncFromSyncIteratorPrototype%.return ( [
value
] )
1.
Let
be the
this
value.
2.
Assert
is an Object
that has a [[SyncIteratorRecord]] internal slot.
3.
Let
promiseCapability
be !
NewPromiseCapability
%Promise%
).
4.
Let
syncIterator
be
.[[SyncIteratorRecord]].[[Iterator]].
5.
Let
return
be
Completion
GetMethod
syncIterator
"return"
)).
6.
IfAbruptRejectPromise
return
promiseCapability
).
7.
If
return
is
undefined
, then
a.
Let
iterResult
be
CreateIterResultObject
value
true
).
b.
Perform !
Call
promiseCapability
.[[Resolve]],
undefined
, «
iterResult
»).
c.
Return
promiseCapability
.[[Promise]].
8.
If
value
is present, then
a.
Let
result
be
Completion
Call
return
syncIterator
, «
value
»)).
9.
Else,
a.
Let
result
be
Completion
Call
return
syncIterator
)).
10.
IfAbruptRejectPromise
result
promiseCapability
).
11.
If
result
is not an Object
, then
a.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, « a newly created
TypeError
object »).
b.
Return
promiseCapability
.[[Promise]].
12.
Return
AsyncFromSyncIteratorContinuation
result
promiseCapability
).
27.1.4.2.3
%AsyncFromSyncIteratorPrototype%.throw ( [
value
] )
Note
In this specification,
value
is always provided, but is left optional for consistency with
%AsyncFromSyncIteratorPrototype%.return ( [
value
] )
1.
Let
be the
this
value.
2.
Assert
is an Object
that has a [[SyncIteratorRecord]] internal slot.
3.
Let
promiseCapability
be !
NewPromiseCapability
%Promise%
).
4.
Let
syncIterator
be
.[[SyncIteratorRecord]].[[Iterator]].
5.
Let
throw
be
Completion
GetMethod
syncIterator
"throw"
)).
6.
IfAbruptRejectPromise
throw
promiseCapability
).
7.
If
throw
is
undefined
, then
a.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, «
value
»).
b.
Return
promiseCapability
.[[Promise]].
8.
If
value
is present, then
a.
Let
result
be
Completion
Call
throw
syncIterator
, «
value
»)).
9.
Else,
a.
Let
result
be
Completion
Call
throw
syncIterator
)).
10.
IfAbruptRejectPromise
result
promiseCapability
).
11.
If
result
is not an Object
, then
a.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, « a newly created
TypeError
object »).
b.
Return
promiseCapability
.[[Promise]].
12.
Return
AsyncFromSyncIteratorContinuation
result
promiseCapability
).
27.1.4.3
Properties of Async-from-Sync Iterator Instances
Async-from-Sync Iterator instances are
ordinary objects
that inherit properties from the
%AsyncFromSyncIteratorPrototype%
intrinsic object. Async-from-Sync Iterator instances are initially created with the internal slots listed in
Table 78
. Async-from-Sync Iterator instances are not directly observable from ECMAScript code.
Table 78: Internal Slots of Async-from-Sync Iterator Instances
Internal Slot
Type
Description
[[SyncIteratorRecord]]
an
Iterator Record
Represents the original synchronous iterator which is being adapted.
27.1.4.4
AsyncFromSyncIteratorContinuation (
result
promiseCapability
The abstract operation AsyncFromSyncIteratorContinuation takes arguments
result
(an Object) and
promiseCapability
(a
PromiseCapability Record
for an intrinsic
%Promise%
) and returns a Promise. It performs the following steps when called:
1.
NOTE: Because
promiseCapability
is derived from the intrinsic
%Promise%
, the calls to
promiseCapability
.[[Reject]] entailed by the use
IfAbruptRejectPromise
below are guaranteed not to throw.
2.
Let
done
be
Completion
IteratorComplete
result
)).
3.
IfAbruptRejectPromise
done
promiseCapability
).
4.
Let
value
be
Completion
IteratorValue
result
)).
5.
IfAbruptRejectPromise
value
promiseCapability
).
6.
Let
valueWrapper
be
Completion
PromiseResolve
%Promise%
value
)).
7.
IfAbruptRejectPromise
valueWrapper
promiseCapability
).
8.
Let
unwrap
be a new
Abstract Closure
with parameters (
) that captures
done
and performs the following steps when called:
a.
Return
CreateIterResultObject
done
).
9.
Let
onFulfilled
be
CreateBuiltinFunction
unwrap
, 1,
""
, « »).
10.
NOTE:
onFulfilled
is used when processing the
"value"
property of an IteratorResult object in order to wait for its value if
it is a promise and re-package the result in a new "unwrapped"
IteratorResult object.
11.
Perform
PerformPromiseThen
valueWrapper
onFulfilled
undefined
promiseCapability
).
12.
Return
promiseCapability
.[[Promise]].
27.2
Promise Objects
A Promise is an object that is used as a placeholder for the
eventual results of a deferred (and possibly asynchronous) computation.
Any Promise is in one of three mutually exclusive states:
fulfilled
rejected
, and
pending
A promise
is fulfilled if
p.then(f, r)
will immediately enqueue a
Job
to call the function
A promise
is rejected if
p.then(f, r)
will immediately enqueue a
Job
to call the function
A promise is pending if it is neither fulfilled nor rejected.
A promise is said to be
settled
if it is not pending, i.e. if it is either fulfilled or rejected.
A promise is
resolved
if it is settled or if it has been
“locked in” to match the state of another promise. Attempting to
resolve or reject a resolved promise has no effect. A promise is
unresolved
if it is not resolved. An unresolved promise is always in the pending
state. A resolved promise may be pending, fulfilled or rejected.
27.2.1
Promise Abstract Operations
27.2.1.1
PromiseCapability Records
PromiseCapability Record
is a
Record
value used to encapsulate a Promise or promise-like object along with
the functions that are capable of resolving or rejecting that promise.
PromiseCapability Records are produced by the
NewPromiseCapability
abstract operation.
PromiseCapability Records have the fields listed in
Table 79
Table 79:
PromiseCapability Record
Fields
Field Name
Value
Meaning
[[Promise]]
an Object
An object that is usable as a promise.
[[Resolve]]
function object
The function that is used to resolve the given promise.
[[Reject]]
function object
The function that is used to reject the given promise.
27.2.1.1.1
IfAbruptRejectPromise (
value
capability
IfAbruptRejectPromise is a shorthand for a sequence of algorithm steps that use a
PromiseCapability Record
. An algorithm step of the form:
1.
IfAbruptRejectPromise
value
capability
).
means the same thing as:
1.
Assert
value
is a
Completion Record
2.
If
value
is an
abrupt completion
, then
a.
Perform ?
Call
capability
.[[Reject]],
undefined
, «
value
.[[Value]] »).
b.
Return
capability
.[[Promise]].
3.
Else, set
value
to
value
.[[Value]].
27.2.1.2
PromiseReaction Records
The PromiseReaction is a
Record
value used to store information about how a promise should react when
it becomes resolved or rejected with a given value. PromiseReaction
records are created by the
PerformPromiseThen
abstract operation, and are used by the
Abstract Closure
returned by
NewPromiseReactionJob
PromiseReaction records have the fields listed in
Table 80
Table 80: PromiseReaction
Record
Fields
Field Name
Value
Meaning
[[Capability]]
PromiseCapability Record
or
undefined
The capabilities of the promise for which this record provides a reaction handler.
[[Type]]
Fulfill
or
Reject
The [[Type]] is used when [[Handler]] is
empty
to allow for behaviour specific to the settlement type.
[[Handler]]
JobCallback Record
or
empty
The function that should be applied to the incoming
value, and whose return value will govern what happens to the derived
promise. If [[Handler]] is
empty
, a function that depends on the value of [[Type]] will be used instead.
27.2.1.3
CreateResolvingFunctions (
promise
The abstract operation CreateResolvingFunctions takes argument
promise
(a Promise) and returns a
Record
with fields [[Resolve]] (a
function object
) and [[Reject]] (a
function object
). It performs the following steps when called:
1.
Let
alreadyResolved
be the
Record
{ [[Value]]:
false
}.
2.
Let
stepsResolve
be the algorithm steps defined in
Promise Resolve Functions
3.
Let
lengthResolve
be the number of non-optional parameters of the function definition in
Promise Resolve Functions
4.
Let
resolve
be
CreateBuiltinFunction
stepsResolve
lengthResolve
""
, « [[Promise]], [[AlreadyResolved]] »).
5.
Set
resolve
.[[Promise]] to
promise
6.
Set
resolve
.[[AlreadyResolved]] to
alreadyResolved
7.
Let
stepsReject
be the algorithm steps defined in
Promise Reject Functions
8.
Let
lengthReject
be the number of non-optional parameters of the function definition in
Promise Reject Functions
9.
Let
reject
be
CreateBuiltinFunction
stepsReject
lengthReject
""
, « [[Promise]], [[AlreadyResolved]] »).
10.
Set
reject
.[[Promise]] to
promise
11.
Set
reject
.[[AlreadyResolved]] to
alreadyResolved
12.
Return the
Record
{ [[Resolve]]:
resolve
, [[Reject]]:
reject
}.
27.2.1.3.1
Promise Reject Functions
A promise reject function is an anonymous built-in function that has [[Promise]] and [[AlreadyResolved]] internal slots.
When a promise reject function is called with argument
reason
, the following steps are taken:
1.
Let
be the
active function object
2.
Assert
has a [[Promise]] internal slot whose value
is an Object
3.
Let
promise
be
.[[Promise]].
4.
Let
alreadyResolved
be
.[[AlreadyResolved]].
5.
If
alreadyResolved
.[[Value]] is
true
, return
undefined
6.
Set
alreadyResolved
.[[Value]] to
true
7.
Perform
RejectPromise
promise
reason
).
8.
Return
undefined
The
"length"
property of a promise reject function is
27.2.1.3.2
Promise Resolve Functions
A promise resolve function is an anonymous built-in function that has [[Promise]] and [[AlreadyResolved]] internal slots.
When a promise resolve function is called with argument
resolution
, the following steps are taken:
1.
Let
be the
active function object
2.
Assert
has a [[Promise]] internal slot whose value
is an Object
3.
Let
promise
be
.[[Promise]].
4.
Let
alreadyResolved
be
.[[AlreadyResolved]].
5.
If
alreadyResolved
.[[Value]] is
true
, return
undefined
6.
Set
alreadyResolved
.[[Value]] to
true
7.
If
SameValue
resolution
promise
) is
true
, then
a.
Let
selfResolutionError
be a newly created
TypeError
object.
b.
Perform
RejectPromise
promise
selfResolutionError
).
c.
Return
undefined
8.
If
resolution
is not an Object
, then
a.
Perform
FulfillPromise
promise
resolution
).
b.
Return
undefined
9.
Let
then
be
Completion
Get
resolution
"then"
)).
10.
If
then
is an
abrupt completion
, then
a.
Perform
RejectPromise
promise
then
.[[Value]]).
b.
Return
undefined
11.
Let
thenAction
be
then
.[[Value]].
12.
If
IsCallable
thenAction
) is
false
, then
a.
Perform
FulfillPromise
promise
resolution
).
b.
Return
undefined
13.
Let
thenJobCallback
be
HostMakeJobCallback
thenAction
).
14.
Let
job
be
NewPromiseResolveThenableJob
promise
resolution
thenJobCallback
).
15.
Perform
HostEnqueuePromiseJob
job
.[[Job]],
job
.[[Realm]]).
16.
Return
undefined
The
"length"
property of a promise resolve function is
27.2.1.4
FulfillPromise (
promise
value
The abstract operation FulfillPromise takes arguments
promise
(a Promise) and
value
(an
ECMAScript language value
) and returns
unused
. It performs the following steps when called:
1.
Assert
: The value of
promise
.[[PromiseState]] is
pending
2.
Let
reactions
be
promise
.[[PromiseFulfillReactions]].
3.
Set
promise
.[[PromiseResult]] to
value
4.
Set
promise
.[[PromiseFulfillReactions]] to
undefined
5.
Set
promise
.[[PromiseRejectReactions]] to
undefined
6.
Set
promise
.[[PromiseState]] to
fulfilled
7.
Perform
TriggerPromiseReactions
reactions
value
).
8.
Return
unused
27.2.1.5
NewPromiseCapability (
The abstract operation NewPromiseCapability takes argument
(an
ECMAScript language value
) and returns either a
normal completion containing
PromiseCapability Record
or a
throw completion
. It attempts to use
as a
constructor
in the fashion of the built-in Promise
constructor
to create a promise and extract its
resolve
and
reject
functions. The promise plus the
resolve
and
reject
functions are used to initialize a new
PromiseCapability Record
. It performs the following steps when called:
1.
If
IsConstructor
) is
false
, throw a
TypeError
exception.
2.
NOTE:
is assumed to be a
constructor
function that supports the parameter conventions of the Promise
constructor
(see
27.2.3.1
).
3.
Let
resolvingFunctions
be the
Record
{ [[Resolve]]:
undefined
, [[Reject]]:
undefined
}.
4.
Let
executorClosure
be a new
Abstract Closure
with parameters (
resolve
reject
) that captures
resolvingFunctions
and performs the following steps when called:
a.
If
resolvingFunctions
.[[Resolve]] is not
undefined
, throw a
TypeError
exception.
b.
If
resolvingFunctions
.[[Reject]] is not
undefined
, throw a
TypeError
exception.
c.
Set
resolvingFunctions
.[[Resolve]] to
resolve
d.
Set
resolvingFunctions
.[[Reject]] to
reject
e.
Return
undefined
5.
Let
executor
be
CreateBuiltinFunction
executorClosure
, 2,
""
, « »).
6.
Let
promise
be ?
Construct
, «
executor
»).
7.
If
IsCallable
resolvingFunctions
.[[Resolve]]) is
false
, throw a
TypeError
exception.
8.
If
IsCallable
resolvingFunctions
.[[Reject]]) is
false
, throw a
TypeError
exception.
9.
Return the
PromiseCapability Record
{ [[Promise]]:
promise
, [[Resolve]]:
resolvingFunctions
.[[Resolve]], [[Reject]]:
resolvingFunctions
.[[Reject]] }.
Note
This abstract operation supports Promise subclassing, as it is generic on any
constructor
that calls a passed executor function argument in the same way as the Promise
constructor
. It is used to generalize static methods of the Promise
constructor
to any subclass.
27.2.1.6
IsPromise (
The abstract operation IsPromise takes argument
(an
ECMAScript language value
) and returns a Boolean. It checks for the promise brand on an object. It performs the following steps when called:
1.
If
is not an Object
, return
false
2.
If
does not have a [[PromiseState]] internal slot, return
false
3.
Return
true
27.2.1.7
RejectPromise (
promise
reason
The abstract operation RejectPromise takes arguments
promise
(a Promise) and
reason
(an
ECMAScript language value
) and returns
unused
. It performs the following steps when called:
1.
Assert
: The value of
promise
.[[PromiseState]] is
pending
2.
Let
reactions
be
promise
.[[PromiseRejectReactions]].
3.
Set
promise
.[[PromiseResult]] to
reason
4.
Set
promise
.[[PromiseFulfillReactions]] to
undefined
5.
Set
promise
.[[PromiseRejectReactions]] to
undefined
6.
Set
promise
.[[PromiseState]] to
rejected
7.
If
promise
.[[PromiseIsHandled]] is
false
, perform
HostPromiseRejectionTracker
promise
"reject"
).
8.
Perform
TriggerPromiseReactions
reactions
reason
).
9.
Return
unused
27.2.1.8
TriggerPromiseReactions (
reactions
argument
The abstract operation TriggerPromiseReactions takes arguments
reactions
(a
List
of PromiseReaction
Records
) and
argument
(an
ECMAScript language value
) and returns
unused
. It enqueues a new
Job
for each record in
reactions
. Each such
Job
processes the [[Type]] and [[Handler]] of the PromiseReaction
Record
, and if the [[Handler]] is not
empty
, calls it passing the given argument. If the [[Handler]] is
empty
, the behaviour is determined by the [[Type]]. It performs the following steps when called:
1.
For each element
reaction
of
reactions
, do
a.
Let
job
be
NewPromiseReactionJob
reaction
argument
).
b.
Perform
HostEnqueuePromiseJob
job
.[[Job]],
job
.[[Realm]]).
2.
Return
unused
27.2.1.9
HostPromiseRejectionTracker (
promise
operation
The
host-defined
abstract operation HostPromiseRejectionTracker takes arguments
promise
(a Promise) and
operation
"reject"
or
"handle"
) and returns
unused
. It allows
host environments
to track promise rejections.
An implementation of HostPromiseRejectionTracker must conform to the following requirements:
It must complete normally (i.e. not return an
abrupt completion
).
The default implementation of HostPromiseRejectionTracker is to return
unused
Note 1
HostPromiseRejectionTracker is called in two scenarios:
When a promise is rejected without any handlers, it is called with its
operation
argument set to
"reject"
When a handler is added to a rejected promise for the first time, it is called with its
operation
argument set to
"handle"
A typical implementation of HostPromiseRejectionTracker
might try to notify developers of unhandled rejections, while also being
careful to notify them if such previous notifications are later
invalidated by new handlers being attached.
Note 2
If
operation
is
"handle"
, an implementation should not hold a reference to
promise
in a way that would interfere with garbage collection. An implementation may hold a reference to
promise
if
operation
is
"reject"
, since it is expected that rejections will be rare and not on hot code paths.
27.2.2
Promise Jobs
27.2.2.1
NewPromiseReactionJob (
reaction
argument
The abstract operation NewPromiseReactionJob takes arguments
reaction
(a PromiseReaction
Record
) and
argument
(an
ECMAScript language value
) and returns a
Record
with fields [[Job]] (a
Job
Abstract Closure
) and [[Realm]] (a
Realm Record
or
null
). It returns a new
Job
Abstract Closure
that applies the appropriate handler to the incoming value, and uses
the handler's return value to resolve or reject the derived promise
associated with that handler. It performs the following steps when
called:
1.
Let
job
be a new
Job
Abstract Closure
with no parameters that captures
reaction
and
argument
and performs the following steps when called:
a.
Let
promiseCapability
be
reaction
.[[Capability]].
b.
Let
type
be
reaction
.[[Type]].
c.
Let
handler
be
reaction
.[[Handler]].
d.
If
handler
is
empty
, then
i.
If
type
is
Fulfill
, let
handlerResult
be
NormalCompletion
argument
).
ii.
Else,
1.
Assert
type
is
Reject
2.
Let
handlerResult
be
ThrowCompletion
argument
).
e.
Else, let
handlerResult
be
Completion
HostCallJobCallback
handler
undefined
, «
argument
»)).
f.
If
promiseCapability
is
undefined
, then
i.
Assert
handlerResult
is not an
abrupt completion
ii.
Return
empty
g.
Assert
promiseCapability
is a
PromiseCapability Record
h.
If
handlerResult
is an
abrupt completion
, then
i.
Return ?
Call
promiseCapability
.[[Reject]],
undefined
, «
handlerResult
.[[Value]] »).
i.
Else,
i.
Return ?
Call
promiseCapability
.[[Resolve]],
undefined
, «
handlerResult
.[[Value]] »).
2.
Let
handlerRealm
be
null
3.
If
reaction
.[[Handler]] is not
empty
, then
a.
Let
getHandlerRealmResult
be
Completion
GetFunctionRealm
reaction
.[[Handler]].[[Callback]])).
b.
If
getHandlerRealmResult
is a
normal completion
, set
handlerRealm
to
getHandlerRealmResult
.[[Value]].
c.
Else, set
handlerRealm
to
the current Realm Record
d.
NOTE:
handlerRealm
is never
null
unless the handler is
undefined
. When the handler is a revoked Proxy and no ECMAScript code runs,
handlerRealm
is used to create error objects.
4.
Return the
Record
{ [[Job]]:
job
, [[Realm]]:
handlerRealm
}.
27.2.2.2
NewPromiseResolveThenableJob (
promiseToResolve
thenable
then
The abstract operation NewPromiseResolveThenableJob takes arguments
promiseToResolve
(a Promise),
thenable
(an Object), and
then
(a
JobCallback Record
) and returns a
Record
with fields [[Job]] (a
Job
Abstract Closure
) and [[Realm]] (a
Realm Record
). It performs the following steps when called:
1.
Let
job
be a new
Job
Abstract Closure
with no parameters that captures
promiseToResolve
thenable
, and
then
and performs the following steps when called:
a.
Let
resolvingFunctions
be
CreateResolvingFunctions
promiseToResolve
).
b.
Let
thenCallResult
be
Completion
HostCallJobCallback
then
thenable
, «
resolvingFunctions
.[[Resolve]],
resolvingFunctions
.[[Reject]] »)).
c.
If
thenCallResult
is an
abrupt completion
, then
i.
Return ?
Call
resolvingFunctions
.[[Reject]],
undefined
, «
thenCallResult
.[[Value]] »).
d.
Return ?
thenCallResult
2.
Let
getThenRealmResult
be
Completion
GetFunctionRealm
then
.[[Callback]])).
3.
If
getThenRealmResult
is a
normal completion
, let
thenRealm
be
getThenRealmResult
.[[Value]].
4.
Else, let
thenRealm
be
the current Realm Record
5.
NOTE:
thenRealm
is never
null
. When
then
.[[Callback]] is a revoked Proxy and no code runs,
thenRealm
is used to create error objects.
6.
Return the
Record
{ [[Job]]:
job
, [[Realm]]:
thenRealm
}.
Note
This
Job
uses the supplied thenable and its
then
method to resolve the given promise. This process must take place as a
Job
to ensure that the evaluation of the
then
method occurs after evaluation of any surrounding code has completed.
27.2.3
The Promise Constructor
The Promise
constructor
is
%Promise%
is the initial value of the
"Promise"
property of the
global object
creates and initializes a new Promise when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
may be used as the value in an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified Promise behaviour must include a
super
call to the Promise
constructor
to create and initialize the subclass instance with the internal state necessary to support the
Promise
and
Promise.prototype
built-in methods.
27.2.3.1
Promise (
executor
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
If
IsCallable
executor
) is
false
, throw a
TypeError
exception.
3.
Let
promise
be ?
OrdinaryCreateFromConstructor
(NewTarget,
"%Promise.prototype%"
, « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] »).
4.
Set
promise
.[[PromiseState]] to
pending
5.
Set
promise
.[[PromiseFulfillReactions]] to a new empty
List
6.
Set
promise
.[[PromiseRejectReactions]] to a new empty
List
7.
Set
promise
.[[PromiseIsHandled]] to
false
8.
Let
resolvingFunctions
be
CreateResolvingFunctions
promise
).
9.
Let
completion
be
Completion
Call
executor
undefined
, «
resolvingFunctions
.[[Resolve]],
resolvingFunctions
.[[Reject]] »)).
10.
If
completion
is an
abrupt completion
, then
a.
Perform ?
Call
resolvingFunctions
.[[Reject]],
undefined
, «
completion
.[[Value]] »).
11.
Return
promise
Note
The
executor
argument must be a
function object
It is called for initiating and reporting completion of the possibly
deferred action represented by this Promise. The executor is called with
two arguments:
resolve
and
reject
. These are functions that may be used by the
executor
function to report eventual completion or failure of the deferred
computation. Returning from the executor function does not mean that the
deferred action has been completed but only that the request to
eventually perform the deferred action has been accepted.
The
resolve
function that is passed to an
executor
function accepts a single argument. The
executor
code may eventually call the
resolve
function to indicate that it wishes to resolve the associated Promise. The argument passed to the
resolve
function represents the eventual value of the deferred action and can
be either the actual fulfillment value or another promise which will
provide the value if it is fulfilled.
The
reject
function that is passed to an
executor
function accepts a single argument. The
executor
code may eventually call the
reject
function to indicate that the associated Promise is rejected and will never be fulfilled. The argument passed to the
reject
function is used as the rejection value of the promise. Typically it will be an Error object.
The resolve and reject functions passed to an
executor
function by the Promise
constructor
have the capability to actually resolve and reject the associated promise. Subclasses may have different
constructor
behaviour that passes in customized values for resolve and reject.
27.2.4
Properties of the Promise Constructor
The Promise
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
has the following properties:
27.2.4.1
Promise.all (
iterable
This function returns a new promise which is fulfilled with
an array of fulfillment values for the passed promises, or rejects with
the reason of the first passed promise that rejects. It resolves all
elements of the passed iterable to promises as it runs this algorithm.
1.
Let
be the
this
value.
2.
Let
promiseCapability
be ?
NewPromiseCapability
).
3.
Let
promiseResolve
be
Completion
GetPromiseResolve
)).
4.
IfAbruptRejectPromise
promiseResolve
promiseCapability
).
5.
Let
iteratorRecord
be
Completion
GetIterator
iterable
sync
)).
6.
IfAbruptRejectPromise
iteratorRecord
promiseCapability
).
7.
Let
result
be
Completion
PerformPromiseAll
iteratorRecord
promiseCapability
promiseResolve
)).
8.
If
result
is an
abrupt completion
, then
a.
If
iteratorRecord
.[[Done]] is
false
, set
result
to
Completion
IteratorClose
iteratorRecord
result
)).
b.
IfAbruptRejectPromise
result
promiseCapability
).
9.
Return ?
result
Note
This function requires its
this
value to be a
constructor
function that supports the parameter conventions of the Promise
constructor
27.2.4.1.1
GetPromiseResolve (
promiseConstructor
The abstract operation GetPromiseResolve takes argument
promiseConstructor
(a
constructor
) and returns either a
normal completion containing
function object
or a
throw completion
. It performs the following steps when called:
1.
Let
promiseResolve
be ?
Get
promiseConstructor
"resolve"
).
2.
If
IsCallable
promiseResolve
) is
false
, throw a
TypeError
exception.
3.
Return
promiseResolve
27.2.4.1.2
PerformPromiseAll (
iteratorRecord
constructor
resultCapability
promiseResolve
The abstract operation PerformPromiseAll takes arguments
iteratorRecord
(an
Iterator Record
),
constructor
(a
constructor
),
resultCapability
(a
PromiseCapability Record
), and
promiseResolve
(a
function object
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
values
be a new empty
List
2.
Let
remainingElementsCount
be the
Record
{ [[Value]]: 1 }.
3.
Let
index
be 0.
4.
Repeat,
a.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
b.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
next
).
d.
If
next
is
false
, then
i.
Set
iteratorRecord
.[[Done]] to
true
ii.
Set
remainingElementsCount
.[[Value]] to
remainingElementsCount
.[[Value]] - 1.
iii.
If
remainingElementsCount
.[[Value]] = 0, then
1.
Let
valuesArray
be
CreateArrayFromList
values
).
2.
Perform ?
Call
resultCapability
.[[Resolve]],
undefined
, «
valuesArray
»).
iv.
Return
resultCapability
.[[Promise]].
e.
Let
nextValue
be
Completion
IteratorValue
next
)).
f.
If
nextValue
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
g.
ReturnIfAbrupt
nextValue
).
h.
Append
undefined
to
values
i.
Let
nextPromise
be ?
Call
promiseResolve
constructor
, «
nextValue
»).
j.
Let
steps
be the algorithm steps defined in
Promise.all
Resolve Element Functions
k.
Let
length
be the number of non-optional parameters of the function definition in
Promise.all
Resolve Element Functions
l.
Let
onFulfilled
be
CreateBuiltinFunction
steps
length
""
, « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] »).
m.
Set
onFulfilled
.[[AlreadyCalled]] to
false
n.
Set
onFulfilled
.[[Index]] to
index
o.
Set
onFulfilled
.[[Values]] to
values
p.
Set
onFulfilled
.[[Capability]] to
resultCapability
q.
Set
onFulfilled
.[[RemainingElements]] to
remainingElementsCount
r.
Set
remainingElementsCount
.[[Value]] to
remainingElementsCount
.[[Value]] + 1.
s.
Perform ?
Invoke
nextPromise
"then"
, «
onFulfilled
resultCapability
.[[Reject]] »).
t.
Set
index
to
index
+ 1.
27.2.4.1.3
Promise.all
Resolve Element Functions
Promise.all
resolve element function is an anonymous built-in function that is used to resolve a specific
Promise.all
element. Each
Promise.all
resolve element function has [[Index]], [[Values]], [[Capability]],
[[RemainingElements]], and [[AlreadyCalled]] internal slots.
When a
Promise.all
resolve element function is called with argument
, the following steps are taken:
1.
Let
be the
active function object
2.
If
.[[AlreadyCalled]] is
true
, return
undefined
3.
Set
.[[AlreadyCalled]] to
true
4.
Let
index
be
.[[Index]].
5.
Let
values
be
.[[Values]].
6.
Let
promiseCapability
be
.[[Capability]].
7.
Let
remainingElementsCount
be
.[[RemainingElements]].
8.
Set
values
index
] to
9.
Set
remainingElementsCount
.[[Value]] to
remainingElementsCount
.[[Value]] - 1.
10.
If
remainingElementsCount
.[[Value]] = 0, then
a.
Let
valuesArray
be
CreateArrayFromList
values
).
b.
Return ?
Call
promiseCapability
.[[Resolve]],
undefined
, «
valuesArray
»).
11.
Return
undefined
The
"length"
property of a
Promise.all
resolve element function is
27.2.4.2
Promise.allSettled (
iterable
This function returns a promise that is fulfilled with an
array of promise state snapshots, but only after all the original
promises have settled, i.e. become either fulfilled or rejected. It
resolves all elements of the passed iterable to promises as it runs this
algorithm.
1.
Let
be the
this
value.
2.
Let
promiseCapability
be ?
NewPromiseCapability
).
3.
Let
promiseResolve
be
Completion
GetPromiseResolve
)).
4.
IfAbruptRejectPromise
promiseResolve
promiseCapability
).
5.
Let
iteratorRecord
be
Completion
GetIterator
iterable
sync
)).
6.
IfAbruptRejectPromise
iteratorRecord
promiseCapability
).
7.
Let
result
be
Completion
PerformPromiseAllSettled
iteratorRecord
promiseCapability
promiseResolve
)).
8.
If
result
is an
abrupt completion
, then
a.
If
iteratorRecord
.[[Done]] is
false
, set
result
to
Completion
IteratorClose
iteratorRecord
result
)).
b.
IfAbruptRejectPromise
result
promiseCapability
).
9.
Return ?
result
Note
This function requires its
this
value to be a
constructor
function that supports the parameter conventions of the Promise
constructor
27.2.4.2.1
PerformPromiseAllSettled (
iteratorRecord
constructor
resultCapability
promiseResolve
The abstract operation PerformPromiseAllSettled takes arguments
iteratorRecord
(an
Iterator Record
),
constructor
(a
constructor
),
resultCapability
(a
PromiseCapability Record
), and
promiseResolve
(a
function object
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
values
be a new empty
List
2.
Let
remainingElementsCount
be the
Record
{ [[Value]]: 1 }.
3.
Let
index
be 0.
4.
Repeat,
a.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
b.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
next
).
d.
If
next
is
false
, then
i.
Set
iteratorRecord
.[[Done]] to
true
ii.
Set
remainingElementsCount
.[[Value]] to
remainingElementsCount
.[[Value]] - 1.
iii.
If
remainingElementsCount
.[[Value]] = 0, then
1.
Let
valuesArray
be
CreateArrayFromList
values
).
2.
Perform ?
Call
resultCapability
.[[Resolve]],
undefined
, «
valuesArray
»).
iv.
Return
resultCapability
.[[Promise]].
e.
Let
nextValue
be
Completion
IteratorValue
next
)).
f.
If
nextValue
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
g.
ReturnIfAbrupt
nextValue
).
h.
Append
undefined
to
values
i.
Let
nextPromise
be ?
Call
promiseResolve
constructor
, «
nextValue
»).
j.
Let
stepsFulfilled
be the algorithm steps defined in
Promise.allSettled
Resolve Element Functions
k.
Let
lengthFulfilled
be the number of non-optional parameters of the function definition in
Promise.allSettled
Resolve Element Functions
l.
Let
onFulfilled
be
CreateBuiltinFunction
stepsFulfilled
lengthFulfilled
""
, « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] »).
m.
Let
alreadyCalled
be the
Record
{ [[Value]]:
false
}.
n.
Set
onFulfilled
.[[AlreadyCalled]] to
alreadyCalled
o.
Set
onFulfilled
.[[Index]] to
index
p.
Set
onFulfilled
.[[Values]] to
values
q.
Set
onFulfilled
.[[Capability]] to
resultCapability
r.
Set
onFulfilled
.[[RemainingElements]] to
remainingElementsCount
s.
Let
stepsRejected
be the algorithm steps defined in
Promise.allSettled
Reject Element Functions
t.
Let
lengthRejected
be the number of non-optional parameters of the function definition in
Promise.allSettled
Reject Element Functions
u.
Let
onRejected
be
CreateBuiltinFunction
stepsRejected
lengthRejected
""
, « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] »).
v.
Set
onRejected
.[[AlreadyCalled]] to
alreadyCalled
w.
Set
onRejected
.[[Index]] to
index
x.
Set
onRejected
.[[Values]] to
values
y.
Set
onRejected
.[[Capability]] to
resultCapability
z.
Set
onRejected
.[[RemainingElements]] to
remainingElementsCount
aa.
Set
remainingElementsCount
.[[Value]] to
remainingElementsCount
.[[Value]] + 1.
ab.
Perform ?
Invoke
nextPromise
"then"
, «
onFulfilled
onRejected
»).
ac.
Set
index
to
index
+ 1.
27.2.4.2.2
Promise.allSettled
Resolve Element Functions
Promise.allSettled
resolve element function is an anonymous built-in function that is used to resolve a specific
Promise.allSettled
element. Each
Promise.allSettled
resolve element function has [[Index]], [[Values]], [[Capability]],
[[RemainingElements]], and [[AlreadyCalled]] internal slots.
When a
Promise.allSettled
resolve element function is called with argument
, the following steps are taken:
1.
Let
be the
active function object
2.
Let
alreadyCalled
be
.[[AlreadyCalled]].
3.
If
alreadyCalled
.[[Value]] is
true
, return
undefined
4.
Set
alreadyCalled
.[[Value]] to
true
5.
Let
index
be
.[[Index]].
6.
Let
values
be
.[[Values]].
7.
Let
promiseCapability
be
.[[Capability]].
8.
Let
remainingElementsCount
be
.[[RemainingElements]].
9.
Let
obj
be
OrdinaryObjectCreate
%Object.prototype%
).
10.
Perform !
CreateDataPropertyOrThrow
obj
"status"
"fulfilled"
).
11.
Perform !
CreateDataPropertyOrThrow
obj
"value"
).
12.
Set
values
index
] to
obj
13.
Set
remainingElementsCount
.[[Value]] to
remainingElementsCount
.[[Value]] - 1.
14.
If
remainingElementsCount
.[[Value]] = 0, then
a.
Let
valuesArray
be
CreateArrayFromList
values
).
b.
Return ?
Call
promiseCapability
.[[Resolve]],
undefined
, «
valuesArray
»).
15.
Return
undefined
The
"length"
property of a
Promise.allSettled
resolve element function is
27.2.4.2.3
Promise.allSettled
Reject Element Functions
Promise.allSettled
reject element function is an anonymous built-in function that is used to reject a specific
Promise.allSettled
element. Each
Promise.allSettled
reject element function has [[Index]], [[Values]], [[Capability]], [[RemainingElements]], and [[AlreadyCalled]] internal slots.
When a
Promise.allSettled
reject element function is called with argument
, the following steps are taken:
1.
Let
be the
active function object
2.
Let
alreadyCalled
be
.[[AlreadyCalled]].
3.
If
alreadyCalled
.[[Value]] is
true
, return
undefined
4.
Set
alreadyCalled
.[[Value]] to
true
5.
Let
index
be
.[[Index]].
6.
Let
values
be
.[[Values]].
7.
Let
promiseCapability
be
.[[Capability]].
8.
Let
remainingElementsCount
be
.[[RemainingElements]].
9.
Let
obj
be
OrdinaryObjectCreate
%Object.prototype%
).
10.
Perform !
CreateDataPropertyOrThrow
obj
"status"
"rejected"
).
11.
Perform !
CreateDataPropertyOrThrow
obj
"reason"
).
12.
Set
values
index
] to
obj
13.
Set
remainingElementsCount
.[[Value]] to
remainingElementsCount
.[[Value]] - 1.
14.
If
remainingElementsCount
.[[Value]] = 0, then
a.
Let
valuesArray
be
CreateArrayFromList
values
).
b.
Return ?
Call
promiseCapability
.[[Resolve]],
undefined
, «
valuesArray
»).
15.
Return
undefined
The
"length"
property of a
Promise.allSettled
reject element function is
27.2.4.3
Promise.any (
iterable
This function returns a promise that is fulfilled by the first given promise to be fulfilled, or rejected with an
AggregateError
holding the rejection reasons if all of the given promises are
rejected. It resolves all elements of the passed iterable to promises as
it runs this algorithm.
1.
Let
be the
this
value.
2.
Let
promiseCapability
be ?
NewPromiseCapability
).
3.
Let
promiseResolve
be
Completion
GetPromiseResolve
)).
4.
IfAbruptRejectPromise
promiseResolve
promiseCapability
).
5.
Let
iteratorRecord
be
Completion
GetIterator
iterable
sync
)).
6.
IfAbruptRejectPromise
iteratorRecord
promiseCapability
).
7.
Let
result
be
Completion
PerformPromiseAny
iteratorRecord
promiseCapability
promiseResolve
)).
8.
If
result
is an
abrupt completion
, then
a.
If
iteratorRecord
.[[Done]] is
false
, set
result
to
Completion
IteratorClose
iteratorRecord
result
)).
b.
IfAbruptRejectPromise
result
promiseCapability
).
9.
Return ?
result
Note
This function requires its
this
value to be a
constructor
function that supports the parameter conventions of the
Promise
constructor
27.2.4.3.1
PerformPromiseAny (
iteratorRecord
constructor
resultCapability
promiseResolve
The abstract operation PerformPromiseAny takes arguments
iteratorRecord
(an
Iterator Record
),
constructor
(a
constructor
),
resultCapability
(a
PromiseCapability Record
), and
promiseResolve
(a
function object
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
errors
be a new empty
List
2.
Let
remainingElementsCount
be the
Record
{ [[Value]]: 1 }.
3.
Let
index
be 0.
4.
Repeat,
a.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
b.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
next
).
d.
If
next
is
false
, then
i.
Set
iteratorRecord
.[[Done]] to
true
ii.
Set
remainingElementsCount
.[[Value]] to
remainingElementsCount
.[[Value]] - 1.
iii.
If
remainingElementsCount
.[[Value]] = 0, then
1.
Let
error
be a newly created
AggregateError
object.
2.
Perform !
DefinePropertyOrThrow
error
"errors"
, PropertyDescriptor { [[Configurable]]:
true
, [[Enumerable]]:
false
, [[Writable]]:
true
, [[Value]]:
CreateArrayFromList
errors
) }).
3.
Return
ThrowCompletion
error
).
iv.
Return
resultCapability
.[[Promise]].
e.
Let
nextValue
be
Completion
IteratorValue
next
)).
f.
If
nextValue
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
g.
ReturnIfAbrupt
nextValue
).
h.
Append
undefined
to
errors
i.
Let
nextPromise
be ?
Call
promiseResolve
constructor
, «
nextValue
»).
j.
Let
stepsRejected
be the algorithm steps defined in
Promise.any
Reject Element Functions
k.
Let
lengthRejected
be the number of non-optional parameters of the function definition in
Promise.any
Reject Element Functions
l.
Let
onRejected
be
CreateBuiltinFunction
stepsRejected
lengthRejected
""
, « [[AlreadyCalled]], [[Index]], [[Errors]], [[Capability]], [[RemainingElements]] »).
m.
Set
onRejected
.[[AlreadyCalled]] to
false
n.
Set
onRejected
.[[Index]] to
index
o.
Set
onRejected
.[[Errors]] to
errors
p.
Set
onRejected
.[[Capability]] to
resultCapability
q.
Set
onRejected
.[[RemainingElements]] to
remainingElementsCount
r.
Set
remainingElementsCount
.[[Value]] to
remainingElementsCount
.[[Value]] + 1.
s.
Perform ?
Invoke
nextPromise
"then"
, «
resultCapability
.[[Resolve]],
onRejected
»).
t.
Set
index
to
index
+ 1.
27.2.4.3.2
Promise.any
Reject Element Functions
Promise.any
reject element function is an anonymous built-in function that is used to reject a specific
Promise.any
element. Each
Promise.any
reject element function has [[Index]], [[Errors]], [[Capability]], [[RemainingElements]], and [[AlreadyCalled]] internal slots.
When a
Promise.any
reject element function is called with argument
, the following steps are taken:
1.
Let
be the
active function object
2.
If
.[[AlreadyCalled]] is
true
, return
undefined
3.
Set
.[[AlreadyCalled]] to
true
4.
Let
index
be
.[[Index]].
5.
Let
errors
be
.[[Errors]].
6.
Let
promiseCapability
be
.[[Capability]].
7.
Let
remainingElementsCount
be
.[[RemainingElements]].
8.
Set
errors
index
] to
9.
Set
remainingElementsCount
.[[Value]] to
remainingElementsCount
.[[Value]] - 1.
10.
If
remainingElementsCount
.[[Value]] = 0, then
a.
Let
error
be a newly created
AggregateError
object.
b.
Perform !
DefinePropertyOrThrow
error
"errors"
, PropertyDescriptor { [[Configurable]]:
true
, [[Enumerable]]:
false
, [[Writable]]:
true
, [[Value]]:
CreateArrayFromList
errors
) }).
c.
Return ?
Call
promiseCapability
.[[Reject]],
undefined
, «
error
»).
11.
Return
undefined
The
"length"
property of a
Promise.any
reject element function is
27.2.4.4
Promise.prototype
The initial value of
Promise.prototype
is the
Promise prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
27.2.4.5
Promise.race (
iterable
This function returns a new promise which is settled in the
same way as the first passed promise to settle. It resolves all elements
of the passed
iterable
to promises as it runs this algorithm.
1.
Let
be the
this
value.
2.
Let
promiseCapability
be ?
NewPromiseCapability
).
3.
Let
promiseResolve
be
Completion
GetPromiseResolve
)).
4.
IfAbruptRejectPromise
promiseResolve
promiseCapability
).
5.
Let
iteratorRecord
be
Completion
GetIterator
iterable
sync
)).
6.
IfAbruptRejectPromise
iteratorRecord
promiseCapability
).
7.
Let
result
be
Completion
PerformPromiseRace
iteratorRecord
promiseCapability
promiseResolve
)).
8.
If
result
is an
abrupt completion
, then
a.
If
iteratorRecord
.[[Done]] is
false
, set
result
to
Completion
IteratorClose
iteratorRecord
result
)).
b.
IfAbruptRejectPromise
result
promiseCapability
).
9.
Return ?
result
Note 1
If the
iterable
argument yields no values or if none of the promises yielded by
iterable
ever settle, then the pending promise returned by this method will never be settled.
Note 2
This function expects its
this
value to be a
constructor
function that supports the parameter conventions of the Promise
constructor
. It also expects that its
this
value provides a
resolve
method.
27.2.4.5.1
PerformPromiseRace (
iteratorRecord
constructor
resultCapability
promiseResolve
The abstract operation PerformPromiseRace takes arguments
iteratorRecord
(an
Iterator Record
),
constructor
(a
constructor
),
resultCapability
(a
PromiseCapability Record
), and
promiseResolve
(a
function object
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Repeat,
a.
Let
next
be
Completion
IteratorStep
iteratorRecord
)).
b.
If
next
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
c.
ReturnIfAbrupt
next
).
d.
If
next
is
false
, then
i.
Set
iteratorRecord
.[[Done]] to
true
ii.
Return
resultCapability
.[[Promise]].
e.
Let
nextValue
be
Completion
IteratorValue
next
)).
f.
If
nextValue
is an
abrupt completion
, set
iteratorRecord
.[[Done]] to
true
g.
ReturnIfAbrupt
nextValue
).
h.
Let
nextPromise
be ?
Call
promiseResolve
constructor
, «
nextValue
»).
i.
Perform ?
Invoke
nextPromise
"then"
, «
resultCapability
.[[Resolve]],
resultCapability
.[[Reject]] »).
27.2.4.6
Promise.reject (
This function returns a new promise rejected with the passed argument.
1.
Let
be the
this
value.
2.
Let
promiseCapability
be ?
NewPromiseCapability
).
3.
Perform ?
Call
promiseCapability
.[[Reject]],
undefined
, «
»).
4.
Return
promiseCapability
.[[Promise]].
Note
This function expects its
this
value to be a
constructor
function that supports the parameter conventions of the Promise
constructor
27.2.4.7
Promise.resolve (
This function returns either a new promise resolved with the
passed argument, or the argument itself if the argument is a promise
produced by this
constructor
1.
Let
be the
this
value.
2.
If
is not an Object
, throw a
TypeError
exception.
3.
Return ?
PromiseResolve
).
Note
This function expects its
this
value to be a
constructor
function that supports the parameter conventions of the Promise
constructor
27.2.4.7.1
PromiseResolve (
The abstract operation PromiseResolve takes arguments
(a
constructor
) and
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It returns a new promise resolved with
. It performs the following steps when called:
1.
If
IsPromise
) is
true
, then
a.
Let
xConstructor
be ?
Get
"constructor"
).
b.
If
SameValue
xConstructor
) is
true
, return
2.
Let
promiseCapability
be ?
NewPromiseCapability
).
3.
Perform ?
Call
promiseCapability
.[[Resolve]],
undefined
, «
»).
4.
Return
promiseCapability
.[[Promise]].
27.2.4.8
get Promise [ @@species ]
Promise[@@species]
is an
accessor property
whose set accessor function is
undefined
. Its get accessor function performs the following steps when called:
1.
Return the
this
value.
The value of the
"name"
property of this function is
"get [Symbol.species]"
Note
Promise prototype methods normally use their
this
value's
constructor
to create a derived object. However, a subclass
constructor
may over-ride that default behaviour by redefining its
@@species
property.
27.2.5
Properties of the Promise Prototype Object
The
Promise prototype object
is
%Promise.prototype%
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is an
ordinary object
does not have a [[PromiseState]] internal slot or any of the other internal slots of Promise instances.
27.2.5.1
Promise.prototype.catch (
onRejected
This method performs the following steps when called:
1.
Let
promise
be the
this
value.
2.
Return ?
Invoke
promise
"then"
, «
undefined
onRejected
»).
27.2.5.2
Promise.prototype.constructor
The initial value of
Promise.prototype.constructor
is
%Promise%
27.2.5.3
Promise.prototype.finally (
onFinally
This method performs the following steps when called:
1.
Let
promise
be the
this
value.
2.
If
promise
is not an Object
, throw a
TypeError
exception.
3.
Let
be ?
SpeciesConstructor
promise
%Promise%
).
4.
Assert
IsConstructor
) is
true
5.
If
IsCallable
onFinally
) is
false
, then
a.
Let
thenFinally
be
onFinally
b.
Let
catchFinally
be
onFinally
6.
Else,
a.
Let
thenFinallyClosure
be a new
Abstract Closure
with parameters (
value
) that captures
onFinally
and
and performs the following steps when called:
i.
Let
result
be ?
Call
onFinally
undefined
).
ii.
Let
be ?
PromiseResolve
result
).
iii.
Let
returnValue
be a new
Abstract Closure
with no parameters that captures
value
and performs the following steps when called:
1.
Return
value
iv.
Let
valueThunk
be
CreateBuiltinFunction
returnValue
, 0,
""
, « »).
v.
Return ?
Invoke
"then"
, «
valueThunk
»).
b.
Let
thenFinally
be
CreateBuiltinFunction
thenFinallyClosure
, 1,
""
, « »).
c.
Let
catchFinallyClosure
be a new
Abstract Closure
with parameters (
reason
) that captures
onFinally
and
and performs the following steps when called:
i.
Let
result
be ?
Call
onFinally
undefined
).
ii.
Let
be ?
PromiseResolve
result
).
iii.
Let
throwReason
be a new
Abstract Closure
with no parameters that captures
reason
and performs the following steps when called:
1.
Return
ThrowCompletion
reason
).
iv.
Let
thrower
be
CreateBuiltinFunction
throwReason
, 0,
""
, « »).
v.
Return ?
Invoke
"then"
, «
thrower
»).
d.
Let
catchFinally
be
CreateBuiltinFunction
catchFinallyClosure
, 1,
""
, « »).
7.
Return ?
Invoke
promise
"then"
, «
thenFinally
catchFinally
»).
27.2.5.4
Promise.prototype.then (
onFulfilled
onRejected
This method performs the following steps when called:
1.
Let
promise
be the
this
value.
2.
If
IsPromise
promise
) is
false
, throw a
TypeError
exception.
3.
Let
be ?
SpeciesConstructor
promise
%Promise%
).
4.
Let
resultCapability
be ?
NewPromiseCapability
).
5.
Return
PerformPromiseThen
promise
onFulfilled
onRejected
resultCapability
).
27.2.5.4.1
PerformPromiseThen (
promise
onFulfilled
onRejected
[ ,
resultCapability
] )
The abstract operation PerformPromiseThen takes arguments
promise
(a Promise),
onFulfilled
(an
ECMAScript language value
), and
onRejected
(an
ECMAScript language value
) and optional argument
resultCapability
(a
PromiseCapability Record
) and returns an
ECMAScript language value
. It performs the “then” operation on
promise
using
onFulfilled
and
onRejected
as its settlement actions. If
resultCapability
is passed, the result is stored by updating
resultCapability
's
promise. If it is not passed, then PerformPromiseThen is being called
by a specification-internal operation where the result does not matter.
It performs the following steps when called:
1.
Assert
IsPromise
promise
) is
true
2.
If
resultCapability
is not present, then
a.
Set
resultCapability
to
undefined
3.
If
IsCallable
onFulfilled
) is
false
, then
a.
Let
onFulfilledJobCallback
be
empty
4.
Else,
a.
Let
onFulfilledJobCallback
be
HostMakeJobCallback
onFulfilled
).
5.
If
IsCallable
onRejected
) is
false
, then
a.
Let
onRejectedJobCallback
be
empty
6.
Else,
a.
Let
onRejectedJobCallback
be
HostMakeJobCallback
onRejected
).
7.
Let
fulfillReaction
be the PromiseReaction { [[Capability]]:
resultCapability
, [[Type]]:
Fulfill
, [[Handler]]:
onFulfilledJobCallback
}.
8.
Let
rejectReaction
be the PromiseReaction { [[Capability]]:
resultCapability
, [[Type]]:
Reject
, [[Handler]]:
onRejectedJobCallback
}.
9.
If
promise
.[[PromiseState]] is
pending
, then
a.
Append
fulfillReaction
to
promise
.[[PromiseFulfillReactions]].
b.
Append
rejectReaction
to
promise
.[[PromiseRejectReactions]].
10.
Else if
promise
.[[PromiseState]] is
fulfilled
, then
a.
Let
value
be
promise
.[[PromiseResult]].
b.
Let
fulfillJob
be
NewPromiseReactionJob
fulfillReaction
value
).
c.
Perform
HostEnqueuePromiseJob
fulfillJob
.[[Job]],
fulfillJob
.[[Realm]]).
11.
Else,
a.
Assert
: The value of
promise
.[[PromiseState]] is
rejected
b.
Let
reason
be
promise
.[[PromiseResult]].
c.
If
promise
.[[PromiseIsHandled]] is
false
, perform
HostPromiseRejectionTracker
promise
"handle"
).
d.
Let
rejectJob
be
NewPromiseReactionJob
rejectReaction
reason
).
e.
Perform
HostEnqueuePromiseJob
rejectJob
.[[Job]],
rejectJob
.[[Realm]]).
12.
Set
promise
.[[PromiseIsHandled]] to
true
13.
If
resultCapability
is
undefined
, then
a.
Return
undefined
14.
Else,
a.
Return
resultCapability
.[[Promise]].
27.2.5.5
Promise.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Promise"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.2.6
Properties of Promise Instances
Promise instances are
ordinary objects
that inherit properties from the
Promise prototype object
(the intrinsic,
%Promise.prototype%
). Promise instances are initially created with the internal slots described in
Table 81
Table 81: Internal Slots of Promise Instances
Internal Slot
Type
Description
[[PromiseState]]
pending
fulfilled
, or
rejected
Governs how a promise will react to incoming calls to its
then
method.
[[PromiseResult]]
an
ECMAScript language value
The value with which the promise has been fulfilled or
rejected, if any. Only meaningful if [[PromiseState]] is not
pending
[[PromiseFulfillReactions]]
List
of PromiseReaction
Records
Records
to be processed when/if the promise transitions from the
pending
state to the
fulfilled
state.
[[PromiseRejectReactions]]
List
of PromiseReaction
Records
Records
to be processed when/if the promise transitions from the
pending
state to the
rejected
state.
[[PromiseIsHandled]]
a Boolean
Indicates whether the promise has ever had a fulfillment
or rejection handler; used in unhandled rejection tracking.
27.3
GeneratorFunction Objects
GeneratorFunctions are functions that are usually created by evaluating
GeneratorDeclaration
s,
GeneratorExpression
s, and
GeneratorMethod
s. They may also be created by calling the
%GeneratorFunction%
intrinsic.
Figure 6 (Informative): Generator Objects Relationships
27.3.1
The GeneratorFunction Constructor
The GeneratorFunction
constructor
is
%GeneratorFunction%
is a subclass of
Function
creates and initializes a new GeneratorFunction when called as a function rather than as a
constructor
. Thus the function call
GeneratorFunction (…)
is equivalent to the object creation expression
new GeneratorFunction (…)
with the same arguments.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified GeneratorFunction behaviour must include a
super
call to the GeneratorFunction
constructor
to create and initialize subclass instances with the internal slots
necessary for built-in GeneratorFunction behaviour. All ECMAScript
syntactic forms for defining generator
function objects
create direct instances of GeneratorFunction. There is no syntactic means to create instances of GeneratorFunction subclasses.
27.3.1.1
GeneratorFunction ( ...
parameterArgs
bodyArg
The last argument (if any) specifies the body (executable
code) of a generator function; any preceding arguments specify formal
parameters.
This function performs the following steps when called:
1.
Let
be the
active function object
2.
If
bodyArg
is not present, set
bodyArg
to the empty String.
3.
Return ?
CreateDynamicFunction
, NewTarget,
generator
parameterArgs
bodyArg
).
Note
See NOTE for
20.2.1.1
27.3.2
Properties of the GeneratorFunction Constructor
The GeneratorFunction
constructor
is a standard built-in
function object
that inherits from the Function
constructor
has a [[Prototype]] internal slot whose value is
%Function%
has a
"name"
property whose value is
"GeneratorFunction"
has the following properties:
27.3.2.1
GeneratorFunction.length
This is a
data property
with a value of 1. This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.3.2.2
GeneratorFunction.prototype
The initial value of
GeneratorFunction.prototype
is the
GeneratorFunction prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
27.3.3
Properties of the GeneratorFunction Prototype Object
The
GeneratorFunction prototype object
is
%GeneratorFunction.prototype%
(see
Figure 6
).
is an
ordinary object
is not a
function object
and does not have an [[ECMAScriptCode]] internal slot or any other of the internal slots listed in
Table 30
or
Table 82
has a [[Prototype]] internal slot whose value is
%Function.prototype%
27.3.3.1
GeneratorFunction.prototype.constructor
The initial value of
GeneratorFunction.prototype.constructor
is
%GeneratorFunction%
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.3.3.2
GeneratorFunction.prototype.prototype
The initial value of
GeneratorFunction.prototype.prototype
is the
Generator prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.3.3.3
GeneratorFunction.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"GeneratorFunction"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.3.4
GeneratorFunction Instances
Every GeneratorFunction instance is an ECMAScript
function object
and has the internal slots listed in
Table 30
. The value of the [[IsClassConstructor]] internal slot for all such instances is
false
Each GeneratorFunction instance has the following own properties:
27.3.4.1
length
The specification for the
"length"
property of Function instances given in
20.2.4.1
also applies to GeneratorFunction instances.
27.3.4.2
name
The specification for the
"name"
property of Function instances given in
20.2.4.2
also applies to GeneratorFunction instances.
27.3.4.3
prototype
Whenever a GeneratorFunction instance is created another
ordinary object
is also created and is the initial value of the generator function's
"prototype"
property. The value of the prototype property is used to initialize the
[[Prototype]] internal slot of a newly created Generator when the
generator
function object
is invoked using [[Call]].
This property has the attributes { [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
Note
Unlike Function instances, the object that is the value of a GeneratorFunction's
"prototype"
property does not have a
"constructor"
property whose value is the GeneratorFunction instance.
27.4
AsyncGeneratorFunction Objects
AsyncGeneratorFunctions are functions that are usually created by evaluating
AsyncGeneratorDeclaration
AsyncGeneratorExpression
, and
AsyncGeneratorMethod
syntactic productions. They may also be created by calling the
%AsyncGeneratorFunction%
intrinsic.
27.4.1
The AsyncGeneratorFunction Constructor
The AsyncGeneratorFunction
constructor
is
%AsyncGeneratorFunction%
is a subclass of
Function
creates and initializes a new AsyncGeneratorFunction when called as a function rather than as a
constructor
. Thus the function call
AsyncGeneratorFunction (...)
is equivalent to the object creation expression
new AsyncGeneratorFunction (...)
with the same arguments.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified AsyncGeneratorFunction behaviour must include a
super
call to the AsyncGeneratorFunction
constructor
to create and initialize subclass instances with the internal slots
necessary for built-in AsyncGeneratorFunction behaviour. All ECMAScript
syntactic forms for defining async generator
function objects
create direct instances of AsyncGeneratorFunction. There is no
syntactic means to create instances of AsyncGeneratorFunction
subclasses.
27.4.1.1
AsyncGeneratorFunction ( ...
parameterArgs
bodyArg
The last argument (if any) specifies the body (executable
code) of an async generator function; any preceding arguments specify
formal parameters.
This function performs the following steps when called:
1.
Let
be the
active function object
2.
If
bodyArg
is not present, set
bodyArg
to the empty String.
3.
Return ?
CreateDynamicFunction
, NewTarget,
asyncGenerator
parameterArgs
bodyArg
).
Note
See NOTE for
20.2.1.1
27.4.2
Properties of the AsyncGeneratorFunction Constructor
The AsyncGeneratorFunction
constructor
is a standard built-in
function object
that inherits from the Function
constructor
has a [[Prototype]] internal slot whose value is
%Function%
has a
"name"
property whose value is
"AsyncGeneratorFunction"
has the following properties:
27.4.2.1
AsyncGeneratorFunction.length
This is a
data property
with a value of 1. This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.4.2.2
AsyncGeneratorFunction.prototype
The initial value of
AsyncGeneratorFunction.prototype
is the
AsyncGeneratorFunction prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
27.4.3
Properties of the AsyncGeneratorFunction Prototype Object
The
AsyncGeneratorFunction prototype object
is
%AsyncGeneratorFunction.prototype%
is an
ordinary object
is not a
function object
and does not have an [[ECMAScriptCode]] internal slot or any other of the internal slots listed in
Table 30
or
Table 83
has a [[Prototype]] internal slot whose value is
%Function.prototype%
27.4.3.1
AsyncGeneratorFunction.prototype.constructor
The initial value of
AsyncGeneratorFunction.prototype.constructor
is
%AsyncGeneratorFunction%
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.4.3.2
AsyncGeneratorFunction.prototype.prototype
The initial value of
AsyncGeneratorFunction.prototype.prototype
is the
AsyncGenerator prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.4.3.3
AsyncGeneratorFunction.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"AsyncGeneratorFunction"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.4.4
AsyncGeneratorFunction Instances
Every AsyncGeneratorFunction instance is an ECMAScript
function object
and has the internal slots listed in
Table 30
. The value of the [[IsClassConstructor]] internal slot for all such instances is
false
Each AsyncGeneratorFunction instance has the following own properties:
27.4.4.1
length
The value of the
"length"
property is an
integral Number
that indicates the typical number of arguments expected by the
AsyncGeneratorFunction. However, the language permits the function to be
invoked with some other number of arguments. The behaviour of an
AsyncGeneratorFunction when invoked on a number of arguments other than
the number specified by its
"length"
property depends on the function.
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.4.4.2
name
The specification for the
"name"
property of Function instances given in
20.2.4.2
also applies to AsyncGeneratorFunction instances.
27.4.4.3
prototype
Whenever an AsyncGeneratorFunction instance is created, another
ordinary object
is also created and is the initial value of the async generator function's
"prototype"
property. The value of the prototype property is used to initialize the
[[Prototype]] internal slot of a newly created AsyncGenerator when the
generator
function object
is invoked using [[Call]].
This property has the attributes { [[Writable]]:
true
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
Note
Unlike function instances, the object that is the value of an AsyncGeneratorFunction's
"prototype"
property does not have a
"constructor"
property whose value is the AsyncGeneratorFunction instance.
27.5
Generator Objects
A Generator is an instance of a generator function and conforms to both the
Iterator
and
Iterable
interfaces.
Generator instances directly inherit properties from the object that is the initial value of the
"prototype"
property of the Generator function that created the instance. Generator
instances indirectly inherit properties from the Generator Prototype
intrinsic,
%GeneratorFunction.prototype.prototype%
27.5.1
Properties of the Generator Prototype Object
The
Generator prototype object
is
%GeneratorFunction.prototype.prototype%
is an
ordinary object
is not a Generator instance and does not have a [[GeneratorState]] internal slot.
has a [[Prototype]] internal slot whose value is
%IteratorPrototype%
has properties that are indirectly inherited by all Generator instances.
27.5.1.1
Generator.prototype.constructor
The initial value of
Generator.prototype.constructor
is
%GeneratorFunction.prototype%
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.5.1.2
Generator.prototype.next (
value
1.
Return ?
GeneratorResume
this
value,
value
empty
).
27.5.1.3
Generator.prototype.return (
value
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Let
be
Completion Record
{ [[Type]]:
return
, [[Value]]:
value
, [[Target]]:
empty
}.
3.
Return ?
GeneratorResumeAbrupt
empty
).
27.5.1.4
Generator.prototype.throw (
exception
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Let
be
ThrowCompletion
exception
).
3.
Return ?
GeneratorResumeAbrupt
empty
).
27.5.1.5
Generator.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Generator"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.5.2
Properties of Generator Instances
Generator instances are initially created with the internal slots described in
Table 82
Table 82: Internal Slots of Generator Instances
Internal Slot
Type
Description
[[GeneratorState]]
undefined
suspendedStart
suspendedYield
executing
, or
completed
The current execution state of the generator.
[[GeneratorContext]]
an
execution context
The
execution context
that is used when executing the code of this generator.
[[GeneratorBrand]]
a String or
empty
A brand used to distinguish different kinds of generators. The [[GeneratorBrand]] of generators declared by
ECMAScript source text
is always
empty
27.5.3
Generator Abstract Operations
27.5.3.1
GeneratorStart (
generator
generatorBody
The abstract operation GeneratorStart takes arguments
generator
(a Generator) and
generatorBody
(a
FunctionBody
Parse Node
or an
Abstract Closure
with no parameters) and returns
unused
. It performs the following steps when called:
1.
Assert
: The value of
generator
.[[GeneratorState]] is
undefined
2.
Let
genContext
be the
running execution context
3.
Set the Generator component of
genContext
to
generator
4.
Let
closure
be a new
Abstract Closure
with no parameters that captures
generatorBody
and performs the following steps when called:
a.
Let
acGenContext
be the
running execution context
b.
Let
acGenerator
be the Generator component of
acGenContext
c.
If
generatorBody
is a
Parse Node
, then
i.
Let
result
be
Completion
Evaluation
of
generatorBody
).
d.
Else,
i.
Assert
generatorBody
is an
Abstract Closure
with no parameters.
ii.
Let
result
be
generatorBody
().
e.
Assert
: If we return here, the generator either threw an exception or performed either an implicit or explicit return.
f.
Remove
acGenContext
from the
execution context stack
and restore the
execution context
that is at the top of the
execution context stack
as the
running execution context
g.
Set
acGenerator
.[[GeneratorState]] to
completed
h.
NOTE: Once a generator enters the
completed
state it never leaves it and its associated
execution context
is never resumed. Any execution state associated with
acGenerator
can be discarded at this point.
i.
If
result
.[[Type]] is
normal
, let
resultValue
be
undefined
j.
Else if
result
.[[Type]] is
return
, let
resultValue
be
result
.[[Value]].
k.
Else,
i.
Assert
result
.[[Type]] is
throw
ii.
Return ?
result
l.
Return
CreateIterResultObject
resultValue
true
).
5.
Set the code evaluation state of
genContext
such that when evaluation is resumed for that
execution context
closure
will be called with no arguments.
6.
Set
generator
.[[GeneratorContext]] to
genContext
7.
Set
generator
.[[GeneratorState]] to
suspendedStart
8.
Return
unused
27.5.3.2
GeneratorValidate (
generator
generatorBrand
The abstract operation GeneratorValidate takes arguments
generator
(an
ECMAScript language value
) and
generatorBrand
(a String or
empty
) and returns either a
normal completion containing
one of
suspendedStart
suspendedYield
, or
completed
, or a
throw completion
. It performs the following steps when called:
1.
Perform ?
RequireInternalSlot
generator
, [[GeneratorState]]).
2.
Perform ?
RequireInternalSlot
generator
, [[GeneratorBrand]]).
3.
If
generator
.[[GeneratorBrand]] is not
generatorBrand
, throw a
TypeError
exception.
4.
Assert
generator
also has a [[GeneratorContext]] internal slot.
5.
Let
state
be
generator
.[[GeneratorState]].
6.
If
state
is
executing
, throw a
TypeError
exception.
7.
Return
state
27.5.3.3
GeneratorResume (
generator
value
generatorBrand
The abstract operation GeneratorResume takes arguments
generator
(an
ECMAScript language value
),
value
(an
ECMAScript language value
or
empty
), and
generatorBrand
(a String or
empty
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
state
be ?
GeneratorValidate
generator
generatorBrand
).
2.
If
state
is
completed
, return
CreateIterResultObject
undefined
true
).
3.
Assert
state
is either
suspendedStart
or
suspendedYield
4.
Let
genContext
be
generator
.[[GeneratorContext]].
5.
Let
methodContext
be the
running execution context
6.
Suspend
methodContext
7.
Set
generator
.[[GeneratorState]] to
executing
8.
Push
genContext
onto the
execution context stack
genContext
is now the
running execution context
9.
Resume the suspended evaluation of
genContext
using
NormalCompletion
value
) as the result of the operation that suspended it. Let
result
be the value returned by the resumed computation.
10.
Assert
: When we return here,
genContext
has already been removed from the
execution context stack
and
methodContext
is the currently
running execution context
11.
Return ?
result
27.5.3.4
GeneratorResumeAbrupt (
generator
abruptCompletion
generatorBrand
The abstract operation GeneratorResumeAbrupt takes arguments
generator
(an
ECMAScript language value
),
abruptCompletion
(a
return completion
or a
throw completion
), and
generatorBrand
(a String or
empty
) and returns either a
normal completion containing
an
ECMAScript language value
or a
throw completion
. It performs the following steps when called:
1.
Let
state
be ?
GeneratorValidate
generator
generatorBrand
).
2.
If
state
is
suspendedStart
, then
a.
Set
generator
.[[GeneratorState]] to
completed
b.
NOTE: Once a generator enters the
completed
state it never leaves it and its associated
execution context
is never resumed. Any execution state associated with
generator
can be discarded at this point.
c.
Set
state
to
completed
3.
If
state
is
completed
, then
a.
If
abruptCompletion
.[[Type]] is
return
, then
i.
Return
CreateIterResultObject
abruptCompletion
.[[Value]],
true
).
b.
Return ?
abruptCompletion
4.
Assert
state
is
suspendedYield
5.
Let
genContext
be
generator
.[[GeneratorContext]].
6.
Let
methodContext
be the
running execution context
7.
Suspend
methodContext
8.
Set
generator
.[[GeneratorState]] to
executing
9.
Push
genContext
onto the
execution context stack
genContext
is now the
running execution context
10.
Resume the suspended evaluation of
genContext
using
abruptCompletion
as the result of the operation that suspended it. Let
result
be the
Completion Record
returned by the resumed computation.
11.
Assert
: When we return here,
genContext
has already been removed from the
execution context stack
and
methodContext
is the currently
running execution context
12.
Return ?
result
27.5.3.5
GetGeneratorKind ( )
The abstract operation GetGeneratorKind takes no arguments and returns
non-generator
sync
, or
async
. It performs the following steps when called:
1.
Let
genContext
be the
running execution context
2.
If
genContext
does not have a Generator component, return
non-generator
3.
Let
generator
be the Generator component of
genContext
4.
If
generator
has an [[AsyncGeneratorState]] internal slot, return
async
5.
Else, return
sync
27.5.3.6
GeneratorYield (
iterNextObj
The abstract operation GeneratorYield takes argument
iterNextObj
(an Object that conforms to the
IteratorResult
interface) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
Let
genContext
be the
running execution context
2.
Assert
genContext
is the
execution context
of a generator.
3.
Let
generator
be the value of the Generator component of
genContext
4.
Assert
GetGeneratorKind
() is
sync
5.
Set
generator
.[[GeneratorState]] to
suspendedYield
6.
Remove
genContext
from the
execution context stack
and restore the
execution context
that is at the top of the
execution context stack
as the
running execution context
7.
Let
callerContext
be the
running execution context
8.
Resume
callerContext
passing
NormalCompletion
iterNextObj
). If
genContext
is ever resumed again, let
resumptionValue
be the
Completion Record
with which it is resumed.
9.
Assert
: If control reaches here, then
genContext
is the
running execution context
again.
10.
Return
resumptionValue
27.5.3.7
Yield (
value
The abstract operation Yield takes argument
value
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
Let
generatorKind
be
GetGeneratorKind
().
2.
If
generatorKind
is
async
, return ?
AsyncGeneratorYield
(?
Await
value
)).
3.
Otherwise, return ?
GeneratorYield
CreateIterResultObject
value
false
)).
27.5.3.8
CreateIteratorFromClosure (
closure
generatorBrand
generatorPrototype
The abstract operation CreateIteratorFromClosure takes arguments
closure
(an
Abstract Closure
with no parameters),
generatorBrand
(a String or
empty
), and
generatorPrototype
(an Object) and returns a Generator. It performs the following steps when called:
1.
NOTE:
closure
can contain uses of the
Yield
operation to yield an IteratorResult object.
2.
Let
internalSlotsList
be « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] ».
3.
Let
generator
be
OrdinaryObjectCreate
generatorPrototype
internalSlotsList
).
4.
Set
generator
.[[GeneratorBrand]] to
generatorBrand
5.
Set
generator
.[[GeneratorState]] to
undefined
6.
Let
callerContext
be the
running execution context
7.
Let
calleeContext
be a new
execution context
8.
Set the Function of
calleeContext
to
null
9.
Set the
Realm
of
calleeContext
to
the current Realm Record
10.
Set the ScriptOrModule of
calleeContext
to
callerContext
's ScriptOrModule.
11.
If
callerContext
is not already suspended, suspend
callerContext
12.
Push
calleeContext
onto the
execution context stack
calleeContext
is now the
running execution context
13.
Perform
GeneratorStart
generator
closure
).
14.
Remove
calleeContext
from the
execution context stack
and restore
callerContext
as the
running execution context
15.
Return
generator
27.6
AsyncGenerator Objects
An AsyncGenerator is an instance of an async generator function
and conforms to both the AsyncIterator and AsyncIterable interfaces.
AsyncGenerator instances directly inherit properties from the object that is the initial value of the
"prototype"
property of the AsyncGenerator function that created the instance.
AsyncGenerator instances indirectly inherit properties from the
AsyncGenerator Prototype intrinsic,
%AsyncGeneratorFunction.prototype.prototype%
27.6.1
Properties of the AsyncGenerator Prototype Object
The
AsyncGenerator prototype object
is
%AsyncGeneratorFunction.prototype.prototype%
is an
ordinary object
is not an AsyncGenerator instance and does not have an [[AsyncGeneratorState]] internal slot.
has a [[Prototype]] internal slot whose value is
%AsyncIteratorPrototype%
has properties that are indirectly inherited by all AsyncGenerator instances.
27.6.1.1
AsyncGenerator.prototype.constructor
The initial value of
AsyncGenerator.prototype.constructor
is
%AsyncGeneratorFunction.prototype%
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.6.1.2
AsyncGenerator.prototype.next (
value
1.
Let
generator
be the
this
value.
2.
Let
promiseCapability
be !
NewPromiseCapability
%Promise%
).
3.
Let
result
be
Completion
AsyncGeneratorValidate
generator
empty
)).
4.
IfAbruptRejectPromise
result
promiseCapability
).
5.
Let
state
be
generator
.[[AsyncGeneratorState]].
6.
If
state
is
completed
, then
a.
Let
iteratorResult
be
CreateIterResultObject
undefined
true
).
b.
Perform !
Call
promiseCapability
.[[Resolve]],
undefined
, «
iteratorResult
»).
c.
Return
promiseCapability
.[[Promise]].
7.
Let
completion
be
NormalCompletion
value
).
8.
Perform
AsyncGeneratorEnqueue
generator
completion
promiseCapability
).
9.
If
state
is either
suspendedStart
or
suspendedYield
, then
a.
Perform
AsyncGeneratorResume
generator
completion
).
10.
Else,
a.
Assert
state
is either
executing
or
awaiting-return
11.
Return
promiseCapability
.[[Promise]].
27.6.1.3
AsyncGenerator.prototype.return (
value
1.
Let
generator
be the
this
value.
2.
Let
promiseCapability
be !
NewPromiseCapability
%Promise%
).
3.
Let
result
be
Completion
AsyncGeneratorValidate
generator
empty
)).
4.
IfAbruptRejectPromise
result
promiseCapability
).
5.
Let
completion
be
Completion Record
{ [[Type]]:
return
, [[Value]]:
value
, [[Target]]:
empty
}.
6.
Perform
AsyncGeneratorEnqueue
generator
completion
promiseCapability
).
7.
Let
state
be
generator
.[[AsyncGeneratorState]].
8.
If
state
is either
suspendedStart
or
completed
, then
a.
Set
generator
.[[AsyncGeneratorState]] to
awaiting-return
b.
Perform !
AsyncGeneratorAwaitReturn
generator
).
9.
Else if
state
is
suspendedYield
, then
a.
Perform
AsyncGeneratorResume
generator
completion
).
10.
Else,
a.
Assert
state
is either
executing
or
awaiting-return
11.
Return
promiseCapability
.[[Promise]].
27.6.1.4
AsyncGenerator.prototype.throw (
exception
1.
Let
generator
be the
this
value.
2.
Let
promiseCapability
be !
NewPromiseCapability
%Promise%
).
3.
Let
result
be
Completion
AsyncGeneratorValidate
generator
empty
)).
4.
IfAbruptRejectPromise
result
promiseCapability
).
5.
Let
state
be
generator
.[[AsyncGeneratorState]].
6.
If
state
is
suspendedStart
, then
a.
Set
generator
.[[AsyncGeneratorState]] to
completed
b.
Set
state
to
completed
7.
If
state
is
completed
, then
a.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, «
exception
»).
b.
Return
promiseCapability
.[[Promise]].
8.
Let
completion
be
ThrowCompletion
exception
).
9.
Perform
AsyncGeneratorEnqueue
generator
completion
promiseCapability
).
10.
If
state
is
suspendedYield
, then
a.
Perform
AsyncGeneratorResume
generator
completion
).
11.
Else,
a.
Assert
state
is either
executing
or
awaiting-return
12.
Return
promiseCapability
.[[Promise]].
27.6.1.5
AsyncGenerator.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"AsyncGenerator"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.6.2
Properties of AsyncGenerator Instances
AsyncGenerator instances are initially created with the internal slots described below:
Table 83: Internal Slots of AsyncGenerator Instances
Internal Slot
Type
Description
[[AsyncGeneratorState]]
undefined
suspendedStart
suspendedYield
executing
awaiting-return
, or
completed
The current execution state of the async generator.
[[AsyncGeneratorContext]]
an
execution context
The
execution context
that is used when executing the code of this async generator.
[[AsyncGeneratorQueue]]
List
of
AsyncGeneratorRequest
Records
Records
which represent requests to resume the async generator. Except during
state transitions, it is non-empty if and only if
[[AsyncGeneratorState]] is either
executing
or
awaiting-return
[[GeneratorBrand]]
a String or
empty
A brand used to distinguish different kinds of async generators. The [[GeneratorBrand]] of async generators declared by
ECMAScript source text
is always
empty
27.6.3
AsyncGenerator Abstract Operations
27.6.3.1
AsyncGeneratorRequest Records
An
AsyncGeneratorRequest
is a
Record
value used to store information about how an async generator should be
resumed and contains capabilities for fulfilling or rejecting the
corresponding promise.
They have the following fields:
Table 84: AsyncGeneratorRequest
Record
Fields
Field Name
Value
Meaning
[[Completion]]
Completion Record
The
Completion Record
which should be used to resume the async generator.
[[Capability]]
PromiseCapability Record
The promise capabilities associated with this request.
27.6.3.2
AsyncGeneratorStart (
generator
generatorBody
The abstract operation AsyncGeneratorStart takes arguments
generator
(an AsyncGenerator) and
generatorBody
(a
FunctionBody
Parse Node
or an
Abstract Closure
with no parameters) and returns
unused
. It performs the following steps when called:
1.
Assert
generator
.[[AsyncGeneratorState]] is
undefined
2.
Let
genContext
be the
running execution context
3.
Set the Generator component of
genContext
to
generator
4.
Let
closure
be a new
Abstract Closure
with no parameters that captures
generatorBody
and performs the following steps when called:
a.
Let
acGenContext
be the
running execution context
b.
Let
acGenerator
be the Generator component of
acGenContext
c.
If
generatorBody
is a
Parse Node
, then
i.
Let
result
be
Completion
Evaluation
of
generatorBody
).
d.
Else,
i.
Assert
generatorBody
is an
Abstract Closure
with no parameters.
ii.
Let
result
be
Completion
generatorBody
()).
e.
Assert
: If we return here, the async generator either threw an exception or performed either an implicit or explicit return.
f.
Remove
acGenContext
from the
execution context stack
and restore the
execution context
that is at the top of the
execution context stack
as the
running execution context
g.
Set
acGenerator
.[[AsyncGeneratorState]] to
completed
h.
If
result
.[[Type]] is
normal
, set
result
to
NormalCompletion
undefined
).
i.
If
result
.[[Type]] is
return
, set
result
to
NormalCompletion
result
.[[Value]]).
j.
Perform
AsyncGeneratorCompleteStep
acGenerator
result
true
).
k.
Perform
AsyncGeneratorDrainQueue
acGenerator
).
l.
Return
undefined
5.
Set the code evaluation state of
genContext
such that when evaluation is resumed for that
execution context
closure
will be called with no arguments.
6.
Set
generator
.[[AsyncGeneratorContext]] to
genContext
7.
Set
generator
.[[AsyncGeneratorState]] to
suspendedStart
8.
Set
generator
.[[AsyncGeneratorQueue]] to a new empty
List
9.
Return
unused
27.6.3.3
AsyncGeneratorValidate (
generator
generatorBrand
The abstract operation AsyncGeneratorValidate takes arguments
generator
(an
ECMAScript language value
) and
generatorBrand
(a String or
empty
) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Perform ?
RequireInternalSlot
generator
, [[AsyncGeneratorContext]]).
2.
Perform ?
RequireInternalSlot
generator
, [[AsyncGeneratorState]]).
3.
Perform ?
RequireInternalSlot
generator
, [[AsyncGeneratorQueue]]).
4.
If
generator
.[[GeneratorBrand]] is not
generatorBrand
, throw a
TypeError
exception.
5.
Return
unused
27.6.3.4
AsyncGeneratorEnqueue (
generator
completion
promiseCapability
The abstract operation AsyncGeneratorEnqueue takes arguments
generator
(an AsyncGenerator),
completion
(a
Completion Record
), and
promiseCapability
(a
PromiseCapability Record
) and returns
unused
. It performs the following steps when called:
1.
Let
request
be
AsyncGeneratorRequest
{ [[Completion]]:
completion
, [[Capability]]:
promiseCapability
}.
2.
Append
request
to
generator
.[[AsyncGeneratorQueue]].
3.
Return
unused
27.6.3.5
AsyncGeneratorCompleteStep (
generator
completion
done
[ ,
realm
] )
The abstract operation AsyncGeneratorCompleteStep takes arguments
generator
(an AsyncGenerator),
completion
(a
Completion Record
), and
done
(a Boolean) and optional argument
realm
(a
Realm Record
) and returns
unused
. It performs the following steps when called:
1.
Assert
generator
.[[AsyncGeneratorQueue]] is not empty.
2.
Let
next
be the first element of
generator
.[[AsyncGeneratorQueue]].
3.
Remove the first element from
generator
.[[AsyncGeneratorQueue]].
4.
Let
promiseCapability
be
next
.[[Capability]].
5.
Let
value
be
completion
.[[Value]].
6.
If
completion
.[[Type]] is
throw
, then
a.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, «
value
»).
7.
Else,
a.
Assert
completion
.[[Type]] is
normal
b.
If
realm
is present, then
i.
Let
oldRealm
be the
running execution context
's
Realm
ii.
Set the
running execution context
's
Realm
to
realm
iii.
Let
iteratorResult
be
CreateIterResultObject
value
done
).
iv.
Set the
running execution context
's
Realm
to
oldRealm
c.
Else,
i.
Let
iteratorResult
be
CreateIterResultObject
value
done
).
d.
Perform !
Call
promiseCapability
.[[Resolve]],
undefined
, «
iteratorResult
»).
8.
Return
unused
27.6.3.6
AsyncGeneratorResume (
generator
completion
The abstract operation AsyncGeneratorResume takes arguments
generator
(an AsyncGenerator) and
completion
(a
Completion Record
) and returns
unused
. It performs the following steps when called:
1.
Assert
generator
.[[AsyncGeneratorState]] is either
suspendedStart
or
suspendedYield
2.
Let
genContext
be
generator
.[[AsyncGeneratorContext]].
3.
Let
callerContext
be the
running execution context
4.
Suspend
callerContext
5.
Set
generator
.[[AsyncGeneratorState]] to
executing
6.
Push
genContext
onto the
execution context stack
genContext
is now the
running execution context
7.
Resume the suspended evaluation of
genContext
using
completion
as the result of the operation that suspended it. Let
result
be the
Completion Record
returned by the resumed computation.
8.
Assert
result
is never an
abrupt completion
9.
Assert
: When we return here,
genContext
has already been removed from the
execution context stack
and
callerContext
is the currently
running execution context
10.
Return
unused
27.6.3.7
AsyncGeneratorUnwrapYieldResumption (
resumptionValue
The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument
resumptionValue
(a
Completion Record
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
If
resumptionValue
.[[Type]] is not
return
, return ?
resumptionValue
2.
Let
awaited
be
Completion
Await
resumptionValue
.[[Value]])).
3.
If
awaited
.[[Type]] is
throw
, return ?
awaited
4.
Assert
awaited
.[[Type]] is
normal
5.
Return
Completion Record
{ [[Type]]:
return
, [[Value]]:
awaited
.[[Value]], [[Target]]:
empty
}.
27.6.3.8
AsyncGeneratorYield (
value
The abstract operation AsyncGeneratorYield takes argument
value
(an
ECMAScript language value
) and returns either a
normal completion containing
an
ECMAScript language value
or an
abrupt completion
. It performs the following steps when called:
1.
Let
genContext
be the
running execution context
2.
Assert
genContext
is the
execution context
of a generator.
3.
Let
generator
be the value of the Generator component of
genContext
4.
Assert
GetGeneratorKind
() is
async
5.
Let
completion
be
NormalCompletion
value
).
6.
Assert
: The
execution context stack
has at least two elements.
7.
Let
previousContext
be the second to top element of the
execution context stack
8.
Let
previousRealm
be
previousContext
's
Realm
9.
Perform
AsyncGeneratorCompleteStep
generator
completion
false
previousRealm
).
10.
Let
queue
be
generator
.[[AsyncGeneratorQueue]].
11.
If
queue
is not empty, then
a.
NOTE: Execution continues without suspending the generator.
b.
Let
toYield
be the first element of
queue
c.
Let
resumptionValue
be
Completion
toYield
.[[Completion]]).
d.
Return ?
AsyncGeneratorUnwrapYieldResumption
resumptionValue
).
12.
Else,
a.
Set
generator
.[[AsyncGeneratorState]] to
suspendedYield
b.
Remove
genContext
from the
execution context stack
and restore the
execution context
that is at the top of the
execution context stack
as the
running execution context
c.
Let
callerContext
be the
running execution context
d.
Resume
callerContext
passing
undefined
. If
genContext
is ever resumed again, let
resumptionValue
be the
Completion Record
with which it is resumed.
e.
Assert
: If control reaches here, then
genContext
is the
running execution context
again.
f.
Return ?
AsyncGeneratorUnwrapYieldResumption
resumptionValue
).
27.6.3.9
AsyncGeneratorAwaitReturn (
generator
The abstract operation AsyncGeneratorAwaitReturn takes argument
generator
(an AsyncGenerator) and returns either a
normal completion containing
unused
or a
throw completion
. It performs the following steps when called:
1.
Let
queue
be
generator
.[[AsyncGeneratorQueue]].
2.
Assert
queue
is not empty.
3.
Let
next
be the first element of
queue
4.
Let
completion
be
Completion
next
.[[Completion]]).
5.
Assert
completion
.[[Type]] is
return
6.
Let
promise
be ?
PromiseResolve
%Promise%
completion
.[[Value]]).
7.
Let
fulfilledClosure
be a new
Abstract Closure
with parameters (
value
) that captures
generator
and performs the following steps when called:
a.
Set
generator
.[[AsyncGeneratorState]] to
completed
b.
Let
result
be
NormalCompletion
value
).
c.
Perform
AsyncGeneratorCompleteStep
generator
result
true
).
d.
Perform
AsyncGeneratorDrainQueue
generator
).
e.
Return
undefined
8.
Let
onFulfilled
be
CreateBuiltinFunction
fulfilledClosure
, 1,
""
, « »).
9.
Let
rejectedClosure
be a new
Abstract Closure
with parameters (
reason
) that captures
generator
and performs the following steps when called:
a.
Set
generator
.[[AsyncGeneratorState]] to
completed
b.
Let
result
be
ThrowCompletion
reason
).
c.
Perform
AsyncGeneratorCompleteStep
generator
result
true
).
d.
Perform
AsyncGeneratorDrainQueue
generator
).
e.
Return
undefined
10.
Let
onRejected
be
CreateBuiltinFunction
rejectedClosure
, 1,
""
, « »).
11.
Perform
PerformPromiseThen
promise
onFulfilled
onRejected
).
12.
Return
unused
27.6.3.10
AsyncGeneratorDrainQueue (
generator
The abstract operation AsyncGeneratorDrainQueue takes argument
generator
(an AsyncGenerator) and returns
unused
. It drains the generator's AsyncGeneratorQueue until it encounters an
AsyncGeneratorRequest
which holds a
return completion
. It performs the following steps when called:
1.
Assert
generator
.[[AsyncGeneratorState]] is
completed
2.
Let
queue
be
generator
.[[AsyncGeneratorQueue]].
3.
If
queue
is empty, return
unused
4.
Let
done
be
false
5.
Repeat, while
done
is
false
a.
Let
next
be the first element of
queue
b.
Let
completion
be
Completion
next
.[[Completion]]).
c.
If
completion
.[[Type]] is
return
, then
i.
Set
generator
.[[AsyncGeneratorState]] to
awaiting-return
ii.
Perform !
AsyncGeneratorAwaitReturn
generator
).
iii.
Set
done
to
true
d.
Else,
i.
If
completion
.[[Type]] is
normal
, then
1.
Set
completion
to
NormalCompletion
undefined
).
ii.
Perform
AsyncGeneratorCompleteStep
generator
completion
true
).
iii.
If
queue
is empty, set
done
to
true
6.
Return
unused
27.6.3.11
CreateAsyncIteratorFromClosure (
closure
generatorBrand
generatorPrototype
The abstract operation CreateAsyncIteratorFromClosure takes arguments
closure
(an
Abstract Closure
with no parameters),
generatorBrand
(a String or
empty
), and
generatorPrototype
(an Object) and returns an AsyncGenerator. It performs the following steps when called:
1.
NOTE:
closure
can contain uses of the
Await
operation and uses of the
Yield
operation to yield an IteratorResult object.
2.
Let
internalSlotsList
be « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] ».
3.
Let
generator
be
OrdinaryObjectCreate
generatorPrototype
internalSlotsList
).
4.
Set
generator
.[[GeneratorBrand]] to
generatorBrand
5.
Set
generator
.[[AsyncGeneratorState]] to
undefined
6.
Let
callerContext
be the
running execution context
7.
Let
calleeContext
be a new
execution context
8.
Set the Function of
calleeContext
to
null
9.
Set the
Realm
of
calleeContext
to
the current Realm Record
10.
Set the ScriptOrModule of
calleeContext
to
callerContext
's ScriptOrModule.
11.
If
callerContext
is not already suspended, suspend
callerContext
12.
Push
calleeContext
onto the
execution context stack
calleeContext
is now the
running execution context
13.
Perform
AsyncGeneratorStart
generator
closure
).
14.
Remove
calleeContext
from the
execution context stack
and restore
callerContext
as the
running execution context
15.
Return
generator
27.7
AsyncFunction Objects
AsyncFunctions are functions that are usually created by evaluating
AsyncFunctionDeclaration
s,
AsyncFunctionExpression
s,
AsyncMethod
s, and
AsyncArrowFunction
s. They may also be created by calling the
%AsyncFunction%
intrinsic.
27.7.1
The AsyncFunction Constructor
The AsyncFunction
constructor
is
%AsyncFunction%
is a subclass of
Function
creates and initializes a new AsyncFunction when called as a function rather than as a
constructor
. Thus the function call
AsyncFunction(…)
is equivalent to the object creation expression
new AsyncFunction(…)
with the same arguments.
may be used as the value of an
extends
clause of a class definition. Subclass
constructors
that intend to inherit the specified AsyncFunction behaviour must include a
super
call to the AsyncFunction
constructor
to create and initialize a subclass instance with the internal slots
necessary for built-in async function behaviour. All ECMAScript
syntactic forms for defining async
function objects
create direct instances of AsyncFunction. There is no syntactic means to create instances of AsyncFunction subclasses.
27.7.1.1
AsyncFunction ( ...
parameterArgs
bodyArg
The last argument (if any) specifies the body (executable
code) of an async function. Any preceding arguments specify formal
parameters.
This function performs the following steps when called:
1.
Let
be the
active function object
2.
If
bodyArg
is not present, set
bodyArg
to the empty String.
3.
Return ?
CreateDynamicFunction
, NewTarget,
async
parameterArgs
bodyArg
).
Note
See NOTE for
20.2.1.1
27.7.2
Properties of the AsyncFunction Constructor
The AsyncFunction
constructor
is a standard built-in
function object
that inherits from the Function
constructor
has a [[Prototype]] internal slot whose value is
%Function%
has a
"name"
property whose value is
"AsyncFunction"
has the following properties:
27.7.2.1
AsyncFunction.length
This is a
data property
with a value of 1. This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.7.2.2
AsyncFunction.prototype
The initial value of
AsyncFunction.prototype
is the
AsyncFunction prototype object
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
27.7.3
Properties of the AsyncFunction Prototype Object
The
AsyncFunction prototype object
is
%AsyncFunction.prototype%
is an
ordinary object
is not a
function object
and does not have an [[ECMAScriptCode]] internal slot or any other of the internal slots listed in
Table 30
has a [[Prototype]] internal slot whose value is
%Function.prototype%
27.7.3.1
AsyncFunction.prototype.constructor
The initial value of
AsyncFunction.prototype.constructor
is
%AsyncFunction%
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.7.3.2
AsyncFunction.prototype [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"AsyncFunction"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
27.7.4
AsyncFunction Instances
Every AsyncFunction instance is an ECMAScript
function object
and has the internal slots listed in
Table 30
. The value of the [[IsClassConstructor]] internal slot for all such instances is
false
. AsyncFunction instances are not
constructors
and do not have a [[Construct]] internal method. AsyncFunction
instances do not have a prototype property as they are not
constructible.
Each AsyncFunction instance has the following own properties:
27.7.4.1
length
The specification for the
"length"
property of Function instances given in
20.2.4.1
also applies to AsyncFunction instances.
27.7.4.2
name
The specification for the
"name"
property of Function instances given in
20.2.4.2
also applies to AsyncFunction instances.
27.7.5
Async Functions Abstract Operations
27.7.5.1
AsyncFunctionStart (
promiseCapability
asyncFunctionBody
The abstract operation AsyncFunctionStart takes arguments
promiseCapability
(a
PromiseCapability Record
) and
asyncFunctionBody
(a
FunctionBody
Parse Node
or an
ExpressionBody
Parse Node
) and returns
unused
. It performs the following steps when called:
1.
Let
runningContext
be the
running execution context
2.
Let
asyncContext
be a copy of
runningContext
3.
NOTE: Copying the execution state is required for
AsyncBlockStart
to resume its execution. It is ill-defined to resume a currently executing context.
4.
Perform
AsyncBlockStart
promiseCapability
asyncFunctionBody
asyncContext
).
5.
Return
unused
27.7.5.2
AsyncBlockStart (
promiseCapability
asyncBody
asyncContext
The abstract operation AsyncBlockStart takes arguments
promiseCapability
(a
PromiseCapability Record
),
asyncBody
(a
Parse Node
), and
asyncContext
(an
execution context
) and returns
unused
. It performs the following steps when called:
1.
Assert
promiseCapability
is a
PromiseCapability Record
2.
Let
runningContext
be the
running execution context
3.
Let
closure
be a new
Abstract Closure
with no parameters that captures
promiseCapability
and
asyncBody
and performs the following steps when called:
a.
Let
acAsyncContext
be the
running execution context
b.
Let
result
be
Completion
Evaluation
of
asyncBody
).
c.
Assert
If we return here, the async function either threw an exception or
performed an implicit or explicit return; all awaiting is done.
d.
Remove
acAsyncContext
from the
execution context stack
and restore the
execution context
that is at the top of the
execution context stack
as the
running execution context
e.
If
result
.[[Type]] is
normal
, then
i.
Perform !
Call
promiseCapability
.[[Resolve]],
undefined
, «
undefined
»).
f.
Else if
result
.[[Type]] is
return
, then
i.
Perform !
Call
promiseCapability
.[[Resolve]],
undefined
, «
result
.[[Value]] »).
g.
Else,
i.
Assert
result
.[[Type]] is
throw
ii.
Perform !
Call
promiseCapability
.[[Reject]],
undefined
, «
result
.[[Value]] »).
h.
Return
unused
4.
Set the code evaluation state of
asyncContext
such that when evaluation is resumed for that
execution context
closure
will be called with no arguments.
5.
Push
asyncContext
onto the
execution context stack
asyncContext
is now the
running execution context
6.
Resume the suspended evaluation of
asyncContext
. Let
result
be the value returned by the resumed computation.
7.
Assert
: When we return here,
asyncContext
has already been removed from the
execution context stack
and
runningContext
is the currently
running execution context
8.
Assert
result
is a
normal completion
with a value of
unused
. The possible sources of this value are
Await
or, if the async function doesn't await anything, step
3.h
above.
9.
Return
unused
27.7.5.3
Await (
value
The abstract operation Await takes argument
value
(an
ECMAScript language value
) and returns either a
normal completion containing
either an
ECMAScript language value
or
empty
, or a
throw completion
. It performs the following steps when called:
1.
Let
asyncContext
be the
running execution context
2.
Let
promise
be ?
PromiseResolve
%Promise%
value
).
3.
Let
fulfilledClosure
be a new
Abstract Closure
with parameters (
) that captures
asyncContext
and performs the following steps when called:
a.
Let
prevContext
be the
running execution context
b.
Suspend
prevContext
c.
Push
asyncContext
onto the
execution context stack
asyncContext
is now the
running execution context
d.
Resume the suspended evaluation of
asyncContext
using
NormalCompletion
) as the result of the operation that suspended it.
e.
Assert
: When we reach this step,
asyncContext
has already been removed from the
execution context stack
and
prevContext
is the currently
running execution context
f.
Return
undefined
4.
Let
onFulfilled
be
CreateBuiltinFunction
fulfilledClosure
, 1,
""
, « »).
5.
Let
rejectedClosure
be a new
Abstract Closure
with parameters (
reason
) that captures
asyncContext
and performs the following steps when called:
a.
Let
prevContext
be the
running execution context
b.
Suspend
prevContext
c.
Push
asyncContext
onto the
execution context stack
asyncContext
is now the
running execution context
d.
Resume the suspended evaluation of
asyncContext
using
ThrowCompletion
reason
) as the result of the operation that suspended it.
e.
Assert
: When we reach this step,
asyncContext
has already been removed from the
execution context stack
and
prevContext
is the currently
running execution context
f.
Return
undefined
6.
Let
onRejected
be
CreateBuiltinFunction
rejectedClosure
, 1,
""
, « »).
7.
Perform
PerformPromiseThen
promise
onFulfilled
onRejected
).
8.
Remove
asyncContext
from the
execution context stack
and restore the
execution context
that is at the top of the
execution context stack
as the
running execution context
9.
Let
callerContext
be the
running execution context
10.
Resume
callerContext
passing
empty
. If
asyncContext
is ever resumed again, let
completion
be the
Completion Record
with which it is resumed.
11.
Assert
: If control reaches here, then
asyncContext
is the
running execution context
again.
12.
Return
completion
28
Reflection
28.1
The Reflect Object
The Reflect object:
is
%Reflect%
is the initial value of the
"Reflect"
property of the
global object
is an
ordinary object
has a [[Prototype]] internal slot whose value is
%Object.prototype%
is not a
function object
does not have a [[Construct]] internal method; it cannot be used as a
constructor
with the
new
operator.
does not have a [[Call]] internal method; it cannot be invoked as a function.
28.1.1
Reflect.apply (
target
thisArgument
argumentsList
This function performs the following steps when called:
1.
If
IsCallable
target
) is
false
, throw a
TypeError
exception.
2.
Let
args
be ?
CreateListFromArrayLike
argumentsList
).
3.
Perform
PrepareForTailCall
().
4.
Return ?
Call
target
thisArgument
args
).
28.1.2
Reflect.construct (
target
argumentsList
[ ,
newTarget
] )
This function performs the following steps when called:
1.
If
IsConstructor
target
) is
false
, throw a
TypeError
exception.
2.
If
newTarget
is not present, set
newTarget
to
target
3.
Else if
IsConstructor
newTarget
) is
false
, throw a
TypeError
exception.
4.
Let
args
be ?
CreateListFromArrayLike
argumentsList
).
5.
Return ?
Construct
target
args
newTarget
).
28.1.3
Reflect.defineProperty (
target
propertyKey
attributes
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Let
key
be ?
ToPropertyKey
propertyKey
).
3.
Let
desc
be ?
ToPropertyDescriptor
attributes
).
4.
Return ?
target
.[[DefineOwnProperty]]
key
desc
).
28.1.4
Reflect.deleteProperty (
target
propertyKey
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Let
key
be ?
ToPropertyKey
propertyKey
).
3.
Return ?
target
.[[Delete]]
key
).
28.1.5
Reflect.get (
target
propertyKey
[ ,
receiver
] )
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Let
key
be ?
ToPropertyKey
propertyKey
).
3.
If
receiver
is not present, then
a.
Set
receiver
to
target
4.
Return ?
target
.[[Get]]
key
receiver
).
28.1.6
Reflect.getOwnPropertyDescriptor (
target
propertyKey
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Let
key
be ?
ToPropertyKey
propertyKey
).
3.
Let
desc
be ?
target
.[[GetOwnProperty]]
key
).
4.
Return
FromPropertyDescriptor
desc
).
28.1.7
Reflect.getPrototypeOf (
target
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Return ?
target
.[[GetPrototypeOf]]()
28.1.8
Reflect.has (
target
propertyKey
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Let
key
be ?
ToPropertyKey
propertyKey
).
3.
Return ?
target
.[[HasProperty]]
key
).
28.1.9
Reflect.isExtensible (
target
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Return ?
target
.[[IsExtensible]]()
28.1.10
Reflect.ownKeys (
target
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Let
keys
be ?
target
.[[OwnPropertyKeys]]()
3.
Return
CreateArrayFromList
keys
).
28.1.11
Reflect.preventExtensions (
target
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Return ?
target
.[[PreventExtensions]]()
28.1.12
Reflect.set (
target
propertyKey
[ ,
receiver
] )
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
Let
key
be ?
ToPropertyKey
propertyKey
).
3.
If
receiver
is not present, then
a.
Set
receiver
to
target
4.
Return ?
target
.[[Set]]
key
receiver
).
28.1.13
Reflect.setPrototypeOf (
target
proto
This function performs the following steps when called:
1.
If
target
is not an Object
, throw a
TypeError
exception.
2.
If
proto
is not an Object
and
proto
is not
null
, throw a
TypeError
exception.
3.
Return ?
target
.[[SetPrototypeOf]]
proto
).
28.1.14
Reflect [ @@toStringTag ]
The initial value of the
@@toStringTag
property is the String value
"Reflect"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
true
}.
28.2
Proxy Objects
28.2.1
The Proxy Constructor
The Proxy
constructor
is
%Proxy%
is the initial value of the
"Proxy"
property of the
global object
creates and initializes a new Proxy object when called as a
constructor
is not intended to be called as a function and will throw an exception when called in that manner.
28.2.1.1
Proxy (
target
handler
This function performs the following steps when called:
1.
If NewTarget is
undefined
, throw a
TypeError
exception.
2.
Return ?
ProxyCreate
target
handler
).
28.2.2
Properties of the Proxy Constructor
The Proxy
constructor
has a [[Prototype]] internal slot whose value is
%Function.prototype%
does not have a
"prototype"
property because Proxy objects do not have a [[Prototype]] internal slot that requires initialization.
has the following properties:
28.2.2.1
Proxy.revocable (
target
handler
This function creates a revocable Proxy object.
It performs the following steps when called:
1.
Let
proxy
be ?
ProxyCreate
target
handler
).
2.
Let
revokerClosure
be a new
Abstract Closure
with no parameters that captures nothing and performs the following steps when called:
a.
Let
be the
active function object
b.
Let
be
.[[RevocableProxy]].
c.
If
is
null
, return
undefined
d.
Set
.[[RevocableProxy]] to
null
e.
Assert
is a Proxy object.
f.
Set
.[[ProxyTarget]] to
null
g.
Set
.[[ProxyHandler]] to
null
h.
Return
undefined
3.
Let
revoker
be
CreateBuiltinFunction
revokerClosure
, 0,
""
, « [[RevocableProxy]] »).
4.
Set
revoker
.[[RevocableProxy]] to
proxy
5.
Let
result
be
OrdinaryObjectCreate
%Object.prototype%
).
6.
Perform !
CreateDataPropertyOrThrow
result
"proxy"
proxy
).
7.
Perform !
CreateDataPropertyOrThrow
result
"revoke"
revoker
).
8.
Return
result
28.3
Module Namespace Objects
A Module Namespace Object is a
module namespace exotic object
that provides runtime property-based access to a module's exported bindings. There is no
constructor
function for Module Namespace Objects. Instead, such an object is created for each module that is imported by an
ImportDeclaration
that contains a
NameSpaceImport
In addition to the properties specified in
10.4.6
each Module Namespace Object has the following own property:
28.3.1
@@toStringTag
The initial value of the
@@toStringTag
property is the String value
"Module"
This property has the attributes { [[Writable]]:
false
, [[Enumerable]]:
false
, [[Configurable]]:
false
}.
29
Memory Model
The memory consistency model, or
memory model
, specifies the possible orderings of
Shared Data Block events
arising via accessing TypedArray instances backed by a
SharedArrayBuffer and via methods on the Atomics object. When the
program has no data races (defined below), the ordering of events
appears as sequentially consistent, i.e., as an interleaving of actions
from each
agent
When the program has data races, shared memory operations may appear
sequentially inconsistent. For example, programs may exhibit
causality-violating behaviour and other astonishments. These
astonishments arise from compiler transforms and the design of CPUs
(e.g., out-of-order execution and speculation). The memory model defines
both the precise conditions under which a program exhibits sequentially
consistent behaviour as well as the possible values read from data
races. To wit, there is no undefined behaviour.
The memory model is defined as relational constraints on events introduced by
abstract operations
on SharedArrayBuffer or by methods on the Atomics object during an evaluation.
Note
This section provides an axiomatic model on events introduced by the
abstract operations
on SharedArrayBuffers. It bears stressing that the model is not
expressible algorithmically, unlike the rest of this specification. The
nondeterministic introduction of events by
abstract operations
is the interface between the operational semantics of ECMAScript
evaluation and the axiomatic semantics of the memory model. The
semantics of these events is defined by considering graphs of all events
in an evaluation. These are neither Static Semantics nor Runtime
Semantics. There is no demonstrated algorithmic implementation, but
instead a set of constraints that determine if a particular event graph
is allowed or disallowed.
29.1
Memory Model Fundamentals
Shared memory accesses (reads and writes) are divided into two
groups, atomic accesses and data accesses, defined below. Atomic
accesses are sequentially consistent, i.e., there is a strict total
ordering of events agreed upon by all
agents
in an
agent cluster
. Non-atomic accesses do not have a strict total ordering agreed upon by all
agents
, i.e., unordered.
Note 1
No orderings weaker than sequentially consistent and stronger than unordered, such as release-acquire, are supported.
Shared Data Block event
is either a
ReadSharedMemory
WriteSharedMemory
, or
ReadModifyWriteSharedMemory
Record
Table 85:
ReadSharedMemory
Event Fields
Field Name
Value
Meaning
[[Order]]
SeqCst
or
Unordered
The weakest ordering guaranteed by the
memory model
for the event.
[[NoTear]]
a Boolean
Whether this event is allowed to read from multiple write events with equal range as this event.
[[Block]]
Shared Data Block
The block the event operates on.
[[ByteIndex]]
a non-negative
integer
The byte address of the read in [[Block]].
[[ElementSize]]
a non-negative
integer
The size of the read.
Table 86:
WriteSharedMemory
Event Fields
Field Name
Value
Meaning
[[Order]]
SeqCst
Unordered
, or
Init
The weakest ordering guaranteed by the
memory model
for the event.
[[NoTear]]
a Boolean
Whether this event is allowed to be read from multiple read events with equal range as this event.
[[Block]]
Shared Data Block
The block the event operates on.
[[ByteIndex]]
a non-negative
integer
The byte address of the write in [[Block]].
[[ElementSize]]
a non-negative
integer
The size of the write.
[[Payload]]
List
of
byte values
The
List
of
byte values
to be read by other events.
Table 87:
ReadModifyWriteSharedMemory
Event Fields
Field Name
Value
Meaning
[[Order]]
SeqCst
Read-modify-write events are always sequentially consistent.
[[NoTear]]
true
Read-modify-write events cannot tear.
[[Block]]
Shared Data Block
The block the event operates on.
[[ByteIndex]]
a non-negative
integer
The byte address of the read-modify-write in [[Block]].
[[ElementSize]]
a non-negative
integer
The size of the read-modify-write.
[[Payload]]
List
of
byte values
The
List
of
byte values
to be passed to [[ModifyOp]].
[[ModifyOp]]
read-modify-write modification function
An abstract closure that returns a modified
List
of
byte values
from a read
List
of
byte values
and [[Payload]].
These events are introduced by
abstract operations
or by methods on the Atomics object.
Some operations may also introduce
Synchronize
events. A
Synchronize event
has no fields, and exists purely to directly constrain the permitted orderings of other events.
In addition to
Shared Data Block
and Synchronize events, there are
host
-specific events.
Let the range of a ReadSharedMemory, WriteSharedMemory, or ReadModifyWriteSharedMemory event be the Set of contiguous
integers
from its [[ByteIndex]] to [[ByteIndex]] + [[ElementSize]] - 1. Two
events' ranges are equal when the events have the same [[Block]], and
the ranges are element-wise equal. Two events' ranges are overlapping
when the events have the same [[Block]], the ranges are not equal and
their intersection is non-empty. Two events' ranges are disjoint when
the events do not have the same [[Block]] or their ranges are neither
equal nor overlapping.
Note 2
Examples of
host
-specific synchronizing events that should be accounted for are: sending a SharedArrayBuffer from one
agent
to another (e.g., by
postMessage
in a browser), starting and stopping
agents
, and communicating within the
agent cluster
via channels other than shared memory. It is assumed those events are appended to
agent-order
during evaluation like the other SharedArrayBuffer events.
Events are ordered within
candidate executions
by the relations defined below.
29.2
Agent Events Records
An
Agent Events Record
is a
Record
with the following fields.
Table 88:
Agent Events Record
Fields
Field Name
Value
Meaning
[[AgentSignifier]]
an
agent signifier
The
agent
whose evaluation resulted in this ordering.
[[EventList]]
List
of events
Events are appended to the list during evaluation.
[[AgentSynchronizesWith]]
List
of pairs of
Synchronize events
Synchronize
relationships introduced by the operational semantics.
29.3
Chosen Value Records
Chosen Value Record
is a
Record
with the following fields.
Table 89:
Chosen Value Record
Fields
Field Name
Value
Meaning
[[Event]]
Shared Data Block event
The
ReadSharedMemory
or
ReadModifyWriteSharedMemory
event that was introduced for this chosen value.
[[ChosenValue]]
List
of
byte values
The bytes that were nondeterministically chosen during evaluation.
29.4
Candidate Executions
candidate execution
of the evaluation of an
agent cluster
is a
Record
with the following fields.
Table 90: Candidate Execution
Record
Fields
Field Name
Value
Meaning
[[EventsRecords]]
List
of
Agent Events Records
Maps an
agent
to
Lists
of events appended during the evaluation.
[[ChosenValues]]
List
of
Chosen Value Records
Maps
ReadSharedMemory
or
ReadModifyWriteSharedMemory
events to the
List
of
byte values
chosen during the evaluation.
[[AgentOrder]]
an
agent-order
Relation
Defined below.
[[ReadsBytesFrom]]
reads-bytes-from
mathematical function
Defined below.
[[ReadsFrom]]
reads-from
Relation
Defined below.
[[HostSynchronizesWith]]
host-synchronizes-with
Relation
Defined below.
[[SynchronizesWith]]
synchronizes-with
Relation
Defined below.
[[HappensBefore]]
happens-before
Relation
Defined below.
An
empty candidate execution
is a candidate execution
Record
whose fields are empty
Lists
and
Relations
29.5
Abstract Operations for the Memory Model
29.5.1
EventSet (
execution
The abstract operation EventSet takes argument
execution
(a
candidate execution
) and returns a Set of events. It performs the following steps when called:
1.
Let
events
be an empty Set.
2.
For each
Agent Events Record
aer
of
execution
.[[EventsRecords]], do
a.
For each event
of
aer
.[[EventList]], do
i.
Add
to
events
3.
Return
events
29.5.2
SharedDataBlockEventSet (
execution
The abstract operation SharedDataBlockEventSet takes argument
execution
(a
candidate execution
) and returns a Set of events. It performs the following steps when called:
1.
Let
events
be an empty Set.
2.
For each event
of
EventSet
execution
), do
a.
If
is a
ReadSharedMemory
WriteSharedMemory
, or
ReadModifyWriteSharedMemory
event, add
to
events
3.
Return
events
29.5.3
HostEventSet (
execution
The abstract operation HostEventSet takes argument
execution
(a
candidate execution
) and returns a Set of events. It performs the following steps when called:
1.
Let
events
be an empty Set.
2.
For each event
of
EventSet
execution
), do
a.
If
is not in
SharedDataBlockEventSet
execution
), add
to
events
3.
Return
events
29.5.4
ComposeWriteEventBytes (
execution
byteIndex
Ws
The abstract operation ComposeWriteEventBytes takes arguments
execution
(a
candidate execution
),
byteIndex
(a non-negative
integer
), and
Ws
(a
List
of either
WriteSharedMemory
or
ReadModifyWriteSharedMemory
events) and returns a
List
of
byte values
. It performs the following steps when called:
1.
Let
byteLocation
be
byteIndex
2.
Let
bytesRead
be a new empty
List
3.
For each element
of
Ws
, do
a.
Assert
has
byteLocation
in its range.
b.
Let
payloadIndex
be
byteLocation
.[[ByteIndex]].
c.
If
is a
WriteSharedMemory
event, then
i.
Let
byte
be
.[[Payload]][
payloadIndex
].
d.
Else,
i.
Assert
is a
ReadModifyWriteSharedMemory
event.
ii.
Let
bytes
be
ValueOfReadEvent
execution
).
iii.
Let
bytesModified
be
.[[ModifyOp]](
bytes
.[[Payload]]).
iv.
Let
byte
be
bytesModified
payloadIndex
].
e.
Append
byte
to
bytesRead
f.
Set
byteLocation
to
byteLocation
+ 1.
4.
Return
bytesRead
Note 1
The read-modify-write modification [[ModifyOp]] is given by the function properties on the Atomics object that introduce
ReadModifyWriteSharedMemory
events.
Note 2
This abstract operation composes a
List
of write events into a
List
of
byte values
. It is used in the event semantics of
ReadSharedMemory
and
ReadModifyWriteSharedMemory
events.
29.5.5
ValueOfReadEvent (
execution
The abstract operation ValueOfReadEvent takes arguments
execution
(a
candidate execution
) and
(a
ReadSharedMemory
or
ReadModifyWriteSharedMemory
event) and returns a
List
of
byte values
. It performs the following steps when called:
1.
Let
Ws
be
execution
.[[ReadsBytesFrom]](
).
2.
Assert
Ws
is a
List
of
WriteSharedMemory
or
ReadModifyWriteSharedMemory
events with length equal to
.[[ElementSize]].
3.
Return
ComposeWriteEventBytes
execution
.[[ByteIndex]],
Ws
).
29.6
Relations of Candidate Executions
29.6.1
agent-order
For a
candidate execution
execution
execution
.[[AgentOrder]] is a
Relation
on events that satisfies the following.
For each pair (
) in
EventSet
execution
),
execution
.[[AgentOrder]] contains (
) if there is some
Agent Events Record
aer
in
execution
.[[EventsRecords]] such that
and
are in
aer
.[[EventList]] and
is before
in
List
order of
aer
.[[EventList]].
Note
Each
agent
introduces events in a per-
agent
strict total order
during the evaluation. This is the union of those
strict total orders
29.6.2
reads-bytes-from
For a
candidate execution
execution
execution
.[[ReadsBytesFrom]] is a mathematical function mapping events in
SharedDataBlockEventSet
execution
) to
Lists
of events in
SharedDataBlockEventSet
execution
) that satisfies the following conditions.
For each
ReadSharedMemory
or
ReadModifyWriteSharedMemory
event
in
SharedDataBlockEventSet
execution
),
execution
.[[ReadsBytesFrom]](
) is a
List
of length
.[[ElementSize]] whose elements are
WriteSharedMemory
or
ReadModifyWriteSharedMemory
events
Ws
such that all of the following are true.
Each event
with index
in
Ws
has
.[[ByteIndex]] +
in its range.
is not in
Ws
29.6.3
reads-from
For a
candidate execution
execution
execution
.[[ReadsFrom]] is the least
Relation
on events that satisfies the following.
For each pair (
) in
SharedDataBlockEventSet
execution
),
execution
.[[ReadsFrom]] contains (
) if
execution
.[[ReadsBytesFrom]](
) contains
29.6.4
host-synchronizes-with
For a
candidate execution
execution
execution
.[[HostSynchronizesWith]] is a
host
-provided
strict partial order
on
host
-specific events that satisfies at least the following.
If
execution
.[[HostSynchronizesWith]] contains (
),
and
are in
HostEventSet
execution
).
There is no cycle in the union of
execution
.[[HostSynchronizesWith]] and
execution
.[[AgentOrder]].
Note 1
For two
host
-specific events
and
host-synchronizes-with
implies
happens-before
Note 2
The host-synchronizes-with relation allows the
host
to provide additional synchronization mechanisms, such as
postMessage
between HTML workers.
29.6.5
synchronizes-with
For a
candidate execution
execution
execution
.[[SynchronizesWith]] is the least
Relation
on events that satisfies the following.
For each pair (
) in
execution
.[[ReadsFrom]],
execution
.[[SynchronizesWith]] contains (
) if
.[[Order]] is
SeqCst
.[[Order]] is
SeqCst
, and
and
have equal ranges.
For each element
eventsRecord
of
execution
.[[EventsRecords]], the following is true.
For each pair (
Sw
) in
eventsRecord
.[[AgentSynchronizesWith]],
execution
.[[SynchronizesWith]] contains (
Sw
).
For each pair (
) in
execution
.[[HostSynchronizesWith]],
execution
.[[SynchronizesWith]] contains (
).
Note 1
Owing to convention, write events synchronizes-with read events, instead of read events synchronizes-with write events.
Note 2
Init
events do not participate in synchronizes-with, and are instead constrained directly by
happens-before
Note 3
Not all
SeqCst
events related by
reads-from
are related by synchronizes-with. Only events that also have equal ranges are related by synchronizes-with.
Note 4
For
Shared Data Block events
and
such that
synchronizes-with
may
reads-from
other writes than
29.6.6
happens-before
For a
candidate execution
execution
execution
.[[HappensBefore]] is the least
Relation
on events that satisfies the following.
For each pair (
) in
execution
.[[AgentOrder]],
execution
.[[HappensBefore]] contains (
).
For each pair (
) in
execution
.[[SynchronizesWith]],
execution
.[[HappensBefore]] contains (
).
For each pair (
) in
SharedDataBlockEventSet
execution
),
execution
.[[HappensBefore]] contains (
) if
.[[Order]] is
Init
and
and
have overlapping ranges.
For each pair (
) in
EventSet
execution
),
execution
.[[HappensBefore]] contains (
) if there is an event
such that the pairs (
) and (
) are in
execution
.[[HappensBefore]].
Note
Because happens-before is a superset of
agent-order
candidate executions
are consistent with the single-thread evaluation semantics of ECMAScript.
29.7
Properties of Valid Executions
29.7.1
Valid Chosen Reads
candidate execution
execution
has valid chosen reads if the following algorithm returns
true
1.
For each
ReadSharedMemory
or
ReadModifyWriteSharedMemory
event
of
SharedDataBlockEventSet
execution
), do
a.
Let
chosenValueRecord
be the element of
execution
.[[ChosenValues]] whose [[Event]] field is
b.
Let
chosenValue
be
chosenValueRecord
.[[ChosenValue]].
c.
Let
readValue
be
ValueOfReadEvent
execution
).
d.
Let
chosenLen
be the number of elements in
chosenValue
e.
Let
readLen
be the number of elements in
readValue
f.
If
chosenLen
readLen
, then
i.
Return
false
g.
If
chosenValue
] ≠
readValue
] for some
integer
in the
interval
from 0 (inclusive) to
chosenLen
(exclusive), then
i.
Return
false
2.
Return
true
29.7.2
Coherent Reads
candidate execution
execution
has coherent reads if the following algorithm returns
true
1.
For each
ReadSharedMemory
or
ReadModifyWriteSharedMemory
event
of
SharedDataBlockEventSet
execution
), do
a.
Let
Ws
be
execution
.[[ReadsBytesFrom]](
).
b.
Let
byteLocation
be
.[[ByteIndex]].
c.
For each element
of
Ws
, do
i.
If
execution
.[[HappensBefore]] contains (
), then
1.
Return
false
ii.
If there exists a
WriteSharedMemory
or
ReadModifyWriteSharedMemory
event
that has
byteLocation
in its range such that the pairs (
) and (
) are in
execution
.[[HappensBefore]], then
1.
Return
false
iii.
Set
byteLocation
to
byteLocation
+ 1.
2.
Return
true
29.7.3
Tear Free Reads
candidate execution
execution
has tear free reads if the following algorithm returns
true
1.
For each
ReadSharedMemory
or
ReadModifyWriteSharedMemory
event
of
SharedDataBlockEventSet
execution
), do
a.
If
.[[NoTear]] is
true
, then
i.
Assert
: The remainder of dividing
.[[ByteIndex]] by
.[[ElementSize]] is 0.
ii.
For each event
such that
execution
.[[ReadsFrom]] contains (
) and
.[[NoTear]] is
true
, do
1.
If
and
have equal ranges and there exists an event
such that
and
have equal ranges,
.[[NoTear]] is
true
is not
, and
execution
.[[ReadsFrom]] contains (
), then
a.
Return
false
2.
Return
true
Note
An event's [[NoTear]] field is
true
when that event was introduced via accessing an
integer
TypedArray, and
false
when introduced via accessing a floating point TypedArray or DataView.
Intuitively, this requirement says when a memory range is accessed in an aligned fashion via an
integer
TypedArray, a single write event on that range must "win" when in a
data race with other write events with equal ranges. More precisely,
this requirement says an aligned read event cannot read a value composed
of bytes from multiple, different write events all with equal ranges.
It is possible, however, for an aligned read event to read from multiple
write events with overlapping ranges.
29.7.4
Sequentially Consistent Atomics
For a
candidate execution
execution
, memory-order is a
strict total order
of all events in
EventSet
execution
) that satisfies the following.
For each pair (
) in
execution
.[[HappensBefore]], (
) is in memory-order.
For each pair (
) in
execution
.[[ReadsFrom]], there is no
WriteSharedMemory
or
ReadModifyWriteSharedMemory
event
in
SharedDataBlockEventSet
execution
) such that
.[[Order]] is
SeqCst
, the pairs (
) and (
) are in memory-order, and any of the following conditions are true.
execution
.[[SynchronizesWith]] contains the pair (
), and
and
have equal ranges.
The pairs (
) and (
) are in
execution
.[[HappensBefore]],
.[[Order]] is
SeqCst
, and
and
have equal ranges.
The pairs (
) and (
) are in
execution
.[[HappensBefore]],
.[[Order]] is
SeqCst
, and
and
have equal ranges.
Note 1
This clause additionally constrains
SeqCst
events on equal ranges.
For each
WriteSharedMemory
or
ReadModifyWriteSharedMemory
event
in
SharedDataBlockEventSet
execution
), if
.[[Order]] is
SeqCst
, then it is not the case that there is an infinite number of
ReadSharedMemory
or
ReadModifyWriteSharedMemory
events in
SharedDataBlockEventSet
execution
) with equal range that is memory-order before
Note 2
This clause together with the forward progress guarantee on
agents
ensure the liveness condition that
SeqCst
writes become visible to
SeqCst
reads with equal range in
finite
time.
candidate execution
has sequentially consistent atomics if a memory-order exists.
Note 3
While memory-order includes all events in
EventSet
execution
), those that are not constrained by
happens-before
or
synchronizes-with
are allowed to occur anywhere in the order.
29.7.5
Valid Executions
candidate execution
execution
is a valid execution (or simply an execution) if all of the following are true.
The
host
provides a
host-synchronizes-with
Relation
for
execution
.[[HostSynchronizesWith]].
execution
.[[HappensBefore]] is a
strict partial order
execution
has valid chosen reads.
execution
has coherent reads.
execution
has tear free reads.
execution
has sequentially consistent atomics.
All programs have at least one valid execution.
29.8
Races
For an execution
execution
, two events
and
in
SharedDataBlockEventSet
execution
) are in a race if the following algorithm returns
true
1.
If
is not
, then
a.
If the pairs (
) and (
) are not in
execution
.[[HappensBefore]], then
i.
If
and
are both
WriteSharedMemory
or
ReadModifyWriteSharedMemory
events and
and
do not have disjoint ranges, then
1.
Return
true
ii.
If
execution
.[[ReadsFrom]] contains either (
) or (
), then
1.
Return
true
2.
Return
false
29.9
Data Races
For an execution
execution
, two events
and
in
SharedDataBlockEventSet
execution
) are in a data race if the following algorithm returns
true
1.
If
and
are in a race in
execution
, then
a.
If
.[[Order]] is not
SeqCst
or
.[[Order]] is not
SeqCst
, then
i.
Return
true
b.
If
and
have overlapping ranges, then
i.
Return
true
2.
Return
false
29.10
Data Race Freedom
An execution
execution
is data race free if there are no two events in
SharedDataBlockEventSet
execution
) that are in a data race.
A program is data race free if all its executions are data race free.
The
memory model
guarantees sequential consistency of all events for data race free programs.
29.11
Shared Memory Guidelines
Note 1
The following are guidelines for ECMAScript programmers working with shared memory.
We recommend programs be kept data race free, i.e., make it so
that it is impossible for there to be concurrent non-atomic operations
on the same memory location. Data race free programs have interleaving
semantics where each step in the evaluation semantics of each
agent
are interleaved with each other. For data race free programs, it is not necessary to understand the details of the
memory model
. The details are unlikely to build intuition that will help one to better write ECMAScript.
More generally, even if a program is not data race free it may
have predictable behaviour, so long as atomic operations are not
involved in any data races and the operations that race all have the
same access size. The simplest way to arrange for atomics not to be
involved in races is to ensure that different memory cells are used by
atomic and non-atomic operations and that atomic accesses of different
sizes are not used to access the same cells at the same time.
Effectively, the program should treat shared memory as strongly typed as
much as possible. One still cannot depend on the ordering and timing of
non-atomic accesses that race, but if memory is treated as strongly
typed the racing accesses will not "tear" (bits of their values will not
be mixed).
Note 2
The following are guidelines for ECMAScript implementers writing compiler transformations for programs using shared memory.
It is desirable to allow most program transformations that are valid in a single-
agent
setting in a multi-
agent
setting, to ensure that the performance of each
agent
in a multi-
agent
program is as good as it would be in a single-
agent
setting. Frequently these transformations are hard to judge. We outline
some rules about program transformations that are intended to be taken
as normative (in that they are implied by the
memory model
or stronger than what the
memory model
implies) but which are likely not exhaustive. These rules are intended
to apply to program transformations that precede the introductions of
the events that make up the
agent-order
Let an
agent-order slice
be the subset of the
agent-order
pertaining to a single
agent
Let
possible read values
of a read event be the set of all values of
ValueOfReadEvent
for that event across all valid executions.
Any transformation of an agent-order slice that is valid in the
absence of shared memory is valid in the presence of shared memory,
with the following exceptions.
Atomics are carved in stone
: Program transformations must not cause the
SeqCst
events in an agent-order slice to be reordered with its
Unordered
operations, nor its
SeqCst
operations to be reordered with each other, nor may a program transformation remove a
SeqCst
operation from the
agent-order
(In practice, the prohibition on reorderings forces a compiler to assume that every
SeqCst
operation is a synchronization and included in the final
memory-order
, which it would usually have to assume anyway in the absence of inter-
agent
program analysis. It also forces the compiler to assume that every call where the callee's effects on the
memory-order
are unknown may contain
SeqCst
operations.)
Reads must be stable
: Any given shared memory read must only observe a single value in an execution.
(For example, if what is semantically a single read in the
program is executed multiple times then the program is subsequently
allowed to observe only one of the values read. A transformation known
as rematerialization can violate this rule.)
Writes must be stable
: All observable writes to shared memory must follow from program semantics in an execution.
(For example, a transformation may not introduce certain
observable writes, such as by using read-modify-write operations on a
larger location to write a smaller datum, writing a value to memory that
the program could not have written, or writing a just-read value back
to the location it was read from, if that location could have been
overwritten by another
agent
after the read.)
Possible read values must be non-empty
: Program transformations cannot cause the possible read values of a shared memory read to become empty.
(Counterintuitively, this rule in effect restricts transformations on writes, because writes have force in
memory model
insofar as to be read by read events. For example, writes may be moved and coalesced and sometimes reordered between two
SeqCst
operations, but the transformation may not remove every write that updates a location; some write must be preserved.)
Examples of transformations that remain valid are: merging
multiple non-atomic reads from the same location, reordering non-atomic
reads, introducing speculative non-atomic reads, merging multiple
non-atomic writes to the same location, reordering non-atomic writes to
different locations, and hoisting non-atomic reads out of loops even if
that affects termination. Note in general that aliased TypedArrays make
it hard to prove that locations are different.
Note 3
The following are guidelines for ECMAScript implementers generating machine code for shared memory accesses.
For architectures with memory models no weaker than those of
ARM or Power, non-atomic stores and loads may be compiled to bare stores
and loads on the target architecture. Atomic stores and loads may be
compiled down to instructions that guarantee sequential consistency. If
no such instructions exist, memory barriers are to be employed, such as
placing barriers on both sides of a bare store or load.
Read-modify-write operations may be compiled to read-modify-write
instructions on the target architecture, such as
LOCK
-prefixed
instructions on x86, load-exclusive/store-exclusive instructions on
ARM, and load-link/store-conditional instructions on Power.
Specifically, the
memory model
is intended to allow code generation as follows.
Every atomic operation in the program is assumed to be necessary.
Atomic operations are never rearranged with each other or with non-atomic operations.
Functions are always assumed to perform atomic operations.
Atomic operations are never implemented as read-modify-write
operations on larger data, but as non-lock-free atomics if the platform
does not have atomic operations of the appropriate size. (We already
assume that every platform has normal memory access operations of every
interesting size.)
Naive code generation uses these patterns:
Regular loads and stores compile to single load and store instructions.
Lock-free atomic loads and stores compile to a full (sequentially consistent) fence, a regular load or store, and a full fence.
Lock-free atomic read-modify-write accesses compile to a
full fence, an atomic read-modify-write instruction sequence, and a full
fence.
Non-lock-free atomics compile to a spinlock acquire, a full
fence, a series of non-atomic load and store instructions, a full fence,
and a spinlock release.
That mapping is correct so long as an atomic operation on an
address range does not race with a non-atomic write or with an atomic
operation of different size. However, that is all we need: the
memory model
effectively demotes the atomic operations involved in a race to
non-atomic status. On the other hand, the naive mapping is quite strong:
it allows atomic operations to be used as sequentially consistent
fences, which the
memory model
does not actually guarantee.
Local improvements to those basic patterns are also allowed, subject to the constraints of the
memory model
. For example:
There are obvious platform-dependent improvements that
remove redundant fences. For example, on x86 the fences around lock-free
atomic loads and stores can always be omitted except for the fence
following a store, and no fence is needed for lock-free
read-modify-write instructions, as these all use
LOCK
-prefixed
instructions. On many platforms there are fences of several strengths,
and weaker fences can be used in certain contexts without destroying
sequential consistency.
Most modern platforms support lock-free atomics for all the
data sizes required by ECMAScript atomics. Should non-lock-free atomics
be needed, the fences surrounding the body of the atomic operation can
usually be folded into the lock and unlock steps. The simplest solution
for non-lock-free atomics is to have a single lock word per
SharedArrayBuffer.
There are also more complicated platform-dependent local
improvements, requiring some code analysis. For example, two
back-to-back fences often have the same effect as a single fence, so if
code is generated for two atomic operations in sequence, only a single
fence need separate them. On x86, even a single fence separating atomic
stores can be omitted, as the fence following a store is only needed to
separate the store from a subsequent load.
Grammar Summary
A.1
Lexical Grammar
SourceCharacter
::
any Unicode code point
InputElementDiv
::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
RightBracePunctuator
InputElementRegExp
::
WhiteSpace
LineTerminator
Comment
CommonToken
RightBracePunctuator
RegularExpressionLiteral
InputElementRegExpOrTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
InputElementTemplateTail
::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
InputElementHashbangOrRegExp
::
WhiteSpace
LineTerminator
Comment
CommonToken
HashbangComment
RegularExpressionLiteral
WhiteSpace
::





LineTerminator
::




LineTerminatorSequence
::


[lookahead ≠





Comment
::
MultiLineComment
SingleLineComment
MultiLineComment
::
/*
MultiLineCommentChars
opt
*/
MultiLineCommentChars
::
MultiLineNotAsteriskChar
MultiLineCommentChars
opt
PostAsteriskCommentChars
opt
PostAsteriskCommentChars
::
MultiLineNotForwardSlashOrAsteriskChar
MultiLineCommentChars
opt
PostAsteriskCommentChars
opt
MultiLineNotAsteriskChar
::
SourceCharacter
but not
MultiLineNotForwardSlashOrAsteriskChar
::
SourceCharacter
but not one of
or
SingleLineComment
::
//
SingleLineCommentChars
opt
SingleLineCommentChars
::
SingleLineCommentChar
SingleLineCommentChars
opt
SingleLineCommentChar
::
SourceCharacter
but not
LineTerminator
HashbangComment
::
#!
SingleLineCommentChars
opt
CommonToken
::
IdentifierName
PrivateIdentifier
Punctuator
NumericLiteral
StringLiteral
Template
PrivateIdentifier
::
IdentifierName
IdentifierName
::
IdentifierStart
IdentifierName
IdentifierPart
IdentifierStart
::
IdentifierStartChar
UnicodeEscapeSequence
IdentifierPart
::
IdentifierPartChar
UnicodeEscapeSequence
IdentifierStartChar
::
UnicodeIDStart
IdentifierPartChar
::
UnicodeIDContinue


AsciiLetter
::
one of
UnicodeIDStart
::
any Unicode code point with the Unicode property “ID_Start”
UnicodeIDContinue
::
any Unicode code point with the Unicode property “ID_Continue”
ReservedWord
::
one of
await
break
case
catch
class
const
continue
debugger
default
delete
do
else
enum
export
extends
false
finally
for
function
if
import
in
instanceof
new
null
return
super
switch
this
throw
true
try
typeof
var
void
while
with
yield
Punctuator
::
OptionalChainingPunctuator
OtherPunctuator
OptionalChainingPunctuator
::
?.
[lookahead ∉
DecimalDigit
OtherPunctuator
::
one of
...
<=
>=
==
!=
===
!==
**
++
--
<<
>>
>>>
&&
||
??
+=
-=
*=
%=
**=
<<=
>>=
>>>=
&=
|=
^=
&&=
||=
??=
=>
DivPunctuator
::
/=
RightBracePunctuator
::
NullLiteral
::
null
BooleanLiteral
::
true
false
NumericLiteralSeparator
::
NumericLiteral
::
DecimalLiteral
DecimalBigIntegerLiteral
NonDecimalIntegerLiteral
[+Sep]
NonDecimalIntegerLiteral
[+Sep]
BigIntLiteralSuffix
LegacyOctalIntegerLiteral
DecimalBigIntegerLiteral
::
BigIntLiteralSuffix
NonZeroDigit
DecimalDigits
[+Sep]
opt
BigIntLiteralSuffix
NonZeroDigit
NumericLiteralSeparator
DecimalDigits
[+Sep]
BigIntLiteralSuffix
NonDecimalIntegerLiteral
[Sep]
::
BinaryIntegerLiteral
[?Sep]
OctalIntegerLiteral
[?Sep]
HexIntegerLiteral
[?Sep]
BigIntLiteralSuffix
::
DecimalLiteral
::
DecimalIntegerLiteral
DecimalDigits
[+Sep]
opt
ExponentPart
[+Sep]
opt
DecimalDigits
[+Sep]
ExponentPart
[+Sep]
opt
DecimalIntegerLiteral
ExponentPart
[+Sep]
opt
DecimalIntegerLiteral
::
NonZeroDigit
NonZeroDigit
NumericLiteralSeparator
opt
DecimalDigits
[+Sep]
NonOctalDecimalIntegerLiteral
DecimalDigits
[Sep]
::
DecimalDigit
DecimalDigits
[?Sep]
DecimalDigit
[+Sep]
DecimalDigits
[+Sep]
NumericLiteralSeparator
DecimalDigit
DecimalDigit
::
one of
NonZeroDigit
::
one of
ExponentPart
[Sep]
::
ExponentIndicator
SignedInteger
[?Sep]
ExponentIndicator
::
one of
SignedInteger
[Sep]
::
DecimalDigits
[?Sep]
DecimalDigits
[?Sep]
DecimalDigits
[?Sep]
BinaryIntegerLiteral
[Sep]
::
0b
BinaryDigits
[?Sep]
0B
BinaryDigits
[?Sep]
BinaryDigits
[Sep]
::
BinaryDigit
BinaryDigits
[?Sep]
BinaryDigit
[+Sep]
BinaryDigits
[+Sep]
NumericLiteralSeparator
BinaryDigit
BinaryDigit
::
one of
OctalIntegerLiteral
[Sep]
::
0o
OctalDigits
[?Sep]
0O
OctalDigits
[?Sep]
OctalDigits
[Sep]
::
OctalDigit
OctalDigits
[?Sep]
OctalDigit
[+Sep]
OctalDigits
[+Sep]
NumericLiteralSeparator
OctalDigit
LegacyOctalIntegerLiteral
::
OctalDigit
LegacyOctalIntegerLiteral
OctalDigit
NonOctalDecimalIntegerLiteral
::
NonOctalDigit
LegacyOctalLikeDecimalIntegerLiteral
NonOctalDigit
NonOctalDecimalIntegerLiteral
DecimalDigit
LegacyOctalLikeDecimalIntegerLiteral
::
OctalDigit
LegacyOctalLikeDecimalIntegerLiteral
OctalDigit
OctalDigit
::
one of
NonOctalDigit
::
one of
HexIntegerLiteral
[Sep]
::
0x
HexDigits
[?Sep]
0X
HexDigits
[?Sep]
HexDigits
[Sep]
::
HexDigit
HexDigits
[?Sep]
HexDigit
[+Sep]
HexDigits
[+Sep]
NumericLiteralSeparator
HexDigit
HexDigit
::
one of
StringLiteral
::
DoubleStringCharacters
opt
SingleStringCharacters
opt
DoubleStringCharacters
::
DoubleStringCharacter
DoubleStringCharacters
opt
SingleStringCharacters
::
SingleStringCharacter
SingleStringCharacters
opt
DoubleStringCharacter
::
SourceCharacter
but not one of
or
or
LineTerminator


EscapeSequence
LineContinuation
SingleStringCharacter
::
SourceCharacter
but not one of
or
or
LineTerminator


EscapeSequence
LineContinuation
LineContinuation
::
LineTerminatorSequence
EscapeSequence
::
CharacterEscapeSequence
[lookahead ∉
DecimalDigit
LegacyOctalEscapeSequence
NonOctalDecimalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence
::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter
::
one of
NonEscapeCharacter
::
SourceCharacter
but not one of
EscapeCharacter
or
LineTerminator
EscapeCharacter
::
SingleEscapeCharacter
DecimalDigit
LegacyOctalEscapeSequence
::
[lookahead ∈ {
}]
NonZeroOctalDigit
[lookahead ∉
OctalDigit
ZeroToThree
OctalDigit
[lookahead ∉
OctalDigit
FourToSeven
OctalDigit
ZeroToThree
OctalDigit
OctalDigit
NonZeroOctalDigit
::
OctalDigit
but not
ZeroToThree
::
one of
FourToSeven
::
one of
NonOctalDecimalEscapeSequence
::
one of
HexEscapeSequence
::
HexDigit
HexDigit
UnicodeEscapeSequence
::
Hex4Digits
u{
CodePoint
Hex4Digits
::
HexDigit
HexDigit
HexDigit
HexDigit
RegularExpressionLiteral
::
RegularExpressionBody
RegularExpressionFlags
RegularExpressionBody
::
RegularExpressionFirstChar
RegularExpressionChars
RegularExpressionChars
::
[empty]
RegularExpressionChars
RegularExpressionChar
RegularExpressionFirstChar
::
RegularExpressionNonTerminator
but not one of
or
or
or
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar
::
RegularExpressionNonTerminator
but not one of
or
or
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence
::
RegularExpressionNonTerminator
RegularExpressionNonTerminator
::
SourceCharacter
but not
LineTerminator
RegularExpressionClass
::
RegularExpressionClassChars
RegularExpressionClassChars
::
[empty]
RegularExpressionClassChars
RegularExpressionClassChar
RegularExpressionClassChar
::
RegularExpressionNonTerminator
but not one of
or
RegularExpressionBackslashSequence
RegularExpressionFlags
::
[empty]
RegularExpressionFlags
IdentifierPartChar
Template
::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate
::
TemplateCharacters
opt
TemplateHead
::
TemplateCharacters
opt
${
TemplateSubstitutionTail
::
TemplateMiddle
TemplateTail
TemplateMiddle
::
TemplateCharacters
opt
${
TemplateTail
::
TemplateCharacters
opt
TemplateCharacters
::
TemplateCharacter
TemplateCharacters
opt
TemplateCharacter
::
[lookahead ≠
TemplateEscapeSequence
NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter
but not one of
or
or
or
LineTerminator
TemplateEscapeSequence
::
CharacterEscapeSequence
[lookahead ∉
DecimalDigit
HexEscapeSequence
UnicodeEscapeSequence
NotEscapeSequence
::
DecimalDigit
DecimalDigit
but not
[lookahead ∉
HexDigit
HexDigit
[lookahead ∉
HexDigit
[lookahead ∉
HexDigit
[lookahead ≠
HexDigit
[lookahead ∉
HexDigit
HexDigit
HexDigit
[lookahead ∉
HexDigit
HexDigit
HexDigit
HexDigit
[lookahead ∉
HexDigit
[lookahead ∉
HexDigit
NotCodePoint
[lookahead ∉
HexDigit
CodePoint
[lookahead ∉
HexDigit
[lookahead ≠
NotCodePoint
::
HexDigits
[~Sep]
but only if MV of
HexDigits
> 0x10FFFF
CodePoint
::
HexDigits
[~Sep]
but only if MV of
HexDigits
≤ 0x10FFFF
A.2
Expressions
IdentifierReference
[Yield, Await]
Identifier
[~Yield]
yield
[~Await]
await
BindingIdentifier
[Yield, Await]
Identifier
yield
await
LabelIdentifier
[Yield, Await]
Identifier
[~Yield]
yield
[~Await]
await
Identifier
IdentifierName
but not
ReservedWord
PrimaryExpression
[Yield, Await]
this
IdentifierReference
[?Yield, ?Await]
Literal
ArrayLiteral
[?Yield, ?Await]
ObjectLiteral
[?Yield, ?Await]
FunctionExpression
ClassExpression
[?Yield, ?Await]
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
[?Yield, ?Await, ~Tagged]
CoverParenthesizedExpressionAndArrowParameterList
[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList
[Yield, Await]
Expression
[+In, ?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
...
BindingIdentifier
[?Yield, ?Await]
...
BindingPattern
[?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
...
BindingIdentifier
[?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
...
BindingPattern
[?Yield, ?Await]
When processing an instance of the production
PrimaryExpression
[Yield, Await]
CoverParenthesizedExpressionAndArrowParameterList
[?Yield, ?Await]
the interpretation of
CoverParenthesizedExpressionAndArrowParameterList
is refined using the following grammar:
ParenthesizedExpression
[Yield, Await]
Expression
[+In, ?Yield, ?Await]
Literal
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
ArrayLiteral
[Yield, Await]
Elision
opt
ElementList
[?Yield, ?Await]
ElementList
[?Yield, ?Await]
Elision
opt
ElementList
[Yield, Await]
Elision
opt
AssignmentExpression
[+In, ?Yield, ?Await]
Elision
opt
SpreadElement
[?Yield, ?Await]
ElementList
[?Yield, ?Await]
Elision
opt
AssignmentExpression
[+In, ?Yield, ?Await]
ElementList
[?Yield, ?Await]
Elision
opt
SpreadElement
[?Yield, ?Await]
Elision
Elision
SpreadElement
[Yield, Await]
...
AssignmentExpression
[+In, ?Yield, ?Await]
ObjectLiteral
[Yield, Await]
PropertyDefinitionList
[?Yield, ?Await]
PropertyDefinitionList
[?Yield, ?Await]
PropertyDefinitionList
[Yield, Await]
PropertyDefinition
[?Yield, ?Await]
PropertyDefinitionList
[?Yield, ?Await]
PropertyDefinition
[?Yield, ?Await]
PropertyDefinition
[Yield, Await]
IdentifierReference
[?Yield, ?Await]
CoverInitializedName
[?Yield, ?Await]
PropertyName
[?Yield, ?Await]
AssignmentExpression
[+In, ?Yield, ?Await]
MethodDefinition
[?Yield, ?Await]
...
AssignmentExpression
[+In, ?Yield, ?Await]
PropertyName
[Yield, Await]
LiteralPropertyName
ComputedPropertyName
[?Yield, ?Await]
LiteralPropertyName
IdentifierName
StringLiteral
NumericLiteral
ComputedPropertyName
[Yield, Await]
AssignmentExpression
[+In, ?Yield, ?Await]
CoverInitializedName
[Yield, Await]
IdentifierReference
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
Initializer
[In, Yield, Await]
AssignmentExpression
[?In, ?Yield, ?Await]
TemplateLiteral
[Yield, Await, Tagged]
NoSubstitutionTemplate
SubstitutionTemplate
[?Yield, ?Await, ?Tagged]
SubstitutionTemplate
[Yield, Await, Tagged]
TemplateHead
Expression
[+In, ?Yield, ?Await]
TemplateSpans
[?Yield, ?Await, ?Tagged]
TemplateSpans
[Yield, Await, Tagged]
TemplateTail
TemplateMiddleList
[?Yield, ?Await, ?Tagged]
TemplateTail
TemplateMiddleList
[Yield, Await, Tagged]
TemplateMiddle
Expression
[+In, ?Yield, ?Await]
TemplateMiddleList
[?Yield, ?Await, ?Tagged]
TemplateMiddle
Expression
[+In, ?Yield, ?Await]
MemberExpression
[Yield, Await]
PrimaryExpression
[?Yield, ?Await]
MemberExpression
[?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
MemberExpression
[?Yield, ?Await]
IdentifierName
MemberExpression
[?Yield, ?Await]
TemplateLiteral
[?Yield, ?Await, +Tagged]
SuperProperty
[?Yield, ?Await]
MetaProperty
new
MemberExpression
[?Yield, ?Await]
Arguments
[?Yield, ?Await]
MemberExpression
[?Yield, ?Await]
PrivateIdentifier
SuperProperty
[Yield, Await]
super
Expression
[+In, ?Yield, ?Await]
super
IdentifierName
MetaProperty
NewTarget
ImportMeta
NewTarget
new
target
ImportMeta
import
meta
NewExpression
[Yield, Await]
MemberExpression
[?Yield, ?Await]
new
NewExpression
[?Yield, ?Await]
CallExpression
[Yield, Await]
CoverCallExpressionAndAsyncArrowHead
[?Yield, ?Await]
SuperCall
[?Yield, ?Await]
ImportCall
[?Yield, ?Await]
CallExpression
[?Yield, ?Await]
Arguments
[?Yield, ?Await]
CallExpression
[?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
CallExpression
[?Yield, ?Await]
IdentifierName
CallExpression
[?Yield, ?Await]
TemplateLiteral
[?Yield, ?Await, +Tagged]
CallExpression
[?Yield, ?Await]
PrivateIdentifier
When processing an instance of the production
CallExpression
[Yield, Await]
CoverCallExpressionAndAsyncArrowHead
[?Yield, ?Await]
the interpretation of
CoverCallExpressionAndAsyncArrowHead
is refined using the following grammar:
CallMemberExpression
[Yield, Await]
MemberExpression
[?Yield, ?Await]
Arguments
[?Yield, ?Await]
SuperCall
[Yield, Await]
super
Arguments
[?Yield, ?Await]
ImportCall
[Yield, Await]
import
AssignmentExpression
[+In, ?Yield, ?Await]
Arguments
[Yield, Await]
ArgumentList
[?Yield, ?Await]
ArgumentList
[?Yield, ?Await]
ArgumentList
[Yield, Await]
AssignmentExpression
[+In, ?Yield, ?Await]
...
AssignmentExpression
[+In, ?Yield, ?Await]
ArgumentList
[?Yield, ?Await]
AssignmentExpression
[+In, ?Yield, ?Await]
ArgumentList
[?Yield, ?Await]
...
AssignmentExpression
[+In, ?Yield, ?Await]
OptionalExpression
[Yield, Await]
MemberExpression
[?Yield, ?Await]
OptionalChain
[?Yield, ?Await]
CallExpression
[?Yield, ?Await]
OptionalChain
[?Yield, ?Await]
OptionalExpression
[?Yield, ?Await]
OptionalChain
[?Yield, ?Await]
OptionalChain
[Yield, Await]
?.
Arguments
[?Yield, ?Await]
?.
Expression
[+In, ?Yield, ?Await]
?.
IdentifierName
?.
TemplateLiteral
[?Yield, ?Await, +Tagged]
?.
PrivateIdentifier
OptionalChain
[?Yield, ?Await]
Arguments
[?Yield, ?Await]
OptionalChain
[?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
OptionalChain
[?Yield, ?Await]
IdentifierName
OptionalChain
[?Yield, ?Await]
TemplateLiteral
[?Yield, ?Await, +Tagged]
OptionalChain
[?Yield, ?Await]
PrivateIdentifier
LeftHandSideExpression
[Yield, Await]
NewExpression
[?Yield, ?Await]
CallExpression
[?Yield, ?Await]
OptionalExpression
[?Yield, ?Await]
UpdateExpression
[Yield, Await]
LeftHandSideExpression
[?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
[no
LineTerminator
here]
++
LeftHandSideExpression
[?Yield, ?Await]
[no
LineTerminator
here]
--
++
UnaryExpression
[?Yield, ?Await]
--
UnaryExpression
[?Yield, ?Await]
UnaryExpression
[Yield, Await]
UpdateExpression
[?Yield, ?Await]
delete
UnaryExpression
[?Yield, ?Await]
void
UnaryExpression
[?Yield, ?Await]
typeof
UnaryExpression
[?Yield, ?Await]
UnaryExpression
[?Yield, ?Await]
UnaryExpression
[?Yield, ?Await]
UnaryExpression
[?Yield, ?Await]
UnaryExpression
[?Yield, ?Await]
[+Await]
AwaitExpression
[?Yield]
ExponentiationExpression
[Yield, Await]
UnaryExpression
[?Yield, ?Await]
UpdateExpression
[?Yield, ?Await]
**
ExponentiationExpression
[?Yield, ?Await]
MultiplicativeExpression
[Yield, Await]
ExponentiationExpression
[?Yield, ?Await]
MultiplicativeExpression
[?Yield, ?Await]
MultiplicativeOperator
ExponentiationExpression
[?Yield, ?Await]
MultiplicativeOperator
one of
AdditiveExpression
[Yield, Await]
MultiplicativeExpression
[?Yield, ?Await]
AdditiveExpression
[?Yield, ?Await]
MultiplicativeExpression
[?Yield, ?Await]
AdditiveExpression
[?Yield, ?Await]
MultiplicativeExpression
[?Yield, ?Await]
ShiftExpression
[Yield, Await]
AdditiveExpression
[?Yield, ?Await]
ShiftExpression
[?Yield, ?Await]
<<
AdditiveExpression
[?Yield, ?Await]
ShiftExpression
[?Yield, ?Await]
>>
AdditiveExpression
[?Yield, ?Await]
ShiftExpression
[?Yield, ?Await]
>>>
AdditiveExpression
[?Yield, ?Await]
RelationalExpression
[In, Yield, Await]
ShiftExpression
[?Yield, ?Await]
RelationalExpression
[?In, ?Yield, ?Await]
ShiftExpression
[?Yield, ?Await]
RelationalExpression
[?In, ?Yield, ?Await]
ShiftExpression
[?Yield, ?Await]
RelationalExpression
[?In, ?Yield, ?Await]
<=
ShiftExpression
[?Yield, ?Await]
RelationalExpression
[?In, ?Yield, ?Await]
>=
ShiftExpression
[?Yield, ?Await]
RelationalExpression
[?In, ?Yield, ?Await]
instanceof
ShiftExpression
[?Yield, ?Await]
[+In]
RelationalExpression
[+In, ?Yield, ?Await]
in
ShiftExpression
[?Yield, ?Await]
[+In]
PrivateIdentifier
in
ShiftExpression
[?Yield, ?Await]
EqualityExpression
[In, Yield, Await]
RelationalExpression
[?In, ?Yield, ?Await]
EqualityExpression
[?In, ?Yield, ?Await]
==
RelationalExpression
[?In, ?Yield, ?Await]
EqualityExpression
[?In, ?Yield, ?Await]
!=
RelationalExpression
[?In, ?Yield, ?Await]
EqualityExpression
[?In, ?Yield, ?Await]
===
RelationalExpression
[?In, ?Yield, ?Await]
EqualityExpression
[?In, ?Yield, ?Await]
!==
RelationalExpression
[?In, ?Yield, ?Await]
BitwiseANDExpression
[In, Yield, Await]
EqualityExpression
[?In, ?Yield, ?Await]
BitwiseANDExpression
[?In, ?Yield, ?Await]
EqualityExpression
[?In, ?Yield, ?Await]
BitwiseXORExpression
[In, Yield, Await]
BitwiseANDExpression
[?In, ?Yield, ?Await]
BitwiseXORExpression
[?In, ?Yield, ?Await]
BitwiseANDExpression
[?In, ?Yield, ?Await]
BitwiseORExpression
[In, Yield, Await]
BitwiseXORExpression
[?In, ?Yield, ?Await]
BitwiseORExpression
[?In, ?Yield, ?Await]
BitwiseXORExpression
[?In, ?Yield, ?Await]
LogicalANDExpression
[In, Yield, Await]
BitwiseORExpression
[?In, ?Yield, ?Await]
LogicalANDExpression
[?In, ?Yield, ?Await]
&&
BitwiseORExpression
[?In, ?Yield, ?Await]
LogicalORExpression
[In, Yield, Await]
LogicalANDExpression
[?In, ?Yield, ?Await]
LogicalORExpression
[?In, ?Yield, ?Await]
||
LogicalANDExpression
[?In, ?Yield, ?Await]
CoalesceExpression
[In, Yield, Await]
CoalesceExpressionHead
[?In, ?Yield, ?Await]
??
BitwiseORExpression
[?In, ?Yield, ?Await]
CoalesceExpressionHead
[In, Yield, Await]
CoalesceExpression
[?In, ?Yield, ?Await]
BitwiseORExpression
[?In, ?Yield, ?Await]
ShortCircuitExpression
[In, Yield, Await]
LogicalORExpression
[?In, ?Yield, ?Await]
CoalesceExpression
[?In, ?Yield, ?Await]
ConditionalExpression
[In, Yield, Await]
ShortCircuitExpression
[?In, ?Yield, ?Await]
ShortCircuitExpression
[?In, ?Yield, ?Await]
AssignmentExpression
[+In, ?Yield, ?Await]
AssignmentExpression
[?In, ?Yield, ?Await]
AssignmentExpression
[In, Yield, Await]
ConditionalExpression
[?In, ?Yield, ?Await]
[+Yield]
YieldExpression
[?In, ?Await]
ArrowFunction
[?In, ?Yield, ?Await]
AsyncArrowFunction
[?In, ?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
AssignmentExpression
[?In, ?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
AssignmentOperator
AssignmentExpression
[?In, ?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
&&=
AssignmentExpression
[?In, ?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
||=
AssignmentExpression
[?In, ?Yield, ?Await]
LeftHandSideExpression
[?Yield, ?Await]
??=
AssignmentExpression
[?In, ?Yield, ?Await]
AssignmentOperator
one of
*=
/=
%=
+=
-=
<<=
>>=
>>>=
&=
^=
|=
**=
In certain circumstances when processing an instance of the production
AssignmentExpression
[In, Yield, Await]
LeftHandSideExpression
[?Yield, ?Await]
AssignmentExpression
[?In, ?Yield, ?Await]
the interpretation of
LeftHandSideExpression
is refined using the following grammar:
AssignmentPattern
[Yield, Await]
ObjectAssignmentPattern
[?Yield, ?Await]
ArrayAssignmentPattern
[?Yield, ?Await]
ObjectAssignmentPattern
[Yield, Await]
AssignmentRestProperty
[?Yield, ?Await]
AssignmentPropertyList
[?Yield, ?Await]
AssignmentPropertyList
[?Yield, ?Await]
AssignmentRestProperty
[?Yield, ?Await]
opt
ArrayAssignmentPattern
[Yield, Await]
Elision
opt
AssignmentRestElement
[?Yield, ?Await]
opt
AssignmentElementList
[?Yield, ?Await]
AssignmentElementList
[?Yield, ?Await]
Elision
opt
AssignmentRestElement
[?Yield, ?Await]
opt
AssignmentRestProperty
[Yield, Await]
...
DestructuringAssignmentTarget
[?Yield, ?Await]
AssignmentPropertyList
[Yield, Await]
AssignmentProperty
[?Yield, ?Await]
AssignmentPropertyList
[?Yield, ?Await]
AssignmentProperty
[?Yield, ?Await]
AssignmentElementList
[Yield, Await]
AssignmentElisionElement
[?Yield, ?Await]
AssignmentElementList
[?Yield, ?Await]
AssignmentElisionElement
[?Yield, ?Await]
AssignmentElisionElement
[Yield, Await]
Elision
opt
AssignmentElement
[?Yield, ?Await]
AssignmentProperty
[Yield, Await]
IdentifierReference
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
opt
PropertyName
[?Yield, ?Await]
AssignmentElement
[?Yield, ?Await]
AssignmentElement
[Yield, Await]
DestructuringAssignmentTarget
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
opt
AssignmentRestElement
[Yield, Await]
...
DestructuringAssignmentTarget
[?Yield, ?Await]
DestructuringAssignmentTarget
[Yield, Await]
LeftHandSideExpression
[?Yield, ?Await]
Expression
[In, Yield, Await]
AssignmentExpression
[?In, ?Yield, ?Await]
Expression
[?In, ?Yield, ?Await]
AssignmentExpression
[?In, ?Yield, ?Await]
A.3
Statements
Statement
[Yield, Await, Return]
BlockStatement
[?Yield, ?Await, ?Return]
VariableStatement
[?Yield, ?Await]
EmptyStatement
ExpressionStatement
[?Yield, ?Await]
IfStatement
[?Yield, ?Await, ?Return]
BreakableStatement
[?Yield, ?Await, ?Return]
ContinueStatement
[?Yield, ?Await]
BreakStatement
[?Yield, ?Await]
[+Return]
ReturnStatement
[?Yield, ?Await]
WithStatement
[?Yield, ?Await, ?Return]
LabelledStatement
[?Yield, ?Await, ?Return]
ThrowStatement
[?Yield, ?Await]
TryStatement
[?Yield, ?Await, ?Return]
DebuggerStatement
Declaration
[Yield, Await]
HoistableDeclaration
[?Yield, ?Await, ~Default]
ClassDeclaration
[?Yield, ?Await, ~Default]
LexicalDeclaration
[+In, ?Yield, ?Await]
HoistableDeclaration
[Yield, Await, Default]
FunctionDeclaration
[?Yield, ?Await, ?Default]
GeneratorDeclaration
[?Yield, ?Await, ?Default]
AsyncFunctionDeclaration
[?Yield, ?Await, ?Default]
AsyncGeneratorDeclaration
[?Yield, ?Await, ?Default]
BreakableStatement
[Yield, Await, Return]
IterationStatement
[?Yield, ?Await, ?Return]
SwitchStatement
[?Yield, ?Await, ?Return]
BlockStatement
[Yield, Await, Return]
Block
[?Yield, ?Await, ?Return]
Block
[Yield, Await, Return]
StatementList
[?Yield, ?Await, ?Return]
opt
StatementList
[Yield, Await, Return]
StatementListItem
[?Yield, ?Await, ?Return]
StatementList
[?Yield, ?Await, ?Return]
StatementListItem
[?Yield, ?Await, ?Return]
StatementListItem
[Yield, Await, Return]
Statement
[?Yield, ?Await, ?Return]
Declaration
[?Yield, ?Await]
LexicalDeclaration
[In, Yield, Await]
LetOrConst
BindingList
[?In, ?Yield, ?Await]
LetOrConst
let
const
BindingList
[In, Yield, Await]
LexicalBinding
[?In, ?Yield, ?Await]
BindingList
[?In, ?Yield, ?Await]
LexicalBinding
[?In, ?Yield, ?Await]
LexicalBinding
[In, Yield, Await]
BindingIdentifier
[?Yield, ?Await]
Initializer
[?In, ?Yield, ?Await]
opt
BindingPattern
[?Yield, ?Await]
Initializer
[?In, ?Yield, ?Await]
VariableStatement
[Yield, Await]
var
VariableDeclarationList
[+In, ?Yield, ?Await]
VariableDeclarationList
[In, Yield, Await]
VariableDeclaration
[?In, ?Yield, ?Await]
VariableDeclarationList
[?In, ?Yield, ?Await]
VariableDeclaration
[?In, ?Yield, ?Await]
VariableDeclaration
[In, Yield, Await]
BindingIdentifier
[?Yield, ?Await]
Initializer
[?In, ?Yield, ?Await]
opt
BindingPattern
[?Yield, ?Await]
Initializer
[?In, ?Yield, ?Await]
BindingPattern
[Yield, Await]
ObjectBindingPattern
[?Yield, ?Await]
ArrayBindingPattern
[?Yield, ?Await]
ObjectBindingPattern
[Yield, Await]
BindingRestProperty
[?Yield, ?Await]
BindingPropertyList
[?Yield, ?Await]
BindingPropertyList
[?Yield, ?Await]
BindingRestProperty
[?Yield, ?Await]
opt
ArrayBindingPattern
[Yield, Await]
Elision
opt
BindingRestElement
[?Yield, ?Await]
opt
BindingElementList
[?Yield, ?Await]
BindingElementList
[?Yield, ?Await]
Elision
opt
BindingRestElement
[?Yield, ?Await]
opt
BindingRestProperty
[Yield, Await]
...
BindingIdentifier
[?Yield, ?Await]
BindingPropertyList
[Yield, Await]
BindingProperty
[?Yield, ?Await]
BindingPropertyList
[?Yield, ?Await]
BindingProperty
[?Yield, ?Await]
BindingElementList
[Yield, Await]
BindingElisionElement
[?Yield, ?Await]
BindingElementList
[?Yield, ?Await]
BindingElisionElement
[?Yield, ?Await]
BindingElisionElement
[Yield, Await]
Elision
opt
BindingElement
[?Yield, ?Await]
BindingProperty
[Yield, Await]
SingleNameBinding
[?Yield, ?Await]
PropertyName
[?Yield, ?Await]
BindingElement
[?Yield, ?Await]
BindingElement
[Yield, Await]
SingleNameBinding
[?Yield, ?Await]
BindingPattern
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
opt
SingleNameBinding
[Yield, Await]
BindingIdentifier
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
opt
BindingRestElement
[Yield, Await]
...
BindingIdentifier
[?Yield, ?Await]
...
BindingPattern
[?Yield, ?Await]
EmptyStatement
ExpressionStatement
[Yield, Await]
[lookahead ∉ {
function
async
[no
LineTerminator
here]
function
class
let
}]
Expression
[+In, ?Yield, ?Await]
IfStatement
[Yield, Await, Return]
if
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
else
Statement
[?Yield, ?Await, ?Return]
if
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
[lookahead ≠
else
IterationStatement
[Yield, Await, Return]
DoWhileStatement
[?Yield, ?Await, ?Return]
WhileStatement
[?Yield, ?Await, ?Return]
ForStatement
[?Yield, ?Await, ?Return]
ForInOfStatement
[?Yield, ?Await, ?Return]
DoWhileStatement
[Yield, Await, Return]
do
Statement
[?Yield, ?Await, ?Return]
while
Expression
[+In, ?Yield, ?Await]
WhileStatement
[Yield, Await, Return]
while
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
ForStatement
[Yield, Await, Return]
for
[lookahead ≠
let
Expression
[~In, ?Yield, ?Await]
opt
Expression
[+In, ?Yield, ?Await]
opt
Expression
[+In, ?Yield, ?Await]
opt
Statement
[?Yield, ?Await, ?Return]
for
var
VariableDeclarationList
[~In, ?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
opt
Expression
[+In, ?Yield, ?Await]
opt
Statement
[?Yield, ?Await, ?Return]
for
LexicalDeclaration
[~In, ?Yield, ?Await]
Expression
[+In, ?Yield, ?Await]
opt
Expression
[+In, ?Yield, ?Await]
opt
Statement
[?Yield, ?Await, ?Return]
ForInOfStatement
[Yield, Await, Return]
for
[lookahead ≠
let
LeftHandSideExpression
[?Yield, ?Await]
in
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
for
var
ForBinding
[?Yield, ?Await]
in
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
for
ForDeclaration
[?Yield, ?Await]
in
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
for
[lookahead ∉ {
let
async
of
}]
LeftHandSideExpression
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
for
var
ForBinding
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
for
ForDeclaration
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
[+Await]
for
await
[lookahead ≠
let
LeftHandSideExpression
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
[+Await]
for
await
var
ForBinding
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
[+Await]
for
await
ForDeclaration
[?Yield, ?Await]
of
AssignmentExpression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
ForDeclaration
[Yield, Await]
LetOrConst
ForBinding
[?Yield, ?Await]
ForBinding
[Yield, Await]
BindingIdentifier
[?Yield, ?Await]
BindingPattern
[?Yield, ?Await]
ContinueStatement
[Yield, Await]
continue
continue
[no
LineTerminator
here]
LabelIdentifier
[?Yield, ?Await]
BreakStatement
[Yield, Await]
break
break
[no
LineTerminator
here]
LabelIdentifier
[?Yield, ?Await]
ReturnStatement
[Yield, Await]
return
return
[no
LineTerminator
here]
Expression
[+In, ?Yield, ?Await]
WithStatement
[Yield, Await, Return]
with
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
SwitchStatement
[Yield, Await, Return]
switch
Expression
[+In, ?Yield, ?Await]
CaseBlock
[?Yield, ?Await, ?Return]
CaseBlock
[Yield, Await, Return]
CaseClauses
[?Yield, ?Await, ?Return]
opt
CaseClauses
[?Yield, ?Await, ?Return]
opt
DefaultClause
[?Yield, ?Await, ?Return]
CaseClauses
[?Yield, ?Await, ?Return]
opt
CaseClauses
[Yield, Await, Return]
CaseClause
[?Yield, ?Await, ?Return]
CaseClauses
[?Yield, ?Await, ?Return]
CaseClause
[?Yield, ?Await, ?Return]
CaseClause
[Yield, Await, Return]
case
Expression
[+In, ?Yield, ?Await]
StatementList
[?Yield, ?Await, ?Return]
opt
DefaultClause
[Yield, Await, Return]
default
StatementList
[?Yield, ?Await, ?Return]
opt
LabelledStatement
[Yield, Await, Return]
LabelIdentifier
[?Yield, ?Await]
LabelledItem
[?Yield, ?Await, ?Return]
LabelledItem
[Yield, Await, Return]
Statement
[?Yield, ?Await, ?Return]
FunctionDeclaration
[?Yield, ?Await, ~Default]
ThrowStatement
[Yield, Await]
throw
[no
LineTerminator
here]
Expression
[+In, ?Yield, ?Await]
TryStatement
[Yield, Await, Return]
try
Block
[?Yield, ?Await, ?Return]
Catch
[?Yield, ?Await, ?Return]
try
Block
[?Yield, ?Await, ?Return]
Finally
[?Yield, ?Await, ?Return]
try
Block
[?Yield, ?Await, ?Return]
Catch
[?Yield, ?Await, ?Return]
Finally
[?Yield, ?Await, ?Return]
Catch
[Yield, Await, Return]
catch
CatchParameter
[?Yield, ?Await]
Block
[?Yield, ?Await, ?Return]
catch
Block
[?Yield, ?Await, ?Return]
Finally
[Yield, Await, Return]
finally
Block
[?Yield, ?Await, ?Return]
CatchParameter
[Yield, Await]
BindingIdentifier
[?Yield, ?Await]
BindingPattern
[?Yield, ?Await]
DebuggerStatement
debugger
A.4
Functions and Classes
UniqueFormalParameters
[Yield, Await]
FormalParameters
[?Yield, ?Await]
FormalParameters
[Yield, Await]
[empty]
FunctionRestParameter
[?Yield, ?Await]
FormalParameterList
[?Yield, ?Await]
FormalParameterList
[?Yield, ?Await]
FormalParameterList
[?Yield, ?Await]
FunctionRestParameter
[?Yield, ?Await]
FormalParameterList
[Yield, Await]
FormalParameter
[?Yield, ?Await]
FormalParameterList
[?Yield, ?Await]
FormalParameter
[?Yield, ?Await]
FunctionRestParameter
[Yield, Await]
BindingRestElement
[?Yield, ?Await]
FormalParameter
[Yield, Await]
BindingElement
[?Yield, ?Await]
FunctionDeclaration
[Yield, Await, Default]
function
BindingIdentifier
[?Yield, ?Await]
FormalParameters
[~Yield, ~Await]
FunctionBody
[~Yield, ~Await]
[+Default]
function
FormalParameters
[~Yield, ~Await]
FunctionBody
[~Yield, ~Await]
FunctionExpression
function
BindingIdentifier
[~Yield, ~Await]
opt
FormalParameters
[~Yield, ~Await]
FunctionBody
[~Yield, ~Await]
FunctionBody
[Yield, Await]
FunctionStatementList
[?Yield, ?Await]
FunctionStatementList
[Yield, Await]
StatementList
[?Yield, ?Await, +Return]
opt
ArrowFunction
[In, Yield, Await]
ArrowParameters
[?Yield, ?Await]
[no
LineTerminator
here]
=>
ConciseBody
[?In]
ArrowParameters
[Yield, Await]
BindingIdentifier
[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList
[?Yield, ?Await]
ConciseBody
[In]
[lookahead ≠
ExpressionBody
[?In, ~Await]
FunctionBody
[~Yield, ~Await]
ExpressionBody
[In, Await]
AssignmentExpression
[?In, ~Yield, ?Await]
When processing an instance of the production
ArrowParameters
[Yield, Await]
CoverParenthesizedExpressionAndArrowParameterList
[?Yield, ?Await]
the interpretation of
CoverParenthesizedExpressionAndArrowParameterList
is refined using the following grammar:
ArrowFormalParameters
[Yield, Await]
UniqueFormalParameters
[?Yield, ?Await]
AsyncArrowFunction
[In, Yield, Await]
async
[no
LineTerminator
here]
AsyncArrowBindingIdentifier
[?Yield]
[no
LineTerminator
here]
=>
AsyncConciseBody
[?In]
CoverCallExpressionAndAsyncArrowHead
[?Yield, ?Await]
[no
LineTerminator
here]
=>
AsyncConciseBody
[?In]
AsyncConciseBody
[In]
[lookahead ≠
ExpressionBody
[?In, +Await]
AsyncFunctionBody
AsyncArrowBindingIdentifier
[Yield]
BindingIdentifier
[?Yield, +Await]
CoverCallExpressionAndAsyncArrowHead
[Yield, Await]
MemberExpression
[?Yield, ?Await]
Arguments
[?Yield, ?Await]
When processing an instance of the production
AsyncArrowFunction
[In, Yield, Await]
CoverCallExpressionAndAsyncArrowHead
[?Yield, ?Await]
[no
LineTerminator
here]
=>
AsyncConciseBody
[?In]
the interpretation of
CoverCallExpressionAndAsyncArrowHead
is refined using the following grammar:
AsyncArrowHead
async
[no
LineTerminator
here]
ArrowFormalParameters
[~Yield, +Await]
MethodDefinition
[Yield, Await]
ClassElementName
[?Yield, ?Await]
UniqueFormalParameters
[~Yield, ~Await]
FunctionBody
[~Yield, ~Await]
GeneratorMethod
[?Yield, ?Await]
AsyncMethod
[?Yield, ?Await]
AsyncGeneratorMethod
[?Yield, ?Await]
get
ClassElementName
[?Yield, ?Await]
FunctionBody
[~Yield, ~Await]
set
ClassElementName
[?Yield, ?Await]
PropertySetParameterList
FunctionBody
[~Yield, ~Await]
PropertySetParameterList
FormalParameter
[~Yield, ~Await]
GeneratorDeclaration
[Yield, Await, Default]
function
BindingIdentifier
[?Yield, ?Await]
FormalParameters
[+Yield, ~Await]
GeneratorBody
[+Default]
function
FormalParameters
[+Yield, ~Await]
GeneratorBody
GeneratorExpression
function
BindingIdentifier
[+Yield, ~Await]
opt
FormalParameters
[+Yield, ~Await]
GeneratorBody
GeneratorMethod
[Yield, Await]
ClassElementName
[?Yield, ?Await]
UniqueFormalParameters
[+Yield, ~Await]
GeneratorBody
GeneratorBody
FunctionBody
[+Yield, ~Await]
YieldExpression
[In, Await]
yield
yield
[no
LineTerminator
here]
AssignmentExpression
[?In, +Yield, ?Await]
yield
[no
LineTerminator
here]
AssignmentExpression
[?In, +Yield, ?Await]
AsyncGeneratorDeclaration
[Yield, Await, Default]
async
[no
LineTerminator
here]
function
BindingIdentifier
[?Yield, ?Await]
FormalParameters
[+Yield, +Await]
AsyncGeneratorBody
[+Default]
async
[no
LineTerminator
here]
function
FormalParameters
[+Yield, +Await]
AsyncGeneratorBody
AsyncGeneratorExpression
async
[no
LineTerminator
here]
function
BindingIdentifier
[+Yield, +Await]
opt
FormalParameters
[+Yield, +Await]
AsyncGeneratorBody
AsyncGeneratorMethod
[Yield, Await]
async
[no
LineTerminator
here]
ClassElementName
[?Yield, ?Await]
UniqueFormalParameters
[+Yield, +Await]
AsyncGeneratorBody
AsyncGeneratorBody
FunctionBody
[+Yield, +Await]
AsyncFunctionDeclaration
[Yield, Await, Default]
async
[no
LineTerminator
here]
function
BindingIdentifier
[?Yield, ?Await]
FormalParameters
[~Yield, +Await]
AsyncFunctionBody
[+Default]
async
[no
LineTerminator
here]
function
FormalParameters
[~Yield, +Await]
AsyncFunctionBody
AsyncFunctionExpression
async
[no
LineTerminator
here]
function
BindingIdentifier
[~Yield, +Await]
opt
FormalParameters
[~Yield, +Await]
AsyncFunctionBody
AsyncMethod
[Yield, Await]
async
[no
LineTerminator
here]
ClassElementName
[?Yield, ?Await]
UniqueFormalParameters
[~Yield, +Await]
AsyncFunctionBody
AsyncFunctionBody
FunctionBody
[~Yield, +Await]
AwaitExpression
[Yield]
await
UnaryExpression
[?Yield, +Await]
ClassDeclaration
[Yield, Await, Default]
class
BindingIdentifier
[?Yield, ?Await]
ClassTail
[?Yield, ?Await]
[+Default]
class
ClassTail
[?Yield, ?Await]
ClassExpression
[Yield, Await]
class
BindingIdentifier
[?Yield, ?Await]
opt
ClassTail
[?Yield, ?Await]
ClassTail
[Yield, Await]
ClassHeritage
[?Yield, ?Await]
opt
ClassBody
[?Yield, ?Await]
opt
ClassHeritage
[Yield, Await]
extends
LeftHandSideExpression
[?Yield, ?Await]
ClassBody
[Yield, Await]
ClassElementList
[?Yield, ?Await]
ClassElementList
[Yield, Await]
ClassElement
[?Yield, ?Await]
ClassElementList
[?Yield, ?Await]
ClassElement
[?Yield, ?Await]
ClassElement
[Yield, Await]
MethodDefinition
[?Yield, ?Await]
static
MethodDefinition
[?Yield, ?Await]
FieldDefinition
[?Yield, ?Await]
static
FieldDefinition
[?Yield, ?Await]
ClassStaticBlock
FieldDefinition
[Yield, Await]
ClassElementName
[?Yield, ?Await]
Initializer
[+In, ?Yield, ?Await]
opt
ClassElementName
[Yield, Await]
PropertyName
[?Yield, ?Await]
PrivateIdentifier
ClassStaticBlock
static
ClassStaticBlockBody
ClassStaticBlockBody
ClassStaticBlockStatementList
ClassStaticBlockStatementList
StatementList
[~Yield, +Await, ~Return]
opt
A.5
Scripts and Modules
Script
ScriptBody
opt
ScriptBody
StatementList
[~Yield, ~Await, ~Return]
Module
ModuleBody
opt
ModuleBody
ModuleItemList
ModuleItemList
ModuleItem
ModuleItemList
ModuleItem
ModuleItem
ImportDeclaration
ExportDeclaration
StatementListItem
[~Yield, +Await, ~Return]
ModuleExportName
IdentifierName
StringLiteral
ImportDeclaration
import
ImportClause
FromClause
import
ModuleSpecifier
ImportClause
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding
NameSpaceImport
ImportedDefaultBinding
NamedImports
ImportedDefaultBinding
ImportedBinding
NameSpaceImport
as
ImportedBinding
NamedImports
ImportsList
ImportsList
FromClause
from
ModuleSpecifier
ImportsList
ImportSpecifier
ImportsList
ImportSpecifier
ImportSpecifier
ImportedBinding
ModuleExportName
as
ImportedBinding
ModuleSpecifier
StringLiteral
ImportedBinding
BindingIdentifier
[~Yield, +Await]
ExportDeclaration
export
ExportFromClause
FromClause
export
NamedExports
export
VariableStatement
[~Yield, +Await]
export
Declaration
[~Yield, +Await]
export
default
HoistableDeclaration
[~Yield, +Await, +Default]
export
default
ClassDeclaration
[~Yield, +Await, +Default]
export
default
[lookahead ∉ {
function
async
[no
LineTerminator
here]
function
class
}]
AssignmentExpression
[+In, ~Yield, +Await]
ExportFromClause
as
ModuleExportName
NamedExports
NamedExports
ExportsList
ExportsList
ExportsList
ExportSpecifier
ExportsList
ExportSpecifier
ExportSpecifier
ModuleExportName
ModuleExportName
as
ModuleExportName
A.6
Number Conversions
StringNumericLiteral
:::
StrWhiteSpace
opt
StrWhiteSpace
opt
StrNumericLiteral
StrWhiteSpace
opt
StrWhiteSpace
:::
StrWhiteSpaceChar
StrWhiteSpace
opt
StrWhiteSpaceChar
:::
WhiteSpace
LineTerminator
StrNumericLiteral
:::
StrDecimalLiteral
NonDecimalIntegerLiteral
[~Sep]
StrDecimalLiteral
:::
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral
:::
Infinity
DecimalDigits
[~Sep]
DecimalDigits
[~Sep]
opt
ExponentPart
[~Sep]
opt
DecimalDigits
[~Sep]
ExponentPart
[~Sep]
opt
DecimalDigits
[~Sep]
ExponentPart
[~Sep]
opt
All grammar symbols not explicitly defined by the
StringNumericLiteral
grammar have the definitions used in the
Lexical Grammar for numeric literals
StringIntegerLiteral
:::
StrWhiteSpace
opt
StrWhiteSpace
opt
StrIntegerLiteral
StrWhiteSpace
opt
StrIntegerLiteral
:::
SignedInteger
[~Sep]
NonDecimalIntegerLiteral
[~Sep]
A.7
Time Zone Offset String Format
UTCOffset
:::
TemporalSign
Hour
TemporalSign
Hour
HourSubcomponents
[+Extended]
TemporalSign
Hour
HourSubcomponents
[~Extended]
TemporalSign
:::
ASCIISign

ASCIISign
:::
one of
Hour
:::
DecimalDigit
DecimalDigit
20
21
22
23
HourSubcomponents
[Extended]
:::
TimeSeparator
[?Extended]
MinuteSecond
TimeSeparator
[?Extended]
MinuteSecond
TimeSeparator
[?Extended]
MinuteSecond
TemporalDecimalFraction
opt
TimeSeparator
[Extended]
:::
[+Extended]
[~Extended]
[empty]
MinuteSecond
:::
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalFraction
:::
TemporalDecimalSeparator
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
DecimalDigit
TemporalDecimalSeparator
:::
one of
A.8
Regular Expressions
Pattern
[UnicodeMode, N]
::
Disjunction
[?UnicodeMode, ?N]
Disjunction
[UnicodeMode, N]
::
Alternative
[?UnicodeMode, ?N]
Alternative
[?UnicodeMode, ?N]
Disjunction
[?UnicodeMode, ?N]
Alternative
[UnicodeMode, N]
::
[empty]
Alternative
[?UnicodeMode, ?N]
Term
[?UnicodeMode, ?N]
Term
[UnicodeMode, N]
::
Assertion
[?UnicodeMode, ?N]
Atom
[?UnicodeMode, ?N]
Atom
[?UnicodeMode, ?N]
Quantifier
Assertion
[UnicodeMode, N]
::
\b
\B
(?=
Disjunction
[?UnicodeMode, ?N]
(?!
Disjunction
[?UnicodeMode, ?N]
(?<=
Disjunction
[?UnicodeMode, ?N]
(?Disjunction
[?UnicodeMode, ?N]
Quantifier
::
QuantifierPrefix
QuantifierPrefix
QuantifierPrefix
::
DecimalDigits
[~Sep]
DecimalDigits
[~Sep]
,}
DecimalDigits
[~Sep]
DecimalDigits
[~Sep]
Atom
[UnicodeMode, N]
::
PatternCharacter
AtomEscape
[?UnicodeMode, ?N]
CharacterClass
[?UnicodeMode]
GroupSpecifier
[?UnicodeMode]
opt
Disjunction
[?UnicodeMode, ?N]
(?:
Disjunction
[?UnicodeMode, ?N]
SyntaxCharacter
::
one of
PatternCharacter
::
SourceCharacter
but not
SyntaxCharacter
AtomEscape
[UnicodeMode, N]
::
DecimalEscape
CharacterClassEscape
[?UnicodeMode]
CharacterEscape
[?UnicodeMode]
[+N]
GroupName
[?UnicodeMode]
CharacterEscape
[UnicodeMode]
::
ControlEscape
AsciiLetter
[lookahead ∉
DecimalDigit
HexEscapeSequence
RegExpUnicodeEscapeSequence
[?UnicodeMode]
IdentityEscape
[?UnicodeMode]
ControlEscape
::
one of
GroupSpecifier
[UnicodeMode]
::
GroupName
[?UnicodeMode]
GroupName
[UnicodeMode]
::
RegExpIdentifierName
[?UnicodeMode]
RegExpIdentifierName
[UnicodeMode]
::
RegExpIdentifierStart
[?UnicodeMode]
RegExpIdentifierName
[?UnicodeMode]
RegExpIdentifierPart
[?UnicodeMode]
RegExpIdentifierStart
[UnicodeMode]
::
IdentifierStartChar
RegExpUnicodeEscapeSequence
[+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpIdentifierPart
[UnicodeMode]
::
IdentifierPartChar
RegExpUnicodeEscapeSequence
[+UnicodeMode]
[~UnicodeMode]
UnicodeLeadSurrogate
UnicodeTrailSurrogate
RegExpUnicodeEscapeSequence
[UnicodeMode]
::
[+UnicodeMode]
HexLeadSurrogate
\u
HexTrailSurrogate
[+UnicodeMode]
HexLeadSurrogate
[+UnicodeMode]
HexTrailSurrogate
[+UnicodeMode]
HexNonSurrogate
[~UnicodeMode]
Hex4Digits
[+UnicodeMode]
u{
CodePoint
UnicodeLeadSurrogate
::
any Unicode code point in the inclusive interval from U+D800 to U+DBFF
UnicodeTrailSurrogate
::
any Unicode code point in the inclusive interval from U+DC00 to U+DFFF
Each
\u
HexTrailSurrogate
for which the choice of associated
HexLeadSurrogate
is ambiguous shall be associated with the nearest possible
HexLeadSurrogate
that would otherwise have no corresponding
\u
HexTrailSurrogate
HexLeadSurrogate
::
Hex4Digits
but only if the MV of
Hex4Digits
is in the
inclusive interval
from 0xD800 to 0xDBFF
HexTrailSurrogate
::
Hex4Digits
but only if the MV of
Hex4Digits
is in the
inclusive interval
from 0xDC00 to 0xDFFF
HexNonSurrogate
::
Hex4Digits
but only if the MV of
Hex4Digits
is not in the
inclusive interval
from 0xD800 to 0xDFFF
IdentityEscape
[UnicodeMode]
::
[+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
[~UnicodeMode]
SourceCharacter
but not
UnicodeIDContinue
DecimalEscape
::
NonZeroDigit
DecimalDigits
[~Sep]
opt
[lookahead ∉
DecimalDigit
CharacterClassEscape
[UnicodeMode]
::
[+UnicodeMode]
p{
UnicodePropertyValueExpression
[+UnicodeMode]
P{
UnicodePropertyValueExpression
UnicodePropertyValueExpression
::
UnicodePropertyName
UnicodePropertyValue
LoneUnicodePropertyNameOrValue
UnicodePropertyName
::
UnicodePropertyNameCharacters
UnicodePropertyNameCharacters
::
UnicodePropertyNameCharacter
UnicodePropertyNameCharacters
opt
UnicodePropertyValue
::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue
::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters
::
UnicodePropertyValueCharacter
UnicodePropertyValueCharacters
opt
UnicodePropertyValueCharacter
::
UnicodePropertyNameCharacter
DecimalDigit
UnicodePropertyNameCharacter
::
AsciiLetter
CharacterClass
[UnicodeMode]
::
[lookahead ≠
ClassRanges
[?UnicodeMode]
[^
ClassRanges
[?UnicodeMode]
ClassRanges
[UnicodeMode]
::
[empty]
NonemptyClassRanges
[?UnicodeMode]
NonemptyClassRanges
[UnicodeMode]
::
ClassAtom
[?UnicodeMode]
ClassAtom
[?UnicodeMode]
NonemptyClassRangesNoDash
[?UnicodeMode]
ClassAtom
[?UnicodeMode]
ClassAtom
[?UnicodeMode]
ClassRanges
[?UnicodeMode]
NonemptyClassRangesNoDash
[UnicodeMode]
::
ClassAtom
[?UnicodeMode]
ClassAtomNoDash
[?UnicodeMode]
NonemptyClassRangesNoDash
[?UnicodeMode]
ClassAtomNoDash
[?UnicodeMode]
ClassAtom
[?UnicodeMode]
ClassRanges
[?UnicodeMode]
ClassAtom
[UnicodeMode]
::
ClassAtomNoDash
[?UnicodeMode]
ClassAtomNoDash
[UnicodeMode]
::
SourceCharacter
but not one of
or
or
ClassEscape
[?UnicodeMode]
ClassEscape
[UnicodeMode]
::
[+UnicodeMode]
CharacterClassEscape
[?UnicodeMode]
CharacterEscape
[?UnicodeMode]
Additional ECMAScript Features for Web Browsers
The ECMAScript language syntax and semantics defined in this annex are required when the ECMAScript
host
is a web browser. The content of this annex is normative but optional if the ECMAScript
host
is not a web browser.
Note
This annex describes various legacy features and other characteristics of web browser ECMAScript
hosts
All of the language features and behaviours specified in this annex
have one or more undesirable characteristics and in the absence of
legacy usage would be removed from this specification. However, the
usage of these features by large numbers of existing web pages means
that web browsers must continue to support them. The specifications in
this annex define the requirements for interoperable implementations of
these legacy features.
These features are not considered part of the core ECMAScript
language. Programmers should not use or assume the existence of these
features and behaviours when writing new ECMAScript code. ECMAScript
implementations are discouraged from implementing these features unless
the implementation is part of a web browser or is required to run the
same legacy ECMAScript code that web browsers encounter.
B.1
Additional Syntax
B.1.1
HTML-like Comments
The syntax and semantics of
12.4
is extended as follows except that this extension is not allowed when parsing source text using the
goal symbol
Module
Syntax
Comment
::
MultiLineComment
SingleLineComment
SingleLineHTMLOpenComment
SingleLineHTMLCloseComment
SingleLineDelimitedComment
MultiLineComment
::
/*
FirstCommentLine
opt
LineTerminator
MultiLineCommentChars
opt
*/
HTMLCloseComment
opt
FirstCommentLine
::
SingleLineDelimitedCommentChars
SingleLineHTMLOpenComment
::

SingleLineCommentChars
opt
SingleLineDelimitedCommentChars
::
SingleLineNotAsteriskChar
SingleLineDelimitedCommentChars
opt
SingleLinePostAsteriskCommentChars
opt
SingleLineNotAsteriskChar
::
SourceCharacter
but not one of
or
LineTerminator
SingleLinePostAsteriskCommentChars
::
SingleLineNotForwardSlashOrAsteriskChar
SingleLineDelimitedCommentChars
opt
SingleLinePostAsteriskCommentChars
opt
SingleLineNotForwardSlashOrAsteriskChar
::
SourceCharacter
but not one of
or
or
LineTerminator
WhiteSpaceSequence
::
WhiteSpace
WhiteSpaceSequence
opt
SingleLineDelimitedCommentSequence
::
SingleLineDelimitedComment
WhiteSpaceSequence
opt
SingleLineDelimitedCommentSequence
opt
Similar to a
MultiLineComment
that contains a line terminator code point, a
SingleLineHTMLCloseComment
is considered to be a
LineTerminator
for purposes of parsing by the syntactic grammar.
B.1.2
Regular Expressions Patterns
The syntax of
22.2.1
is modified and extended as follows. These changes introduce
ambiguities that are broken by the ordering of grammar productions and
by contextual information. When parsing using the following grammar,
each alternative is considered only if previous production alternatives
do not match.
This alternative pattern grammar and semantics only changes the
syntax and semantics of BMP patterns. The following grammar extensions
include productions parameterized with the [UnicodeMode] parameter.
However, none of these extensions change the syntax of Unicode patterns
recognized when parsing with the [UnicodeMode] parameter present on the
goal symbol
Syntax
Term
[UnicodeMode, N]
::
[+UnicodeMode]
Assertion
[+UnicodeMode, ?N]
[+UnicodeMode]
Atom
[+UnicodeMode, ?N]
Quantifier
[+UnicodeMode]
Atom
[+UnicodeMode, ?N]
[~UnicodeMode]
QuantifiableAssertion
[?N]
Quantifier
[~UnicodeMode]
Assertion
[~UnicodeMode, ?N]
[~UnicodeMode]
ExtendedAtom
[?N]
Quantifier
[~UnicodeMode]
ExtendedAtom
[?N]
Assertion
[UnicodeMode, N]
::
\b
\B
[+UnicodeMode]
(?=
Disjunction
[+UnicodeMode, ?N]
[+UnicodeMode]
(?!
Disjunction
[+UnicodeMode, ?N]
[~UnicodeMode]
QuantifiableAssertion
[?N]
(?<=
Disjunction
[?UnicodeMode, ?N]
(?Disjunction
[?UnicodeMode, ?N]
QuantifiableAssertion
[N]
::
(?=
Disjunction
[~UnicodeMode, ?N]
(?!
Disjunction
[~UnicodeMode, ?N]
ExtendedAtom
[N]
::
AtomEscape
[~UnicodeMode, ?N]
[lookahead =
CharacterClass
[~UnicodeMode]
GroupSpecifier
[~UnicodeMode]
opt
Disjunction
[~UnicodeMode, ?N]
(?:
Disjunction
[~UnicodeMode, ?N]
InvalidBracedQuantifier
ExtendedPatternCharacter
InvalidBracedQuantifier
::
DecimalDigits
[~Sep]
DecimalDigits
[~Sep]
,}
DecimalDigits
[~Sep]
DecimalDigits
[~Sep]
ExtendedPatternCharacter
::
SourceCharacter
but not one of
AtomEscape
[UnicodeMode, N]
::
[+UnicodeMode]
DecimalEscape
[~UnicodeMode]
DecimalEscape
but only if the
CapturingGroupNumber
of
DecimalEscape
is ≤
CountLeftCapturingParensWithin
(the
Pattern
containing
DecimalEscape
CharacterClassEscape
[?UnicodeMode]
CharacterEscape
[?UnicodeMode, ?N]
[+N]
GroupName
[?UnicodeMode]
CharacterEscape
[UnicodeMode, N]
::
ControlEscape
AsciiLetter
[lookahead ∉
DecimalDigit
HexEscapeSequence
RegExpUnicodeEscapeSequence
[?UnicodeMode]
[~UnicodeMode]
LegacyOctalEscapeSequence
IdentityEscape
[?UnicodeMode, ?N]
IdentityEscape
[UnicodeMode, N]
::
[+UnicodeMode]
SyntaxCharacter
[+UnicodeMode]
[~UnicodeMode]
SourceCharacterIdentityEscape
[?N]
SourceCharacterIdentityEscape
[N]
::
[~N]
SourceCharacter
but not
[+N]
SourceCharacter
but not one of
or
ClassAtomNoDash
[UnicodeMode, N]
::
SourceCharacter
but not one of
or
or
ClassEscape
[?UnicodeMode, ?N]
[lookahead =
ClassEscape
[UnicodeMode, N]
::
[+UnicodeMode]
[~UnicodeMode]
ClassControlLetter
CharacterClassEscape
[?UnicodeMode]
CharacterEscape
[?UnicodeMode, ?N]
ClassControlLetter
::
DecimalDigit
Note
When the same left-hand sides occurs with both [+UnicodeMode]
and [~UnicodeMode] guards it is to control the disambiguation priority.
B.1.2.1
Static Semantics: Early Errors
The semantics of
22.2.1.1
is extended as follows:
ExtendedAtom
::
InvalidBracedQuantifier
It is a Syntax Error if any source text is matched by this production.
Additionally, the rules for the following productions are modified with the addition of the
highlighted
text:
NonemptyClassRanges
::
ClassAtom
ClassAtom
ClassRanges
It is a Syntax Error if
IsCharacterClass
of the first
ClassAtom
is
true
or
IsCharacterClass
of the second
ClassAtom
is
true
and this production has a
[UnicodeMode]
parameter
It is a Syntax Error if
IsCharacterClass
of the first
ClassAtom
is
false
IsCharacterClass
of the second
ClassAtom
is
false
, and the
CharacterValue
of the first
ClassAtom
is strictly greater than the
CharacterValue
of the second
ClassAtom
NonemptyClassRangesNoDash
::
ClassAtomNoDash
ClassAtom
ClassRanges
It is a Syntax Error if
IsCharacterClass
of
ClassAtomNoDash
is
true
or
IsCharacterClass
of
ClassAtom
is
true
and this production has a
[UnicodeMode]
parameter
It is a Syntax Error if
IsCharacterClass
of
ClassAtomNoDash
is
false
IsCharacterClass
of
ClassAtom
is
false
, and the
CharacterValue
of
ClassAtomNoDash
is strictly greater than the
CharacterValue
of
ClassAtom
B.1.2.2
Static Semantics: CountLeftCapturingParensWithin and CountLeftCapturingParensBefore
In the definitions of
CountLeftCapturingParensWithin
and
CountLeftCapturingParensBefore
, references to “
Atom
::
GroupSpecifier
opt
Disjunction
” are to be interpreted as meaning “
Atom
::
GroupSpecifier
opt
Disjunction
” or “
ExtendedAtom
::
GroupSpecifier
opt
Disjunction
”.
B.1.2.3
Static Semantics: IsCharacterClass
The semantics of
22.2.1.5
is extended as follows:
ClassAtomNoDash
::
[lookahead =
1.
Return
false
B.1.2.4
Static Semantics: CharacterValue
The semantics of
22.2.1.6
is extended as follows:
ClassAtomNoDash
::
[lookahead =
1.
Return the numeric value of U+005C (REVERSE SOLIDUS).
ClassEscape
::
ClassControlLetter
1.
Let
ch
be the code point matched by
ClassControlLetter
2.
Let
be the numeric value of
ch
3.
Return the remainder of dividing
by 32.
CharacterEscape
::
LegacyOctalEscapeSequence
1.
Return the MV of
LegacyOctalEscapeSequence
(see
12.9.4.3
).
B.1.2.5
Runtime Semantics: CompileSubpattern
The semantics of
CompileSubpattern
is extended as follows:
The rule for
Term
::
QuantifiableAssertion
Quantifier
is the same as for
Term
::
Atom
Quantifier
but with
QuantifiableAssertion
substituted for
Atom
The rule for
Term
::
ExtendedAtom
Quantifier
is the same as for
Term
::
Atom
Quantifier
but with
ExtendedAtom
substituted for
Atom
The rule for
Term
::
ExtendedAtom
is the same as for
Term
::
Atom
but with
ExtendedAtom
substituted for
Atom
B.1.2.6
Runtime Semantics: CompileAssertion
CompileAssertion
rules for the
Assertion
::
(?=
Disjunction
and
Assertion
::
(?!
Disjunction
productions are also used for the
QuantifiableAssertion
productions, but with
QuantifiableAssertion
substituted for
Assertion
B.1.2.7
Runtime Semantics: CompileAtom
CompileAtom
rules for the
Atom
productions except for
Atom
::
PatternCharacter
are also used for the
ExtendedAtom
productions, but with
ExtendedAtom
substituted for
Atom
. The following rules, with parameter
direction
, are also added:
ExtendedAtom
::
[lookahead =
1.
Let
be the
CharSet
containing the single character
U+005C (REVERSE SOLIDUS).
2.
Return
CharacterSetMatcher
rer
false
direction
).
ExtendedAtom
::
ExtendedPatternCharacter
1.
Let
ch
be the character represented by
ExtendedPatternCharacter
2.
Let
be a one-element
CharSet
containing the character
ch
3.
Return
CharacterSetMatcher
rer
false
direction
).
B.1.2.8
Runtime Semantics: CompileToCharSet
The semantics of
22.2.2.9
is extended as follows:
The following two rules replace the corresponding rules of
CompileToCharSet
NonemptyClassRanges
::
ClassAtom
ClassAtom
ClassRanges
1.
Let
be
CompileToCharSet
of the first
ClassAtom
with argument
rer
2.
Let
be
CompileToCharSet
of the second
ClassAtom
with argument
rer
3.
Let
be
CompileToCharSet
of
ClassRanges
with argument
rer
4.
Let
be
CharacterRangeOrUnion
rer
).
5.
Return the union of
and
NonemptyClassRangesNoDash
::
ClassAtomNoDash
ClassAtom
ClassRanges
1.
Let
be
CompileToCharSet
of
ClassAtomNoDash
with argument
rer
2.
Let
be
CompileToCharSet
of
ClassAtom
with argument
rer
3.
Let
be
CompileToCharSet
of
ClassRanges
with argument
rer
4.
Let
be
CharacterRangeOrUnion
rer
).
5.
Return the union of
and
In addition, the following rules are added to
CompileToCharSet
ClassEscape
::
ClassControlLetter
1.
Let
cv
be the
CharacterValue
of this
ClassEscape
2.
Let
be the character whose character value is
cv
3.
Return the
CharSet
containing the single character
ClassAtomNoDash
::
[lookahead =
1.
Return the
CharSet
containing the single character
U+005C (REVERSE SOLIDUS).
Note
This production can only be reached from the sequence
\c
within a character class where it is not followed by an acceptable control character.
B.1.2.8.1
CharacterRangeOrUnion (
rer
The abstract operation CharacterRangeOrUnion takes arguments
rer
(a
RegExp Record
),
(a
CharSet
), and
(a
CharSet
) and returns a
CharSet
. It performs the following steps when called:
1.
If
rer
.[[Unicode]] is
false
, then
a.
If
does not contain exactly one character or
does not contain exactly one character, then
i.
Let
be the
CharSet
containing the single character
U+002D (HYPHEN-MINUS).
ii.
Return the union of
CharSets
and
2.
Return
CharacterRange
).
B.1.2.9
Static Semantics: ParsePattern (
patternText
The semantics of
22.2.3.4
is extended as follows:
The abstract operation
ParsePattern
takes arguments
patternText
(a sequence of Unicode code points) and
(a Boolean). It performs the following steps when called:
1.
If
is
true
, then
a.
Let
parseResult
be
ParseText
patternText
Pattern
[+UnicodeMode, +N]
).
2.
Else,
a.
Let
parseResult
be
ParseText
patternText
Pattern
[~UnicodeMode, ~N]
).
b.
If
parseResult
is a
Parse Node
and
parseResult
contains a
GroupName
, then
i.
Set
parseResult
to
ParseText
patternText
Pattern
[~UnicodeMode, +N]
).
3.
Return
parseResult
B.2
Additional Built-in Properties
When the ECMAScript
host
is a web browser the following additional properties of the standard built-in objects are defined.
B.2.1
Additional Properties of the Global Object
The entries in
Table 91
are added to
Table 6
Table 91: Additional Well-known Intrinsic Objects
Intrinsic Name
Global Name
ECMAScript Language Association
%escape%
escape
The
escape
function (
B.2.1.1
%unescape%
unescape
The
unescape
function (
B.2.1.2
B.2.1.1
escape (
string
This function is a property of the
global object
. It computes a new version of a String value in which certain code units have been replaced by a hexadecimal escape sequence.
When replacing a code unit of numeric value less than or equal to 0x00FF, a two-digit escape sequence of the form
xx
is used. When replacing a code unit of numeric value strictly greater than 0x00FF, a four-digit escape sequence of the form
%u
xxxx
is used.
It is the
%escape%
intrinsic object.
It performs the following steps when called:
1.
Set
string
to ?
ToString
string
).
2.
Let
len
be the length of
string
3.
Let
be the empty String.
4.
Let
unescapedSet
be the
string-concatenation
of
the ASCII word characters
and
"@*+-./"
5.
Let
be 0.
6.
Repeat, while
len
a.
Let
be the code unit at index
within
string
b.
If
unescapedSet
contains
, then
i.
Let
be
c.
Else,
i.
Let
be the numeric value of
ii.
If
< 256, then
1.
Let
hex
be the String representation of
, formatted as an uppercase hexadecimal number.
2.
Let
be the
string-concatenation
of
"%"
and !
StringPad
hex
"0"
start
).
iii.
Else,
1.
Let
hex
be the String representation of
, formatted as an uppercase hexadecimal number.
2.
Let
be the
string-concatenation
of
"%u"
and !
StringPad
hex
"0"
start
).
d.
Set
to the
string-concatenation
of
and
e.
Set
to
+ 1.
7.
Return
Note
The encoding is partly based on the encoding described in
RFC 1738, but the entire encoding specified in this standard is
described above without regard to the contents of RFC 1738. This
encoding does not reflect changes to RFC 1738 made by RFC 3986.
B.2.1.2
unescape (
string
This function is a property of the
global object
. It computes a new version of a String value in which each escape sequence of the sort that might be introduced by the
escape
function is replaced with the code unit that it represents.
It is the
%unescape%
intrinsic object.
It performs the following steps when called:
1.
Set
string
to ?
ToString
string
).
2.
Let
len
be the length of
string
3.
Let
be the empty String.
4.
Let
be 0.
5.
Repeat, while
len
a.
Let
be the code unit at index
within
string
b.
If
is the code unit 0x0025 (PERCENT SIGN), then
i.
Let
hexDigits
be the empty String.
ii.
Let
optionalAdvance
be 0.
iii.
If
+ 5 <
len
and the code unit at index
+ 1 within
string
is the code unit 0x0075 (LATIN SMALL LETTER U), then
1.
Set
hexDigits
to the
substring
of
string
from
+ 2 to
+ 6.
2.
Set
optionalAdvance
to 5.
iv.
Else if
+ 3 ≤
len
, then
1.
Set
hexDigits
to the
substring
of
string
from
+ 1 to
+ 3.
2.
Set
optionalAdvance
to 2.
v.
Let
parseResult
be
ParseText
StringToCodePoints
hexDigits
),
HexDigits
[~Sep]
).
vi.
If
parseResult
is a
Parse Node
, then
1.
Let
be the MV of
parseResult
2.
Set
to the code unit whose numeric value is
3.
Set
to
optionalAdvance
c.
Set
to the
string-concatenation
of
and
d.
Set
to
+ 1.
6.
Return
B.2.2
Additional Properties of the String.prototype Object
B.2.2.1
String.prototype.substr (
start
length
This method returns a
substring
of the result of converting the
this
value to a String, starting from index
start
and running for
length
code units (or through the end of the String if
length
is
undefined
). If
start
is negative, it is treated as
sourceLength
start
where
sourceLength
is the length of the String. The result
is a String
value, not a String object.
It performs the following steps when called:
1.
Let
be ?
RequireObjectCoercible
this
value).
2.
Let
be ?
ToString
).
3.
Let
size
be the length of
4.
Let
intStart
be ?
ToIntegerOrInfinity
start
).
5.
If
intStart
= -∞, set
intStart
to 0.
6.
Else if
intStart
< 0, set
intStart
to
max
size
intStart
, 0).
7.
Else, set
intStart
to
min
intStart
size
).
8.
If
length
is
undefined
, let
intLength
be
size
; otherwise let
intLength
be ?
ToIntegerOrInfinity
length
).
9.
Set
intLength
to the result of
clamping
intLength
between 0 and
size
10.
Let
intEnd
be
min
intStart
intLength
size
).
11.
Return the
substring
of
from
intStart
to
intEnd
Note
This method is intentionally generic; it does not require that its
this
value be a String object. Therefore it can be transferred to other kinds of objects for use as a method.
B.2.2.2
String.prototype.anchor (
name
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"a"
"name"
name
).
B.2.2.2.1
CreateHTML (
string
tag
attribute
value
The abstract operation CreateHTML takes arguments
string
(an
ECMAScript language value
),
tag
(a String),
attribute
(a String), and
value
(an
ECMAScript language value
) and returns either a
normal completion containing
a String or a
throw completion
. It performs the following steps when called:
1.
Let
str
be ?
RequireObjectCoercible
string
).
2.
Let
be ?
ToString
str
).
3.
Let
p1
be the
string-concatenation
of
"<"
and
tag
4.
If
attribute
is not the empty String, then
a.
Let
be ?
ToString
value
).
b.
Let
escapedV
be the String value that is the same as
except that each occurrence of the code unit 0x0022 (QUOTATION MARK) in
has been replaced with the six code unit sequence
"""
c.
Set
p1
to the
string-concatenation
of:
p1
the code unit 0x0020 (SPACE)
attribute
the code unit 0x003D (EQUALS SIGN)
the code unit 0x0022 (QUOTATION MARK)
escapedV
the code unit 0x0022 (QUOTATION MARK)
5.
Let
p2
be the
string-concatenation
of
p1
and
">"
6.
Let
p3
be the
string-concatenation
of
p2
and
7.
Let
p4
be the
string-concatenation
of
p3
"tag
, and
">"
8.
Return
p4
B.2.2.3
String.prototype.big ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"big"
""
""
).
B.2.2.4
String.prototype.blink ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"blink"
""
""
).
B.2.2.5
String.prototype.bold ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"b"
""
""
).
B.2.2.6
String.prototype.fixed ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"tt"
""
""
).
B.2.2.7
String.prototype.fontcolor (
color
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"font"
"color"
color
).
B.2.2.8
String.prototype.fontsize (
size
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"font"
"size"
size
).
B.2.2.9
String.prototype.italics ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"i"
""
""
).
B.2.2.10
String.prototype.link (
url
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"a"
"href"
url
).
B.2.2.11
String.prototype.small ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"small"
""
""
).
B.2.2.12
String.prototype.strike ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"strike"
""
""
).
B.2.2.13
String.prototype.sub ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"sub"
""
""
).
B.2.2.14
String.prototype.sup ( )
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Return ?
CreateHTML
"sup"
""
""
).
B.2.2.15
String.prototype.trimLeft ( )
Note
The property
"trimStart"
is preferred. The
"trimLeft"
property is provided principally for compatibility with old code. It is recommended that the
"trimStart"
property be used in new ECMAScript code.
The initial value of the
"trimLeft"
property is %String.prototype.trimStart%, defined in
22.1.3.32
B.2.2.16
String.prototype.trimRight ( )
Note
The property
"trimEnd"
is preferred. The
"trimRight"
property is provided principally for compatibility with old code. It is recommended that the
"trimEnd"
property be used in new ECMAScript code.
The initial value of the
"trimRight"
property is %String.prototype.trimEnd%, defined in
22.1.3.31
B.2.3
Additional Properties of the Date.prototype Object
B.2.3.1
Date.prototype.getYear ( )
Note
The
getFullYear
method is preferred for nearly all purposes, because it avoids the “year 2000 problem.”
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
If
is
NaN
, return
NaN
3.
Return
YearFromTime
LocalTime
)) -
1900
B.2.3.2
Date.prototype.setYear (
year
Note
The
setFullYear
method is preferred for nearly all purposes, because it avoids the “year 2000 problem.”
This method performs the following steps when called:
1.
Let
be ?
thisTimeValue
this
value).
2.
Let
be ?
ToNumber
year
).
3.
If
is
NaN
, set
to
+0
; otherwise, set
to
LocalTime
).
4.
If
is
NaN
, then
a.
Set the [[DateValue]] internal slot of
this Date object
to
NaN
b.
Return
NaN
5.
Let
yi
be !
ToIntegerOrInfinity
).
6.
If 0 ≤
yi
≤ 99, let
yyyy
be
1900
yi
).
7.
Else, let
yyyy
be
8.
Let
be
MakeDay
yyyy
MonthFromTime
),
DateFromTime
)).
9.
Let
date
be
UTC
MakeDate
TimeWithinDay
))).
10.
Set the [[DateValue]] internal slot of
this Date object
to
TimeClip
date
).
11.
Return the value of the [[DateValue]] internal slot of
this Date object
B.2.3.3
Date.prototype.toGMTString ( )
Note
The
toUTCString
method is preferred. This method is provided principally for compatibility with old code.
The initial value of the
"toGMTString"
property is %Date.prototype.toUTCString%, defined in
21.4.4.43
B.2.4
Additional Properties of the RegExp.prototype Object
B.2.4.1
RegExp.prototype.compile (
pattern
flags
This method performs the following steps when called:
1.
Let
be the
this
value.
2.
Perform ?
RequireInternalSlot
, [[RegExpMatcher]]).
3.
If
pattern
is an Object
and
pattern
has a [[RegExpMatcher]] internal slot, then
a.
If
flags
is not
undefined
, throw a
TypeError
exception.
b.
Let
be
pattern
.[[OriginalSource]].
c.
Let
be
pattern
.[[OriginalFlags]].
4.
Else,
a.
Let
be
pattern
b.
Let
be
flags
5.
Return ?
RegExpInitialize
).
Note
This method completely reinitializes the
this
value RegExp with a new pattern and flags. An implementation may
interpret use of this method as an assertion that the resulting RegExp
object will be used multiple times and hence is a candidate for extra
optimization.
B.3
Other Additional Features
B.3.1
Labelled Function Declarations
Prior to ECMAScript 2015, the specification of
LabelledStatement
did not allow for the association of a statement label with a
FunctionDeclaration
. However, a labelled
FunctionDeclaration
was an allowable extension for
non-strict code
and most browser-hosted ECMAScript implementations supported that
extension. In ECMAScript 2015 and later, the grammar production for
LabelledStatement
permits use of
FunctionDeclaration
as a
LabelledItem
but
14.13.1
includes an Early Error rule that produces a Syntax Error if that occurs. That rule is modified with the addition of the
highlighted
text:
LabelledItem
FunctionDeclaration
It is a Syntax Error if any source text
that is
strict mode code
is matched by this production.
Note
The
early error
rules for
WithStatement
IfStatement
, and
IterationStatement
prevent these statements from containing a labelled
FunctionDeclaration
in
non-strict code
B.3.2
Block-Level Function Declarations Web Legacy Compatibility Semantics
Prior to ECMAScript 2015, the ECMAScript specification did not define the occurrence of a
FunctionDeclaration
as an element of a
Block
statement's
StatementList
. However, support for that form of
FunctionDeclaration
was an allowable extension and most browser-hosted ECMAScript
implementations permitted them. Unfortunately, the semantics of such
declarations differ among those implementations. Because of these
semantic differences, existing web
ECMAScript source text
that uses
Block
level function declarations is only portable among browser
implementations if the usage only depends upon the semantic intersection
of all of the browser implementations for such declarations. The
following are the use cases that fall within that intersection
semantics:
A function is declared and only referenced within a single block.
One or more
FunctionDeclaration
s whose
BindingIdentifier
is the name
occur within the function code of an enclosing function
and that declaration is nested within a
Block
No other declaration of
that is not a
var
declaration occurs within the function code of
All occurrences of
as an
IdentifierReference
are within the
StatementList
of the
Block
containing the declaration of
A function is declared and possibly used within a single
Block
but also referenced by an inner function definition that is not contained within that same
Block
One or more
FunctionDeclaration
s whose
BindingIdentifier
is the name
occur within the function code of an enclosing function
and that declaration is nested within a
Block
No other declaration of
that is not a
var
declaration occurs within the function code of
There may be occurrences of
as an
IdentifierReference
within the
StatementList
of the
Block
containing the declaration of
There is at least one occurrence of
as an
IdentifierReference
within another function
that is nested within
and no other declaration of
shadows the references to
from within
All invocations of
occur after the declaration of
has been evaluated.
A function is declared and possibly used within a single block but also referenced within subsequent blocks.
One or more
FunctionDeclaration
whose
BindingIdentifier
is the name
occur within the function code of an enclosing function
and that declaration is nested within a
Block
No other declaration of
that is not a
var
declaration occurs within the function code of
There may be occurrences of
as an
IdentifierReference
within the
StatementList
of the
Block
containing the declaration of
There is at least one occurrence of
as an
IdentifierReference
within the function code of
that lexically follows the
Block
containing the declaration of
The first use case is interoperable with the semantics of
Block
level function declarations provided by ECMAScript 2015. Any pre-existing
ECMAScript source text
that employs that use case will operate using the Block level function declarations semantics defined by clauses
10
14
, and
15
ECMAScript 2015 interoperability for the second and third use cases requires the following extensions to the clause
10
, clause
15
, clause
19.2.1
and clause
16.1.7
semantics.
If an ECMAScript implementation has a mechanism for reporting
diagnostic warning messages, a warning should be produced when code
contains a
FunctionDeclaration
for which these compatibility semantics are applied and introduce
observable differences from non-compatibility semantics. For example, if
a var binding is not introduced because its introduction would create
an
early error
, a warning message should not be produced.
B.3.2.1
Changes to FunctionDeclarationInstantiation
During
FunctionDeclarationInstantiation
the following steps are performed in place of step
29
29.
If
strict
is
false
, then
a.
For each
FunctionDeclaration
that is directly contained in the
StatementList
of a
Block
CaseClause
, or
DefaultClause
, do
i.
Let
be
StringValue
of the
BindingIdentifier
of
ii.
If replacing the
FunctionDeclaration
with a
VariableStatement
that has
as a
BindingIdentifier
would not produce any Early Errors for
func
and
parameterNames
does not contain
, then
1.
NOTE: A var binding for
is only instantiated here if it is neither a VarDeclaredName, the name of a formal parameter, or another
FunctionDeclaration
2.
If
initializedBindings
does not contain
and
is not
"arguments"
, then
a.
Perform !
varEnv
.CreateMutableBinding(
false
).
b.
Perform !
varEnv
.InitializeBinding(
undefined
).
c.
Append
to
instantiatedVarNames
3.
When the
FunctionDeclaration
is evaluated, perform the following steps in place of the
FunctionDeclaration
Evaluation
algorithm provided in
15.2.6
a.
Let
fenv
be the
running execution context
's VariableEnvironment.
b.
Let
benv
be the
running execution context
's LexicalEnvironment.
c.
Let
fobj
be !
benv
.GetBindingValue(
false
).
d.
Perform !
fenv
.SetMutableBinding(
fobj
false
).
e.
Return
unused
B.3.2.2
Changes to GlobalDeclarationInstantiation
During
GlobalDeclarationInstantiation
the following steps are performed in place of step
12
12.
Perform the following steps:
a.
Let
strict
be
IsStrict
of
script
b.
If
strict
is
false
, then
i.
Let
declaredFunctionOrVarNames
be the
list-concatenation
of
declaredFunctionNames
and
declaredVarNames
ii.
For each
FunctionDeclaration
that is directly contained in the
StatementList
of a
Block
CaseClause
, or
DefaultClause
Contained within
script
, do
1.
Let
be
StringValue
of the
BindingIdentifier
of
2.
If replacing the
FunctionDeclaration
with a
VariableStatement
that has
as a
BindingIdentifier
would not produce any Early Errors for
script
, then
a.
If
env
.HasLexicalDeclaration(
) is
false
, then
i.
Let
fnDefinable
be ?
env
.CanDeclareGlobalVar(
).
ii.
If
fnDefinable
is
true
, then
i.
NOTE: A var binding for
is only instantiated here if it is neither a VarDeclaredName nor the name of another
FunctionDeclaration
ii.
If
declaredFunctionOrVarNames
does not contain
, then
i.
Perform ?
env
.CreateGlobalVarBinding(
false
).
ii.
Append
to
declaredFunctionOrVarNames
iii.
When the
FunctionDeclaration
is evaluated, perform the following steps in place of the
FunctionDeclaration
Evaluation
algorithm provided in
15.2.6
i.
Let
genv
be the
running execution context
's VariableEnvironment.
ii.
Let
benv
be the
running execution context
's LexicalEnvironment.
iii.
Let
fobj
be !
benv
.GetBindingValue(
false
).
iv.
Perform ?
genv
.SetMutableBinding
fobj
false
).
v.
Return
unused
B.3.2.3
Changes to EvalDeclarationInstantiation
During
EvalDeclarationInstantiation
the following steps are performed in place of step
11
11.
If
strict
is
false
, then
a.
Let
declaredFunctionOrVarNames
be the
list-concatenation
of
declaredFunctionNames
and
declaredVarNames
b.
For each
FunctionDeclaration
that is directly contained in the
StatementList
of a
Block
CaseClause
, or
DefaultClause
Contained within
body
, do
i.
Let
be
StringValue
of the
BindingIdentifier
of
ii.
If replacing the
FunctionDeclaration
with a
VariableStatement
that has
as a
BindingIdentifier
would not produce any Early Errors for
body
, then
1.
Let
bindingExists
be
false
2.
Let
thisEnv
be
lexEnv
3.
Assert
: The following loop will terminate.
4.
Repeat, while
thisEnv
is not
varEnv
a.
If
thisEnv
is not an Object
Environment Record
, then
i.
If !
thisEnv
.HasBinding(
) is
true
, then
i.
Let
bindingExists
be
true
b.
Set
thisEnv
to
thisEnv
.[[OuterEnv]].
5.
If
bindingExists
is
false
and
varEnv
is a
Global Environment Record
, then
a.
If
varEnv
.HasLexicalDeclaration(
) is
false
, then
i.
Let
fnDefinable
be ?
varEnv
.CanDeclareGlobalVar(
).
b.
Else,
i.
Let
fnDefinable
be
false
6.
Else,
a.
Let
fnDefinable
be
true
7.
If
bindingExists
is
false
and
fnDefinable
is
true
, then
a.
If
declaredFunctionOrVarNames
does not contain
, then
i.
If
varEnv
is a
Global Environment Record
, then
i.
Perform ?
varEnv
.CreateGlobalVarBinding(
true
).
ii.
Else,
i.
Let
bindingExists
be !
varEnv
.HasBinding(
).
ii.
If
bindingExists
is
false
, then
i.
Perform !
varEnv
.CreateMutableBinding(
true
).
ii.
Perform !
varEnv
.InitializeBinding(
undefined
).
iii.
Append
to
declaredFunctionOrVarNames
b.
When the
FunctionDeclaration
is evaluated, perform the following steps in place of the
FunctionDeclaration
Evaluation
algorithm provided in
15.2.6
i.
Let
genv
be the
running execution context
's VariableEnvironment.
ii.
Let
benv
be the
running execution context
's LexicalEnvironment.
iii.
Let
fobj
be !
benv
.GetBindingValue(
false
).
iv.
Perform ?
genv
.SetMutableBinding
fobj
false
).
v.
Return
unused
B.3.2.4
Changes to Block Static Semantics: Early Errors
The rules for the following production in
14.2.1
are modified with the addition of the
highlighted
text:
Block
StatementList
It is a Syntax Error if the
LexicallyDeclaredNames
of
StatementList
contains any duplicate entries
, unless the
source text matched by
this production is not
strict mode code
and the duplicate entries are only bound by FunctionDeclarations
It is a Syntax Error if any element of the
LexicallyDeclaredNames
of
StatementList
also occurs in the
VarDeclaredNames
of
StatementList
B.3.2.5
Changes to
switch
Statement Static Semantics: Early Errors
The rules for the following production in
14.12.1
are modified with the addition of the
highlighted
text:
SwitchStatement
switch
Expression
CaseBlock
It is a Syntax Error if the
LexicallyDeclaredNames
of
CaseBlock
contains any duplicate entries
, unless the
source text matched by
this production is not
strict mode code
and the duplicate entries are only bound by FunctionDeclarations
It is a Syntax Error if any element of the
LexicallyDeclaredNames
of
CaseBlock
also occurs in the
VarDeclaredNames
of
CaseBlock
B.3.2.6
Changes to BlockDeclarationInstantiation
During
BlockDeclarationInstantiation
the following steps are performed in place of step
3.a.ii.1
1.
If !
env
.HasBinding(
dn
) is
false
, then
a.
Perform !
env
.CreateMutableBinding(
dn
false
).
During
BlockDeclarationInstantiation
the following steps are performed in place of step
3.b.iii
iii.
Perform the following steps:
1.
If the binding for
fn
in
env
is an uninitialized binding, then
a.
Perform !
env
.InitializeBinding(
fn
fo
).
2.
Else,
a.
Assert
is a
FunctionDeclaration
b.
Perform !
env
.SetMutableBinding(
fn
fo
false
).
B.3.3
FunctionDeclarations in IfStatement Statement Clauses
The following augments the
IfStatement
production in
14.6
IfStatement
[Yield, Await, Return]
if
Expression
[+In, ?Yield, ?Await]
FunctionDeclaration
[?Yield, ?Await, ~Default]
else
Statement
[?Yield, ?Await, ?Return]
if
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
else
FunctionDeclaration
[?Yield, ?Await, ~Default]
if
Expression
[+In, ?Yield, ?Await]
FunctionDeclaration
[?Yield, ?Await, ~Default]
else
FunctionDeclaration
[?Yield, ?Await, ~Default]
if
Expression
[+In, ?Yield, ?Await]
FunctionDeclaration
[?Yield, ?Await, ~Default]
[lookahead ≠
else
This production only applies when parsing
non-strict code
Source text matched by
this production is processed as if each matching occurrence of
FunctionDeclaration
[?Yield, ?Await, ~Default]
was the sole
StatementListItem
of a
BlockStatement
occupying that position in the source text. The semantics of such a synthetic
BlockStatement
includes the web legacy compatibility semantics specified in
B.3.2
B.3.4
VariableStatements in Catch Blocks
The content of subclause
14.15.1
is replaced with the following:
Catch
catch
CatchParameter
Block
It is a Syntax Error if
BoundNames
of
CatchParameter
contains any duplicate elements.
It is a Syntax Error if any element of the
BoundNames
of
CatchParameter
also occurs in the
LexicallyDeclaredNames
of
Block
It is a Syntax Error if any element of the
BoundNames
of
CatchParameter
also occurs in the
VarDeclaredNames
of
Block
unless
CatchParameter
is
CatchParameter
BindingIdentifier
Note
The
Block
of a
Catch
clause may contain
var
declarations that bind a name that is also bound by the
CatchParameter
At runtime, such bindings are instantiated in the
VariableDeclarationEnvironment. They do not shadow the same-named
bindings introduced by the
CatchParameter
and hence the
Initializer
for such
var
declarations will assign to the corresponding catch parameter rather than the
var
binding.
This modified behaviour also applies to
var
and
function
declarations introduced by
direct eval
calls contained within the
Block
of a
Catch
clause. This change is accomplished by modifying the algorithm of
19.2.1.3
as follows:
Step
3.d.i.2.a.i
is replaced by:
i.
If
thisEnv
is not the
Environment Record
for a
Catch
clause, throw a
SyntaxError
exception.
Step
11.b.ii.4.a.i.i
is replaced by:
i.
If
thisEnv
is not the
Environment Record
for a
Catch
clause, let
bindingExists
be
true
B.3.5
Initializers in ForIn Statement Heads
The following augments the
ForInOfStatement
production in
14.7.5
ForInOfStatement
[Yield, Await, Return]
for
var
BindingIdentifier
[?Yield, ?Await]
Initializer
[~In, ?Yield, ?Await]
in
Expression
[+In, ?Yield, ?Await]
Statement
[?Yield, ?Await, ?Return]
This production only applies when parsing
non-strict code
The
static semantics
of
ContainsDuplicateLabels
in
8.3.1
are augmented with the following:
ForInOfStatement
for
var
BindingIdentifier
Initializer
in
Expression
Statement
1.
Return
ContainsDuplicateLabels
of
Statement
with argument
labelSet
The
static semantics
of
ContainsUndefinedBreakTarget
in
8.3.2
are augmented with the following:
ForInOfStatement
for
var
BindingIdentifier
Initializer
in
Expression
Statement
1.
Return
ContainsUndefinedBreakTarget
of
Statement
with argument
labelSet
The
static semantics
of
ContainsUndefinedContinueTarget
in
8.3.3
are augmented with the following:
ForInOfStatement
for
var
BindingIdentifier
Initializer
in
Expression
Statement
1.
Return
ContainsUndefinedContinueTarget
of
Statement
with arguments
iterationSet
and « ».
The
static semantics
of
IsDestructuring
in
14.7.5.2
are augmented with the following:
BindingIdentifier
Identifier
yield
await
1.
Return
false
The
static semantics
of
VarDeclaredNames
in
8.2.6
are augmented with the following:
ForInOfStatement
for
var
BindingIdentifier
Initializer
in
Expression
Statement
1.
Let
names1
be the
BoundNames
of
BindingIdentifier
2.
Let
names2
be the
VarDeclaredNames
of
Statement
3.
Return the
list-concatenation
of
names1
and
names2
The
static semantics
of
VarScopedDeclarations
in
8.2.7
are augmented with the following:
ForInOfStatement
for
var
BindingIdentifier
Initializer
in
Expression
Statement
1.
Let
declarations1
be «
BindingIdentifier
».
2.
Let
declarations2
be the
VarScopedDeclarations
of
Statement
3.
Return the
list-concatenation
of
declarations1
and
declarations2
The
runtime semantics
of
ForInOfLoopEvaluation
in
14.7.5.5
are augmented with the following:
ForInOfStatement
for
var
BindingIdentifier
Initializer
in
Expression
Statement
1.
Let
bindingId
be
StringValue
of
BindingIdentifier
2.
Let
lhs
be ?
ResolveBinding
bindingId
).
3.
If
IsAnonymousFunctionDefinition
Initializer
) is
true
, then
a.
Let
value
be ?
NamedEvaluation
of
Initializer
with argument
bindingId
4.
Else,
a.
Let
rhs
be ?
Evaluation
of
Initializer
b.
Let
value
be ?
GetValue
rhs
).
5.
Perform ?
PutValue
lhs
value
).
6.
Let
keyResult
be ?
ForIn/OfHeadEvaluation
(« »,
Expression
enumerate
).
7.
Return ?
ForIn/OfBodyEvaluation
BindingIdentifier
Statement
keyResult
enumerate
varBinding
labelSet
).
B.3.6
The [[IsHTMLDDA]] Internal Slot
An
[[IsHTMLDDA]] internal slot
may exist on
host-defined
objects. Objects with an [[IsHTMLDDA]] internal slot behave like
undefined
in the
ToBoolean
and
IsLooselyEqual
abstract operations
and when used as an operand for the
typeof
operator
Note
Objects with an [[IsHTMLDDA]] internal slot are never created by this specification. However, the
document.all
object
in web browsers is a
host-defined
exotic object
with this slot that exists for web compatibility purposes. There are no
other known examples of this type of object and implementations should
not create any with the exception of
document.all
B.3.6.1
Changes to ToBoolean
The following step replaces step
of
ToBoolean
3.
If
argument
is an Object
and
argument
has an
[[IsHTMLDDA]] internal slot
, return
false
B.3.6.2
Changes to IsLooselyEqual
The following steps replace step
of
IsLooselyEqual
4.
Perform the following steps:
a.
If
is an Object
has an
[[IsHTMLDDA]] internal slot
, and
is either
null
or
undefined
, return
true
b.
If
is either
null
or
undefined
is an Object
, and
has an
[[IsHTMLDDA]] internal slot
, return
true
B.3.6.3
Changes to the
typeof
Operator
The following step replaces step
12
of
the evaluation semantics for
typeof
12.
If
val
has an
[[IsHTMLDDA]] internal slot
, return
"undefined"
B.3.7
Non-default behaviour in HostMakeJobCallback
The
HostMakeJobCallback
abstract operation allows
hosts
which are web browsers to specify non-default behaviour.
B.3.8
Non-default behaviour in HostEnsureCanAddPrivateElement
The
HostEnsureCanAddPrivateElement
abstract operation allows
hosts
which are web browsers to specify non-default behaviour.
The Strict Mode of ECMAScript
The strict mode restriction and exceptions
implements
interface
let
package
private
protected
public
static
, and
yield
are
reserved words
within
strict mode code
. (
12.7.2
).
A conforming implementation, when processing
strict mode code
, must disallow instances of the productions
NumericLiteral
::
LegacyOctalIntegerLiteral
and
DecimalIntegerLiteral
::
NonOctalDecimalIntegerLiteral
A conforming implementation, when processing
strict mode code
, must disallow instances of the productions
EscapeSequence
::
LegacyOctalEscapeSequence
and
EscapeSequence
::
NonOctalDecimalEscapeSequence
Assignment to an undeclared identifier or otherwise unresolvable reference does not create a property in the
global object
. When a simple assignment occurs within
strict mode code
, its
LeftHandSideExpression
must not evaluate to an unresolvable Reference. If it does a
ReferenceError
exception is thrown (
6.2.5.6
). The
LeftHandSideExpression
also may not be a reference to a
data property
with the attribute value { [[Writable]]:
false
}, to an
accessor property
with the attribute value { [[Set]]:
undefined
}, nor to a non-existent property of an object whose [[Extensible]] internal slot is
false
. In these cases a
TypeError
exception is thrown (
13.15
).
An
IdentifierReference
with the
StringValue
"eval"
or
"arguments"
may not appear as the
LeftHandSideExpression
of an Assignment operator (
13.15
) or of an
UpdateExpression
13.4
) or as the
UnaryExpression
operated upon by a Prefix Increment (
13.4.4
) or a Prefix Decrement (
13.4.5
) operator.
Arguments objects for
strict functions
define a non-configurable
accessor property
"callee"
which throws a
TypeError
exception on access (
10.4.4.6
).
Arguments objects for
strict functions
do not dynamically share their
array-indexed
property values with the corresponding formal parameter bindings of their functions. (
10.4.4
).
For
strict functions
, if an arguments object is created the binding of the local identifier
arguments
to the arguments object is immutable and hence may not be the target of an assignment expression. (
10.2.11
).
It is a
SyntaxError
if the
StringValue
of a
BindingIdentifier
is either
"eval"
or
"arguments"
within
strict mode code
13.1.1
).
Strict mode eval code cannot instantiate variables or functions in
the variable environment of the caller to eval. Instead, a new variable
environment is created and that environment is used for declaration
binding instantiation for the eval code (
19.2.1
).
If
this
is evaluated within
strict mode code
, then the
this
value is not coerced to an object. A
this
value of either
undefined
or
null
is not converted to the
global object
and primitive values are not converted to wrapper objects. The
this
value passed via a function call (including calls made using
Function.prototype.apply
and
Function.prototype.call
) do not coerce the passed
this
value to an object (
10.2.1.2
20.2.3.1
20.2.3.3
).
When a
delete
operator occurs within
strict mode code
, a
SyntaxError
is thrown if its
UnaryExpression
is a direct reference to a variable, function argument, or function name (
13.5.1.1
).
When a
delete
operator occurs within
strict mode code
, a
TypeError
is thrown if the property to be deleted has the attribute { [[Configurable]]:
false
} or otherwise cannot be deleted (
13.5.1.2
).
Strict mode code
may not include a
WithStatement
. The occurrence of a
WithStatement
in such a context is a
SyntaxError
14.11.1
).
It is a
SyntaxError
if a
CatchParameter
occurs within
strict mode code
and
BoundNames
of
CatchParameter
contains either
eval
or
arguments
14.15.1
).
It is a
SyntaxError
if the same
BindingIdentifier
appears more than once in the
FormalParameters
of a
strict function
. An attempt to create such a function using a Function, Generator, or AsyncFunction
constructor
is a
SyntaxError
15.2.1
20.2.1.1.1
).
An implementation may not extend, beyond that defined in this specification, the meanings within
strict functions
of properties named
"caller"
or
"arguments"
of function instances.
Host Layering Points
See
4.2
for the definition of
host
D.1
Host Hooks
HostCallJobCallback
(...)
HostEnqueueFinalizationRegistryCleanupJob
(...)
HostEnqueuePromiseJob
(...)
HostEnsureCanCompileStrings
(...)
HostFinalizeImportMeta
(...)
HostGetImportMetaProperties
(...)
HostHasSourceTextAvailable
(...)
HostLoadImportedModule
(...)
HostMakeJobCallback
(...)
HostPromiseRejectionTracker
(...)
InitializeHostDefinedRealm
(...)
D.2
Host-defined Fields
[[HostDefined]] on
Realm Records
: See
Table 24
[[HostDefined]] on
Script Records
: See
Table 39
[[HostDefined]] on
Module Records
: See
Table 40
[[HostDefined]] on
JobCallback Records
: See
Table 28
[[HostSynchronizesWith]] on Candidate Executions: See
Table 90
[[IsHTMLDDA]]: See
B.3.6
D.3
Host-defined Objects
The
global object
: See clause
19
D.4
Running Jobs
Preparation steps before, and cleanup steps after, invocation of
Job
Abstract Closures
. See
9.5
D.5
Internal Methods of Exotic Objects
Any of the essential internal methods in
Table 4
for any
exotic object
not specified within this specification.
D.6
Built-in Objects and Methods
Any built-in objects and methods not defined within this specification, except as restricted in
17.1
Corrections and Clarifications in ECMAScript 2015 with Possible Compatibility Impact
9.1.1.4.15
9.1.1.4.18
Edition 5 and 5.1 used a property existence test to determine whether a
global object
property corresponding to a new global declaration already existed.
ECMAScript 2015 uses an own property existence test. This corresponds to
what has been most commonly implemented by web browsers.
10.4.2.1
: The 5
th
Edition moved the capture of the current array length prior to the
integer
conversion of the
array index
or new length value. However, the captured length value could become
invalid if the conversion process has the side-effect of changing the
array length. ECMAScript 2015 specifies that the current array length
must be captured after the possible occurrence of such side-effects.
21.4.1.17
: Previous editions permitted the
TimeClip
abstract operation to return either
+0
or
-0
as the representation of a 0
time value
. ECMAScript 2015 specifies that
+0
always returned. This means that for ECMAScript 2015 the
time value
of a Date is never observably
-0
and methods that return
time values
never return
-0
21.4.1.18
If a UTC offset representation is not present, the local time zone is
used. Edition 5.1 incorrectly stated that a missing time zone should be
interpreted as
"z"
21.4.4.36
: If the year cannot be represented using the Date Time String Format specified in
21.4.1.18
a RangeError exception is thrown. Previous editions did not specify the behaviour for that case.
21.4.4.41
: Previous editions did not specify the value returned by
Date.prototype.toString
when
this time value
is
NaN
. ECMAScript 2015 specifies the result to be the String value
"Invalid Date"
22.2.4.1
22.2.6.13.1
: Any LineTerminator code points in the value of the
"source"
property of a RegExp instance must be expressed using an escape sequence. Edition 5.1 only required the escaping of
22.2.6.8
22.2.6.11
: In previous editions, the specifications for
String.prototype.match
and
String.prototype.replace
was incorrect for cases where the pattern argument was a RegExp value whose
global
flag is set. The previous specifications stated that for each attempt to match the pattern, if
lastIndex
did not change, it should be incremented by 1. The correct behaviour is that
lastIndex
should be incremented by 1 only if the pattern matched the empty String.
23.1.3.30
: Previous editions did not specify how a
NaN
value returned by a
comparefn
was interpreted by
Array.prototype.sort
. ECMAScript 2015 specifies that such as value is treated as if
+0
was returned from the
comparefn
. ECMAScript 2015 also specifies that
ToNumber
is applied to the result returned by a
comparefn
. In previous editions, the effect of a
comparefn
result that
is not a Number
value was
implementation-defined
. In practice, implementations call
ToNumber
Additions and Changes That Introduce Incompatibilities with Prior Editions
6.2.5
: In ECMAScript 2015, Function calls are not allowed to return a
Reference Record
7.1.4.1
: In ECMAScript 2015,
ToNumber
applied to a String value now recognizes and converts
BinaryIntegerLiteral
and
OctalIntegerLiteral
numeric strings. In previous editions such strings were converted to
NaN
9.3
: In ECMAScript 2018, Template objects are canonicalized based on
Parse Node
(source location), instead of across all occurrences of that template literal or tagged template in a
Realm
in previous editions.
12.2
In ECMAScript 2016, Unicode 8.0.0 or higher is mandated, as opposed to
ECMAScript 2015 which mandated Unicode 5.1. In particular, this caused
U+180E MONGOLIAN VOWEL SEPARATOR, which was in the
Space_Separator
Zs
) category and thus treated as whitespace in ECMAScript 2015, to be moved to the
Format
Cf
) category (as of Unicode 6.3.0). This causes whitespace-sensitive methods to behave differently. For example,
"\u180E".trim().length
was
in previous editions, but
in ECMAScript 2016 and later. Additionally, ECMAScript 2017 mandated always using the latest version of the Unicode Standard.
12.7
: In ECMAScript 2015, the valid code points for an
IdentifierName
are specified in terms of the Unicode properties “ID_Start” and “ID_Continue”. In previous editions, the valid
IdentifierName
or
Identifier
code points were specified by enumerating various Unicode code point categories.
12.10.1
In ECMAScript 2015, Automatic Semicolon Insertion adds a semicolon at
the end of a do-while statement if the semicolon is missing. This change
aligns the specification with the actual behaviour of most existing
implementations.
13.2.5.1
: In ECMAScript 2015, it is no longer an
early error
to have duplicate property names in Object Initializers.
13.15.1
: In ECMAScript 2015,
strict mode code
containing an assignment to an immutable binding such as the function name of a
FunctionExpression
does not produce an
early error
. Instead it produces a runtime error.
14.2
: In ECMAScript 2015, a
StatementList
beginning with the token let followed by the input elements
LineTerminator
then
Identifier
is the start of a
LexicalDeclaration
. In previous editions, automatic semicolon insertion would always insert a semicolon before the
Identifier
input element.
14.5
: In ECMAScript 2015, a
StatementListItem
beginning with the token
let
followed by the token
is the start of a
LexicalDeclaration
. In previous editions such a sequence would be the start of an
ExpressionStatement
14.6.2
: In ECMAScript 2015, the normal result of an
IfStatement
is never the value
empty
. If no
Statement
part is evaluated or if the evaluated
Statement
part produces a
normal completion containing
empty
, the result of the
IfStatement
is
undefined
14.7
: In ECMAScript 2015, if the
token of a for statement is immediately followed by the token sequence
let [
then the
let
is treated as the start of a
LexicalDeclaration
. In previous editions such a token sequence would be the start of an
Expression
14.7
: In ECMAScript 2015, if the ( token of a for-in statement is immediately followed by the token sequence
let [
then the
let
is treated as the start of a
ForDeclaration
. In previous editions such a token sequence would be the start of an
LeftHandSideExpression
14.7
: Prior to ECMAScript 2015, an initialization expression could appear as part of the
VariableDeclaration
that precedes the
in
keyword
. In ECMAScript 2015, the
ForBinding
in that same position does not allow the occurrence of such an
initializer. In ECMAScript 2017, such an initializer is permitted only
in
non-strict code
14.7
: In ECMAScript 2015, the result of evaluating an
IterationStatement
is never a
normal completion
whose [[Value]] is
empty
. If the
Statement
part of an
IterationStatement
is not evaluated or if the final evaluation of the
Statement
part produces a
normal completion
whose [[Value]] is
empty
, the result of evaluating the
IterationStatement
is a
normal completion
whose [[Value]] is
undefined
14.11.2
: In ECMAScript 2015, the result of evaluating a
WithStatement
is never a
normal completion
whose [[Value]] is
empty
. If evaluation of the
Statement
part of a
WithStatement
produces a
normal completion
whose [[Value]] is
empty
, the result of evaluating the
WithStatement
is a
normal completion
whose [[Value]] is
undefined
14.12.4
: In ECMAScript 2015, the result of evaluating a
SwitchStatement
is never a
normal completion
whose [[Value]] is
empty
. If evaluation of the
CaseBlock
part of a
SwitchStatement
produces a
normal completion
whose [[Value]] is
empty
, the result of evaluating the
SwitchStatement
is a
normal completion
whose [[Value]] is
undefined
14.15
: In ECMAScript 2015, it is an
early error
for a
Catch
clause to contain a
var
declaration for the same
Identifier
that appears as the
Catch
clause parameter. In previous editions, such a variable declaration
would be instantiated in the enclosing variable environment but the
declaration's
Initializer
value would be assigned to the
Catch
parameter.
14.15
19.2.1.3
: In ECMAScript 2015, a runtime
SyntaxError
is thrown if a
Catch
clause evaluates a non-strict direct
eval
whose eval code includes a
var
or
FunctionDeclaration
declaration that binds the same
Identifier
that appears as the
Catch
clause parameter.
14.15.3
: In ECMAScript 2015, the result of a
TryStatement
is never the value
empty
. If the
Block
part of a
TryStatement
evaluates to a
normal completion containing
empty
, the result of the
TryStatement
is
undefined
. If the
Block
part of a
TryStatement
evaluates to a
throw completion
and it has a
Catch
part that evaluates to a
normal completion containing
empty
, the result of the
TryStatement
is
undefined
if there is no
Finally
clause or if its
Finally
clause evaluates to an
empty
normal completion
15.4.5
In ECMAScript 2015, the
function objects
that are created as the values of the [[Get]] or [[Set]] attribute of
accessor properties
in an
ObjectLiteral
are not
constructor
functions and they do not have a
"prototype"
own property. In the previous edition, they were
constructors
and had a
"prototype"
property.
20.1.2.6
: In ECMAScript 2015, if the argument to
Object.freeze
is not an object it is treated as if it was a non-extensible
ordinary object
with no own properties. In the previous edition, a non-object argument always causes a
TypeError
to be thrown.
20.1.2.8
: In ECMAScript 2015, if the argument to
Object.getOwnPropertyDescriptor
is not an object an attempt is made to coerce the argument using
ToObject
If the coercion is successful the result is used in place of the
original argument value. In the previous edition, a non-object argument
always causes a
TypeError
to be thrown.
20.1.2.10
: In ECMAScript 2015, if the argument to
Object.getOwnPropertyNames
is not an object an attempt is made to coerce the argument using
ToObject
If the coercion is successful the result is used in place of the
original argument value. In the previous edition, a non-object argument
always causes a
TypeError
to be thrown.
20.1.2.12
: In ECMAScript 2015, if the argument to
Object.getPrototypeOf
is not an object an attempt is made to coerce the argument using
ToObject
If the coercion is successful the result is used in place of the
original argument value. In the previous edition, a non-object argument
always causes a
TypeError
to be thrown.
20.1.2.15
: In ECMAScript 2015, if the argument to
Object.isExtensible
is not an object it is treated as if it was a non-extensible
ordinary object
with no own properties. In the previous edition, a non-object argument always causes a
TypeError
to be thrown.
20.1.2.16
: In ECMAScript 2015, if the argument to
Object.isFrozen
is not an object it is treated as if it was a non-extensible
ordinary object
with no own properties. In the previous edition, a non-object argument always causes a
TypeError
to be thrown.
20.1.2.17
: In ECMAScript 2015, if the argument to
Object.isSealed
is not an object it is treated as if it was a non-extensible
ordinary object
with no own properties. In the previous edition, a non-object argument always causes a
TypeError
to be thrown.
20.1.2.18
: In ECMAScript 2015, if the argument to
Object.keys
is not an object an attempt is made to coerce the argument using
ToObject
If the coercion is successful the result is used in place of the
original argument value. In the previous edition, a non-object argument
always causes a
TypeError
to be thrown.
20.1.2.19
: In ECMAScript 2015, if the argument to
Object.preventExtensions
is not an object it is treated as if it was a non-extensible
ordinary object
with no own properties. In the previous edition, a non-object argument always causes a
TypeError
to be thrown.
20.1.2.21
: In ECMAScript 2015, if the argument to
Object.seal
is not an object it is treated as if it was a non-extensible
ordinary object
with no own properties. In the previous edition, a non-object argument always causes a
TypeError
to be thrown.
20.2.3.2
In ECMAScript 2015, the [[Prototype]] internal slot of a bound function
is set to the [[GetPrototypeOf]] value of its target function. In the
previous edition, [[Prototype]] was always set to
%Function.prototype%
20.2.4.1
: In ECMAScript 2015, the
"length"
property of function instances is configurable. In previous editions it was non-configurable.
20.5.6.2
: In ECMAScript 2015, the [[Prototype]] internal slot of a
NativeError
constructor
is the Error
constructor
. In previous editions it was the
Function prototype object
21.4.4
In ECMAScript 2015, the
Date prototype object
is not a Date instance. In previous editions it was a Date instance whose TimeValue was
NaN
22.1.3.11
In ECMAScript 2015, the
String.prototype.localeCompare
function must treat Strings that are canonically equivalent according
to the Unicode Standard as being identical. In previous editions
implementations were permitted to ignore canonical equivalence and could
instead use a bit-wise comparison.
22.1.3.27
and
22.1.3.29
In ECMAScript 2015, lowercase/upper conversion processing operates on
code points. In previous editions such the conversion processing was
only applied to individual code units. The only affected code points are
those in the Deseret block of Unicode.
22.1.3.30
In ECMAScript 2015, the
String.prototype.trim
method is defined to recognize white space code points that may exist
outside of the Unicode BMP. However, as of Unicode 7 no such code points
are defined. In previous editions such code points would not have been
recognized as white space.
22.2.4.1
In ECMAScript 2015, If the
pattern
argument is a RegExp instance and the
flags
argument is not
undefined
, a new RegExp instance is created just like
pattern
except that
pattern
's flags are replaced by the argument
flags
. In previous editions a
TypeError
exception was thrown when
pattern
was a RegExp instance and
flags
was not
undefined
22.2.6
In ECMAScript 2015, the
RegExp prototype object
is not a RegExp instance. In previous editions it was a RegExp instance whose pattern is the empty String.
22.2.6
In ECMAScript 2015,
"source"
"global"
"ignoreCase"
, and
"multiline"
are
accessor properties
defined on the
RegExp prototype object
. In previous editions they were
data properties
defined on RegExp instances.
25.4.13
: In ECMAScript 2019,
Atomics.wake
has been renamed to
Atomics.notify
to prevent confusion with
Atomics.wait
27.1.4.4
27.6.3.6
: In ECMAScript 2019, the number of
Jobs
enqueued by
await
was reduced, which could create an observable difference in resolution order between a
then()
call and an
await
expression.
Colophon
This specification is authored on
GitHub
in a plaintext source format called
Ecmarkup
Ecmarkup is an HTML and Markdown dialect that provides a framework and
toolset for authoring ECMAScript specifications in plaintext and
processing the specification into a full-featured HTML rendering that
follows the editorial conventions for this document. Ecmarkup builds on
and integrates a number of other formats and technologies including
Grammarkdown
for defining syntax and
Ecmarkdown
for authoring algorithm steps. PDF renderings of this specification are produced by printing the HTML rendering to a PDF.
Prior editions of this specification were authored using Word—the
Ecmarkup source text that formed the basis of this edition was produced
by converting the ECMAScript 2015 Word document to Ecmarkup using an
automated conversion tool.
Bibliography
IEEE 754-2019
IEEE Standard for Floating-Point Arithmetic
. Institute of Electrical and Electronic Engineers, New York (2019)
Note
There are no normative changes between IEEE 754-2008 and IEEE 754-2019 that affect the ECMA-262 specification.
The Unicode Standard
, available at <
Unicode Technical Note #5: Canonical Equivalence in Applications
, available at <
Unicode Technical Standard #10: Unicode Collation Algorithm
, available at <
Unicode Standard Annex #15, Unicode Normalization Forms
, available at <
Unicode Standard Annex #18: Unicode Regular Expressions
, available at <
Unicode Standard Annex #24: Unicode
Script
Property
, available at <
Unicode Standard Annex #31, Unicode Identifiers and Pattern Syntax
, available at <
Unicode Standard Annex #44: Unicode Character Database
, available at <
Unicode Technical Standard #51: Unicode Emoji
, available at <
IANA Time Zone Database
, available at <
ISO 8601:2004(E)
Data elements and interchange formats — Information interchange — Representation of dates and times
RFC 1738 “Uniform Resource Locators (URL)”
, available at <
RFC 2396 “Uniform Resource Identifiers (URI): Generic Syntax”
, available at <
RFC 3629 “UTF-8, a transformation format of ISO 10646”
, available at <
RFC 7231 “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content”
, available at <
Copyright & Software License
Ecma International
Rue du Rhone 114
CH-1204 Geneva
Tel: +41 22 849 6000
Fax: +41 22 849 6001
Web:
Copyright Notice
By obtaining and/or copying this work, you (the licensee) agree that
you have read, understood, and will comply with the following terms and
conditions.
Permission under Ecma’s copyright to copy, modify, prepare derivative
works of, and distribute this work, with or without modification, for
any purpose and without fee or royalty is hereby granted, provided that
you include the following on ALL copies of the work or portions thereof,
including modifications:
(i) The full text of this COPYRIGHT NOTICE AND COPYRIGHT LICENSE
in a location viewable to users of the redistributed or derivative work.
(ii) Any pre-existing intellectual property disclaimers, notices,
or terms and conditions. If none exist, the Ecma alternative copyright
notice should be included.
(iii) Notice of any changes or modifications, through a copyright
statement on the document such as “This document includes material
copied from or derived from [title and URI of the Ecma document].
Copyright © Ecma International.”
Disclaimers
THIS WORK IS PROVIDED “AS IS,” AND COPYRIGHT HOLDERS MAKE NO
REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
PURPOSE OR THAT THE USE OF THE DOCUMENT WILL NOT INFRINGE ANY THIRD
PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT,
SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT.
The name and trademarks of copyright holders may NOT be used in
advertising or publicity pertaining to the work without specific,
written prior permission. Title to copyright in this work will at all
times remain with copyright holders.
Software License
All Software contained in this document ("Software") is
protected by copyright and is being made available under the "BSD
License", included below. This Software may be subject to third party
rights (rights from parties other than Ecma International), including
patent rights, and no licenses under such third party rights are granted
under this license even if the third party concerned is a member of
Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS
AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm
FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE
REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
Neither the name of the authors nor Ecma International may be used
to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.
Syntax-Directed Operations
Permalink
Pin