Ecmascript 201 8 Language Specification: Ecma-262
Ecmascript 201 8 Language Specification: Ecma-262
ECMAScript® 2018
Language Specification
Reference number
ECMA-123:2009
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 http://www.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.
Community:
Refer to the colophon for more information on how this document is created.
Table of Contents
Introduction
1 Scope
2 Conformance
3 Normative References
4 Overview
4.1 Web Scripting
4.2 ECMAScript Overview
4.2.1 Objects
4.2.2 The Strict Variant of ECMAScript
4.3 Terms and Definitions
Introduction
This Ecma Standard defines the ECMAScript 2018 Language. It is the ninth edition of the ECMAScript Language
Specification. Since publication of the first edition in 1997, ECMAScript has grown to be one of the world's most
widely used general-purpose programming languages. It is best known as the language embedded in web browsers
but has also been widely adopted for server and embedded applications.
ECMAScript is based on several originating technologies, the most well-known being JavaScript (Netscape) and
JScript (Microsoft). The language was invented by Brendan Eich at Netscape and first appeared in that company's
Navigator 2.0 browser. It has appeared in all subsequent browsers from Netscape and in all browsers from Microsoft
starting with Internet Explorer 3.0.
The development of the ECMAScript Language Specification started in November 1996. The first edition of this Ecma
Standard was adopted by the Ecma General Assembly of June 1997.
That Ecma Standard was submitted to ISO/IEC JTC 1 for adoption under the fast-track procedure, and approved as
international standard ISO/IEC 16262, in April 1998. The Ecma General Assembly of June 1998 approved the second
edition of ECMA-262 to keep it fully aligned with ISO/IEC 16262. Changes between the first and the second edition
are editorial in nature.
The third edition of the Standard introduced powerful regular expressions, better string handling, new control
statements, try/catch exception handling, tighter definition of errors, formatting for numeric output and minor
changes in anticipation of future language growth. The third edition of the ECMAScript standard was adopted by the
Ecma General Assembly of December 1999 and published as ISO/IEC 16262:2002 in June 2002.
After publication of the third edition, ECMAScript achieved massive adoption in conjunction with the World Wide
Web where it has become the programming language that is supported by essentially all web browsers. Significant
work was done to develop a fourth edition of ECMAScript. However, that work was not completed and not published
as the fourth edition of ECMAScript but some of it was incorporated into the development of the sixth edition.
The fifth edition of ECMAScript (published as ECMA-262 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
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 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
includes.
This specification introduces 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.values,
Object.entries
Object.entries, and Object.getOwnPropertyDescriptors
Object.getOwnPropertyDescriptors.
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, 6th Edition Project Editor
Brian Terlson
ECMA-262, 7th Edition Project Editor
1 Scope
This Standard defines the ECMAScript 2018 general-purpose programming language.
2 Conformance
A conforming implementation of ECMAScript must provide and support all the types, values, objects, properties,
functions, and program syntax and semantics described in this specification.
A conforming implementation of ECMAScript must interpret source text input in conformance with the latest version
of the Unicode Standard and ISO/IEC 10646.
A conforming implementation of ECMAScript that provides an application programming interface (API) that
supports programs that need to adapt to the linguistic and cultural conventions used by different human languages
and countries must implement the interface defined by the most recent edition of ECMA-402 that is compatible with
this specification.
A conforming implementation of ECMAScript may provide additional types, values, objects, properties, and functions
beyond those described in this specification. In particular, a conforming implementation of ECMAScript may provide
properties not described in this specification, and values for those properties, for objects that are described in this
specification.
A conforming implementation of ECMAScript may support program and regular expression syntax not described in
this specification. In particular, a conforming implementation of ECMAScript may support program syntax that
makes use of 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 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 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
Object, Function
Function, Boolean
Boolean, Symbol
Symbol, and various Error objects; objects that represent and manipulate
numeric values including Math
Math, Number
Number, and Date
Date; the text processing objects String and RegExp
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
ArrayBuffer, SharedArrayBuffer
SharedArrayBuffer, and DataView
DataView; objects
supporting control abstractions including generator functions and Promise objects; and reflection objects including
Proxy and Reflect
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.
cf 1 cf 2 cf 3 cf 4 cf 5
q1 q1 q1 q1 q1
q2 q2 q2 q2 q2
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
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
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
q1, q2
q2, or
CFP1
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.
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
.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 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 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
52 © Ecma International 2018
Ecma International
member of the Object type that may be invoked as a subroutine
NOTE In addition to its properties, a function contains executable code and state that determine how it
behaves when invoked. A function's code may or may not be written in ECMAScript.
4.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.
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 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
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.
When a parse is successful, it constructs a parse tree, a rooted tree structure in which each node is a Parse Node. Each
Parse Node is an instance of a symbol in the grammar; it represents a span of the source text that can be derived from
that symbol. The root node of the parse tree, representing the whole of the source text, is an instance of the parse's
goal symbol. When a Parse Node is an instance of a nonterminal, it is also an instance of some production that has
that nonterminal as its left-hand side. Moreover, it has zero or more children, one for each symbol on the production's
right-hand side: each child is a Parse Node that is an instance of the corresponding symbol.
New Parse Nodes are instantiated for each invocation of the parser and never reused between parses even of identical
source text. Parse Nodes are considered the same Parse Node if and only if they represent the same span of source text,
are instances of the same grammar symbol, and resulted from the same parser invocation.
NOTE 1 Parsing the same String multiple times will lead to different Parse Nodes, 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
© Ecma International 2018 55
Ecma International
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 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
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
BindingIdentifier Initializer
and that:
IterationStatement :
for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
IterationStatement :
for ( LexicalDeclaration ; Expressionopt ) Statement
for ( LexicalDeclaration Expression ; Expressionopt ) Statement
IterationStatement :
for ( LexicalDeclaration ; ) Statement
for ( LexicalDeclaration ; Expression ) Statement
for ( LexicalDeclaration Expression ; ) Statement
for ( LexicalDeclaration Expression ; Expression ) 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:
is an abbreviation for:
StatementList :
ReturnStatement
ExpressionStatement
StatementList_Return :
ReturnStatement
ExpressionStatement
StatementList_In :
ReturnStatement
ExpressionStatement
StatementList_Return_In :
ReturnStatement
ExpressionStatement
Multiple parameters produce a combinatory number of productions, not all of which are necessarily referenced in a
complete grammar.
References to nonterminals on the right-hand side of a production can also be parameterized. For example:
StatementList :
ReturnStatement
ExpressionStatement[+In]
is equivalent to saying:
StatementList :
ReturnStatement
ExpressionStatement_In
and:
StatementList :
ReturnStatement
ExpressionStatement[~In]
is equivalent to:
StatementList :
ReturnStatement
ExpressionStatement
A nonterminal reference may have both a parameter list and an “opt” suffix. For example:
VariableDeclaration :
is an abbreviation for:
VariableDeclaration :
BindingIdentifier
BindingIdentifier Initializer_In
Prefixing a parameter name with “?” on a right-hand side nonterminal reference makes that parameter value
dependent upon the occurrence of the parameter name on the reference to the current production's left-hand side
symbol. For example:
VariableDeclaration[In] :
BindingIdentifier Initializer[?In]
is an abbreviation for:
VariableDeclaration :
BindingIdentifier Initializer
VariableDeclaration_In :
BindingIdentifier Initializer_In
If a right-hand side alternative is prefixed with “[+parameter]” that alternative is only available if the named
parameter was used in referencing the production's nonterminal symbol. If a right-hand side alternative is prefixed
with “[~parameter]” that alternative is only available if the named parameter was not used in referencing the
production's nonterminal symbol. This means that:
StatementList[Return] :
[+Return]ReturnStatement
ExpressionStatement
is an abbreviation for:
StatementList :
ExpressionStatement
StatementList_Return :
ReturnStatement
ExpressionStatement
and that:
StatementList[Return] :
[~Return]ReturnStatement
ExpressionStatement
is an abbreviation for:
StatementList :
ReturnStatement
ExpressionStatement
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
1 2 3 4 5 6 7 8 9
NonZeroDigit ::
1
2
3
4
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
0 1 2 3 4 5 6 7 8 9
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
If the phrase “[no LineTerminator here]” appears in the right-hand side of a production of the syntactic grammar, it
indicates that the production is a restricted production: it may not be used if a LineTerminator occurs in the input stream
at the indicated position. For example, the production:
ThrowStatement :
throw [no LineTerminator here] Expression ;
indicates that the production may not be used if a LineTerminator occurs in the script between the throw token and
the Expression.
Unless the presence of a LineTerminator is forbidden by a restricted production, any number of occurrences of
LineTerminator may appear between any two consecutive tokens in the stream of input elements without affecting the
syntactic acceptability of the script.
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 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, 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 }
The algorithms of this specification often implicitly return Completion Records whose [[Type]] is normal. Unless it is
otherwise obvious from the context, an algorithm statement that returns a value that is not a Completion Record, such
as:
1. Return "Infinity"
"Infinity".
"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:
© Ecma International 2018 63
Ecma International
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. ReturnIfAbrupt(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.
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.
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.
Well-known symbols are built-in Symbol values that are explicitly referenced by algorithms of this specification. They
are typically used as the keys of properties whose values serve as extension points of a specification algorithm. Unless
otherwise specified, well-known symbols values are shared by all realms (8.2).
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.
The Number type has exactly 18437736874454810627 (that is, 264-253+3) values, representing the double-precision 64-
bit format IEEE 754-2008 values as specified in the IEEE Standard for Binary Floating-Point Arithmetic, except that the
9007199254740990 (that is, 253-2) distinct “Not-a-Number” values of the IEEE Standard are represented in
ECMAScript as a single special NaN value. (Note that the NaN value is produced by the program expression NaN
NaN.) In
some implementations, external code might be able to detect a difference between various Not-a-Number values, but
such behaviour is implementation-dependent; to ECMAScript code, all NaN values are indistinguishable from each
other.
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
Infinity) and -Infinity
-Infinity.)
Note that there is both a positive zero and a negative zero. For brevity, these values are also referred to for expository
purposes by the symbols +0 and -0, respectively. (Note that these two different zero Number values are produced by
the program expressions +0 (or simply 0 ) and -0
-0.)
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.
Properties are identified using key values. A property key value is either an ECMAScript String value or a Symbol
value. All String and Symbol values, including the empty string, are valid as property keys. A property name is a
property key that is a String value.
An integer index is a String-valued property key that is a canonical numeric String (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.
Attributes are used in this specification to define and explain the state of Object properties. A data property associates
a key value with the attributes listed in Table 2.
[[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
Undefined method (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
Undefined method (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
The actual semantics of objects, in ECMAScript, are specified via algorithms called internal methods. Each object in an
ECMAScript engine is associated with a set of internal methods that defines its runtime behaviour. These internal
methods are not part of the ECMAScript language. They are defined by this specification purely for expository
purposes. However, each object within an implementation of ECMAScript must behave as specified by the internal
methods associated with it. The exact manner in which this is accomplished is determined by the implementation.
Internal method names are polymorphic. This means that different object values may perform different algorithms
when a common internal method name is invoked upon them. That actual object upon which an internal method is
invoked is the “target” of the invocation. If, at runtime, the implementation of an algorithm attempts to use an
internal method of an object that the object does not support, a TypeError exception is thrown.
72 © Ecma International 2018
Ecma International
Internal slots correspond to internal state that is associated with objects and used by various ECMAScript
specification algorithms. Internal slots are not object properties and they are not inherited. Depending upon the
specific internal slot specification, such state may consist of values of any ECMAScript language type or of specific
ECMAScript specification type values. Unless explicitly specified otherwise, internal slots are allocated as part of the
process of creating an object and may not be dynamically added to an object. Unless specified otherwise, the initial
value of an internal slot is the value undefined. Various algorithms within this specification create objects that have
internal slots. However, the ECMAScript language provides no direct way to associate internal slots with an object.
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 | Determine the object that provides inherited properties for this object.
Null A null value indicates that there are no inherited properties.
[[SetPrototypeOf]] (Object | Null) → Associate this object with another object that provides inherited
Boolean properties. Passing null indicates that there are no inherited
properties. Returns true indicating that the operation was completed
successfully or false indicating that the operation was not successful.
[[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
Undefined | whose key is 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
PropertyDescriptor) state described by PropertyDescriptor. Return true if that property was
→ Boolean successfully 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
Boolean either an own or inherited property whose key is propertyKey.
[[Get]] (propertyKey, Return the value of the property whose key is propertyKey from this
Receiver) → any object. If any ECMAScript code must be executed to retrieve the
property value, Receiver is used as the this value when evaluating the
code.
[[Set]] (propertyKey, Set the value of the property whose key is propertyKey to value. If any
value, Receiver) → ECMAScript code must be executed to set the property value, Receiver
Boolean is used as the this value when evaluating the code. Returns true if the
property value was set or false if it could not be set.
[[Delete]] (propertyKey) → Remove the own property whose key is propertyKey from this object.
Boolean Return false if the property was not deleted and is still present.
Return true if the property was deleted or is not present.
[[OwnPropertyKeys]] ( ) → List of Return a List whose elements are all of the own property keys for the
propertyKey object.
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
[[Call]] (any, a Executes code associated with this object. Invoked via a function call expression. The
List of arguments to the internal method are a this value and a list containing the arguments
any) → passed to the function by a call expression. Objects that implement this internal method
any are callable.
[[Construct]] (a List of Creates an object. Invoked via the new or super operators. The first argument to the
any, internal method is a list containing the arguments of the operator. The second argument
Object) is the object to which the new operator was initially applied. Objects that implement this
→ Object internal method are called constructors. A function object is not necessarily a constructor
and such non-constructor function objects do not have a [[Construct]] internal method.
The semantics of the essential internal methods for ordinary objects and standard exotic objects are specified in clause
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.
The Internal Methods of Objects of an ECMAScript engine must conform to the list of invariants specified below.
Ordinary ECMAScript Objects as well as all standard exotic objects in this specification maintain these invariants.
ECMAScript Proxy objects maintain these invariants by means of runtime checks on the result of traps invoked on the
[[ProxyHandler]] object.
Any implementation provided exotic objects must also maintain these invariants for those objects. Violation of these
invariants may cause ECMAScript code to have unpredictable behaviour and create security issues. However,
violation of these invariants must never compromise the memory safety of an implementation.
An implementation must not allow these invariants to be circumvented in any manner such as by providing
alternative interfaces that implement the functionality of the essential internal methods without enforcing their
invariants.
Definitions:
The target of an internal method is the object upon which the internal method is called.
A target is non-extensible if it has been observed to return false from its [[IsExtensible]] internal method, or true
from its [[PreventExtensions]] internal method.
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
(see 6.2.5.6).
If a property P is described as a data property with Desc.[[Value]] equal to v and Desc.[[Writable]] and Desc.
[[Configurable]] are both false, then the SameValue must be returned for the Desc.[[Value]] attribute of the
property on all future calls to [[GetOwnProperty]] ( P ).
If P's attributes other than [[Writable]] may change over time or if the property might disappear, 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 Desc.[[Writable]] and Desc.
[[Configurable]] attributes must be true even if no mechanism to change the value is exposed via
the other internal methods.
[[DefineOwnProperty]] must return false if P has previously been observed as a non-configurable own
property of the target, unless either:
[[HasProperty]] ( P )
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.
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]] ( )
Well-known intrinsics are built-in objects that are explicitly referenced by the algorithms of this specification and
which usually have realm-specific identities. Unless otherwise specified each intrinsic object actually corresponds to a
set of similar objects, one per realm.
© Ecma International 2018 77
Ecma International
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
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 F 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 F is called with argument reason, the following steps are taken:
6.2.3.2 NormalCompletion
1. Return NormalCompletion(argument).
6.2.3.3 ThrowCompletion
1. Return ThrowCompletion(argument).
The abstract operation UpdateEmpty with arguments completionRecord and value performs the following steps:
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.
88 © Ecma International 2018
Ecma International
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 )
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
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).
NOTE The object that may be created in step 6.a.ii is not accessible outside of the above algorithm and the
ordinary object [[Set]] internal method. An implementation might choose to avoid the actual
creation of that object.
6.2.4.10 GetThisValue ( 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).
90 © Ecma International 2018
Ecma International
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 IsAccessorDescriptor is called with Property Descriptor Desc, the following steps are
taken:
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 ToPropertyDescriptor is called with object Obj, the following steps are taken:
When the abstract operation CompletePropertyDescriptor is called with Property Descriptor Desc, 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
© Ecma International 2018 93
Ecma International
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.
3. Let execution be the [[CandidateExecution]] field of the surrounding agent's Agent Record.
4. Let eventList be the [[EventList]] field of the element in execution.[[EventLists]] whose [[AgentSignifier]] is
AgentSignifier().
5. Let zero be « 0 ».
6. For each index i of db, do
a. Append WriteSharedMemory { [[Order]]: "Init" "Init", [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: i,
[[ElementSize]]: 1, [[Payload]]: zero } to eventList.
7. Return db.
When the abstract operation CopyDataBlockBytes is called, the following steps are taken:
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.[[EventLists]] whose
[[AgentSignifier]] is AgentSignifier().
94 © Ecma International 2018
Ecma International
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"
"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"
"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).
7 Abstract Operations
These operations are not a part of the ECMAScript language; they are defined here to solely to aid the specification of
the semantics of the ECMAScript language. Other, more specialized abstract operations are defined throughout this
specification.
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.4) 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.
ToNumber applied to Strings applies the following grammar to the input String interpreted as a sequence of UTF-16
encoded code points (6.1.4). If the grammar cannot interpret the String as an expansion of StringNumericLiteral, then
the result of ToNumber is NaN.
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.
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
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
98 © Ecma International 2018
Ecma International
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.
The abstract operation ToInt32 converts argument to one of 232 integer values in the range -231 through 231-1, inclusive.
This abstract operation functions as follows:
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.
The abstract operation ToUint32 converts argument to one of 232 integer values in the range 0 through 232-1, inclusive.
This abstract operation functions as follows:
The abstract operation ToInt16 converts argument to one of 216 integer values in the range -32768 through 32767,
inclusive. This abstract operation functions as follows:
The abstract operation ToUint16 converts argument to one of 216 integer values in the range 0 through 216-1, inclusive.
This abstract operation functions as follows:
The substitution of 216 for 232 in step 4 is the only difference between ToUint32 and
ToUint16.
ToUint16 maps -0 to +0.
The abstract operation ToInt8 converts argument to one of 28 integer values in the range -128 through 127, inclusive.
This abstract operation functions as follows:
The abstract operation ToUint8 converts argument to one of 28 integer values in the range 0 through 255, inclusive.
This abstract operation functions as follows:
The abstract operation ToUint8Clamp converts argument to one of 28 integer values in the range 0 through 255,
inclusive. This abstract operation functions as follows:
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.
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.
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:
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.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:
NOTE This algorithm differs from the Strict Equality Comparison Algorithm in its treatment of signed
zeroes and NaNs.
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.2 GetV ( V, P )
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 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 ».
2. If Type(obj) is not Object, throw a TypeError exception.
3. Let len be ? ToLength(? Get(obj, "length"
"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. Set index to index + 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:
An Environment Record records the identifier bindings that are created within the scope of its associated Lexical
Environment. It is referred to as the Lexical Environment's EnvironmentRecord.
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
D) String value N 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
S) String value 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.
WithBaseObject() If this Environment Record is associated with a with statement, return the with
object. Otherwise, return undefined.
Each declarative Environment Record is associated with an ECMAScript program scope containing variable, constant,
let, class, module, import, and/or function declarations. A declarative Environment Record binds the set of identifiers
defined by the declarations contained within its scope.
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).
8.1.1.1.5 SetMutableBinding ( N, V, S )
The concrete Environment Record method SetMutableBinding for declarative Environment Records attempts to
124 © Ecma International 2018
Ecma International
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.
8.1.1.1.8 HasThisBinding ( )
1. Return false.
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)).
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;
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.
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.
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.
A function Environment Record is a declarative Environment Record that is used to represent the top-level scope of a
function and, if the function is not an ArrowFunction, provides a this binding. If a function is not an ArrowFunction
function and references super
super, its function Environment Record also contains the state that is used to perform
super method invocations from within the function.
Function Environment Records have the additional state fields listed in Table 15.
[[ThisValue]] Any This is the this value used for this invocation of the function.
[[FunctionObject]] Object The function object whose invocation caused this Environment
Record to be created.
[[HomeObject]] Object | undefined If the associated function has super property accesses and is not
an ArrowFunction, [[HomeObject]] is the object that the function is
bound to as a method. The default value for [[HomeObject]] is
undefined.
[[NewTarget]] Object | undefined If this Environment Record was created by the [[Construct]]
internal method, [[NewTarget]] is the value of the [[Construct]]
newTarget parameter. Otherwise, its value is undefined.
Function Environment Records support all of the declarative Environment Record methods listed in Table 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 )
1. Let envRec be the function Environment Record for which the method was invoked.
2. Assert: envRec.[[ThisBindingStatus]] is not "lexical"
"lexical".
3. If envRec.[[ThisBindingStatus]] is "initialized"
"initialized", throw a ReferenceError exception.
4. Set envRec.[[ThisValue]] to V.
5. Set envRec.[[ThisBindingStatus]] to "initialized"
"initialized".
6. Return V.
© Ecma International 2018 129
Ecma International
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"
"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"
"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"
"lexical".
3. If envRec.[[ThisBindingStatus]] is "uninitialized"
"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 used to represent the outer most scope that is shared by all of the ECMAScript Script
elements that are processed in a common realm. A global Environment Record provides the bindings for built-in
globals (clause 18), properties of the global object, and for all top-level declarations (13.2.8, 13.2.10) that occur within a
Script.
A global Environment Record is logically a single record but it is specified as a composite encapsulating an object
Environment Record and a declarative Environment Record. The object Environment Record has as its base object the
global object of the associated Realm Record. This global object is the value returned by the global Environment
Record's GetThisBinding concrete method. The object Environment Record component of a global Environment
Record contains the bindings for all built-in globals (clause 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 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
Environment as 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
Environment code except for FunctionDeclaration, GeneratorDeclaration,
Record AsyncFunctionDeclaration, 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
(N) be shadowed by a global lexical binding.
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
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.
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]].
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 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.
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]].
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]].
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
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
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.
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.
A module Environment Record is a declarative Environment Record that is used to represent the outer scope of an
ECMAScript Module. In additional to normal mutable and immutable bindings, module Environment Records also
provide immutable import bindings which are bindings that provide indirect access to a target binding that exists in
another Environment Record.
Module Environment Records support all of the declarative Environment Record methods listed in Table 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
M, N2) N is the 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
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]].
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:
When the abstract operation NewGlobalEnvironment is called with arguments G and thisValue, 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.
A realm is represented in this specification as a Realm Record with the fields specified in Table 20:
[[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
[[Site]]: Parse Node, Realm Record's [[TemplateMap]]. Each [[Site]] value is a Parse Node that is
[[Array]]: Object }. a TemplateLiteral. The associated [[Array]] value is the corresponding
template object that is passed to a tag function.
[[HostDefined]] Any, default value Field reserved for use by host environments that need to associate
is undefined. additional 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
state execution context.
Function If this execution context is evaluating the code of a function object, then the value of this
component is that function object. If the context is evaluating the code of a Script or Module, the
value is null.
Realm The Realm Record from which associated code accesses ECMAScript resources.
ScriptOrModule The Module Record or Script Record from which associated code originates. If there is no
originating script or module, as is the case for the original execution context created in
InitializeHostDefinedRealm, the value is null.
Evaluation of code by the running execution context may be suspended at various points defined within this
specification. Once the running execution context has been suspended a different execution context may become the
running execution context and commence evaluating its code. At some later time a suspended execution context may
again become the running execution context and continue evaluating its code at the point where it had previously
been suspended. Transition of the running execution context status among execution contexts usually occurs in stack-
like last-in/first-out manner. However, some ECMAScript features require non-LIFO transitions of the running
execution context.
The value of the Realm component of the running execution context is also called the current Realm Record. The value
of the Function component of the running execution context is also called the active function object.
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.
VariableEnvironment Identifies the Lexical Environment whose EnvironmentRecord holds bindings created by
VariableStatements within this execution context.
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.
8.3.3 GetThisEnvironment ( )
The abstract operation GetThisEnvironment finds the Environment Record that currently supplies the binding of the
keyword this
this. GetThisEnvironment performs the following steps:
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]] 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
Module Record PendingJob 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 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.
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:
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
"ScriptJobs", ScriptEvaluationJob, « sourceText, hostDefined »).
i. Perform EnqueueJob("ScriptJobs"
b. Else sourceText is the source code of a module,
"ScriptJobs", TopLevelModuleEvaluationJob, « sourceText, hostDefined
i. Perform EnqueueJob("ScriptJobs"
»).
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 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.1 AgentSignifier ( )
The abstract operation AgentSignifier takes no arguments. It performs the following steps:
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.
An embedding may deactivate (stop forward progress) or activate (resume forward progress) an agent without the
agent's knowledge or cooperation. If the embedding does so, it must not leave some agents in the cluster active while
other agents in the cluster are deactivated indefinitely.
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 [[EventLists]] field is a List containing, for each agent, an Agent Events Record
whose [[AgentSignifier]] field is that agent's signifier and whose [[EventList]] field is an empty List.
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.
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.
Every ordinary object has a Boolean-valued [[Extensible]] internal slot that controls whether or not properties may be
added to the object. If the value of the [[Extensible]] internal slot is false then additional properties may not be added
to the object. In addition, if [[Extensible]] is false the value of the [[Prototype]] internal slot of the object may not be
modified. Once the value of an object's [[Extensible]] internal slot has been set to false it may not be subsequently
changed 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 [[SetPrototypeOf]] ( V )
When the [[SetPrototypeOf]] internal method of O is called with argument V, the following steps are taken:
9.1.2.1 OrdinarySetPrototypeOf ( O, V )
When the abstract operation OrdinarySetPrototypeOf is called with Object O and value V, the following steps are
152 © Ecma International 2018
Ecma International
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).
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 )
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:
154 © Ecma International 2018
Ecma International
NOTE If undefined is passed as O, only validation is performed and no object updates are performed.
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:
When the abstract operation OrdinaryGet is called with Object O, property key P, and ECMAScript language value
Receiver, the following steps are taken:
When the abstract operation OrdinarySet is called with Object O, property key P, value V, and ECMAScript language
value Receiver, the following steps are taken:
When the abstract operation OrdinarySetWithOwnDescriptor is called with Object O, property key P, value V,
ECMAScript language value Receiver, and Property Descriptor (or undefined) ownDesc, 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"
"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 If constructor does not supply a [[Prototype]] value, the default value that is used is obtained from
the realm of the constructor function rather than from the running execution context.
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
Record intrinsic objects 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
strict, global) and code body of the function. lexical means that this refers to the this
value of a lexically enclosing function. strict means that the this value is used
exactly as provided by an invocation of the function. global means that a this
value of undefined 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.
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:
When the abstract operation OrdinaryCallBindThis is called with function object F, execution context calleeContext,
and ECMAScript value thisArgument, the following steps are taken:
When the abstract operation OrdinaryCallEvaluateBody is called with function object F and List argumentsList, 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.
1. Assert: F is an extensible object that does not have a length own property.
2. Assert: Type(length) is Number.
3. Assert: length ≥ 0 and ! ToInteger(length) is equal to length.
4. Return ! DefinePropertyOrThrow(F, "length"
"length", PropertyDescriptor{[[Value]]: length, [[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 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"
"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
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%]].
170 © Ecma International 2018
Ecma International
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.
Each built-in function defined in this specification is created by calling the CreateBuiltinFunction abstract operation.
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 [[Call]] internal method of a bound function exotic object, F, which was created using the bind function is
called with parameters thisArgument and argumentsList, a List of ECMAScript language values, the following steps are
taken:
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 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.
When the [[DefineOwnProperty]] internal method of an Array exotic object A is called with property key P, and
Property Descriptor Desc, the following steps are taken:
The abstract operation ArrayCreate with argument length (either 0 or a positive integer) and optional argument proto
is used to specify the creation of new Array exotic objects. It performs the following steps:
The abstract operation ArraySpeciesCreate with arguments originalArray and length is used to specify the creation of a
new Array object using a constructor function that is derived from originalArray. It performs the following steps:
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:
When the [[DefineOwnProperty]] internal method of a String exotic object S is called with property key P, and
Property Descriptor Desc, the following steps are taken:
9.4.3.3 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of a String exotic object O is called, the following steps are taken:
The abstract operation StringCreate with arguments value and prototype is used to specify the creation of new String
exotic objects. It performs the following steps:
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 in the function's execution context. This means
that changing the property changes the corresponding value of the argument binding and vice-
versa. This correspondence is broken if such a property is deleted and then redefined or if the
property is changed into an accessor property. If the arguments object is an ordinary object, the
values of its properties are simply a copy of the arguments passed to the function and there is no
dynamic linkage between the property values and the formal parameter values.
NOTE 3 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"
"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 [[DefineOwnProperty]] internal method of an arguments exotic object when called with a property key P and
Property Descriptor Desc performs the following steps:
The [[Get]] internal method of an arguments exotic object when called with a property key P and ECMAScript
language value Receiver performs the following steps:
The [[Set]] internal method of an arguments exotic object when called with property key P, value V, and ECMAScript
language value Receiver performs the following steps:
9.4.4.5 [[Delete]] ( P )
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.
8. Set obj.[[Delete]] as specified in 9.4.4.5.
9. Set the remainder of obj's essential internal methods to the default ordinary object definitions specified in 9.1.
10. Set obj.[[Prototype]] to %ObjectPrototype%.
11. Set obj.[[Extensible]] to true.
12. Let map be ObjectCreate(null).
13. Set obj.[[ParameterMap]] to map.
14. Let parameterNames be the BoundNames of formals.
15. Let numberOfParameters be the number of elements in parameterNames.
16. Let index be 0.
17. Repeat, while index < len,
a. Let val be argumentsList[index].
b. Perform CreateDataProperty(obj, ! ToString(index), val).
180 © Ecma International 2018
Ecma International
c. Let index be index + 1.
18. Perform DefinePropertyOrThrow(obj, "length""length", PropertyDescriptor { [[Value]]: len, [[Writable]]: true,
[[Enumerable]]: false, [[Configurable]]: true }).
19. Let mappedNames be a new empty List.
20. Let index be numberOfParameters - 1.
21. Repeat, while index ≥ 0,
a. Let name be parameterNames[index].
b. If name is not an element of mappedNames, then
i. Add name as an element of the list mappedNames.
ii. If index < len, then
1. Let g be MakeArgGetter(name, env).
2. Let p be MakeArgSetter(name, env).
3. Perform map.[[DefineOwnProperty]](! ToString(index), PropertyDescriptor { [[Set]]: p,
[[Get]]: g, [[Enumerable]]: false, [[Configurable]]: true }).
c. Let index be index - 1.
22. Perform ! DefinePropertyOrThrow(obj, @@iterator, PropertyDescriptor { [[Value]]: %ArrayProto_values%,
[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }).
23. Perform ! DefinePropertyOrThrow(obj, "callee"
"callee", PropertyDescriptor { [[Value]]: func, [[Writable]]: true,
[[Enumerable]]: false, [[Configurable]]: true }).
24. Return obj.
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 f that expects no arguments is called it performs the following steps:
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 f is called with argument value it performs the following steps:
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:
When the [[DefineOwnProperty]] internal method of an Integer-Indexed exotic object O is called with property key P,
and Property Descriptor Desc, the following steps are taken:
When the [[Get]] internal method of an Integer-Indexed exotic object O is called with property key P and ECMAScript
language value Receiver, the following steps are taken:
When the [[Set]] internal method of an Integer-Indexed exotic object O is called with property key P, value V, and
ECMAScript language value Receiver, 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:
The abstract operation IntegerIndexedObjectCreate with arguments prototype and internalSlotsList is used to specify
the creation of new Integer-Indexed exotic objects. The argument internalSlotsList is a List of the names of additional
internal slots that must be defined as part of the object. IntegerIndexedObjectCreate performs the following steps:
The abstract operation IntegerIndexedElementGet with arguments O and index performs the following steps:
The abstract operation IntegerIndexedElementSet with arguments O, index, and value performs the following steps:
[[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
String object. 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]], 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 [[DefineOwnProperty]] internal method of a module namespace exotic object O is called with property key
P and Property Descriptor Desc, the following steps are taken:
1. Return false.
9.4.6.6 [[HasProperty]] ( P )
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
9.4.6.10 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of a module namespace exotic object O is called, the following steps
are taken:
The abstract operation ModuleNamespaceCreate with arguments module, and exports is used to specify the creation of
new module namespace exotic objects. It performs the following steps:
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 )
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:
9.5.2 [[SetPrototypeOf]] ( V )
When the [[SetPrototypeOf]] internal method of a Proxy exotic object O is called with argument V, the following steps
are taken:
190 © Ecma International 2018
Ecma International
1. Assert: Either Type(V) is Object or Type(V) is Null.
2. Let handler be O.[[ProxyHandler]].
3. If handler is null, throw a TypeError exception.
4. Assert: Type(handler) is Object.
5. Let target be O.[[ProxyTarget]].
6. Let trap be ? GetMethod(handler, "setPrototypeOf"
"setPrototypeOf").
7. If trap is undefined, then
a. Return ? target.[[SetPrototypeOf]](V).
8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, « target, V »)).
9. If booleanTrapResult is false, return false.
10. Let extensibleTarget be ? IsExtensible(target).
11. If extensibleTarget is true, return true.
12. Let targetProto be ? target.[[GetPrototypeOf]]().
13. If SameValue(V, targetProto) is false, throw a TypeError exception.
14. Return true.
9.5.3 [[IsExtensible]] ( )
When the [[IsExtensible]] internal method of a Proxy exotic object O is called, the following steps are taken:
9.5.4 [[PreventExtensions]] ( )
When the [[PreventExtensions]] internal method of a Proxy exotic object O is called, the following steps are taken:
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:
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:
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.
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:
9.5.11 [[OwnPropertyKeys]] ( )
When the [[OwnPropertyKeys]] internal method of a Proxy exotic object O is called, the following steps are taken:
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.
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 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
\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 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
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
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
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”).
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>
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.
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 ::
© Ecma International 2018 205
Ecma International
// SingleLineCommentCharsopt
SingleLineCommentChars ::
SingleLineCommentChar SingleLineCommentCharsopt
SingleLineCommentChar ::
SourceCharacter but not LineTerminator
11.5 Tokens
Syntax
CommonToken ::
IdentifierName
Punctuator
NumericLiteral
StringLiteral
Template
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.
206 © Ecma International 2018
Ecma International
Syntax
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”
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”.
IdentifierPart :: \ UnicodeEscapeSequence
IdentifierName ::
IdentifierStart
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 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
11.7 Punctuators
Syntax
Punctuator :: one of
{ ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ? : = += -= *= %= **=
<<= >>= >>>= &= |= ^= =>
DivPunctuator ::
/
/=
RightBracePunctuator ::
}
11.8 Literals
NullLiteral ::
null
BooleanLiteral ::
true
false
NumericLiteral ::
DecimalLiteral
BinaryIntegerLiteral
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalIntegerLiteral ExponentPartopt
DecimalIntegerLiteral ::
0
NonZeroDigit DecimalDigitsopt
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit :: one of
0 1 2 3 4 5 6 7 8 9
NonZeroDigit :: one of
1 2 3 4 5 6 7 8 9
ExponentPart ::
ExponentIndicator SignedInteger
ExponentIndicator :: one of
e E
SignedInteger ::
DecimalDigits
+ DecimalDigits
- DecimalDigits
BinaryIntegerLiteral ::
0b BinaryDigits
0B BinaryDigits
BinaryDigits ::
BinaryDigit
BinaryDigits BinaryDigit
BinaryDigit :: one of
0 1
OctalIntegerLiteral ::
0o OctalDigits
0O OctalDigits
OctalDigits ::
OctalDigit
OctalDigits OctalDigit
HexIntegerLiteral ::
0x HexDigits
0X HexDigits
HexDigits ::
HexDigit
HexDigits HexDigit
HexDigit :: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
NOTE For example: 3in is an error and not the two input elements 3 and in
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.
A numeric literal stands for a value of the Number type. This value is determined in two steps: first, a mathematical
value (MV) is derived from the literal; second, this mathematical value is rounded as described below.
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, 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
Syntax
StringLiteral ::
" DoubleStringCharactersopt "
DoubleStringCharacters ::
DoubleStringCharacter DoubleStringCharactersopt
SingleStringCharacters ::
SingleStringCharacter SingleStringCharactersopt
DoubleStringCharacter ::
SourceCharacter but not one of " or \ or LineTerminator
\ EscapeSequence
LineContinuation
SingleStringCharacter ::
SourceCharacter but not one of ' or \ or LineTerminator
\ EscapeSequence
LineContinuation
LineContinuation ::
\ LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
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
SingleEscapeCharacter :: one of
' " \ b f n r t v
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 A line terminator code point cannot appear in a string literal, except as part of a LineContinuation to
produce the empty code points sequence. The proper way to cause a line terminator code point to
be part of the String value of a string literal is to use an escape sequence such as \n or \u000A
\u000A.
StringLiteral ::
" DoubleStringCharactersopt "
1. Return the String value whose elements are the SV of this StringLiteral.
A string literal stands for a value of the String type. The String value (SV) of the literal is described in terms of code
unit values contributed by the various parts of the string literal. As part of this process, some Unicode code points
within the string literal are interpreted as having a mathematical value (MV), as described below or in 11.8.3.
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
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 ]
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 ::
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
A conforming implementation must not use the extended definition of EscapeSequence described in B.1.2 when parsing
a TemplateCharacter.
A template literal component is interpreted as a sequence of Unicode code points. The Template Value (TV) of a literal
component is described in terms of code unit values (SV, 11.8.4) contributed by the various parts of the template literal
component. As part of this process, some Unicode code points within the template component are interpreted as
having a mathematical value (MV, 11.8.3). In determining a TV, escape sequences are replaced by the UTF-16 code
unit(s) of the Unicode code point represented by the escape sequence. The Template Raw Value (TRV) is similar to a
Template Value with the difference that in TRVs escape sequences are interpreted literally.
1. When, as the source text is parsed from left to right, a token (called the offending token) is encountered that is
not allowed by any production of the grammar, then a semicolon is automatically inserted before the offending
token if one or more of the following conditions is true:
The offending token is separated from the previous token by at least one LineTerminator.
The offending token is } .
The previous token is ) and the inserted semicolon would then be parsed as the terminating semicolon
of a do-while statement (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).
UpdateExpression[Yield, Await] :
LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++
ContinueStatement[Yield, Await] :
continue ;
continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;
BreakStatement[Yield, Await] :
break ;
break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;
ReturnStatement[Yield, Await] :
return ;
return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ;
ThrowStatement[Yield, Await] :
throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ;
YieldExpression[In, Await] :
yield [no LineTerminator here] * AssignmentExpression[?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
continue, break
break, return
return, throw
throw, or yield token is encountered and a
LineTerminator is encountered before the next token, a semicolon is automatically inserted
after the continue
continue, break
break, return
return, throw
throw, or yield token.
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
return
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
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
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"
"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
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"
"yield".
It is a Syntax Error if this production has an [Await] parameter and StringValue of Identifier is "await"
"await".
It is a Syntax Error if this phrase is contained in strict mode code and the StringValue of IdentifierName is:
"implements"
"implements", "interface"
"interface", "let"
"let", "package"
"package", "private"
"private", "protected"
"protected", "public"
"public",
"static"
"static", or "yield"
"yield".
It is a Syntax Error if the goal symbol of the syntactic grammar is Module and the StringValue of IdentifierName
is "await"
"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
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 : await
1. If this IdentifierReference is contained in strict mode code and StringValue of Identifier is "eval" or
"arguments"
"arguments", return false.
2. Return true.
IdentifierReference : yield
1. Return true.
IdentifierReference : await
1. Return true.
1. Return "yield"
"yield".
IdentifierReference : await
BindingIdentifier : await
LabelIdentifier : await
1. Return "await"
"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
"yield").
1. Return ? ResolveBinding("yield"
IdentifierReference : await
"await").
1. Return ? ResolveBinding("await"
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]
FunctionExpression
ClassExpression[?Yield, ?Await]
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral[?Yield, ?Await, ~Tagged]
CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] :
( Expression[+In, ?Yield, ?Await] )
( )
( ... BindingIdentifier[?Yield, ?Await] )
Supplemental Syntax
ParenthesizedExpression[Yield, Await] :
( Expression[+In, ?Yield, ?Await] )
12.2.1 Semantics
PrimaryExpression :
this
IdentifierReference
1. Return false.
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
1. Return true.
PrimaryExpression :
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CoverParenthesizedExpressionAndArrowParameterList
1. Return false.
PrimaryExpression :
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
1. Return false.
1. Return ? ResolveThisBinding().
12.2.4 Literals
Syntax
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
1. Return null.
Literal : BooleanLiteral
Literal : NumericLiteral
Literal : StringLiteral
Syntax
ArrayLiteral[Yield, Await] :
[ Elisionopt ]
[ ElementList[?Yield, ?Await] ]
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 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 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]].
Syntax
ObjectLiteral[Yield, Await] :
{ }
{ PropertyDefinitionList[?Yield, ?Await] }
{ PropertyDefinitionList[?Yield, ?Await] , }
PropertyDefinitionList[Yield, Await] :
PropertyDefinition[?Yield, ?Await]
PropertyDefinitionList[?Yield, ?Await] , PropertyDefinition[?Yield, ?Await]
PropertyDefinition[Yield, Await] :
IdentifierReference[?Yield, ?Await]
CoverInitializedName[?Yield, ?Await]
PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await]
MethodDefinition[?Yield, ?Await]
... AssignmentExpression[+In, ?Yield, ?Await]
PropertyName[Yield, Await] :
LiteralPropertyName
ComputedPropertyName[?Yield, ?Await]
LiteralPropertyName :
ComputedPropertyName[Yield, Await] :
[ AssignmentExpression[+In, ?Yield, ?Await] ]
CoverInitializedName[Yield, Await] :
IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]
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.
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 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
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"
"g", "i"
"i", "m"
"m",
"s"
"s", "u"
"u", or "y"
"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.
3. Return RegExpCreate(pattern, flags).
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 TemplateMiddle Contains NotEscapeSequence.
TemplateLiteral : NoSubstitutionTemplate
TemplateSpans : TemplateTail
The abstract operation GetTemplateObject is called with a Parse Node, templateLiteral, as an argument. It performs the
following steps:
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.
1. Return the String value whose code units are the elements of the TV of NoSubstitutionTemplate as defined in
11.8.6.
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.
ParenthesizedExpression : ( Expression )
NOTE This algorithm does not apply GetValue to the result of evaluating Expression. The principal
motivation for this is so that operators such as delete and typeof may be applied to
parenthesized expressions.
MemberExpression[Yield, Await] :
PrimaryExpression[?Yield, ?Await]
MemberExpression[?Yield, ?Await] [ Expression[+In, ?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]
SuperCall[Yield, Await] :
super Arguments[?Yield, ?Await]
Arguments[Yield, Await] :
( )
( ArgumentList[?Yield, ?Await] )
( ArgumentList[?Yield, ?Await] , )
ArgumentList[Yield, Await] :
AssignmentExpression[+In, ?Yield, ?Await]
... AssignmentExpression[+In, ?Yield, ?Await]
ArgumentList[?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await]
ArgumentList[?Yield, ?Await] , ... AssignmentExpression[+In, ?Yield, ?Await]
LeftHandSideExpression[Yield, Await] :
NewExpression[?Yield, ?Await]
CallExpression[?Yield, ?Await]
Supplemental Syntax
CallMemberExpression[Yield, Await] :
244 © Ecma International 2018
Ecma International
MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
MemberExpression :
MemberExpression [ Expression ]
MemberExpression . IdentifierName
MemberExpression TemplateLiteral
SuperProperty
MetaProperty
new MemberExpression Arguments
NewExpression :
new NewExpression
1. Return false.
MemberExpression :
MemberExpression [ Expression ]
MemberExpression . IdentifierName
MemberExpression TemplateLiteral
SuperProperty
MetaProperty
new MemberExpression Arguments
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
1. Return false.
CallExpression :
CallExpression [ Expression ]
CallExpression . IdentifierName
1. Return true.
CallExpression :
CoverCallExpressionAndAsyncArrowHead
SuperCall
CallExpression Arguments
CallExpression TemplateLiteral
NewExpression :
new NewExpression
MemberExpression :
MemberExpression TemplateLiteral
new MemberExpression Arguments
NewTarget :
new . target
1. Return false.
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 . 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:
The abstract operation MakeSuperPropertyReference with arguments propertyKey and strict performs the following
steps:
ArgumentList : AssignmentExpression
1. Return GetNewTarget().
UpdateExpression[Yield, Await] :
LeftHandSideExpression[?Yield, ?Await]
++ UnaryExpression[?Yield, ?Await]
-- UnaryExpression[?Yield, ?Await]
1. Return false.
1. Return false.
UnaryExpression[Yield, Await] :
UpdateExpression[?Yield, ?Await]
delete UnaryExpression[?Yield, ?Await]
void UnaryExpression[?Yield, ?Await]
[+Await] AwaitExpression[?Yield]
1. Return false.
1. Return false.
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"
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 false.
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] :
260 © Ecma International 2018
Ecma International
ExponentiationExpression[?Yield, ?Await]
MultiplicativeOperator : one of
* / %
1. Return false.
1. Return false.
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-2008 arithmetic:
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]
1. Return false.
1. Return false.
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:
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 false.
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 false.
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.
A != B is equivalent to !(A == B)
B).
A == B is equivalent to B == A
A, except in the order of evaluation of A and B .
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 false.
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 false.
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.
1. Return false.
1. Return false.
AssignmentOperator : one of
*= /= %= += -= <<= >>= >>>= &= ^= |= **=
1. Return true.
AssignmentExpression :
YieldExpression
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
1. Return false.
1. Return false.
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.
ObjectAssignmentPattern[Yield, Await] :
{ }
{ AssignmentRestProperty[?Yield, ?Await] }
{ AssignmentPropertyList[?Yield, ?Await] }
ArrayAssignmentPattern[Yield, Await] :
[ Elisionopt AssignmentRestElement[?Yield, ?Await] opt ]
[ AssignmentElementList[?Yield, ?Await] ]
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
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 ]
ObjectAssignmentPattern : { AssignmentRestProperty }
NOTE The following operations collect a list of all destructured property names.
AssignmentElementList : AssignmentElisionElement
AssignmentElisionElement : AssignmentElement
Elision : ,
Elision : Elision ,
1. Return false.
1. Return false.
NOTE GetValue must be called even though its value is not used because it may have observable side-
effects.
BreakStatement[?Yield, ?Await]
[+Return] ReturnStatement[?Yield, ?Await]
WithStatement[?Yield, ?Await, ?Return]
LabelledStatement[?Yield, ?Await, ?Return]
ThrowStatement[?Yield, ?Await]
TryStatement[?Yield, ?Await, ?Return]
DebuggerStatement
Declaration[Yield, Await] :
HoistableDeclaration[?Yield, ?Await, ~Default]
ClassDeclaration[?Yield, ?Await, ~Default]
LexicalDeclaration[+In, ?Yield, ?Await]
Statement :
VariableStatement
EmptyStatement
1. Return false.
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
ReturnStatement
ThrowStatement
DebuggerStatement
1. Return false.
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
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
284 © Ecma International 2018
Ecma International
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.
BreakableStatement : SwitchStatement
1. Return NormalCompletion(empty).
HoistableDeclaration : FunctionDeclaration
BreakableStatement :
IterationStatement
SwitchStatement
13.2 Block
Syntax
Declaration[?Yield, ?Await]
Block : { }
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 : 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.
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;")
BlockDeclarationInstantiation is performed as follows using arguments code and env. code is the Parse Node
corresponding to the body of the block. env is the Lexical Environment in which bindings are to be created.
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.
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.
BindingPattern[Yield, Await] :
ObjectBindingPattern[?Yield, ?Await]
ArrayBindingPattern[?Yield, ?Await]
ObjectBindingPattern[Yield, Await] :
{ }
{ BindingRestProperty[?Yield, ?Await] }
{ BindingPropertyList[?Yield, ?Await] }
ArrayBindingPattern[Yield, Await] :
[ Elisionopt BindingRestElement[?Yield, ?Await] opt ]
[ BindingElementList[?Yield, ?Await] ]
BindingRestProperty[Yield, Await] :
... BindingIdentifier[?Yield, ?Await]
BindingPropertyList[Yield, Await] :
BindingProperty[?Yield, ?Await]
BindingPropertyList[?Yield, ?Await] , BindingProperty[?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]
SingleNameBinding[Yield, Await] :
BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] opt
BindingRestElement[Yield, Await] :
... BindingIdentifier[?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.
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 }
NOTE These collect a list of all bound property names rather than just empty completion.
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.
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 as arguments.
BindingElementList : BindingElisionElement
1. Return the result of performing IteratorBindingInitialization for BindingElisionElement with iteratorRecord and
environment as arguments.
BindingElisionElement : BindingElement
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.
EmptyStatement :
;
1. Return NormalCompletion(empty).
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
else.
NOTE It is only necessary to apply this rule if the extension specified in B.3.2 is implemented.
for ( [lookahead ∉ { let [ }] Expression[~In, ?Yield, ?Await] opt ; Expression[+In, ?Yield, ?Await] opt ;
ForDeclaration[Yield, Await] :
LetOrConst ForBinding[?Yield, ?Await]
ForBinding[Yield, Await] :
BindingIdentifier[?Yield, ?Await]
BindingPattern[?Yield, ?Await]
13.7.1 Semantics
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
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 It is only necessary to apply this rule if the extension specified in B.3.2 is implemented.
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.
13.7.2 The do
do-while
while Statement
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
IterationStatement :
for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
The abstract operation ForBodyEvaluation with arguments test, increment, stmt, perIterationBindings, and labelSet is
performed as follows:
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.
c. If LoopContinues(result, labelSet) is false, return Completion(UpdateEmpty(result, V)).
d. If result.[[Value]] is not empty, set V to result.[[Value]].
e. Perform ? CreatePerIterationEnvironment(perIterationBindings).
f. If increment is not [empty], then
i. Let incRef be the result of evaluating increment.
ii. Perform ? GetValue(incRef).
IterationStatement :
for ( LeftHandSideExpression in Expression ) Statement
for ( LeftHandSideExpression of AssignmentExpression ) Statement
for await ( LeftHandSideExpression of AssignmentExpression ) Statement
NOTE 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
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
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
ForBinding : BindingIdentifier
1. Return false.
ForBinding : BindingPattern
1. Return true.
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
IterationStatement :
for ( ForDeclaration in Expression ) Statement
for await ( LeftHandSideExpression of AssignmentExpression ) Statement
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 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.
1. Return the result of performing BindingInitialization for ForBinding passing value and environment as the
arguments.
The abstract operation ForIn/OfHeadEvaluation is called with arguments TDZnames, expr, and iterationKind. The
value of iterationKind is either enumerate, iterate, or async-iterate.
The abstract operation ForIn/OfBodyEvaluation is called with arguments lhs, stmt, iteratorRecord, iterationKind,
lhsKind, labelSet, and optional argument iteratorKind. The value of lhsKind is either assignment, varBinding or
lexicalBinding. The value of iteratorKind is either sync or async.
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
NOTE The following is an informative definition of an ECMAScript generator function that conforms to
these rules:
function
function* EnumerateObjectProperties
EnumerateObjectProperties(obj) {
const visited = new Set();
for (const
const key of Reflect.ownKeys(obj)) {
if (typeof
typeof key === "symbol") continue
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
return;
for (const
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 ;
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.
It is a Syntax Error if the code that matches this production is contained in strict mode code.
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 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
CaseBlock : { }
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).
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.
1. Return NormalCompletion(empty).
DefaultClause : default :
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.
LabelledItem : FunctionDeclaration
1. Return false.
LabelledItem : FunctionDeclaration
1. Return false.
LabelledItem : FunctionDeclaration
1. Return false.
LabelledItem : Statement
LabelledItem : FunctionDeclaration
LabelledItem : Statement
LabelledItem : FunctionDeclaration
LabelledItem : Statement
LabelledItem : FunctionDeclaration
LabelledItem : Statement
LabelledItem : FunctionDeclaration
LabelledItem : FunctionDeclaration
LabelledItem : FunctionDeclaration
LabelledItem : Statement
LabelledItem : FunctionDeclaration
© Ecma International 2018 337
Ecma International
1. Return the result of evaluating FunctionDeclaration.
ThrowStatement[Yield, Await] :
throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ;
try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return]
CatchParameter[Yield, Await] :
BindingIdentifier[?Yield, ?Await]
BindingPattern[?Yield, ?Await]
NOTE The try statement encloses a block of code in which an exceptional condition can occur, such as a
runtime error or a throw statement. The catch clause provides the exception-handling code.
When a catch clause catches an exception, its CatchParameter is bound to that exception.
NOTE No matter how control leaves the Block the LexicalEnvironment is always restored to its former
state.
DebuggerStatement :
debugger ;
FunctionBody[~Yield, ~Await] }
FunctionExpression :
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] :
FormalParameter[?Yield, ?Await]
FormalParameterList[?Yield, ?Await] , FormalParameter[?Yield, ?Await]
FunctionRestParameter[Yield, Await] :
BindingRestElement[?Yield, ?Await]
FormalParameter[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'
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. 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"
"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.
344 © Ecma International 2018
Ecma International
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.
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).
FormalParameter : BindingElement
NOTE 2 The new Environment Record created in step 6 is only used if the BindingElement contains a direct
eval.
FunctionRestParameter : BindingRestElement
NOTE 3 The new Environment Record created in step 6 is only used if the BindingRestElement contains a
direct eval.
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. 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).
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 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. Perform envRec.InitializeBinding(name, closure).
11. 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).
ArrowParameters[Yield, Await] :
BindingIdentifier[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
ConciseBody[In] :
[lookahead ≠ {] AssignmentExpression[?In, ~Yield, ~Await]
{ FunctionBody[~Yield, ~Await] }
Supplemental Syntax
© Ecma International 2018 351
Ecma International
When the production
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
is recognized the following grammar is used to refine the interpretation of
CoverParenthesizedExpressionAndArrowParameterList:
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
new.target, this
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. Return closure.
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] }
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.
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"
"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.
GeneratorBody : FunctionBody
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"
"prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]:
true, [[Enumerable]]: false, [[Configurable]]: false }).
6. Perform SetFunctionName(F, name).
7. 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"
"prototype", PropertyDescriptor { [[Value]]: prototype,
[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }).
6. 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"
"prototype", PropertyDescriptor { [[Value]]: prototype,
[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }).
10. Perform SetFunctionName(closure, name).
11. Perform envRec.InitializeBinding(name, closure).
12. Return closure.
NOTE The BindingIdentifier in a GeneratorExpression can be referenced from inside the GeneratorExpression's
FunctionBody to allow the generator code to call itself recursively. However, unlike in a
GeneratorDeclaration, the BindingIdentifier in a GeneratorExpression cannot be referenced from and
does not affect the scope enclosing the GeneratorExpression.
YieldExpression : yield
AsyncGeneratorMethod[Yield, Await] :
async [no LineTerminator here] * PropertyName[?Yield, ?Await] (
AsyncGeneratorBody }
AsyncGeneratorExpression :
async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await] opt (
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
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.
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 false.
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"
"prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]:
true, [[Enumerable]]: false, [[Configurable]]: false }).
6. Perform ! SetFunctionName(F, name).
7. Return F.
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"
"prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]:
true, [[Enumerable]]: false, [[Configurable]]: false }).
5. Perform SetFunctionName(F, "default"
"default").
6. Return F.
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"
"prototype", PropertyDescriptor { [[Value]]: prototype,
[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }).
6. 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"
"prototype", PropertyDescriptor { [[Value]]: prototype,
[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }).
10. Perform ! SetFunctionName(closure, name).
11. Perform ! envRec.InitializeBinding(name, closure).
12. Return closure.
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]
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.
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.
constructor
constructor(... args){ super (...args);}
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
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.
13. Assert: constructorInfo is not an abrupt completion.
14. Let F be constructorInfo.[[Closure]].
15. If ClassHeritageopt is present, set F.[[ConstructorKind]] to "derived"
"derived".
16. Perform MakeConstructor(F, false, proto).
17. Perform MakeClassConstructor(F).
18. Perform CreateMethodProperty(proto, "constructor"
"constructor", F).
19. If ClassBodyopt is not present, let methods be a new empty List.
20. Else, let methods be NonConstructorMethodDefinitions of ClassBody.
21. For each ClassElement m in order from methods, do
© Ecma International 2018 373
Ecma International
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).
22. Set the running execution context's LexicalEnvironment to lex.
23. If className is not undefined, then
a. Perform classScopeEnvRec.InitializeBinding(className, F).
24. Return F.
NOTE ClassDeclaration : class ClassTail only occurs as part of an ExportDeclaration and the setting of a
name property and establishing its binding are handled as part of the evaluation action for that
production. See 15.2.3.11.
NOTE 1 ClassDeclaration : class ClassTail only occurs as part of an ExportDeclaration and is never directly
evaluated.
NOTE 2 If the class definition included a name static method then that method is not over-written with a
name data property for the class name.
AsyncFunctionBody }
AsyncFunctionExpression :
async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody }
AsyncMethod[Yield, Await] :
async [no LineTerminator here] PropertyName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await]
) { AsyncFunctionBody }
AsyncFunctionBody :
FunctionBody[~Yield, +Await]
AwaitExpression[Yield] :
await UnaryExpression[?Yield, +Await]
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
"*default*
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. 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"
"default").
4. Return F.
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. Return closure.
AsyncConciseBody[?In]
CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] =>
AsyncConciseBody[?In]
AsyncConciseBody[In] :
[lookahead ≠ {] AssignmentExpression[?In, ~Yield, +Await]
{ AsyncFunctionBody }
AsyncArrowBindingIdentifier[Yield] :
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.
AsyncArrowFunction : async [no LineTerminator here] AsyncArrowBindingIdentifier [no LineTerminator here] =>
AsyncConciseBody
NOTE Normally, Contains does not look inside most function forms. However, Contains is used to detect
new.target
new.target, this
this, and super usage within an AsyncArrowFunction.
1. Return false.
1. Return 1.
1. Return false.
1. Return true.
AsyncArrowBindingIdentifier : BindingIdentifier
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.
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 :
384 © Ecma International 2018
Ecma International
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ThrowStatement
DebuggerStatement
Block : { }
ReturnStatement : return ;
LabelledItem : FunctionDeclaration
IterationStatement :
for ( LeftHandSideExpression of AssignmentExpression ) Statement
for ( var ForBinding of AssignmentExpression ) Statement
for ( ForDeclaration of AssignmentExpression ) Statement
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
NOTE A potential tail position call that is immediately followed by return GetValue of the call result is
also a possible tail position call. Function calls cannot return reference values, so such a GetValue
operation will always return the same value as the actual function call result.
AssignmentExpression :
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
EqualityExpression :
EqualityExpression == RelationalExpression
EqualityExpression != RelationalExpression
EqualityExpression === RelationalExpression
EqualityExpression !== RelationalExpression
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
© Ecma International 2018 387
Ecma International
CallExpression [ Expression ]
CallExpression . IdentifierName
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
CallExpression :
CoverCallExpressionAndAsyncArrowHead
CallExpression Arguments
CallExpression TemplateLiteral
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.
15.1 Scripts
Syntax
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
undefined assigned.
[[Environment]] Lexical The Lexical Environment containing the top level bindings for this
Environment | script. This field is set when the script is instantiated.
undefined
[[ECMAScriptCode]] a Parse Node The result of parsing the source text of this module using Script as the
goal symbol.
[[HostDefined]] Any, default value Field reserved for use by host environments that need to associate
is undefined. additional 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
StatementListItem[~Yield, ~Await, ~Return]
ModuleItem :
ImportDeclaration
ExportDeclaration
1. Return false.
ModuleItem :
ImportDeclaration
ExportDeclaration
1. Return false.
ModuleItem :
ImportDeclaration
ExportDeclaration
NOTE ExportedBindings are the locally bound names that are explicitly associated with a Module's
ExportedNames.
ModuleItem :
ImportDeclaration
StatementListItem
NOTE ExportedNames are the externally visible names that a Module explicitly maps to one of its local
name bindings.
ModuleItem : ExportDeclaration
ModuleItem :
ImportDeclaration
StatementListItem
ModuleItem :
ModuleItem :
ExportDeclaration
StatementListItem
The abstract operation ImportedLocalNames with argument importEntries creates a List of all of the local name
bindings defined by a List of ImportEntry Records (see Table 40). ImportedLocalNames performs the following steps:
ModuleItemList : ModuleItem
ModuleItem : StatementListItem
NOTE 1 The LexicallyDeclaredNames of a Module includes the names of all of its imported bindings.
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.
ModuleItem : ImportDeclaration
ModuleItem : ImportDeclaration
ModuleItem : ExportDeclaration
ModuleItem : ImportDeclaration
ModuleItem : ExportDeclaration
A Module Record encapsulates structural information about the imports and exports of a single module. This
information is used to link the imports and exports of sets of connected modules. A Module Record includes four
fields that are only used when evaluating a module.
For specification purposes Module Record values are values of the Record specification type and can be thought of as
existing in a simple object-oriented hierarchy where Module Record is an abstract class with concrete subclasses. This
specification only defines a single Module Record 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
undefined assigned.
[[Environment]] Lexical The Lexical Environment containing the top level bindings for this module.
Environment | This field is set when the module is instantiated.
undefined
[[Namespace]] Object | undefined The Module Namespace Object (26.3) if one has been created for this
module. Otherwise undefined.
[[HostDefined]] Any, default value Field reserved for use by host environments that need to associate
is undefined. additional 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
resolveSet) represented by a 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.
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.
A Source Text Module Record is used to represent information about a module that was defined from ECMAScript
source text (10) that was parsed using the goal symbol Module. Its fields contain digested information about the names
A Source Text Module Record can exist in a module graph with other subclasses of the abstract Module Record type.
However, non-source text Module Records must not participate in dependency cycles with Source Text Module
Records.
In addition to the fields, defined in Table 37, Source Text Module Records have the additional fields listed in Table 39.
Each of these fields is initially set in ParseModule.
[[ECMAScriptCode]] a Parse The result of parsing the source text of this module using Module as the
Node goal symbol.
[[RequestedModules]] List of A List of all the ModuleSpecifier strings used by the module represented by
String this record to request the importation of a module. The List is source code
occurrence ordered.
[[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
[[EvaluationError]] An abrupt A completion of type throw representing the exception that occurred
completion during evaluation. undefined if no exception occurred or if [[Status]] is not
| undefined "evaluated"
"evaluated".
[[DFSIndex]] Integer | Auxiliary field used during Instantiate and Evaluate only. If [[Status]] is
undefined "instantiating" or "evaluating"
"evaluating", this non-negative 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"
"evaluating", this is either the module's
own [[DFSIndex]] or that of an "earlier" module in the same strongly
connected component.
[[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 41 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 42:
[[ExportName]] String The name used to export this binding by this module.
[[ModuleRequest]] String The String value of the ModuleSpecifier of the ExportDeclaration. null if the
| null ExportDeclaration 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.
[[LocalName]] String The name that is used to locally access the exported value from within the importing
| null module. null if the exported value is not locally accessible from within the module.
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 Instantiate concrete method of a Source Text Module Record implements the corresponding Module Record
abstract method.
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 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 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.
The Evaluate concrete method of a Source Text 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.
The ModuleExecution abstract operation is used by InnerModuleEvaluation to initialize the execution context of the
module and evaluate the module's code within it.
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"
"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
"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"
"uninstantiated". C's [[Status]] has become "instantiated"
"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"
"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 same exception. (Hosts are not required to reuse
Source Text 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.
???
© Ecma International 2018 411
Ecma International
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"
"uninstantiated".
B C
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"
"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. However, once we unwind back to the original InnerModuleInstantiation on A, it fails
during ModuleDeclarationEnvironmentSetup, namely right after C.ResolveExport(). The thrown SyntaxError
exception propagates up to A.Instantiate, which resets all modules that are currently on its stack (these are always
exactly the modules that are still "instantiating"
"instantiating"). Hence both A and B become "uninstantiated"
"uninstantiated". Note
that C is left as "instantiated"
"instantiated".
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"
"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]].
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.
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
Syntax
ImportDeclaration :
import ImportClause FromClause ;
import ModuleSpecifier ;
ImportClause :
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding , NameSpaceImport
ImportedDefaultBinding , NamedImports
ImportedDefaultBinding :
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 :
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 ;
ExportDeclaration :
export ExportClause FromClause ;
export * FromClause ;
ExportClause : { }
ExportSpecifier : IdentifierName
1. Return « "default" ».
ExportClause : { }
ExportSpecifier : IdentifierName
1. Let entry be the ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]:
"*default*"
"*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 : { }
ExportDeclaration :
export * FromClause ;
export ExportClause FromClause ;
export ExportClause ;
export default AssignmentExpression ;
1. Return false.
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
ExportDeclaration :
export * FromClause ;
1. Return NormalCompletion(empty).
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
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"
"arguments". Such own properties also must not be created for
function objects defined using an ArrowFunction, MethodDefinition, GeneratorDeclaration, GeneratorExpression,
AsyncGeneratorDeclaration, AsyncGeneratorExpression, ClassDeclaration, ClassExpression, AsyncFunctionDeclaration,
AsyncFunctionExpression, or AsyncArrowFunction regardless of whether the definition is contained in strict
mode code. Built-in functions, strict functions created using the Function constructor, generator functions
created using the Generator constructor, async functions created using the AsyncFunction constructor,
and functions created using the bind method also must not be created with such own properties.
If an implementation extends any function object with an own property named "caller" the value of that
property, as observed using [[Get]] or [[GetOwnProperty]], must not be a strict function object. If it is an
accessor property, the function that is the value of the property's [[Get]] attribute must never return a strict
function when called.
Neither mapped nor unmapped arguments objects may be created with an own property named "caller"
"caller".
© Ecma International 2018 425
Ecma International
The behaviour of the following methods must not be extended except as specified in ECMA-402:
Object.prototype.toLocaleString
Object.prototype.toLocaleString, Array.prototype.toLocaleString
Array.prototype.toLocaleString,
Number.prototype.toLocaleString
Number.prototype.toLocaleString, Date.prototype.toLocaleDateString
Date.prototype.toLocaleDateString,
Date.prototype.toLocaleString
Date.prototype.toLocaleString, Date.prototype.toLocaleTimeString
Date.prototype.toLocaleTimeString,
String.prototype.localeCompare
String.prototype.localeCompare, %TypedArray%.prototype.toLocaleString
%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
this value” and “NewTarget” have the meanings given in 9.3.
of a particular function, the terms “this
Unless otherwise specified in the description of a particular function, if a built-in function or constructor described is
given more arguments than the function is specified to allow, the extra arguments are evaluated by the call and then
ignored by the function. However, an implementation may define implementation specific behaviour relating to such
arguments as long as the behaviour is not the throwing of a TypeError exception that is predicated simply on the
presence of an extra argument.
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.
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
let, const
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
When the abstract operation EvalDeclarationInstantiation is called with arguments body, varEnv, lexEnv, and strict, the
following steps are taken:
NOTE A reliable way for ECMAScript code to test if a value X is a NaN is an expression of the form
X !== 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 interpreted as part of the notation of a decimal literal, and no indication
is given that any such code units were ignored.
The parseInt function is the %parseInt% intrinsic object. When the parseInt function is called, the following
steps are taken:
NOTE parseInt may interpret only a leading portion of string as an integer value; it ignores any code
units that cannot be interpreted as part of the notation of an integer, and no indication is given that
any such code units were ignored.
NOTE Many implementations of ECMAScript provide additional functions and methods that manipulate
web pages; these functions are beyond the scope of this standard.
A URI is composed of a sequence of components separated by component separators. The general form is:
:”, “/
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
434 © Ecma International 2018
Ecma International
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
uriMark
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"
"%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.
In UTF-8, characters are encoded using sequences of 1 to 6 octets. The only octet of a sequence of one has th
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
that octet contain bits from the value of the character to be encoded. The following octets all have the highe
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 44.
Code Unit Value Representation 1st Octet 2nd Octet 3rd Octet 4th Octet
Where
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 UT
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
URIError when encountering such invalid sequences.
The decodeURI function computes a new version of a URI in which each escape sequence and UTF-8 encoding of
the sort that might be introduced by the encodeURI function is replaced with the UTF-16 encoding of the code
points that it represents. Escape sequences that could not have been introduced by encodeURI are not replaced.
The decodeURI function is the %decodeURI% intrinsic object. When the decodeURI function is called with one
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 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 computes a new version of a UTF-16 encoded (6.1.4) URI in which each
instance of certain code points is replaced by one, two, three, or four escape sequences representing the UTF-8
encoding of the code point.
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 ( . . . )
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.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.17 Promise ( . . . )
See 25.6.3.
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 ( . . . )
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.28 Uint8Array ( . . . )
See 22.2.4.
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.4.1 Atomics
See 24.4.
18.4.2 JSON
See 24.5.
18.4.3 Math
See 20.2.
18.4.4 Reflect
See 26.1.
19 Fundamental Objects
When 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).
2. If only one argument was passed, return to.
3. Let sources be the List of argument values starting with the second argument.
4. For each element nextSource of sources, in ascending index order, do
a. If nextSource is undefined or null, let keys be a new empty List.
b. Else,
i. Let from be ! ToObject(nextSource).
ii. Let keys be ? from.[[OwnPropertyKeys]]().
c. For each element nextKey of keys in List order, do
i. Let desc be ? from.[[GetOwnProperty]](nextKey).
ii. If desc is not undefined and desc.[[Enumerable]] is true, then
1. Let propValue be ? Get(from, nextKey).
2. Perform ? Set(to, nextKey, propValue, true).
5. Return to.
The create function creates a new object with a specified prototype. When the create function is called, the
following steps are taken:
The defineProperties function is used to add own properties and/or update the attributes of existing own
properties of an object. When the defineProperties function is called, the following steps are taken:
The abstract operation ObjectDefineProperties with arguments O and Properties performs the following steps:
The defineProperty function is used to add an own property and/or update the attributes of an existing own
property of an object. When the defineProperty function is called, the following steps are taken:
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:
19.1.2.7 Object.getOwnPropertyDescriptor ( O, P )
19.1.2.8 Object.getOwnPropertyDescriptors ( O )
When the getOwnPropertyDescriptors function is called, the following steps are taken:
19.1.2.9 Object.getOwnPropertyNames ( O )
When the getOwnPropertyNames function is called, the following steps are taken:
19.1.2.10 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.11 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.13 Object.isExtensible ( O )
When the isExtensible function is called with argument O, the following steps are taken:
19.1.2.14 Object.isFrozen ( O )
When the isFrozen function is called with argument O, the following steps are taken:
19.1.2.15 Object.isSealed ( O )
When the isSealed function is called with argument O, the following steps are taken:
19.1.2.16 Object.keys ( O )
When the keys function is called with argument O, the following steps are taken:
19.1.2.17 Object.preventExtensions ( O )
When the preventExtensions function is called, the following steps are taken:
19.1.2.18 Object.prototype
19.1.2.19 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. Let O be ? 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.21 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).
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).
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.
When the toLocaleString method is called, the following steps are taken:
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
Array, Number
Number, Date
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.
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.
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"
"normal", "generator"
"generator", "async"
"async", or "async generator"
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.
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
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
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 on an object func 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.
When the call method is called on an object func with argument, thisArg and zero or more args, 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.
19.2.3.4 Function.prototype.constructor
19.2.3.5 Function.prototype.toString ( )
When the toString method is called on an object func, the following steps are taken:
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.
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 }.
When Boolean 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:
19.3.2.1 Boolean.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
19.3.3.1 Boolean.prototype.constructor
19.3.3.2 Boolean.prototype.toString ( )
19.3.3.3 Boolean.prototype.valueOf ( )
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 }.
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 45.
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 }.
19.4.2.4 Symbol.isConcatSpreadable
The initial value of Symbol.isConcatSpreadable is the well-known symbol @@isConcatSpreadable (Table 1).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
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
460 © Ecma International 2018
Ecma International
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
The initial value of Symbol.species is the well-known symbol @@species (Table 1).
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
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
19.4.3.2 Symbol.prototype.toString ( )
When the abstract operation SymbolDescriptiveString is called with argument sym, the following steps are taken:
19.4.3.3 Symbol.prototype.valueOf ( )
This function is called by ECMAScript language operators to convert a Symbol object to a primitive value. The
allowed values for hint are "default"
"default", "number"
"number", and "string"
"string".
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 }.
The initial value of the @@toStringTag property is the String value "Symbol"
"Symbol".
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%"
"%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"
"message", msgDesc).
4. Return O.
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has the following properties:
19.5.2.1 Error.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
19.5.3.1 Error.prototype.constructor
19.5.3.2 Error.prototype.message
19.5.3.3 Error.prototype.name
19.5.3.4 Error.prototype.toString ( )
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
19.5.5.3 ReferenceError
19.5.5.4 SyntaxError
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, "% NativeError Prototype%"Prototype%", « [[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"
"message", msgDesc).
4. Return O.
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.
has a [[Prototype]] internal slot whose value is the intrinsic object %ErrorPrototype%.
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).
NativeError instances are ordinary objects that inherit properties from their NativeError prototype object and have an
[[ErrorData]] internal slot whose value is undefined. The only specified use of [[ErrorData]] is by
Object.prototype.toString (19.1.3.6) to identify Error or NativeError instances.
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 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.
When Number.isSafeInteger is called with one argument number, the following steps are taken:
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.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.1.2.10 Number.NaN
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.1.2.11 Number.NEGATIVE_INFINITY
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
The value of the Number.parseFloat data property is the same built-in function object that is the value of the
parseFloat property of the global object defined in 18.2.4.
The value of the Number.parseInt data property is the same built-in function object that is the value of the
parseInt property of the global object defined in 18.2.5.
20.1.2.14 Number.POSITIVE_INFINITY
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
20.1.2.15 Number.prototype
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 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
Return a String containing this Number value represented in decimal exponential notation with one digit before the
significand's decimal point and fractionDigits digits after the significand's decimal point. If fractionDigits is undefined,
include as many significand digits as necessary to uniquely specify the Number (just like in ToString except that in
this case the Number is always output in exponential notation). Specifically, perform the following steps:
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 1 toFixed returns a String containing this Number value represented in decimal fixed-point
notation with fractionDigits digits after the decimal point. If fractionDigits is undefined, 0 is
assumed.
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,
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the
Number.prototype.toLocaleString method as specified in the ECMA-402 specification. If an ECMAScript
implementation does not include the ECMA-402 API the following specification of the toLocaleString method
is used.
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
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.
Return a String containing this Number value represented either in decimal exponential notation with one digit before
the significand's decimal point and precision-1 digits after the significand's decimal point or in decimal fixed notation
with precision significant digits. If precision is undefined, call ToString instead. Specifically, perform the following
steps:
10e-p+1 is larger.
b. Let m be the String value consisting of the digits of the decimal representation of n (in order, with no
leading zeroes).
c. If e < -6 or e ≥ p, then
i. Assert: e ≠ 0.
ii. If p ≠ 1, then
1. Let a be the first element of m, and let b be the remaining p-1 elements of m.
2. Let m be the string-concatenation of a, "."
".", and b.
iii. If e > 0, then
1. Let c be the code unit 0x002B (PLUS SIGN).
iv. Else e < 0,
© Ecma International 2018 473
Ecma International
1. Let c be the code unit 0x002D (HYPHEN-MINUS).
2. Let e be -e.
v. Let d be the String value consisting of the digits of the decimal representation of e (in order, with
no leading zeroes).
vi. Return the string-concatenation of s, m, the code unit 0x0065 (LATIN SMALL LETTER E), c, and
d.
11. If e = p-1, return the string-concatenation of s and m.
12. If e ≥ 0, then
a. Let m be the string-concatenation of the first e+1 elements of m, the code unit 0x002E (FULL STOP), and
the remaining p- (e+1) elements of m.
13. Else e < 0,
a. Let m be the string-concatenation of the code unit 0x0030 (DIGIT ZERO), the code unit 0x002E (FULL
STOP), -(e+1) occurrences of the code unit 0x0030 (DIGIT ZERO), and the String m.
14. Return the string-concatenation of s and m.
NOTE The optional radix should be an integer value in the inclusive range 2 to 36. If radix is not present or
is undefined the Number 10 is used as the value of radix.
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 ( )
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
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
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
Math.LN2.
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
Math.SQRT2.
20.2.1.8 Math.SQRT2
The Number value for the square root of 2, which is approximately 1.4142135623730951.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
The initial value of the @@toStringTag property is the String value "Math"
"Math".
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.
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
fdlibm, the freely distributable mathematical library from Sun
Microsystems (http://www.netlib.org/fdlibm).
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 )
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 )
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 )
20.2.2.14 Math.exp ( x )
20.2.2.15 Math.expm1 ( x )
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.
20.2.2.17 Math.fround ( x )
When Math.fround is called with argument x, the following steps are taken:
Math.hypot returns an implementation-dependent approximation of the square root of the sum of squares of its
arguments.
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 )
20.2.2.22 Math.log10 ( x )
20.2.2.23 Math.log2 ( 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.
1. Return the result of Applying the ** operator with base and exponent as specified in 12.6.4.
20.2.2.27 Math.random ( )
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 2 The value of Math.round(x) is not always the same as the value of Math.floor(x+0.5)
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)
Math.floor(x+0.5)because of internal rounding when computing x+0.5
x+0.5.
20.2.2.29 Math.sign ( x )
20.2.2.30 Math.sin ( x )
20.2.2.31 Math.sinh ( x )
20.2.2.32 Math.sqrt ( x )
20.2.2.33 Math.tan ( x )
20.2.2.34 Math.tanh ( x )
20.2.2.35 Math.trunc ( 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 indicating a particular instant in time to within a millisecond. 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
of time.
Time is measured in ECMAScript in milliseconds since 01 January, 1970 UTC. In time values leap seconds are ignored.
It is assumed that there are exactly 86,400,000 milliseconds per day. ECMAScript Number values can represent all
integers from -9,007,199,254,740,992 to 9,007,199,254,740,992; this range suffices to measure times to millisecond
precision for any instant that is within approximately 285,616 years, either forward or backward, from 01 January,
1970 UTC.
The actual range of times supported by ECMAScript Date objects is slightly smaller: exactly -100,000,000 days to
100,000,000 days measured relative to midnight at the beginning of 01 January, 1970 UTC. This gives a range of
8,640,000,000,000,000 milliseconds to either side of 01 January, 1970 UTC.
The exact moment of midnight at the beginning of 01 January, 1970 UTC is represented by the value +0.
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
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:
MonthFromTime(t)
= 0 if 0 ≤ DayWithinYear(t) < 31
= 1 if 31 ≤ DayWithinYear(t) < 59+InLeapYear(t)
= 2 if 59+InLeapYear(t) ≤ DayWithinYear(t) < 90+InLeapYear(t)
= 3 if 90+InLeapYear(t) ≤ DayWithinYear(t) < 120+InLeapYear(t)
= 4 if 120+InLeapYear(t) ≤ DayWithinYear(t) < 151+InLeapYear(t)
= 5 if 151+InLeapYear(t) ≤ DayWithinYear(t) < 181+InLeapYear(t)
= 6 if 181+InLeapYear(t) ≤ DayWithinYear(t) < 212+InLeapYear(t)
= 7 if 212+InLeapYear(t) ≤ DayWithinYear(t) < 243+InLeapYear(t)
= 8 if 243+InLeapYear(t) ≤ DayWithinYear(t) < 273+InLeapYear(t)
= 9 if 273+InLeapYear(t) ≤ DayWithinYear(t) < 304+InLeapYear(t)
= 10 if 304+InLeapYear(t) ≤ DayWithinYear(t) < 334+InLeapYear(t)
= 11 if 334+InLeapYear(t) ≤ DayWithinYear(t) < 365+InLeapYear(t)
where
DayWithinYear(t) = Day(t)-DayFromYear(YearFromTime(t))
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.
A date number is identified by an integer in the range 1 through 31, inclusive. The mapping DateFromTime(t) from a
time value t to a date number is defined by:
DateFromTime(t)
A weekday value of 0 specifies Sunday; 1 specifies Monday; 2 specifies Tuesday; 3 specifies Wednesday; 4 specifies
Thursday; 5 specifies Friday; and 6 specifies Saturday. Note that WeekDay(0) = 4, corresponding to Thursday, 01
January, 1970.
LocalTZA( t, isUTC ) is an implementation-defined algorithm that must return a number representing milliseconds
suitable for adding to a Time Value. The local political rules for standard time and daylight saving time in effect at t
should be used to determine the result in the way specified in the following three paragraphs.
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.
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:
where
HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond = 1000
msPerMinute = 60000 = msPerSecond × SecondsPerMinute
msPerHour = 3600000 = msPerMinute × MinutesPerHour
The abstract operation MakeTime calculates a number of milliseconds from its four arguments, which must be
ECMAScript Number values. This operator functions as follows:
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.
The abstract operation MakeDay calculates a number of days from its three arguments, which must be ECMAScript
Number values. This operator functions as follows:
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).
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.
The abstract operation MakeDate calculates a number of milliseconds from its two arguments, which must be
ECMAScript Number values. This operator functions as follows:
The abstract operation TimeClip calculates a number of milliseconds from its argument, which must be an
ECMAScript Number value. This operator functions as follows:
ECMAScript defines a string interchange format for date-times based upon a simplification of the ISO 8601 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.
. "." (dot) appears literally in the string.
sss is the number of complete milliseconds since the start of the second as three decimal digits.
Z is the time zone offset specified as "Z" (for UTC) or either "+" or "-" followed by a time expression
HH:mm
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
HH, mm
mm, or ss fields
are absent "00" is used as the value and the value of an absent sss field is "000"
"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.
Illegal values (out-of-bounds as well as syntax errors) in a format string means that the format string is not a valid
instance of this format.
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, ISO 8601 and this format specifies numeric representations of date and time.
ECMAScript requires the ability to specify 6 digit years (extended years); approximately 285,426 years, either forward
or backward, from 01 January, 1970 UTC. To represent years before 0 or after 9999, ISO 8601 permits the expansion of
the year representation, but only by prior agreement between the sender and the receiver. In the simplified
ECMAScript format such an expanded year representation shall have 2 extra year digits and is always prefixed with a
+ or - sign. The year 0 is considered positive and hence prefixed with a + sign.
This description applies only if the Date constructor is called with at least two arguments.
When the Date function is called, the following steps are taken:
This description applies only if the Date constructor is called with exactly one argument.
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:
492 © Ecma International 2018
Ecma International
1. Let numberOfArgs be the number of arguments passed to this function call.
2. Assert: numberOfArgs = 0.
3. If NewTarget is undefined, then
a. Let now be the Number that is the time value (UTC) identifying the current time.
b. Return ToDateString(now).
4. Else,
a. Let O be ? OrdinaryCreateFromConstructor(NewTarget, "%DatePrototype%"
"%DatePrototype%", « [[DateValue]] »).
b. Set O.[[DateValue]] to the time value (UTC) identifying the current time.
c. Return O.
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
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 format of the String according to the rules (including extended years) called out in Date Time
String Format (20.3.1.15). If the String does not conform to that format the function may fall back to any
implementation-specific heuristics or implementation-specific date formats. Unrecognizable Strings or dates
containing illegal element values in the format String 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
20.3.3.3 Date.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
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 not NaN and 0 ≤ ToInteger(y) ≤ 99, let yr be 1900+ToInteger(y); otherwise, let yr be y.
9. 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
20.3.4.1 Date.prototype.constructor
20.3.4.2 Date.prototype.getDate ( )
20.3.4.3 Date.prototype.getDay ( )
20.3.4.4 Date.prototype.getFullYear ( )
20.3.4.5 Date.prototype.getHours ( )
20.3.4.6 Date.prototype.getMilliseconds ( )
20.3.4.7 Date.prototype.getMinutes ( )
20.3.4.8 Date.prototype.getMonth ( )
20.3.4.9 Date.prototype.getSeconds ( )
20.3.4.10 Date.prototype.getTime ( )
20.3.4.11 Date.prototype.getTimezoneOffset ( )
20.3.4.12 Date.prototype.getUTCDate ( )
20.3.4.13 Date.prototype.getUTCDay ( )
20.3.4.15 Date.prototype.getUTCHours ( )
20.3.4.16 Date.prototype.getUTCMilliseconds ( )
20.3.4.17 Date.prototype.getUTCMinutes ( )
20.3.4.18 Date.prototype.getUTCMonth ( )
20.3.4.19 Date.prototype.getUTCSeconds ( )
NOTE If month is not present, this method behaves as if month was present with the value getMonth()
getMonth().
If date is not present, it behaves as if date was present with the value getDate()
getDate().
NOTE If min is not present, this method behaves as if min was present with the value getMinutes()
getMinutes().
If sec is not present, it behaves as if sec was present with the value getSeconds()
getSeconds(). If ms is not
present, it behaves as if ms was present with the value getMilliseconds()
getMilliseconds().
20.3.4.23 Date.prototype.setMilliseconds ( ms )
NOTE If sec is not present, this method behaves as if sec was present with the value getSeconds()
getSeconds(). If
ms is not present, this behaves as if ms was present with the value getMilliseconds()
getMilliseconds().
NOTE If date is not present, this method behaves as if date was present with the value getDate()
getDate().
NOTE If ms is not present, this method behaves as if ms was present with the value
getMilliseconds()
getMilliseconds().
NOTE If month is not present, this method behaves as if month was present with the value
getUTCMonth()
getUTCMonth(). If date is not present, it behaves as if date was present with the value
getUTCDate()
getUTCDate().
NOTE If min is not present, this method behaves as if min was present with the value
getUTCMinutes()
getUTCMinutes(). If sec is not present, it behaves as if sec was present with the value
getUTCSeconds()
getUTCSeconds(). If ms is not present, it behaves as if ms was present with the value
getUTCMilliseconds()
getUTCMilliseconds().
20.3.4.31 Date.prototype.setUTCMilliseconds ( ms )
NOTE If date is not present, this method behaves as if date was present with the value getUTCDate()
getUTCDate().
NOTE If ms is not present, this method behaves as if ms was present with the value
getUTCMilliseconds()
getUTCMilliseconds().
20.3.4.35 Date.prototype.toDateString ( )
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 extended year format), a RangeError exception is thrown.
This function provides a String representation of a Date object for use by JSON.stringify (24.5.2).
When the toJSON method is called with argument key, the following steps are taken:
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.
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the
Date.prototype.toLocaleDateString method as specified in the ECMA-402 specification. If an
ECMAScript implementation does not include the ECMA-402 API the following specification of the
toLocaleDateString method is used.
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.
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the
Date.prototype.toLocaleString method as specified in the ECMA-402 specification. If an ECMAScript
implementation does not include the ECMA-402 API the following specification of the toLocaleString method
is used.
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.
© Ecma International 2018 503
Ecma International
20.3.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the
Date.prototype.toLocaleTimeString method as specified in the ECMA-402 specification. If an
ECMAScript implementation does not include the ECMA-402 API the following specification of the
toLocaleTimeString method is used.
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 ( )
NOTE 1 For any Date object d whose milliseconds amount is zero, the result of
Date.parse(d.toString()) is equal to d.valueOf()
d.valueOf(). See 20.3.3.2.
NOTE 2 The toString 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.
0 "Sun"
1 "Mon"
2 "Tue"
3 "Wed"
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 ( )
20.3.4.43 Date.prototype.toUTCString ( )
This function is called by ECMAScript language operators to convert a Date object to a primitive value. The allowed
values for hint are "default"
"default", "number"
"number", and "string"
"string". Date objects, are unique among built-in ECMAScript
object in that they treat "default" as being equivalent to "string"
"string", All other built-in ECMAScript objects treat
"default" as being equivalent to "number"
"number".
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
When String 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:
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
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
The String.raw function may be called with a variable number of arguments. The first argument is template and
the remainder of the arguments form the List substitutions. The following steps are taken:
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"
"raw")).
5. Let literalSegments be ? ToLength(? Get(raw, "length"
"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. Let nextIndex be nextIndex + 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.
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.
NOTE 1 Returns a single element String containing the code unit at index pos within the String value
resulting from converting this object to a String. If there is no element at that index, the result is the
empty String. The result is a String value, not a String object.
If pos is 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)
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.
NOTE 1 Returns a Number (a nonnegative integer less than 216) that is the numeric value of the code unit
at index pos within the String resulting from converting this object to a String. If there is no element
at that index, the result is NaN.
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.
NOTE 1 Returns a nonnegative integer Number less than 0x110000 that is the code point value of the UTF-
16 encoded code point (6.1.4) starting at the string element at index pos within the String resulting
from converting this object to a String. If there is no element at that index, the result is undefined.
If a valid UTF-16 surrogate pair does not begin at pos, the result is the code unit at pos.
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 1 When the concat method is called it returns the String value consisting of the code units of the
this object (converted to a String) followed by the code units of each of the arguments converted
to a String. The result is a String value, not a String object.
When the concat method is called with zero or more arguments, the following steps are taken:
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
NOTE 1 Returns true if the sequence of elements of searchString converted to a String is the same as the
corresponding elements 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 allow such argument values.
NOTE 3 The endsWith 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 includes method takes two arguments, searchString and position, and performs the following steps:
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.
NOTE 1 If searchString appears as a substring of the result of converting this object to a String, at one or
more indices that are greater than or equal to position, then the smallest such index is returned;
otherwise, -1 is returned. If position is undefined, 0 is assumed, so as to search all of the String.
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.
NOTE 1 If searchString appears as a substring of the result of converting this object to a String at one or
more indices that are smaller than or equal to position, then the greatest such index is returned;
otherwise, -1 is returned. If position is undefined, the length of the String value is assumed, so as to
search all of the String.
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 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.25) 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 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.
When the match method is called with argument regexp, the following steps are taken:
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.
When the normalize method is called with one argument form, the following steps are taken:
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.
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 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 n is one of n≤m and the nth element of captures is undefined, use the empty String
Where 1 2 3 4 5 6 7 8 9 instead. If n>m, no replacement is done.
0x0031 and $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
N, N n is one of range 01 to 99. If nn≤m and the nnth element of captures is undefined, use
Where 0 1 2 3 4 5 6 7 8 9 the empty String instead. If nn is 00 or nn>m, no replacement is done.
0x0030
≤N≤
0x0039
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:
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 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 startsWith 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 substring 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 of the String (or through the
end of the String if end is undefined). The result is a String value, not a String object.
If either argument is NaN or negative, it is replaced with zero; if either argument is 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
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.
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the
toLocaleUpperCase method as specified in the ECMA-402 specification. If an ECMAScript implementation does
not include the ECMA-402 API the following specification of the toLocaleUpperCase 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 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()
s.toLowerCase().
NOTE 2 The toLowerCase 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 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.
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.
21.1.3.28 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"
Iterator".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
String Iterator instances are ordinary objects that inherit properties from the %StringIteratorPrototype% intrinsic
object. String Iterator instances are initially created with the internal slots listed in Table 49.
[[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 interpret the String as an expansion of Pattern.
Syntax
Pattern[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] )
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
CharacterEscape[U] ::
ControlEscape
c ControlLetter
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
RegExpUnicodeEscapeSequence[?U]
IdentityEscape[?U]
ControlEscape :: one of
f n r t v
ControlLetter :: one of
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
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
© Ecma International 2018 529
Ecma International
[~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] /
[~U] SourceCharacter but not UnicodeIDContinue
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
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]
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
It is a Syntax Error if IsCharacterClass of the first ClassAtom is true or IsCharacterClass of the second ClassAtom
is true.
It is a Syntax Error if IsCharacterClass of the first ClassAtom is false and IsCharacterClass of the second
ClassAtom is false and the CharacterValue of the first ClassAtom is larger than the CharacterValue of the second
ClassAtom.
RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence
RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence
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 51.
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
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 53, nor a binary property or binary property alias listed in
the “Property name and aliases” column of Table 52.
1. Return false.
ClassEscape :: CharacterClassEscape
1. Return true.
ClassEscape :: b
ClassEscape :: -
CharacterEscape :: c ControlLetter
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"
"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
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 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
21.2.2.2 Pattern
21.2.2.3 Disjunction
NOTE The | regular expression operator separates two alternatives. The pattern first tries to match the
left Alternative (followed by the sequel of the regular expression); if it fails, it tries to match the
right Disjunction (followed by the sequel of the regular expression). If the left Alternative, the right
Disjunction, and the sequel all have choice points, all choices in the sequel are tried before moving
on to the next choice in the left Alternative. If choices in the left Alternative are exhausted, the right
Disjunction is tried instead of the left Alternative. Any capturing parentheses inside a portion of the
pattern skipped by | produce undefined values instead of Strings. Thus, for example,
/a|ab/.exec("abc")
/((a)|(ab))((c)|(bc))/.exec("abc")
and not
The order in which the two alternatives are tried is independent of the value of 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 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
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.
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.
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"]
["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")
NOTE 3 Step 4 of the RepeatMatcher clears Atom's captures each time Atom is repeated. We can see its
behaviour in the regular expression
/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")
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.
/(a*)*/.exec("b")
/(a*)b\1+/.exec("baaaac")
["b", ""]
21.2.2.6 Assertion
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.
e. Return false.
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
0 1 2 3 4 5 6 7 8 9 _
The abstract operation IsWordChar takes an integer parameter e and performs the following steps:
21.2.2.7 Quantifier
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
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
\ followed by a nonzero decimal number), referenced in a replace String, or
backreference (\
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.
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 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
\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"
"SS". It may however map a code point outside the Basic Latin range to a character
within, for example, "ſ" (U+017F) to "s"
"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
/[a-z]/i, but they will match /[a-z]/ui
/[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 51 or Table 52.
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 51 and Table 52. 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 51: Non-binary Unicode property aliases and their canonical property names
Property name and aliases Canonical property name
G e n e r aall__CCaatteeggoorryy GGeenneerraall__CCaatteeggoorryy
ggcc
Script Script
sscc
S c r i p tt__EExxtteennssiioonnss SSccrriipptt__EExxtteennssiioonnss
ssccxx
Table 52: Binary Unicode property aliases and their canonical property names
Property name and aliases Canonical property name
ASCII ASCII
A S C I I __HHeexx__DDiiggiitt AASSCCIIII__HHeexx__DDiiggiitt
AAHHeexx
A l p h a bbeettiicc AAllpphhaabbeettiicc
Alpha
AAnnyy AAnnyy
A s s i g nneedd AAssssiiggnneedd
B i d i _ CCoonnttrrooll BBiiddii__CCoonnttrrooll
Bidi_C
BBiiddii__MMiirrrroorreedd
Case_Ignorable CCaassee__IIggnnoorraabbllee
CCII
Cased Cased
Changes_When_Casefolded CChhaannggeess__WWhheenn__CCaasseeffoollddeedd
CCWWCCFF
Changes_When_Casemapped CChhaannggeess__WWhheenn__CCaasseemmaappppeedd
CCWWCCMM
Changes_When_Lowercased CChhaannggeess__WWhheenn__LLoowweerrccaasseedd
CCWWLL
Changes_When_NFKC_Casefolded CChhaannggeess__WWhheenn__NNFFKKCC__CCaasseeffoollddeedd
CWKCF
Changes_When_Titlecased CChhaannggeess__WWhheenn__TTiittlleeccaasseedd
CCWWTT
Changes_When_Uppercased CChhaannggeess__WWhheenn__UUppppeerrccaasseedd
CCWWUU
DDaasshh DDaasshh
Default_Ignorable_Code_Point DDeeffaauulltt__IIggnnoorraabbllee__CCooddee__PPooiinntt
DDII
Deprecated DDeepprreeccaatteedd
DDeepp
Diacritic DDiiaaccrriittiicc
DDiiaa
Emoji Emoji
Emoji_Component EEmmoojjii__CCoommppoonneenntt
Emoji_Modifier EEmmoojjii__MMooddiiffiieerr
Emoji_Modifier_Base EEmmoojjii__MMooddiiffiieerr__BBaassee
Emoji_Presentation EEmmoojjii__PPrreesseennttaattiioonn
Extender EExxtteennddeerr
EExxtt
Grapheme_Extend GGrraapphheemmee__EExxtteenndd
Gr_Ext
Hex_Digit HHeexx__DDiiggiitt
HHeexx
IDS_Binary_Operator IIDDSS__BBiinnaarryy__OOppeerraattoorr
IIDDSSBB
IDS_Trinary_Operator IIDDSS__TTrriinnaarryy__OOppeerraattoorr
IIDDSSTT
ID_Continue IIDD__CCoonnttiinnuuee
IIDDCC
ID_Start IIDD__SSttaarrtt
IIDDSS
Ideographic IIddeeooggrraapphhiicc
IIddeeoo
Join_Control JJooiinn__CCoonnttrrooll
Join_C
Logical_Order_Exception LLooggiiccaall__OOrrddeerr__EExxcceeppttiioonn
LLOOEE
Lowercase LLoowweerrccaassee
Lower
MMaatthh MMaatthh
Noncharacter_Code_Point NNoonncchhaarraacctteerr__CCooddee__PPooiinntt
NChar
Pattern_Syntax PPaatttteerrnn__SSyynnttaaxx
Pat_Syn
Pattern_White_Space PPaatttteerrnn__WWhhiittee__SSppaaccee
Pat_WS
Quotation_Mark QQuuoottaattiioonn__MMaarrkk
Radical Radical
Regional_Indicator RReeggiioonnaall__IInnddiiccaattoorr
RRII
Sentence_Terminal SSeenntteennccee__TTeerrmmiinnaall
STerm
Soft_Dotted SSoofftt__DDootttteedd
SSDD
Terminal_Punctuation TTeerrmmiinnaall__PPuunnccttuuaattiioonn
TTeerrmm
Unified_Ideograph UUnniiffiieedd__IIddeeooggrraapphh
UIdeo
Uppercase UUppppeerrccaassee
Upper
Variation_Selector VVaarriiaattiioonn__SSeelleeccttoorr
VVSS
White_Space WWhhiittee__SSppaaccee
space
XID_Continue XXIIDD__CCoonnttiinnuuee
XXIIDDCC
XID_Start XXIIDD__SSttaarrtt
XXIIDDSS
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 51.
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
53 or Table 54.
3. Let value be the canonical property value of v as given in the “Canonical property value” column of the
552 © Ecma International 2018
Ecma International
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 53 and Table 54. 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_Extension 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 53: Value aliases and canonical values for the Unicode property General_Category
Property value and aliases Canonical property value
C a s e d __LLeetttteerr CCaasseedd__LLeetttteerr
LLCC
C l o s e __PPuunnccttuuaattiioonn CClloossee__PPuunnccttuuaattiioonn
PPee
C o n n e ccttoorr__PPuunnccttuuaattiioonn CCoonnnneeccttoorr__PPuunnccttuuaattiioonn
PPcc
Control Control
CCcc
cntrl
C u r r e nnccyy__SSyymmbbooll CCuurrrreennccyy__SSyymmbbooll
SScc
D a s h _ PPuunnccttuuaattiioonn DDaasshh__PPuunnccttuuaattiioonn
PPdd
D e c i m aall__NNuummbbeerr DDeecciimmaall__NNuummbbeerr
NNdd
digit
E n c l o ssiinngg__MMaarrkk EEnncclloossiinngg__MMaarrkk
MMee
F i n a l __PPuunnccttuuaattiioonn FFiinnaall__PPuunnccttuuaattiioonn
PPff
Format Format
CCff
Initial_Punctuation IInniittiiaall__PPuunnccttuuaattiioonn
PPii
Letter Letter
L
Letter_Number LLeetttteerr__NNuummbbeerr
NNll
Line_Separator LLiinnee__SSeeppaarraattoorr
ZZll
Lowercase_Letter LLoowweerrccaassee__LLeetttteerr
LLll
MMaarrkk MMaarrkk
M
Combining_Mark
Math_Symbol MMaatthh__SSyymmbbooll
SSmm
Modifier_Letter MMooddiiffiieerr__LLeetttteerr
LLmm
Modifier_Symbol MMooddiiffiieerr__SSyymmbbooll
SSkk
Nonspacing_Mark NNoonnssppaacciinngg__MMaarrkk
MMnn
Number Number
N
Open_Punctuation OOppeenn__PPuunnccttuuaattiioonn
PPss
Other Other
C
Other_Letter OOtthheerr__LLeetttteerr
LLoo
Other_Number OOtthheerr__NNuummbbeerr
Other_Punctuation OOtthheerr__PPuunnccttuuaattiioonn
PPoo
Other_Symbol OOtthheerr__SSyymmbbooll
SSoo
Paragraph_Separator PPaarraaggrraapphh__SSeeppaarraattoorr
ZZpp
Private_Use PPrriivvaattee__UUssee
CCoo
Punctuation PPuunnccttuuaattiioonn
P
punct
Separator SSeeppaarraattoorr
Z
Space_Separator SSppaaccee__SSeeppaarraattoorr
ZZss
Spacing_Mark SSppaacciinngg__MMaarrkk
MMcc
Surrogate SSuurrrrooggaattee
CCss
Symbol Symbol
S
Titlecase_Letter TTiittlleeccaassee__LLeetttteerr
LLtt
Unassigned UUnnaassssiiggnneedd
CCnn
Uppercase_Letter UUppppeerrccaassee__LLeetttteerr
LLuu
Table 54: Value aliases and canonical values for the Unicode properties Script and Script_Extensions
Adlam Adlam
AAddllmm
AAhhoomm AAhhoomm
AAhhoomm
A n a t o lliiaann__HHiieerrooggllyypphhss AAnnaattoolliiaann__HHiieerrooggllyypphhss
HHlluuww
Arabic Arabic
AArraabb
A r m e n iiaann AArrmmeenniiaann
AArrmmnn
Avestan Avestan
AAvvsstt
B a l i n eessee BBaalliinneessee
BBaallii
Bamum Bamum
BBaammuu
B a s s a __VVaahh BBaassssaa__VVaahh
BBaassss
Batak Batak
BBaattkk
Bengali Bengali
BBeenngg
B h a i k ssuukkii BBhhaaiikkssuukkii
BBhhkkss
B o p o m ooffoo BBooppoommooffoo
BBooppoo
Brahmi Brahmi
BBrraahh
Braille Braille
Buginese BBuuggiinneessee
BBuuggii
Buhid Buhid
BBuuhhdd
Canadian_Aboriginal CCaannaaddiiaann__AAbboorriiggiinnaall
CCaannss
Carian Carian
CCaarrii
Caucasian_Albanian CCaauuccaassiiaann__AAllbbaanniiaann
AAgghhbb
Chakma Chakma
CCaakkmm
CChhaamm CChhaamm
CChhaamm
Cherokee CChheerrookkeeee
CChheerr
Common Common
ZZyyyyyy
Coptic Coptic
CCoopptt
QQaaaacc
Cuneiform CCuunneeiiffoorrmm
XXssuuxx
Cypriot Cypriot
CCpprrtt
Cyrillic CCyyrriilllliicc
CCyyrrll
Deseret Deseret
DDssrrtt
Duployan DDuuppllooyyaann
DDuuppll
Egyptian_Hieroglyphs EEggyyppttiiaann__HHiieerrooggllyypphhss
EEggyypp
Elbasan Elbasan
EEllbbaa
Ethiopic EEtthhiiooppiicc
EEtthhii
Georgian GGeeoorrggiiaann
GGeeoorr
Glagolitic GGllaaggoolliittiicc
GGllaagg
Gothic Gothic
GGootthh
Grantha Grantha
GGrraann
Greek Greek
GGrreekk
Gujarati GGuujjaarraattii
GGuujjrr
Gurmukhi GGuurrmmuukkhhii
GGuurruu
HHaann HHaann
HHaannii
Hangul Hangul
HHaanngg
Hanunoo Hanunoo
HHaannoo
Hebrew Hebrew
HHeebbrr
Hiragana HHiirraaggaannaa
HHiirraa
Imperial_Aramaic IImmppeerriiaall__AArraammaaiicc
AArrmmii
Inherited IInnhheerriitteedd
ZZiinnhh
QQaaaaii
Inscriptional_Pahlavi IInnssccrriippttiioonnaall__PPaahhllaavvii
PPhhllii
Inscriptional_Parthian IInnssccrriippttiioonnaall__PPaarrtthhiiaann
PPrrttii
Javanese JJaavvaanneessee
JJaavvaa
Kaithi Kaithi
KKtthhii
Kannada Kannada
KKnnddaa
Katakana KKaattaakkaannaa
KKaannaa
Kayah_Li KKaayyaahh__LLii
KKaallii
Kharoshthi KKhhaarroosshhtthhii
KKhhaarr
Khmer Khmer
KKhhmmrr
Khojki Khojki
KKhhoojj
Khudawadi KKhhuuddaawwaaddii
SSiinndd
LLaaoo LLaaoo
LLaaoooo
Latin Latin
LLaattnn
Lepcha Lepcha
LLeeppcc
Limbu Limbu
LLiimmbb
Linear_A LLiinneeaarr__AA
LLiinnaa
Linear_B LLiinneeaarr__BB
LLiinnbb
LLiissuu LLiissuu
LLiissuu
Lycian Lycian
LLyyccii
Lydian Lydian
LLyyddii
Mahajani MMaahhaajjaannii
MMaahhjj
Malayalam MMaallaayyaallaamm
MMllyymm
Mandaic Mandaic
MMaanndd
Manichaean MMaanniicchhaaeeaann
MMaannii
Marchen Marchen
Masaram_Gondi MMaassaarraamm__GGoonnddii
GGoonnmm
Meetei_Mayek MMeeeetteeii__MMaayyeekk
MMtteeii
Mende_Kikakui MMeennddee__KKiikkaakkuuii
MMeenndd
Meroitic_Cursive MMeerrooiittiicc__CCuurrssiivvee
MMeerrcc
Meroitic_Hieroglyphs MMeerrooiittiicc__HHiieerrooggllyypphhss
MMeerroo
MMiiaaoo MMiiaaoo
PPllrrdd
MMooddii MMooddii
MMooddii
Mongolian MMoonnggoolliiaann
MMoonngg
MMrroo MMrroo
MMrroooo
Multani Multani
MMuulltt
Myanmar Myanmar
MMyymmrr
Nabataean NNaabbaattaaeeaann
NNbbaatt
New_Tai_Lue NNeeww__TTaaii__LLuuee
TTaalluu
NNeewwaa NNeewwaa
NNeewwaa
NNkkoo
Nushu Nushu
NNsshhuu
Ogham Ogham
OOggaamm
Ol_Chiki OOll__CChhiikkii
OOllcckk
Old_Hungarian OOlldd__HHuunnggaarriiaann
HHuunngg
Old_Italic OOlldd__IIttaalliicc
IIttaall
Old_North_Arabian OOlldd__NNoorrtthh__AArraabbiiaann
NNaarrbb
Old_Permic OOlldd__PPeerrmmiicc
PPeerrmm
Old_Persian OOlldd__PPeerrssiiaann
XXppeeoo
Old_South_Arabian OOlldd__SSoouutthh__AArraabbiiaann
SSaarrbb
Old_Turkic OOlldd__TTuurrkkiicc
OOrrkkhh
Oriya Oriya
OOrryyaa
Osage Osage
OOssggee
Osmanya Osmanya
OOssmmaa
Pahawh_Hmong PPaahhaawwhh__HHmmoonngg
HHmmnngg
Pau_Cin_Hau PPaauu__CCiinn__HHaauu
PPaauucc
Phags_Pa PPhhaaggss__PPaa
PPhhaagg
Phoenician PPhhooeenniicciiaann
PPhhnnxx
Psalter_Pahlavi PPssaalltteerr__PPaahhllaavvii
PPhhllpp
Rejang Rejang
RRjjnngg
Runic Runic
RRuunnrr
Samaritan SSaammaarriittaann
SSaammrr
Saurashtra SSaauurraasshhttrraa
SSaauurr
Sharada Sharada
SShhrrdd
Shavian Shavian
SShhaaww
Siddham Siddham
SSiidddd
SignWriting SSiiggnnWWrriittiinngg
SSggnnww
Sinhala Sinhala
SSiinnhh
Sora_Sompeng SSoorraa__SSoommppeenngg
SSoorraa
Sundanese SSuunnddaanneessee
SSuunndd
Syloti_Nagri SSyylloottii__NNaaggrrii
SSyylloo
Syriac Syriac
SSyyrrcc
Tagalog Tagalog
TTggllgg
Tagbanwa TTaaggbbaannwwaa
TTaaggbb
Tai_Le Tai_Le
TTaallee
Tai_Tham TTaaii__TThhaamm
LLaannaa
Tai_Viet TTaaii__VViieett
TTaavvtt
Takri Takri
TTaakkrr
Tamil Tamil
TTaammll
Tangut Tangut
TTaanngg
Telugu Telugu
TTeelluu
Thaana Thaana
TThhaaaa
TThhaaii TThhaaii
TThhaaii
Tifinagh TTiiffiinnaagghh
TTffnngg
Tirhuta Tirhuta
TTiirrhh
Ugaritic UUggaarriittiicc
UUggaarr
VVaaii VVaaii
VVaaiiii
Warang_Citi WWaarraanngg__CCiittii
WWaarraa
YYii YYii
YYiiiiii
Zanabazar_Square ZZaannaabbaazzaarr__SSqquuaarree
ZZaannbb
21.2.2.9 AtomEscape
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
CharacterEscape ::
ControlEscape
c ControlLetter
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
RegExpUnicodeEscapeSequence
IdentityEscape
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
21.2.2.14 ClassRanges
21.2.2.15 NonemptyClassRanges
The abstract operation CharacterRange takes two CharSet parameters A and B and performs the following steps:
21.2.2.16 NonemptyClassRangesNoDash
NOTE 1 ClassRanges can expand into a single ClassAtom and/or ranges of two ClassAtom separated by
dashes. In the latter case the ClassRanges includes all characters between the first ClassAtom and the
second ClassAtom, inclusive; an error occurs if either ClassAtom does not represent a single
character (for example, if one is \w) or if the first ClassAtom's character value is greater than the
second ClassAtom's character value.
NOTE 2 Even if the pattern ignores case, the case of the two ends of a range is significant in determining
which characters belong to the range. Thus, for example, the pattern /[E-F]/i matches only the
letters E , F , e , and f , while the pattern /[E-f]/i matches all upper and lower-case letters in the
Unicode Basic Latin block as well as the symbols [ , \ , ] , ^ , _ , and ` .
21.2.2.17 ClassAtom
21.2.2.18 ClassAtomNoDash
21.2.2.19 ClassEscape
ClassEscape :: b
ClassEscape :: -
ClassEscape :: CharacterEscape
ClassEscape :: CharacterClassEscape
NOTE A ClassAtom can use any of the escape sequences that are allowed in the rest of the regular
expression except for \b
\b, \B
\B, and backreferences. Inside a CharacterClass, \b means the backspace
character, while \B and backreferences raise errors. Using a backreference inside a ClassAtom
causes an error.
NOTE If pattern is supplied using a StringLiteral, the usual escape sequence substitutions are performed
before the String is processed by RegExp. If pattern must contain an escape sequence to be
recognized by RegExp, any U+005C (REVERSE SOLIDUS) code points must be escaped within the
StringLiteral to prevent them being removed when the contents of the StringLiteral are formed.
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:
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 RegExp 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 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
© Ecma International 2018 573
Ecma International
The initial value of RegExp.prototype.constructor is the intrinsic object %RegExp%.
Performs a regular expression match of string against the regular expression and returns an Array object containing
the results of the match, or null if string did not match.
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
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:
RegExp.prototype.ignoreCase is an accessor property whose set accessor function is undefined. Its get
accessor function performs the following steps:
When the @@match method is called with argument string, the following steps are taken:
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.
RegExp.prototype.multiline is an accessor property whose set accessor function is undefined. Its get
accessor function performs the following steps:
When the @@replace method is called with arguments string and replaceValue, the following steps are taken:
When the @@search method is called with argument string, the following steps are taken:
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:
NOTE 1 Returns an Array object into which substrings of the result of converting string to a String have been stored
are determined by searching from left to right for matches of the this value regular expression; these occurr
part of any substring in the returned array, but serve to divide up the String value.
The this value may be an empty regular expression or a regular expression that can match an empty String.
regular expression does not match the empty substring at the beginning or end of the input String, nor does
empty substring at the end of the previous separator match. (For example, if the regular expression matche
String, the String is split up into individual code unit elements; the length of the result array equals the leng
and each substring contains one code unit.) Only the first match at a given index of the String is considered
backtracking could yield a non-empty-substring match at that index. (For example, /a*?/[Symbol.spl
/a*?/[Symbol.sp
evaluates to the array ["a", "b"]
"b"], while /a*/[Symbol.split]("ab") evaluates to the array
If the string is (or converts to) the empty String, the result depends on whether the regular expression can m
String. If it can, the result array contains no elements. Otherwise, the result array contains one element, whi
String.
If the regular expression contains capturing parentheses, then each time separator is matched the results (inc
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", "/"
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.
RegExp.prototype.sticky is an accessor property whose set accessor function is undefined. Its get accessor
function performs the following steps:
21.2.5.14 RegExp.prototype.test ( S )
21.2.5.15 RegExp.prototype.toString ( )
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
source, global
global, ignoreCase
ignoreCase, and multiline
multiline. Those properties are now specified as
accessor properties of RegExp.prototype.
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.
This description applies if and only if the Array constructor is called with exactly one argument.
This description applies if and only if the Array constructor is called with at least two 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.
The isArray function takes one argument arg, and performs the following steps:
1. Return ? IsArray(arg).
When the of method is called with any number of arguments, the following steps are taken:
NOTE 2 The of 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 other constructors that may
be called with a single numeric argument.
22.1.2.4 Array.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Array[@@species] is an accessor property whose set accessor function is undefined. Its get accessor function
performs the following steps:
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
The copyWithin method takes up to three arguments target, start and end.
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.
22.1.3.4 Array.prototype.entries ( )
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 2 The every 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 fill method takes up to three arguments value, start and end.
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.
NOTE 1 callbackfn should be a function that accepts three arguments and returns a value that is coercible to
the Boolean value true or false. filter calls callbackfn once for each element in the array, in
ascending order, and constructs a new array of all the values for which callbackfn returns true.
callbackfn is called only for elements of the array which actually exist; it is not called for missing
elements of the array.
If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn.
If it is not provided, undefined is used instead.
callbackfn is called with three arguments: the value of the element, the index of the element, and the
object being traversed.
filter does not directly mutate the object on which it is called but the object may be mutated by
the calls to callbackfn.
The range of elements processed by filter is set before the first call to callbackfn. Elements
which are appended to the array after the call to filter begins will not be visited by callbackfn. If
existing elements of the array are changed their value as passed to callbackfn will be the value at the
time filter visits them; elements that are deleted after the call to filter begins and before
being visited are not visited.
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.
The find method is called with one or two arguments, predicate and thisArg.
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.
When the find method is called, the following steps are taken:
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.
NOTE 1 predicate should be a function that accepts three arguments and returns a value that is coercible to
the Boolean value true or false. findIndex 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,
findIndex immediately returns the index of that element value. Otherwise, findIndex
returns -1.
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 transferred to other kinds of objects for use as a method.
NOTE 1 includes compares searchElement to the elements of the array, in ascending order, using the
SameValueZero algorithm, and if found at any position, returns true; otherwise, false is returned.
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.
NOTE 1 indexOf compares searchElement to the elements of the array, in ascending order, using the Strict
Equality Comparison algorithm, and if found at one or more indices, returns the smallest such
index; otherwise, -1 is returned.
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.
When the indexOf method is called with one or two arguments, the following steps are taken:
NOTE 1 The elements of the array are converted to Strings, and these Strings are then concatenated,
separated by occurrences of the separator. If no separator is provided, a single comma is used as the
separator.
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.14 Array.prototype.keys ( )
NOTE 1 lastIndexOf compares searchElement to the elements of the array in descending order using the
Strict Equality Comparison algorithm, and if found at one or more indices, returns the largest such
index; otherwise, -1 is returned.
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.
NOTE 1 callbackfn should be a function that accepts three arguments. map calls callbackfn once for each
element in the array, in ascending order, and constructs a new Array from the results. callbackfn is
called only for elements of the array which actually exist; it is not called for missing elements of the
array.
If a thisArg parameter is provided, it will be used as the this value for each invocation of callbackfn.
If it is not provided, undefined is used instead.
callbackfn is called with three arguments: the value of the element, the index of the element, and the
object being traversed.
map does not directly mutate the object on which it is called but the object may be mutated by the
calls to callbackfn.
The range of elements processed by map is set before the first call to callbackfn. Elements which are
appended to the array after the call to map begins will not be visited by callbackfn. If existing
elements of the array are changed, their value as passed to callbackfn will be the value at the time
map visits them; elements that are deleted after the call to map begins and before being visited are
not visited.
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.17 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.
NOTE 1 The arguments are appended to the end of the array, in the order in which they appear. The new
length of the array is returned as the result of the call.
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.
NOTE 1 callbackfn should be a function that takes four arguments. reduce calls the callback, as a function,
once for each element after the first element present in the array, in ascending order.
callbackfn is called with four arguments: the previousValue (value from the previous call to
callbackfn), the currentValue (value of the current element), the currentIndex, and the object being
traversed. The first time that callback is called, the previousValue and currentValue can be one of two
values. If an initialValue was supplied in the call to reduce
reduce, then previousValue will be equal to
initialValue and currentValue will be equal to the first value in the array. If no initialValue was
supplied, then previousValue will be equal to the first value in the array and currentValue will be
equal to the second. It is a TypeError if the array contains no elements and initialValue is not
provided.
reduce does not directly mutate the object on which it is called but the object may be mutated by
the calls to callbackfn.
The range of elements processed by reduce is set before the first call to callbackfn. Elements that
are appended to the array after the call to reduce begins will not be visited by callbackfn. If
existing elements of the array are changed, their value as passed to callbackfn will be the value at
the time reduce visits them; elements that are deleted after the call to reduce begins and before
being visited are not visited.
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.
NOTE 1 callbackfn should be a function that takes four arguments. reduceRight calls the callback, as a
function, once for each element after the first element present in the array, in descending order.
callbackfn is called with four arguments: the previousValue (value from the previous call to
callbackfn), the currentValue (value of the current element), the currentIndex, and the object being
traversed. The first time the function is called, the previousValue and currentValue can be one of two
values. If an initialValue was supplied in the call to reduceRight
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:
NOTE 2 The reduceRight 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.21 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.22 Array.prototype.shift ( )
NOTE 1 The first element of the array is removed from the array and returned.
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 1 The slice method takes two arguments, start and end, and returns an array containing the
elements of the array from element start up to, but not including, element end (or through the end
of the array if end is undefined). If start is negative, it is treated as length+start where length is the
length of the array. If end is negative, it is treated as length+end where length is the length of the
array.
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.
The elements of this array are sorted. The sort is not necessarily stable (that is, elements that compare equal do not
necessarily remain in their original order). If comparefn is not undefined, it should be a function that accepts two
arguments x and y and returns a negative value if x < y, zero if x = y, or a positive value if x > y.
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.
The sort order is also implementation-defined if obj is sparse and any of the following conditions are 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,
606 © Ecma International 2018
Ecma International
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 values a, b, and c (possibly the same value) in the set S: The notation a <CF b means comparefn(a, b) < 0; a =CF b
means comparefn(a, b) = 0 (of either sign); and a >CF b means comparefn(a, b) > 0.
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 Method calls performed by the ToString abstract operations in steps 5 and 7 have the potential to
cause SortCompare to not behave as a consistent comparison function.
NOTE 1 When the splice method is called with two or more arguments start, deleteCount and zero or
more items, the deleteCount elements of the array starting at integer index start are replaced by the
arguments items. An Array object containing the deleted elements (if any) is returned.
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.
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the
Array.prototype.toLocaleString method as specified in the ECMA-402 specification. If an ECMAScript
implementation does not include the ECMA-402 API the following specification of the toLocaleString method
is used.
NOTE 1 The first edition of ECMA-402 did not include a replacement specification for the
Array.prototype.toLocaleString 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
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.28 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.
NOTE 1 The arguments are prepended to the start of the array, such that their order within the array is the
same as the order in which they appear in the argument list.
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.30 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 }.
Several methods of Array objects return Iterator objects. The abstract operation CreateArrayIterator with arguments
array and kind is used to create such iterator objects. It performs the following steps:
22.1.5.2.1 %ArrayIteratorPrototype%.next ( )
The initial value of the @@toStringTag property is the String value "Array Iterator"
Iterator".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
Array Iterator instances are ordinary objects that inherit properties from the %ArrayIteratorPrototype% intrinsic
object. Array Iterator instances are initially created with the internal slots listed in Table 55.
[[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"
"key", "value"
"value", "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% ( )
© Ecma International 2018 615
Ecma International
The %TypedArray% constructor performs the following steps:
has a [[Prototype]] internal slot whose value is the intrinsic object %FunctionPrototype%.
has a name property whose value is "TypedArray"
"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:
When the of method is called with any number of arguments, the following steps are taken:
22.2.2.3 %TypedArray%.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
%TypedArray%[@@species] is an accessor property whose set accessor function is undefined. Its get accessor function
© Ecma International 2018 617
Ecma International
performs the following steps:
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.
prototype.buffer is an accessor property whose set accessor function is undefined. Its get
%TypedArray%.prototype.buffer
accessor function performs the following steps:
22.2.3.4 %TypedArray%.prototype.constructor
22.2.3.6 %TypedArray%.prototype.entries ( )
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.
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 ( )
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.
prototype.length is an accessor property whose set accessor function is undefined. Its get
%TypedArray%.prototype.length
accessor function performs the following steps:
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 ( )
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.
.prototype.set is a single function whose behaviour is overloaded based upon the type of its
%TypedArray%.prototype.set
first argument.
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.
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 56 for targetName.
13. Let targetType be the String value of the Element Type value in Table 56 for targetName.
14. Let targetByteOffset be target.[[ByteOffset]].
15. Let src be ? ToObject(array).
16. Let srcLength be ? ToLength(? Get(src, "length"
"length")).
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]].
14. Let targetType be the String value of the Element Type value in Table 56 for targetName.
15. Let targetElementSize be the Number value of the Element Size value specified in Table 56 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 56 for srcName.
19. Let srcElementSize be the Number value of the Element Size value specified in Table 56 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. Let srcBuffer be ? CloneArrayBuffer(srcBuffer, srcByteOffset, srcByteLength, %ArrayBuffer%).
c. NOTE: %ArrayBuffer% is used to clone srcBuffer because is it known to not have any observable side-
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.
.prototype.sort is a distinct function that, except as described below, implements the same
%TypedArray%.prototype.sort
requirements as those of Array.prototype.sort as defined in 22.1.3.25. The implementation of the
.prototype.sort specification may be optimized with the knowledge that the this value is an
%TypedArray%.prototype.sort
object that has a fixed length and whose integer-indexed properties are not sparse. The only internal methods of the
this object that the algorithm may call are [[Get]] and [[Set]].
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.25:
When the TypedArray SortCompare abstract operation is called with two arguments x and y, the following steps are
taken:
NOTE Because NaN always compares greater than any other value, NaN property values always sort to
the end of the result when comparefn is not provided.
Returns a new TypedArray object whose element type is the same as this TypedArray and whose ArrayBuffer is the
same as the ArrayBuffer of this TypedArray, referencing the elements at begin, inclusive, up to end, exclusive. If either
begin or end is negative, it refers to an index from the end of the array, as opposed to from the beginning.
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 ( )
22.2.3.30 %TypedArray%.prototype.values ( )
The initial value of the @@iterator property is the same function object as the initial value of the
.prototype.values property.
%TypedArray%.prototype.values
The initial value of the name property of this function is "get [Symbol.toStringTag]"
[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 56.
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.
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 56. If the length argument is passed, an ArrayBuffer of that length is
© Ecma International 2018 631
Ecma International
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 the TypedArray instance O. It performs the following steps:
This description applies only if the TypedArray function is called with at least one argument and the Type of the first
argument is Object and that object has a [[TypedArrayName]] internal slot.
This description applies only if the TypedArray function is called with at least one argument and the Type of the first
argument is Object and that object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]] internal slot.
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 56 for this TypedArray
constructor.
4. Let O be ? AllocateTypedArray(constructorName, NewTarget, "% TypedArray Prototype%"
Prototype%").
5. Let usingIterator be ? GetMethod(object, @@iterator).
6. If usingIterator is not undefined, then
This description applies only if the TypedArray function is called with at least one argument and the Type of the first
argument is Object and that object has an [[ArrayBufferData]] internal slot.
TypedArray called with at least one argument buffer performs the following steps:
The abstract operation TypedArrayCreate with arguments constructor and argumentList is used to specify the creation
of a new TypedArray object using a constructor function. It performs the following steps:
The abstract operation TypedArraySpeciesCreate with arguments exemplar and argumentList is used to specify the
creation of a new TypedArray object using a constructor function that is derived from exemplar. It 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 56.
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 56
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
The value of TypedArray .prototype.BYTES_PER_ELEMENT is the Number value of the Element Size value
specified in Table 56 for TypedArray.
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
22.2.6.2 TypedArray.prototype.constructor
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.
When the Map function is called with optional argument, 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 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%.
has the following properties:
23.1.2.1 Map.prototype
Map[@@species] is an accessor property whose set accessor function is undefined. Its get accessor function
performs the following steps:
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.
23.1.3.2 Map.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.1.3.4 Map.prototype.entries ( )
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 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 ( )
Map.prototype.size is an accessor property whose set accessor function is undefined. Its get accessor function
performs the following steps:
23.1.3.11 Map.prototype.values ( )
The initial value of the @@iterator property is the same function object as the initial value of the entries property.
The initial value of the @@toStringTag property is the String value "Map"
"Map".
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"
Iterator".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
Map Iterator instances are ordinary objects that inherit properties from the %MapIteratorPrototype% intrinsic object.
Map Iterator instances are initially created with the internal slots described in Table 57.
[[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"
"key", "value"
"value", "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.
When the Set 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.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:
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.
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 initial value of the @@iterator property is the same function object as the initial value of the values property.
The initial value of the @@toStringTag property is the String value "Set"
"Set".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
Several methods of Set objects return Iterator objects. The abstract operation CreateSetIterator with arguments set and
kind is used to create such iterator objects. It performs the following steps:
23.2.5.2.1 %SetIteratorPrototype%.next ( )
The initial value of the @@toStringTag property is the String value "Set Iterator"
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 58.
[[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"
"key", "value"
"value", "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.
23.3.2.1 WeakMap.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
23.3.3.1 WeakMap.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.
The initial value of the @@toStringTag property is the String value "WeakMap"
"WeakMap".
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
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.
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.
The initial value of the @@toStringTag property is the String value "WeakSet"
"WeakSet".
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 performs the following steps:
1. Assert: Type(arrayBuffer) is Object and it has [[ArrayBufferData]] and [[ArrayBufferByteLength]] internal slots.
2. Assert: IsSharedArrayBuffer(arrayBuffer) is false.
3. Set arrayBuffer.[[ArrayBufferData]] to null.
4. Set arrayBuffer.[[ArrayBufferByteLength]] to 0.
5. Return NormalCompletion(null).
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:
The abstract operation RawBytesToNumber takes three parameters, a String type, a List rawBytes, and a Boolean
isLittleEndian. This operation performs the following steps:
1. Let elementSize be the Number value of the Element Size value specified in Table 56 for Element Type type.
2. If isLittleEndian is false, reverse the order of the elements of rawBytes.
3. If type is "Float32"
"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"
"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.
The abstract operation GetValueFromBuffer takes six parameters, an ArrayBuffer or SharedArrayBuffer arrayBuffer, an
integer byteIndex, a String type, a Boolean isTypedArray, a String order, and optionally a Boolean isLittleEndian. This
operation performs the following steps:
The abstract operation NumberToRawBytes takes three parameters, a String type, a Number value, and a Boolean
isLittleEndian. This operation performs the following steps:
1. If type is "Float32"
"Float32", then
a. Let rawBytes be a List containing the 4 bytes that are the result of converting value to IEEE 754-2008
binary32 format using “Round to nearest, ties to even” rounding mode. If isLittleEndian is false, the
bytes are arranged in big endian order. Otherwise, the bytes are arranged in little endian order. If value is
NaN, rawBytes may be set to any implementation chosen IEEE 754-2008 binary32 format Not-a-Number
encoding. An implementation must always choose the same encoding for each implementation
distinguishable NaN value.
2. Else if type is "Float64"
"Float64", then
a. Let rawBytes be a List containing the 8 bytes that are the IEEE 754-2008 binary64 format encoding of
value. If isLittleEndian is false, the bytes are arranged in big endian order. Otherwise, the bytes are
arranged in little endian order. If value is NaN, rawBytes may be set to any implementation chosen IEEE
754-2008 binary64 format Not-a-Number encoding. An implementation must always choose the same
encoding for each implementation distinguishable NaN value.
3. Else,
a. Let n be the Number value of the Element Size specified in Table 56 for Element Type type.
b. Let convOp be the abstract operation named in the Conversion Operation column in Table 56 for
Element Type type.
c. Let intValue be convOp(value).
d. If intValue ≥ 0, then
i. Let rawBytes be a List containing the n-byte binary encoding of intValue. If isLittleEndian is false,
the bytes are ordered in big endian order. Otherwise, the bytes are ordered in little endian order.
e. Else,
i. Let rawBytes be a List containing the n-byte binary 2's complement encoding of intValue. If
isLittleEndian is false, the bytes are ordered in big endian order. Otherwise, the bytes are ordered
in little endian order.
4. Return rawBytes.
The abstract operation SetValueInBuffer takes seven parameters, an ArrayBuffer or SharedArrayBuffer arrayBuffer, an
integer byteIndex, a String type, a Number value, a Boolean isTypedArray, a String order, and optionally a Boolean
isLittleEndian. This operation performs the following steps:
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 are taken:
24.1.3.2 ArrayBuffer.prototype
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
ArrayBuffer[@@species] 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"
"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.
The abstract operation AllocateSharedArrayBuffer with arguments constructor and byteLength is used to create a
SharedArrayBuffer object. It performs the following steps:
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:
24.2.4.2 SharedArrayBuffer.prototype.constructor
The initial value of the @@toStringTag property is the String value "SharedArrayBuffer"
"SharedArrayBuffer".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
The abstract operation GetViewValue with arguments view, requestIndex, isLittleEndian, and type is used by functions
on DataView instances to retrieve values from the view's buffer. It performs the following steps:
The abstract operation SetViewValue with arguments view, requestIndex, isLittleEndian, type, and value is used by
functions on DataView instances to store values into the view's buffer. It performs the following steps:
When the DataView 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
DataView.prototype.byteLength
prototype.byteLength is an accessor property whose set accessor function is undefined. Its get
accessor function performs the following steps:
DataView
DataView.prototype.byteOffset
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
When the getFloat32 method is called with argument byteOffset and optional argument littleEndian, the following
steps are taken:
When the getFloat64 method is called with argument byteOffset and optional argument littleEndian, the following
steps are taken:
When the getInt8 method is called with argument byteOffset, the following steps are taken:
When the getInt16 method is called with argument byteOffset and optional argument littleEndian, the following
steps are taken:
When the getInt32 method is called with argument byteOffset and optional argument littleEndian, the following
steps are taken:
When the getUint8 method is called with argument byteOffset, the following steps are taken:
When the getUint16 method is called with argument byteOffset and optional argument littleEndian, the following
steps are taken:
When the getUint32 method is called with argument byteOffset and optional argument littleEndian, the following
steps are taken:
When the setFloat32 method is called with arguments byteOffset and value and optional argument littleEndian, the
following steps are taken:
When the setFloat64 method is called with arguments byteOffset and value and optional argument littleEndian, the
following steps are taken:
When the setInt8 method is called with arguments byteOffset and value, the following steps are taken:
When the setInt16 method is called with arguments byteOffset and value and optional argument littleEndian, the
following steps are taken:
When the setInt32 method is called with arguments byteOffset and value and optional argument littleEndian, the
following steps are taken:
When the setUint8 method is called with arguments byteOffset and value, the following steps are taken:
When the setUint16 method is called with arguments byteOffset and value and optional argument littleEndian, the
following steps are taken:
When the setUint32 method is called with arguments byteOffset and value and optional argument littleEndian, the
following steps are taken:
The initial value of the @@toStringTag property is the String value "DataView"
"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 abstract operation ValidateSharedIntegerTypedArray takes one argument typedArray and an optional Boolean
onlyInt32. It performs the following steps:
The abstract operation ValidateAtomicAccess takes two arguments, typedArray and requestIndex. It performs the
following steps:
A WaiterList is a semantic object that contains an ordered list of those agents that are waiting on a location (block, i) in
shared memory; block is a Shared Data Block and i a byte offset into the memory of block.
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
waking 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:
24.4.1.4 EnterCriticalSection ( WL )
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
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 WakeWaiter takes two arguments, a WaiterList WL and an agent signifier W. It performs the
following steps:
NOTE The embedding may delay waking W, e.g. for resource management reasons, but W must
eventually be woken 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:
The abstract operation AtomicLoad takes two arguments, typedArray, index. The operation atomically loads a value
and 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
Atomics.isLockFree() is an optimization primitive. The intuition is that if the atomic step of
compareExchange, load
an atomic primitive (compareExchange load, store
store, add
add, sub
sub, and
and, or
or, xor
xor, or
exchange
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
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
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 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.
JSON allows Unicode code units 0x2028 (LINE SEPARATOR) and 0x2029 (PARAGRAPH SEPARATOR) to directly
appear in String literals without using an escape sequence. This is enabled by using the following alternative
definition of DoubleStringCharacter when parsing scriptText in step 4:
DoubleStringCharacter ::
SourceCharacter but not one of " or \ or U+0000 through U+001F
\ EscapeSequence
The SV of DoubleStringCharacter :: SourceCharacter but not one of " or \ or U+0000 through U+001F is the
680 © Ecma International 2018
Ecma International
UTF16Encoding of the code point value of SourceCharacter.
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.
The abstract operation InternalizeJSONProperty is a recursive abstract operation that takes two parameters: a holder
object and the String name of a property in that object. InternalizeJSONProperty uses the value of reviver that was
originally passed to the above parse function.
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 3 ") code units. The code units " and \ are
String values are wrapped in QUOTATION MARK ("
escaped with \ prefixes. Control characters code units are replaced with escape sequences
\u
\uHHHH, or with the shorter forms, \b (BACKSPACE), \f (FORM FEED), \n (LINE FEED), \r
(CARRIAGE RETURN), \t (CHARACTER TABULATION).
NOTE 4 Finite numbers are stringified as if by calling ToString(number). NaN and Infinity regardless of sign
are represented as the String null
null.
NOTE 5 Values that do not have a JSON representation (such as undefined and functions) do not produce a
String. Instead they produce the undefined value. In arrays these values are represented as the
String null
null. In objects an unrepresentable value causes the property to be excluded from
stringification.
NOTE 6 An object is rendered as U+007B (LEFT CURLY BRACKET) followed by zero or more properties,
separated with a U+002C (COMMA), closed with a U+007D (RIGHT CURLY BRACKET). A
property is a quoted String representing the key or property name, a U+003A (COLON), and then
the stringified property value. An array is rendered as an opening U+005B (LEFT SQUARE
BRACKET followed by zero or more values, separated with a U+002C (COMMA), closed with a
U+005D (RIGHT SQUARE BRACKET).
The abstract operation SerializeJSONProperty with arguments key, and holder has access to ReplacerFunction from the
invocation of the stringify method. Its algorithm is as follows:
The abstract operation QuoteJSONString with argument value wraps a String value in QUOTATION MARK code
units and escapes certain other code units within it.
1. Let product be the String value consisting solely of the code unit 0x0022 (QUOTATION MARK).
2. For each code unit C in value, do
a. If the numeric value of C is listed in the Code Unit Value column of Table 59, then
i. Set product to the string-concatenation of product and the Escape Sequence for C as specified in
Table 59.
b. Else if C has a numeric value less than 0x0020 (SPACE), then
i. Set product to the string-concatenation of product and UnicodeEscape(C).
c. Else,
i. Set product to the string-concatenation of product and C.
3. Set product to the string-concatenation of product and the code unit 0x0022 (QUOTATION MARK).
4. Return product.
0x0008 BACKSPACE \b
The abstract operation UnicodeEscape takes a code unit argument C and represents it as a Unicode escape sequence.
The abstract operation SerializeJSONObject with argument value serializes an object. It has access to the stack, indent,
gap, and PropertyList 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. 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
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"
"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
686 © Ecma International 2018
Ecma International
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 The returned object must conform to the Iterator
object. interface.
An object that implements the Iterator interface must include the property in Table 61. Such objects may also
implement the properties in Table 62.
next A function The returned object must conform to the IteratorResult interface. If a previous call to the
that returns next method of an Iterator has returned an IteratorResult object whose done property is
an true, then all subsequent calls to the next method of that object should also return an
IteratorResult IteratorResult object whose done property is true. However, this requirement is not
object. enforced.
NOTE 1 Arguments may be passed to the next function but their interpretation and validity is dependent
upon the target Iterator. The for-of statement and other common users of Iterators do not pass any
arguments, so Iterator objects that expect to be used in such a manner must be prepared to deal
with being called with no arguments.
return A function The returned object must conform to the IteratorResult interface. Invoking this method
that returns notifies the Iterator object that the caller does not intend to make any more next method
an calls to the Iterator. The returned IteratorResult object will typically have a done property
IteratorResult whose value is true, and a value property with the value passed as the argument of the
object. return method. However, this requirement is not enforced.
throw A function The returned object must conform to the IteratorResult interface. Invoking this method
that returns notifies the Iterator object that the caller has detected an error condition. The argument
an may be used to identify the error condition and typically will be an exception object. A
IteratorResult typical response is to throw the value passed as the argument. If the method does not
object. throw
throw, the returned IteratorResult object will typically have a done property whose
value is true.
NOTE 2 Typically callers of these methods should check for their existence before invoking them. Certain
ECMAScript language features including for for-ofof, yield*
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 The returned object must conform to the
AsyncIterator object. AsyncIterator interface.
An object that implements the AsyncIterator interface must include the properties in Table 64. Such objects may also
implement the properties in Table 65.
next A function The returned promise, when fulfilled, must fulfill with an object which conforms to the
that returns IteratorResult interface. If a previous call to the next method of an AsyncIterator has
a promise returned a promise for an IteratorResult object whose done property is true, then all
for an subsequent calls to the next method of that object should also return a promise for an
IteratorResult IteratorResult object whose done property is true. However, this requirement is not
object. enforced.
Additionally, the IteratorResult object that serves as a fulfillment value should have a
value property whose value is not a promise (or "thenable"). However, this requirement
is also not enforced.
NOTE 1 Arguments may be passed to the next function but their interpretation and validity is dependent
upon the target AsyncIterator. The for
for-await
await-ofof 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 IteratorResult interface. Invoking this method notifies the AsyncIterator object that the
a promise caller does not intend to make any more next method calls to the AsyncIterator. The
for an returned promise will fulfill with an IteratorResult object which will typically have a done
IteratorResult property whose value is true, and a value property with the value passed as the
object. argument of the return method. However, this requirement is not enforced.
Additionally, the IteratorResult object that serves as a fulfillment value should have a
value property whose value is not a promise (or "thenable"). If the argument value is
used in the typical manner, then if it is a rejected promise, a promise rejected with the
same reason should be returned; if it is a fulfilled promise, then its fulfillment value
should be used as the value property of the returned promise's IteratorResult object
fulfillment value. However, these requirements are also not enforced.
throw A function The returned promise, when fulfilled, must fulfill with an object which conforms to the
that returns IteratorResult interface. Invoking this method notifies the AsyncIterator object that the
a promise caller has detected an error condition. The argument may be used to identify the error
for an condition and typically will be an exception object. A typical response is to return a
IteratorResult rejected promise which 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 features including for
for-await
await-of
of and yield* call these methods after
performing an existence check.
done Either true This is the result status of an iterator next method call. If the end of the iterator was
or false. reached done is true. If the end was not reached done is false and a value is available. If
a done property (either own or inherited) does not exist, it is 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
ECMAScript value of the iterator, if it supplied one. If the iterator does not have a return value, value
language is undefined. In that case, the value property may be absent from the conforming object
value. if it does not inherit an 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%.
is an ordinary object.
The abstract operation CreateAsyncFromSyncIterator is used to create an async iterator Record from a synchronous
iterator Record. It performs the following steps:
The initial value of the @@toStringTag property is the String value "Async-from-Sync Iterator"
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 F is called with argument value, the following steps are
taken:
Async-from-Sync Iterator instances are ordinary objects that inherit properties from the
%AsyncFromSyncIteratorPrototype% intrinsic object. Async-from-Sync Iterator instances are initially created with the
internal slots listed in Table 67.
[[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:
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"
"GeneratorFunction".
has the following properties:
25.2.2.1 GeneratorFunction.length
This is a data property with a value of 1. This property has the attributes { [[Writable]]: false, [[Enumerable]]: false,
[[Configurable]]: true }.
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 68.
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"
"GeneratorFunction".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
25.2.4.1 length
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
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 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:
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 69.
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
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
The initial value of the @@toStringTag property is the String value "AsyncGeneratorFunction"
"AsyncGeneratorFunction".
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 a constructor property whose value is the
AsyncGeneratorFunction instance.
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 }.
The initial value of the @@toStringTag property is the String value "Generator"
"Generator".
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"
"suspendedStart", "suspendedYield"
"suspendedYield", "executing"
"executing", and "completed"
"completed".
[[GeneratorContext]] The execution context that is used when executing the code of this generator.
The abstract operation GeneratorStart with arguments generator and generatorBody performs the following steps:
The abstract operation GeneratorValidate with argument generator performs the following steps:
The abstract operation GeneratorResume with arguments generator and value performs the following steps:
The abstract operation GeneratorResumeAbrupt with arguments generator and abruptCompletion performs the
following steps:
25.4.3.5 GetGeneratorKind ( )
The abstract operation GeneratorYield with argument iterNextObj performs the following steps:
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"
"AsyncGenerator".
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"
"suspendedStart", "suspendedYield"
"suspendedYield", "executing"
"executing",
"awaiting-return"
"awaiting-return", and "completed"
"completed".
[[AsyncGeneratorContext]] The execution context that is used when executing the code of this async generator.
The AsyncGeneratorRequest is a Record value used to store information about how an async generator should be
resumed and contains capabilities for fulfilling or rejecting the corresponding promise.
[[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.
When an AsyncGeneratorResumeNext return processor fulfilled function F is called with argument value, the
following steps are taken:
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 F 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).
The PromiseReaction is a Record value used to store information about how a promise should react when it becomes
resolved or rejected with a given value. PromiseReaction records are created by the PerformPromiseThen abstract
operation, and are used by a PromiseReactionJob.
[[Capability]] A The capabilities of the promise for which this record provides a reaction
PromiseCapability handler.
Record
[[Type]] Either The [[Type]] is used when [[Handler]] is undefined to allow for behaviour
"Fulfill" or specific to the settlement type.
"Reject"
"Reject".
[[Handler]] A function object The function that should be applied to the incoming value, and whose return
or undefined. value will 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 F 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 F is called with argument resolution, the following steps are taken:
When the FulfillPromise abstract operation is called with arguments promise and value, 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 any subclass.
A GetCapabilitiesExecutor function is an anonymous built-in function that has a [[Capability]] internal slot.
When a GetCapabilitiesExecutor function F 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.
When the RejectPromise abstract operation is called with arguments promise and reason, the following steps are taken:
The abstract operation TriggerPromiseReactions takes a collection of PromiseReactionRecords and enqueues a new
Job for each record. Each such Job processes the [[Type]] and [[Handler]] of the PromiseReactionRecord, and if the
[[Handler]] is a function, calls it passing the given argument. If the [[Handler]] is undefined, the behaviour is
determined by the [[Type]].
An implementation of HostPromiseRejectionTracker must complete normally in all cases. The default implementation
of HostPromiseRejectionTracker is to unconditionally return an empty normal completion.
When a promise is rejected without any handlers, it is called with its operation argument set
to "reject"
"reject".
When a handler is added to a rejected promise for the first time, it is called with its operation
argument set to "handle"
"handle".
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.
The job PromiseResolveThenableJob with parameters promiseToResolve, thenable, and then performs the following steps:
When the Promise function is called with argument executor, the following steps are taken:
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.
716 © Ecma International 2018
Ecma International
25.6.4.1.1 Runtime Semantics: PerformPromiseAll ( iteratorRecord, constructor, resultCapability )
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 F 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.
NOTE 1 If the iterable argument is empty or if none of the promises in iterable ever settle then the pending
promise returned by this method will never be settled.
NOTE 2 The race function expects its this value to be a constructor function that supports the parameter
conventions of the Promise constructor. It also expects that its this value provides a resolve
method.
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 is a promise produced by this constructor.
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.
Promise[@@species] is an accessor property whose set accessor function is undefined. Its get accessor function
performs the following steps:
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.
When the catch method is called with argument onRejected, the following steps are taken:
25.6.5.2 Promise.prototype.constructor
When the finally method is called with argument onFinally, the following steps are taken:
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
Promise-like constructor function object, and the value of the
[[OnFinally]] internal slot is a function object.
When a Then Finally function F 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
Promise-like constructor function object, and the value of the
[[OnFinally]] internal slot is a function object.
When a Catch Finally function F is called with argument reason, the following steps are taken:
When the then method is called with arguments onFulfilled and onRejected, the following steps are taken:
The abstract operation PerformPromiseThen performs the “then” operation on promise using onFulfilled and onRejected
as its settlement actions. The result is resultCapability's promise.
The initial value of the @@toStringTag property is the String value "Promise"
"Promise".
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"
"pending", "fulfilled"
"fulfilled", and "rejected"
"rejected".
[[PromiseResult]] The value with which the promise has been fulfilled or rejected, if any. Only
meaningful if [[PromiseState]] is not "pending"
"pending".
[[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:
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 "AsyncFunction"
"AsyncFunction".
has the following properties:
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
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"
"AsyncFunction".
This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
25.7.4.1 length
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
© Ecma International 2018 725
Ecma International
26.1 The Reflect Object
The Reflect object:
When Proxy is called with arguments target and handler 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, F, is called, the following steps are taken:
1. Let p be F.[[RevocableProxy]].
2. If p is null, return undefined.
3. Set F.[[RevocableProxy]] to null.
4. Assert: p is a Proxy object.
5. Set p.[[ProxyTarget]] to null.
6. Set p.[[ProxyHandler]] to null.
7. Return undefined.
In addition to the properties specified in 9.4.6 each Module Namespace Object has the following own property:
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.
[[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"
"SeqCst", The weakest ordering guaranteed by the memory model for the
"Unordered"
"Unordered", or "Init" event.
[[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
function List of byte values and [[Payload]].
These events are introduced by abstract operations or by methods on the Atomics object.
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.
Shared Data Block events are ordered within candidate executions by the relations defined below.
[[AgentSignifier]] A value that admits equality testing The agent whose evaluation resulted in this ordering.
[[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
[[EventLists]] 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.[[EventLists]] 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 orders.
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.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 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"
"SeqCst".
W.[[Order]] is "SeqCst" or "Init"
"Init".
If W.[[Order]] is "SeqCst"
"SeqCst", then R and W have equal ranges.
If W.[[Order]] is "Init"
"Init", then for each event V such that (R, V) is in execution.[[ReadsFrom]], V.
[[Order]] is "Init"
"Init".
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 an event R and an event 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 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.
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 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
(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.
Examples of transformations that remain valid are: merging multiple non-atomic reads from the
same location, reordering non-atomic reads, introducing speculative non-atomic reads, merging
multiple non-atomic writes to the same location, reordering non-atomic writes to different
locations, and hoisting non-atomic reads out of loops even if that affects termination. Note in
general that aliased TypedArrays make it hard to prove that locations are different.
NOTE 3 The following are guidelines for ECMAScript implementers generating machine code for shared
memory accesses.
For architectures with memory models no weaker than those of ARM or Power, non-atomic stores
and loads may be compiled to bare stores and loads on the target architecture. Atomic stores and
loads may be compiled down to instructions that guarantee sequential consistency. If no such
instructions exist, memory barriers are to be employed, such as placing barriers on both sides of a
bare store or load. Read-modify-write operations may be compiled to read-modify-write
instructions on the target architectrue, such as LOCK
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.
A Grammar Summary
InputElementDiv ::
WhiteSpace
LineTerminator
Comment
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>
<ZWNBSP>
<USP>
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence ::
<LF>
<CR>[lookahead ≠ <LF>]
<LS>
<PS>
<CR><LF>
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
Punctuator
NumericLiteral
StringLiteral
Template
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
IdentifierStart ::
UnicodeIDStart
$
_
\ UnicodeEscapeSequence
IdentifierPart ::
UnicodeIDContinue
$
\ UnicodeEscapeSequence
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:
Punctuator :: one of
{ ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ? : = += -= *= %= **=
<<= >>= >>>= &= |= ^= =>
DivPunctuator ::
/
/=
RightBracePunctuator ::
}
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
0 1 2 3 4 5 6 7 8 9
NonZeroDigit :: one of
1 2 3 4 5 6 7 8 9
ExponentPart ::
ExponentIndicator SignedInteger
ExponentIndicator :: one of
e E
SignedInteger ::
DecimalDigits
+ DecimalDigits
- DecimalDigits
BinaryIntegerLiteral ::
0b BinaryDigits
0B BinaryDigits
BinaryDigits ::
BinaryDigit
BinaryDigits BinaryDigit
BinaryDigit :: one of
0 1
OctalIntegerLiteral ::
0o OctalDigits
0O OctalDigits
OctalDigits ::
OctalDigit
OctalDigits OctalDigit
OctalDigit :: one of
HexIntegerLiteral ::
0x HexDigits
0X HexDigits
HexDigits ::
HexDigit
HexDigits HexDigit
HexDigit :: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
StringLiteral ::
" DoubleStringCharactersopt "
DoubleStringCharacters ::
DoubleStringCharacter DoubleStringCharactersopt
SingleStringCharacters ::
SingleStringCharacter SingleStringCharactersopt
DoubleStringCharacter ::
SourceCharacter but not one of " or \ or LineTerminator
\ EscapeSequence
LineContinuation
SingleStringCharacter ::
SourceCharacter but not one of ' or \ or LineTerminator
\ EscapeSequence
LineContinuation
LineContinuation ::
\ LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
UnicodeEscapeSequence
CharacterEscapeSequence ::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter :: one of
' " \ b f n r t v
NonEscapeCharacter ::
SourceCharacter but not one of EscapeCharacter or LineTerminator
HexEscapeSequence ::
x HexDigit HexDigit
UnicodeEscapeSequence ::
u Hex4Digits
u{ CodePoint }
Hex4Digits ::
HexDigit HexDigit HexDigit HexDigit
RegularExpressionLiteral ::
/ RegularExpressionBody / RegularExpressionFlags
RegularExpressionBody ::
RegularExpressionFirstChar RegularExpressionChars
RegularExpressionChars ::
[empty]
RegularExpressionChars RegularExpressionChar
RegularExpressionFirstChar ::
RegularExpressionNonTerminator but not one of * or \ or / or [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar ::
RegularExpressionNonTerminator but not one of \ or / or [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence ::
\ RegularExpressionNonTerminator
RegularExpressionNonTerminator ::
SourceCharacter but not LineTerminator
RegularExpressionClass ::
[ RegularExpressionClassChars ]
RegularExpressionClassChars ::
[empty]
RegularExpressionClassChars RegularExpressionClassChar
RegularExpressionClassChar ::
RegularExpressionNonTerminator but not one of ] or \
RegularExpressionBackslashSequence
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
A.2 Expressions
IdentifierReference[Yield, Await] :
Identifier
[~Yield] yield
[~Await] await
BindingIdentifier[Yield, Await] :
Identifier
yield
await
Identifier :
IdentifierName but not ReservedWord
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] )
( )
( ... BindingIdentifier[?Yield, ?Await] )
ParenthesizedExpression[Yield, Await] :
( Expression[+In, ?Yield, ?Await] )
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
StringLiteral
ArrayLiteral[Yield, Await] :
[ ElementList[?Yield, ?Await] ]
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] :
IdentifierReference[?Yield, ?Await]
CoverInitializedName[?Yield, ?Await]
PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await]
MethodDefinition[?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] ]
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]
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] , )
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]
UpdateExpression[Yield, Await] :
LeftHandSideExpression[?Yield, ?Await]
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]
[+Await] AwaitExpression[?Yield]
ExponentiationExpression[Yield, Await] :
UnaryExpression[?Yield, ?Await]
UpdateExpression[?Yield, ?Await] ** ExponentiationExpression[?Yield, ?Await]
MultiplicativeOperator : one of
* / %
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] }
ArrayAssignmentPattern[Yield, Await] :
[ Elisionopt AssignmentRestElement[?Yield, ?Await] opt ]
[ AssignmentElementList[?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]
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]
WithStatement[?Yield, ?Await, ?Return]
LabelledStatement[?Yield, ?Await, ?Return]
ThrowStatement[?Yield, ?Await]
Declaration[Yield, Await] :
HoistableDeclaration[?Yield, ?Await, ~Default]
ClassDeclaration[?Yield, ?Await, ~Default]
LetOrConst :
let
const
VariableStatement[Yield, Await] :
var VariableDeclarationList[+In, ?Yield, ?Await] ;
BindingPattern[Yield, Await] :
ObjectBindingPattern[?Yield, ?Await]
ArrayBindingPattern[?Yield, ?Await]
ObjectBindingPattern[Yield, Await] :
{ }
{ BindingRestProperty[?Yield, ?Await] }
{ BindingPropertyList[?Yield, ?Await] }
ArrayBindingPattern[Yield, Await] :
[ Elisionopt BindingRestElement[?Yield, ?Await] opt ]
[ BindingElementList[?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]
BindingElement[Yield, Await] :
SingleNameBinding[?Yield, ?Await]
BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] opt
SingleNameBinding[Yield, Await] :
BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] opt
BindingRestElement[Yield, Await] :
... BindingIdentifier[?Yield, ?Await]
... BindingPattern[?Yield, ?Await]
EmptyStatement :
;
ExpressionStatement[Yield, Await] :
ForDeclaration[Yield, Await] :
LetOrConst ForBinding[?Yield, ?Await]
ForBinding[Yield, Await] :
BindingIdentifier[?Yield, ?Await]
BindingPattern[?Yield, ?Await]
ContinueStatement[Yield, Await] :
continue ;
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 ;
FunctionBody[~Yield, ~Await] }
FunctionExpression :
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] :
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] :
( UniqueFormalParameters[?Yield, ?Await] )
AsyncConciseBody[?In]
CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] =>
AsyncConciseBody[?In]
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]
PropertySetParameterList :
FormalParameter[~Yield, ~Await]
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]
AsyncMethod[Yield, Await] :
async [no LineTerminator here] PropertyName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await]
) { AsyncFunctionBody }
AsyncFunctionBody }
AsyncFunctionExpression :
async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody }
AsyncFunctionBody :
FunctionBody[~Yield, +Await]
AwaitExpression[Yield] :
await UnaryExpression[?Yield, +Await]
ClassExpression[Yield, Await] :
class BindingIdentifier[?Yield, ?Await] opt ClassTail[?Yield, ?Await]
ClassTail[Yield, Await] :
ClassHeritage[?Yield, ?Await] opt { ClassBody[?Yield, ?Await] opt }
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
ExportDeclaration
StatementListItem[~Yield, ~Await, ~Return]
ImportDeclaration :
import ImportClause FromClause ;
import ModuleSpecifier ;
ImportClause :
ImportedDefaultBinding
NameSpaceImport
NamedImports
ImportedDefaultBinding , NameSpaceImport
ImportedDefaultBinding , NamedImports
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 ;
export VariableStatement[~Yield, ~Await]
ExportClause :
{ }
{ ExportsList }
{ ExportsList , }
ExportsList :
ExportSpecifier
ExportsList , ExportSpecifier
ExportSpecifier :
IdentifierName
IdentifierName as IdentifierName
© Ecma International 2018 765
Ecma International
A.6 Number Conversions
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
DecimalDigits ::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit :: one of
0 1 2 3 4 5 6 7 8 9
ExponentPart ::
ExponentIndicator SignedInteger
ExponentIndicator :: one of
e E
SignedInteger ::
DecimalDigits
+ DecimalDigits
- DecimalDigits
HexIntegerLiteral ::
0x HexDigits
0X HexDigits
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]
Assertion[U, N] ::
^
$
\ b
\ B
( ? = Disjunction[?U, ?N] )
( ? ! Disjunction[?U, ?N] )
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 :: one of
f n r t v
ControlLetter :: one of
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
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] /
[~U] SourceCharacter but not UnicodeIDContinue
DecimalEscape ::
NonZeroDigit DecimalDigitsopt [lookahead ∉ DecimalDigit]
CharacterClassEscape[U] ::
d
D
s
S
w
W
[+U] p{ UnicodePropertyValueExpression }
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]
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 ::
0 OctalDigit
LegacyOctalLikeDecimalIntegerLiteral OctalDigit
NonOctalDigit :: one of
8 9
Syntax
EscapeSequence ::
CharacterEscapeSequence
LegacyOctalEscapeSequence
HexEscapeSequence
UnicodeEscapeSequence
LegacyOctalEscapeSequence ::
OctalDigit [lookahead ∉ OctalDigit]
ZeroToThree OctalDigit [lookahead ∉ OctalDigit]
FourToSeven OctalDigit
ZeroToThree OctalDigit OctalDigit
ZeroToThree :: one of
0 1 2 3
FourToSeven :: one of
4 5 6 7
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
SingleLineDelimitedComment ::
/* SingleLineDelimitedCommentCharsopt */
HTMLCloseComment ::
WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt --> SingleLineCommentCharsopt
SingleLineDelimitedCommentChars ::
SingleLineNotAsteriskChar SingleLineDelimitedCommentCharsopt
* SingleLinePostAsteriskCommentCharsopt
SingleLinePostAsteriskCommentChars ::
SingleLineNotForwardSlashOrAsteriskChar SingleLineDelimitedCommentCharsopt
* SingleLinePostAsteriskCommentCharsopt
SingleLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not one of / or * or LineTerminator
WhiteSpaceSequence ::
WhiteSpace WhiteSpaceSequenceopt
SingleLineDelimitedCommentSequence ::
SingleLineDelimitedComment WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt
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] QuantifiableAssertion[?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]
CharacterEscape[U, N] ::
ControlEscape
c ControlLetter
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
RegExpUnicodeEscapeSequence[?U]
[~U]LegacyOctalEscapeSequence
IdentityEscape[?U, ?N]
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] ::
\ [lookahead = c]
ClassEscape[U, N] ::
b
[+U] -
[~U] cClassControlLetter
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 the first ClassAtom is true or IsCharacterClass of the second ClassAtom
is true and this production has a [U] parameter.
ClassAtomNoDash :: \ [lookahead = c]
1. Return false.
ClassAtomNoDash :: \ [lookahead = c]
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.
The production Term :: ExtendedAtom evaluates the same as the production Term :: Atom 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
0x00FF, a four-digit escape sequence
of the form %u xxxx 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.
The unescape function is the %unescape% intrinsic object. When the unescape function is called with one
argument string, the following steps are taken:
B.2.2.1 Object.prototype.__proto__
780 © Ecma International 2018
Ecma International
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:
When the __defineGetter__ method is called with arguments P and getter, the following steps are taken:
When the __defineSetter__ method is called with arguments P and setter, the following steps are taken:
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:
The substr method takes two arguments, start and length, and returns a substring of the result of converting the
this object to a String, starting from index start and running for length code units (or through the end of the String if
length is undefined). If start is negative, it is treated as sourceLength+start where sourceLength is the length of the String.
The result is a String value, not a String object. 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 ( )
© Ecma International 2018 783
Ecma International
When the fixed method is called with no arguments, the following steps are taken:
When the fontcolor method is called with argument color, the following steps are taken:
When the fontsize method is called with argument size, 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:
When the link method is called with argument url, 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:
B.2.3.14 String.prototype.sup ( )
When the sup method is called with no arguments, the following steps are taken:
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:
NOTE The setFullYear method is preferred for nearly all purposes, because it avoids the “year 2000
problem.”
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
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 , }
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
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 Block containing the declaration of f.
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.
During FunctionDeclarationInstantiation the following steps are performed in place of step 28:
During GlobalDeclarationInstantiation the following steps are performed in place of step 14:
For web browser compatibility, that rule is modified with the addition of the highlighted text:
Block : { StatementList }
It is a Syntax Error if the LexicallyDeclaredNames of StatementList contains any duplicate entries, unless the
source 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 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.a.ii.1:
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. The relaxation of the normal static
semantic rule does not apply to names only bound by for-of statements.
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.
2. If name is bound by any syntactic form other than a FunctionDeclaration, a VariableStatement, the
VariableDeclarationList of a for statement, the ForBinding of a for-in statement, or the BindingIdentifier of a for-in
statement, 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 :
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:
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
implements, interface
interface, letlet, package
package, private
private, protected
protected, public
public, static
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
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
© Ecma International 2018 795
Ecma International
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 zone should be interpreted as "z"
"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"
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 "/"
"/".
22.1.3.25, 22.1.3.25.1: Previous editions did not specify how a NaN value returned by a comparefn was interpreted by
Array.prototype.sort
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.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-
19.1.2.11: 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.13: 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.14: 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.15: 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.16: 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.19: 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 TimeValue was NaN.
21.1.3.10 In ECMAScript 2015, the String.prototype.localeCompare function must treat Strings that are
798 © Ecma International 2018
Ecma International
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.
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/>
6. Unicode Standard Annex #18: Unicode Regular Expressions, available at <https://unicode.org/reports/tr18/>
7. Unicode Standard Annex #24: Unicode Script Property, available at <https://unicode.org/reports/tr24/>
8. Unicode Standard Annex #31, Unicode Identifiers and Pattern Syntax, available at
CH-1204 Geneva
Web: https://ecma-international.org/
Copyright Notice
© 2018 Ecma International
This draft document may be copied and furnished to others, and derivative works that comment on or otherwise
explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part,
without restriction of any kind, provided that the above copyright notice and this section are included on all such
copies and derivative works. However, this document itself may not be modified in any way, including by removing
the copyright notice or references to Ecma International, except as needed for the purpose of developing any
document or deliverable produced by Ecma International.
This disclaimer is valid only prior to final version of this document. After approval all rights on the standard are
reserved by Ecma International.
The limited permissions are granted through the standardization phase and will not be revoked by Ecma International
or its successors or assigns during this time.
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
800 © Ecma International 2018
Ecma International
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.