Ecma 262 PDF
Ecma 262 PDF
Ecma 262 PDF
Community:
Refer to the colophon for more information on how this document is created.
Introduction
This Ecma Standard defines the ECMAScript 2019 Language. It is the tenth 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
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 5th 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 addition 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 supplemental 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
2 © Ecma International 2019
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. This specification also includes 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 rest parameter and spread operator support for object properties.
This specification, the 10th edition, introduces 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, this specification includes a few minor updates to
syntax and semantics. Updated syntax includes optional catch binding parameters and allowing U+2028 (LINE SEPARATOR)
and U+2029 (PARAGRAPH SEPARATOR) in string literals to align with JSON. Other updates include 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.
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, 6th Edition
Brian Terlson
ECMA-262, Project Editor, 7th through 10th Editions
1 Scope
This Standard defines the ECMAScript 2019 general-purpose programming language.
2 Conformance
© Ecma International 2019 3
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 the
“future reserved words” listed in subclause 11.6.2.2 of this specification.
A conforming implementation of ECMAScript must not implement any extension that is listed as a Forbidden Extension in
subclause 16.2.
3 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
4 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
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 has the features and facilities it provides.
ECMAScript is now a fully featured general-purpose programming language.
Some of the facilities of ECMAScript are similar to those used in other programming languages; in particular C, Java™, Self, and
Scheme as described in:
Gosling, James, Bill Joy and Guy Steele. The Java™ Language Specification. Addison Wesley Publishing Co., 1996.
Ungar, David, and Smith, Randall B. Self: The Power of Simplicity. OOPSLA '87 Conference Proceedings, pp. 227-241, Orlando,
FL, October 1987.
IEEE Standard for the Scheme Programming Language. IEEE Std 1178-1990.
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
© Ecma International 2019 5
execution environment.
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, 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.2.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.
6 © Ecma International 2019
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.
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: cf1, cf2, cf3, cf4, and cf5.
Each of these objects contains properties named q1 and q2. The dashed lines represent the implicit prototype relationship; so,
for example, cf3's prototype is CFp. The constructor, CF, has two properties itself, named P1 and P2, which are not visible to
CFp, cf1, cf2, cf3, cf4, or cf5. The property named CFP1 in CFp is shared by cf1, cf2, cf3, cf4, and cf5 (but not by CF), as are any
properties found in CFp's implicit prototype chain that are not named q1, q2, or CFP1. Notice that there is no implicit
prototype link between CF and CFp.
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 cf1, cf2, cf3, cf4, and cf5 by assigning a new value to the property in CFp.
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-
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.
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.3.1 type
set of data values as defined in clause 6 of this specification
NOTE
A primitive value is a datum that is represented directly at the lowest level of the language implementation.
4.3.3 object
member of the type Object
4.3.4 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.3.5 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.
NOTE
Any object that is not an ordinary object is an exotic object.
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.
NOTE
There are only two Boolean values, true and false.
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.
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.
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 (21.1.1.1).
NOTE
A Number value is a member of the Number type and is a direct representation of a number.
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 (20.1.1.1).
4.3.23 Infinity
number value that is the positive infinite number value
4.3.24 NaN
number value that is an IEEE 754-2008 “Not-a-Number” value
4.3.28 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.
NOTE
Examples of built-in functions include parseInt and Math.exp. An implementation may provide implementation-dependent
built-in functions that are not described in this specification.
4.3.30 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.3.31 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.
NOTE
Standard built-in methods are defined in this specification, and an ECMAScript implementation may specify and provide other
additional built-in methods.
12 © Ecma International 2019
4.3.33 attribute
internal value that defines some characteristic of a property
Clauses 6-9 define the execution environment within which ECMAScript programs operate.
Clauses 10-16 define the actual ECMAScript programming language including its syntactic encoding and the execution
semantics of all language features.
Clauses 17-26 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 27 describes the memory consistency model of accesses on SharedArrayBuffer-backed memory and methods of the
Atomics object.
5 Notational Conventions
A 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
© Ecma International 2019 13
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.
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 (11.9). 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.
A RegExp grammar for ECMAScript is given in 21.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.
Productions of the numeric string grammar are distinguished by having three colons “:::” as punctuation.
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.
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, e.g., as occurs in:
eval(str); eval(str);
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 12, 13, 14 and 15 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 define an error condition if "P is not covering an N", where
P is a Parse Node (an instance of the generalized production) and N is a nonterminal from the supplemental grammar. Here,
the sequence of tokens originally matched by P is parsed again using N as the goal symbol. (If N takes grammatical
parameters, then they are set to the same values used when P was originally parsed.) An error occurs if the sequence of tokens
cannot be parsed as a single instance of N, with no tokens left over. Subsequently, algorithms access the result of the parse
using a phrase of the form "the N that is covered by P". This will always be a Parse Node (an instance of N, unique for a given P),
since any parsing failure would have been detected by an early error rule.
Nonterminal symbols are shown in italic type. The definition of a nonterminal (also called a “production”) is introduced by the
© Ecma International 2019 15
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.
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 Initializeropt
VariableDeclaration :
BindingIdentifier
BindingIdentifier Initializer
and that:
IterationStatement :
for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
IterationStatement :
for ( LexicalDeclaration ; Expressionopt ) Statement
for ( LexicalDeclaration Expression ; Expressionopt ) Statement
IterationStatement :
for ( LexicalDeclaration ; ) Statement
so, in this example, the nonterminal IterationStatement actually has four alternative right-hand sides.
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
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
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
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
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
123456789
NonZeroDigit ::
1
2
3
4
© Ecma International 2019 19
5
6
7
8
9
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.
If the phrase “[lookahead ∉ set]” appears in the right-hand side of a production, it indicates that the production may not be
used if the immediately following input token sequence is a member of the given set. The set can be written as a comma
separated list of one or two element terminal sequences enclosed in curly brackets. For convenience, the set can also be
written as a nonterminal, in which case it represents the set of all terminals to which that nonterminal could expand. If the set
consists of a single terminal the phrase “[lookahead ≠ terminal]” may be used.
DecimalDigit :: one of
0123456789
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
the definition:
LookaheadExample ::
n [lookahead ∉ { 1 , 3 , 5 , 7 , 9 }] DecimalDigits
DecimalDigit [lookahead ∉ DecimalDigit]
matches either the letter n followed by one or more decimal digits the first of which is even, or a decimal digit not followed by
another decimal digit.
Similarly, if the phrase “[lookahead ∈ set]” appears in the right-hand side of a production, it indicates that the production may
only be used if the immediately following input token sequence is a member of the given set. If the set consists of a single
terminal the phrase “[lookahead = terminal]” may be used.
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
When an alternative in a production of the lexical grammar or the numeric string grammar appears to be a multi-code point
token, it represents the sequence of code points that would make up such a token.
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.
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
Algorithms may be explicitly parameterized, in which case the names and usage of the parameters must be provided as part of
the algorithm's definition.
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 lower case alphabetic characters and the second level of substeps labelled with lower case 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 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 x be someValue”. These aliases are reference-like
in that both x 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 x 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 x to someOtherValue”.
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
1, 3, and 4 in the following algorithm:
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,
22 © Ecma International 2019
assume that some algorithm has a step of the form: “Return the result of evaluating 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:
Block : { StatementList }
1. Return "Infinity".
1. Return NormalCompletion("Infinity").
However, if the value expression of a “return” statement is a Completion Record construction literal, the resulting Completion
Record is returned. If the value expression is a call to an abstract operation, the “return” statement simply returns the
Completion Record produced by the abstract operation.
The abstract operation Completion(completionRecord) is used to emphasize that a previously computed Completion Record is
being returned. The Completion abstract operation takes a single argument, completionRecord, and performs the following
steps:
A “return” statement without a value in an algorithm step means the same thing as:
1. Return NormalCompletion(undefined).
Any reference to a Completion Record value that is in a context that does not explicitly require a complete Completion Record
value is equivalent to an explicit reference to the [[Value]] field of the Completion Record value unless the Completion Record
is an abrupt completion.
5.2.3.3 ReturnIfAbrupt
1. ReturnIfAbrupt(argument).
1. ReturnIfAbrupt(AbstractOperation()).
Where hygienicTemp is ephemeral and visible only in the steps pertaining to ReturnIfAbrupt.
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().
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:
Syntax-directed operations for runtime semantics make use of this shorthand by placing ! or ? before the invocation of the
operation:
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.
Unless otherwise specified every grammar production alternative in this specification implicitly has a definition for a static
semantic rule named Contains which takes an argument named symbol whose value is a terminal or nonterminal of the
grammar that includes the associated production. The default definition of Contains is:
A special kind of static semantic rule is an Early Error Rule. Early error rules define early error conditions (see clause 16) 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.
The mathematical function abs(x) produces the absolute value of x, which is -x if x is negative (less than zero) and otherwise is
x 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 include +∞ and -∞.
The notation “x modulo y” (y must be finite and nonzero) computes a value k of the same sign as y (or zero) such that abs(k) <
abs(y) and x - k = q × y for some integer q.
The mathematical function floor(x) produces the largest integer (closest to positive infinity) that is not larger than x.
NOTE
floor(x) = x - (x modulo 1).
Within this specification, the notation “Type(x)” is used as shorthand for “the type of x” where “type” refers to the ECMAScript
language and specification types defined in this clause. When the term “empty” is used as if it was naming a value, it is
equivalent to saying “no value of any type”.
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 range 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 range 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 a trailing
surrogate, is a surrogate pair and is interpreted as a code point with the value (c1 - 0xD800) × 0x400 + (c2 - 0xDC00) +
0x10000. (See 10.1.2)
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 21.1.3.12) can be used to explicitly normalize a String value.
String.prototype.localeCompare (see 21.1.3.10) internally normalizes String values, but no other operations implicitly
normalize the strings upon which they operate. Only operations that are explicitly specified to be language or locale sensitive
produce language-sensitive results.
© Ecma International 2019 27
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 A, B, ..." (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).
Each Symbol value immutably holds an associated value called [[Description]] that is either undefined or a String value.
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.
@@asyncIterator "Symbol.asyncIterator" A method that returns the default AsyncIterator for an object.
Called by the semantics of the for-await-of statement.
@@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.
@@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.
@@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.
@@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.
NOTE
The bit pattern that might be observed in an ArrayBuffer (see 24.1) or a SharedArrayBuffer (see 24.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 18437736874454810624 (that is, 264 - 253) 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.
The 18437736874454810622 (that is, 264 - 253 - 2) finite nonzero values are of two kinds:
18428729675200069632 (that is, 264 - 254) of them are normalized, having the form
s × m × 2e
where s is +1 or -1, m is a positive integer less than 253 but not less than 252, and e is an integer ranging from -1074 to 971,
inclusive.
The remaining 9007199254740990 (that is, 253 - 2) values are denormalized, having the form
s × m × 2e
Note that all the positive and negative integers whose magnitude is no greater than 253 are representable in the Number type
(indeed, the integer 0 has two representations, +0 and -0).
A finite number has an odd significand if it is nonzero and the integer m 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 x” where x 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 21024 (which is +1 × 253 × 2971) and -21024 (which is -1 × 253 × 2971). Choose the member of this set that
is closest in value to x. 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 21024 and -21024 are considered to have even significands. Finally, if 21024 was chosen, replace it
with +∞; if -21024 was chosen, replace it with -∞; if +0 was chosen, replace it with -0 if and only if x is less than zero; any other
chosen value is used unchanged. The result is the Number value for x. (This procedure corresponds exactly to the behaviour of
the IEEE 754-2008 “round to nearest, ties to even” mode.)
Some ECMAScript operators deal only with integers in specific ranges such as -231 through 231 - 1, inclusive, or in the range 0
through 216 - 1, inclusive. 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.
A 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.
An integer index is a String-valued property key that is a canonical numeric String (see 7.1.16) and whose numeric value is
either +0 or a positive integer ≤ 253 - 1. An array index is an integer index whose numeric value i is in the range +0 ≤ i < 232 - 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. Ordinary objects are the most common form of objects and have the default object
semantics. An exotic object is any form of object whose property semantics differ in any way from the default semantics.
[[Writable]] Boolean If false, attempts by ECMAScript code to change the property's [[Value]] attribute using
[[Set]] will not succeed.
[[Enumerable]] Boolean If true, the property will be enumerated by a for-in enumeration (see 13.7.5). Otherwise,
the property is said to be non-enumerable.
[[Configurable]] Boolean If false, attempts to delete the property, change the property to be an accessor property,
or change its attributes (other than [[Value]], or changing [[Writable]] to false) will fail.
An accessor property associates a key value with the attributes listed in Table 3.
[[Get]] Object | If the value is an Object it must be a function object. The function's [[Call]] internal method
© Ecma International 2019 31
Undefined (Table 6) is called with an empty arguments list to retrieve the property value each time a get
access of the property is performed.
[[Set]] Object | If the value is an Object it must be a function object. The function's [[Call]] internal method
Undefined (Table 6) 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]] Boolean If true, the property is to be enumerated by a for-in enumeration (see 13.7.5). Otherwise, the
property is said to be non-enumerable.
[[Configurable]] Boolean If false, attempts to delete the property, change the property to be a data property, or change
its attributes will fail.
If the initial values of a property's attributes are not explicitly specified by this specification, the default value defined in Table
4 is used.
[[Value]] undefined
[[Get]] undefined
[[Set]] undefined
[[Writable]] false
[[Enumerable]] false
[[Configurable]] false
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
Internal methods and internal slots are identified within this specification using names enclosed in double square brackets [[
]].
Table 5 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.
The “Signature” column of Table 5 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 6 augmented by the following additional names. “any” means the value may
be any ECMAScript language type. An internal method implicitly returns a Completion Record. In addition to its parameters, an
internal method always has access to the object that is the target of the method invocation.
[[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) → Associate this object with another object that provides inherited properties.
Boolean 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) → Return a Property Descriptor for the own property of this object whose key is
Undefined | propertyKey, or undefined if no such property exists.
Property
Descriptor
[[DefineOwnProperty]] (propertyKey, Create or alter the own property, whose key is propertyKey, to have the state
PropertyDescriptor) described by PropertyDescriptor. Return true if that property was successfully
→ Boolean created/updated or false if the property could not be created or updated.
[[HasProperty]] (propertyKey) → Return a Boolean value indicating whether this object already has either an
Boolean own or inherited property whose key is propertyKey.
© Ecma International 2019 33
[[Get]] (propertyKey, Return the value of the property whose key is propertyKey from this object. If
Receiver) → any 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, Set the value of the property whose key is propertyKey to value. If any
Receiver) → ECMAScript code must be executed to set the property value, Receiver is used
Boolean 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) → Remove the own property whose key is propertyKey from this object. Return
Boolean 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 Return a List whose elements are all of the own property keys for the object.
propertyKey
Table 6 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.
[[Call]] (any, a Executes code associated with this object. Invoked via a function call expression. The arguments
List of to the internal method are a this value and a list containing the arguments passed to the function
any) → by a call expression. Objects that implement this internal method are callable.
any
[[Construct]] (a List of Creates an object. Invoked via the new or super operators. The first argument to the internal
any, method is a list containing the arguments of the operator. The second argument is the object to
Object) → which the new operator was initially applied. Objects that implement this internal method are
Object 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 9. 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.
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.
A 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.
[[GetPrototypeOf]] ( )
NOTE 1
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]] ( V )
[[IsExtensible]] ( )
[[PreventExtensions]] ( )
[[GetOwnProperty]] ( P )
The Type of the return value must be either Property Descriptor or Undefined.
If the Type of the return value is Property Descriptor, the return value must be a complete property descriptor.
© Ecma International 2019 35
If P is described as a non-configurable, non-writable own data property, all future calls to [[GetOwnProperty]] ( P ) must
return Property Descritor whose [[Value]] is SameValue as P's [[Value]] attribute.
If P's attributes other than [[Writable]] may change over time or if the property might be deleted, then P'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 P is non-existent, then all future calls to [[GetOwnProperty]] (P) on the target must
describe P as non-existent (i.e. [[GetOwnProperty]] (P) must return undefined).
NOTE 2
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 internal methods.
[[DefineOwnProperty]] ( P, Desc )
[[HasProperty]] ( P )
[[Get]] ( P, Receiver )
If P was previously observed as a non-configurable, non-writable own data property of the target with value V, then
[[Get]] must return the SameValue as V.
If P 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]] ( P, V, Receiver )
[[Delete]] ( P )
[[OwnPropertyKeys]] ( )
[[Construct]] ( )
Within this specification a reference such as %name% means the intrinsic object, associated with the current realm,
corresponding to the name. Determination of the current realm and its intrinsics is described in 8.3. The well-known intrinsics
are listed in Table 7.
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 « ».
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 either an ECMAScript value or an abstract value represented by a name
associated with the Record type. 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 }.
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 R and two values a and b in
the value domain of R, a R b is shorthand for saying the ordered pair (a, b) is a member of R. A Relation is least with respect to
some conditions when it is the smallest Relation that satisfies those conditions.
NOTE 1
The two properties above are called, in order, irreflexivity and transitivity.
a is identical to b or a R b or b R a, and
It is not the case that a R a, and
If a R b and b R c, then a R c.
NOTE 2
The three properties above are called, in order, totality, irreflexivity, and transitivity.
Values of the Completion type are Record values whose fields are defined as by Table 8. Such values are referred to as
Completion Records.
[[Type]] One of normal, break, continue, return, or throw The type of completion that occurred.
[[Value]] any ECMAScript language value or empty The value that was produced.
[[Target]] any ECMAScript string or empty The target label for directed control transfers.
The term “abrupt completion” refers to any completion with a [[Type]] value other than normal.
6.2.3.1 Await
Algorithm steps that say
where all variables in the above steps, with the exception of completion, are ephemeral and visible only in the steps pertaining
to Await.
NOTE
Await can be combined with the ? and ! prefixes, so that for example
An Await fulfilled function is an anonymous built-in function that is used as part of the Await specification device to deliver the
promise fulfillment value to the caller as a normal completion. Each Await fulfilled function has an [[AsyncContext]] internal
slot.
When an Await fulfilled function is called with argument value, the following steps are taken:
An Await rejected function is an anonymous built-in function that is used as part of the Await specification device to deliver
the promise rejection reason to the caller as an abrupt throw completion. Each Await rejected function has an
[[AsyncContext]] internal slot.
When an Await rejected function is called with argument reason, the following steps are taken:
6.2.3.2 NormalCompletion
The abstract operation NormalCompletion with a single argument, such as:
1. Return NormalCompletion(argument).
6.2.3.3 ThrowCompletion
The abstract operation ThrowCompletion with a single argument, such as:
1. Return ThrowCompletion(argument).
A Reference is a resolved name or property binding. A Reference consists of three components, the base value component, the
referenced name component, and the Boolean-valued strict reference flag. The base value component is either undefined, an
Object, a Boolean, a String, a Symbol, a Number, or an Environment Record. A base value component of undefined indicates
that the Reference could not be resolved to a binding. The referenced name component is a String or Symbol value.
A Super Reference is a Reference that is used to represent a name binding that was expressed using the super keyword. A Super
Reference has an additional thisValue component, and its base value component will never be an Environment Record.
The following abstract operations are used in this specification to operate on references:
6.2.4.1 GetBase ( V )
6.2.4.2 GetReferencedName ( V )
6.2.4.3 IsStrictReference ( V )
6.2.4.4 HasPrimitiveBase ( V )
6.2.4.5 IsPropertyReference ( V )
6.2.4.6 IsUnresolvableReference ( V )
6.2.4.7 IsSuperReference ( V )
1. Assert: Type(V) is Reference.
2. If V has a thisValue component, return true; otherwise return false.
6.2.4.8 GetValue ( V )
1. ReturnIfAbrupt(V).
2. If Type(V) is not Reference, return V.
3. Let base be GetBase(V).
4. If IsUnresolvableReference(V) is true, throw a ReferenceError exception.
5. If IsPropertyReference(V) is true, then
a. If HasPrimitiveBase(V) is true, then
i. Assert: In this case, base will never be undefined or null.
ii. Set base to ! ToObject(base).
b. Return ? base.[[Get]](GetReferencedName(V), GetThisValue(V)).
6. Else base must be an Environment Record,
a. Return ? base.GetBindingValue(GetReferencedName(V), IsStrictReference(V)) (see 8.1.1).
NOTE
The object that may be created in step 5.a.ii 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.4.9 PutValue ( V, W )
1. ReturnIfAbrupt(V).
2. ReturnIfAbrupt(W).
3. If Type(V) is not Reference, throw a ReferenceError exception.
4. Let base be GetBase(V).
5. If IsUnresolvableReference(V) is true, then
a. If IsStrictReference(V) is true, then
i. Throw a ReferenceError exception.
b. Let globalObj be GetGlobalObject().
c. Return ? Set(globalObj, GetReferencedName(V), W, false).
6. Else if IsPropertyReference(V) is true, then
a. If HasPrimitiveBase(V) is true, then
i. Assert: In this case, base will never be undefined or null.
ii. Set base to ! ToObject(base).
b. Let succeeded be ? base.[[Set]](GetReferencedName(V), W, GetThisValue(V)).
c. If succeeded is false and IsStrictReference(V) is true, throw a TypeError exception.
d. Return.
7. Else base must be an Environment Record,
a. Return ? base.SetMutableBinding(GetReferencedName(V), W, IsStrictReference(V)) (see 8.1.1).
6.2.4.10 GetThisValue ( V )
1. Assert: IsPropertyReference(V) is true.
2. If IsSuperReference(V) is true, then
a. Return the value of the thisValue component of the reference V.
3. Return GetBase(V).
6.2.4.11 InitializeReferencedBinding ( V, W )
1. ReturnIfAbrupt(V).
2. ReturnIfAbrupt(W).
3. Assert: Type(V) is Reference.
4. Assert: IsUnresolvableReference(V) is false.
5. Let base be GetBase(V).
6. Assert: base is an Environment Record.
7. Return base.InitializeBinding(GetReferencedName(V), W).
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. A generic Property Descriptor is a
Property Descriptor value that is neither a data Property Descriptor nor an accessor 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
fields that correspond to the property attributes defined in either Table 2 or Table 3.
The following abstract operations are used in this specification to operate upon Property Descriptor values:
When the abstract operation IsDataDescriptor is called with Property Descriptor Desc, the following steps are taken:
When the abstract operation IsGenericDescriptor is called with Property Descriptor Desc, the following steps are taken:
When the abstract operation FromPropertyDescriptor is called with Property Descriptor Desc, the following steps are taken:
When the abstract operation ToPropertyDescriptor is called with object Obj, the following steps are taken:
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 3rd 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:
When the abstract operation CreateByteDataBlock is called with integer argument size, the following steps are taken:
1. Assert: size ≥ 0.
2. 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.
3. Set all of the bytes of db to 0.
4. Return db.
When the abstract operation CreateSharedByteDataBlock is called with integer argument size, the following steps are taken:
1. Assert: size ≥ 0.
2. 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.
1. Assert: fromBlock and toBlock are distinct Data Block or Shared Data Block values.
2. Assert: fromIndex, toIndex, and count are integer values ≥ 0.
3. Let fromSize be the number of bytes in fromBlock.
4. Assert: fromIndex + count ≤ fromSize.
5. Let toSize be the number of bytes in toBlock.
6. Assert: toIndex + count ≤ toSize.
7. 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 eventList be the [[EventList]] field of the element in execution.[[EventsRecords]] whose [[AgentSignifier]] is
AgentSignifier().
iii. Let bytes be a List of length 1 that contains 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 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 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. Increment toIndex and fromIndex each by 1.
d. Decrement count by 1.
8. Return NormalCompletion(empty).
NOTE
When ToPrimitive is called with no 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 Date objects (see
20.3.4.45) and Symbol objects (see 19.4.3.5) over-ride the default ToPrimitive behaviour. Date objects treat no hint as if the
hint were String.
When the abstract operation OrdinaryToPrimitive is called with arguments O and hint, the following steps are taken:
Number If argument is +0, -0, or NaN, return false; otherwise return true.
String If argument is the empty String (its length is zero), return false; otherwise return true.
NOTE 1
The terminal symbols of this grammar are all composed of characters in the Unicode Basic Multilingual Plane (BMP).
Therefore, the result of ToNumber will be NaN if the string contains any leading surrogate or trailing surrogate code units,
whether paired or unpaired.
Syntax
StringNumericLiteral :::
StrWhiteSpaceopt
StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
StrWhiteSpace :::
StrWhiteSpaceChar StrWhiteSpaceopt
StrWhiteSpaceChar :::
WhiteSpace
LineTerminator
StrNumericLiteral :::
StrDecimalLiteral
BinaryIntegerLiteral
OctalIntegerLiteral
HexIntegerLiteral
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+ StrUnsignedDecimalLiteral
- StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral :::
Infinity
DecimalDigits . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalDigits ExponentPartopt
56 © Ecma International 2019
All grammar symbols not explicitly defined above have the definitions used in the Lexical Grammar for numeric literals
(11.8.3)
NOTE 2
Some differences should be noted between the syntax of a StringNumericLiteral and a NumericLiteral:
A StringNumericLiteral may include leading and/or trailing white space and/or line terminators.
A StringNumericLiteral that is decimal may have any number of leading 0 digits.
A StringNumericLiteral that is decimal may include a + or - to indicate its sign.
A 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.
The conversion of a String to a Number value is similar overall to the determination of the Number value for a numeric literal
(see 11.8.3), but some of the details are different, so the process for converting a String numeric literal to a value of Number
type is given here. This value is determined in two steps: first, a mathematical value (MV) is derived from the String numeric
literal; second, this mathematical value is rounded as described below. The MV on any grammar symbol, not provided below,
is the MV for that symbol defined in 11.8.3.1.
Once the exact MV for a String numeric literal has been determined, it is then rounded to a value of the Number type. If the MV
is 0, then the rounded value is +0 unless the first non white space code point in the String numeric literal is "-", in which case
the rounded value is -0. Otherwise, the rounded value must be the Number value for the MV (in the sense defined in 6.1.6),
unless the literal includes a StrUnsignedDecimalLiteral and the literal has more than 20 significant digits, in which case the
Number value may be either the Number value for the MV of a literal produced by replacing each significant digit after the 20th
with a 0 digit or the Number value for the MV of a literal produced by replacing each significant digit after the 20th with a 0
digit and then incrementing the literal at the 20th digit position. A digit is significant if it is not part of an ExponentPart and
it is not 0; or
there is a nonzero digit to its left and there is a nonzero digit, not in the ExponentPart, to its right.
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(x)) is equal to ToInt32(x) for all values of x. (It is to preserve this latter property that +∞ and -∞ are
mapped to +0.)
ToInt32 maps -0 to +0.
NOTE
Given the above definition of ToUint32:
NOTE
Given the above definition of ToUint16:
NOTE
Unlike the other ECMAScript integer conversion abstract operation, ToUint8Clamp rounds rather than truncates non-integer
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.12.1 NumberToString ( m )
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 exactly the same Number value as x.
The least significant digit of s is not always uniquely determined by the requirements listed in step 5.
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 5 be used as a guideline:
5. Otherwise, let n, k, and s be integers such that k ≥ 1, 10k - 1 ≤ s < 10k, the Number value for s × 10n - k is m, and k is as small
as possible. If there are multiple possibilities for s, choose the value of s for which s × 10n - k is closest in value to m. If
there are two such possible values of s, choose the one that is even. Note that k is the number of digits in the decimal
representation of s and that s is not divisible by 10.
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). November 30, 1990. Available as
http://ampl.com/REFS/abstracts.html#rounding. Associated code available as
http://netlib.sandia.gov/fp/dtoa.c and as
http://netlib.sandia.gov/fp/g_fmt.c and may also be found at the various netlib mirror sites.
Boolean Return a new Boolean object whose [[BooleanData]] internal slot is set to argument. See 19.3 for a
description of Boolean objects.
Number Return a new Number object whose [[NumberData]] internal slot is set to argument. See 20.1 for a
description of Number objects.
String Return a new String object whose [[StringData]] internal slot is set to argument. See 21.1 for a description of
String objects.
Symbol Return a new Symbol object whose [[SymbolData]] internal slot is set to argument. See 19.4 for a description
of Symbol objects.
A canonical numeric string is any String value for which the CanonicalNumericIndexString abstract operation does not return
undefined.
7.2.5 IsExtensible ( O )
The abstract operation IsExtensible is used to determine whether additional properties can be added to the object that is O. A
Boolean value is returned. This abstract operation performs the following steps:
7.2.9 IsStringPrefix ( p, q )
The abstract operation IsStringPrefix determines if String p is a prefix of String q.
7.2.10 SameValue ( x, y )
The internal comparison abstract operation SameValue(x, y), where x and y are ECMAScript language values, produces true or
false. Such a comparison is performed as follows:
7.2.11 SameValueZero ( x, y )
The internal comparison abstract operation SameValueZero(x, y), where x and y are ECMAScript language values, produces
true or false. Such a comparison is performed as follows:
NOTE
SameValueZero differs from SameValue only in its treatment of +0 and -0.
7.2.12 SameValueNonNumber ( x, y )
The internal comparison abstract operation SameValueNonNumber(x, y), where neither x nor y are Number values, produces
true or false. Such a comparison is performed as follows:
NOTE 1
Step 3 differs from step 7 in the algorithm for the addition operator + (12.8.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 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 could test as unequal. In
effect this algorithm assumes that both Strings are already in normalized form. Also, note that for strings containing
supplementary characters, lexicographic ordering on sequences of UTF-16 code unit values differs from that on sequences of
code point values.
NOTE
This algorithm differs from the SameValue Algorithm in its treatment of signed zeroes and NaNs.
7.3.1 Get ( O, P )
The abstract operation Get is used to retrieve the value of a specific property of an object. The operation is called with
arguments O and P where O is the object and P is the property key. This abstract operation performs the following steps:
7.3.4 CreateDataProperty ( O, P, V )
The abstract operation CreateDataProperty is used to create a new own property of an object. The operation is called with
arguments O, P, and V where O is the object, P is the property key, and V is the value for the property. This abstract operation
performs the following steps:
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 O is not extensible, [[DefineOwnProperty]] will return false.
7.3.5 CreateMethodProperty ( O, P, V )
The abstract operation CreateMethodProperty is used to create a new own property of an object. The operation is called with
arguments O, P, and V where O is the object, P is the property key, and V is the value for the property. This abstract operation
performs the following steps:
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 and is not
configurable or if O is not extensible, [[DefineOwnProperty]] will return false.
7.3.6 CreateDataPropertyOrThrow ( O, P, V )
The abstract operation CreateDataPropertyOrThrow is used to create a new own property of an object. It throws a TypeError
exception if the requested property update cannot be performed. The operation is called with arguments O, P, and V where O is
the object, P is the property key, and V is the value for the property. This abstract operation performs the following steps:
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 O is not extensible, [[DefineOwnProperty]] will return false causing this operation to throw a TypeError
exception.
7.3.8 DeletePropertyOrThrow ( O, P )
The abstract operation DeletePropertyOrThrow is used to remove a specific own property of an object. It throws an exception
if the property is not configurable. The operation is called with arguments O and P where O is the object and P is the property
7.3.9 GetMethod ( V, P )
The abstract operation GetMethod 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. The operation is called with arguments V and P where V is the ECMAScript
language value, P is the property key. This abstract operation performs the following steps:
7.3.10 HasProperty ( O, P )
The abstract operation HasProperty is used to determine whether an object has a property with the specified property key.
The property may be either an own or inherited. A Boolean value is returned. The operation is called with arguments O and P
where O is the object and P is the property key. This abstract operation performs the following steps:
7.3.11 HasOwnProperty ( O, P )
The abstract operation HasOwnProperty is used to determine whether an object has an own property with the specified
property key. A Boolean value is returned. The operation is called with arguments O and P where O is the object and P is the
property key. This abstract operation performs the following steps:
NOTE
If newTarget is not present, this operation is equivalent to: new F(...argumentsList)
1. Assert: elements is a List whose elements are all ECMAScript language values.
2. Let array be ! ArrayCreate(0).
3. Let n be 0.
4. For each element e of elements, do
a. Let status be CreateDataProperty(array, ! ToString(n), e).
b. Assert: status is true.
c. Increment n by 1.
5. Return array.
1. If elementTypes is not present, set elementTypes to « Undefined, Null, Boolean, String, Symbol, Number, Object ».
74 © Ecma International 2019
2. If Type(obj) is not Object, throw a TypeError exception.
3. Let len be ? ToLength(? Get(obj, "length")).
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 Type(next) is not an element of elementTypes, throw a TypeError exception.
d. Append next as the last element of list.
e. Increase index by 1.
7. Return list.
7.3.19 OrdinaryHasInstance ( C, O )
The abstract operation OrdinaryHasInstance implements the default algorithm for determining if an object O inherits from the
instance object inheritance path provided by constructor C. This abstract operation performs the following steps:
NOTE
Step 5 will only be reached if obj is a non-standard function exotic object that does not have a [[Realm]] internal slot.
NOTE
The target passed in here is always a newly created object which is not directly accessible in case of an error being thrown.
NOTE
The list iterator object is never directly accessible to ECMAScript code.
The ListIterator next method is a standard built-in function object (clause 17) that performs the following steps:
The outer environment reference is used to model the logical nesting of Lexical Environment values. The outer reference of a
(inner) Lexical Environment is a reference to the Lexical Environment that logically surrounds the inner Lexical Environment.
An outer Lexical Environment may, of course, have its own outer Lexical Environment. A Lexical Environment may serve as
the outer environment for multiple inner Lexical Environments. For example, if a FunctionDeclaration contains two nested
FunctionDeclarations then the Lexical Environments of each of the nested functions will have as their outer Lexical
Environment the Lexical Environment of the current evaluation of the surrounding function.
A global environment is a Lexical Environment which does not have an outer environment. The global environment's outer
environment reference is null. A global environment's EnvironmentRecord may be prepopulated with identifier bindings and
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.
A module environment is a Lexical Environment that contains the bindings for the top level declarations of a Module. It also
contains the bindings that are explicitly imported by the Module. The outer environment of a module environment is a global
environment.
A function environment is a Lexical Environment that corresponds to the invocation of an ECMAScript function object. A
function environment may establish a new this binding. A function environment also captures the state necessary to support
super method invocations.
Lexical Environments and Environment Record values 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.
For specification purposes Environment Record values are values of the Record specification type and 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. The abstract class includes the abstract
specification methods defined in Table 14. These abstract methods have distinct concrete algorithms for each of the concrete
subclasses.
HasBinding(N) Determine if an Environment Record has a binding for the String value N. Return true if it does
and false if it does not.
CreateMutableBinding(N, Create a new but uninitialized mutable binding in an Environment Record. The String value N
D) is the text of the bound name. If the Boolean argument D is true the binding may be
subsequently deleted.
CreateImmutableBinding(N, Create a new but uninitialized immutable binding in an Environment Record. The String value
S) N is the text of the bound name. If S 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 N is the text of the bound name. V 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 N is the text of the bound name. V is the value for the binding and may be a value of any
ECMAScript language type. S is a Boolean flag. If S 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 N is the text of the bound name. S is used to identify references originating in strict
mode code or that otherwise require strict mode reference semantics. If S 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 S.
DeleteBinding(N) Delete a binding from an Environment Record. The String value N is the text of the bound
name. If a binding for N 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.
The behaviour of the concrete specification methods for declarative Environment Records is defined by the following
82 © Ecma International 2019
algorithms.
8.1.1.1.1 HasBinding ( N )
The concrete Environment Record method HasBinding for declarative Environment Records simply determines if the
argument identifier is one of the identifiers bound by the record:
1. Let envRec be the declarative Environment Record for which the method was invoked.
2. If envRec has a binding for the name that is the value of N, return true.
3. Return false.
8.1.1.1.2 CreateMutableBinding ( N, D )
The concrete Environment Record method CreateMutableBinding for declarative Environment Records creates a new mutable
binding for the name N that is uninitialized. A binding must not already exist in this Environment Record for N. If Boolean
argument D has the value true the new binding is marked as being subject to deletion.
1. Let envRec be the declarative Environment Record for which the method was invoked.
2. Assert: envRec does not already have a binding for N.
3. Create a mutable binding in envRec for N and record that it is uninitialized. If D is true, record that the newly created
binding may be deleted by a subsequent DeleteBinding call.
4. Return NormalCompletion(empty).
8.1.1.1.3 CreateImmutableBinding ( N, S )
The concrete Environment Record method CreateImmutableBinding for declarative Environment Records creates a new
immutable binding for the name N that is uninitialized. A binding must not already exist in this Environment Record for N. If
the Boolean argument S has the value true the new binding is marked as a strict binding.
1. Let envRec be the declarative Environment Record for which the method was invoked.
2. Assert: envRec does not already have a binding for N.
3. Create an immutable binding in envRec for N and record that it is uninitialized. If S is true, record that the newly created
binding is a strict binding.
4. Return NormalCompletion(empty).
8.1.1.1.4 InitializeBinding ( N, V )
The concrete Environment Record method InitializeBinding for declarative Environment Records is used to set the bound
value of the current binding of the identifier whose name is the value of the argument N to the value of argument V. An
uninitialized binding for N must already exist.
1. Let envRec be the declarative Environment Record for which the method was invoked.
2. Assert: envRec must have an uninitialized binding for N.
3. Set the bound value for N in envRec to V.
4. Record that the binding for N in envRec has been initialized.
5. Return NormalCompletion(empty).
The concrete Environment Record method SetMutableBinding for declarative Environment Records attempts to change the
bound value of the current binding of the identifier whose name is the value of the argument N to the value of argument V. A
binding for N normally already exists, but in rare cases it may not. If the binding is an immutable binding, a TypeError is
thrown if S is true.
1. Let envRec be the declarative Environment Record for which the method was invoked.
2. If envRec does not have a binding for N, then
a. If S is true, throw a ReferenceError exception.
b. Perform envRec.CreateMutableBinding(N, true).
c. Perform envRec.InitializeBinding(N, V).
d. Return NormalCompletion(empty).
3. If the binding for N in envRec is a strict binding, set S to true.
4. If the binding for N in envRec has not yet been initialized, throw a ReferenceError exception.
5. Else if the binding for N in envRec is a mutable binding, change its bound value to V.
6. Else,
a. Assert: This is an attempt to change the value of an immutable binding.
b. If S is true, throw a TypeError exception.
7. Return NormalCompletion(empty).
NOTE
An example of ECMAScript code that results in a missing binding at step 2 is:
8.1.1.1.6 GetBindingValue ( N, S )
The concrete Environment Record method GetBindingValue for declarative Environment Records simply returns the value of
its bound identifier whose name is the value of the argument N. If the binding exists but is uninitialized a ReferenceError is
thrown, regardless of the value of S.
1. Let envRec be the declarative Environment Record for which the method was invoked.
2. Assert: envRec has a binding for N.
3. If the binding for N in envRec is an uninitialized binding, throw a ReferenceError exception.
4. Return the value currently bound to N in envRec.
8.1.1.1.7 DeleteBinding ( N )
The concrete Environment Record method DeleteBinding for declarative Environment Records can only delete bindings that
have been explicitly designated as being subject to deletion.
1. Let envRec be the declarative Environment Record for which the method was invoked.
2. Assert: envRec has a binding for the name that is the value of N.
3. If the binding for N in envRec cannot be deleted, return false.
4. Remove the binding for N from envRec.
5. Return true.
1. Return false.
8.1.1.1.9 HasSuperBinding ( )
1. Return false.
8.1.1.1.10 WithBaseObject ( )
1. Return undefined.
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 has the value false. Immutable bindings
do not exist for object Environment Records.
Object Environment Records created for with statements (13.11) can provide their binding object as an implicit this value for
use in function calls. The capability is controlled by a withEnvironment Boolean value that is associated with each object
Environment Record. By default, the value of withEnvironment is false for any object Environment Record.
The behaviour of the concrete specification methods for object Environment Records is defined by the following algorithms.
8.1.1.2.1 HasBinding ( N )
The concrete Environment Record method HasBinding for object Environment Records determines if its associated binding
object has a property whose name is the value of the argument N:
1. Let envRec be the object Environment Record for which the method was invoked.
2. Let bindings be the binding object for envRec.
3. Let foundBinding be ? HasProperty(bindings, N).
4. If foundBinding is false, return false.
5. If the withEnvironment flag of envRec is false, return true.
6. Let unscopables be ? Get(bindings, @@unscopables).
7. If Type(unscopables) is Object, then
a. Let blocked be ToBoolean(? Get(unscopables, N)).
© Ecma International 2019 85
b. If blocked is true, return false.
8. Return true.
8.1.1.2.2 CreateMutableBinding ( N, D )
The concrete Environment Record method CreateMutableBinding for object Environment Records creates in an Environment
Record's associated binding object a property whose name is the String value and initializes it to the value undefined. If
Boolean argument D has the value true the new property's [[Configurable]] attribute is set to true; otherwise it is set to false.
1. Let envRec be the object Environment Record for which the method was invoked.
2. Let bindings be the binding object for envRec.
3. Return ? DefinePropertyOrThrow(bindings, N, PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true,
[[Enumerable]]: true, [[Configurable]]: D }).
NOTE
Normally envRec will not have a binding for N 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.
8.1.1.2.3 CreateImmutableBinding ( N, S )
The concrete Environment Record method CreateImmutableBinding is never used within this specification in association with
object Environment Records.
8.1.1.2.4 InitializeBinding ( N, V )
The concrete Environment Record method InitializeBinding for object Environment Records is used to set the bound value of
the current binding of the identifier whose name is the value of the argument N to the value of argument V. An uninitialized
binding for N must already exist.
1. Let envRec be the object Environment Record for which the method was invoked.
2. Assert: envRec must have an uninitialized binding for N.
3. Record that the binding for N in envRec has been initialized.
4. Return ? envRec.SetMutableBinding(N, V, false).
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, implementations do not need to explicitly track the initialization state of
individual object Environment Record bindings.
8.1.1.2.5 SetMutableBinding ( N, V, S )
The concrete Environment Record method SetMutableBinding for object Environment Records attempts to set the value of the
Environment Record's associated binding object's property whose name is the value of the argument N to the value of
argument V. A property named N normally already exists but if it does not or is not currently writable, error handling is
determined by the value of the Boolean argument S.
1. Let envRec be the object Environment Record for which the method was invoked.
2. Let bindings be the binding object for envRec.
86 © Ecma International 2019
3. Return ? Set(bindings, N, V, S).
8.1.1.2.6 GetBindingValue ( N, S )
The concrete Environment Record method GetBindingValue for object Environment Records returns the value of its associated
binding object's property whose name is the String value of the argument identifier N. The property should already exist but if
it does not the result depends upon the value of the S argument:
1. Let envRec be the object Environment Record for which the method was invoked.
2. Let bindings be the binding object for envRec.
3. Let value be ? HasProperty(bindings, N).
4. If value is false, then
a. If S is false, return the value undefined; otherwise throw a ReferenceError exception.
5. Return ? Get(bindings, N).
8.1.1.2.7 DeleteBinding ( N )
The concrete Environment Record method DeleteBinding for object Environment Records can only delete bindings that
correspond to properties of the environment object whose [[Configurable]] attribute have the value true.
1. Let envRec be the object Environment Record for which the method was invoked.
2. Let bindings be the binding object for envRec.
3. Return ? bindings.[[Delete]](N).
8.1.1.2.8 HasThisBinding ( )
1. Return false.
8.1.1.2.9 HasSuperBinding ( )
1. Return false.
8.1.1.2.10 WithBaseObject ( )
Object Environment Records return undefined as their WithBaseObject unless their withEnvironment flag is true.
1. Let envRec be the object Environment Record for which the method was invoked.
2. If the withEnvironment flag of envRec is true, return the binding object for envRec.
3. Otherwise, return undefined.
Function Environment Records have the additional state fields listed in Table 15.
[[ThisValue]] Any This is the this value used for this invocation of the function.
[[ThisBindingStatus]] "lexical" | If the value is "lexical", this is an ArrowFunction and does not have a local
"initialized" | this value.
"uninitialized"
[[FunctionObject]] Object The function object whose invocation caused this Environment Record to be
created.
[[HomeObject]] Object | If the associated function has super property accesses and is not an
undefined ArrowFunction, [[HomeObject]] is the object that the function is bound to as a
method. The default value for [[HomeObject]] is undefined.
[[NewTarget]] Object | If this Environment Record was created by the [[Construct]] internal method,
undefined [[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 14 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 16:
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
object is derived from this Environment Record's [[HomeObject]] field. The value undefined indicates
that super property accesses will produce runtime errors.
The behaviour of the additional concrete specification methods for function Environment Records is defined by the following
algorithms:
8.1.1.3.1 BindThisValue ( V )
8.1.1.3.2 HasThisBinding ( )
1. Let envRec be the function Environment Record for which the method was invoked.
2. If envRec.[[ThisBindingStatus]] is "lexical", return false; otherwise, return true.
8.1.1.3.3 HasSuperBinding ( )
1. Let envRec be the function Environment Record for which the method was invoked.
2. If envRec.[[ThisBindingStatus]] is "lexical", return false.
3. If envRec.[[HomeObject]] has the value undefined, return false; otherwise, return true.
8.1.1.3.4 GetThisBinding ( )
1. Let envRec be the function Environment Record for which the method was invoked.
2. Assert: envRec.[[ThisBindingStatus]] is not "lexical".
3. If envRec.[[ThisBindingStatus]] is "uninitialized", throw a ReferenceError exception.
4. Return envRec.[[ThisValue]].
8.1.1.3.5 GetSuperBase ( )
1. Let envRec be the function Environment Record for which the method was invoked.
2. Let home be envRec.[[HomeObject]].
3. If home has the value undefined, return undefined.
4. Assert: Type(home) is Object.
5. Return ? home.[[GetPrototypeOf]]().
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 18) 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
© Ecma International 2019 89
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 17 and the additional methods listed in Table 18.
[[ObjectRecord]] Object Binding object is the global object. It contains global built-in bindings as well as
Environment FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration,
Record AsyncGeneratorDeclaration, and VariableDeclaration bindings in global code for the
associated realm.
[[GlobalThisValue]] Object The value returned by this in global scope. Hosts may provide any ECMAScript
Object value.
[[DeclarativeRecord]] Declarative Contains bindings for all declarations in global code for the associated realm code
Environment except for FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration,
Record AsyncGeneratorDeclaration, and VariableDeclaration bindings.
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 Determines if the argument is the name of a global object property that may not be
(N) shadowed by a global lexical binding.
CanDeclareGlobalVar (N) Determines if a corresponding CreateGlobalVarBinding call would succeed if called for the
same argument N.
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 N is the bound name. If D 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, Create and initialize a global function binding in the [[ObjectRecord]] component of a
V, D) 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 N is the bound name. V is the initialization value. If the Boolean argument D 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.
8.1.1.4.1 HasBinding ( N )
The concrete Environment Record method HasBinding for global Environment Records simply determines if the argument
identifier is one of the identifiers bound by the record:
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let DclRec be envRec.[[DeclarativeRecord]].
3. If DclRec.HasBinding(N) is true, return true.
4. Let ObjRec be envRec.[[ObjectRecord]].
5. Return ? ObjRec.HasBinding(N).
8.1.1.4.2 CreateMutableBinding ( N, D )
The concrete Environment Record method CreateMutableBinding for global Environment Records creates a new mutable
binding for the name N that is uninitialized. The binding is created in the associated DeclarativeRecord. A binding for N must
not already exist in the DeclarativeRecord. If Boolean argument D has the value true the new binding is marked as being
subject to deletion.
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let DclRec be envRec.[[DeclarativeRecord]].
3. If DclRec.HasBinding(N) is true, throw a TypeError exception.
4. Return DclRec.CreateMutableBinding(N, D).
8.1.1.4.3 CreateImmutableBinding ( N, S )
The concrete Environment Record method CreateImmutableBinding for global Environment Records creates a new immutable
binding for the name N that is uninitialized. A binding must not already exist in this Environment Record for N. If the Boolean
© Ecma International 2019 91
argument S has the value true the new binding is marked as a strict binding.
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let DclRec be envRec.[[DeclarativeRecord]].
3. If DclRec.HasBinding(N) is true, throw a TypeError exception.
4. Return DclRec.CreateImmutableBinding(N, S).
8.1.1.4.4 InitializeBinding ( N, V )
The concrete Environment Record method InitializeBinding for global Environment Records is used to set the bound value of
the current binding of the identifier whose name is the value of the argument N to the value of argument V. An uninitialized
binding for N must already exist.
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let DclRec be envRec.[[DeclarativeRecord]].
3. If DclRec.HasBinding(N) is true, then
a. Return DclRec.InitializeBinding(N, V).
4. Assert: If the binding exists, it must be in the object Environment Record.
5. Let ObjRec be envRec.[[ObjectRecord]].
6. Return ? ObjRec.InitializeBinding(N, V).
8.1.1.4.5 SetMutableBinding ( N, V, S )
The concrete Environment Record method SetMutableBinding for global Environment Records attempts to change the bound
value of the current binding of the identifier whose name is the value of the argument N to the value of argument V. If the
binding is an immutable binding, a TypeError is thrown if S is true. A property named N normally already exists but if it does
not or is not currently writable, error handling is determined by the value of the Boolean argument S.
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let DclRec be envRec.[[DeclarativeRecord]].
3. If DclRec.HasBinding(N) is true, then
a. Return DclRec.SetMutableBinding(N, V, S).
4. Let ObjRec be envRec.[[ObjectRecord]].
5. Return ? ObjRec.SetMutableBinding(N, V, S).
8.1.1.4.6 GetBindingValue ( N, S )
The concrete Environment Record method GetBindingValue for global Environment Records returns the value of its bound
identifier whose name is the value of the argument N. If the binding is an uninitialized binding throw a ReferenceError
exception. A property named N normally already exists but if it does not or is not currently writable, error handling is
determined by the value of the Boolean argument S.
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let DclRec be envRec.[[DeclarativeRecord]].
3. If DclRec.HasBinding(N) is true, then
a. Return DclRec.GetBindingValue(N, S).
4. Let ObjRec be envRec.[[ObjectRecord]].
92 © Ecma International 2019
5. Return ? ObjRec.GetBindingValue(N, S).
8.1.1.4.7 DeleteBinding ( N )
The concrete Environment Record method DeleteBinding for global Environment Records can only delete bindings that have
been explicitly designated as being subject to deletion.
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let DclRec be envRec.[[DeclarativeRecord]].
3. If DclRec.HasBinding(N) is true, then
a. Return DclRec.DeleteBinding(N).
4. Let ObjRec be envRec.[[ObjectRecord]].
5. Let globalObject be the binding object for ObjRec.
6. Let existingProp be ? HasOwnProperty(globalObject, N).
7. If existingProp is true, then
a. Let status be ? ObjRec.DeleteBinding(N).
b. If status is true, then
i. Let varNames be envRec.[[VarNames]].
ii. If N is an element of varNames, remove that element from the varNames.
c. Return status.
8. Return true.
8.1.1.4.8 HasThisBinding ( )
1. Return true.
8.1.1.4.9 HasSuperBinding ( )
1. Return false.
8.1.1.4.10 WithBaseObject ( )
1. Return undefined.
8.1.1.4.11 GetThisBinding ( )
1. Let envRec be the global Environment Record for which the method was invoked.
2. Return envRec.[[GlobalThisValue]].
8.1.1.4.12 HasVarDeclaration ( N )
The concrete Environment Record method HasVarDeclaration for global Environment Records determines if the argument
identifier has a binding in this record that was created using a VariableStatement or a FunctionDeclaration:
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let varDeclaredNames be envRec.[[VarNames]].
© Ecma International 2019 93
3. If varDeclaredNames contains N, return true.
4. Return false.
8.1.1.4.13 HasLexicalDeclaration ( N )
The concrete Environment Record method HasLexicalDeclaration for global Environment Records 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:
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let DclRec be envRec.[[DeclarativeRecord]].
3. Return DclRec.HasBinding(N).
8.1.1.4.14 HasRestrictedGlobalProperty ( N )
The concrete Environment Record method HasRestrictedGlobalProperty for global Environment Records 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:
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let ObjRec be envRec.[[ObjectRecord]].
3. Let globalObject be the binding object for ObjRec.
4. Let existingProp be ? globalObject.[[GetOwnProperty]](N).
5. If existingProp is undefined, return false.
6. If existingProp.[[Configurable]] is true, return false.
7. 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.
8.1.1.4.15 CanDeclareGlobalVar ( N )
The concrete Environment Record method CanDeclareGlobalVar for global Environment Records determines if a
corresponding CreateGlobalVarBinding call would succeed if called for the same argument N. Redundant var declarations and
var declarations for pre-existing global object properties are allowed.
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let ObjRec be envRec.[[ObjectRecord]].
3. Let globalObject be the binding object for ObjRec.
4. Let hasProperty be ? HasOwnProperty(globalObject, N).
5. If hasProperty is true, return true.
6. Return ? IsExtensible(globalObject).
8.1.1.4.16 CanDeclareGlobalFunction ( N )
The concrete Environment Record method CanDeclareGlobalFunction for global Environment Records determines if a
94 © Ecma International 2019
corresponding CreateGlobalFunctionBinding call would succeed if called for the same argument N.
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let ObjRec be envRec.[[ObjectRecord]].
3. Let globalObject be the binding object for ObjRec.
4. Let existingProp be ? globalObject.[[GetOwnProperty]](N).
5. If existingProp is undefined, return ? IsExtensible(globalObject).
6. If existingProp.[[Configurable]] is true, return true.
7. If IsDataDescriptor(existingProp) is true and existingProp has attribute values { [[Writable]]: true, [[Enumerable]]: true },
return true.
8. Return false.
8.1.1.4.17 CreateGlobalVarBinding ( N, D )
The concrete Environment Record method CreateGlobalVarBinding for global Environment Records 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.
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let ObjRec be envRec.[[ObjectRecord]].
3. Let globalObject be the binding object for ObjRec.
4. Let hasProperty be ? HasOwnProperty(globalObject, N).
5. Let extensible be ? IsExtensible(globalObject).
6. If hasProperty is false and extensible is true, then
a. Perform ? ObjRec.CreateMutableBinding(N, D).
b. Perform ? ObjRec.InitializeBinding(N, undefined).
7. Let varDeclaredNames be envRec.[[VarNames]].
8. If varDeclaredNames does not contain N, then
a. Append N to varDeclaredNames.
9. Return NormalCompletion(empty).
8.1.1.4.18 CreateGlobalFunctionBinding ( N, V, D )
The concrete Environment Record method CreateGlobalFunctionBinding for global Environment Records 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.
1. Let envRec be the global Environment Record for which the method was invoked.
2. Let ObjRec be envRec.[[ObjectRecord]].
3. Let globalObject be the binding object for ObjRec.
4. Let existingProp be ? globalObject.[[GetOwnProperty]](N).
5. If existingProp is undefined or existingProp.[[Configurable]] is true, then
a. Let desc be the PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: D }.
6. Else,
a. Let desc be the PropertyDescriptor { [[Value]]: V }.
7. Perform ? DefinePropertyOrThrow(globalObject, N, desc).
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. Steps 8-9 are 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.
Module Environment Records support all of the declarative Environment Record methods listed in Table 14 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 19:
CreateImportBinding(N, Create an immutable indirect binding in a module Environment Record. The String value N is the
M, N2) text of the bound name. M is a Module Record, and N2 is a binding that exists in M's module
Environment Record.
The behaviour of the additional concrete specification methods for module Environment Records are defined by the following
algorithms:
8.1.1.5.1 GetBindingValue ( N, S )
The concrete Environment Record method GetBindingValue for module Environment Records returns the value of its bound
identifier whose name is the value of the argument N. 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.
1. Assert: S is true.
2. Let envRec be the module Environment Record for which the method was invoked.
3. Assert: envRec has a binding for N.
4. If the binding for N is an indirect binding, then
a. Let M and N2 be the indirection values provided when this binding for N was created.
b. Let targetEnv be M.[[Environment]].
96 © Ecma International 2019
c. If targetEnv is undefined, throw a ReferenceError exception.
d. Let targetER be targetEnv's EnvironmentRecord.
e. Return ? targetER.GetBindingValue(N2, true).
5. If the binding for N in envRec is an uninitialized binding, throw a ReferenceError exception.
6. Return the value currently bound to N in envRec.
NOTE
S will always be true because a Module is always strict mode code.
8.1.1.5.2 DeleteBinding ( N )
The concrete Environment Record method DeleteBinding for module Environment Records refuses to delete bindings.
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 that would resolve to a module Environment Record binding. See 12.5.3.1.
8.1.1.5.3 HasThisBinding ( )
1. Return true.
8.1.1.5.4 GetThisBinding ( )
1. Return undefined.
8.1.1.5.5 CreateImportBinding ( N, M, N2 )
The concrete Environment Record method CreateImportBinding for module Environment Records creates a new initialized
immutable indirect binding for the name N. A binding must not already exist in this Environment Record for N. M is a Module
Record, and N2 is the name of a binding that exists in M's module Environment Record. Accesses to the value of the new
binding will indirectly access the bound value of the target binding.
1. Let envRec be the module Environment Record for which the method was invoked.
2. Assert: envRec does not already have a binding for N.
3. Assert: M is a Module Record.
4. Assert: When M.[[Environment]] is instantiated it will have a direct binding for N2.
5. Create an immutable indirect binding in envRec for N that references M and N2 as its target binding and record that the
binding is initialized.
6. Return NormalCompletion(empty).
The abstract operation GetIdentifierReference is called with a Lexical Environment lex, a String name, and a Boolean flag strict.
The value of lex may be null. When called, the following steps are performed:
8.1.2.2 NewDeclarativeEnvironment ( E )
When the abstract operation NewDeclarativeEnvironment is called with a Lexical Environment as argument E the following
steps are performed:
8.1.2.3 NewObjectEnvironment ( O, E )
When the abstract operation NewObjectEnvironment is called with an Object O and a Lexical Environment E as arguments, the
following steps are performed:
When the abstract operation NewFunctionEnvironment is called with arguments F and newTarget the following steps are
performed:
8.1.2.6 NewModuleEnvironment ( E )
When the abstract operation NewModuleEnvironment is called with a Lexical Environment argument E the following steps are
performed:
8.2 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.
[[Intrinsics]] Record whose field The intrinsic values used by code associated with this realm
names are intrinsic
keys and whose
values are objects
[[TemplateMap]] A List of Record { Template objects are canonicalized separately for each realm using its Realm
[[Site]]: Parse Node, Record's [[TemplateMap]]. Each [[Site]] value is a Parse Node that is a
[[Array]]: Object }. TemplateLiteral. The associated [[Array]] value is the corresponding template
object that is passed to a tag function.
NOTE
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.
[[HostDefined]] Any, default value is Field reserved for use by host environments that need to associate additional
undefined. information with a Realm Record.
8.2.1 CreateRealm ( )
The abstract operation CreateRealm with no arguments performs the following steps:
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 21.
code evaluation Any state needed to perform, suspend, and resume evaluation of the code associated with this execution
state 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.
Execution contexts for ECMAScript code have the additional state components listed in Table 22.
Table 22: Additional State Components for ECMAScript Code Execution Contexts
Component Purpose
LexicalEnvironment Identifies the Lexical Environment used to resolve identifier references made by code within this
execution context.
102 © Ecma International 2019
VariableEnvironment Identifies the Lexical Environment whose EnvironmentRecord holds bindings created by
VariableStatements within this execution context.
The LexicalEnvironment and VariableEnvironment components of an execution context are always Lexical Environments.
Execution contexts representing the evaluation of generator objects have the additional state components listed in Table 23.
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.
8.3.1 GetActiveScriptOrModule ( )
The GetActiveScriptOrModule abstract operation is used to determine the running script or module, based on the running
execution context. GetActiveScriptOrModule performs the following steps:
NOTE
The result of ResolveBinding is always a Reference value with its referenced name component equal to the name argument.
NOTE
The loop in step 2 will always terminate because the list of environments always ends with the global environment which has
a this binding.
8.3.4 ResolveThisBinding ( )
The abstract operation ResolveThisBinding determines the binding of the keyword this using the LexicalEnvironment of the
running execution context. ResolveThisBinding performs the following steps:
8.3.5 GetNewTarget ( )
The abstract operation GetNewTarget determines the NewTarget value using the LexicalEnvironment of the running
execution context. GetNewTarget performs the following steps:
8.3.6 GetGlobalObject ( )
The abstract operation GetGlobalObject returns the global object used by the currently running execution context.
GetGlobalObject performs the following steps:
Execution of a Job can be initiated only when there is no running execution context and the execution context stack is empty. A
PendingJob is a request for the future execution of a Job. A PendingJob is an internal Record whose fields are specified in Table
24. Once execution of a Job is initiated, the Job always executes to completion. No other Job may be initiated until the
currently running Job completes. However, the currently running Job or external events may cause the enqueuing of additional
PendingJobs that may be initiated sometime after completion of the currently running Job.
[[Job]] The name of a Job This is the abstract operation that is performed when execution of this
abstract operation PendingJob is initiated.
[[Arguments]] A List The List of argument values that are to be passed to [[Job]] when it is
activated.
[[Realm]] A Realm Record The Realm Record for the initial execution context when this PendingJob is
initiated.
[[ScriptOrModule]] A Script Record or The script or module for the initial execution context when this PendingJob
Module Record is initiated.
[[HostDefined]] Any, default value is Field reserved for use by host environments that need to associate
undefined. additional information with a pending Job.
A Job Queue is a FIFO queue of PendingJob records. Each Job Queue has a name and the full set of available Job Queues are
defined by an ECMAScript implementation. Every ECMAScript implementation has at least the Job Queues defined in Table 25.
Each agent has its own set of named Job Queues. All references to a named job queue in this specification denote the named
job queue of the surrounding agent.
ScriptJobs Jobs that validate and evaluate ECMAScript Script and Module source text. See clauses 10 and 15.
PromiseJobs Jobs that are responses to the settlement of a Promise (see 25.6).
A request for the future execution of a Job is made by enqueueing, on a Job Queue, a PendingJob record that includes a Job
abstract operation name and any necessary argument values. When there is no running execution context and the execution
context stack is empty, the ECMAScript implementation removes the first PendingJob from a Job Queue and uses the
information contained in it to create an execution context and starts execution of the associated Job abstract operation.
The PendingJob records from a single Job Queue are always initiated in FIFO order. This specification does not define the
© Ecma International 2019 105
order in which multiple Job Queues are serviced. An ECMAScript implementation may interweave the FIFO evaluation of the
PendingJob records of a Job Queue with the evaluation of the PendingJob records of one or more other Job Queues. An
implementation must define what occurs when there are no running execution context and all Job Queues are empty.
NOTE
Typically an ECMAScript implementation will have its Job Queues pre-initialized with at least one PendingJob and one of those
Jobs will be the first to be executed. An implementation might choose to free all resources and terminate if the current Job
completes and all Job Queues are empty. Alternatively, it might choose to wait for a some implementation specific agent or
mechanism to enqueue new PendingJob requests.
The following abstract operations are used to create and manage Jobs and Job Queues:
1. Assert: Type(queueName) is String and its value is the name of a Job Queue recognized by this implementation.
2. Assert: job is the name of a Job.
3. Assert: arguments is a List that has the same number of elements as the number of parameters required by job.
4. Let callerContext be the running execution context.
5. Let callerRealm be callerContext's Realm.
6. Let callerScriptOrModule be callerContext's ScriptOrModule.
7. Let pending be PendingJob { [[Job]]: job, [[Arguments]]: arguments, [[Realm]]: callerRealm, [[ScriptOrModule]]:
callerScriptOrModule, [[HostDefined]]: undefined }.
8. Perform any implementation or host environment defined processing of pending. This may include modifying the
[[HostDefined]] field or any other field of pending.
9. Add pending at the back of the Job Queue named by queueName.
10. Return NormalCompletion(empty).
8.5 InitializeHostDefinedRealm ( )
The abstract operation InitializeHostDefinedRealm performs the following steps:
8.6 RunJobs ( )
The abstract operation RunJobs performs the following steps:
1. Perform ? InitializeHostDefinedRealm().
2. In an implementation-dependent manner, obtain the ECMAScript source texts (see clause 10) and any associated host-
defined values for zero or more ECMAScript scripts and/or ECMAScript modules. For each such sourceText and
hostDefined, do
a. If sourceText is the source code of a script, then
i. Perform EnqueueJob("ScriptJobs", ScriptEvaluationJob, « sourceText, hostDefined »).
b. Else sourceText is the source code of a module,
i. Perform EnqueueJob("ScriptJobs", TopLevelModuleEvaluationJob, « sourceText, hostDefined »).
3. Repeat,
a. Suspend the running execution context and remove it from the execution context stack.
b. Assert: The execution context stack is now empty.
c. Let nextQueue be a non-empty Job Queue chosen in an implementation-defined manner. If all Job Queues are empty,
the result is implementation-defined.
d. Let nextPending be the PendingJob record at the front of nextQueue. Remove that record from nextQueue.
e. Let newContext be a new execution context.
f. Set newContext's Function to null.
g. Set newContext's Realm to nextPending.[[Realm]].
h. Set newContext's ScriptOrModule to nextPending.[[ScriptOrModule]].
i. Push newContext onto the execution context stack; newContext is now the running execution context.
j. Perform any implementation or host environment defined job initialization using nextPending.
k. Let result be the result of performing the abstract operation named by nextPending.[[Job]] using the elements of
nextPending.[[Arguments]] as its arguments.
l. If result is an abrupt completion, perform HostReportErrors(« result.[[Value]] »).
8.7 Agents
An agent comprises a set of ECMAScript execution contexts, an execution context stack, a running execution context, a set of
named job queues, 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 the jobs in the agent's job queues 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]] property is true.
NOTE 1
© Ecma International 2019 107
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 the jobs in the agent's job queues, 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, the named job queues, and the Agent Record's fields.
[[LittleEndian]] Boolean The default value computed for the isLittleEndian parameter when it is needed by the
algorithms GetValueFromBuffer and SetValueInBuffer. The choice is implementation-
dependent and should be the alternative that is most efficient for the implementation.
Once the value has been observed it cannot change.
[[Signifier]] Any Uniquely identifies the agent within its agent cluster.
globally-
unique
value
[[IsLockFree1]] Boolean true if atomic operations on one-byte values are lock-free, false otherwise.
[[IsLockFree2]] Boolean true if atomic operations on two-byte values are lock-free, false otherwise.
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.
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 n is lock-free does not imply anything about the (perceived) atomicity of non-atomic accesses of
size n, 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.
8.7.2 AgentCanSuspend ( )
The abstract operation AgentCanSuspend takes no arguments. It performs the following steps:
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.
NOTE 1
Programs within different agents may share memory by unspecified means. At a minimum, the backing memory for
SharedArrayBuffer objects 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.
NOTE 2
The agents in a cluster need not all be alive at some particular point in time. If agent A creates another agent B, after which A
terminates and B creates agent C, the three agents are in the same cluster if A could share some memory with B and B could
share some memory with C.
All agents within a cluster must have the same value for the [[LittleEndian]] property 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]] property in their respective Agent Records;
similarly for the [[IsLockFree2]] property.
All agents within a cluster must have different values for the [[Signifier]] property in their respective Agent Records.
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 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.
An agent becomes blocked when its running execution context waits synchronously and indefinitely for an external event. Only
agents whose Agent Record's [[CanBlock]] property is true can become blocked in this sense. An unblocked agent is one that is
not blocked.
110 © Ecma International 2019
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.
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 O is an ordinary object, P is a property key value, V 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 O 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.
9.1.1 [[GetPrototypeOf]] ( )
When the [[GetPrototypeOf]] internal method of O is called, the following steps are taken:
1. Return ! OrdinaryGetPrototypeOf(O).
9.1.1.1 OrdinaryGetPrototypeOf ( O )
When the abstract operation OrdinaryGetPrototypeOf is called with Object O, the following steps are taken:
1. Return O.[[Prototype]].
9.1.2.1 OrdinarySetPrototypeOf ( O, V )
When the abstract operation OrdinarySetPrototypeOf is called with Object O and value V, the following steps are taken:
NOTE
The loop in step 8 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]].
9.1.3 [[IsExtensible]] ( )
When the [[IsExtensible]] internal method of O is called, the following steps are taken:
1. Return ! OrdinaryIsExtensible(O).
9.1.3.1 OrdinaryIsExtensible ( O )
When the abstract operation OrdinaryIsExtensible is called with Object O, the following steps are taken:
1. Return O.[[Extensible]].
9.1.4 [[PreventExtensions]] ( )
When the [[PreventExtensions]] internal method of O is called, the following steps are taken:
1. Return ! OrdinaryPreventExtensions(O).
112 © Ecma International 2019
9.1.4.1 OrdinaryPreventExtensions ( O )
When the abstract operation OrdinaryPreventExtensions is called with Object O, the following steps are taken:
9.1.5 [[GetOwnProperty]] ( P )
When the [[GetOwnProperty]] internal method of O is called with property key P, the following steps are taken:
9.1.5.1 OrdinaryGetOwnProperty ( O, P )
When the abstract operation OrdinaryGetOwnProperty is called with Object O and with property key P, the following steps are
taken:
When the abstract operation OrdinaryDefineOwnProperty is called with Object O, property key P, and Property Descriptor
Desc, the following steps are taken:
When the abstract operation IsCompatiblePropertyDescriptor is called with Boolean value Extensible, and Property
Descriptors Desc, and Current, the following steps are taken:
When the abstract operation ValidateAndApplyPropertyDescriptor is called with Object O, property key P, Boolean value
extensible, and Property Descriptors Desc, and current, the following steps are taken:
NOTE
If undefined is passed as O, only validation is performed and no object updates are performed.
9.1.7 [[HasProperty]] ( P )
When the [[HasProperty]] internal method of O is called with property key P, the following steps are taken:
9.1.7.1 OrdinaryHasProperty ( O, P )
When the abstract operation OrdinaryHasProperty is called with Object O and with property key P, the following steps are
taken:
9.1.10 [[Delete]] ( P )
When the [[Delete]] internal method of O is called with property key P, the following steps are taken:
9.1.10.1 OrdinaryDelete ( O, P )
When the abstract operation OrdinaryDelete is called with Object O and property key P, the following steps are taken:
9.1.11 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of O is called, the following steps are taken:
1. Return ! OrdinaryOwnPropertyKeys(O).
9.1.11.1 OrdinaryOwnPropertyKeys ( O )
When the abstract operation OrdinaryOwnPropertyKeys is called with Object O, the following steps are taken:
1. Assert: intrinsicDefaultProto is a String value that 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. Return ObjectCreate(proto, internalSlotsList).
1. Assert: intrinsicDefaultProto is a String value that 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. Assert: IsCallable(constructor) is true.
3. Let proto be ? Get(constructor, "prototype").
4. If Type(proto) is not Object, then
a. Let realm be ? GetFunctionRealm(constructor).
b. Set proto to realm's intrinsic object named intrinsicDefaultProto.
5. Return proto.
NOTE
ECMAScript function objects have the additional internal slots listed in Table 27.
[[Environment]] Lexical The Lexical Environment that the function was closed over. Used as the outer
Environment environment 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.
[[Realm]] Realm The realm in which the function was created and which provides any intrinsic objects
Record that are accessed when evaluating the function.
[[ScriptOrModule]] Script The script or module in which the function was created.
Record or
Module
Record
[[ThisMode]] (lexical, Defines how this references are interpreted within the formal parameters and code
strict, body of the function. lexical means that this refers to the this value of a lexically
global) 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 is interpreted
as a reference to the global object.
[[Strict]] Boolean true if this is a strict function, false if this is a non-strict function.
[[HomeObject]] Object If the function uses super, this is the object whose [[GetPrototypeOf]] provides the
object where super property lookups begin.
All ECMAScript function objects have the [[Call]] internal method defined here. ECMAScript functions that are also
constructors in addition have the [[Construct]] internal method.
NOTE
When calleeContext is removed from the execution context stack in step 8 it must not be destroyed if it is suspended and
retained for later resumption by an accessible generator object.
When the abstract operation PrepareForOrdinaryCall is called with function object F and ECMAScript language value
newTarget, the following steps are taken:
1. Return the result of EvaluateBody of the parsed code that is F.[[ECMAScriptCode]] passing F and argumentsList as the
arguments.
9.2.9.1 %ThrowTypeError% ( )
The %ThrowTypeError% intrinsic is an anonymous built-in function object that is defined once for each realm. When
%ThrowTypeError% is called it performs the following steps:
The "length" property of a %ThrowTypeError% function has the attributes { [[Writable]]: false, [[Enumerable]]: false,
[[Configurable]]: false }.
9.2.11 MakeClassConstructor ( F )
The abstract operation MakeClassConstructor with argument F performs the following steps:
1. Assert: F is an extensible object that does not have a name own property.
2. Assert: Type(name) is either Symbol or String.
3. Assert: If prefix is present, then Type(prefix) is String.
4. If Type(name) is 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 "]".
5. If prefix is present, then
a. Set name to the string-concatenation of prefix, the code unit 0x0020 (SPACE), and name.
6. Return ! DefinePropertyOrThrow(F, "name", PropertyDescriptor { [[Value]]: name, [[Writable]]: false, [[Enumerable]]:
false, [[Configurable]]: true }).
FunctionDeclarationInstantiation is performed as follows using arguments func and argumentsList. func is the function object
for which the execution context is being established.
NOTE 2
B.3.3 provides an extension to the above algorithm that is necessary for backwards compatibility with web browser
128 © Ecma International 2019
implementations of ECMAScript that predate ECMAScript 2015.
NOTE 3
Parameter Initializers may contain direct eval expressions. Any top level declarations of such evals are only visible to the eval
code (10.2). The creation of the environment for such declarations is described in 14.1.19.
If a built-in function object is implemented as an exotic object it must have the ordinary object behaviour specified in 9.1. All
such function exotic objects also have [[Prototype]], [[Extensible]], [[Realm]], and [[ScriptOrModule]] internal slots.
Unless otherwise specified every built-in function object has the %FunctionPrototype% 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 [[FunctionKind]] internal slot to have the value "classConstructor".
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:
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 object for later resumption.
10. Let result be the Completion Record that is the result of evaluating F in an implementation-defined manner that conforms
to the specification of F. The this value is uninitialized, argumentsList provides the named parameters, and newTarget
provides the NewTarget value.
1. Assert: steps is either a set of algorithm steps or other definition of a function's behaviour provided in this specification.
2. If realm is not present, set realm to the current Realm Record.
3. Assert: realm is a Realm Record.
4. If prototype is not present, set prototype to realm.[[Intrinsics]].[[%FunctionPrototype%]].
5. Let func be a new built-in function object that when called performs the action described by steps. The new function
object has internal slots whose names are the elements of internalSlotsList. The initial value of each of those internal
slots is undefined.
6. Set func.[[Realm]] to realm.
7. Set func.[[Prototype]] to prototype.
8. Set func.[[Extensible]] to true.
9. Set func.[[ScriptOrModule]] to null.
10. Return func.
Bound function objects do not have the internal slots of ECMAScript function objects defined in Table 27. Instead they have
the internal slots defined in Table 28.
[[BoundThis]] Any The value that is always passed as the this value when calling the wrapped
function.
[[BoundArguments]] List of Any A list of values whose elements are used as the first arguments to any call to the
wrapped function.
Bound function objects provide all of the essential internal methods as specified in 9.1. However, they use the following
definitions for the essential internal methods of function objects.
When the [[Construct]] internal method of a bound function exotic object, F that was created using the bind function is called
with a list of arguments argumentsList and newTarget, the following steps are taken:
The abstract operation BoundFunctionCreate with arguments targetFunction, boundThis and boundArgs is used to specify the
creation of new Bound Function exotic objects. It performs the following steps:
NOTE
132 © Ecma International 2019
A String property name P is an array index if and only if ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal to
232 - 1.
Array exotic objects provide an alternative definition for the [[DefineOwnProperty]] internal method. Except for that internal
method, Array exotic objects provide all of the other essential internal methods as specified in 9.1.
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.
When the abstract operation ArraySetLength is called with an Array exotic object A, and Property Descriptor Desc, the
following steps are taken:
NOTE
In steps 3 and 4, 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 2nd Edition of this specification.
String exotic objects have the same internal slots as ordinary objects. They also have a [[StringData]] internal slot.
String exotic objects provide alternative definitions for the following internal methods. All of the other String exotic object
essential internal methods that are not defined below are as specified in 9.1.
9.4.3.1 [[GetOwnProperty]] ( P )
When the [[GetOwnProperty]] internal method of a String exotic object S is called with property key P, the following steps are
taken:
© Ecma International 2019 135
1. Assert: IsPropertyKey(P) is true.
2. Let desc be OrdinaryGetOwnProperty(S, P).
3. If desc is not undefined, return desc.
4. Return ! StringGetOwnProperty(S, P).
9.4.3.3 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of a String exotic object O is called, the following steps are taken:
9.4.3.5 StringGetOwnProperty ( S, P )
The abstract operation StringGetOwnProperty called with arguments S and P performs the following steps:
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 (19.1.3.6) to identify
them as such.
Arguments exotic objects provide alternative definitions for the following internal methods. All of the other arguments exotic
object essential internal methods that are not defined below are as specified in 9.1
NOTE 1
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
© Ecma International 2019 137
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 2
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 3
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 4
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.
9.4.4.1 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of an arguments exotic object when called with a property key P performs the
following steps:
The [[Delete]] internal method of an arguments exotic object when called with a property key P performs the following steps:
The abstract operation CreateUnmappedArgumentsObject called with an argument argumentsList performs the following
steps:
The abstract operation CreateMappedArgumentsObject is called with object func, Parse Node formals, List argumentsList, and
Environment Record env. The following steps are performed:
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 a newly created arguments exotic object with a [[ParameterMap]] internal slot.
4. Set obj.[[GetOwnProperty]] as specified in 9.4.4.1.
5. Set obj.[[DefineOwnProperty]] as specified in 9.4.4.2.
6. Set obj.[[Get]] as specified in 9.4.4.3.
7. Set obj.[[Set]] as specified in 9.4.4.4.
The abstract operation MakeArgGetter called with String name and Environment Record env creates a built-in function object
that when executed returns the value bound for name in env. It performs the following steps:
An ArgGetter function is an anonymous built-in function with [[Name]] and [[Env]] internal slots. When an ArgGetter function
NOTE
ArgGetter functions are never directly accessible to ECMAScript code.
The abstract operation MakeArgSetter called with String name and Environment Record env creates a built-in function object
that when executed sets the value bound for name in env. It performs the following steps:
An ArgSetter function is an anonymous built-in function with [[Name]] and [[Env]] internal slots. When an ArgSetter function is
called with argument value it performs the following steps:
NOTE
ArgSetter functions are never directly accessible to ECMAScript code.
Integer-Indexed exotic objects have the same internal slots as ordinary objects and additionally [[ViewedArrayBuffer]],
[[ArrayLength]], [[ByteOffset]], and [[TypedArrayName]] internal slots.
Integer-Indexed exotic objects provide alternative definitions for the following internal methods. All of the other Integer-
Indexed exotic object essential internal methods that are not defined below are as specified in 9.1.
9.4.5.1 [[GetOwnProperty]] ( P )
When the [[GetOwnProperty]] internal method of an Integer-Indexed exotic object O is called with property key P, the
following steps are taken:
9.4.5.2 [[HasProperty]] ( P )
When the [[HasProperty]] internal method of an Integer-Indexed exotic object O is called with property key P, the following
steps are taken:
9.4.5.6 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of an Integer-Indexed exotic object O is called, the following steps are taken:
Module namespace objects have the internal slots defined in Table 29.
[[Module]] Module The Module Record whose exports this namespace exposes.
Record
[[Exports]] List of A List containing the String values of the exported names exposed as own properties of this object.
String The list is ordered as if an Array of those String values had been sorted using
Array.prototype.sort using undefined as comparefn.
[[Prototype]] Null This slot always contains the value null (see 9.4.6.1).
Module namespace exotic objects provide alternative definitions for all of the internal methods except [[GetPrototypeOf]],
146 © Ecma International 2019
which behaves as defined in 9.1.1.
9.4.6.1 [[SetPrototypeOf]] ( V )
When the [[SetPrototypeOf]] internal method of a module namespace exotic object O is called with argument V, the following
steps are taken:
9.4.6.2 [[IsExtensible]] ( )
When the [[IsExtensible]] internal method of a module namespace exotic object O is called, the following steps are taken:
1. Return false.
9.4.6.3 [[PreventExtensions]] ( )
When the [[PreventExtensions]] internal method of a module namespace exotic object O is called, the following steps are
taken:
1. Return true.
9.4.6.4 [[GetOwnProperty]] ( P )
When the [[GetOwnProperty]] internal method of a module namespace exotic object O is called with property key P, the
following steps are taken:
When the [[HasProperty]] internal method of a module namespace exotic object O is called with property key P, the following
steps are taken:
When the [[Get]] internal method of a module namespace exotic object O is called with property key P and ECMAScript
language value Receiver, the following steps are taken:
NOTE
ResolveExport is idempotent and side-effect free. An implementation might choose to pre-compute or cache the
ResolveExport results for the [[Exports]] of each module namespace exotic object.
When the [[Set]] internal method of a module namespace exotic object O is called with property key P, value V, and
ECMAScript language value Receiver, the following steps are taken:
1. Return false.
9.4.6.9 [[Delete]] ( P )
When the [[Delete]] internal method of a module namespace exotic object O is called with property key P, the following steps
are taken:
9.4.6.10 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of a module namespace exotic object O is called, the following steps are
taken:
Immutable prototype exotic objects have the same internal slots as ordinary objects. They are exotic only in the following
internal methods. All other internal methods of immutable prototype exotic objects that are not explicitly defined below are
instead defined as in ordinary objects.
9.4.7.1 [[SetPrototypeOf]] ( V )
When the [[SetPrototypeOf]] internal method of an immutable prototype exotic object O is called with argument V, the
© Ecma International 2019 149
following steps are taken:
9.4.7.2 SetImmutablePrototype ( O, V )
When the SetImmutablePrototype abstract operation is called with arguments O and V, the following steps are taken:
[[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
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 O is an ECMAScript proxy object, P is a property key value, V is any
ECMAScript language value and Desc is a Property Descriptor record.
9.5.1 [[GetPrototypeOf]] ( )
When the [[GetPrototypeOf]] internal method of a Proxy exotic object O is called, the following steps are taken:
NOTE
[[GetPrototypeOf]] for proxy objects enforces the following invariants:
9.5.2 [[SetPrototypeOf]] ( V )
© Ecma International 2019 151
When the [[SetPrototypeOf]] internal method of a Proxy exotic object O is called with argument V, the following steps are
taken:
NOTE
[[SetPrototypeOf]] for proxy objects enforces the following invariants:
9.5.3 [[IsExtensible]] ( )
When the [[IsExtensible]] internal method of a Proxy exotic object O is called, the following steps are taken:
NOTE
[[IsExtensible]] for proxy objects enforces the following invariants:
9.5.4 [[PreventExtensions]] ( )
When the [[PreventExtensions]] internal method of a Proxy exotic object O is called, the following steps are taken:
NOTE
[[PreventExtensions]] for proxy objects enforces the following invariants:
9.5.5 [[GetOwnProperty]] ( P )
When the [[GetOwnProperty]] internal method of a Proxy exotic object O is called with property key P, the following steps are
taken:
NOTE
[[GetOwnProperty]] for proxy objects enforces the following invariants:
NOTE
[[DefineOwnProperty]] for proxy objects enforces the following invariants:
9.5.7 [[HasProperty]] ( P )
When the [[HasProperty]] internal method of a Proxy exotic object O is called with property key P, the following steps are
taken:
NOTE
[[HasProperty]] for proxy objects enforces the following invariants:
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.
NOTE
[[Set]] for proxy objects enforces the following invariants:
9.5.10 [[Delete]] ( P )
When the [[Delete]] internal method of a Proxy exotic object O is called with property key P, the following steps are taken:
NOTE
[[Delete]] for proxy objects enforces the following invariants:
NOTE
[[OwnPropertyKeys]] for proxy objects enforces the following invariants:
NOTE
A 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.
NOTE 1
A 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:
SourceCharacter ::
any Unicode code point
ECMAScript code is expressed using Unicode. ECMAScript source text is a sequence of code points. All Unicode code point
values from U+0000 to U+10FFFF, including surrogate code points, may occur in 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
160 © Ecma International 2019
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.
1. Assert: 0 ≤ cp ≤ 0x10FFFF.
2. If cp ≤ 0xFFFF, return cp.
3. Let cu1 be floor((cp - 0x10000) / 0x400) + 0xD800.
4. Let cu2 be ((cp - 0x10000) modulo 0x400) + 0xDC00.
5. Return the code unit sequence consisting of cu1 followed by cu2.
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 9.2) of an ECMAScript function object. The function code of a particular ECMAScript function does not
© Ecma International 2019 161
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.
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
Function code is generally provided as the bodies of Function Definitions (14.1), Arrow Function Definitions (14.2), Method
Definitions (14.3), Generator Function Definitions (14.4), Async Function Definitions (14.7), Async Generator Function
Definitions (14.5), and Async Arrow Functions (14.8). Function code is also derived from the arguments to the Function
constructor (19.2.1.1), the GeneratorFunction constructor (25.2.1.1), and the AsyncFunction constructor (25.7.1.1).
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.
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
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 11.9); 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
© Ecma International 2019 163
RegularExpressionLiteral
InputElementRegExpOrTemplateTail ::
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
InputElementTemplateTail ::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
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. <ZWNBSP> 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
<ZWNBSP> code points are treated as white space characters (see 11.2).
The special treatment of certain format-control characters outside of comments, string literals, and regular expression literals
is summarized in Table 31.
The ECMAScript white space code points are listed in Table 32.
Other category “Zs” Any other Unicode “Space_Separator” code point <USP>
ECMAScript implementations must recognize as WhiteSpace code points listed in the “Space_Separator” (“Zs”) category.
NOTE
Other than for the code points listed in Table 32, ECMAScript WhiteSpace intentionally excludes all code points that have the
Unicode “White_Space” property but which are not classified in category “Space_Separator” (“Zs”).
Syntax
WhiteSpace ::
<TAB>
<VT>
<FF>
<SP>
<NBSP>
<ZWNBSP>
<USP>
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 33.
Only the Unicode code points in Table 33 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 32. The
sequence <CR><LF> is commonly used as a line terminator. It should be considered a single SourceCharacter for the purpose
of reporting line numbers.
Syntax
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence ::
<LF>
<CR>[lookahead ≠ <LF>]
<LS>
<PS>
<CR><LF>
11.4 Comments
Comments can be either single or multi-line. Multi-line comments cannot nest.
166 © Ecma International 2019
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 11.9).
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 ::
/* MultiLineCommentCharsopt */
MultiLineCommentChars ::
MultiLineNotAsteriskChar MultiLineCommentCharsopt
* PostAsteriskCommentCharsopt
PostAsteriskCommentChars ::
MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt
* PostAsteriskCommentCharsopt
MultiLineNotAsteriskChar ::
SourceCharacter but not *
MultiLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not one of / or *
SingleLineComment ::
// SingleLineCommentCharsopt
SingleLineCommentChars ::
SingleLineCommentChar SingleLineCommentCharsopt
SingleLineCommentChar ::
SourceCharacter but not LineTerminator
11.5 Tokens
Syntax
NOTE
The DivPunctuator, RegularExpressionLiteral, RightBracePunctuator, and TemplateSubstitutionTail productions derive
additional tokens that are not included in the CommonToken production.
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.
Unicode escape sequences are permitted in an IdentifierName, where they contribute a single Unicode code point to the
IdentifierName. The code point is expressed by the CodePoint of the UnicodeEscapeSequence (see 11.8.4). The \ preceding the
UnicodeEscapeSequence and the u and { } code units, if they appear, do not contribute code points to the IdentifierName. A
UnicodeEscapeSequence cannot be used to put a code point into an IdentifierName that would otherwise be illegal. 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 IdentifierNames 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.
Syntax
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
IdentifierStart ::
UnicodeIDStart
168 © Ecma International 2019
$
_
\ UnicodeEscapeSequence
IdentifierPart ::
UnicodeIDContinue
$
\ UnicodeEscapeSequence
<ZWNJ>
<ZWJ>
UnicodeIDStart ::
any Unicode code point with the Unicode property “ID_Start”
UnicodeIDContinue ::
any Unicode code point with the Unicode property “ID_Continue”
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”.
It is a Syntax Error if SV(UnicodeEscapeSequence) is none of "$", or "_", or the UTF16Encoding of a code point matched
by the UnicodeIDStart lexical grammar production.
IdentifierPart :: \ UnicodeEscapeSequence
It is a Syntax Error if SV(UnicodeEscapeSequence) is none of "$", or "_", or the UTF16Encoding of either <ZWNJ> or
<ZWJ>, or the UTF16Encoding of a Unicode code point that would be matched by the UnicodeIDContinue lexical grammar
production.
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
1. Return the String value consisting of the sequence of code units corresponding to IdentifierName. In determining the
sequence any occurrences of \ UnicodeEscapeSequence are first replaced with the code point represented by the
© Ecma International 2019 169
UnicodeEscapeSequence and then the code points of the entire IdentifierName are converted to code units by
UTF16Encoding each code point.
Syntax
ReservedWord ::
Keyword
FutureReservedWord
NullLiteral
BooleanLiteral
NOTE
The ReservedWord definitions are specified as literal sequences of specific SourceCharacter elements. A code point in a
ReservedWord cannot be expressed by a \ UnicodeEscapeSequence.
11.6.2.1 Keywords
The following tokens are ECMAScript keywords and may not be used as Identifiers in ECMAScript programs.
Syntax
Keyword :: one of
await break case catch class const continue debugger default delete do else export
extends finally for function if import in instanceof new return super switch this
throw try typeof var void while with yield
NOTE
In some contexts yield and await are given the semantics of an Identifier. See 12.1.1. In strict mode code, let and static
are treated as reserved words through static semantic restrictions (see 12.1.1, 13.3.1.1, 13.7.5.1, and 14.6.1) rather than the
lexical grammar.
The following tokens are reserved for use as keywords in future language extensions.
Syntax
FutureReservedWord ::
enum
NOTE
Use of the following tokens within strict mode code is also reserved. That usage is restricted using static semantic restrictions
(see 12.1.1) rather than the lexical grammar:
11.7 Punctuators
Syntax
Punctuator :: one of
{ ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ? : = += -= *=
%= **= <<= >>= >>>= &= |= ^= =>
DivPunctuator ::
/
/=
RightBracePunctuator ::
}
11.8 Literals
NullLiteral ::
null
BooleanLiteral ::
true
false
NumericLiteral ::
DecimalLiteral
BinaryIntegerLiteral
OctalIntegerLiteral
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalIntegerLiteral ExponentPartopt
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigitsopt
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit :: one of
0123456789
NonZeroDigit :: one of
123456789
ExponentPart ::
ExponentIndicator SignedInteger
ExponentIndicator :: one of
eE
SignedInteger ::
DecimalDigits
+ DecimalDigits
- DecimalDigits
BinaryIntegerLiteral ::
0b BinaryDigits
0B BinaryDigits
BinaryDigits ::
BinaryDigit
BinaryDigits BinaryDigit
BinaryDigit :: one of
01
OctalIntegerLiteral ::
0o OctalDigits
0O OctalDigits
OctalDigits ::
172 © Ecma International 2019
OctalDigit
OctalDigits OctalDigit
OctalDigit :: one of
01234567
HexIntegerLiteral ::
0x HexDigits
0X HexDigits
HexDigits ::
HexDigit
HexDigits HexDigit
HexDigit :: one of
0123456789abcdefABCDEF
NOTE
For example: 3in is an error and not the two input elements 3 and in.
A conforming implementation, when processing strict mode code, must not extend, as described in B.1.1, the syntax of
NumericLiteral to include LegacyOctalIntegerLiteral, nor extend the syntax of DecimalIntegerLiteral to include
NonOctalDecimalIntegerLiteral.
Once the exact MV for a numeric literal has been determined, it is then rounded to a value of the Number type. If the MV is 0,
174 © Ecma International 2019
then the rounded value is +0; otherwise, the rounded value must be the Number value for the MV (as specified in 6.1.6),
unless the literal is a DecimalLiteral and the literal has more than 20 significant digits, in which case the Number value may be
either the Number value for the MV of a literal produced by replacing each significant digit after the 20th with a 0 digit or the
Number value for the MV of a literal produced by replacing each significant digit after the 20th with a 0 digit and then
incrementing the literal at the 20th significant digit position. A digit is significant if it is not part of an ExponentPart and
it is not 0; or
there is a nonzero digit to its left and there is a nonzero digit, not in the ExponentPart, to its right.
Syntax
StringLiteral ::
" DoubleStringCharactersopt "
' SingleStringCharactersopt '
DoubleStringCharacters ::
DoubleStringCharacter DoubleStringCharactersopt
SingleStringCharacters ::
SingleStringCharacter SingleStringCharactersopt
DoubleStringCharacter ::
SourceCharacter but not one of " or \ or LineTerminator
<LS>
<PS>
\ EscapeSequence
LineContinuation
SingleStringCharacter ::
SourceCharacter but not one of ' or \ or LineTerminator
<LS>
<PS>
\ EscapeSequence
LineContinuation
LineContinuation ::
\ LineTerminatorSequence
© Ecma International 2019 175
EscapeSequence ::
CharacterEscapeSequence
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
UnicodeEscapeSequence
A conforming implementation, when processing strict mode code, must not extend the syntax of EscapeSequence to include
LegacyOctalEscapeSequence as described in B.1.2.
CharacterEscapeSequence ::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter :: one of
'"\bfnrtv
NonEscapeCharacter ::
SourceCharacter but not one of EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
HexEscapeSequence ::
x HexDigit HexDigit
UnicodeEscapeSequence ::
u Hex4Digits
u{ CodePoint }
Hex4Digits ::
HexDigit HexDigit HexDigit HexDigit
The definition of the nonterminal HexDigit is given in 11.8.3. SourceCharacter is defined in 10.1.
NOTE 2
<LF> and <CR> 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.
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 (21.2.1).
An implementation may extend the ECMAScript Regular Expression grammar defined in 21.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
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 IdentifierPart
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: /(?:)/.
Template ::
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate ::
` TemplateCharactersopt `
TemplateHead ::
` TemplateCharactersopt ${
TemplateSubstitutionTail ::
TemplateMiddle
TemplateTail
TemplateMiddle ::
} TemplateCharactersopt ${
TemplateTail ::
} TemplateCharactersopt `
TemplateCharacters ::
TemplateCharacter TemplateCharactersopt
TemplateCharacter ::
$ [lookahead ≠ {]
\ EscapeSequence
\ NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter but not one of ` or \ or $ or LineTerminator
NotEscapeSequence ::
0 DecimalDigit
DecimalDigit but not 0
x [lookahead ∉ HexDigit]
x HexDigit [lookahead ∉ HexDigit]
u [lookahead ∉ HexDigit] [lookahead ≠ {]
u HexDigit [lookahead ∉ HexDigit]
180 © Ecma International 2019
u HexDigit HexDigit [lookahead ∉ HexDigit]
u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit]
u { [lookahead ∉ HexDigit]
u { NotCodePoint [lookahead ∉ HexDigit]
u { CodePoint [lookahead ∉ HexDigit] [lookahead ≠ }]
NotCodePoint ::
HexDigits but only if MV of HexDigits > 0x10FFFF
CodePoint ::
HexDigits but only if MV of HexDigits ≤ 0x10FFFF
A conforming implementation must not use the extended definition of EscapeSequence described in B.1.2 when parsing a
TemplateCharacter.
NOTE
TemplateSubstitutionTail is used by the InputElementTemplateTail alternative lexical goal.
NOTE
TV excludes the code units of LineContinuation while TRV includes them. <CR><LF> and <CR> LineTerminatorSequences are
normalized to <LF> for both TV and TRV. An explicit EscapeSequence is needed to include a <CR> or <CR><LF> sequence.
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 (13.7.2).
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.
3. 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 13.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] ;
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.
{ 1 2 } 3
is not a valid sentence in the ECMAScript grammar, even with the automatic semicolon insertion rules. In contrast, the source
{ 1
2 } 3
is also not a valid ECMAScript sentence, but is transformed by automatic semicolon insertion into the following:
{ 1
;2 ;} 3;
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;
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
a = b;
++c;
NOTE 2
The token ++ is not treated as a postfix operator applying to the variable b, because a LineTerminator occurs between b 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).print()
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 + c(d + e).print()
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.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 0;
It is a Syntax Error if the code matched by this production is contained in strict mode code and the StringValue of
Identifier is "arguments" or "eval".
IdentifierReference : yield
BindingIdentifier : yield
LabelIdentifier : yield
It is a Syntax Error if the code matched by this production is contained in strict mode code.
IdentifierReference : await
BindingIdentifier : await
© Ecma International 2019 187
LabelIdentifier : await
BindingIdentifier : yield
BindingIdentifier : await
IdentifierReference : Identifier
BindingIdentifier : Identifier
LabelIdentifier : 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".
It is a Syntax Error if this phrase is contained in strict mode code and the StringValue of IdentifierName is:
"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 StringValue of IdentifierName is the same String value as 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.
BindingIdentifier : yield
BindingIdentifier : await
IdentifierReference : yield
1. Return simple.
IdentifierReference : await
1. Return simple.
1. Return "yield".
IdentifierReference : await
BindingIdentifier : await
LabelIdentifier : await
1. Return "await".
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 9.2.15). In those cases a
lexical binding is hoisted and preinitialized prior to evaluation of its initializer.
BindingIdentifier : Identifier
BindingIdentifier : yield
BindingIdentifier : await
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.
PrimaryExpression[Yield, Await] :
this
IdentifierReference[?Yield, ?Await]
Literal
ArrayLiteral[?Yield, ?Await]
ObjectLiteral[?Yield, ?Await]
FunctionExpression
ClassExpression[?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
ParenthesizedExpression[Yield, Await] :
( Expression[+In, ?Yield, ?Await] )
12.2.1 Semantics
1. Return false.
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
1. Return true.
PrimaryExpression :
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CoverParenthesizedExpressionAndArrowParameterList
1. Return false.
1. Return invalid.
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
1. Return ? ResolveThisBinding().
12.2.4 Literals
Syntax
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
1. Return null.
Literal : BooleanLiteral
Literal : NumericLiteral
Literal : StringLiteral
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] :
[ Elisionopt ]
[ ElementList[?Yield, ?Await] ]
[ ElementList[?Yield, ?Await] , Elisionopt ]
ElementList[Yield, Await] :
Elisionopt AssignmentExpression[+In, ?Yield, ?Await]
Elisionopt SpreadElement[?Yield, ?Await]
ElementList[?Yield, ?Await] , Elisionopt AssignmentExpression[+In, ?Yield, ?Await]
ElementList[?Yield, ?Await] , Elisionopt SpreadElement[?Yield, ?Await]
Elision :
,
Elision ,
SpreadElement[Yield, Await] :
... AssignmentExpression[+In, ?Yield, ?Await]
Elision : Elision ,
1. Let padding be the ElisionWidth of Elision; if Elision is not present, use the numeric value zero.
2. Let initResult be the result of evaluating AssignmentExpression.
3. Let initValue be ? GetValue(initResult).
4. Let created be CreateDataProperty(array, ToString(ToUint32(nextIndex + padding)), initValue).
5. Assert: created is true.
6. Return nextIndex + padding + 1.
1. Let padding be the ElisionWidth of Elision; if Elision is not present, use the numeric value zero.
2. Return the result of performing ArrayAccumulation for SpreadElement with arguments array and nextIndex + padding.
1. Let postIndex be the result of performing ArrayAccumulation for ElementList with arguments array and nextIndex.
2. ReturnIfAbrupt(postIndex).
3. Let padding be the ElisionWidth of Elision; if Elision is not present, use the numeric value zero.
4. Let initResult be the result of evaluating AssignmentExpression.
5. Let initValue be ? GetValue(initResult).
6. Let created be CreateDataProperty(array, ToString(ToUint32(postIndex + padding)), initValue).
7. Assert: created is true.
8. Return postIndex + padding + 1.
1. Let postIndex be the result of performing ArrayAccumulation for ElementList with arguments array and nextIndex.
2. ReturnIfAbrupt(postIndex).
3. Let padding be the ElisionWidth of Elision; if Elision is not present, use the numeric value zero.
4. Return the result of performing ArrayAccumulation for SpreadElement with arguments array and postIndex + padding.
NOTE
© Ecma International 2019 195
CreateDataProperty 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]].
ArrayLiteral : [ ElementList ]
Syntax
ObjectLiteral[Yield, Await] :
{}
{ PropertyDefinitionList[?Yield, ?Await] }
{ PropertyDefinitionList[?Yield, ?Await] , }
PropertyDefinitionList[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]
NOTE 2
MethodDefinition is defined in 14.3.
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.
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.
© Ecma International 2019 197
PropertyDefinition : CoverInitializedName
NOTE
This production exists so that ObjectLiteral can serve as a cover grammar for ObjectAssignmentPattern. It cannot occur in an
actual object initializer.
PropertyName : LiteralPropertyName
1. Return false.
PropertyName : ComputedPropertyName
PropertyDefinition : MethodDefinition
NOTE
Static semantic rules that depend upon substructure generally do not look into function definitions.
LiteralPropertyName : IdentifierName
1. Return false.
PropertyName : ComputedPropertyName
1. Return true.
1. Return empty.
LiteralPropertyName : IdentifierName
LiteralPropertyName : StringLiteral
1. Return the String value whose code units are the SV of the StringLiteral.
LiteralPropertyName : NumericLiteral
ComputedPropertyName : [ AssignmentExpression ]
1. Return empty.
1. Return ObjectCreate(%ObjectPrototype%).
ObjectLiteral :
{ PropertyDefinitionList }
{ PropertyDefinitionList , }
LiteralPropertyName : IdentifierName
LiteralPropertyName : StringLiteral
1. Return the String value whose code units are the SV of the StringLiteral.
LiteralPropertyName : NumericLiteral
ComputedPropertyName : [ AssignmentExpression ]
PropertyDefinition : IdentifierReference
NOTE
An alternative semantics for this production is given in B.3.1.
See 11.8.5.
It is a Syntax Error if BodyText of RegularExpressionLiteral cannot be recognized using the goal symbol Pattern of the
ECMAScript RegExp grammar specified in 21.2.1.
It is a Syntax Error if FlagText of RegularExpressionLiteral contains any code points other than "g", "i", "m", "s", "u", or
"y", or if it contains the same code point more than once.
1. Let pattern be the String value consisting of the UTF16Encoding of each code point of BodyText of
RegularExpressionLiteral.
2. Let flags be the String value consisting of the UTF16Encoding of each code point of FlagText of RegularExpressionLiteral.
It is a Syntax Error if the number of elements in the result of TemplateStrings of TemplateLiteral with argument false is
greater than 232 - 1.
It is a Syntax Error if the [Tagged] parameter was not set and NoSubstitutionTemplate Contains NotEscapeSequence.
It is a Syntax Error if the [Tagged] parameter was not set and TemplateHead Contains NotEscapeSequence.
TemplateSpans : TemplateTail
It is a Syntax Error if the [Tagged] parameter was not set and TemplateTail Contains NotEscapeSequence.
It is a Syntax Error if the [Tagged] parameter was not set and TemplateMiddle Contains NotEscapeSequence.
TemplateSpans : TemplateTail
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 (12.2.9.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.
NOTE 1
The string conversion semantics applied to the Expression value are like String.prototype.concat rather than the +
operator.
TemplateSpans : TemplateTail
NOTE 2
The string conversion semantics applied to the Expression value are like String.prototype.concat rather than the +
operator.
TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
ParenthesizedExpression : ( Expression )
ParenthesizedExpression : ( Expression )
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]
SuperProperty[Yield, Await] :
super [ Expression[+In, ?Yield, ?Await] ]
super . IdentifierName
MetaProperty :
NewTarget
NewTarget :
new . target
NewExpression[Yield, Await] :
MemberExpression[?Yield, ?Await]
new NewExpression[?Yield, ?Await]
CallExpression[Yield, Await] :
CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await]
SuperCall[?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]
SuperCall[Yield, Await] :
super Arguments[?Yield, ?Await]
Arguments[Yield, Await] :
208 © Ecma International 2019
()
( 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]
LeftHandSideExpression[Yield, Await] :
NewExpression[?Yield, ?Await]
CallExpression[?Yield, ?Await]
Supplemental Syntax
CallMemberExpression[Yield, Await] :
MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
NewExpression :
new NewExpression
LeftHandSideExpression :
CallExpression
1. Return false.
MemberExpression :
MemberExpression [ Expression ]
MemberExpression . IdentifierName
MemberExpression TemplateLiteral
SuperProperty
MetaProperty
new MemberExpression Arguments
NewExpression :
new NewExpression
LeftHandSideExpression :
CallExpression
NewExpression :
new NewExpression
LeftHandSideExpression :
CallExpression
1. Return false.
MemberExpression :
MemberExpression [ Expression ]
MemberExpression . IdentifierName
SuperProperty
1. Return simple.
CallExpression :
CoverCallExpressionAndAsyncArrowHead
SuperCall
CallExpression Arguments
CallExpression TemplateLiteral
NewExpression :
new NewExpression
MemberExpression :
MemberExpression TemplateLiteral
new MemberExpression Arguments
NewTarget :
1. Return invalid.
MemberExpression . IdentifierName
CallExpression . IdentifierName
MemberExpression [ Expression ]
CallExpression [ Expression ]
MemberExpression . IdentifierName
MemberExpression [ <identifier-name-string> ]
and similarly
CallExpression . IdentifierName
CallExpression [ <identifier-name-string> ]
Is evaluated in exactly the same manner as MemberExpression : MemberExpression [ Expression ] except that the contained
CallExpression is evaluated in step 1.
Is evaluated in exactly the same manner as MemberExpression : MemberExpression . IdentifierName except that the contained
CallExpression is evaluated in step 1.
The abstract operation EvaluateNew with arguments constructExpr, and arguments performs the following steps:
The abstract operation EvaluateCall takes as arguments a value func, a value ref, a Parse Node arguments, and a Boolean
argument tailPosition. It performs the following steps:
ArgumentList : AssignmentExpression
1. Return GetNewTarget().
UpdateExpression[Yield, Await] :
LeftHandSideExpression[?Yield, ?Await]
LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++
LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] --
++ UnaryExpression[?Yield, ?Await]
-- UnaryExpression[?Yield, ?Await]
UpdateExpression :
++ UnaryExpression
-- UnaryExpression
1. Return false.
1. Return invalid.
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]
1. Return false.
1. Return invalid.
It is a Syntax Error if the UnaryExpression is contained in strict mode code and the derived UnaryExpression is
PrimaryExpression : IdentifierReference .
NOTE
The last rule means that expressions such as delete (((foo))) produce early errors because of recursive application of the
first rule.
NOTE
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 }, a TypeError exception is thrown.
NOTE
GetValue must be called even though its value is not used because it may have observable side-effects.
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Symbol "symbol"
Object (non-standard exotic and does not Implementation-defined. Must not be "undefined", "boolean", "function",
implement [[Call]]) "number", "symbol", or "string".
NOTE
Implementations are discouraged from defining new typeof result values for non-standard exotic objects. If possible
"object" should be used for such objects.
ExponentiationExpression[Yield, Await] :
UnaryExpression[?Yield, ?Await]
UpdateExpression[?Yield, ?Await] ** ExponentiationExpression[?Yield, ?Await]
1. Return false.
1. Return invalid.
NOTE
The result of base ** exponent when base is 1 or -1 and exponent is +Infinity or -Infinity differs from IEEE 754-2008. The first
edition of ECMAScript specified a result of NaN for this operation, whereas later versions of IEEE 754-2008 specified 1. The
historical ECMAScript behaviour is preserved for compatibility reasons.
MultiplicativeExpression[Yield, Await] :
ExponentiationExpression[?Yield, ?Await]
MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await]
MultiplicativeOperator : one of
*/%
1. Return false.
1. Return invalid.
The * MultiplicativeOperator performs multiplication, producing the product of its operands. Multiplication is commutative.
Multiplication is not always associative in ECMAScript, because of finite precision.
The result of a floating-point multiplication is governed by the rules of IEEE 754-2008 binary double-precision arithmetic:
The / MultiplicativeOperator performs division, producing the quotient of its operands. The left operand is the dividend and
the right operand is the divisor. ECMAScript does not perform integer division. The operands and result of all division
operations are double-precision floating-point numbers. The result of division is determined by the specification of IEEE 754-
The % MultiplicativeOperator yields the remainder of its operands from an implied division; the left operand is the dividend and
the right operand is the divisor.
NOTE
In C and C++, the remainder operator accepts only integral operands; in ECMAScript, it also accepts floating-point operands.
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-2008. The IEEE 754-2008 “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.
The result of an ECMAScript floating-point remainder operation is determined by the rules of IEEE arithmetic:
AdditiveExpression[Yield, Await] :
MultiplicativeExpression[?Yield, ?Await]
AdditiveExpression[?Yield, ?Await] + MultiplicativeExpression[?Yield, ?Await]
AdditiveExpression[?Yield, ?Await] - MultiplicativeExpression[?Yield, ?Await]
1. Return false.
1. Return invalid.
NOTE 1
No hint is provided in the calls to ToPrimitive in steps 5 and 6. All standard objects except Date objects handle the absence of
a hint as if the hint Number were given; Date objects handle the absence of a hint as if the hint String were given. Exotic
objects may handle the absence of a hint in some other manner.
NOTE 2
Step 7 differs from step 3 of the Abstract Relational Comparison algorithm, by using the logical-or operation instead of the
logical-and operation.
The result of an addition is determined using the rules of IEEE 754-2008 binary double-precision arithmetic:
NOTE
© Ecma International 2019 229
The - operator performs subtraction when applied to two operands of numeric type, producing the difference of its operands;
the left operand is the minuend and the right operand is the subtrahend. Given numeric operands a and b, it is always the case
that a - b produces the same result as a + (-b).
ShiftExpression[Yield, Await] :
AdditiveExpression[?Yield, ?Await]
ShiftExpression[?Yield, ?Await] << AdditiveExpression[?Yield, ?Await]
ShiftExpression[?Yield, ?Await] >> AdditiveExpression[?Yield, ?Await]
ShiftExpression[?Yield, ?Await] >>> AdditiveExpression[?Yield, ?Await]
1. Return false.
1. Return invalid.
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.
1. Return false.
1. Return invalid.
NOTE
Steps 4 and 5 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.
Syntax
1. Return false.
1. Return invalid.
NOTE 1
Given the above definition of equality:
NOTE 2
The equality operators maintain the following invariants:
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.
1. Return false.
1. Return invalid.
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.
1. Return false.
1. Return invalid.
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.
238 © Ecma International 2019
12.14.1 Static Semantics: IsFunctionDefinition
ConditionalExpression : LogicalORExpression ? AssignmentExpression : AssignmentExpression
1. Return false.
1. Return invalid.
AssignmentOperator : one of
*= /= %= += -= <<= >>= >>>= &= ^= |= **=
1. Return true.
AssignmentExpression :
YieldExpression
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
1. Return false.
1. Return invalid.
NOTE
When an assignment occurs within strict mode code, it is a runtime error if lref in step 1.f of the first algorithm or step 7 of the
second algorithm it is an unresolvable reference. If it is, a ReferenceError exception is thrown. 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 for which the IsExtensible predicate returns
the value false. In these cases a TypeError exception is thrown.
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 }
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] :
Elisionopt 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]
DestructuringAssignmentTarget : LeftHandSideExpression
ObjectAssignmentPattern : { }
1. Perform ? RequireObjectCoercible(value).
2. Return NormalCompletion(empty).
ObjectAssignmentPattern :
{ AssignmentPropertyList }
{ AssignmentPropertyList , }
1. Perform ? RequireObjectCoercible(value).
2. Perform ? PropertyDestructuringAssignmentEvaluation for AssignmentPropertyList using value as the argument.
3. Return NormalCompletion(empty).
ArrayAssignmentPattern : [ ]
ArrayAssignmentPattern : [ Elision ]
ArrayAssignmentPattern : [ AssignmentElementList ]
© Ecma International 2019 243
1. Let iteratorRecord be ? GetIterator(value).
2. Let result be the result of performing IteratorDestructuringAssignmentEvaluation of AssignmentElementList using
iteratorRecord as the argument.
3. If iteratorRecord.[[Done]] is false, return ? IteratorClose(iteratorRecord, result).
4. Return result.
ObjectAssignmentPattern : { AssignmentRestProperty }
1. Perform ? RequireObjectCoercible(value).
2. Let excludedNames be a new empty List.
3. Return the result of performing RestDestructuringAssignmentEvaluation of AssignmentRestProperty with value and
excludedNames as the arguments.
1. Perform ? RequireObjectCoercible(value).
2. Let excludedNames be the result of performing ? PropertyDestructuringAssignmentEvaluation for AssignmentPropertyList
using value as the argument.
3. Return the result of performing RestDestructuringAssignmentEvaluation of AssignmentRestProperty with value and
excludedNames as the arguments.
NOTE
The following operations collect a list of all destructured property names.
244 © Ecma International 2019
AssignmentPropertyList : AssignmentPropertyList , AssignmentProperty
AssignmentElementList : AssignmentElisionElement
AssignmentElisionElement : AssignmentElement
Elision : ,
Elision : Elision ,
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. Return false.
1. Return invalid.
248 © Ecma International 2019
12.16.3 Runtime Semantics: Evaluation
Expression : Expression , AssignmentExpression
NOTE
GetValue must be called even though its value is not used because it may have observable side-effects.
Declaration[Yield, Await] :
HoistableDeclaration[?Yield, ?Await, ~Default]
ClassDeclaration[?Yield, ?Await, ~Default]
LexicalDeclaration[+In, ?Yield, ?Await]
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
1. Return false.
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
ReturnStatement
ThrowStatement
DebuggerStatement
1. Return false.
Statement :
1. Return false.
BreakableStatement : IterationStatement
1. Let newIterationSet be a copy of iterationSet with all the elements of labelSet appended.
2. Return ContainsUndefinedContinueTarget of IterationStatement with arguments newIterationSet and « ».
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.
BreakableStatement : IterationStatement
1. Let stmtResult be the result of performing LabelledEvaluation 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 Completion(stmtResult).
BreakableStatement : SwitchStatement
NOTE
A BreakableStatement is one that can be exited via an unlabelled BreakStatement.
1. Return NormalCompletion(empty).
HoistableDeclaration : FunctionDeclaration
BreakableStatement :
IterationStatement
SwitchStatement
13.2 Block
Syntax
1. Return false.
StatementListItem : Declaration
1. Return false.
Block : { }
1. Return false.
StatementListItem : Declaration
1. Return false.
Block : { }
1. Return false.
StatementListItem : Declaration
1. Return false.
StatementListItem : Statement
StatementListItem : Declaration
StatementListItem : Statement
StatementListItem : Declaration
StatementListItem : Statement
StatementListItem : Declaration
NOTE
At the top level of a function, or script, function declarations are treated like var declarations rather than like lexical
declarations.
StatementListItem : Statement
StatementListItem : Declaration
StatementListItem : Declaration
StatementListItem : Statement
NOTE
At the top level of a function or script, inner function declarations are treated like var declarations.
StatementListItem : Statement
StatementListItem : Declaration
StatementListItem : Declaration
StatementListItem : Declaration
1. Return NormalCompletion(empty).
Block : { StatementList }
NOTE 1
No matter how control leaves the Block the LexicalEnvironment is always restored to its former state.
StatementList : StatementList StatementListItem
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;")
Syntax
LetOrConst :
let
const
It is a Syntax Error if Initializer is not present and IsConstantDeclaration of the LexicalDeclaration containing this
LexicalBinding is true.
LetOrConst : let
1. Return false.
LetOrConst : const
1. Return true.
LexicalBinding : BindingIdentifier
NOTE
A static semantics rule ensures that this form of LexicalBinding never occurs in a const declaration.
LexicalBinding : BindingIdentifier Initializer
Syntax
VariableStatement[Yield, Await] :
var VariableDeclarationList[+In, ?Yield, ?Await] ;
VariableDeclaration : BindingIdentifier
1. Return NormalCompletion(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 6 will assign value to the
property instead of assigning to the VariableEnvironment binding of the Identifier.
VariableDeclaration : BindingPattern Initializer
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] :
[ Elisionopt BindingRestElement[?Yield, ?Await] opt ]
[ BindingElementList[?Yield, ?Await] ]
© Ecma International 2019 263
[ BindingElementList[?Yield, ?Await] , Elisionopt 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] :
Elisionopt 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]
ArrayBindingPattern : [ Elision ]
1. Return false.
ArrayBindingPattern : [ Elision ]
1. Return false.
1. Return true.
SingleNameBinding : BindingIdentifier
1. Return false.
1. Return true.
1. Return false.
1. Return false.
1. Return true.
SingleNameBinding : BindingIdentifier
1. Return false.
1. Return true.
1. Return false.
1. Return false.
SingleNameBinding : BindingIdentifier
1. Return true.
1. Return false.
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.
BindingPattern : ObjectBindingPattern
1. Perform ? RequireObjectCoercible(value).
2. Return the result of performing BindingInitialization for ObjectBindingPattern using value and environment as arguments.
BindingPattern : ArrayBindingPattern
ObjectBindingPattern : { }
1. Return NormalCompletion(empty).
ObjectBindingPattern :
{ BindingPropertyList }
{ BindingPropertyList , }
1. Perform ? PropertyBindingInitialization for BindingPropertyList using value and environment as the arguments.
2. Return NormalCompletion(empty).
ObjectBindingPattern : { BindingRestProperty }
1. Let excludedNames be the result of performing ? PropertyBindingInitialization of BindingPropertyList using value and
environment as arguments.
2. Return the result of performing RestBindingInitialization of BindingRestProperty with value, environment, and
excludedNames as the arguments.
NOTE
These collect a list of all bound property names rather than just empty completion.
BindingPropertyList : BindingPropertyList , BindingProperty
1. Let boundNames be the result of performing ? PropertyBindingInitialization for BindingPropertyList using value and
environment as arguments.
2. Let nextNames be the result of performing ? PropertyBindingInitialization for BindingProperty using value and
environment as arguments.
3. Append each item in nextNames to the end of boundNames.
4. Return boundNames.
BindingProperty : SingleNameBinding
1. Let name be the string that is the only element of BoundNames of SingleNameBinding.
2. Perform ? KeyedBindingInitialization for SingleNameBinding using value, environment, and name as the arguments.
3. Return a new List containing name.
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.
ArrayBindingPattern : [ ]
1. Return NormalCompletion(empty).
ArrayBindingPattern : [ Elision ]
ArrayBindingPattern : [ BindingElementList ]
1. Return the result of performing IteratorBindingInitialization for BindingElementList with iteratorRecord and environment
as arguments.
ArrayBindingPattern : [ BindingElementList , ]
1. Return the result of performing IteratorBindingInitialization for BindingElementList with iteratorRecord and environment
© Ecma International 2019 269
as arguments.
BindingElementList : BindingElisionElement
1. Return the result of performing IteratorBindingInitialization for BindingElisionElement with iteratorRecord and
environment as arguments.
BindingElisionElement : BindingElement
1. Return the result of performing IteratorBindingInitialization of BindingElement with iteratorRecord and environment as
the arguments.
BindingElement : SingleNameBinding
1. Return the result of performing IteratorBindingInitialization for SingleNameBinding with iteratorRecord and environment
as the arguments.
1. Let A be ! ArrayCreate(0).
2. Let n be 0.
3. Repeat,
a. If iteratorRecord.[[Done]] is false, then
i. Let next be 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 the result of performing BindingInitialization of BindingPattern with A and environment as the
arguments.
c. Let nextValue be IteratorValue(next).
d. If nextValue is an abrupt completion, set iteratorRecord.[[Done]] to true.
e. ReturnIfAbrupt(nextValue).
f. Let status be CreateDataProperty(A, ! ToString(n), nextValue).
g. Assert: status is true.
h. Increment n by 1.
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.
BindingElement : BindingPattern Initializer
EmptyStatement :
;
1. Return NormalCompletion(empty).
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.
Each else for which the choice of associated if is ambiguous shall be associated with the nearest possible if that would
otherwise have no corresponding else.
NOTE
It is only necessary to apply this rule if the extension specified in B.3.2 is implemented.
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 « ».
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.6.
13.7.1 Semantics
NOTE
It is only necessary to apply this rule if the extension specified in B.3.2 is implemented.
© Ecma International 2019 277
13.7.1.2 Runtime Semantics: LoopContinues ( completion, labelSet )
The abstract operation LoopContinues with arguments completion and labelSet is defined by the following steps:
NOTE
Within the Statement part of an IterationStatement a ContinueStatement may be used to begin a new iteration.
1. Let V be undefined.
2. Repeat,
a. Let stmtResult be the result of evaluating Statement.
b. If LoopContinues(stmtResult, labelSet) is false, return Completion(UpdateEmpty(stmtResult, V)).
c. If stmtResult.[[Value]] is not empty, set V to stmtResult.[[Value]].
d. Let exprRef be the result of evaluating Expression.
e. Let exprValue be ? GetValue(exprRef).
f. If ToBoolean(exprValue) is false, return NormalCompletion(V).
1. Let V be undefined.
2. Repeat,
a. Let exprRef be the result of evaluating Expression.
b. Let exprValue be ? GetValue(exprRef).
c. If ToBoolean(exprValue) is false, return NormalCompletion(V).
d. Let stmtResult be the result of evaluating Statement.
e. If LoopContinues(stmtResult, labelSet) is false, return Completion(UpdateEmpty(stmtResult, V)).
f. If stmtResult.[[Value]] is not empty, set V to stmtResult.[[Value]].
It is a Syntax Error if any element of the BoundNames of LexicalDeclaration also occurs in the VarDeclaredNames of
Statement.
IterationStatement :
for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
IterationStatement :
for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
280 © Ecma International 2019
1. Return ContainsUndefinedBreakTarget of Statement with argument labelSet.
IterationStatement :
for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
1. Let V be undefined.
2. Perform ? CreatePerIterationEnvironment(perIterationBindings).
3. Repeat,
a. If test is not [empty], then
i. Let testRef be the result of evaluating test.
ii. Let testValue be ? GetValue(testRef).
iii. If ToBoolean(testValue) is false, return NormalCompletion(V).
b. Let result be the result of evaluating stmt.
NOTE
© Ecma International 2019 283
The last rule means that the other rules are applied even if parentheses surround Expression.
IterationStatement :
for ( ForDeclaration in Expression ) Statement
for ( ForDeclaration of AssignmentExpression ) Statement
for await ( ForDeclaration of AssignmentExpression ) Statement
IterationStatement :
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
NOTE
This section is extended by Annex B.3.6.
IterationStatement :
for ( LeftHandSideExpression in Expression ) Statement
for ( var ForBinding in Expression ) Statement
for ( ForDeclaration in Expression ) Statement
for ( LeftHandSideExpression of AssignmentExpression ) Statement
NOTE
This section is extended by Annex B.3.6.
IterationStatement :
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
NOTE
This section is extended by Annex B.3.6.
ForBinding : BindingIdentifier
1. Return false.
ForBinding : BindingPattern
1. Return true.
NOTE
This section is extended by Annex B.3.6.
IterationStatement :
for ( LeftHandSideExpression of AssignmentExpression ) Statement
for await ( LeftHandSideExpression of AssignmentExpression ) Statement
IterationStatement :
for ( var ForBinding of AssignmentExpression ) Statement
for await ( var ForBinding of AssignmentExpression ) Statement
IterationStatement :
for ( ForDeclaration of AssignmentExpression ) Statement
for await ( ForDeclaration of AssignmentExpression ) Statement
NOTE
This section is extended by Annex B.3.6.
IterationStatement :
for ( LeftHandSideExpression of AssignmentExpression ) Statement
for await ( var ForBinding of AssignmentExpression ) Statement
IterationStatement :
for ( var ForBinding of AssignmentExpression ) Statement
for await ( var ForBinding of AssignmentExpression ) Statement
IterationStatement :
for ( ForDeclaration of AssignmentExpression ) Statement
for await ( ForDeclaration of AssignmentExpression ) Statement
NOTE
This section is extended by Annex B.3.6.
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 9.2.15). In those cases a
lexical binding is hoisted and preinitialized prior to evaluation of its initializer.
ForDeclaration : LetOrConst ForBinding
1. Return the result of performing BindingInitialization for ForBinding passing value and environment as the arguments.
NOTE
This section is extended by Annex B.3.6.
13.7.5.15 EnumerateObjectProperties ( O )
When the abstract operation EnumerateObjectProperties is called with argument O, the following steps are taken:
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
© Ecma International 2019 291
method. Property attributes of the target object must be obtained by calling its [[GetOwnProperty]] internal method.
NOTE
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;
}
}
ContinueStatement[Yield, Await] :
continue ;
continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;
It is a Syntax Error if this ContinueStatement is not nested, directly or indirectly (but not crossing function boundaries),
within an IterationStatement.
ContinueStatement : continue ;
1. Return false.
292 © Ecma International 2019
ContinueStatement : continue LabelIdentifier ;
BreakStatement[Yield, Await] :
break ;
break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;
It is a Syntax Error if this BreakStatement is not nested, directly or indirectly (but not crossing function boundaries),
within an IterationStatement or a SwitchStatement.
BreakStatement : break ;
1. Return false.
ReturnStatement[Yield, Await] :
return ;
return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ;
NOTE
A 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.
NOTE
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.
294 © Ecma International 2019
13.11.1 Static Semantics: Early Errors
WithStatement : with ( Expression ) Statement
It is a Syntax Error if the code that matches 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.2 is implemented.
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.
CaseBlock : { }
1. Return false.
CaseBlock : { }
1. Return false.
CaseBlock : { }
1. Return false.
1. If the StatementList is present, return ContainsUndefinedContinueTarget of StatementList with arguments iterationSet and
« ».
2. Return false.
1. If the StatementList is present, return ContainsUndefinedContinueTarget of StatementList with arguments iterationSet and
« ».
2. Return false.
1. If the first CaseClauses is present, let names be the LexicallyDeclaredNames of the first CaseClauses.
2. Else, let names be a new empty List.
3. Append to names the elements of the LexicallyDeclaredNames of the DefaultClause.
4. If the second CaseClauses is not present, return names.
5. Return the result of appending to names the elements of the LexicallyDeclaredNames of the second CaseClauses.
1. If the first CaseClauses is present, let declarations be the LexicallyScopedDeclarations of the first CaseClauses.
2. Else, let declarations be a new empty List.
3. Append to declarations the elements of the LexicallyScopedDeclarations of the DefaultClause.
4. If the second CaseClauses is not present, return declarations.
5. Return the result of appending to declarations the elements of the LexicallyScopedDeclarations of the second CaseClauses.
CaseBlock : { }
1. If the first CaseClauses is present, let names be the VarDeclaredNames of the first CaseClauses.
2. Else, let names be a new empty List.
3. Append to names the elements of the VarDeclaredNames of the DefaultClause.
4. If the second CaseClauses is not present, return names.
5. Return the result of appending to names the elements of the VarDeclaredNames of the second CaseClauses.
CaseBlock : { }
1. If the first CaseClauses is present, let declarations be the VarScopedDeclarations of the first CaseClauses.
2. Else, let declarations be a new empty List.
3. Append to declarations the elements of the VarScopedDeclarations of the DefaultClause.
4. If the second CaseClauses is not present, return declarations.
5. Return the result of appending to declarations the elements of the VarScopedDeclarations of the second CaseClauses.
1. Return NormalCompletion(undefined).
CaseBlock : { CaseClauses }
1. Let V be undefined.
2. Let A be the List of CaseClause items in CaseClauses, in source text order.
3. Let found be false.
4. For each CaseClause C in A, do
a. If found is false, then
i. Set found to ? CaseClauseIsSelected(C, input).
b. If found is true, then
i. Let R be the result of evaluating C.
ii. If R.[[Value]] is not empty, set V to R.[[Value]].
iii. If R is an abrupt completion, return Completion(UpdateEmpty(R, V)).
5. Return NormalCompletion(V).
1. Let V be undefined.
2. If the first CaseClauses is present, then
a. Let A be the List of CaseClause items in the first CaseClauses, in source text order.
3. Else,
a. Let A be « ».
4. Let found be false.
5. For each CaseClause C in A, do
a. If found is false, then
i. Set found to ? CaseClauseIsSelected(C, input).
b. If found is true, then
i. Let R be the result of evaluating C.
ii. If R.[[Value]] is not empty, set V to R.[[Value]].
iii. If R is an abrupt completion, return Completion(UpdateEmpty(R, V)).
6. Let foundInB be false.
7. If the second CaseClauses is present, then
a. Let B be the List of CaseClause items in the second CaseClauses, in source text order.
8. Else,
a. Let B be « ».
9. If found is false, then
a. For each CaseClause C in B, do
i. If foundInB is false, then
1. Set foundInB to ? CaseClauseIsSelected(C, input).
ii. If foundInB is true, then
1. Let R be the result of evaluating CaseClause C.
2. If R.[[Value]] is not empty, set V to R.[[Value]].
3. If R is an abrupt completion, return Completion(UpdateEmpty(R, V)).
302 © Ecma International 2019
10. If foundInB is true, return NormalCompletion(V).
11. Let R be the result of evaluating DefaultClause.
12. If R.[[Value]] is not empty, set V to R.[[Value]].
13. If R is an abrupt completion, return Completion(UpdateEmpty(R, V)).
14. For each CaseClause C in B (NOTE: this is another complete iteration of the second CaseClauses), do
a. Let R be the result of evaluating CaseClause C.
b. If R.[[Value]] is not empty, set V to R.[[Value]].
c. If R is an abrupt completion, return Completion(UpdateEmpty(R, V)).
15. Return NormalCompletion(V).
NOTE
This operation does not execute C's StatementList (if any). The CaseBlock algorithm uses its return value to determine which
StatementList to start executing.
NOTE
No matter how control leaves the SwitchStatement the LexicalEnvironment is always restored to its former state.
CaseClause : case Expression :
1. Return NormalCompletion(empty).
1. Return NormalCompletion(empty).
NOTE
A 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.
NOTE
An alternative definition for this rule is provided in B.3.2.
LabelledItem : FunctionDeclaration
LabelledItem : FunctionDeclaration
1. Return false.
LabelledItem : FunctionDeclaration
1. Return false.
LabelledItem : Statement
LabelledItem : FunctionDeclaration
LabelledItem : Statement
LabelledItem : FunctionDeclaration
LabelledItem : Statement
LabelledItem : FunctionDeclaration
LabelledItem : FunctionDeclaration
LabelledItem : FunctionDeclaration
LabelledItem : FunctionDeclaration
LabelledItem : Statement
LabelledItem : FunctionDeclaration
© Ecma International 2019 307
1. Return the result of evaluating FunctionDeclaration.
ThrowStatement[Yield, Await] :
throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ;
CatchParameter[Yield, Await] :
BindingIdentifier[?Yield, ?Await]
BindingPattern[?Yield, ?Await]
NOTE
An alternative static semantics for this production is given in B.3.5.
NOTE
No matter how control leaves the Block the LexicalEnvironment is always restored to its former state.
DebuggerStatement :
debugger ;
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]
FunctionBody[Yield, Await] :
FunctionStatementList[?Yield, ?Await]
FunctionStatementList[Yield, Await] :
StatementList[?Yield, ?Await, +Return] opt
A Use Strict Directive is an ExpressionStatement in a Directive Prologue whose StringLiteral is either the exact code unit
sequences "use strict" or 'use strict'. A Use Strict Directive may not contain an EscapeSequence or LineContinuation.
A Directive Prologue may contain more than one Use Strict Directive. However, an implementation may issue a warning if this
occurs.
NOTE
The ExpressionStatements of a Directive Prologue are evaluated normally during evaluation of the containing production.
314 © Ecma International 2019
Implementations may define implementation specific meanings for ExpressionStatements 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.
If the source code matching this production is strict mode code, the Early Error rules for UniqueFormalParameters :
FormalParameters are applied.
If the source code matching this production is strict mode code, it is a Syntax Error if BindingIdentifier is present and the
StringValue of BindingIdentifier is "eval" or "arguments".
It is a Syntax Error if ContainsUseStrict 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 1
The LexicallyDeclaredNames of a FunctionBody does not include identifiers bound using var or function declarations.
UniqueFormalParameters : FormalParameters
FormalParameters : FormalParameterList
NOTE 2
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.
FunctionBody : FunctionStatementList
1. Return « "*default*" ».
NOTE
"*default*" is used within this specification as a synthetic name for hoistable anonymous functions that are defined using
export declarations.
FormalParameters : [empty]
1. Return false.
NOTE
Static semantic rules that depend upon substructure generally do not look into function definitions.
1. Return false.
1. If the Directive Prologue of FunctionStatementList contains a Use Strict Directive, return true; otherwise, return false.
1. Return 0.
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 : FormalParameterList , FormalParameter
1. Return false.
1. Return true.
1. Return false.
1. Return true.
1. Return true.
1. Return false.
FormalParameter : BindingElement
FunctionStatementList : StatementList
FunctionStatementList : StatementList
FunctionStatementList : StatementList
FunctionStatementList : StatementList
FunctionBody : FunctionStatementList
NOTE 1
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.
FormalParameters : [empty]
1. Return NormalCompletion(empty).
1. Perform ? IteratorBindingInitialization for FormalParameterList using iteratorRecord and environment as the arguments.
2. Return the result of performing IteratorBindingInitialization for FunctionRestParameter using iteratorRecord and
environment as the arguments.
1. Perform ? IteratorBindingInitialization for FormalParameterList using iteratorRecord and environment as the arguments.
2. Return the result of performing IteratorBindingInitialization for FormalParameter using iteratorRecord and environment as
the arguments.
FormalParameter : BindingElement
NOTE 2
The new Environment Record created in step 6 is only used if the BindingElement contains a direct eval.
FunctionRestParameter : BindingRestElement
1. If the function code for FunctionDeclaration is strict mode code, let strict be true. Otherwise let strict be false.
2. Let name be StringValue of BindingIdentifier.
3. Let F be FunctionCreate(Normal, FormalParameters, FunctionBody, scope, strict).
4. Perform MakeConstructor(F).
5. Perform SetFunctionName(F, name).
6. Set F.[[SourceText]] to the source text matched by FunctionDeclaration.
7. Return F.
NOTE
An anonymous FunctionDeclaration can only occur as part of an export default declaration, and its function code is
therefore always strict mode code.
1. Return NormalCompletion(empty).
NOTE 1
An alternative semantics is provided in B.3.3.
1. Return NormalCompletion(empty).
1. If the function code for FunctionExpression is strict mode code, let strict be true. Otherwise let strict be false.
2. Let scope be the LexicalEnvironment of the running execution context.
3. Let closure be FunctionCreate(Normal, FormalParameters, FunctionBody, scope, strict).
4. Perform MakeConstructor(closure).
5. Set closure.[[SourceText]] to the source text matched by FunctionExpression.
6. Return closure.
1. If the function code for FunctionExpression is strict mode code, let strict be true. Otherwise let strict be false.
2. Let scope be the running execution context's LexicalEnvironment.
3. Let funcEnv be NewDeclarativeEnvironment(scope).
4. Let envRec be funcEnv's EnvironmentRecord.
5. Let name be StringValue of BindingIdentifier.
6. Perform envRec.CreateImmutableBinding(name, false).
7. Let closure be FunctionCreate(Normal, FormalParameters, FunctionBody, funcEnv, strict).
8. Perform MakeConstructor(closure).
9. Perform SetFunctionName(closure, name).
10. Set closure.[[SourceText]] to the source text matched by FunctionExpression.
11. Perform envRec.InitializeBinding(name, closure).
12. Return closure.
NOTE 2
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.
NOTE 3
A 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 NormalCompletion(undefined).
ConciseBody[In] :
[lookahead ≠ {] AssignmentExpression[?In, ~Yield, ~Await]
{ FunctionBody[~Yield, ~Await] }
Supplemental Syntax
ArrowFormalParameters[Yield, Await] :
( UniqueFormalParameters[?Yield, ?Await] )
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
NOTE
Normally, Contains does not look inside most function forms. However, Contains is used to detect new.target, this, and
super usage within an ArrowFunction.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
1. Return false.
1. Return false.
1. Return 1.
1. Return false.
1. Return true.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
CoverParenthesizedExpressionAndArrowParameterList :
( Expression )
()
( ... BindingIdentifier )
( ... BindingPattern )
( Expression , ... BindingIdentifier )
( Expression , ... BindingPattern )
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.
ArrowParameters : BindingIdentifier
ConciseBody : AssignmentExpression
1. If the function code for this ArrowFunction is strict mode code, let strict be true. Otherwise let strict be false.
2. Let scope be the LexicalEnvironment of the running execution context.
3. Let parameters be CoveredFormalsList of ArrowParameters.
4. Let closure be FunctionCreate(Arrow, parameters, ConciseBody, scope, strict).
5. Set closure.[[SourceText]] to the source text matched by ArrowFunction.
6. 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 4 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
326 © Ecma International 2019
super is accessible via the scope that is captured by the function object of the ArrowFunction.
MethodDefinition[Yield, Await] :
PropertyName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, ~Await] ) {
FunctionBody[~Yield, ~Await] }
GeneratorMethod[?Yield, ?Await]
AsyncMethod[?Yield, ?Await]
AsyncGeneratorMethod[?Yield, ?Await]
get PropertyName[?Yield, ?Await] ( ) { FunctionBody[~Yield, ~Await] }
set PropertyName[?Yield, ?Await] ( PropertySetParameterList ) { FunctionBody[~Yield, ~Await] }
PropertySetParameterList :
FormalParameter[~Yield, ~Await]
MethodDefinition :
PropertyName ( UniqueFormalParameters ) { FunctionBody }
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList ) { FunctionBody }
1. Return false.
MethodDefinition :
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList ) { FunctionBody }
1. Return true.
GeneratorMethod[Yield, Await] :
* PropertyName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, ~Await] ) { GeneratorBody }
GeneratorExpression :
function * BindingIdentifier[+Yield, ~Await] opt ( FormalParameters[+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 object is in a resumable state.
NOTE 3
Abstract operations relating to generator objects are defined in 25.4.3.
If the source code matching this production is strict mode code, the Early Error rules for UniqueFormalParameters :
FormalParameters are applied.
If the source code matching this production is strict mode code, it is a Syntax Error if BindingIdentifier is present and the
StringValue of BindingIdentifier is "eval" or "arguments".
It is a Syntax Error if ContainsUseStrict 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.
1. Return « "*default*" ».
NOTE
"*default*" is used within this specification as a synthetic name for hoistable anonymous functions that are defined using
export declarations.
1. Return false.
NOTE
Static semantic rules that depend upon substructure generally do not look into function definitions.
1. Return false.
1. Return true.
1. Return false.
1. Return true.
1. If the function code for GeneratorDeclaration is strict mode code, let strict be true. Otherwise let strict be false.
2. Let name be StringValue of BindingIdentifier.
3. Let F be GeneratorFunctionCreate(Normal, FormalParameters, GeneratorBody, scope, strict).
4. Let prototype be ObjectCreate(%GeneratorPrototype%).
5. Perform DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true,
[[Enumerable]]: false, [[Configurable]]: false }).
6. Perform SetFunctionName(F, name).
7. Set F.[[SourceText]] to the source text matched by GeneratorDeclaration.
8. Return F.
NOTE
An anonymous GeneratorDeclaration can only occur as part of an export default declaration, and its function code is
therefore always strict mode code.
1. If the function code for this GeneratorExpression is strict mode code, let strict be true. Otherwise let strict be false.
2. Let scope be the LexicalEnvironment of the running execution context.
3. Let closure be GeneratorFunctionCreate(Normal, FormalParameters, GeneratorBody, scope, strict).
4. Let prototype be ObjectCreate(%GeneratorPrototype%).
5. Perform DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true,
[[Enumerable]]: false, [[Configurable]]: false }).
6. Set closure.[[SourceText]] to the source text matched by GeneratorExpression.
7. Return closure.
1. If the function code for this GeneratorExpression is strict mode code, let strict be true. Otherwise let strict be false.
2. Let scope be the running execution context's LexicalEnvironment.
3. Let funcEnv be NewDeclarativeEnvironment(scope).
4. Let envRec be funcEnv's EnvironmentRecord.
5. Let name be StringValue of BindingIdentifier.
6. Perform envRec.CreateImmutableBinding(name, false).
7. Let closure be GeneratorFunctionCreate(Normal, FormalParameters, GeneratorBody, funcEnv, strict).
8. Let prototype be ObjectCreate(%GeneratorPrototype%).
9. Perform DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true,
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.
YieldExpression : yield
AsyncGeneratorMethod[Yield, Await] :
async [no LineTerminator here] * PropertyName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await]
) { AsyncGeneratorBody }
AsyncGeneratorExpression :
async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await] opt (
FormalParameters[+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 async generator object is in a resumable
state.
NOTE 2
Abstract operations relating to async generator objects are defined in 25.5.3.
If the source code matching this production is strict mode code, the Early Error rules for UniqueFormalParameters :
FormalParameters are applied.
If the source code matching this production is strict mode code, it is a Syntax Error if BindingIdentifier is the
IdentifierName eval or the IdentifierName arguments.
It is a Syntax Error if ContainsUseStrict 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.
© Ecma International 2019 337
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.
1. Return « "*default*" ».
NOTE
"*default*" is used within this specification as a synthetic name for hoistable anonymous functions that are defined using
export declarations.
1. Return false.
NOTE
Static semantic rules that depend upon substructure generally do not look into function definitions.
1. Return true.
1. Return false.
1. Return true.
AsyncGeneratorBody : FunctionBody
1. If the function code for AsyncGeneratorDeclaration is strict mode code, let strict be true. Otherwise let strict be false.
2. Let name be StringValue of BindingIdentifier.
3. Let F be ! AsyncGeneratorFunctionCreate(Normal, FormalParameters, AsyncGeneratorBody, scope, strict).
4. Let prototype be ! ObjectCreate(%AsyncGeneratorPrototype%).
5. Perform ! DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true,
1. If the function code for AsyncGeneratorDeclaration is strict mode code, let strict be true. Otherwise let strict be false.
2. Let F be AsyncGeneratorFunctionCreate(Normal, FormalParameters, AsyncGeneratorBody, scope, strict).
3. Let prototype be ObjectCreate(%AsyncGeneratorPrototype%).
4. Perform DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true,
[[Enumerable]]: false, [[Configurable]]: false }).
5. Perform SetFunctionName(F, "default").
6. Set F.[[SourceText]] to the source text matched by AsyncGeneratorDeclaration.
7. Return F.
NOTE
An anonymous AsyncGeneratorDeclaration can only occur as part of an export default declaration.
1. If the function code for this AsyncGeneratorExpression is strict mode code, let strict be true. Otherwise let strict be false.
2. Let scope be the LexicalEnvironment of the running execution context.
3. Let closure be ! AsyncGeneratorFunctionCreate(Normal, FormalParameters, AsyncGeneratorBody, scope, strict).
4. Let prototype be ! ObjectCreate(%AsyncGeneratorPrototype%).
5. Perform ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true,
[[Enumerable]]: false, [[Configurable]]: false }).
6. Set closure.[[SourceText]] to the source text matched by AsyncGeneratorExpression.
7. Return closure.
1. If the function code for this AsyncGeneratorExpression is strict mode code, let strict be true. Otherwise let strict be false.
2. Let scope be the running execution context's LexicalEnvironment.
3. Let funcEnv be ! NewDeclarativeEnvironment(scope).
4. Let envRec be funcEnv's EnvironmentRecord.
5. Let name be StringValue of BindingIdentifier.
6. Perform ! envRec.CreateImmutableBinding(name).
7. Let closure be ! AsyncGeneratorFunctionCreate(Normal, FormalParameters, AsyncGeneratorBody, funcEnv, strict).
8. Let prototype be ! ObjectCreate(%AsyncGeneratorPrototype%).
9. Perform ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true,
[[Enumerable]]: false, [[Configurable]]: false }).
10. Perform ! SetFunctionName(closure, name).
11. Perform ! envRec.InitializeBinding(name, closure).
12. Set closure.[[SourceText]] to the source text matched by AsyncGeneratorExpression.
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.
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]
;
NOTE
A class definition is always strict mode code.
It is a Syntax Error if ClassHeritage is not present and the following algorithm evaluates to true:
ClassBody : ClassElementList
ClassElement : MethodDefinition
1. Return « "*default*" ».
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.
NOTE
Static semantic rules that depend upon substructure generally do not look into class bodies except for PropertyNames.
1. Let inList be the result of ComputedPropertyContains for ClassElementList with argument symbol.
2. If inList is true, return true.
3. Return the result of ComputedPropertyContains for ClassElement with argument symbol.
ClassElement : MethodDefinition
ClassElement : ;
1. Return false.
1. Return false.
1. Return true.
1. Return false.
1. Return true.
1. Return false.
1. Return true.
ClassElement : ;
1. Return false.
1. Return empty.
© Ecma International 2019 345
14.6.13 Runtime Semantics: ClassDefinitionEvaluation
With parameters classBinding and className.
using the syntactic grammar with the goal symbol MethodDefinition[~Yield, ~Await] .
b. Else,
i. Set constructor to the result of parsing the source text
constructor(){ }
using the syntactic grammar with the goal symbol MethodDefinition[~Yield, ~Await] .
11. Set the running execution context's LexicalEnvironment to classScope.
12. Let constructorInfo be the result of performing DefineMethod for constructor with arguments proto and constructorParent
as the optional functionPrototype argument.
346 © Ecma International 2019
13. Assert: constructorInfo is not an abrupt completion.
14. Let F be constructorInfo.[[Closure]].
15. If ClassHeritageopt is present, set F.[[ConstructorKind]] to "derived".
16. Perform MakeConstructor(F, false, proto).
17. Perform MakeClassConstructor(F).
18. If className is not undefined, then
a. Perform SetFunctionName(F, className).
19. Perform CreateMethodProperty(proto, "constructor", F).
20. If ClassBodyopt is not present, let methods be a new empty List.
21. Else, let methods be NonConstructorMethodDefinitions of ClassBody.
22. For each ClassElement m in order from methods, do
a. If IsStatic of m is false, then
i. Let status be the result of performing PropertyDefinitionEvaluation for m with arguments proto and false.
b. Else,
i. Let status be the result of performing PropertyDefinitionEvaluation for m with arguments F and false.
c. If status is an abrupt completion, then
i. Set the running execution context's LexicalEnvironment to lex.
ii. Return Completion(status).
23. Set the running execution context's LexicalEnvironment to lex.
24. If classBinding is not undefined, then
a. Perform classScopeEnvRec.InitializeBinding(classBinding, F).
25. Return F.
1. Let value be the result of ClassDefinitionEvaluation of ClassTail with arguments undefined and "default".
2. ReturnIfAbrupt(value).
3. Set value.[[SourceText]] to the source text matched by ClassDeclaration.
4. 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 15.2.3.11.
1. Return the result of ClassDefinitionEvaluation of ClassTail with arguments undefined and name.
NOTE
ClassDeclaration : class ClassTail only occurs as part of an ExportDeclaration and is never directly evaluated.
ClassExpression : class BindingIdentifier ClassTail
AsyncFunctionExpression :
async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody }
async [no LineTerminator here] function BindingIdentifier[~Yield, +Await] (
FormalParameters[~Yield, +Await] ) { AsyncFunctionBody }
AsyncMethod[Yield, Await] :
async [no LineTerminator here] PropertyName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] )
{ AsyncFunctionBody }
AsyncFunctionBody :
348 © Ecma International 2019
FunctionBody[~Yield, +Await]
AwaitExpression[Yield] :
await UnaryExpression[?Yield, +Await]
NOTE 1
await is parsed as an AwaitExpression when the [Await] parameter is present. The [Await] parameter is present in the following
contexts:
In an AsyncFunctionBody.
In the FormalParameters of an AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncGeneratorDeclaration, or
AsyncGeneratorExpression. AwaitExpression in this position is a Syntax error via static semantics.
When Module is the syntactic goal symbol and the [Await] parameter is absent, await is parsed as a keyword and will be a
Syntax error. 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:
NOTE 2
Unlike YieldExpression, it is a Syntax Error to omit the operand of an AwaitExpression. You must await something.
1. Return « "*default*" ».
NOTE
"*default*" is used within this specification as a synthetic name for hoistable anonymous functions that are defined using
export declarations.
1. Return false.
1. Return false.
1. Return true.
1. Return false.
1. Return true.
1. If the function code for AsyncFunctionDeclaration is strict mode code, let strict be true. Otherwise, let strict be false.
2. Let name be StringValue of BindingIdentifier.
3. Let F be ! AsyncFunctionCreate(Normal, FormalParameters, AsyncFunctionBody, scope, strict).
4. Perform ! SetFunctionName(F, name).
5. Set F.[[SourceText]] to the source text matched by AsyncFunctionDeclaration.
6. Return F.
1. If the function code for AsyncFunctionDeclaration is strict mode code, let strict be true. Otherwise, let strict be false.
2. Let F be ! AsyncFunctionCreate(Normal, FormalParameters, AsyncFunctionBody, scope, strict).
3. Perform ! SetFunctionName(F, "default").
4. Set F.[[SourceText]] to the source text matched by AsyncFunctionDeclaration.
5. Return F.
© Ecma International 2019 351
14.7.11 Runtime Semantics: EvaluateBody
With parameters functionObject and List argumentsList.
AsyncFunctionBody : FunctionBody
1. Return NormalCompletion(empty).
1. Return NormalCompletion(empty).
1. If the function code for AsyncFunctionExpression is strict mode code, let strict be true. Otherwise let strict be false.
2. Let scope be the LexicalEnvironment of the running execution context.
3. Let closure be ! AsyncFunctionCreate(Normal, FormalParameters, AsyncFunctionBody, scope, strict).
4. Set closure.[[SourceText]] to the source text matched by AsyncFunctionExpression.
5. Return closure.
1. If the function code for AsyncFunctionExpression is strict mode code, let strict be true. Otherwise let strict be false.
2. Let scope be the LexicalEnvironment of the running execution context.
3. Let funcEnv be ! NewDeclarativeEnvironment(scope).
4. Let envRec be funcEnv's EnvironmentRecord.
5. Let name be StringValue of BindingIdentifier.
6. Perform ! envRec.CreateImmutableBinding(name).
7. Let closure be ! AsyncFunctionCreate(Normal, FormalParameters, AsyncFunctionBody, funcEnv, strict).
8. Perform ! SetFunctionName(closure, name).
9. Perform ! envRec.InitializeBinding(name, closure).
10. Set closure.[[SourceText]] to the source text matched by AsyncFunctionExpression.
11. Return closure.
AsyncConciseBody[In] :
[lookahead ≠ {] AssignmentExpression[?In, ~Yield, +Await]
{ AsyncFunctionBody }
AsyncArrowBindingIdentifier[Yield] :
© Ecma International 2019 353
BindingIdentifier[?Yield, +Await]
CoverCallExpressionAndAsyncArrowHead[Yield, Await] :
MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
Supplemental Syntax
AsyncArrowHead :
async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]
It is a Syntax Error if any element of the BoundNames of AsyncArrowBindingIdentifier also occurs in the
LexicallyDeclaredNames of AsyncConciseBody.
1. If symbol is not one of NewTarget, SuperProperty, SuperCall, super, or this, return false.
2. Return AsyncConciseBody Contains symbol.
1. If symbol is not one of NewTarget, SuperProperty, SuperCall, super, or this, return false.
2. Let head be CoveredAsyncArrowHead of CoverCallExpressionAndAsyncArrowHead.
3. If head Contains symbol is true, return true.
4. Return AsyncConciseBody Contains symbol.
NOTE
Normally, Contains does not look inside most function forms. However, Contains is used to detect new.target, this, and
super usage within an AsyncArrowFunction.
1. Return false.
1. Return 1.
1. Return false.
1. Return true.
AsyncArrowBindingIdentifier : BindingIdentifier
AsyncConciseBody : AssignmentExpression
AsyncConciseBody : { AsyncFunctionBody }
1. Return the result of EvaluateBody of AsyncFunctionBody passing functionObject and argumentsList as the arguments.
1. If the function code for this AsyncArrowFunction is strict mode code, let strict be true. Otherwise, let strict be false.
2. Let scope be the LexicalEnvironment of the running execution context.
3. Let parameters be AsyncArrowBindingIdentifier.
4. Let closure be ! AsyncFunctionCreate(Arrow, parameters, AsyncConciseBody, scope, strict).
5. Return closure.
1. If the function code for this AsyncArrowFunction is strict mode code, let strict be true. Otherwise, let strict be false.
2. Let scope be the LexicalEnvironment of the running execution context.
3. Let head be CoveredAsyncArrowHead of CoverCallExpressionAndAsyncArrowHead.
4. Let parameters be the ArrowFormalParameters of head.
5. Let closure be ! AsyncFunctionCreate(Arrow, parameters, AsyncConciseBody, scope, strict).
6. Return closure.
NOTE
Tail Position calls are only defined in strict mode code because of a common non-standard language extension (see 9.2.9) that
enables observation of the chain of caller contexts.
NOTE
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.
FunctionStatementList : [empty]
StatementListItem : Declaration
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ThrowStatement
DebuggerStatement
Block : { }
ReturnStatement : return ;
LabelledItem : FunctionDeclaration
CaseBlock : { }
1. Return false.
IterationStatement :
do Statement while ( Expression ) ;
while ( Expression ) Statement
for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
for ( LeftHandSideExpression in Expression ) Statement
for ( var ForBinding in Expression ) Statement
for ( ForDeclaration in Expression ) Statement
LabelledStatement :
LabelIdentifier : LabelledItem
AssignmentExpression :
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
EqualityExpression :
RelationalExpression :
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ShiftExpression
RelationalExpression 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
MemberExpression :
MemberExpression [ Expression ]
MemberExpression . IdentifierName
SuperProperty
MetaProperty
new MemberExpression Arguments
PrimaryExpression :
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
1. Return false.
Expression :
AssignmentExpression
Expression , AssignmentExpression
MemberExpression :
MemberExpression TemplateLiteral
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
ParenthesizedExpression :
( Expression )
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.
Script :
ScriptBodyopt
ScriptBody :
StatementList[~Yield, ~Await, ~Return]
ScriptBody : StatementList
It is a Syntax Error if StatementList Contains super unless the source code 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 18.2.1.1.
It is a Syntax Error if StatementList Contains NewTarget unless the source code 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 18.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.
1. If the Directive Prologue of StatementList contains a Use Strict Directive, return true; otherwise, return false.
NOTE
At the top level of a Script, function declarations are treated like var declarations rather than like lexical declarations.
1. Return NormalCompletion(undefined).
[[Realm]] Realm Record | The realm within which this script was created. undefined if not yet assigned.
undefined
[[Environment]] Lexical Environment The Lexical Environment containing the top level bindings for this script. This
| undefined field is set when the script is instantiated.
[[ECMAScriptCode]] a Parse Node The result of parsing the source text of this module using Script as the goal
symbol.
[[HostDefined]] Any, default value is Field reserved for use by host environments that need to associate additional
undefined. information with a script.
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.
GlobalDeclarationInstantiation is performed as follows using arguments script and env. script is the ScriptBody for which the
execution context is being established. env is the global lexical environment in which bindings are to be created.
NOTE 2
Early errors specified in 15.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.
15.2 Modules
Syntax
Module :
ModuleBodyopt
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList ModuleItem
ModuleItem :
ImportDeclaration
ExportDeclaration
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.
ModuleItem :
ImportDeclaration
ExportDeclaration
1. Return false.
ModuleItem :
ImportDeclaration
ExportDeclaration
1. Return false.
ModuleItem :
ImportDeclaration
ExportDeclaration
1. Return false.
ModuleItem :
ImportDeclaration
StatementListItem
ModuleItem :
ImportDeclaration
StatementListItem
ModuleItem :
ImportDeclaration
StatementListItem
ModuleItem :
ExportDeclaration
StatementListItem
ModuleItemList : ModuleItem
ModuleItem : StatementListItem
ModuleItem : ImportDeclaration
ModuleItem : ExportDeclaration
ModuleItem : StatementListItem
NOTE 2
At the top level of a Module, function declarations are treated like lexical declarations rather than like var declarations.
372 © Ecma International 2019
15.2.1.12 Static Semantics: LexicallyScopedDeclarations
Module : [empty]
ModuleItem : ImportDeclaration
ModuleItem : ImportDeclaration
ModuleItem : ExportDeclaration
ModuleItem : ImportDeclaration
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 37. All Module Definition subclasses include at least those fields. Module
Record also defines the abstract method list in Table 38. All Module definition subclasses must provide concrete
implementations of these abstract methods.
[[Realm]] Realm Record | The Realm within which this module was created. undefined if not yet assigned.
undefined
[[Environment]] Lexical Environment | The Lexical Environment containing the top level bindings for this module. This
undefined field is set when the module is instantiated.
[[Namespace]] Object | undefined The Module Namespace Object (26.3) if one has been created for this module.
Otherwise undefined.
[[HostDefined]] Any, default value is Field reserved for use by host environments that need to associate additional
undefined. information with a module.
GetExportedNames(exportStarSet) Return a list of all names that are either directly or indirectly exported from this
module.
ResolveExport(exportName, Return the binding of a name exported by this module. Bindings are represented by a
resolveSet) ResolvedBinding Record, of the form { [[Module]]: Module Record, [[BindingName]]:
String }. Return null if the name cannot be resolved, or "ambiguous" if multiple
bindings were found.
374 © Ecma International 2019
This operation must be idempotent if it completes normally. Each time it is called with a
specific exportName, resolveSet pair as arguments it must return the same result.
Instantiate() Prepare the module for evaluation by transitively resolving all module dependencies
and creating a module Environment Record.
Evaluate() If this module has already been evaluated successfully, return undefined; if it has
already been evaluated unsuccessfully, throw the exception that was produced.
Otherwise, transitively evaluate all module dependencies of this module and then
evaluate this module.
In addition to the fields defined in Table 37 Cyclic Module Records have the additional fields listed in Table 39
[[EvaluationError]] An abrupt A completion of type throw representing the exception that occurred during
completion evaluation. undefined if no exception occurred or if [[Status]] is not "evaluated".
|
undefined
[[DFSIndex]] Integer | Auxiliary field used during Instantiate and Evaluate only. If [[Status]] is
undefined "instantiating" or "evaluating", this nonnegative number records the point at
which the module was first visited during the ongoing depth-first traversal of the
dependency graph.
[[DFSAncestorIndex]] Integer | Auxiliary field used during Instantiate and Evaluate only. If [[Status]] is
undefined "instantiating" 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 A List of all the ModuleSpecifier strings used by the module represented by this record
In addition to the methods defined in Table 38 Cyclic Module Records have the additional methods listed in Table 40
InitializeEnvironment() Initialize the Lexical Environment of the module, including resolving all imported bindings.
ExecuteModule() Initialize the execution context of the module and evaluate the module's code within it.
The Instantiate concrete method of a Cyclic Module Record implements the corresponding Module Record abstract method.
On success, Instantiate transitions this module's [[Status]] from "uninstantiated" to "instantiated". On failure, an
exception is thrown and this module's [[Status]] remains "uninstantiated".
This abstract method performs the following steps (most of the work is done by the auxiliary function
InnerModuleInstantiation):
The InnerModuleInstantiation abstract operation is used by Instantiate to perform the actual instantiation process for the
Cyclic Module Record 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 "instantiated" together.
376 © Ecma International 2019
This abstract operation performs the following steps:
The Evaluate concrete method of a Cyclic Module Record implements the corresponding Module Record abstract method.
If execution results in an exception, that exception is recorded in the [[EvaluationError]] field and rethrown by future
invocations of Evaluate.
This abstract method performs the following steps (most of the work is done by the auxiliary function
InnerModuleEvaluation):
The InnerModuleEvaluation abstract operation is used by Evaluate to perform the actual evaluation process for the Source
Text Module Record 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 [[DFSAncestoreIndex]] fields, are used the same way as in
InnerModuleInstantiation.
This non-normative section gives a series of examples of the instantiation and evaluation of a few common module graphs,
with a specific focus on how errors can occur.
Let's first assume that there are no error conditions. When a host first calls A.Instantiate(), this will complete successfully by
assumption, and recursively instantiate modules B and C as well, such that A.[[Status]] = B.[[Status]] = C.[[Status]] =
"instantiated". This preparatory step can be performed at any time. Later, when the host is ready to incur any possible
side effects of the modules, it can call A.Evaluate(), which will complete successfully (again by assumption), recursively having
evaluated first C and then B. Each module's [[Status]] at this point will be "evaluated".
Consider then cases involving instantiation errors. If InnerModuleInstantiation of C succeeds but, thereafter, fails for B, for
example because it imports something that C does not provide, then the original A.Instantiate() will fail, and both A and B's
[[Status]] remain "uninstantiated". C's [[Status]] has become "instantiated", though.
Finally, consider a case involving evaluation errors. If InnerModuleEvaluation of C succeeds but, thereafter, fails for B, for
example because B contains code that throws an exception, then the original A.Evaluate() will fail. The resulting exception will
be recorded in both A and B's [[EvaluationError]] fields, and their [[Status]] will become "evaluated". C will also become
"evaluated" but, in contrast to A and B, will remain without an [[EvaluationError]], as it successfully completed evaluation.
Storing the exception ensures that any time a host tries to reuse A or B by calling their Evaluate() method, it will encounter the
© Ecma International 2019 379
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.)
The difference here between instantiation and evaluation errors is due to how 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.) Instantiation, 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.
In this scenario, module A declares a dependency on some other module, but no Module Record exists for that module, i.e.
HostResolveImportedModule throws 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 throwing an exception when trying to parse
the resulting source text. Hosts can choose to expose the cause of failure via the exception they throw from
HostResolveImportedModule. In any case, this exception causes an instantiation failure, which as before results in A's
[[Status]] remaining "uninstantiated".
Here we assume that the entry point is module A, so that the host proceeds by calling A.Instantiate(), which performs
InnerModuleInstantiation on A. This in turn calls InnerModuleInstantiation on B. Because of the cycle, this again triggers
InnerModuleInstantiation on A, but at this point it is a no-op since A.[[Status]] is already "instantiating". B.[[Status]] itself
remains "instantiating" when control gets back to A and InnerModuleInstantiation is triggered on C. After this returns
with C.[[Status]] being "instantiated" , both A and B transition from "instantiating" to "instantiated" together; this
is by design, since they form a strongly connected component.
An analogous story occurs for the evaluation phase of a cyclic module graph, in the success case.
Now consider a case where A has an instantiation error; for example, it tries to import a binding from C that does not exist. In
that case, the above steps still occur, including the early return from the second call to InnerModuleInstantiation on A.
Finally, consider a case where A 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 A. However, once we unwind back to the original InnerModuleEvaluation on A, it fails by
assumption. The exception thrown propagates up to A.Evaluate(), which records the error in all modules that are currently on
its stack (i.e., the modules that are still "evaluating"). Hence both A and B become "evaluated" and the exception is
recorded in both A and B's [[EvaluationError]] fields, while C is left as "evaluated" with no [[EvaluationError]].
A 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 39, Source Text Module Records have the additional fields listed in Table 41. Each of
these fields is initially set in ParseModule.
[[ECMAScriptCode]] a Parse Node The result of parsing the source text of this module using Module as the goal
symbol.
[[ImportEntries]] List of A List of ImportEntry records derived from the code of this module.
ImportEntry
Records
[[LocalExportEntries]] List of A List of ExportEntry records derived from the code of this module that
ExportEntry correspond to declarations that occur within the module.
Records
[[IndirectExportEntries]] List of A List of ExportEntry records derived from the code of this module that
ExportEntry correspond to reexported imports that occur within the module.
Records
[[StarExportEntries]] List of A List of ExportEntry records derived from the code of this module that
ExportEntry correspond to export * declarations that occur within the module.
Records
[[ImportName]] String The name under which the desired binding is exported by the module identified by
[[ModuleRequest]]. The value "*" indicates that the import request is for the target module's
namespace object.
[[LocalName]] String The name that is used to locally access the imported value from within the importing module.
NOTE 1
Table 43 gives examples of ImportEntry records fields used to represent the syntactic import forms:
An ExportEntry Record is a Record that digests information about a single declarative export. Each ExportEntry Record has the
fields defined in Table 44:
[[ExportName]] String The name used to export this binding by this module.
| null
[[ModuleRequest]] String The String value of the ModuleSpecifier of the ExportDeclaration. null if the ExportDeclaration
| null does not have a ModuleSpecifier.
[[ImportName]] String The name under which the desired binding is exported by the module identified by
| null [[ModuleRequest]]. null if the ExportDeclaration does not have a ModuleSpecifier. "*" indicates
that the export request is for all exported bindings.
382 © Ecma International 2019
[[LocalName]] String The name that is used to locally access the exported value from within the importing module.
| null null if the exported value is not locally accessible from within the module.
NOTE 2
Table 45 gives examples of the ExportEntry record fields used to represent the syntactic export forms:
The following definitions specify the required concrete methods and other abstract operations for Source Text Module
Records
The abstract operation ParseModule with arguments sourceText, realm, and hostDefined creates a Source Text Module Record
based upon the result of parsing sourceText as a Module. ParseModule performs the following steps:
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.
The GetExportedNames concrete method of a Source Text Module Record implements the corresponding Module Record
abstract method.
NOTE
GetExportedNames does not filter out or throw an exception for names that have ambiguous star export bindings.
The ResolveExport concrete method of a Source Text Module Record implements the corresponding Module Record abstract
method.
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. If no definition was found or the request is found to be circular, null is
returned. If the request is found to be ambiguous, the string "ambiguous" is returned.
The InitializeEnvironment concrete method of a Source Text Module Record implements the corresponding Cyclic Module
Record abstract method.
The ExecuteModule concrete method of a Source Text Module Record implements the corresponding Cyclic Module Record
abstract method.
The normal return value must be an instance of a concrete subclass of Module Record.
If a Module Record corresponding to the pair referencingModule, specifier does not exist or cannot be created, an
exception must be thrown.
This operation must be idempotent if it completes normally. Each time it is called with a specific referencingModule,
specifier pair as arguments it must return the same Module Record instance.
Multiple different referencingModule, specifier pairs may map to the same Module Record instance. The actual mapping
semantic is implementation-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 alphabetic case folding and expansion of relative and
abbreviated path specifiers.
The GetModuleNamespace abstract operation retrieves the Module Namespace Exotic object representing module's exports,
lazily creating it the first time it was requested, and storing it in module.[[Namespace]] for future retrieval.
NOTE
The only way GetModuleNamespace can throw is via one of the triggered HostResolveImportedModule calls. Unresolvable
names are simply excluded from the namespace at this point. They will lead to a real instantiation error later unless they are
all ambiguous star exports that are not explicitly requested anywhere.
388 © Ecma International 2019
15.2.1.20 Runtime Semantics: TopLevelModuleEvaluationJob ( sourceText, hostDefined )
A TopLevelModuleEvaluationJob with parameters sourceText and hostDefined is a job that parses, validates, and evaluates
sourceText as a Module.
NOTE
An implementation may parse a sourceText as a Module, analyse it for Early Error conditions, and instantiate it prior to the
execution of the TopLevelModuleEvaluationJob for that sourceText. An implementation may also resolve, pre-parse and pre-
analyse, and pre-instantiate module dependencies of sourceText. However, the reporting of any errors detected by these
actions must be deferred until the TopLevelModuleEvaluationJob is actually executed.
1. Return NormalCompletion(undefined).
ModuleBody : ModuleItemList
NOTE
The value of a ModuleItemList is the value of the last value-producing item in the ModuleItemList.
ModuleItem : ImportDeclaration
1. Return NormalCompletion(empty).
15.2.2 Imports
© Ecma International 2019 389
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
IdentifierName as ImportedBinding
ModuleSpecifier :
StringLiteral
ImportedBinding :
BindingIdentifier[~Yield, ~Await]
NamedImports : { }
ImportedDefaultBinding : ImportedBinding
NameSpaceImport : * as ImportedBinding
NamedImports : { }
ImportSpecifier : ImportedBinding
ModuleSpecifier : StringLiteral
15.2.3 Exports
Syntax
ExportDeclaration :
export * FromClause ;
export ExportClause FromClause ;
export ExportClause ;
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] ;
ExportClause :
{}
{ ExportsList }
{ ExportsList , }
ExportsList :
ExportSpecifier
ExportsList , ExportSpecifier
ExportSpecifier :
IdentifierName
IdentifierName as IdentifierName
NOTE
The above rule means that each ReferencedBindings of ExportClause is treated as an IdentifierReference.
ExportDeclaration :
export * FromClause ;
export ExportClause FromClause ;
export ExportClause ;
1. Return « "*default*" ».
ExportDeclaration :
export * FromClause ;
export ExportClause FromClause ;
ExportClause : { }
ExportSpecifier : IdentifierName
1. Return « "default" ».
ExportSpecifier : IdentifierName
1. Let entry be the ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: "*default*",
[[ExportName]]: "default" }.
2. Return a new List containing entry.
NOTE
"*default*" is used within this specification as a synthetic name for anonymous default export values.
ExportClause : { }
ExportSpecifier : IdentifierName
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.
ExportDeclaration :
export * FromClause ;
export ExportClause FromClause ;
export ExportClause ;
export VariableStatement
ExportDeclaration :
export ExportClause ;
export VariableStatement
export Declaration
export default HoistableDeclaration
export default ClassDeclaration
export default AssignmentExpression ;
ExportSpecifier : IdentifierName
1. Return NormalCompletion(empty).
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 16.2, an 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 implementation-
defined behaviour instead of throwing SyntaxError when they encounter an implementation-defined extension to the
script syntax or regular expression pattern or flag syntax.
Except as restricted in 16.2, an 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 implementation-defined behaviour instead of throwing an error (such as ReferenceError).
An implementation of HostReportErrors must complete normally in all cases. The default implementation of HostReportErrors
is to unconditionally return an empty normal completion.
NOTE
errorList will be a List of ECMAScript language values. If the errors are parsing errors or early errors, these will always be
SyntaxError or ReferenceError objects. Runtime errors, however, can be any ECMAScript value.
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
© Ecma International 2019 401
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 the following methods must not be extended except as specified in ECMA-402:
Object.prototype.toLocaleString, Array.prototype.toLocaleString,
Number.prototype.toLocaleString, Date.prototype.toLocaleDateString,
Date.prototype.toLocaleString, Date.prototype.toLocaleTimeString,
String.prototype.localeCompare, %TypedArray%.prototype.toLocaleString.
The RegExp pattern grammars in 21.2.1 and B.1.4 must not be extended to recognize any of the source characters A-Z or
a-z as IdentityEscape[+U] when the [U] grammar parameter is present.
The Syntactic Grammar must not be extended in any manner that allows the token : to immediately follow source text
that matches the BindingIdentifier nonterminal symbol.
When processing strict mode code, the syntax of NumericLiteral must not be extended to include
LegacyOctalIntegerLiteral and the syntax of DecimalIntegerLiteral must not be extended to include
NonOctalDecimalIntegerLiteral as described in B.1.1.
TemplateCharacter must not be extended to include LegacyOctalEscapeSequence as defined in B.1.2.
When processing strict mode code, the extensions defined in B.3.2, B.3.3, B.3.4, and B.3.6 must not be supported.
When parsing for the Module goal symbol, the lexical grammar extensions defined in B.1.3 must not be supported.
Unless specified otherwise, a built-in object that is callable as a function is a built-in function object with the characteristics
described in 9.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 9.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
402 © Ecma International 2019
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 (19.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 (19.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 (9.3.3).
Every built-in function object, including constructors, has a "length" property whose value is an integer. Unless otherwise
specified, this value is equal to the largest number of named arguments shown in the subclause headings for the function
description. Optional parameters (which are indicated with brackets: [ ]) or rest parameters (which are shown using the form
«...name») are not included in the default argument 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 1.
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, that is not identified as an anonymous function 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. 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 " prepended to the
property name string. The value of the name property is explicitly specified for each built-in functions whose property key is a
Symbol value.
Unless otherwise specified, the name property of a built-in function object, if it exists, has the attributes { [[Writable]]: false,
[[Enumerable]]: false, [[Configurable]]: true }.
Every other data property described in clauses 18 through 26 and in Annex B.2 has the attributes { [[Writable]]: true,
[[Enumerable]]: false, [[Configurable]]: true } unless otherwise specified.
Every accessor property described in clauses 18 through 26 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.
© Ecma International 2019 403
18 The Global Object
The global object:
18.1.1 Infinity
The value of Infinity is +∞ (see 6.1.6). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false,
[[Configurable]]: false }.
18.1.2 NaN
The value of NaN is NaN (see 6.1.6). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false,
[[Configurable]]: false }.
18.1.3 undefined
The value of undefined is undefined (see 6.1.1). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false,
[[Configurable]]: false }.
18.2.1 eval ( x )
The eval function is the %eval% intrinsic object. When the eval function is called with one argument x, the following steps
are taken:
The abstract operation PerformEval with arguments x, evalRealm, strictCaller, and direct performs the following steps:
NOTE
The eval code cannot instantiate variable or function bindings in the variable environment of the calling context that invoked
the eval if the calling context is evaluating formal parameter initializers or 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.
These static semantics are applied by PerformEval when a direct eval call occurs outside of any function.
ScriptBody : StatementList
These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition.
ScriptBody : StatementList
18.2.1.1.3 Additional Early Error Rules for Eval Outside Constructor Methods
These static semantics are applied by PerformEval when a direct eval call occurs outside of the constructor method of a
ClassDeclaration or ClassExpression.
ScriptBody : StatementList
An implementation of HostEnsureCanCompileStrings may complete normally or abruptly. Any abrupt completions will be
propagated to its callers. The default implementation of HostEnsureCanCompileStrings is to unconditionally return an empty
normal completion.
When the abstract operation EvalDeclarationInstantiation is called with arguments body, varEnv, lexEnv, and strict, the
following steps are taken:
NOTE
An alternative version of this algorithm is described in B.3.5.
NOTE
A reliable way for ECMAScript code to test if a value X is a NaN is an expression of the form X !== X. The result will be true if
and only if X is a NaN.
The parseFloat function is the %parseFloat% intrinsic object. When the parseFloat function is called with one argument
string, the following steps are taken:
NOTE
parseFloat may interpret only a leading portion of string as a Number value; it ignores any code units that cannot be
The parseInt function is the %parseInt% intrinsic object. When the parseInt function is called, the following steps are
taken:
NOTE
Many implementations of ECMAScript provide additional functions and methods that manipulate web pages; these functions
are beyond the scope of this standard.
where the italicized names represent components and “:”, “/”, “;” and “?” are reserved for use as separators. The encodeURI
and decodeURI functions are intended to work with complete URIs; they assume that any reserved code units in the URI are
intended to have special meaning and so are not encoded. The encodeURIComponent and decodeURIComponent functions
are intended to work with the individual component parts of a URI; they assume that any reserved code units represent text
and so must be encoded so that they are not interpreted as reserved code units when the component is part of a complete URI.
Syntax
uri :::
uriCharactersopt
uriCharacters :::
uriCharacter uriCharactersopt
uriCharacter :::
uriReserved
uriUnescaped
uriEscaped
uriUnescaped :::
uriAlpha
DecimalDigit
uriEscaped :::
% HexDigit HexDigit
NOTE
The above syntax is based upon RFC 2396 and does not reflect changes introduced by the more recent RFC 3986.
Runtime Semantics
When a code unit to be included in a URI is not listed above or is not intended to have the special meaning sometimes given to
the reserved code units, that code unit must be encoded. The code unit is transformed into its UTF-8 encoding, with surrogate
pairs first converted from UTF-16 to the corresponding code point value. (Note that for code units in the range [0, 127] this
results in a single octet with the same value.) The resulting sequence of octets is then transformed into a String with each
octet represented by an escape sequence of the form "%xx".
The encoding and escaping process is described by the abstract operation Encode taking two String arguments string and
unescapedSet.
The unescaping and decoding process is described by the abstract operation Decode taking two String arguments string and
reservedSet.
NOTE
This syntax of Uniform Resource Identifiers is based upon RFC 2396 and does not reflect the more recent RFC 3986 which
replaces RFC 2396. A formal description and implementation of UTF-8 is given in RFC 3629.
In UTF-8, characters are encoded using sequences of 1 to 6 octets. The only octet of a sequence of one has the higher-order bit
set to 0, the remaining 7 bits being used to encode the character value. In a sequence of n octets, n > 1, the initial octet has the
n higher-order bits set to 1, followed by a bit set to 0. The remaining bits of that octet contain bits from the value of the
character to be encoded. The following octets all have the higher-order bit set to 1 and the following bit set to 0, leaving 6 bits
in each to contain bits from the character to be encoded. The possible UTF-8 encodings of ECMAScript characters are specified
in Table 46.
Code Unit Value Representation 1st Octet 2nd Octet 3rd Octet 4th Octet
Where
414 © Ecma International 2019
uuuuu = vvvv + 1
to account for the addition of 0x10000 as in section 3.8 of the Unicode Standard (Surrogates).
The above transformation combines each surrogate pair (for which code unit values in the inclusive range 0xD800 to 0xDFFF
are reserved) into a UTF-32 representation and encodes the resulting 21-bit value into UTF-8. Decoding reconstructs the
surrogate pair.
RFC 3629 prohibits the decoding of invalid UTF-8 octet sequences. For example, the invalid sequence C0 80 must not decode
into the code unit 0x0000. Implementations of the Decode algorithm are required to throw a URIError when encountering
such invalid sequences.
The decodeURI function is the %decodeURI% intrinsic object. When the decodeURI function is called with one argument
encodedURI, the following steps are taken:
NOTE
The code point "#" is not decoded from escape sequences even though it is not a reserved URI code point.
The decodeURIComponent 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
points that it represents.
The decodeURIComponent function is the %decodeURIComponent% intrinsic object. When the decodeURIComponent
function is called with one argument encodedURIComponent, the following steps are taken:
The encodeURI 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 points.
The encodeURI function is the %encodeURI% intrinsic object. When the encodeURI function is called with one argument uri,
the following steps are taken:
NOTE
The code unit "#" is not encoded to an escape sequence even though it is not a reserved or unescaped URI code point.
The encodeURIComponent function is the %encodeURIComponent% intrinsic object. When the encodeURIComponent
function is called with one argument uriComponent, the following steps are taken:
18.3.1 Array ( . . . )
See 22.1.1.
18.3.2 ArrayBuffer ( . . . )
See 24.1.2.
18.3.3 Boolean ( . . . )
See 19.3.1.
18.3.4 DataView ( . . . )
See 24.3.2.
18.3.5 Date ( . . . )
See 20.3.2.
18.3.6 Error ( . . . )
416 © Ecma International 2019
See 19.5.1.
18.3.7 EvalError ( . . . )
See 19.5.5.1.
18.3.8 Float32Array ( . . . )
See 22.2.4.
18.3.9 Float64Array ( . . . )
See 22.2.4.
18.3.10 Function ( . . . )
See 19.2.1.
18.3.11 Int8Array ( . . . )
See 22.2.4.
18.3.12 Int16Array ( . . . )
See 22.2.4.
18.3.13 Int32Array ( . . . )
See 22.2.4.
18.3.14 Map ( . . . )
See 23.1.1.
18.3.15 Number ( . . . )
See 20.1.1.
18.3.16 Object ( . . . )
See 19.1.1.
18.3.18 Proxy ( . . . )
See 26.2.1.
18.3.19 RangeError ( . . . )
See 19.5.5.2.
18.3.20 ReferenceError ( . . . )
See 19.5.5.3.
18.3.21 RegExp ( . . . )
See 21.2.3.
18.3.22 Set ( . . . )
See 23.2.1.
18.3.23 SharedArrayBuffer ( . . . )
See 24.2.2.
18.3.24 String ( . . . )
See 21.1.1.
18.3.25 Symbol ( . . . )
See 19.4.1.
18.3.26 SyntaxError ( . . . )
See 19.5.5.4.
18.3.27 TypeError ( . . . )
See 19.5.5.5.
18.3.29 Uint8ClampedArray ( . . . )
See 22.2.4.
18.3.30 Uint16Array ( . . . )
See 22.2.4.
18.3.31 Uint32Array ( . . . )
See 22.2.4.
18.3.32 URIError ( . . . )
See 19.5.5.6.
18.3.33 WeakMap ( . . . )
See 23.3.1.
18.3.34 WeakSet ( . . . )
See 23.4.
18.4.1 Atomics
See 24.4.
18.4.2 JSON
See 24.5.
18.4.3 Math
See 20.2.
19 Fundamental Objects
When the Object function is called with optional argument value, the following steps are taken:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has a "length" property.
has the following additional properties:
The assign function is used to copy the values of all of the enumerable own properties from one or more source objects to a
target object. When the assign function is called, the following steps are taken:
1. Let to be ? ToObject(target).
The abstract operation ObjectDefineProperties with arguments O and Properties performs the following steps:
19.1.2.5 Object.entries ( O )
When the entries function is called with argument O, the following steps are taken:
19.1.2.6 Object.freeze ( O )
When the freeze function is called, the following steps are taken:
1. Perform ? RequireObjectCoercible(iterable).
2. Let obj be ObjectCreate(%ObjectPrototype%).
3. Assert: obj is an extensible ordinary object with no own properties.
4. Let stepsDefine be the algorithm steps defined in CreateDataPropertyOnObject Functions.
5. Let adder be CreateBuiltinFunction(stepsDefine, « »).
6. Return ? AddEntriesFromIterable(obj, iterable, adder).
NOTE
422 © Ecma International 2019
The function created for adder is never directly accessible to ECMAScript code.
19.1.2.8 Object.getOwnPropertyDescriptor ( O, P )
When the getOwnPropertyDescriptor function is called, the following steps are taken:
19.1.2.9 Object.getOwnPropertyDescriptors ( O )
When the getOwnPropertyDescriptors function is called, the following steps are taken:
19.1.2.10 Object.getOwnPropertyNames ( O )
When the getOwnPropertyNames function is called, the following steps are taken:
19.1.2.11 Object.getOwnPropertySymbols ( O )
When the getOwnPropertySymbols function is called with argument O, the following steps are taken:
The abstract operation GetOwnPropertyKeys is called with arguments O and type where O is an Object and type is one of the
ECMAScript specification types String or Symbol. The following steps are taken:
19.1.2.12 Object.getPrototypeOf ( O )
When the getPrototypeOf function is called with argument O, the following steps are taken:
When the is function is called with arguments value1 and value2, the following steps are taken:
19.1.2.14 Object.isExtensible ( O )
When the isExtensible function is called with argument O, the following steps are taken:
19.1.2.15 Object.isFrozen ( O )
When the isFrozen function is called with argument O, the following steps are taken:
19.1.2.16 Object.isSealed ( O )
When the isSealed function is called with argument O, the following steps are taken:
When the keys function is called with argument O, the following steps are taken:
19.1.2.18 Object.preventExtensions ( O )
When the preventExtensions function is called, the following steps are taken:
19.1.2.19 Object.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
19.1.2.20 Object.seal ( O )
When the seal function is called, the following steps are taken:
When the setPrototypeOf function is called with arguments O and proto, the following steps are taken:
1. Set O to ? RequireObjectCoercible(O).
2. If Type(proto) is neither Object nor Null, throw a TypeError exception.
3. If Type(O) is not Object, return O.
4. Let status be ? O.[[SetPrototypeOf]](proto).
5. If status is false, throw a TypeError exception.
6. Return O.
19.1.2.22 Object.values ( O )
When the values function is called with argument O, the following steps are taken:
19.1.3.1 Object.prototype.constructor
19.1.3.2 Object.prototype.hasOwnProperty ( V )
When the hasOwnProperty method is called with argument V, the following steps are taken:
1. Let P be ? ToPropertyKey(V).
2. Let O be ? ToObject(this value).
3. Return ? HasOwnProperty(O, P).
NOTE
The ordering of steps 1 and 2 is chosen to ensure that any exception that would have been thrown by step 1 in previous
editions of this specification will continue to be thrown even if the this value is undefined or null.
19.1.3.3 Object.prototype.isPrototypeOf ( V )
When the isPrototypeOf method is called with argument V, the following steps are taken:
NOTE
The ordering of steps 1 and 2 preserves the behaviour specified by previous editions of this specification for the case where V
is not an object and the this value is undefined or null.
19.1.3.4 Object.prototype.propertyIsEnumerable ( V )
When the propertyIsEnumerable method is called with argument V, the following steps are taken:
1. Let P be ? ToPropertyKey(V).
426 © Ecma International 2019
2. Let O be ? ToObject(this value).
3. Let desc be ? O.[[GetOwnProperty]](P).
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 1 and 2 is chosen to ensure that any exception that would have been thrown by step 1 in previous
editions of this specification will continue to be thrown even if the this value is undefined or null.
The optional parameters to this function are not used but are intended to correspond to the parameter pattern used by ECMA-
402 toLocaleString functions. Implementations that do not include ECMA-402 support must not use those parameter
positions for other purposes.
NOTE 1
This function provides a generic toLocaleString implementation for objects that have no locale-specific toString
behaviour. Array, Number, Date, and Typed Arrays provide their own locale-sensitive toLocaleString methods.
NOTE 2
ECMA-402 intentionally does not provide an alternative to this default implementation.
19.1.3.6 Object.prototype.toString ( )
When the toString method is called, the following steps are taken:
NOTE
Historically, this function 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.
19.1.3.7 Object.prototype.valueOf ( )
When the valueOf method is called, the following steps are taken:
The last argument specifies the body (executable code) of a function; any preceding arguments specify formal parameters.
428 © Ecma International 2019
When the Function function is called with some arguments p1, p2, … , pn, body (where n might be 0, that is, there are no “ p ”
arguments, and where body might also not be provided), the following steps are taken:
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:
The abstract operation CreateDynamicFunction is called with arguments constructor, newTarget, kind, and args. constructor is
the constructor function that is performing this action, newTarget is the constructor that new was initially applied to, kind is
either "normal", "generator", "async", or "async generator", and args is a List containing the actual argument values
that were passed to constructor. The following steps are taken:
NOTE
A prototype property is created for every non-async function created using CreateDynamicFunction to provide for the
possibility that the function will be used as a constructor.
"normal" "function"
"generator" "function*"
19.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 }.
19.2.2.2 Function.prototype
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.
When the apply method is called with arguments thisArg and argArray, the following steps are taken:
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 an arrow function or a bound function then the thisArg will be ignored by the function [[Call]] in step 5.
When the bind method is called with argument thisArg and zero or more args, it performs the following steps:
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 an arrow function or a bound function then the thisArg passed to this method will not be used by subsequent calls
to F.
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 an arrow function or a bound function then the thisArg will be ignored by the function [[Call]] in step 5.
19.2.3.4 Function.prototype.constructor
When the toString method is called, the following steps are taken:
NativeFunction :
function PropertyName[~Yield, ~Await] opt ( FormalParameters[~Yield, ~Await] ) { [ native code ] }
When the @@hasInstance method of an object F is called with value V, the following steps are taken:
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
v instanceof F
evaluates as
F[@@hasInstance](v)
A 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.
19.2.4.1 length
The value of the "length" property is an integer 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 }.
19.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 code. 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 do not have a
name own property but inherit the name property of %FunctionPrototype%.
19.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.
An implementation of HostHasSourceTextAvailable must complete normally in all cases. This operation 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 completion
record. The default implementation of HostHasSourceTextAvailable is to unconditionally return a normal completion with a
value of true.
When Boolean is called with argument value, the following steps are taken:
1. Let b be ToBoolean(value).
2. If NewTarget is undefined, return b.
3. Let O be ? OrdinaryCreateFromConstructor(NewTarget, "%BooleanPrototype%", « [[BooleanData]] »).
4. Set O.[[BooleanData]] to b.
5. Return O.
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
19.3.2.1 Boolean.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
19.3.3.1 Boolean.prototype.constructor
The initial value of Boolean.prototype.constructor is the intrinsic object %Boolean%.
19.3.3.2 Boolean.prototype.toString ( )
The following steps are taken:
19.3.3.3 Boolean.prototype.valueOf ( )
The following steps are taken:
When Symbol is called with optional argument description, the following steps are taken:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
19.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 }.
When Symbol.for is called with argument key it performs the following steps:
The GlobalSymbolRegistry is a 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 48.
19.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 }.
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 }.
19.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 }.
When Symbol.keyFor is called with argument sym it performs the following steps:
19.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 }.
19.4.2.8 Symbol.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
19.4.2.9 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 }.
19.4.2.10 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 }.
19.4.2.11 Symbol.species
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
19.4.2.12 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 }.
19.4.2.13 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 }.
19.4.2.14 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 }.
19.4.2.15 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 }.
19.4.3.1 Symbol.prototype.constructor
440 © Ecma International 2019
The initial value of Symbol.prototype.constructor is the intrinsic object %Symbol%.
19.4.3.3 Symbol.prototype.toString ( )
The following steps are taken:
When the abstract operation SymbolDescriptiveString is called with argument sym, the following steps are taken:
19.4.3.4 Symbol.prototype.valueOf ( )
The following steps are taken:
When the @@toPrimitive method is called with argument hint, the following steps are taken:
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
When the Error function is called with argument message, the following steps are taken:
1. If NewTarget is undefined, let newTarget be the active function object, else let newTarget be NewTarget.
2. Let O be ? OrdinaryCreateFromConstructor(newTarget, "%ErrorPrototype%", « [[ErrorData]] »).
3. If message is not undefined, then
a. Let msg be ? ToString(message).
b. Let msgDesc be the PropertyDescriptor { [[Value]]: msg, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]:
true }.
c. Perform ! DefinePropertyOrThrow(O, "message", msgDesc).
4. Return O.
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
19.5.2.1 Error.prototype
The initial value of Error.prototype is the intrinsic object %ErrorPrototype%.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
19.5.3.1 Error.prototype.constructor
The initial value of Error.prototype.constructor is the intrinsic object %Error%.
19.5.3.2 Error.prototype.message
The initial value of Error.prototype.message is the empty String.
19.5.3.3 Error.prototype.name
The initial value of Error.prototype.name is "Error".
19.5.3.4 Error.prototype.toString ( )
The following steps are taken:
19.5.5.1 EvalError
This exception is not currently used within this specification. This object remains for compatibility with previous editions of
this specification.
19.5.5.2 RangeError
Indicates a value that is not in the set or range of allowable values.
19.5.5.3 ReferenceError
Indicate that an invalid reference value has been detected.
19.5.5.4 SyntaxError
Indicates that a parsing error has occurred.
19.5.5.5 TypeError
TypeError is used to indicate an unsuccessful operation when none of the other NativeError objects are an appropriate
indication of the failure cause.
19.5.5.6 URIError
Indicates that one of the global URI handling functions was used in a way that is incompatible with its definition.
For each error object, references to NativeError in the definition should be replaced with the appropriate error object name
from 19.5.5.
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.
is designed to be subclassable. It 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.
When a NativeError function is called with argument message, the following steps are taken:
1. If NewTarget is undefined, let newTarget be the active function object, else let newTarget be NewTarget.
2. Let O be ? OrdinaryCreateFromConstructor(newTarget, "%NativeErrorPrototype%", « [[ErrorData]] »).
3. If message is not undefined, then
a. Let msg be ? ToString(message).
b. Let msgDesc be the PropertyDescriptor { [[Value]]: msg, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]:
true }.
c. Perform ! DefinePropertyOrThrow(O, "message", msgDesc).
4. Return O.
The actual value of the string passed in step 2 is either "%EvalErrorPrototype%", "%RangeErrorPrototype%",
"%ReferenceErrorPrototype%", "%SyntaxErrorPrototype%", "%TypeErrorPrototype%", or
"%URIErrorPrototype%" corresponding to which NativeError constructor is being defined.
has a [[Prototype]] internal slot whose value is the intrinsic object %Error%.
has a name property whose value is the String value `"NativeError"`.
has the following properties:
19.5.6.2.1 NativeError.prototype
The initial value of NativeError.prototype is a NativeError prototype object (19.5.6.3). Each NativeError constructor has a
distinct prototype object.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
is an ordinary object.
is not an Error instance and does not have an [[ErrorData]] internal slot.
© Ecma International 2019 445
has a [[Prototype]] internal slot whose value is the intrinsic object %ErrorPrototype%.
19.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% (19.5.6.1).
19.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.
19.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).
When Number is called with argument value, the following steps are taken:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
20.1.2.1 Number.EPSILON
The value of Number.EPSILON is the difference between 1 and the smallest value greater than 1 that is representable as a
Number value, which is approximately 2.2204460492503130808472633361816 x 10 - 16.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
When Number.isFinite is called with one argument number, the following steps are taken:
When Number.isInteger is called with one argument number, the following steps are taken:
When Number.isNaN is called with one argument number, the following steps are taken:
NOTE
© Ecma International 2019 447
This function differs from the global isNaN function (18.2.3) in that it does not convert its argument to a Number before
determining whether it is NaN.
20.1.2.6 Number.MAX_SAFE_INTEGER
NOTE
The value of Number.MAX_SAFE_INTEGER is the largest integer n such that n and n + 1 are both exactly representable as a
Number value.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.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 × 10308.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.1.2.8 Number.MIN_SAFE_INTEGER
NOTE
The value of Number.MIN_SAFE_INTEGER is the smallest integer n such that n and n - 1 are both exactly representable as a
Number value.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.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-2008 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.
448 © Ecma International 2019
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.1.2.10 Number.NaN
The value of Number.NaN is NaN.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.1.2.11 Number.NEGATIVE_INFINITY
The value of Number.NEGATIVE_INFINITY is -∞.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.1.2.14 Number.POSITIVE_INFINITY
The value of Number.POSITIVE_INFINITY is +∞.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.1.2.15 Number.prototype
The initial value of Number.prototype is the intrinsic object %NumberPrototype%.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
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
© Ecma International 2019 449
initialized to a Number value.
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.
20.1.3.1 Number.prototype.constructor
The initial value of Number.prototype.constructor is the intrinsic object %Number%.
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:
1. Let e, n, and f be integers such that f ≥ 0, 10f ≤ n < 10f + 1, the Number value for n × 10e - f is x, and f is as small as possible.
If there are multiple possibilities for n, choose the value of n for which n × 10e - f is closest in value to x. If there are two
such possible values of n, choose the one that is even.
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,
Produces a String value that represents this Number value formatted according to the conventions of the host environment's
current locale. This function is implementation-dependent, 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.
The toString function 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.
20.1.3.7 Number.prototype.valueOf ( )
1. Return ? thisNumberValue(this value).
NOTE
In this specification, the phrase “the Number value for x” has a technical meaning defined in 6.1.6.
20.2.1.1 Math.E
The Number value for e, the base of the natural logarithms, which is approximately 2.7182818284590452354.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.2.1.2 Math.LN10
454 © Ecma International 2019
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 }.
20.2.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 }.
20.2.1.4 Math.LOG10E
The Number value for the base-10 logarithm of e, 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.
20.2.1.5 Math.LOG2E
The Number value for the base-2 logarithm of e, 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.
20.2.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 }.
20.2.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.
20.2.1.8 Math.SQRT2
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
In the function descriptions below, the symbols NaN, -0, +0, -∞ and +∞ refer to the Number values described in 6.1.6.
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-2008 arithmetic contained in fdlibm, the freely
distributable mathematical library from Sun Microsystems (http://www.netlib.org/fdlibm).
20.2.2.1 Math.abs ( x )
Returns the absolute value of x; the result has the same magnitude as x but has positive sign.
20.2.2.2 Math.acos ( x )
Returns an implementation-dependent approximation to the arc cosine of x. The result is expressed in radians and ranges
from +0 to +π.
20.2.2.3 Math.acosh ( x )
Returns an implementation-dependent approximation to the inverse hyperbolic cosine of x.
20.2.2.4 Math.asin ( x )
Returns an implementation-dependent approximation to the arc sine of x. The result is expressed in radians and ranges from -
π / 2 to +π / 2.
20.2.2.5 Math.asinh ( x )
20.2.2.6 Math.atan ( x )
Returns an implementation-dependent approximation to the arc tangent of x. The result is expressed in radians and ranges
from -π / 2 to +π / 2.
20.2.2.7 Math.atanh ( x )
20.2.2.8 Math.atan2 ( y, x )
Returns an implementation-dependent approximation to the arc tangent of the quotient y / x of the arguments y and x, where
the signs of y and x are used to determine the quadrant of the result. Note that it is intentional and traditional for the two-
argument arc tangent function that the argument named y be first and the argument named x be second. The result is
expressed in radians and ranges from -π to +π.
20.2.2.9 Math.cbrt ( x )
20.2.2.10 Math.ceil ( x )
Returns the smallest (closest to -∞) Number value that is not less than x and is equal to a mathematical integer. If x is already
an integer, the result is x.
20.2.2.11 Math.clz32 ( x )
When Math.clz32 is called with one argument x, the following steps are taken:
1. Let n be ? ToUint32(x).
2. Let p be the number of leading zero bits in the 32-bit binary representation of n.
3. Return p.
NOTE
If n is 0, p will be 32. If the most significant bit of the 32-bit binary encoding of n is 1, p will be 0.
20.2.2.12 Math.cos ( x )
20.2.2.13 Math.cosh ( x )
NOTE
The value of cosh(x) is the same as (exp(x) + exp(-x)) / 2.
20.2.2.14 Math.exp ( x )
Returns an implementation-dependent approximation to the exponential function of x (e raised to the power of x, where e is
the base of the natural logarithms).
20.2.2.15 Math.expm1 ( x )
Returns an implementation-dependent approximation to subtracting 1 from the exponential function of x (e raised to the
power of x, where e is the base of the natural logarithms). The result is computed in a way that is accurate even when the
value of x is close 0.
20.2.2.16 Math.floor ( x )
Returns the greatest (closest to +∞) Number value that is not greater than x and is equal to a mathematical integer. If x is
already an integer, the result is x.
NOTE
The value of Math.floor(x) is the same as the value of -Math.ceil(-x).
20.2.2.17 Math.fround ( x )
When Math.fround is called with argument x, the following steps are taken:
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.
20.2.2.19 Math.imul ( x, y )
When Math.imul is called with arguments x and y, the following steps are taken:
1. Let a be ? ToUint32(x).
2. Let b be ? ToUint32(y).
3. Let product be (a × b) modulo 232.
4. If product ≥ 231, return product - 232; otherwise return product.
20.2.2.20 Math.log ( x )
20.2.2.21 Math.log1p ( x )
Returns an implementation-dependent approximation to the natural logarithm of 1 + x. The result is computed in a way that is
accurate even when the value of x is close to zero.
20.2.2.22 Math.log10 ( x )
Returns an implementation-dependent approximation to the base 10 logarithm of x.
20.2.2.23 Math.log2 ( x )
Returns an implementation-dependent approximation to the base 2 logarithm of x.
Given zero or more arguments, calls ToNumber on each of the arguments and returns the largest of the resulting values.
Given zero or more arguments, calls ToNumber on each of the arguments and returns the smallest of the resulting values.
20.2.2.27 Math.random ( )
Returns a Number value with positive sign, greater than or equal to 0 but less than 1, chosen randomly or pseudo randomly
with approximately uniform distribution over that range, using an implementation-dependent algorithm or strategy. This
function takes no arguments.
Each Math.random function created for distinct realms must produce a distinct sequence of values from successive calls.
20.2.2.28 Math.round ( x )
Returns the Number value that is closest to x and is equal to a mathematical integer. If two integer Number values are equally
close to x, then the result is the Number value that is closer to +∞. If x is already an integer, the result is x.
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 x 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.
20.2.2.29 Math.sign ( x )
20.2.2.30 Math.sin ( x )
20.2.2.31 Math.sinh ( x )
Returns an implementation-dependent approximation to the hyperbolic sine of x.
NOTE
The value of sinh(x) is the same as (exp(x) - exp(-x)) / 2.
20.2.2.32 Math.sqrt ( x )
Returns an implementation-dependent approximation to the square root of x.
20.2.2.33 Math.tan ( x )
20.2.2.34 Math.tanh ( x )
NOTE
The value of tanh(x) is the same as (exp(x) - exp(-x))/(exp(x) + exp(-x)).
Returns the integral part of the number x, removing any fractional digits. If x is already an integer, the result is x.
A Date object contains a Number representing an instant in time with millisecond precision. Such a Number is called a time
value. A time value may also be NaN, indicating that the Date object does not represent a specific instant in time.
Time is measured in ECMAScript as milliseconds since midnight at the beginning of 01 January, 1970 UTC. Time in ECMAScript
does not observe leap seconds; they are ignored. Time calculations assume each and every day contains exactly 60 × 60 × 24 ×
1000 = 86,400,000 milliseconds, to align with the POSIX specification of each and every day containing exactly 86,400
seconds.
A Number can exactly represent all integers from -9,007,199,254,740,992 to 9,007,199,254,740,992 (20.1.2.8 and 20.1.2.6). A
time value supports a slightly smaller range of exactly -100,000,000 days to 100,000,000 days measured relative to midnight
at the beginning of 01 January, 1970 UTC. This yields an exact supported time value range of -8,640,000,000,000,000 to
8,640,000,000,000,000 milliseconds relative to midnight at the beginning of 01 January, 1970 UTC.
The exact moment of midnight at the beginning of 01 January, 1970 UTC is represented by the time value +0.
NOTE
The 400 year cycle of the Gregorian calendar contains 97 leap years. This yields an average of 365.2425 days per year, or an
average of 31,556,952,000 milliseconds per year under the Gregorian calendar. ECMAScript applies a proleptic Gregorian
calendar for all time computations.
As specified by this section, the maximum year range a Number can represent exactly with millisecond precision is
approximately -285,426 to 285,426 years relative to midnight at the beginning of 01 January, 1970 UTC.
As specified by this section, the maximum year range a time value can represent is approximately -273,790 to 273,790 years
relative to midnight at the beginning of 01 January, 1970 UTC.
msPerDay = 86400000
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 y is therefore defined by
DaysInYear(y)
= 365 if (y modulo 4) ≠ 0
= 366 if (y modulo 4) = 0 and (y modulo 100) ≠ 0
= 365 if (y modulo 100) = 0 and (y modulo 400) ≠ 0
= 366 if (y 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 y is given by:
DayFromYear(y) = 365 × (y - 1970) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400)
YearFromTime(t) = the largest integer y (closest to positive infinity) such that TimeFromYear(y) ≤ t
The leap-year function is 1 for a time within a leap year and otherwise is zero:
InLeapYear(t)
= 0 if DaysInYear(YearFromTime(t)) = 365
= 1 if DaysInYear(YearFromTime(t)) = 366
Months are identified by an integer in the range 0 to 11, inclusive. The mapping MonthFromTime(t) from a time value t to a
month number is defined by:
where
A month value of 0 specifies January; 1 specifies February; 2 specifies March; 3 specifies April; 4 specifies May; 5 specifies
June; 6 specifies July; 7 specifies August; 8 specifies September; 9 specifies October; 10 specifies November; and 11 specifies
December. Note that MonthFromTime(0) = 0, corresponding to Thursday, 01 January, 1970.
DateFromTime(t)
= DayWithinYear(t) + 1 if MonthFromTime(t) = 0
= DayWithinYear(t) - 30 if MonthFromTime(t) = 1
= DayWithinYear(t) - 58 - InLeapYear(t) if MonthFromTime(t) = 2
= DayWithinYear(t) - 89 - InLeapYear(t) if MonthFromTime(t) = 3
= DayWithinYear(t) - 119 - InLeapYear(t) if MonthFromTime(t) = 4
= DayWithinYear(t) - 150 - InLeapYear(t) if MonthFromTime(t) = 5
= DayWithinYear(t) - 180 - InLeapYear(t) if MonthFromTime(t) = 6
= DayWithinYear(t) - 211 - InLeapYear(t) if MonthFromTime(t) = 7
= DayWithinYear(t) - 242 - InLeapYear(t) if MonthFromTime(t) = 8
= DayWithinYear(t) - 272 - InLeapYear(t) if MonthFromTime(t) = 9
= DayWithinYear(t) - 303 - InLeapYear(t) if MonthFromTime(t) = 10
= DayWithinYear(t) - 333 - InLeapYear(t) if MonthFromTime(t) = 11
When isUTC is true, LocalTZA( t, true ) should return the offset of the local time zone from UTC measured in milliseconds at
time represented by time value t (UTC). When the result is added to t (UTC), it should yield the local time.
When isUTC is false, LocalTZA( t, false ) should return the offset of the local time zone from UTC measured in milliseconds at
local time represented by time value tlocal = t. When the result is subtracted from the local time tlocal, it should yield the
corresponding UTC.
When tlocal represents local time repeating multiple times at a negative time zone transition (e.g. when the daylight saving
time ends or the time zone adjustment is decreased due to a time zone rule change) or skipped local time at a positive time
zone transitions (e.g. when the daylight saving time starts or the time zone adjustment is increased due to a time zone rule
change), tlocal must be interpreted with the time zone adjustment before the transition.
If an implementation does not support a conversion described above or if political rules for time t are not available within the
implementation, the result must be 0.
NOTE
It is recommended that implementations use the time zone information of the IANA Time Zone Database
https://www.iana.org/time-zones/.
1:30 AM on November 5, 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. LocalTZA(TimeClip(MakeDate(MakeDay(2017, 10, 5), MakeTime(1, 30, 0, 0))), false) is -4
× msPerHour.
2:30 AM on March 12, 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). LocalTZA(TimeClip(MakeDate(MakeDay(2017, 2, 12), MakeTime(2, 30, 0, 0))), false) is -5 × msPerHour.
20.3.1.8 LocalTime ( t )
The abstract operation LocalTime with argument t converts t from UTC to local time by performing the following steps:
NOTE
Two different time values (t (UTC)) are converted to the same local time tlocal 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.).
20.3.1.9 UTC ( t )
The abstract operation UTC with argument t converts t from local time to UTC. It performs the following steps:
468 © Ecma International 2019
1. Return t - LocalTZA(t, false).
NOTE
UTC(LocalTime(t)) is not necessarily always equal to t. LocalTime(UTC(tlocal)) is not necessarily always equal to tlocal, either.
where
HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond = 1000
msPerMinute = 60000 = msPerSecond × SecondsPerMinute
msPerHour = 3600000 = msPerMinute × MinutesPerHour
1. If hour is not finite or min is not finite or sec is not finite or ms is not finite, return NaN.
2. Let h be ! ToInteger(hour).
3. Let m be ! ToInteger(min).
4. Let s be ! ToInteger(sec).
5. Let milli be ! ToInteger(ms).
6. Let t be h * msPerHour + m * msPerMinute + s * msPerSecond + milli, performing the arithmetic according to IEEE 754-
2008 rules (that is, as if using the ECMAScript operators * and +).
7. Return t.
1. If year is not finite or month is not finite or date is not finite, return NaN.
2. Let y be ! ToInteger(year).
3. Let m be ! ToInteger(month).
4. Let dt be ! ToInteger(date).
5. Let ym be y + floor(m / 12).
© Ecma International 2019 469
6. Let mn be m modulo 12.
7. Find a value t such that YearFromTime(t) is ym and MonthFromTime(t) is mn and DateFromTime(t) is 1; but if this is not
possible (because some argument is out of range), return NaN.
8. Return Day(t) + dt - 1.
NOTE
The point of step 4 is that an implementation is permitted a choice of internal representations of time values, for example as a
64-bit signed integer or as a 64-bit floating-point value. Depending on the implementation, this internal representation may or
may not distinguish -0 and +0.
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
YYYY is the decimal digits of the year 0000 to 9999 in the proleptic Gregorian calendar.
- "-" (hyphen) appears literally twice in the string.
MM is the month of the year from 01 (January) to 12 (December).
DD is the day of the month from 01 to 31.
T "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.
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 time zone offset appended:
THH:mm
THH:mm:ss
THH:mm:ss.sss
All numbers must be base 10. If the MM or DD fields are absent "01" is used as the value. If the HH, mm, or ss fields are absent
"00" is used as the value and the value of an absent sss field is "000". When the time zone offset is absent, date-only forms
are interpreted as a UTC time and date-time forms are interpreted as a local time.
A string containing out-of-bounds or nonconforming fields 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.
Covering the full time value range of approximately 273,790 years forward or backward from 01 January, 1970 (20.3.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 hence
prefixed with a + sign. 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 behavior or heuristics.
When the Date function is called, the following steps are taken:
When the Date function is called, the following steps are taken:
20.3.2.3 Date ( )
This description applies only if the Date constructor is called with no arguments.
When the Date function is called, the following steps are taken:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
20.3.3.1 Date.now ( )
The now function returns a Number value that is the time value designating the UTC date and time of the occurrence of the call
to now.
The parse function applies the ToString operator to its argument. If ToString results in an abrupt completion the Completion
Record is immediately returned. Otherwise, parse 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 (20.3.1.15), 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 field values shall cause Date.parse to return NaN.
If x is any Date object 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())
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
Date.parse is implementation-dependent when given any String value that does not conform to the Date Time String Format
(20.3.1.15) and that could not be produced in that implementation by the toString or toUTCString method.
20.3.3.3 Date.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
474 © Ecma International 2019
20.3.3.4 Date.UTC ( year [ , month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] ] )
When the UTC function is called, the following steps are taken:
1. Let y be ? ToNumber(year).
2. If month is present, let m be ? ToNumber(month); else let m be 0.
3. If date is present, let dt be ? ToNumber(date); else let dt be 1.
4. If hours is present, let h be ? ToNumber(hours); else let h be 0.
5. If minutes is present, let min be ? ToNumber(minutes); else let min be 0.
6. If seconds is present, let s be ? ToNumber(seconds); else let s be 0.
7. If ms is present, let milli be ? ToNumber(ms); else let milli be 0.
8. If y is NaN, let yr be NaN.
9. Else,
a. Let yi be ! ToInteger(y).
b. If 0 ≤ yi ≤ 99, let yr be 1900 + yi; otherwise, let yr be y.
10. Return TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))).
NOTE
The UTC function differs from the Date constructor in two ways: it returns a time value as a Number, rather than creating a
Date object, and it interprets the arguments in UTC rather than as local time.
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.
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.
20.3.4.1 Date.prototype.constructor
© Ecma International 2019 475
The initial value of Date.prototype.constructor is the intrinsic object %Date%.
20.3.4.2 Date.prototype.getDate ( )
The following steps are performed:
20.3.4.3 Date.prototype.getDay ( )
The following steps are performed:
20.3.4.4 Date.prototype.getFullYear ( )
The following steps are performed:
20.3.4.5 Date.prototype.getHours ( )
The following steps are performed:
20.3.4.6 Date.prototype.getMilliseconds ( )
The following steps are performed:
20.3.4.7 Date.prototype.getMinutes ( )
The following steps are performed:
20.3.4.8 Date.prototype.getMonth ( )
The following steps are performed:
20.3.4.9 Date.prototype.getSeconds ( )
The following steps are performed:
20.3.4.10 Date.prototype.getTime ( )
The following steps are performed:
20.3.4.11 Date.prototype.getTimezoneOffset ( )
The following steps are performed:
20.3.4.12 Date.prototype.getUTCDate ( )
The following steps are performed:
20.3.4.13 Date.prototype.getUTCDay ( )
The following steps are performed:
20.3.4.14 Date.prototype.getUTCFullYear ( )
The following steps are performed:
20.3.4.15 Date.prototype.getUTCHours ( )
The following steps are performed:
20.3.4.16 Date.prototype.getUTCMilliseconds ( )
The following steps are performed:
20.3.4.17 Date.prototype.getUTCMinutes ( )
The following steps are performed:
20.3.4.18 Date.prototype.getUTCMonth ( )
The following steps are performed:
20.3.4.19 Date.prototype.getUTCSeconds ( )
The following steps are performed:
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().
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().
20.3.4.23 Date.prototype.setMilliseconds ( ms )
The following steps are performed:
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().
NOTE
If date is not present, this method behaves as if date was present with the value getDate().
NOTE
If ms is not present, this method behaves as if ms was present with the value getMilliseconds().
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().
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().
20.3.4.31 Date.prototype.setUTCMilliseconds ( ms )
NOTE
If sec is not present, this method behaves as if sec was present with the value getUTCSeconds(). If ms is not present, it
function behaves as if ms was present with the value return by getUTCMilliseconds().
NOTE
If date is not present, this method behaves as if date was present with the value getUTCDate().
NOTE
If ms is not present, this method behaves as if ms was present with the value getUTCMilliseconds().
20.3.4.35 Date.prototype.toDateString ( )
The following steps are performed:
20.3.4.36 Date.prototype.toISOString ( )
This function returns a String value representing the instance in time corresponding to this time value. The format of the
String is the Date Time string format defined in 20.3.1.15. All fields are present in the String. The time zone is always UTC,
denoted by the suffix Z. If this time value is not a finite Number or if the year is not a value that can be represented in that
format (if necessary using expanded year format), a RangeError exception is thrown.
When the toJSON method is called with argument key, the following steps are taken:
NOTE 1
The argument is ignored.
484 © Ecma International 2019
NOTE 2
The toJSON function is intentionally generic; it does not require that its this value be a Date object. 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.
This function returns a String value. The contents of the String are implementation-dependent, 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.
This function returns a String value. The contents of the String are implementation-dependent, 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.
This function returns a String value. The contents of the String are implementation-dependent, 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.
20.3.4.41 Date.prototype.toString ( )
The following steps are performed:
© Ecma International 2019 485
1. Let tv be ? thisTimeValue(this value).
2. Return ToDateString(tv).
NOTE 1
For any Date object d whose milliseconds amount is zero, the result of Date.parse(d.toString()) is equal to
d.valueOf(). See 20.3.3.2.
NOTE 2
The toString function is not generic; it throws a TypeError exception if its this value is not a Date object. Therefore, it
cannot be transferred to other kinds of objects for use as a method.
0 "Sun"
1 "Mon"
2 "Tue"
4 "Thu"
5 "Fri"
6 "Sat"
0 "Jan"
1 "Feb"
2 "Mar"
3 "Apr"
4 "May"
5 "Jun"
6 "Jul"
7 "Aug"
8 "Sep"
9 "Oct"
10 "Nov"
11 "Dec"
20.3.4.42 Date.prototype.toTimeString ( )
The following steps are performed:
20.3.4.43 Date.prototype.toUTCString ( )
The following steps are performed:
20.3.4.44 Date.prototype.valueOf ( )
The following steps are performed:
When the @@toPrimitive method is called with argument hint, the following steps are taken:
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
21 Text Processing
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
The String.fromCharCode function may be called with any number of arguments which form the rest parameter codeUnits.
The following steps are taken:
The String.fromCodePoint function may be called with any number of arguments which form the rest parameter
codePoints. The following steps are taken:
21.1.2.3 String.prototype
The initial value of String.prototype is the intrinsic object %StringPrototype%.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
1. Let substitutions be a List consisting of all of the arguments passed to this function, starting with the second argument. If
fewer than two arguments were passed, the List is empty.
2. Let numberOfSubstitutions be the number of elements in substitutions.
3. Let cooked be ? ToObject(template).
4. Let raw be ? ToObject(? Get(cooked, "raw")).
5. Let literalSegments be ? ToLength(? Get(raw, "length")).
6. If literalSegments ≤ 0, return the empty string.
7. Let stringElements be a new empty List.
8. Let nextIndex be 0.
9. Repeat,
a. Let nextKey be ! ToString(nextIndex).
b. Let nextSeg be ? ToString(? Get(raw, nextKey)).
c. Append in order the code unit elements of nextSeg to the end of stringElements.
d. If nextIndex + 1 = literalSegments, then
i. Return the String value whose code units are, in order, the elements in the List stringElements. If stringElements
has no elements, the empty string is returned.
e. If nextIndex < numberOfSubstitutions, let next be substitutions[nextIndex].
f. Else, let next be the empty String.
g. Let nextSub be ? ToString(next).
h. Append in order the code unit elements of nextSub to the end of stringElements.
i. Increase nextIndex by 1.
NOTE
String.raw is intended for use as a tag function of a Tagged Template (12.3.7). When called as such, the first argument will be a
well formed template object and the rest parameter will contain the substitution values.
© Ecma International 2019 491
21.1.3 Properties of the String Prototype Object
The String prototype object:
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.
If pos is a value of Number type that is an integer, then the result of x.charAt(pos) is equal to the result of
x.substring(pos, pos + 1).
When the charAt method is called with one argument pos, the following steps are taken:
NOTE 2
The charAt function 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.
When the charCodeAt method is called with one argument pos, the following steps are taken:
NOTE 2
The charCodeAt function 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.
When the codePointAt method is called with one argument pos, the following steps are taken:
NOTE 2
The codePointAt function 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
The concat function 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.
21.1.3.5 String.prototype.constructor
The initial value of String.prototype.constructor is the intrinsic object %String%.
NOTE 1
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 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
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, return true; otherwise, 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
The includes function 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.
The indexOf method takes two arguments, searchString and position, and performs the following steps:
NOTE 2
The indexOf function 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.
The lastIndexOf method takes two arguments, searchString and position, and performs the following steps:
NOTE 2
The lastIndexOf function 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.
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the localeCompare
method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the
following specification of the localeCompare method is used.
When the localeCompare method is called with argument that, it returns a Number other than NaN that represents the result
of a locale-sensitive String comparison of the this value (converted to a String) with that (converted to a String). The two
Strings are S and That. The two Strings are compared in an implementation-defined fashion. The result is intended to order
496 © Ecma International 2019
String values in the sort order specified by a host default locale, and will be negative, zero, or positive, depending on whether S
comes before That in the sort order, the Strings are equal, or S comes after That in the sort order, respectively.
Before performing the comparisons, the following steps are performed to prepare the Strings:
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 localeCompare method, if considered as a function of two arguments this and that, is a consistent comparison function
(as defined in 22.1.3.27) on the set of all Strings.
The actual return values are implementation-defined to permit implementers to encode additional information in the value,
but the function is required to define a total ordering on all Strings. This function must treat Strings that are canonically
equivalent according to the Unicode standard as identical and must return 0 when comparing Strings that are considered
canonically equivalent.
NOTE 1
The localeCompare 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 function is intended to rely on whatever language-sensitive comparison functionality is available to the ECMAScript
environment from the host environment, and to compare according to the rules of the host environment's current locale.
However, regardless of the host provided comparison capabilities, this function must treat Strings that are canonically
equivalent according to the Unicode standard as identical. It is recommended that this function should not honour Unicode
compatibility equivalences or decompositions. 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
(https://unicode.org/reports/tr15/) and Unicode Technical Note #5, Canonical Equivalence in Applications
(https://www.unicode.org/notes/tn5/). Also see Unicode Technical Standard #10, Unicode Collation Algorithm
(https://unicode.org/reports/tr10/).
NOTE 3
The localeCompare function 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
The match function 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
The normalize function 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.
When the padEnd method is called, the following steps are taken:
NOTE 1
The first argument maxLength will be clamped such that it can be no smaller than the length of the this value.
NOTE 2
The optional second argument fillString defaults to " " (the String value consisting of the code unit 0x0020 SPACE).
When the padStart method is called, the following steps are taken:
NOTE 1
The first argument maxLength will be clamped such that it can be no smaller than the length of the this value.
NOTE 2
The optional second argument fillString defaults to " " (the String value consisting of the code unit 0x0020 SPACE).
NOTE 1
This method creates the String value consisting of the code units of the this object (converted to String) repeated count
times.
NOTE 2
The repeat function 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.
When the replace method is called with arguments searchValue and replaceValue, the following steps are taken:
NOTE
The replace function 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.
21.1.3.16.1 Runtime Semantics: GetSubstitution ( matched, str, position, captures, namedCaptures, replacement )
0x0024, $$ $
0x0024
0x0024, $` If position is 0, the replacement is the empty String. Otherwise the replacement is the
0x0060 substring of str that starts at index 0 and whose last code unit is at index position - 1.
0x0024, $' If tailPos ≥ stringLength, the replacement is the empty String. Otherwise the
0x0027 replacement is the substring of str that starts at index tailPos and continues to the
end of str.
0x0024, $n where The nth element of captures, where n is a single digit in the range 1 to 9. If n ≤ m and
N n is one of the nth element of captures is undefined, use the empty String instead. If n > m, no
Where 1 2 3 4 5 6 7 8 9 and replacement is done.
0x0031 $n is not followed by a
≤N≤ decimal digit
0x0039
0x0024, $nn where The nnth element of captures, where nn is a two-digit decimal number in the range 01
N, N n is one of to 99. If nn ≤ m and the nnth element of captures is undefined, use the empty String
Where 0 1 2 3 4 5 6 7 8 9 instead. If nn is 00 or nn > m, no replacement is done.
0x0030
≤N≤
0x0039
0x0024, $< 1. If namedCaptures is undefined, the replacement text is the String "$<".
0x003C 2. Else,
a. Scan until the next > U+003E (GREATER-THAN SIGN).
b. If none is found, the replacement text is the String "$<".
c. Else,
i. Let groupName be the enclosed substring.
ii. Let capture be ? Get(namedCaptures, groupName).
iii. If capture is undefined, replace the text through > with the empty
string.
iv. Otherwise, replace the text through > with ? ToString(capture).
When the search method is called with argument regexp, the following steps are taken:
NOTE
The search function 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.
The slice method takes two arguments, start and end, and 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. The following steps are taken:
NOTE
The slice function 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.
Returns an Array object 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
substring 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.
When the split method is called, the following steps are taken:
502 © Ecma International 2019
1. Let O 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, « O, limit »).
3. Let S be ? ToString(O).
4. Let A be ! ArrayCreate(0).
5. Let lengthA be 0.
6. If limit is undefined, let lim be 232 - 1; else let lim be ? ToUint32(limit).
7. Let s be the length of S.
8. Let p be 0.
9. Let R be ? ToString(separator).
10. If lim = 0, return A.
11. If separator is undefined, then
a. Perform ! CreateDataProperty(A, "0", S).
b. Return A.
12. If s = 0, then
a. Let z be SplitMatch(S, 0, R).
b. If z is not false, return A.
c. Perform ! CreateDataProperty(A, "0", S).
d. Return A.
13. Let q be p.
14. Repeat, while q ≠ s
a. Let e be SplitMatch(S, q, R).
b. If e is false, increase q by 1.
c. Else e is an integer index ≤ s,
i. If e = p, increase q by 1.
ii. Else e ≠ p,
1. Let T be the String value equal to the substring of S consisting of the code units at indices p (inclusive)
through q (exclusive).
2. Perform ! CreateDataProperty(A, ! ToString(lengthA), T).
3. Increment lengthA by 1.
4. If lengthA = lim, return A.
5. Set p to e.
6. Set q to p.
15. Let T be the String value equal to the substring of S consisting of the code units at indices p (inclusive) through s
(exclusive).
16. Perform ! CreateDataProperty(A, ! ToString(lengthA), T).
17. Return A.
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.
© Ecma International 2019 503
If the this object 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
The split function 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.
The abstract operation SplitMatch takes three parameters, a String S, an integer q, and a String R, and performs the following
steps in order to return either false or the end index of a match:
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 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
If either argument is NaN or negative, it is replaced with zero; if either argument is larger than the length of the String, it is
replaced with the length of the String.
NOTE
The substring function 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.
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the
toLocaleLowerCase method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include
the ECMA-402 API the following specification of the toLocaleLowerCase method is used.
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in 6.1.4.
This function works exactly the same as toLowerCase except that its result is intended to yield the correct result for the host
environment's current locale, rather than a locale-independent result. 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
NOTE
The toLocaleLowerCase function 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.
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in 6.1.4.
This function works exactly the same as toUpperCase except that its result is intended to yield the correct result for the host
environment's current locale, rather than a locale-independent result. 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
The toLocaleUpperCase function 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.
21.1.3.24 String.prototype.toLowerCase ( )
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in 6.1.4. The following steps
are taken:
The result must be derived according to the locale-insensitive case mappings in the Unicode Character Database (this
explicitly includes not only the UnicodeData.txt file, but also all locale-insensitive mappings in the SpecialCasings.txt file 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 functions are
not symmetrical. In other words, s.toUpperCase().toLowerCase() is not necessarily equal to s.toLowerCase().
NOTE 2
21.1.3.25 String.prototype.toString ( )
When the toString method is called, the following steps are taken:
NOTE
For a String object, the toString method happens to return the same thing as the valueOf method.
21.1.3.26 String.prototype.toUpperCase ( )
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in 6.1.4.
This function 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
The toUpperCase function 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.
21.1.3.27 String.prototype.trim ( )
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in 6.1.4.
NOTE
The trim function 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.
The abstract operation TrimString is called with arguments string and where, and interprets the String value string as a
sequence of UTF-16 encoded code points, as described in 6.1.4. It performs the following steps:
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.
21.1.3.28 String.prototype.trimEnd ( )
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in 6.1.4.
NOTE
The trimEnd function 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.
21.1.3.29 String.prototype.trimStart ( )
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in 6.1.4.
NOTE
The trimStart function 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.
21.1.3.30 String.prototype.valueOf ( )
When the valueOf method is called, the following steps are taken:
When the @@iterator method is called it returns an Iterator object (25.1.1.2) that iterates over the code points of a String
value, returning each code point as a String value. The following steps are taken:
String instances have a "length" property, and a set of enumerable properties with integer-indexed names.
21.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 }.
Several methods of String objects return Iterator objects. The abstract operation CreateStringIterator with argument string is
used to create such iterator objects. It performs the following steps:
21.1.5.2.1 %StringIteratorPrototype%.next ( )
The initial value of the @@toStringTag property is the String value "String Iterator".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
[[IteratedString]] The String value whose code units are being iterated.
[[StringIteratorNextIndex]] The integer index of the next string index to be examined by this iteration.
NOTE
The form and functionality of regular expressions is modelled after the regular expression facility in the Perl 5 programming
language.
21.2.1 Patterns
The RegExp constructor applies the following grammar to the input pattern String. An error occurs if the grammar cannot
Syntax
Pattern[U, N] ::
Disjunction[?U, ?N]
Disjunction[U, N] ::
Alternative[?U, ?N]
Alternative[?U, ?N] | Disjunction[?U, ?N]
Alternative[U, N] ::
[empty]
Alternative[?U, ?N] Term[?U, ?N]
Term[U, N] ::
Assertion[?U, ?N]
Atom[?U, ?N]
Atom[?U, ?N] Quantifier
Assertion[U, N] ::
^
$
\b
\B
( ? = Disjunction[?U, ?N] )
( ? ! Disjunction[?U, ?N] )
( ? <= Disjunction[?U, ?N] )
( ? <! Disjunction[?U, ?N] )
Quantifier ::
QuantifierPrefix
QuantifierPrefix ?
QuantifierPrefix ::
*
+
?
{ DecimalDigits }
{ DecimalDigits , }
{ DecimalDigits , DecimalDigits }
Atom[U, N] ::
PatternCharacter
SyntaxCharacter :: one of
^$\.*+?()[]{}|
PatternCharacter ::
SourceCharacter but not SyntaxCharacter
AtomEscape[U, N] ::
DecimalEscape
CharacterClassEscape[?U]
CharacterEscape[?U]
[+N] k GroupName[?U]
CharacterEscape[U] ::
ControlEscape
c ControlLetter
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
RegExpUnicodeEscapeSequence[?U]
IdentityEscape[?U]
ControlEscape :: one of
fnrtv
ControlLetter :: one of
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
GroupSpecifier[U] ::
[empty]
? GroupName[?U]
GroupName[U] ::
< RegExpIdentifierName[?U] >
RegExpIdentifierName[U] ::
RegExpIdentifierStart[?U]
RegExpIdentifierName[?U] RegExpIdentifierPart[?U]
RegExpIdentifierStart[U] ::
UnicodeIDStart
512 © Ecma International 2019
$
_
\ RegExpUnicodeEscapeSequence[?U]
RegExpIdentifierPart[U] ::
UnicodeIDContinue
$
\ RegExpUnicodeEscapeSequence[?U]
<ZWNJ>
<ZWJ>
RegExpUnicodeEscapeSequence[U] ::
[+U] u LeadSurrogate \u TrailSurrogate
[+U] u LeadSurrogate
[+U] u TrailSurrogate
[+U] u NonSurrogate
[~U] u Hex4Digits
[+U] u{ CodePoint }
Each \u TrailSurrogate for which the choice of associated u LeadSurrogate is ambiguous shall be associated with the nearest
possible u LeadSurrogate that would otherwise have no corresponding \u TrailSurrogate.
LeadSurrogate ::
Hex4Digits but only if the SV of Hex4Digits is in the inclusive range 0xD800 to 0xDBFF
TrailSurrogate ::
Hex4Digits but only if the SV of Hex4Digits is in the inclusive range 0xDC00 to 0xDFFF
NonSurrogate ::
Hex4Digits but only if the SV of Hex4Digits is not in the inclusive range 0xD800 to 0xDFFF
IdentityEscape[U] ::
[+U] SyntaxCharacter
[+U] /
DecimalEscape ::
NonZeroDigit DecimalDigitsopt [lookahead ∉ DecimalDigit]
CharacterClassEscape[U] ::
d
D
s
S
w
W
© Ecma International 2019 513
[+U] p{ UnicodePropertyValueExpression }
[+U] P{ UnicodePropertyValueExpression }
UnicodePropertyValueExpression ::
UnicodePropertyName = UnicodePropertyValue
LoneUnicodePropertyNameOrValue
UnicodePropertyName ::
UnicodePropertyNameCharacters
UnicodePropertyNameCharacters ::
UnicodePropertyNameCharacter UnicodePropertyNameCharactersopt
UnicodePropertyValue ::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue ::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters ::
UnicodePropertyValueCharacter UnicodePropertyValueCharactersopt
UnicodePropertyValueCharacter ::
UnicodePropertyNameCharacter
0
1
2
3
4
5
6
7
8
9
UnicodePropertyNameCharacter ::
ControlLetter
_
CharacterClass[U] ::
[ [lookahead ∉ { ^ }] ClassRanges[?U] ]
[ ^ ClassRanges[?U] ]
ClassRanges[U] ::
[empty]
NonemptyClassRanges[?U]
NonemptyClassRangesNoDash[U] ::
ClassAtom[?U]
ClassAtomNoDash[?U] NonemptyClassRangesNoDash[?U]
ClassAtomNoDash[?U] - ClassAtom[?U] ClassRanges[?U]
ClassAtom[U] ::
-
ClassAtomNoDash[?U]
ClassAtomNoDash[U] ::
SourceCharacter but not one of \ or ] or -
\ ClassEscape[?U]
ClassEscape[U] ::
b
[+U] -
CharacterClassEscape[?U]
CharacterEscape[?U]
It is a Syntax Error if the MV of the first DecimalDigits is larger than the MV of the second DecimalDigits.
AtomEscape :: k GroupName
It is a Syntax Error if the enclosing Pattern does not contain a GroupSpecifier with an enclosed RegExpIdentifierName
whose StringValue equals the StringValue of the RegExpIdentifierName of this production's GroupName.
AtomEscape :: DecimalEscape
RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence
It is a Syntax Error if SV(RegExpUnicodeEscapeSequence) is none of "$", or "_", or the UTF16Encoding of a code point
matched by the UnicodeIDStart lexical grammar production.
RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence
It is a Syntax Error if SV(RegExpUnicodeEscapeSequence) is none of "$", or "_", or the UTF16Encoding of either <ZWNJ>
or <ZWJ>, or the UTF16Encoding of a Unicode code point that would be matched by the UnicodeIDContinue lexical
grammar production.
It is a Syntax Error if the List of Unicode code points that is SourceText of UnicodePropertyName is not identical to a List of
Unicode code points that is a Unicode property name or property alias listed in the “Property name and aliases” column
of Table 54.
It is a Syntax Error if the List of Unicode code points that is SourceText of UnicodePropertyValue is not identical to a List of
Unicode code points that is a value or value alias for the Unicode property or property alias given by SourceText of
UnicodePropertyName listed in the “Property value and aliases” column of the corresponding tables Table 56 or Table 57.
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
It is a Syntax Error if the List of Unicode code points that is SourceText of LoneUnicodePropertyNameOrValue is not
identical to a List of Unicode code points that is a Unicode general category or general category alias listed in the
“Property value and aliases” column of Table 56, nor a binary property or binary property alias listed in the “Property
name and aliases” column of Table 55.
1. Return false.
ClassEscape :: CharacterClassEscape
1. Return true.
ClassEscape :: b
ClassEscape :: -
CharacterEscape :: ControlEscape
CharacterEscape :: c ControlLetter
© Ecma International 2019 517
1. Let ch be the code point matched by ControlLetter.
2. Let i be ch's code point value.
3. Return the remainder of dividing i by 32.
NOTE
\0 represents the <NUL> character and cannot be followed by a decimal digit.
CharacterEscape :: HexEscapeSequence
1. Return the numeric value of the code unit that is the SV of HexEscapeSequence.
RegExpUnicodeEscapeSequence :: u LeadSurrogate
RegExpUnicodeEscapeSequence :: u TrailSurrogate
RegExpUnicodeEscapeSequence :: u NonSurrogate
RegExpUnicodeEscapeSequence :: u Hex4Digits
RegExpUnicodeEscapeSequence :: u{ CodePoint }
LeadSurrogate :: Hex4Digits
TrailSurrogate :: Hex4Digits
NonSurrogate :: Hex4Digits
CharacterEscape :: IdentityEscape
1. Return the List, in source text order, of Unicode code points in the source text matched by this production.
RegExpIdentifierName[U] ::
RegExpIdentifierStart[?U]
RegExpIdentifierName[?U] RegExpIdentifierPart[?U]
1. Return the String value consisting of the sequence of code units corresponding to RegExpIdentifierName. In determining
the sequence any occurrences of \ RegExpUnicodeEscapeSequence are first replaced with the code point represented by
the RegExpUnicodeEscapeSequence and then the code points of the entire RegExpIdentifierName are converted to code
units by UTF16Encoding each code point.
A Pattern is either a BMP pattern or a Unicode pattern depending upon whether or not its associated flags contain a "u". 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 code 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
0x1D11E. 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 UTF16Decode must be used in
producing a List consisting of 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
© Ecma International 2019 519
requires that the result of pattern matching be as if such translations were performed.
21.2.2.1 Notation
Input is a List consisting of all of the characters, in order, of the String being matched by the regular expression pattern.
Each character is either a code unit or a code point, depending upon the kind of pattern involved. The notation Input[n]
means the nth character of Input, where n can range between 0 (inclusive) and InputLength (exclusive).
InputLength is the number of characters in Input.
NcapturingParens is the total number of left-capturing parentheses (i.e. the total number of Atom :: ( GroupSpecifier
Disjunction ) Parse Nodes) in the pattern. A left-capturing parenthesis is any ( pattern character that is matched by the (
terminal of the Atom :: ( GroupSpecifier Disjunction ) production.
DotAll is true if the RegExp object's [[OriginalFlags]] internal slot contains "s" and otherwise is false.
IgnoreCase is true if the RegExp object's [[OriginalFlags]] internal slot contains "i" and otherwise is false.
Multiline is true if the RegExp object's [[OriginalFlags]] internal slot contains "m" and otherwise is false.
Unicode is true if the RegExp object's [[OriginalFlags]] internal slot contains "u" and otherwise is false.
Furthermore, the descriptions below use the following internal data structures:
A CharSet is a mathematical set of characters, either code units or code points depending up the state of the Unicode flag.
“All characters” means either all code unit values or all code point values also depending upon the state of Unicode.
A State is an ordered pair (endIndex, captures) where endIndex is an integer and captures is a List of NcapturingParens
values. 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 nth element of captures is either a List that represents the value obtained by the nth set of capturing
parentheses or undefined if the nth 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.
A MatchResult is either a State or the special token failure that indicates that the match failed.
A Continuation procedure is an internal closure (i.e. an internal procedure with some arguments already bound to
values) that takes one State argument and returns a MatchResult result. If an internal closure references variables which
are bound in the function that creates the closure, the closure uses the values that these variables had at the time the
closure was created. The Continuation attempts to match the remaining portion (specified by the closure's already-
bound arguments) of the pattern against Input, starting at the intermediate state given by its State argument. If the match
succeeds, the Continuation returns the final State that it reached; if the match fails, the Continuation returns failure.
A Matcher procedure is an internal closure that takes two arguments — a State and a Continuation — and returns a
MatchResult result. A Matcher attempts to match a middle subpattern (specified by the closure's already-bound
arguments) of the pattern against Input, starting at the intermediate state given by its State argument. The Continuation
argument should be a closure that matches the rest of the pattern. After matching the subpattern of a pattern to obtain a
new State, the Matcher then calls Continuation on that new State to test if the rest of the pattern can match as well. If it
can, the Matcher returns the State returned by Continuation; if not, the Matcher may try different choices at its choice
points, repeatedly calling Continuation until it either succeeds or all possibilities have been exhausted.
An AssertionTester procedure is an internal closure that takes a State argument and returns a Boolean result. The
assertion tester tests a specific condition (specified by the closure's already-bound arguments) against the current place
in Input and returns true if the condition matched or false if not.
520 © Ecma International 2019
21.2.2.2 Pattern
NOTE
A Pattern evaluates (“compiles”) to an internal procedure value. RegExpBuiltinExec can then apply this procedure to a String
and an offset within the String to determine whether the pattern would match starting at exactly that offset within the String,
and, if it does match, what the values of the capturing parentheses would be. The algorithms in 21.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 internal procedure to find a match in a String cannot throw an exception (except for any host-defined
exceptions that can occur anywhere such as out-of-memory).
21.2.2.3 Disjunction
NOTE
The | regular expression operator separates two alternatives. The pattern first tries to match the left Alternative (followed by
/a|ab/.exec("abc")
/((a)|(ab))((c)|(bc))/.exec("abc")
and not
The order in which the two alternatives are tried is independent of the value of direction.
21.2.2.4 Alternative
With parameter direction.
1. Return a Matcher that takes two arguments, a State x and a Continuation c, and returns the result of calling c(x).
NOTE
Consecutive Terms try to simultaneously match consecutive portions of Input. When direction is equal to +1, 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
522 © Ecma International 2019
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 equal to -1, the evaluation order of Alternative and Term are reversed.
21.2.2.5 Term
With parameter direction.
1. Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following
steps when evaluated:
a. Evaluate Assertion to obtain an AssertionTester t.
b. Call t(x) and let r be the resulting Boolean value.
c. If r is false, return failure.
d. Call c(x) and return its result.
NOTE
The AssertionTester is independent of direction.
1. Return the Matcher that is the result of evaluating Atom with argument direction.
The abstract operation RepeatMatcher takes eight parameters, a Matcher m, an integer min, an integer (or ∞) max, a Boolean
greedy, a State x, a Continuation c, an integer parenIndex, and an integer parenCount, and performs the following steps:
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 (nth) 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]{2,4}/.exec("abcdefghi")
/a[a-z]{2,4}?/.exec("abcdefghi")
Consider also
/(aa|aabaac|ba|b|c)*/.exec("aabaac")
["aaba", "ba"]
["aabaac", "aabaac"]
524 © Ecma International 2019
["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")
/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")
and not
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 1 of the RepeatMatcher's d closure 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")
/(a*)b\1+/.exec("baaaac")
["b", ""]
21.2.2.6 Assertion
The production Assertion :: ^ evaluates as follows:
1. Return an internal AssertionTester closure that takes a State argument x and performs the following steps when
evaluated:
a. Let e be x's endIndex.
b. If e is zero, return true.
c. If Multiline is false, return false.
d. If the character Input[e - 1] is one of LineTerminator, return true.
NOTE
Even when the y flag is used with a pattern, ^ always matches only at the beginning of Input, or (if Multiline is true) at the
beginning of a line.
1. Return an internal AssertionTester closure that takes a State argument x and performs the following steps when
evaluated:
a. Let e be x's endIndex.
b. If e is equal to InputLength, return true.
c. If Multiline is false, return false.
d. If the character Input[e] is one of LineTerminator, return true.
e. Return false.
1. Return an internal AssertionTester closure that takes a State argument x and performs the following steps when
evaluated:
a. Let e be x's endIndex.
b. Call IsWordChar(e - 1) and let a be the Boolean result.
c. Call IsWordChar(e) and let b be the Boolean result.
d. If a is true and b is false, return true.
e. If a is false and b is true, return true.
f. Return false.
1. Return an internal AssertionTester closure that takes a State argument x and performs the following steps when
evaluated:
a. Let e be x's endIndex.
b. Call IsWordChar(e - 1) and let a be the Boolean result.
c. Call IsWordChar(e) and let b be the Boolean result.
d. If a is true and b is false, return false.
e. If a is false and b is true, return false.
f. Return true.
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
The abstract operation IsWordChar takes an integer parameter e and performs the following steps:
21.2.2.7 Quantifier
The production Quantifier :: QuantifierPrefix evaluates as follows:
1. Evaluate QuantifierPrefix to obtain the two results: an integer min and an integer (or ∞) max.
2. Return the three results min, max, and true.
1. Evaluate QuantifierPrefix to obtain the two results: an integer min and an integer (or ∞) max.
2. Return the three results min, max, and false.
21.2.2.8 Atom
With parameter direction.
1. Return the Matcher that is the result of evaluating AtomEscape with argument direction.
1. Return the Matcher that is the result of evaluating Disjunction with argument direction.
The abstract operation CharacterSetMatcher takes three arguments, a CharSet A, a Boolean flag invert, and an integer direction,
and performs the following steps:
1. Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following
steps when evaluated:
a. Let e be x's endIndex.
b. Let f be e + direction.
c. If f < 0 or f > InputLength, return failure.
d. Let index be min(e, f).
e. Let ch be the character Input[index].
f. Let cc be Canonicalize(ch).
g. If invert is false, then
i. If there does not exist a member a of set A such that Canonicalize(a) is cc, return failure.
h. Else,
i. Assert: invert is true.
ii. If there exists a member a of set A such that Canonicalize(a) is cc, return failure.
i. Let cap be x's captures List.
j. Let y be the State (f, cap).
k. Call c(y) and return its result.
The abstract operation Canonicalize takes a character parameter ch and performs the following steps:
NOTE 1
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 nonzero decimal number), referenced
in a replace String, or returned as part of an array from the regular expression matching internal procedure. To inhibit the
capturing behaviour of parentheses, use the form (?: Disjunction ) instead.
NOTE 2
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 b and therefore returns the array:
["", "aaa"]
/(?=(a+))a*b\1/.exec("baaabac")
["aba", "a"]
and not:
["aaaba", "a"]
NOTE 3
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
© Ecma International 2019 531
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(?!(a+)b\2c)\2(.*)/.exec("baaabaac")
looks for an a not immediately followed by some positive number n of a's, a b, another n a's (specified by the first \2) and a c.
The second \2 is outside the negative lookahead, so it matches against undefined and therefore always succeeds. The whole
expression returns the array:
NOTE 4
In case-insignificant matches when 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) to "SS". It may however map a code point outside the Basic Latin range
to a character within, for example, "ſ" (U+017F) to "s". Such characters are not mapped if Unicode is false. This prevents
Unicode code points such as U+017F and U+212A from matching regular expressions such as /[a-z]/i, but they will match
/[a-z]/ui.
The abstract operation UnicodeMatchProperty takes a parameter p that is a List of Unicode code points and performs the
following steps:
1. Assert: p is a List of Unicode code points that is identical to a List of Unicode code points that is a Unicode property name
or property alias listed in the “Property name and aliases” column of Table 54 or Table 55.
2. Let c be the canonical property name of p as given in the “Canonical property name” column of the corresponding row.
3. Return the List of Unicode code points of c.
Implementations must support the Unicode property names and aliases listed in Table 54 and Table 55. 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.
Table 54: 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
Table 55: 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
Default_Ignorable_Code_Point Default_Ignorable_Code_Point
DI
Deprecated Deprecated
Dep
Diacritic Diacritic
Dia
Emoji Emoji
Emoji_Component Emoji_Component
Emoji_Modifier Emoji_Modifier
Emoji_Modifier_Base Emoji_Modifier_Base
Emoji_Presentation Emoji_Presentation
Extended_Pictographic Extended_Pictographic
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
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
XID_Continue XID_Continue
XIDC
XID_Start XID_Start
XIDS
The abstract operation UnicodeMatchPropertyValue takes two parameters p and v, each of which is a List of Unicode code
points, and performs the following steps:
1. Assert: p is a List of Unicode code points that is identical to a List of Unicode code points that is a canonical, unaliased
Unicode property name listed in the “Canonical property name” column of Table 54.
2. Assert: v is a List of Unicode code points that is identical to a List of Unicode code points that is a property value or
property value alias for Unicode property p listed in the “Property value and aliases” column of Table 56 or Table 57.
3. Let value be the canonical property value of v as given in the “Canonical property value” column of the corresponding
row.
4. Return the List of Unicode code points of value.
Implementations must support the Unicode property value names and aliases listed in Table 56 and Table 57. To ensure
interoperability, implementations must not support any other property value names or 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.
Table 56: Value aliases and canonical values for the Unicode property General_Category
Property value and aliases Canonical property value
Cased_Letter Cased_Letter
LC
Close_Punctuation Close_Punctuation
Pe
Connector_Punctuation Connector_Punctuation
Pc
Control Control
Cc
cntrl
536 © Ecma International 2019
Currency_Symbol Currency_Symbol
Sc
Dash_Punctuation Dash_Punctuation
Pd
Decimal_Number Decimal_Number
Nd
digit
Enclosing_Mark Enclosing_Mark
Me
Final_Punctuation Final_Punctuation
Pf
Format Format
Cf
Initial_Punctuation Initial_Punctuation
Pi
Letter Letter
L
Letter_Number Letter_Number
Nl
Line_Separator Line_Separator
Zl
Lowercase_Letter Lowercase_Letter
Ll
Mark Mark
M
Combining_Mark
Math_Symbol Math_Symbol
Sm
Modifier_Letter Modifier_Letter
Lm
Nonspacing_Mark Nonspacing_Mark
Mn
Number Number
N
Open_Punctuation Open_Punctuation
Ps
Other Other
C
Other_Letter Other_Letter
Lo
Other_Number Other_Number
No
Other_Punctuation Other_Punctuation
Po
Other_Symbol Other_Symbol
So
Paragraph_Separator Paragraph_Separator
Zp
Private_Use Private_Use
Co
Punctuation Punctuation
P
punct
Separator Separator
Z
Space_Separator Space_Separator
Zs
Spacing_Mark Spacing_Mark
Surrogate Surrogate
Cs
Symbol Symbol
S
Titlecase_Letter Titlecase_Letter
Lt
Unassigned Unassigned
Cn
Uppercase_Letter Uppercase_Letter
Lu
Table 57: Value aliases and canonical values for the Unicode properties Script and Script_Extensions
Property value and aliases Canonical property value
Adlam Adlam
Adlm
Ahom Ahom
Ahom
Anatolian_Hieroglyphs Anatolian_Hieroglyphs
Hluw
Arabic Arabic
Arab
Armenian Armenian
Armn
Avestan Avestan
Avst
Balinese Balinese
Bali
Bamum Bamum
Bamu
Batak Batak
Batk
Bengali Bengali
Beng
Bhaiksuki Bhaiksuki
Bhks
Bopomofo Bopomofo
Bopo
Brahmi Brahmi
Brah
Braille Braille
Brai
Buginese Buginese
Bugi
Buhid Buhid
Buhd
Canadian_Aboriginal Canadian_Aboriginal
Cans
Carian Carian
Cari
Caucasian_Albanian Caucasian_Albanian
Aghb
Chakma Chakma
Cakm
Cham Cham
Cham
Cherokee Cherokee
Common Common
Zyyy
Coptic Coptic
Copt
Qaac
Cuneiform Cuneiform
Xsux
Cypriot Cypriot
Cprt
Cyrillic Cyrillic
Cyrl
Deseret Deseret
Dsrt
Devanagari Devanagari
Deva
Dogra Dogra
Dogr
Duployan Duployan
Dupl
Egyptian_Hieroglyphs Egyptian_Hieroglyphs
Egyp
Elbasan Elbasan
Elba
Ethiopic Ethiopic
Ethi
Georgian Georgian
Geor
Glagolitic Glagolitic
Glag
Grantha Grantha
Gran
Greek Greek
Grek
Gujarati Gujarati
Gujr
Gunjala_Gondi Gunjala_Gondi
Gong
Gurmukhi Gurmukhi
Guru
Han Han
Hani
Hangul Hangul
Hang
Hanifi_Rohingya Hanifi_Rohingya
Rohg
Hanunoo Hanunoo
Hano
Hatran Hatran
Hatr
Hebrew Hebrew
Hebr
Hiragana Hiragana
Hira
Imperial_Aramaic Imperial_Aramaic
Armi
Inherited Inherited
Zinh
542 © Ecma International 2019
Qaai
Inscriptional_Pahlavi Inscriptional_Pahlavi
Phli
Inscriptional_Parthian Inscriptional_Parthian
Prti
Javanese Javanese
Java
Kaithi Kaithi
Kthi
Kannada Kannada
Knda
Katakana Katakana
Kana
Kayah_Li Kayah_Li
Kali
Kharoshthi Kharoshthi
Khar
Khmer Khmer
Khmr
Khojki Khojki
Khoj
Khudawadi Khudawadi
Sind
Lao Lao
Laoo
Latin Latin
Latn
Lepcha Lepcha
Lepc
Linear_A Linear_A
Lina
Linear_B Linear_B
Linb
Lisu Lisu
Lisu
Lycian Lycian
Lyci
Lydian Lydian
Lydi
Mahajani Mahajani
Mahj
Makasar Makasar
Maka
Malayalam Malayalam
Mlym
Mandaic Mandaic
Mand
Manichaean Manichaean
Mani
Marchen Marchen
Marc
Medefaidrin Medefaidrin
Medf
Masaram_Gondi Masaram_Gondi
Gonm
Meetei_Mayek Meetei_Mayek
Mtei
Meroitic_Cursive Meroitic_Cursive
Merc
Meroitic_Hieroglyphs Meroitic_Hieroglyphs
Mero
Miao Miao
Plrd
Modi Modi
Modi
Mongolian Mongolian
Mong
Mro Mro
Mroo
Multani Multani
Mult
Myanmar Myanmar
Mymr
Nabataean Nabataean
Nbat
New_Tai_Lue New_Tai_Lue
Talu
Newa Newa
Newa
Nko Nko
Nkoo
Nushu Nushu
Nshu
Ogham
Ol_Chiki Ol_Chiki
Olck
Old_Hungarian Old_Hungarian
Hung
Old_Italic Old_Italic
Ital
Old_North_Arabian Old_North_Arabian
Narb
Old_Permic Old_Permic
Perm
Old_Persian Old_Persian
Xpeo
Old_Sogdian Old_Sogdian
Sogo
Old_South_Arabian Old_South_Arabian
Sarb
Old_Turkic Old_Turkic
Orkh
Oriya Oriya
Orya
Osage Osage
Osge
Osmanya Osmanya
Osma
Pahawh_Hmong Pahawh_Hmong
Hmng
Palmyrene Palmyrene
Palm
Phags_Pa Phags_Pa
Phag
Phoenician Phoenician
Phnx
Psalter_Pahlavi Psalter_Pahlavi
Phlp
Rejang Rejang
Rjng
Runic Runic
Runr
Samaritan Samaritan
Samr
Saurashtra Saurashtra
Saur
Sharada Sharada
Shrd
Shavian Shavian
Shaw
Siddham Siddham
Sidd
SignWriting SignWriting
Sgnw
Sinhala Sinhala
Sinh
Sogdian Sogdian
Sogd
Sora_Sompeng Sora_Sompeng
Sora
Sundanese Sundanese
Sund
Syloti_Nagri Syloti_Nagri
Sylo
Syriac Syriac
Syrc
Tagalog Tagalog
Tglg
Tagbanwa Tagbanwa
Tagb
Tai_Le Tai_Le
Tale
Tai_Tham Tai_Tham
Lana
Tai_Viet Tai_Viet
Tavt
Takri Takri
Takr
Tamil Tamil
Taml
Tangut Tangut
Tang
Telugu Telugu
Telu
Thaana Thaana
Thaa
Thai Thai
548 © Ecma International 2019
Thai
Tibetan Tibetan
Tibt
Tifinagh Tifinagh
Tfng
Tirhuta Tirhuta
Tirh
Ugaritic Ugaritic
Ugar
Vai Vai
Vaii
Warang_Citi Warang_Citi
Wara
Yi Yi
Yiii
Zanabazar_Square Zanabazar_Square
Zanb
21.2.2.9 AtomEscape
With parameter direction.
NOTE
An escape sequence of the form \ followed by a nonzero decimal number n matches the result of the nth set of capturing
parentheses (21.2.2.1). It is an error if the regular expression has fewer than n capturing parentheses. If the regular expression
has n or more capturing parentheses but the nth one is undefined because it has not captured anything, then the
backreference always succeeds.
1. Search the enclosing Pattern for an instance of a GroupSpecifier for a RegExpIdentifierName which has a StringValue equal
to the StringValue of the RegExpIdentifierName contained in GroupName.
2. Assert: A unique such GroupSpecifier is found.
3. Let parenIndex be the number of left-capturing parentheses in the entire regular expression that occur to the left of the
located GroupSpecifier. This is the total number of Atom :: ( GroupSpecifier Disjunction ) Parse Nodes prior to or
enclosing the located GroupSpecifier.
4. Call BackreferenceMatcher(parenIndex, direction) and return its Matcher result.
The abstract operation BackreferenceMatcher takes two arguments, an integer n and an integer direction, and performs the
following steps:
1. Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following
steps:
a. Let cap be x's captures List.
b. Let s be cap[n].
c. If s is undefined, return c(x).
d. Let e be x's endIndex.
e. Let len be the number of elements in s.
f.Let f be e + direction × len.
g. If f < 0 or f > InputLength, return failure.
h. Let g be min(e, f).
i.If there exists an integer i between 0 (inclusive) and len (exclusive) such that Canonicalize(s[i]) is not the same
character value as Canonicalize(Input[g + i]), return failure.
j. Let y be the State (f, cap).
k. Call c(y) and return its result.
21.2.2.10 CharacterEscape
The CharacterEscape productions evaluate as follows:
CharacterEscape ::
ControlEscape
c ControlLetter
0 [lookahead ∉ DecimalDigit]
21.2.2.11 DecimalEscape
The DecimalEscape productions evaluate as follows:
NOTE
If \ is followed by a decimal number n whose first digit is not 0, then the escape sequence is considered to be a backreference.
It is an error if n is greater than the total number of left-capturing parentheses in the entire regular expression.
21.2.2.12 CharacterClassEscape
1. Return the ten-element set of characters containing the characters 0 through 9 inclusive.
1. Return the set of all characters not included in the set returned by CharacterClassEscape :: d .
1. Return the set of characters containing the characters that are on the right-hand side of the WhiteSpace or LineTerminator
productions.
1. Return the set of all characters not included in the set returned by CharacterClassEscape :: s .
1. Return the set of all characters not included in the set returned by CharacterClassEscape :: w .
21.2.2.13 CharacterClass
The production CharacterClass :: [ ClassRanges ] evaluates as follows:
21.2.2.14 ClassRanges
The production ClassRanges :: [empty] evaluates as follows:
21.2.2.15 NonemptyClassRanges
552 © Ecma International 2019
The production NonemptyClassRanges :: ClassAtom evaluates as follows:
The abstract operation CharacterRange takes two CharSet parameters A and B and performs the following steps:
21.2.2.16 NonemptyClassRangesNoDash
The production NonemptyClassRangesNoDash :: ClassAtom evaluates as follows:
21.2.2.17 ClassAtom
The production ClassAtom :: - evaluates as follows:
21.2.2.18 ClassAtomNoDash
The production ClassAtomNoDash :: SourceCharacter but not one of \ or ] or - evaluates as follows:
21.2.2.19 ClassEscape
The ClassEscape productions evaluate as follows:
ClassEscape :: b
ClassEscape :: -
ClassEscape :: CharacterEscape
ClassEscape :: CharacterClassEscape
NOTE
If pattern is supplied using a StringLiteral, the usual escape sequence substitutions are performed before the String is
When the abstract operation RegExpAlloc with argument newTarget is called, the following steps are taken:
When the abstract operation RegExpInitialize with arguments obj, pattern, and flags is called, the following steps are taken:
When the abstract operation RegExpCreate with arguments P and F is called, the following steps are taken:
When the abstract operation EscapeRegExpPattern with arguments P and F is called, the following occurs:
1. Let S be a String in the form of a Pattern[~U] (Pattern[+U] if F contains "u") equivalent to P interpreted as UTF-16
encoded Unicode code points (6.1.4), in which certain code points are escaped as described below. S may or may not be
identical to P; however, the internal procedure that would result from evaluating S as a Pattern[~U] (Pattern[+U] if F
contains "u") must behave identically to the internal procedure given by the constructed object's [[RegExpMatcher]]
internal slot. Multiple calls to this abstract operation using the same values for P and F must produce identical results.
2. The code points / or any LineTerminator occurring in the pattern shall be escaped in S as necessary to ensure that the
string-concatenation of "/", S, "/", and F can be parsed (in an appropriate lexical context) as a RegularExpressionLiteral
that behaves identically to the constructed regular expression. For example, if P is "/", then S could be "\/" or
"\u002F", among other possibilities, but not "/", because /// followed by F would be parsed as a SingleLineComment
rather than a RegularExpressionLiteral. If P is the empty String, this specification can be met by letting S be "(?:)".
3. Return S.
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
21.2.4.1 RegExp.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
RegExp[@@species] is an accessor property whose set accessor function is undefined. Its get accessor function performs
the following steps:
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.
21.2.5.1 RegExp.prototype.constructor
The initial value of RegExp.prototype.constructor is the intrinsic object %RegExp%.
The String ToString(string) is searched for an occurrence of the regular expression pattern as follows:
The abstract operation RegExpExec with arguments R and S performs the following steps:
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.
The abstract operation RegExpBuiltinExec with arguments R and S performs the following steps:
The abstract operation AdvanceStringIndex with arguments S, index, and unicode performs the following steps:
RegExp.prototype.dotAll is an accessor property whose set accessor function is undefined. Its get accessor function
performs the following steps:
RegExp.prototype.flags is an accessor property whose set accessor function is undefined. Its get accessor function
performs the following steps:
RegExp.prototype.global is an accessor property whose set accessor function is undefined. Its get accessor function
performs the following steps:
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.
NOTE
The lastIndex and global properties of this RegExp object are ignored when performing the search. The lastIndex
property is left unchanged.
RegExp.prototype.source is an accessor property whose set accessor function is undefined. Its get accessor function
performs the following steps:
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 the 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<B>bold</B>and<CODE>coded</CODE>")
["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.
When the @@split method is called, the following steps are taken:
NOTE 2
The @@split method ignores the value of the global and sticky properties of this RegExp object.
21.2.5.14 RegExp.prototype.test ( S )
The following steps are taken:
21.2.5.15 RegExp.prototype.toString ( )
1. Let R be the this value.
2. If Type(R) is not Object, throw a TypeError exception.
3. Let pattern be ? ToString(? Get(R, "source")).
4. Let flags be ? ToString(? Get(R, "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.
RegExp.prototype.unicode is an accessor property whose set accessor function is undefined. Its get accessor function
performs the following steps:
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.
21.2.6.1 lastIndex
The value of the lastIndex property specifies the String index at which to start the next match. It is coerced to an integer
when used (see 21.2.5.2.2). This property shall have the attributes { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]:
false }.
22 Indexed Collections
22.1.1.1 Array ( )
This description applies if and only if the Array constructor is called with no arguments.
When the Array function is called, the following steps are taken:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
When the from method is called with argument items and optional arguments mapfn and thisArg, the following steps are
taken:
NOTE
The from function 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.
1. Return ? IsArray(arg).
22.1.2.4 Array.prototype
The value of Array.prototype is %ArrayPrototype%, the intrinsic Array prototype object.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
NOTE
Array prototype methods normally use their this object's constructor to create a derived object. However, a subclass
constructor may over-ride that default behaviour by redefining its @@species property.
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.
When the concat method is called with zero or more arguments, it returns an array containing the array elements of the
object followed by the array elements of each argument in order.
NOTE 1
The explicit setting of the "length" property in step 6 is necessary to ensure that its value is correct in situations where the
trailing elements of the result Array are not present.
NOTE 2
The concat function 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.
The abstract operation IsConcatSpreadable with argument O performs the following steps:
22.1.3.2 Array.prototype.constructor
574 © Ecma International 2019
The initial value of Array.prototype.constructor is the intrinsic object %Array%.
NOTE 1
The end argument is optional with the length of the this object as its default value. 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.
NOTE 2
The copyWithin function 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.
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.
When the every method is called with one or two arguments, the following steps are taken:
NOTE 1
The start and end arguments are optional with default values of 0 and the length of the this object. 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.
NOTE 2
The fill function 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.
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
© Ecma International 2019 577
and before being visited are not visited.
When the filter method is called with one or two arguments, the following steps are taken:
NOTE 2
The filter function 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.
NOTE 1
predicate should be a function that accepts three arguments and returns a value that is coercible to a Boolean value. find calls
predicate once for each element of the array, in ascending order, until it finds one where predicate returns true. If such an
element is found, find immediately returns that element value. Otherwise, find returns undefined.
If a thisArg parameter is provided, it will be used as the this value for each invocation of predicate. If it is not provided,
undefined is used instead.
predicate is called with three arguments: the value of the element, the index of the element, and the object being traversed.
find 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 by find is set before the first call to predicate. Elements that are appended to the array after
the call to find begins 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 find visits them.
NOTE 2
The find function 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.
If a thisArg parameter is provided, it will be used as the this value for each invocation of predicate. If it is not provided,
undefined is used instead.
predicate is called with three arguments: the value of the element, the index of the element, and the object being traversed.
findIndex 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 by findIndex is set before the first call to predicate. Elements that are appended to the array
after the call to findIndex begins 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 findIndex visits them.
When the findIndex method is called with one or two arguments, the following steps are taken:
NOTE 2
The findIndex function 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.
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.
When the forEach method is called with one or two arguments, the following steps are taken:
NOTE 2
The forEach function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be
© Ecma International 2019 581
transferred to other kinds of objects for use as a method.
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 negative, it is used as the offset from the end of
the array to compute fromIndex. If the computed index is less than 0, the whole array will be searched.
When the includes method is called, the following steps are taken:
NOTE 2
The includes function 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.
NOTE 3
The includes method intentionally differs from the similar indexOf method in two ways. First, it uses the SameValueZero
algorithm, instead of Strict Equality Comparison, allowing it to detect NaN array elements. Second, it does not skip missing
array elements, instead treating them as undefined.
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 negative, it is used as the offset from the end of the
array to compute fromIndex. If the computed index is less than 0, the whole array will be searched.
NOTE 2
The indexOf function 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.
The join method takes one argument, separator, and performs the following steps:
NOTE 2
The join function 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.
22.1.3.16 Array.prototype.keys ( )
The following steps are taken:
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 negative, it is used as the offset from
the end of the array to compute fromIndex. If the computed index is less than 0, -1 is returned.
When the lastIndexOf method is called with one or two arguments, the following steps are taken:
NOTE 2
The lastIndexOf function 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.
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.
When the map method is called with one or two arguments, the following steps are taken:
NOTE 2
The map function 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.
22.1.3.19 Array.prototype.pop ( )
NOTE 1
The last element of the array is removed from the array and returned.
When the pop method is called, the following steps are taken:
NOTE 2
The pop function 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.
When the push method is called with zero or more arguments, the following steps are taken:
NOTE 2
The push function 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.
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.
When the reduce method is called with one or two arguments, the following steps are taken:
NOTE 2
The reduce function 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.
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 equal to initialValue and currentValue will be equal to the last value in the array. If no initialValue was supplied, then
previousValue will be equal to the last value in the array and currentValue will be equal to 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.
When the reduceRight method is called with one or two arguments, the following steps are taken:
22.1.3.23 Array.prototype.reverse ( )
NOTE 1
The elements of the array are rearranged so as to reverse their order. The object is returned as the result of the call.
When the reverse method is called, the following steps are taken:
NOTE 2
The reverse function 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.
22.1.3.24 Array.prototype.shift ( )
NOTE 1
The first element of the array is removed from the array and returned.
© Ecma International 2019 589
When the shift method is called, the following steps are taken:
NOTE 2
The shift function 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.
NOTE 2
The explicit setting of the "length" property of the result Array in step 11 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
The slice function 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.
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.
When the some method is called with one or two arguments, the following steps are taken:
NOTE 2
The some function 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.
Upon entry, the following steps are performed to initialize evaluation of the sort function:
Within this specification of the sort method, an object, obj, is said to be sparse if the following algorithm returns true:
The sort order is the ordering, after completion of this function, of the integer-indexed property values of obj whose integer
indexes are less than len. The result of the sort function is then determined as follows:
If comparefn is not undefined and is not a consistent comparison function for the elements of this array (see below), the sort
order is implementation-defined. The sort order is also implementation-defined if comparefn is undefined and SortCompare
does not act as a consistent comparison function.
Let proto be obj.[[GetPrototypeOf]](). If proto is not null and there exists an integer j such that all of the conditions below are
satisfied then the sort order is implementation-defined:
obj is sparse
0 ≤ j < len
HasProperty(proto, ToString(j)) is true.
IsExtensible(obj) is false.
Any integer index property of obj whose name is a nonnegative integer less than len is a data property whose
[[Configurable]] attribute is false.
The sort order is also implementation-defined if any of the following conditions are true:
If obj is an exotic object (including Proxy exotic objects) whose behaviour for [[Get]], [[Set]], [[Delete]], and
[[GetOwnProperty]] is not the ordinary object implementation of these internal methods.
If any index property of obj whose name is a nonnegative integer less than len is an accessor property or is a data
property whose [[Writable]] attribute is false.
If comparefn is undefined and the application of ToString to any value passed as an argument to SortCompare modifies
obj or any object on obj's prototype chain.
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.
1. Perform an implementation-dependent sequence of calls to the [[Get]] and [[Set]] internal methods of obj, to the
DeletePropertyOrThrow and HasOwnProperty abstract operation with obj as the first argument, and to SortCompare
(described below), such that:
The property key argument for each call to [[Get]], [[Set]], HasOwnProperty, or DeletePropertyOrThrow is the string
representation of a nonnegative integer less than len.
The arguments for calls to SortCompare are values returned by a previous call to the [[Get]] internal method, unless
the properties accessed by those previous calls did not exist according to HasOwnProperty. If both prospective
arguments to SortCompare correspond to non-existent properties, use +0 instead of calling SortCompare. If only the
first prospective argument is non-existent use +1. If only the second prospective argument is non-existent use -1.
If obj is not sparse then DeletePropertyOrThrow must not be called.
If any [[Set]] call returns false a TypeError exception is thrown.
If an abrupt completion is returned from any of these operations, it is immediately returned as the value of this
function.
2. Return obj.
Unless the sort order is specified above to be implementation-defined, the returned object must have the following two
characteristics:
There must be some mathematical permutation π of the nonnegative integers less than len, such that for every
nonnegative integer j less than len, if property old[j] existed, then new[π(j)] is exactly the same value as old[j]. But if
property old[j] did not exist, then new[π(j)] does not exist.
Then for all nonnegative integers j and k, each less than len, if SortCompare(old[j], old[k]) < 0 (see SortCompare below),
then new[π(j)] < new[π(k)].
Here the notation old[j] is used to refer to the hypothetical result of calling obj.[[Get]](j) before this function is executed, and
the notation new[j] to refer to the hypothetical result of calling obj.[[Get]](j) after this function has been executed.
A function comparefn is a consistent comparison function for a set of values S if all of the requirements below are met for all
Calling comparefn(a, b) always returns the same value v when given a specific pair of values a and b as its two arguments.
Furthermore, Type(v) is Number, and v is not NaN. Note that this implies that exactly one of a <CF b, a =CF b, and a >CF b
will be true for a given pair of a and b.
Calling comparefn(a, b) does not modify obj or any object on obj's prototype chain.
a =CF a (reflexivity)
If a =CF b, then b =CF a (symmetry)
If a =CF b and b =CF c, then a =CF c (transitivity of =CF)
If a <CF b and b <CF c, then a <CF c (transitivity of <CF)
If a >CF b and b >CF c, then a >CF c (transitivity of >CF)
NOTE 1
The above conditions are necessary and sufficient to ensure that comparefn divides the set S into equivalence classes and that
these equivalence classes are totally ordered.
NOTE 2
The sort function 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.
The SortCompare abstract operation is called with two arguments x and y. It also has access to the comparefn argument passed
to the current invocation of the sort method. The following steps are taken:
NOTE 1
Because non-existent property values always compare greater than undefined property values, and undefined always
compares greater than any other value, undefined property values always sort to the end of the result, followed by non-
existent property values.
NOTE 2
NOTE 2
The explicit setting of the "length" property of the result Array in step 19 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
The splice function 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.
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.
NOTE 2
The elements of the array are converted to Strings using their toLocaleString methods, and these Strings are then
concatenated, separated by occurrences of a separator String that has been derived in an implementation-defined locale-
specific way. The result of calling this function is intended to be analogous to the result of toString, except that the result of
this function is intended to be locale-specific.
NOTE 3
The toLocaleString function 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.
22.1.3.30 Array.prototype.toString ( )
When the toString method is called, the following steps are taken:
NOTE
The toString function 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.
When the unshift method is called with zero or more arguments item1, item2, etc., the following steps are taken:
NOTE 2
The unshift function 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.
22.1.3.32 Array.prototype.values ( )
The initial value of the @@iterator property is the same function object as the initial value of the Array.prototype.values
property.
The initial value of the @@unscopables data property is an object created by the following steps:
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 object.
Array instances have a "length" property, and a set of enumerable properties with array index names.
22.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
© Ecma International 2019 599
the old and new length values. However, non-configurable properties can not be deleted. Attempting to set the "length"
property of an Array object 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 9.4.2.1.
22.1.5.2.1 %ArrayIteratorPrototype%.next ( )
The initial value of the @@toStringTag property is the String value "Array Iterator".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
[[ArrayIteratorNextIndex]] The integer index of the next integer index to be examined by this iteration.
[[ArrayIterationKind]] A String value that identifies what is returned for each element of the iteration. The possible
values are: "key", "value", "key+value".
In the definitions below, references to TypedArray should be replaced with the appropriate constructor name from the above
table. The phrase “the element size in bytes” refers to the value in the Element Size column of the table in the row
corresponding to the constructor. The phrase “element Type” refers to the value in the Element Type column for that row.
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.
22.2.1.1 %TypedArray% ( )
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has a name property whose value is "TypedArray".
has the following properties:
When the from method is called with argument source, and optional arguments mapfn and thisArg, the following steps are
taken:
NOTE
The items argument is assumed to be a well-formed rest argument value.
22.2.2.3 %TypedArray%.prototype
NOTE
%TypedArrayPrototype% methods normally use their this object's constructor to create a derived object. However, a
subclass constructor may over-ride that default behaviour by redefining its @@species property.
has a [[Prototype]] internal slot whose value is the intrinsic object %ObjectPrototype%.
is an ordinary object.
does not have a [[ViewedArrayBuffer]] or any other of the internal slots that are specific to TypedArray instance objects.
%TypedArray%.prototype.buffer is an accessor property whose set accessor function is undefined. Its get accessor
function performs the following steps:
%TypedArray%.prototype.byteLength is an accessor property whose set accessor function is undefined. Its get accessor
function performs the following steps:
22.2.3.4 %TypedArray%.prototype.constructor
The initial value of %TypedArray%.prototype.constructor is the %TypedArray% intrinsic object.
22.2.3.6 %TypedArray%.prototype.entries ( )
The following steps are taken:
This function 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.
The interpretation and use of the arguments of %TypedArray%.prototype.fill are the same as for
Array.prototype.fill as defined in 22.1.3.6.
The interpretation and use of the arguments of %TypedArray%.prototype.filter are the same as for
Array.prototype.filter as defined in 22.1.3.7.
When the filter method is called with one or two arguments, the following steps are taken:
This function is not generic. The this value must be an object with a [[TypedArrayName]] internal slot.
This function 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.
This function 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.
This function 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.
This function 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.
This function 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.
This function 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.
22.2.3.16 %TypedArray%.prototype.keys ( )
The following steps are taken:
This function is not generic. The this value must be an object with a [[TypedArrayName]] internal slot.
When the map method is called with one or two arguments, the following steps are taken:
This function is not generic. The this value must be an object with a [[TypedArrayName]] internal slot.
This function 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.
This function 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.
22.2.3.22 %TypedArray%.prototype.reverse ( )
%TypedArray%.prototype.reverse is a distinct function that implements the same algorithm as
Array.prototype.reverse as defined in 22.1.3.23 except that the this object'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 function 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.
This function is not generic. The this value must be an object with a [[TypedArrayName]] internal slot.
Sets multiple values in this TypedArray, reading the values from the object array. The optional offset value indicates the first
element index in this TypedArray where values are written. If omitted, it is assumed to be 0.
1. Assert: array is any ECMAScript language value other than an Object with a [[TypedArrayName]] internal slot. If it is such
an Object, the definition in 22.2.3.23.2 applies.
2. Let target be the this value.
612 © Ecma International 2019
3. If Type(target) is not Object, throw a TypeError exception.
4. If target does not have a [[TypedArrayName]] internal slot, throw a TypeError exception.
5. Assert: target has a [[ViewedArrayBuffer]] internal slot.
6. Let targetOffset be ? ToInteger(offset).
7. If targetOffset < 0, throw a RangeError exception.
8. Let targetBuffer be target.[[ViewedArrayBuffer]].
9. If IsDetachedBuffer(targetBuffer) is true, throw a TypeError exception.
10. Let targetLength be target.[[ArrayLength]].
11. Let targetName be the String value of target.[[TypedArrayName]].
12. Let targetElementSize be the Number value of the Element Size value specified in Table 59 for targetName.
13. Let targetType be the String value of the Element Type value in Table 59 for targetName.
14. Let targetByteOffset be target.[[ByteOffset]].
15. Let src be ? ToObject(array).
16. Let srcLength be ? ToLength(? Get(src, "length")).
17. If srcLength + targetOffset > targetLength, throw a RangeError exception.
18. Let targetByteIndex be targetOffset × targetElementSize + targetByteOffset.
19. Let k be 0.
20. Let limit be targetByteIndex + targetElementSize × srcLength.
21. Repeat, while targetByteIndex < limit
a. Let Pk be ! ToString(k).
b. Let kNumber be ? ToNumber(? Get(src, Pk)).
c. If IsDetachedBuffer(targetBuffer) is true, throw a TypeError exception.
d. Perform SetValueInBuffer(targetBuffer, targetByteIndex, targetType, kNumber, true, "Unordered").
e. Increase k by 1.
f. Set targetByteIndex to targetByteIndex + targetElementSize.
22. Return undefined.
Sets multiple values in this TypedArray, reading the values from the typedArray argument object. The optional offset value
indicates the first element index in this TypedArray where values are written. If omitted, it is assumed to be 0.
1. Assert: typedArray has a [[TypedArrayName]] internal slot. If it does not, the definition in 22.2.3.23.1 applies.
2. Let target be the this value.
3. If Type(target) is not Object, throw a TypeError exception.
4. If target does not have a [[TypedArrayName]] internal slot, throw a TypeError exception.
5. Assert: target has a [[ViewedArrayBuffer]] internal slot.
6. Let targetOffset be ? ToInteger(offset).
7. If targetOffset < 0, throw a RangeError exception.
8. Let targetBuffer be target.[[ViewedArrayBuffer]].
9. If IsDetachedBuffer(targetBuffer) is true, throw a TypeError exception.
10. Let targetLength be target.[[ArrayLength]].
11. Let srcBuffer be typedArray.[[ViewedArrayBuffer]].
12. If IsDetachedBuffer(srcBuffer) is true, throw a TypeError exception.
13. Let targetName be the String value of target.[[TypedArrayName]].
© Ecma International 2019 613
14. Let targetType be the String value of the Element Type value in Table 59 for targetName.
15. Let targetElementSize be the Number value of the Element Size value specified in Table 59 for targetName.
16. Let targetByteOffset be target.[[ByteOffset]].
17. Let srcName be the String value of typedArray.[[TypedArrayName]].
18. Let srcType be the String value of the Element Type value in Table 59 for srcName.
19. Let srcElementSize be the Number value of the Element Size value specified in Table 59 for srcName.
20. Let srcLength be typedArray.[[ArrayLength]].
21. Let srcByteOffset be typedArray.[[ByteOffset]].
22. If srcLength + targetOffset > targetLength, throw a RangeError exception.
23. If both IsSharedArrayBuffer(srcBuffer) and IsSharedArrayBuffer(targetBuffer) are true, then
a. If srcBuffer.[[ArrayBufferData]] and targetBuffer.[[ArrayBufferData]] are the same Shared Data Block values, let same
be true; else let same be false.
24. Else, let same be SameValue(srcBuffer, targetBuffer).
25. If same is true, then
a. Let srcByteLength be typedArray.[[ByteLength]].
b. Set srcBuffer to ? CloneArrayBuffer(srcBuffer, srcByteOffset, srcByteLength, %ArrayBuffer%).
c. NOTE: %ArrayBuffer% is used to clone srcBuffer because is it known to not have any observable side-effects.
d. Let srcByteIndex be 0.
26. Else, let srcByteIndex be srcByteOffset.
27. Let targetByteIndex be targetOffset × targetElementSize + targetByteOffset.
28. Let limit be targetByteIndex + targetElementSize × srcLength.
29. If SameValue(srcType, targetType) is true, then
a. NOTE: If srcType and targetType are the same, 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. Increase srcByteIndex by 1.
iv. Increase targetByteIndex by 1.
30. 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.
31. Return undefined.
This function is not generic. The this value must be an object with a [[TypedArrayName]] internal slot.
This function 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.
This function is not generic. The this value must be an object with a [[TypedArrayName]] internal slot.
Upon entry, the following steps are performed to initialize evaluation of the sort function. These steps are used instead of the
entry steps in 22.1.3.27:
The implementation-defined sort order condition for exotic objects is not applied by %TypedArray%.prototype.sort.
The following version of SortCompare is used by %TypedArray%.prototype.sort. It performs a numeric comparison rather
than the string comparison used in 22.1.3.27. SortCompare has access to the comparefn and buffer values of the current
invocation of the sort method.
When the TypedArray SortCompare abstract operation is called with two arguments x and y, the following steps are taken:
NOTE
This function is not generic. The this value must be an object with a [[TypedArrayName]] internal slot.
This function 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 function is based upon the algorithm
for Array.prototype.toLocaleString that is in the ECMA-402 specification.
22.2.3.29 %TypedArray%.prototype.toString ( )
© Ecma International 2019 617
The initial value of the %TypedArray%.prototype.toString data property is the same built-in function object as the
Array.prototype.toString method defined in 22.1.3.30.
22.2.3.30 %TypedArray%.prototype.values ( )
The following steps are taken:
The initial value of the name property of this function is "get [Symbol.toStringTag]".
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 59.
is a single function whose behaviour is overloaded 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.
is designed to be subclassable. It 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 3.
618 © Ecma International 2019
22.2.4.1 TypedArray ( )
This description applies only if the TypedArray function is called with no arguments.
This description applies only if the TypedArray function is called with at least one argument and the Type of the first argument
is not Object.
The abstract operation AllocateTypedArray with arguments constructorName, newTarget, defaultProto and optional argument
length is used to validate and create an instance of a TypedArray constructor. constructorName is required to be the name of a
TypedArray constructor in Table 59. 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 all of the
TypedArray overloads. AllocateTypedArray performs the following steps:
The abstract operation AllocateTypedArrayBuffer with arguments O and length allocates and associates an ArrayBuffer with
© Ecma International 2019 619
the TypedArray instance O. It performs the following steps:
1. Assert: Type(object) is Object and object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]] internal
slot.
2. If NewTarget is undefined, throw a TypeError exception.
3. Let constructorName be the String value of the Constructor Name value specified in Table 59 for this TypedArray
constructor.
4. Let O be ? AllocateTypedArray(constructorName, NewTarget, "%TypedArrayPrototype%").
5. Let usingIterator be ? GetMethod(object, @@iterator).
6. If usingIterator is not undefined, then
a. Let values be ? IterableToList(object, usingIterator).
b. Let len be the number of elements in values.
c. Perform ? AllocateTypedArrayBuffer(O, len).
d. Let k be 0.
e. Repeat, while k < len
i. Let Pk be ! ToString(k).
ii. Let kValue be the first element of values and remove that element from values.
iii. Perform ? Set(O, Pk, kValue, true).
iv. Increase k by 1.
f. Assert: values is now an empty List.
g. Return O.
7. NOTE: object is not an Iterable so assume it is already an array-like object.
8. Let arrayLike be object.
9. Let len be ? ToLength(? Get(arrayLike, "length")).
TypedArray called with at least one argument buffer performs the following steps:
has a [[Prototype]] internal slot whose value is the intrinsic object %TypedArray%.
has a name property whose value is the String value of the constructor name specified for it in Table 59.
has the following properties:
22.2.5.1 TypedArray.BYTES_PER_ELEMENT
The value of TypedArray.BYTES_PER_ELEMENT is the Number value of the Element Size value specified in Table 59 for
TypedArray.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
22.2.5.2 TypedArray.prototype
The initial value of TypedArray.prototype is the corresponding TypedArray prototype intrinsic object (22.2.6).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
has a [[Prototype]] internal slot whose value is the intrinsic object %TypedArrayPrototype%.
is an ordinary object.
does not have a [[ViewedArrayBuffer]] or any other of the internal slots that are specific to TypedArray instance objects.
22.2.6.1 TypedArray.prototype.BYTES_PER_ELEMENT
© Ecma International 2019 623
The value of TypedArray.prototype.BYTES_PER_ELEMENT is the Number value of the Element Size value specified in Table
59 for TypedArray.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
22.2.6.2 TypedArray.prototype.constructor
The initial value of a TypedArray.prototype.constructor is the corresponding %TypedArray% intrinsic object.
23 Keyed Collections
Map object 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 structures used in this Map objects specification is only
intended to describe the required observable semantics of Map objects. It is not intended to be a viable implementation
model.
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.
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.
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
© Ecma International 2019 625
has the following properties:
23.1.2.1 Map.prototype
The initial value of Map.prototype is the intrinsic object %MapPrototype%.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
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.
23.1.3.1 Map.prototype.clear ( )
NOTE
The existing [[MapData]] List is preserved because there may be existing Map Iterator objects that are suspended midway
through iterating over that List.
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.
23.1.3.4 Map.prototype.entries ( )
When the forEach method is called with one or two arguments, the following steps are taken:
NOTE
callbackfn should be a function that accepts three arguments. forEach calls callbackfn once for each key/value pair present in
© Ecma International 2019 627
the map object, 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 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.
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.
23.1.3.8 Map.prototype.keys ( )
The following steps are taken:
23.1.3.11 Map.prototype.values ( )
The following steps are taken:
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
Several methods of Map objects return Iterator objects. The abstract operation CreateMapIterator with arguments map and
kind is used to create such iterator objects. It performs the following steps:
23.1.5.2.1 %MapIteratorPrototype%.next ( )
The initial value of the @@toStringTag property is the String value "Map Iterator".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
[[MapNextIndex]] The integer index of the next Map data element to be examined by this iterator.
[[MapIterationKind]] A String value that identifies what is to be returned for each element of the iteration. The possible
values are: "key", "value", "key+value".
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 structures used in this Set objects specification is only
intended to describe the required observable semantics of Set objects. It is not intended to be a viable implementation model.
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
23.2.2.1 Set.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Set[@@species] is an accessor property whose set accessor function is undefined. Its get accessor function performs the
following steps:
632 © Ecma International 2019
1. Return the this value.
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.
23.2.3.2 Set.prototype.clear ( )
NOTE
The existing [[SetData]] List is preserved because there may be existing Set Iterator objects that are suspended midway
through iterating over that List.
© Ecma International 2019 633
23.2.3.3 Set.prototype.constructor
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.
23.2.3.5 Set.prototype.entries ( )
NOTE
For iteration purposes, a Set appears similar to a Map where each entry has the same value for its key and value.
When the forEach method is called with one or two arguments, the following steps are taken:
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.
23.2.3.8 Set.prototype.keys ( )
The initial value of the keys property is the same function object as the initial value of the values property.
NOTE
For iteration purposes, a Set appears similar to a Map where each entry has the same value for its key and value.
Set.prototype.size is an accessor property whose set accessor function is undefined. Its get accessor function performs
the following steps:
23.2.3.10 Set.prototype.values ( )
The following steps are taken:
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
23.2.5.2.1 %SetIteratorPrototype%.next ( )
The initial value of the @@toStringTag property is the String value "Set Iterator".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
Set Iterator instances are ordinary objects that inherit properties from the %SetIteratorPrototype% intrinsic object. Set
Iterator instances are initially created with the internal slots specified in Table 61.
[[SetNextIndex]] The integer index of the next Set data element to be examined by this iterator
[[SetIterationKind]] A String value that identifies what is to be returned for each element of the iteration. The possible
values are: "key", "value", "key+value". "key" and "value" have the same meaning.
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.
WeakMap objects 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 WeakMap objects
specification are only intended to describe the required observable semantics of WeakMap objects. It is not intended to be a
viable implementation model.
NOTE
WeakMap and WeakSets are intended to provide mechanisms for dynamically associating state with an object in a manner
that does not “leak” memory resources if, in the absence of the WeakMap or WeakSet, the object 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 mapping of weak map instances to keys. Alternatively each weak map may
internally store its key to value mappings 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 WeakSets:
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, http://doi.acm.org/10.1145/263698.263733.
Alexandra Barros, Roberto Ierusalimschy, Eliminating Cycles in Weak Tables. Journal of Universal Computer Science - J.UCS,
vol. 14, no. 21, pp. 3481-3497, 2008, http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak
When the WeakMap function is called with optional argument iterable, the following steps are taken:
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.
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
23.3.2.1 WeakMap.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
23.3.3.1 WeakMap.prototype.constructor
The initial value of WeakMap.prototype.constructor is the intrinsic object %WeakMap%.
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.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
An implementation may impose an arbitrarily determined latency between the time an object contained in a WeakSet
© Ecma International 2019 641
becomes inaccessible and the time when the object 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 object that does not
require the observer to present the observed object.
WeakSet 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 WeakSet objects specification is
only intended to describe the required observable semantics of WeakSet objects. It is not intended to be a viable
implementation model.
NOTE
See the NOTE in 23.3.
When the WeakSet function is called with optional argument iterable, the following steps are taken:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
23.4.2.1 WeakSet.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
23.4.3.2 WeakSet.prototype.constructor
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.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
24 Structured Data
The abstract operation AllocateArrayBuffer with arguments constructor and byteLength is used to create an ArrayBuffer object.
It performs the following steps:
The abstract operation IsDetachedBuffer with argument arrayBuffer performs the following steps:
The abstract operation DetachArrayBuffer with argument arrayBuffer and optional argument key performs the following steps:
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 implementation or host environment may define such operations.
The abstract operation CloneArrayBuffer takes four parameters, an ArrayBuffer srcBuffer, an integer offset srcByteOffset, an
integer length srcLength, and a constructor function cloneConstructor. 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. This operation performs the
following steps:
1. Let elementSize be the Number value of the Element Size value specified in Table 59 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-2008 binary32 value.
b. If value is an IEEE 754-2008 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-2008 binary64 value.
b. If value is an IEEE 754-2008 binary64 NaN value, return the NaN Number value.
c. Return the Number value that corresponds to value.
5. If the first code unit of type is the code unit 0x0055 (LATIN CAPITAL LETTER U), 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 2's complement number of bit length elementSize × 8.
7. Return the Number value that corresponds to intValue.
When the ArrayBuffer function is called with argument length, the following steps are taken:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
The isView function takes one argument arg, and performs the following steps:
24.1.3.2 ArrayBuffer.prototype
The initial value of ArrayBuffer.prototype is the intrinsic object %ArrayBufferPrototype%.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
NOTE
ArrayBuffer prototype methods normally use their this object's constructor to create a derived object. However, a subclass
constructor may over-ride that default behaviour by redefining its @@species property.
ArrayBuffer.prototype.byteLength is an accessor property whose set accessor function is undefined. Its get accessor
function performs the following steps:
24.1.4.2 ArrayBuffer.prototype.constructor
The initial value of the @@toStringTag property is the String value "ArrayBuffer".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
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.
The abstract operation AllocateSharedArrayBuffer with arguments constructor and byteLength is used to create a
SharedArrayBuffer object. It performs the following steps:
IsSharedArrayBuffer tests whether an object is an ArrayBuffer, a SharedArrayBuffer, or a subtype of either. It performs the
following steps:
NOTE
Unlike an ArrayBuffer, a SharedArrayBuffer cannot become detached, and its internal [[ArrayBufferData]] slot is never
null.
652 © Ecma International 2019
24.2.2.1 SharedArrayBuffer ( [ length ] )
When the SharedArrayBuffer function is called with optional argument length, the following steps are taken:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
24.2.3.1 SharedArrayBuffer.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
SharedArrayBuffer[@@species] is an accessor property whose set accessor function is undefined. Its get accessor
function performs the following steps:
SharedArrayBuffer.prototype.byteLength is an accessor property whose set accessor function is undefined. Its get
accessor function performs the following steps:
24.2.4.2 SharedArrayBuffer.prototype.constructor
The initial value of SharedArrayBuffer.prototype.constructor is the intrinsic object %SharedArrayBuffer%.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
NOTE
654 © Ecma International 2019
SharedArrayBuffer instances, unlike ArrayBuffer instances, are never detached.
When the DataView function is called with at least one argument buffer, the following steps are taken:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
24.3.3.1 DataView.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
DataView.prototype.buffer is an accessor property whose set accessor function is undefined. Its get accessor function
performs the following steps:
DataView.prototype.byteLength is an accessor property whose set accessor function is undefined. Its get accessor
function performs the following steps:
DataView.prototype.byteOffset is an accessor property whose set accessor function is undefined. Its get accessor
function performs the following steps:
24.3.4.4 DataView.prototype.constructor
The initial value of DataView.prototype.constructor is the intrinsic object %DataView%.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
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.
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.
The agent cluster has a store of WaiterList objects; the store is indexed by (block, i). WaiterLists are agent-independent: a
lookup in the store of WaiterLists by (block, i) will result in the same WaiterList object in any agent in the agent cluster.
Operations on a WaiterList -- adding and removing waiting agents, traversing the list of agents, suspending and notifying
agents on the list -- may only be performed by agents that have entered the WaiterList's critical section.
The abstract operation GetWaiterList takes two arguments, a Shared Data Block block and a nonnegative integer i. It performs
the following steps:
The abstract operation EnterCriticalSection takes one argument, a WaiterList WL. It performs the following steps:
1. Assert: The calling 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).
24.4.1.5 LeaveCriticalSection ( WL )
The abstract operation LeaveCriticalSection takes one argument, a WaiterList WL. It performs the following steps:
The abstract operation AddWaiter takes two arguments, a WaiterList WL and an agent signifier W. It performs the following
steps:
The abstract operation RemoveWaiter takes two arguments, a WaiterList WL and an agent signifier W. It performs the
following steps:
The abstract operation RemoveWaiters takes two arguments, a WaiterList WL and nonnegative integer c. It performs the
following steps:
The abstract operation Suspend takes three arguments, a WaiterList WL, an agent signifier W, and a nonnegative, non-NaN
Number timeout. It performs the following steps:
The abstract operation NotifyWaiter takes two arguments, a WaiterList WL and an agent signifier W. It performs the following
steps:
NOTE
The embedding may delay notifying W, e.g. for resource management reasons, but W must eventually be notified in order to
guarantee forward progress.
The abstract operation AtomicReadModifyWrite takes four arguments, typedArray, index, value, and a pure combining
operation op. The pure combining operation op takes two List of byte values arguments and returns a List of byte values. The
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:
1. Let n be ? ToInteger(size).
2. Let AR be the Agent Record of the surrounding agent.
3. If n equals 1, return AR.[[IsLockFree1]].
4. If n equals 2, return AR.[[IsLockFree2]].
5. If n equals 4, return true.
6. Return false.
NOTE
Atomics.isLockFree() 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 n bytes will be performed without
the calling agent acquiring a lock outside the n bytes comprising the datum, then Atomics.isLockFree(n) will return true.
High-performance algorithms will use Atomics.isLockFree 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.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
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.
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.
© Ecma International 2019 669
1. Let JText be ? ToString(text).
2. Parse JText interpreted as UTF-16 encoded Unicode points (6.1.4) as a JSON text as specified in ECMA-404. Throw a
SyntaxError exception if JText is not a valid JSON text as defined in that specification.
3. Let scriptText be the string-concatenation of "(", JText, and ");".
4. Let completion be the result of parsing and evaluating scriptText as if it was the source text of an ECMAScript Script. The
extended PropertyDefinitionEvaluation semantics defined in B.3.1 must not be used during the evaluation.
5. Let unfiltered be completion.[[Value]].
6. Assert: unfiltered is either a String, Number, Boolean, Null, or an Object that is defined by either an ArrayLiteral or an
ObjectLiteral.
7. If IsCallable(reviver) is true, then
a. Let root be ObjectCreate(%ObjectPrototype%).
b. Let rootName be the empty String.
c. Let status be CreateDataProperty(root, rootName, unfiltered).
d. Assert: status is true.
e. Return ? InternalizeJSONProperty(root, rootName).
8. Else,
a. Return unfiltered.
NOTE
Valid JSON text is a subset of the ECMAScript PrimaryExpression syntax as modified by Step 4 above. Step 2 verifies that JText
conforms to that subset, and step 6 verifies that that parsing and evaluation returns a value of an appropriate type.
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
In the case where there are duplicate name Strings within an object, lexically preceding values for the same key shall be
overwritten.
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
the stringify function must throw a TypeError exception. This is an example of a value that cannot be stringified:
a = [];
a[0] = a;
my_text = JSON.stringify(a); // This must throw a TypeError.
NOTE 2
Symbolic primitive values are rendered as follows:
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 \uHHHH, or with the shorter forms, \b (BACKSPACE), \f (FORM
FEED), \n (LINE FEED), \r (CARRIAGE RETURN), \t (CHARACTER TABULATION).
The abstract operation QuoteJSONString with argument value wraps a String value in QUOTATION MARK code units and
escapes certain other code units within it.
This operation interprets a String value as a sequence of UTF-16 encoded code points, as described in 6.1.4.
1. Let product be the String value consisting solely of the code unit 0x0022 (QUOTATION MARK).
2. Let cpList be a List containing in order the code points of value when interpreted as a sequence of UTF-16 encoded code
points as described in 6.1.4.
3. For each code point C in cpList, do
a. If C is listed in the Code Point column of Table 62, then
i. Set product to the string-concatenation of product and the Escape Sequence for C as specified in Table 62.
b. Else if C has a numeric value less than 0x0020 (SPACE), or if C has the same numeric value as a leading surrogate or
trailing surrogate, then
i. Let unit be the code unit whose numeric value is that of C.
ii. Set product to the string-concatenation of product and UnicodeEscape(unit).
c. Else,
i. Set product to the string-concatenation of product and the UTF16Encoding of C.
4. Set product to the string-concatenation of product and the code unit 0x0022 (QUOTATION MARK).
5. Return product.
U+0008 BACKSPACE \b
The abstract operation UnicodeEscape takes a code unit argument C and represents it as a Unicode escape sequence.
1. If stack contains value, throw a TypeError exception because the structure is cyclical.
2. Append value to stack.
3. Let stepback be indent.
4. Set indent to the string-concatenation of indent and gap.
5. If PropertyList is not undefined, then
a. Let K be PropertyList.
6. Else,
a. Let K be ? EnumerableOwnPropertyNames(value, "key").
7. Let partial be a new empty List.
8. For each element P of K, do
a. Let strP be ? SerializeJSONProperty(P, value).
b. If strP is not undefined, then
i. Let member be QuoteJSONString(P).
ii. Set member to the string-concatenation of member and ":".
iii. If 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 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 gap is not the empty String,
i. Let separator be the string-concatenation of the code unit 0x002C (COMMA), the code unit 0x000A (LINE
FEED), and 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), indent, properties, the code unit
0x000A (LINE FEED), stepback, and "}".
11. Remove the last element of stack.
12. Set indent to stepback.
13. Return final.
© Ecma International 2019 675
24.5.2.5 Runtime Semantics: SerializeJSONArray ( value )
The abstract operation SerializeJSONArray with argument value serializes an array. It has access to the stack, indent, and gap
values of the current invocation of the stringify method.
1. If stack contains value, throw a TypeError exception because the structure is cyclical.
2. Append value to stack.
3. Let stepback be indent.
4. Set indent to the string-concatenation of indent and gap.
5. Let partial be a new empty List.
6. Let len be ? ToLength(? Get(value, "length")).
7. Let index be 0.
8. Repeat, while index < len
a. Let strP be ? SerializeJSONProperty(! ToString(index), value).
b. If strP is undefined, then
i. Append "null" to partial.
c. Else,
i. Append strP to partial.
d. Increment index by 1.
9. If partial is empty, then
a. Let final be "[]".
10. Else,
a. If 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 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), indent, properties, the code unit
0x000A (LINE FEED), stepback, and "]".
11. Remove the last element of stack.
12. Set indent to stepback.
13. Return final.
NOTE
The representation of arrays includes only the elements between zero and array.length - 1 inclusive. Properties whose
keys are not array indexes 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.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
25.1 Iteration
@@iterator A function that returns an Iterator object. The returned object must conform to the Iterator interface.
next A function The returned object must conform to the IteratorResult interface. If a previous call to the next
that returns method of an Iterator has returned an IteratorResult object whose done property is true, then all
an subsequent calls to the next method of that object should also return an IteratorResult object
IteratorResult whose done property is true. However, this requirement is not enforced.
object.
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
© Ecma International 2019 677
such a manner must be prepared to deal with being called with no arguments.
return A function The returned object must conform to the IteratorResult interface. Invoking this method notifies
that returns the Iterator object that the caller does not intend to make any more next method calls to the
an Iterator. The returned IteratorResult object will typically have a done property whose value is
IteratorResult true, and a value property with the value passed as the argument of the return method.
object. However, this requirement is not enforced.
throw A function The returned object must conform to the IteratorResult interface. Invoking this method notifies
that returns the Iterator object that the caller has detected an error condition. The argument may be used to
an identify the error condition and typically will be an exception object. A typical response is to
IteratorResult throw the value passed as the argument. If the method does not throw, the returned
object. 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.
@@asyncIterator A function that returns an AsyncIterator The returned object must conform to the AsyncIterator
object. interface.
next A function The returned promise, when fulfilled, must fulfill with an object which conforms to the
that returns a IteratorResult interface. If a previous call to the next method of an AsyncIterator has returned a
promise for promise for an IteratorResult object whose done property is true, then all subsequent calls to the
an next method of that object should also return a promise for an IteratorResult object whose done
678 © Ecma International 2019
IteratorResult property is true. However, this requirement is not enforced.
object.
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.
return A function The returned promise, when fulfilled, must fulfill with an object which conforms to the
that returns a IteratorResult interface. Invoking this method notifies the AsyncIterator object that the caller does
promise for not intend to make any more next method calls to the AsyncIterator. The returned promise will
an fulfill with an IteratorResult object which will typically have a done property whose value is true,
IteratorResult and a value property with the value passed as the argument of the return method. However,
object. 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 The returned promise, when fulfilled, must fulfill with an object which conforms to the
that returns a IteratorResult interface. Invoking this method notifies the AsyncIterator object that the caller has
promise for detected an error condition. The argument may be used to identify the error condition and
an typically will be an exception object. A typical response is to return a rejected promise which
IteratorResult rejects with the value passed as the argument.
object.
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
done Either true This is the result status of an iterator next method call. If the end of the iterator was reached done
or false. 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 consider to have the value false.
value Any If done is false, this is the current iteration element value. If done is true, this is the return value of
ECMAScript the iterator, if it supplied one. If the iterator does not have a return value, value is undefined. In
language that case, the value property may be absent from the conforming object if it does not inherit an
value. explicit value property.
has a [[Prototype]] internal slot whose value is the intrinsic object %ObjectPrototype%.
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]()))
has a [[Prototype]] internal slot whose value is the intrinsic object %ObjectPrototype%.
680 © Ecma International 2019
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.
The initial value of the @@toStringTag property is the String value "Async-from-Sync Iterator".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
An async-from-sync iterator value unwrap function is an anonymous built-in function that is used by methods of
%AsyncFromSyncIteratorPrototype% when processing the value field 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. Each async iterator value unwrap
function has a [[Done]] internal slot.
When an async-from-sync iterator value unwrap function is called with argument value, the following steps are taken:
[[SyncIteratorRecord]] A Record, of the type returned by GetIterator, representing the original synchronous iterator which
is being adapted.
The last argument specifies the body (executable code) of a generator function; any preceding arguments specify formal
parameters.
When the GeneratorFunction function is called with some arguments p1, p2, … , pn, body (where n might be 0, that is, there
are no “p” arguments, and where body might also not be provided), the following steps are taken:
NOTE
See NOTE for 19.2.1.1.
is a standard built-in function object that inherits from the Function constructor.
has a [[Prototype]] internal slot whose value is the intrinsic object %Function%.
has a name property whose value is "GeneratorFunction".
has the following properties:
This is a data property with a value of 1. This property has the attributes { [[Writable]]: false, [[Enumerable]]: false,
[[Configurable]]: true }.
25.2.2.2 GeneratorFunction.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
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 27 or Table 71.
is the value of the prototype property of the intrinsic object %GeneratorFunction%.
is the intrinsic object %Generator% (see Figure 2).
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
25.2.3.1 GeneratorFunction.prototype.constructor
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
25.2.3.2 GeneratorFunction.prototype.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
The initial value of the @@toStringTag property is the String value "GeneratorFunction".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
The specification for the "length" property of Function instances given in 19.2.4.1 also applies to GeneratorFunction
instances.
25.2.4.2 name
The specification for the name property of Function instances given in 19.2.4.2 also applies to GeneratorFunction instances.
25.2.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 object 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 the a GeneratorFunction's prototype property does not have a
constructor property whose value is the GeneratorFunction instance.
The last argument specifies the body (executable code) of an async generator function; any preceding arguments specify
686 © Ecma International 2019
formal parameters.
When the AsyncGeneratorFunction function is called with some arguments p1, p2, … , pn, body (where n might be 0, that is,
there are no "p" arguments, and where body might also not be provided), the following steps are taken:
NOTE
See NOTE for 19.2.1.1.
is a standard built-in function object that inherits from the Function constructor.
has a [[Prototype]] internal slot whose value is the intrinsic object %Function%.
has a name property whose value is "AsyncGeneratorFunction".
has the following properties:
25.3.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 }.
25.3.2.2 AsyncGeneratorFunction.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
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 27 or Table 72.
is the value of the prototype property of the intrinsic object %AsyncGeneratorFunction%.
is the intrinsic object %AsyncGenerator%.
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
25.3.3.1 AsyncGeneratorFunction.prototype.constructor
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
25.3.3.2 AsyncGeneratorFunction.prototype.prototype
The value of AsyncGeneratorFunction.prototype.prototype is the %AsyncGeneratorPrototype% intrinsic object.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
25.3.4.1 length
The value of the "length" property is an integer 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 }.
25.3.4.2 name
The specification for the name property of Function instances given in 19.2.4.2 also applies to AsyncGeneratorFunction
instances.
25.3.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 object 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 the an AsyncGeneratorFunction's prototype property does not have
Generator instances directly inherit properties from the object that is the value of the prototype property of the Generator
function that created the instance. Generator instances indirectly inherit properties from the Generator Prototype intrinsic,
%GeneratorPrototype%.
25.4.1.1 Generator.prototype.constructor
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
[[GeneratorState]] The current execution state of the generator. The possible values are: undefined,
"suspendedStart", "suspendedYield", "executing", and "completed".
[[GeneratorContext]] The execution context that is used when executing the code of this generator.
25.4.3.5 GetGeneratorKind ( )
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.
AsyncGenerator instances directly inherit properties from the object that is the value of the prototype property of the
AsyncGenerator function that created the instance. AsyncGenerator instances indirectly inherit properties from the
AsyncGenerator Prototype intrinsic, %AsyncGeneratorPrototype%.
25.5.1.1 AsyncGenerator.prototype.constructor
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
The initial value of the @@toStringTag property is the String value "AsyncGenerator".
© Ecma International 2019 693
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
[[AsyncGeneratorState]] The current execution state of the async generator. The possible values are: undefined,
"suspendedStart", "suspendedYield", "executing", "awaiting-return", and
"completed".
[[AsyncGeneratorContext]] The execution context that is used when executing the code of this async generator.
[[AsyncGeneratorQueue]] A List of AsyncGeneratorRequest records which represent requests to resume the async
generator.
[[Completion]] A Completion record The completion which should be used to resume the async generator.
[[Capability]] A PromiseCapability record The promise capabilities associated with this request.
An AsyncGeneratorResumeNext return processor fulfilled function is an anonymous built-in function that is used as part of the
AsyncGeneratorResumeNext specification device to unwrap promises passed in to the AsyncGenerator.prototype.return (
value ) method. Each AsyncGeneratorResumeNext return processor fulfilled function has a [[Generator]] internal slot.
An AsyncGeneratorResumeNext return processor rejected function is an anonymous built-in function that is used as part of
the AsyncGeneratorResumeNext specification device to unwrap promises passed in to the AsyncGenerator.prototype.return (
value ) method. Each AsyncGeneratorResumeNext return processor rejected function has a [[Generator]] internal slot.
When an AsyncGeneratorResumeNext return processor rejected function is called with argument reason, the following steps
are taken:
Any Promise object is in one of three mutually exclusive states: fulfilled, rejected, and pending:
A promise p is fulfilled if p.then(f, r) will immediately enqueue a Job to call the function f.
A promise p is rejected if p.then(f, r) will immediately enqueue a Job to call the function r.
A promise is pending if it is neither fulfilled nor 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.
A PromiseCapability is a Record value used to encapsulate a promise object along with the functions that are capable of
resolving or rejecting that promise object. PromiseCapability Records are produced by the NewPromiseCapability abstract
operation.
[[Resolve]] A function object The function that is used to resolve the given promise object.
[[Reject]] A function object The function that is used to reject the given promise object.
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).
[[Capability]] A The capabilities of the promise for which this record provides a reaction handler.
PromiseCapability
Record, or
undefined
[[Type]] Either "Fulfill" The [[Type]] is used when [[Handler]] is undefined to allow for behaviour specific to the
or "Reject". settlement type.
[[Handler]] A function object The function that should be applied to the incoming value, and whose return value will
or undefined. govern what happens to the derived promise. If [[Handler]] is undefined, a function that
depends on the value of [[Type]] will be used instead.
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:
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:
25.6.1.5 NewPromiseCapability ( C )
The abstract operation NewPromiseCapability takes a constructor function, and attempts to use that constructor function in
the fashion of the built-in Promise constructor to create a Promise object and extract its resolve and reject functions. The
promise plus the resolve and reject functions are used to initialize a new PromiseCapability Record which is returned as the
value of this abstract operation.
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
© Ecma International 2019 701
any subclass.
A GetCapabilitiesExecutor function is an anonymous built-in function that has a [[Capability]] internal slot.
When a GetCapabilitiesExecutor function is called with arguments resolve and reject, the following steps are taken:
25.6.1.6 IsPromise ( x )
The abstract operation IsPromise checks for the promise brand on an object.
An implementation of HostPromiseRejectionTracker must complete normally in all cases. The default implementation of
HostPromiseRejectionTracker is to unconditionally return an empty normal completion.
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.
The job PromiseReactionJob with parameters reaction and argument 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.
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.
When the Promise function is called with argument executor, the following steps are taken:
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 object. 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 object. 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
object 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.
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
The all 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.
NOTE
The all function requires its this value to be a constructor function that supports the parameter conventions of the Promise
constructor.
When the PerformPromiseAll abstract operation is called with arguments iteratorRecord, constructor, and resultCapability, the
following steps are taken:
A 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 x, the following steps are taken:
25.6.4.2 Promise.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
The race 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.
When the PerformPromiseRace abstract operation is called with arguments iteratorRecord, constructor, and resultCapability,
the following steps are taken:
25.6.4.4 Promise.reject ( r )
The reject function returns a new promise rejected with the passed argument.
NOTE
The reject function expects its this value to be a constructor function that supports the parameter conventions of the
Promise constructor.
25.6.4.5 Promise.resolve ( x )
The resolve function returns either a new promise resolved with the passed argument, or the argument itself if the argument
NOTE
The resolve function expects its this value to be a constructor function that supports the parameter conventions of the
Promise constructor.
25.6.4.5.1 PromiseResolve ( C, x )
The abstract operation PromiseResolve, given a constructor and a value, returns a new promise resolved with that value.
NOTE
Promise prototype methods normally use their this object's constructor to create a derived object. However, a subclass
constructor may over-ride that default behaviour by redefining its @@species property.
25.6.5.2 Promise.prototype.constructor
The initial value of Promise.prototype.constructor is the intrinsic object %Promise%.
A Then Finally function is an anonymous built-in function that has a [[Constructor]] and an [[OnFinally]] internal slot. The
value of the [[Constructor]] internal slot is a Promise-like constructor function object, and the value of the [[OnFinally]]
internal slot is a function object.
When a Then Finally function is called with argument value, the following steps are taken:
A Catch Finally function is an anonymous built-in function that has a [[Constructor]] and an [[OnFinally]] internal slot. The
value of the [[Constructor]] internal slot is a Promise-like constructor function object, and the value of the [[OnFinally]]
internal slot is a function object.
When a Catch Finally function is called with argument reason, the following steps are taken:
The abstract operation PerformPromiseThen 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.)
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
[[PromiseState]] A String value that governs how a promise will react to incoming calls to its then method. The
possible values are: "pending", "fulfilled", and "rejected".
[[PromiseResult]] The value with which the promise has been fulfilled or rejected, if any. Only meaningful if
[[PromiseState]] is not "pending".
[[PromiseFulfillReactions]] A List of PromiseReaction records to be processed when/if the promise transitions from the
"pending" state to the "fulfilled" state.
712 © Ecma International 2019
[[PromiseRejectReactions]] A List of PromiseReaction records to be processed when/if the promise transitions from the
"pending" state to the "rejected" state.
[[PromiseIsHandled]] A boolean indicating whether the promise has ever had a fulfillment or rejection handler; used
in unhandled rejection tracking.
The last argument specifies the body (executable code) of an async function. Any preceding arguments specify formal
parameters.
When the AsyncFunction function is called with some arguments p1, p2, …, pn, body (where n might be 0, that is, there are no
p arguments, and where body might also not be provided), the following steps are taken:
NOTE
See NOTE for 19.2.1.1.
25.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 }.
25.7.2.2 AsyncFunction.prototype
The initial value of AsyncFunction.prototype is the intrinsic object %AsyncFunctionPrototype%.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
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 27.
is the value of the prototype property of the intrinsic object %AsyncFunction%.
is the intrinsic object %AsyncFunctionPrototype%.
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
25.7.3.1 AsyncFunction.prototype.constructor
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
The initial value of the @@toStringTag property is the string value "AsyncFunction".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
The specification for the "length" property of Function instances given in 19.2.4.1 also applies to AsyncFunction instances.
25.7.4.2 name
The specification for the name property of Function instances given in 19.2.4.2 also applies to AsyncFunction instances.
26 Reflection
When Proxy is called with arguments target and handler, it performs the following steps:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
does not have a prototype property because proxy exotic objects do not have a [[Prototype]] internal slot that requires
initialization.
has the following properties:
The Proxy.revocable function is used to create a revocable Proxy object. When Proxy.revocable is called with arguments
target and handler, the following steps are taken:
A Proxy revocation function is an anonymous function that has the ability to invalidate a specific Proxy object.
When a Proxy revocation function is called, the following steps are taken:
In addition to the properties specified in 9.4.6 each Module Namespace Object has the following own property:
26.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 }.
27 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.
NOTE 1
No orderings weaker than sequentially consistent and stronger than unordered, such as release-acquire, are supported.
720 © Ecma International 2019
A Shared Data Block event is either a ReadSharedMemory, WriteSharedMemory, or ReadModifyWriteSharedMemory Record.
[[Order]] "SeqCst" or The weakest ordering guaranteed by the memory model for the event.
"Unordered"
[[NoTear]] A Boolean Whether this event is allowed to read from multiple write events on equal range
as this event.
[[Block]] A Shared Data Block The block the event operates on.
[[Order]] "SeqCst", "Unordered", The weakest ordering guaranteed by the memory model for the event.
or "Init"
[[NoTear]] A Boolean Whether this event is allowed to be read from multiple read events with
equal range as this event.
[[Block]] A Shared Data Block The block the event operates on.
[[ModifyOp]] A semantic A pure semantic function that returns a modified List of byte values from a read List of
function 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.
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.
[[AgentSignifier]] A value that admits equality The agent whose evaluation resulted in this ordering.
testing
[[EventList]] A List of events Events are appended to the list during evaluation.
[[ChosenValue]] A List of byte The bytes that were nondeterministically chosen during evaluation.
values
[[EventsRecords]] A List of Agent Maps an agent to Lists of events appended during the evaluation.
Events Records.
An empty candidate execution is a candidate execution Record whose fields are empty Lists and Relations.
NOTE 1
The semantic function [[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.
27.6.1 agent-order
For a candidate execution execution, execution.[[AgentOrder]] is a Relation on events that satisfies the following.
For each pair (E, D) in EventSet(execution), (E, D) is in execution.[[AgentOrder]] if there is some Agent Events Record aer
in execution.[[EventsRecords]] such that E and D are in aer.[[EventList]] and E is before D 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
27.6.2 reads-bytes-from
For a candidate execution execution, execution.[[ReadsBytesFrom]] is a semantic function from events in
SharedDataBlockEventSet(execution) to Lists of events in SharedDataBlockEventSet(execution) that satisfies the following
conditions.
27.6.3 reads-from
For a candidate execution execution, execution.[[ReadsFrom]] is the least Relation on events that satisfies the following.
27.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.
NOTE 1
For two host-specific events E and D, E host-synchronizes-with D implies E happens-before D.
NOTE 2
The host-synchronizes-with relation allows the host to provide additional synchronization mechanisms, such as
postMessage between HTML workers.
27.6.5 synchronizes-with
For a candidate execution execution, execution.[[SynchronizesWith]] is the least Relation on events that satisfies the following.
For each pair (R, W) in execution.[[ReadsFrom]], (W, R) is in execution.[[SynchronizesWith]] if all the following are true.
R.[[Order]] is "SeqCst".
W.[[Order]] is "SeqCst" or "Init".
If W.[[Order]] is "SeqCst", then R and W have equal ranges.
If W.[[Order]] is "Init", then for each event V such that (R, V) is in execution.[[ReadsFrom]], V.[[Order]] is "Init".
For each element eventsRecord of execution.[[EventsRecords]], the following is true.
726 © Ecma International 2019
For each pair (S, Sw) in eventsRecord.[[AgentSynchronizesWith]], (S, Sw) is in execution.[[SynchronizesWith]].
For each pair (E, D) in execution.[[HostSynchronizesWith]], (E, D) is in execution.[[SynchronizesWith]].
NOTE 1
Owing to convention, write events synchronizes-with read events, instead of read events synchronizes-with write events.
NOTE 2
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 3
For Shared Data Block events R and W such that W synchronizes-with R, R may reads-from other writes than W.
27.6.6 happens-before
For a candidate execution execution, execution.[[HappensBefore]] is the least Relation on events that satisfies the following.
NOTE
Because happens-before is a superset of agent-order, candidate executions are consistent with the single-thread evaluation
semantics of ECMAScript.
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.
NOTE 1
This clause additionally constrains "SeqCst" events on equal ranges.
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.
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.
27.8 Races
For an execution execution, two events E and D in SharedDataBlockEventSet(execution) are in a race if the following abstract
operation returns true.
1. If E is not D, then
a. If the pairs (E, D) and (D, E) are not in execution.[[HappensBefore]], then
i. If E and D are both WriteSharedMemory or ReadModifyWriteSharedMemory events and E and D do not have
disjoint ranges, then
1. Return true.
ii. If either (E, D) or (D, E) is in execution.[[ReadsFrom]], then
1. Return true.
2. Return false.
© Ecma International 2019 729
27.9 Data Races
For an execution execution, two events E and D in SharedDataBlockEventSet(execution) are in a data race if the following
abstract operation returns true.
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.
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
730 © Ecma International 2019
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 nonempty: 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
© Ecma International 2019 731
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 architectrue, such as LOCK-prefixed instructions on x86, load-exclusive/store-exclusive instructions on ARM, and load-
link/store-conditional instructions on Power.
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.
A number of local improvements to those basic patterns are also intended to be legal:
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.
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
WhiteSpace ::
<TAB>
<VT>
<FF>
<SP>
<NBSP>
© Ecma International 2019 733
<ZWNBSP>
<USP>
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence ::
<LF>
<CR>[lookahead ≠ <LF>]
<LS>
<PS>
<CR><LF>
Comment ::
MultiLineComment
SingleLineComment
MultiLineComment ::
/* MultiLineCommentCharsopt */
MultiLineCommentChars ::
MultiLineNotAsteriskChar MultiLineCommentCharsopt
* PostAsteriskCommentCharsopt
PostAsteriskCommentChars ::
MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt
* PostAsteriskCommentCharsopt
MultiLineNotAsteriskChar ::
SourceCharacter but not *
MultiLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not one of / or *
SingleLineComment ::
// SingleLineCommentCharsopt
SingleLineCommentChars ::
SingleLineCommentChar SingleLineCommentCharsopt
SingleLineCommentChar ::
SourceCharacter but not LineTerminator
CommonToken ::
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
IdentifierStart ::
UnicodeIDStart
$
_
\ UnicodeEscapeSequence
IdentifierPart ::
UnicodeIDContinue
$
\ UnicodeEscapeSequence
<ZWNJ>
<ZWJ>
UnicodeIDStart ::
any Unicode code point with the Unicode property “ID_Start”
UnicodeIDContinue ::
any Unicode code point with the Unicode property “ID_Continue”
ReservedWord ::
Keyword
FutureReservedWord
NullLiteral
BooleanLiteral
Keyword :: one of
await break case catch class const continue debugger default delete do else export
extends finally for function if import in instanceof new return super switch this
throw try typeof var void while with yield
FutureReservedWord ::
enum
The following tokens are also considered to be FutureReservedWords when parsing strict mode code:
DivPunctuator ::
/
/=
RightBracePunctuator ::
}
NullLiteral ::
null
BooleanLiteral ::
true
false
NumericLiteral ::
DecimalLiteral
BinaryIntegerLiteral
OctalIntegerLiteral
HexIntegerLiteral
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalIntegerLiteral ExponentPartopt
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigitsopt
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit :: one of
0123456789
NonZeroDigit :: one of
123456789
ExponentPart ::
ExponentIndicator SignedInteger
SignedInteger ::
DecimalDigits
+ DecimalDigits
- DecimalDigits
BinaryIntegerLiteral ::
0b BinaryDigits
0B BinaryDigits
BinaryDigits ::
BinaryDigit
BinaryDigits BinaryDigit
BinaryDigit :: one of
01
OctalIntegerLiteral ::
0o OctalDigits
0O OctalDigits
OctalDigits ::
OctalDigit
OctalDigits OctalDigit
OctalDigit :: one of
01234567
HexIntegerLiteral ::
0x HexDigits
0X HexDigits
HexDigits ::
HexDigit
HexDigits HexDigit
HexDigit :: one of
0123456789abcdefABCDEF
StringLiteral ::
" DoubleStringCharactersopt "
' SingleStringCharactersopt '
DoubleStringCharacters ::
DoubleStringCharacter DoubleStringCharactersopt
DoubleStringCharacter ::
SourceCharacter but not one of " or \ or LineTerminator
<LS>
<PS>
\ EscapeSequence
LineContinuation
SingleStringCharacter ::
SourceCharacter but not one of ' or \ or LineTerminator
<LS>
<PS>
\ EscapeSequence
LineContinuation
LineContinuation ::
\ LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence ::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter :: one of
'"\bfnrtv
NonEscapeCharacter ::
SourceCharacter but not one of EscapeCharacter or LineTerminator
EscapeCharacter ::
SingleEscapeCharacter
DecimalDigit
x
u
HexEscapeSequence ::
x HexDigit HexDigit
UnicodeEscapeSequence ::
u Hex4Digits
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 IdentifierPart
Template ::
NoSubstitutionTemplate
TemplateHead
© Ecma International 2019 739
NoSubstitutionTemplate ::
` TemplateCharactersopt `
TemplateHead ::
` TemplateCharactersopt ${
TemplateSubstitutionTail ::
TemplateMiddle
TemplateTail
TemplateMiddle ::
} TemplateCharactersopt ${
TemplateTail ::
} TemplateCharactersopt `
TemplateCharacters ::
TemplateCharacter TemplateCharactersopt
TemplateCharacter ::
$ [lookahead ≠ {]
\ EscapeSequence
\ NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter but not one of ` or \ or $ or LineTerminator
NotEscapeSequence ::
0 DecimalDigit
DecimalDigit but not 0
x [lookahead ∉ HexDigit]
x HexDigit [lookahead ∉ HexDigit]
u [lookahead ∉ HexDigit] [lookahead ≠ {]
u HexDigit [lookahead ∉ HexDigit]
u HexDigit HexDigit [lookahead ∉ HexDigit]
u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit]
u { [lookahead ∉ HexDigit]
u { NotCodePoint [lookahead ∉ HexDigit]
u { CodePoint [lookahead ∉ HexDigit] [lookahead ≠ }]
NotCodePoint ::
HexDigits but only if MV of HexDigits > 0x10FFFF
CodePoint ::
HexDigits but only if MV of HexDigits ≤ 0x10FFFF
BindingIdentifier[Yield, Await] :
Identifier
yield
await
Identifier :
IdentifierName but not ReservedWord
AsyncArrowBindingIdentifier[Yield] :
BindingIdentifier[?Yield, +Await]
LabelIdentifier[Yield, Await] :
Identifier
[~Yield] yield
[~Await] await
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] )
© Ecma International 2019 741
( Expression[+In, ?Yield, ?Await] , ... BindingIdentifier[?Yield, ?Await] )
( Expression[+In, ?Yield, ?Await] , ... BindingPattern[?Yield, ?Await] )
ParenthesizedExpression[Yield, Await] :
( Expression[+In, ?Yield, ?Await] )
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
ArrayLiteral[Yield, Await] :
[ Elisionopt ]
[ ElementList[?Yield, ?Await] ]
[ ElementList[?Yield, ?Await] , Elisionopt ]
ElementList[Yield, Await] :
Elisionopt AssignmentExpression[+In, ?Yield, ?Await]
Elisionopt SpreadElement[?Yield, ?Await]
ElementList[?Yield, ?Await] , Elisionopt AssignmentExpression[+In, ?Yield, ?Await]
ElementList[?Yield, ?Await] , Elisionopt 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] :
742 © Ecma International 2019
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]
MemberExpression[Yield, Await] :
PrimaryExpression[?Yield, ?Await]
MemberExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ]
MemberExpression[?Yield, ?Await] . IdentifierName
MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
© Ecma International 2019 743
SuperProperty[?Yield, ?Await]
MetaProperty
new MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
SuperProperty[Yield, Await] :
super [ Expression[+In, ?Yield, ?Await] ]
super . IdentifierName
MetaProperty :
NewTarget
NewTarget :
new . target
NewExpression[Yield, Await] :
MemberExpression[?Yield, ?Await]
new NewExpression[?Yield, ?Await]
CallExpression[Yield, Await] :
CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await]
SuperCall[?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]
CoverCallExpressionAndAsyncArrowHead[Yield, Await] :
MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
CallMemberExpression[Yield, Await] :
MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
SuperCall[Yield, Await] :
super Arguments[?Yield, ?Await]
Arguments[Yield, Await] :
()
( ArgumentList[?Yield, ?Await] )
( ArgumentList[?Yield, ?Await] , )
LeftHandSideExpression[Yield, Await] :
NewExpression[?Yield, ?Await]
CallExpression[?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]
© Ecma International 2019 745
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]
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] :
[ Elisionopt AssignmentRestElement[?Yield, ?Await] opt ]
[ AssignmentElementList[?Yield, ?Await] ]
[ AssignmentElementList[?Yield, ?Await] , Elisionopt 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]
© Ecma International 2019 747
AssignmentElisionElement[Yield, Await] :
Elisionopt 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]
AssignmentOperator : one of
*= /= %= += -= <<= >>= >>>= &= ^= |= **=
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]
LetOrConst :
let
const
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] :
[ Elisionopt BindingRestElement[?Yield, ?Await] opt ]
[ BindingElementList[?Yield, ?Await] ]
[ BindingElementList[?Yield, ?Await] , Elisionopt 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] :
Elisionopt BindingElement[?Yield, ?Await]
BindingProperty[Yield, Await] :
SingleNameBinding[?Yield, ?Await]
PropertyName[?Yield, ?Await] : BindingElement[?Yield, ?Await]
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] ;
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] ;
ThrowStatement[Yield, Await] :
throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ;
CatchParameter[Yield, Await] :
BindingIdentifier[?Yield, ?Await]
BindingPattern[?Yield, ?Await]
DebuggerStatement :
debugger ;
FunctionExpression :
© Ecma International 2019 753
function BindingIdentifier[~Yield, ~Await] opt ( FormalParameters[~Yield, ~Await] ) {
FunctionBody[~Yield, ~Await] }
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]
FunctionBody[Yield, Await] :
FunctionStatementList[?Yield, ?Await]
FunctionStatementList[Yield, Await] :
StatementList[?Yield, ?Await, +Return] opt
ArrowParameters[Yield, Await] :
BindingIdentifier[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
ConciseBody[In] :
[lookahead ≠ {] AssignmentExpression[?In, ~Yield, ~Await]
{ FunctionBody[~Yield, ~Await] }
ArrowFormalParameters[Yield, Await] :
AsyncConciseBody[In] :
[lookahead ≠ {] AssignmentExpression[?In, ~Yield, +Await]
{ AsyncFunctionBody }
AsyncArrowHead :
async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]
MethodDefinition[Yield, Await] :
PropertyName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, ~Await] ) {
FunctionBody[~Yield, ~Await] }
GeneratorMethod[?Yield, ?Await]
AsyncMethod[?Yield, ?Await]
AsyncGeneratorMethod[?Yield, ?Await]
get PropertyName[?Yield, ?Await] ( ) { FunctionBody[~Yield, ~Await] }
set PropertyName[?Yield, ?Await] ( PropertySetParameterList ) { FunctionBody[~Yield, ~Await] }
PropertySetParameterList :
FormalParameter[~Yield, ~Await]
GeneratorMethod[Yield, Await] :
* PropertyName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, ~Await] ) { GeneratorBody }
GeneratorExpression :
function * BindingIdentifier[+Yield, ~Await] opt ( FormalParameters[+Yield, ~Await] ) { GeneratorBody }
GeneratorBody :
© Ecma International 2019 755
FunctionBody[+Yield, ~Await]
YieldExpression[In, Await] :
yield
yield [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await]
yield [no LineTerminator here] * AssignmentExpression[?In, +Yield, ?Await]
AsyncGeneratorMethod[Yield, Await] :
async [no LineTerminator here] * PropertyName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await]
) { AsyncGeneratorBody }
AsyncGeneratorBody }
AsyncGeneratorExpression :
async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await] opt (
FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody }
AsyncGeneratorBody :
FunctionBody[+Yield, +Await]
AsyncMethod[Yield, Await] :
async [no LineTerminator here] PropertyName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] )
{ AsyncFunctionBody }
AsyncFunctionExpression :
async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody }
async [no LineTerminator here] function BindingIdentifier[~Yield, +Await] (
FormalParameters[~Yield, +Await] ) { AsyncFunctionBody }
AsyncFunctionBody :
FunctionBody[~Yield, +Await]
AwaitExpression[Yield] :
await UnaryExpression[?Yield, +Await]
756 © Ecma International 2019
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]
;
ScriptBody :
StatementList[~Yield, ~Await, ~Return]
Module :
ModuleBodyopt
ModuleBody :
ModuleItemList
ModuleItemList :
ModuleItem
ModuleItemList ModuleItem
ModuleItem :
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
IdentifierName as ImportedBinding
ModuleSpecifier :
StringLiteral
ImportedBinding :
BindingIdentifier[~Yield, ~Await]
ExportDeclaration :
export * FromClause ;
export ExportClause FromClause ;
export ExportClause ;
ExportClause :
{}
{ ExportsList }
{ ExportsList , }
ExportsList :
ExportSpecifier
ExportsList , ExportSpecifier
ExportSpecifier :
IdentifierName
IdentifierName as IdentifierName
StrWhiteSpace :::
StrWhiteSpaceChar StrWhiteSpaceopt
StrWhiteSpaceChar :::
WhiteSpace
LineTerminator
StrNumericLiteral :::
StrDecimalLiteral
BinaryIntegerLiteral
OctalIntegerLiteral
HexIntegerLiteral
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+ StrUnsignedDecimalLiteral
- StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral :::
© Ecma International 2019 759
Infinity
DecimalDigits . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalDigits ExponentPartopt
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit :: one of
0123456789
ExponentPart ::
ExponentIndicator SignedInteger
ExponentIndicator :: one of
eE
SignedInteger ::
DecimalDigits
+ DecimalDigits
- DecimalDigits
HexIntegerLiteral ::
0x HexDigits
0X HexDigits
HexDigit :: one of
0123456789abcdefABCDEF
All grammar symbols not explicitly defined by the StringNumericLiteral grammar have the definitions used in the Lexical
Grammar for numeric literals.
uriCharacters :::
uriCharacter uriCharactersopt
uriCharacter :::
uriReserved
uriUnescaped
uriEscaped
uriUnescaped :::
uriAlpha
DecimalDigit
uriMark
uriEscaped :::
% HexDigit HexDigit
Disjunction[U, N] ::
Alternative[?U, ?N]
Alternative[?U, ?N] | Disjunction[?U, ?N]
Alternative[U, N] ::
[empty]
Alternative[?U, ?N] Term[?U, ?N]
Term[U, N] ::
Assertion[?U, ?N]
Atom[?U, ?N]
Atom[?U, ?N] Quantifier
Assertion[U, N] ::
^
$
\b
\B
( ? = Disjunction[?U, ?N] )
( ? ! Disjunction[?U, ?N] )
( ? <= Disjunction[?U, ?N] )
( ? <! Disjunction[?U, ?N] )
© Ecma International 2019 761
Quantifier ::
QuantifierPrefix
QuantifierPrefix ?
QuantifierPrefix ::
*
+
?
{ DecimalDigits }
{ DecimalDigits , }
{ DecimalDigits , DecimalDigits }
Atom[U, N] ::
PatternCharacter
.
\ AtomEscape[?U, ?N]
CharacterClass[?U]
( GroupSpecifier[?U] Disjunction[?U, ?N] )
( ? : Disjunction[?U, ?N] )
SyntaxCharacter :: one of
^$\.*+?()[]{}|
PatternCharacter ::
SourceCharacter but not SyntaxCharacter
AtomEscape[U, N] ::
DecimalEscape
CharacterClassEscape[?U]
CharacterEscape[?U]
[+N] k GroupName[?U]
CharacterEscape[U] ::
ControlEscape
c ControlLetter
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
RegExpUnicodeEscapeSequence[?U]
IdentityEscape[?U]
ControlEscape :: one of
fnrtv
ControlLetter :: one of
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
762 © Ecma International 2019
GroupSpecifier[U] ::
[empty]
? GroupName[?U]
GroupName[U] ::
< RegExpIdentifierName[?U] >
RegExpIdentifierName[U] ::
RegExpIdentifierStart[?U]
RegExpIdentifierName[?U] RegExpIdentifierPart[?U]
RegExpIdentifierStart[U] ::
UnicodeIDStart
$
_
\ RegExpUnicodeEscapeSequence[?U]
RegExpIdentifierPart[U] ::
UnicodeIDContinue
$
\ RegExpUnicodeEscapeSequence[?U]
<ZWNJ>
<ZWJ>
RegExpUnicodeEscapeSequence[U] ::
[+U] u LeadSurrogate \u TrailSurrogate
[+U] u LeadSurrogate
[+U] u TrailSurrogate
[+U] u NonSurrogate
[~U] u Hex4Digits
[+U] u{ CodePoint }
Each \u TrailSurrogate for which the choice of associated u LeadSurrogate is ambiguous shall be associated with the nearest
possible u LeadSurrogate that would otherwise have no corresponding \u TrailSurrogate.
LeadSurrogate ::
Hex4Digits but only if the SV of Hex4Digits is in the inclusive range 0xD800 to 0xDBFF
TrailSurrogate ::
Hex4Digits but only if the SV of Hex4Digits is in the inclusive range 0xDC00 to 0xDFFF
NonSurrogate ::
Hex4Digits but only if the SV of Hex4Digits is not in the inclusive range 0xD800 to 0xDFFF
DecimalEscape ::
NonZeroDigit DecimalDigitsopt [lookahead ∉ DecimalDigit]
CharacterClassEscape[U] ::
d
D
s
S
w
W
[+U] p{ UnicodePropertyValueExpression }
[+U] P{ UnicodePropertyValueExpression }
UnicodePropertyValueExpression ::
UnicodePropertyName = UnicodePropertyValue
LoneUnicodePropertyNameOrValue
UnicodePropertyName ::
UnicodePropertyNameCharacters
UnicodePropertyNameCharacters ::
UnicodePropertyNameCharacter UnicodePropertyNameCharactersopt
UnicodePropertyValue ::
UnicodePropertyValueCharacters
LoneUnicodePropertyNameOrValue ::
UnicodePropertyValueCharacters
UnicodePropertyValueCharacters ::
UnicodePropertyValueCharacter UnicodePropertyValueCharactersopt
UnicodePropertyValueCharacter ::
UnicodePropertyNameCharacter
0
1
2
3
4
5
6
UnicodePropertyNameCharacter ::
ControlLetter
_
CharacterClass[U] ::
[ [lookahead ∉ { ^ }] ClassRanges[?U] ]
[ ^ ClassRanges[?U] ]
ClassRanges[U] ::
[empty]
NonemptyClassRanges[?U]
NonemptyClassRanges[U] ::
ClassAtom[?U]
ClassAtom[?U] NonemptyClassRangesNoDash[?U]
ClassAtom[?U] - ClassAtom[?U] ClassRanges[?U]
NonemptyClassRangesNoDash[U] ::
ClassAtom[?U]
ClassAtomNoDash[?U] NonemptyClassRangesNoDash[?U]
ClassAtomNoDash[?U] - ClassAtom[?U] ClassRanges[?U]
ClassAtom[U] ::
-
ClassAtomNoDash[?U]
ClassAtomNoDash[U] ::
SourceCharacter but not one of \ or ] or -
\ ClassEscape[?U]
ClassEscape[U] ::
b
[+U] -
CharacterClassEscape[?U]
CharacterEscape[?U]
NOTE
This annex describes various legacy features and other characteristics of web browser based ECMAScript implementations. 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.
Syntax
NumericLiteral ::
DecimalLiteral
BinaryIntegerLiteral
OctalIntegerLiteral
HexIntegerLiteral
LegacyOctalIntegerLiteral
LegacyOctalIntegerLiteral ::
0 OctalDigit
LegacyOctalIntegerLiteral OctalDigit
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigitsopt
NonOctalDecimalIntegerLiteral
NonOctalDecimalIntegerLiteral ::
0 NonOctalDigit
LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit
NonOctalDecimalIntegerLiteral DecimalDigit
LegacyOctalLikeDecimalIntegerLiteral ::
NonOctalDigit :: one of
89
Syntax
EscapeSequence ::
CharacterEscapeSequence
LegacyOctalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
LegacyOctalEscapeSequence ::
OctalDigit [lookahead ∉ OctalDigit]
ZeroToThree OctalDigit [lookahead ∉ OctalDigit]
FourToSeven OctalDigit
ZeroToThree OctalDigit OctalDigit
ZeroToThree :: one of
0123
FourToSeven :: one of
4567
© Ecma International 2019 767
This definition of EscapeSequence is not used in strict mode or when parsing TemplateCharacter.
Syntax
Comment ::
MultiLineComment
SingleLineComment
SingleLineHTMLOpenComment
SingleLineHTMLCloseComment
SingleLineDelimitedComment
MultiLineComment ::
/* FirstCommentLineopt LineTerminator MultiLineCommentCharsopt */ HTMLCloseCommentopt
FirstCommentLine ::
SingleLineDelimitedCommentChars
SingleLineHTMLOpenComment ::
<!-- SingleLineCommentCharsopt
SingleLineHTMLCloseComment ::
LineTerminatorSequence HTMLCloseComment
768 © Ecma International 2019
SingleLineDelimitedComment ::
/* SingleLineDelimitedCommentCharsopt */
HTMLCloseComment ::
WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt --> SingleLineCommentCharsopt
SingleLineDelimitedCommentChars ::
SingleLineNotAsteriskChar SingleLineDelimitedCommentCharsopt
* SingleLinePostAsteriskCommentCharsopt
SingleLineNotAsteriskChar ::
SourceCharacter but not one of * or LineTerminator
SingleLinePostAsteriskCommentChars ::
SingleLineNotForwardSlashOrAsteriskChar SingleLineDelimitedCommentCharsopt
* SingleLinePostAsteriskCommentCharsopt
SingleLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not one of / or * or LineTerminator
WhiteSpaceSequence ::
WhiteSpace WhiteSpaceSequenceopt
SingleLineDelimitedCommentSequence ::
SingleLineDelimitedComment WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt
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.
This alternative pattern grammar and semantics only changes the syntax and semantics of BMP patterns. The following
grammar extensions include productions parameterized with the [U] parameter. However, none of these extensions change
the syntax of Unicode patterns recognized when parsing with the [U] parameter present on the goal symbol.
Syntax
Term[U, N] ::
[+U] Assertion[+U, ?N]
Assertion[U, N] ::
^
$
\b
\B
[+U] ( ? = Disjunction[+U, ?N] )
[+U] (? ! Disjunction[+U, ?N] )
[~U] QuantifiableAssertion[?N]
QuantifiableAssertion[N] ::
( ? = Disjunction[~U, ?N] )
( ? ! Disjunction[~U, ?N] )
ExtendedAtom[N] ::
.
\ AtomEscape[~U, ?N]
\ [lookahead = c]
CharacterClass[~U]
( Disjunction[~U, ?N] )
( ? : Disjunction[~U, ?N] )
InvalidBracedQuantifier
ExtendedPatternCharacter
InvalidBracedQuantifier ::
{ DecimalDigits }
{ DecimalDigits , }
{ DecimalDigits , DecimalDigits }
ExtendedPatternCharacter ::
SourceCharacter but not one of ^ $ \ . * + ? ( ) [ |
AtomEscape[U, N] ::
[+U] DecimalEscape
[~U] DecimalEscape but only if the CapturingGroupNumber of DecimalEscape is <= _NcapturingParens_
CharacterClassEscape[?U]
CharacterEscape[~U, ?N]
[+N] k GroupName[?U]
IdentityEscape[U, N] ::
[+U] SyntaxCharacter
[+U] /
[~U] SourceCharacterIdentityEscape[?N]
SourceCharacterIdentityEscape[N] ::
[~N] SourceCharacter but not c
[+N] SourceCharacter but not one of c or k
ClassAtomNoDash[U, N] ::
SourceCharacter but not one of \ or ] or -
\ ClassEscape[?U, ?N]
\ [lookahead = c]
ClassEscape[U, N] ::
b
[+U] -
[~U] c ClassControlLetter
CharacterClassEscape[?U]
CharacterEscape[?U, ?N]
ClassControlLetter ::
DecimalDigit
_
NOTE
When the same left hand sides occurs with both [+U] and [~U] guards it is to control the disambiguation priority.
ExtendedAtom :: InvalidBracedQuantifier
It is a Syntax Error if IsCharacterClass of ClassAtomNoDash is true or IsCharacterClass of ClassAtom is true and this
production has a [U] parameter.
ClassAtomNoDash :: \ [lookahead = c]
1. Return false.
ClassAtomNoDash :: \ [lookahead = c]
ClassEscape :: c ClassControlLetter
CharacterEscape :: LegacyOctalEscapeSequence
1. Evaluate the SV of the LegacyOctalEscapeSequence (see B.1.2) to obtain a code unit cu.
2. Return the numeric value of cu.
Within 21.2.2.5 reference to “ Atom :: ( GroupSpecifier Disjunction ) ” are to be interpreted as meaning “ Atom :: (
GroupSpecifier Disjunction ) ” or “ ExtendedAtom :: ( Disjunction ) ”.
The production Term :: QuantifiableAssertion Quantifier evaluates the same as the production Term :: Atom Quantifier but
with QuantifiableAssertion substituted for Atom.
The production Term :: ExtendedAtom Quantifier evaluates the same as the production Term :: Atom Quantifier but with
ExtendedAtom substituted for Atom.
Assertion (21.2.2.6) evaluation rules for the Assertion :: ( ? = Disjunction ) and Assertion :: ( ? ! Disjunction )
productions are also used for the QuantifiableAssertion productions, but with QuantifiableAssertion substituted for Assertion.
Atom (21.2.2.8) evaluation rules for the Atom productions except for Atom :: PatternCharacter are also used for the
ExtendedAtom productions, but with ExtendedAtom substituted for Atom. The following evaluation rules are also added:
1. Let A be the CharSet containing the single character \ U+005C (REVERSE SOLIDUS).
2. Call CharacterSetMatcher(A, false) and return its Matcher result.
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.
The abstract operation CharacterRangeOrUnion takes two CharSet parameters A and B and performs the following steps:
The escape 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.
For those code units being replaced whose value is 0x00FF or less, a two-digit escape sequence of the form %xx is used. For
those characters being replaced whose code unit value is greater than 0x00FF, a four-digit escape sequence of the form
%uxxxx is used.
The escape function is the %escape% intrinsic object. When the escape function is called with one argument string, the
following steps are taken:
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.
The unescape 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.
B.2.2.1 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:
The value of the [[Get]] attribute is a built-in function that requires no arguments. It performs the following steps:
The value of the [[Set]] attribute is a built-in function that takes an argument proto. It performs the following steps:
B.2.2.4 Object.prototype.__lookupGetter__ ( P )
When the __lookupGetter__ method is called with argument P, the following steps are taken:
B.2.2.5 Object.prototype.__lookupSetter__ ( P )
When the __lookupSetter__ method is called with argument P, the following steps are taken:
NOTE
The substr function 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.
When the anchor method is called with argument name, the following steps are taken:
The abstract operation CreateHTML is called with arguments string, tag, attribute, and value. The arguments tag and attribute
must be String values. The following steps are taken:
B.2.3.3 String.prototype.big ( )
When the big method is called with no arguments, the following steps are taken:
B.2.3.4 String.prototype.blink ( )
When the blink method is called with no arguments, the following steps are taken:
B.2.3.5 String.prototype.bold ( )
When the bold method is called with no arguments, the following steps are taken:
B.2.3.6 String.prototype.fixed ( )
When the fixed method is called with no arguments, the following steps are taken:
B.2.3.9 String.prototype.italics ( )
When the italics method is called with no arguments, the following steps are taken:
B.2.3.11 String.prototype.small ( )
When the small method is called with no arguments, the following steps are taken:
B.2.3.12 String.prototype.strike ( )
When the strike method is called with no arguments, the following steps are taken:
B.2.3.13 String.prototype.sub ( )
When the sub method is called with no arguments, the following steps are taken:
When the sup method is called with no arguments, the following steps are taken:
B.2.3.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 the same function object as the initial value of the
String.prototype.trimStart property.
B.2.3.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 the same function object as the initial value of the
String.prototype.trimEnd property.
B.2.4.1 Date.prototype.getYear ( )
NOTE
The getFullYear method is preferred for nearly all purposes, because it avoids the “year 2000 problem.”
When the getYear method is called with no arguments, the following steps are taken:
When the setYear method is called with one argument year, the following steps are taken:
B.2.4.3 Date.prototype.toGMTString ( )
NOTE
The property toUTCString is preferred. The toGMTString property is provided principally for compatibility with old code. It
is recommended that the toUTCString property be used in new ECMAScript code.
The function object that is the initial value of Date.prototype.toGMTString is the same function object that is the initial
value of Date.prototype.toUTCString.
When the compile method is called with arguments pattern and flags, the following steps are taken:
NOTE
The compile method completely reinitializes the this object 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.
ObjectLiteral : { PropertyDefinitionList }
ObjectLiteral : { 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 .
NOTE
The List returned by PropertyNameList does not include string literal property names defined as using a
ComputedPropertyName.
LabelledItem : FunctionDeclaration
It is a Syntax Error if any strict mode source code matches this rule.
NOTE
The early error rules for WithStatement, IfStatement, and IterationStatement prevent these statements from containing a
labelled FunctionDeclaration in non-strict code.
One or more FunctionDeclarations whose BindingIdentifier is the name f occur within the function code of an
enclosing function g and that declaration is nested within a Block.
No other declaration of f that is not a var declaration occurs within the function code of g
All occurrences of f as an IdentifierReference are within the StatementList of the Block containing the declaration of f.
2. 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 FunctionDeclarations whose BindingIdentifier is the name f occur within the function code of an
enclosing function g and that declaration is nested within a Block.
No other declaration of f that is not a var declaration occurs within the function code of g
There may be occurrences of f as an IdentifierReference within the StatementList of the Block containing the
declaration of f.
There is at least one occurrence of f as an IdentifierReference within another function h that is nested within g and no
other declaration of f shadows the references to f from within h.
All invocations of h occur after the declaration of f has been evaluated.
3. 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 f occur within the function code of an
enclosing function g and that declaration is nested within a Block.
No other declaration of f that is not a var declaration occurs within the function code of g
There may be occurrences of f as an IdentifierReference within the StatementList of the Block containing the
declaration of f.
There is at least one occurrence of f as an IdentifierReference within the function code of g that lexically follows the
The first use case is interoperable with the semantics of Block level function declarations provided by ECMAScript 2015. Any
pre-existing ECMAScript code that employs that use case will operate using the Block level function declarations semantics
defined by clauses 9, 13, and 14 of this specification.
ECMAScript 2015 interoperability for the second and third use cases requires the following extensions to the clause 9, clause
14, clause 18.2.1 and clause 15.1.11 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.
Block : { StatementList }
It is a Syntax Error if the LexicallyDeclaredNames of StatementList contains any duplicate entries, unless the source code
matching this production is not strict mode code and the duplicate entries are only bound by FunctionDeclarations.
For web browser compatibility, that rule is modified with the addition of the highlighted text:
It is a Syntax Error if the LexicallyDeclaredNames of CaseBlock contains any duplicate entries, unless the source code
© Ecma International 2019 787
matching this production is not strict mode code and the duplicate entries are only bound by FunctionDeclarations.
During BlockDeclarationInstantiation the following steps are performed in place of step 4.b.iii:
This production only applies when parsing non-strict code. Code matching 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 code. The semantics of such a synthetic BlockStatement includes the web legacy
compatibility semantics specified in B.3.3.
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 18.2.1.3 as follows:
1. If thisEnvRec is not the Environment Record for a Catch clause, throw a SyntaxError exception.
1. If thisEnvRec is not the Environment Record for a Catch clause, let bindingExists be true.
The static semantics of ContainsDuplicateLabels in 13.7.5.3 are augmented with the following:
The static semantics of ContainsUndefinedBreakTarget in 13.7.5.4 are augmented with the following:
The static semantics of ContainsUndefinedContinueTarget in 13.7.5.5 are augmented with the following:
The static semantics of IsDestructuring in 13.7.5.6 are augmented with the following:
BindingIdentifier :
© Ecma International 2019 789
Identifier
yield
await
1. Return false.
The static semantics of VarDeclaredNames in 13.7.5.7 are augmented with the following:
The static semantics of VarScopedDeclarations in 13.7.5.8 are augmented with the following:
The runtime semantics of LabelledEvaluation in 13.7.5.11 are augmented with the following:
NOTE
Objects with an [[IsHTMLDDA]] internal slot are never created by this specification. However, the document.all object in
web browsers is a host-created 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.
The result column in Table 9 for an argument type of Object is replaced with the following algorithm:
The following steps are inserted after step 3 of the Abstract Equality Comparison algorithm:
1. If Type(x) is Object and x has an [[IsHTMLDDA]] internal slot and y is either null or undefined, return true.
2. If x is either null or undefined and Type(y) is Object and y has an [[IsHTMLDDA]] internal slot, return true.
The following table entry is inserted into Table 35 immediately preceeding the entry for "Object (implements [[Call]])":
implements, interface, let, package, private, protected, public, static, and yield are reserved words within
strict mode code. (11.6.2).
A conforming implementation, when processing strict mode code, must not extend, as described in B.1.1, the syntax of
NumericLiteral to include LegacyOctalIntegerLiteral, nor extend the syntax of DecimalIntegerLiteral to include
NonOctalDecimalIntegerLiteral.
A conforming implementation, when processing strict mode code, may not extend the syntax of EscapeSequence to
include LegacyOctalEscapeSequence as described in B.1.2.
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.4.9). 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 has
the value false. In these cases a TypeError exception is thrown (12.15).
An IdentifierReference with the StringValue "eval" or "arguments" may not appear as the LeftHandSideExpression of an
Assignment operator (12.15) or of an UpdateExpression (12.4) or as the UnaryExpression operated upon by a Prefix
Increment (12.4.6) or a Prefix Decrement (12.4.7) operator.
Arguments objects for strict functions define a non-configurable accessor property "callee" which throws a TypeError
exception on access (9.4.4.6).
© Ecma International 2019 791
Arguments objects for strict functions do not dynamically share their array-indexed property values with the
corresponding formal parameter bindings of their functions. (9.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. (9.2.15).
It is a SyntaxError if the StringValue of a BindingIdentifier is "eval" or "arguments" within strict mode code (12.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
(18.2.1).
If this is evaluated within strict mode code, then the this value is not coerced to an object. A this value of 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 (9.2.1.2, 19.2.3.1, 19.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 (12.5.3.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 } (12.5.3.2).
Strict mode code may not include a WithStatement. The occurrence of a WithStatement in such a context is a SyntaxError
(13.11.1).
It is a SyntaxError if a CatchParameter occurs within strict mode code and BoundNames of CatchParameter contains
either eval or arguments (13.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
(14.1.2, 19.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.
9.4.2.1: The 5th 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.
20.3.1.14: 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
object is never observably -0 and methods that return time values never return -0.
20.3.1.15: If a time zone offset is not present, the local time zone is used. Edition 5.1 incorrectly stated that a missing time
792 © Ecma International 2019
zone should be interpreted as "z".
20.3.4.36: If the year cannot be represented using the Date Time String Format specified in 20.3.1.15 a RangeError exception
is thrown. Previous editions did not specify the behaviour for that case.
20.3.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 is "Invalid Date".
21.2.3.1, 21.2.3.2.4: 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 "/".
21.2.5.7, 21.2.5.9: 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 is flag 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 one only if the pattern matched the empty string.
22.1.3.27, 22.1.3.27.1: 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-dependent. In practice, implementations call ToNumber.
6.2.4: In ECMAScript 2015, Function calls are not allowed to return a Reference value.
11.6: 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.
11.9.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.
12.2.6.1: In ECMAScript 2015, it is no longer an early error to have duplicate property names in Object Initializers.
12.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.
13.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.
13.5: In ECMAScript 2015, a StatementListItem beginning with the token let followed by the token [ is the start of a
13.6.7: In ECMAScript 2015, the normal completion value of an IfStatement is never the value empty. If no Statement part is
evaluated or if the evaluated Statement part produces a normal completion whose value is empty, the completion value of the
IfStatement is undefined.
13.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.
13.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.
13.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.
13.7: In ECMAScript 2015, the completion value of an IterationStatement is never the value empty. If the Statement part of an
IterationStatement is not evaluated or if the final evaluation of the Statement part produces a completion whose value is empty,
the completion value of the IterationStatement is undefined.
13.11.7: In ECMAScript 2015, the normal completion value of a WithStatement is never the value empty. If evaluation of the
Statement part of a WithStatement produces a normal completion whose value is empty, the completion value of the
WithStatement is undefined.
13.12.11: In ECMAScript 2015, the completion value of a SwitchStatement is never the value empty. If the CaseBlock part of a
SwitchStatement produces a completion whose value is empty, the completion value of the SwitchStatement is undefined.
13.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.
13.15, 18.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.
13.15.8: In ECMAScript 2015, the completion value of a TryStatement is never the value empty. If the Block part of a
TryStatement evaluates to a normal completion whose value is empty, the completion value 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 whose value is empty, the completion value of the TryStatement is undefined if there is no Finally clause or if its
Finally clause evalulates to an empty normal completion.
14.3.8 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.
19.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
794 © Ecma International 2019
thrown.
19.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.
19.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.
19.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.
19.1.2.14: 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.
19.1.2.15: 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.
19.1.2.16: 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.
19.1.2.17: 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.
19.1.2.18: 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.
19.1.2.20: 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.
19.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 %FunctionPrototype%.
19.2.4.1: In ECMAScript 2015, the "length" property of function instances is configurable. In previous editions it was non-
configurable.
19.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.
20.3.4 In ECMAScript 2015, the Date prototype object is not a Date instance. In previous editions it was a Date instance whose
21.1.3.10 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.
21.1.3.24 and 21.1.3.26 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.
21.1.3.27 In ECMAScript 2015, the String.prototype.trim method is defined to recognize white space code points that
may exists 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.
21.2.3.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.
21.2.5 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.
21.2.5 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.
F 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.
G Bibliography
1. IEEE Std 754-2008: IEEE Standard for Floating-Point Arithmetic. Institute of Electrical and Electronic Engineers, New York
(2008)
2. The Unicode Standard, available at <https://unicode.org/versions/latest>
3. Unicode Technical Note #5: Canonical Equivalence in Applications, available at <https://unicode.org/notes/tn5/>
4. Unicode Technical Standard #10: Unicode Collation Algorithm, available at <https://unicode.org/reports/tr10/>
5. Unicode Standard Annex #15, Unicode Normalization Forms, available at <https://unicode.org/reports/tr15/>
CH-1204 Geneva
Web: https://ecma-international.org/
Copyright Notice
© 2019 Ecma International
This document may be copied, published and distributed to others, and certain derivative works of it may be prepared, copied,
published, and distributed, in whole or in part, provided that the above copyright notice and this Copyright License and
Disclaimer are included on all such copies and derivative works. The only derivative works that are permissible under this
Copyright License and Disclaimer are:
(i) works which incorporate all or portion of this document for the purpose of providing commentary or explanation (such as
an annotated version of the document),
(ii) works which incorporate all or portion of this document for the purpose of incorporating features that provide
accessibility,
(iii) translations of this document into languages other than English and into different formats and
(iv) works by making use of this specification in standard conformant products by implementing (e.g. by copy and paste
wholly or partly) the functionality therein.
However, the content of this document itself may not be modified in any way, including by removing the copyright notice or
The official version of an Ecma International document is the English language version on the Ecma International website. In
the event of discrepancies between a translated version and the official version, the official version shall govern.
The limited permissions granted above are perpetual and will not be revoked by Ecma International or its successors or
assigns.
This document and the information contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL DISCLAIMS
ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
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:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. 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.
3. 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.