ECMAScript® 2022 Language Specification
ECMAScript® 2022 Language Specification
Specification
ECMAScript® 2022
Language Specification
https://tc39.es/ecma262/ 1/490
4/25/2021 ECMAScript® 2022 Language Specification
Community:
Discourse: https://es.discourse.group
IRC: #tc39 on freenode
Mailing List Archives: https://esdiscuss.org/
Refer to the colophon for more information on how this document is created.
https://tc39.es/ecma262/ 2/490
4/25/2021 ECMAScript® 2022 Language Specification
Introduction
This Ecma Standard defines the ECMAScript 2022 Language. It is the twelfth 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,
https://tc39.es/ecma262/ 3/490
4/25/2021 ECMAScript® 2022 Language Specification
program control of property attributes, additional array manipulation functions, support for the JSON
object encoding format, and a strict mode that provides enhanced error checking and program
security. The fifth edition was adopted by the Ecma General Assembly of December 2009.
The fifth edition was submitted to ISO/IEC JTC 1 for adoption under the fast-track procedure, and
approved as international standard ISO/IEC 16262:2011. Edition 5.1 of the ECMAScript Standard
incorporated minor corrections and is the same text as ISO/IEC 16262:2011. The 5.1 Edition was
adopted by the Ecma General Assembly of June 2011.
Focused development of the sixth edition started in 2009, as the fifth edition was being prepared for
publication. However, this was preceded by significant experimentation and language enhancement
design efforts dating to the publication of the third edition in 1999. In a very real sense, the
completion of the sixth edition is the culmination of a fifteen year effort. The goals for this edition
included providing better support for large applications, library creation, and for use of ECMAScript
as a compilation target for other languages. Some of its major enhancements included modules, class
declarations, lexical block scoping, iterators and generators, promises for asynchronous
programming, destructuring patterns, and proper tail calls. The ECMAScript library of built-ins was
expanded to support additional data abstractions including maps, sets, and arrays of binary numeric
values as well as additional support for Unicode 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.
ECMAScript 2017 introduced Async Functions, Shared Memory, and Atomics along with smaller
language and library enhancements, bug fixes, and editorial updates. Async functions improve the
asynchronous programming experience by providing syntax for promise-returning functions. Shared
Memory and Atomics introduce a new memory model that allows multi-agent programs to
communicate using atomic operations that ensure a well-defined execution order even on parallel
https://tc39.es/ecma262/ 4/490
4/25/2021 ECMAScript® 2022 Language Specification
CPUs. It also included new static methods on Object: Object.values, Object.entries, and
Object.getOwnPropertyDescriptors.
ECMAScript 2018 introduced support for asynchronous iteration via the AsyncIterator protocol and
async generators. It also included four new regular expression features: the dotAll flag, named
capture groups, Unicode property escapes, and look-behind assertions. Lastly it included object rest
and spread properties.
ECMAScript 2019 introduced a few new built-in functions: flat and flatMap on
Array.prototype for flattening arrays, Object.fromEntries for directly turning the return
value of Object.entries into a new Object, and trimStart and trimEnd on
String.prototype as better-named alternatives to the widely implemented but non-standard
String.prototype.trimLeft and trimRight built-ins. In addition, it included a few
minor updates to syntax and semantics. Updated syntax included optional catch binding parameters
and allowing U+2028 (LINE SEPARATOR) and U+2029 (PARAGRAPH SEPARATOR) in string
literals to align with JSON. Other updates included requiring that Array.prototype.sort be a
stable sort, requiring that JSON.stringify return well-formed UTF-8 regardless of input, and
clarifying Function.prototype.toString by requiring that it either return the
corresponding original source text or a standard placeholder.
ECMAScript 2020, the 11th edition, introduces the matchAll method for Strings, to produce an
iterator for all match objects generated by a global regular expression; import(), a syntax to
asynchronously import Modules with a dynamic specifier; BigInt, a new number primitive for
working with arbitrary precision integers; Promise.allSettled, a new Promise combinator
that does not short-circuit; globalThis, a universal way to access the global this value;
dedicated export * as ns from 'module' syntax for use within modules; increased
standardization of for-in enumeration order; import.meta, a host-populated object available in
Modules that may contain contextual information about the Module; as well as adding two new
syntax features to improve working with “nullish” values (null or undefined): nullish
coalescing, a value selection operator; and optional chaining, a property access and function
invocation operator that short-circuits if the value to access/invoke is nullish.
ECMAScript 2021, the 12th edition, introduces the replaceAll method for Strings;
Promise.any, a Promise combinator that short-circuits when an input value is fulfilled;
AggregateError, a new Error type to represent multiple errors at once; logical assignment
operators (??=, &&=, ||=); WeakRef, for referring to a target object without preserving it from
https://tc39.es/ecma262/ 5/490
4/25/2021 ECMAScript® 2022 Language Specification
Dozens of individuals representing many organizations have made very significant contributions
within Ecma TC39 to the development of this edition and to the prior editions. In addition, a vibrant
community has emerged supporting TC39's ECMAScript efforts. This community has reviewed
numerous drafts, filed thousands of bug reports, performed implementation experiments, contributed
test suites, and educated the world-wide developer community about ECMAScript. Unfortunately, it
is impossible to identify and acknowledge every person and organization who has contributed to this
effort.
Allen Wirfs-Brock
ECMA-262, Project Editor, 6th Edition
Brian Terlson
ECMA-262, Project Editor, 7th through 10th Editions
Jordan Harband
ECMA-262, Project Editor, 10th through 12th Editions
1 Scope
This Standard defines the ECMAScript 2022 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.
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 support program and regular expression syntax
not described in this specification. In particular, a conforming implementation of ECMAScript may
support program syntax that makes use of any “future reserved words” noted in subclause 12.6.2 of
this specification.
A conforming implementation of ECMAScript must not implement any extension that is listed as a
Forbidden Extension in subclause 17.1.
A conforming implementation of ECMAScript must not redefine any facilities that are not
implementation-defined, implementation-approximated, or host-defined.
NORMATIVE OPTIONAL
3 Normative References
https://tc39.es/ecma262/ 7/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
https://tc39.es/ecma262/ 8/490
4/25/2021 ECMAScript® 2022 Language Specification
ECMAScript usage has moved beyond simple scripting and it is now used for the full spectrum of
programming tasks in many different environments and scales. As the usage of ECMAScript has
expanded, so have the features and facilities it provides. ECMAScript is now a fully featured
general-purpose programming language.
A web server provides a different host environment for server-side computation including objects
representing requests, clients, and files; and mechanisms to lock and share data. By using browser-
side and server-side scripting together, it is possible to distribute computation between the client and
server while providing a customized user interface for a Web-based application.
Each Web browser and server that supports ECMAScript supplies its own host environment,
completing the ECMAScript execution environment.
https://tc39.es/ecma262/ 9/490
4/25/2021 ECMAScript® 2022 Language Specification
An implementation-defined facility is one that defers its definition to an external source without
further qualification. This specification does not make any recommendations for particular
behaviours, and conforming implementations are free to choose any behaviour within the constraints
put forth by this specification.
An implementation-approximated facility is one that defers its definition to an external source while
recommending an ideal behaviour. While conforming implementations are free to choose any
behaviour within the constraints put forth by this specification, they are encouraged to strive to
approximate the ideal. Some mathematical operations, such as Math.exp, are implementation-
approximated.
A host is an external source that further defines facilities listed in Annex D but does not further
define other implementation-defined or implementation-approximated facilities. In informal use, a
host refers to the set of all implementations, such as the set of all web browsers, that interface with
this specification in the same way via Annex D. A host is often an external specification, such as
WHATWG HTML (https://html.spec.whatwg.org/). In other words, facilities that are host-defined
are often further defined in external specifications.
A host hook is an abstract operation that is defined in whole or in part by an external source. All host
hooks must be listed in Annex D.
A host-defined facility is one that defers its definition to an external source without further
qualification and is listed in Annex D. Implementations that are not hosts may also provide
definitions for host-defined facilities.
A host environment is a particular choice of definition for all host-defined facilities. A host
environment typically includes objects or functions which allow obtaining input and providing
output as host-defined properties of the global object.
This specification follows the editorial convention of always using the most specific term. For
example, if a facility is host-defined, it should not be referred to as implementation-defined.
Both hosts and implementations may interface with this specification via the language types,
specification types, abstract operations, grammar productions, intrinsic objects, and intrinsic symbols
https://tc39.es/ecma262/ 10/490
4/25/2021 ECMAScript® 2022 Language Specification
defined herein.
ECMAScript is object-based: basic language and host facilities are provided by objects, and an
ECMAScript program is a cluster of communicating objects. In ECMAScript, an object is a
collection of zero or more properties each with attributes that determine how each property can be
used—for example, when the Writable attribute for a property is set to false, any attempt by
executed ECMAScript code to assign a different value to the property fails. Properties are containers
that hold other objects, primitive values, or functions. A primitive value is a member of one of the
following built-in types: Undefined, Null, Boolean, Number, BigInt, String, and Symbol; an
object is a member of the built-in type Object; and a function is a callable object. A function that is
associated with an object via a property is called a method.
ECMAScript defines a collection of built-in objects that round out the definition of ECMAScript
entities. These built-in objects include the global object; objects that are fundamental to the runtime
semantics of the language including Object, Function, Boolean, Symbol, and various
Error objects; objects that represent and manipulate numeric values including Math, Number,
and Date; the text processing objects String and RegExp; objects that are indexed collections of
values including Array and nine different kinds of Typed Arrays whose elements all have a specific
numeric data representation; keyed collections including Map and Set objects; objects supporting
structured data including the JSON object, ArrayBuffer, SharedArrayBuffer, and
DataView; objects supporting control abstractions including generator functions and Promise
objects; and reflection objects including Proxy and Reflect.
ECMAScript also defines a set of built-in operators. ECMAScript operators include various unary
operations, multiplicative operators, additive operators, bitwise shift operators, relational operators,
equality operators, binary bitwise operators, binary logical operators, assignment operators, and the
comma operator.
Large ECMAScript programs are supported by modules which allow a program to be divided into
multiple sequences of statements and declarations. Each module explicitly identifies declarations it
https://tc39.es/ecma262/ 11/490
4/25/2021 ECMAScript® 2022 Language Specification
uses that need to be provided by other modules and which of its declarations are available for use by
other modules.
ECMAScript syntax intentionally resembles Java syntax. ECMAScript syntax is relaxed to enable it
to serve as an easy-to-use scripting language. For example, a variable is not required to have its type
declared nor are types associated with properties, and defined functions are not required to have their
declarations appear textually before calls to them.
4.3.1 Objects
Even though ECMAScript includes syntax for class definitions, ECMAScript objects are not
fundamentally class-based such as those in C++, Smalltalk, or Java. Instead objects may be created
in various ways including via a literal notation or via constructors which create objects and then
execute code that initializes all or part of them by assigning initial values to their properties. Each
constructor is a function that has a property named "prototype" that is used to implement prototype-
based inheritance and shared properties. Objects are created by using constructors in new
expressions; for example, new Date(2009, 11) creates a new Date object. Invoking a
constructor without using new has consequences that depend on the constructor. For example,
Date() produces a string representation of the current date and time rather than an object.
Every object created by a constructor has an implicit reference (called the object's prototype) to the
value of its constructor's "prototype" property. Furthermore, a prototype may have a non-null
implicit reference to its prototype, and so on; this is called the prototype chain. When a reference is
made to a property in an object, that reference is to the property of that name in the first object in the
prototype chain that contains a property of that name. In other words, first the object mentioned
directly is examined for such a property; if that object contains the named property, that is the
property to which the reference refers; if that object does not contain the named property, the
prototype for that object is examined next; and so on.
https://tc39.es/ecma262/ 12/490
4/25/2021 ECMAScript® 2022 Language Specification
cf 1 cf 2 cf 3 cf 4 cf 5
q1 q1 q1 q1 q1
q2 q2 q2 q2 q2
All objects that do not directly contain a particular property that their prototype contains share that
property and its value. Figure 1 illustrates this:
CF is a constructor (and also an object). Five objects have been created by using new expressions:
cf1, cf2, cf3, cf4, and cf5. Each of these objects contains properties named "q1" and "q2". The
dashed lines represent the implicit prototype relationship; so, for example, cf3's prototype is CFp.
The constructor, CF, has two properties itself, named "P1" and "P2", which are not visible to CFp,
cf1, cf2, cf3, cf4, or cf5. The property named "CFP1" in CFp is shared by cf1, cf2, cf3, cf4, and cf5
(but not by CF), as are any properties found in CFp's implicit prototype chain that are not named
"q1", "q2", or "CFP1". Notice that there is no implicit prototype link between CF and CFp.
Unlike most class-based object languages, properties can be added to objects dynamically by
assigning values to them. That is, constructors are not required to name or assign values to all or any
of the constructed object's properties. In the above diagram, one could add a new shared property for
cf1, cf2, cf3, cf4, and cf5 by assigning a new value to the property in CFp.
Although ECMAScript objects are not inherently class-based, it is often convenient to define class-
like abstractions based upon a common pattern of constructor functions, prototype objects, and
methods. The ECMAScript built-in objects themselves follow such a class-like pattern. Beginning
with ECMAScript 2015, the ECMAScript language includes syntactic class definitions that permit
programmers to concisely define objects that conform to the same class-like abstraction pattern used
by the built-in objects.
The ECMAScript Language recognizes the possibility that some users of the language may wish to
restrict their usage of some features available in the language. They might do so in the interests of
security, to avoid what they consider to be error-prone features, to get enhanced error checking, or
for other reasons of their choosing. In support of this possibility, ECMAScript defines a strict variant
of the language. The strict variant of the language excludes some specific syntactic and semantic
features of the regular ECMAScript language and modifies the detailed semantics of some features.
The strict variant also specifies additional error conditions that must be reported by throwing error
exceptions in situations that are not specified as errors by the non-strict form of the language.
The strict variant of ECMAScript is commonly referred to as the strict mode of the language. Strict
mode selection and use of the strict mode syntax and semantics of ECMAScript is explicitly made at
the level of individual ECMAScript source text units as described in 11.2.2. Because strict mode is
selected at the level of a syntactic source text unit, strict mode only imposes restrictions that have
local effect within such a source text unit. Strict mode does not restrict or modify any aspect of the
ECMAScript semantics that must operate consistently across multiple source text units. A complete
ECMAScript program may be composed of both strict mode and non-strict mode ECMAScript
source text units. In this case, strict mode only applies when actually executing code that is defined
within a strict mode source text unit.
In order to conform to this specification, an ECMAScript implementation must implement both the
full unrestricted ECMAScript language and the strict variant of the ECMAScript language as defined
by this specification. In addition, an implementation must support the combination of unrestricted
and strict mode source text units into a single composite program.
4.4.1 implementation-approximated
an implementation-approximated facility is defined in whole or in part by an external source but has
a recommended, ideal behaviour in this specification
4.4.2 implementation-defined
https://tc39.es/ecma262/ 14/490
4/25/2021 ECMAScript® 2022 Language Specification
4.4.3 host-defined
same as implementation-defined
4.4.4 type
set of data values as defined in clause 6
NOTE A primitive value is a datum that is represented directly at the lowest level of the
language implementation.
4.4.6 object
member of the type Object
NOTE An object is a collection of properties and has a single prototype object. The
prototype may be the null value.
4.4.7 constructor
function object that creates and initializes objects
NOTE The value of a constructor's "prototype" property is a prototype object that is used
to implement inheritance and shared properties.
https://tc39.es/ecma262/ 15/490
4/25/2021 ECMAScript® 2022 Language Specification
4.4.8 prototype
object that provides shared properties for other objects
NOTE When a constructor creates an object, that object implicitly references the
constructor's "prototype" property for the purpose of resolving property references.
The constructor's "prototype" property can be referenced by the program
expression constructor.prototype, and properties added to an object's
prototype are shared, through inheritance, by all objects sharing the prototype.
Alternatively, a new object may be created with an explicitly specified prototype by
using the Object.create built-in function.
https://tc39.es/ecma262/ 16/490
4/25/2021 ECMAScript® 2022 Language Specification
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
https://tc39.es/ecma262/ 17/490
4/25/2021 ECMAScript® 2022 Language Specification
whose value is the Boolean value. A Boolean object can be coerced to a Boolean
value.
NOTE A String value is a member of the String type. Each integer value in the sequence
usually represents a single 16-bit unit of UTF-16 text. However, ECMAScript does
not place any restrictions or requirements on the values except that they must be 16-
bit unsigned integers.
NOTE A String object is created by using the String constructor in a new expression,
supplying a String value as an argument. The resulting object has an internal slot
whose value is the String value. A String object can be coerced to a String value by
calling the String constructor as a function (22.1.1.1).
NOTE A Number value is a member of the Number type and is a direct representation of a
number.
set of all possible Number values including the special “Not-a-Number” (NaN) value, positive
infinity, and negative infinity
NOTE A Number object is created by using the Number constructor in a new expression,
supplying a Number value as an argument. The resulting object has an internal slot
whose value is the Number value. A Number object can be coerced to a Number
value by calling the Number constructor as a function (21.1.1.1).
4.4.26 Infinity
Number value that is the positive infinite Number value
4.4.27 NaN
Number value that is an IEEE 754-2019 “Not-a-Number” value
https://tc39.es/ecma262/ 19/490
4/25/2021 ECMAScript® 2022 Language Specification
4.4.34 function
member of the Object type that may be invoked as a subroutine
NOTE In addition to its properties, a function contains executable code and state that
determine how it behaves when invoked. A function's code may or may not be
written in ECMAScript.
4.4.36 property
part of an object that associates a key (either a String value or a Symbol value) and a value
NOTE Depending upon the form of the property the value may be represented either
directly as a data value (a primitive value, an object, or a function object) or
indirectly by a pair of accessor functions.
https://tc39.es/ecma262/ 20/490
4/25/2021 ECMAScript® 2022 Language Specification
4.4.37 method
function that is the value of a property
NOTE When a function is called as a method of an object, the object is passed to the
function as its this value.
4.4.39 attribute
internal value that defines some characteristic of a property
https://tc39.es/ecma262/ 21/490
4/25/2021 ECMAScript® 2022 Language Specification
Clauses 6 through 10 define the execution environment within which ECMAScript programs
operate.
Clauses 11 through 17 define the actual ECMAScript programming language including its syntactic
encoding and the execution semantics of all language features.
Clauses 18 through 28 define the ECMAScript standard library. They include the definitions of all of
the standard objects that are available for use by ECMAScript programs as they execute.
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.
https://tc39.es/ecma262/ 22/490
4/25/2021 ECMAScript® 2022 Language Specification
A lexical grammar for ECMAScript is given in clause 12. This grammar has as its terminal symbols
Unicode code points that conform to the rules for SourceCharacter defined in 11.1. It defines a set of
productions, starting from the goal symbol InputElementDiv, InputElementTemplateTail, or
InputElementRegExp, or InputElementRegExpOrTemplateTail, that describe how sequences of such
code points are translated into a sequence of input elements.
Input elements other than white space and comments form the terminal symbols for the syntactic
grammar for ECMAScript and are called ECMAScript tokens. These tokens are the reserved words,
identifiers, literals, and punctuators of the ECMAScript language. Moreover, line terminators,
although not considered to be tokens, also become part of the stream of input elements and guide the
process of automatic semicolon insertion (12.9). Simple white space and single-line comments are
discarded and do not appear in the stream of input elements for the syntactic grammar. A
MultiLineComment (that is, a comment of the form /*…*/ regardless of whether it spans more than
one line) is likewise simply discarded if it contains no line terminator; but if a MultiLineComment
contains one or more line terminators, then it is replaced by a single line terminator, which becomes
part of the stream of input elements for the syntactic grammar.
A RegExp grammar for ECMAScript is given in 22.2.1. This grammar also has as its terminal
symbols the code points as defined by SourceCharacter. It defines a set of productions, starting from
the goal symbol Pattern, that describe how sequences of code points are translated into regular
expression patterns.
Productions of the lexical and RegExp grammars are distinguished by having two colons “::” as
separating punctuation. The lexical and RegExp grammars share some productions.
Productions of the numeric string grammar are distinguished by having three colons “:::” as
punctuation.
https://tc39.es/ecma262/ 23/490
4/25/2021 ECMAScript® 2022 Language Specification
The syntactic grammar for ECMAScript is given in clauses 13 through 16. This grammar has
ECMAScript tokens defined by the lexical grammar as its terminal symbols (5.1.2). It defines a set
of productions, starting from two alternative goal symbols Script and Module, that describe how
sequences of tokens form syntactically correct independent components of ECMAScript programs.
When a parse is successful, it constructs a parse tree, a rooted tree structure in which each node is a
Parse Node. Each Parse Node is an instance of a symbol in the grammar; it represents a span of the
source text that can be derived from that symbol. The root node of the parse tree, representing the
whole of the source text, is an instance of the parse's goal symbol. When a Parse Node is an instance
of a nonterminal, it is also an instance of some production that has that nonterminal as its left-hand
side. Moreover, it has zero or more children, one for each symbol on the production's right-hand
side: each child is a Parse Node that is an instance of the corresponding symbol.
New Parse Nodes are instantiated for each invocation of the parser and never reused between parses
even of identical source text. Parse Nodes are considered the same Parse Node if and only if they
represent the same span of source text, are instances of the same grammar symbol, and resulted from
the same parser invocation.
NOTE 1 Parsing the same String multiple times will lead to different Parse Nodes. For
example, consider:
Each call to eval converts the value of str into an ECMAScript source text and
performs an independent parse that creates its own separate tree of Parse Nodes. The
trees are distinct even though each parse operates upon a source text that was
derived from the same String value.
NOTE 2 Parse Nodes are specification artefacts, and implementations are not required to use
https://tc39.es/ecma262/ 24/490
4/25/2021 ECMAScript® 2022 Language Specification
Productions of the syntactic grammar are distinguished by having just one colon “:” as punctuation.
The syntactic grammar as presented in clauses 13 through 16 is not a complete account of which
token sequences are accepted as a correct ECMAScript Script or Module. Certain additional token
sequences are also accepted, namely, those that would be described by the grammar if only
semicolons were added to the sequence in certain places (such as before line terminator characters).
Furthermore, certain token sequences that are described by the grammar are not considered
acceptable if a line terminator character appears in certain “awkward” places.
In certain cases, in order to avoid ambiguities, the syntactic grammar uses generalized productions
that permit token sequences that do not form a valid ECMAScript Script or Module. For example,
this technique is used for object literals and object destructuring patterns. In such cases a more
restrictive supplemental grammar is provided that further restricts the acceptable token sequences.
Typically, an early error rule will then 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
https://tc39.es/ecma262/ 25/490
4/25/2021 ECMAScript® 2022 Language Specification
alternative right-hand sides for the nonterminal then follow on succeeding lines. For example, the
syntactic definition:
WhileStatement :
while ( Expression ) Statement
states that the nonterminal WhileStatement represents the token while, followed by a left
parenthesis token, followed by an Expression, followed by a right parenthesis token, followed by a
Statement. The occurrences of Expression and Statement are themselves nonterminals. As another
example, the syntactic definition:
ArgumentList :
AssignmentExpression
ArgumentList , AssignmentExpression
The subscripted suffix “opt”, which may appear after a terminal or nonterminal, indicates an optional
symbol. The alternative containing the optional symbol actually specifies two right-hand sides, one
that omits the optional element and one that includes it. This means that:
VariableDeclaration :
BindingIdentifier Initializeropt
VariableDeclaration :
BindingIdentifier
BindingIdentifier Initializer
and that:
ForStatement :
for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
https://tc39.es/ecma262/ 26/490
4/25/2021 ECMAScript® 2022 Language Specification
ForStatement :
for ( LexicalDeclaration ; Expressionopt ) Statement
for ( LexicalDeclaration Expression ; Expressionopt ) Statement
ForStatement :
for ( LexicalDeclaration ; ) Statement
for ( LexicalDeclaration ; Expression ) Statement
for ( LexicalDeclaration Expression ; ) Statement
for ( LexicalDeclaration Expression ; Expression ) Statement
so, in this example, the nonterminal ForStatement actually has four alternative right-hand sides.
StatementList[Return] :
ReturnStatement
ExpressionStatement
StatementList :
ReturnStatement
ExpressionStatement
StatementList_Return :
ReturnStatement
ExpressionStatement
and that:
https://tc39.es/ecma262/ 27/490
4/25/2021 ECMAScript® 2022 Language Specification
StatementList[Return, In] :
ReturnStatement
ExpressionStatement
is an abbreviation for:
StatementList :
ReturnStatement
ExpressionStatement
StatementList_Return :
ReturnStatement
ExpressionStatement
StatementList_In :
ReturnStatement
ExpressionStatement
StatementList_Return_In :
ReturnStatement
ExpressionStatement
Multiple parameters produce a combinatory number of productions, not all of which are necessarily
referenced in a complete grammar.
References to nonterminals on the right-hand side of a production can also be parameterized. For
example:
StatementList :
ReturnStatement
ExpressionStatement[+In]
is equivalent to saying:
StatementList :
ReturnStatement
ExpressionStatement_In
https://tc39.es/ecma262/ 28/490
4/25/2021 ECMAScript® 2022 Language Specification
and:
StatementList :
ReturnStatement
ExpressionStatement[~In]
is equivalent to:
StatementList :
ReturnStatement
ExpressionStatement
A nonterminal reference may have both a parameter list and an “opt” suffix. For example:
VariableDeclaration :
BindingIdentifier Initializer[+In] opt
is an abbreviation for:
VariableDeclaration :
BindingIdentifier
BindingIdentifier Initializer_In
Prefixing a parameter name with “?” on a right-hand side nonterminal reference makes that
parameter value dependent upon the occurrence of the parameter name on the reference to the
current production's left-hand side symbol. For example:
VariableDeclaration[In] :
BindingIdentifier Initializer[?In]
is an abbreviation for:
VariableDeclaration :
BindingIdentifier Initializer
VariableDeclaration_In :
BindingIdentifier Initializer_In
https://tc39.es/ecma262/ 29/490
4/25/2021 ECMAScript® 2022 Language Specification
If a right-hand side alternative is prefixed with “[+parameter]” that alternative is only available if the
named parameter was used in referencing the production's nonterminal symbol. If a right-hand side
alternative is prefixed with “[~parameter]” that alternative is only available if the named parameter
was not used in referencing the production's nonterminal symbol. This means that:
StatementList[Return] :
[+Return] ReturnStatement
ExpressionStatement
is an abbreviation for:
StatementList :
ExpressionStatement
StatementList_Return :
ReturnStatement
ExpressionStatement
and that:
StatementList[Return] :
[~Return] ReturnStatement
ExpressionStatement
is an abbreviation for:
StatementList :
ReturnStatement
ExpressionStatement
StatementList_Return :
ExpressionStatement
When the words “one of” follow the colon(s) in a grammar definition, they signify that each of the
terminal symbols on the following line or lines is an alternative definition. For example, the lexical
grammar for ECMAScript contains the production:
NonZeroDigit :: one of
https://tc39.es/ecma262/ 30/490
4/25/2021 ECMAScript® 2022 Language Specification
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 = seq]” appears in the right-hand side of a production, it indicates that the
production may only be used if the token sequence seq is a prefix of the immediately following input
token sequence. Similarly, “[lookahead ∈ set]”, where set is a finite nonempty set of token
sequences, indicates that the production may only be used if some element of set is a prefix of the
immediately following token sequence. For convenience, the set can also be written as a
nonterminal, in which case it represents the set of all token sequences to which that nonterminal
could expand. It is considered an editorial error if the nonterminal could expand to infinitely many
distinct token sequences.
These conditions may be negated. “[lookahead ≠ seq]” indicates that the containing production may
only be used if seq is not a prefix of the immediately following input token sequence, and
“[lookahead ∉ set]” indicates that the production may only be used if no element of set is a prefix of
the immediately following token sequence.
DecimalDigit :: one of
0 1 2 3 4 5 6 7 8 9
https://tc39.es/ecma262/ 31/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
Note that when these phrases are used in the syntactic grammar, it may not be possible to
unambiguously identify the immediately following token sequence because determining later tokens
requires knowing which lexical goal symbol to use at later positions. As such, when these are used in
the syntactic grammar, it is considered an editorial error for a token sequence seq to appear in a
lookahead restriction (including as part of a set of sequences) if the choices of lexical goal symbols
to use could change whether or not seq would be a prefix of the resulting token sequence.
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.
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.
https://tc39.es/ecma262/ 32/490
4/25/2021 ECMAScript® 2022 Language Specification
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
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:
https://tc39.es/ecma262/ 33/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Top-level step
a. Substep.
b. Substep.
i. Subsubstep.
1. Subsubsubstep
a. Subsubsubsubstep
i. Subsubsubsubsubstep
A step or substep may be written as an “if” predicate that conditions its substeps. In this case, the
substeps are only applied if the predicate is true. If a step or substep begins with the word “else”, it is
a predicate that is the negation of the preceding “if” predicate step at the same level.
A step that begins with “Assert:” asserts an invariant condition of its algorithm. Such assertions are
used to make explicit algorithmic invariants that would otherwise be implicit. Such assertions add no
additional semantic requirements and hence need not be checked by an implementation. They are
used simply to clarify algorithms.
Algorithm steps may declare named aliases for any value using the form “Let x be someValue”.
These aliases are reference-like in that both x and someValue refer to the same underlying data and
modifications to either are visible to both. Algorithm steps that want to avoid this reference-like
behaviour should explicitly make a copy of the right-hand side: “Let x be a copy of someValue”
creates a shallow copy of someValue.
Once declared, an alias may be referenced in any subsequent steps and must not be referenced from
steps prior to the alias's declaration. Aliases may be modified using the form “Set x to
someOtherValue”.
https://tc39.es/ecma262/ 34/490
4/25/2021 ECMAScript® 2022 Language Specification
abstract operations are typically referenced using a method application style such as
someValue.OperationName(arg1, arg2).
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 }
https://tc39.es/ecma262/ 35/490
4/25/2021 ECMAScript® 2022 Language Specification
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".
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.
A “return” statement without a value in an algorithm step means the same thing as:
https://tc39.es/ecma262/ 36/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
https://tc39.es/ecma262/ 37/490
4/25/2021 ECMAScript® 2022 Language Specification
Invocations of abstract operations and syntax-directed operations that are prefixed by ? indicate that
ReturnIfAbrupt should be applied to the resulting Completion Record. For example, the step:
1. ? OperationName().
1. 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:
https://tc39.es/ecma262/ 38/490
4/25/2021 ECMAScript® 2022 Language Specification
Static Semantic Rules have names and typically are defined using an algorithm. Named Static
Semantic Rules are associated with grammar productions and a production that has multiple
alternative definitions will typically have for each alternative a distinct algorithm for each applicable
named static semantic rule.
A special kind of static semantic rule is an Early Error Rule. Early error rules define early error
conditions (see clause 17) that are associated with specific grammar productions. Evaluation of most
early error rules are not explicitly invoked within the algorithms of this specification. A conforming
implementation must, prior to the first evaluation of a Script or Module, validate all of the early error
rules of the productions used to parse that Script or Module. If any of the early error rules are
violated the Script or Module is invalid and cannot be evaluated.
Mathematical values: Arbitrary real numbers, used as the default numeric type.
Extended mathematical values: Mathematical values together with +∞ and -∞.
Numbers: IEEE 754-2019 double-precision floating point values.
BigInts: ECMAScript values representing arbitrary integers in a one-to-one correspondence.
In the language of this specification, numerical values are distinguished among different numeric
kinds using subscript suffixes. The subscript 𝔽 refers to Numbers, and the subscript ℤ refers to
BigInts. Numeric values without a subscript suffix refer to mathematical values.
Numeric operators such as +, ×, =, and ≥ refer to those operations as determined by the type of the
operands. When applied to mathematical values, the operators refer to the usual mathematical
https://tc39.es/ecma262/ 39/490
4/25/2021 ECMAScript® 2022 Language Specification
operations. When applied to Numbers, the operators refer to the relevant operations within IEEE
754-2019. When applied to BigInts, the operators refer to the usual mathematical operations applied
to the mathematical value of the BigInt.
In general, when this specification refers to a numerical value, such as in the phrase, "the length of y"
or "the integer represented by the four hexadecimal digits ...", without explicitly specifying a
numeric kind, the phrase refers to a mathematical value. Phrases which refer to a Number or a BigInt
value are explicitly annotated as such; for example, "the Number value for the number of code points
in …" or "the BigInt value for …".
Numeric operators applied to mixed-type operands (such as a Number and a mathematical value) are
not defined and should be considered an editorial error in this specification.
This specification denotes most numeric values in base 10; it also uses numeric values of the form 0x
followed by digits 0-9 or A-F as base-16 values.
When the term integer is used in this specification, it refers to a mathematical value which is in the
set of integers, unless otherwise stated. When the term integral Number is used in this specification,
it refers to a Number value whose mathematical value is in the set of integers.
Conversions between mathematical values and Numbers or BigInts are always explicit in this
document. A conversion from a mathematical value or extended mathematical value x to a Number
is denoted as "the Number value for x" or 𝔽(x), and is defined in 6.1.6.1. A conversion from an
integer x to a BigInt is denoted as "the BigInt value for x" or ℤ(x). A conversion from a Number or
BigInt x to a mathematical value is denoted as "the mathematical value of x", or ℝ(x). The
mathematical value of +0𝔽 and -0𝔽 is the mathematical value 0. The mathematical value of non-
finite values is not defined. The extended mathematical value of x is the mathematical value of x for
finite values, and is +∞ and -∞ for +∞𝔽 and -∞𝔽 respectively; it is not defined for NaN.
The mathematical function abs(x) produces the absolute value of x, which is -x if x < 0 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 are the extended mathematical values.
The notation “x modulo y” (y must be finite and non-zero) 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.
https://tc39.es/ecma262/ 40/490
4/25/2021 ECMAScript® 2022 Language Specification
The phrase "the result of clamping x between lower and upper" (where x is an extended
mathematical value and lower and upper are mathematical values such that lower ≤ upper) produces
lower if x < lower, produces upper if x > upper, and otherwise produces x.
The mathematical function floor(x) produces the largest integer (closest to +∞) that is not larger than
x.
Mathematical functions min, max, abs, and floor are not defined for Numbers and BigInts, and any
usage of those methods that have non-mathematical value arguments would be an editorial error in
this specification.
Values which are internal to the specification and not directly observable from ECMAScript code are
indicated with a sans-serif typeface. For instance, a Completion Record's [[Type]] field takes on
values like normal, return, or throw.
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
https://tc39.es/ecma262/ 42/490
4/25/2021 ECMAScript® 2022 Language Specification
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 11.1.3)
A code unit that is a leading surrogate or trailing surrogate, but is not part of a surrogate pair, is
interpreted as a code point with the same value.
NOTE The rationale behind this design was to keep the implementation of Strings as
simple and high-performing as possible. If ECMAScript source text is in
Normalized Form C, string literals are guaranteed to also be normalized, as long as
they do not contain any Unicode escape sequences.
In this specification, the phrase "the string-concatenation of A, B, ..." (where each argument is a
String value, a code unit, or a sequence of code units) denotes the String value whose sequence of
code units is the concatenation of the code units (in order) of each of the arguments (in order).
The phrase "the substring of S from inclusiveStart to exclusiveEnd" (where S is a String value or a
sequence of code units and inclusiveStart and exclusiveEnd are integers) denotes the String value
consisting of the consecutive code units of S beginning at index inclusiveStart and ending
immediately before index exclusiveEnd (which is the empty String when inclusiveStart =
exclusiveEnd). If the "to" suffix is omitted, the length of S is used as the value of exclusiveEnd.
The abstract operation StringIndexOf takes arguments string (a String), searchValue (a String), and
fromIndex (a non-negative integer). It performs the following steps when called:
https://tc39.es/ecma262/ 43/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 1 If searchValue is the empty String and fromIndex is less than or equal to the length
of string, this algorithm returns fromIndex. The empty String is effectively found at
every position within a string, including after the last code unit.
NOTE 2 This algorithm always returns -1 if fromIndex > the length of string.
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 (9.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.
https://tc39.es/ecma262/ 44/490
4/25/2021 ECMAScript® 2022 Language Specification
String.prototype.replace
method.
https://tc39.es/ecma262/ 46/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 48/490
4/25/2021 ECMAScript® 2022 Language Specification
The T::unit value and T::op operations are not a part of the ECMAScript language; they are defined
here solely to aid the specification of the semantics of the ECMAScript language. Other abstract
operations are defined throughout this specification.
Because the numeric types are in general not convertible without loss of precision or truncation, the
ECMAScript language provides no implicit conversion among these types. Programmers must
explicitly call Number and BigInt functions to convert among types when calling a function
which requires another type.
NOTE The first and subsequent editions of ECMAScript have provided, for certain
operators, implicit numeric conversions that could lose precision or truncate. These
legacy implicit conversions are maintained for backward compatibility, but not
provided for BigInt in order to minimize opportunity for programmer error, and to
leave open the option of generalized value types in a future edition.
The Number type has exactly 18,437,736,874,454,810,627 (that is, 264 - 253 + 3) values,
representing the double-precision 64-bit format IEEE 754-2019 values as specified in the IEEE
Standard for Binary Floating-Point Arithmetic, except that the 9,007,199,254,740,990 (that is, 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.) In some
implementations, external code might be able to detect a difference between various Not-a-Number
values, but such behaviour is implementation-defined; to ECMAScript code, all NaN values are
indistinguishable from each other.
NOTE The bit pattern that might be observed in an ArrayBuffer (see 25.1) or a
SharedArrayBuffer (see 25.2) after a Number value has been stored into it is not
necessarily the same as the internal representation of that Number value used by the
ECMAScript implementation.
There are two other special values, called positive Infinity and negative Infinity. For brevity, these
values are also referred to for expository purposes by the symbols +∞𝔽 and -∞𝔽, respectively. (Note
that these two infinite Number values are produced by the program expressions +Infinity (or
simply Infinity) and -Infinity.)
https://tc39.es/ecma262/ 49/490
4/25/2021 ECMAScript® 2022 Language Specification
The other 18,437,736,874,454,810,624 (that is, 264 - 253) values are called the finite numbers. Half
of these are positive numbers and half are negative numbers; for every finite positive Number value
there is a corresponding negative value having the same magnitude.
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.)
The 18,437,736,874,454,810,622 (that is, 264 - 253 - 2) finite non-zero values are of two kinds:
18,428,729,675,200,069,632 (that is, 264 - 254) of them are normalized, having the form
s × m × 2e
where s is 1 or -1, m is an integer such that 252 ≤ m < 253, and e is an integer such that -1074 ≤ e ≤
971.
The remaining 9,007,199,254,740,990 (that is, 253 - 2) values are denormalized, having the form
s × m × 2e
where s is 1 or -1, m is an integer such that 0 < m < 252, and e is -1074.
Note that all the positive and negative integers whose magnitude is no greater than 253 are
representable in the Number type. The integer 0 has two representations in the Number type: +0𝔽
and -0𝔽.
A finite number has an odd significand if it is non-zero 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
https://tc39.es/ecma262/ 50/490
4/25/2021 ECMAScript® 2022 Language Specification
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 < 0; 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-2019 roundTiesToEven mode.)
The Number value for +∞ is +∞𝔽, and the Number value for -∞ is -∞𝔽.
Some ECMAScript operators deal only with integers in specific ranges such as -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.
6.1.6.1.1 Number::unaryMinus ( x )
The abstract operation Number::unaryMinus takes argument x (a Number). It performs the following
steps when called:
6.1.6.1.2 Number::bitwiseNOT ( x )
The abstract operation Number::bitwiseNOT takes argument x (a Number). It performs the following
steps when called:
The abstract operation Number::exponentiate takes arguments base (a Number) and exponent (a
Number). It returns an implementation-approximated value representing the result of raising base to
the exponent power. It performs the following steps when called:
https://tc39.es/ecma262/ 51/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE The result of base ** exponent when base is 1𝔽 or -1𝔽 and exponent is +∞𝔽 or -∞𝔽,
or when base is 1𝔽 and exponent is NaN, differs from IEEE 754-2019. The first
edition of ECMAScript specified a result of NaN for this operation, whereas later
https://tc39.es/ecma262/ 52/490
4/25/2021 ECMAScript® 2022 Language Specification
6.1.6.1.4 Number::multiply ( x, y )
6.1.6.1.5 Number::divide ( x, y )
The abstract operation Number::divide takes arguments x (a Number) and y (a Number). It performs
division according to the rules of IEEE 754-2019 binary double-precision arithmetic, producing the
quotient of x and y where x is the dividend and y is the divisor. It performs the following steps when
called:
https://tc39.es/ecma262/ 53/490
4/25/2021 ECMAScript® 2022 Language Specification
6.1.6.1.6 Number::remainder ( n, d )
The abstract operation Number::remainder takes arguments n (a Number) and d (a Number). It yields
the remainder from an implied division of its operands where n is the dividend and d is the divisor. It
performs the following steps when called:
NOTE 1 In C and C++, the remainder operator accepts only integral operands; in
ECMAScript, it also accepts floating-point operands.
6.1.6.1.7 Number::add ( x, y )
The abstract operation Number::add takes arguments x (a Number) and y (a Number). It performs
addition according to the rules of IEEE 754-2019 binary double-precision arithmetic, producing the
sum of its arguments. It performs the following steps when called:
6.1.6.1.8 Number::subtract ( x, y )
NOTE It is always the case that x - y produces the same result as x + (-y).
6.1.6.1.9 Number::leftShift ( x, y )
https://tc39.es/ecma262/ 55/490
4/25/2021 ECMAScript® 2022 Language Specification
6.1.6.1.10 Number::signedRightShift ( x, y )
6.1.6.1.11 Number::unsignedRightShift ( x, y )
6.1.6.1.12 Number::lessThan ( x, y )
https://tc39.es/ecma262/ 56/490
4/25/2021 ECMAScript® 2022 Language Specification
6.1.6.1.13 Number::equal ( x, y )
The abstract operation Number::equal takes arguments x (a Number) and y (a Number). It performs
the following steps when called:
6.1.6.1.14 Number::sameValue ( x, y )
6.1.6.1.15 Number::sameValueZero ( x, y )
https://tc39.es/ecma262/ 57/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation NumberBitwiseOp takes arguments op (a sequence of Unicode code points),
x, and y. It performs the following steps when called:
1. Assert: op is &, ^, or |.
2. Let lnum be ! ToInt32(x).
3. Let rnum be ! ToInt32(y).
4. Let lbits be the 32-bit two's complement bit string representing ℝ(lnum).
5. Let rbits be the 32-bit two's complement bit string representing ℝ(rnum).
6. If op is &, let result be the result of applying the bitwise AND operation to lbits and rbits.
7. Else if op is ^, let result be the result of applying the bitwise exclusive OR (XOR) operation to
lbits and rbits.
8. Else, op is |. Let result be the result of applying the bitwise inclusive OR operation to lbits and
rbits.
9. Return the Number value for the integer represented by the 32-bit two's complement bit string
result.
6.1.6.1.17 Number::bitwiseAND ( x, y )
6.1.6.1.18 Number::bitwiseXOR ( x, y )
https://tc39.es/ecma262/ 58/490
4/25/2021 ECMAScript® 2022 Language Specification
6.1.6.1.19 Number::bitwiseOR ( x, y )
6.1.6.1.20 Number::toString ( x )
The abstract operation Number::toString takes argument x (a Number). It converts x to String format.
It performs the following steps when called:
https://tc39.es/ecma262/ 59/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 1 The following observations may be useful as guidelines for implementations, but are
not part of the normative requirements of this Standard:
NOTE 2 For implementations that provide more accurate conversions than required by the
rules above, it is recommended that the following alternative version of step 5 be
used as a guideline:
5. Otherwise, let n, k, and s be integers such that k ≥ 1, 10k - 1 ≤ s < 10k, s × 10n -
k is ℝ(x), 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 ℝ(x). If there
are two such possible values of s, choose the one that is even. Note that k is the
https://tc39.es/ecma262/ 60/490
4/25/2021 ECMAScript® 2022 Language Specification
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:
The BigInt type represents an integer value. The value may be any size and is not limited to a
particular bit-width. Generally, where not otherwise noted, operations are designed to return exact
mathematically-based answers. For binary operations, BigInts act as two's complement binary
strings, with negative numbers treated as having bits set infinitely to the left.
6.1.6.2.1 BigInt::unaryMinus ( x )
The abstract operation BigInt::unaryMinus takes argument x (a BigInt). It performs the following
steps when called:
6.1.6.2.2 BigInt::bitwiseNOT ( x )
The abstract operation BigInt::bitwiseNOT takes argument x (a BigInt). It returns the one's
complement of x; that is, -x - 1ℤ.
https://tc39.es/ecma262/ 61/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation BigInt::exponentiate takes arguments base (a BigInt) and exponent (a BigInt).
It performs the following steps when called:
6.1.6.2.4 BigInt::multiply ( x, y )
The abstract operation BigInt::multiply takes arguments x (a BigInt) and y (a BigInt). It returns the
BigInt value that represents the result of multiplying x and y.
NOTE Even if the result has a much larger bit width than the input, the exact mathematical
answer is given.
6.1.6.2.5 BigInt::divide ( x, y )
The abstract operation BigInt::divide takes arguments x (a BigInt) and y (a BigInt). It performs the
following steps when called:
6.1.6.2.6 BigInt::remainder ( n, d )
The abstract operation BigInt::remainder takes arguments n (a BigInt) and d (a BigInt). It performs
the following steps when called:
NOTE The sign of the result equals the sign of the dividend.
6.1.6.2.7 BigInt::add ( x, y )
The abstract operation BigInt::add takes arguments x (a BigInt) and y (a BigInt). It returns the BigInt
value that represents the sum of x and y.
6.1.6.2.8 BigInt::subtract ( x, y )
The abstract operation BigInt::subtract takes arguments x (a BigInt) and y (a BigInt). It returns the
BigInt value that represents the difference x minus y.
6.1.6.2.9 BigInt::leftShift ( x, y )
The abstract operation BigInt::leftShift takes arguments x (a BigInt) and y (a BigInt). It performs the
following steps when called:
NOTE Semantics here should be equivalent to a bitwise shift, treating the BigInt as an
infinite length string of binary two's complement digits.
6.1.6.2.10 BigInt::signedRightShift ( x, y )
6.1.6.2.11 BigInt::unsignedRightShift ( x, y )
https://tc39.es/ecma262/ 63/490
4/25/2021 ECMAScript® 2022 Language Specification
6.1.6.2.12 BigInt::lessThan ( x, y )
The abstract operation BigInt::lessThan takes arguments x (a BigInt) and y (a BigInt). It returns true
if ℝ(x) < ℝ(y) and false otherwise.
6.1.6.2.13 BigInt::equal ( x, y )
The abstract operation BigInt::equal takes arguments x (a BigInt) and y (a BigInt). It returns true if
ℝ(x) = ℝ(y) and false otherwise.
6.1.6.2.14 BigInt::sameValue ( x, y )
The abstract operation BigInt::sameValue takes arguments x (a BigInt) and y (a BigInt). It performs
the following steps when called:
6.1.6.2.15 BigInt::sameValueZero ( x, y )
6.1.6.2.16 BinaryAnd ( x, y )
The abstract operation BinaryAnd takes arguments x and y. It performs the following steps when
called:
1. Assert: x is 0 or 1.
2. Assert: y is 0 or 1.
3. If x is 1 and y is 1, return 1.
4. Else, return 0.
6.1.6.2.17 BinaryOr ( x, y )
https://tc39.es/ecma262/ 64/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation BinaryOr takes arguments x and y. It performs the following steps when
called:
1. Assert: x is 0 or 1.
2. Assert: y is 0 or 1.
3. If x is 1 or y is 1, return 1.
4. Else, return 0.
6.1.6.2.18 BinaryXor ( x, y )
The abstract operation BinaryXor takes arguments x and y. It performs the following steps when
called:
1. Assert: x is 0 or 1.
2. Assert: y is 0 or 1.
3. If x is 1 and y is 0, return 1.
4. Else if x is 0 and y is 1, return 1.
5. Else, return 0.
The abstract operation BigIntBitwiseOp takes arguments op (a sequence of Unicode code points), x
(a BigInt), and y (a BigInt). It performs the following steps when called:
1. Assert: op is &, ^, or |.
2. Set x to ℝ(x).
3. Set y to ℝ(y).
4. Let result be 0.
5. Let shift be 0.
6. Repeat, until (x = 0 or x = -1) and (y = 0 or y = -1),
a. Let xDigit be x modulo 2.
b. Let yDigit be y modulo 2.
c. If op is &, set result to result + 2shift × BinaryAnd(xDigit, yDigit).
d. Else if op is |, set result to result + 2shift × BinaryOr(xDigit, yDigit).
e. Else,
i. Assert: op is ^.
ii. Set result to result + 2shift × BinaryXor(xDigit, yDigit).
https://tc39.es/ecma262/ 65/490
4/25/2021 ECMAScript® 2022 Language Specification
6.1.6.2.20 BigInt::bitwiseAND ( x, y )
The abstract operation BigInt::bitwiseAND takes arguments x (a BigInt) and y (a BigInt). It performs
the following steps when called:
6.1.6.2.21 BigInt::bitwiseXOR ( x, y )
The abstract operation BigInt::bitwiseXOR takes arguments x (a BigInt) and y (a BigInt). It performs
the following steps when called:
6.1.6.2.22 BigInt::bitwiseOR ( x, y )
The abstract operation BigInt::bitwiseOR takes arguments x (a BigInt) and y (a BigInt). It performs
the following steps when called:
6.1.6.2.23 BigInt::toString ( x )
The abstract operation BigInt::toString takes argument x (a BigInt). It converts x to String format. It
performs the following steps when called:
https://tc39.es/ecma262/ 66/490
4/25/2021 ECMAScript® 2022 Language Specification
1. If x < 0ℤ, return the string-concatenation of the String "-" and ! BigInt::toString(-x).
2. Return the String value consisting of the code units of the digits of the decimal representation
of x.
A data property associates a key value with an ECMAScript language value and a set of
Boolean attributes.
An accessor property associates a key value with one or two accessor functions, and a set of
Boolean attributes. The accessor functions are used to store or retrieve an ECMAScript
language value that is associated with the property.
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.21) and
whose numeric value is either +0𝔽 or a positive integral Number ≤ 𝔽(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. Please see 6.1.7.2 for definitions of
the multiple forms of objects.
https://tc39.es/ecma262/ 67/490
4/25/2021 ECMAScript® 2022 Language Specification
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 3.
[[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 4.
[[Get]] Object | If the value is an Object it must be a function object. The function's
Undefined [[Call]] internal method (Table 7) 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
Undefined [[Call]] internal method (Table 7) 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
https://tc39.es/ecma262/ 68/490
4/25/2021 ECMAScript® 2022 Language Specification
p p y p p p y
[[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.
[[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 5 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.
https://tc39.es/ecma262/ 69/490
4/25/2021 ECMAScript® 2022 Language Specification
Internal method names are polymorphic. This means that different object values may perform
different algorithms when a common internal method name is invoked upon them. That actual object
upon which an internal method is invoked is the “target” of the invocation. If, at runtime, the
implementation of an algorithm attempts to use an internal method of an object that the object does
not support, a TypeError exception is thrown.
Internal slots correspond to internal state that is associated with objects and used by various
ECMAScript specification algorithms. Internal slots are not object properties and they are not
inherited. Depending upon the specific internal slot specification, such state may consist of values of
any ECMAScript language type or of specific ECMAScript specification type values. Unless
explicitly specified otherwise, internal slots are allocated as part of the process of creating an object
and may not be dynamically added to an object. Unless specified otherwise, the initial value of an
internal slot is the value undefined. Various algorithms within this specification create objects that
have internal slots. However, the ECMAScript language provides no direct way to associate internal
slots with an object.
Internal methods and internal slots are identified within this specification using names enclosed in
double square brackets [[ ]].
Table 6 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.
For the internal methods listed in Table 6, the object uses those defined in 10.1.
If the object has a [[Call]] internal method, it uses the one defined in 10.2.1.
If the object has a [[Construct]] internal method, it uses the one defined in 10.2.2.
This specification recognizes different kinds of exotic objects by those objects' internal methods. An
object that is behaviourally equivalent to a particular kind of exotic object (such as an Array exotic
object or a bound function exotic object), but does not have the same collection of internal methods
specified for that kind, is not recognized as that kind of exotic object.
https://tc39.es/ecma262/ 70/490
4/25/2021 ECMAScript® 2022 Language Specification
The “Signature” column of Table 6 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.
In addition to its parameters, an internal method always has access to the object that is the target of
the method invocation.
An internal method implicitly returns a Completion Record, either a normal completion that wraps a
value of the return type shown in its invocation pattern, or a throw completion.
[[SetPrototypeOf]] (Object | Null) → Associate this object with another object that
Boolean provides inherited properties. Passing null
indicates that there are no inherited properties.
Returns true indicating that the operation was
completed successfully or false indicating that the
operation was not successful.
[[OwnPropertyKeys]] ( ) → List of Return a List whose elements are all of the own
propertyKey property keys for the object.
Table 7 summarizes additional essential internal methods that are supported by objects that may be
called as functions. A function object is an object that supports the [[Call]] internal method. A
constructor is an object that supports the [[Construct]] internal method. Every object that supports
https://tc39.es/ecma262/ 72/490
4/25/2021 ECMAScript® 2022 Language Specification
[[Construct]] must support [[Call]]; that is, every constructor must be a function object. Therefore, a
constructor may also be referred to as a constructor function or constructor function object.
[[Call]] (any, a Executes code associated with this object. Invoked via a function call
List of expression. The arguments to the internal method are a this value and
any) → a List whose elements are the arguments passed to the function by a
any call expression. Objects that implement this internal method are
callable.
[[Construct]] (a List of Creates an object. Invoked via the new operator or a super call. The
any, first argument to the internal method is a List whose elements are the
Object) arguments of the constructor invocation or the super call. The
→ Object second argument is the object to which the new operator was initially
applied. Objects that implement this internal method are called
constructors. A function object is not necessarily a constructor and
such non-constructor function objects do not have a [[Construct]]
internal method.
The semantics of the essential internal methods for ordinary objects and standard exotic objects are
specified in clause 10. If any specified use of an internal method of an exotic object is not supported
by an implementation, that usage must throw a TypeError exception when attempted.
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
https://tc39.es/ecma262/ 73/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
Return value:
The value returned by any internal method must be a Completion Record with either:
[[Type]] = normal, [[Target]] = empty, and [[Value]] = a value of the "normal return type"
shown below for that internal method, or
[[Type]] = throw, [[Target]] = empty, and [[Value]] = any ECMAScript language value.
NOTE 1 An internal method must not return a completion with [[Type]] = continue, break,
or return.
[[GetPrototypeOf]] ( )
NOTE 2 An object's prototype chain should have finite length (that is, starting from any
object, recursively applying the [[GetPrototypeOf]] internal method to its result
should eventually lead to the value null). However, this requirement is not
enforceable as an object level invariant if the prototype chain includes any exotic
objects that do not use the ordinary object definition of [[GetPrototypeOf]]. Such a
https://tc39.es/ecma262/ 74/490
4/25/2021 ECMAScript® 2022 Language Specification
circular prototype chain may result in infinite loops when accessing object
properties.
[[SetPrototypeOf]] ( V )
[[IsExtensible]] ( )
[[PreventExtensions]] ( )
[[GetOwnProperty]] ( P )
and it may return different values over time, then either or both of the [[Writable]]
and [[Configurable]] attributes must be true even if no mechanism to change the
value is exposed via the other essential internal methods.
[[DefineOwnProperty]] ( P, Desc )
[[HasProperty]] ( P )
[[Get]] ( P, Receiver )
[[Set]] ( P, V, Receiver )
https://tc39.es/ecma262/ 76/490
4/25/2021 ECMAScript® 2022 Language Specification
[[Delete]] ( P )
[[OwnPropertyKeys]] ( )
[[Call]] ( )
[[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.
Within this specification a reference such as %name% means the intrinsic object, associated with the
current realm, corresponding to the name. A reference such as %name.a.b% means, as if the "b"
property of the "a" property of the intrinsic object %name% was accessed prior to any ECMAScript
code being evaluated. Determination of the current realm and its intrinsics is described in 9.3. The
well-known intrinsics are listed in Table 8.
Association
(20.3.1)
https://tc39.es/ecma262/ 82/490
4/25/2021 ECMAScript® 2022 Language Specification
When an algorithm iterates over the elements of a List without specifying an order, the order used is
the order of the elements in the List.
For notational convenience within this specification, a literal syntax can be used to express a new
List value. For example, « 1, 2 » defines a List value that has two elements each of which is
initialized to a specific value. A new empty List can be expressed as « ».
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
https://tc39.es/ecma262/ 83/490
4/25/2021 ECMAScript® 2022 Language Specification
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 irreflexivity and transitivity, respectively.
https://tc39.es/ecma262/ 84/490
4/25/2021 ECMAScript® 2022 Language Specification
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 totality, irreflexivity, and transitivity,
respectively.
Values of the Completion type are Record values whose fields are defined by Table 9. Such values
are referred to as Completion Records.
[[Type]] One of normal, break, continue, return, or The type of completion that occurred.
throw
[[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
https://tc39.es/ecma262/ 85/490
4/25/2021 ECMAScript® 2022 Language Specification
where all aliases in the above steps, with the exception of completion, are ephemeral and visible only
in the steps pertaining to Await.
NOTE Await can be combined with the ? and ! prefixes, so that for example
An Await fulfilled function is an anonymous built-in function that is used as part of the Await
specification device to deliver the promise fulfillment value to the caller as a normal completion.
Each Await fulfilled function has an [[AsyncContext]] internal slot.
When an Await fulfilled function is called with argument value, the following steps are taken:
An Await rejected function is an anonymous built-in function that is used as part of the Await
specification device to deliver the promise rejection reason to the caller as an abrupt throw
completion. Each Await rejected function has an [[AsyncContext]] internal slot.
When an Await rejected function is called with argument reason, the following steps are taken:
5. Push asyncContext onto the execution context stack; asyncContext is now the running
execution context.
6. Resume the suspended evaluation of asyncContext using ThrowCompletion(reason) as the
result of the operation that suspended it.
7. Assert: When we reach this step, asyncContext has already been removed from the execution
context stack and prevContext is the currently running execution context.
8. Return undefined.
6.2.3.2 NormalCompletion
1. Return NormalCompletion(argument).
6.2.3.3 ThrowCompletion
1. Return ThrowCompletion(argument).
The abstract operation UpdateEmpty takes arguments completionRecord and value. It performs the
following steps when called:
https://tc39.es/ecma262/ 88/490
4/25/2021 ECMAScript® 2022 Language Specification
A Reference Record is a resolved name or property binding; its fields are defined by Table 10.
[[Base]] One of: The value or Environment Record which holds the
binding. A [[Base]] of unresolvable indicates that
any the binding could not be resolved.
ECMAScript
language
value except
undefined or
null,
an
Environment
Record, or
unresolvable.
[[ReferencedName]] String or Symbol The name of the binding. Always a String if [[Base]]
value is an Environment Record.
The following abstract operations are used in this specification to operate upon References:
6.2.4.1 IsPropertyReference ( V )
The abstract operation IsPropertyReference takes argument V. It performs the following steps when
called:
6.2.4.2 IsUnresolvableReference ( V )
The abstract operation IsUnresolvableReference takes argument V. It performs the following steps
when called:
6.2.4.3 IsSuperReference ( V )
The abstract operation IsSuperReference takes argument V. It performs the following steps when
called:
6.2.4.4 GetValue ( V )
The abstract operation GetValue takes argument V. It performs the following steps when called:
https://tc39.es/ecma262/ 90/490
4/25/2021 ECMAScript® 2022 Language Specification
1. ReturnIfAbrupt(V).
2. If V is not a Reference Record, return V.
3. If IsUnresolvableReference(V) is true, throw a ReferenceError exception.
4. If IsPropertyReference(V) is true, then
a. Let baseObj be ! ToObject(V.[[Base]]).
b. Return ? baseObj.[[Get]](V.[[ReferencedName]], GetThisValue(V)).
5. Else,
a. Let base be V.[[Base]].
b. Assert: base is an Environment Record.
c. Return ? base.GetBindingValue(V.[[ReferencedName]], V.[[Strict]]) (see 9.1).
NOTE The object that may be created in step 4.a is not accessible outside of the above
abstract operation and the ordinary object [[Get]] internal method. An
implementation might choose to avoid the actual creation of the object.
6.2.4.5 PutValue ( V, W )
The abstract operation PutValue takes arguments V and W. It performs the following steps when
called:
1. ReturnIfAbrupt(V).
2. ReturnIfAbrupt(W).
3. If V is not a Reference Record, throw a ReferenceError exception.
4. If IsUnresolvableReference(V) is true, then
a. If V.[[Strict]] is true, throw a ReferenceError exception.
b. Let globalObj be GetGlobalObject().
c. Return ? Set(globalObj, V.[[ReferencedName]], W, false).
5. If IsPropertyReference(V) is true, then
a. Let baseObj be ! ToObject(V.[[Base]]).
b. Let succeeded be ? baseObj.[[Set]](V.[[ReferencedName]], W, GetThisValue(V)).
c. If succeeded is false and V.[[Strict]] is true, throw a TypeError exception.
d. Return.
6. Else,
a. Let base be V.[[Base]].
b. Assert: base is an Environment Record.
c. Return ? base.SetMutableBinding(V.[[ReferencedName]], W, V.[[Strict]]) (see 9.1).
https://tc39.es/ecma262/ 91/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE The object that may be created in step 5.a is not accessible outside of the above
abstract operation and the ordinary object [[Set]] internal method. An
implementation might choose to avoid the actual creation of that object.
6.2.4.6 GetThisValue ( V )
The abstract operation GetThisValue takes argument V. It performs the following steps when called:
6.2.4.7 InitializeReferencedBinding ( V, W )
1. ReturnIfAbrupt(V).
2. ReturnIfAbrupt(W).
3. Assert: V is a Reference Record.
4. Assert: IsUnresolvableReference(V) is false.
5. Let base be V.[[Base]].
6. Assert: base is an Environment Record.
7. Return base.InitializeBinding(V.[[ReferencedName]], 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
https://tc39.es/ecma262/ 92/490
4/25/2021 ECMAScript® 2022 Language Specification
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 3 or Table 4.
The following abstract operations are used in this specification to operate upon Property Descriptor
values:
The abstract operation IsDataDescriptor takes argument Desc (a Property Descriptor or undefined).
It performs the following steps when called:
https://tc39.es/ecma262/ 93/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation ToPropertyDescriptor takes argument Obj. It performs the following steps
when called:
https://tc39.es/ecma262/ 94/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 95/490
4/25/2021 ECMAScript® 2022 Language Specification
In algorithm steps that create an Abstract Closure, values are captured with the verb "capture"
followed by a list of aliases. When an Abstract Closure is created, it captures the value that is
associated with each alias at that time. In steps that specify the algorithm to be performed when an
Abstract Closure is called, each captured value is referred to by the alias that was used to capture the
value.
If an Abstract Closure returns a Completion Record, that Completion Record's [[Type]] must be
either normal or throw.
Abstract Closures are created inline as part of other algorithms, shown in the following example.
The Data Block specification type is used to describe a distinct and mutable sequence of byte-sized
(8 bit) numeric values. A byte value is an integer value in the range 0 through 255, inclusive. A Data
Block value is created with a fixed number of bytes that each have the initial value 0.
For notational convenience within this specification, an array-like syntax can be used to access the
individual bytes of a Data Block value. This notation presents a Data Block value as a 0-origined
integer-indexed sequence of bytes. For example, if db is a 5 byte Data Block value then db[2] can be
used to access its 3rd byte.
A data block that resides in memory that can be referenced from multiple agents concurrently is
designated a Shared Data Block. A Shared Data Block has an identity (for the purposes of equality
testing Shared Data Block values) that is address-free: it is tied not to the virtual addresses the block
is mapped to in any process, but to the set of locations in memory that the block represents. Two data
blocks are equal only if the sets of the locations they contain are equal; otherwise, they are not equal
and the intersection of the sets of locations they contain is empty. Finally, Shared Data Blocks can be
distinguished from Data Blocks.
The semantics of Shared Data Blocks is defined using Shared Data Block events by the memory
model. Abstract operations below introduce Shared Data Block events and act as the interface
between evaluation semantics and the event semantics of the memory model. The events form a
candidate execution, on which the memory model acts as a filter. Please consult the memory model
for full semantics.
Shared Data Block events are modeled by Records, defined in the memory model.
The following abstract operations are used in this specification to operate upon Data Block values:
The abstract operation CreateByteDataBlock takes argument size (an integer). It performs the
following steps when called:
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.
https://tc39.es/ecma262/ 97/490
4/25/2021 ECMAScript® 2022 Language Specification
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.[[EventsRecords]] whose
[[AgentSignifier]] is AgentSignifier().
5. Let zero be « 0 ».
6. For each index i of db, do
a. Append WriteSharedMemory { [[Order]]: Init, [[NoTear]]: true, [[Block]]: db,
[[ByteIndex]]: i, [[ElementSize]]: 1, [[Payload]]: zero } to eventList.
7. Return db.
1. Assert: fromBlock and toBlock are distinct Data Block or Shared Data Block values.
2. Let fromSize be the number of bytes in fromBlock.
3. Assert: fromIndex + count ≤ fromSize.
4. Let toSize be the number of bytes in toBlock.
5. Assert: toIndex + count ≤ toSize.
6. Repeat, while count > 0,
a. If fromBlock is a Shared Data Block, then
i. Let execution be the [[CandidateExecution]] field of the surrounding agent's Agent
Record.
ii. Let eventList be the [[EventList]] field of the element in execution.
[[EventsRecords]] whose [[AgentSignifier]] is AgentSignifier().
iii. Let bytes be a List whose sole element is a nondeterministically chosen byte value.
iv. NOTE: In implementations, bytes is the result of a non-atomic read instruction on
the underlying hardware. The nondeterminism is a semantic prescription of the
https://tc39.es/ecma262/ 98/490
4/25/2021 ECMAScript® 2022 Language Specification
7 Abstract Operations
These operations are not a part of the ECMAScript language; they are defined here solely to aid the
specification of the semantics of the ECMAScript language. Other, more specialized abstract
operations are defined throughout this specification.
https://tc39.es/ecma262/ 99/490
4/25/2021 ECMAScript® 2022 Language Specification
The BigInt type has no implicit conversions in the ECMAScript language; programmers must call
BigInt explicitly to convert values from other types.
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 21.4.4.45) and Symbol objects (see 20.4.3.5) over-ride the default
ToPrimitive behaviour. Date objects treat no hint as if the hint were string.
The abstract operation OrdinaryToPrimitive takes arguments O and hint. It performs the following
steps when called:
https://tc39.es/ecma262/ 100/490
4/25/2021 ECMAScript® 2022 Language Specification
Number If argument is +0𝔽, -0𝔽, or NaN, return false; otherwise return true.
String If argument is the empty String (its length is 0), return false; otherwise return true.
https://tc39.es/ecma262/ 102/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
Syntax
StringNumericLiteral :::
StrWhiteSpaceopt
StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
StrWhiteSpace :::
StrWhiteSpaceChar StrWhiteSpaceopt
StrWhiteSpaceChar :::
WhiteSpace
LineTerminator
StrNumericLiteral :::
StrDecimalLiteral
NonDecimalIntegerLiteral[~Sep]
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+ StrUnsignedDecimalLiteral
- StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral :::
Infinity
DecimalDigits[~Sep] . DecimalDigits[~Sep] opt ExponentPart[~Sep] opt
https://tc39.es/ecma262/ 103/490
4/25/2021 ECMAScript® 2022 Language Specification
All grammar symbols not explicitly defined above have the definitions used in the Lexical Grammar
for numeric literals (12.8.3)
NOTE 2 Some differences should be noted between the syntax of a StringNumericLiteral and
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 12.8.3), but some of the details are different, so the process for
converting a String numeric literal to a value of Number type is given here. This value is determined
in two steps: first, a mathematical value (MV) is derived from the String numeric literal; second, this
mathematical value is rounded as described below. The MV on any grammar symbol, not provided
below, is the MV for that symbol defined in 12.8.3.1.
https://tc39.es/ecma262/ 104/490
4/25/2021 ECMAScript® 2022 Language Specification
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.1), 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
https://tc39.es/ecma262/ 105/490
4/25/2021 ECMAScript® 2022 Language Specification
there is a non-zero digit to its left and there is a non-zero digit, not in the ExponentPart, to its
right.
https://tc39.es/ecma262/ 107/490
4/25/2021 ECMAScript® 2022 Language Specification
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 ToUint8 takes argument argument. It converts argument to one of 28 integral
Number values in the range +0𝔽 through 255𝔽, inclusive. It performs the following steps when
called:
NOTE Unlike the other ECMAScript integer conversion abstract operation, ToUint8Clamp
rounds rather than truncates non-integral values and does not convert +∞𝔽 to +0𝔽.
ToUint8Clamp does “round half to even” tie-breaking. This differs from
Math.round which does “round half up” tie-breaking.
The abstract operation ToBigInt takes argument argument. It converts argument to a BigInt value, or
throws if an implicit conversion from Number would be required. It performs the following steps
when called:
https://tc39.es/ecma262/ 110/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation ToBigInt64 takes argument argument. It converts argument to one of 264
BigInt values in the range ℤ(-263) through ℤ(263-1), inclusive. It performs the following steps when
called:
1. Let n be ? ToBigInt(argument).
2. Let int64bit be ℝ(n) modulo 264.
3. If int64bit ≥ 263, return ℤ(int64bit - 264); otherwise return ℤ(int64bit).
1. Let n be ? ToBigInt(argument).
2. Let int64bit be ℝ(n) modulo 264.
3. Return ℤ(int64bit).
Boolean Return a new Boolean object whose [[BooleanData]] internal slot is set to argument.
See 20.3 for a description of Boolean objects.
Number Return a new Number object whose [[NumberData]] internal slot is set to argument.
See 21.1 for a description of Number objects.
String Return a new String object whose [[StringData]] internal slot is set to argument. See
22.1 for a description of String objects.
Symbol Return a new Symbol object whose [[SymbolData]] internal slot is set to argument.
See 20.4 for a description of Symbol objects.
BigInt Return a new BigInt object whose [[BigIntData]] internal slot is set to argument. See
21.2 for a description of BigInt objects.
A canonical numeric string is any String value for which the CanonicalNumericIndexString abstract
operation does not return undefined.
https://tc39.es/ecma262/ 113/490
4/25/2021 ECMAScript® 2022 Language Specification
7.2.5 IsExtensible ( O )
The abstract operation IsExtensible takes argument O (an Object) and returns a completion record
which, if its [[Type]] is normal, has a [[Value]] which is a Boolean. It is used to determine whether
https://tc39.es/ecma262/ 115/490
4/25/2021 ECMAScript® 2022 Language Specification
additional properties can be added to O. It performs the following steps when called:
https://tc39.es/ecma262/ 116/490
4/25/2021 ECMAScript® 2022 Language Specification
7.2.9 IsStringPrefix ( p, q )
The abstract operation IsStringPrefix takes arguments p (a String) and q (a String). It determines if p
is a prefix of q. It performs the following steps when called:
NOTE Any String is a prefix of itself, because r may be the empty String.
7.2.10 SameValue ( x, y )
The abstract operation SameValue takes arguments x (an ECMAScript language value) and y (an
ECMAScript language value) and returns a completion record whose [[Type]] is normal and whose
[[Value]] is a Boolean. It performs the following steps when called:
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 abstract operation SameValueZero takes arguments x (an ECMAScript language value) and y (an
ECMAScript language value) and returns a completion record whose [[Type]] is normal and whose
[[Value]] is a Boolean. It performs the following steps when called:
https://tc39.es/ecma262/ 117/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE SameValueZero differs from SameValue only in its treatment of +0𝔽 and -0𝔽.
7.2.12 SameValueNonNumeric ( x, y )
The abstract operation SameValueNonNumeric takes arguments x (an ECMAScript language value)
and y (an ECMAScript language value) and returns a completion record whose [[Type]] is normal
and whose [[Value]] is a Boolean. It performs the following steps when called:
https://tc39.es/ecma262/ 118/490
4/25/2021 ECMAScript® 2022 Language Specification
2. Else,
a. NOTE: The order of evaluation needs to be reversed to preserve left to right evaluation.
b. Let py be ? ToPrimitive(y, number).
c. Let px be ? ToPrimitive(x, number).
3. If Type(px) is String and Type(py) is String, then
a. If IsStringPrefix(py, px) is true, return false.
b. If IsStringPrefix(px, py) is true, return true.
c. Let k be the smallest non-negative integer such that the code unit at index k within px is
different from the code unit at index k within py. (There must be such a k, for neither
String is a prefix of the other.)
d. Let m be the integer that is the numeric value of the code unit at index k within px.
e. Let n be the integer that is the numeric value of the code unit at index k within py.
f. If m < n, return true. Otherwise, return false.
4. Else,
a. If Type(px) is BigInt and Type(py) is String, then
i. Let ny be ! StringToBigInt(py).
ii. If ny is NaN, return undefined.
iii. Return BigInt::lessThan(px, ny).
b. If Type(px) is String and Type(py) is BigInt, then
i. Let nx be ! StringToBigInt(px).
ii. If nx is NaN, return undefined.
iii. Return BigInt::lessThan(nx, py).
c. NOTE: Because px and py are primitive values, evaluation order is not important.
d. Let nx be ! ToNumeric(px).
e. Let ny be ! ToNumeric(py).
f. If Type(nx) is the same as Type(ny), return Type(nx)::lessThan(nx, ny).
g. Assert: Type(nx) is BigInt and Type(ny) is Number, or Type(nx) is Number and Type(ny)
is BigInt.
h. If nx or ny is NaN, return undefined.
i. If nx is -∞𝔽 or ny is +∞𝔽, return true.
j. If nx is +∞𝔽 or ny is -∞𝔽, return false.
k. If ℝ(nx) < ℝ(ny), return true; otherwise return false.
NOTE 1 Step 3 differs from step 2.c in the algorithm that handles the addition operator +
(13.15.3) by using the logical-and operation instead of the logical-or operation.
https://tc39.es/ecma262/ 119/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 120/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE This algorithm differs from the SameValue Algorithm in its treatment of signed
zeroes and NaNs.
NOTE Within this specification, exotic objects are created in abstract operations such as
ArrayCreate and BoundFunctionCreate by first calling MakeBasicObject to obtain a
basic, foundational object, and then overriding some or all of that object's internal
methods. In order to encapsulate exotic object creation, the object's essential internal
methods are never modified outside those operations.
7.3.2 Get ( O, P )
The abstract operation Get takes arguments O (an Object) and P (a property key). It is used to
retrieve the value of a specific property of an object. It performs the following steps when called:
7.3.3 GetV ( V, P )
The abstract operation GetV takes arguments V (an ECMAScript language value) and P (a property
key). It is used to retrieve the value of a specific property of an ECMAScript language value. If the
value is not an object, the property lookup is performed using a wrapper object appropriate for the
type of the value. It performs the following steps when called:
7.3.5 CreateDataProperty ( O, P, V )
The abstract operation CreateDataProperty takes arguments O (an Object), P (a property key), and V
(an ECMAScript language value). It is used to create a new own property of an object. It performs
the following steps when called:
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.6 CreateMethodProperty ( O, P, V )
The abstract operation CreateMethodProperty takes arguments O (an Object), P (a property key), and
V (an ECMAScript language value). It is used to create a new own property of an object. It performs
the following steps when called:
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.
https://tc39.es/ecma262/ 123/490
4/25/2021 ECMAScript® 2022 Language Specification
7.3.7 CreateDataPropertyOrThrow ( O, P, V )
The abstract operation CreateDataPropertyOrThrow takes arguments O (an Object), P (a property
key), and V (an ECMAScript language value). It is used to create a new own property of an object. It
throws a TypeError exception if the requested property update cannot be performed. It performs the
following steps when called:
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.9 DeletePropertyOrThrow ( O, P )
https://tc39.es/ecma262/ 124/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation DeletePropertyOrThrow takes arguments O (an Object) and P (a property
key). It is used to remove a specific own property of an object. It throws an exception if the property
is not configurable. It performs the following steps when called:
7.3.10 GetMethod ( V, P )
The abstract operation GetMethod takes arguments V (an ECMAScript language value) and P (a
property key). It is used to get the value of a specific property of an ECMAScript language value
when the value of the property is expected to be a function. It performs the following steps when
called:
7.3.11 HasProperty ( O, P )
The abstract operation HasProperty takes arguments O (an Object) and P (a property key) and
returns a completion record which, if its [[Type]] is normal, has a [[Value]] which is a Boolean. It is
used to determine whether an object has a property with the specified property key. The property
may be either an own or inherited. It performs the following steps when called:
7.3.12 HasOwnProperty ( O, P )
https://tc39.es/ecma262/ 125/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation HasOwnProperty takes arguments O (an Object) and P (a property key) and
returns a completion record which, if its [[Type]] is normal, has a [[Value]] which is a Boolean. It is
used to determine whether an object has an own property with the specified property key. It performs
the following steps when called:
https://tc39.es/ecma262/ 127/490
4/25/2021 ECMAScript® 2022 Language Specification
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. Perform ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), e).
b. Set n to n + 1.
5. Return array.
https://tc39.es/ecma262/ 128/490
4/25/2021 ECMAScript® 2022 Language Specification
An array-like object is any object for which this operation returns an integer rather than an abrupt
completion.
NOTE 1 Typically, an array-like object would also have some properties with integer index
names. However, that is not a requirement of this definition.
NOTE 2 Array objects and String objects are examples of array-like objects.
1. If elementTypes is not present, set elementTypes to « Undefined, Null, Boolean, String, Symbol,
Number, BigInt, Object ».
2. If Type(obj) is not Object, throw a TypeError exception.
3. Let len be ? LengthOfArrayLike(obj).
4. Let list be a new empty List.
5. Let index be 0.
6. Repeat, while index < len,
a. Let indexName be ! ToString(𝔽(index)).
b. Let next be ? Get(obj, indexName).
c. If 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.
https://tc39.es/ecma262/ 129/490
4/25/2021 ECMAScript® 2022 Language Specification
property and the this value of the call. argumentsList is the list of arguments values passed to the
method. If argumentsList is not present, a new empty List is used as its value. It performs the
following steps when called:
7.3.21 OrdinaryHasInstance ( C, O )
The abstract operation OrdinaryHasInstance takes arguments C (an ECMAScript language value)
and O. It implements the default algorithm for determining if O inherits from the instance object
inheritance path provided by C. It performs the following steps when called:
https://tc39.es/ecma262/ 131/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
https://tc39.es/ecma262/ 132/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 133/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 134/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation IteratorClose takes arguments iteratorRecord and completion. It is used to
notify an iterator that it should perform any actions it would normally perform when it has reached
its completed state. It performs the following steps when called:
https://tc39.es/ecma262/ 135/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Let closure be a new Abstract Closure with no parameters that captures list and performs the
following steps when called:
a. For each element E of list, do
i. Perform ? Yield(E).
b. Return undefined.
2. Let iterator be ! CreateIteratorFromClosure(closure, empty, %IteratorPrototype%).
3. Return Record { [[Iterator]]: iterator, [[NextMethod]]:
%GeneratorFunction.prototype.prototype.next%, [[Done]]: false }.
NOTE The list iterator object is never directly accessible to ECMAScript code.
8 Syntax-Directed Operations
In addition to those defined in this section, specialized syntax-directed operations are defined
throughout this specification.
NOTE "*default*" is used within this specification as a synthetic name for hoistable
anonymous functions that are defined using export declarations.
BindingIdentifier : Identifier
BindingIdentifier : yield
BindingIdentifier : await
https://tc39.es/ecma262/ 137/490
4/25/2021 ECMAScript® 2022 Language Specification
ObjectBindingPattern : { }
ArrayBindingPattern : [ Elisionopt ]
https://tc39.es/ecma262/ 138/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return « "*default*" ».
FormalParameters : [empty]
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
1. Return « "*default*" ».
1. Return « "*default*" ».
1. Return « "*default*" ».
1. Return « "*default*" ».
https://tc39.es/ecma262/ 141/490
4/25/2021 ECMAScript® 2022 Language Specification
NamedImports : { }
ExportDeclaration :
export ExportFromClause FromClause ;
export NamedExports ;
1. Return « "*default*" ».
1. Return FunctionDeclaration.
HoistableDeclaration : GeneratorDeclaration
1. Return GeneratorDeclaration.
HoistableDeclaration : AsyncFunctionDeclaration
1. Return AsyncFunctionDeclaration.
HoistableDeclaration : AsyncGeneratorDeclaration
1. Return AsyncGeneratorDeclaration.
Declaration : ClassDeclaration
1. Return ClassDeclaration.
https://tc39.es/ecma262/ 143/490
4/25/2021 ECMAScript® 2022 Language Specification
Declaration : LexicalDeclaration
1. Return LexicalDeclaration.
LetOrConst : let
1. Return false.
LetOrConst : const
1. Return true.
FunctionDeclaration :
function BindingIdentifier ( FormalParameters ) { FunctionBody }
function ( FormalParameters ) { FunctionBody }
GeneratorDeclaration :
function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
function * ( FormalParameters ) { GeneratorBody }
AsyncGeneratorDeclaration :
async function * BindingIdentifier ( FormalParameters ) {
AsyncGeneratorBody }
async function * ( FormalParameters ) { AsyncGeneratorBody }
AsyncFunctionDeclaration :
async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
async function ( FormalParameters ) { AsyncFunctionBody }
1. Return false.
ClassDeclaration :
class BindingIdentifier ClassTail
class ClassTail
https://tc39.es/ecma262/ 144/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return false.
ExportDeclaration :
export ExportFromClause FromClause ;
export NamedExports ;
export default AssignmentExpression ;
1. Return false.
StatementListItem : Statement
StatementListItem : Declaration
CaseBlock : { }
https://tc39.es/ecma262/ 145/490
4/25/2021 ECMAScript® 2022 Language Specification
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 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.
LabelledItem : Statement
LabelledItem : FunctionDeclaration
FunctionStatementList : [empty]
https://tc39.es/ecma262/ 146/490
4/25/2021 ECMAScript® 2022 Language Specification
FunctionStatementList : StatementList
ConciseBody : ExpressionBody
AsyncConciseBody : ExpressionBody
ScriptBody : StatementList
NOTE 1 At the top level of a Script, function declarations are treated like var declarations
rather than like lexical declarations.
NOTE 2 The LexicallyDeclaredNames of a Module includes the names of all of its imported
bindings.
ModuleItem : ImportDeclaration
ModuleItem : ExportDeclaration
ModuleItem : StatementListItem
https://tc39.es/ecma262/ 147/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 3 At the top level of a Module, function declarations are treated like lexical
declarations rather than like var declarations.
StatementListItem : Statement
StatementListItem : Declaration
CaseBlock : { }
https://tc39.es/ecma262/ 148/490
4/25/2021 ECMAScript® 2022 Language Specification
LabelledItem : Statement
LabelledItem : FunctionDeclaration
FunctionStatementList : [empty]
FunctionStatementList : StatementList
ConciseBody : ExpressionBody
AsyncConciseBody : ExpressionBody
https://tc39.es/ecma262/ 149/490
4/25/2021 ECMAScript® 2022 Language Specification
ScriptBody : StatementList
Module : [empty]
ModuleItem : ImportDeclaration
ExportDeclaration :
export ExportFromClause FromClause ;
export NamedExports ;
export VariableStatement
https://tc39.es/ecma262/ 150/490
4/25/2021 ECMAScript® 2022 Language Specification
Block : { }
StatementListItem : Declaration
https://tc39.es/ecma262/ 151/490
4/25/2021 ECMAScript® 2022 Language Specification
ForInOfStatement :
for ( LeftHandSideExpression in Expression ) Statement
for ( ForDeclaration in Expression ) Statement
for ( LeftHandSideExpression of AssignmentExpression ) Statement
for ( ForDeclaration of AssignmentExpression ) Statement
for await ( LeftHandSideExpression of AssignmentExpression ) Statement
for await ( ForDeclaration of AssignmentExpression ) Statement
ForInOfStatement :
for ( var ForBinding in Expression ) Statement
for ( var ForBinding of AssignmentExpression ) Statement
for await ( var ForBinding of AssignmentExpression ) Statement
https://tc39.es/ecma262/ 152/490
4/25/2021 ECMAScript® 2022 Language Specification
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 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.
https://tc39.es/ecma262/ 153/490
4/25/2021 ECMAScript® 2022 Language Specification
LabelledItem : FunctionDeclaration
FunctionStatementList : [empty]
FunctionStatementList : StatementList
https://tc39.es/ecma262/ 154/490
4/25/2021 ECMAScript® 2022 Language Specification
ConciseBody : ExpressionBody
AsyncConciseBody : ExpressionBody
ScriptBody : StatementList
Module : [empty]
ModuleItem : ImportDeclaration
ModuleItem : ExportDeclaration
ReturnStatement
ThrowStatement
DebuggerStatement
Block : { }
StatementListItem : Declaration
VariableDeclarationList : VariableDeclaration
ForInOfStatement :
for ( LeftHandSideExpression in Expression ) Statement
for ( ForDeclaration in Expression ) Statement
for ( LeftHandSideExpression of AssignmentExpression ) Statement
for ( ForDeclaration of AssignmentExpression ) Statement
for await ( LeftHandSideExpression of AssignmentExpression ) Statement
for await ( ForDeclaration of AssignmentExpression ) Statement
ForInOfStatement :
for ( var ForBinding in Expression ) Statement
for ( var ForBinding of AssignmentExpression ) Statement
for await ( var ForBinding of AssignmentExpression ) Statement
3. Return declarations.
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 DefaultClause.
4. If the second CaseClauses is not present, return declarations.
5. Return the result of appending to declarations the elements of the VarScopedDeclarations of
the second CaseClauses.
LabelledItem : FunctionDeclaration
FunctionStatementList : [empty]
FunctionStatementList : StatementList
https://tc39.es/ecma262/ 159/490
4/25/2021 ECMAScript® 2022 Language Specification
ConciseBody : ExpressionBody
AsyncConciseBody : ExpressionBody
ScriptBody : StatementList
Module : [empty]
ModuleItem : ImportDeclaration
ModuleItem : ExportDeclaration
StatementListItem : Statement
https://tc39.es/ecma262/ 160/490
4/25/2021 ECMAScript® 2022 Language Specification
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
https://tc39.es/ecma262/ 161/490
4/25/2021 ECMAScript® 2022 Language Specification
StatementListItem : Declaration
StatementListItem : Statement
NOTE At the top level of a function or script, inner function declarations are treated like
var declarations.
LabelledItem : Statement
LabelledItem : FunctionDeclaration
https://tc39.es/ecma262/ 162/490
4/25/2021 ECMAScript® 2022 Language Specification
StatementListItem : Statement
StatementListItem : Declaration
LabelledItem : Statement
LabelledItem : FunctionDeclaration
8.2 Labels
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block : { }
StatementListItem : Declaration
1. Return false.
https://tc39.es/ecma262/ 164/490
4/25/2021 ECMAScript® 2022 Language Specification
ForStatement :
for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
ForInOfStatement :
for ( LeftHandSideExpression in Expression ) Statement
for ( var ForBinding in Expression ) Statement
for ( ForDeclaration in Expression ) Statement
for ( LeftHandSideExpression of AssignmentExpression ) Statement
for ( var ForBinding of AssignmentExpression ) Statement
for ( ForDeclaration of AssignmentExpression ) Statement
for await ( LeftHandSideExpression of AssignmentExpression ) Statement
for await ( var ForBinding of AssignmentExpression ) Statement
for await ( ForDeclaration of AssignmentExpression ) Statement
CaseBlock : { }
https://tc39.es/ecma262/ 165/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return false.
LabelledItem : FunctionDeclaration
1. Return false.
https://tc39.es/ecma262/ 166/490
4/25/2021 ECMAScript® 2022 Language Specification
FunctionStatementList : [empty]
1. Return false.
ModuleItem :
ImportDeclaration
ExportDeclaration
1. Return false.
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block : { }
StatementListItem : Declaration
1. Return false.
https://tc39.es/ecma262/ 168/490
4/25/2021 ECMAScript® 2022 Language Specification
ForStatement :
for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
ForInOfStatement :
for ( LeftHandSideExpression in Expression ) Statement
for ( var ForBinding in Expression ) Statement
for ( ForDeclaration in Expression ) Statement
for ( LeftHandSideExpression of AssignmentExpression ) Statement
for ( var ForBinding of AssignmentExpression ) Statement
for ( ForDeclaration of AssignmentExpression ) Statement
for await ( LeftHandSideExpression of AssignmentExpression ) Statement
for await ( var ForBinding of AssignmentExpression ) Statement
for await ( ForDeclaration of AssignmentExpression ) Statement
BreakStatement : break ;
1. Return false.
https://tc39.es/ecma262/ 169/490
4/25/2021 ECMAScript® 2022 Language Specification
CaseBlock : { }
1. Return false.
LabelledItem : FunctionDeclaration
1. Return false.
FunctionStatementList : [empty]
1. Return false.
ModuleItem :
ImportDeclaration
https://tc39.es/ecma262/ 171/490
4/25/2021 ECMAScript® 2022 Language Specification
ExportDeclaration
1. Return false.
Statement :
VariableStatement
EmptyStatement
ExpressionStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Block : { }
StatementListItem : Declaration
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 « ».
https://tc39.es/ecma262/ 172/490
4/25/2021 ECMAScript® 2022 Language Specification
ForStatement :
for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
ForInOfStatement :
for ( LeftHandSideExpression in Expression ) Statement
for ( var ForBinding in Expression ) Statement
for ( ForDeclaration in Expression ) Statement
for ( LeftHandSideExpression of AssignmentExpression ) Statement
for ( var ForBinding of AssignmentExpression ) Statement
for ( ForDeclaration of AssignmentExpression ) Statement
for await ( LeftHandSideExpression of AssignmentExpression ) Statement
for await ( var ForBinding of AssignmentExpression ) Statement
for await ( ForDeclaration of AssignmentExpression ) Statement
ContinueStatement : continue ;
1. Return false.
CaseBlock : { }
1. Return false.
https://tc39.es/ecma262/ 174/490
4/25/2021 ECMAScript® 2022 Language Specification
LabelledItem : FunctionDeclaration
1. Return false.
FunctionStatementList : [empty]
1. Return false.
ModuleItem :
ImportDeclaration
ExportDeclaration
1. Return false.
https://tc39.es/ecma262/ 176/490
4/25/2021 ECMAScript® 2022 Language Specification
FunctionExpression :
function ( FormalParameters ) { FunctionBody }
GeneratorExpression :
function * ( FormalParameters ) { GeneratorBody }
AsyncGeneratorExpression :
async function * ( FormalParameters ) { AsyncGeneratorBody }
AsyncFunctionExpression :
async function ( FormalParameters ) { AsyncFunctionBody }
ArrowFunction :
ArrowParameters => ConciseBody
AsyncArrowFunction :
async AsyncArrowBindingIdentifier => AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
ClassExpression : class ClassTail
1. Return false.
FunctionExpression :
function BindingIdentifier ( FormalParameters ) { FunctionBody }
GeneratorExpression :
function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
AsyncGeneratorExpression :
async function * BindingIdentifier ( FormalParameters ) {
AsyncGeneratorBody }
AsyncFunctionExpression :
async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
ClassExpression : class BindingIdentifier ClassTail
1. Return true.
PrimaryExpression :
this
IdentifierReference
Literal
ArrayLiteral
ObjectLiteral
RegularExpressionLiteral
TemplateLiteral
MemberExpression :
MemberExpression [ Expression ]
MemberExpression . IdentifierName
MemberExpression TemplateLiteral
SuperProperty
MetaProperty
new MemberExpression Arguments
NewExpression :
new NewExpression
LeftHandSideExpression :
CallExpression
OptionalExpression
UpdateExpression :
LeftHandSideExpression ++
LeftHandSideExpression --
++ UnaryExpression
-- UnaryExpression
UnaryExpression :
delete UnaryExpression
void UnaryExpression
typeof UnaryExpression
+ UnaryExpression
- UnaryExpression
https://tc39.es/ecma262/ 178/490
4/25/2021 ECMAScript® 2022 Language Specification
~ UnaryExpression
! UnaryExpression
AwaitExpression
ExponentiationExpression :
UpdateExpression ** ExponentiationExpression
MultiplicativeExpression :
MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
AdditiveExpression :
AdditiveExpression + MultiplicativeExpression
AdditiveExpression - MultiplicativeExpression
ShiftExpression :
ShiftExpression << AdditiveExpression
ShiftExpression >> AdditiveExpression
ShiftExpression >>> AdditiveExpression
RelationalExpression :
RelationalExpression < ShiftExpression
RelationalExpression > ShiftExpression
RelationalExpression <= ShiftExpression
RelationalExpression >= ShiftExpression
RelationalExpression instanceof ShiftExpression
RelationalExpression in ShiftExpression
EqualityExpression :
EqualityExpression == RelationalExpression
EqualityExpression != RelationalExpression
EqualityExpression === RelationalExpression
EqualityExpression !== RelationalExpression
BitwiseANDExpression :
BitwiseANDExpression & EqualityExpression
BitwiseXORExpression :
BitwiseXORExpression ^ BitwiseANDExpression
BitwiseORExpression :
BitwiseORExpression | BitwiseXORExpression
https://tc39.es/ecma262/ 179/490
4/25/2021 ECMAScript® 2022 Language Specification
LogicalANDExpression :
LogicalANDExpression && BitwiseORExpression
LogicalORExpression :
LogicalORExpression || LogicalANDExpression
CoalesceExpression :
CoalesceExpressionHead ?? BitwiseORExpression
ConditionalExpression :
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
AssignmentExpression :
YieldExpression
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
LeftHandSideExpression &&= AssignmentExpression
LeftHandSideExpression ||= AssignmentExpression
LeftHandSideExpression ??= AssignmentExpression
Expression :
Expression , AssignmentExpression
1. Return false.
AssignmentExpression :
ArrowFunction
AsyncArrowFunction
FunctionExpression :
function BindingIdentifieropt ( FormalParameters ) { FunctionBody }
GeneratorExpression :
function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody }
AsyncGeneratorExpression :
async function * BindingIdentifieropt ( FormalParameters ) {
AsyncGeneratorBody }
AsyncFunctionExpression :
async function BindingIdentifieropt ( FormalParameters ) {
AsyncFunctionBody }
https://tc39.es/ecma262/ 180/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return true.
1. Return true.
PrimaryExpression :
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CoverParenthesizedExpressionAndArrowParameterList
MemberExpression :
MemberExpression [ Expression ]
https://tc39.es/ecma262/ 181/490
4/25/2021 ECMAScript® 2022 Language Specification
MemberExpression . IdentifierName
MemberExpression TemplateLiteral
SuperProperty
MetaProperty
new MemberExpression Arguments
NewExpression :
new NewExpression
LeftHandSideExpression :
CallExpression
OptionalExpression
1. Return false.
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
ParenthesizedExpression : ( Expression )
AsyncArrowFunction :
async AsyncArrowBindingIdentifier => AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
8.4 Contains
Every grammar production alternative in this specification which is not listed below implicitly has
the following default definition of Contains:
https://tc39.es/ecma262/ 183/490
4/25/2021 ECMAScript® 2022 Language Specification
FunctionDeclaration :
function BindingIdentifier ( FormalParameters ) { FunctionBody }
function ( FormalParameters ) { FunctionBody }
FunctionExpression :
function BindingIdentifieropt ( FormalParameters ) { FunctionBody }
GeneratorDeclaration :
function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
function * ( FormalParameters ) { GeneratorBody }
GeneratorExpression :
function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody }
AsyncGeneratorDeclaration :
async function * BindingIdentifier ( FormalParameters ) {
AsyncGeneratorBody }
async function * ( FormalParameters ) { AsyncGeneratorBody }
AsyncGeneratorExpression :
async function * BindingIdentifieropt ( FormalParameters ) {
AsyncGeneratorBody }
AsyncFunctionDeclaration :
async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
async function ( FormalParameters ) { AsyncFunctionBody }
AsyncFunctionExpression :
async function BindingIdentifieropt ( FormalParameters ) {
AsyncFunctionBody }
1. Return false.
NOTE 1 Static semantic rules that depend upon substructure generally do not look into
function definitions.
https://tc39.es/ecma262/ 184/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 2 Static semantic rules that depend upon substructure generally do not look into class
bodies except for PropertyNames.
1. If symbol is not one of NewTarget, SuperProperty, SuperCall, super or this, return false.
2. If ArrowParameters Contains symbol is true, return true.
3. Return ConciseBody Contains symbol.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
1. If symbol is not one of NewTarget, SuperProperty, SuperCall, super, or this, return false.
2. Return AsyncConciseBody Contains symbol.
1. If symbol is not one of NewTarget, SuperProperty, SuperCall, super, or this, return false.
2. Let head be the AsyncArrowHead that is covered by
CoverCallExpressionAndAsyncArrowHead.
3. If head Contains symbol is true, return true.
4. Return AsyncConciseBody Contains symbol.
NOTE 3 Contains is used to detect new.target, this, and super usage within an
https://tc39.es/ecma262/ 185/490
4/25/2021 ECMAScript® 2022 Language Specification
ArrowFunction or AsyncArrowFunction.
PropertyDefinition : MethodDefinition
LiteralPropertyName : IdentifierName
1. Return false.
OptionalChain : ?. IdentifierName
1. Return false.
PropertyName : LiteralPropertyName
https://tc39.es/ecma262/ 186/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return false.
PropertyName : ComputedPropertyName
MethodDefinition :
PropertyName ( UniqueFormalParameters ) { FunctionBody }
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList ) { FunctionBody }
ClassElement : ;
1. Return false.
8.5 Miscellaneous
These operations are used in multiple places throughout the specification.
https://tc39.es/ecma262/ 187/490
4/25/2021 ECMAScript® 2022 Language Specification
FunctionDeclaration :
function BindingIdentifier ( FormalParameters ) { FunctionBody }
function ( FormalParameters ) { FunctionBody }
GeneratorDeclaration :
function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
function * ( FormalParameters ) { GeneratorBody }
AsyncGeneratorDeclaration :
async function * BindingIdentifier ( FormalParameters ) {
AsyncGeneratorBody }
async function * ( FormalParameters ) { AsyncGeneratorBody }
AsyncFunctionDeclaration :
async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
async function ( FormalParameters ) { AsyncFunctionBody }
NOTE undefined is passed for environment to indicate that a PutValue operation should be
used to assign the initialization value. This is the case for var statements and
formal parameter lists of some non-strict functions (See 10.2.10). In those cases a
lexical binding is hoisted and preinitialized prior to evaluation of its initializer.
https://tc39.es/ecma262/ 188/490
4/25/2021 ECMAScript® 2022 Language Specification
BindingIdentifier : Identifier
BindingIdentifier : yield
BindingIdentifier : await
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 , }
https://tc39.es/ecma262/ 189/490
4/25/2021 ECMAScript® 2022 Language Specification
ObjectBindingPattern : { BindingRestProperty }
The abstract operation InitializeBoundName takes arguments name, value, and environment. It
performs the following steps when called:
NOTE When undefined is passed for environment it indicates that a PutValue operation
should be used to assign the initialization value. This is the case for formal
parameter lists of non-strict functions. In that case the formal parameter bindings are
preinitialized in order to deal with the possibility of multiple parameters with the
same name.
ArrayBindingPattern : [ ]
https://tc39.es/ecma262/ 190/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return NormalCompletion(empty).
ArrayBindingPattern : [ Elision ]
https://tc39.es/ecma262/ 191/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 192/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Let A be ! ArrayCreate(0).
2. Let n be 0.
3. Repeat,
https://tc39.es/ecma262/ 193/490
4/25/2021 ECMAScript® 2022 Language Specification
FormalParameters : [empty]
1. Return NormalCompletion(empty).
ArrowParameters : BindingIdentifier
https://tc39.es/ecma262/ 194/490
4/25/2021 ECMAScript® 2022 Language Specification
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
AsyncArrowBindingIdentifier : BindingIdentifier
IdentifierReference :
yield
await
CallExpression :
CallExpression [ Expression ]
CallExpression . IdentifierName
MemberExpression :
MemberExpression [ Expression ]
MemberExpression . IdentifierName
SuperProperty
1. Return simple.
PrimaryExpression :
CoverParenthesizedExpressionAndArrowParameterList
PrimaryExpression :
this
Literal
ArrayLiteral
ObjectLiteral
FunctionExpression
ClassExpression
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral
CallExpression :
CoverCallExpressionAndAsyncArrowHead
https://tc39.es/ecma262/ 196/490
4/25/2021 ECMAScript® 2022 Language Specification
SuperCall
ImportCall
CallExpression Arguments
CallExpression TemplateLiteral
NewExpression :
new NewExpression
MemberExpression :
MemberExpression TemplateLiteral
new MemberExpression Arguments
NewTarget :
new . target
ImportMeta :
import . meta
LeftHandSideExpression :
OptionalExpression
UpdateExpression :
LeftHandSideExpression ++
LeftHandSideExpression --
++ UnaryExpression
-- UnaryExpression
UnaryExpression :
delete UnaryExpression
void UnaryExpression
typeof UnaryExpression
+ UnaryExpression
- UnaryExpression
~ UnaryExpression
! UnaryExpression
AwaitExpression
ExponentiationExpression :
UpdateExpression ** ExponentiationExpression
MultiplicativeExpression :
https://tc39.es/ecma262/ 197/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 198/490
4/25/2021 ECMAScript® 2022 Language Specification
ConditionalExpression :
ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
AssignmentExpression :
YieldExpression
ArrowFunction
AsyncArrowFunction
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
LeftHandSideExpression &&= AssignmentExpression
LeftHandSideExpression ||= AssignmentExpression
LeftHandSideExpression ??= AssignmentExpression
Expression :
Expression , AssignmentExpression
1. Return invalid.
1. Return empty.
LiteralPropertyName : IdentifierName
LiteralPropertyName : StringLiteral
https://tc39.es/ecma262/ 199/490
4/25/2021 ECMAScript® 2022 Language Specification
LiteralPropertyName : NumericLiteral
ComputedPropertyName : [ AssignmentExpression ]
1. Return empty.
MethodDefinition :
PropertyName ( UniqueFormalParameters ) { FunctionBody }
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList ) { FunctionBody }
ClassElement : ;
1. Return empty.
Environment Record is a specification type used to define the association of Identifiers to specific
variables and functions, based upon the lexical nesting structure of ECMAScript code. Usually an
Environment Record is associated with some specific syntactic structure of ECMAScript code such
as a FunctionDeclaration, a BlockStatement, or a Catch clause of a TryStatement. Each time such
code is evaluated, a new Environment Record is created to record the identifier bindings that are
created by that code.
Every Environment Record has an [[OuterEnv]] field, which is either null or a reference to an outer
Environment Record. This is used to model the logical nesting of Environment Record values. The
outer reference of an (inner) Environment Record is a reference to the Environment Record that
logically surrounds the inner Environment Record. An outer Environment Record may, of course,
have its own outer Environment Record. An Environment Record may serve as the outer
environment for multiple inner Environment Records. For example, if a FunctionDeclaration
contains two nested FunctionDeclarations then the Environment Records of each of the nested
functions will have as their outer Environment Record the Environment Record of the current
evaluation of the surrounding function.
Environment Records are purely specification mechanisms and need not correspond to any specific
artefact of an ECMAScript implementation. It is impossible for an ECMAScript program to directly
access or manipulate such values.
https://tc39.es/ecma262/ 201/490
4/25/2021 ECMAScript® 2022 Language Specification
function. It may establish a new this binding. It also captures the state necessary
to support super method invocations.
A module Environment Record contains the bindings for the top-level declarations
of a Module. It also contains the bindings that are explicitly imported by the Module
. Its [[OuterEnv]] is a global Environment Record.
An object Environment Record is used to define the effect of ECMAScript elements such
as WithStatement that associate identifier bindings with the properties of some object.
A global Environment Record is used for Script global declarations. It does not have an
outer environment; its [[OuterEnv]] is null. It may be prepopulated with identifier
bindings and it includes an associated global object whose properties provide some of the
global environment's identifier bindings. As ECMAScript code is executed, additional
properties may be added to the global object and the initial properties may be modified.
The Environment Record abstract class includes the abstract specification methods defined in Table
17. These abstract methods have distinct concrete algorithms for each of the concrete subclasses.
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.
https://tc39.es/ecma262/ 203/490
4/25/2021 ECMAScript® 2022 Language Specification
The behaviour of the concrete specification methods for declarative Environment Records is defined
by the following algorithms.
9.1.1.1.1 HasBinding ( N )
The HasBinding concrete method of a declarative Environment Record envRec takes argument N (a
String). It determines if the argument identifier is one of the identifiers bound by the record. It
performs the following steps when called:
1. If envRec has a binding for the name that is the value of N, return true.
2. Return false.
9.1.1.1.2 CreateMutableBinding ( N, D )
9.1.1.1.3 CreateImmutableBinding ( N, S )
9.1.1.1.4 InitializeBinding ( N, V )
https://tc39.es/ecma262/ 204/490
4/25/2021 ECMAScript® 2022 Language Specification
The InitializeBinding concrete method of a declarative Environment Record envRec takes arguments
N (a String) and V (an ECMAScript language value). It 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. It performs the following steps when called:
9.1.1.1.5 SetMutableBinding ( N, V, S )
NOTE An example of ECMAScript code that results in a missing binding at step 1 is:
https://tc39.es/ecma262/ 205/490
4/25/2021 ECMAScript® 2022 Language Specification
9.1.1.1.6 GetBindingValue ( N, S )
The GetBindingValue concrete method of a declarative Environment Record envRec takes arguments
N (a String) and S (a Boolean). It 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. It performs the following steps when called:
9.1.1.1.7 DeleteBinding ( N )
The DeleteBinding concrete method of a declarative Environment Record envRec takes argument N
(a String). It can only delete bindings that have been explicitly designated as being subject to
deletion. It performs the following steps when called:
1. Assert: envRec has a binding for the name that is the value of N.
2. If the binding for N in envRec cannot be deleted, return false.
3. Remove the binding for N from envRec.
4. Return true.
9.1.1.1.8 HasThisBinding ( )
1. Return false.
NOTE A regular declarative Environment Record (i.e., one that is neither a function
Environment Record nor a module Environment Record) does not provide a this
binding.
9.1.1.1.9 HasSuperBinding ( )
https://tc39.es/ecma262/ 206/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return false.
NOTE A regular declarative Environment Record (i.e., one that is neither a function
Environment Record nor a module Environment Record) does not provide a super
binding.
9.1.1.1.10 WithBaseObject ( )
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 (14.11) can provide their binding object
as an implicit this value for use in function calls. The capability is controlled by a Boolean
[[IsWithEnvironment]] field.
Object Environment Records have the additional state fields listed in Table 18.
with statement.
The behaviour of the concrete specification methods for object Environment Records is defined by
the following algorithms.
9.1.1.2.1 HasBinding ( N )
The HasBinding concrete method of an object Environment Record envRec takes argument N (a
String). It determines if its associated binding object has a property whose name is the value of the
argument N. It performs the following steps when called:
9.1.1.2.2 CreateMutableBinding ( N, 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.
https://tc39.es/ecma262/ 208/490
4/25/2021 ECMAScript® 2022 Language Specification
9.1.1.2.3 CreateImmutableBinding ( N, S )
9.1.1.2.4 InitializeBinding ( N, V )
The InitializeBinding concrete method of an object Environment Record envRec takes arguments N
(a String) and V (an ECMAScript language value). It 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. It
performs the following steps when called:
9.1.1.2.5 SetMutableBinding ( N, V, S )
The SetMutableBinding concrete method of an object Environment Record envRec takes arguments
N (a String), V (an ECMAScript language value), and S (a Boolean). It 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 S. It performs the following steps
when called:
9.1.1.2.6 GetBindingValue ( N, S )
The GetBindingValue concrete method of an object Environment Record envRec takes arguments N
(a String) and S (a Boolean). It returns the value of its associated binding object's property whose
https://tc39.es/ecma262/ 209/490
4/25/2021 ECMAScript® 2022 Language Specification
name is the String value of the argument identifier N. The property should already exist but if it does
not the result depends upon S. It performs the following steps when called:
9.1.1.2.7 DeleteBinding ( N )
The DeleteBinding concrete method of an object Environment Record envRec takes argument N (a
String). It can only delete bindings that correspond to properties of the environment object whose
[[Configurable]] attribute have the value true. It performs the following steps when called:
9.1.1.2.8 HasThisBinding ( )
The HasThisBinding concrete method of an object Environment Record envRec takes no arguments.
It performs the following steps when called:
1. Return false.
9.1.1.2.9 HasSuperBinding ( )
1. Return false.
9.1.1.2.10 WithBaseObject ( )
https://tc39.es/ecma262/ 210/490
4/25/2021 ECMAScript® 2022 Language Specification
The WithBaseObject concrete method of an object Environment Record envRec takes no arguments.
It performs the following steps when called:
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, 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 19.
[[ThisValue]] Any This is the this value used for this invocation of the
function.
Function Environment Records support all of the declarative Environment Record methods listed in
Table 17 and share the same specifications for all of those methods except for HasThisBinding and
https://tc39.es/ecma262/ 211/490
4/25/2021 ECMAScript® 2022 Language Specification
HasSuperBinding. In addition, function Environment Records support the methods listed in Table
20:
BindThisValue(V) Set the [[ThisValue]] and record that it has been initialized.
GetThisBinding() Return the value of this Environment Record's this binding. Throws a
ReferenceError if the this binding has not been initialized.
GetSuperBase() Return the object that is the base for super property accesses bound in this
Environment Record. The value undefined indicates that 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:
9.1.1.3.1 BindThisValue ( V )
The BindThisValue concrete method of a function Environment Record envRec takes argument V (an
ECMAScript language value). It performs the following steps when called:
9.1.1.3.2 HasThisBinding ( )
The HasThisBinding concrete method of a function Environment Record envRec takes no arguments.
It performs the following steps when called:
9.1.1.3.3 HasSuperBinding ( )
https://tc39.es/ecma262/ 212/490
4/25/2021 ECMAScript® 2022 Language Specification
9.1.1.3.4 GetThisBinding ( )
The GetThisBinding concrete method of a function Environment Record envRec takes no arguments.
It performs the following steps when called:
9.1.1.3.5 GetSuperBase ( )
The GetSuperBase concrete method of a function Environment Record envRec takes no arguments.
It performs the following steps when called:
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 19), properties of the global object, and for all top-
level declarations (8.1.9, 8.1.11) that occur within a Script.
bindings for all built-in globals (clause 19) and all bindings introduced by a FunctionDeclaration,
GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, or
VariableStatement contained in global code. The bindings for all other ECMAScript declarations in
global code are contained in the declarative Environment Record component of the global
Environment Record.
Properties may be created directly on a global object. Hence, the object Environment Record
component of a global Environment Record may contain both bindings created explicitly by
FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration,
AsyncGeneratorDeclaration, or VariableDeclaration declarations and bindings created implicitly as
properties of the global object. In order to identify which bindings were explicitly created using
declarations, a global Environment Record maintains a list of the names bound using its
CreateGlobalVarBinding and CreateGlobalFunctionBinding concrete methods.
Global Environment Records have the additional fields listed in Table 21 and the additional methods
listed in Table 22.
[[ObjectRecord]] Object Binding object is the global object. It contains global built-
Environment in bindings as well as FunctionDeclaration,
Record GeneratorDeclaration, AsyncFunctionDeclaration,
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
Environment associated realm code except for FunctionDeclaration,
Record GeneratorDeclaration, AsyncFunctionDeclaration,
AsyncGeneratorDeclaration, and VariableDeclaration
bindings.
The behaviour of the concrete specification methods for global Environment Records is defined by
the following algorithms.
9.1.1.4.1 HasBinding ( N )
The HasBinding concrete method of a global Environment Record envRec takes argument N (a
String). It determines if the argument identifier is one of the identifiers bound by the record. It
performs the following steps when called:
9.1.1.4.2 CreateMutableBinding ( N, D )
9.1.1.4.3 CreateImmutableBinding ( N, S )
https://tc39.es/ecma262/ 216/490
4/25/2021 ECMAScript® 2022 Language Specification
9.1.1.4.4 InitializeBinding ( N, V )
The InitializeBinding concrete method of a global Environment Record envRec takes arguments N (a
String) and V (an ECMAScript language value). It 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. It performs the following steps when called:
9.1.1.4.5 SetMutableBinding ( N, V, S )
The SetMutableBinding concrete method of a global Environment Record envRec takes arguments N
(a String), V (an ECMAScript language value), and S (a Boolean). It 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 S. It performs the following steps when called:
https://tc39.es/ecma262/ 217/490
4/25/2021 ECMAScript® 2022 Language Specification
9.1.1.4.6 GetBindingValue ( N, S )
The GetBindingValue concrete method of a global Environment Record envRec takes arguments N (a
String) and S (a Boolean). It 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 S. It performs the following steps when called:
9.1.1.4.7 DeleteBinding ( N )
The DeleteBinding concrete method of a global Environment Record envRec takes argument N (a
String). It can only delete bindings that have been explicitly designated as being subject to deletion.
It performs the following steps when called:
9.1.1.4.8 HasThisBinding ( )
The HasThisBinding concrete method of a global Environment Record envRec takes no arguments.
It performs the following steps when called:
https://tc39.es/ecma262/ 218/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return true.
9.1.1.4.9 HasSuperBinding ( )
The HasSuperBinding concrete method of a global Environment Record envRec takes no arguments.
It performs the following steps when called:
1. Return false.
9.1.1.4.10 WithBaseObject ( )
The WithBaseObject concrete method of a global Environment Record envRec takes no arguments.
It performs the following steps when called:
1. Return undefined.
9.1.1.4.11 GetThisBinding ( )
The GetThisBinding concrete method of a global Environment Record envRec takes no arguments. It
performs the following steps when called:
1. Return envRec.[[GlobalThisValue]].
9.1.1.4.12 HasVarDeclaration ( N )
The HasVarDeclaration concrete method of a global Environment Record envRec takes argument N
(a String). It determines if the argument identifier has a binding in this record that was created using
a VariableStatement or a FunctionDeclaration. It performs the following steps when called:
9.1.1.4.13 HasLexicalDeclaration ( N )
https://tc39.es/ecma262/ 219/490
4/25/2021 ECMAScript® 2022 Language Specification
The HasLexicalDeclaration concrete method of a global Environment Record envRec takes argument
N (a String). It determines if the argument identifier has a binding in this record that was created
using a lexical declaration such as a LexicalDeclaration or a ClassDeclaration. It performs the
following steps when called:
9.1.1.4.14 HasRestrictedGlobalProperty ( N )
NOTE Properties may exist upon a global object that were directly created rather than
being declared using a var or function declaration. A global lexical binding may not
be created that has the same name as a non-configurable property of the global
object. The global property "undefined" is an example of such a property.
9.1.1.4.15 CanDeclareGlobalVar ( N )
The CanDeclareGlobalVar concrete method of a global Environment Record envRec takes argument
N (a String). It determines if a corresponding CreateGlobalVarBinding call would succeed if called
for the same argument N. Redundant var declarations and var declarations for pre-existing global
object properties are allowed. It performs the following steps when called:
https://tc39.es/ecma262/ 220/490
4/25/2021 ECMAScript® 2022 Language Specification
9.1.1.4.16 CanDeclareGlobalFunction ( N )
9.1.1.4.17 CreateGlobalVarBinding ( N, D )
https://tc39.es/ecma262/ 221/490
4/25/2021 ECMAScript® 2022 Language Specification
9.1.1.4.18 CreateGlobalFunctionBinding ( N, V, D )
NOTE Global function declarations are always represented as own properties of the global
object. If possible, an existing own property is reconfigured to have a standard set of
attribute values. Step 7 is equivalent to what calling the InitializeBinding concrete
method would do and if globalObject is a Proxy will produce the same sequence of
Proxy trap calls.
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.
https://tc39.es/ecma262/ 222/490
4/25/2021 ECMAScript® 2022 Language Specification
Module Environment Records support all of the declarative Environment Record methods listed in
Table 17 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 23:
The behaviour of the additional concrete specification methods for module Environment Records are
defined by the following algorithms:
9.1.1.5.1 GetBindingValue ( N, S )
The GetBindingValue concrete method of a module Environment Record envRec takes arguments N
(a String) and S (a Boolean). It returns the value of its bound identifier whose name is the value of
the argument N. However, if the binding is an indirect binding the value of the target binding is
returned. If the binding exists but is uninitialized a ReferenceError is thrown. It performs the
following steps when called:
1. Assert: S is true.
2. Assert: envRec has a binding for N.
3. 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. Return ? targetEnv.GetBindingValue(N2, true).
4. If the binding for N in envRec is an uninitialized binding, throw a ReferenceError exception.
5. Return the value currently bound to N in envRec.
https://tc39.es/ecma262/ 223/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE S will always be true because a Module is always strict mode code.
9.1.1.5.2 DeleteBinding ( N )
The DeleteBinding concrete method of a module Environment Record is never used within this
specification.
NOTE Module Environment Records are only used within strict code and an early error
rule prevents the delete operator, in strict code, from being applied to a Reference
Record that would resolve to a module Environment Record binding. See 13.5.1.1.
9.1.1.5.3 HasThisBinding ( )
The HasThisBinding concrete method of a module Environment Record envRec takes no arguments.
It performs the following steps when called:
1. Return true.
9.1.1.5.4 GetThisBinding ( )
The GetThisBinding concrete method of a module Environment Record envRec takes no arguments.
It performs the following steps when called:
1. Return undefined.
9.1.1.5.5 CreateImportBinding ( N, M, N2 )
The abstract operation GetIdentifierReference takes arguments env (an Environment Record or null),
name (a String), and strict (a Boolean). It performs the following steps when called:
9.1.2.2 NewDeclarativeEnvironment ( E )
https://tc39.es/ecma262/ 225/490
4/25/2021 ECMAScript® 2022 Language Specification
9.1.2.3 NewObjectEnvironment ( O, W, E )
The abstract operation NewObjectEnvironment takes arguments O (an Object), W (a Boolean), and E
(an Environment Record or null). It performs the following steps when called:
The abstract operation NewFunctionEnvironment takes arguments F and newTarget. It performs the
following steps when called:
The abstract operation NewGlobalEnvironment takes arguments G and thisValue. It performs the
following steps when called:
9.1.2.6 NewModuleEnvironment ( E )
9.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 24:
[[Intrinsics]] Record whose The intrinsic values used by code associated with this realm
field names are
intrinsic keys
and whose
values are
objects
[[TemplateMap]] A List of
https://tc39.es/ecma262/
Template objects are canonicalized separately for each realm
227/490
4/25/2021 ECMAScript® 2022 Language Specification
[[HostDefined]] Any, default Field reserved for use by hosts that need to associate
value is additional information with a Realm Record.
undefined.
9.2.1 CreateRealm ( )
The abstract operation CreateRealm takes no arguments. It performs the following steps when called:
https://tc39.es/ecma262/ 228/490
4/25/2021 ECMAScript® 2022 Language Specification
3. Set fields of intrinsics with the values listed in Table 8. The field names are the names listed in
column one of the table. The value of each field is a new object value fully and recursively
populated with property values as defined by the specification of each object in clauses 19
through 28. All object property values are newly created object values. All values that are built-
in function objects are created by performing CreateBuiltinFunction(steps, length, name, slots,
realmRec, prototype) where steps is the definition of that function provided by this
specification, name is the initial value of the function's name property, length is the initial
value of the function's length property, slots is a list of the names, if any, of the function's
specified internal slots, and prototype is the specified value of the function's [[Prototype]]
internal slot. The creation of the intrinsics and their properties must be ordered to avoid any
dependencies upon objects that have not yet been created.
4. Perform AddRestrictedFunctionProperties(intrinsics.[[%Function.prototype%]], realmRec).
5. Return intrinsics.
https://tc39.es/ecma262/ 229/490
4/25/2021 ECMAScript® 2022 Language Specification
The execution context stack is used to track execution contexts. The running execution context is
always the top element of this stack. A new execution context is created whenever control is
transferred from the executable code associated with the currently running execution context to
executable code that is not associated with that execution context. The newly created execution
context is pushed onto the stack and becomes the running execution context.
An execution context contains whatever implementation specific state is necessary to track the
execution progress of its associated code. Each execution context has at least the state components
listed in Table 25.
code evaluation Any state needed to perform, suspend, and resume evaluation of the code
state associated with this execution context.
Function If this execution context is evaluating the code of a function object, then the
value of this component is that function object. If the context is evaluating the
code of a Script or Module, the value is null.
Realm The Realm Record from which associated code accesses ECMAScript
resources.
https://tc39.es/ecma262/ 230/490
4/25/2021 ECMAScript® 2022 Language Specification
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 26.
Table 26: Additional State Components for ECMAScript Code Execution Contexts
Component Purpose
Execution contexts representing the evaluation of generator objects have the additional state
components listed in Table 27.
https://tc39.es/ecma262/ 231/490
4/25/2021 ECMAScript® 2022 Language Specification
Component Purpose
In most situations only the running execution context (the top of the execution context stack) is
directly manipulated by algorithms within this specification. Hence when the terms
“LexicalEnvironment”, and “VariableEnvironment” are used without qualification they are in
reference to those components of the running execution context.
An execution context is purely a specification mechanism and need not correspond to any particular
artefact of an ECMAScript implementation. It is impossible for ECMAScript code to directly access
or observe an execution context.
9.3.1 GetActiveScriptOrModule ( )
The abstract operation GetActiveScriptOrModule takes no arguments. It is used to determine the
running script or module, based on the running execution context. It performs the following steps
when called:
3. If the code matching the syntactic production that is being evaluated is contained in strict mode
code, let strict be true; else let strict be false.
4. Return ? GetIdentifierReference(env, name, strict).
9.3.3 GetThisEnvironment ( )
The abstract operation GetThisEnvironment takes no arguments. It finds the Environment Record
that currently supplies the binding of the keyword this. It performs the following steps when
called:
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.
9.3.4 ResolveThisBinding ( )
The abstract operation ResolveThisBinding takes no arguments. It determines the binding of the
keyword this using the LexicalEnvironment of the running execution context. It performs the
following steps when called:
9.3.5 GetNewTarget ( )
https://tc39.es/ecma262/ 233/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation GetNewTarget takes no arguments. It determines the NewTarget value using
the LexicalEnvironment of the running execution context. It performs the following steps when
called:
9.3.6 GetGlobalObject ( )
The abstract operation GetGlobalObject takes no arguments. It returns the global object used by the
currently running execution context. It performs the following steps when called:
Jobs are scheduled for execution by ECMAScript host environments. This specification describes the
host hook HostEnqueuePromiseJob to schedule one kind of job; hosts may define additional abstract
operations which schedule jobs. Such operations accept a Job Abstract Closure as the parameter and
schedule it to be performed at some future time. Their implementations must conform to the
following requirements:
At some future point in time, when there is no running execution context and the execution
context stack is empty, the implementation must:
1. Perform any host-defined preparation steps.
2. Invoke the Job Abstract Closure.
3. Perform any host-defined cleanup steps, after which the execution context stack must be
empty.
Only one Job may be actively undergoing evaluation at any point in time.
Once evaluation of a Job starts, it must run to completion before evaluation of any other Job
starts.
https://tc39.es/ecma262/ 234/490
4/25/2021 ECMAScript® 2022 Language Specification
The Abstract Closure must return a normal completion, implementing its own handling of
errors.
NOTE 1 Host environments are not required to treat Jobs uniformly with respect to
scheduling. For example, web browsers and Node.js treat Promise-handling Jobs as
a higher priority than other work; future features may add Jobs that are not treated at
such a high priority.
At any particular time, scriptOrModule (a Script Record, a Module Record, or null) is the active
script or module if all of the following conditions are true:
GetActiveScriptOrModule() is scriptOrModule.
If scriptOrModule is a Script Record or Module Record, let ec be the topmost execution
context on the execution context stack whose ScriptOrModule component is scriptOrModule.
The Realm component of ec is scriptOrModule.[[Realm]].
At any particular time, an execution is prepared to evaluate ECMAScript code if all of the following
conditions are true:
NOTE 2 Host environments may prepare an execution to evaluate code by pushing execution
contexts onto the execution context stack. The specific steps are implementation-
defined.
The specific choice of Realm is up to the host environment. This initial execution
context and Realm is only in use before any callback function is invoked. When a
callback function related to a Job, like a Promise handler, is invoked, the invocation
pushes its own execution context and Realm.
https://tc39.es/ecma262/ 235/490
4/25/2021 ECMAScript® 2022 Language Specification
A JobCallback Record is a Record value used to store a function object and a host-defined value.
Function objects that are invoked via a Job enqueued by the host may have additional host-defined
context. To propagate the state, Job Abstract Closures should not capture and call function objects
directly. Instead, use HostMakeJobCallback and HostCallJobCallback.
[[Callback]] A function object The function to invoke when the Job is invoked.
[[HostDefined]] Any, default value is empty. Field reserved for use by hosts.
The default implementation of HostMakeJobCallback performs the following steps when called:
ECMAScript hosts that are not web browsers must use the default implementation of
HostMakeJobCallback.
NOTE This is called at the time that the callback is passed to the function that is
responsible for its being eventually scheduled and run. For example,
https://tc39.es/ecma262/ 236/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE This requirement means that hosts cannot change the [[Call]] behaviour of function
objects defined in this specification.
The default implementation of HostCallJobCallback performs the following steps when called:
ECMAScript hosts that are not web browsers must use the default implementation of
HostCallJobCallback.
https://tc39.es/ecma262/ 237/490
4/25/2021 ECMAScript® 2022 Language Specification
If realm is not null, each time job is invoked the implementation must perform
implementation-defined steps such that execution is prepared to evaluate ECMAScript code at
the time of job's invocation.
Let scriptOrModule be GetActiveScriptOrModule() at the time HostEnqueuePromiseJob is
invoked. If realm is not null, each time job is invoked the implementation must perform
implementation-defined steps such that scriptOrModule is the active script or module at the
time of job's invocation.
Jobs must run in the same order as the HostEnqueuePromiseJob invocations that scheduled
them.
9.5 InitializeHostDefinedRealm ( )
The abstract operation InitializeHostDefinedRealm takes no arguments. It performs the following
steps when called:
https://tc39.es/ecma262/ 238/490
4/25/2021 ECMAScript® 2022 Language Specification
7. If the host requires use of an exotic object to serve as realm's global object, let global be such
an object created in a host-defined manner. Otherwise, let global be undefined, indicating that
an ordinary object should be created as the global object.
8. If the host requires that the this binding in realm's global scope return an object other than
the global object, let thisValue be such an object created in a host-defined manner. Otherwise,
let thisValue be undefined, indicating that realm's global this binding should be the global
object.
9. Perform SetRealmGlobalObject(realm, global, thisValue).
10. Let globalObj be ? SetDefaultGlobalBindings(realm).
11. Create any host-defined global object properties on globalObj.
12. Return NormalCompletion(empty).
9.6 Agents
An agent comprises a set of ECMAScript execution contexts, an execution context stack, a running
execution context, an Agent Record, and an executing thread. Except for the executing thread, the
constituents of an agent belong exclusively to that agent.
An agent's executing thread executes a job on the agent's execution contexts independently of other
agents, except that an executing thread may be used as the executing thread by multiple agents,
provided none of the agents sharing the thread have an Agent Record whose [[CanBlock]] 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 jobs, the agent is the surrounding agent for the code in
those jobs. The code uses the surrounding agent to access the specification level execution objects
held within the agent: the running execution context, the execution context stack, and the Agent
Record's fields.
[[LittleEndian]] Boolean The default value computed for the isLittleEndian parameter
when it is needed by the algorithms GetValueFromBuffer
https://tc39.es/ecma262/ 239/490
4/25/2021 ECMAScript® 2022 Language Specification
[[Signifier]] Any Uniquely identifies the agent within its agent cluster.
globally-
unique
value
[[KeptAlive]] List of Initially a new empty List, representing the list of objects to
objects be kept alive until the end of the current Job
Once the values of [[Signifier]], [[IsLockFree1]], and [[IsLockFree2]] have been observed by any
agent in the agent cluster they cannot change.
NOTE 2 The values of [[IsLockFree1]] and [[IsLockFree2]] are not necessarily determined
by the hardware, but may also reflect implementation choices that can vary over
time and between ECMAScript implementations.
https://tc39.es/ecma262/ 240/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
9.6.1 AgentSignifier ( )
The abstract operation AgentSignifier takes no arguments. It performs the following steps when
called:
9.6.2 AgentCanSuspend ( )
The abstract operation AgentCanSuspend takes no arguments. It performs the following steps when
called:
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.
https://tc39.es/ecma262/ 241/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
NOTE 4 The purpose of the preceding restriction is to avoid a situation where an agent
deadlocks or starves because another agent has been deactivated. For example, if an
HTML shared worker that has a lifetime independent of documents in any windows
https://tc39.es/ecma262/ 242/490
4/25/2021 ECMAScript® 2022 Language Specification
were allowed to share memory with the dedicated worker of such an independent
document, and the document and its dedicated worker were to be deactivated while
the dedicated worker holds a lock (say, the document is pushed into its window's
history), and the shared worker then tries to acquire the lock, then the shared worker
will be blocked until the dedicated worker is activated again, if ever. Meanwhile
other workers trying to access the shared worker from other windows will starve.
The implication of the restriction is that it will not be possible to share memory
between agents that don't belong to the same suspend/wake collective within the
embedding.
An embedding may terminate an agent without any of the agent's cluster's other agents' prior
knowledge or cooperation. If an agent is terminated not by programmatic action of its own or of
another agent in the cluster but by forces external to the cluster, then the embedding must choose one
of two strategies: Either terminate all the agents in the cluster, or provide reliable APIs that allow the
agents in the cluster to coordinate so that at least one remaining member of the cluster will be able to
detect the termination, with the termination data containing enough information to identify the agent
that was terminated.
NOTE 5 Examples of that type of termination are: operating systems or users terminating
agents that are running in separate processes; the embedding itself terminating an
agent that is running in-process with the other agents when per-agent resource
accounting indicates that the agent is runaway.
Prior to any evaluation of any ECMAScript code by any agent in a cluster, the
[[CandidateExecution]] field of the Agent Record for all agents in the cluster is set to the initial
candidate execution. The initial candidate execution is an empty candidate execution whose
[[EventsRecords]] field is a List containing, for each agent, an Agent Events Record whose
[[AgentSignifier]] field is that agent's signifier, and whose [[EventList]] and
[[AgentSynchronizesWith]] fields are empty Lists.
NOTE 6 All agents in an agent cluster share the same candidate execution in its Agent
Record's [[CandidateExecution]] field. The candidate execution is a specification
mechanism used by the memory model.
NOTE 7 An agent cluster is a specification mechanism and need not correspond to any
https://tc39.es/ecma262/ 243/490
4/25/2021 ECMAScript® 2022 Language Specification
An agent becomes blocked when its running execution context waits synchronously and indefinitely
for an external event. Only agents whose Agent Record's [[CanBlock]] 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.
NOTE This, along with the liveness guarantee in the memory model, ensures that all
SeqCst writes eventually become observable to all agents.
9.9.1 Objectives
This specification does not make any guarantees that any object will be garbage collected. Objects
which are not live may be released after long periods of time, or never at all. For this reason, this
specification uses the term "may" when describing behaviour triggered by garbage collection.
The semantics of WeakRef and FinalizationRegistry objects is based on two operations which
happen at particular points in time:
Some ECMAScript implementations include garbage collector implementations which run in the
background, including when ECMAScript is idle. Letting the host environment schedule
CleanupFinalizationRegistry allows it to resume ECMAScript execution in order to run finalizer
work, which may free up held values, reducing overall memory usage.
9.9.2 Liveness
For some set of objects S, a hypothetical WeakRef-oblivious execution with respect to S is an
execution whereby the abstract operation WeakRefDeref of a WeakRef whose referent is an element
of S always returns undefined.
NOTE 1 WeakRef-obliviousness, together with liveness, capture two notions. One, that a
WeakRef itself does not keep an object alive. Two, that cycles in liveness does not
imply that an object is live. To be concrete, if determining obj's liveness depends on
determining the liveness of another WeakRef referent, obj2, obj2's liveness cannot
assume obj's liveness, which would be circular reasoning.
NOTE 3 Colloquially, we say that an individual object is live if every set of objects
containing it is live.
https://tc39.es/ecma262/ 245/490
4/25/2021 ECMAScript® 2022 Language Specification
At any point during evaluation, a set of objects S is considered live if either of the following
conditions is met:
NOTE 4 The second condition above intends to capture the intuition that an object is live if
its identity is observable via non-WeakRef means. An object's identity may be
observed by observing a strict equality comparison between objects or observing the
object being used as key in a Map.
NOTE 5 Presence of an object in a field, an internal slot, or a property does not imply that the
object is live. For example if the object in question is never passed back to the
program, then it cannot be observed.
This is the case for keys in a WeakMap, members of a WeakSet, as well as the
[[WeakRefTarget]] and [[UnregisterToken]] fields of a FinalizationRegistry Cell
record.
The above definition implies that, if a key in a WeakMap is not live, then its
corresponding value is not necessarily live either.
NOTE 6 Liveness is the lower bound for guaranteeing which WeakRefs engines must not
empty. Liveness as defined here is undecidable. In practice, engines use
conservative approximations such as reachability. There is expected to be significant
implementation leeway.
9.9.3 Execution
At any time, if a set of objects S is not live, an ECMAScript implementation may perform the
following steps atomically:
b. For each FinalizationRegistry fg such that fg.[[Cells]] contains a Record cell such that
cell.[[WeakRefTarget]] is obj, do
i. Set cell.[[WeakRefTarget]] to empty.
ii. Optionally, perform ! HostEnqueueFinalizationRegistryCleanupJob(fg).
c. For each WeakMap map such that map.[[WeakMapData]] contains a Record r such that r.
[[Key]] is obj, do
i. Set r.[[Key]] to empty.
ii. Set r.[[Value]] to empty.
d. For each WeakSet set such that set.[[WeakSetData]] contains obj, do
i. Replace the element of set.[[WeakSetData]] whose value is obj with an element
whose value is empty.
NOTE 1 Together with the definition of liveness, this clause prescribes legal optimizations
that an implementation may apply regarding WeakRefs.
On the other hand, if an object's identity is observable, and that object is in the
[[WeakRefTarget]] internal slot of a WeakRef, optimizations such as
rematerialization that observably empty the WeakRef are prohibited.
NOTE 2 Implementations are not obligated to empty WeakRefs for maximal sets of non-live
objects.
https://tc39.es/ecma262/ 247/490
4/25/2021 ECMAScript® 2022 Language Specification
emptying out other WeakRefs that, if not emptied, could result in an execution that
observes the Object value of obj.
9.10 ClearKeptObjects ( )
The abstract operation ClearKeptObjects takes no arguments. ECMAScript implementations are
expected to call ClearKeptObjects when a synchronous sequence of ECMAScript executions
completes. It performs the following steps when called:
NOTE When the abstract operation AddToKeptObjects is called with a target object
reference, it adds the target to a list that will point strongly at the target until
ClearKeptObjects is called.
https://tc39.es/ecma262/ 248/490
4/25/2021 ECMAScript® 2022 Language Specification
Every ordinary object has a Boolean-valued [[Extensible]] internal slot which is used to fulfill the
extensibility-related internal method invariants specified in 6.1.7.3. Namely, once the value of an
object's [[Extensible]] internal slot has been set to false, it is no longer possible to add properties to
the object, to modify the value of the object's [[Prototype]] internal slot, or to subsequently change
the value of [[Extensible]] to true.
In the following algorithm descriptions, assume O is an ordinary object, P is a property key value, V
is any ECMAScript language value, and Desc is a Property Descriptor record.
https://tc39.es/ecma262/ 249/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
10.1.1 [[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of an ordinary object O takes no arguments. It performs the
following steps when called:
1. Return ! OrdinaryGetPrototypeOf(O).
10.1.1.1 OrdinaryGetPrototypeOf ( O )
The abstract operation OrdinaryGetPrototypeOf takes argument O (an Object). It performs the
following steps when called:
1. Return O.[[Prototype]].
10.1.2 [[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of an ordinary object O takes argument V (an Object or
null). It performs the following steps when called:
10.1.2.1 OrdinarySetPrototypeOf ( O, V )
The abstract operation OrdinarySetPrototypeOf takes arguments O (an Object) and V (an
ECMAScript language value). It performs the following steps when called:
https://tc39.es/ecma262/ 250/490
4/25/2021 ECMAScript® 2022 Language Specification
6. Let p be V.
7. Let done be false.
8. Repeat, while done is false,
a. If p is null, set done to true.
b. Else if SameValue(p, O) is true, return false.
c. Else,
i. If p.[[GetPrototypeOf]] is not the ordinary object internal method defined in 10.1.1,
set done to true.
ii. Else, set p to p.[[Prototype]].
9. Set O.[[Prototype]] to V.
10. Return true.
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]].
10.1.3 [[IsExtensible]] ( )
The [[IsExtensible]] internal method of an ordinary object O takes no arguments. It performs the
following steps when called:
1. Return ! OrdinaryIsExtensible(O).
10.1.3.1 OrdinaryIsExtensible ( O )
The abstract operation OrdinaryIsExtensible takes argument O (an Object). It performs the following
steps when called:
1. Return O.[[Extensible]].
10.1.4 [[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of an ordinary object O takes no arguments. It performs
the following steps when called:
1. Return ! OrdinaryPreventExtensions(O).
https://tc39.es/ecma262/ 251/490
4/25/2021 ECMAScript® 2022 Language Specification
10.1.4.1 OrdinaryPreventExtensions ( O )
The abstract operation OrdinaryPreventExtensions takes argument O (an Object). It performs the
following steps when called:
10.1.5 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of an ordinary object O takes argument P (a property key).
It performs the following steps when called:
10.1.5.1 OrdinaryGetOwnProperty ( O, P )
The abstract operation OrdinaryGetOwnProperty takes arguments O (an Object) and P (a property
key). It performs the following steps when called:
https://tc39.es/ecma262/ 252/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE If undefined is passed as O, only validation is performed and no object updates are
performed.
https://tc39.es/ecma262/ 253/490
4/25/2021 ECMAScript® 2022 Language Specification
8. Else,
a. Assert: ! IsAccessorDescriptor(current) and ! IsAccessorDescriptor(Desc) are both true.
b. If current.[[Configurable]] is false, then
i. If Desc.[[Set]] is present and SameValue(Desc.[[Set]], current.[[Set]]) is false,
return false.
ii. If Desc.[[Get]] is present and SameValue(Desc.[[Get]], current.[[Get]]) is false,
return false.
iii. Return true.
9. If O is not undefined, then
a. For each field of Desc that is present, set the corresponding attribute of the property
named P of object O to the value of the field.
10. Return true.
10.1.7 [[HasProperty]] ( P )
The [[HasProperty]] internal method of an ordinary object O takes argument P (a property key). It
performs the following steps when called:
10.1.7.1 OrdinaryHasProperty ( O, P )
The abstract operation OrdinaryHasProperty takes arguments O (an Object) and P (a property key).
It performs the following steps when called:
https://tc39.es/ecma262/ 255/490
4/25/2021 ECMAScript® 2022 Language Specification
The [[Get]] internal method of an ordinary object O takes arguments P (a property key) and Receiver
(an ECMAScript language value). It performs the following steps when called:
The abstract operation OrdinaryGet takes arguments O (an Object), P (a property key), and Receiver
(an ECMAScript language value). It performs the following steps when called:
The abstract operation OrdinarySet takes arguments O (an Object), P (a property key), V (an
ECMAScript language value), and Receiver (an ECMAScript language value). It performs the
following steps when called:
https://tc39.es/ecma262/ 256/490
4/25/2021 ECMAScript® 2022 Language Specification
10.1.10 [[Delete]] ( P )
https://tc39.es/ecma262/ 257/490
4/25/2021 ECMAScript® 2022 Language Specification
The [[Delete]] internal method of an ordinary object O takes argument P (a property key). It
performs the following steps when called:
10.1.10.1 OrdinaryDelete ( O, P )
The abstract operation OrdinaryDelete takes arguments O (an Object) and P (a property key). It
performs the following steps when called:
10.1.11 [[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of an ordinary object O takes no arguments. It performs
the following steps when called:
1. Return ! OrdinaryOwnPropertyKeys(O).
10.1.11.1 OrdinaryOwnPropertyKeys ( O )
The abstract operation OrdinaryOwnPropertyKeys takes argument O (an Object). It performs the
following steps when called:
https://tc39.es/ecma262/ 258/490
4/25/2021 ECMAScript® 2022 Language Specification
4. For each own property key P of O such that Type(P) is Symbol, in ascending chronological
order of property creation, do
a. Add P as the last element of keys.
5. Return keys.
NOTE Although OrdinaryObjectCreate does little more than call MakeBasicObject, its use
communicates the intention to create an ordinary object, and not an exotic one.
Thus, within this specification, it is not called by any algorithm that subsequently
modifies the internal methods of the object in ways that would make the result non-
ordinary. Operations that create exotic objects invoke MakeBasicObject directly.
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.
In addition to [[Extensible]] and [[Prototype]], ECMAScript function objects also have the internal
slots listed in Table 30.
[[Environment]] Environment The Environment Record that the function was closed
Record over. Used as the outer 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
Record provides any 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
strict | formal parameters and code body of the function. lexical
global means that this refers to the this value of a lexically
https://tc39.es/ecma262/ 261/490
4/25/2021 ECMAScript® 2022 Language Specification
[[HomeObject]] Object If the function uses super, this is the object whose
[[GetPrototypeOf]] provides the object where super
property lookups begin.
All ECMAScript function objects have the [[Call]] internal method defined here. ECMAScript
functions that are also constructors in addition have the [[Construct]] internal method.
https://tc39.es/ecma262/ 262/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
The abstract operation PrepareForOrdinaryCall takes arguments F (a function object) and newTarget
(an ECMAScript language value). It performs the following steps when called:
FunctionBody : FunctionStatementList
ConciseBody : ExpressionBody
GeneratorBody : FunctionBody
https://tc39.es/ecma262/ 264/490
4/25/2021 ECMAScript® 2022 Language Specification
AsyncGeneratorBody : FunctionBody
AsyncFunctionBody : FunctionBody
AsyncConciseBody : ExpressionBody
1. Return the result of EvaluateBody of the parsed code that is F.[[ECMAScriptCode]] passing F
and argumentsList as the arguments.
https://tc39.es/ecma262/ 265/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 266/490
4/25/2021 ECMAScript® 2022 Language Specification
10.2.4.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 }.
The "name" property of a %ThrowTypeError% function has the attributes { [[Writable]]: false,
[[Enumerable]]: false, [[Configurable]]: false }.
https://tc39.es/ecma262/ 267/490
4/25/2021 ECMAScript® 2022 Language Specification
10.2.6 MakeClassConstructor ( F )
The abstract operation MakeClassConstructor takes argument F. It performs the following steps
when called:
https://tc39.es/ecma262/ 268/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Assert: F is an extensible object that does not have a "name" own property.
2. Assert: Type(name) is either Symbol or String.
3. Assert: If prefix is present, then Type(prefix) is String.
4. If Type(name) is Symbol, then
a. Let description be name's [[Description]] value.
b. If description is undefined, set name to the empty String.
c. Else, set name to the string-concatenation of "[", description, and "]".
5. If F has an [[InitialName]] internal slot, then
a. Set F.[[InitialName]] to name.
6. If prefix is present, then
a. Set name to the string-concatenation of prefix, the code unit 0x0020 (SPACE), and name.
b. If F has an [[InitialName]] internal slot, then
i. Optionally, set F.[[InitialName]] to name.
7. Return ! DefinePropertyOrThrow(F, "name", PropertyDescriptor { [[Value]]: name,
[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }).
1. Assert: F is an extensible object that does not have a "length" own property.
2. Return ! DefinePropertyOrThrow(F, "length", PropertyDescriptor { [[Value]]: 𝔽(length),
[[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }).
https://tc39.es/ecma262/ 269/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation FunctionDeclarationInstantiation takes arguments func (a function object) and
argumentsList. func is the function object for which the execution context is being established. It
performs the following steps when called:
https://tc39.es/ecma262/ 270/490
4/25/2021 ECMAScript® 2022 Language Specification
i. Let ao be CreateUnmappedArgumentsObject(argumentsList).
b. Else,
i. NOTE: A mapped argument object is only provided for non-strict functions that
don't have a rest parameter, any parameter default value initializers, or any
destructured parameters.
ii. Let ao be CreateMappedArgumentsObject(func, formals, argumentsList, env).
c. If strict is true, then
i. Perform ! env.CreateImmutableBinding("arguments", false).
d. Else,
i. Perform ! env.CreateMutableBinding("arguments", false).
e. Call env.InitializeBinding("arguments", ao).
f. Let parameterBindings be a List whose elements are the elements of parameterNames,
followed by "arguments".
23. Else,
a. Let parameterBindings be parameterNames.
24. Let iteratorRecord be CreateListIteratorRecord(argumentsList).
25. If hasDuplicates is true, then
a. Perform ? IteratorBindingInitialization for formals with iteratorRecord and undefined as
arguments.
26. Else,
a. Perform ? IteratorBindingInitialization for formals with iteratorRecord and env as
arguments.
27. If hasParameterExpressions is false, then
a. NOTE: Only a single Environment Record is needed for the parameters and top-level
vars.
b. Let instantiatedVarNames be a copy of the List parameterBindings.
c. For each element n of varNames, do
i. If n is not an element of instantiatedVarNames, then
1. Append n to instantiatedVarNames.
2. Perform ! env.CreateMutableBinding(n, false).
3. Call env.InitializeBinding(n, undefined).
d. Let varEnv be env.
28. Else,
a. NOTE: A separate Environment Record is needed to ensure that closures created by
expressions in the formal parameter list do not have visibility of declarations in the
function body.
https://tc39.es/ecma262/ 272/490
4/25/2021 ECMAScript® 2022 Language Specification
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 (11.2). The creation of
the environment for such declarations is described in 8.5.3.
If a built-in function object is implemented as an exotic object it must have the ordinary object
behaviour specified in 10.1. All such function exotic objects also have [[Prototype]], [[Extensible]],
and [[Realm]] internal slots.
Unless otherwise specified every built-in function object has the %Function.prototype% object as the
initial value of its [[Prototype]] internal slot.
The behaviour specified for each built-in function via algorithm steps or other means is the
specification of the function body behaviour for both [[Call]] and [[Construct]] invocations of the
function. However, [[Construct]] invocation is not supported by all built-in functions. For each built-
in function, when invoked with [[Call]], the [[Call]] thisArgument provides the this value, the
[[Call]] argumentsList provides the named parameters, and the NewTarget value is undefined. When
invoked with [[Construct]], the this value is uninitialized, the [[Construct]] argumentsList provides
the named parameters, and the [[Construct]] newTarget parameter provides the NewTarget value. If
the built-in function is implemented as an ECMAScript function object then this specified behaviour
https://tc39.es/ecma262/ 274/490
4/25/2021 ECMAScript® 2022 Language Specification
must be implemented by the ECMAScript code that is the body of the function. Built-in functions
that are ECMAScript function objects must be strict functions. If a built-in constructor has any
[[Call]] behaviour other than throwing a TypeError exception, an ECMAScript implementation of
the function must be done in a manner that does not cause the function's [[IsClassConstructor]]
internal slot to have the value true.
Built-in function objects that are not identified as constructors do not implement the [[Construct]]
internal method unless otherwise specified in the description of a particular function. When a built-in
constructor is called as part of a new expression the argumentsList parameter of the invoked
[[Construct]] internal method provides the values for the built-in constructor's named parameters.
Built-in functions that are not constructors do not have a "prototype" property unless otherwise
specified in the description of a particular function.
If a built-in function object is not implemented as an ECMAScript function it must provide [[Call]]
and [[Construct]] internal methods that conform to the following definitions:
https://tc39.es/ecma262/ 275/490
4/25/2021 ECMAScript® 2022 Language Specification
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 a 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 or realm is empty, 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]].[[%Function.prototype%]].
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, and an [[InitialName]] internal slot.
https://tc39.es/ecma262/ 276/490
4/25/2021 ECMAScript® 2022 Language Specification
Each built-in function defined in this specification is created by calling the CreateBuiltinFunction
abstract operation.
An object is a bound function exotic object if its [[Call]] and (if applicable) [[Construct]] internal
methods use the following implementations, and its other essential internal methods use the
definitions found in 10.1. These methods are installed in BoundFunctionCreate.
Bound function exotic objects do not have the internal slots of ECMAScript function objects listed in
Table 30. Instead they have the internal slots listed in Table 31, in addition to [[Prototype]] and
[[Extensible]].
[[BoundThis]] Any The value that is always passed as the this value when
calling the wrapped function.
[[BoundArguments]] List of A list of values whose elements are used as the first
Any arguments to any call to the wrapped function.
The [[Call]] internal method of a bound function exotic object F takes arguments thisArgument (an
ECMAScript language value) and argumentsList (a List of ECMAScript language values). It
performs the following steps when called:
The [[Construct]] internal method of a bound function exotic object F takes arguments
argumentsList (a List of ECMAScript language values) and newTarget (a constructor). It performs
the following steps when called:
https://tc39.es/ecma262/ 278/490
4/25/2021 ECMAScript® 2022 Language Specification
An object is an Array exotic object (or simply, an Array object) if its [[DefineOwnProperty]] internal
method uses the following implementation, and its other essential internal methods use the
definitions found in 10.1. These methods are installed in ArrayCreate.
The abstract operation ArrayCreate takes argument length (a non-negative integer) and optional
argument proto. It is used to specify the creation of new Array exotic objects. It performs the
following steps when called:
https://tc39.es/ecma262/ 280/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation ArraySpeciesCreate takes arguments originalArray and length (a non-
negative integer). It 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 when called:
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.
https://tc39.es/ecma262/ 281/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation ArraySetLength takes arguments A (an Array object) and Desc (a Property
Descriptor). It performs the following steps when called:
https://tc39.es/ecma262/ 282/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
An object is a String exotic object (or simply, a String object) if its [[GetOwnProperty]],
[[DefineOwnProperty]], and [[OwnPropertyKeys]] internal methods use the following
implementations, and its other essential internal methods use the definitions found in 10.1. These
methods are installed in StringCreate.
String exotic objects have the same internal slots as ordinary objects. They also have a [[StringData]]
internal slot.
10.4.3.1 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of a String exotic object S takes argument P (a property
key). It performs the following steps when called:
10.4.3.3 [[OwnPropertyKeys]] ( )
The abstract operation StringCreate takes arguments value (a String) and prototype. It is used to
specify the creation of new String exotic objects. It performs the following steps when called:
https://tc39.es/ecma262/ 284/490
4/25/2021 ECMAScript® 2022 Language Specification
10.4.3.5 StringGetOwnProperty ( S, P )
The abstract operation StringGetOwnProperty takes arguments S and P. It performs the following
steps when called:
https://tc39.es/ecma262/ 285/490
4/25/2021 ECMAScript® 2022 Language Specification
arguments exotic object. An arguments exotic object is an exotic object whose array index properties
map to the formal parameters bindings of an invocation of its associated ECMAScript function.
An object is an arguments exotic object if its internal methods use the following implementations,
with the ones not specified here using those found in 10.1. These methods are installed in
CreateMappedArgumentsObject.
Arguments exotic objects have the same internal slots as ordinary objects. They also have a
[[ParameterMap]] internal slot. Ordinary arguments objects also have a [[ParameterMap]] internal
slot whose value is always undefined. For ordinary argument objects the [[ParameterMap]] internal
slot is only used by Object.prototype.toString (20.1.3.6) to identify them as such.
NOTE 2 The integer-indexed data properties of an arguments exotic object whose numeric
name values are less than the number of formal parameters of the corresponding
function object initially share their values with the corresponding argument bindings
in the function's execution context. This means that changing the property changes
the corresponding value of the argument binding and vice-versa. This
correspondence is broken if such a property is deleted and then redefined or if the
property is changed into an accessor property. If the arguments object is an ordinary
object, the values of its properties are simply a copy of the arguments passed to the
function and there is no dynamic linkage between the property values and the
formal parameter values.
NOTE 3 The ParameterMap object and its property values are used as a device for specifying
the arguments object correspondence to argument bindings. The ParameterMap
object and the objects that are the values of its properties are not directly observable
from ECMAScript code. An ECMAScript implementation does not need to actually
create or use such objects to implement the specified semantics.
10.4.4.1 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of an arguments exotic object args takes argument P (a
property key). It performs the following steps when called:
The [[DefineOwnProperty]] internal method of an arguments exotic object args takes arguments P (a
property key) and Desc (a Property Descriptor). It performs the following steps when called:
The [[Get]] internal method of an arguments exotic object args takes arguments P (a property key)
and Receiver (an ECMAScript language value). It performs the following steps when called:
The [[Set]] internal method of an arguments exotic object args takes arguments P (a property key), V
(an ECMAScript language value), and Receiver (an ECMAScript language value). It performs the
following steps when called:
10.4.4.5 [[Delete]] ( P )
The [[Delete]] internal method of an arguments exotic object args takes argument P (a property key).
It performs the following steps when called:
9. Return obj.
The abstract operation CreateMappedArgumentsObject takes arguments func (an Object), formals (a
Parse Node), argumentsList (a List), and env (an Environment Record). It performs the following
steps when called:
1. Assert: formals does not contain a rest parameter, any binding patterns, or any initializers. It
may contain duplicate identifiers.
2. Let len be the number of elements in argumentsList.
3. Let obj be ! MakeBasicObject(« [[Prototype]], [[Extensible]], [[ParameterMap]] »).
4. Set obj.[[GetOwnProperty]] as specified in 10.4.4.1.
5. Set obj.[[DefineOwnProperty]] as specified in 10.4.4.2.
6. Set obj.[[Get]] as specified in 10.4.4.3.
7. Set obj.[[Set]] as specified in 10.4.4.4.
8. Set obj.[[Delete]] as specified in 10.4.4.5.
9. Set obj.[[Prototype]] to %Object.prototype%.
10. Let map be ! OrdinaryObjectCreate(null).
11. Set obj.[[ParameterMap]] to map.
12. Let parameterNames be the BoundNames of formals.
13. Let numberOfParameters be the number of elements in parameterNames.
14. Let index be 0.
15. Repeat, while index < len,
a. Let val be argumentsList[index].
b. Perform ! CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), val).
c. Set index to index + 1.
16. Perform ! DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(len),
[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }).
17. Let mappedNames be a new empty List.
18. Set index to numberOfParameters - 1.
19. Repeat, while index ≥ 0,
a. Let name be parameterNames[index].
b. If name is not an element of mappedNames, then
i. Add name as an element of the list mappedNames.
ii. If index < len, then
https://tc39.es/ecma262/ 290/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation MakeArgGetter takes arguments name (a String) and env (an Environment
Record). It creates a built-in function object that when executed returns the value bound for name in
env. It performs the following steps when called:
An ArgGetter function is an anonymous built-in function with [[Name]] and [[Env]] internal slots.
When an ArgGetter function that expects no arguments is called it performs the following steps:
The abstract operation MakeArgSetter takes arguments name (a String) and env (an Environment
Record). It creates a built-in function object that when executed sets the value bound for name in
env. It performs the following steps when called:
An ArgSetter function is an anonymous built-in function with [[Name]] and [[Env]] internal slots.
When an ArgSetter function is called with argument value it performs the following steps:
Integer-Indexed exotic objects have the same internal slots as ordinary objects and additionally
[[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], [[ContentType]], and [[TypedArrayName]]
internal slots.
10.4.5.1 [[GetOwnProperty]] ( P )
https://tc39.es/ecma262/ 292/490
4/25/2021 ECMAScript® 2022 Language Specification
10.4.5.2 [[HasProperty]] ( P )
https://tc39.es/ecma262/ 293/490
4/25/2021 ECMAScript® 2022 Language Specification
The [[Get]] internal method of an Integer-Indexed exotic object O takes arguments P (a property
key) and Receiver (an ECMAScript language value). It performs the following steps when called:
The [[Set]] internal method of an Integer-Indexed exotic object O takes arguments P (a property
key), V (an ECMAScript language value), and Receiver (an ECMAScript language value). It
performs the following steps when called:
10.4.5.6 [[Delete]] ( P )
https://tc39.es/ecma262/ 294/490
4/25/2021 ECMAScript® 2022 Language Specification
The [[Delete]] internal method of an Integer-Indexed exotic object O takes arguments P (a property
key). It performs the following steps when called:
10.4.5.7 [[OwnPropertyKeys]] ( )
https://tc39.es/ecma262/ 295/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation IsValidIntegerIndex takes arguments O and index (a Number). It performs the
following steps when called:
https://tc39.es/ecma262/ 296/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation IntegerIndexedElementSet takes arguments O, index (a Number), and value. It
performs the following steps when called:
NOTE This operation always appears to succeed, but it has no effect when attempting to
write past the end of a TypedArray or to a TypedArray which is backed by a
detached ArrayBuffer.
https://tc39.es/ecma262/ 297/490
4/25/2021 ECMAScript® 2022 Language Specification
its other essential internal methods use the definitions found in 10.1. These methods are installed by
ModuleNamespaceCreate.
Module namespace exotic objects have the internal slots defined in Table 32.
[[Module]] Module The Module Record whose exports this namespace exposes.
Record
[[Exports]] List of A List whose elements are the String values of the exported names
String exposed as own properties of this object. The list is ordered as if an Array
of those String values had been sorted using %Array.prototype.sort%
using undefined as comparefn.
[[Prototype]] Null This slot always contains the value null (see 10.4.6.1).
Module namespace exotic objects provide alternative definitions for all of the internal methods
except [[GetPrototypeOf]], which behaves as defined in 10.1.1.
10.4.6.1 [[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of a module namespace exotic object O takes argument V
(an Object or null). It performs the following steps when called:
10.4.6.2 [[IsExtensible]] ( )
The [[IsExtensible]] internal method of a module namespace exotic object takes no arguments. It
performs the following steps when called:
1. Return false.
10.4.6.3 [[PreventExtensions]] ( )
https://tc39.es/ecma262/ 298/490
4/25/2021 ECMAScript® 2022 Language Specification
The [[PreventExtensions]] internal method of a module namespace exotic object takes no arguments.
It performs the following steps when called:
1. Return true.
10.4.6.4 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of a module namespace exotic object O takes argument P
(a property key). It performs the following steps when called:
The [[DefineOwnProperty]] internal method of a module namespace exotic object O takes arguments
P (a property key) and Desc (a Property Descriptor). It performs the following steps when called:
10.4.6.6 [[HasProperty]] ( P )
The [[HasProperty]] internal method of a module namespace exotic object O takes argument P (a
property key). It performs the following steps when called:
The [[Get]] internal method of a module namespace exotic object O takes arguments P (a property
key) and Receiver (an ECMAScript language value). It performs the following steps when called:
NOTE ResolveExport is side-effect free. Each time this operation is called with a specific
exportName, resolveSet pair as arguments it must return the same result. An
implementation might choose to pre-compute or cache the ResolveExport results for
the [[Exports]] of each module namespace exotic object.
The [[Set]] internal method of a module namespace exotic object takes arguments P (a property key),
V (an ECMAScript language value), and Receiver (an ECMAScript language value). It performs the
following steps when called:
https://tc39.es/ecma262/ 300/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return false.
10.4.6.9 [[Delete]] ( P )
The [[Delete]] internal method of a module namespace exotic object O takes argument P (a property
key). It performs the following steps when called:
10.4.6.10 [[OwnPropertyKeys]] ( )
The abstract operation ModuleNamespaceCreate takes arguments module and exports. It is used to
specify the creation of new module namespace exotic objects. It performs the following steps when
called:
https://tc39.es/ecma262/ 301/490
4/25/2021 ECMAScript® 2022 Language Specification
An object is an immutable prototype exotic object if its [[SetPrototypeOf]] internal method uses the
following implementation. (Its other essential internal methods may use any implementation,
depending on the specific immutable prototype exotic object in question.)
NOTE Unlike other exotic objects, there is not a dedicated creation abstract operation
provided for immutable prototype exotic objects. This is because they are only used
by %Object.prototype% and by host environments, and in host environments, the
relevant objects are potentially exotic in other ways and thus need their own
dedicated creation operation.
10.4.7.1 [[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of an immutable prototype exotic object O takes argument V
(an Object or null). It performs the following steps when called:
10.4.7.2 SetImmutablePrototype ( O, V )
The abstract operation SetImmutablePrototype takes arguments O and V. It performs the following
steps when called:
An object is a Proxy exotic object if its essential internal methods (including [[Call]] and
[[Construct]], if applicable) use the definitions in this section. These internal methods are installed in
ProxyCreate.
[[GetPrototypeOf]] getPrototypeOf
[[SetPrototypeOf]] setPrototypeOf
[[IsExtensible]] isExtensible
[[PreventExtensions]] preventExtensions
[[GetOwnProperty]] getOwnPropertyDescriptor
[[DefineOwnProperty]] defineProperty
[[HasProperty]] has
[[Get]] get
[[Set]] set
[[Delete]] deleteProperty
https://tc39.es/ecma262/
[[O P t K ]] ownKeys 303/490
4/25/2021 ECMAScript® 2022 Language Specification
[[OwnPropertyKeys]] ownKeys
[[Call]] apply
[[Construct]] construct
When a handler method is called to provide the implementation of a proxy object internal method,
the handler method is passed the proxy's target object as a parameter. A proxy's handler object does
not necessarily have a method corresponding to every essential internal method. Invoking an internal
method on the proxy results in the invocation of the corresponding internal method on the proxy's
target object if the handler object does not have a method corresponding to the internal trap.
The [[ProxyHandler]] and [[ProxyTarget]] internal slots of a proxy object are always initialized when
the object is created and typically may not be modified. Some proxy objects are created in a manner
that permits them to be subsequently revoked. When a proxy is revoked, its [[ProxyHandler]] and
[[ProxyTarget]] internal slots are set to null causing subsequent invocations of internal methods on
that proxy object to throw a TypeError exception.
Because proxy objects permit the implementation of internal methods to be provided by arbitrary
ECMAScript code, it is possible to define a proxy object whose handler methods violates the
invariants defined in 6.1.7.3. Some of the internal method invariants defined in 6.1.7.3 are essential
integrity invariants. These invariants are explicitly enforced by the proxy object internal methods
specified in this section. An ECMAScript implementation must be robust in the presence of all
possible invariant violations.
10.5.1 [[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of a Proxy exotic object O takes no arguments. It performs
the following steps when called:
10.5.2 [[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of a Proxy exotic object O takes argument V (an Object or
null). It performs the following steps when called:
https://tc39.es/ecma262/ 305/490
4/25/2021 ECMAScript® 2022 Language Specification
10.5.3 [[IsExtensible]] ( )
The [[IsExtensible]] internal method of a Proxy exotic object O takes no arguments. It performs the
following steps when called:
https://tc39.es/ecma262/ 306/490
4/25/2021 ECMAScript® 2022 Language Specification
10.5.4 [[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of a Proxy exotic object O takes no arguments. It
performs the following steps when called:
10.5.5 [[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of a Proxy exotic object O takes argument P (a property
key). It performs the following steps when called:
https://tc39.es/ecma262/ 307/490
4/25/2021 ECMAScript® 2022 Language Specification
a. Return ? target.[[GetOwnProperty]](P).
8. Let trapResultObj be ? Call(trap, handler, « target, P »).
9. If Type(trapResultObj) is neither Object nor Undefined, throw a TypeError exception.
10. Let targetDesc be ? target.[[GetOwnProperty]](P).
11. If trapResultObj is undefined, then
a. If targetDesc is undefined, return undefined.
b. If targetDesc.[[Configurable]] is false, throw a TypeError exception.
c. Let extensibleTarget be ? IsExtensible(target).
d. If extensibleTarget is false, throw a TypeError exception.
e. Return undefined.
12. Let extensibleTarget be ? IsExtensible(target).
13. Let resultDesc be ? ToPropertyDescriptor(trapResultObj).
14. Call CompletePropertyDescriptor(resultDesc).
15. Let valid be IsCompatiblePropertyDescriptor(extensibleTarget, resultDesc, targetDesc).
16. If valid is false, throw a TypeError exception.
17. If resultDesc.[[Configurable]] is false, then
a. If targetDesc is undefined or targetDesc.[[Configurable]] is true, then
i. Throw a TypeError exception.
b. If resultDesc has a [[Writable]] field and resultDesc.[[Writable]] is false, then
i. If targetDesc.[[Writable]] is true, throw a TypeError exception.
18. Return resultDesc.
https://tc39.es/ecma262/ 308/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 309/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE
[[DefineOwnProperty]] for proxy objects enforces the following invariants:
10.5.7 [[HasProperty]] ( P )
The [[HasProperty]] internal method of a Proxy exotic object O takes argument P (a property key). It
performs the following steps when called:
https://tc39.es/ecma262/ 310/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE
[[HasProperty]] for proxy objects enforces the following invariants:
The value reported for a property must be the same as the value of the
corresponding target object property if the target object property is a non-
writable, non-configurable own data property.
https://tc39.es/ecma262/ 311/490
4/25/2021 ECMAScript® 2022 Language Specification
w tab e, o co gu ab e ow data p ope ty.
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.
https://tc39.es/ecma262/ 312/490
4/25/2021 ECMAScript® 2022 Language Specification
Cannot set the value of a property if the corresponding target object property is
a non-configurable own accessor property that has undefined as its [[Set]]
attribute.
10.5.10 [[Delete]] ( P )
The [[Delete]] internal method of a Proxy exotic object O takes argument P (a property key). It
performs the following steps when called:
https://tc39.es/ecma262/ 313/490
4/25/2021 ECMAScript® 2022 Language Specification
10.5.11 [[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of a Proxy exotic object O takes no arguments. It
performs the following steps when called:
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.
https://tc39.es/ecma262/ 315/490
4/25/2021 ECMAScript® 2022 Language Specification
The [[Construct]] internal method of a Proxy exotic object O takes arguments argumentsList (a List
of ECMAScript language values) and newTarget (a constructor). It performs the following steps
when called:
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.
https://tc39.es/ecma262/ 316/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
https://tc39.es/ecma262/ 317/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Assert: 0 ≤ cp ≤ 0x10FFFF.
2. If cp ≤ 0xFFFF, return the String value consisting of the code unit whose value is cp.
3. Let cu1 be the code unit whose value is floor((cp - 0x10000) / 0x400) + 0xD800.
4. Let cu2 be the code unit whose value is ((cp - 0x10000) modulo 0x400) + 0xDC00.
5. Return the string-concatenation of cu1 and cu2.
https://tc39.es/ecma262/ 318/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 319/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation StringToCodePoints takes argument string (a String). It returns the sequence
of Unicode code points that results from interpreting string as UTF-16 encoded Unicode text as
described in 6.1.4. It performs the following steps when called:
1. Attempt to parse sourceText using goalSymbol as the goal symbol, and analyse the parse result
for any early error conditions. Parsing and early error detection may be interleaved in an
implementation-defined manner.
2. If the parse succeeded and no early errors were found, return the Parse Node (an instance of
goalSymbol) at the root of the parse tree resulting from the parse.
3. Otherwise, return a List of one or more SyntaxError objects representing the parsing errors
and/or early errors. If more than one parsing error or early error is present, the number and
ordering of error objects in the list is implementation-defined, but at least one must be present.
NOTE 1 Consider a text that has an early error at a particular point, and also a syntax error at
a later point. An implementation that does a parse pass followed by an early errors
pass might report the syntax error and not proceed to the early errors pass. An
implementation that interleaves the two activities might report the early error and
not proceed to find the syntax error. A third implementation might report both
errors. All of these behaviours are conformant.
Global code is source text that is treated as an ECMAScript Script. The global code of a
particular Script does not include any source text that is parsed as part of a
FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression,
AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncGeneratorDeclaration,
AsyncGeneratorExpression, MethodDefinition, ArrowFunction, AsyncArrowFunction,
ClassDeclaration, or ClassExpression.
Eval code is the source text supplied to the built-in eval function. More precisely, if the
parameter to the built-in eval function is a String, it is treated as an ECMAScript Script. The
eval code for a particular invocation of eval is the global code portion of that Script.
Function code is source text that is parsed to supply the value of the [[ECMAScriptCode]] and
[[FormalParameters]] internal slots (see 10.2) of an ECMAScript function object. The function
code of a particular ECMAScript function does not include any source text that is parsed as the
function code of a nested FunctionDeclaration, FunctionExpression, GeneratorDeclaration,
GeneratorExpression, AsyncFunctionDeclaration, AsyncFunctionExpression,
AsyncGeneratorDeclaration, AsyncGeneratorExpression, MethodDefinition, ArrowFunction,
AsyncArrowFunction, ClassDeclaration, or ClassExpression.
then the source text matching the BindingIdentifier (if any) of that declaration or expression is
also included in the function code of the corresponding function.
Module code is source text that is code that is provided as a ModuleBody. It is the code that is
directly evaluated when a module is initialized. The module code of a particular module does
https://tc39.es/ecma262/ 321/490
4/25/2021 ECMAScript® 2022 Language Specification
not include any source text that is parsed as part of a nested FunctionDeclaration,
FunctionExpression, GeneratorDeclaration, GeneratorExpression, AsyncFunctionDeclaration,
AsyncFunctionExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpression,
MethodDefinition, ArrowFunction, AsyncArrowFunction, ClassDeclaration, or
ClassExpression.
NOTE 1 Function code is generally provided as the bodies of Function Definitions (15.2),
Arrow Function Definitions (15.3), Method Definitions (15.4), Generator Function
Definitions (15.5), Async Function Definitions (15.8), Async Generator Function
Definitions (15.6), and Async Arrow Functions (15.9). Function code is also derived
from the arguments to the Function constructor (20.2.1.1), the GeneratorFunction
constructor (27.3.1.1), and the AsyncFunction constructor (27.7.1.1).
NOTE 2 The practical effect of including the BindingIdentifier in function code is that the
Early Errors for strict mode code are applied to a BindingIdentifier that is the name
of a function whose body contains a "use strict" directive, even if the surrounding
code is not strict mode code.
A Directive Prologue may contain more than one Use Strict Directive. However, an implementation
may issue a warning if this occurs.
Global code is strict mode code if it begins with a Directive Prologue that contains a Use Strict
Directive.
Module code is always strict mode code.
All parts of a ClassDeclaration or a ClassExpression are strict mode code.
Eval code is strict mode code if it begins with a Directive Prologue that contains a Use Strict
Directive or if the call to eval is a direct eval that is contained in strict mode code.
Function code is strict mode code if the associated FunctionDeclaration, FunctionExpression,
GeneratorDeclaration, GeneratorExpression, AsyncFunctionDeclaration,
AsyncFunctionExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpression,
MethodDefinition, ArrowFunction, or AsyncArrowFunction is contained in strict mode code or
if the code that produces the value of the function's [[ECMAScriptCode]] internal slot begins
with a Directive Prologue that contains a Use Strict Directive.
Function code that is supplied as the arguments to the built-in Function, Generator,
AsyncFunction, and AsyncGenerator constructors is strict mode code if the last argument is a
String that when processed is a FunctionBody that begins with a Directive Prologue that
contains a Use Strict Directive.
ECMAScript code that is not strict mode code is called non-strict code.
https://tc39.es/ecma262/ 323/490
4/25/2021 ECMAScript® 2022 Language Specification
ECMAScript function is not semantically observable from the perspective of an ECMAScript code
function that calls or is called by such a non-ECMAScript function.
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 12.9); in examples such as the following:
a = b
/hi/g.exec(c).map(d);
a = b / hi / g.exec(c).map(d);
https://tc39.es/ecma262/ 324/490
4/25/2021 ECMAScript® 2022 Language Specification
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
https://tc39.es/ecma262/ 325/490
4/25/2021 ECMAScript® 2022 Language Specification
It is useful to allow format-control characters in source text to facilitate editing and display. All
format control characters may be used within comments, and within string literals, template literals,
and regular expression literals.
U+200C (ZERO WIDTH NON-JOINER) and U+200D (ZERO WIDTH JOINER) are format-
control characters that are used to make necessary distinctions when forming words or phrases in
certain languages. In ECMAScript source text these code points may also be used in an
IdentifierName after the first character.
U+FEFF (ZERO WIDTH NO-BREAK SPACE) is a format-control character used primarily at the
start of a text to mark it as Unicode and to allow detection of the text's encoding and byte order.
<ZWNBSP> characters intended for this purpose can sometimes also appear after the start of a text,
for example as a result of concatenating files. In ECMAScript source text <ZWNBSP> code points
are treated as white space characters (see 12.2).
The special treatment of certain format-control characters outside of comments, string literals, and
regular expression literals is summarized in Table 34.
White space code points are used to improve source text readability and to separate tokens
(indivisible lexical units) from each other, but are otherwise insignificant. White space code points
may occur between any two tokens and at the start or end of input. White space code points may
occur within a StringLiteral, a RegularExpressionLiteral, a Template, or a TemplateSubstitutionTail
where they are considered significant code points forming part of a literal value. They may also
occur within a Comment, but cannot appear within any other kind of token.
The ECMAScript white space code points are listed in Table 35.
Other category “Zs” Any other Unicode “Space_Separator” code point <USP>
NOTE Other than for the code points listed in Table 35, ECMAScript WhiteSpace
intentionally excludes all code points that have the Unicode “White_Space”
property but which are not classified in category “Space_Separator” (“Zs”).
Syntax
WhiteSpace ::
<TAB>
<VT>
https://tc39.es/ecma262/ 327/490
4/25/2021 ECMAScript® 2022 Language Specification
<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 36.
https://tc39.es/ecma262/ 328/490
4/25/2021 ECMAScript® 2022 Language Specification
Only the Unicode code points in Table 36 are treated as line terminators. Other new line or line
breaking Unicode code points are not treated as line terminators but are treated as white space if they
meet the requirements listed in Table 35. The sequence <CR><LF> is commonly used as a line
terminator. It should be considered a single SourceCharacter for the purpose of reporting line
numbers.
Syntax
LineTerminator ::
<LF>
<CR>
<LS>
<PS>
LineTerminatorSequence ::
<LF>
<CR> [lookahead ≠ <LF>]
<LS>
<PS>
<CR> <LF>
12.4 Comments
Comments can be either single or multi-line. Multi-line comments cannot nest.
Because a single-line comment can contain any Unicode code point except a LineTerminator code
point, and because of the general rule that a token is always as long as possible, a single-line
comment always consists of all code points from the // marker to the end of the line. However, the
LineTerminator at the end of the line is not considered to be part of the single-line comment; it is
recognized separately by the lexical grammar and becomes part of the stream of input elements for
the syntactic grammar. This point is very important, because it implies that the presence or absence
of single-line comments does not affect the process of automatic semicolon insertion (see 12.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
https://tc39.es/ecma262/ 329/490
4/25/2021 ECMAScript® 2022 Language Specification
Syntax
Comment ::
MultiLineComment
SingleLineComment
MultiLineComment ::
/* MultiLineCommentCharsopt */
MultiLineCommentChars ::
MultiLineNotAsteriskChar MultiLineCommentCharsopt
* PostAsteriskCommentCharsopt
PostAsteriskCommentChars ::
MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt
* PostAsteriskCommentCharsopt
MultiLineNotAsteriskChar ::
SourceCharacter but not *
MultiLineNotForwardSlashOrAsteriskChar ::
SourceCharacter but not one of / or *
SingleLineComment ::
// SingleLineCommentCharsopt
SingleLineCommentChars ::
SingleLineCommentChar SingleLineCommentCharsopt
SingleLineCommentChar ::
SourceCharacter but not LineTerminator
A number of productions in this section are given alternative definitions in section B.1.3
https://tc39.es/ecma262/ 330/490
4/25/2021 ECMAScript® 2022 Language Specification
12.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 12.8.4). The \ preceding the UnicodeEscapeSequence and the u and
https://tc39.es/ecma262/ 331/490
4/25/2021 ECMAScript® 2022 Language Specification
{ } code units, if they appear, do not contribute code points to the IdentifierName. A
UnicodeEscapeSequence cannot be used to put a code point into an IdentifierName that would
otherwise be illegal. In other words, if a \ UnicodeEscapeSequence sequence were replaced by the
SourceCharacter it contributes, the result must still be a valid IdentifierName that has the exact same
sequence of SourceCharacter elements as the original IdentifierName. All interpretations of
IdentifierName within this specification are based upon their actual code points regardless of
whether or not an escape sequence was used to contribute any particular code point.
Two IdentifierNames that are canonically equivalent according to the Unicode standard are not equal
unless, after replacement of each UnicodeEscapeSequence, they are represented by the exact same
sequence of code points.
Syntax
IdentifierName ::
IdentifierStart
IdentifierName IdentifierPart
IdentifierStart ::
UnicodeIDStart
$
_
\ 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”
https://tc39.es/ecma262/ 332/490
4/25/2021 ECMAScript® 2022 Language Specification
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
A reserved word is an IdentifierName that cannot be used as an identifier. Many keywords are
reserved words, but some are not, and some are reserved only in certain contexts. if and while are
reserved words. await is reserved only inside async functions and modules. async is not reserved;
it can be used as a variable name or statement label without restriction.
https://tc39.es/ecma262/ 333/490
4/25/2021 ECMAScript® 2022 Language Specification
This specification uses a combination of grammatical productions and early error rules to specify
which names are valid identifiers and which are reserved words. All tokens in the ReservedWord list
below, except for await and yield, are unconditionally reserved. Exceptions for await and
yield are specified in 13.1, using parameterized syntactic productions. Lastly, several early error
rules restrict the set of valid identifiers. See 13.1.1, 14.3.1.1, 14.7.5.1, and 15.7.1. In summary, there
are five categories of identifier names:
Those that are always allowed as identifiers, and are not keywords, such as Math, window,
toString, and _;
Those that are never allowed as identifiers, namely the ReservedWords listed below except
await and yield;
Those that are contextually allowed as identifiers, namely await and yield;
Those that are contextually disallowed as identifiers, in strict mode code: let, static,
implements, interface, package, private, protected, and public;
Those that are always allowed as identifiers, but also appear as keywords within certain
syntactic productions, at places where Identifier is not allowed: as, async, from, get, of,
set, and target.
The term conditional keyword, or contextual keyword, is sometimes used to refer to the keywords
that fall in the last three categories, and thus can be used as identifiers in some contexts and as
keywords in others.
Syntax
ReservedWord :: one of
await break case catch class const continue debugger
default delete do else enum export extends false finally
for function if import in instanceof new null return
super switch this throw true try typeof var void while
with yield
NOTE 1 Per 5.1.5, keywords in the grammar match literal sequences of specific
SourceCharacter elements. A code point in a keyword cannot be expressed by a \
UnicodeEscapeSequence.
https://tc39.es/ecma262/ 334/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 2 enum is not currently used as a keyword in this specification. It is a future reserved
word, set aside for use as a keyword in future language extensions.
NOTE 3 The names arguments and eval are not keywords, but they are subject to some
restrictions in strict mode code. See 13.1.1, 8.5.4, 15.2.1, 15.5.1, 15.6.1, and 15.8.1.
12.7 Punctuators
Syntax
Punctuator ::
OptionalChainingPunctuator
OtherPunctuator
OptionalChainingPunctuator ::
?. [lookahead ∉ DecimalDigit]
OtherPunctuator :: one of
{ ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ --
<< >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>=
>>>= &= |= ^= &&= ||= ??= =>
DivPunctuator ::
/
/=
RightBracePunctuator ::
https://tc39.es/ecma262/ 335/490
4/25/2021 ECMAScript® 2022 Language Specification
12.8 Literals
NullLiteral ::
null
BooleanLiteral ::
true
false
NumericLiteralSeparator ::
_
NumericLiteral ::
DecimalLiteral
DecimalBigIntegerLiteral
NonDecimalIntegerLiteral[+Sep]
NonDecimalIntegerLiteral[+Sep] BigIntLiteralSuffix
DecimalBigIntegerLiteral ::
0 BigIntLiteralSuffix
https://tc39.es/ecma262/ 336/490
4/25/2021 ECMAScript® 2022 Language Specification
NonDecimalIntegerLiteral[Sep] ::
BinaryIntegerLiteral[?Sep]
OctalIntegerLiteral[?Sep]
HexIntegerLiteral[?Sep]
BigIntLiteralSuffix ::
n
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigits[+Sep] opt ExponentPart[+Sep] opt
. DecimalDigits[+Sep] ExponentPart[+Sep] opt
DecimalIntegerLiteral ExponentPart[+Sep] opt
DecimalIntegerLiteral ::
0
NonZeroDigit
NonZeroDigit NumericLiteralSeparatoropt DecimalDigits[+Sep]
DecimalDigits[Sep] ::
DecimalDigit
DecimalDigits[?Sep] DecimalDigit
[+Sep] DecimalDigits[+Sep] NumericLiteralSeparator 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[Sep] ::
ExponentIndicator SignedInteger[?Sep]
https://tc39.es/ecma262/ 337/490
4/25/2021 ECMAScript® 2022 Language Specification
ExponentIndicator :: one of
e E
SignedInteger[Sep] ::
DecimalDigits[?Sep]
+ DecimalDigits[?Sep]
- DecimalDigits[?Sep]
BinaryIntegerLiteral[Sep] ::
0b BinaryDigits[?Sep]
0B BinaryDigits[?Sep]
BinaryDigits[Sep] ::
BinaryDigit
BinaryDigits[?Sep] BinaryDigit
[+Sep] BinaryDigits[+Sep] NumericLiteralSeparator BinaryDigit
BinaryDigit :: one of
0 1
OctalIntegerLiteral[Sep] ::
0o OctalDigits[?Sep]
0O OctalDigits[?Sep]
OctalDigits[Sep] ::
OctalDigit
OctalDigits[?Sep] OctalDigit
[+Sep] OctalDigits[+Sep] NumericLiteralSeparator OctalDigit
OctalDigit :: one of
0 1 2 3 4 5 6 7
HexIntegerLiteral[Sep] ::
0x HexDigits[?Sep]
0X HexDigits[?Sep]
https://tc39.es/ecma262/ 338/490
4/25/2021 ECMAScript® 2022 Language Specification
HexDigits[Sep] ::
HexDigit
HexDigits[?Sep] HexDigit
[+Sep] HexDigits[+Sep] NumericLiteralSeparator 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.
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 or the BigInt type.
https://tc39.es/ecma262/ 340/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return the Number value that results from rounding the MV of DecimalLiteral as described
below.
NumericLiteral :: NonDecimalIntegerLiteral
1. Return the Number value that results from rounding the MV of NonDecimalIntegerLiteral 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.1), unless the literal is a DecimalLiteral and the
literal has more than 20 significant digits, in which case the Number value may be either the Number
value for the MV of a literal produced by replacing each significant digit after the 20th with a 0 digit
or the Number value for the MV of a literal produced by replacing each significant digit after the
20th with a 0 digit and then incrementing the literal at the 20th significant digit position. A digit is
significant if it is not part of an ExponentPart and
it is not 0; or
there is a non-zero digit to its left and there is a non-zero digit, not in the ExponentPart, to its
right.
DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix
1. Return 0ℤ.
https://tc39.es/ecma262/ 342/490
4/25/2021 ECMAScript® 2022 Language Specification
DecimalBigIntegerLiteral ::
NonZeroDigit DecimalDigits BigIntLiteralSuffix
NonZeroDigit NumericLiteralSeparator DecimalDigits BigIntLiteralSuffix
NOTE 1 A string literal is 0 or more Unicode code points enclosed in single or double
quotes. Unicode code points may also be represented by an escape sequence. All
code points may appear literally in a string literal except for the closing quote code
points, U+005C (REVERSE SOLIDUS), U+000D (CARRIAGE RETURN), and
U+000A (LINE FEED). Any code points may appear in the form of an escape
sequence. String literals evaluate to ECMAScript String values. When generating
these String values Unicode code points are UTF-16 encoded as defined in 11.1.1.
Code points belonging to the Basic Multilingual Plane are encoded as a single code
unit element of the string. All other code points are encoded as two code unit
elements of the string.
Syntax
StringLiteral ::
" DoubleStringCharactersopt "
' SingleStringCharactersopt '
DoubleStringCharacters ::
DoubleStringCharacter DoubleStringCharactersopt
SingleStringCharacters ::
SingleStringCharacter SingleStringCharactersopt
DoubleStringCharacter ::
SourceCharacter but not one of " or \ or LineTerminator
https://tc39.es/ecma262/ 343/490
4/25/2021 ECMAScript® 2022 Language Specification
<LS>
<PS>
\ EscapeSequence
LineContinuation
SingleStringCharacter ::
SourceCharacter but not one of ' or \ or LineTerminator
<LS>
<PS>
\ EscapeSequence
LineContinuation
LineContinuation ::
\ LineTerminatorSequence
EscapeSequence ::
CharacterEscapeSequence
0 [lookahead ∉ DecimalDigit]
HexEscapeSequence
UnicodeEscapeSequence
A conforming implementation, when processing strict mode code, must not extend the syntax of
EscapeSequence to include LegacyOctalEscapeSequence or NonOctalDecimalEscapeSequence as
described in B.1.2.
CharacterEscapeSequence ::
SingleEscapeCharacter
NonEscapeCharacter
SingleEscapeCharacter :: one of
' " \ b f n r t v
NonEscapeCharacter ::
SourceCharacter but not one of EscapeCharacter or LineTerminator
EscapeCharacter ::
https://tc39.es/ecma262/ 344/490
4/25/2021 ECMAScript® 2022 Language Specification
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 12.8.3. SourceCharacter is defined in 11.1.
NOTE 2 <LF> and <CR> cannot appear in a string literal, except as part of a
LineContinuation to produce the empty code points sequence. The proper way to
include either in the String value of a string literal is to use an escape sequence such
as \n or \u000A.
A string literal stands for a value of the String type. The String value (SV) of the literal is described
in terms of String 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 12.8.3.
.
The SV of DoubleStringCharacter :: SourceCharacter but not one of " or \ or
LineTerminator is the result of performing UTF16EncodeCodePoint on the code point value of
SourceCharacter.
The SV of DoubleStringCharacter :: <LS> is the String value consisting of the code unit
0x2028 (LINE SEPARATOR).
The SV of DoubleStringCharacter :: <PS> is the String value consisting of the code unit
0x2029 (PARAGRAPH SEPARATOR).
The SV of DoubleStringCharacter :: LineContinuation is the empty String.
The SV of SingleStringCharacter :: SourceCharacter but not one of ' or \ or
LineTerminator is the result of performing UTF16EncodeCodePoint on the code point value of
SourceCharacter.
The SV of SingleStringCharacter :: <LS> is the String value consisting of the code unit
0x2028 (LINE SEPARATOR).
The SV of SingleStringCharacter :: <PS> is the String value consisting of the code unit
0x2029 (PARAGRAPH SEPARATOR).
The SV of SingleStringCharacter :: LineContinuation is the empty String.
The SV of EscapeSequence :: 0 is the String value consisting of the code unit 0x0000
(NULL).
The SV of CharacterEscapeSequence :: SingleEscapeCharacter is the String value
consisting of the code unit whose value is determined by the SingleEscapeCharacter according
to Table 37.
NOTE 1 A regular expression literal is an input element that is converted to a RegExp object
(see 22.2) each time the literal is evaluated. Two regular expression literals in a
program evaluate to regular expression objects that never compare as === to each
other even if the two literals' contents are identical. A RegExp object may also be
created at runtime by new RegExp or calling the RegExp constructor as a function
(see 22.2.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
https://tc39.es/ecma262/ 347/490
4/25/2021 ECMAScript® 2022 Language Specification
RegularExpressionBody and the RegularExpressionFlags are subsequently parsed again using the
more stringent ECMAScript Regular Expression grammar (22.2.1).
An implementation may extend the ECMAScript Regular Expression grammar defined in 22.2.1, but
it must not extend the RegularExpressionBody and RegularExpressionFlags productions defined
below or the productions used by these productions.
Syntax
RegularExpressionLiteral ::
/ RegularExpressionBody / RegularExpressionFlags
RegularExpressionBody ::
RegularExpressionFirstChar RegularExpressionChars
RegularExpressionChars ::
[empty]
RegularExpressionChars RegularExpressionChar
RegularExpressionFirstChar ::
RegularExpressionNonTerminator but not one of * or \ or / or [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionChar ::
RegularExpressionNonTerminator but not one of \ or / or [
RegularExpressionBackslashSequence
RegularExpressionClass
RegularExpressionBackslashSequence ::
\ RegularExpressionNonTerminator
RegularExpressionNonTerminator ::
SourceCharacter but not LineTerminator
RegularExpressionClass ::
[ RegularExpressionClassChars ]
https://tc39.es/ecma262/ 348/490
4/25/2021 ECMAScript® 2022 Language Specification
RegularExpressionClassChars ::
[empty]
RegularExpressionClassChars RegularExpressionClassChar
RegularExpressionClassChar ::
RegularExpressionNonTerminator but not one of ] or \
RegularExpressionBackslashSequence
RegularExpressionFlags ::
[empty]
RegularExpressionFlags IdentifierPart
NOTE 2 Regular expression literals may not be empty; instead of representing an empty
regular expression literal, the code unit sequence // starts a single-line comment.
To specify an empty regular expression, use: /(?:)/.
Template ::
https://tc39.es/ecma262/ 349/490
4/25/2021 ECMAScript® 2022 Language Specification
NoSubstitutionTemplate
TemplateHead
NoSubstitutionTemplate ::
` TemplateCharactersopt `
TemplateHead ::
` TemplateCharactersopt ${
TemplateSubstitutionTail ::
TemplateMiddle
TemplateTail
TemplateMiddle ::
} TemplateCharactersopt ${
TemplateTail ::
} TemplateCharactersopt `
TemplateCharacters ::
TemplateCharacter TemplateCharactersopt
TemplateCharacter ::
$ [lookahead ≠ {]
\ EscapeSequence
\ NotEscapeSequence
LineContinuation
LineTerminatorSequence
SourceCharacter but not one of ` or \ or $ or LineTerminator
NotEscapeSequence ::
0 DecimalDigit
DecimalDigit but not 0
x [lookahead ∉ HexDigit]
x HexDigit [lookahead ∉ HexDigit]
https://tc39.es/ecma262/ 350/490
4/25/2021 ECMAScript® 2022 Language Specification
NotCodePoint ::
HexDigits[~Sep] but only if MV of HexDigits > 0x10FFFF
CodePoint ::
HexDigits[~Sep] 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 String values (SV, 12.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, 12.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.
https://tc39.es/ecma262/ 351/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 352/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 353/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE TV excludes the code units of LineContinuation while TRV includes them. <CR>
<LF> and <CR> LineTerminatorSequences are normalized to <LF> for both TV and
TRV. An explicit EscapeSequence is needed to include a <CR> or <CR><LF>
sequence.
https://tc39.es/ecma262/ 354/490
4/25/2021 ECMAScript® 2022 Language Specification
In the following rules, “token” means the actual recognized lexical token determined using the
current lexical goal symbol as described in clause 12.
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 (14.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 14.7.4).
NOTE The following are the only restricted productions in the grammar:
UpdateExpression[Yield, Await] :
LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here]
++
LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here]
--
ContinueStatement[Yield, Await] :
continue ;
https://tc39.es/ecma262/ 355/490
4/25/2021 ECMAScript® 2022 Language Specification
The source
{ 1 2 } 3
is not a valid sentence in the ECMAScript grammar, even with the automatic semicolon insertion
rules. In contrast, the source
{ 1
2 } 3
is also not a valid ECMAScript sentence, but is transformed by automatic semicolon insertion into
the following:
{ 1
;2 ;} 3;
The source
for (a; b
)
is not a valid ECMAScript sentence and is not altered by automatic semicolon insertion because the
semicolon is needed for the header of a for statement. Automatic semicolon insertion never inserts
one of the two semicolons in the header of a for statement.
https://tc39.es/ecma262/ 357/490
4/25/2021 ECMAScript® 2022 Language Specification
The source
return
a + b
return;
a + b;
The source
a = b
++c
a = b;
++c;
NOTE 2 The token ++ is not treated as a postfix operator applying to the variable b, because
a LineTerminator occurs between b and ++.
The source
if (a > b)
else c = d
is not a valid ECMAScript sentence and is not altered by automatic semicolon insertion before the
else token, even though no production of the grammar applies at that point, because an
automatically inserted semicolon would then be parsed as an empty statement.
The source
a = b + c
(d + e).print()
https://tc39.es/ecma262/ 358/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
ECMAScript programs can be written in a style with very few semicolons by relying on automatic
semicolon insertion. As described above, semicolons are not inserted at every newline, and
automatic semicolon insertion can depend on multiple tokens across line terminators.
As new syntactic features are added to ECMAScript, additional grammar productions could be added
that cause lines relying on automatic semicolon insertion preceding them to change grammar
productions when parsed.
For the purposes of this section, a case of automatic semicolon insertion is considered interesting if it
is a place where a semicolon may or may not be inserted, depending on the source text which
precedes it. The rest of this section describes a number of interesting cases of automatic semicolon
insertion in this version of ECMAScript.
An opening parenthesis ((). Without a semicolon, the two lines together are treated as a
CallExpression.
An opening square bracket ([). Without a semicolon, the two lines together are treated as
property access, rather than an ArrayLiteral or ArrayAssignmentPattern.
A template literal (`). Without a semicolon, the two lines together are interpreted as a tagged
Template (13.3.11), with the previous expression as the MemberExpression.
https://tc39.es/ecma262/ 359/490
4/25/2021 ECMAScript® 2022 Language Specification
Unary + or -. Without a semicolon, the two lines together are interpreted as a usage of the
corresponding binary operator.
A RegExp literal. Without a semicolon, the two lines together may be parsed instead as the /
MultiplicativeOperator, for example if the RegExp has flags.
ECMAScript contains grammar productions which include “[no LineTerminator here]”. These
productions are sometimes a means to have optional operands in the grammar. Introducing a
LineTerminator in these locations would change the grammar production of a source text by using
the grammar production without the optional operand.
The rest of this section describes a number of productions using “[no LineTerminator here]” in this
version of ECMAScript.
12.9.3.2.1 List of Grammar Productions with Optional Operands and “[no LineTerminator
here]”
UpdateExpression.
ContinueStatement.
BreakStatement.
ReturnStatement.
YieldExpression.
Async Function Definitions (15.8) with relation to Function Definitions (15.2)
13.1 Identifiers
Syntax
IdentifierReference[Yield, Await] :
Identifier
https://tc39.es/ecma262/ 360/490
4/25/2021 ECMAScript® 2022 Language Specification
[~Yield] yield
[~Await] await
BindingIdentifier[Yield, Await] :
Identifier
yield
await
LabelIdentifier[Yield, Await] :
Identifier
[~Yield] yield
[~Await] await
Identifier :
IdentifierName but not ReservedWord
NOTE yield and await are permitted as BindingIdentifier in the grammar, and
prohibited with static semantics below, to prohibit automatic semicolon insertion in
cases such as
let
await 0;
It is a Syntax Error if the code matched by this production is contained in strict mode code and
the StringValue of Identifier is "arguments" or "eval".
IdentifierReference : yield
BindingIdentifier : yield
LabelIdentifier : yield
It is a Syntax Error if the code matched by this production is contained in strict mode code.
https://tc39.es/ecma262/ 361/490
4/25/2021 ECMAScript® 2022 Language Specification
IdentifierReference : await
BindingIdentifier : await
LabelIdentifier : await
It is a Syntax Error if this production has a [Yield] parameter and StringValue of Identifier is
"yield".
It is a Syntax Error if this production has an [Await] parameter and StringValue of Identifier is
"await".
It is a Syntax Error if this phrase is contained in strict mode code and the StringValue of
IdentifierName is: "implements", "interface", "let", "package", "private", "protected",
"public", "static", or "yield".
It is a Syntax Error if the goal symbol of the syntactic grammar is Module and the StringValue
of IdentifierName is "await".
It is a Syntax Error if StringValue of IdentifierName is the same String value as the StringValue
of any ReservedWord except for yield or await.
https://tc39.es/ecma262/ 362/490
4/25/2021 ECMAScript® 2022 Language Specification
IdentifierReference : yield
BindingIdentifier : yield
LabelIdentifier : yield
1. Return "yield".
IdentifierReference : await
BindingIdentifier : await
LabelIdentifier : await
1. Return "await".
IdentifierReference : yield
1. Return ? ResolveBinding("yield").
IdentifierReference : await
1. Return ? ResolveBinding("await").
https://tc39.es/ecma262/ 363/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 2 In non-strict code, the keyword yield may be used as an identifier. Evaluating the
IdentifierReference resolves the binding of yield as if it was an Identifier. Early
Error restriction ensures that such an evaluation only can occur for non-strict code.
PrimaryExpression[Yield, Await] :
this
IdentifierReference[?Yield, ?Await]
Literal
ArrayLiteral[?Yield, ?Await]
ObjectLiteral[?Yield, ?Await]
FunctionExpression
ClassExpression[?Yield, ?Await]
GeneratorExpression
AsyncFunctionExpression
AsyncGeneratorExpression
RegularExpressionLiteral
TemplateLiteral[?Yield, ?Await, ~Tagged]
CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] :
( Expression[+In, ?Yield, ?Await] )
( Expression[+In, ?Yield, ?Await] , )
( )
( ... BindingIdentifier[?Yield, ?Await] )
( ... BindingPattern[?Yield, ?Await] )
https://tc39.es/ecma262/ 364/490
4/25/2021 ECMAScript® 2022 Language Specification
Supplemental Syntax
ParenthesizedExpression[Yield, Await] :
( Expression[+In, ?Yield, ?Await] )
1. Return ? ResolveThisBinding().
13.2.3 Literals
Syntax
Literal :
NullLiteral
BooleanLiteral
NumericLiteral
https://tc39.es/ecma262/ 365/490
4/25/2021 ECMAScript® 2022 Language Specification
StringLiteral
1. Return null.
Literal : BooleanLiteral
Literal : NumericLiteral
Literal : StringLiteral
Array elements may be elided at the beginning, middle or end of the element list. Whenever a
comma in the element list is not preceded by an AssignmentExpression (i.e., a comma at the
beginning or after another comma), the missing array element contributes to the length of the Array
and increases the index of subsequent elements. Elided array elements are not defined. If an element
is elided at the end of an array, that element does not contribute to the length of the Array.
Syntax
ArrayLiteral[Yield, Await] :
[ Elisionopt ]
https://tc39.es/ecma262/ 366/490
4/25/2021 ECMAScript® 2022 Language Specification
[ ElementList[?Yield, ?Await] ]
[ ElementList[?Yield, ?Await] , Elisionopt ]
ElementList[Yield, Await] :
Elisionopt AssignmentExpression[+In, ?Yield, ?Await]
Elisionopt SpreadElement[?Yield, ?Await]
ElementList[?Yield, ?Await] , Elisionopt
AssignmentExpression[+In, ?Yield, ?Await]
ElementList[?Yield, ?Await] , Elisionopt
SpreadElement[?Yield, ?Await]
Elision :
,
Elision ,
SpreadElement[Yield, Await] :
... AssignmentExpression[+In, ?Yield, ?Await]
Elision : ,
Elision : Elision ,
1. Return the result of performing ArrayAccumulation for Elision with arguments array and
nextIndex + 1.
https://tc39.es/ecma262/ 367/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Set nextIndex to the result of performing ArrayAccumulation for ElementList with arguments
array and nextIndex.
2. ReturnIfAbrupt(nextIndex).
3. If Elision is present, then
a. Set nextIndex to the result of performing ArrayAccumulation for Elision with arguments
array and nextIndex.
b. ReturnIfAbrupt(nextIndex).
4. Let initResult be the result of evaluating AssignmentExpression.
5. Let initValue be ? GetValue(initResult).
6. Let created be ! CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue).
7. Return nextIndex + 1.
1. Set nextIndex to the result of performing ArrayAccumulation for ElementList with arguments
array and nextIndex.
2. ReturnIfAbrupt(nextIndex).
3. If Elision is present, then
https://tc39.es/ecma262/ 368/490
4/25/2021 ECMAScript® 2022 Language Specification
a. Set nextIndex to the result of performing ArrayAccumulation for Elision with arguments
array and nextIndex.
b. ReturnIfAbrupt(nextIndex).
4. Return the result of performing ArrayAccumulation for SpreadElement with arguments array
and nextIndex.
NOTE CreateDataPropertyOrThrow is used to ensure that own properties are defined for
the array even if the standard built-in Array prototype object has been modified in a
manner that would preclude the creation of new own properties using [[Set]].
ArrayLiteral : [ ElementList ]
3. ReturnIfAbrupt(len).
4. Return array.
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] :
https://tc39.es/ecma262/ 370/490
4/25/2021 ECMAScript® 2022 Language Specification
IdentifierReference[?Yield, ?Await]
CoverInitializedName[?Yield, ?Await]
PropertyName[?Yield, ?Await] :
AssignmentExpression[+In, ?Yield, ?Await]
MethodDefinition[?Yield, ?Await]
... AssignmentExpression[+In, ?Yield, ?Await]
PropertyName[Yield, Await] :
LiteralPropertyName
ComputedPropertyName[?Yield, ?Await]
LiteralPropertyName :
IdentifierName
StringLiteral
NumericLiteral
ComputedPropertyName[Yield, Await] :
[ AssignmentExpression[+In, ?Yield, ?Await] ]
CoverInitializedName[Yield, Await] :
IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]
NOTE 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.
1. Return false.
PropertyName : ComputedPropertyName
1. Return true.
1. Return ! OrdinaryObjectCreate(%Object.prototype%).
ObjectLiteral :
{ PropertyDefinitionList }
{ PropertyDefinitionList , }
LiteralPropertyName : IdentifierName
LiteralPropertyName : StringLiteral
LiteralPropertyName : NumericLiteral
ComputedPropertyName : [ AssignmentExpression ]
https://tc39.es/ecma262/ 373/490
4/25/2021 ECMAScript® 2022 Language Specification
PropertyDefinition : IdentifierReference
MethodDefinition :
PropertyName ( UniqueFormalParameters ) { FunctionBody }
https://tc39.es/ecma262/ 374/490
4/25/2021 ECMAScript® 2022 Language Specification
See 12.8.5.
https://tc39.es/ecma262/ 375/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
It is a Syntax Error if the [Tagged] parameter was not set and TemplateTail Contains
NotEscapeSequence.
It is a Syntax Error if the [Tagged] parameter was not set and TemplateMiddle Contains
NotEscapeSequence.
TemplateLiteral : NoSubstitutionTemplate
TemplateSpans : TemplateTail
https://tc39.es/ecma262/ 378/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 2 Each TemplateLiteral in the program code of a realm is associated with a unique
template object that is used in the evaluation of tagged Templates (13.2.8.5). 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.
https://tc39.es/ecma262/ 380/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 1 The string conversion semantics applied to the Expression value are like
String.prototype.concat rather than the + operator.
TemplateSpans : TemplateTail
https://tc39.es/ecma262/ 381/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 2 The string conversion semantics applied to the Expression value are like
String.prototype.concat rather than the + operator.
NOTE 3 The string conversion semantics applied to the Expression value are like
String.prototype.concat rather than the + operator.
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
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] ]
MemberExpression[?Yield, ?Await] . IdentifierName
MemberExpression[?Yield, ?Await]
TemplateLiteral[?Yield, ?Await, +Tagged]
SuperProperty[?Yield, ?Await]
https://tc39.es/ecma262/ 383/490
4/25/2021 ECMAScript® 2022 Language Specification
MetaProperty
new MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
SuperProperty[Yield, Await] :
super [ Expression[+In, ?Yield, ?Await] ]
super . IdentifierName
MetaProperty :
NewTarget
ImportMeta
NewTarget :
new . target
ImportMeta :
import . meta
NewExpression[Yield, Await] :
MemberExpression[?Yield, ?Await]
new NewExpression[?Yield, ?Await]
CallExpression[Yield, Await] :
CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await]
SuperCall[?Yield, ?Await]
ImportCall[?Yield, ?Await]
CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
CallExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ]
CallExpression[?Yield, ?Await] . IdentifierName
CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
SuperCall[Yield, Await] :
super Arguments[?Yield, ?Await]
ImportCall[Yield, Await] :
import ( AssignmentExpression[+In, ?Yield, ?Await] )
https://tc39.es/ecma262/ 384/490
4/25/2021 ECMAScript® 2022 Language Specification
Arguments[Yield, Await] :
( )
( ArgumentList[?Yield, ?Await] )
( ArgumentList[?Yield, ?Await] , )
ArgumentList[Yield, Await] :
AssignmentExpression[+In, ?Yield, ?Await]
... AssignmentExpression[+In, ?Yield, ?Await]
ArgumentList[?Yield, ?Await] ,
AssignmentExpression[+In, ?Yield, ?Await]
ArgumentList[?Yield, ?Await] , ...
AssignmentExpression[+In, ?Yield, ?Await]
OptionalExpression[Yield, Await] :
MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await]
CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await]
OptionalExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await]
OptionalChain[Yield, Await] :
?. Arguments[?Yield, ?Await]
?. [ Expression[+In, ?Yield, ?Await] ]
?. IdentifierName
?. TemplateLiteral[?Yield, ?Await, +Tagged]
OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await]
OptionalChain[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ]
OptionalChain[?Yield, ?Await] . IdentifierName
OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
LeftHandSideExpression[Yield, Await] :
NewExpression[?Yield, ?Await]
CallExpression[?Yield, ?Await]
OptionalExpression[?Yield, ?Await]
https://tc39.es/ecma262/ 385/490
4/25/2021 ECMAScript® 2022 Language Specification
Supplemental Syntax
CallMemberExpression[Yield, Await] :
MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]
NOTE This production exists in order to prevent automatic semicolon insertion rules (12.9)
from being applied to the following code:
a?.b
`c`
a.b
`c`
which is a valid statement and where automatic semicolon insertion does not apply.
ImportMeta :
import . meta
https://tc39.es/ecma262/ 386/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE Properties are accessed by name, using either the dot notation:
MemberExpression . IdentifierName
CallExpression . IdentifierName
MemberExpression [ Expression ]
CallExpression [ Expression ]
MemberExpression . IdentifierName
MemberExpression [ <identifier-name-string> ]
and similarly
CallExpression . IdentifierName
CallExpression [ <identifier-name-string> ]
https://tc39.es/ecma262/ 387/490
4/25/2021 ECMAScript® 2022 Language Specification
3. If the code matched by this MemberExpression is strict mode code, let strict be true; else let
strict be false.
4. Return ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict).
https://tc39.es/ecma262/ 388/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation EvaluateNew takes arguments constructExpr and arguments. It performs the
following steps when called:
https://tc39.es/ecma262/ 389/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 390/490
4/25/2021 ECMAScript® 2022 Language Specification
The abstract operation EvaluateCall takes arguments func (an ECMAScript language value), ref (an
ECMAScript language value or a Reference Record), arguments (a Parse Node), and tailPosition (a
Boolean). It performs the following steps when called:
https://tc39.es/ecma262/ 391/490
4/25/2021 ECMAScript® 2022 Language Specification
13.3.7.2 GetSuperConstructor ( )
The abstract operation GetSuperConstructor takes no arguments. It performs the following steps
when called:
ArgumentList : AssignmentExpression
5. Repeat,
a. Let next be ? IteratorStep(iteratorRecord).
b. If next is false, return list.
c. Let nextArg be ? IteratorValue(next).
d. Append nextArg as the last element of list.
TemplateLiteral : NoSubstitutionTemplate
TemplateLiteral : SubstitutionTemplate
https://tc39.es/ecma262/ 394/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE An optional chain is a chain of one or more property accesses and function calls, the
first of which begins with the token ?..
OptionalExpression :
CallExpression OptionalChain
OptionalExpression :
https://tc39.es/ecma262/ 395/490
4/25/2021 ECMAScript® 2022 Language Specification
OptionalExpression OptionalChain
OptionalChain : ?. Arguments
OptionalChain : ?. [ Expression ]
1. If the code matched by this OptionalChain is strict mode code, let strict be true; else let strict
be false.
2. Return ? EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict).
OptionalChain : ?. IdentifierName
1. If the code matched by this OptionalChain is strict mode code, let strict be true; else let strict
be false.
2. Return ? EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict).
https://tc39.es/ecma262/ 397/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE A tagged template is a function call where the arguments of the call are derived
from a TemplateLiteral (13.2.8). The actual arguments include a template object
(13.2.8.3) and the values produced by evaluating the expressions embedded within
the TemplateLiteral.
1. Return GetNewTarget().
It must return a List, whose values are all Records with two fields, [[Key]] and [[Value]].
Each such Record's [[Key]] field must be a property key, i.e., IsPropertyKey must return true
when applied to it.
Each such Record's [[Value]] field must be an ECMAScript value.
It must always complete normally (i.e., not return an abrupt completion).
https://tc39.es/ecma262/ 399/490
4/25/2021 ECMAScript® 2022 Language Specification
UpdateExpression[Yield, Await] :
LeftHandSideExpression[?Yield, ?Await]
LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++
LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] --
++ UnaryExpression[?Yield, ?Await]
-- UnaryExpression[?Yield, ?Await]
UpdateExpression :
++ UnaryExpression
-- UnaryExpression
UnaryExpression[Yield, Await] :
UpdateExpression[?Yield, ?Await]
delete UnaryExpression[?Yield, ?Await]
void UnaryExpression[?Yield, ?Await]
typeof UnaryExpression[?Yield, ?Await]
+ UnaryExpression[?Yield, ?Await]
- UnaryExpression[?Yield, ?Await]
~ UnaryExpression[?Yield, ?Await]
! UnaryExpression[?Yield, ?Await]
[+Await] AwaitExpression[?Yield]
It is a Syntax Error if the UnaryExpression is contained in strict mode code and the derived
UnaryExpression is PrimaryExpression : IdentifierReference .
https://tc39.es/ecma262/ 402/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE
The last rule means that expressions such as delete (((foo))) produce early
errors because of recursive application of the first rule.
NOTE 1 When a delete operator occurs within strict mode code, a SyntaxError exception
is thrown if its UnaryExpression is a direct reference to a variable, function
argument, or function name. In addition, if a delete operator occurs within strict
mode code and the property to be deleted has the attribute { [[Configurable]]: false
} (or otherwise cannot be deleted), a TypeError exception is thrown.
NOTE 2 The object that may be created in step 5.b is not accessible outside of the above
abstract operation and the ordinary object [[Delete]] internal method. An
implementation might choose to avoid the actual creation of that object.
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"
BigInt "bigint"
https://tc39.es/ecma262/ 404/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE The unary - operator converts its operand to Number type and then negates it.
Negating +0𝔽 produces -0𝔽, and negating -0𝔽 produces +0𝔽.
https://tc39.es/ecma262/ 405/490
4/25/2021 ECMAScript® 2022 Language Specification
UnaryExpression : ~ UnaryExpression
ExponentiationExpression[Yield, Await] :
UnaryExpression[?Yield, ?Await]
UpdateExpression[?Yield, ?Await] **
ExponentiationExpression[?Yield, ?Await]
Syntax
MultiplicativeExpression[Yield, Await] :
ExponentiationExpression[?Yield, ?Await]
MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator
ExponentiationExpression[?Yield, ?Await]
MultiplicativeOperator : one of
* / %
NOTE
The * operator performs multiplication, producing the product of its operands.
The / operator performs division, producing the quotient of its operands.
The % operator yields the remainder of its operands from an implied division.
AdditiveExpression[Yield, Await] :
MultiplicativeExpression[?Yield, ?Await]
AdditiveExpression[?Yield, ?Await] +
MultiplicativeExpression[?Yield, ?Await]
AdditiveExpression[?Yield, ?Await] -
MultiplicativeExpression[?Yield, ?Await]
https://tc39.es/ecma262/ 407/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE The addition operator either performs string concatenation or numeric addition.
1. Return ? EvaluateStringOrNumericBinaryExpression(AdditiveExpression, +,
MultiplicativeExpression).
NOTE The - operator performs subtraction, producing the difference of its operands.
1. Return ? EvaluateStringOrNumericBinaryExpression(AdditiveExpression, -,
MultiplicativeExpression).
ShiftExpression[Yield, Await] :
AdditiveExpression[?Yield, ?Await]
ShiftExpression[?Yield, ?Await] << AdditiveExpression[?Yield, ?Await]
ShiftExpression[?Yield, ?Await] >> AdditiveExpression[?Yield, ?Await]
ShiftExpression[?Yield, ?Await] >>> AdditiveExpression[?Yield, ?Await]
Performs a bitwise left shift operation on the left operand by the amount specified
https://tc39.es/ecma262/ 408/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE
by the right operand.
NOTE Performs a sign-filling bitwise right shift operation on the left operand by the
amount specified by the right operand.
NOTE Performs a zero-filling bitwise right shift operation on the left operand by the
amount specified by the right operand.
Syntax
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.
https://tc39.es/ecma262/ 410/490
4/25/2021 ECMAScript® 2022 Language Specification
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
https://tc39.es/ecma262/ 413/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 3 The equality operator is not always transitive. For example, there might be two
distinct String objects, each representing the same String value; each String object
would be considered equal to the String value by the == operator, but the two String
objects would not be equal to each other. For example:
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.
https://tc39.es/ecma262/ 415/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return ? EvaluateStringOrNumericBinaryExpression(BitwiseXORExpression, ^,
BitwiseANDExpression).
1. Return ? EvaluateStringOrNumericBinaryExpression(BitwiseORExpression, |,
BitwiseXORExpression).
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.
https://tc39.es/ecma262/ 417/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 418/490
4/25/2021 ECMAScript® 2022 Language Specification
AssignmentOperator : one of
*= /= %= += -= <<= >>= >>>= &= ^= |= **=
AssignmentExpression :
LeftHandSideExpression AssignmentOperator AssignmentExpression
LeftHandSideExpression &&= AssignmentExpression
LeftHandSideExpression ||= AssignmentExpression
https://tc39.es/ecma262/ 419/490
4/25/2021 ECMAScript® 2022 Language Specification
assignmentOpText opText
https://tc39.es/ecma262/ 420/490
4/25/2021 ECMAScript® 2022 Language Specification
**= **
*= *
/= /
%= %
+= +
-= -
<<= <<
>>= >>
>>>= >>>
&= &
^= ^
|= |
NOTE When this expression occurs within strict mode code, it is a runtime error if lref in
step 1.e, 2, 2, 2, 2 is an unresolvable reference. If it is, a ReferenceError exception
is thrown. Additionally, it is a runtime error if the lref in step 8, 7, 7, 6 is a reference
to a data property with the attribute value { [[Writable]]: false }, to an accessor
property with the attribute value { [[Set]]: undefined }, or to a non-existent
property of an object for which the IsExtensible predicate returns the value false. In
these cases a TypeError exception is thrown.
https://tc39.es/ecma262/ 422/490
4/25/2021 ECMAScript® 2022 Language Specification
opText operation
** T::exponentiate
* T::multiply
/ T::divide
% T::remainder
+ T::add
- T::subtract
<< T::leftShift
>> T::signedRightShift
>>> T::unsignedRightShift
& T::bitwiseAND
^ T::bitwiseXOR
| T::bitwiseOR
https://tc39.es/ecma262/ 423/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE 1 No hint is provided in the calls to ToPrimitive in steps 2.a and 2.b. All standard
objects except Date objects handle the absence of a hint as if number were given;
Date objects handle the absence of a hint as if string were given. Exotic objects may
handle the absence of a hint in some other manner.
NOTE 2 Step 2.c differs from step 3 of the Abstract Relational Comparison algorithm, by
using the logical-or operation instead of the logical-and operation.
AssignmentPattern[Yield, Await] :
ObjectAssignmentPattern[?Yield, ?Await]
ArrayAssignmentPattern[?Yield, ?Await]
ObjectAssignmentPattern[Yield, Await] :
https://tc39.es/ecma262/ 424/490
4/25/2021 ECMAScript® 2022 Language Specification
{ }
{ AssignmentRestProperty[?Yield, ?Await] }
{ AssignmentPropertyList[?Yield, ?Await] }
{ AssignmentPropertyList[?Yield, ?Await] ,
AssignmentRestProperty[?Yield, ?Await] opt }
ArrayAssignmentPattern[Yield, Await] :
[ Elisionopt AssignmentRestElement[?Yield, ?Await] opt ]
[ AssignmentElementList[?Yield, ?Await] ]
[ AssignmentElementList[?Yield, ?Await] , Elisionopt
AssignmentRestElement[?Yield, ?Await] opt ]
AssignmentRestProperty[Yield, Await] :
... DestructuringAssignmentTarget[?Yield, ?Await]
AssignmentPropertyList[Yield, Await] :
AssignmentProperty[?Yield, ?Await]
AssignmentPropertyList[?Yield, ?Await] ,
AssignmentProperty[?Yield, ?Await]
AssignmentElementList[Yield, Await] :
AssignmentElisionElement[?Yield, ?Await]
AssignmentElementList[?Yield, ?Await] ,
AssignmentElisionElement[?Yield, ?Await]
AssignmentElisionElement[Yield, Await] :
Elisionopt AssignmentElement[?Yield, ?Await]
AssignmentProperty[Yield, Await] :
IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] opt
PropertyName[?Yield, ?Await] : AssignmentElement[?Yield, ?Await]
AssignmentElement[Yield, Await] :
https://tc39.es/ecma262/ 425/490
4/25/2021 ECMAScript® 2022 Language Specification
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).
https://tc39.es/ecma262/ 426/490
4/25/2021 ECMAScript® 2022 Language Specification
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 ]
https://tc39.es/ecma262/ 427/490
4/25/2021 ECMAScript® 2022 Language Specification
ArrayAssignmentPattern : [ AssignmentElementList ]
ObjectAssignmentPattern : { AssignmentRestProperty }
1. Perform ? RequireObjectCoercible(value).
2. Let excludedNames be a new empty List.
3. Return the result of performing RestDestructuringAssignmentEvaluation of
AssignmentRestProperty with value and excludedNames as the arguments.
https://tc39.es/ecma262/ 428/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Perform ? RequireObjectCoercible(value).
2. Let excludedNames be ? PropertyDestructuringAssignmentEvaluation of
AssignmentPropertyList with argument value.
3. Return the result of performing RestDestructuringAssignmentEvaluation of
AssignmentRestProperty with arguments value and excludedNames.
NOTE The following operations collect a list of all destructured property names.
https://tc39.es/ecma262/ 429/490
4/25/2021 ECMAScript® 2022 Language Specification
AssignmentElementList : AssignmentElisionElement
AssignmentElisionElement : AssignmentElement
https://tc39.es/ecma262/ 430/490
4/25/2021 ECMAScript® 2022 Language Specification
Elision : ,
Elision : Elision ,
https://tc39.es/ecma262/ 432/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE GetValue must be called even though its value is not used because it may have
observable side-effects.
https://tc39.es/ecma262/ 434/490
4/25/2021 ECMAScript® 2022 Language Specification
Declaration[Yield, Await] :
HoistableDeclaration[?Yield, ?Await, ~Default]
ClassDeclaration[?Yield, ?Await, ~Default]
LexicalDeclaration[+In, ?Yield, ?Await]
https://tc39.es/ecma262/ 435/490
4/25/2021 ECMAScript® 2022 Language Specification
AsyncGeneratorDeclaration
1. Return NormalCompletion(empty).
HoistableDeclaration : FunctionDeclaration
BreakableStatement :
IterationStatement
SwitchStatement
14.2 Block
Syntax
https://tc39.es/ecma262/ 436/490
4/25/2021 ECMAScript® 2022 Language Specification
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:
https://tc39.es/ecma262/ 437/490
4/25/2021 ECMAScript® 2022 Language Specification
eval("1;;;;;")
eval("1;{}")
eval("1;var a;")
The abstract operation BlockDeclarationInstantiation takes arguments code (a Parse Node) and env
(an Environment Record). code is the Parse Node corresponding to the body of the block. env is the
Environment Record in which bindings are to be created. It performs the following steps when
called:
https://tc39.es/ecma262/ 438/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE let and const declarations define variables that are scoped to the running
execution context's LexicalEnvironment. The variables are created when their
containing Environment Record is instantiated but may not be accessed in any way
until the variable's LexicalBinding is evaluated. A variable defined by a
LexicalBinding with an Initializer is assigned the value of its Initializer's
AssignmentExpression when the LexicalBinding is evaluated, not when the variable
is created. If a LexicalBinding in a let declaration does not have an Initializer the
variable is assigned the value undefined when the LexicalBinding is evaluated.
Syntax
LetOrConst :
let
const
https://tc39.es/ecma262/ 439/490
4/25/2021 ECMAScript® 2022 Language Specification
LexicalBinding : BindingIdentifier
NOTE A static semantics rule ensures that this form of LexicalBinding never occurs in a
const declaration.
https://tc39.es/ecma262/ 440/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE A var statement declares variables that are scoped to the running execution
context's VariableEnvironment. Var variables are created when their containing
Environment Record is instantiated and are initialized to undefined when created.
Within the scope of any VariableEnvironment a common BindingIdentifier may
appear in more than one VariableDeclaration but those declarations collectively
define only one variable. A variable defined by a VariableDeclaration with an
Initializer is assigned the value of its Initializer's AssignmentExpression when the
VariableDeclaration is executed, not when the variable is created.
Syntax
VariableStatement[Yield, Await] :
var VariableDeclarationList[+In, ?Yield, ?Await] ;
3. Return NormalCompletion(empty).
VariableDeclaration : BindingIdentifier
1. Return NormalCompletion(empty).
BindingPattern[Yield, Await] :
ObjectBindingPattern[?Yield, ?Await]
ArrayBindingPattern[?Yield, ?Await]
ObjectBindingPattern[Yield, Await] :
{ }
{ BindingRestProperty[?Yield, ?Await] }
{ BindingPropertyList[?Yield, ?Await] }
{ BindingPropertyList[?Yield, ?Await] ,
BindingRestProperty[?Yield, ?Await] opt }
ArrayBindingPattern[Yield, Await] :
[ Elisionopt BindingRestElement[?Yield, ?Await] opt ]
[ BindingElementList[?Yield, ?Await] ]
[ BindingElementList[?Yield, ?Await] , Elisionopt
BindingRestElement[?Yield, ?Await] opt ]
BindingRestProperty[Yield, Await] :
... BindingIdentifier[?Yield, ?Await]
BindingPropertyList[Yield, Await] :
BindingProperty[?Yield, ?Await]
BindingPropertyList[?Yield, ?Await] , BindingProperty[?Yield, ?Await]
BindingElementList[Yield, Await] :
BindingElisionElement[?Yield, ?Await]
BindingElementList[?Yield, ?Await] ,
BindingElisionElement[?Yield, ?Await]
BindingElisionElement[Yield, Await] :
Elisionopt BindingElement[?Yield, ?Await]
BindingProperty[Yield, Await] :
SingleNameBinding[?Yield, ?Await]
https://tc39.es/ecma262/ 443/490
4/25/2021 ECMAScript® 2022 Language Specification
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]
NOTE These collect a list of all bound property names rather than just empty completion.
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 List whose sole element is name.
https://tc39.es/ecma262/ 444/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
https://tc39.es/ecma262/ 445/490
4/25/2021 ECMAScript® 2022 Language Specification
EmptyStatement :
;
1. Return NormalCompletion(empty).
ExpressionStatement[Yield, Await] :
[lookahead ∉ { { , function , async [no LineTerminator here] function ,
class , let [ }] Expression[+In, ?Yield, ?Await] ;
https://tc39.es/ecma262/ 446/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE The lookahead-restriction [lookahead ≠ else] resolves the classic "dangling else"
problem in the usual way. That is, when the choice of associated if is otherwise
ambiguous, the else is associated with the nearest (innermost) of the candidate
ifs
https://tc39.es/ecma262/ 447/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE It is only necessary to apply this rule if the extension specified in B.3.2 is
implemented.
Syntax
14.7.1 Semantics
The abstract operation LoopContinues takes arguments completion and labelSet. It performs the
following steps when called:
IterationStatement : DoWhileStatement
IterationStatement : WhileStatement
https://tc39.es/ecma262/ 449/490
4/25/2021 ECMAScript® 2022 Language Specification
IterationStatement : ForStatement
IterationStatement : ForInOfStatement
NOTE It is only necessary to apply this rule if the extension specified in B.3.2 is
implemented.
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.
https://tc39.es/ecma262/ 450/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE It is only necessary to apply this rule if the extension specified in B.3.2 is
implemented.
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]].
Syntax
NOTE It is only necessary to apply this rule if the extension specified in B.3.2 is
implemented.
It is a Syntax Error if any element of the BoundNames of LexicalDeclaration also occurs in the
VarDeclaredNames of Statement.
https://tc39.es/ecma262/ 452/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 453/490
4/25/2021 ECMAScript® 2022 Language Specification
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).
ForDeclaration[Yield, Await] :
LetOrConst ForBinding[?Yield, ?Await]
ForBinding[Yield, Await] :
BindingIdentifier[?Yield, ?Await]
BindingPattern[?Yield, ?Await]
NOTE It is only necessary to apply this rule if the extension specified in B.3.2 is
implemented.
ForInOfStatement :
for ( LeftHandSideExpression in Expression ) Statement
https://tc39.es/ecma262/ 456/490
4/25/2021 ECMAScript® 2022 Language Specification
ForInOfStatement :
for ( ForDeclaration in Expression ) Statement
for ( ForDeclaration of AssignmentExpression ) Statement
for await ( ForDeclaration of AssignmentExpression ) Statement
MemberExpression :
MemberExpression [ Expression ]
MemberExpression . IdentifierName
MemberExpression TemplateLiteral
SuperProperty
MetaProperty
https://tc39.es/ecma262/ 457/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return false.
ForBinding : BindingIdentifier
1. Return false.
ForBinding : BindingPattern
1. Return true.
NOTE undefined is passed for environment to indicate that a PutValue operation should be
used to assign the initialization value. This is the case for var statements and the
formal parameter lists of some non-strict functions (see 10.2.10). 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.
https://tc39.es/ecma262/ 458/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 459/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 460/490
4/25/2021 ECMAScript® 2022 Language Specification
3. Let V be undefined.
4. Let destructuring be IsDestructuring of lhs.
5. If destructuring is true and if lhsKind is assignment, then
a. Assert: lhs is a LeftHandSideExpression.
b. Let assignmentPattern be the AssignmentPattern that is covered by lhs.
6. Repeat,
a. Let nextResult be ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]).
b. If iteratorKind is async, set nextResult to ? Await(nextResult).
c. If Type(nextResult) is not Object, throw a TypeError exception.
d. Let done be ? IteratorComplete(nextResult).
e. If done is true, return NormalCompletion(V).
f. Let nextValue be ? IteratorValue(nextResult).
g. If lhsKind is either assignment or varBinding, then
i. If destructuring is false, then
1. Let lhsRef be the result of evaluating lhs. (It may be evaluated repeatedly.)
h. Else,
i. Assert: lhsKind is lexicalBinding.
ii. Assert: lhs is a ForDeclaration.
iii. Let iterationEnv be NewDeclarativeEnvironment(oldEnv).
iv. Perform ForDeclarationBindingInstantiation for lhs passing iterationEnv as the
argument.
v. Set the running execution context's LexicalEnvironment to iterationEnv.
vi. If destructuring is false, then
1. Assert: lhs binds a single name.
2. Let lhsName be the sole element of BoundNames of lhs.
3. Let lhsRef be ! ResolveBinding(lhsName).
i. If destructuring is false, then
i. If lhsRef is an abrupt completion, then
1. Let status be lhsRef.
ii. Else if lhsKind is lexicalBinding, then
1. Let status be InitializeReferencedBinding(lhsRef, nextValue).
iii. Else,
1. Let status be PutValue(lhsRef, nextValue).
j. Else,
i. If lhsKind is assignment, then
https://tc39.es/ecma262/ 462/490
4/25/2021 ECMAScript® 2022 Language Specification
14.7.5.9 EnumerateObjectProperties ( O )
The abstract operation EnumerateObjectProperties takes argument O. It performs the following steps
when called:
The iterator's throw and return methods are null and are never invoked. The iterator's next
method processes object properties to determine whether the property key should be returned as an
iterator value. Returned property keys do not include keys that are Symbols. Properties of the target
object may be deleted during enumeration. A property that is deleted before it is processed by the
iterator's next method is ignored. If new properties are added to the target object during
enumeration, the newly added properties are not guaranteed to be processed in the active
enumeration. A property name will be returned by the iterator's next method at most once in any
enumeration.
Enumerating the properties of the target object includes enumerating properties of its prototype, and
the prototype of the prototype, and so on, recursively; but a property of a prototype is not processed
if it has the same name as a property that has already been processed by the iterator's next method.
The values of [[Enumerable]] attributes are not considered when determining if a property of a
prototype object has already been processed. The enumerable property names of prototype objects
must be obtained by invoking EnumerateObjectProperties passing the prototype object as the
argument. EnumerateObjectProperties must obtain the own property keys of the target object by
calling its [[OwnPropertyKeys]] internal method. Property attributes of the target object must be
obtained by calling its [[GetOwnProperty]] internal method.
In addition, if neither O nor any object in its prototype chain is a Proxy exotic object, Integer-
Indexed exotic object, module namespace exotic object, or implementation provided exotic object,
then the iterator must behave as would the iterator given by CreateForInIterator(O) until one of the
following occurs:
the value of the [[Prototype]] internal slot of O or an object in its prototype chain changes,
a property is removed from O or an object in its prototype chain,
a property is added to an object in O's prototype chain, or
https://tc39.es/ecma262/ 464/490
4/25/2021 ECMAScript® 2022 Language Specification
the value of the [[Enumerable]] attribute of a property of O or an object in its prototype chain
changes.
function* EnumerateObjectProperties(obj) {
const visited = new Set();
for (const key of Reflect.ownKeys(obj)) {
if (typeof key === "symbol") continue;
const desc = Reflect.getOwnPropertyDescriptor(obj, ke
if (desc) {
visited.add(key);
if (desc.enumerable) yield key;
}
}
const proto = Reflect.getPrototypeOf(obj);
if (proto === null) return;
for (const protoKey of EnumerateObjectProperties(proto)
if (!visited.has(protoKey)) yield protoKey;
}
}
NOTE 2 The list of exotic objects for which implementations are not required to match
CreateForInIterator was chosen because implementations historically differed in
behaviour for those cases, and agreed in all others.
https://tc39.es/ecma262/ 465/490
4/25/2021 ECMAScript® 2022 Language Specification
A For-In Iterator is an object that represents a specific iteration over some specific object. For-In
Iterator objects are never directly accessible to ECMAScript code; they exist solely to illustrate the
behaviour of EnumerateObjectProperties.
The abstract operation CreateForInIterator takes argument object. It is used to create a For-In Iterator
object which iterates over the own and inherited enumerable string properties of object in a specific
order. It performs the following steps when called:
14.7.5.10.2.1 %ForInIteratorPrototype%.next ( )
For-In Iterator instances are ordinary objects that inherit properties from the
%ForInIteratorPrototype% intrinsic object. For-In Iterator instances are initially created with the
internal slots listed in Table 39.
[[VisitedKeys]] A list of String values which have been emitted by this iterator thus far.
[[RemainingKeys]] A list of String values remaining to be emitted for the current object,
before iterating the properties of its prototype (if its prototype is not null).
https://tc39.es/ecma262/ 467/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
BreakStatement[Yield, Await] :
break ;
break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;
https://tc39.es/ecma262/ 468/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
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.
It is a Syntax Error if IsLabelledFunction(Statement) is true.
NOTE It is only necessary to apply the second rule if the extension specified in B.3.2 is
implemented.
NOTE No matter how control leaves the embedded Statement, whether normally or by
some form of abrupt completion or exception, the LexicalEnvironment is always
restored to its former state.
https://tc39.es/ecma262/ 471/490
4/25/2021 ECMAScript® 2022 Language Specification
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 of 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.
https://tc39.es/ecma262/ 472/490
4/25/2021 ECMAScript® 2022 Language Specification
3. Else,
a. Let A be « ».
4. Let found be false.
5. For each CaseClause C of A, do
a. If found is false, then
i. Set found to ? CaseClauseIsSelected(C, input).
b. If found is true, then
i. Let R be the result of evaluating C.
ii. If R.[[Value]] is not empty, set V to R.[[Value]].
iii. If R is an abrupt completion, return Completion(UpdateEmpty(R, V)).
6. Let foundInB be false.
7. If the second CaseClauses is present, then
a. Let B be the List of CaseClause items in the second CaseClauses, in source text order.
8. Else,
a. Let B be « ».
9. If found is false, then
a. For each CaseClause C of B, do
i. If foundInB is false, then
1. Set foundInB to ? CaseClauseIsSelected(C, input).
ii. If foundInB is true, then
1. Let R be the result of evaluating CaseClause C.
2. If R.[[Value]] is not empty, set V to R.[[Value]].
3. If R is an abrupt completion, return Completion(UpdateEmpty(R, V)).
10. If foundInB is true, return NormalCompletion(V).
11. Let R be the result of evaluating DefaultClause.
12. If R.[[Value]] is not empty, set V to R.[[Value]].
13. If R is an abrupt completion, return Completion(UpdateEmpty(R, V)).
14. NOTE: The following is another complete iteration of the second CaseClauses.
15. For each CaseClause C of B, do
a. Let R be the result of evaluating CaseClause C.
b. If R.[[Value]] is not empty, set V to R.[[Value]].
c. If R is an abrupt completion, return Completion(UpdateEmpty(R, V)).
16. Return NormalCompletion(V).
The abstract operation CaseClauseIsSelected takes arguments C (a Parse Node for CaseClause) and
input (an ECMAScript language value). It determines whether C matches input. It performs the
following steps when called:
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.
1. Return NormalCompletion(empty).
https://tc39.es/ecma262/ 474/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
The abstract operation IsLabelledFunction takes argument stmt. It performs the following steps when
called:
BreakableStatement : IterationStatement
BreakableStatement : SwitchStatement
https://tc39.es/ecma262/ 476/490
4/25/2021 ECMAScript® 2022 Language Specification
LabelledItem : FunctionDeclaration
Statement :
BlockStatement
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
ThrowStatement
TryStatement
DebuggerStatement
NOTE 2 The only two productions of Statement which have special semantics for
LabelledEvaluation are BreakableStatement and LabelledStatement.
https://tc39.es/ecma262/ 477/490
4/25/2021 ECMAScript® 2022 Language Specification
ThrowStatement[Yield, Await] :
throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ;
CatchParameter[Yield, Await] :
BindingIdentifier[?Yield, ?Await]
https://tc39.es/ecma262/ 478/490
4/25/2021 ECMAScript® 2022 Language Specification
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.
https://tc39.es/ecma262/ 479/490
4/25/2021 ECMAScript® 2022 Language Specification
NOTE No matter how control leaves the Block the LexicalEnvironment is always restored
to its former state.
https://tc39.es/ecma262/ 480/490
4/25/2021 ECMAScript® 2022 Language Specification
Syntax
DebuggerStatement :
debugger ;
DebuggerStatement : debugger ;
UniqueFormalParameters[Yield, Await] :
https://tc39.es/ecma262/ 481/490
4/25/2021 ECMAScript® 2022 Language Specification
FormalParameters[?Yield, ?Await]
FormalParameters[Yield, Await] :
[empty]
FunctionRestParameter[?Yield, ?Await]
FormalParameterList[?Yield, ?Await]
FormalParameterList[?Yield, ?Await] ,
FormalParameterList[?Yield, ?Await] ,
FunctionRestParameter[?Yield, ?Await]
FormalParameterList[Yield, Await] :
FormalParameter[?Yield, ?Await]
FormalParameterList[?Yield, ?Await] , FormalParameter[?Yield, ?Await]
FunctionRestParameter[Yield, Await] :
BindingRestElement[?Yield, ?Await]
FormalParameter[Yield, Await] :
BindingElement[?Yield, ?Await]
FormalParameters : FormalParameterList
https://tc39.es/ecma262/ 482/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return false.
ArrayBindingPattern : [ Elisionopt ]
1. Return false.
https://tc39.es/ecma262/ 483/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return true.
SingleNameBinding : BindingIdentifier
1. Return false.
1. Return true.
1. Return false.
FormalParameters : [empty]
1. Return false.
ArrowParameters : BindingIdentifier
1. Return false.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
AsyncArrowBindingIdentifier : BindingIdentifier
1. Return false.
1. Return false.
1. Return false.
SingleNameBinding : BindingIdentifier
1. Return true.
1. Return false.
FormalParameters : [empty]
1. Return true.
FormalParameters : FunctionRestParameter
1. Return false.
https://tc39.es/ecma262/ 485/490
4/25/2021 ECMAScript® 2022 Language Specification
1. Return false.
FormalParameter : BindingElement
ArrowParameters : BindingIdentifier
1. Return true.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
1. Return true.
1. Return false.
1. Return true.
https://tc39.es/ecma262/ 486/490
4/25/2021 ECMAScript® 2022 Language Specification
SingleNameBinding : BindingIdentifier
1. Return false.
1. Return true.
1. Return 0.
FormalParameterList : FormalParameter
https://tc39.es/ecma262/ 487/490
4/25/2021 ECMAScript® 2022 Language Specification
ArrowParameters : BindingIdentifier
1. Return 1.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
PropertySetParameterList : FormalParameter
AsyncArrowBindingIdentifier : BindingIdentifier
1. Return 1.
FunctionBody[~Yield, ~Await] }
FunctionExpression :
function BindingIdentifier[~Yield, ~Await] opt (
FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await]
https://tc39.es/ecma262/ 488/490
4/25/2021 ECMAScript® 2022 Language Specification
FunctionBody[Yield, Await] :
FunctionStatementList[?Yield, ?Await]
FunctionStatementList[Yield, Await] :
StatementList[?Yield, ?Await, +Return] opt
If the source code matching FormalParameters is strict mode code, the Early Error rules for
UniqueFormalParameters : FormalParameters are applied.
If BindingIdentifier is present and the source code matching BindingIdentifier is strict mode
code, it is a Syntax Error if the StringValue of BindingIdentifier is "eval" or "arguments".
It is a Syntax Error if FunctionBodyContainsUseStrict of FunctionBody is true and
IsSimpleParameterList of FormalParameters is false.
It is a Syntax Error if any element of the BoundNames of FormalParameters also occurs in the
LexicallyDeclaredNames of FunctionBody.
It is a Syntax Error if FormalParameters Contains SuperProperty is true.
It is a Syntax Error if FunctionBody Contains SuperProperty is true.
It is a Syntax Error if FormalParameters Contains SuperCall is true.
It is a Syntax Error if FunctionBody Contains SuperCall is true.
FunctionBody : FunctionStatementList
https://tc39.es/ecma262/ 489/490
4/25/2021 ECMAScript® 2022 Language Specification
https://tc39.es/ecma262/ 490/490