ECMA-262
7ᵗʰ Edition / June 2016
Introduction#
This Ecma Standard defines the ECMAScript 2016 Language. It is the seventh 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 future language growth. The third edition of the ECMAScript standard was adopted by the Ecma General Assembly of December 1999 and published as ISO/IEC 16262:2002 in June 2002.
After publication of the third edition, ECMAScript achieved massive adoption in conjunction with the World Wide Web where it has become the programming language that is supported by essentially all web browsers. Significant work was done to develop a fourth edition of ECMAScript. However, that work was not completed and not published as the fourth edition of ECMAScript but some of it was incorporated into the development of the sixth edition.
The fifth edition of ECMAScript (published as ECMA-262 5th edition) codified de facto interpretations of the language specification that have become common among browser implementations and added support for new features that had emerged since the publication of the third edition. Such features include accessor properties, reflective creation and inspection of objects, program control of property attributes, additional array manipulation functions, support for the JSON object encoding format, and a strict mode that provides enhanced error checking and program security. The Fifth Edition was adopted by the Ecma General Assembly of December 2009.
The fifth Edition was submitted to ISO/IEC JTC 1 for adoption under the fast-track procedure, and approved as international standard ISO/IEC 16262:2011. Edition 5.1 of the ECMAScript Standard incorporated minor corrections and is the same text as ISO/IEC 16262:2011. The 5.1 Edition was adopted by the Ecma General Assembly of June 2011.
Focused development of the sixth edition started in 2009, as the fifth edition was being prepared for publication. However, this was preceded by significant experimentation and language enhancement design efforts dating to the publication of the third edition in 1999. In a very real sense, the completion of the sixth edition is the culmination of a fifteen year effort. The goals for this addition included providing better support for large applications, library creation, and for use of ECMAScript as a compilation target for other languages. Some of its major enhancements included modules, class declarations, lexical block scoping, iterators and generators, promises for asynchronous programming, destructuring patterns, and proper tail calls. The ECMAScript library of built-ins was expanded to support additional data abstractions including maps, sets, and arrays of binary numeric values as well as additional support for Unicode supplemental characters in strings and regular expressions. The built-ins were also made extensible via subclassing. The sixth edition provides the foundation for regular, incremental language and library enhancements. The sixth edition was adopted by the General Assembly of June 2015.
This ECMAScript specification is 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. This specification also includes support for a new exponentiation operator and adds a new method to Array.prototype called includes.
Dozens of individuals representing many organizations have made very significant contributions within Ecma TC39 to the development of this edition and to the prior editions. In addition, a vibrant community has emerged supporting TC39's ECMAScript efforts. This community has reviewed numerous drafts, filed thousands of bug reports, performed implementation experiments, contributed test suites, and educated the world-wide developer community about ECMAScript. Unfortunately, it is impossible to identify and acknowledge every person and organization who has contributed to this effort.
Allen Wirfs-Brock
ECMA-262, 6th Edition Project Editor
Brian Terlson
ECMA-262, 7th Edition Project Editor
1Scope#
This Standard defines the ECMAScript 2016 general purpose programming language.
2Conformance#
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 Unicode Standard, Version 8.0.0 or later and ISO/IEC 10646.
A conforming implementation of ECMAScript that provides an application programming interface that supports programs that need to adapt to the linguistic and cultural conventions used by different human languages and countries must implement the interface defined by the most recent edition of ECMA-402 that is compatible with this specification.
A conforming implementation of ECMAScript may provide additional types, values, objects, properties, and functions beyond those described in this specification. In particular, a conforming implementation of ECMAScript may provide properties not described in this specification, and values for those properties, for objects that are described in this specification.
A conforming implementation of ECMAScript may support program and regular expression syntax not described in this specification. In particular, a conforming implementation of ECMAScript may support program syntax that makes use of the “future reserved words” listed in subclause
A conforming implementation of ECMAScript must not implement any extension that is listed as a Forbidden Extension in subclause
3Normative References#
The following referenced documents are indispensable for the application of this document. For dated references, only the edition cited applies. For undated references, the latest edition of the referenced document (including any amendments) applies.
ISO/IEC 10646:2003: Information Technology – Universal Multiple-Octet Coded Character Set (UCS) plus Amendment 1:2005, Amendment 2:2006, Amendment 3:2008, and Amendment 4:2008, plus additional amendments and corrigenda, or successor
ECMA-402, ECMAScript 2015 Internationalization API Specification.
https://www.ecma-international.org/publications-and-standards/standards/ecma-402/
ECMA-404, The JSON Data Interchange Format.
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/
4Overview#
This section contains a non-normative overview of the ECMAScript language.
ECMAScript is an object-oriented programming language for performing computations and manipulating computational objects within a host environment. ECMAScript as defined here is not intended to be computationally self-sufficient; indeed, there are no provisions in this specification for input of external data or output of computed results. Instead, it is expected that the computational environment of an ECMAScript program will provide not only the objects and other facilities described in this specification but also certain environment-specific objects, whose description and behaviour are beyond the scope of this specification except to indicate that they may provide certain properties that can be accessed and certain functions that can be called from an ECMAScript program.
ECMAScript was originally designed to be used as a scripting language, but has become widely used as a general purpose programming language. A scripting language is a programming language that is used to manipulate, customize, and automate the facilities of an existing system. In such systems, useful functionality is already available through a user interface, and the scripting language is a mechanism for exposing that functionality to program control. In this way, the existing system is said to provide a host environment of objects and facilities, which completes the capabilities of the scripting language. A scripting language is intended for use by both professional and non-professional programmers.
ECMAScript was originally designed to be a Web scripting language, providing a mechanism to enliven Web pages in browsers and to perform server computation as part of a Web-based client-server architecture. ECMAScript is now used to provide core scripting capabilities for a variety of host environments. Therefore the core language is specified in this document apart from any particular host environment.
ECMAScript usage has moved beyond simple scripting and it is now used for the full spectrum of programming tasks in many different environments and scales. As the usage of ECMAScript has expanded, so has the features and facilities it provides. ECMAScript is now a fully featured general propose programming language.
Some of the facilities of ECMAScript are similar to those used in other programming languages; in particular C, Java™, Self, and Scheme as described in:
ISO/IEC 9899:1996, Programming Languages – C.
Gosling, James, Bill Joy and Guy Steele. The Java™ Language Specification. Addison Wesley Publishing Co., 1996.
Ungar, David, and Smith, Randall B. Self: The Power of Simplicity. OOPSLA '87 Conference Proceedings, pp. 227-241, Orlando, FL, October 1987.
IEEE Standard for the Scheme Programming Language. IEEE Std 1178-1990.
4.1Web Scripting#
A web browser provides an ECMAScript host environment for client-side computation including, for instance, objects that represent windows, menus, pop-ups, dialog boxes, text areas, anchors, frames, history, cookies, and input/output. Further, the host environment provides a means to attach scripting code to events such as change of focus, page and image loading, unloading, error and abort, selection, form submission, and mouse actions. Scripting code appears within the HTML and the displayed page is a combination of user interface elements and fixed and computed text and images. The scripting code is reactive to user interaction and there is no need for a main program.
A web server provides a different host environment for server-side computation including objects representing requests, clients, and files; and mechanisms to lock and share data. By using browser-side and server-side scripting together, it is possible to distribute computation between the client and server while providing a customized user interface for a Web-based application.
Each Web browser and server that supports ECMAScript supplies its own host environment, completing the ECMAScript execution environment.
4.2ECMAScript Overview#
The following is an informal overview of ECMAScript—not all parts of the language are described. This overview is not part of the standard proper.
ECMAScript is object-based: basic language and host facilities are provided by objects, and an ECMAScript program is a cluster of communicating objects. In ECMAScript, an object is a collection of zero or more properties each with attributes that determine how each property can be used—for example, when the Writable attribute for a property is set to
ECMAScript defines a collection of built-in objects that round out the definition of ECMAScript entities. These built-in objects include the 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, and DataView; objects supporting control abstractions including generator functions and Promise objects; and, reflection objects including Proxy and Reflect.
ECMAScript also defines a set of built-in operators. ECMAScript operators include various unary operations, multiplicative operators, additive operators, bitwise shift operators, relational operators, equality operators, binary bitwise operators, binary logical operators, assignment operators, and the comma operator.
Large ECMAScript programs are supported by modules which allow a program to be divided into multiple sequences of statements and declarations. Each module explicitly identifies declarations it uses that need to be provided by other modules and which of its declarations are available for use by other modules.
ECMAScript syntax intentionally resembles Java syntax. ECMAScript syntax is relaxed to enable it to serve as an easy-to-use scripting language. For example, a variable is not required to have its type declared nor are types associated with properties, and defined functions are not required to have their declarations appear textually before calls to them.
4.2.1Objects#
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.
In a class-based object-oriented language, in general, state is carried by instances, methods are carried by classes, and inheritance is only of structure and behaviour. In ECMAScript, the state and methods are carried by objects, while structure, behaviour, and state are all inherited.
All objects that do not directly contain a particular property that their prototype contains share that property and its value. Figure 1 illustrates this:
CF is a constructor (and also an object). Five objects have been created by using new expressions: cf1, cf2, cf3, cf4, and cf5. Each of these objects contains properties named q1 and q2. The dashed lines represent the implicit prototype relationship; so, for example, cf3's prototype is CFp. The constructor, CF, has two properties itself, named P1 and P2, which are not visible to CFp, cf1, cf2, cf3, cf4, or cf5. The property named CFP1 in CFp is shared by cf1, cf2, cf3, cf4, and cf5 (but not by CF), as are any properties found in CFp's implicit prototype chain that are not named q1, q2, or CFP1. Notice that there is no implicit prototype link between CF and CFp.
Unlike most class-based object languages, properties can be added to objects dynamically by assigning values to them. That is, constructors are not required to name or assign values to all or any of the constructed object's properties. In the above diagram, one could add a new shared property for cf1, cf2, cf3, cf4, and cf5 by assigning a new value to the property in CFp.
Although ECMAScript objects are not inherently class-based, it is often convenient to define class-like abstractions based upon a common pattern of constructor functions, prototype objects, and methods. The ECMAScript built-in objects themselves follow such a class-like pattern. Beginning with ECMAScript 2015, the ECMAScript language includes syntactic class definitions that permit programmers to concisely define objects that conform to the same class-like abstraction pattern used by the built-in objects.
4.2.2The Strict Variant of ECMAScript#
The ECMAScript Language recognizes the possibility that some users of the language may wish to restrict their usage of some features available in the language. They might do so in the interests of security, to avoid what they consider to be error-prone features, to get enhanced error checking, or for other reasons of their choosing. In support of this possibility, ECMAScript defines a strict variant of the language. The strict variant of the language excludes some specific syntactic and semantic features of the regular ECMAScript language and modifies the detailed semantics of some features. The strict variant also specifies additional error conditions that must be reported by throwing error exceptions in situations that are not specified as errors by the non-strict form of the language.
The strict variant of ECMAScript is commonly referred to as the strict mode of the language. Strict mode selection and use of the strict mode syntax and semantics of ECMAScript is explicitly made at the level of individual ECMAScript source text units. 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.3Terms and Definitions#
For the purposes of this document, the following terms and definitions apply.
4.3.1type#
set of data values as defined in clause
4.3.2primitive value#
member of one of the types Undefined, Null, Boolean, Number, Symbol, or String as defined in clause
A primitive value is a datum that is represented directly at the lowest level of the language implementation.
4.3.3object#
member of the type Object
An object is a collection of properties and has a single prototype object. The prototype may be the null value.
4.3.4constructor#
function object that creates and initializes objects
The value of a constructor's prototype property is a prototype object that is used to implement inheritance and shared properties.
4.3.5prototype#
object that provides shared properties for other objects
When a constructor creates an object, that object implicitly references the constructor's prototype property for the purpose of resolving property references. The constructor's prototype property can be referenced by the program expression constructor.prototype, and properties added to an object's prototype are shared, through inheritance, by all objects sharing the prototype. Alternatively, a new object may be created with an explicitly specified prototype by using the Object.create built-in function.
4.3.6ordinary object#
object that has the default behaviour for the essential internal methods that must be supported by all objects
4.3.7exotic object#
object that does not have the default behaviour for one or more of the essential internal methods
Any object that is not an ordinary object is an exotic object.
4.3.8standard object#
object whose semantics are defined by this specification
4.3.9built-in object#
object specified and supplied by an ECMAScript implementation
Standard built-in objects are defined in this specification. An ECMAScript implementation may specify and supply additional kinds of built-in objects. A built-in constructor is a built-in object that is also a constructor.
4.3.10undefined value#
primitive value used when a variable has not been assigned a value
4.3.11Undefined type#
type whose sole value is the
4.3.12null value#
primitive value that represents the intentional absence of any object value
4.3.13Null type#
type whose sole value is the
4.3.14Boolean value#
member of the Boolean type
There are only two Boolean values,
4.3.15Boolean type#
type consisting of the primitive values
4.3.16Boolean object#
member of the Object type that is an instance of the standard built-in Boolean constructor
A Boolean object is created by using the Boolean constructor in a new expression, supplying a Boolean value as an argument. The resulting object has an internal slot whose value is the Boolean value. A Boolean object can be coerced to a Boolean value.
4.3.17String value#
primitive value that is a finite ordered sequence of zero or more 16-bit unsigned integer
A String value is a member of the String type. Each integer value in the sequence usually represents a single 16-bit unit of UTF-16 text. However, ECMAScript does not place any restrictions or requirements on the values except that they must be 16-bit unsigned integers.
4.3.18String type#
set of all possible String values
4.3.19String object#
member of the Object type that is an instance of the standard built-in String constructor
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 (
4.3.20Number value#
primitive value corresponding to a double-precision 64-bit binary format IEEE 754-2008 value
A Number value is a member of the Number type and is a direct representation of a number.
4.3.21Number type#
set of all possible Number values including the special “Not-a-Number” (NaN) value, positive infinity, and negative infinity
4.3.22Number object#
member of the Object type that is an instance of the standard built-in Number constructor
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 (
4.3.23Infinity#
number value that is the positive infinite number value
4.3.24NaN#
number value that is an IEEE 754-2008 “Not-a-Number” value
4.3.25Symbol value#
primitive value that represents a unique, non-String Object property key
4.3.26Symbol type#
set of all possible Symbol values
4.3.27Symbol object#
member of the Object type that is an instance of the standard built-in Symbol constructor
4.3.28function#
member of the Object type that may be invoked as a subroutine
In addition to its properties, a function contains executable code and state that determine how it behaves when invoked. A function's code may or may not be written in ECMAScript.
4.3.29built-in function#
built-in object that is a function
Examples of built-in functions include parseInt and Math.exp. An implementation may provide implementation-dependent built-in functions that are not described in this specification.
4.3.30property#
part of an object that associates a key (either a String value or a Symbol value) and a value
Depending upon the form of the property the value may be represented either directly as a data value (a primitive value, an object, or a function object) or indirectly by a pair of accessor functions.
4.3.31method#
function that is the value of a property
When a function is called as a method of an object, the object is passed to the function as its
4.3.32built-in method#
method that is a built-in function
Standard built-in methods are defined in this specification, and an ECMAScript implementation may specify and provide other additional built-in methods.
4.3.33attribute#
internal value that defines some characteristic of a property
4.3.34own property#
property that is directly contained by its object
4.3.35inherited property#
property of an object that is not an own property but is a property (either own or inherited) of the object's prototype
4.4Organization of This Specification#
The remainder of this specification is organized as follows:
Clause 5 defines the notational conventions used throughout the specification.
Clauses 6-9 define the execution environment within which ECMAScript programs operate.
Clauses 10-16 define the actual ECMAScript programming language including its syntactic encoding and the execution semantics of all language features.
Clauses 17-26 define the ECMAScript standard library. It includes the definitions of all of the standard objects that are available for use by ECMAScript programs as they execute.
5Notational Conventions#
5.1Syntactic and Lexical Grammars#
5.1.1Context-Free Grammars#
A context-free grammar consists of a number of productions. Each production has an abstract symbol called a nonterminal as its left-hand side, and a sequence of zero or more nonterminal and terminal symbols as its right-hand side. For each grammar, the terminal symbols are drawn from a specified alphabet.
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.
5.1.2The Lexical and RegExp Grammars#
A lexical grammar for ECMAScript is given in clause
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 (/*…*/ regardless of whether it spans more than one line) is likewise simply discarded if it contains no line terminator; but if a
A RegExp grammar for ECMAScript is given in
Productions of the lexical and RegExp grammars are distinguished by having two colons “::” as separating punctuation. The lexical and RegExp grammars share some productions.
5.1.3The Numeric String Grammar#
Another grammar is used for translating Strings into numeric values. This grammar is similar to the part of the lexical grammar having to do with numeric literals and has as its terminal symbols
Productions of the numeric string grammar are distinguished by having three colons “:::” as punctuation.
5.1.4The Syntactic Grammar#
The syntactic grammar for ECMAScript is given in clauses 11, 12, 13, 14, and 15. This grammar has ECMAScript tokens defined by the lexical grammar as its terminal symbols (
When a stream of code points is to be parsed as an ECMAScript
Productions of the syntactic grammar are distinguished by having just one colon “:” as punctuation.
The syntactic grammar as presented in clauses 12, 13, 14 and 15 is not a complete account of which token sequences are accepted as a correct ECMAScript
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
5.1.5Grammar Notation#
Terminal symbols of the lexical, RegExp, and numeric string grammars are shown in fixed width font, both in the productions of the grammars and throughout this specification whenever the text directly refers to such a terminal symbol. These are to appear in a script exactly as written. All terminal symbol code points specified in this way are to be understood as the appropriate Unicode code points from the Basic Latin range, as opposed to any similar-looking code points from other Unicode ranges.
Nonterminal symbols are shown in italic type. The definition of a nonterminal (also called a “production”) is introduced by the name of the nonterminal being defined followed by one or more colons. (The number of colons indicates to which grammar the production belongs.) One or more alternative right-hand sides for the nonterminal then follow on succeeding lines. For example, the syntactic definition:
states that the nonterminal while, followed by a left parenthesis token, followed by an
states that an
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:
is a convenient abbreviation for:
and that:
is a convenient abbreviation for:
which in turn is an abbreviation for:
so, in this example, the nonterminal
A production may be parameterized by a subscripted annotation of the form “[parameters]”, which may appear as a suffix to the nonterminal symbol defined by the production. “parameters” may be either a single name or a comma separated list of names. A parameterized production is shorthand for a set of productions defining all combinations of the parameter names, preceded by an underscore, appended to the parameterized nonterminal symbol. This means that:
is a convenient abbreviation for:
and that:
is an abbreviation for:
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:
is equivalent to saying:
A nonterminal reference may have both a parameter list and an “opt” suffix. For example:
is an abbreviation for:
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:
is an abbreviation for:
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:
is an abbreviation for:
and that
is an abbreviation for:
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:
which is merely a convenient abbreviation for:
If the phrase “[empty]” appears as the right-hand side of a production, it indicates that the production's right-hand side contains no terminals or nonterminals.
If the phrase “[lookahead ∉ set]” appears in the right-hand side of a production, it indicates that the production may not be used if the immediately following input token sequence is a member of the given set. The set can be written as a comma separated list of one or two element terminal sequences enclosed in curly brackets. For convenience, the set can also be written as a nonterminal, in which case it represents the set of all terminals to which that nonterminal could expand. If the set consists of a single terminal the phrase “[lookahead ≠ terminal]” may be used.
For example, given the definitions
the definition
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.
If the phrase “[no
indicates that the production may not be used if a throw token and the
Unless the presence of a
When an alternative in a production of the lexical grammar or the numeric string grammar appears to be a multi-code point token, it represents the sequence of code points that would make up such a token.
The right-hand side of a production may specify that certain expansions are not permitted by using the phrase “but not” and then indicating the expansions to be excluded. For example, the production:
means that the nonterminal
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:
5.2Algorithm Conventions#
The specification often uses a numbered list to specify steps in an algorithm. These algorithms are used to precisely specify the required semantics of ECMAScript language constructs. The algorithms are not intended to imply the use of any specific implementation technique. In practice, there may be more efficient algorithms available to implement a given feature.
Algorithms may be explicitly parameterized, in which case the names and usage of the parameters must be provided as part of the algorithm's definition. In order to facilitate their use in multiple parts of this specification, some algorithms, called abstract operations, are named and written in parameterized functional form so that they may be referenced by name from within other algorithms. Abstract operations are typically referenced using a functional application style such as operationName(arg1, arg2). Some abstract operations are treated as polymorphically dispatched methods of class-like specification abstractions. Such method-like abstract operations are typically referenced using a method application style such as someValue.operationName(arg1, arg2).
Calls to abstract operations return ? indicate that
The prefix ! is used to indicate that an abstract operation will never return an
- Let val be operationName().
- Assert: val is never an
abrupt completion . - If val is a
Completion Record , let val be val.[[Value]].
Algorithms may be associated with productions of one of the ECMAScript grammars. A production that has multiple alternative definitions will typically have a distinct algorithm for each alternative. When an algorithm is associated with a grammar production, it may reference the terminal and nonterminal symbols of the production alternative as if they were parameters of the algorithm. When used in this manner, nonterminal symbols refer to the actual alternative definition that is matched when parsing the source text.
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.
Unless explicitly specified otherwise, all chain productions have an implicit definition for every algorithm that might be applied to that production's left-hand side nonterminal. The implicit definition simply reapplies the same algorithm name with the same parameters, if any, to the
but there is no corresponding Evaluation algorithm that is explicitly specified for that production. If in some algorithm there is a statement of the form: “Return the result of evaluating
Runtime Semantics: Evaluation
- Return the result of evaluating
StatementList .
For clarity of expression, 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:
- Top-level step
- Substep.
- Substep.
- Subsubstep.
- Subsubsubstep
- Subsubsubsubstep
- Subsubsubsubsubstep
- Subsubsubsubstep
- Subsubsubstep
- Subsubstep.
A step or substep may be written as an “if” predicate that conditions its substeps. In this case, the substeps are only applied if the predicate is true. If a step or substep begins with the word “else”, it is a predicate that is the negation of the preceding “if” predicate step at the same level.
A step may specify the iterative application of its substeps.
A step that begins with “Assert:” asserts an invariant condition of its algorithm. Such assertions are used to make explicit algorithmic invariants that would otherwise be implicit. Such assertions add no additional semantic requirements and hence need not be checked by an implementation. They are used simply to clarify algorithms.
Mathematical operations such as addition, subtraction, negation, multiplication, division, and the mathematical functions defined later in this clause should always be understood as computing exact mathematical results on mathematical real numbers, which unless otherwise noted do not include infinities and do not include a negative zero that is distinguished from positive zero. Algorithms in this standard that model floating-point arithmetic include explicit steps, where necessary, to handle infinities and signed zero and to perform rounding. If a mathematical operation or function is applied to a floating-point number, it should be understood as being applied to the exact mathematical value represented by that floating-point number; such a floating-point number must be finite, and if it is
The mathematical function
The mathematical function
The notation “
The mathematical function
5.3Static Semantic Rules#
Context-free grammars are not sufficiently powerful to express all the rules that define whether a stream of input elements form a valid ECMAScript
Static Semantic Rules have names and typically are defined using an algorithm. Named Static Semantic Rules are associated with grammar productions and a production that has multiple alternative definitions will typically have for each alternative a distinct algorithm for each applicable named static semantic rule.
Unless otherwise specified every grammar production alternative in this specification implicitly has a definition for a static semantic rule named Contains which takes an argument named symbol whose value is a terminal or nonterminal of the grammar that includes the associated production. The default definition of Contains is:
- For each terminal and nonterminal grammar symbol, sym, in the definition of this production do
- If sym is the same grammar symbol as symbol, return
true . - If sym is a nonterminal, then
- Let contained be the result of sym Contains symbol.
- If contained is
true , returntrue .
- If sym is the same grammar symbol as symbol, return
- Return
false .
The above definition is explicitly over-ridden for specific productions.
A special kind of static semantic rule is an Early Error Rule.
6ECMAScript Data Types and Values#
Algorithms within this specification manipulate values each of which has an associated type. The possible value types are exactly those defined in this clause. Types are further subclassified into ECMAScript language types and specification types.
Within this specification, the notation “Type(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”.
6.1ECMAScript Language Types#
An ECMAScript language type corresponds to values that are directly manipulated by an ECMAScript programmer using the ECMAScript language. The ECMAScript language types are Undefined, Null, Boolean, String, Symbol, Number, and Object. An ECMAScript language value is a value that is characterized by an ECMAScript language type.
6.1.1The Undefined Type#
The Undefined type has exactly one value, called
6.1.2The Null Type#
The Null type has exactly one value, called
6.1.3The Boolean Type#
The Boolean type represents a logical entity having two values, called
6.1.4The String Type#
The String type is the set of all ordered sequences of zero or more 16-bit unsigned integer values (“elements”) up to a maximum length of 253-1 elements. The String type is generally used to represent textual data in a running ECMAScript program, in which case each element in the String is treated as a UTF-16 code unit value. Each element is regarded as occupying a position within the sequence. These positions are indexed with nonnegative integers. The first element (if any) is at index 0, the next element (if any) at index 1, and so on. The length of a String is the number of elements (i.e., 16-bit values) within it. The empty String has length zero and therefore contains no elements.
Where ECMAScript operations interpret String values, each element is interpreted as a single UTF-16 code unit. However, ECMAScript does not place any restrictions or requirements on the sequence of code units in a String value, so they may be ill-formed when interpreted as UTF-16 code unit sequences. Operations that do not interpret String contents treat them as sequences of undifferentiated 16-bit unsigned integers. The function String.prototype.normalize (see String.prototype.localeCompare (see
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.
Some operations interpret String contents as UTF-16 encoded Unicode code points. In that case the interpretation is:
- A code unit in the range 0 to 0xD7FF or in the range 0xE000 to 0xFFFF is interpreted as a code point with the same value.
-
A sequence of two code units, where the first code unit c1 is in the range 0xD800 to 0xDBFF and the second code unit c2 is in the range 0xDC00 to 0xDFFF, is a surrogate pair and is interpreted as a code point with the value (c1 - 0xD800) × 0x400 + (c2 - 0xDC00) + 0x10000. (See
10.1.2 ) - A code unit that is in the range 0xD800 to 0xDFFF, but is not part of a surrogate pair, is interpreted as a code point with the same value.
6.1.5The Symbol Type#
The Symbol type is the set of all non-String values that may be used as the key of an Object property (
Each possible Symbol value is unique and immutable.
Each Symbol value immutably holds an associated value called [[Description]] that is either
6.1.5.1Well-Known Symbols#
Well-known symbols are built-in Symbol values that are explicitly referenced by algorithms of this specification. They are typically used as the keys of properties whose values serve as extension points of a specification algorithm. Unless otherwise specified, well-known symbols values are shared by all realms (
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
| Specification Name | [[Description]] | Value and Purpose |
|---|---|---|
| @@hasInstance |
"Symbol.hasInstance"
|
A method that determines if a constructor object recognizes an object as one of the constructor's instances. Called by the semantics of the instanceof operator.
|
| @@isConcatSpreadable |
"Symbol.isConcatSpreadable"
|
A Boolean valued property that if true indicates that an object should be flattened to its array elements by Array.prototype.concat.
|
| @@iterator |
"Symbol.iterator"
|
A method that returns the default Iterator for an object. Called by the semantics of the for-of statement. |
| @@match |
"Symbol.match"
|
A regular expression method that matches the regular expression against a string. Called by the String.prototype.match method.
|
| @@replace |
"Symbol.replace"
|
A regular expression method that replaces matched substrings of a string. Called by the String.prototype.replace method.
|
| @@search |
"Symbol.search"
|
A regular expression method that returns the index within a string that matches the regular expression. Called by the String.prototype.search method.
|
| @@species |
"Symbol.species"
|
A function valued property that is the constructor function that is used to create derived objects. |
| @@split |
"Symbol.split"
|
A regular expression method that splits a string at the indices that match the regular expression. Called by the String.prototype.split method.
|
| @@toPrimitive |
"Symbol.toPrimitive"
|
A method that converts an object to a corresponding primitive value. Called by the |
| @@toStringTag |
"Symbol.toStringTag"
|
A String valued property that is used in the creation of the default string description of an object. Accessed by the built-in method Object.prototype.toString.
|
| @@unscopables |
"Symbol.unscopables"
|
An object valued property whose own and inherited property names are property names that are excluded from the with environment bindings of the associated object.
|
6.1.6The Number Type#
The Number type has exactly 18437736874454810627 (that is, NaN.) In some implementations, external code might be able to detect a difference between various Not-a-Number values, but such behaviour is implementation-dependent; to ECMAScript code, all
The bit pattern that might be observed in an ArrayBuffer (see
There are two other special values, called +Infinity (or simply Infinity) and -Infinity.)
The other 18437736874454810624 (that is,
Note that there is both a +0 (or simply 0) and -0.)
The 18437736874454810622 (that is,
18428729675200069632 (that is,
s × m × 2e
where s is +1 or -1, m is a positive integer less than 253 but not less than 252, and e is an integer ranging from -1074 to 971, inclusive.
The remaining 9007199254740990 (that is,
s × m × 2e
where s is +1 or -1, m is a positive integer less than 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 (indeed, the integer 0 has two representations,
A finite number has an odd significand if it is nonzero and the integer m used to express it (in one of the two forms shown above) is odd. Otherwise, it has an even significand.
In this specification, the phrase “the Number value for x” where x represents an exact nonzero 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
Some ECMAScript operators deal only with integers in specific ranges such as
6.1.7The Object Type#
An Object is logically a collection of properties. Each property is either a data property, or an accessor property:
-
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
Property keys are used to access properties and their values. There are two kinds of access for properties: get and set, corresponding to value retrieval and assignment, respectively. The properties accessible via get and set access includes both own properties that are a direct part of an object and inherited properties which are provided by another associated object via a property inheritance relationship. Inherited properties may be either own or inherited properties of the associated object. Each own property of an object must each have a key value that is distinct from the key values of the other own properties of that object.
All objects are logically collections of properties, but there are multiple forms of objects that differ in their semantics for accessing and manipulating their properties. Ordinary objects are the most common form of objects and have the default object semantics. An exotic object is any form of object whose property semantics differ in any way from the default semantics.
6.1.7.1Property Attributes#
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
| Attribute Name | Value Domain | Description |
|---|---|---|
| [[Value]] |
Any |
The value retrieved by a get access of the property. |
| [[Writable]] | Boolean |
If |
| [[Enumerable]] | Boolean |
If |
| [[Configurable]] | Boolean |
If |
An accessor property associates a key value with the attributes listed in
| Attribute Name | Value Domain | Description |
|---|---|---|
| [[Get]] | Object | Undefined |
If the value is an Object it must be a function object. The function's [[Call]] internal method ( |
| [[Set]] | Object | Undefined |
If the value is an Object it must be a function object. The function's [[Call]] internal method ( |
| [[Enumerable]] | Boolean |
If |
| [[Configurable]] | Boolean |
If |
If the initial values of a property's attributes are not explicitly specified by this specification, the default value defined in
| Attribute Name | Default Value |
|---|---|
| [[Value]] |
|
| [[Get]] |
|
| [[Set]] |
|
| [[Writable]] |
|
| [[Enumerable]] |
|
| [[Configurable]] |
|
6.1.7.2Object Internal Methods and Internal Slots#
The actual semantics of objects, in ECMAScript, are specified via algorithms called internal methods. Each object in an ECMAScript engine is associated with a set of internal methods that defines its runtime behaviour. These internal methods are not part of the ECMAScript language. They are defined by this specification purely for expository purposes. However, each object within an implementation of ECMAScript must behave as specified by the internal methods associated with it. The exact manner in which this is accomplished is determined by the implementation.
Internal method names are polymorphic. This means that different object values may perform different algorithms when a common internal method name is invoked upon them. That actual object upon which an internal method is invoked is the “target” of the invocation. If, at runtime, the implementation of an algorithm attempts to use an internal method of an object that the object does not support, a
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
Internal methods and internal slots are identified within this specification using names enclosed in double square brackets [[ ]].
The “Signature” column of
| Internal Method | Signature | Description |
|---|---|---|
| [[GetPrototypeOf]] | () → Object | Null |
Determine the object that provides inherited properties for this object. A |
| [[SetPrototypeOf]] | (Object | Null) → Boolean |
Associate this object with another object that provides inherited properties. Passing |
| [[IsExtensible]] | ( ) → Boolean | Determine whether it is permitted to add additional properties to this object. |
| [[PreventExtensions]] | ( ) → Boolean |
Control whether new properties may be added to this object. Returns |
| [[GetOwnProperty]] |
(propertyKey) → Undefined | |
Return a |
| [[HasProperty]] | (propertyKey) → Boolean | Return a Boolean value indicating whether this object already has either an own or inherited property whose key is propertyKey. |
| [[Get]] | (propertyKey, Receiver) → any |
Return the value of the property whose key is propertyKey from this object. If any ECMAScript code must be executed to retrieve the property value, Receiver is used as the |
| [[Set]] | (propertyKey, value, Receiver) → Boolean |
Set the value of the property whose key is propertyKey to value. If any ECMAScript code must be executed to set the property value, Receiver is used as the |
| [[Delete]] | (propertyKey) → Boolean |
Remove the own property whose key is propertyKey from this object. Return |
| [[DefineOwnProperty]] | (propertyKey, PropertyDescriptor) → Boolean |
Create or alter the own property, whose key is propertyKey, to have the state described by PropertyDescriptor. Return |
| [[OwnPropertyKeys]] |
()→ |
Return a |
| Internal Method | Signature | Description |
|---|---|---|
| [[Call]] |
(any, a |
Executes code associated with this object. Invoked via a function call expression. The arguments to the internal method are a |
| [[Construct]] |
(a |
Creates an object. Invoked via the new or super operators. The first argument to the internal method is a list containing the arguments of the operator. The second argument is the object to which the new operator was initially applied. Objects that implement this internal method are called constructors. A function object is not necessarily a constructor and such non-constructor function objects do not have a [[Construct]] internal method.
|
The semantics of the essential internal methods for ordinary objects and standard exotic objects are specified in clause
6.1.7.3Invariants of the Essential Internal Methods#
The Internal Methods of Objects of an ECMAScript engine must conform to the list of invariants specified below. Ordinary ECMAScript Objects as well as all standard exotic objects in this specification maintain these invariants. ECMAScript Proxy objects maintain these invariants by means of runtime checks on the result of traps invoked on the [[ProxyHandler]] object.
Any implementation provided exotic objects must also maintain these invariants for those objects. Violation of these invariants may cause ECMAScript code to have unpredictable behaviour and create security issues. However, violation of these invariants must never compromise the memory safety of an implementation.
An implementation must not allow these invariants to be circumvented in any manner such as by providing alternative interfaces that implement the functionality of the essential internal methods without enforcing their invariants.
Definitions:
- The target of an internal method is the object upon which the internal method is called.
- A target is non-extensible if it has been observed to return false from its [[IsExtensible]] internal method, or true from its [[PreventExtensions]] internal method.
- 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 theSameValue algorithm.
[[GetPrototypeOf]] ( )
- The Type of the return value must be either Object or Null.
-
If target is non-extensible, and [[GetPrototypeOf]] returns a value v, then any future calls to [[GetPrototypeOf]] should return the
SameValue as v.
An object's prototype chain should have finite length (that is, starting from any object, recursively applying the [[GetPrototypeOf]] internal method to its result should eventually lead to the value null). However, this requirement is not enforceable as an object level invariant if the prototype chain includes any exotic objects that do not use the ordinary object definition of [[GetPrototypeOf]]. Such a circular prototype chain may result in infinite loops when accessing object properties.
[[SetPrototypeOf]] (V)
- The Type of the return value must be Boolean.
-
If target is non-extensible, [[SetPrototypeOf]] must return false, unless V is the
SameValue as the target's observed [[GetPrototypeOf]] value.
[[IsExtensible]] ( )
- The Type of the return value must be Boolean.
- If [[IsExtensible]] returns false, all future calls to [[IsExtensible]] on the target must return false.
[[PreventExtensions]] ( )
- The Type of the return value must be Boolean.
- If [[PreventExtensions]] returns true, all future calls to [[IsExtensible]] on the target must return false and the target is now considered non-extensible.
[[GetOwnProperty]] (P)
-
The Type of the return value must be either
Property Descriptor or Undefined. -
If the Type of the return value is
Property Descriptor , the return value must be a complete property descriptor (see6.2.4.6 ). -
If a property P is described as a data property with Desc.[[Value]] equal to v and Desc.[[Writable]] and Desc.[[Configurable]] are both false, then the
SameValue must be returned for the Desc.[[Value]] attribute of the property on all future calls to [[GetOwnProperty]] ( P ). - If P's attributes other than [[Writable]] may change over time or if the property might disappear, then P's [[Configurable]] attribute must be true.
- If the [[Writable]] attribute may change from false to true, then the [[Configurable]] attribute must be true.
- If the target is non-extensible and P is non-existent, then all future calls to [[GetOwnProperty]] (P) on the target must describe P as non-existent (i.e. [[GetOwnProperty]] (P) must return undefined).
As a consequence of the third invariant, if a property is described as a data property and it may return different values over time, then either or both of the Desc.[[Writable]] and Desc.[[Configurable]] attributes must be true even if no mechanism to change the value is exposed via the other internal methods.
[[DefineOwnProperty]] (P, Desc)
- The Type of the return value must be Boolean.
-
[[DefineOwnProperty]] must return false if P has previously been observed as a non-configurable own property of the target, unless either:
- P is a non-configurable writable own data property. A non-configurable writable data property can be changed into a non-configurable non-writable data property.
-
All attributes in Desc are the
SameValue as P's attributes.
- [[DefineOwnProperty]] (P, Desc) must return false if target is non-extensible and P is a non-existent own property. That is, a non-extensible target object cannot be extended with new properties.
[[HasProperty]] ( P )
- The Type of the return value must be Boolean.
- If P was previously observed as a non-configurable data or accessor own property of the target, [[HasProperty]] must return true.
[[Get]] (P, Receiver)
-
If P was previously observed as a non-configurable, non-writable own data property of the target with value v, then [[Get]] must return the
SameValue . - If P was previously observed as a non-configurable own accessor property of the target whose [[Get]] attribute is undefined, the [[Get]] operation must return undefined.
[[Set]] ( P, V, Receiver)
- The Type of the return value must be Boolean.
-
If P was previously observed as a non-configurable, non-writable own data property of the target, then [[Set]] must return false unless V is the
SameValue as P's [[Value]] attribute. - If P was previously observed as a non-configurable own accessor property of the target whose [[Set]] attribute is undefined, the [[Set]] operation must return false.
[[Delete]] ( P )
- The Type of the return value must be Boolean.
- If P was previously observed to be a non-configurable own data or accessor property of the target, [[Delete]] must return false.
[[OwnPropertyKeys]] ( )
-
The return value must be a
List . -
The Type of each element of the returned
List is either String or Symbol. -
The returned
List must contain at least the keys of all non-configurable own properties that have previously been observed. -
If the object is non-extensible, the returned
List must contain only the keys of all own properties of the object that are observable using [[GetOwnProperty]].
[[Construct]] ( )
- The Type of the return value must be Object.
6.1.7.4Well-Known Intrinsic Objects#
Well-known intrinsics are built-in objects that are explicitly referenced by the algorithms of this specification and which usually have
Within this specification a reference such as %name% means the intrinsic object, associated with the current
| Intrinsic Name | Global Name | ECMAScript Language Association |
|---|---|---|
|
|
Array
|
The Array constructor ( |
|
|
ArrayBuffer
|
The ArrayBuffer constructor ( |
|
|
ArrayBuffer.prototype
|
The initial value of the prototype data property of |
|
|
The prototype of Array iterator objects ( |
|
|
|
Array.prototype
|
The initial value of the prototype data property of |
|
|
Array.prototype.values
|
The initial value of the values data property of |
|
|
Boolean
|
The Boolean constructor ( |
|
|
Boolean.prototype
|
The initial value of the prototype data property of |
|
|
DataView
|
The DataView constructor ( |
|
|
DataView.prototype
|
The initial value of the prototype data property of |
|
|
Date
|
The Date constructor ( |
|
|
Date.prototype
|
The initial value of the prototype data property of |
|
|
decodeURI
|
The decodeURI function ( |
|
|
decodeURIComponent
|
The decodeURIComponent function ( |
|
|
encodeURI
|
The encodeURI function ( |
|
|
encodeURIComponent
|
The encodeURIComponent function ( |
|
|
Error
|
The Error constructor ( |
|
|
Error.prototype
|
The initial value of the prototype data property of |
|
|
eval
|
The eval function ( |
| %EvalError% |
EvalError
|
The EvalError constructor ( |
| %EvalErrorPrototype% |
EvalError.prototype
|
The initial value of the prototype property of %EvalError%
|
| %Float32Array% |
Float32Array
|
The Float32Array constructor ( |
| %Float32ArrayPrototype% |
Float32Array.prototype
|
The initial value of the prototype data property of %Float32Array%.
|
| %Float64Array% |
Float64Array
|
The Float64Array constructor ( |
| %Float64ArrayPrototype% |
Float64Array.prototype
|
The initial value of the prototype data property of %Float64Array%
|
|
|
Function
|
The Function constructor ( |
|
|
Function.prototype
|
The initial value of the prototype data property of |
| %Generator% |
The initial value of the prototype property of |
|
|
|
The constructor of generator objects ( |
|
|
|
The initial value of the prototype property of %Generator%
|
|
| %Int8Array% |
Int8Array
|
The Int8Array constructor ( |
| %Int8ArrayPrototype% |
Int8Array.prototype
|
The initial value of the prototype data property of %Int8Array%
|
| %Int16Array% |
Int16Array
|
The Int16Array constructor ( |
| %Int16ArrayPrototype% |
Int16Array.prototype
|
The initial value of the prototype data property of %Int16Array%
|
| %Int32Array% |
Int32Array
|
The Int32Array constructor ( |
| %Int32ArrayPrototype% |
Int32Array.prototype
|
The initial value of the prototype data property of %Int32Array%
|
|
|
isFinite
|
The isFinite function ( |
|
|
isNaN
|
The isNaN function ( |
|
|
An object that all standard built-in iterator objects indirectly inherit from | |
|
|
JSON
|
The JSON object ( |
|
|
Map
|
The Map constructor ( |
|
|
The prototype of Map iterator objects ( |
|
|
|
Map.prototype
|
The initial value of the prototype data property of |
|
|
Math
|
The Math object ( |
|
|
Number
|
The Number constructor ( |
|
|
Number.prototype
|
The initial value of the prototype property of |
|
|
Object
|
The Object constructor ( |
|
|
Object.prototype
|
The initial value of the prototype data property of |
|
|
Object.prototype.toString
|
The initial value of the toString data property of |
|
|
Object.prototype.valueOf
|
The initial value of the valueOf data property of |
|
|
parseFloat
|
The parseFloat function ( |
|
|
parseInt
|
The parseInt function ( |
|
|
Promise
|
The Promise constructor ( |
|
|
Promise.prototype
|
The initial value of the prototype data property of |
|
|
Proxy
|
The Proxy constructor ( |
| %RangeError% |
RangeError
|
The RangeError constructor ( |
| %RangeErrorPrototype% |
RangeError.prototype
|
The initial value of the prototype property of %RangeError%
|
| %ReferenceError% |
ReferenceError
|
The ReferenceError constructor ( |
| %ReferenceErrorPrototype% |
ReferenceError.prototype
|
The initial value of the prototype property of %ReferenceError%
|
|
|
Reflect
|
The Reflect object ( |
|
|
RegExp
|
The RegExp constructor ( |
|
|
RegExp.prototype
|
The initial value of the prototype data property of |
|
|
Set
|
The Set constructor ( |
|
|
The prototype of Set iterator objects ( |
|
|
|
Set.prototype
|
The initial value of the prototype data property of |
|
|
String
|
The String constructor ( |
|
|
The prototype of String iterator objects ( |
|
|
|
String.prototype
|
The initial value of the prototype data property of |
|
|
Symbol
|
The Symbol constructor ( |
|
|
Symbol.prototype
|
The initial value of the prototype data property of |
| %SyntaxError% |
SyntaxError
|
The SyntaxError constructor ( |
| %SyntaxErrorPrototype% |
SyntaxError.prototype
|
The initial value of the prototype property of %SyntaxError%
|
|
|
A function object that unconditionally throws a new instance of %TypeError% | |
|
|
The super class of all typed Array constructors ( |
|
|
|
The initial value of the prototype property of |
|
| %TypeError% |
TypeError
|
The TypeError constructor ( |
| %TypeErrorPrototype% |
TypeError.prototype
|
The initial value of the prototype property of %TypeError%
|
| %Uint8Array% |
Uint8Array
|
The Uint8Array constructor ( |
| %Uint8ArrayPrototype% |
Uint8Array.prototype
|
The initial value of the prototype data property of %Uint8Array%
|
| %Uint8ClampedArray% |
Uint8ClampedArray
|
The Uint8ClampedArray constructor ( |
| %Uint8ClampedArrayPrototype% |
Uint8ClampedArray.prototype
|
The initial value of the prototype data property of %Uint8ClampedArray%
|
| %Uint16Array% |
Uint16Array
|
The Uint16Array constructor ( |
| %Uint16ArrayPrototype% |
Uint16Array.prototype
|
The initial value of the prototype data property of %Uint16Array%
|
| %Uint32Array% |
Uint32Array
|
The Uint32Array constructor ( |
| %Uint32ArrayPrototype% |
Uint32Array.prototype
|
The initial value of the prototype data property of %Uint32Array%
|
| %URIError% |
URIError
|
The URIError constructor ( |
| %URIErrorPrototype% |
URIError.prototype
|
The initial value of the prototype property of %URIError%
|
|
|
WeakMap
|
The WeakMap constructor ( |
|
|
WeakMap.prototype
|
The initial value of the prototype data property of |
|
|
WeakSet
|
The WeakSet constructor ( |
|
|
WeakSet.prototype
|
The initial value of the prototype data property of |
6.2ECMAScript Specification Types#
A specification type corresponds to meta-values that are used within algorithms to describe the semantics of ECMAScript language constructs and ECMAScript language types. The specification types are
6.2.1The List and Record Specification Types#
The List type is used to explain the evaluation of argument lists (see new expressions, in function calls, and in other algorithms where a simple ordered list of values is needed. Values of the List type are simply ordered sequences of list elements containing the individual values. These sequences may be of any length. The elements of a list may be randomly accessed using 0-origin indices. For notational convenience an array-like syntax can be used to access List elements. For example, arguments[2] is shorthand for saying the 3rd element of the List arguments.
For notational convenience within this specification, a literal syntax can be used to express a new List value. For example, « 1, 2 » defines a List value that has two elements each of which is initialized to a specific value. A new empty List can be expressed as « ».
The Record type is used to describe data aggregations within the algorithms of this specification. A Record type value consists of one or more named fields. The value of each field is either an ECMAScript value or an abstract value represented by a name associated with the Record type. Field names are always enclosed in double brackets, for example [[Value]].
For notational convenience within this specification, an object literal-like syntax can be used to express a Record value. For example, {[[Field1]]: 42, [[Field2]]:
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]]:
6.2.2The Completion Record Specification Type#
The Completion type is a break, continue, return and throw) that perform nonlocal transfers of control.
Values of the Completion type are
| Field | Value | Meaning |
|---|---|---|
| [[Type]] |
One of |
The type of completion that occurred. |
| [[Value]] |
any |
The value that was produced. |
| [[Target]] |
any ECMAScript string or |
The target label for directed control transfers. |
The term “abrupt completion” refers to any completion with a [[Type]] value other than
6.2.2.1NormalCompletion#
The abstract operation NormalCompletion with a single argument, such as:
- Return
NormalCompletion (argument).
Is a shorthand that is defined as follows:
- Return
Completion {[[Type]]:normal , [[Value]]: argument, [[Target]]:empty }.
6.2.2.2Implicit Completion Values#
The algorithms of this specification often implicitly return
- Return
"Infinity".
means the same thing as:
- Return
NormalCompletion ("Infinity").
However, if the value expression of a “return” statement is a
The abstract operation
- Assert: completionRecord is a
Completion Record . - Return completionRecord as the
Completion Record of this abstract operation.
A “return” statement without a value in an algorithm step means the same thing as:
- Return
NormalCompletion (undefined ).
Any reference to a
6.2.2.3Throw an Exception#
Algorithms steps that say to throw an exception, such as
- Throw a
TypeError exception.
mean the same things as:
- Return
Completion {[[Type]]:throw , [[Value]]: a newly createdTypeError object, [[Target]]:empty }.
6.2.2.4ReturnIfAbrupt#
Algorithms steps that say or are otherwise equivalent to:
ReturnIfAbrupt (argument).
mean the same thing as:
- If argument is an
abrupt completion , return argument. - Else if argument is a
Completion Record , let argument be argument.[[Value]].
Algorithms steps that say or are otherwise equivalent to:
ReturnIfAbrupt (AbstractOperation()).
mean the same thing as:
- Let hygienicTemp be AbstractOperation().
- If hygienicTemp is an
abrupt completion , return hygienicTemp. - Else if hygienicTemp is a
Completion Record , let hygienicTemp be hygienicTemp.[[Value]].
Where hygienicTemp is ephemeral and visible only in the steps pertaining to ReturnIfAbrupt.
6.2.2.5UpdateEmpty ( completionRecord, value)#
The abstract operation UpdateEmpty with arguments completionRecord and value performs the following steps:
- Assert: If completionRecord.[[Type]] is either
return orthrow , then completionRecord.[[Value]] is notempty . - If completionRecord.[[Value]] is not
empty , returnCompletion (completionRecord). - Return
Completion {[[Type]]: completionRecord.[[Type]], [[Value]]: value, [[Target]]: completionRecord.[[Target]] }.
6.2.3The Reference Specification Type#
The Reference type is used to explain the behaviour of such operators as delete, typeof, the assignment operators, the super keyword and other language features. For example, the left-hand operand of an assignment is expected to produce a reference.
A Reference is a resolved name or property binding. A Reference consists of three components, the base value, the referenced name and the Boolean valued strict reference flag. The base value is either
A Super Reference is a Reference that is used to represents a name binding that was expressed using the super keyword. A Super Reference has an additional thisValue component and its base value will never be an
The following abstract operations are used in this specification to access the components of references:
- GetBase(V). Returns the base value component of the reference V.
- GetReferencedName(V). Returns the referenced name component of the reference V.
- IsStrictReference(V). Returns the strict reference flag component of the reference V.
-
HasPrimitiveBase(V). Returns
true ifType (base) is Boolean, String, Symbol, or Number. -
IsPropertyReference(V). Returns
true if either the base value is an object or HasPrimitiveBase(V) istrue ; otherwise returnsfalse . -
IsUnresolvableReference(V). Returns
true if the base value isundefined andfalse otherwise. -
IsSuperReference(V). Returns
true if this reference has a thisValue component.
The following abstract operations are used in this specification to operate on references:
6.2.3.1GetValue (V)#
ReturnIfAbrupt (V).- If
Type (V) is notReference , return V. - Let base be GetBase(V).
- If IsUnresolvableReference(V) is
true , throw aReferenceError exception. - If IsPropertyReference(V) is
true , then- If HasPrimitiveBase(V) is
true , then- Assert: In this case, base will never be
null orundefined . - Let base be
ToObject (base).
- Assert: In this case, base will never be
- Return ? base.[[Get]](GetReferencedName(V),
GetThisValue (V)).
- If HasPrimitiveBase(V) is
- Else base must be an
Environment Record ,- Return ? base.GetBindingValue(GetReferencedName(V), IsStrictReference(V)) (see
8.1.1 ).
- Return ? base.GetBindingValue(GetReferencedName(V), IsStrictReference(V)) (see
The object that may be created in step 5.a.ii is not accessible outside of the above abstract operation and the ordinary object [[Get]] internal method. An implementation might choose to avoid the actual creation of the object.
6.2.3.2PutValue (V, W)#
ReturnIfAbrupt (V).ReturnIfAbrupt (W).- If
Type (V) is notReference , throw aReferenceError exception. - Let base be GetBase(V).
- If IsUnresolvableReference(V) is
true , then- If IsStrictReference(V) is
true , then- Throw a
ReferenceError exception.
- Throw a
- Let globalObj be
GetGlobalObject (). - Return ?
Set (globalObj, GetReferencedName(V), W,false ).
- If IsStrictReference(V) is
- Else if IsPropertyReference(V) is
true , then- If HasPrimitiveBase(V) is
true , then- Assert: In this case, base will never be
null orundefined . - Set base to
ToObject (base).
- Assert: In this case, base will never be
- Let succeeded be ? base.[[Set]](GetReferencedName(V), W,
GetThisValue (V)). - If succeeded is
false and IsStrictReference(V) istrue , throw aTypeError exception. - Return.
- If HasPrimitiveBase(V) is
- Else base must be an
Environment Record ,- Return ? base.SetMutableBinding(GetReferencedName(V), W, IsStrictReference(V)) (see
8.1.1 ).
- Return ? base.SetMutableBinding(GetReferencedName(V), W, IsStrictReference(V)) (see
The object that may be created in step 6.a.ii is not accessible outside of the above algorithm and the ordinary object [[Set]] internal method. An implementation might choose to avoid the actual creation of that object.
6.2.3.3GetThisValue (V)#
- Assert: IsPropertyReference(V) is
true . - If IsSuperReference(V) is
true , then- Return the value of the thisValue component of the reference V.
- Return GetBase(V).
6.2.3.4InitializeReferencedBinding (V, W)#
ReturnIfAbrupt (V).ReturnIfAbrupt (W).- Assert:
Type (V) isReference . - Assert: IsUnresolvableReference(V) is
false . - Let base be GetBase(V).
- Assert: base is an
Environment Record . - Return base.InitializeBinding(GetReferencedName(V), W).
6.2.4The Property Descriptor Specification Type#
The Property Descriptor type is used to explain the manipulation and reification of Object property attributes. Values of the Property Descriptor type are Records. Each field's name is an attribute name and its value is a corresponding attribute value as specified in
Property Descriptor values may be further classified as data Property Descriptors and accessor Property Descriptors based upon the existence or use of certain fields. A data Property Descriptor is one that includes any fields named either [[Value]] or [[Writable]]. An accessor Property Descriptor is one that includes any fields named either [[Get]] or [[Set]]. Any Property Descriptor may have fields named [[Enumerable]] and [[Configurable]]. A Property Descriptor value may not be both a data Property Descriptor and an accessor Property Descriptor; however, it may be neither. A generic Property Descriptor is a Property Descriptor value that is neither a data Property Descriptor nor an accessor Property Descriptor. A fully populated Property Descriptor is one that is either an accessor Property Descriptor or a data Property Descriptor and that has all of the fields that correspond to the property attributes defined in either
The following abstract operations are used in this specification to operate upon Property Descriptor values:
6.2.4.1IsAccessorDescriptor ( Desc )#
When the abstract operation IsAccessorDescriptor is called with
- If Desc is
undefined , returnfalse . - If both Desc.[[Get]] and Desc.[[Set]] are absent, return
false . - Return
true .
6.2.4.2IsDataDescriptor ( Desc )#
When the abstract operation IsDataDescriptor is called with
- If Desc is
undefined , returnfalse . - If both Desc.[[Value]] and Desc.[[Writable]] are absent, return
false . - Return
true .
6.2.4.3IsGenericDescriptor ( Desc )#
When the abstract operation IsGenericDescriptor is called with
- If Desc is
undefined , returnfalse . - If
IsAccessorDescriptor (Desc) andIsDataDescriptor (Desc) are bothfalse , returntrue . - Return
false .
6.2.4.4FromPropertyDescriptor ( Desc )#
When the abstract operation FromPropertyDescriptor is called with
- If Desc is
undefined , returnundefined . - Let obj be
ObjectCreate (%ObjectPrototype% ). - Assert: obj is an extensible ordinary object with no own properties.
- If Desc has a [[Value]] field, then
- Perform
CreateDataProperty (obj,"value", Desc.[[Value]]).
- Perform
- If Desc has a [[Writable]] field, then
- Perform
CreateDataProperty (obj,"writable", Desc.[[Writable]]).
- Perform
- If Desc has a [[Get]] field, then
- Perform
CreateDataProperty (obj,"get", Desc.[[Get]]).
- Perform
- If Desc has a [[Set]] field, then
- Perform
CreateDataProperty (obj,"set", Desc.[[Set]]).
- Perform
- If Desc has an [[Enumerable]] field, then
- Perform
CreateDataProperty (obj,"enumerable", Desc.[[Enumerable]]).
- Perform
- If Desc has a [[Configurable]] field, then
- Perform
CreateDataProperty (obj,"configurable", Desc.[[Configurable]]).
- Perform
- Assert: all of the above
CreateDataProperty operations returntrue . - Return obj.
6.2.4.5ToPropertyDescriptor ( Obj )#
When the abstract operation ToPropertyDescriptor is called with object Obj, the following steps are taken:
- If
Type (Obj) is not Object, throw aTypeError exception. - Let desc be a new
Property Descriptor that initially has no fields. - Let hasEnumerable be ?
HasProperty (Obj,"enumerable"). - If hasEnumerable is
true , then - Let hasConfigurable be ?
HasProperty (Obj,"configurable"). - If hasConfigurable is
true , then - Let hasValue be ?
HasProperty (Obj,"value"). - If hasValue is
true , then- Let value be ?
Get (Obj,"value"). - Set the [[Value]] field of desc to value.
- Let value be ?
- Let hasWritable be ?
HasProperty (Obj,"writable"). - If hasWritable is
true , then - Let hasGet be ?
HasProperty (Obj,"get"). - If hasGet is
true , then- Let getter be ?
Get (Obj,"get"). - If
IsCallable (getter) isfalse and getter is notundefined , throw aTypeError exception. - Set the [[Get]] field of desc to getter.
- Let getter be ?
- Let hasSet be ?
HasProperty (Obj,"set"). - If hasSet is
true , then- Let setter be ?
Get (Obj,"set"). - If
IsCallable (setter) isfalse and setter is notundefined , throw aTypeError exception. - Set the [[Set]] field of desc to setter.
- Let setter be ?
- If either desc.[[Get]] or desc.[[Set]] is present, then
- If either desc.[[Value]] or desc.[[Writable]] is present, throw a
TypeError exception.
- If either desc.[[Value]] or desc.[[Writable]] is present, throw a
- Return desc.
6.2.4.6CompletePropertyDescriptor ( Desc )#
When the abstract operation CompletePropertyDescriptor is called with
- Assert: Desc is a
Property Descriptor . - Let like be
Record {[[Value]]:undefined , [[Writable]]:false , [[Get]]:undefined , [[Set]]:undefined , [[Enumerable]]:false , [[Configurable]]:false }. - If either
IsGenericDescriptor (Desc) orIsDataDescriptor (Desc) istrue , then- If Desc does not have a [[Value]] field, set Desc.[[Value]] to like.[[Value]].
- If Desc does not have a [[Writable]] field, set Desc.[[Writable]] to like.[[Writable]].
- Else,
- If Desc does not have a [[Get]] field, set Desc.[[Get]] to like.[[Get]].
- If Desc does not have a [[Set]] field, set Desc.[[Set]] to like.[[Set]].
- If Desc does not have an [[Enumerable]] field, set Desc.[[Enumerable]] to like.[[Enumerable]].
- If Desc does not have a [[Configurable]] field, set Desc.[[Configurable]] to like.[[Configurable]].
- Return Desc.
6.2.5The Lexical Environment and Environment Record Specification Types#
The
6.2.6Data Blocks#
The Data Block specification type is used to describe a distinct and mutable sequence of byte-sized (8 bit) numeric values. 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.
The following abstract operations are used in this specification to operate upon Data Block values:
6.2.6.1CreateByteDataBlock (size)#
When the abstract operation CreateByteDataBlock is called with integer argument size, the following steps are taken:
- Assert: size≥0.
- Let db be a new
Data Block value consisting of size bytes. If it is impossible to create such aData Block , throw aRangeError exception. - Set all of the bytes of db to 0.
- Return db.
6.2.6.2CopyDataBlockBytes (toBlock, toIndex, fromBlock, fromIndex, count)#
When the abstract operation CopyDataBlockBytes is called, the following steps are taken:
- Assert: fromBlock and toBlock are distinct
Data Block values. - Assert: fromIndex, toIndex, and count are integer values ≥ 0.
- Let fromSize be the number of bytes in fromBlock.
- Assert: fromIndex+count ≤ fromSize.
- Let toSize be the number of bytes in toBlock.
- Assert: toIndex+count ≤ toSize.
- Repeat, while count>0
- Set toBlock[toIndex] to the value of fromBlock[fromIndex].
- Increment toIndex and fromIndex each by 1.
- Decrement count by 1.
- Return
NormalCompletion (empty ).
7Abstract Operations#
These operations are not a part of the ECMAScript language; they are defined here to solely to aid the specification of the semantics of the ECMAScript language. Other, more specialized abstract operations are defined throughout this specification.
7.1Type Conversion#
The ECMAScript language implicitly performs automatic type conversion as needed. To clarify the semantics of certain constructs it is useful to define a set of conversion abstract operations. The conversion abstract operations are polymorphic; they can accept a value of any
7.1.1ToPrimitive ( input [ , PreferredType ] )#
The abstract operation ToPrimitive takes an input argument and an optional argument PreferredType. The abstract operation ToPrimitive converts its input argument to a non-Object type. If an object is capable of converting to more than one primitive type, it may use the optional hint PreferredType to favour that type. Conversion occurs according to
| Input Type | Result |
|---|---|
| Undefined | Return input. |
| Null | Return input. |
| Boolean | Return input. |
| Number | Return input. |
| String | Return input. |
| Symbol | Return input. |
| Object | Perform the steps following this table. |
When
- If PreferredType was not passed, let hint be
"default". - Else if PreferredType is hint String, let hint be
"string". - Else PreferredType is hint Number, let hint be
"number". - Let exoticToPrim be ?
GetMethod (input, @@toPrimitive). - If exoticToPrim is not
undefined , then - If hint is
"default", let hint be"number". - Return ? OrdinaryToPrimitive(input, hint).
When the abstract operation OrdinaryToPrimitive is called with arguments O and hint, the following steps are taken:
- Assert:
Type (O) is Object. - Assert:
Type (hint) is String and its value is either"string"or"number". - If hint is
"string", then- Let methodNames be «
"toString","valueOf"».
- Let methodNames be «
- Else,
- Let methodNames be «
"valueOf","toString"».
- Let methodNames be «
- For each name in methodNames in
List order, do- Let method be ?
Get (O, name). - If
IsCallable (method) istrue , then
- Let method be ?
- Throw a
TypeError exception.
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
7.1.2ToBoolean ( argument )#
The abstract operation ToBoolean converts argument to a value of type Boolean according to
| Argument Type | Result |
|---|---|
| Undefined |
Return |
| Null |
Return |
| Boolean | Return argument. |
| Number |
Return |
| String |
Return |
| Symbol |
Return |
| Object |
Return |
7.1.3ToNumber ( argument )#
The abstract operation ToNumber converts argument to a value of type Number according to
| Argument Type | Result |
|---|---|
| Undefined |
Return |
| Null |
Return |
| Boolean |
Return 1 if argument is |
| Number | Return argument (no conversion). |
| String | See grammar and conversion algorithm below. |
| Symbol |
Throw a |
| Object |
Apply the following steps:
|
7.1.3.1ToNumber Applied to the String Type#
The terminal symbols of this grammar are all composed of Unicode BMP code points so the result will be
Syntax
All grammar symbols not explicitly defined above have the definitions used in the Lexical Grammar for numeric literals (
Some differences should be noted between the syntax of a
-
A
StringNumericLiteral may include leading and/or trailing white space and/or line terminators. -
A
StringNumericLiteral that is decimal may have any number of leading0digits. -
A
StringNumericLiteral that is decimal may include a+or-to indicate its sign. -
A
StringNumericLiteral that is empty or contains only white space is converted to+0 . -
Infinityand-Infinityare recognized as aStringNumericLiteral but not as aNumericLiteral .
7.1.3.1.1Runtime Semantics: MV's#
The conversion of a String to a Number value is similar overall to the determination of the Number value for a numeric literal (see
-
The MV of
is 0.StringNumericLiteral ::: [empty] -
The MV of
is 0.StringNumericLiteral ::: StrWhiteSpace -
The MV of
is the MV ofStringNumericLiteral ::: StrWhiteSpace opt StrNumericLiteral StrWhiteSpace opt StrNumericLiteral , no matter whether white space is present or not. -
The MV of
is the MV ofStrNumericLiteral ::: StrDecimalLiteral StrDecimalLiteral . -
The MV of
is the MV ofStrNumericLiteral ::: BinaryIntegerLiteral BinaryIntegerLiteral . -
The MV of
is the MV ofStrNumericLiteral ::: OctalIntegerLiteral OctalIntegerLiteral . -
The MV of
is the MV ofStrNumericLiteral ::: HexIntegerLiteral HexIntegerLiteral . -
The MV of
is the MV ofStrDecimalLiteral ::: StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral . -
The MV of
is the MV ofStrDecimalLiteral ::: + StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral . -
The MV of
is the negative of the MV ofStrDecimalLiteral ::: - StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral . (Note that if the MV ofStrUnsignedDecimalLiteral is 0, the negative of this MV is also 0. The rounding rule described below handles the conversion of this signless mathematical zero to a floating-point+0 or-0 as appropriate.) -
The MV of
is 1010000 (a value so large that it will round toStrUnsignedDecimalLiteral ::: Infinity +∞ ). -
The MV of
is the MV ofStrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigits . -
The MV of
is the MV of the firstStrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigits DecimalDigits plus (the MV of the secondDecimalDigits times10-n ), where n is the number of code points in the secondDecimalDigits . -
The MV of
is the MV ofStrUnsignedDecimalLiteral ::: DecimalDigits . ExponentPart DecimalDigits times 10e, where e is the MV ofExponentPart . -
The MV of
is (the MV of the firstStrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigits ExponentPart DecimalDigits plus (the MV of the secondDecimalDigits times10-n )) times10e , where n is the number of code points in the secondDecimalDigits and e is the MV ofExponentPart . -
The MV of
is the MV ofStrUnsignedDecimalLiteral ::: . DecimalDigits DecimalDigits times10-n , where n is the number of code points inDecimalDigits . -
The MV of
is the MV ofStrUnsignedDecimalLiteral ::: . DecimalDigits ExponentPart DecimalDigits times10e-n , where n is the number of code points inDecimalDigits and e is the MV ofExponentPart . -
The MV of
is the MV ofStrUnsignedDecimalLiteral ::: DecimalDigits DecimalDigits . -
The MV of
is the MV ofStrUnsignedDecimalLiteral ::: DecimalDigits ExponentPart DecimalDigits times10e , where e is the MV ofExponentPart .
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 "-", in which case the rounded value is
-
it is not
0; or -
there is a nonzero digit to its left and there is a nonzero digit, not in the
ExponentPart , to its right.
7.1.4ToInteger ( argument )#
The abstract operation ToInteger converts argument to an integral numeric value. This abstract operation functions as follows:
7.1.5ToInt32 ( argument )#
The abstract operation ToInt32 converts argument to one of 232 integer values in the range
Given the above definition of ToInt32:
- The ToInt32 abstract operation is idempotent: if applied to a result that it produced, the second application leaves that value unchanged.
-
ToInt32(
ToUint32 (x)) is equal to ToInt32(x) for all values of x. (It is to preserve this latter property that+∞ and-∞ are mapped to+0 .) -
ToInt32 maps
-0 to+0 .
7.1.6ToUint32 ( argument )#
The abstract operation ToUint32 converts argument to one of 232 integer values in the range 0 through
Given the above definition of ToUint32:
-
Step 5 is the only difference between ToUint32 and
ToInt32 . - The ToUint32 abstract operation is idempotent: if applied to a result that it produced, the second application leaves that value unchanged.
-
ToUint32(
ToInt32 (x)) is equal to ToUint32(x) for all values of x. (It is to preserve this latter property that+∞ and-∞ are mapped to+0 .) -
ToUint32 maps
-0 to+0 .
7.1.7ToInt16 ( argument )#
The abstract operation ToInt16 converts argument to one of 216 integer values in the range -32768 through 32767, inclusive. This abstract operation functions as follows:
7.1.8ToUint16 ( argument )#
The abstract operation ToUint16 converts argument to one of 216 integer values in the range 0 through
Given the above definition of ToUint16:
-
The substitution of 216 for 232 in step 4 is the only difference between
ToUint32 and ToUint16. -
ToUint16 maps
-0 to+0 .
7.1.9ToInt8 ( argument )#
The abstract operation ToInt8 converts argument to one of 28 integer values in the range -128 through 127, inclusive. This abstract operation functions as follows:
7.1.10ToUint8 ( argument )#
The abstract operation ToUint8 converts argument to one of 28 integer values in the range 0 through 255, inclusive. This abstract operation functions as follows:
7.1.11ToUint8Clamp ( argument )#
The abstract operation ToUint8Clamp converts argument to one of 28 integer values in the range 0 through 255, inclusive. This abstract operation functions as follows:
Unlike the other ECMAScript integer conversion abstract operation, ToUint8Clamp rounds rather than truncates non-integer values and does not convert Math.round which does “round half up” tie-breaking.
7.1.12ToString ( argument )#
The abstract operation ToString converts argument to a value of type String according to
| Argument Type | Result |
|---|---|
| Undefined |
Return "undefined".
|
| Null |
Return "null".
|
| Boolean |
If argument is If argument is |
| Number |
See |
| String | Return argument. |
| Symbol |
Throw a |
| Object |
Apply the following steps:
|
7.1.12.1ToString Applied to the Number Type#
The abstract operation
- If m is
NaN , return the String"NaN". - If m is
+0 or-0 , return the String"0". - If m is less than zero, return the String concatenation of the String
"-"andToString (-m). - If m is
+∞ , return the String"Infinity". - Otherwise, let n, k, and s be integers such that k ≥ 1, 10k-1 ≤ s < 10k, the Number value for s × 10n-k is m, and k is as small as possible. Note that k is the number of digits in the decimal representation of s, that s is not divisible by 10, and that the least significant digit of s is not necessarily uniquely determined by these criteria.
- If k ≤ n ≤ 21, return the String consisting of the code units of the k digits of the decimal representation of s (in order, with no leading zeroes), followed by n-k occurrences of the code unit 0x0030 (DIGIT ZERO).
- If 0 < n ≤ 21, return the String consisting of the code units of the most significant n digits of the decimal representation of s, followed by the code unit 0x002E (FULL STOP), followed by the code units of the remaining k-n digits of the decimal representation of s.
- If -6 < n ≤ 0, return the String consisting of the code unit 0x0030 (DIGIT ZERO), followed by the code unit 0x002E (FULL STOP), followed by -n occurrences of the code unit 0x0030 (DIGIT ZERO), followed by the code units of the k digits of the decimal representation of s.
- Otherwise, if k = 1, return the String consisting of the code unit of the single digit of s, followed by code unit 0x0065 (LATIN SMALL LETTER E), followed by the code unit 0x002B (PLUS SIGN) or the code unit 0x002D (HYPHEN-MINUS) according to whether n-1 is positive or negative, followed by the code units of the decimal representation of the integer
abs (n-1) (with no leading zeroes). - Return the String consisting of the code units of the most significant digit of the decimal representation of s, followed by code unit 0x002E (FULL STOP), followed by the code units of the remaining k-1 digits of the decimal representation of s, followed by code unit 0x0065 (LATIN SMALL LETTER E), followed by code unit 0x002B (PLUS SIGN) or the code unit 0x002D (HYPHEN-MINUS) according to whether n-1 is positive or negative, followed by the code units of the decimal representation of the integer
abs (n-1) (with no leading zeroes).
The following observations may be useful as guidelines for implementations, but are not part of the normative requirements of this Standard:
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:
- Otherwise, let n, k, and s be integers such that k ≥ 1, 10k-1 ≤ s < 10k, the Number value for s × 10n-k is m, and k is as small as possible. If there are multiple possibilities for s, choose the value of s for which s × 10n-k is closest in value to m. If there are two such possible values of s, choose the one that is even. Note that k is the number of digits in the decimal representation of s and that s is not divisible by 10.
Implementers of ECMAScript may find useful the paper and code written by David M. Gay for binary-to-decimal conversion of floating-point numbers:
Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions. Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). November 30, 1990. Available as
http://ampl.com/REFS/abstracts.html#rounding. Associated code available as
http://netlib.sandia.gov/fp/dtoa.c and as
http://netlib.sandia.gov/fp/g_fmt.c and may also be found at the various netlib mirror sites.
7.1.13ToObject ( argument )#
The abstract operation ToObject converts argument to a value of type Object according to
| Argument Type | Result |
|---|---|
| Undefined |
Throw a |
| Null |
Throw a |
| Boolean |
Return a new Boolean object whose [[BooleanData]] internal slot is set to the value of argument. See |
| Number |
Return a new Number object whose [[NumberData]] internal slot is set to the value of argument. See |
| String |
Return a new String object whose [[StringData]] internal slot is set to the value of argument. See |
| Symbol |
Return a new Symbol object whose [[SymbolData]] internal slot is set to the value of argument. See |
| Object | Return argument. |
7.1.14ToPropertyKey ( argument )#
The abstract operation ToPropertyKey converts argument to a value that can be used as a property key by performing the following steps:
- Let key be ?
ToPrimitive (argument, hint String). - If
Type (key) is Symbol, then- Return key.
- Return !
ToString (key).
7.1.15ToLength ( argument )#
The abstract operation ToLength converts argument to an integer suitable for use as the length of an array-like object. It performs the following steps:
7.1.16CanonicalNumericIndexString ( argument )#
The abstract operation CanonicalNumericIndexString returns argument converted to a numeric value if it is a String representation of a Number that would be produced by "-0". Otherwise, it returns
A canonical numeric string is any String value for which the CanonicalNumericIndexString abstract operation does not return
7.2Testing and Comparison Operations#
7.2.1RequireObjectCoercible ( argument )#
The abstract operation RequireObjectCoercible throws an error if argument is a value that cannot be converted to an Object using
| Argument Type | Result |
|---|---|
| Undefined |
Throw a |
| Null |
Throw a |
| Boolean | Return argument. |
| Number | Return argument. |
| String | Return argument. |
| Symbol | Return argument. |
| Object | Return argument. |
7.2.2IsArray ( argument )#
The abstract operation IsArray takes one argument argument, and performs the following steps:
- If
Type (argument) is not Object, returnfalse . - If argument is an Array exotic object, return
true . - If argument is a Proxy exotic object, then
- If the value of the [[ProxyHandler]] internal slot of argument is
null , throw aTypeError exception. - Let target be the value of the [[ProxyTarget]] internal slot of argument.
- Return ?
IsArray (target).
- If the value of the [[ProxyHandler]] internal slot of argument is
- Return
false .
7.2.3IsCallable ( argument )#
The abstract operation IsCallable determines if argument, which must be an
- If
Type (argument) is not Object, returnfalse . - If argument has a [[Call]] internal method, return
true . - Return
false .
7.2.4IsConstructor ( argument )#
The abstract operation IsConstructor determines if argument, which must be an
- If
Type (argument) is not Object, returnfalse . - If argument has a [[Construct]] internal method, return
true . - Return
false .
7.2.5IsExtensible (O)#
The abstract operation IsExtensible is used to determine whether additional properties can be added to the object that is O. A Boolean value is returned. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Return ? O.[[IsExtensible]]().
7.2.6IsInteger ( argument )#
The abstract operation IsInteger determines if argument is a finite integer numeric value.
7.2.7IsPropertyKey ( argument )#
The abstract operation IsPropertyKey determines if argument, which must be an
7.2.8IsRegExp ( argument )#
The abstract operation IsRegExp with argument argument performs the following steps:
7.2.9SameValue (x, y)#
The internal comparison abstract operation SameValue(x, y), where x and y are ECMAScript language values, produces
- If
Type (x) is different fromType (y), returnfalse . - If
Type (x) is Number, then- If x is
NaN and y isNaN , returntrue . - If x is
+0 and y is-0 , returnfalse . - If x is
-0 and y is+0 , returnfalse . - If x is the same Number value as y, return
true . - Return
false .
- If x is
- Return
SameValueNonNumber (x, y).
This algorithm differs from the
7.2.10SameValueZero (x, y)#
The internal comparison abstract operation SameValueZero(x, y), where x and y are ECMAScript language values, produces
- If
Type (x) is different fromType (y), returnfalse . - If
Type (x) is Number, then- If x is
NaN and y isNaN , returntrue . - If x is
+0 and y is-0 , returntrue . - If x is
-0 and y is+0 , returntrue . - If x is the same Number value as y, return
true . - Return
false .
- If x is
- Return
SameValueNonNumber (x, y).
SameValueZero differs from
7.2.11SameValueNonNumber (x, y)#
The internal comparison abstract operation SameValueNonNumber(x, y), where neither x nor y are Number values, produces
- Assert:
Type (x) is not Number. - Assert:
Type (x) is the same asType (y). - If
Type (x) is Undefined, returntrue . - If
Type (x) is Null, returntrue . - If
Type (x) is String, then- If x and y are exactly the same sequence of code units (same length and same code units at corresponding indices), return
true ; otherwise, returnfalse .
- If x and y are exactly the same sequence of code units (same length and same code units at corresponding indices), return
- If
Type (x) is Boolean, then- If x and y are both
true or bothfalse , returntrue ; otherwise, returnfalse .
- If x and y are both
- If
Type (x) is Symbol, then- If x and y are both the same Symbol value, return
true ; otherwise, returnfalse .
- If x and y are both the same Symbol value, return
- Return
true if x and y are the same Object value. Otherwise, returnfalse .
7.2.12Abstract Relational Comparison#
The comparison x < y, where x and y are values, produces
- If the LeftFirst flag is
true , then- Let px be ?
ToPrimitive (x, hint Number). - Let py be ?
ToPrimitive (y, hint Number).
- Let px be ?
- Else the order of evaluation needs to be reversed to preserve left to right evaluation
- Let py be ?
ToPrimitive (y, hint Number). - Let px be ?
ToPrimitive (x, hint Number).
- Let py be ?
- If both px and py are Strings, then
- If py is a prefix of px, return
false . (A String value p is a prefix of String value q if q can be the result of concatenating p and some other String r. Note that any String is a prefix of itself, because r may be the empty String.) - If px is a prefix of py, return
true . - Let k be the smallest nonnegative 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.)
- Let m be the integer that is the code unit value at index k within px.
- Let n be the integer that is the code unit value at index k within py.
- If m < n, return
true . Otherwise, returnfalse .
- If py is a prefix of px, return
- Else,
- Let nx be ?
ToNumber (px). Because px and py are primitive values evaluation order is not important. - Let ny be ?
ToNumber (py). - If nx is
NaN , returnundefined . - If ny is
NaN , returnundefined . - If nx and ny are the same Number value, return
false . - If nx is
+0 and ny is-0 , returnfalse . - If nx is
-0 and ny is+0 , returnfalse . - If nx is
+∞ , returnfalse . - If ny is
+∞ , returntrue . - If ny is
-∞ , returnfalse . - If nx is
-∞ , returntrue . - If the mathematical value of nx is less than the mathematical value of ny —note that these mathematical values are both finite and not both zero—return
true . Otherwise, returnfalse .
- Let nx be ?
Step 3 differs from step 7 in the algorithm for the addition operator + (
The comparison of Strings uses a simple lexicographic ordering on sequences of code unit values. There is no attempt to use the more complex, semantically oriented definitions of character or string equality and collating order defined in the Unicode specification. Therefore String values that are canonically equal according to the Unicode standard could test as unequal. In effect this algorithm assumes that both Strings are already in normalized form. Also, note that for strings containing supplementary characters, lexicographic ordering on sequences of UTF-16 code unit values differs from that on sequences of code point values.
7.2.13Abstract Equality Comparison#
The comparison x == y, where x and y are values, produces
- If
Type (x) is the same asType (y), then- Return the result of performing
Strict Equality Comparison x === y.
- Return the result of performing
- If x is
null and y isundefined , returntrue . - If x is
undefined and y isnull , returntrue . - If
Type (x) is Number andType (y) is String, return the result of the comparison x ==ToNumber (y). - If
Type (x) is String andType (y) is Number, return the result of the comparisonToNumber (x) == y. - If
Type (x) is Boolean, return the result of the comparisonToNumber (x) == y. - If
Type (y) is Boolean, return the result of the comparison x ==ToNumber (y). - If
Type (x) is either String, Number, or Symbol andType (y) is Object, return the result of the comparison x ==ToPrimitive (y). - If
Type (x) is Object andType (y) is either String, Number, or Symbol, return the result of the comparisonToPrimitive (x) == y. - Return
false .
7.2.14Strict Equality Comparison#
The comparison x === y, where x and y are values, produces
- If
Type (x) is different fromType (y), returnfalse . - If
Type (x) is Number, then- If x is
NaN , returnfalse . - If y is
NaN , returnfalse . - If x is the same Number value as y, return
true . - If x is
+0 and y is-0 , returntrue . - If x is
-0 and y is+0 , returntrue . - Return
false .
- If x is
- Return
SameValueNonNumber (x, y).
This algorithm differs from the
7.3Operations on Objects#
7.3.1Get (O, P)#
The abstract operation Get is used to retrieve the value of a specific property of an object. The operation is called with arguments O and P where O is the object and P is the property key. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Assert:
IsPropertyKey (P) istrue . - Return ? O.[[Get]](P, O).
7.3.2GetV (V, P)#
The abstract operation GetV is used to retrieve the value of a specific property of an
- Assert:
IsPropertyKey (P) istrue . - Let O be ?
ToObject (V). - Return ? O.[[Get]](P, V).
7.3.3Set (O, P, V, Throw)#
The abstract operation Set is used to set the value of a specific property of an object. The operation is called with arguments O, P, V, and Throw where O is the object, P is the property key, V is the new value for the property and Throw is a Boolean flag. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Assert:
IsPropertyKey (P) istrue . - Assert:
Type (Throw) is Boolean. - Let success be ? O.[[Set]](P, V, O).
- If success is
false and Throw istrue , throw aTypeError exception. - Return success.
7.3.4CreateDataProperty (O, P, V)#
The abstract operation CreateDataProperty is used to create a new own property of an object. The operation is called with arguments O, P, and V where O is the object, P is the property key, and V is the value for the property. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Assert:
IsPropertyKey (P) istrue . - Let newDesc be the PropertyDescriptor{[[Value]]: V, [[Writable]]:
true , [[Enumerable]]:true , [[Configurable]]:true }. - Return ? O.[[DefineOwnProperty]](P, newDesc).
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
7.3.5CreateMethodProperty (O, P, V)#
The abstract operation CreateMethodProperty is used to create a new own property of an object. The operation is called with arguments O, P, and V where O is the object, P is the property key, and V is the value for the property. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Assert:
IsPropertyKey (P) istrue . - Let newDesc be the PropertyDescriptor{[[Value]]: V, [[Writable]]:
true , [[Enumerable]]:false , [[Configurable]]:true }. - Return ? O.[[DefineOwnProperty]](P, newDesc).
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
7.3.6CreateDataPropertyOrThrow (O, P, V)#
The abstract operation CreateDataPropertyOrThrow is used to create a new own property of an object. It throws a
- Assert:
Type (O) is Object. - Assert:
IsPropertyKey (P) istrue . - Let success be ?
CreateDataProperty (O, P, V). - If success is
false , throw aTypeError exception. - Return success.
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
7.3.7DefinePropertyOrThrow (O, P, desc)#
The abstract operation DefinePropertyOrThrow is used to call the [[DefineOwnProperty]] internal method of an object in a manner that will throw a
- Assert:
Type (O) is Object. - Assert:
IsPropertyKey (P) istrue . - Let success be ? O.[[DefineOwnProperty]](P, desc).
- If success is
false , throw aTypeError exception. - Return success.
7.3.8DeletePropertyOrThrow (O, P)#
The abstract operation DeletePropertyOrThrow is used to remove a specific own property of an object. It throws an exception if the property is not configurable. The operation is called with arguments O and P where O is the object and P is the property key. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Assert:
IsPropertyKey (P) istrue . - Let success be ? O.[[Delete]](P).
- If success is
false , throw aTypeError exception. - Return success.
7.3.9GetMethod (V, P)#
The abstract operation GetMethod is used to get the value of a specific property of an
- Assert:
IsPropertyKey (P) istrue . - Let func be ?
GetV (V, P). - If func is either
undefined ornull , returnundefined . - If
IsCallable (func) isfalse , throw aTypeError exception. - Return func.
7.3.10HasProperty (O, P)#
The abstract operation HasProperty is used to determine whether an object has a property with the specified property key. The property may be either an own or inherited. A Boolean value is returned. The operation is called with arguments O and P where O is the object and P is the property key. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Assert:
IsPropertyKey (P) istrue . - Return ? O.[[HasProperty]](P).
7.3.11HasOwnProperty (O, P)#
The abstract operation HasOwnProperty is used to determine whether an object has an own property with the specified property key. A Boolean value is returned. The operation is called with arguments O and P where O is the object and P is the property key. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Assert:
IsPropertyKey (P) istrue . - Let desc be ? O.[[GetOwnProperty]](P).
- If desc is
undefined , returnfalse . - Return
true .
7.3.12Call (F, V [ , argumentsList ])#
The abstract operation Call is used to call the [[Call]] internal method of a function object. The operation is called with arguments F, V, and optionally argumentsList where F is the function object, V is an
- If argumentsList was not passed, let argumentsList be a new empty
List . - If
IsCallable (F) isfalse , throw aTypeError exception. - Return ? F.[[Call]](V, argumentsList).
7.3.13Construct (F [ , argumentsList [ , newTarget ]])#
The abstract operation Construct is used to call the [[Construct]] internal method of a function object. The operation is called with arguments F, and optionally argumentsList, and newTarget where F is the function object. argumentsList and newTarget are the values to be passed as the corresponding arguments of the internal method. If argumentsList is not present, a new empty
- If newTarget was not passed, let newTarget be F.
- If argumentsList was not passed, let argumentsList be a new empty
List . - Assert:
IsConstructor (F) istrue . - Assert:
IsConstructor (newTarget) istrue . - Return ? F.[[Construct]](argumentsList, newTarget).
If newTarget is not passed, this operation is equivalent to: new F(...argumentsList)
7.3.14SetIntegrityLevel (O, level)#
The abstract operation SetIntegrityLevel is used to fix the set of own properties of an object. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Assert: level is either
"sealed"or"frozen". - Let status be ? O.[[PreventExtensions]]().
- If status is
false , returnfalse . - Let keys be ? O.[[OwnPropertyKeys]]().
- If level is
"sealed", then- Repeat for each element k of keys,
- Perform ?
DefinePropertyOrThrow (O, k, PropertyDescriptor{[[Configurable]]:false }).
- Perform ?
- Repeat for each element k of keys,
- Else level is
"frozen",- Repeat for each element k of keys,
- Let currentDesc be ? O.[[GetOwnProperty]](k).
- If currentDesc is not
undefined , then- If
IsAccessorDescriptor (currentDesc) istrue , then- Let desc be the PropertyDescriptor{[[Configurable]]:
false }.
- Let desc be the PropertyDescriptor{[[Configurable]]:
- Else,
- Let desc be the PropertyDescriptor { [[Configurable]]:
false , [[Writable]]:false }.
- Let desc be the PropertyDescriptor { [[Configurable]]:
- Perform ?
DefinePropertyOrThrow (O, k, desc).
- If
- Repeat for each element k of keys,
- Return
true .
7.3.15TestIntegrityLevel (O, level)#
The abstract operation TestIntegrityLevel is used to determine if the set of own properties of an object are fixed. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Assert: level is either
"sealed"or"frozen". - Let status be ?
IsExtensible (O). - If status is
true , returnfalse . - NOTE If the object is extensible, none of its properties are examined.
- Let keys be ? O.[[OwnPropertyKeys]]().
- Repeat for each element k of keys,
- Let currentDesc be ? O.[[GetOwnProperty]](k).
- If currentDesc is not
undefined , then- If currentDesc.[[Configurable]] is
true , returnfalse . - If level is
"frozen"andIsDataDescriptor (currentDesc) istrue , then- If currentDesc.[[Writable]] is
true , returnfalse .
- If currentDesc.[[Writable]] is
- If currentDesc.[[Configurable]] is
- Return
true .
7.3.16CreateArrayFromList (elements)#
The abstract operation CreateArrayFromList is used to create an Array object whose elements are provided by a
- Assert: elements is a
List whose elements are all ECMAScript language values. - Let array be
ArrayCreate (0). - Let n be 0.
- For each element e of elements
- Let status be
CreateDataProperty (array, !ToString (n), e). - Assert: status is
true . - Increment n by 1.
- Let status be
- Return array.
7.3.17CreateListFromArrayLike (obj [ , elementTypes ] )#
The abstract operation CreateListFromArrayLike is used to create a
7.3.18Invoke (V, P [ , argumentsList ])#
The abstract operation Invoke is used to call a method property of an
- Assert:
IsPropertyKey (P) istrue . - If argumentsList was not passed, let argumentsList be a new empty
List . - Let func be ?
GetV (V, P). - Return ?
Call (func, V, argumentsList).
7.3.19OrdinaryHasInstance (C, O)#
The abstract operation OrdinaryHasInstance implements the default algorithm for determining if an object O inherits from the instance object inheritance path provided by constructor C. This abstract operation performs the following steps:
- If
IsCallable (C) isfalse , returnfalse . - If C has a [[BoundTargetFunction]] internal slot, then
- Let BC be the value of C's [[BoundTargetFunction]] internal slot.
- Return ?
InstanceofOperator (O, BC).
- If
Type (O) is not Object, returnfalse . - Let P be ?
Get (C,"prototype"). - If
Type (P) is not Object, throw aTypeError exception. - Repeat
- Let O be ? O.[[GetPrototypeOf]]().
- If O is
null, returnfalse . - If
SameValue (P, O) istrue , returntrue .
7.3.20SpeciesConstructor ( O, defaultConstructor )#
The abstract operation SpeciesConstructor is used to retrieve the constructor that should be used to create new objects that are derived from the argument object O. The defaultConstructor argument is the constructor to use if a constructor @@species property cannot be found starting from O. This abstract operation performs the following steps:
- Assert:
Type (O) is Object. - Let C be ?
Get (O,"constructor"). - If C is
undefined , return defaultConstructor. - If
Type (C) is not Object, throw aTypeError exception. - Let S be ?
Get (C, @@species). - If S is either
undefined ornull , return defaultConstructor. - If
IsConstructor (S) istrue , return S. - Throw a
TypeError exception.
7.3.21EnumerableOwnNames (O)#
When the abstract operation EnumerableOwnNames is called with Object O, the following steps are taken:
- Assert:
Type (O) is Object. - Let ownKeys be ? O.[[OwnPropertyKeys]]().
- Let names be a new empty
List . - Repeat, for each element key of ownKeys in
List order- If
Type (key) is String, then- Let desc be ? O.[[GetOwnProperty]](key).
- If desc is not
undefined , then- If desc.[[Enumerable]] is
true , append key to names.
- If desc.[[Enumerable]] is
- If
- Order the elements of names so they are in the same relative order as would be produced by the Iterator that would be returned if the
EnumerateObjectProperties internal method was invoked with O. - Return names.
7.3.22GetFunctionRealm ( obj )#
The abstract operation GetFunctionRealm with argument obj performs the following steps:
- Assert: obj is a callable object.
- If obj has a [[Realm]] internal slot, then
- Return obj's [[Realm]] internal slot.
- If obj is a Bound Function exotic object, then
- Let target be obj's [[BoundTargetFunction]] internal slot.
- Return ?
GetFunctionRealm (target).
- If obj is a Proxy exotic object, then
- If the value of the [[ProxyHandler]] internal slot of obj is
null , throw aTypeError exception. - Let proxyTarget be the value of obj's [[ProxyTarget]] internal slot.
- Return ?
GetFunctionRealm (proxyTarget).
- If the value of the [[ProxyHandler]] internal slot of obj is
- Return
the current Realm Record .
Step 5 will only be reached if target is a non-standard exotic function object that does not have a [[Realm]] internal slot.
7.4Operations on Iterator Objects#
See Common Iteration Interfaces (
7.4.1GetIterator ( obj [ , method ] )#
The abstract operation GetIterator with argument obj and optional argument method performs the following steps:
7.4.2IteratorNext ( iterator [ , value ] )#
The abstract operation IteratorNext with argument iterator and optional argument value performs the following steps:
7.4.3IteratorComplete ( iterResult )#
The abstract operation IteratorComplete with argument iterResult performs the following steps:
7.4.4IteratorValue ( iterResult )#
The abstract operation IteratorValue with argument iterResult performs the following steps:
7.4.5IteratorStep ( iterator )#
The abstract operation IteratorStep with argument iterator requests the next value from iterator and returns either
- Let result be ?
IteratorNext (iterator). - Let done be ?
IteratorComplete (result). - If done is
true , returnfalse . - Return result.
7.4.6IteratorClose ( iterator, completion )#
The abstract operation IteratorClose with arguments iterator and completion is used to notify an iterator that it should perform any actions it would normally perform when it has reached its completed state:
- Assert:
Type (iterator) is Object. - Assert: completion is a
Completion Record . - Let return be ?
GetMethod (iterator,"return"). - If return is
undefined , returnCompletion (completion). - Let innerResult be
Call (return, iterator, « »). - If completion.[[Type]] is
throw , returnCompletion (completion). - If innerResult.[[Type]] is
throw , returnCompletion (innerResult). - If
Type (innerResult.[[Value]]) is not Object, throw aTypeError exception. - Return
Completion (completion).
7.4.7CreateIterResultObject ( value, done )#
The abstract operation CreateIterResultObject with arguments value and done creates an object that supports the IteratorResult interface by performing the following steps:
- Assert:
Type (done) is Boolean. - Let obj be
ObjectCreate (%ObjectPrototype% ). - Perform
CreateDataProperty (obj,"value", value). - Perform
CreateDataProperty (obj,"done", done). - Return obj.
7.4.8CreateListIterator ( list )#
The abstract operation CreateListIterator with argument list creates an Iterator (
- Let iterator be
ObjectCreate (%IteratorPrototype% , « [[IteratorNext]], [[IteratedList]], [[ListIteratorNextIndex]] »). - Set iterator's [[IteratedList]] internal slot to list.
- Set iterator's [[ListIteratorNextIndex]] internal slot to 0.
- Let next be a new built-in function object as defined in ListIterator
next(7.4.8.1 ). - Set iterator's [[IteratorNext]] internal slot to next.
- Perform
CreateMethodProperty (iterator,"next", next). - Return iterator.
7.4.8.1ListIterator next( )#
The ListIterator next method is a standard built-in function object (clause
- Let O be the
this value. - Let f be the
active function object . - If O does not have a [[IteratorNext]] internal slot, throw a
TypeError exception. - Let next be the value of the [[IteratorNext]] internal slot of O.
- If
SameValue (f, next) isfalse , throw aTypeError exception. - If O does not have an [[IteratedList]] internal slot, throw a
TypeError exception. - Let list be the value of the [[IteratedList]] internal slot of O.
- Let index be the value of the [[ListIteratorNextIndex]] internal slot of O.
- Let len be the number of elements of list.
- If index ≥ len, then
- Return
CreateIterResultObject (undefined ,true ).
- Return
- Set the value of the [[ListIteratorNextIndex]] internal slot of O to index+1.
- Return
CreateIterResultObject (list[index],false ).
A ListIterator next method will throw an exception if applied to any object other than the one with which it was originally associated.
8Executable Code and Execution Contexts#
8.1Lexical Environments#
A Lexical Environment is a specification type used to define the association of
An
The outer environment reference is used to model the logical nesting of Lexical Environment values. The outer reference of a (inner) Lexical Environment is a reference to the Lexical Environment that logically surrounds the inner Lexical Environment. An outer Lexical Environment may, of course, have its own outer Lexical Environment. A Lexical Environment may serve as the outer environment for multiple inner Lexical Environments. For example, if a
A global environment is a Lexical Environment which does not have an outer environment. The global environment's outer environment reference is
A module environment is a Lexical Environment that contains the bindings for the top level declarations of a
A function environment is a Lexical Environment that corresponds to the invocation of an ECMAScript function object. A function environment may establish a new this binding. A function environment also captures the state necessary to support super method invocations.
Lexical Environments and
8.1.1Environment Records#
There are two primary kinds of Environment Record values used in this specification: declarative Environment Records and object Environment Records. Declarative Environment Records are used to define the effect of ECMAScript language syntactic elements such as
For specification purposes Environment Record values are values of the
| Method | Purpose |
|---|---|
| HasBinding(N) |
Determine if an Environment Record has a binding for the String value N. Return |
| CreateMutableBinding(N, D) |
Create a new but uninitialized mutable binding in an Environment Record. The String value N is the text of the bound name. If the Boolean argument D is |
| CreateImmutableBinding(N, S) |
Create a new but uninitialized immutable binding in an Environment Record. The String value N is the text of the bound name. If S is |
| InitializeBinding(N, V) |
Set the value of an already existing but uninitialized binding in an Environment Record. The String value N is the text of the bound name. V is the value for the binding and is a value of any |
| SetMutableBinding(N, V, S) |
Set the value of an already existing mutable binding in an Environment Record. The String value N is the text of the bound name. V is the value for the binding and may be a value of any |
| GetBindingValue(N, S) |
Returns the value of an already existing binding from an Environment Record. The String value N is the text of the bound name. S is used to identify references originating in |
| DeleteBinding(N) |
Delete a binding from an Environment Record. The String value N is the text of the bound name. If a binding for N exists, remove the binding and return |
| HasThisBinding() |
Determine if an Environment Record establishes a this binding. Return |
| HasSuperBinding() |
Determine if an Environment Record establishes a super method binding. Return |
| WithBaseObject() |
If this Environment Record is associated with a with statement, return the with object. Otherwise, return |
8.1.1.1Declarative Environment Records#
Each declarative
The behaviour of the concrete specification methods for declarative Environment Records is defined by the following algorithms.
8.1.1.1.1HasBinding (N)#
The concrete
- Let envRec be the declarative
Environment Record for which the method was invoked. - If envRec has a binding for the name that is the value of N, return
true . - Return
false .
8.1.1.1.2CreateMutableBinding (N, D)#
The concrete
- Let envRec be the declarative
Environment Record for which the method was invoked. - Assert: envRec does not already have a binding for N.
- Create a mutable binding in envRec for N and record that it is uninitialized. If D is
true , record that the newly created binding may be deleted by a subsequent DeleteBinding call. - Return
NormalCompletion (empty ).
8.1.1.1.3CreateImmutableBinding (N, S)#
The concrete
- Let envRec be the declarative
Environment Record for which the method was invoked. - Assert: envRec does not already have a binding for N.
- Create an immutable binding in envRec for N and record that it is uninitialized. If S is
true , record that the newly created binding is a strict binding. - Return
NormalCompletion (empty ).
8.1.1.1.4InitializeBinding (N, V)#
The concrete
- Let envRec be the declarative
Environment Record for which the method was invoked. - Assert: envRec must have an uninitialized binding for N.
- Set the bound value for N in envRec to V.
Record that the binding for N in envRec has been initialized.- Return
NormalCompletion (empty ).
8.1.1.1.5SetMutableBinding (N, V, S)#
The concrete
- Let envRec be the declarative
Environment Record for which the method was invoked. - If envRec does not have a binding for N, then
- If S is
true , throw aReferenceError exception. - Perform envRec.CreateMutableBinding(N,
true ). - Perform envRec.InitializeBinding(N, V).
- Return
NormalCompletion (empty ).
- If S is
- If the binding for N in envRec is a strict binding, let S be
true . - If the binding for N in envRec has not yet been initialized, throw a
ReferenceError exception. - Else if the binding for N in envRec is a mutable binding, change its bound value to V.
- Else this must be an attempt to change the value of an immutable binding so if S is
true , throw aTypeError exception. - Return
NormalCompletion (empty ).
An example of ECMAScript code that results in a missing binding at step 2 is:
function f(){eval("var x; x = (delete x, 0);")}
8.1.1.1.6GetBindingValue (N, S)#
The concrete
- Let envRec be the declarative
Environment Record for which the method was invoked. - Assert: envRec has a binding for N.
- If the binding for N in envRec is an uninitialized binding, throw a
ReferenceError exception. - Return the value currently bound to N in envRec.
8.1.1.1.7DeleteBinding (N)#
The concrete
- Let envRec be the declarative
Environment Record for which the method was invoked. - Assert: envRec has a binding for the name that is the value of N.
- If the binding for N in envRec cannot be deleted, return
false . - Remove the binding for N from envRec.
- Return
true .
8.1.1.1.8HasThisBinding ()#
Regular declarative Environment Records do not provide a this binding.
- Return
false .
8.1.1.1.9HasSuperBinding ()#
Regular declarative Environment Records do not provide a super binding.
- Return
false .
8.1.1.1.10WithBaseObject ()#
Declarative Environment Records always return
- Return
undefined .
8.1.1.2Object Environment Records#
Each object
Object Environment Records created for with statements (
The behaviour of the concrete specification methods for object Environment Records is defined by the following algorithms.
8.1.1.2.1HasBinding (N)#
The concrete
- Let envRec be the object
Environment Record for which the method was invoked. - Let bindings be the binding object for envRec.
- Let foundBinding be ?
HasProperty (bindings, N). - If foundBinding is
false , returnfalse . - If the withEnvironment flag of envRec is
false , returntrue . - Let unscopables be ?
Get (bindings, @@unscopables). - If
Type (unscopables) is Object, then - Return
true .
8.1.1.2.2CreateMutableBinding (N, D)#
The concrete
- Let envRec be the object
Environment Record for which the method was invoked. - Let bindings be the binding object for envRec.
- If D is
true , let configValue betrue ; otherwise let configValue befalse . - Return ?
DefinePropertyOrThrow (bindings, N, PropertyDescriptor{[[Value]]:undefined , [[Writable]]:true , [[Enumerable]]:true , [[Configurable]]: configValue}).
Normally envRec will not have a binding for N but if it does, the semantics of
8.1.1.2.3CreateImmutableBinding (N, S)#
The concrete
8.1.1.2.4InitializeBinding (N, V)#
The concrete
- Let envRec be the object
Environment Record for which the method was invoked. - Assert: envRec must have an uninitialized binding for N.
Record that the binding for N in envRec has been initialized.- Return ? envRec.SetMutableBinding(N, V,
false ).
In this specification, all uses of CreateMutableBinding for object Environment Records are immediately followed by a call to InitializeBinding for the same name. Hence, implementations do not need to explicitly track the initialization state of individual object
8.1.1.2.5SetMutableBinding (N, V, S)#
The concrete
- Let envRec be the object
Environment Record for which the method was invoked. - Let bindings be the binding object for envRec.
- Return ?
Set (bindings, N, V, S).
8.1.1.2.6GetBindingValue (N, S)#
The concrete
- Let envRec be the object
Environment Record for which the method was invoked. - Let bindings be the binding object for envRec.
- Let value be ?
HasProperty (bindings, N). - If value is
false , then- If S is
false , return the valueundefined ; otherwise throw aReferenceError exception.
- If S is
- Return ?
Get (bindings, N).
8.1.1.2.7DeleteBinding (N)#
The concrete
- Let envRec be the object
Environment Record for which the method was invoked. - Let bindings be the binding object for envRec.
- Return ? bindings.[[Delete]](N).
8.1.1.2.8HasThisBinding ()#
Regular object Environment Records do not provide a this binding.
- Return
false .
8.1.1.2.9HasSuperBinding ()#
Regular object Environment Records do not provide a super binding.
- Return
false .
8.1.1.2.10WithBaseObject ()#
Object Environment Records return
- Let envRec be the object
Environment Record for which the method was invoked. - If the withEnvironment flag of envRec is
true , return the binding object for envRec. - Otherwise, return
undefined .
8.1.1.3Function Environment Records#
A function this binding. If a function is not an super, its function super method invocations from within the function.
Function Environment Records have the additional state fields listed in
| Field Name | Value | Meaning |
|---|---|---|
| [[ThisValue]] | Any |
This is the |
| [[ThisBindingStatus]] |
"lexical" | "initialized" | "uninitialized"
|
If the value is "lexical", this is an |
| [[FunctionObject]] | Object |
The function object whose invocation caused this |
| [[HomeObject]] |
Object | |
If the associated function has super property accesses and is not an |
| [[NewTarget]] |
Object | |
If this |
Function Environment Records support all of the declarative
| Method | Purpose |
|---|---|
| BindThisValue(V) | Set the [[ThisValue]] and record that it has been initialized. |
| GetThisBinding() |
Return the value of this this binding. Throws a this binding has not been initialized.
|
| GetSuperBase() |
Return the object that is the base for super property accesses bound in this super property accesses will produce runtime errors.
|
The behaviour of the additional concrete specification methods for function Environment Records is defined by the following algorithms:
8.1.1.3.1BindThisValue (V)#
- Let envRec be the function
Environment Record for which the method was invoked. - Assert: envRec.[[ThisBindingStatus]] is not
"lexical". - If envRec.[[ThisBindingStatus]] is
"initialized", throw aReferenceError exception. - Set envRec.[[ThisValue]] to V.
- Set envRec.[[ThisBindingStatus]] to
"initialized". - Return V.
8.1.1.3.2HasThisBinding ()#
- Let envRec be the function
Environment Record for which the method was invoked. - If envRec.[[ThisBindingStatus]] is
"lexical", returnfalse ; otherwise, returntrue .
8.1.1.3.3HasSuperBinding ()#
- Let envRec be the function
Environment Record for which the method was invoked. - If envRec.[[ThisBindingStatus]] is
"lexical", returnfalse . - If envRec.[[HomeObject]] has the value
undefined , returnfalse ; otherwise, returntrue .
8.1.1.3.4GetThisBinding ()#
- Let envRec be the function
Environment Record for which the method was invoked. - Assert: envRec.[[ThisBindingStatus]] is not
"lexical". - If envRec.[[ThisBindingStatus]] is
"uninitialized", throw aReferenceError exception. - Return envRec.[[ThisValue]].
8.1.1.3.5GetSuperBase ()#
- Let envRec be the function
Environment Record for which the method was invoked. - Let home be the value of envRec.[[HomeObject]].
- If home has the value
undefined , returnundefined . - Assert:
Type (home) is Object. - Return ? home.[[GetPrototypeOf]]().
8.1.1.4Global Environment Records#
A global
A global
Properties may be created directly on a
Global Environment Records have the additional fields listed in
| Field Name | Value | Meaning |
|---|---|---|
| [[ObjectRecord]] |
Object |
Binding object is the |
| [[GlobalThisValue]] | Object |
The value returned by this in global scope. Hosts may provide any ECMAScript Object value.
|
| [[DeclarativeRecord]] |
Declarative |
Contains bindings for all declarations in global code for the associated |
| [[VarNames]] |
|
The string names bound by |
| Method | Purpose |
|---|---|
| GetThisBinding() |
Return the value of this this binding.
|
| HasVarDeclaration (N) |
Determines if the argument identifier has a binding in this |
| HasLexicalDeclaration (N) |
Determines if the argument identifier has a binding in this |
| HasRestrictedGlobalProperty (N) |
Determines if the argument is the name of a |
| CanDeclareGlobalVar (N) | Determines if a corresponding CreateGlobalVarBinding call would succeed if called for the same argument N. |
| CanDeclareGlobalFunction (N) | Determines if a corresponding CreateGlobalFunctionBinding call would succeed if called for the same argument N. |
| CreateGlobalVarBinding(N, D) |
Used to create and initialize to var binding in the [[ObjectRecord]] component of a global var. The String value N is the bound name. If D is |
| CreateGlobalFunctionBinding(N, V, D) |
Create and initialize a global function binding in the [[ObjectRecord]] component of a global function. The String value N is the bound name. V is the initialization value. If the Boolean argument D is |
The behaviour of the concrete specification methods for global Environment Records is defined by the following algorithms.
8.1.1.4.1HasBinding (N)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let DclRec be envRec.[[DeclarativeRecord]].
- If DclRec.HasBinding(N) is
true , returntrue . - Let ObjRec be envRec.[[ObjectRecord]].
- Return ? ObjRec.HasBinding(N).
8.1.1.4.2CreateMutableBinding (N, D)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let DclRec be envRec.[[DeclarativeRecord]].
- If DclRec.HasBinding(N) is
true , throw aTypeError exception. - Return DclRec.CreateMutableBinding(N, D).
8.1.1.4.3CreateImmutableBinding (N, S)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let DclRec be envRec.[[DeclarativeRecord]].
- If DclRec.HasBinding(N) is
true , throw aTypeError exception. - Return DclRec.CreateImmutableBinding(N, S).
8.1.1.4.4InitializeBinding (N, V)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let DclRec be envRec.[[DeclarativeRecord]].
- If DclRec.HasBinding(N) is
true , then- Return DclRec.InitializeBinding(N, V).
- Assert: If the binding exists, it must be in the object
Environment Record . - Let ObjRec be envRec.[[ObjectRecord]].
- Return ? ObjRec.InitializeBinding(N, V).
8.1.1.4.5SetMutableBinding (N, V, S)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let DclRec be envRec.[[DeclarativeRecord]].
- If DclRec.HasBinding(N) is
true , then- Return DclRec.SetMutableBinding(N, V, S).
- Let ObjRec be envRec.[[ObjectRecord]].
- Return ? ObjRec.SetMutableBinding(N, V, S).
8.1.1.4.6GetBindingValue (N, S)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let DclRec be envRec.[[DeclarativeRecord]].
- If DclRec.HasBinding(N) is
true , then- Return DclRec.GetBindingValue(N, S).
- Let ObjRec be envRec.[[ObjectRecord]].
- Return ? ObjRec.GetBindingValue(N, S).
8.1.1.4.7DeleteBinding (N)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let DclRec be envRec.[[DeclarativeRecord]].
- If DclRec.HasBinding(N) is
true , then- Return DclRec.DeleteBinding(N).
- Let ObjRec be envRec.[[ObjectRecord]].
- Let globalObject be the binding object for ObjRec.
- Let existingProp be ?
HasOwnProperty (globalObject, N). - If existingProp is
true , then- Let status be ? ObjRec.DeleteBinding(N).
- If status is
true , then- Let varNames be envRec.[[VarNames]].
- If N is an element of varNames, remove that element from the varNames.
- Return status.
- Return
true .
8.1.1.4.8HasThisBinding ()#
- Return
true .
8.1.1.4.9HasSuperBinding ()#
- Return
false .
8.1.1.4.10WithBaseObject ()#
Global Environment Records always return
- Return
undefined .
8.1.1.4.11GetThisBinding ()#
- Let envRec be the global
Environment Record for which the method was invoked. - Return envRec.[[GlobalThisValue]].
8.1.1.4.12HasVarDeclaration (N)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let varDeclaredNames be envRec.[[VarNames]].
- If varDeclaredNames contains the value of N, return
true . - Return
false .
8.1.1.4.13HasLexicalDeclaration (N)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let DclRec be envRec.[[DeclarativeRecord]].
- Return DclRec.HasBinding(N).
8.1.1.4.14HasRestrictedGlobalProperty (N)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let ObjRec be envRec.[[ObjectRecord]].
- Let globalObject be the binding object for ObjRec.
- Let existingProp be ? globalObject.[[GetOwnProperty]](N).
- If existingProp is
undefined , returnfalse . - If existingProp.[[Configurable]] is
true , returnfalse . - Return
true .
Properties may exist upon a undefined is an example of such a property.
8.1.1.4.15CanDeclareGlobalVar (N)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let ObjRec be envRec.[[ObjectRecord]].
- Let globalObject be the binding object for ObjRec.
- Let hasProperty be ?
HasOwnProperty (globalObject, N). - If hasProperty is
true , returntrue . - Return ?
IsExtensible (globalObject).
8.1.1.4.16CanDeclareGlobalFunction (N)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let ObjRec be envRec.[[ObjectRecord]].
- Let globalObject be the binding object for ObjRec.
- Let existingProp be ? globalObject.[[GetOwnProperty]](N).
- If existingProp is
undefined , return ?IsExtensible (globalObject). - If existingProp.[[Configurable]] is
true , returntrue . - If
IsDataDescriptor (existingProp) istrue and existingProp has attribute values {[[Writable]]:true , [[Enumerable]]:true }, returntrue . - Return
false .
8.1.1.4.17CreateGlobalVarBinding (N, D)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let ObjRec be envRec.[[ObjectRecord]].
- Let globalObject be the binding object for ObjRec.
- Let hasProperty be ?
HasOwnProperty (globalObject, N). - Let extensible be ?
IsExtensible (globalObject). - If hasProperty is
false and extensible istrue , then- Perform ? ObjRec.CreateMutableBinding(N, D).
- Perform ? ObjRec.InitializeBinding(N,
undefined ).
- Let varDeclaredNames be envRec.[[VarNames]].
- If varDeclaredNames does not contain the value of N, then
- Append N to varDeclaredNames.
- Return
NormalCompletion (empty ).
8.1.1.4.18CreateGlobalFunctionBinding (N, V, D)#
The concrete
- Let envRec be the global
Environment Record for which the method was invoked. - Let ObjRec be envRec.[[ObjectRecord]].
- Let globalObject be the binding object for ObjRec.
- Let existingProp be ? globalObject.[[GetOwnProperty]](N).
- If existingProp is
undefined or existingProp.[[Configurable]] istrue , then- Let desc be the PropertyDescriptor{[[Value]]: V, [[Writable]]:
true , [[Enumerable]]:true , [[Configurable]]: D}.
- Let desc be the PropertyDescriptor{[[Value]]: V, [[Writable]]:
- Else,
- Let desc be the PropertyDescriptor{[[Value]]: V }.
- Perform ?
DefinePropertyOrThrow (globalObject, N, desc). Record that the binding for N in ObjRec has been initialized.- Perform ?
Set (globalObject, N, V,false ). - Let varDeclaredNames be envRec.[[VarNames]].
- If varDeclaredNames does not contain the value of N, then
- Append N to varDeclaredNames.
- Return
NormalCompletion (empty ).
Global function declarations are always represented as own properties of the
8.1.1.5Module Environment Records#
A module
Module Environment Records support all of the declarative
| Method | Purpose |
|---|---|
| CreateImportBinding(N, M, N2) |
Create an immutable indirect binding in a module |
| GetThisBinding() |
Return the value of this this binding.
|
The behaviour of the additional concrete specification methods for module Environment Records are defined by the following algorithms:
8.1.1.5.1GetBindingValue (N, S)#
The concrete
- Let envRec be the module
Environment Record for which the method was invoked. - Assert: envRec has a binding for N.
- If the binding for N is an indirect binding, then
- Let M and N2 be the indirection values provided when this binding for N was created.
- Let targetEnv be M.[[Environment]].
- If targetEnv is
undefined , throw aReferenceError exception. - Let targetER be targetEnv's
EnvironmentRecord . - Return ? targetER.GetBindingValue(N2, S).
- If the binding for N in envRec is an uninitialized binding, throw a
ReferenceError exception. - Return the value currently bound to N in envRec.
Because a
8.1.1.5.2DeleteBinding (N)#
The concrete
- Let envRec be the module
Environment Record for which the method was invoked. - If envRec does not have a binding for the name that is the value of N, return
true . - Return
false .
The bindings of a module
8.1.1.5.3HasThisBinding ()#
Module Environment Records provide a this binding.
- Return
true .
8.1.1.5.4GetThisBinding ()#
- Return
undefined .
8.1.1.5.5CreateImportBinding (N, M, N2)#
The concrete
- Let envRec be the module
Environment Record for which the method was invoked. - Assert: envRec does not already have a binding for N.
- Assert: M is a
Module Record . - Assert: When M.[[Environment]] is instantiated it will have a direct binding for N2.
- Create an immutable indirect binding in envRec for N that references M and N2 as its target binding and record that the binding is initialized.
- Return
NormalCompletion (empty ).
8.1.2Lexical Environment Operations#
The following abstract operations are used in this specification to operate upon lexical environments:
8.1.2.1GetIdentifierReference (lex, name, strict)#
The abstract operation GetIdentifierReference is called with a
- If lex is the value
null , then- Return a value of type
Reference whose base value isundefined , whose referenced name is name, and whose strict reference flag is strict.
- Return a value of type
- Let envRec be lex's
EnvironmentRecord . - Let exists be ? envRec.HasBinding(name).
- If exists is
true , then- Return a value of type
Reference whose base value is envRec, whose referenced name is name, and whose strict reference flag is strict.
- Return a value of type
- Else,
- Let outer be the value of lex's outer environment reference.
- Return ?
GetIdentifierReference (outer, name, strict).
8.1.2.2NewDeclarativeEnvironment (E)#
When the abstract operation NewDeclarativeEnvironment is called with a
- Let env be a new
Lexical Environment . - Let envRec be a new declarative
Environment Record containing no bindings. - Set env's
EnvironmentRecord to envRec. - Set the outer lexical environment reference of env to E.
- Return env.
8.1.2.3NewObjectEnvironment (O, E)#
When the abstract operation NewObjectEnvironment is called with an Object O and a
- Let env be a new
Lexical Environment . - Let envRec be a new object
Environment Record containing O as the binding object. - Set env's
EnvironmentRecord to envRec. - Set the outer lexical environment reference of env to E.
- Return env.
8.1.2.4NewFunctionEnvironment ( F, newTarget )#
When the abstract operation NewFunctionEnvironment is called with arguments F and newTarget the following steps are performed:
- Assert: F is an ECMAScript function.
- Assert:
Type (newTarget) is Undefined or Object. - Let env be a new
Lexical Environment . - Let envRec be a new function
Environment Record containing no bindings. - Set envRec.[[FunctionObject]] to F.
- If F's [[ThisMode]] internal slot is
lexical , set envRec.[[ThisBindingStatus]] to"lexical". - Else, set envRec.[[ThisBindingStatus]] to
"uninitialized". - Let home be the value of F's [[HomeObject]] internal slot.
- Set envRec.[[HomeObject]] to home.
- Set envRec.[[NewTarget]] to newTarget.
- Set env's
EnvironmentRecord to envRec. - Set the outer lexical environment reference of env to the value of F's [[Environment]] internal slot.
- Return env.
8.1.2.5NewGlobalEnvironment ( G, thisValue )#
When the abstract operation NewGlobalEnvironment is called with arguments G and thisValue, the following steps are performed:
- Let env be a new
Lexical Environment . - Let objRec be a new object
Environment Record containing G as the binding object. - Let dclRec be a new declarative
Environment Record containing no bindings. - Let globalRec be a new global
Environment Record . - Set globalRec.[[ObjectRecord]] to objRec.
- Set globalRec.[[GlobalThisValue]] to thisValue.
- Set globalRec.[[DeclarativeRecord]] to dclRec.
- Set globalRec.[[VarNames]] to a new empty
List . - Set env's
EnvironmentRecord to globalRec. - Set the outer lexical environment reference of env to
null . - Return env.
8.1.2.6NewModuleEnvironment (E)#
When the abstract operation NewModuleEnvironment is called with a
- Let env be a new
Lexical Environment . - Let envRec be a new module
Environment Record containing no bindings. - Set env's
EnvironmentRecord to envRec. - Set the outer lexical environment reference of env to E.
- Return env.
8.2Realms#
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
A realm is represented in this specification as a Realm Record with the fields specified in
| Field Name | Value | Meaning |
|---|---|---|
| [[Intrinsics]] |
|
The intrinsic values used by code associated with this realm |
| [[GlobalObject]] | Object |
The |
| [[GlobalEnv]] |
|
The |
| [[TemplateMap]] |
A |
Template objects are canonicalized separately for each realm using its Realm Record's [[TemplateMap]]. Each [[Strings]] value is a |
An implementation may define other, implementation specific fields.
8.2.1CreateRealm ( )#
The abstract operation CreateRealm with no arguments performs the following steps:
- Let realmRec be a new
Realm Record . - Perform
CreateIntrinsics (realmRec). - Set realmRec.[[GlobalObject]] to
undefined . - Set realmRec.[[GlobalEnv]] to
undefined . - Set realmRec.[[TemplateMap]] to a new empty
List . - Return realmRec.
8.2.2CreateIntrinsics ( realmRec )#
When the abstract operation CreateIntrinsics with argument realmRec performs the following steps:
- Let intrinsics be a new
Record . - Set realmRec.[[Intrinsics]] to intrinsics.
- Let objProto be
ObjectCreate (null ). - Set intrinsics.[[
%ObjectPrototype% ]] to objProto. - Let throwerSteps be the algorithm steps specified in
9.2.7.1 for the%ThrowTypeError% function. - Let thrower be
CreateBuiltinFunction (realmRec, throwerSteps,null ). - Set intrinsics.[[
%ThrowTypeError% ]] to thrower. - Let noSteps be an empty sequence of algorithm steps.
- Let funcProto be
CreateBuiltinFunction (realmRec, noSteps, objProto). - Set intrinsics.[[
%FunctionPrototype% ]] to funcProto. - Call thrower.[[SetPrototypeOf]](funcProto).
- Perform
AddRestrictedFunctionProperties (funcProto, realmRec). - Set fields of intrinsics with the values listed in
Table 7 that have not already been handled above. 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 18-26. All object property values are newly created object values. All values that are built-in function objects are created by performingCreateBuiltinFunction (realmRec, <steps>, <prototype>, <slots>) where <steps> is the definition of that function provided by this specification, <prototype> is the specified value of the function's [[Prototype]] internal slot and <slots> is a list of the names, if any, of the function's specified internal slots. The creation of the intrinsics and their properties must be ordered to avoid any dependencies upon objects that have not yet been created. - Return intrinsics.
8.2.3SetRealmGlobalObject ( realmRec, globalObj, thisValue )#
The abstract operation SetRealmGlobalObject with arguments realmRec, globalObj, and thisValue performs the following steps:
- If globalObj is
undefined , then- Let intrinsics be realmRec.[[Intrinsics]].
- Let globalObj be
ObjectCreate (intrinsics.[[%ObjectPrototype% ]]).
- Assert:
Type (globalObj) is Object. - If thisValue is
undefined , let thisValue be globalObj. - Set realmRec.[[GlobalObject]] to globalObj.
- Let newGlobalEnv be
NewGlobalEnvironment (globalObj, thisValue). - Set realmRec.[[GlobalEnv]] to newGlobalEnv.
- Return realmRec.
8.2.4SetDefaultGlobalBindings ( realmRec )#
The abstract operation SetDefaultGlobalBindings with argument realmRec performs the following steps:
- Let global be realmRec.[[GlobalObject]].
- For each property of the Global Object specified in clause
18 , do- Let name be the String value of the property name.
- Let desc be the fully populated data property descriptor for the property containing the specified attributes for the property. For properties listed in
18.2 ,18.3 , or18.4 the value of the [[Value]] attribute is the corresponding intrinsic object from realmRec. - Perform ?
DefinePropertyOrThrow (global, name, desc).
- Return global.
8.3Execution Contexts#
An execution context is a specification device that is used to track the runtime evaluation of code by an ECMAScript implementation. At any point in time, there is at most one execution context that is actually executing code. This is known as the running execution context.
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
| Component | Purpose |
|---|---|
| code evaluation state | Any state needed to perform, suspend, and resume evaluation of the code associated with this execution context. |
| Function |
If this execution context is evaluating the code of a function object, then the value of this component is that function object. If the context is evaluating the code of a |
|
|
The |
| ScriptOrModule |
The |
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
Execution contexts for ECMAScript code have the additional state components listed in
| Component | Purpose |
|---|---|
| LexicalEnvironment |
Identifies the |
| VariableEnvironment |
Identifies the |
The LexicalEnvironment and VariableEnvironment components of an execution context are always Lexical Environments. When an execution context is created its LexicalEnvironment and VariableEnvironment components initially have the same value.
Execution contexts representing the evaluation of generator objects have the additional state components listed in
| Component | Purpose |
|---|---|
| Generator | The GeneratorObject that this execution context is evaluating. |
In most situations only the running execution context (the top of the execution context stack) is directly manipulated by algorithms within this specification. Hence when the terms “LexicalEnvironment”, and “VariableEnvironment” are used without qualification they are in reference to those components of the running execution context.
An execution context is purely a specification mechanism and need not correspond to any particular artefact of an ECMAScript implementation. It is impossible for ECMAScript code to directly access or observe an execution context.
8.3.1GetActiveScriptOrModule ()#
The GetActiveScriptOrModule abstract operation is used to determine the running script or module, based on the
- If the
execution context stack is empty, returnnull . - Let ec be the topmost
execution context on theexecution context stack whose Function component's [[ScriptOrModule]] component is notnull . - If such an
execution context exists, return ec's Function component's [[ScriptOrModule]] slot's value. - Otherwise, let ec be the
running execution context . - Assert: ec's ScriptOrModule component is not
null . - Return ec's ScriptOrModule component.
8.3.2ResolveBinding ( name [ , env ] )#
The ResolveBinding abstract operation is used to determine the binding of name passed as a String value. The optional argument env can be used to explicitly provide the
- If env was not passed or if env is
undefined , then- Let env be the
running execution context 's LexicalEnvironment.
- Let env be the
- Assert: env is a
Lexical Environment . - If the code matching the syntactic production that is being evaluated is contained in
strict mode code , let strict betrue , else let strict befalse . - Return ?
GetIdentifierReference (env, name, strict).
The result of ResolveBinding is always a
8.3.3GetThisEnvironment ( )#
The abstract operation GetThisEnvironment finds the this. GetThisEnvironment performs the following steps:
- Let lex be the
running execution context 's LexicalEnvironment. - Repeat
- Let envRec be lex's
EnvironmentRecord . - Let exists be envRec.HasThisBinding().
- If exists is
true , return envRec. - Let outer be the value of lex's outer environment reference.
- Let lex be outer.
- Let envRec be lex's
The loop in step 2 will always terminate because the list of environments always ends with the this binding.
8.3.4ResolveThisBinding ( )#
The abstract operation ResolveThisBinding determines the binding of the keyword this using the LexicalEnvironment of the
- Let envRec be
GetThisEnvironment ( ). - Return ? envRec.GetThisBinding().
8.3.5GetNewTarget ( )#
The abstract operation GetNewTarget determines the NewTarget value using the LexicalEnvironment of the
- Let envRec be
GetThisEnvironment ( ). - Assert: envRec has a [[NewTarget]] field.
- Return envRec.[[NewTarget]].
8.3.6GetGlobalObject ( )#
The abstract operation GetGlobalObject returns the
- Let ctx be the
running execution context . - Let currentRealm be ctx's
Realm . - Return currentRealm.[[GlobalObject]].
8.4Jobs and Job Queues#
A Job is an abstract operation that initiates an ECMAScript computation when no other ECMAScript computation is currently in progress. A Job abstract operation may be defined to accept an arbitrary set of job parameters.
Execution of a Job can be initiated only when there is no
| Field Name | Value | Meaning |
|---|---|---|
| [[Job]] | The name of a Job abstract operation |
This is the abstract operation that is performed when execution of this PendingJob is initiated. Jobs are abstract operations that use |
| [[Arguments]] |
A |
The |
| [[Realm]] |
A |
The |
| [[ScriptOrModule]] |
A |
The script or module for the initial |
| [[HostDefined]] |
Any, default value is |
Field reserved for use by host environments that need to associate additional information with a pending Job. |
A Job Queue is a FIFO queue of PendingJob records. Each Job Queue has a name and the full set of available Job Queues are defined by an ECMAScript implementation. Every ECMAScript implementation has at least the Job Queues defined in
A request for the future execution of a Job is made by enqueueing, on a Job Queue, a PendingJob record that includes a Job abstract operation name and any necessary argument values. When there is no
The PendingJob records from a single Job Queue are always initiated in FIFO order. This specification does not define the order in which multiple Job Queues are serviced. An ECMAScript implementation may interweave the FIFO evaluation of the PendingJob records of a Job Queue with the evaluation of the PendingJob records of one or more other Job Queues. An implementation must define what occurs when there are no
Typically an ECMAScript implementation will have its Job Queues pre-initialized with at least one PendingJob and one of those Jobs will be the first to be executed. An implementation might choose to free all resources and terminate if the current Job completes and all Job Queues are empty. Alternatively, it might choose to wait for a some implementation specific agent or mechanism to enqueue new PendingJob requests.
The following abstract operations are used to create and manage Jobs and Job Queues:
8.4.1EnqueueJob (queueName, job, arguments)#
The EnqueueJob abstract operation requires three arguments: queueName, job, and arguments. It performs the following steps:
- Assert:
Type (queueName) is String and its value is the name of a Job Queue recognized by this implementation. - Assert: job is the name of a Job.
- Assert: arguments is a
List that has the same number of elements as the number of parameters required by job. - Let callerContext be the
running execution context . - Let callerRealm be callerContext's
Realm . - Let callerScriptOrModule be callerContext's ScriptOrModule.
- Let pending be PendingJob{ [[Job]]: job, [[Arguments]]: arguments, [[Realm]]: callerRealm, [[ScriptOrModule]]: callerScriptOrModule, [[HostDefined]]:
undefined }. - Perform any implementation or host environment defined processing of pending. This may include modifying the [[HostDefined]] field or any other field of pending.
- Add pending at the back of the Job Queue named by queueName.
- Return
NormalCompletion (empty ).
8.4.2NextJob#
An algorithm step such as:
NextJob result.
is used in Job abstract operations in place of:
- Return result.
Job abstract operations must not contain a Return step or a
- If result is an
abrupt completion , performHostReportErrors (« result.[[Value]] »). - Suspend the
running execution context and remove it from theexecution context stack . - Assert: The
execution context stack is now empty. - Let nextQueue be a non-empty Job Queue chosen in an implementation defined manner. If all Job Queues are empty, the result is implementation defined.
- Let nextPending be the PendingJob record at the front of nextQueue. Remove that record from nextQueue.
- Let newContext be a new
execution context . - Set newContext's Function to
null . - Set newContext's
Realm to nextPending.[[Realm]]. - Set newContext's ScriptOrModule to nextPending.[[ScriptOrModule]].
- Push newContext onto the
execution context stack ; newContext is now therunning execution context . - Perform any implementation or host environment defined job initialization using nextPending.
- Perform the abstract operation named by nextPending.[[Job]] using the elements of nextPending.[[Arguments]] as its arguments.
8.5InitializeHostDefinedRealm ( )#
The abstract operation InitializeHostDefinedRealm performs the following steps:
- Let
realm beCreateRealm (). - Let newContext be a new
execution context . - Set the Function of newContext to
null . - Set the
Realm of newContext torealm . - Set the ScriptOrModule of newContext to
null . - Push newContext onto the
execution context stack ; newContext is now therunning execution context . - If the host requires use of an exotic object to serve as
realm 'sglobal object , let global be such an object created in an implementation defined manner. Otherwise, let global beundefined , indicating that an ordinary object should be created as theglobal object . - If the host requires that the
thisbinding inrealm 's global scope return an object other than theglobal object , let thisValue be such an object created in an implementation defined manner. Otherwise, let thisValue beundefined , indicating thatrealm 's globalthisbinding should be theglobal object . - Perform
SetRealmGlobalObject (realm , global, thisValue). - Let globalObj be ?
SetDefaultGlobalBindings (realm ). - Create any implementation defined
global object properties on globalObj. - In an implementation dependent manner, obtain the ECMAScript source texts (see clause
10 ) and any associated host-defined values for zero or more ECMAScript scripts and/or ECMAScript modules. For each such sourceText and hostDefined,- If sourceText is the source code of a script, then
- Perform
EnqueueJob ("ScriptJobs",ScriptEvaluationJob , « sourceText, hostDefined »).
- Perform
- Else sourceText is the source code of a module,
- Perform
EnqueueJob ("ScriptJobs",TopLevelModuleEvaluationJob , « sourceText, hostDefined »).
- Perform
- If sourceText is the source code of a script, then
NextJob NormalCompletion (undefined ).
9Ordinary and Exotic Objects Behaviours#
9.1Ordinary Object Internal Methods and Internal Slots#
All ordinary objects have an internal slot called [[Prototype]]. The value of this internal slot is either
Every ordinary object has a Boolean-valued [[Extensible]] internal slot that controls whether or not properties may be added to the object. If the value of the [[Extensible]] internal slot is
In the following algorithm descriptions, assume O is an ordinary object, P is a property key value, V is any
Each ordinary object internal method delegates to a similarly-named abstract operation. If such an abstract operation depends on another internal method, then the internal method is invoked on O rather than calling the similarly-named abstract operation directly. These semantics ensure that exotic objects have their overridden internal methods invoked when ordinary object internal methods are applied to them.
9.1.1[[GetPrototypeOf]] ( )#
When the [[GetPrototypeOf]] internal method of O is called, the following steps are taken:
- Return !
OrdinaryGetPrototypeOf (O).
9.1.1.1OrdinaryGetPrototypeOf (O)#
When the abstract operation OrdinaryGetPrototypeOf is called with Object O, the following steps are taken:
- Return the value of the [[Prototype]] internal slot of O.
9.1.2[[SetPrototypeOf]] (V)#
When the [[SetPrototypeOf]] internal method of O is called with argument V, the following steps are taken:
- Return !
OrdinarySetPrototypeOf (O, V).
9.1.2.1OrdinarySetPrototypeOf (O, V)#
When the abstract operation OrdinarySetPrototypeOf is called with Object O and value V, the following steps are taken:
- Assert: Either
Type (V) is Object orType (V) is Null. - Let extensible be the value of the [[Extensible]] internal slot of O.
- Let current be the value of the [[Prototype]] internal slot of O.
- If
SameValue (V, current) istrue , returntrue . - If extensible is
false , returnfalse . - Let p be V.
- Let done be
false . - Repeat while done is
false , - Set the value of the [[Prototype]] internal slot of O to V.
- Return
true .
The loop in step 8 guarantees that there will be no circularities in any prototype chain that only includes objects that use the ordinary object definitions for [[GetPrototypeOf]] and [[SetPrototypeOf]].
9.1.3[[IsExtensible]] ( )#
When the [[IsExtensible]] internal method of O is called, the following steps are taken:
- Return !
OrdinaryIsExtensible (O).
9.1.3.1OrdinaryIsExtensible (O)#
When the abstract operation OrdinaryIsExtensible is called with Object O, the following steps are taken:
- Return the value of the [[Extensible]] internal slot of O.
9.1.4[[PreventExtensions]] ( )#
When the [[PreventExtensions]] internal method of O is called, the following steps are taken:
- Return !
OrdinaryPreventExtensions (O).
9.1.4.1OrdinaryPreventExtensions (O)#
When the abstract operation OrdinaryPreventExtensions is called with Object O, the following steps are taken:
- Set the value of the [[Extensible]] internal slot of O to
false . - Return
true .
9.1.5[[GetOwnProperty]] (P)#
When the [[GetOwnProperty]] internal method of O is called with property key P, the following steps are taken:
- Return !
OrdinaryGetOwnProperty (O, P).
9.1.5.1OrdinaryGetOwnProperty (O, P)#
When the abstract operation OrdinaryGetOwnProperty is called with Object O and with property key P, the following steps are taken:
- Assert:
IsPropertyKey (P) istrue . - If O does not have an own property with key P, return
undefined . - Let D be a newly created
Property Descriptor with no fields. - Let X be O's own property whose key is P.
- If X is a data property, then
- Set D.[[Value]] to the value of X's [[Value]] attribute.
- Set D.[[Writable]] to the value of X's [[Writable]] attribute.
- Else X is an accessor property, so
- Set D.[[Get]] to the value of X's [[Get]] attribute.
- Set D.[[Set]] to the value of X's [[Set]] attribute.
- Set D.[[Enumerable]] to the value of X's [[Enumerable]] attribute.
- Set D.[[Configurable]] to the value of X's [[Configurable]] attribute.
- Return D.
9.1.6[[DefineOwnProperty]] (P, Desc)#
When the [[DefineOwnProperty]] internal method of O is called with property key P and
- Return ?
OrdinaryDefineOwnProperty (O, P, Desc).
9.1.6.1OrdinaryDefineOwnProperty (O, P, Desc)#
When the abstract operation OrdinaryDefineOwnProperty is called with Object O, property key P, and
- Let current be ? O.[[GetOwnProperty]](P).
- Let extensible be the value of the [[Extensible]] internal slot of O.
- Return
ValidateAndApplyPropertyDescriptor (O, P, extensible, Desc, current).
9.1.6.2IsCompatiblePropertyDescriptor (Extensible, Desc, Current)#
When the abstract operation IsCompatiblePropertyDescriptor is called with Boolean value Extensible, and Property Descriptors Desc, and Current, the following steps are taken:
- Return
ValidateAndApplyPropertyDescriptor (undefined ,undefined , Extensible, Desc, Current).
9.1.6.3ValidateAndApplyPropertyDescriptor (O, P, extensible, Desc, current)#
When the abstract operation ValidateAndApplyPropertyDescriptor is called with Object O, property key P, Boolean value extensible, and Property Descriptors Desc, and current, the following steps are taken:
This algorithm contains steps that test various fields of the
If
- Assert: If O is not
undefined , thenIsPropertyKey (P) istrue . - If current is
undefined , then- If extensible is
false , returnfalse . - Assert: extensible is
true . - If
IsGenericDescriptor (Desc) istrue orIsDataDescriptor (Desc) istrue , then- If O is not
undefined , create an own data property named P of object O whose [[Value]], [[Writable]], [[Enumerable]] and [[Configurable]] attribute values are described by Desc. If the value of an attribute field of Desc is absent, the attribute of the newly created property is set to its default value.
- If O is not
- Else Desc must be an accessor
Property Descriptor ,- If O is not
undefined , create an own accessor property named P of object O whose [[Get]], [[Set]], [[Enumerable]] and [[Configurable]] attribute values are described by Desc. If the value of an attribute field of Desc is absent, the attribute of the newly created property is set to its default value.
- If O is not
- Return
true .
- If extensible is
- Return
true , if every field in Desc is absent. - Return
true , if every field in Desc also occurs in current and the value of every field in Desc is the same value as the corresponding field in current when compared using theSameValue algorithm. - If the [[Configurable]] field of current is
false , then- Return
false , if the [[Configurable]] field of Desc istrue . - Return
false , if the [[Enumerable]] field of Desc is present and the [[Enumerable]] fields of current and Desc are the Boolean negation of each other.
- Return
- If
IsGenericDescriptor (Desc) istrue , no further validation is required. - Else if
IsDataDescriptor (current) andIsDataDescriptor (Desc) have different results, then- Return
false , if the [[Configurable]] field of current isfalse . - If
IsDataDescriptor (current) istrue , then- If O is not
undefined , convert the property named P of object O from a data property to an accessor property. Preserve the existing values of the converted property's [[Configurable]] and [[Enumerable]] attributes and set the rest of the property's attributes to their default values.
- If O is not
- Else,
- If O is not
undefined , convert the property named P of object O from an accessor property to a data property. Preserve the existing values of the converted property's [[Configurable]] and [[Enumerable]] attributes and set the rest of the property's attributes to their default values.
- If O is not
- Return
- Else if
IsDataDescriptor (current) andIsDataDescriptor (Desc) are bothtrue , then- If the [[Configurable]] field of current is
false , then- Return
false , if the [[Writable]] field of current isfalse and the [[Writable]] field of Desc istrue . - If the [[Writable]] field of current is
false , then- Return
false , if the [[Value]] field of Desc is present andSameValue (Desc.[[Value]], current.[[Value]]) isfalse .
- Return
- Return
- Else the [[Configurable]] field of current is
true , so any change is acceptable.
- If the [[Configurable]] field of current is
- Else
IsAccessorDescriptor (current) andIsAccessorDescriptor (Desc) are bothtrue , - If O is not
undefined , then- 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.
- Return
true .
Step 8.b allows any field of Desc to be different from the corresponding field of current if current's [[Configurable]] field is
9.1.7[[HasProperty]](P)#
When the [[HasProperty]] internal method of O is called with property key P, the following steps are taken:
- Return ?
OrdinaryHasProperty (O, P).
9.1.7.1OrdinaryHasProperty (O, P)#
When the abstract operation OrdinaryHasProperty is called with Object O and with property key P, the following steps are taken:
- Assert:
IsPropertyKey (P) istrue . - Let hasOwn be ? O.[[GetOwnProperty]](P).
- If hasOwn is not
undefined , returntrue . - Let parent be ? O.[[GetPrototypeOf]]().
- If parent is not
null , then- Return ? parent.[[HasProperty]](P).
- Return
false .
9.1.8[[Get]] (P, Receiver)#
When the [[Get]] internal method of O is called with property key P and
- Return ?
OrdinaryGet (O, P, Receiver).
9.1.8.1OrdinaryGet (O, P, Receiver)#
When the abstract operation OrdinaryGet is called with Object O, property key P, and
- Assert:
IsPropertyKey (P) istrue . - Let desc be ? O.[[GetOwnProperty]](P).
- If desc is
undefined , then- Let parent be ? O.[[GetPrototypeOf]]().
- If parent is
null , returnundefined . - Return ? parent.[[Get]](P, Receiver).
- If
IsDataDescriptor (desc) istrue , return desc.[[Value]]. - Assert:
IsAccessorDescriptor (desc) istrue . - Let getter be desc.[[Get]].
- If getter is
undefined , returnundefined . - Return ?
Call (getter, Receiver).
9.1.9[[Set]] ( P, V, Receiver)#
When the [[Set]] internal method of O is called with property key P, value V, and
- Return ?
OrdinarySet (O, P, V, Receiver).
9.1.9.1OrdinarySet (O, P, V, Receiver)#
When the abstract operation OrdinarySet is called with Object O, property key P, value V, and
- Assert:
IsPropertyKey (P) istrue . - Let ownDesc be ? O.[[GetOwnProperty]](P).
- If ownDesc is
undefined , then- Let parent be ? O.[[GetPrototypeOf]]().
- If parent is not
null , then- Return ? parent.[[Set]](P, V, Receiver).
- Else,
- Let ownDesc be the PropertyDescriptor{[[Value]]:
undefined , [[Writable]]:true , [[Enumerable]]:true , [[Configurable]]:true }.
- Let ownDesc be the PropertyDescriptor{[[Value]]:
- If
IsDataDescriptor (ownDesc) istrue , then- If ownDesc.[[Writable]] is
false , returnfalse . - If
Type (Receiver) is not Object, returnfalse . - Let existingDescriptor be ? Receiver.[[GetOwnProperty]](P).
- If existingDescriptor is not
undefined , then- If
IsAccessorDescriptor (existingDescriptor) istrue , returnfalse . - If existingDescriptor.[[Writable]] is
false , returnfalse . - Let valueDesc be the PropertyDescriptor{[[Value]]: V}.
- Return ? Receiver.[[DefineOwnProperty]](P, valueDesc).
- If
- Else Receiver does not currently have a property P,
- Return ?
CreateDataProperty (Receiver, P, V).
- Return ?
- If ownDesc.[[Writable]] is
- Assert:
IsAccessorDescriptor (ownDesc) istrue . - Let setter be ownDesc.[[Set]].
- If setter is
undefined , returnfalse . - Perform ?
Call (setter, Receiver, « V »). - Return
true .
9.1.10[[Delete]] (P)#
When the [[Delete]] internal method of O is called with property key P, the following steps are taken:
- Return ?
OrdinaryDelete (O, P).
9.1.10.1OrdinaryDelete (O, P)#
When the abstract operation OrdinaryDelete is called with Object O and property key P, the following steps are taken:
- Assert:
IsPropertyKey (P) istrue . - Let desc be ? O.[[GetOwnProperty]](P).
- If desc is
undefined , returntrue . - If desc.[[Configurable]] is
true , then- Remove the own property with name P from O.
- Return
true .
- Return
false .
9.1.11[[OwnPropertyKeys]] ( )#
When the [[OwnPropertyKeys]] internal method of O is called, the following steps are taken:
- Return !
OrdinaryOwnPropertyKeys (O).
9.1.11.1OrdinaryOwnPropertyKeys (O)#
When the abstract operation OrdinaryOwnPropertyKeys is called with Object O, the following steps are taken:
- Let keys be a new empty
List . - For each own property key P of O that is an integer index, in ascending numeric index order
- Add P as the last element of keys.
- For each own property key P of O that is a String but is not an integer index, in ascending chronological order of property creation
- Add P as the last element of keys.
- For each own property key P of O that is a Symbol, in ascending chronological order of property creation
- Add P as the last element of keys.
- Return keys.
9.1.12ObjectCreate (proto [ , internalSlotsList ])#
The abstract operation ObjectCreate with argument proto (an object or null) is used to specify the runtime creation of new ordinary objects. The optional argument internalSlotsList is a
- If internalSlotsList was not provided, let internalSlotsList be a new empty
List . - Let obj be a newly created object with an internal slot for each name in internalSlotsList.
- Set obj's essential internal methods to the default ordinary object definitions specified in
9.1 . - Set the [[Prototype]] internal slot of obj to proto.
- Set the [[Extensible]] internal slot of obj to
true . - Return obj.
9.1.13OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )#
The abstract operation OrdinaryCreateFromConstructor creates an ordinary object whose [[Prototype]] value is retrieved from a constructor's prototype property, if it exists. Otherwise the intrinsic named by intrinsicDefaultProto is used for [[Prototype]]. The optional internalSlotsList is a
- Assert: intrinsicDefaultProto is a String value that is this specification's name of an intrinsic object. The corresponding object must be an intrinsic that is intended to be used as the [[Prototype]] value of an object.
- Let proto be ?
GetPrototypeFromConstructor (constructor, intrinsicDefaultProto). - Return
ObjectCreate (proto, internalSlotsList).
9.1.14GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )#
The abstract operation GetPrototypeFromConstructor determines the [[Prototype]] value that should be used to create an object corresponding to a specific constructor. The value is retrieved from the constructor's prototype property, if it exists. Otherwise the intrinsic named by intrinsicDefaultProto is used for [[Prototype]]. This abstract operation performs the following steps:
- Assert: intrinsicDefaultProto is a String value that is this specification's name of an intrinsic object. The corresponding object must be an intrinsic that is intended to be used as the [[Prototype]] value of an object.
- Assert:
IsCallable (constructor) istrue . - Let proto be ?
Get (constructor,"prototype"). - If
Type (proto) is not Object, then- Let
realm be ?GetFunctionRealm (constructor). - Let proto be
realm 's intrinsic object named intrinsicDefaultProto.
- Let
- Return proto.
If constructor does not supply a [[Prototype]] value, the default value that is used is obtained from the
9.2ECMAScript Function Objects#
ECMAScript function objects encapsulate parameterized ECMAScript code closed over a lexical environment and support the dynamic evaluation of that code. An ECMAScript function object is an ordinary object and has the same internal slots and the same internal methods as other ordinary objects. The code of an ECMAScript function object may be either
ECMAScript function objects have the additional internal slots listed in
| Internal Slot | Type | Description |
|---|---|---|
| [[Environment]] |
|
The |
| [[FormalParameters]] | Parse Node | The root parse node of the source text that defines the function's formal parameter list. |
| [[FunctionKind]] | String |
Either "normal", "classConstructor" or "generator".
|
| [[ECMAScriptCode]] | Parse Node | The root parse node of the source text that defines the function's body. |
| [[ConstructorKind]] | String |
Either "base" or "derived".
|
| [[Realm]] |
|
The |
| [[ScriptOrModule]] |
|
The script or module in which the function was created. |
| [[ThisMode]] | (lexical, strict, global) |
Defines how this references are interpreted within the formal parameters and code body of the function. this refers to the |
| [[Strict]] | Boolean |
|
| [[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.
9.2.1[[Call]] ( thisArgument, argumentsList)#
The [[Call]] internal method for an ECMAScript function object F is called with parameters thisArgument and argumentsList, a
- Assert: F is an ECMAScript function object.
- If F's [[FunctionKind]] internal slot is
"classConstructor", throw aTypeError exception. - Let callerContext be the
running execution context . - Let calleeContext be
PrepareForOrdinaryCall (F,undefined ). - Assert: calleeContext is now the
running execution context . - Perform
OrdinaryCallBindThis (F, calleeContext, thisArgument). - Let result be
OrdinaryCallEvaluateBody (F, argumentsList). - Remove calleeContext from the
execution context stack and restore callerContext as therunning execution context . - If result.[[Type]] is
return , returnNormalCompletion (result.[[Value]]). ReturnIfAbrupt (result).- Return
NormalCompletion (undefined ).
When calleeContext is removed from the
9.2.1.1PrepareForOrdinaryCall ( F, newTarget )#
When the abstract operation PrepareForOrdinaryCall is called with function object F and
- Assert:
Type (newTarget) is Undefined or Object. - Let callerContext be the
running execution context . - Let calleeContext be a new ECMAScript code
execution context . - Set the Function of calleeContext to F.
- Let calleeRealm be the value of F's [[Realm]] internal slot.
- Set the
Realm of calleeContext to calleeRealm. - Set the ScriptOrModule of calleeContext to the value of F's [[ScriptOrModule]] internal slot.
- Let localEnv be
NewFunctionEnvironment (F, newTarget). - Set the LexicalEnvironment of calleeContext to localEnv.
- Set the VariableEnvironment of calleeContext to localEnv.
- If callerContext is not already suspended, suspend callerContext.
- Push calleeContext onto the
execution context stack ; calleeContext is now therunning execution context . - NOTE Any exception objects produced after this point are associated with calleeRealm.
- Return calleeContext.
9.2.1.2OrdinaryCallBindThis ( F, calleeContext, thisArgument )#
When the abstract operation OrdinaryCallBindThis is called with function object F,
- Let thisMode be the value of F's [[ThisMode]] internal slot.
- If thisMode is
lexical , returnNormalCompletion (undefined ). - Let calleeRealm be the value of F's [[Realm]] internal slot.
- Let localEnv be the LexicalEnvironment of calleeContext.
- If thisMode is
strict , let thisValue be thisArgument. - Else,
- If thisArgument is
null orundefined , then- Let globalEnv be calleeRealm.[[GlobalEnv]].
- Let globalEnvRec be globalEnv's
EnvironmentRecord . - Let thisValue be globalEnvRec.[[GlobalThisValue]].
- Else,
- If thisArgument is
- Let envRec be localEnv's
EnvironmentRecord . - Assert: The next step never returns an
abrupt completion because envRec.[[ThisBindingStatus]] is not"initialized". - Return envRec.BindThisValue(thisValue).
9.2.1.3OrdinaryCallEvaluateBody ( F, argumentsList )#
When the abstract operation OrdinaryCallEvaluateBody is called with function object F and
- Perform ?
FunctionDeclarationInstantiation (F, argumentsList). - Return the result of EvaluateBody of the parsed code that is the value of F's [[ECMAScriptCode]] internal slot passing F as the argument.
9.2.2[[Construct]] ( argumentsList, newTarget)#
The [[Construct]] internal method for an ECMAScript Function object F is called with parameters argumentsList and newTarget. argumentsList is a possibly empty
- Assert: F is an ECMAScript function object.
- Assert:
Type (newTarget) is Object. - Let callerContext be the
running execution context . - Let kind be F's [[ConstructorKind]] internal slot.
- If kind is
"base", then- Let thisArgument be ?
OrdinaryCreateFromConstructor (newTarget,"%ObjectPrototype%").
- Let thisArgument be ?
- Let calleeContext be
PrepareForOrdinaryCall (F, newTarget). - Assert: calleeContext is now the
running execution context . - If kind is
"base", performOrdinaryCallBindThis (F, calleeContext, thisArgument). - Let constructorEnv be the LexicalEnvironment of calleeContext.
- Let envRec be constructorEnv's
EnvironmentRecord . - Let result be
OrdinaryCallEvaluateBody (F, argumentsList). - Remove calleeContext from the
execution context stack and restore callerContext as therunning execution context . - If result.[[Type]] is
return , then- If
Type (result.[[Value]]) is Object, returnNormalCompletion (result.[[Value]]). - If kind is
"base", returnNormalCompletion (thisArgument). - If result.[[Value]] is not
undefined , throw aTypeError exception.
- If
- Else,
ReturnIfAbrupt (result). - Return ? envRec.GetThisBinding().
9.2.3FunctionAllocate (functionPrototype, strict, functionKind)#
The abstract operation FunctionAllocate requires the three arguments functionPrototype, strict and functionKind. FunctionAllocate performs the following steps:
- Assert:
Type (functionPrototype) is Object. - Assert: functionKind is either
"normal","non-constructor"or"generator". - If functionKind is
"normal", let needsConstruct betrue . - Else, let needsConstruct be
false . - If functionKind is
"non-constructor", let functionKind be"normal". - Let F be a newly created ECMAScript function object with the internal slots listed in
Table 27 . All of those internal slots are initialized toundefined . - Set F's essential internal methods to the default ordinary object definitions specified in
9.1 . - Set F's [[Call]] internal method to the definition specified in
9.2.1 . - If needsConstruct is
true , then- Set F's [[Construct]] internal method to the definition specified in
9.2.2 . - Set the [[ConstructorKind]] internal slot of F to
"base".
- Set F's [[Construct]] internal method to the definition specified in
- Set the [[Strict]] internal slot of F to strict.
- Set the [[FunctionKind]] internal slot of F to functionKind.
- Set the [[Prototype]] internal slot of F to functionPrototype.
- Set the [[Extensible]] internal slot of F to
true . - Set the [[Realm]] internal slot of F to
the current Realm Record . - Return F.
9.2.4FunctionInitialize (F, kind, ParameterList, Body, Scope)#
The abstract operation FunctionInitialize requires the arguments: a function object F, kind which is one of (Normal, Method, Arrow), a parameter list production specified by ParameterList, a body production specified by Body, a
- Assert: F is an extensible object that does not have a
lengthown property. - Let len be the ExpectedArgumentCount of ParameterList.
- Perform !
DefinePropertyOrThrow (F,"length", PropertyDescriptor{[[Value]]: len, [[Writable]]:false , [[Enumerable]]:false , [[Configurable]]:true }). - Let Strict be the value of the [[Strict]] internal slot of F.
- Set the [[Environment]] internal slot of F to the value of Scope.
- Set the [[FormalParameters]] internal slot of F to ParameterList.
- Set the [[ECMAScriptCode]] internal slot of F to Body.
- Set the [[ScriptOrModule]] internal slot of F to
GetActiveScriptOrModule (). - If kind is
Arrow , set the [[ThisMode]] internal slot of F tolexical . - Else if Strict is
true , set the [[ThisMode]] internal slot of F tostrict . - Else set the [[ThisMode]] internal slot of F to
global . - Return F.
9.2.5FunctionCreate (kind, ParameterList, Body, Scope, Strict [ , prototype ])#
The abstract operation FunctionCreate requires the arguments: kind which is one of (Normal, Method, Arrow), a parameter list production specified by ParameterList, a body production specified by Body, a
- If the prototype argument was not passed, then
- Let prototype be the intrinsic object
%FunctionPrototype% .
- Let prototype be the intrinsic object
- If kind is not
Normal , let allocKind be"non-constructor". - Else let allocKind be
"normal". - Let F be
FunctionAllocate (prototype, Strict, allocKind). - Return
FunctionInitialize (F, kind, ParameterList, Body, Scope).
9.2.6GeneratorFunctionCreate (kind, ParameterList, Body, Scope, Strict)#
The abstract operation GeneratorFunctionCreate requires the arguments: kind which is one of (Normal, Method), a parameter list production specified by ParameterList, a body production specified by Body, a
- Let functionPrototype be the intrinsic object %Generator%.
- Let F be
FunctionAllocate (functionPrototype, Strict,"generator"). - Return
FunctionInitialize (F, kind, ParameterList, Body, Scope).
9.2.7AddRestrictedFunctionProperties ( F, realm )#
The abstract operation AddRestrictedFunctionProperties is called with a function object F and
- Assert:
realm .[[Intrinsics]].[[%ThrowTypeError% ]] exists and has been initialized. - Let thrower be
realm .[[Intrinsics]].[[%ThrowTypeError% ]]. - Perform !
DefinePropertyOrThrow (F,"caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]:false , [[Configurable]]:true }). - Return !
DefinePropertyOrThrow (F,"arguments", PropertyDescriptor {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]:false , [[Configurable]]:true }).
9.2.7.1%ThrowTypeError% ( )#
The %ThrowTypeError% intrinsic is an anonymous built-in function object that is defined once for each
- Throw a
TypeError exception.
The value of the [[Extensible]] internal slot of a %ThrowTypeError% function is
The length property of a %ThrowTypeError% function has the attributes { [[Writable]]:
9.2.8MakeConstructor (F [ , writablePrototype, prototype ])#
The abstract operation MakeConstructor requires a Function argument F and optionally, a Boolean writablePrototype and an object prototype. If prototype is provided it is assumed to already contain, if needed, a "constructor" property whose value is F. This operation converts F into a constructor by performing the following steps:
- Assert: F is an ECMAScript function object.
- Assert: F has a [[Construct]] internal method.
- Assert: F is an extensible object that does not have a
prototypeown property. - If the writablePrototype argument was not provided, let writablePrototype be
true . - If the prototype argument was not provided, then
- Let prototype be
ObjectCreate (%ObjectPrototype% ). - Perform !
DefinePropertyOrThrow (prototype,"constructor", PropertyDescriptor{[[Value]]: F, [[Writable]]: writablePrototype, [[Enumerable]]:false , [[Configurable]]:true }).
- Let prototype be
- Perform !
DefinePropertyOrThrow (F,"prototype", PropertyDescriptor{[[Value]]: prototype, [[Writable]]: writablePrototype, [[Enumerable]]:false , [[Configurable]]:false }). - Return
NormalCompletion (undefined ).
9.2.9MakeClassConstructor ( F)#
The abstract operation MakeClassConstructor with argument F performs the following steps:
- Assert: F is an ECMAScript function object.
- Assert: F's [[FunctionKind]] internal slot is
"normal". - Set F's [[FunctionKind]] internal slot to
"classConstructor". - Return
NormalCompletion (undefined ).
9.2.10MakeMethod ( F, homeObject)#
The abstract operation MakeMethod with arguments F and homeObject configures F as a method by performing the following steps:
- Assert: F is an ECMAScript function object.
- Assert:
Type (homeObject) is Object. - Set the [[HomeObject]] internal slot of F to homeObject.
- Return
NormalCompletion (undefined ).
9.2.11SetFunctionName (F, name [ , prefix ])#
The abstract operation SetFunctionName requires a Function argument F, a String or Symbol argument name and optionally a String argument prefix. This operation adds a name property to F by performing the following steps:
- Assert: F is an extensible object that does not have a
nameown property. - Assert:
Type (name) is either Symbol or String. - Assert: If prefix was passed, then
Type (prefix) is String. - If
Type (name) is Symbol, then- Let description be name's [[Description]] value.
- If description is
undefined , let name be the empty String. - Else, let name be the concatenation of
"[", description, and"]".
- If prefix was passed, then
- Let name be the concatenation of prefix, code unit 0x0020 (SPACE), and name.
- Return !
DefinePropertyOrThrow (F,"name", PropertyDescriptor{[[Value]]: name, [[Writable]]:false , [[Enumerable]]:false , [[Configurable]]:true }).
9.2.12FunctionDeclarationInstantiation (func, argumentsList)#
When an
FunctionDeclarationInstantiation is performed as follows using arguments func and argumentsList. func is the function object for which the
- Let calleeContext be the
running execution context . - Let env be the LexicalEnvironment of calleeContext.
- Let envRec be env's
EnvironmentRecord . - Let code be the value of the [[ECMAScriptCode]] internal slot of func.
- Let strict be the value of the [[Strict]] internal slot of func.
- Let formals be the value of the [[FormalParameters]] internal slot of func.
- Let parameterNames be the BoundNames of formals.
- If parameterNames has any duplicate entries, let hasDuplicates be
true . Otherwise, let hasDuplicates befalse . - Let simpleParameterList be IsSimpleParameterList of formals.
- Let hasParameterExpressions be ContainsExpression of formals.
- Let varNames be the VarDeclaredNames of code.
- Let varDeclarations be the VarScopedDeclarations of code.
- Let lexicalNames be the LexicallyDeclaredNames of code.
- Let functionNames be a new empty
List . - Let functionsToInitialize be a new empty
List . - For each d in varDeclarations, in reverse list order do
- If d is neither a
VariableDeclaration or aForBinding , then- Assert: d is either a
FunctionDeclaration or aGeneratorDeclaration . - Let fn be the sole element of the BoundNames of d.
- If fn is not an element of functionNames, then
- Insert fn as the first element of functionNames.
- NOTE If there are multiple
FunctionDeclaration s orGeneratorDeclaration s for the same name, the last declaration is used. - Insert d as the first element of functionsToInitialize.
- Assert: d is either a
- If d is neither a
- Let argumentsObjectNeeded be
true . - If the value of the [[ThisMode]] internal slot of func is
lexical , then- NOTE Arrow functions never have an arguments objects.
- Let argumentsObjectNeeded be
false .
- Else if
"arguments"is an element of parameterNames, then- Let argumentsObjectNeeded be
false .
- Let argumentsObjectNeeded be
- Else if hasParameterExpressions is
false , then- If
"arguments"is an element of functionNames or if"arguments"is an element of lexicalNames, then- Let argumentsObjectNeeded be
false .
- Let argumentsObjectNeeded be
- If
- For each String paramName in parameterNames, do
- Let alreadyDeclared be envRec.HasBinding(paramName).
- NOTE Early errors ensure that duplicate parameter names can only occur in non-strict functions that do not have parameter default values or rest parameters.
- If alreadyDeclared is
false , then- Perform ! envRec.CreateMutableBinding(paramName,
false ). - If hasDuplicates is
true , then- Perform ! envRec.InitializeBinding(paramName,
undefined ).
- Perform ! envRec.InitializeBinding(paramName,
- Perform ! envRec.CreateMutableBinding(paramName,
- If argumentsObjectNeeded is
true , then- If strict is
true or if simpleParameterList isfalse , then- Let ao be
CreateUnmappedArgumentsObject (argumentsList).
- Let ao be
- Else,
- NOTE 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.
- Let ao be
CreateMappedArgumentsObject (func, formals, argumentsList, envRec).
- If strict is
true , then- Perform ! envRec.CreateImmutableBinding(
"arguments",false ).
- Perform ! envRec.CreateImmutableBinding(
- Else,
- Perform ! envRec.CreateMutableBinding(
"arguments",false ).
- Perform ! envRec.CreateMutableBinding(
- Call envRec.InitializeBinding(
"arguments", ao). - Append
"arguments"to parameterNames.
- If strict is
- Let iteratorRecord be
Record {[[Iterator]]:CreateListIterator (argumentsList), [[Done]]:false }. - If hasDuplicates is
true , then- Perform ? IteratorBindingInitialization for formals with iteratorRecord and
undefined as arguments.
- Perform ? IteratorBindingInitialization for formals with iteratorRecord and
- Else,
- Perform ? IteratorBindingInitialization for formals with iteratorRecord and env as arguments.
- If hasParameterExpressions is
false , then- NOTE Only a single lexical environment is needed for the parameters and top-level vars.
- Let instantiatedVarNames be a copy of the
List parameterNames. - For each n in varNames, do
- If n is not an element of instantiatedVarNames, then
- Append n to instantiatedVarNames.
- Perform ! envRec.CreateMutableBinding(n,
false ). - Call envRec.InitializeBinding(n,
undefined ).
- If n is not an element of instantiatedVarNames, then
- Let varEnv be env.
- Let varEnvRec be envRec.
- Else,
- 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. - Let varEnv be
NewDeclarativeEnvironment (env). - Let varEnvRec be varEnv's
EnvironmentRecord . - Set the VariableEnvironment of calleeContext to varEnv.
- Let instantiatedVarNames be a new empty
List . - For each n in varNames, do
- If n is not an element of instantiatedVarNames, then
- Append n to instantiatedVarNames.
- Perform ! varEnvRec.CreateMutableBinding(n,
false ). - If n is not an element of parameterNames or if n is an element of functionNames, let initialValue be
undefined . - Else,
- Let initialValue be ! envRec.GetBindingValue(n,
false ).
- Let initialValue be ! envRec.GetBindingValue(n,
- Call varEnvRec.InitializeBinding(n, initialValue).
- NOTE vars whose names are the same as a formal parameter, initially have the same value as the corresponding initialized parameter.
- If n is not an element of instantiatedVarNames, then
- NOTE A separate
- NOTE: Annex
B.3.3.1 adds additional steps at this point. - If strict is
false , then- Let lexEnv be
NewDeclarativeEnvironment (varEnv). - NOTE: Non-strict functions use a separate lexical
Environment Record for top-level lexical declarations so that adirect eval can determine whether any var scoped declarations introduced by the eval code conflict with pre-existing top-level lexically scoped declarations. This is not needed for strict functions because a strictdirect eval always places all declarations into a newEnvironment Record .
- Let lexEnv be
- Else, let lexEnv be varEnv.
- Let lexEnvRec be lexEnv's
EnvironmentRecord . - Set the LexicalEnvironment of calleeContext to lexEnv.
- Let lexDeclarations be the LexicallyScopedDeclarations of code.
- For each element d in lexDeclarations do
- NOTE A lexically declared name cannot be the same as a function/generator declaration, formal parameter, or a var name. Lexically declared names are only instantiated here but not initialized.
- For each element dn of the BoundNames of d do
- If IsConstantDeclaration of d is
true , then- Perform ! lexEnvRec.CreateImmutableBinding(dn,
true ).
- Perform ! lexEnvRec.CreateImmutableBinding(dn,
- Else,
- Perform ! lexEnvRec.CreateMutableBinding(dn,
false ).
- Perform ! lexEnvRec.CreateMutableBinding(dn,
- If IsConstantDeclaration of d is
- For each parsed grammar phrase f in functionsToInitialize, do
- Let fn be the sole element of the BoundNames of f.
- Let fo be the result of performing InstantiateFunctionObject for f with argument lexEnv.
- Perform ! varEnvRec.SetMutableBinding(fn, fo,
false ).
- Return
NormalCompletion (empty ).
Parameter
9.3Built-in Function Objects#
The built-in function objects defined in this specification may be implemented as either ECMAScript function objects (
If a built-in function object is implemented as an exotic object it must have the ordinary object behaviour specified in
Unless otherwise specified every built-in function object has the
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 "classConstructor".
Built-in function objects that are not identified as constructors do not implement the [[Construct]] internal method unless otherwise specified in the description of a particular function. When a built-in constructor is called as part of a new expression the argumentsList parameter of the invoked [[Construct]] internal method provides the values for the built-in constructor's named parameters.
Built-in functions that are not constructors do not have a prototype property unless otherwise specified in the description of a particular function.
If a built-in function object is not implemented as an ECMAScript function it must provide [[Call]] and [[Construct]] internal methods that conform to the following definitions:
9.3.1[[Call]] ( thisArgument, argumentsList)#
The [[Call]] internal method for a built-in function object F is called with parameters thisArgument and argumentsList, a
- Let callerContext be the
running execution context . - If callerContext is not already suspended, suspend callerContext.
- Let calleeContext be a new ECMAScript code
execution context . - Set the Function of calleeContext to F.
- Let calleeRealm be the value of F's [[Realm]] internal slot.
- Set the
Realm of calleeContext to calleeRealm. - Set the ScriptOrModule of calleeContext to the value of F's [[ScriptOrModule]] internal slot.
- Perform any necessary implementation defined initialization of calleeContext.
- Push calleeContext onto the
execution context stack ; calleeContext is now therunning execution context . - Let result be the
Completion Record that is the result of evaluating F in an implementation defined manner that conforms to the specification of F. thisArgument is thethis value, argumentsList provides the named parameters, and the NewTarget value isundefined . - Remove calleeContext from the
execution context stack and restore callerContext as therunning execution context . - Return result.
When calleeContext is removed from the
9.3.2[[Construct]] (argumentsList, newTarget)#
The [[Construct]] internal method for built-in function object F is called with parameters argumentsList and newTarget. The steps performed are the same as [[Call]] (see
- Let result be the
Completion Record that is the result of evaluating F in an implementation defined manner that conforms to the specification of F. Thethis value is uninitialized, argumentsList provides the named parameters, and newTarget provides the NewTarget value.
9.3.3CreateBuiltinFunction (realm, steps, prototype [ , internalSlotsList ])#
The abstract operation CreateBuiltinFunction takes arguments
- Assert:
realm is aRealm Record . - Assert: steps is either a set of algorithm steps or other definition of a function's behaviour provided in this specification.
- Let func be a new built-in function object that when called performs the action described by steps. The new function object has internal slots whose names are the elements of internalSlotsList. The initial value of each of those internal slots is
undefined . - Set the [[Realm]] internal slot of func to
realm . - Set the [[Prototype]] internal slot of func to prototype.
- Set the [[Extensible]] internal slot of func to
true . - Set the [[ScriptOrModule]] internal slot of func to
null . - Return func.
Each built-in function defined in this specification is created as if by calling the CreateBuiltinFunction abstract operation, unless otherwise specified.
9.4Built-in Exotic Object Internal Methods and Slots#
This specification defines several kinds of built-in exotic objects. These objects generally behave similar to ordinary objects except for a few specific situations. The following exotic objects use the ordinary object internal methods except where it is explicitly specified otherwise below:
9.4.1Bound Function Exotic Objects#
A bound function is an exotic object that wraps another function object. A bound function is callable (it has a [[Call]] internal method and may have a [[Construct]] internal method). Calling a bound function generally results in a call of its wrapped function.
Bound function objects do not have the internal slots of ECMAScript function objects defined in
| Internal Slot | Type | Description |
|---|---|---|
| [[BoundTargetFunction]] | Callable Object | The wrapped function object. |
| [[BoundThis]] | Any |
The value that is always passed as the |
| [[BoundArguments]] |
|
A list of values whose elements are used as the first arguments to any call to the wrapped function. |
Bound function objects provide all of the essential internal methods as specified in
9.4.1.1[[Call]] ( thisArgument, argumentsList)#
When the [[Call]] internal method of an exotic
- Let target be the value of F's [[BoundTargetFunction]] internal slot.
- Let boundThis be the value of F's [[BoundThis]] internal slot.
- Let boundArgs be the value of F's [[BoundArguments]] internal slot.
- Let args be a new list containing the same values as the list boundArgs in the same order followed by the same values as the list argumentsList in the same order.
- Return ?
Call (target, boundThis, args).
9.4.1.2[[Construct]] (argumentsList, newTarget)#
When the [[Construct]] internal method of an exotic
- Let target be the value of F's [[BoundTargetFunction]] internal slot.
- Assert: target has a [[Construct]] internal method.
- Let boundArgs be the value of F's [[BoundArguments]] internal slot.
- Let args be a new list containing the same values as the list boundArgs in the same order followed by the same values as the list argumentsList in the same order.
- If
SameValue (F, newTarget) istrue , let newTarget be target. - Return ?
Construct (target, args, newTarget).
9.4.1.3BoundFunctionCreate (targetFunction, boundThis, boundArgs)#
The abstract operation BoundFunctionCreate with arguments targetFunction, boundThis and boundArgs is used to specify the creation of new Bound Function exotic objects. It performs the following steps:
- Assert:
Type (targetFunction) is Object. - Let proto be ? targetFunction.[[GetPrototypeOf]]().
- Let obj be a newly created object.
- Set obj's essential internal methods to the default ordinary object definitions specified in
9.1 . - Set the [[Call]] internal method of obj as described in
9.4.1.1 . - If targetFunction has a [[Construct]] internal method, then
- Set the [[Construct]] internal method of obj as described in
9.4.1.2 .
- Set the [[Construct]] internal method of obj as described in
- Set the [[Prototype]] internal slot of obj to proto.
- Set the [[Extensible]] internal slot of obj to
true . - Set the [[BoundTargetFunction]] internal slot of obj to targetFunction.
- Set the [[BoundThis]] internal slot of obj to the value of boundThis.
- Set the [[BoundArguments]] internal slot of obj to boundArgs.
- Return obj.
9.4.2Array Exotic Objects#
An Array object is an exotic object that gives special treatment to array index property keys (see length property whose value is always a nonnegative integer less than 232. The value of the length property is numerically greater than the name of every own property whose name is an array index; whenever an own property of an Array object is created or changed, other properties are adjusted as necessary to maintain this invariant. Specifically, whenever an own property is added whose name is an array index, the value of the length property is changed, if necessary, to be one more than the numeric value of that array index; and whenever the value of the length property is changed, every own property whose name is an array index whose value is not smaller than the new length is deleted. This constraint applies only to own properties of an Array object and is unaffected by length or array index properties that may be inherited from its prototypes.
A String property name P is an array index if and only if
Array exotic objects always have a non-configurable property named "length".
Array exotic objects provide an alternative definition for the [[DefineOwnProperty]] internal method. Except for that internal method, Array exotic objects provide all of the other essential internal methods as specified in
9.4.2.1[[DefineOwnProperty]] ( P, Desc)#
When the [[DefineOwnProperty]] internal method of an Array exotic object A is called with property key P, and
- Assert:
IsPropertyKey (P) istrue . - If P is
"length", then- Return ?
ArraySetLength (A, Desc).
- Return ?
- Else if P is an array index, then
- Let oldLenDesc be
OrdinaryGetOwnProperty (A,"length"). - Assert: oldLenDesc will never be
undefined or an accessor descriptor because Array objects are created with a length data property that cannot be deleted or reconfigured. - Let oldLen be oldLenDesc.[[Value]].
- Let index be !
ToUint32 (P). - If index ≥ oldLen and oldLenDesc.[[Writable]] is
false , returnfalse . - Let succeeded be !
OrdinaryDefineOwnProperty (A, P, Desc). - If succeeded is
false , returnfalse . - If index ≥ oldLen, then
- Set oldLenDesc.[[Value]] to index + 1.
- Let succeeded be
OrdinaryDefineOwnProperty (A,"length", oldLenDesc). - Assert: succeeded is
true .
- Return
true .
- Let oldLenDesc be
- Return
OrdinaryDefineOwnProperty (A, P, Desc).
9.4.2.2ArrayCreate (length [ , proto ])#
The abstract operation ArrayCreate with argument length (either 0 or a positive integer) and optional argument proto is used to specify the creation of new Array exotic objects. It performs the following steps:
- Assert: length is an integer Number ≥ 0.
- If length is
-0 , let length be+0 . - If length>232-1, throw a
RangeError exception. - If the proto argument was not passed, let proto be the intrinsic object
%ArrayPrototype% . - Let A be a newly created Array exotic object.
- Set A's essential internal methods except for [[DefineOwnProperty]] to the default ordinary object definitions specified in
9.1 . - Set the [[DefineOwnProperty]] internal method of A as specified in
9.4.2.1 . - Set the [[Prototype]] internal slot of A to proto.
- Set the [[Extensible]] internal slot of A to
true . - Perform !
OrdinaryDefineOwnProperty (A,"length", PropertyDescriptor{[[Value]]: length, [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:false }). - Return A.
9.4.2.3ArraySpeciesCreate (originalArray, length)#
The abstract operation ArraySpeciesCreate with arguments originalArray and length is used to specify the creation of a new Array object using a constructor function that is derived from originalArray. It performs the following steps:
- Assert: length is an integer Number ≥ 0.
- If length is
-0 , let length be+0 . - Let C be
undefined . - Let isArray be ?
IsArray (originalArray). - If isArray is
true , then- Let C be ?
Get (originalArray,"constructor"). - If
IsConstructor (C) istrue , then- Let thisRealm be
the current Realm Record . - Let realmC be ?
GetFunctionRealm (C). - If thisRealm and realmC are not the same
Realm Record , then
- Let thisRealm be
- If
Type (C) is Object, then- Let C be ?
Get (C, @@species). - If C is
null , let C beundefined .
- Let C be ?
- Let C be ?
- If C is
undefined , return ?ArrayCreate (length). - If
IsConstructor (C) isfalse , throw aTypeError exception. - Return ?
Construct (C, « length »).
If originalArray was created using the standard built-in Array constructor for a
9.4.2.4ArraySetLength (A, Desc)#
When the abstract operation ArraySetLength is called with an Array exotic object A, and
- If the [[Value]] field of Desc is absent, then
- Return
OrdinaryDefineOwnProperty (A,"length", Desc).
- Return
- Let newLenDesc be a copy of Desc.
- Let newLen be ?
ToUint32 (Desc.[[Value]]). - Let numberLen be ?
ToNumber (Desc.[[Value]]). - If newLen ≠ numberLen, throw a
RangeError exception. - Set newLenDesc.[[Value]] to newLen.
- Let oldLenDesc be
OrdinaryGetOwnProperty (A,"length"). - Assert: oldLenDesc will never be
undefined or an accessor descriptor because Array objects are created with a length data property that cannot be deleted or reconfigured. - Let oldLen be oldLenDesc.[[Value]].
- If newLen ≥ oldLen, then
- Return
OrdinaryDefineOwnProperty (A,"length", newLenDesc).
- Return
- If oldLenDesc.[[Writable]] is
false , returnfalse . - If newLenDesc.[[Writable]] is absent or has the value
true , let newWritable betrue . - Else,
- Need to defer setting the [[Writable]] attribute to
false in case any elements cannot be deleted. - Let newWritable be
false . - Set newLenDesc.[[Writable]] to
true .
- Need to defer setting the [[Writable]] attribute to
- Let succeeded be !
OrdinaryDefineOwnProperty (A,"length", newLenDesc). - If succeeded is
false , returnfalse . - While newLen < oldLen repeat,
- Set oldLen to oldLen - 1.
- Let deleteSucceeded be ! A.[[Delete]](!
ToString (oldLen)). - If deleteSucceeded is
false , then- Set newLenDesc.[[Value]] to oldLen + 1.
- If newWritable is
false , set newLenDesc.[[Writable]] tofalse . - Let succeeded be !
OrdinaryDefineOwnProperty (A,"length", newLenDesc). - Return
false .
- If newWritable is
false , then- Return
OrdinaryDefineOwnProperty (A,"length", PropertyDescriptor{[[Writable]]:false }). This call will always returntrue .
- Return
- Return
true .
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.
9.4.3String Exotic Objects#
A String object is an exotic object that encapsulates a String value and exposes virtual integer indexed data properties corresponding to the individual code unit elements of the String value. Exotic String objects always have a data property named "length" whose value is the number of code unit elements in the encapsulated String value. Both the code unit data properties and the "length" property are non-writable and non-configurable.
Exotic String objects have the same internal slots as ordinary objects. They also have a [[StringData]] internal slot.
Exotic String objects provide alternative definitions for the following internal methods. All of the other exotic String object essential internal methods that are not defined below are as specified in
9.4.3.1[[GetOwnProperty]] ( P )#
When the [[GetOwnProperty]] internal method of an exotic String object S is called with property key P, the following steps are taken:
- Assert:
IsPropertyKey (P) istrue . - Let desc be
OrdinaryGetOwnProperty (S, P). - If desc is not
undefined , return desc. - If
Type (P) is not String, returnundefined . - Let index be !
CanonicalNumericIndexString (P). - If index is
undefined , returnundefined . - If
IsInteger (index) isfalse , returnundefined . - If index =
-0 , returnundefined . - Let str be the String value of the [[StringData]] internal slot of S.
- Let len be the number of elements in str.
- If index < 0 or len ≤ index, return
undefined . - Let resultStr be a String value of length 1, containing one code unit from str, specifically the code unit at index index.
- Return a PropertyDescriptor{[[Value]]: resultStr, [[Writable]]:
false , [[Enumerable]]:true , [[Configurable]]:false }.
9.4.3.2[[OwnPropertyKeys]] ( )#
When the [[OwnPropertyKeys]] internal method of a String exotic object O is called, the following steps are taken:
- Let keys be a new empty
List . - Let str be the String value of the [[StringData]] internal slot of O.
- Let len be the number of elements in str.
- For each integer i starting with 0 such that i < len, in ascending order,
- Add !
ToString (i) as the last element of keys.
- Add !
- For each own property key P of O such that P is an integer index and
ToInteger (P) ≥ len, in ascending numeric index order,- Add P as the last element of keys.
- For each own property key P of O such that
Type (P) is String and P is not an integer index, in ascending chronological order of property creation,- Add P as the last element of keys.
- For each own property key P of O such that
Type (P) is Symbol, in ascending chronological order of property creation,- Add P as the last element of keys.
- Return keys.
9.4.3.3StringCreate ( value, prototype)#
The abstract operation StringCreate with arguments value and prototype is used to specify the creation of new exotic String objects. It performs the following steps:
- Assert:
Type (value) is String. - Let S be a newly created String exotic object.
- Set the [[StringData]] internal slot of S to value.
- Set S's essential internal methods to the default ordinary object definitions specified in
9.1 . - Set the [[GetOwnProperty]] internal method of S as specified in
9.4.3.1 . - Set the [[OwnPropertyKeys]] internal method of S as specified in
9.4.3.2 . - Set the [[Prototype]] internal slot of S to prototype.
- Set the [[Extensible]] internal slot of S to
true . - Let length be the number of code unit elements in value.
- Perform !
DefinePropertyOrThrow (S,"length", PropertyDescriptor{[[Value]]: length, [[Writable]]:false , [[Enumerable]]:false , [[Configurable]]:false }). - Return S.
9.4.4Arguments Exotic Objects#
Most ECMAScript functions make an arguments object available to their code. Depending upon the characteristics of the function definition, its arguments object is either an ordinary object or an arguments exotic object. An arguments exotic object is an exotic object whose array index properties map to the formal parameters bindings of an invocation of its associated ECMAScript function.
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 (
Arguments exotic objects provide alternative definitions for the following internal methods. All of the other exotic arguments object essential internal methods that are not defined below are as specified in
For non-strict functions the integer indexed data properties of an arguments 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
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.
Arguments objects for strict mode functions define non-configurable accessor properties named "caller" and "callee" which throw a "callee" property has a more specific meaning for non-strict functions and a "caller" property has historically been provided as an implementation-defined extension by some ECMAScript implementations. The strict mode definition of these properties exists to ensure that neither of them is defined in any other manner by conforming ECMAScript implementations.
9.4.4.1[[GetOwnProperty]] (P)#
The [[GetOwnProperty]] internal method of an arguments exotic object when called with a property key P performs the following steps:
- Let args be the arguments object.
- Let desc be
OrdinaryGetOwnProperty (args, P). - If desc is
undefined , return desc. - Let map be the value of the [[ParameterMap]] internal slot of the arguments object.
- Let isMapped be !
HasOwnProperty (map, P). - If the value of isMapped is
true , then- Set desc.[[Value]] to
Get (map, P).
- Set desc.[[Value]] to
- If
IsDataDescriptor (desc) istrue and P is"caller"and desc.[[Value]] is a strict mode Function object, throw aTypeError exception. - Return desc.
If an implementation does not provide a built-in caller property for argument exotic objects then step 7 of this algorithm must be skipped.
9.4.4.2[[DefineOwnProperty]] (P, Desc)#
The [[DefineOwnProperty]] internal method of an arguments exotic object when called with a property key P and
- Let args be the arguments object.
- Let map be the value of the [[ParameterMap]] internal slot of the arguments object.
- Let isMapped be
HasOwnProperty (map, P). - Let newArgDesc be Desc.
- If isMapped is
true andIsDataDescriptor (Desc) istrue , then- If Desc.[[Value]] is not present and Desc.[[Writable]] is present and its value is
false , then- Let newArgDesc be a copy of Desc.
- Set newArgDesc.[[Value]] to
Get (map, P).
- If Desc.[[Value]] is not present and Desc.[[Writable]] is present and its value is
- Let allowed be ?
OrdinaryDefineOwnProperty (args, P, newArgDesc). - If allowed is
false , returnfalse . - If the value of isMapped is
true , then- If
IsAccessorDescriptor (Desc) istrue , then- Call map.[[Delete]](P).
- Else,
- If Desc.[[Value]] is present, then
- Let setStatus be
Set (map, P, Desc.[[Value]],false ). - Assert: setStatus is
true because formal parameters mapped by argument objects are always writable.
- Let setStatus be
- If Desc.[[Writable]] is present and its value is
false , then- Call map.[[Delete]](P).
- If Desc.[[Value]] is present, then
- If
- Return
true .
9.4.4.3[[Get]] (P, Receiver)#
The [[Get]] internal method of an arguments exotic object when called with a property key P and
- Let args be the arguments object.
- Let map be the value of the [[ParameterMap]] internal slot of the arguments object.
- Let isMapped be !
HasOwnProperty (map, P). - If the value of isMapped is
false , then- Return ?
OrdinaryGet (args, P, Receiver).
- Return ?
- Else map contains a formal parameter mapping for P,
- Return
Get (map, P).
- Return
9.4.4.4[[Set]] ( P, V, Receiver)#
The [[Set]] internal method of an arguments exotic object when called with property key P, value V, and
- Let args be the arguments object.
- If
SameValue (args, Receiver) isfalse , then- Let isMapped be
false .
- Let isMapped be
- Else,
- Let map be the value of the [[ParameterMap]] internal slot of the arguments object.
- Let isMapped be !
HasOwnProperty (map, P).
- If isMapped is
true , then- Let setStatus be
Set (map, P, V,false ). - Assert: setStatus is
true because formal parameters mapped by argument objects are always writable.
- Let setStatus be
- Return ?
OrdinarySet (args, P, V, Receiver).
9.4.4.5[[HasProperty]] ( P )#
The [[HasProperty]] internal method of an arguments exotic object when called with property key P, performs the following steps:
- Let args be the arguments object.
- If P is
"caller", then- Let desc be !
OrdinaryGetOwnProperty (args, P). - If
IsDataDescriptor (desc) istrue , returntrue .
- Let desc be !
- Return ?
OrdinaryHasProperty (args, P).
If an implementation does not provide a built-in caller property for argument exotic objects then step 2 of this algorithm must be skipped.
9.4.4.6[[Delete]] (P)#
The [[Delete]] internal method of an arguments exotic object when called with a property key P performs the following steps:
- Let args be the arguments object.
- Let map be the value of the [[ParameterMap]] internal slot of args.
- Let isMapped be !
HasOwnProperty (map, P). - Let result be ?
OrdinaryDelete (args, P). - If result is
true and the value of isMapped istrue , then- Call map.[[Delete]](P).
- Return result.
9.4.4.7CreateUnmappedArgumentsObject (argumentsList)#
The abstract operation CreateUnmappedArgumentsObject called with an argument argumentsList performs the following steps:
- Let len be the number of elements in argumentsList.
- Let obj be
ObjectCreate (%ObjectPrototype% , « [[ParameterMap]] »). - Set obj's [[ParameterMap]] internal slot to
undefined . - Perform
DefinePropertyOrThrow (obj,"length", PropertyDescriptor{[[Value]]: len, [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:true }). - Let index be 0.
- Repeat while index < len,
- Let val be argumentsList[index].
- Perform
CreateDataProperty (obj, !ToString (index), val). - Let index be index + 1.
- Perform !
DefinePropertyOrThrow (obj, @@iterator, PropertyDescriptor {[[Value]]:%ArrayProto_values% , [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:true }). - Perform !
DefinePropertyOrThrow (obj,"callee", PropertyDescriptor {[[Get]]:%ThrowTypeError% , [[Set]]:%ThrowTypeError% , [[Enumerable]]:false , [[Configurable]]:false }). - Perform !
DefinePropertyOrThrow (obj,"caller", PropertyDescriptor {[[Get]]:%ThrowTypeError% , [[Set]]:%ThrowTypeError% , [[Enumerable]]:false , [[Configurable]]:false }). - Return obj.
9.4.4.8CreateMappedArgumentsObject ( func, formals, argumentsList, env )#
The abstract operation CreateMappedArgumentsObject is called with object func, parsed grammar phrase formals,
- Assert: formals does not contain a rest parameter, any binding patterns, or any initializers. It may contain duplicate identifiers.
- Let len be the number of elements in argumentsList.
- Let obj be a newly created arguments exotic object with a [[ParameterMap]] internal slot.
- Set the [[GetOwnProperty]] internal method of obj as specified in
9.4.4.1 . - Set the [[DefineOwnProperty]] internal method of obj as specified in
9.4.4.2 . - Set the [[Get]] internal method of obj as specified in
9.4.4.3 . - Set the [[Set]] internal method of obj as specified in
9.4.4.4 . - Set the [[HasProperty]] internal method of obj as specified in
9.4.4.5 . - Set the [[Delete]] internal method of obj as specified in
9.4.4.6 . - Set the remainder of obj's essential internal methods to the default ordinary object definitions specified in
9.1 . - Set the [[Prototype]] internal slot of obj to
%ObjectPrototype% . - Set the [[Extensible]] internal slot of obj to
true . - Let map be
ObjectCreate (null ). - Set the [[ParameterMap]] internal slot of obj to map.
- Let parameterNames be the BoundNames of formals.
- Let numberOfParameters be the number of elements in parameterNames.
- Let index be 0.
- Repeat while index < len,
- Let val be argumentsList[index].
- Perform
CreateDataProperty (obj, !ToString (index), val). - Let index be index + 1.
- Perform
DefinePropertyOrThrow (obj,"length", PropertyDescriptor{[[Value]]: len, [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:true }). - Let mappedNames be a new empty
List . - Let index be numberOfParameters - 1.
- Repeat while index ≥ 0,
- Let name be parameterNames[index].
- If name is not an element of mappedNames, then
- Add name as an element of the list mappedNames.
- If index < len, then
- Let g be
MakeArgGetter (name, env). - Let p be
MakeArgSetter (name, env). - Perform map.[[DefineOwnProperty]](!
ToString (index), PropertyDescriptor{[[Set]]: p, [[Get]]: g, [[Enumerable]]:false , [[Configurable]]:true }).
- Let g be
- Let index be index - 1.
- Perform !
DefinePropertyOrThrow (obj, @@iterator, PropertyDescriptor {[[Value]]:%ArrayProto_values% , [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:true }). - Perform !
DefinePropertyOrThrow (obj,"callee", PropertyDescriptor {[[Value]]: func, [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:true }). - Return obj.
9.4.4.8.1MakeArgGetter ( name, env)#
The abstract operation MakeArgGetter called with String name and
- Let
realm bethe current Realm Record . - Let steps be the steps of an ArgGetter function as specified below.
- Let getter be
CreateBuiltinFunction (realm , steps,%FunctionPrototype% , « [[Name]], [[Env]] »). - Set getter's [[Name]] internal slot to name.
- Set getter's [[Env]] internal slot to env.
- Return getter.
An ArgGetter function is an anonymous built-in function with [[Name]] and [[Env]] internal slots. When an ArgGetter function f that expects no arguments is called it performs the following steps:
- Let name be the value of f's [[Name]] internal slot.
- Let env be the value of f's [[Env]] internal slot.
- Return env.GetBindingValue(name,
false ).
ArgGetter functions are never directly accessible to ECMAScript code.
9.4.4.8.2MakeArgSetter ( name, env)#
The abstract operation MakeArgSetter called with String name and
- Let
realm bethe current Realm Record . - Let steps be the steps of an ArgSetter function as specified below.
- Let setter be
CreateBuiltinFunction (realm , steps,%FunctionPrototype% , « [[Name]], [[Env]] »). - Set setter's [[Name]] internal slot to name.
- Set setter's [[Env]] internal slot to env.
- Return setter.
An ArgSetter function is an anonymous built-in function with [[Name]] and [[Env]] internal slots. When an ArgSetter function f is called with argument value it performs the following steps:
- Let name be the value of f's [[Name]] internal slot.
- Let env be the value of f's [[Env]] internal slot.
- Return env.SetMutableBinding(name, value,
false ).
ArgSetter functions are never directly accessible to ECMAScript code.
9.4.5Integer Indexed Exotic Objects#
An Integer Indexed object is an exotic object that performs special handling of integer index property keys.
Integer Indexed exotic objects have the same internal slots as ordinary objects and additionally [[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], and [[TypedArrayName]] internal slots.
Integer Indexed exotic objects provide alternative definitions for the following internal methods. All of the other Integer Indexed exotic object essential internal methods that are not defined below are as specified in
9.4.5.1[[GetOwnProperty]] ( P )#
When the [[GetOwnProperty]] internal method of an Integer Indexed exotic object O is called with property key P, the following steps are taken:
- Assert:
IsPropertyKey (P) istrue . - Assert: O is an Object that has a [[ViewedArrayBuffer]] internal slot.
- If
Type (P) is String, then- Let numericIndex be !
CanonicalNumericIndexString (P). - If numericIndex is not
undefined , then- Let value be ?
IntegerIndexedElementGet (O, numericIndex). - If value is
undefined , returnundefined . - Return a PropertyDescriptor{[[Value]]: value, [[Writable]]:
true , [[Enumerable]]:true , [[Configurable]]:false }.
- Let value be ?
- Let numericIndex be !
- Return
OrdinaryGetOwnProperty (O, P).
9.4.5.2[[HasProperty]](P)#
When the [[HasProperty]] internal method of an Integer Indexed exotic object O is called with property key P, the following steps are taken:
- Assert:
IsPropertyKey (P) istrue . - Assert: O is an Object that has a [[ViewedArrayBuffer]] internal slot.
- If
Type (P) is String, then- Let numericIndex be !
CanonicalNumericIndexString (P). - If numericIndex is not
undefined , then- Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - If
IsInteger (numericIndex) isfalse , returnfalse . - If numericIndex =
-0 , returnfalse . - If numericIndex < 0, return
false . - If numericIndex ≥ the value of O's [[ArrayLength]] internal slot, return
false . - Return
true .
- Let numericIndex be !
- Return ?
OrdinaryHasProperty (O, P).
9.4.5.3[[DefineOwnProperty]] ( P, Desc)#
When the [[DefineOwnProperty]] internal method of an Integer Indexed exotic object O is called with property key P, and
- Assert:
IsPropertyKey (P) istrue . - Assert: O is an Object that has a [[ViewedArrayBuffer]] internal slot.
- If
Type (P) is String, then- Let numericIndex be !
CanonicalNumericIndexString (P). - If numericIndex is not
undefined , then- If
IsInteger (numericIndex) isfalse , returnfalse . - Let intIndex be numericIndex.
- If intIndex =
-0 , returnfalse . - If intIndex < 0, return
false . - Let length be the value of O's [[ArrayLength]] internal slot.
- If intIndex ≥ length, return
false . - If
IsAccessorDescriptor (Desc) istrue , returnfalse . - If Desc has a [[Configurable]] field and if Desc.[[Configurable]] is
true , returnfalse . - If Desc has an [[Enumerable]] field and if Desc.[[Enumerable]] is
false , returnfalse . - If Desc has a [[Writable]] field and if Desc.[[Writable]] is
false , returnfalse . - If Desc has a [[Value]] field, then
- Let value be Desc.[[Value]].
- Return ?
IntegerIndexedElementSet (O, intIndex, value).
- Return
true .
- If
- Let numericIndex be !
- Return
OrdinaryDefineOwnProperty (O, P, Desc).
9.4.5.4[[Get]] (P, Receiver)#
When the [[Get]] internal method of an Integer Indexed exotic object O is called with property key P and
- Assert:
IsPropertyKey (P) istrue . - If
Type (P) is String, then- Let numericIndex be !
CanonicalNumericIndexString (P). - If numericIndex is not
undefined , then- Return ?
IntegerIndexedElementGet (O, numericIndex).
- Return ?
- Let numericIndex be !
- Return ?
OrdinaryGet (O, P, Receiver).
9.4.5.5[[Set]] ( P, V, Receiver)#
When the [[Set]] internal method of an Integer Indexed exotic object O is called with property key P, value V, and
- Assert:
IsPropertyKey (P) istrue . - If
Type (P) is String, then- Let numericIndex be !
CanonicalNumericIndexString (P). - If numericIndex is not
undefined , then- Return ?
IntegerIndexedElementSet (O, numericIndex, V).
- Return ?
- Let numericIndex be !
- Return ?
OrdinarySet (O, P, V, Receiver).
9.4.5.6[[OwnPropertyKeys]] ()#
When the [[OwnPropertyKeys]] internal method of an Integer Indexed exotic object O is called, the following steps are taken:
- Let keys be a new empty
List . - Assert: O is an Object that has [[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], and [[TypedArrayName]] internal slots.
- Let len be the value of O's [[ArrayLength]] internal slot.
- For each integer i starting with 0 such that i < len, in ascending order,
- Add !
ToString (i) as the last element of keys.
- Add !
- For each own property key P of O such that
Type (P) is String and P is not an integer index, in ascending chronological order of property creation- Add P as the last element of keys.
- For each own property key P of O such that
Type (P) is Symbol, in ascending chronological order of property creation- Add P as the last element of keys.
- Return keys.
9.4.5.7IntegerIndexedObjectCreate (prototype, internalSlotsList)#
The abstract operation IntegerIndexedObjectCreate with arguments prototype and internalSlotsList is used to specify the creation of new Integer Indexed exotic objects. The argument internalSlotsList is a
- Assert: internalSlotsList contains the names [[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], and [[TypedArrayName]].
- Let A be a newly created object with an internal slot for each name in internalSlotsList.
- Set A's essential internal methods to the default ordinary object definitions specified in
9.1 . - Set the [[GetOwnProperty]] internal method of A as specified in
9.4.5.1 . - Set the [[HasProperty]] internal method of A as specified in
9.4.5.2 . - Set the [[DefineOwnProperty]] internal method of A as specified in
9.4.5.3 . - Set the [[Get]] internal method of A as specified in
9.4.5.4 . - Set the [[Set]] internal method of A as specified in
9.4.5.5 . - Set the [[OwnPropertyKeys]] internal method of A as specified in
9.4.5.6 . - Set the [[Prototype]] internal slot of A to prototype.
- Set the [[Extensible]] internal slot of A to
true . - Return A.
9.4.5.8IntegerIndexedElementGet ( O, index )#
The abstract operation IntegerIndexedElementGet with arguments O and index performs the following steps:
- Assert:
Type (index) is Number. - Assert: O is an Object that has [[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], and [[TypedArrayName]] internal slots.
- Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - If
IsInteger (index) isfalse , returnundefined . - If index =
-0 , returnundefined . - Let length be the value of O's [[ArrayLength]] internal slot.
- If index < 0 or index ≥ length, return
undefined . - Let offset be the value of O's [[ByteOffset]] internal slot.
- Let arrayTypeName be the String value of O's [[TypedArrayName]] internal slot.
- Let elementSize be the Number value of the Element Size value specified in
Table 50 for arrayTypeName. - Let indexedPosition be (index × elementSize) + offset.
- Let elementType be the String value of the Element Type value in
Table 50 for arrayTypeName. - Return
GetValueFromBuffer (buffer, indexedPosition, elementType).
9.4.5.9IntegerIndexedElementSet ( O, index, value )#
The abstract operation IntegerIndexedElementSet with arguments O, index, and value performs the following steps:
- Assert:
Type (index) is Number. - Assert: O is an Object that has [[ViewedArrayBuffer]], [[ArrayLength]], [[ByteOffset]], and [[TypedArrayName]] internal slots.
- Let numValue be ?
ToNumber (value). - Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - If
IsInteger (index) isfalse , returnfalse . - If index =
-0 , returnfalse . - Let length be the value of O's [[ArrayLength]] internal slot.
- If index < 0 or index ≥ length, return
false . - Let offset be the value of O's [[ByteOffset]] internal slot.
- Let arrayTypeName be the String value of O's [[TypedArrayName]] internal slot.
- Let elementSize be the Number value of the Element Size value specified in
Table 50 for arrayTypeName. - Let indexedPosition be (index × elementSize) + offset.
- Let elementType be the String value of the Element Type value in
Table 50 for arrayTypeName. - Perform
SetValueInBuffer (buffer, indexedPosition, elementType, numValue). - Return
true .
9.4.6Module Namespace Exotic Objects#
A module namespace object is an exotic object that exposes the bindings exported from an ECMAScript export * export items. Each String-valued own property key is the StringValue of the corresponding exported binding name. These are the only String-keyed properties of a module namespace exotic object. Each such property has the attributes { [[Writable]]:
Module namespace objects have the internal slots defined in
| Internal Slot | Type | Description |
|---|---|---|
| [[Module]] |
|
The |
| [[Exports]] |
|
A Array.prototype.sort using |
Module namespace exotic objects provide alternative definitions for all of the internal methods.
9.4.6.1[[GetPrototypeOf]] ( )#
When the [[GetPrototypeOf]] internal method of a module namespace exotic object O is called, the following steps are taken:
- Return
null .
9.4.6.2[[SetPrototypeOf]] (V)#
When the [[SetPrototypeOf]] internal method of a module namespace exotic object O is called with argument V, the following steps are taken:
9.4.6.3[[IsExtensible]] ( )#
When the [[IsExtensible]] internal method of a module namespace exotic object O is called, the following steps are taken:
- Return
false .
9.4.6.4[[PreventExtensions]] ( )#
When the [[PreventExtensions]] internal method of a module namespace exotic object O is called, the following steps are taken:
- Return
true .
9.4.6.5[[GetOwnProperty]] (P)#
When the [[GetOwnProperty]] internal method of a module namespace exotic object O is called with property key P, the following steps are taken:
- If
Type (P) is Symbol, returnOrdinaryGetOwnProperty (O, P). - Let exports be the value of O's [[Exports]] internal slot.
- If P is not an element of exports, return
undefined . - Let value be ? O.[[Get]](P, O).
- Return PropertyDescriptor{[[Value]]: value, [[Writable]]:
true , [[Enumerable]]:true , [[Configurable]]:false }.
9.4.6.6[[DefineOwnProperty]] (P, Desc)#
When the [[DefineOwnProperty]] internal method of a module namespace exotic object O is called with property key P and
- Return
false .
9.4.6.7[[HasProperty]] (P)#
When the [[HasProperty]] internal method of a module namespace exotic object O is called with property key P, the following steps are taken:
- If
Type (P) is Symbol, returnOrdinaryHasProperty (O, P). - Let exports be the value of O's [[Exports]] internal slot.
- If P is an element of exports, return
true . - Return
false .
9.4.6.8[[Get]] (P, Receiver)#
When the [[Get]] internal method of a module namespace exotic object O is called with property key P and
- Assert:
IsPropertyKey (P) istrue . - If
Type (P) is Symbol, then- Return ?
OrdinaryGet (O, P, Receiver).
- Return ?
- Let exports be the value of O's [[Exports]] internal slot.
- If P is not an element of exports, return
undefined . - Let m be the value of O's [[Module]] internal slot.
- Let binding be ? m.ResolveExport(P, « », « »).
- Assert: binding is neither
null nor"ambiguous". - Let targetModule be binding.[[Module]].
- Assert: targetModule is not
undefined . - Let targetEnv be targetModule.[[Environment]].
- If targetEnv is
undefined , throw aReferenceError exception. - Let targetEnvRec be targetEnv's
EnvironmentRecord . - Return ? targetEnvRec.GetBindingValue(binding.[[BindingName]],
true ).
ResolveExport is idempotent and side-effect free. An implementation might choose to pre-compute or cache the ResolveExport results for the [[Exports]] of each module namespace exotic object.
9.4.6.9[[Set]] ( P, V, Receiver)#
When the [[Set]] internal method of a module namespace exotic object O is called with property key P, value V, and
- Return
false .
9.4.6.10[[Delete]] (P)#
When the [[Delete]] internal method of a module namespace exotic object O is called with property key P, the following steps are taken:
- Assert:
IsPropertyKey (P) istrue . - Let exports be the value of O's [[Exports]] internal slot.
- If P is an element of exports, return
false . - Return
true .
9.4.6.11[[OwnPropertyKeys]] ( )#
When the [[OwnPropertyKeys]] internal method of a module namespace exotic object O is called, the following steps are taken:
- Let exports be a copy of the value of O's [[Exports]] internal slot.
- Let symbolKeys be !
OrdinaryOwnPropertyKeys (O). - Append all the entries of symbolKeys to the end of exports.
- Return exports.
9.4.6.12ModuleNamespaceCreate (module, exports)#
The abstract operation ModuleNamespaceCreate with arguments module, and exports is used to specify the creation of new module namespace exotic objects. It performs the following steps:
- Assert: module is a
Module Record . - Assert: module.[[Namespace]] is
undefined . - Assert: exports is a
List of String values. - Let M be a newly created object.
- Set M's essential internal methods to the definitions specified in
9.4.6 . - Set M's [[Module]] internal slot to module.
- Set M's [[Exports]] internal slot to exports.
- Create own properties of M corresponding to the definitions in
26.3 . - Set module.[[Namespace]] to M.
- Return M.
9.4.7Immutable Prototype Exotic Objects#
An immutable prototype exotic object is an exotic object that has an immutable [[Prototype]] internal slot.
9.4.7.1[[SetPrototypeOf]] (V)#
When the [[SetPrototypeOf]] internal method of an
9.5Proxy Object Internal Methods and Internal Slots#
A proxy object is an exotic object whose essential internal methods are partially implemented using ECMAScript code. Every proxy objects has an internal slot called [[ProxyHandler]]. The value of [[ProxyHandler]] is an object, called the proxy's handler object, or
| Internal Method | Handler Method |
|---|---|
| [[GetPrototypeOf]] |
getPrototypeOf
|
| [[SetPrototypeOf]] |
setPrototypeOf
|
| [[IsExtensible]] |
isExtensible
|
| [[PreventExtensions]] |
preventExtensions
|
| [[GetOwnProperty]] |
getOwnPropertyDescriptor
|
| [[HasProperty]] |
has
|
| [[Get]] |
get
|
| [[Set]] |
set
|
| [[Delete]] |
deleteProperty
|
| [[DefineOwnProperty]] |
defineProperty
|
| [[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
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
In the following algorithm descriptions, assume O is an ECMAScript proxy object, P is a property key value, V is any
9.5.1[[GetPrototypeOf]] ( )#
When the [[GetPrototypeOf]] internal method of a Proxy exotic object O is called, the following steps are taken:
- Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"getPrototypeOf"). - If trap is
undefined , then- Return ? target.[[GetPrototypeOf]]().
- Let handlerProto be ?
Call (trap, handler, « target »). - If
Type (handlerProto) is neither Object nor Null, throw aTypeError exception. - Let extensibleTarget be ?
IsExtensible (target). - If extensibleTarget is
true , return handlerProto. - Let targetProto be ? target.[[GetPrototypeOf]]().
- If
SameValue (handlerProto, targetProto) isfalse , throw aTypeError exception. - Return handlerProto.
[[GetPrototypeOf]] for proxy objects enforces the following invariant:
-
The result of [[GetPrototypeOf]] must be either an Object or
null . - If the target object is not extensible, [[GetPrototypeOf]] applied to the proxy object must return the same value as [[GetPrototypeOf]] applied to the proxy object's target object.
9.5.2[[SetPrototypeOf]] (V)#
When the [[SetPrototypeOf]] internal method of a Proxy exotic object O is called with argument V, the following steps are taken:
- Assert: Either
Type (V) is Object orType (V) is Null. - Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"setPrototypeOf"). - If trap is
undefined , then- Return ? target.[[SetPrototypeOf]](V).
- Let booleanTrapResult be
ToBoolean (?Call (trap, handler, « target, V »)). - If booleanTrapResult is
false , returnfalse . - Let extensibleTarget be ?
IsExtensible (target). - If extensibleTarget is
true , returntrue . - Let targetProto be ? target.[[GetPrototypeOf]]().
- If
SameValue (V, targetProto) isfalse , throw aTypeError exception. - Return
true .
[[SetPrototypeOf]] for proxy objects enforces the following invariant:
- The result of [[SetPrototypeOf]] is a Boolean value.
- If the target object is not extensible, the argument value must be the same as the result of [[GetPrototypeOf]] applied to target object.
9.5.3[[IsExtensible]] ( )#
When the [[IsExtensible]] internal method of a Proxy exotic object O is called, the following steps are taken:
- Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"isExtensible"). - If trap is
undefined , then- Return ? target.[[IsExtensible]]().
- Let booleanTrapResult be
ToBoolean (?Call (trap, handler, « target »)). - Let targetResult be ? target.[[IsExtensible]]().
- If
SameValue (booleanTrapResult, targetResult) isfalse , throw aTypeError exception. - Return booleanTrapResult.
[[IsExtensible]] for proxy objects enforces the following invariant:
- The result of [[IsExtensible]] is a Boolean value.
- [[IsExtensible]] applied to the proxy object must return the same value as [[IsExtensible]] applied to the proxy object's target object with the same argument.
9.5.4[[PreventExtensions]] ( )#
When the [[PreventExtensions]] internal method of a Proxy exotic object O is called, the following steps are taken:
- Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"preventExtensions"). - If trap is
undefined , then- Return ? target.[[PreventExtensions]]().
- Let booleanTrapResult be
ToBoolean (?Call (trap, handler, « target »)). - If booleanTrapResult is
true , then- Let targetIsExtensible be ? target.[[IsExtensible]]().
- If targetIsExtensible is
true , throw aTypeError exception.
- Return booleanTrapResult.
[[PreventExtensions]] for proxy objects enforces the following invariant:
- The result of [[PreventExtensions]] is a Boolean value.
-
[[PreventExtensions]] applied to the proxy object only returns
true if [[IsExtensible]] applied to the proxy object's target object isfalse .
9.5.5[[GetOwnProperty]] (P)#
When the [[GetOwnProperty]] internal method of a Proxy exotic object O is called with property key P, the following steps are taken:
- Assert:
IsPropertyKey (P) istrue . - Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"getOwnPropertyDescriptor"). - If trap is
undefined , then- Return ? target.[[GetOwnProperty]](P).
- Let trapResultObj be ?
Call (trap, handler, « target, P »). - If
Type (trapResultObj) is neither Object nor Undefined, throw aTypeError exception. - Let targetDesc be ? target.[[GetOwnProperty]](P).
- If trapResultObj is
undefined , then- If targetDesc is
undefined , returnundefined . - If targetDesc.[[Configurable]] is
false , throw aTypeError exception. - Let extensibleTarget be ?
IsExtensible (target). - Assert:
Type (extensibleTarget) is Boolean. - If extensibleTarget is
false , throw aTypeError exception. - Return
undefined .
- If targetDesc is
- Let extensibleTarget be ?
IsExtensible (target). - Let resultDesc be ?
ToPropertyDescriptor (trapResultObj). - Call
CompletePropertyDescriptor (resultDesc). - Let valid be
IsCompatiblePropertyDescriptor (extensibleTarget, resultDesc, targetDesc). - If valid is
false , throw aTypeError exception. - If resultDesc.[[Configurable]] is
false , then- If targetDesc is
undefined or targetDesc.[[Configurable]] istrue , then- Throw a
TypeError exception.
- Throw a
- If targetDesc is
- Return resultDesc.
[[GetOwnProperty]] for proxy objects enforces the following invariants:
-
The result of [[GetOwnProperty]] must be either an Object or
undefined . - A property cannot be reported as non-existent, if it exists as a non-configurable own property of the target object.
- A property cannot be reported as non-existent, if it exists as an own property of the target object and the target object is not extensible.
- A property cannot be reported as existent, if it does not exists as an own property of the target object and the target object is not extensible.
- A property cannot be reported as non-configurable, if it does not exists as an own property of the target object or if it exists as a configurable own property of the target object.
9.5.6[[DefineOwnProperty]] (P, Desc)#
When the [[DefineOwnProperty]] internal method of a Proxy exotic object O is called with property key P and
- Assert:
IsPropertyKey (P) istrue . - Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"defineProperty"). - If trap is
undefined , then- Return ? target.[[DefineOwnProperty]](P, Desc).
- Let descObj be
FromPropertyDescriptor (Desc). - Let booleanTrapResult be
ToBoolean (?Call (trap, handler, « target, P, descObj »)). - If booleanTrapResult is
false , returnfalse . - Let targetDesc be ? target.[[GetOwnProperty]](P).
- Let extensibleTarget be ?
IsExtensible (target). - If Desc has a [[Configurable]] field and if Desc.[[Configurable]] is
false , then- Let settingConfigFalse be
true .
- Let settingConfigFalse be
- Else let settingConfigFalse be
false . - If targetDesc is
undefined , then- If extensibleTarget is
false , throw aTypeError exception. - If settingConfigFalse is
true , throw aTypeError exception.
- If extensibleTarget is
- Else targetDesc is not
undefined ,- If
IsCompatiblePropertyDescriptor (extensibleTarget, Desc, targetDesc) isfalse , throw aTypeError exception. - If settingConfigFalse is
true and targetDesc.[[Configurable]] istrue , throw aTypeError exception.
- If
- Return
true .
[[DefineOwnProperty]] for proxy objects enforces the following invariants:
- The result of [[DefineOwnProperty]] is a Boolean value.
- A property cannot be added, if the target object is not extensible.
- A property cannot be non-configurable, unless there exists a corresponding non-configurable own property of the target object.
-
If a property has a corresponding target object property then applying the
Property Descriptor of the property to the target object using [[DefineOwnProperty]] will not throw an exception.
9.5.7[[HasProperty]] (P)#
When the [[HasProperty]] internal method of a Proxy exotic object O is called with property key P, the following steps are taken:
- Assert:
IsPropertyKey (P) istrue . - Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"has"). - If trap is
undefined , then- Return ? target.[[HasProperty]](P).
- Let booleanTrapResult be
ToBoolean (?Call (trap, handler, « target, P »)). - If booleanTrapResult is
false , then- Let targetDesc be ? target.[[GetOwnProperty]](P).
- If targetDesc is not
undefined , then- If targetDesc.[[Configurable]] is
false , throw aTypeError exception. - Let extensibleTarget be ?
IsExtensible (target). - If extensibleTarget is
false , throw aTypeError exception.
- If targetDesc.[[Configurable]] is
- Return booleanTrapResult.
[[HasProperty]] for proxy objects enforces the following invariants:
- The result of [[HasProperty]] is a Boolean value.
- A property cannot be reported as non-existent, if it exists as a non-configurable own property of the target object.
- A property cannot be reported as non-existent, if it exists as an own property of the target object and the target object is not extensible.
9.5.8[[Get]] (P, Receiver)#
When the [[Get]] internal method of a Proxy exotic object O is called with property key P and
- Assert:
IsPropertyKey (P) istrue . - Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"get"). - If trap is
undefined , then- Return ? target.[[Get]](P, Receiver).
- Let trapResult be ?
Call (trap, handler, « target, P, Receiver »). - Let targetDesc be ? target.[[GetOwnProperty]](P).
- If targetDesc is not
undefined , then- If
IsDataDescriptor (targetDesc) istrue and targetDesc.[[Configurable]] isfalse and targetDesc.[[Writable]] isfalse , then- If
SameValue (trapResult, targetDesc.[[Value]]) isfalse , throw aTypeError exception.
- If
- If
IsAccessorDescriptor (targetDesc) istrue and targetDesc.[[Configurable]] isfalse and targetDesc.[[Get]] isundefined , then- If trapResult is not
undefined , throw aTypeError exception.
- If trapResult is not
- If
- Return trapResult.
[[Get]] for proxy objects enforces the following invariants:
- The value reported for a property must be the same as the value of the corresponding target object property if the target object property is a non-writable, non-configurable own data property.
-
The value reported for a property must be
undefined if the corresponding target object property is a non-configurable own accessor property that hasundefined as its [[Get]] attribute.
9.5.9[[Set]] ( P, V, Receiver)#
When the [[Set]] internal method of a Proxy exotic object O is called with property key P, value V, and
- Assert:
IsPropertyKey (P) istrue . - Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"set"). - If trap is
undefined , then- Return ? target.[[Set]](P, V, Receiver).
- Let booleanTrapResult be
ToBoolean (?Call (trap, handler, « target, P, V, Receiver »)). - If booleanTrapResult is
false , returnfalse . - Let targetDesc be ? target.[[GetOwnProperty]](P).
- If targetDesc is not
undefined , then- If
IsDataDescriptor (targetDesc) istrue and targetDesc.[[Configurable]] isfalse and targetDesc.[[Writable]] isfalse , then- If
SameValue (V, targetDesc.[[Value]]) isfalse , throw aTypeError exception.
- If
- If
IsAccessorDescriptor (targetDesc) istrue and targetDesc.[[Configurable]] isfalse , then- If targetDesc.[[Set]] is
undefined , throw aTypeError exception.
- If targetDesc.[[Set]] is
- If
- Return
true .
[[Set]] for proxy objects enforces the following invariants:
- The result of [[Set]] is a Boolean value.
- Cannot change the value of a property to be different from the value of the corresponding target object property if the corresponding target object property is a non-writable, non-configurable own data property.
-
Cannot set the value of a property if the corresponding target object property is a non-configurable own accessor property that has
undefined as its [[Set]] attribute.
9.5.10[[Delete]] (P)#
When the [[Delete]] internal method of a Proxy exotic object O is called with property key P, the following steps are taken:
- Assert:
IsPropertyKey (P) istrue . - Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"deleteProperty"). - If trap is
undefined , then- Return ? target.[[Delete]](P).
- Let booleanTrapResult be
ToBoolean (?Call (trap, handler, « target, P »)). - If booleanTrapResult is
false , returnfalse . - Let targetDesc be ? target.[[GetOwnProperty]](P).
- If targetDesc is
undefined , returntrue . - If targetDesc.[[Configurable]] is
false , throw aTypeError exception. - Return
true .
[[Delete]] for proxy objects enforces the following invariant:
- The result of [[Delete]] is a Boolean value.
- A property cannot be reported as deleted, if it exists as a non-configurable own property of the target object.
9.5.11[[OwnPropertyKeys]] ( )#
When the [[OwnPropertyKeys]] internal method of a Proxy exotic object O is called, the following steps are taken:
- Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"ownKeys"). - If trap is
undefined , then- Return ? target.[[OwnPropertyKeys]]().
- Let trapResultArray be ?
Call (trap, handler, « target »). - Let trapResult be ?
CreateListFromArrayLike (trapResultArray, « String, Symbol »). - Let extensibleTarget be ?
IsExtensible (target). - Let targetKeys be ? target.[[OwnPropertyKeys]]().
- Assert: targetKeys is a
List containing only String and Symbol values. - Let targetConfigurableKeys be a new empty
List . - Let targetNonconfigurableKeys be a new empty
List . - Repeat, for each element key of targetKeys,
- Let desc be ? target.[[GetOwnProperty]](key).
- If desc is not
undefined and desc.[[Configurable]] isfalse , then- Append key as an element of targetNonconfigurableKeys.
- Else,
- Append key as an element of targetConfigurableKeys.
- If extensibleTarget is
true and targetNonconfigurableKeys is empty, then- Return trapResult.
- Let uncheckedResultKeys be a new
List which is a copy of trapResult. - Repeat, for each key that is an element of targetNonconfigurableKeys,
- If key is not an element of uncheckedResultKeys, throw a
TypeError exception. - Remove key from uncheckedResultKeys.
- If key is not an element of uncheckedResultKeys, throw a
- If extensibleTarget is
true , return trapResult. - Repeat, for each key that is an element of targetConfigurableKeys,
- If key is not an element of uncheckedResultKeys, throw a
TypeError exception. - Remove key from uncheckedResultKeys.
- If key is not an element of uncheckedResultKeys, throw a
- If uncheckedResultKeys is not empty, throw a
TypeError exception. - Return trapResult.
[[OwnPropertyKeys]] for proxy objects enforces the following invariants:
-
The result of [[OwnPropertyKeys]] is a
List . -
The Type of each result
List element is either String or Symbol. -
The result
List must contain the keys of all non-configurable own properties of the target object. -
If the target object is not extensible, then the result
List must contain all the keys of the own properties of the target object and no other values.
9.5.12[[Call]] (thisArgument, argumentsList)#
The [[Call]] internal method of a Proxy exotic object O is called with parameters thisArgument and argumentsList, a
- Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"apply"). - If trap is
undefined , then- Return ?
Call (target, thisArgument, argumentsList).
- Return ?
- Let argArray be
CreateArrayFromList (argumentsList). - Return ?
Call (trap, handler, « target, thisArgument, argArray »).
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.
9.5.13[[Construct]] ( argumentsList, newTarget)#
The [[Construct]] internal method of a Proxy exotic object O is called with parameters argumentsList which is a possibly empty
- Let handler be the value of the [[ProxyHandler]] internal slot of O.
- If handler is
null , throw aTypeError exception. - Assert:
Type (handler) is Object. - Let target be the value of the [[ProxyTarget]] internal slot of O.
- Let trap be ?
GetMethod (handler,"construct"). - If trap is
undefined , then- Assert: target has a [[Construct]] internal method.
- Return ?
Construct (target, argumentsList, newTarget).
- Let argArray be
CreateArrayFromList (argumentsList). - Let newObj be ?
Call (trap, handler, « target, argArray, newTarget »). - If
Type (newObj) is not Object, throw aTypeError exception. - Return newObj.
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.
[[Construct]] for proxy objects enforces the following invariants:
- The result of [[Construct]] must be an Object.
9.5.14ProxyCreate (target, handler)#
The abstract operation ProxyCreate with arguments target and handler is used to specify the creation of new Proxy exotic objects. It performs the following steps:
- If
Type (target) is not Object, throw aTypeError exception. - If target is a Proxy exotic object and the value of the [[ProxyHandler]] internal slot of target is
null , throw aTypeError exception. - If
Type (handler) is not Object, throw aTypeError exception. - If handler is a Proxy exotic object and the value of the [[ProxyHandler]] internal slot of handler is
null , throw aTypeError exception. - Let P be a newly created object.
- Set P's essential internal methods (except for [[Call]] and [[Construct]]) to the definitions specified in
9.5 . - If
IsCallable (target) istrue , then - Set the [[ProxyTarget]] internal slot of P to target.
- Set the [[ProxyHandler]] internal slot of P to handler.
- Return P.
10ECMAScript Language: Source Code#
10.1Source Text#
Syntax
ECMAScript code is expressed using Unicode, version 8.0.0 or later. 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
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.
In string literals, regular expression literals, template literals and identifiers, any Unicode code point may also be expressed using Unicode escape sequences that explicitly express a code point's numeric value. Within a comment, such an escape sequence is effectively ignored as part of the comment.
ECMAScript differs from the Java programming language in the behaviour of Unicode escape sequences. In a Java program, if the Unicode escape sequence \u000A, for example, occurs within a single-line comment, it is interpreted as a line terminator (Unicode code point U+000A is LINE FEED (LF)) and therefore the next code point is not part of the comment. Similarly, if the Unicode escape sequence \u000A occurs within a string literal in a Java program, it is likewise interpreted as a line terminator, which is not allowed within a string literal—one must write \n instead of \u000A to cause a LINE FEED (LF) to be part of the String value of a string literal. In an ECMAScript program, a Unicode escape sequence occurring within a comment is never interpreted and therefore cannot contribute to termination of the comment. Similarly, a Unicode escape sequence occurring within a string literal in an ECMAScript program always contributes to the literal and is never interpreted as a line terminator or as a code point that might terminate the string literal.
10.1.1Static Semantics: UTF16Encoding ( cp )#
The UTF16Encoding of a numeric code point value, cp, is determined as follows:
10.1.2Static Semantics: UTF16Decode( lead, trail )#
Two code units, lead and trail, that form a UTF-16 surrogate pair are converted to a code point by performing the following steps:
- Assert: 0xD800 ≤ lead ≤ 0xDBFF and 0xDC00 ≤ trail ≤ 0xDFFF.
- Let cp be (lead - 0xD800) × 1024 + (trail - 0xDC00) + 0x10000.
- Return the code point cp.
10.2Types of Source Code#
There are four types of ECMAScript code:
-
Global code is source text that is treated as an ECMAScript
Script . The global code of a particularScript does not include any source text that is parsed as part of aFunctionDeclaration ,FunctionExpression ,GeneratorDeclaration ,GeneratorExpression ,MethodDefinition ,ArrowFunction ,ClassDeclaration , orClassExpression . -
Eval code is the source text supplied to the built-in
evalfunction. More precisely, if the parameter to the built-inevalfunction is a String, it is treated as an ECMAScriptScript . The eval code for a particular invocation ofevalis the global code portion of thatScript . -
Function code is source text that is parsed to supply the value of the [[ECMAScriptCode]] and [[FormalParameters]] internal slots (see
9.2 ) of an ECMAScript function object. The function code of a particular ECMAScript function does not include any source text that is parsed as the function code of a nestedFunctionDeclaration ,FunctionExpression ,GeneratorDeclaration ,GeneratorExpression ,MethodDefinition ,ArrowFunction ,ClassDeclaration , orClassExpression . -
Module code is source text that is code that is provided as a
ModuleBody . It is the code that is directly evaluated when a module is initialized. The module code of a particular module does not include any source text that is parsed as part of a nestedFunctionDeclaration ,FunctionExpression ,GeneratorDeclaration ,GeneratorExpression ,MethodDefinition ,ArrowFunction ,ClassDeclaration , orClassExpression .
Function code is generally provided as the bodies of Function Definitions (Function constructor (
10.2.1Strict Mode Code#
An ECMAScript
-
Global code is strict mode code if it begins with a
Directive Prologue that contains aUse Strict Directive . - Module code is always strict mode code.
-
All parts of a
ClassDeclaration or aClassExpression are strict mode code. -
Eval code is strict mode code if it begins with a
Directive Prologue that contains aUse Strict Directive or if the call toevalis adirect eval that is contained in strict mode code. -
Function code is strict mode code if the associated
FunctionDeclaration ,FunctionExpression ,GeneratorDeclaration ,GeneratorExpression ,MethodDefinition , orArrowFunction is contained in strict mode code or if the code that produces the value of the function's [[ECMAScriptCode]] internal slot begins with aDirective Prologue that contains aUse Strict Directive . -
Function code that is supplied as the arguments to the built-in
FunctionandGeneratorconstructors is strict mode code if the last argument is a String that when processed is aFunctionBody that begins with aDirective Prologue that contains aUse Strict Directive .
ECMAScript code that is not strict mode code is called non-strict code.
10.2.2Non-ECMAScript Functions#
An ECMAScript implementation may support the evaluation of exotic function objects whose evaluative behaviour is expressed in some implementation defined form of executable code other than via ECMAScript code. Whether a function object is an ECMAScript code function or a non-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.
11ECMAScript Language: Lexical Grammar#
The source text of an ECMAScript
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
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
a = b
/hi/g.exec(c).map(d);
where the first non-whitespace, non-comment code point after a
a = b / hi / g.exec(c).map(d);
Syntax
11.1Unicode Format-Control Characters#
The Unicode format-control characters (i.e., the characters in category “Cf” in the Unicode Character Database such as LEFT-TO-RIGHT MARK or RIGHT-TO-LEFT MARK) are control codes used to control the formatting of a range of text in the absence of higher-level protocols for this (such as mark-up languages).
It is useful to allow format-control characters in source text to facilitate editing and display. All format control characters may be used within comments, and within string literals, template literals, and regular expression literals.
U+200C (ZERO WIDTH NON-JOINER) and U+200D (ZERO WIDTH JOINER) are format-control characters that are used to make necessary distinctions when forming words or phrases in certain languages. In ECMAScript source text these code points may also be used in an
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
The special treatment of certain format-control characters outside of comments, string literals, and regular expression literals is summarized in
| Code Point | Name | Abbreviation | Usage |
|---|---|---|---|
U+200C
|
ZERO WIDTH NON-JOINER | <ZWNJ> |
|
U+200D
|
ZERO WIDTH JOINER | <ZWJ> |
|
U+FEFF
|
ZERO WIDTH NO-BREAK SPACE | <ZWNBSP> |
|
11.2White Space#
White space code points are used to improve source text readability and to separate tokens (indivisible lexical units) from each other, but are otherwise insignificant. White space code points may occur between any two tokens and at the start or end of input. White space code points may occur within a
The ECMAScript white space code points are listed in
| Code Point | Name | Abbreviation |
|---|---|---|
U+0009
|
CHARACTER TABULATION | <TAB> |
U+000B
|
LINE TABULATION | <VT> |
U+000C
|
FORM FEED (FF) | <FF> |
U+0020
|
SPACE | <SP> |
U+00A0
|
NO-BREAK SPACE | <NBSP> |
U+FEFF
|
ZERO WIDTH NO-BREAK SPACE | <ZWNBSP> |
| Other category “Zs” | Any other Unicode “Separator, space” code point | <USP> |
ECMAScript implementations must recognize as
Other than for the code points listed in
Syntax
11.3Line Terminators#
Like white space code points, line terminator code points are used to improve source text readability and to separate tokens (indivisible lexical units) from each other. However, unlike white space code points, line terminators have some influence over the behaviour of the syntactic grammar. In general, line terminators may occur between any two tokens, but there are a few places where they are forbidden by the syntactic grammar. Line terminators also affect the process of automatic semicolon insertion (
A line terminator can occur within a
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
| Code Point | Unicode Name | Abbreviation |
|---|---|---|
U+000A
|
LINE FEED (LF) | <LF> |
U+000D
|
CARRIAGE RETURN (CR) | <CR> |
U+2028
|
LINE SEPARATOR | <LS> |
U+2029
|
PARAGRAPH SEPARATOR | <PS> |
Only the Unicode code points in
Syntax
11.5Tokens#
Syntax
The
11.6Names and Keywords#
This standard specifies specific code point additions: U+0024 (DOLLAR SIGN) and U+005F (LOW LINE) are permitted anywhere in an
Unicode escape sequences are permitted in an \ preceding the u and { } code units, if they appear, do not contribute code points to the \
Two
Syntax
The definitions of the nonterminal
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”.
11.6.1Identifier Names#
11.6.1.1Static Semantics: Early Errors#
-
It is a Syntax Error if SV(
UnicodeEscapeSequence ) is none of"$", or"_", or theUTF16Encoding of a code point matched by theUnicodeIDStart lexical grammar production.
-
It is a Syntax Error if SV(
UnicodeEscapeSequence ) is none of"$", or"_", or theUTF16Encoding of either <ZWNJ> or <ZWJ>, or theUTF16Encoding of a Unicode code point that would be matched by theUnicodeIDContinue lexical grammar production.
11.6.1.2Static Semantics: StringValue#
- Return the String value consisting of the sequence of code units corresponding to
IdentifierName . In determining the sequence any occurrences of\UnicodeEscapeSequence are first replaced with the code point represented by theUnicodeEscapeSequence and then the code points of the entireIdentifierName are converted to code units byUTF16Encoding each code point.
11.6.2Reserved Words#
A reserved word is an
Syntax
The \
11.6.2.1Keywords#
The following tokens are ECMAScript keywords and may not be used as
Syntax
In some contexts yield is given the semantics of an let and static are treated as reserved keywords through static semantic restrictions (see
11.6.2.2Future Reserved Words#
The following tokens are reserved for used as keywords in future language extensions.
Syntax
await is only treated as a
Use of the following tokens within
implements
|
package
|
protected
|
|
interface
|
private
|
public
|
11.7Punctuators#
Syntax
11.8Literals#
11.8.1Null Literals#
Syntax
11.8.2Boolean Literals#
Syntax
11.8.3Numeric Literals#
Syntax
The
For example: 3in is an error and not the two input elements 3 and in.
A conforming implementation, when processing
11.8.3.1Static Semantics: MV#
A numeric literal stands for a value of the Number type. This value is determined in two steps: first, a mathematical value (MV) is derived from the literal; second, this mathematical value is rounded as described below.
-
The MV of
is the MV ofNumericLiteral :: DecimalLiteral DecimalLiteral . -
The MV of
is the MV ofNumericLiteral :: BinaryIntegerLiteral BinaryIntegerLiteral . -
The MV of
is the MV ofNumericLiteral :: OctalIntegerLiteral OctalIntegerLiteral . -
The MV of
is the MV ofNumericLiteral :: HexIntegerLiteral HexIntegerLiteral . -
The MV of
is the MV ofDecimalLiteral :: DecimalIntegerLiteral . DecimalIntegerLiteral . -
The MV of
is the MV ofDecimalLiteral :: DecimalIntegerLiteral . DecimalDigits DecimalIntegerLiteral plus (the MV ofDecimalDigits × 10-n), where n is the number of code points inDecimalDigits . -
The MV of
is the MV ofDecimalLiteral :: DecimalIntegerLiteral . ExponentPart DecimalIntegerLiteral × 10e, where e is the MV ofExponentPart . -
The MV of
is (the MV ofDecimalLiteral :: DecimalIntegerLiteral . DecimalDigits ExponentPart DecimalIntegerLiteral plus (the MV ofDecimalDigits × 10-n)) × 10e, where n is the number of code points inDecimalDigits and e is the MV ofExponentPart . -
The MV of
is the MV ofDecimalLiteral :: . DecimalDigits DecimalDigits × 10-n, where n is the number of code points inDecimalDigits . -
The MV of
is the MV ofDecimalLiteral :: . DecimalDigits ExponentPart DecimalDigits × 10e-n, where n is the number of code points inDecimalDigits and e is the MV ofExponentPart . -
The MV of
is the MV ofDecimalLiteral :: DecimalIntegerLiteral DecimalIntegerLiteral . -
The MV of
is the MV ofDecimalLiteral :: DecimalIntegerLiteral ExponentPart DecimalIntegerLiteral × 10e, where e is the MV ofExponentPart . -
The MV of
is 0.DecimalIntegerLiteral :: 0 -
The MV of
is the MV ofDecimalIntegerLiteral :: NonZeroDigit NonZeroDigit . -
The MV of
is (the MV ofDecimalIntegerLiteral :: NonZeroDigit DecimalDigits NonZeroDigit × 10n) plus the MV ofDecimalDigits , where n is the number of code points inDecimalDigits . -
The MV of
is the MV ofDecimalDigits :: DecimalDigit DecimalDigit . -
The MV of
is (the MV ofDecimalDigits :: DecimalDigits DecimalDigit DecimalDigits × 10) plus the MV ofDecimalDigit . -
The MV of
is the MV ofExponentPart :: ExponentIndicator SignedInteger SignedInteger . -
The MV of
is the MV ofSignedInteger :: DecimalDigits DecimalDigits . -
The MV of
is the MV ofSignedInteger :: + DecimalDigits DecimalDigits . -
The MV of
is the negative of the MV ofSignedInteger :: - DecimalDigits DecimalDigits . -
The MV of
or ofDecimalDigit :: 0 or ofHexDigit :: 0 or ofOctalDigit :: 0 is 0.BinaryDigit :: 0 -
The MV of
or ofDecimalDigit :: 1 or ofNonZeroDigit :: 1 or ofHexDigit :: 1 or ofOctalDigit :: 1 is 1.BinaryDigit :: 1 -
The MV of
or ofDecimalDigit :: 2 or ofNonZeroDigit :: 2 or ofHexDigit :: 2 is 2.OctalDigit :: 2 -
The MV of
or ofDecimalDigit :: 3 or ofNonZeroDigit :: 3 or ofHexDigit :: 3 is 3.OctalDigit :: 3 -
The MV of
or ofDecimalDigit :: 4 or ofNonZeroDigit :: 4 or ofHexDigit :: 4 is 4.OctalDigit :: 4 -
The MV of
or ofDecimalDigit :: 5 or ofNonZeroDigit :: 5 or ofHexDigit :: 5 is 5.OctalDigit :: 5 -
The MV of
or ofDecimalDigit :: 6 or ofNonZeroDigit :: 6 or ofHexDigit :: 6 is 6.OctalDigit :: 6 -
The MV of
or ofDecimalDigit :: 7 or ofNonZeroDigit :: 7 or ofHexDigit :: 7 is 7.OctalDigit :: 7 -
The MV of
or ofDecimalDigit :: 8 or ofNonZeroDigit :: 8 is 8.HexDigit :: 8 -
The MV of
or ofDecimalDigit :: 9 or ofNonZeroDigit :: 9 is 9.HexDigit :: 9 -
The MV of
or ofHexDigit :: a is 10.HexDigit :: A -
The MV of
or ofHexDigit :: b is 11.HexDigit :: B -
The MV of
or ofHexDigit :: c is 12.HexDigit :: C -
The MV of
or ofHexDigit :: d is 13.HexDigit :: D -
The MV of
or ofHexDigit :: e is 14.HexDigit :: E -
The MV of
or ofHexDigit :: f is 15.HexDigit :: F -
The MV of
is the MV ofBinaryIntegerLiteral :: 0b BinaryDigits BinaryDigits . -
The MV of
is the MV ofBinaryIntegerLiteral :: 0B BinaryDigits BinaryDigits . -
The MV of
is the MV ofBinaryDigits :: BinaryDigit BinaryDigit . -
The MV of
is (the MV ofBinaryDigits :: BinaryDigits BinaryDigit BinaryDigits × 2) plus the MV ofBinaryDigit . -
The MV of
is the MV ofOctalIntegerLiteral :: 0o OctalDigits OctalDigits . -
The MV of
is the MV ofOctalIntegerLiteral :: 0O OctalDigits OctalDigits . -
The MV of
is the MV ofOctalDigits :: OctalDigit OctalDigit . -
The MV of
is (the MV ofOctalDigits :: OctalDigits OctalDigit OctalDigits × 8) plus the MV ofOctalDigit . -
The MV of
is the MV ofHexIntegerLiteral :: 0x HexDigits HexDigits . -
The MV of
is the MV ofHexIntegerLiteral :: 0X HexDigits HexDigits . -
The MV of
is the MV ofHexDigits :: HexDigit HexDigit . -
The MV of
is (the MV ofHexDigits :: HexDigits HexDigit HexDigits × 16) plus the MV ofHexDigit .
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 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
-
it is not
0; or -
there is a nonzero digit to its left and there is a nonzero digit, not in the
ExponentPart , to its right.
11.8.4String Literals#
A string literal is zero 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), U+2028 (LINE SEPARATOR), U+2029 (PARAGRAPH SEPARATOR), 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
Syntax
A conforming implementation, when processing
The definition of the nonterminal
A line terminator code point cannot appear in a string literal, except as part of a \n or \u000A.
11.8.4.1Static Semantics: Early Errors#
-
It is a Syntax Error if the MV of
HexDigits > 1114111.
11.8.4.2Static Semantics: StringValue#
- Return the String value whose elements are the SV of this
StringLiteral .
11.8.4.3Static Semantics: SV#
A string literal stands for a value of the String type. The String value (SV) of the literal is described in terms of code unit values contributed by the various parts of the string literal. As part of this process, some Unicode code points within the string literal are interpreted as having a mathematical value (MV), as described below or in
-
The SV of
is the empty code unit sequence.StringLiteral :: " " -
The SV of
is the empty code unit sequence.StringLiteral :: ' ' -
The SV of
is the SV ofStringLiteral :: " DoubleStringCharacters " DoubleStringCharacters . -
The SV of
is the SV ofStringLiteral :: ' SingleStringCharacters ' SingleStringCharacters . -
The SV of
is a sequence of one or two code units that is the SV ofDoubleStringCharacters :: DoubleStringCharacter DoubleStringCharacter . -
The SV of
is a sequence of one or two code units that is the SV ofDoubleStringCharacters :: DoubleStringCharacter DoubleStringCharacters DoubleStringCharacter followed by all the code units in the SV ofDoubleStringCharacters in order. -
The SV of
is a sequence of one or two code units that is the SV ofSingleStringCharacters :: SingleStringCharacter SingleStringCharacter . -
The SV of
is a sequence of one or two code units that is the SV ofSingleStringCharacters :: SingleStringCharacter SingleStringCharacters SingleStringCharacter followed by all the code units in the SV ofSingleStringCharacters in order. -
The SV of
is theDoubleStringCharacter :: SourceCharacter but not one of " or\ orLineTerminator UTF16Encoding of the code point value ofSourceCharacter . -
The SV of
is the SV of theDoubleStringCharacter :: \ EscapeSequence EscapeSequence . -
The SV of
is the empty code unit sequence.DoubleStringCharacter :: LineContinuation -
The SV of
is theSingleStringCharacter :: SourceCharacter but not one of ' or\ orLineTerminator UTF16Encoding of the code point value ofSourceCharacter . -
The SV of
is the SV of theSingleStringCharacter :: \ EscapeSequence EscapeSequence . -
The SV of
is the empty code unit sequence.SingleStringCharacter :: LineContinuation -
The SV of
is the SV of theEscapeSequence :: CharacterEscapeSequence CharacterEscapeSequence . -
The SV of
is the code unit value 0.EscapeSequence :: 0 -
The SV of
is the SV of theEscapeSequence :: HexEscapeSequence HexEscapeSequence . -
The SV of
is the SV of theEscapeSequence :: UnicodeEscapeSequence UnicodeEscapeSequence . -
The SV of
is the code unit whose value is determined by theCharacterEscapeSequence :: SingleEscapeCharacter SingleEscapeCharacter according toTable 34 .
| Escape Sequence | Code Unit Value | Unicode Character Name | Symbol |
|---|---|---|---|
\b
|
0x0008
|
BACKSPACE | <BS> |
\t
|
0x0009
|
CHARACTER TABULATION | <HT> |
\n
|
0x000A
|
LINE FEED (LF) | <LF> |
\v
|
0x000B
|
LINE TABULATION | <VT> |
\f
|
0x000C
|
FORM FEED (FF) | <FF> |
\r
|
0x000D
|
CARRIAGE RETURN (CR) | <CR> |
\"
|
0x0022
|
QUOTATION MARK |
"
|
\'
|
0x0027
|
APOSTROPHE |
'
|
\\
|
0x005C
|
REVERSE SOLIDUS |
\
|
-
The SV of
is the SV of theCharacterEscapeSequence :: NonEscapeCharacter NonEscapeCharacter . -
The SV of
is theNonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter orLineTerminator UTF16Encoding of the code point value ofSourceCharacter . -
The SV of
is the code unit value that is (16 times the MV of the firstHexEscapeSequence :: x HexDigit HexDigit HexDigit ) plus the MV of the secondHexDigit . -
The SV of
is the SV ofUnicodeEscapeSequence :: u Hex4Digits Hex4Digits . -
The SV of
is the code unit value that is (4096 times the MV of the firstHex4Digits :: HexDigit HexDigit HexDigit HexDigit HexDigit ) plus (256 times the MV of the secondHexDigit ) plus (16 times the MV of the thirdHexDigit ) plus the MV of the fourthHexDigit . -
The SV of
is theUnicodeEscapeSequence :: u{ HexDigits } UTF16Encoding of the MV ofHexDigits .
11.8.5Regular Expression Literals#
A regular expression literal is an input element that is converted to a RegExp object (see === 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
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
An implementation may extend the ECMAScript Regular Expression grammar defined in
Syntax
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: /(?:)/.
11.8.5.1Static Semantics: Early Errors#
-
It is a Syntax Error if
IdentifierPart contains a Unicode escape sequence.
11.8.5.2Static Semantics: BodyText#
- Return the source text that was recognized as
RegularExpressionBody .
11.8.5.3Static Semantics: FlagText#
- Return the source text that was recognized as
RegularExpressionFlags .
11.8.6Template Literal Lexical Components#
Syntax
A conforming implementation must not use the extended definition of
11.8.6.1Static Semantics: TV and TRV#
A template literal component is interpreted as a sequence of Unicode code points. The Template Value (TV) of a literal component is described in terms of code unit values (SV,
-
The TV and TRV of
is the empty code unit sequence.NoSubstitutionTemplate :: ` ` -
The TV and TRV of
is the empty code unit sequence.TemplateHead :: ` ${ -
The TV and TRV of
is the empty code unit sequence.TemplateMiddle :: } ${ -
The TV and TRV of
is the empty code unit sequence.TemplateTail :: } ` -
The TV of
is the TV ofNoSubstitutionTemplate :: ` TemplateCharacters ` TemplateCharacters . -
The TV of
is the TV ofTemplateHead :: ` TemplateCharacters ${ TemplateCharacters . -
The TV of
is the TV ofTemplateMiddle :: } TemplateCharacters ${ TemplateCharacters . -
The TV of
is the TV ofTemplateTail :: } TemplateCharacters ` TemplateCharacters . -
The TV of
is the TV ofTemplateCharacters :: TemplateCharacter TemplateCharacter . -
The TV of
is a sequence consisting of the code units in the TV ofTemplateCharacters :: TemplateCharacter TemplateCharacters TemplateCharacter followed by all the code units in the TV ofTemplateCharacters in order. -
The TV of
is theTemplateCharacter :: SourceCharacter but not one of ` or\ or$ orLineTerminator UTF16Encoding of the code point value ofSourceCharacter . -
The TV of
is the code unit value 0x0024.TemplateCharacter :: $ -
The TV of
is the SV ofTemplateCharacter :: \ EscapeSequence EscapeSequence . -
The TV of
is the TV ofTemplateCharacter :: LineContinuation LineContinuation . -
The TV of
is the TRV ofTemplateCharacter :: LineTerminatorSequence LineTerminatorSequence . -
The TV of
is the empty code unit sequence.LineContinuation :: \ LineTerminatorSequence -
The TRV of
is the TRV ofNoSubstitutionTemplate :: ` TemplateCharacters ` TemplateCharacters . -
The TRV of
is the TRV ofTemplateHead :: ` TemplateCharacters ${ TemplateCharacters . -
The TRV of
is the TRV ofTemplateMiddle :: } TemplateCharacters ${ TemplateCharacters . -
The TRV of
is the TRV ofTemplateTail :: } TemplateCharacters ` TemplateCharacters . -
The TRV of
is the TRV ofTemplateCharacters :: TemplateCharacter TemplateCharacter . -
The TRV of
is a sequence consisting of the code units in the TRV ofTemplateCharacters :: TemplateCharacter TemplateCharacters TemplateCharacter followed by all the code units in the TRV ofTemplateCharacters , in order. -
The TRV of
is theTemplateCharacter :: SourceCharacter but not one of ` or\ or$ orLineTerminator UTF16Encoding of the code point value ofSourceCharacter . -
The TRV of
is the code unit value 0x0024.TemplateCharacter :: $ -
The TRV of
is the sequence consisting of the code unit value 0x005C followed by the code units of TRV ofTemplateCharacter :: \ EscapeSequence EscapeSequence . -
The TRV of
is the TRV ofTemplateCharacter :: LineContinuation LineContinuation . -
The TRV of
is the TRV ofTemplateCharacter :: LineTerminatorSequence LineTerminatorSequence . -
The TRV of
is the TRV of theEscapeSequence :: CharacterEscapeSequence CharacterEscapeSequence . -
The TRV of
is the code unit value 0x0030 (DIGIT ZERO).EscapeSequence :: 0 -
The TRV of
is the TRV of theEscapeSequence :: HexEscapeSequence HexEscapeSequence . -
The TRV of
is the TRV of theEscapeSequence :: UnicodeEscapeSequence UnicodeEscapeSequence . -
The TRV of
is the TRV of theCharacterEscapeSequence :: SingleEscapeCharacter SingleEscapeCharacter . -
The TRV of
is the SV of theCharacterEscapeSequence :: NonEscapeCharacter NonEscapeCharacter . -
The TRV of
is the SV of theSingleEscapeCharacter :: one of ' " \ b f n r t v SourceCharacter that is that single code point. -
The TRV of
is the sequence consisting of code unit value 0x0078 followed by TRV of the firstHexEscapeSequence :: x HexDigit HexDigit HexDigit followed by the TRV of the secondHexDigit . -
The TRV of
is the sequence consisting of code unit value 0x0075 followed by TRV ofUnicodeEscapeSequence :: u Hex4Digits Hex4Digits . -
The TRV of
is the sequence consisting of code unit value 0x0075 followed by code unit value 0x007B followed by TRV ofUnicodeEscapeSequence :: u{ HexDigits } HexDigits followed by code unit value 0x007D. -
The TRV of
is the sequence consisting of the TRV of the firstHex4Digits :: HexDigit HexDigit HexDigit HexDigit HexDigit followed by the TRV of the secondHexDigit followed by the TRV of the thirdHexDigit followed by the TRV of the fourthHexDigit . -
The TRV of
is the TRV ofHexDigits :: HexDigit HexDigit . -
The TRV of
is the sequence consisting of TRV ofHexDigits :: HexDigits HexDigit HexDigits followed by TRV ofHexDigit . -
The TRV of a
HexDigit is the SV of theSourceCharacter that is thatHexDigit . -
The TRV of
is the sequence consisting of the code unit value 0x005C followed by the code units of TRV ofLineContinuation :: \ LineTerminatorSequence LineTerminatorSequence . -
The TRV of
is the code unit value 0x000A.LineTerminatorSequence :: <LF> -
The TRV of
is the code unit value 0x000A.LineTerminatorSequence :: <CR> -
The TRV of
is the code unit value 0x2028.LineTerminatorSequence :: <LS> -
The TRV of
is the code unit value 0x2029.LineTerminatorSequence :: <PS> -
The TRV of
is the sequence consisting of the code unit value 0x000A.LineTerminatorSequence :: <CR> <LF>
TV excludes the code units of
11.9Automatic Semicolon Insertion#
Most ECMAScript statements and declarations must be terminated with a semicolon. Such semicolons may always appear explicitly in the source text. For convenience, however, such semicolons may be omitted from the source text in certain situations. These situations are described by saying that semicolons are automatically inserted into the source code token stream in those situations.
11.9.1Rules of Automatic Semicolon Insertion#
In the following rules, “token” means the actual recognized lexical token determined using the current lexical goal symbol as described in clause
There are three basic rules of semicolon insertion:
-
When, as a
Script orModule is parsed from left to right, a token (called the offending token) is encountered that is not allowed by any production of the grammar, then a semicolon is automatically inserted before the offending token if one or more of the following conditions is true:-
The offending token is separated from the previous token by at least one
LineTerminator . -
The offending token is
}. -
The previous token is
)and the inserted semicolon would then be parsed as the terminating semicolon of a do-while statement (13.7.2 ).
-
The offending token is separated from the previous token by at least one
-
When, as the
Script orModule 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 complete ECMAScriptScript orModule , then a semicolon is automatically inserted at the end of the input stream. -
When, as the
Script orModule 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 “[noLineTerminator 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 oneLineTerminator , 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
The following are the only restricted productions in the grammar:
The practical effect of these restricted productions is as follows:
-
When a
++or--token is encountered where the parser would treat it as a postfix operator, and at least oneLineTerminator occurred between the preceding token and the++or--token, then a semicolon is automatically inserted before the++or--token. -
When a
continue,break,return,throw, oryieldtoken is encountered and aLineTerminator is encountered before the next token, a semicolon is automatically inserted after thecontinue,break,return,throw, oryieldtoken.
The resulting practical advice to ECMAScript programmers is:
-
A postfix
++or--operator should appear on the same line as its operand. -
An
Expression in areturnorthrowstatement or anAssignmentExpression in ayieldexpression should start on the same line as thereturn,throw, oryieldtoken. -
A
LabelIdentifier in abreakorcontinuestatement should be on the same line as thebreakorcontinuetoken.
11.9.2Examples of Automatic Semicolon Insertion#
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;
which is a valid ECMAScript sentence.
The source
for (a; b
)
is not a valid ECMAScript sentence and is not altered by automatic semicolon insertion because the semicolon is needed for the header of a for statement. Automatic semicolon insertion never inserts one of the two semicolons in the header of a for statement.
The source
return
a + b
is transformed by automatic semicolon insertion into the following:
return;
a + b;
The expression a + b is not treated as a value to be returned by the return statement, because a return.
The source
a = b
++c
is transformed by automatic semicolon insertion into the following:
a = b;
++c;
The token ++ is not treated as a postfix operator applying to the variable b, because a b and ++.
The source
if (a > b)
else c = d
is not a valid ECMAScript sentence and is not altered by automatic semicolon insertion before the else token, even though no production of the grammar applies at that point, because an automatically inserted semicolon would then be parsed as an empty statement.
The source
a = b + c
(d + e).print()
is not transformed by automatic semicolon insertion, because the parenthesized expression that begins the second line can be interpreted as an argument list for a function call:
a = b + c(d + e).print()
In the circumstance that an assignment statement must begin with a left parenthesis, it is a good idea for the programmer to provide an explicit semicolon at the end of the preceding statement rather than to rely on automatic semicolon insertion.
12ECMAScript Language: Expressions#
12.1Identifiers#
Syntax
12.1.1Static Semantics: Early Errors#
-
It is a Syntax Error if the code matched by this production is contained in
strict mode code and the StringValue ofIdentifier is"arguments"or"eval".
-
It is a Syntax Error if the code matched by this production is contained in
strict mode code .
-
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 phrase is contained in
strict mode code and the StringValue ofIdentifierName is:"implements","interface","let","package","private","protected","public","static", or"yield". -
It is a Syntax Error if StringValue of
IdentifierName is the same String value as the StringValue of anyReservedWord except foryield.
StringValue of
12.1.2Static Semantics: BoundNames#
- Return a new
List containing the StringValue ofIdentifier .
- Return a new
List containing"yield".
12.1.3Static Semantics: IsValidSimpleAssignmentTarget#
- If this
IdentifierReference is contained instrict mode code and StringValue ofIdentifier is"eval"or"arguments", returnfalse . - Return
true .
- Return
true .
12.1.4Static Semantics: StringValue#
- Return
"yield".
- Return the StringValue of
IdentifierName .
12.1.5Runtime Semantics: BindingInitialization#
With arguments value and environment.
var statements and formal parameter lists of some non-strict functions (See
- Let name be StringValue of
Identifier . - Return ?
InitializeBoundName (name, value, environment).
- Return ?
InitializeBoundName ("yield", value, environment).
12.1.5.1Runtime Semantics: InitializeBoundName(name, value, environment)#
- Assert:
Type (name) is String. - If environment is not
undefined , then- Let env be the
EnvironmentRecord component of environment. - Perform env.InitializeBinding(name, value).
- Return
NormalCompletion (undefined ).
- Let env be the
- Else,
- Let lhs be
ResolveBinding (name). - Return ?
PutValue (lhs, value).
- Let lhs be
12.1.6Runtime Semantics: Evaluation#
- Return ?
ResolveBinding (StringValue ofIdentifier ).
- Return ?
ResolveBinding ("yield").
The result of evaluating an
In non-strict code, the keyword yield may be used as an identifier. Evaluating the yield as if it was an yield in binding creation contexts.
12.2Primary Expression#
Syntax
Supplemental Syntax
When processing the production
the interpretation of
12.2.1Semantics#
12.2.1.1Static Semantics: CoveredParenthesizedExpression#
- Return the result of parsing the lexical token stream matched by
CoverParenthesizedExpressionAndArrowParameterList using either[Yield] ParenthesizedExpression orParenthesizedExpression as the goal symbol depending upon whether the [Yield] grammar parameter was present when[Yield] CoverParenthesizedExpressionAndArrowParameterList was matched.
12.2.1.2Static Semantics: HasName#
- Let expr be CoveredParenthesizedExpression of
CoverParenthesizedExpressionAndArrowParameterList . - If IsFunctionDefinition of expr is
false , returnfalse . - Return HasName of expr.
12.2.1.3Static Semantics: IsFunctionDefinition#
- Return
false .
- Let expr be CoveredParenthesizedExpression of
CoverParenthesizedExpressionAndArrowParameterList . - Return IsFunctionDefinition of expr.
12.2.1.4Static Semantics: IsIdentifierRef#
- Return
true .
- Return
false .
12.2.1.5Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
- Let expr be CoveredParenthesizedExpression of
CoverParenthesizedExpressionAndArrowParameterList . - Return IsValidSimpleAssignmentTarget of expr.
12.2.2The this Keyword#
12.2.2.1Runtime Semantics: Evaluation#
- Return ?
ResolveThisBinding ( ).
12.2.3Identifier Reference#
See
12.2.4Literals#
Syntax
12.2.4.1Runtime Semantics: Evaluation#
- Return
null .
- Return
false ifBooleanLiteral is the tokenfalse. - Return
true ifBooleanLiteral is the tokentrue.
- Return the number whose value is MV of
NumericLiteral as defined in11.8.3 .
- Return the StringValue of
StringLiteral as defined in11.8.4.2 .
12.2.5Array Initializer#
An
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
Syntax
12.2.5.1Static Semantics: ElisionWidth#
- Return the numeric value 1.
- Let preceding be the ElisionWidth of
Elision . - Return preceding+1.
12.2.5.2Runtime Semantics: ArrayAccumulation#
With parameters array and nextIndex.
- Let padding be the ElisionWidth of
Elision ; ifElision is not present, use the numeric value zero. - Let initResult be the result of evaluating
AssignmentExpression . - Let initValue be ?
GetValue (initResult). - Let created be
CreateDataProperty (array,ToString (ToUint32 (nextIndex+padding)), initValue). - Assert: created is
true . - Return nextIndex+padding+1.
- Let padding be the ElisionWidth of
Elision ; ifElision is not present, use the numeric value zero. - Return the result of performing ArrayAccumulation for
SpreadElement with arguments array and nextIndex+padding.
- Let postIndex be the result of performing ArrayAccumulation for
ElementList with arguments array and nextIndex. ReturnIfAbrupt (postIndex).- Let padding be the ElisionWidth of
Elision ; ifElision is not present, use the numeric value zero. - Let initResult be the result of evaluating
AssignmentExpression . - Let initValue be ?
GetValue (initResult). - Let created be
CreateDataProperty (array,ToString (ToUint32 (postIndex+padding)), initValue). - Assert: created is
true . - Return postIndex+padding+1.
- Let postIndex be the result of performing ArrayAccumulation for
ElementList with arguments array and nextIndex. ReturnIfAbrupt (postIndex).- Let padding be the ElisionWidth of
Elision ; ifElision is not present, use the numeric value zero. - Return the result of performing ArrayAccumulation for
SpreadElement with arguments array and postIndex+padding.
- Let spreadRef be the result of evaluating
AssignmentExpression . - Let spreadObj be ?
GetValue (spreadRef). - Let iterator be ?
GetIterator (spreadObj). - Repeat
- Let next be ?
IteratorStep (iterator). - If next is
false , return nextIndex. - Let nextValue be ?
IteratorValue (next). - Let status be
CreateDataProperty (array,ToString (ToUint32 (nextIndex)), nextValue). - Assert: status is
true . - Let nextIndex be nextIndex + 1.
- Let next be ?
12.2.5.3Runtime Semantics: Evaluation#
- Let array be
ArrayCreate (0). - Let pad be the ElisionWidth of
Elision ; ifElision is not present, use the numeric value zero. - Perform
Set (array,"length",ToUint32 (pad),false ). - NOTE: The above Set cannot fail because of the nature of the object returned by
ArrayCreate . - Return array.
- Let array be
ArrayCreate (0). - Let len be the result of performing ArrayAccumulation for
ElementList with arguments array and 0. ReturnIfAbrupt (len).- Perform
Set (array,"length",ToUint32 (len),false ). - NOTE: The above Set cannot fail because of the nature of the object returned by
ArrayCreate . - Return array.
- Let array be
ArrayCreate (0). - Let len be the result of performing ArrayAccumulation for
ElementList with arguments array and 0. ReturnIfAbrupt (len).- Let padding be the ElisionWidth of
Elision ; ifElision is not present, use the numeric value zero. - Perform
Set (array,"length",ToUint32 (padding+len),false ). - NOTE: The above Set cannot fail because of the nature of the object returned by
ArrayCreate . - Return array.
12.2.6Object Initializer#
An object initializer is an expression describing the initialization of an Object, written in a form resembling a literal. It is a list of zero or more pairs of property keys and associated values, enclosed in curly brackets. The values need not be literals; they are evaluated each time the object initializer is evaluated.
Syntax
In certain contexts,
12.2.6.1Static Semantics: Early Errors#
-
It is a Syntax Error if HasDirectSuper of
MethodDefinition istrue .
In addition to describing an actual object initializer the
- Always throw a Syntax Error if code matches this production.
This production exists so that
12.2.6.2Static Semantics: ComputedPropertyContains#
With parameter symbol.
- Return
false .
- Return the result of
ComputedPropertyName Contains symbol.
12.2.6.3Static Semantics: Contains#
With parameter symbol.
- If symbol is
MethodDefinition , returntrue . - Return the result of ComputedPropertyContains for
MethodDefinition with argument symbol.
Static semantic rules that depend upon substructure generally do not look into function definitions.
- If symbol is a
ReservedWord , returnfalse . - If symbol is an
Identifier and StringValue of symbol is the same value as the StringValue ofIdentifierName , returntrue . - Return
false .
12.2.6.4Static Semantics: HasComputedPropertyKey#
- If HasComputedPropertyKey of
PropertyDefinitionList istrue , returntrue . - Return HasComputedPropertyKey of
PropertyDefinition .
- Return
false .
- Return IsComputedPropertyKey of
PropertyName .
12.2.6.5Static Semantics: IsComputedPropertyKey#
- Return
false .
- Return
true .
12.2.6.6Static Semantics: PropName#
- Return StringValue of
IdentifierReference .
- Return PropName of
PropertyName .
- Return StringValue of
IdentifierName .
- Return a String value whose code units are the SV of the
StringLiteral .
- Let nbr be the result of forming the value of the
NumericLiteral . - Return !
ToString (nbr).
- Return
empty .
12.2.6.7Static Semantics: PropertyNameList#
- If PropName of
PropertyDefinition isempty , return a new emptyList . - Return a new
List containing PropName ofPropertyDefinition .
- Let list be PropertyNameList of
PropertyDefinitionList . - If PropName of
PropertyDefinition isempty , return list. - Append PropName of
PropertyDefinition to the end of list. - Return list.
12.2.6.8Runtime Semantics: Evaluation#
- Return
ObjectCreate (%ObjectPrototype% ).
- Let obj be
ObjectCreate (%ObjectPrototype% ). - Let status be the result of performing PropertyDefinitionEvaluation of
PropertyDefinitionList with arguments obj andtrue . ReturnIfAbrupt (status).- Return obj.
- Return StringValue of
IdentifierName .
- Return a String value whose code units are the SV of the
StringLiteral .
- Let nbr be the result of forming the value of the
NumericLiteral . - Return !
ToString (nbr).
- Let exprValue be the result of evaluating
AssignmentExpression . - Let propName be ?
GetValue (exprValue). - Return ?
ToPropertyKey (propName).
12.2.6.9Runtime Semantics: PropertyDefinitionEvaluation#
With parameters object and enumerable.
- Let status be the result of performing PropertyDefinitionEvaluation of
PropertyDefinitionList with arguments object and enumerable. ReturnIfAbrupt (status).- Return the result of performing PropertyDefinitionEvaluation of
PropertyDefinition with arguments object and enumerable.
- Let propName be StringValue of
IdentifierReference . - Let exprValue be the result of evaluating
IdentifierReference . - Let propValue be ?
GetValue (exprValue). - Assert: enumerable is
true . - Return
CreateDataPropertyOrThrow (object, propName, propValue).
- Let propKey be the result of evaluating
PropertyName . ReturnIfAbrupt (propKey).- Let exprValueRef be the result of evaluating
AssignmentExpression . - Let propValue be ?
GetValue (exprValueRef). - If
IsAnonymousFunctionDefinition (AssignmentExpression ) istrue , then- Let hasNameProperty be ?
HasOwnProperty (propValue,"name"). - If hasNameProperty is
false , performSetFunctionName (propValue, propKey).
- Let hasNameProperty be ?
- Assert: enumerable is
true . - Return
CreateDataPropertyOrThrow (object, propKey, propValue).
An alternative semantics for this production is given in
12.2.7Function Defining Expressions#
See
See
See
12.2.8Regular Expression Literals#
Syntax
See
12.2.8.1Static Semantics: Early Errors#
-
It is a Syntax Error if BodyText of
RegularExpressionLiteral cannot be recognized using the goal symbolPattern of the ECMAScript RegExp grammar specified in21.2.1 . -
It is a Syntax Error if FlagText of
RegularExpressionLiteral contains any code points other than"g","i","m","u", or"y", or if it contains the same code point more than once.
12.2.8.2Runtime Semantics: Evaluation#
- Let pattern be the String value consisting of the
UTF16Encoding of each code point of BodyText ofRegularExpressionLiteral . - Let flags be the String value consisting of the
UTF16Encoding of each code point of FlagText ofRegularExpressionLiteral . - Return
RegExpCreate (pattern, flags).
12.2.9Template Literals#
Syntax
12.2.9.1Static Semantics: TemplateStrings#
With parameter raw.
- If raw is
false , then- Let string be the TV of
NoSubstitutionTemplate .
- Let string be the TV of
- Else,
- Let string be the TRV of
NoSubstitutionTemplate .
- Let string be the TRV of
- Return a
List containing the single element, string.
- If raw is
false , then- Let head be the TV of
TemplateHead .
- Let head be the TV of
- Else,
- Let head be the TRV of
TemplateHead .
- Let head be the TRV of
- Let tail be TemplateStrings of
TemplateSpans with argument raw. - Return a
List containing head followed by the elements, in order, of tail.
- If raw is
false , then- Let tail be the TV of
TemplateTail .
- Let tail be the TV of
- Else,
- Let tail be the TRV of
TemplateTail .
- Let tail be the TRV of
- Return a
List containing the single element, tail.
- Let middle be TemplateStrings of
TemplateMiddleList with argument raw. - If raw is
false , then- Let tail be the TV of
TemplateTail .
- Let tail be the TV of
- Else,
- Let tail be the TRV of
TemplateTail .
- Let tail be the TRV of
- Return a
List containing the elements, in order, of middle followed by tail.
- If raw is
false , then- Let string be the TV of
TemplateMiddle .
- Let string be the TV of
- Else,
- Let string be the TRV of
TemplateMiddle .
- Let string be the TRV of
- Return a
List containing the single element, string.
- Let front be TemplateStrings of
TemplateMiddleList with argument raw. - If raw is
false , then- Let last be the TV of
TemplateMiddle .
- Let last be the TV of
- Else,
- Let last be the TRV of
TemplateMiddle .
- Let last be the TRV of
- Append last as the last element of the
List front. - Return front.
12.2.9.2Runtime Semantics: ArgumentListEvaluation#
- Let templateLiteral be this
TemplateLiteral . - Let siteObj be
GetTemplateObject (templateLiteral). - Return a
List containing the one element which is siteObj.
- Let templateLiteral be this
TemplateLiteral . - Let siteObj be
GetTemplateObject (templateLiteral). - Let firstSub be the result of evaluating
Expression . ReturnIfAbrupt (firstSub).- Let restSub be SubstitutionEvaluation of
TemplateSpans . ReturnIfAbrupt (restSub).- Assert: restSub is a
List . - Return a
List whose first element is siteObj, whose second elements is firstSub, and whose subsequent elements are the elements of restSub, in order. restSub may contain no elements.
12.2.9.3Runtime Semantics: GetTemplateObject ( templateLiteral )#
The abstract operation GetTemplateObject is called with a grammar production, templateLiteral, as an argument. It performs the following steps:
- Let rawStrings be TemplateStrings of templateLiteral with argument
true . - Let
realm bethe current Realm Record . - Let templateRegistry be
realm .[[TemplateMap]]. - For each element e of templateRegistry, do
- If e.[[Strings]] and rawStrings contain the same values in the same order, then
- Return e.[[Array]].
- If e.[[Strings]] and rawStrings contain the same values in the same order, then
- Let cookedStrings be TemplateStrings of templateLiteral with argument
false . - Let count be the number of elements in the
List cookedStrings. - Let template be
ArrayCreate (count). - Let rawObj be
ArrayCreate (count). - Let index be 0.
- Repeat while index < count
- Let prop be !
ToString (index). - Let cookedValue be the String value cookedStrings[index].
- Call template.[[DefineOwnProperty]](prop, PropertyDescriptor{[[Value]]: cookedValue, [[Writable]]:
false , [[Enumerable]]:true , [[Configurable]]:false }). - Let rawValue be the String value rawStrings[index].
- Call rawObj.[[DefineOwnProperty]](prop, PropertyDescriptor{[[Value]]: rawValue, [[Writable]]:
false , [[Enumerable]]:true , [[Configurable]]:false }). - Let index be index+1.
- Let prop be !
- Perform
SetIntegrityLevel (rawObj,"frozen"). - Call template.[[DefineOwnProperty]](
"raw", PropertyDescriptor{[[Value]]: rawObj, [[Writable]]:false , [[Enumerable]]:false , [[Configurable]]:false }). - Perform
SetIntegrityLevel (template,"frozen"). - Append the
Record {[[Strings]]: rawStrings, [[Array]]: template} to templateRegistry. - Return template.
The creation of a template object cannot result in an
Each
Future editions of this specification may define additional non-enumerable properties of template objects.
12.2.9.4Runtime Semantics: SubstitutionEvaluation#
- Return a new empty
List .
- Return the result of SubstitutionEvaluation of
TemplateMiddleList .
- Let sub be the result of evaluating
Expression . ReturnIfAbrupt (sub).- Return a
List containing only sub.
- Let preceding be the result of SubstitutionEvaluation of
TemplateMiddleList . ReturnIfAbrupt (preceding).- Let next be the result of evaluating
Expression . ReturnIfAbrupt (next).- Append next as the last element of the
List preceding. - Return preceding.
12.2.9.5Runtime Semantics: Evaluation#
- Return the String value whose code units are the elements of the TV of
NoSubstitutionTemplate as defined in11.8.6 .
- Let head be the TV of
TemplateHead as defined in11.8.6 . - Let sub be the result of evaluating
Expression . ReturnIfAbrupt (sub).- Let middle be ?
ToString (sub). - Let tail be the result of evaluating
TemplateSpans . ReturnIfAbrupt (tail).- Return the String value whose code units are the elements of head followed by the elements of middle followed by the elements of tail.
The string conversion semantics applied to the String.prototype.concat rather than the + operator.
- Let tail be the TV of
TemplateTail as defined in11.8.6 . - Return the string consisting of the code units of tail.
- Let head be the result of evaluating
TemplateMiddleList . ReturnIfAbrupt (head).- Let tail be the TV of
TemplateTail as defined in11.8.6 . - Return the string whose code units are the elements of head followed by the elements of tail.
- Let head be the TV of
TemplateMiddle as defined in11.8.6 . - Let sub be the result of evaluating
Expression . ReturnIfAbrupt (sub).- Let middle be ?
ToString (sub). - Return the sequence of code units consisting of the code units of head followed by the elements of middle.
The string conversion semantics applied to the String.prototype.concat rather than the + operator.
- Let rest be the result of evaluating
TemplateMiddleList . ReturnIfAbrupt (rest).- Let middle be the TV of
TemplateMiddle as defined in11.8.6 . - Let sub be the result of evaluating
Expression . ReturnIfAbrupt (sub).- Let last be ?
ToString (sub). - Return the sequence of code units consisting of the elements of rest followed by the code units of middle followed by the elements of last.
The string conversion semantics applied to the String.prototype.concat rather than the + operator.
12.2.10The Grouping Operator#
12.2.10.1Static Semantics: Early Errors#
-
It is a Syntax Error if the lexical token sequence matched by
CoverParenthesizedExpressionAndArrowParameterList cannot be parsed with no tokens left over usingParenthesizedExpression as the goal symbol. -
All Early Errors rules for
ParenthesizedExpression and its derived productions also apply to CoveredParenthesizedExpression ofCoverParenthesizedExpressionAndArrowParameterList .
12.2.10.2Static Semantics: IsFunctionDefinition#
- Return IsFunctionDefinition of
Expression .
12.2.10.3Static Semantics: IsValidSimpleAssignmentTarget#
- Return IsValidSimpleAssignmentTarget of
Expression .
12.2.10.4Runtime Semantics: Evaluation#
- Let expr be CoveredParenthesizedExpression of
CoverParenthesizedExpressionAndArrowParameterList . - Return the result of evaluating expr.
- Return the result of evaluating
Expression . This may be of typeReference .
This algorithm does not apply delete and typeof may be applied to parenthesized expressions.
12.3Left-Hand-Side Expressions#
Syntax
12.3.1Static Semantics#
12.3.1.1Static Semantics: Contains#
With parameter symbol.
- If
MemberExpression Contains symbol istrue , returntrue . - If symbol is a
ReservedWord , returnfalse . - If symbol is an
Identifier and StringValue of symbol is the same value as the StringValue ofIdentifierName , returntrue . - Return
false .
- If symbol is the
ReservedWord super, returntrue . - If symbol is a
ReservedWord , returnfalse . - If symbol is an
Identifier and StringValue of symbol is the same value as the StringValue ofIdentifierName , returntrue . - Return
false .
- If
CallExpression Contains symbol istrue , returntrue . - If symbol is a
ReservedWord , returnfalse . - If symbol is an
Identifier and StringValue of symbol is the same value as the StringValue ofIdentifierName , returntrue . - Return
false .
12.3.1.2Static Semantics: IsFunctionDefinition#
- Return
false .
12.3.1.3Static Semantics: IsDestructuring#
- If
PrimaryExpression is either anObjectLiteral or anArrayLiteral , returntrue . - Return
false .
- Return
false .
12.3.1.4Static Semantics: IsIdentifierRef#
- Return
false .
12.3.1.5Static Semantics: IsValidSimpleAssignmentTarget#
- Return
true .
- Return
false .
12.3.2Property Accessors#
Properties are accessed by name, using either the dot notation:
or the bracket notation:
The dot notation is explained by the following syntactic conversion:
is identical in its behaviour to
[ <identifier-name-string> ]
and similarly
is identical in its behaviour to
[ <identifier-name-string> ]
where <identifier-name-string> is the result of evaluating StringValue of
12.3.2.1Runtime Semantics: Evaluation#
- Let baseReference be the result of evaluating
MemberExpression . - Let baseValue be ?
GetValue (baseReference). - Let propertyNameReference be the result of evaluating
Expression . - Let propertyNameValue be ?
GetValue (propertyNameReference). - Let bv be ?
RequireObjectCoercible (baseValue). - Let propertyKey be ?
ToPropertyKey (propertyNameValue). - If the code matched by the syntactic production that is being evaluated is
strict mode code , let strict betrue , else let strict befalse . - Return a value of type
Reference whose base value is bv, whose referenced name is propertyKey, and whose strict reference flag is strict.
- Let baseReference be the result of evaluating
MemberExpression . - Let baseValue be ?
GetValue (baseReference). - Let bv be ?
RequireObjectCoercible (baseValue). - Let propertyNameString be StringValue of
IdentifierName . - If the code matched by the syntactic production that is being evaluated is
strict mode code , let strict betrue , else let strict befalse . - Return a value of type
Reference whose base value is bv, whose referenced name is propertyNameString, and whose strict reference flag is strict.
Is evaluated in exactly the same manner as
Is evaluated in exactly the same manner as
12.3.3The new Operator#
12.3.3.1Runtime Semantics: Evaluation#
- Return ?
EvaluateNew (NewExpression ,empty ).
- Return ?
EvaluateNew (MemberExpression ,Arguments ).
12.3.3.1.1Runtime Semantics: EvaluateNew(constructProduction, arguments)#
The abstract operation EvaluateNew with arguments constructProduction, and arguments performs the following steps:
- Assert: constructProduction is either a
NewExpression or aMemberExpression . - Assert: arguments is either
empty or anArguments production. - Let ref be the result of evaluating constructProduction.
- Let constructor be ?
GetValue (ref). - If arguments is
empty , let argList be a new emptyList . - Else,
- Let argList be ArgumentListEvaluation of arguments.
ReturnIfAbrupt (argList).
- If
IsConstructor (constructor) isfalse , throw aTypeError exception. - Return ?
Construct (constructor, argList).
12.3.4Function Calls#
12.3.4.1Runtime Semantics: Evaluation#
- Let ref be the result of evaluating
MemberExpression . - Let func be ?
GetValue (ref). - If
Type (ref) isReference and IsPropertyReference(ref) isfalse and GetReferencedName(ref) is"eval", then- If
SameValue (func,%eval% ) istrue , then- Let argList be ? ArgumentListEvaluation(
Arguments ). - If argList has no elements, return
undefined . - Let evalText be the first element of argList.
- If the source code matching this
CallExpression is strict code, let strictCaller betrue . Otherwise let strictCaller befalse . - Let evalRealm be
the current Realm Record . - Return ?
PerformEval (evalText, evalRealm, strictCaller,true ).
- Let argList be ? ArgumentListEvaluation(
- If
- If
Type (ref) isReference , then- If IsPropertyReference(ref) is
true , then- Let thisValue be
GetThisValue (ref).
- Let thisValue be
- Else, the base of ref is an
Environment Record - Let refEnv be GetBase(ref).
- Let thisValue be refEnv.WithBaseObject().
- If IsPropertyReference(ref) is
- Else
Type (ref) is notReference ,- Let thisValue be
undefined .
- Let thisValue be
- Let thisCall be this
CallExpression . - Let tailCall be
IsInTailPosition (thisCall). - Return ?
EvaluateDirectCall (func, thisValue,Arguments , tailCall).
A
- Let ref be the result of evaluating
CallExpression . - Let thisCall be this
CallExpression . - Let tailCall be
IsInTailPosition (thisCall). - Return ?
EvaluateCall (ref,Arguments , tailCall).
12.3.4.2Runtime Semantics: EvaluateCall( ref, arguments, tailPosition )#
The abstract operation EvaluateCall takes as arguments a value ref, a syntactic grammar production arguments, and a Boolean argument tailPosition. It performs the following steps:
- Let func be ?
GetValue (ref). - If
Type (ref) isReference , then- If IsPropertyReference(ref) is
true , then- Let thisValue be
GetThisValue (ref).
- Let thisValue be
- Else, the base of ref is an
Environment Record - Let refEnv be GetBase(ref).
- Let thisValue be refEnv.WithBaseObject().
- If IsPropertyReference(ref) is
- Else
Type (ref) is notReference ,- Let thisValue be
undefined .
- Let thisValue be
- Return ?
EvaluateDirectCall (func, thisValue, arguments, tailPosition).
12.3.4.3Runtime Semantics: EvaluateDirectCall( func, thisValue, arguments, tailPosition )#
The abstract operation EvaluateDirectCall takes as arguments a value func, a value thisValue, a syntactic grammar production arguments, and a Boolean argument tailPosition. It performs the following steps:
- Let argList be ? ArgumentListEvaluation(arguments).
- If
Type (func) is not Object, throw aTypeError exception. - If
IsCallable (func) isfalse , throw aTypeError exception. - If tailPosition is
true , performPrepareForTailCall (). - Let result be
Call (func, thisValue, argList). - Assert: If tailPosition is
true , the above call will not return here, but instead evaluation will continue as if the following return has already occurred. - Assert: If result is not an
abrupt completion , thenType (result) is anECMAScript language type . - Return result.
12.3.5The super Keyword#
12.3.5.1Runtime Semantics: Evaluation#
- Let propertyNameReference be the result of evaluating
Expression . - Let propertyNameValue be
GetValue (propertyNameReference). - Let propertyKey be ?
ToPropertyKey (propertyNameValue). - If the code matched by the syntactic production that is being evaluated is
strict mode code , let strict betrue , else let strict befalse . - Return ?
MakeSuperPropertyReference (propertyKey, strict).
- Let propertyKey be StringValue of
IdentifierName . - If the code matched by the syntactic production that is being evaluated is
strict mode code , let strict betrue , else let strict befalse . - Return ?
MakeSuperPropertyReference (propertyKey, strict).
- Let newTarget be
GetNewTarget (). - If newTarget is
undefined , throw aReferenceError exception. - Let func be ?
GetSuperConstructor (). - Let argList be ArgumentListEvaluation of
Arguments . ReturnIfAbrupt (argList).- Let result be ?
Construct (func, argList, newTarget). - Let thisER be
GetThisEnvironment ( ). - Return ? thisER.BindThisValue(result).
12.3.5.2Runtime Semantics: GetSuperConstructor ( )#
The abstract operation GetSuperConstructor performs the following steps:
- Let envRec be
GetThisEnvironment ( ). - Assert: envRec is a function
Environment Record . - Let activeFunction be envRec.[[FunctionObject]].
- Let superConstructor be ? activeFunction.[[GetPrototypeOf]]().
- If
IsConstructor (superConstructor) isfalse , throw aTypeError exception. - Return superConstructor.
12.3.5.3Runtime Semantics: MakeSuperPropertyReference(propertyKey, strict)#
The abstract operation MakeSuperPropertyReference with arguments propertyKey and strict performs the following steps:
- Let env be
GetThisEnvironment ( ). - If env.HasSuperBinding() is
false , throw aReferenceError exception. - Let actualThis be ? env.GetThisBinding().
- Let baseValue be ? env.GetSuperBase().
- Let bv be ?
RequireObjectCoercible (baseValue). - Return a value of type
Reference that is a SuperReference whose base value is bv, whose referenced name is propertyKey, whose thisValue is actualThis, and whose strict reference flag is strict.
12.3.6Argument Lists#
The evaluation of an argument list produces a
12.3.6.1Runtime Semantics: ArgumentListEvaluation#
- Return a new empty
List .
- Let ref be the result of evaluating
AssignmentExpression . - Let arg be ?
GetValue (ref). - Return a
List whose sole item is arg.
- Let list be a new empty
List . - Let spreadRef be the result of evaluating
AssignmentExpression . - Let spreadObj be ?
GetValue (spreadRef). - Let iterator be ?
GetIterator (spreadObj). - Repeat
- Let next be ?
IteratorStep (iterator). - If next is
false , return list. - Let nextArg be ?
IteratorValue (next). - Append nextArg as the last element of list.
- Let next be ?
- Let precedingArgs be the result of evaluating
ArgumentList . ReturnIfAbrupt (precedingArgs).- Let ref be the result of evaluating
AssignmentExpression . - Let arg be ?
GetValue (ref). - Append arg to the end of precedingArgs.
- Return precedingArgs.
- Let precedingArgs be the result of evaluating
ArgumentList . - Let spreadRef be the result of evaluating
AssignmentExpression . - Let iterator be ?
GetIterator (?GetValue (spreadRef)). - Repeat
- Let next be ?
IteratorStep (iterator). - If next is
false , return precedingArgs. - Let nextArg be ?
IteratorValue (next). - Append nextArg as the last element of precedingArgs.
- Let next be ?
12.3.7Tagged Templates#
A tagged template is a function call where the arguments of the call are derived from a
12.3.7.1Runtime Semantics: Evaluation#
- Let tagRef be the result of evaluating
MemberExpression . - Let thisCall be this
MemberExpression . - Let tailCall be
IsInTailPosition (thisCall). - Return ?
EvaluateCall (tagRef,TemplateLiteral , tailCall).
- Let tagRef be the result of evaluating
CallExpression . - Let thisCall be this
CallExpression . - Let tailCall be
IsInTailPosition (thisCall). - Return ?
EvaluateCall (tagRef,TemplateLiteral , tailCall).
12.3.8Meta Properties#
12.3.8.1Runtime Semantics: Evaluation#
- Return
GetNewTarget ().
12.4Update Expressions#
Syntax
12.4.1Static Semantics: Early Errors#
-
It is an early
Reference Error if IsValidSimpleAssignmentTarget ofLeftHandSideExpression isfalse .
-
It is an early
Reference Error if IsValidSimpleAssignmentTarget ofUnaryExpression isfalse .
12.4.2Static Semantics: IsFunctionDefinition#
- Return
false .
12.4.3Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.4.4Postfix Increment Operator#
12.4.4.1Runtime Semantics: Evaluation#
- Let lhs be the result of evaluating
LeftHandSideExpression . - Let oldValue be ?
ToNumber (?GetValue (lhs)). - Let newValue be the result of adding the value
1to oldValue, using the same rules as for the+operator (see12.8.5 ). - Perform ?
PutValue (lhs, newValue). - Return oldValue.
12.4.5Postfix Decrement Operator#
12.4.5.1Runtime Semantics: Evaluation#
- Let lhs be the result of evaluating
LeftHandSideExpression . - Let oldValue be ?
ToNumber (?GetValue (lhs)). - Let newValue be the result of subtracting the value
1from oldValue, using the same rules as for the-operator (see12.8.5 ). - Perform ?
PutValue (lhs, newValue). - Return oldValue.
12.4.6Prefix Increment Operator#
12.4.6.1Runtime Semantics: Evaluation#
- Let expr be the result of evaluating
UnaryExpression . - Let oldValue be ?
ToNumber (?GetValue (expr)). - Let newValue be the result of adding the value
1to oldValue, using the same rules as for the+operator (see12.8.5 ). - Perform ?
PutValue (expr, newValue). - Return newValue.
12.4.7Prefix Decrement Operator#
12.4.7.1Runtime Semantics: Evaluation#
- Let expr be the result of evaluating
UnaryExpression . - Let oldValue be ?
ToNumber (?GetValue (expr)). - Let newValue be the result of subtracting the value
1from oldValue, using the same rules as for the-operator (see12.8.5 ). - Perform ?
PutValue (expr, newValue). - Return newValue.
12.5Unary Operators#
Syntax
12.5.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.5.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.5.3The delete Operator#
12.5.3.1Static Semantics: Early Errors#
-
It is a Syntax Error if the
UnaryExpression is contained instrict mode code and the derivedUnaryExpression is .PrimaryExpression : IdentifierReference -
It is a Syntax Error if the derived
UnaryExpression is
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
andCoverParenthesizedExpressionAndArrowParameterList ultimately derives a phrase that, if used in place ofUnaryExpression , would produce a Syntax Error according to these rules. This rule is recursively applied.
The last rule means that expressions such as delete (((foo))) produce early errors because of recursive application of the first rule.
12.5.3.2Runtime Semantics: Evaluation#
- Let ref be the result of evaluating
UnaryExpression . ReturnIfAbrupt (ref).- If
Type (ref) is notReference , returntrue . - If IsUnresolvableReference(ref) is
true , then- Assert: IsStrictReference(ref) is
false . - Return
true .
- Assert: IsStrictReference(ref) is
- If IsPropertyReference(ref) is
true , then- If IsSuperReference(ref) is
true , throw aReferenceError exception. - Let baseObj be !
ToObject (GetBase(ref)). - Let deleteStatus be ? baseObj.[[Delete]](GetReferencedName(ref)).
- If deleteStatus is
false and IsStrictReference(ref) istrue , throw aTypeError exception. - Return deleteStatus.
- If IsSuperReference(ref) is
- Else ref is a
Reference to anEnvironment Record binding,- Let bindings be GetBase(ref).
- Return ? bindings.DeleteBinding(GetReferencedName(ref)).
When a delete operator occurs within delete operator occurs within
12.5.4The void Operator#
12.5.4.1Runtime Semantics: Evaluation#
- Let expr be the result of evaluating
UnaryExpression . - Perform ?
GetValue (expr). - Return
undefined .
12.5.5The typeof Operator#
12.5.5.1Runtime Semantics: Evaluation#
- Let val be the result of evaluating
UnaryExpression . - If
Type (val) isReference , then- If IsUnresolvableReference(val) is
true , return"undefined".
- If IsUnresolvableReference(val) is
- Let val be ?
GetValue (val). - Return a String according to
Table 35 .
| Type of val | Result |
|---|---|
| Undefined |
"undefined"
|
| Null |
"object"
|
| Boolean |
"boolean"
|
| Number |
"number"
|
| String |
"string"
|
| Symbol |
"symbol"
|
| Object (ordinary and does not implement [[Call]]) |
"object"
|
| Object (standard exotic and does not implement [[Call]]) |
"object"
|
| Object (implements [[Call]]) |
"function"
|
| Object (non-standard exotic and does not implement [[Call]]) |
Implementation-defined. Must not be "undefined", "boolean", "function", "number", "symbol", or "string".
|
Implementations are discouraged from defining new typeof result values for non-standard exotic objects. If possible "object" should be used for such objects.
12.5.6Unary + Operator#
The unary + operator converts its operand to Number type.
12.5.6.1Runtime Semantics: Evaluation#
- Let expr be the result of evaluating
UnaryExpression . - Return ?
ToNumber (?GetValue (expr)).
12.5.7Unary - Operator#
The unary - operator converts its operand to Number type and then negates it. Negating
12.5.7.1Runtime Semantics: Evaluation#
- Let expr be the result of evaluating
UnaryExpression . - Let oldValue be ?
ToNumber (?GetValue (expr)). - If oldValue is
NaN , returnNaN . - Return the result of negating oldValue; that is, compute a Number with the same magnitude but opposite sign.
12.5.8Bitwise NOT Operator ( ~ )#
12.5.8.1Runtime Semantics: Evaluation#
- Let expr be the result of evaluating
UnaryExpression . - Let oldValue be ?
ToInt32 (?GetValue (expr)). - Return the result of applying bitwise complement to oldValue. The result is a signed 32-bit integer.
12.5.9Logical NOT Operator ( ! )#
12.5.9.1Runtime Semantics: Evaluation#
- Let expr be the result of evaluating
UnaryExpression . - Let oldValue be
ToBoolean (?GetValue (expr)). - If oldValue is
true , returnfalse . - Return
true .
12.6Exponentiation Operator#
Syntax
12.6.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.6.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.6.3Runtime Semantics: Evaluation#
- Let left be the result of evaluating UpdateExpression.
- Let leftValue be ?
GetValue (left). - Let right be the result of evaluating ExponentiationExpression.
- Let rightValue be ?
GetValue (right). - Let base be ?
ToNumber (leftValue). - Let exponent be ?
ToNumber (rightValue). - Return the result of
Applying the ** operator with base and exponent as specified in12.7.3.4 .
12.7Multiplicative Operators#
Syntax
12.7.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.7.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.7.3Runtime Semantics: Evaluation#
- Let left be the result of evaluating
MultiplicativeExpression . - Let leftValue be ?
GetValue (left). - Let right be the result of evaluating
ExponentiationExpression . - Let rightValue be ?
GetValue (right). - Let lnum be ?
ToNumber (leftValue). - Let rnum be ?
ToNumber (rightValue). - Return the result of applying the
MultiplicativeOperator (*,/, or%) to lnum and rnum as specified in12.7.3.1 ,12.7.3.2 , or12.7.3.3 .
12.7.3.1Applying the * Operator#
The *
The result of a floating-point multiplication is governed by the rules of IEEE 754-2008 binary double-precision arithmetic:
-
If either operand is
NaN , the result isNaN . - The sign of the result is positive if both operands have the same sign, negative if the operands have different signs.
-
Multiplication of an infinity by a zero results in
NaN . - Multiplication of an infinity by an infinity results in an infinity. The sign is determined by the rule already stated above.
- Multiplication of an infinity by a finite nonzero value results in a signed infinity. The sign is determined by the rule already stated above.
-
In the remaining cases, where neither an infinity nor
NaN is involved, the product is computed and rounded to the nearest representable value using IEEE 754-2008 round to nearest, ties to even mode. If the magnitude is too large to represent, the result is then an infinity of appropriate sign. If the magnitude is too small to represent, the result is then a zero of appropriate sign. The ECMAScript language requires support of gradual underflow as defined by IEEE 754-2008.
12.7.3.2Applying the / Operator#
The /
-
If either operand is
NaN , the result isNaN . - The sign of the result is positive if both operands have the same sign, negative if the operands have different signs.
-
Division of an infinity by an infinity results in
NaN . - Division of an infinity by a zero results in an infinity. The sign is determined by the rule already stated above.
- Division of an infinity by a nonzero finite value results in a signed infinity. The sign is determined by the rule already stated above.
- Division of a finite value by an infinity results in zero. The sign is determined by the rule already stated above.
-
Division of a zero by a zero results in
NaN ; division of zero by any other finite value results in zero, with the sign determined by the rule already stated above. - Division of a nonzero finite value by a zero results in a signed infinity. The sign is determined by the rule already stated above.
-
In the remaining cases, where neither an infinity, nor a zero, nor
NaN is involved, the quotient is computed and rounded to the nearest representable value using IEEE 754-2008 round to nearest, ties to even mode. If the magnitude is too large to represent, the operation overflows; the result is then an infinity of appropriate sign. If the magnitude is too small to represent, the operation underflows and the result is a zero of the appropriate sign. The ECMAScript language requires support of gradual underflow as defined by IEEE 754-2008.
12.7.3.3Applying the % Operator#
The %
In C and C++, the remainder operator accepts only integral operands; in ECMAScript, it also accepts floating-point operands.
The result of a floating-point remainder operation as computed by the % operator is not the same as the “remainder” operation defined by IEEE 754-2008. The IEEE 754-2008 “remainder” operation computes the remainder from a rounding division, not a truncating division, and so its behaviour is not analogous to that of the usual integer remainder operator. Instead the ECMAScript language defines % on floating-point operations to behave in a manner analogous to that of the Java integer remainder operator; this may be compared with the C library function fmod.
The result of an ECMAScript floating-point remainder operation is determined by the rules of IEEE arithmetic:
-
If either operand is
NaN , the result isNaN . - The sign of the result equals the sign of the dividend.
-
If the dividend is an infinity, or the divisor is a zero, or both, the result is
NaN . - If the dividend is finite and the divisor is an infinity, the result equals the dividend.
- If the dividend is a zero and the divisor is nonzero and finite, the result is the same as the dividend.
-
In the remaining cases, where neither an infinity, nor a zero, nor
NaN is involved, the floating-point remainder r from a dividend n and a divisor d is defined by the mathematical relation r = n - (d × q) where q is an integer that is negative only if n/d is negative and positive only if n/d is positive, and whose magnitude is as large as possible without exceeding the magnitude of the true mathematical quotient of n and d. r is computed and rounded to the nearest representable value using IEEE 754-2008 round to nearest, ties to even mode.
12.7.3.4Applying the ** Operator#
Returns an implementation-dependent approximation of the result of raising base to the power exponent.
- If exponent is
NaN , the result isNaN . - If exponent is
+0 , the result is 1, even if base isNaN . - If exponent is
-0 , the result is 1, even if base isNaN . - If base is
NaN and exponent is nonzero, the result isNaN . - If
abs (base) > 1 and exponent is+∞ , the result is+∞ . - If
abs (base) > 1 and exponent is-∞ , the result is+0 . - If
abs (base) is 1 and exponent is+∞ , the result isNaN . - If
abs (base) is 1 and exponent is-∞ , the result isNaN . - If
abs (base) < 1 and exponent is+∞ , the result is+0 . - If
abs (base) < 1 and exponent is-∞ , the result is+∞ . - If base is
+∞ and exponent > 0, the result is+∞ . - If base is
+∞ and exponent < 0, the result is+0 . - If base is
-∞ and exponent > 0 and exponent is an odd integer, the result is-∞ . - If base is
-∞ and exponent > 0 and exponent is not an odd integer, the result is+∞ . - If base is
-∞ and exponent < 0 and exponent is an odd integer, the result is-0 . - If base is
-∞ and exponent < 0 and exponent is not an odd integer, the result is+0 . - If base is
+0 and exponent > 0, the result is+0 . - If base is
+0 and exponent < 0, the result is+∞ . - If base is
-0 and exponent > 0 and exponent is an odd integer, the result is-0 . - If base is
-0 and exponent > 0 and exponent is not an odd integer, the result is+0 . - If base is
-0 and exponent < 0 and exponent is an odd integer, the result is-∞ . - If base is
-0 and exponent < 0 and exponent is not an odd integer, the result is+∞ . - If base < 0 and base is finite and exponent is finite and exponent is not an integer, the result is
NaN .
The result of base ** exponent when base is
12.8Additive Operators#
Syntax
12.8.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.8.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.8.3The Addition Operator ( + )#
The addition operator either performs string concatenation or numeric addition.
12.8.3.1Runtime Semantics: Evaluation#
- Let lref be the result of evaluating
AdditiveExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
MultiplicativeExpression . - Let rval be ?
GetValue (rref). - Let lprim be ?
ToPrimitive (lval). - Let rprim be ?
ToPrimitive (rval). - If
Type (lprim) is String orType (rprim) is String, then - Let lnum be ?
ToNumber (lprim). - Let rnum be ?
ToNumber (rprim). - Return the result of applying the addition operation to lnum and rnum. See the Note below
12.8.5 .
No hint is provided in the calls to
Step 7 differs from step 5 of the
12.8.4The Subtraction Operator ( - )#
12.8.4.1Runtime Semantics: Evaluation#
- Let lref be the result of evaluating
AdditiveExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
MultiplicativeExpression . - Let rval be ?
GetValue (rref). - Let lnum be ?
ToNumber (lval). - Let rnum be ?
ToNumber (rval). - Return the result of applying the subtraction operation to lnum and rnum. See the note below
12.8.5 .
12.8.5Applying the Additive Operators to Numbers#
The + operator performs addition when applied to two operands of numeric type, producing the sum of the operands. The - operator performs subtraction, producing the difference of two numeric operands.
Addition is a commutative operation, but not always associative.
The result of an addition is determined using the rules of IEEE 754-2008 binary double-precision arithmetic:
-
If either operand is
NaN , the result isNaN . -
The sum of two infinities of opposite sign is
NaN . - The sum of two infinities of the same sign is the infinity of that sign.
- The sum of an infinity and a finite value is equal to the infinite operand.
-
The sum of two negative zeroes is
-0 . The sum of two positive zeroes, or of two zeroes of opposite sign, is+0 . - The sum of a zero and a nonzero finite value is equal to the nonzero operand.
-
The sum of two nonzero finite values of the same magnitude and opposite sign is
+0 . -
In the remaining cases, where neither an infinity, nor a zero, nor
NaN is involved, and the operands have the same sign or have different magnitudes, the sum is computed and rounded to the nearest representable value using IEEE 754-2008 round to nearest, ties to even mode. If the magnitude is too large to represent, the operation overflows and the result is then an infinity of appropriate sign. The ECMAScript language requires support of gradual underflow as defined by IEEE 754-2008.
The - operator performs subtraction when applied to two operands of numeric type, producing the difference of its operands; the left operand is the minuend and the right operand is the subtrahend. Given numeric operands a and b, it is always the case that a-b produces the same result as a+(-b).
12.9Bitwise Shift Operators#
Syntax
12.9.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.9.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.9.3The Left Shift Operator ( << )#
Performs a bitwise left shift operation on the left operand by the amount specified by the right operand.
12.9.3.1Runtime Semantics: Evaluation#
- Let lref be the result of evaluating
ShiftExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
AdditiveExpression . - Let rval be ?
GetValue (rref). - Let lnum be ?
ToInt32 (lval). - Let rnum be ?
ToUint32 (rval). - Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
- Return the result of left shifting lnum by shiftCount bits. The result is a signed 32-bit integer.
12.9.4The Signed Right Shift Operator ( >> )#
Performs a sign-filling bitwise right shift operation on the left operand by the amount specified by the right operand.
12.9.4.1Runtime Semantics: Evaluation#
- Let lref be the result of evaluating
ShiftExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
AdditiveExpression . - Let rval be ?
GetValue (rref). - Let lnum be ?
ToInt32 (lval). - Let rnum be ?
ToUint32 (rval). - Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
- Return the result of performing a sign-extending right shift of lnum by shiftCount bits. The most significant bit is propagated. The result is a signed 32-bit integer.
12.9.5The Unsigned Right Shift Operator ( >>> )#
Performs a zero-filling bitwise right shift operation on the left operand by the amount specified by the right operand.
12.9.5.1Runtime Semantics: Evaluation#
- Let lref be the result of evaluating
ShiftExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
AdditiveExpression . - Let rval be ?
GetValue (rref). - Let lnum be ?
ToUint32 (lval). - Let rnum be ?
ToUint32 (rval). - Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
- Return the result of performing a zero-filling right shift of lnum by shiftCount bits. Vacated bits are filled with zero. The result is an unsigned 32-bit integer.
12.10Relational Operators#
The result of evaluating a relational operator is always of type Boolean, reflecting whether the relationship named by the operator holds between its two operands.
Syntax
The [In] grammar parameter is needed to avoid confusing the in operator in a relational expression with the in operator in a for statement.
12.10.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.10.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.10.3Runtime Semantics: Evaluation#
- Let lref be the result of evaluating
RelationalExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
ShiftExpression . - Let rval be ?
GetValue (rref). - Let r be the result of performing
Abstract Relational Comparison lval < rval. ReturnIfAbrupt (r).- If r is
undefined , returnfalse . Otherwise, return r.
- Let lref be the result of evaluating
RelationalExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
ShiftExpression . - Let rval be ?
GetValue (rref). - Let r be the result of performing
Abstract Relational Comparison rval < lval with LeftFirst equal tofalse . ReturnIfAbrupt (r).- If r is
undefined , returnfalse . Otherwise, return r.
- Let lref be the result of evaluating
RelationalExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
ShiftExpression . - Let rval be ?
GetValue (rref). - Let r be the result of performing
Abstract Relational Comparison rval < lval with LeftFirst equal tofalse . ReturnIfAbrupt (r).- If r is
true orundefined , returnfalse . Otherwise, returntrue .
- Let lref be the result of evaluating
RelationalExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
ShiftExpression . - Let rval be ?
GetValue (rref). - Let r be the result of performing
Abstract Relational Comparison lval < rval. ReturnIfAbrupt (r).- If r is
true orundefined , returnfalse . Otherwise, returntrue .
- Let lref be the result of evaluating
RelationalExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
ShiftExpression . - Let rval be ?
GetValue (rref). - Return ?
InstanceofOperator (lval, rval).
- Let lref be the result of evaluating
RelationalExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
ShiftExpression . - Let rval be ?
GetValue (rref). - If
Type (rval) is not Object, throw aTypeError exception. - Return ?
HasProperty (rval,ToPropertyKey (lval)).
12.10.4Runtime Semantics: InstanceofOperator(O, C)#
The abstract operation InstanceofOperator(O, C) implements the generic algorithm for determining if an object O inherits from the inheritance path defined by constructor C. This abstract operation performs the following steps:
- If
Type (C) is not Object, throw aTypeError exception. - Let instOfHandler be ?
GetMethod (C, @@hasInstance). - If instOfHandler is not
undefined , then - If
IsCallable (C) isfalse , throw aTypeError exception. - Return ?
OrdinaryHasInstance (C, O).
Steps 5 and 6 provide compatibility with previous editions of ECMAScript that did not use a @@hasInstance method to define the instanceof operator semantics. If a function object does not define or inherit @@hasInstance it uses the default instanceof semantics.
12.11Equality Operators#
The result of evaluating an equality operator is always of type Boolean, reflecting whether the relationship named by the operator holds between its two operands.
Syntax
12.11.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.11.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.11.3Runtime Semantics: Evaluation#
- Let lref be the result of evaluating
EqualityExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
RelationalExpression . - Let rval be ?
GetValue (rref). - Return the result of performing
Abstract Equality Comparison rval == lval.
- Let lref be the result of evaluating
EqualityExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
RelationalExpression . - Let rval be ?
GetValue (rref). - Let r be the result of performing
Abstract Equality Comparison rval == lval. - If r is
true , returnfalse . Otherwise, returntrue .
- Let lref be the result of evaluating
EqualityExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
RelationalExpression . - Let rval be ?
GetValue (rref). - Return the result of performing
Strict Equality Comparison rval === lval.
- Let lref be the result of evaluating
EqualityExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
RelationalExpression . - Let rval be ?
GetValue (rref). - Let r be the result of performing
Strict Equality Comparison rval === lval. - If r is
true , returnfalse . Otherwise, returntrue .
Given the above definition of equality:
-
String comparison can be forced by:
"" + a == "" + b. -
Numeric comparison can be forced by:
+a == +b. -
Boolean comparison can be forced by:
!a == !b.
The equality operators maintain the following invariants:
-
A != Bis equivalent to!(A == B). -
A == Bis equivalent toB == A, except in the order of evaluation ofAandB.
The equality operator is not always transitive. For example, there might be two distinct String objects, each representing the same String value; each String object would be considered equal to the String value by the == operator, but the two String objects would not be equal to each other. For example:
-
new String("a") == "a"and"a" == new String("a")are bothtrue . -
new String("a") == new String("a")isfalse .
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.
12.12Binary Bitwise Operators#
Syntax
12.12.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.12.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.12.3Runtime Semantics: Evaluation#
The production
- Let lref be the result of evaluating A.
- Let lval be ?
GetValue (lref). - Let rref be the result of evaluating B.
- Let rval be ?
GetValue (rref). - Let lnum be ?
ToInt32 (lval). - Let rnum be ?
ToInt32 (rval). - Return the result of applying the bitwise operator @ to lnum and rnum. The result is a signed 32 bit integer.
12.13Binary Logical Operators#
Syntax
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.
12.13.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.13.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.13.3Runtime Semantics: Evaluation#
- Let lref be the result of evaluating
LogicalANDExpression . - Let lval be ?
GetValue (lref). - Let lbool be
ToBoolean (lval). - If lbool is
false , return lval. - Let rref be the result of evaluating
BitwiseORExpression . - Return ?
GetValue (rref).
- Let lref be the result of evaluating
LogicalORExpression . - Let lval be ?
GetValue (lref). - Let lbool be
ToBoolean (lval). - If lbool is
true , return lval. - Let rref be the result of evaluating
LogicalANDExpression . - Return ?
GetValue (rref).
12.14Conditional Operator ( ? : )#
Syntax
The grammar for a
12.14.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.14.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.14.3Runtime Semantics: Evaluation#
- Let lref be the result of evaluating
LogicalORExpression . - Let lval be
ToBoolean (?GetValue (lref)). - If lval is
true , then- Let trueRef be the result of evaluating the first
AssignmentExpression . - Return ?
GetValue (trueRef).
- Let trueRef be the result of evaluating the first
- Else,
- Let falseRef be the result of evaluating the second
AssignmentExpression . - Return ?
GetValue (falseRef).
- Let falseRef be the result of evaluating the second
12.15Assignment Operators#
Syntax
12.15.1Static Semantics: Early Errors#
-
It is a Syntax Error if
LeftHandSideExpression is either anObjectLiteral or anArrayLiteral and the lexical token sequence matched byLeftHandSideExpression cannot be parsed with no tokens left over usingAssignmentPattern as the goal symbol. -
It is an early
Reference Error ifLeftHandSideExpression is neither anObjectLiteral nor anArrayLiteral and IsValidSimpleAssignmentTarget ofLeftHandSideExpression isfalse .
-
It is an early
Reference Error if IsValidSimpleAssignmentTarget ofLeftHandSideExpression isfalse .
12.15.2Static Semantics: IsFunctionDefinition#
- Return
true .
- Return
false .
12.15.3Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.15.4Runtime Semantics: Evaluation#
- If
LeftHandSideExpression is neither anObjectLiteral nor anArrayLiteral , then- Let lref be the result of evaluating
LeftHandSideExpression . ReturnIfAbrupt (lref).- Let rref be the result of evaluating
AssignmentExpression . - Let rval be ?
GetValue (rref). - If
IsAnonymousFunctionDefinition (AssignmentExpression ) and IsIdentifierRef ofLeftHandSideExpression are bothtrue , then- Let hasNameProperty be ?
HasOwnProperty (rval,"name"). - If hasNameProperty is
false , performSetFunctionName (rval, GetReferencedName(lref)).
- Let hasNameProperty be ?
- Perform ?
PutValue (lref, rval). - Return rval.
- Let lref be the result of evaluating
- Let assignmentPattern be the parse of the source text corresponding to
LeftHandSideExpression usingAssignmentPattern as the goal symbol.[?Yield] - Let rref be the result of evaluating
AssignmentExpression . - Let rval be ?
GetValue (rref). - Let status be the result of performing DestructuringAssignmentEvaluation of assignmentPattern using rval as the argument.
ReturnIfAbrupt (status).- Return rval.
- Let lref be the result of evaluating
LeftHandSideExpression . - Let lval be ?
GetValue (lref). - Let rref be the result of evaluating
AssignmentExpression . - Let rval be ?
GetValue (rref). - Let op be the
@whereAssignmentOperator is@=. - Let r be the result of applying op to lval and rval as if evaluating the expression lval op rval.
- Perform ?
PutValue (lref, r). - Return r.
When an assignment occurs within
12.15.5Destructuring Assignment#
Supplemental Syntax
In certain circumstances when processing the production
12.15.5.1Static Semantics: Early Errors#
-
It is a Syntax Error if IsValidSimpleAssignmentTarget of
IdentifierReference isfalse .
-
It is a Syntax Error if
LeftHandSideExpression is either anObjectLiteral or anArrayLiteral and if the lexical token sequence matched byLeftHandSideExpression cannot be parsed with no tokens left over usingAssignmentPattern as the goal symbol. -
It is a Syntax Error if
LeftHandSideExpression is neither anObjectLiteral nor anArrayLiteral and IsValidSimpleAssignmentTarget(LeftHandSideExpression ) isfalse .
12.15.5.2Runtime Semantics: DestructuringAssignmentEvaluation#
with parameter value
- Perform ?
RequireObjectCoercible (value). - Return
NormalCompletion (empty ).
- Perform ?
RequireObjectCoercible (value). - Return the result of performing DestructuringAssignmentEvaluation for
AssignmentPropertyList using value as the argument.
- Let iterator be ?
GetIterator (value). - Return ?
IteratorClose (iterator,NormalCompletion (empty )).
- Let iterator be ?
GetIterator (value). - Let iteratorRecord be
Record {[[Iterator]]: iterator, [[Done]]:false }. - Let result be the result of performing IteratorDestructuringAssignmentEvaluation of
Elision with iteratorRecord as the argument. - If iteratorRecord.[[Done]] is
false , return ?IteratorClose (iterator, result). - Return result.
- Let iterator be ?
GetIterator (value). - Let iteratorRecord be
Record {[[Iterator]]: iterator, [[Done]]:false }. - If
Elision is present, then- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
Elision with iteratorRecord as the argument. - If status is an
abrupt completion , then- If iteratorRecord.[[Done]] is
false , return ?IteratorClose (iterator, status). - Return
Completion (status).
- If iteratorRecord.[[Done]] is
- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
- Let result be the result of performing IteratorDestructuringAssignmentEvaluation of
AssignmentRestElement with iteratorRecord as the argument. - If iteratorRecord.[[Done]] is
false , return ?IteratorClose (iterator, result). - Return result.
- Let iterator be ?
GetIterator (value). - Let iteratorRecord be
Record {[[Iterator]]: iterator, [[Done]]:false }. - Let result be the result of performing IteratorDestructuringAssignmentEvaluation of
AssignmentElementList using iteratorRecord as the argument. - If iteratorRecord.[[Done]] is
false , return ?IteratorClose (iterator, result). - Return result.
- Let iterator be ?
GetIterator (value). - Let iteratorRecord be
Record {[[Iterator]]: iterator, [[Done]]:false }. - Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
AssignmentElementList using iteratorRecord as the argument. - If status is an
abrupt completion , then- If iteratorRecord.[[Done]] is
false , return ?IteratorClose (iterator, status). - Return
Completion (status).
- If iteratorRecord.[[Done]] is
- If
Elision is present, then- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
Elision with iteratorRecord as the argument. - If status is an
abrupt completion , then- If iteratorRecord.[[Done]] is
false , return ?IteratorClose (iterator, status). - Return
Completion (status).
- If iteratorRecord.[[Done]] is
- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
- If
AssignmentRestElement is present, then- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
AssignmentRestElement with iteratorRecord as the argument.
- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
- If iteratorRecord.[[Done]] is
false , return ?IteratorClose (iterator, status). - Return
Completion (status).
- Let status be the result of performing DestructuringAssignmentEvaluation for
AssignmentPropertyList using value as the argument. ReturnIfAbrupt (status).- Return the result of performing DestructuringAssignmentEvaluation for
AssignmentProperty using value as the argument.
- Let P be StringValue of
IdentifierReference . - Let lref be ?
ResolveBinding (P). - Let v be ?
GetV (value, P). - If
Initializer is present and v isopt undefined , then- Let defaultValue be the result of evaluating
Initializer . - Let v be ?
GetValue (defaultValue). - If
IsAnonymousFunctionDefinition (Initializer ) istrue , then- Let hasNameProperty be ?
HasOwnProperty (v,"name"). - If hasNameProperty is
false , performSetFunctionName (v, P).
- Let hasNameProperty be ?
- Let defaultValue be the result of evaluating
- Return ?
PutValue (lref, v).
- Let name be the result of evaluating
PropertyName . ReturnIfAbrupt (name).- Return the result of performing KeyedDestructuringAssignmentEvaluation of
AssignmentElement with value and name as the arguments.
12.15.5.3Runtime Semantics: IteratorDestructuringAssignmentEvaluation#
with parameters iteratorRecord
- Return the result of performing IteratorDestructuringAssignmentEvaluation of
AssignmentElisionElement using iteratorRecord as the argument.
- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
AssignmentElementList using iteratorRecord as the argument. ReturnIfAbrupt (status).- Return the result of performing IteratorDestructuringAssignmentEvaluation of
AssignmentElisionElement using iteratorRecord as the argument.
- Return the result of performing IteratorDestructuringAssignmentEvaluation of
AssignmentElement with iteratorRecord as the argument.
- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
Elision with iteratorRecord as the argument. ReturnIfAbrupt (status).- Return the result of performing IteratorDestructuringAssignmentEvaluation of
AssignmentElement with iteratorRecord as the argument.
- If iteratorRecord.[[Done]] is
false , then- Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , set iteratorRecord.[[Done]] totrue .
- Let next be
- Return
NormalCompletion (empty ).
- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
Elision with iteratorRecord as the argument. ReturnIfAbrupt (status).- If iteratorRecord.[[Done]] is
false , then- Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , set iteratorRecord.[[Done]] totrue .
- Let next be
- Return
NormalCompletion (empty ).
- If
DestructuringAssignmentTarget is neither anObjectLiteral nor anArrayLiteral , then- Let lref be the result of evaluating
DestructuringAssignmentTarget . ReturnIfAbrupt (lref).
- Let lref be the result of evaluating
- If iteratorRecord.[[Done]] is
false , then- Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , set iteratorRecord.[[Done]] totrue . - Else,
- Let value be
IteratorValue (next). - If value is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (value).
- Let value be
- Let next be
- If iteratorRecord.[[Done]] is
true , let value beundefined . - If
Initializer is present and value isundefined , then- Let defaultValue be the result of evaluating
Initializer . - Let v be ?
GetValue (defaultValue).
- Let defaultValue be the result of evaluating
- Else, let v be value.
- If
DestructuringAssignmentTarget is anObjectLiteral or anArrayLiteral , then- Let nestedAssignmentPattern be the parse of the source text corresponding to
DestructuringAssignmentTarget using eitherAssignmentPattern orAssignmentPattern as the goal symbol depending upon whether this[Yield] AssignmentElement has the [Yield] parameter. - Return the result of performing DestructuringAssignmentEvaluation of nestedAssignmentPattern with v as the argument.
- Let nestedAssignmentPattern be the parse of the source text corresponding to
- If
Initializer is present and value isundefined andIsAnonymousFunctionDefinition (Initializer ) and IsIdentifierRef ofDestructuringAssignmentTarget are bothtrue , then- Let hasNameProperty be ?
HasOwnProperty (v,"name"). - If hasNameProperty is
false , performSetFunctionName (v, GetReferencedName(lref)).
- Let hasNameProperty be ?
- Return ?
PutValue (lref, v).
Left to right evaluation order is maintained by evaluating a
- If
DestructuringAssignmentTarget is neither anObjectLiteral nor anArrayLiteral , then- Let lref be the result of evaluating
DestructuringAssignmentTarget . ReturnIfAbrupt (lref).
- Let lref be the result of evaluating
- Let A be
ArrayCreate (0). - Let n be 0.
- Repeat while iteratorRecord.[[Done]] is
false ,- Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , set iteratorRecord.[[Done]] totrue . - Else,
- Let nextValue be
IteratorValue (next). - If nextValue is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (nextValue).- Let status be
CreateDataProperty (A, !ToString (n), nextValue). - Assert: status is
true . - Increment n by 1.
- Let nextValue be
- Let next be
- If
DestructuringAssignmentTarget is neither anObjectLiteral nor anArrayLiteral , then- Return ?
PutValue (lref, A).
- Return ?
- Let nestedAssignmentPattern be the parse of the source text corresponding to
DestructuringAssignmentTarget using eitherAssignmentPattern orAssignmentPattern as the goal symbol depending upon whether this[Yield] AssignmentElement has the [Yield] parameter. - Return the result of performing DestructuringAssignmentEvaluation of nestedAssignmentPattern with A as the argument.
12.15.5.4Runtime Semantics: KeyedDestructuringAssignmentEvaluation#
with parameters value and propertyName
- If
DestructuringAssignmentTarget is neither anObjectLiteral nor anArrayLiteral , then- Let lref be the result of evaluating
DestructuringAssignmentTarget . ReturnIfAbrupt (lref).
- Let lref be the result of evaluating
- Let v be ?
GetV (value, propertyName). - If
Initializer is present and v isundefined , then- Let defaultValue be the result of evaluating
Initializer . - Let rhsValue be ?
GetValue (defaultValue).
- Let defaultValue be the result of evaluating
- Else, let rhsValue be v.
- If
DestructuringAssignmentTarget is anObjectLiteral or anArrayLiteral , then- Let assignmentPattern be the parse of the source text corresponding to
DestructuringAssignmentTarget using eitherAssignmentPattern orAssignmentPattern as the goal symbol depending upon whether this[Yield] AssignmentElement has the [Yield] parameter. - Return the result of performing DestructuringAssignmentEvaluation of assignmentPattern with rhsValue as the argument.
- Let assignmentPattern be the parse of the source text corresponding to
- If
Initializer is present and v isundefined andIsAnonymousFunctionDefinition (Initializer ) and IsIdentifierRef ofDestructuringAssignmentTarget are bothtrue , then- Let hasNameProperty be ?
HasOwnProperty (rhsValue,"name"). - If hasNameProperty is
false , performSetFunctionName (rhsValue, GetReferencedName(lref)).
- Let hasNameProperty be ?
- Return ?
PutValue (lref, rhsValue).
12.16Comma Operator ( , )#
Syntax
12.16.1Static Semantics: IsFunctionDefinition#
- Return
false .
12.16.2Static Semantics: IsValidSimpleAssignmentTarget#
- Return
false .
12.16.3Runtime Semantics: Evaluation#
- Let lref be the result of evaluating
Expression . - Perform ?
GetValue (lref). - Let rref be the result of evaluating
AssignmentExpression . - Return ?
GetValue (rref).
13ECMAScript Language: Statements and Declarations#
Syntax
13.1Statement Semantics#
13.1.1Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Return
false .
13.1.2Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Return
false .
13.1.3Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Return
false .
- Let newIterationSet be a copy of iterationSet with all the elements of labelSet appended.
- Return ContainsUndefinedContinueTarget of
IterationStatement with arguments newIterationSet and « ».
13.1.4Static Semantics: DeclarationPart#
- Return
FunctionDeclaration .
- Return
GeneratorDeclaration .
- Return
ClassDeclaration .
- Return
LexicalDeclaration .
13.1.5Static Semantics: VarDeclaredNames#
- Return a new empty
List .
13.1.6Static Semantics: VarScopedDeclarations#
- Return a new empty
List .
13.1.7Runtime Semantics: LabelledEvaluation#
With argument labelSet.
- Let stmtResult be the result of performing LabelledEvaluation of
IterationStatement with argument labelSet. - If stmtResult.[[Type]] is
break , then- If stmtResult.[[Target]] is
empty , then- If stmtResult.[[Value]] is
empty , let stmtResult beNormalCompletion (undefined ). - Else, let stmtResult be
NormalCompletion (stmtResult.[[Value]]).
- If stmtResult.[[Value]] is
- If stmtResult.[[Target]] is
- Return
Completion (stmtResult).
- Let stmtResult be the result of evaluating
SwitchStatement . - If stmtResult.[[Type]] is
break , then- If stmtResult.[[Target]] is
empty , then- If stmtResult.[[Value]] is
empty , let stmtResult beNormalCompletion (undefined ). - Else, let stmtResult be
NormalCompletion (stmtResult.[[Value]]).
- If stmtResult.[[Value]] is
- If stmtResult.[[Target]] is
- Return
Completion (stmtResult).
A
13.1.8Runtime Semantics: Evaluation#
- Return
NormalCompletion (empty ).
- Return the result of evaluating
FunctionDeclaration .
- Let newLabelSet be a new empty
List . - Return the result of performing LabelledEvaluation of this
BreakableStatement with argument newLabelSet.
13.2Block#
Syntax
13.2.1Static Semantics: Early Errors#
-
It is a Syntax Error if the LexicallyDeclaredNames of
StatementList contains any duplicate entries. -
It is a Syntax Error if any element of the LexicallyDeclaredNames of
StatementList also occurs in the VarDeclaredNames ofStatementList .
13.2.2Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Return
false .
- Let hasDuplicates be ContainsDuplicateLabels of
StatementList with argument labelSet. - If hasDuplicates is
true , returntrue . - Return ContainsDuplicateLabels of
StatementListItem with argument labelSet.
- Return
false .
13.2.3Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Return
false .
- Let hasUndefinedLabels be ContainsUndefinedBreakTarget of
StatementList with argument labelSet. - If hasUndefinedLabels is
true , returntrue . - Return ContainsUndefinedBreakTarget of
StatementListItem with argument labelSet.
- Return
false .
13.2.4Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Return
false .
- Let hasUndefinedLabels be ContainsUndefinedContinueTarget of
StatementList with arguments iterationSet and « ». - If hasUndefinedLabels is
true , returntrue . - Return ContainsUndefinedContinueTarget of
StatementListItem with arguments iterationSet and « ».
- Return
false .
13.2.5Static Semantics: LexicallyDeclaredNames#
- Return a new empty
List .
- Let names be LexicallyDeclaredNames of
StatementList . - Append to names the elements of the LexicallyDeclaredNames of
StatementListItem . - Return names.
- If
Statement is , return LexicallyDeclaredNames ofStatement : LabelledStatement LabelledStatement . - Return a new empty
List .
- Return the BoundNames of
Declaration .
13.2.6Static Semantics: LexicallyScopedDeclarations#
- Let declarations be LexicallyScopedDeclarations of
StatementList . - Append to declarations the elements of the LexicallyScopedDeclarations of
StatementListItem . - Return declarations.
- If
Statement is , return LexicallyScopedDeclarations ofStatement : LabelledStatement LabelledStatement . - Return a new empty
List .
- Return a new
List containing DeclarationPart ofDeclaration .
13.2.7Static Semantics: TopLevelLexicallyDeclaredNames#
- Let names be TopLevelLexicallyDeclaredNames of
StatementList . - Append to names the elements of the TopLevelLexicallyDeclaredNames of
StatementListItem . - Return names.
- Return a new empty
List .
- If
Declaration is , thenDeclaration : HoistableDeclaration - Return « ».
- Return the BoundNames of
Declaration .
At the top level of a function, or script, function declarations are treated like var declarations rather than like lexical declarations.
13.2.8Static Semantics: TopLevelLexicallyScopedDeclarations#
- Return a new empty
List .
- Let declarations be TopLevelLexicallyScopedDeclarations of
StatementList . - Append to declarations the elements of the TopLevelLexicallyScopedDeclarations of
StatementListItem . - Return declarations.
- Return a new empty
List .
- If
Declaration is , thenDeclaration : HoistableDeclaration - Return « ».
- Return a new
List containingDeclaration .
13.2.9Static Semantics: TopLevelVarDeclaredNames#
- Return a new empty
List .
- Let names be TopLevelVarDeclaredNames of
StatementList . - Append to names the elements of the TopLevelVarDeclaredNames of
StatementListItem . - Return names.
- If
Declaration is , thenDeclaration : HoistableDeclaration - Return the BoundNames of
HoistableDeclaration .
- Return the BoundNames of
- Return a new empty
List .
- If
Statement is , return TopLevelVarDeclaredNames ofStatement : LabelledStatement Statement . - Return VarDeclaredNames of
Statement .
At the top level of a function or script, inner function declarations are treated like var declarations.
13.2.10Static Semantics: TopLevelVarScopedDeclarations#
- Return a new empty
List .
- Let declarations be TopLevelVarScopedDeclarations of
StatementList . - Append to declarations the elements of the TopLevelVarScopedDeclarations of
StatementListItem . - Return declarations.
- If
Statement is , return TopLevelVarScopedDeclarations ofStatement : LabelledStatement Statement . - Return VarScopedDeclarations of
Statement .
- If
Declaration is , thenDeclaration : HoistableDeclaration - Let declaration be DeclarationPart of
HoistableDeclaration . - Return « declaration ».
- Let declaration be DeclarationPart of
- Return a new empty
List .
13.2.11Static Semantics: VarDeclaredNames#
- Return a new empty
List .
- Let names be VarDeclaredNames of
StatementList . - Append to names the elements of the VarDeclaredNames of
StatementListItem . - Return names.
- Return a new empty
List .
13.2.12Static Semantics: VarScopedDeclarations#
- Return a new empty
List .
- Let declarations be VarScopedDeclarations of
StatementList . - Append to declarations the elements of the VarScopedDeclarations of
StatementListItem . - Return declarations.
- Return a new empty
List .
13.2.13Runtime Semantics: Evaluation#
- Return
NormalCompletion (empty ).
- Let oldEnv be the
running execution context 's LexicalEnvironment. - Let blockEnv be
NewDeclarativeEnvironment (oldEnv). - Perform
BlockDeclarationInstantiation (StatementList , blockEnv). - Set the
running execution context 's LexicalEnvironment to blockEnv. - Let blockValue be the result of evaluating
StatementList . - Set the
running execution context 's LexicalEnvironment to oldEnv. - Return blockValue.
No matter how control leaves the
- Let sl be the result of evaluating
StatementList . ReturnIfAbrupt (sl).- Let s be the result of evaluating
StatementListItem . - Return
Completion (UpdateEmpty (s, sl)).
The value of a eval function all return the value 1:
eval("1;;;;;")
eval("1;{}")
eval("1;var a;")
13.2.14Runtime Semantics: BlockDeclarationInstantiation( code, env )#
When a
BlockDeclarationInstantiation is performed as follows using arguments code and env. code is the grammar production corresponding to the body of the block. env is the
- Let envRec be env's
EnvironmentRecord . - Assert: envRec is a declarative
Environment Record . - Let declarations be the LexicallyScopedDeclarations of code.
- For each element d in declarations do
- For each element dn of the BoundNames of d do
- If IsConstantDeclaration of d is
true , then- Perform ! envRec.CreateImmutableBinding(dn,
true ).
- Perform ! envRec.CreateImmutableBinding(dn,
- Else,
- Perform ! envRec.CreateMutableBinding(dn,
false ).
- Perform ! envRec.CreateMutableBinding(dn,
- If IsConstantDeclaration of d is
- If d is a
GeneratorDeclaration production or aFunctionDeclaration production, then- Let fn be the sole element of the BoundNames of d.
- Let fo be the result of performing InstantiateFunctionObject for d with argument env.
- Perform envRec.InitializeBinding(fn, fo).
- For each element dn of the BoundNames of d do
13.3Declarations and the Variable Statement#
13.3.1Let and Const Declarations#
let and const declarations define variables that are scoped to the let declaration does not have an
Syntax
13.3.1.1Static Semantics: Early Errors#
-
It is a Syntax Error if the BoundNames of
BindingList contains"let". -
It is a Syntax Error if the BoundNames of
BindingList contains any duplicate entries.
-
It is a Syntax Error if
Initializer is not present and IsConstantDeclaration of theLexicalDeclaration containing this production istrue .
13.3.1.2Static Semantics: BoundNames#
- Return the BoundNames of
BindingList .
- Let names be the BoundNames of
BindingList . - Append to names the elements of the BoundNames of
LexicalBinding . - Return names.
- Return the BoundNames of
BindingIdentifier .
- Return the BoundNames of
BindingPattern .
13.3.1.3Static Semantics: IsConstantDeclaration#
- Return IsConstantDeclaration of
LetOrConst .
- Return
false .
- Return
true .
13.3.1.4Runtime Semantics: Evaluation#
- Let next be the result of evaluating
BindingList . ReturnIfAbrupt (next).- Return
NormalCompletion (empty ).
- Let next be the result of evaluating
BindingList . ReturnIfAbrupt (next).- Return the result of evaluating
LexicalBinding .
- Let lhs be
ResolveBinding (StringValue ofBindingIdentifier ). - Return
InitializeReferencedBinding (lhs,undefined ).
A static semantics rule ensures that this form of const declaration.
- Let bindingId be StringValue of
BindingIdentifier . - Let lhs be
ResolveBinding (bindingId). - Let rhs be the result of evaluating
Initializer . - Let value be ?
GetValue (rhs). - If
IsAnonymousFunctionDefinition (Initializer ) istrue , then- Let hasNameProperty be ?
HasOwnProperty (value,"name"). - If hasNameProperty is
false , performSetFunctionName (value, bindingId).
- Let hasNameProperty be ?
- Return
InitializeReferencedBinding (lhs, value).
- Let rhs be the result of evaluating
Initializer . - Let value be ?
GetValue (rhs). - Let env be the
running execution context 's LexicalEnvironment. - Return the result of performing BindingInitialization for
BindingPattern using value and env as the arguments.
13.3.2Variable Statement#
A var statement declares variables that are scoped to the
Syntax
13.3.2.1Static Semantics: BoundNames#
- Let names be BoundNames of
VariableDeclarationList . - Append to names the elements of BoundNames of
VariableDeclaration . - Return names.
- Return the BoundNames of
BindingIdentifier .
- Return the BoundNames of
BindingPattern .
13.3.2.2Static Semantics: VarDeclaredNames#
- Return BoundNames of
VariableDeclarationList .
13.3.2.3Static Semantics: VarScopedDeclarations#
- Return a new
List containingVariableDeclaration .
- Let declarations be VarScopedDeclarations of
VariableDeclarationList . - Append
VariableDeclaration to declarations. - Return declarations.
13.3.2.4Runtime Semantics: Evaluation#
- Let next be the result of evaluating
VariableDeclarationList . ReturnIfAbrupt (next).- Return
NormalCompletion (empty ).
- Let next be the result of evaluating
VariableDeclarationList . ReturnIfAbrupt (next).- Return the result of evaluating
VariableDeclaration .
- Return
NormalCompletion (empty ).
- Let bindingId be StringValue of
BindingIdentifier . - Let lhs be ?
ResolveBinding (bindingId). - Let rhs be the result of evaluating
Initializer . - Let value be ?
GetValue (rhs). - If
IsAnonymousFunctionDefinition (Initializer ) istrue , then- Let hasNameProperty be ?
HasOwnProperty (value,"name"). - If hasNameProperty is
false , performSetFunctionName (value, bindingId).
- Let hasNameProperty be ?
- Return ?
PutValue (lhs, value).
If a
- Let rhs be the result of evaluating
Initializer . - Let rval be ?
GetValue (rhs). - Return the result of performing BindingInitialization for
BindingPattern passing rval andundefined as arguments.
13.3.3Destructuring Binding Patterns#
Syntax
13.3.3.1Static Semantics: BoundNames#
- Return a new empty
List .
- Return a new empty
List .
- Return the BoundNames of
BindingRestElement .
- Return the BoundNames of
BindingElementList .
- Let names be BoundNames of
BindingElementList . - Append to names the elements of BoundNames of
BindingRestElement . - Return names.
- Let names be BoundNames of
BindingPropertyList . - Append to names the elements of BoundNames of
BindingProperty . - Return names.
- Let names be BoundNames of
BindingElementList . - Append to names the elements of BoundNames of
BindingElisionElement . - Return names.
- Return BoundNames of
BindingElement .
- Return the BoundNames of
BindingElement .
- Return the BoundNames of
BindingIdentifier .
- Return the BoundNames of
BindingPattern .
13.3.3.2Static Semantics: ContainsExpression#
- Return
false .
- Return
false .
- Return ContainsExpression of
BindingRestElement .
- Return ContainsExpression of
BindingElementList .
- Let has be ContainsExpression of
BindingElementList . - If has is
true , returntrue . - Return ContainsExpression of
BindingRestElement .
- Let has be ContainsExpression of
BindingPropertyList . - If has is
true , returntrue . - Return ContainsExpression of
BindingProperty .
- Let has be ContainsExpression of
BindingElementList . - If has is
true , returntrue . - Return ContainsExpression of
BindingElisionElement .
- Return ContainsExpression of
BindingElement .
- Let has be IsComputedPropertyKey of
PropertyName . - If has is
true , returntrue . - Return ContainsExpression of
BindingElement .
- Return
true .
- Return
false .
- Return
true .
- Return
false .
- Return ContainsExpression of
BindingPattern .
13.3.3.3Static Semantics: HasInitializer#
- Return
false .
- Return
true .
- Return
false .
- Return
true .
13.3.3.4Static Semantics: IsSimpleParameterList#
- Return
false .
- Return
false .
- Return
true .
- Return
false .
13.3.3.5Runtime Semantics: BindingInitialization#
With parameters value and environment.
When
- Perform ?
RequireObjectCoercible (value). - Return the result of performing BindingInitialization for
ObjectBindingPattern using value and environment as arguments.
- Let iterator be ?
GetIterator (value). - Let iteratorRecord be
Record {[[Iterator]]: iterator, [[Done]]:false }. - Let result be IteratorBindingInitialization for
ArrayBindingPattern using iteratorRecord and environment as arguments. - If iteratorRecord.[[Done]] is
false , return ?IteratorClose (iterator, result). - Return result.
- Return
NormalCompletion (empty ).
- Let status be the result of performing BindingInitialization for
BindingPropertyList using value and environment as arguments. ReturnIfAbrupt (status).- Return the result of performing BindingInitialization for
BindingProperty using value and environment as arguments.
- Let name be the string that is the only element of BoundNames of
SingleNameBinding . - Return the result of performing KeyedBindingInitialization for
SingleNameBinding using value, environment, and name as the arguments.
- Let P be the result of evaluating
PropertyName . ReturnIfAbrupt (P).- Return the result of performing KeyedBindingInitialization for
BindingElement using value, environment, and P as arguments.
13.3.3.6Runtime Semantics: IteratorBindingInitialization#
With parameters iteratorRecord, and environment.
When
- Return
NormalCompletion (empty ).
- Return the result of performing IteratorDestructuringAssignmentEvaluation of
Elision with iteratorRecord as the argument.
- If
Elision is present, then- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
Elision with iteratorRecord as the argument. ReturnIfAbrupt (status).
- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
- Return the result of performing IteratorBindingInitialization for
BindingRestElement with iteratorRecord and environment as arguments.
- Return the result of performing IteratorBindingInitialization for
BindingElementList with iteratorRecord and environment as arguments.
- Return the result of performing IteratorBindingInitialization for
BindingElementList with iteratorRecord and environment as arguments.
- Let status be the result of performing IteratorBindingInitialization for
BindingElementList with iteratorRecord and environment as arguments. ReturnIfAbrupt (status).- Return the result of performing IteratorDestructuringAssignmentEvaluation of
Elision with iteratorRecord as the argument.
- Let status be the result of performing IteratorBindingInitialization for
BindingElementList with iteratorRecord and environment as arguments. ReturnIfAbrupt (status).- If
Elision is present, then- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
Elision with iteratorRecord as the argument. ReturnIfAbrupt (status).
- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
- Return the result of performing IteratorBindingInitialization for
BindingRestElement with iteratorRecord and environment as arguments.
- Return the result of performing IteratorBindingInitialization for
BindingElisionElement with iteratorRecord and environment as arguments.
- Let status be the result of performing IteratorBindingInitialization for
BindingElementList with iteratorRecord and environment as arguments. ReturnIfAbrupt (status).- Return the result of performing IteratorBindingInitialization for
BindingElisionElement using iteratorRecord and environment as arguments.
- Return the result of performing IteratorBindingInitialization of
BindingElement with iteratorRecord and environment as the arguments.
- Let status be the result of performing IteratorDestructuringAssignmentEvaluation of
Elision with iteratorRecord as the argument. ReturnIfAbrupt (status).- Return the result of performing IteratorBindingInitialization of
BindingElement with iteratorRecord and environment as the arguments.
- Return the result of performing IteratorBindingInitialization for
SingleNameBinding with iteratorRecord and environment as the arguments.
- Let bindingId be StringValue of
BindingIdentifier . - Let lhs be ?
ResolveBinding (bindingId, environment). - If iteratorRecord.[[Done]] is
false , then- Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , set iteratorRecord.[[Done]] totrue . - Else,
- Let v be
IteratorValue (next). - If v is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (v).
- Let v be
- Let next be
- If iteratorRecord.[[Done]] is
true , let v beundefined . - If
Initializer is present and v isundefined , then- Let defaultValue be the result of evaluating
Initializer . - Let v be ?
GetValue (defaultValue). - If
IsAnonymousFunctionDefinition (Initializer ) istrue , then- Let hasNameProperty be ?
HasOwnProperty (v,"name"). - If hasNameProperty is
false , performSetFunctionName (v, bindingId).
- Let hasNameProperty be ?
- Let defaultValue be the result of evaluating
- If environment is
undefined , return ?PutValue (lhs, v). - Return
InitializeReferencedBinding (lhs, v).
- If iteratorRecord.[[Done]] is
false , then- Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , set iteratorRecord.[[Done]] totrue . - Else,
- Let v be
IteratorValue (next). - If v is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (v).
- Let v be
- Let next be
- If iteratorRecord.[[Done]] is
true , let v beundefined . - If
Initializer is present and v isundefined , then- Let defaultValue be the result of evaluating
Initializer . - Let v be ?
GetValue (defaultValue).
- Let defaultValue be the result of evaluating
- Return the result of performing BindingInitialization of
BindingPattern with v and environment as the arguments.
- Let lhs be ?
ResolveBinding (StringValue ofBindingIdentifier , environment). - Let A be
ArrayCreate (0). - Let n be 0.
- Repeat,
- If iteratorRecord.[[Done]] is
false , then- Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , set iteratorRecord.[[Done]] totrue .
- Let next be
- If iteratorRecord.[[Done]] is
true , then- If environment is
undefined , return ?PutValue (lhs, A). - Return
InitializeReferencedBinding (lhs, A).
- If environment is
- Let nextValue be
IteratorValue (next). - If nextValue is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (nextValue).- Let status be
CreateDataProperty (A, !ToString (n), nextValue). - Assert: status is
true . - Increment n by 1.
- If iteratorRecord.[[Done]] is
- Let A be
ArrayCreate (0). - Let n be 0.
- Repeat,
- If iteratorRecord.[[Done]] is
false , then- Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , set iteratorRecord.[[Done]] totrue .
- Let next be
- If iteratorRecord.[[Done]] is
true , then- Return the result of performing BindingInitialization of
BindingPattern with A and environment as the arguments.
- Return the result of performing BindingInitialization of
- Let nextValue be
IteratorValue (next). - If nextValue is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (nextValue).- Let status be
CreateDataProperty (A, !ToString (n), nextValue). - Assert: status is
true . - Increment n by 1.
- If iteratorRecord.[[Done]] is
13.3.3.7Runtime Semantics: KeyedBindingInitialization#
With parameters value, environment, and propertyName.
When
- Let v be ?
GetV (value, propertyName). - If
Initializer is present and v isundefined , then- Let defaultValue be the result of evaluating
Initializer . - Let v be ?
GetValue (defaultValue).
- Let defaultValue be the result of evaluating
- Return the result of performing BindingInitialization for
BindingPattern passing v and environment as arguments.
- Let bindingId be StringValue of
BindingIdentifier . - Let lhs be ?
ResolveBinding (bindingId, environment). - Let v be ?
GetV (value, propertyName). - If
Initializer is present and v isundefined , then- Let defaultValue be the result of evaluating
Initializer . - Let v be ?
GetValue (defaultValue). - If
IsAnonymousFunctionDefinition (Initializer ) istrue , then- Let hasNameProperty be ?
HasOwnProperty (v,"name"). - If hasNameProperty is
false , performSetFunctionName (v, bindingId).
- Let hasNameProperty be ?
- Let defaultValue be the result of evaluating
- If environment is
undefined , return ?PutValue (lhs, v). - Return
InitializeReferencedBinding (lhs, v).
13.4Empty Statement#
Syntax
13.4.1Runtime Semantics: Evaluation#
- Return
NormalCompletion (empty ).
13.5Expression Statement#
Syntax
An function or class keywords because that would make it ambiguous with a let [ because that would make it ambiguous with a let
13.5.1Runtime Semantics: Evaluation#
- Let exprRef be the result of evaluating
Expression . - Return ?
GetValue (exprRef).
13.6The if Statement#
Syntax
Each else for which the choice of associated if is ambiguous shall be associated with the nearest possible if that would otherwise have no corresponding else.
13.6.1Static Semantics: Early Errors#
-
It is a Syntax Error if
IsLabelledFunction (Statement ) istrue .
It is only necessary to apply this rule if the extension specified in
13.6.2Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Return ContainsDuplicateLabels of
Statement with argument labelSet.
13.6.3Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Return ContainsUndefinedBreakTarget of
Statement with argument labelSet.
13.6.4Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Return ContainsUndefinedContinueTarget of
Statement with arguments iterationSet and « ».
13.6.5Static Semantics: VarDeclaredNames#
- Return the VarDeclaredNames of
Statement .
13.6.6Static Semantics: VarScopedDeclarations#
- Return the VarScopedDeclarations of
Statement .
13.6.7Runtime Semantics: Evaluation#
- Let exprRef be the result of evaluating
Expression . - Let exprValue be
ToBoolean (?GetValue (exprRef)). - If exprValue is
true , then- Let stmtCompletion be the result of evaluating the first
Statement .
- Let stmtCompletion be the result of evaluating the first
- Else,
- Let stmtCompletion be the result of evaluating the second
Statement .
- Let stmtCompletion be the result of evaluating the second
- Return
Completion (UpdateEmpty (stmtCompletion,undefined )).
- Let exprRef be the result of evaluating
Expression . - Let exprValue be
ToBoolean (?GetValue (exprRef)). - If exprValue is
false , then- Return
NormalCompletion (undefined ).
- Return
- Else,
- Let stmtCompletion be the result of evaluating
Statement . - Return
Completion (UpdateEmpty (stmtCompletion,undefined )).
- Let stmtCompletion be the result of evaluating
13.7Iteration Statements#
Syntax
13.7.1Semantics#
13.7.1.1Static Semantics: Early Errors#
-
It is a Syntax Error if
IsLabelledFunction (Statement ) istrue .
It is only necessary to apply this rule if the extension specified in
13.7.1.2Runtime Semantics: LoopContinues(completion, labelSet)#
The abstract operation LoopContinues with arguments completion and labelSet is defined by the following steps:
- If completion.[[Type]] is
normal , returntrue . - If completion.[[Type]] is not
continue , returnfalse . - If completion.[[Target]] is
empty , returntrue . - If completion.[[Target]] is an element of labelSet, return
true . - Return
false .
Within the
13.7.2The do-while Statement#
13.7.2.1Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Return ContainsDuplicateLabels of
Statement with argument labelSet.
13.7.2.2Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Return ContainsUndefinedBreakTarget of
Statement with argument labelSet.
13.7.2.3Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Return ContainsUndefinedContinueTarget of
Statement with arguments iterationSet and « ».
13.7.2.4Static Semantics: VarDeclaredNames#
- Return the VarDeclaredNames of
Statement .
13.7.2.5Static Semantics: VarScopedDeclarations#
- Return the VarScopedDeclarations of
Statement .
13.7.2.6Runtime Semantics: LabelledEvaluation#
With argument labelSet.
- Let V be
undefined . - Repeat
- Let stmt be the result of evaluating
Statement . - If
LoopContinues (stmt, labelSet) isfalse , returnCompletion (UpdateEmpty (stmt, V)). - If stmt.[[Value]] is not
empty , let V be stmt.[[Value]]. - Let exprRef be the result of evaluating
Expression . - Let exprValue be ?
GetValue (exprRef). - If
ToBoolean (exprValue) isfalse , returnNormalCompletion (V).
- Let stmt be the result of evaluating
13.7.3The while Statement#
13.7.3.1Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Return ContainsDuplicateLabels of
Statement with argument labelSet.
13.7.3.2Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Return ContainsUndefinedBreakTarget of
Statement with argument labelSet.
13.7.3.3Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Return ContainsUndefinedContinueTarget of
Statement with arguments iterationSet and « ».
13.7.3.4Static Semantics: VarDeclaredNames#
- Return the VarDeclaredNames of
Statement .
13.7.3.5Static Semantics: VarScopedDeclarations#
- Return the VarScopedDeclarations of
Statement .
13.7.3.6Runtime Semantics: LabelledEvaluation#
With argument labelSet.
- Let V be
undefined . - Repeat
- Let exprRef be the result of evaluating
Expression . - Let exprValue be ?
GetValue (exprRef). - If
ToBoolean (exprValue) isfalse , returnNormalCompletion (V). - Let stmt be the result of evaluating
Statement . - If
LoopContinues (stmt, labelSet) isfalse , returnCompletion (UpdateEmpty (stmt, V)). - If stmt.[[Value]] is not
empty , let V be stmt.[[Value]].
- Let exprRef be the result of evaluating
13.7.4The for Statement#
13.7.4.1Static Semantics: Early Errors#
-
It is a Syntax Error if any element of the BoundNames of
LexicalDeclaration also occurs in the VarDeclaredNames ofStatement .
13.7.4.2Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Return ContainsDuplicateLabels of
Statement with argument labelSet.
13.7.4.3Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Return ContainsUndefinedBreakTarget of
Statement with argument labelSet.
13.7.4.4Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Return ContainsUndefinedContinueTarget of
Statement with arguments iterationSet and « ».
13.7.4.5Static Semantics: VarDeclaredNames#
- Return the VarDeclaredNames of
Statement .
- Let names be BoundNames of
VariableDeclarationList . - Append to names the elements of the VarDeclaredNames of
Statement . - Return names.
- Return the VarDeclaredNames of
Statement .
13.7.4.6Static Semantics: VarScopedDeclarations#
- Return the VarScopedDeclarations of
Statement .
- Let declarations be VarScopedDeclarations of
VariableDeclarationList . - Append to declarations the elements of the VarScopedDeclarations of
Statement . - Return declarations.
- Return the VarScopedDeclarations of
Statement .
13.7.4.7Runtime Semantics: LabelledEvaluation#
With argument labelSet.
- If the first
Expression is present, then- Let exprRef be the result of evaluating the first
Expression . - Perform ?
GetValue (exprRef).
- Let exprRef be the result of evaluating the first
- Return ?
ForBodyEvaluation (the secondExpression , the thirdExpression ,Statement , « », labelSet).
- Let varDcl be the result of evaluating
VariableDeclarationList . ReturnIfAbrupt (varDcl).- Return ?
ForBodyEvaluation (the firstExpression , the secondExpression ,Statement , « », labelSet).
- Let oldEnv be the
running execution context 's LexicalEnvironment. - Let loopEnv be
NewDeclarativeEnvironment (oldEnv). - Let loopEnvRec be loopEnv's
EnvironmentRecord . - Let isConst be the result of performing IsConstantDeclaration of
LexicalDeclaration . - Let boundNames be the BoundNames of
LexicalDeclaration . - For each element dn of boundNames do
- If isConst is
true , then- Perform ! loopEnvRec.CreateImmutableBinding(dn,
true ).
- Perform ! loopEnvRec.CreateImmutableBinding(dn,
- Else,
- Perform ! loopEnvRec.CreateMutableBinding(dn,
false ).
- Perform ! loopEnvRec.CreateMutableBinding(dn,
- If isConst is
- Set the
running execution context 's LexicalEnvironment to loopEnv. - Let forDcl be the result of evaluating
LexicalDeclaration . - If forDcl is an
abrupt completion , then- Set the
running execution context 's LexicalEnvironment to oldEnv. - Return
Completion (forDcl).
- Set the
- If isConst is
false , let perIterationLets be boundNames; otherwise let perIterationLets be « ». - Let bodyResult be
ForBodyEvaluation (the firstExpression , the secondExpression ,Statement , perIterationLets, labelSet). - Set the
running execution context 's LexicalEnvironment to oldEnv. - Return
Completion (bodyResult).
13.7.4.8Runtime Semantics: ForBodyEvaluation( test, increment, stmt, perIterationBindings, labelSet )#
The abstract operation ForBodyEvaluation with arguments test, increment, stmt, perIterationBindings, and labelSet is performed as follows:
- Let V be
undefined . - Perform ?
CreatePerIterationEnvironment (perIterationBindings). - Repeat
- If test is not
[empty] , then- Let testRef be the result of evaluating test.
- Let testValue be ?
GetValue (testRef). - If
ToBoolean (testValue) isfalse , returnNormalCompletion (V).
- Let result be the result of evaluating stmt.
- If
LoopContinues (result, labelSet) isfalse , returnCompletion (UpdateEmpty (result, V)). - If result.[[Value]] is not
empty , let V be result.[[Value]]. - Perform ?
CreatePerIterationEnvironment (perIterationBindings). - If increment is not
[empty] , then- Let incRef be the result of evaluating increment.
- Perform ?
GetValue (incRef).
- If test is not
13.7.4.9Runtime Semantics: CreatePerIterationEnvironment( perIterationBindings )#
The abstract operation CreatePerIterationEnvironment with argument perIterationBindings is performed as follows:
- If perIterationBindings has any elements, then
- Let lastIterationEnv be the
running execution context 's LexicalEnvironment. - Let lastIterationEnvRec be lastIterationEnv's
EnvironmentRecord . - Let outer be lastIterationEnv's outer environment reference.
- Assert: outer is not
null . - Let thisIterationEnv be
NewDeclarativeEnvironment (outer). - Let thisIterationEnvRec be thisIterationEnv's
EnvironmentRecord . - For each element bn of perIterationBindings do,
- Perform ! thisIterationEnvRec.CreateMutableBinding(bn,
false ). - Let lastValue be ? lastIterationEnvRec.GetBindingValue(bn,
true ). - Perform thisIterationEnvRec.InitializeBinding(bn, lastValue).
- Perform ! thisIterationEnvRec.CreateMutableBinding(bn,
- Set the
running execution context 's LexicalEnvironment to thisIterationEnv.
- Let lastIterationEnv be the
- Return
undefined .
13.7.5The for-in and for-of Statements#
13.7.5.1Static Semantics: Early Errors#
-
It is a Syntax Error if
LeftHandSideExpression is either anObjectLiteral or anArrayLiteral and if the lexical token sequence matched byLeftHandSideExpression cannot be parsed with no tokens left over usingAssignmentPattern as the goal symbol.
If
-
It is a Syntax Error if IsValidSimpleAssignmentTarget of
LeftHandSideExpression isfalse . -
It is a Syntax Error if the
LeftHandSideExpression is andCoverParenthesizedExpressionAndArrowParameterList : ( Expression ) Expression derives a production that would produce a Syntax Error according to these rules if that production is substituted forLeftHandSideExpression . This rule is recursively applied.
The last rule means that the other rules are applied even if parentheses surround
-
It is a Syntax Error if the BoundNames of
ForDeclaration contains"let". -
It is a Syntax Error if any element of the BoundNames of
ForDeclaration also occurs in the VarDeclaredNames ofStatement . -
It is a Syntax Error if the BoundNames of
ForDeclaration contains any duplicate entries.
13.7.5.2Static Semantics: BoundNames#
- Return the BoundNames of
ForBinding .
13.7.5.3Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Return ContainsDuplicateLabels of
Statement with argument labelSet.
13.7.5.4Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Return ContainsUndefinedBreakTarget of
Statement with argument labelSet.
13.7.5.5Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Return ContainsUndefinedContinueTarget of
Statement with arguments iterationSet and « ».
13.7.5.6Static Semantics: IsDestructuring#
- Return IsDestructuring of
ForBinding .
- Return
false .
- Return
true .
13.7.5.7Static Semantics: VarDeclaredNames#
- Return the VarDeclaredNames of
Statement .
- Let names be the BoundNames of
ForBinding . - Append to names the elements of the VarDeclaredNames of
Statement . - Return names.
- Return the VarDeclaredNames of
Statement .
- Return the VarDeclaredNames of
Statement .
- Let names be the BoundNames of
ForBinding . - Append to names the elements of the VarDeclaredNames of
Statement . - Return names.
- Return the VarDeclaredNames of
Statement .
13.7.5.8Static Semantics: VarScopedDeclarations#
- Return the VarScopedDeclarations of
Statement .
- Let declarations be a
List containingForBinding . - Append to declarations the elements of the VarScopedDeclarations of
Statement . - Return declarations.
- Return the VarScopedDeclarations of
Statement .
- Return the VarScopedDeclarations of
Statement .
- Let declarations be a
List containingForBinding . - Append to declarations the elements of the VarScopedDeclarations of
Statement . - Return declarations.
- Return the VarScopedDeclarations of
Statement .
13.7.5.9Runtime Semantics: BindingInitialization#
With arguments value and environment.
var statements and the formal parameter lists of some non-strict functions (see
- Return the result of performing BindingInitialization for
ForBinding passing value and environment as the arguments.
13.7.5.10Runtime Semantics: BindingInstantiation#
With argument environment.
- Let envRec be environment's
EnvironmentRecord . - Assert: envRec is a declarative
Environment Record . - For each element name of the BoundNames of
ForBinding do- If IsConstantDeclaration of
LetOrConst istrue , then- Perform ! envRec.CreateImmutableBinding(name,
true ).
- Perform ! envRec.CreateImmutableBinding(name,
- Else,
- Perform ! envRec.CreateMutableBinding(name,
false ).
- Perform ! envRec.CreateMutableBinding(name,
- If IsConstantDeclaration of
13.7.5.11Runtime Semantics: LabelledEvaluation#
With argument labelSet.
- Let keyResult be ?
ForIn/OfHeadEvaluation (« »,Expression ,enumerate ). - Return ?
ForIn/OfBodyEvaluation (LeftHandSideExpression ,Statement , keyResult,assignment , labelSet).
- Let keyResult be ?
ForIn/OfHeadEvaluation (« »,Expression ,enumerate ). - Return ?
ForIn/OfBodyEvaluation (ForBinding ,Statement , keyResult,varBinding , labelSet).
- Let keyResult be the result of performing ?
ForIn/OfHeadEvaluation (BoundNames ofForDeclaration ,Expression ,enumerate ). - Return ?
ForIn/OfBodyEvaluation (ForDeclaration ,Statement , keyResult,lexicalBinding , labelSet).
- Let keyResult be the result of performing ?
ForIn/OfHeadEvaluation (« »,AssignmentExpression ,iterate ). - Return ?
ForIn/OfBodyEvaluation (LeftHandSideExpression ,Statement , keyResult,assignment , labelSet).
- Let keyResult be the result of performing ?
ForIn/OfHeadEvaluation (« »,AssignmentExpression ,iterate ). - Return ?
ForIn/OfBodyEvaluation (ForBinding ,Statement , keyResult,varBinding , labelSet).
- Let keyResult be the result of performing ?
ForIn/OfHeadEvaluation (BoundNames ofForDeclaration ,AssignmentExpression ,iterate ). - Return ?
ForIn/OfBodyEvaluation (ForDeclaration ,Statement , keyResult,lexicalBinding , labelSet).
13.7.5.12Runtime Semantics: ForIn/OfHeadEvaluation ( TDZnames, expr, iterationKind)#
The abstract operation ForIn/OfHeadEvaluation is called with arguments TDZnames, expr, and iterationKind. The value of iterationKind is either
- Let oldEnv be the
running execution context 's LexicalEnvironment. - If TDZnames is not an empty
List , then- Assert: TDZnames has no duplicate entries.
- Let TDZ be
NewDeclarativeEnvironment (oldEnv). - Let TDZEnvRec be TDZ's
EnvironmentRecord . - For each string name in TDZnames, do
- Perform ! TDZEnvRec.CreateMutableBinding(name,
false ).
- Perform ! TDZEnvRec.CreateMutableBinding(name,
- Set the
running execution context 's LexicalEnvironment to TDZ.
- Let exprRef be the result of evaluating expr.
- Set the
running execution context 's LexicalEnvironment to oldEnv. - Let exprValue be ?
GetValue (exprRef). - If iterationKind is
enumerate , then- If exprValue.[[Value]] is
null orundefined , then- Return
Completion {[[Type]]:break , [[Value]]:empty , [[Target]]:empty }.
- Return
- Let obj be
ToObject (exprValue). - Return ?
EnumerateObjectProperties (obj).
- If exprValue.[[Value]] is
- Else,
- Assert: iterationKind is
iterate . - Return ?
GetIterator (exprValue).
- Assert: iterationKind is
13.7.5.13Runtime Semantics: ForIn/OfBodyEvaluation ( lhs, stmt, iterator, lhsKind, labelSet )#
The abstract operation ForIn/OfBodyEvaluation is called with arguments lhs, stmt, iterator, lhsKind, and labelSet. The value of lhsKind is either
- Let oldEnv be the
running execution context 's LexicalEnvironment. - Let V be
undefined . - Let destructuring be IsDestructuring of lhs.
- If destructuring is
true and if lhsKind isassignment , then- Assert: lhs is a
LeftHandSideExpression . - Let assignmentPattern be the parse of the source text corresponding to lhs using
AssignmentPattern as the goal symbol.
- Assert: lhs is a
- Repeat
- Let nextResult be ?
IteratorStep (iterator). - If nextResult is
false , returnNormalCompletion (V). - Let nextValue be ?
IteratorValue (nextResult). - If lhsKind is either
assignment orvarBinding , then- If destructuring is
false , then- Let lhsRef be the result of evaluating lhs. (It may be evaluated repeatedly.)
- If destructuring is
- Else,
- Assert: lhsKind is
lexicalBinding . - Assert: lhs is a
ForDeclaration . - Let iterationEnv be
NewDeclarativeEnvironment (oldEnv). - Perform BindingInstantiation for lhs passing iterationEnv as the argument.
- Set the
running execution context 's LexicalEnvironment to iterationEnv. - If destructuring is
false , then- Assert: lhs binds a single name.
- Let lhsName be the sole element of BoundNames of lhs.
- Let lhsRef be !
ResolveBinding (lhsName).
- Assert: lhsKind is
- If destructuring is
false , then- If lhsRef is an
abrupt completion , then- Let status be lhsRef.
- Else if lhsKind is
lexicalBinding , then- Let status be
InitializeReferencedBinding (lhsRef, nextValue).
- Let status be
- Else,
- Let status be
PutValue (lhsRef, nextValue).
- Let status be
- If lhsRef is an
- Else,
- If lhsKind is
assignment , then- Let status be the result of performing DestructuringAssignmentEvaluation of assignmentPattern using nextValue as the argument.
- Else if lhsKind is
varBinding , then- Assert: lhs is a
ForBinding . - Let status be the result of performing BindingInitialization for lhs passing nextValue and
undefined as the arguments.
- Assert: lhs is a
- Else,
- Assert: lhsKind is
lexicalBinding . - Assert: lhs is a
ForDeclaration . - Let status be the result of performing BindingInitialization for lhs passing nextValue and iterationEnv as arguments.
- Assert: lhsKind is
- If lhsKind is
- If status is an
abrupt completion , then- Set the
running execution context 's LexicalEnvironment to oldEnv. - Return ?
IteratorClose (iterator, status).
- Set the
- Let result be the result of evaluating stmt.
- Set the
running execution context 's LexicalEnvironment to oldEnv. - If
LoopContinues (result, labelSet) isfalse , return ?IteratorClose (iterator,UpdateEmpty (result, V)). - If result.[[Value]] is not
empty , let V be result.[[Value]].
- Let nextResult be ?
13.7.5.14Runtime Semantics: Evaluation#
- Let bindingId be StringValue of
BindingIdentifier . - Return ?
ResolveBinding (bindingId).
13.7.5.15EnumerateObjectProperties (O)#
When the abstract operation EnumerateObjectProperties is called with argument O, the following steps are taken:
- Assert:
Type (O) is Object. - Return an Iterator object (
25.1.1.2 ) whosenextmethod iterates over all the String-valued keys of enumerable properties of O. The iterator object is never directly accessible to ECMAScript code. The mechanics and order of enumerating the properties is not specified but must conform to the rules specified below.
The iterator's throw and return methods are 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.
The following is an informative definition of an ECMAScript generator function that conforms to these rules:
function* EnumerateObjectProperties(obj) {
let visited = new Set;
for (let key of Reflect.ownKeys(obj)) {
if (typeof key === "string") {
let desc = Reflect.getOwnPropertyDescriptor(obj, key);
if (desc && !visited.has(key)) {
visited.add(key);
if (desc.enumerable) yield key;
}
}
}
let proto = Reflect.getPrototypeOf(obj)
if (proto === null) return;
for (let protoName of EnumerateObjectProperties(proto)) {
if (!visited.has(protoName)) yield protoName;
}
}
13.8The continue Statement#
Syntax
13.8.1Static Semantics: Early Errors#
-
It is a Syntax Error if this production is not nested, directly or indirectly (but not crossing function boundaries), within an
IterationStatement .
13.8.2Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Return
false .
- If the StringValue of
LabelIdentifier is not an element of iterationSet, returntrue . - Return
false .
13.8.3Runtime Semantics: Evaluation#
- Return
Completion {[[Type]]:continue , [[Value]]:empty , [[Target]]:empty }.
- Let label be the StringValue of
LabelIdentifier . - Return
Completion {[[Type]]:continue , [[Value]]:empty , [[Target]]: label }.
13.9The break Statement#
Syntax
13.9.1Static Semantics: Early Errors#
-
It is a Syntax Error if this production is not nested, directly or indirectly (but not crossing function boundaries), within an
IterationStatement or aSwitchStatement .
13.9.2Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Return
false .
- If the StringValue of
LabelIdentifier is not an element of labelSet, returntrue . - Return
false .
13.9.3Runtime Semantics: Evaluation#
- Return
Completion {[[Type]]:break , [[Value]]:empty , [[Target]]:empty }.
- Let label be the StringValue of
LabelIdentifier . - Return
Completion {[[Type]]:break , [[Value]]:empty , [[Target]]: label }.
13.10The return Statement#
Syntax
A return statement causes a function to cease execution and return a value to the caller. If
13.10.1Runtime Semantics: Evaluation#
- Return
Completion {[[Type]]:return , [[Value]]:undefined , [[Target]]:empty }.
- Let exprRef be the result of evaluating
Expression . - Let exprValue be ?
GetValue (exprRef). - Return
Completion {[[Type]]:return , [[Value]]: exprValue, [[Target]]:empty }.
13.11The with Statement#
Syntax
The with statement adds an object
13.11.1Static Semantics: Early Errors#
- It is a Syntax Error if the code that matches this production is contained in strict code.
-
It is a Syntax Error if
IsLabelledFunction (Statement ) istrue .
It is only necessary to apply the second rule if the extension specified in
13.11.2Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Return ContainsDuplicateLabels of
Statement with argument labelSet.
13.11.3Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Return ContainsUndefinedBreakTarget of
Statement with argument labelSet.
13.11.4Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Return ContainsUndefinedContinueTarget of
Statement with arguments iterationSet and « ».
13.11.5Static Semantics: VarDeclaredNames#
- Return the VarDeclaredNames of
Statement .
13.11.6Static Semantics: VarScopedDeclarations#
- Return the VarScopedDeclarations of
Statement .
13.11.7Runtime Semantics: Evaluation#
- Let val be the result of evaluating
Expression . - Let obj be ?
ToObject (?GetValue (val)). - Let oldEnv be the
running execution context 's LexicalEnvironment. - Let newEnv be
NewObjectEnvironment (obj, oldEnv). - Set the withEnvironment flag of newEnv's
EnvironmentRecord totrue . - Set the
running execution context 's LexicalEnvironment to newEnv. - Let C be the result of evaluating
Statement . - Set the
running execution context 's LexicalEnvironment to oldEnv. - Return
Completion (UpdateEmpty (C,undefined )).
No matter how control leaves the embedded
13.12The switch Statement#
Syntax
13.12.1Static Semantics: Early Errors#
13.12.2Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Return ContainsDuplicateLabels of
CaseBlock with argument labelSet.
- Return
false .
- If the first
CaseClauses is present, then- Let hasDuplicates be ContainsDuplicateLabels of the first
CaseClauses with argument labelSet. - If hasDuplicates is
true , returntrue .
- Let hasDuplicates be ContainsDuplicateLabels of the first
- Let hasDuplicates be ContainsDuplicateLabels of
DefaultClause with argument labelSet. - If hasDuplicates is
true , returntrue . - If the second
CaseClauses is not present, returnfalse . - Return ContainsDuplicateLabels of the second
CaseClauses with argument labelSet.
- Let hasDuplicates be ContainsDuplicateLabels of
CaseClauses with argument labelSet. - If hasDuplicates is
true , returntrue . - Return ContainsDuplicateLabels of
CaseClause with argument labelSet.
- If the
StatementList is present, return ContainsDuplicateLabels ofStatementList with argument labelSet. - Else return
false .
- If the
StatementList is present, return ContainsDuplicateLabels ofStatementList with argument labelSet. - Else return
false .
13.12.3Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Return ContainsUndefinedBreakTarget of
CaseBlock with argument labelSet.
- Return
false .
- If the first
CaseClauses is present, then- Let hasUndefinedLabels be ContainsUndefinedBreakTarget of the first
CaseClauses with argument labelSet. - If hasUndefinedLabels is
true , returntrue .
- Let hasUndefinedLabels be ContainsUndefinedBreakTarget of the first
- Let hasUndefinedLabels be ContainsUndefinedBreakTarget of
DefaultClause with argument labelSet. - If hasUndefinedLabels is
true , returntrue . - If the second
CaseClauses is not present, returnfalse . - Return ContainsUndefinedBreakTarget of the second
CaseClauses with argument labelSet.
- Let hasUndefinedLabels be ContainsUndefinedBreakTarget of
CaseClauses with argument labelSet. - If hasUndefinedLabels is
true , returntrue . - Return ContainsUndefinedBreakTarget of
CaseClause with argument labelSet.
- If the
StatementList is present, return ContainsUndefinedBreakTarget ofStatementList with argument labelSet. - Else return
false .
- If the
StatementList is present, return ContainsUndefinedBreakTarget ofStatementList with argument labelSet. - Else return
false .
13.12.4Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Return ContainsUndefinedContinueTarget of
CaseBlock with arguments iterationSet and « ».
- Return
false .
- If the first
CaseClauses is present, then- Let hasUndefinedLabels be ContainsUndefinedContinueTarget of the first
CaseClauses with arguments iterationSet and « ». - If hasUndefinedLabels is
true , returntrue .
- Let hasUndefinedLabels be ContainsUndefinedContinueTarget of the first
- Let hasUndefinedLabels be ContainsUndefinedContinueTarget of
DefaultClause with arguments iterationSet and « ». - If hasUndefinedLabels is
true , returntrue . - If the second
CaseClauses is not present, returnfalse . - Return ContainsUndefinedContinueTarget of the second
CaseClauses with arguments iterationSet and « ».
- Let hasUndefinedLabels be ContainsUndefinedContinueTarget of
CaseClauses with arguments iterationSet and « ». - If hasUndefinedLabels is
true , returntrue . - Return ContainsUndefinedContinueTarget of
CaseClause with arguments iterationSet and « ».
- If the
StatementList is present, return ContainsUndefinedContinueTarget ofStatementList with arguments iterationSet and « ». - Else return
false .
- If the
StatementList is present, return ContainsUndefinedContinueTarget ofStatementList with arguments iterationSet and « ». - Else return
false .
13.12.5Static Semantics: LexicallyDeclaredNames#
- Return a new empty
List .
- If the first
CaseClauses is present, let names be the LexicallyDeclaredNames of the firstCaseClauses . - Else let names be a new empty
List . - Append to names the elements of the LexicallyDeclaredNames of the
DefaultClause . - If the second
CaseClauses is not present, return names. - Else return the result of appending to names the elements of the LexicallyDeclaredNames of the second
CaseClauses .
- Let names be LexicallyDeclaredNames of
CaseClauses . - Append to names the elements of the LexicallyDeclaredNames of
CaseClause . - Return names.
- If the
StatementList is present, return the LexicallyDeclaredNames ofStatementList . - Else return a new empty
List .
- If the
StatementList is present, return the LexicallyDeclaredNames ofStatementList . - Else return a new empty
List .
13.12.6Static Semantics: LexicallyScopedDeclarations#
- Return a new empty
List .
- If the first
CaseClauses is present, let declarations be the LexicallyScopedDeclarations of the firstCaseClauses . - Else let declarations be a new empty
List . - Append to declarations the elements of the LexicallyScopedDeclarations of the
DefaultClause . - If the second
CaseClauses is not present, return declarations. - Else return the result of appending to declarations the elements of the LexicallyScopedDeclarations of the second
CaseClauses .
- Let declarations be LexicallyScopedDeclarations of
CaseClauses . - Append to declarations the elements of the LexicallyScopedDeclarations of
CaseClause . - Return declarations.
- If the
StatementList is present, return the LexicallyScopedDeclarations ofStatementList . - Else return a new empty
List .
- If the
StatementList is present, return the LexicallyScopedDeclarations ofStatementList . - Else return a new empty
List .
13.12.7Static Semantics: VarDeclaredNames#
- Return the VarDeclaredNames of
CaseBlock .
- Return a new empty
List .
- If the first
CaseClauses is present, let names be the VarDeclaredNames of the firstCaseClauses . - Else let names be a new empty
List . - Append to names the elements of the VarDeclaredNames of the
DefaultClause . - If the second
CaseClauses is not present, return names. - Else return the result of appending to names the elements of the VarDeclaredNames of the second
CaseClauses .
- Let names be VarDeclaredNames of
CaseClauses . - Append to names the elements of the VarDeclaredNames of
CaseClause . - Return names.
- If the
StatementList is present, return the VarDeclaredNames ofStatementList . - Else return a new empty
List .
- If the
StatementList is present, return the VarDeclaredNames ofStatementList . - Else return a new empty
List .
13.12.8Static Semantics: VarScopedDeclarations#
- Return the VarScopedDeclarations of
CaseBlock .
- Return a new empty
List .
- If the first
CaseClauses is present, let declarations be the VarScopedDeclarations of the firstCaseClauses . - Else let declarations be a new empty
List . - Append to declarations the elements of the VarScopedDeclarations of the
DefaultClause . - If the second
CaseClauses is not present, return declarations. - Else return the result of appending to declarations the elements of the VarScopedDeclarations of the second
CaseClauses .
- Let declarations be VarScopedDeclarations of
CaseClauses . - Append to declarations the elements of the VarScopedDeclarations of
CaseClause . - Return declarations.
- If the
StatementList is present, return the VarScopedDeclarations ofStatementList . - Else return a new empty
List .
- If the
StatementList is present, return the VarScopedDeclarations ofStatementList . - Else return a new empty
List .
13.12.9Runtime Semantics: CaseBlockEvaluation#
With argument input.
- Return
NormalCompletion (undefined ).
- Let V be
undefined . - Let A be the
List ofCaseClause items inCaseClauses , in source text order. - Let found be
false . - Repeat for each
CaseClause C in A,- If found is
false , then- Let clauseSelector be the result of CaseSelectorEvaluation of C.
ReturnIfAbrupt (clauseSelector).- Let found be the result of performing
Strict Equality Comparison input === clauseSelector.[[Value]].
- If found is
true , then- Let R be the result of evaluating C.
- If R.[[Value]] is not
empty , let V be R.[[Value]]. - If R is an
abrupt completion , returnCompletion (UpdateEmpty (R, V)).
- If found is
- Return
NormalCompletion (V).
- Let V be
undefined . - Let A be the
List ofCaseClause items in the firstCaseClauses , in source text order. If the firstCaseClauses is not present, A is « ». - Let found be
false . - Repeat for each
CaseClause C in A- If found is
false , then- Let clauseSelector be the result of CaseSelectorEvaluation of C.
ReturnIfAbrupt (clauseSelector).- Let found be the result of performing
Strict Equality Comparison input === clauseSelector.[[Value]].
- If found is
true , then- Let R be the result of evaluating C.
- If R.[[Value]] is not
empty , let V be R.[[Value]]. - If R is an
abrupt completion , returnCompletion (UpdateEmpty (R, V)).
- If found is
- Let foundInB be
false . - Let B be the
List containing theCaseClause items in the secondCaseClauses , in source text order. If the secondCaseClauses is not present, B is « ». - If found is
false , then- Repeat for each
CaseClause C in B- If foundInB is
false , then- Let clauseSelector be the result of CaseSelectorEvaluation of C.
ReturnIfAbrupt (clauseSelector).- Let foundInB be the result of performing
Strict Equality Comparison input === clauseSelector.[[Value]].
- If foundInB is
true , then- Let R be the result of evaluating
CaseClause C. - If R.[[Value]] is not
empty , let V be R.[[Value]]. - If R is an
abrupt completion , returnCompletion (UpdateEmpty (R, V)).
- Let R be the result of evaluating
- If foundInB is
- Repeat for each
- If foundInB is
true , returnNormalCompletion (V). - Let R be the result of evaluating
DefaultClause . - If R.[[Value]] is not
empty , let V be R.[[Value]]. - If R is an
abrupt completion , returnCompletion (UpdateEmpty (R, V)). - Repeat for each
CaseClause C in B (NOTE this is another complete iteration of the secondCaseClauses )- Let R be the result of evaluating
CaseClause C. - If R.[[Value]] is not
empty , let V be R.[[Value]]. - If R is an
abrupt completion , returnCompletion (UpdateEmpty (R, V)).
- Let R be the result of evaluating
- Return
NormalCompletion (V).
13.12.10Runtime Semantics: CaseSelectorEvaluation#
- Let exprRef be the result of evaluating
Expression . - Return ?
GetValue (exprRef).
CaseSelectorEvaluation does not execute the associated
13.12.11Runtime Semantics: Evaluation#
- Let exprRef be the result of evaluating
Expression . - Let switchValue be ?
GetValue (exprRef). - Let oldEnv be the
running execution context 's LexicalEnvironment. - Let blockEnv be
NewDeclarativeEnvironment (oldEnv). - Perform
BlockDeclarationInstantiation (CaseBlock , blockEnv). - Set the
running execution context 's LexicalEnvironment to blockEnv. - Let R be the result of performing CaseBlockEvaluation of
CaseBlock with argument switchValue. - Set the
running execution context 's LexicalEnvironment to oldEnv. - Return R.
No matter how control leaves the
- Return
NormalCompletion (empty ).
- Return the result of evaluating
StatementList .
- Return
NormalCompletion (empty ).
- Return the result of evaluating
StatementList .
13.13Labelled Statements#
Syntax
A break and continue statements. ECMAScript has no goto statement. A
13.13.1Static Semantics: Early Errors#
- It is a Syntax Error if any source text matches this rule.
An alternative definition for this rule is provided in
13.13.2Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Let label be the StringValue of
LabelIdentifier . - If label is an element of labelSet, return
true . - Let newLabelSet be a copy of labelSet with label appended.
- Return ContainsDuplicateLabels of
LabelledItem with argument newLabelSet.
- Return
false .
13.13.3Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Let label be the StringValue of
LabelIdentifier . - Let newLabelSet be a copy of labelSet with label appended.
- Return ContainsUndefinedBreakTarget of
LabelledItem with argument newLabelSet.
- Return
false .
13.13.4Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Let label be the StringValue of
LabelIdentifier . - Let newLabelSet be a copy of labelSet with label appended.
- Return ContainsUndefinedContinueTarget of
LabelledItem with arguments iterationSet and newLabelSet.
- Return
false .
13.13.5Static Semantics: IsLabelledFunction ( stmt )#
The abstract operation IsLabelledFunction with argument stmt performs the following steps:
- If stmt is not a
LabelledStatement , returnfalse . - Let item be the
LabelledItem component of stmt. - If item is
, returnLabelledItem : FunctionDeclaration true . - Let subStmt be the
Statement component of item. - Return
IsLabelledFunction (subStmt).
13.13.6Static Semantics: LexicallyDeclaredNames#
- Return the LexicallyDeclaredNames of
LabelledItem .
- Return a new empty
List .
- Return BoundNames of
FunctionDeclaration .
13.13.7Static Semantics: LexicallyScopedDeclarations#
- Return the LexicallyScopedDeclarations of
LabelledItem .
- Return a new empty
List .
- Return a new
List containingFunctionDeclaration .
13.13.8Static Semantics: TopLevelLexicallyDeclaredNames#
- Return a new empty
List .
13.13.9Static Semantics: TopLevelLexicallyScopedDeclarations#
- Return a new empty
List .
13.13.10Static Semantics: TopLevelVarDeclaredNames#
- Return the TopLevelVarDeclaredNames of
LabelledItem .
- If
Statement is , return TopLevelVarDeclaredNames ofStatement : LabelledStatement Statement . - Return VarDeclaredNames of
Statement .
- Return BoundNames of
FunctionDeclaration .
13.13.11Static Semantics: TopLevelVarScopedDeclarations#
- Return the TopLevelVarScopedDeclarations of
LabelledItem .
- If
Statement is , return TopLevelVarScopedDeclarations ofStatement : LabelledStatement Statement . - Return VarScopedDeclarations of
Statement .
- Return a new
List containingFunctionDeclaration .
13.13.12Static Semantics: VarDeclaredNames#
- Return the VarDeclaredNames of
LabelledItem .
- Return a new empty
List .
13.13.13Static Semantics: VarScopedDeclarations#
- Return the VarScopedDeclarations of
LabelledItem .
- Return a new empty
List .
13.13.14Runtime Semantics: LabelledEvaluation#
With argument labelSet.
- Let label be the StringValue of
LabelIdentifier . - Append label as an element of labelSet.
- Let stmtResult be LabelledEvaluation of
LabelledItem with argument labelSet. - If stmtResult.[[Type]] is
break andSameValue (stmtResult.[[Target]], label) istrue , then- Let stmtResult be
NormalCompletion (stmtResult.[[Value]]).
- Let stmtResult be
- Return
Completion (stmtResult).
- If
Statement is either aLabelledStatement or aBreakableStatement , then- Return LabelledEvaluation of
Statement with argument labelSet.
- Return LabelledEvaluation of
- Else,
- Return the result of evaluating
Statement .
- Return the result of evaluating
- Return the result of evaluating
FunctionDeclaration .
13.13.15Runtime Semantics: Evaluation#
- Let newLabelSet be a new empty
List . - Return LabelledEvaluation of this
LabelledStatement with argument newLabelSet.
13.14The throw Statement#
Syntax
13.14.1Runtime Semantics: Evaluation#
- Let exprRef be the result of evaluating
Expression . - Let exprValue be ?
GetValue (exprRef). - Return
Completion {[[Type]]:throw , [[Value]]: exprValue, [[Target]]:empty }.
13.15The try Statement#
Syntax
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
13.15.1Static Semantics: Early Errors#
-
It is a Syntax Error if BoundNames of
CatchParameter contains any duplicate elements. -
It is a Syntax Error if any element of the BoundNames of
CatchParameter also occurs in the LexicallyDeclaredNames ofBlock . -
It is a Syntax Error if any element of the BoundNames of
CatchParameter also occurs in the VarDeclaredNames ofBlock .
An alternative static semantics for this production is given in
13.15.2Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Return ContainsDuplicateLabels of
Block with argument labelSet.
13.15.3Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Let hasUndefinedLabels be ContainsUndefinedBreakTarget of
Block with argument labelSet. - If hasUndefinedLabels is
true , returntrue . - Let hasUndefinedLabels be ContainsUndefinedBreakTarget of
Catch with argument labelSet. - If hasUndefinedLabels is
true , returntrue . - Return ContainsUndefinedBreakTarget of
Finally with argument labelSet.
- Return ContainsUndefinedBreakTarget of
Block with argument labelSet.
13.15.4Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Let hasUndefinedLabels be ContainsUndefinedContinueTarget of
Block with arguments iterationSet and « ». - If hasUndefinedLabels is
true , returntrue . - Let hasUndefinedLabels be ContainsUndefinedContinueTarget of
Catch with arguments iterationSet and « ». - If hasUndefinedLabels is
true , returntrue . - Return ContainsUndefinedContinueTarget of
Finally with arguments iterationSet and « ».
- Return ContainsUndefinedContinueTarget of
Block with arguments iterationSet and « ».
13.15.5Static Semantics: VarDeclaredNames#
- Return the VarDeclaredNames of
Block .
13.15.6Static Semantics: VarScopedDeclarations#
- Return the VarScopedDeclarations of
Block .
13.15.7Runtime Semantics: CatchClauseEvaluation#
with parameter thrownValue
- Let oldEnv be the
running execution context 's LexicalEnvironment. - Let catchEnv be
NewDeclarativeEnvironment (oldEnv). - Let catchEnvRec be catchEnv's
EnvironmentRecord . - For each element argName of the BoundNames of
CatchParameter , do- Perform ! catchEnvRec.CreateMutableBinding(argName,
false ).
- Perform ! catchEnvRec.CreateMutableBinding(argName,
- Set the
running execution context 's LexicalEnvironment to catchEnv. - Let status be the result of performing BindingInitialization for
CatchParameter passing thrownValue and catchEnv as arguments. - If status is an
abrupt completion , then- Set the
running execution context 's LexicalEnvironment to oldEnv. - Return
Completion (status).
- Set the
- Let B be the result of evaluating
Block . - Set the
running execution context 's LexicalEnvironment to oldEnv. - Return
Completion (B).
No matter how control leaves the
13.15.8Runtime Semantics: Evaluation#
- Let B be the result of evaluating
Block . - If B.[[Type]] is
throw , let C be CatchClauseEvaluation ofCatch with parameter B.[[Value]]. - Else, let C be B.
- Return
Completion (UpdateEmpty (C,undefined )).
- Let B be the result of evaluating
Block . - Let F be the result of evaluating
Finally . - If F.[[Type]] is
normal , let F be B. - Return
Completion (UpdateEmpty (F,undefined )).
- Let B be the result of evaluating
Block . - If B.[[Type]] is
throw , let C be CatchClauseEvaluation ofCatch with parameter B.[[Value]]. - Else, let C be B.
- Let F be the result of evaluating
Finally . - If F.[[Type]] is
normal , let F be C. - Return
Completion (UpdateEmpty (F,undefined )).
13.16The debugger Statement#
Syntax
13.16.1Runtime Semantics: Evaluation#
Evaluating the
- If an implementation defined debugging facility is available and enabled, then
- Perform an implementation defined debugging action.
- Let result be an implementation defined
Completion value.
- Else,
- Let result be
NormalCompletion (empty ).
- Let result be
- Return result.
14ECMAScript Language: Functions and Classes#
Various ECMAScript language elements cause the creation of ECMAScript function objects (
14.1Function Definitions#
Syntax
14.1.1Directive Prologues and the Use Strict Directive#
A Directive Prologue is the longest sequence of
A Use Strict Directive is an "use strict" or 'use strict'. A Use Strict Directive may not contain an
A Directive Prologue may contain more than one Use Strict Directive. However, an implementation may issue a warning if this occurs.
The
14.1.2Static Semantics: Early Errors#
-
If the source code matching this production is strict code, the Early Error rules for
are applied.StrictFormalParameters : FormalParameters -
If the source code matching this production is strict code, it is a Syntax Error if
BindingIdentifier is theIdentifierName evalor theIdentifierName arguments. -
It is a Syntax Error if ContainsUseStrict of
FunctionBody istrue and IsSimpleParameterList ofFormalParameters isfalse . -
It is a Syntax Error if any element of the BoundNames of
FormalParameters also occurs in the LexicallyDeclaredNames ofFunctionBody . -
It is a Syntax Error if
FormalParameters ContainsSuperProperty istrue . -
It is a Syntax Error if
FunctionBody ContainsSuperProperty istrue . -
It is a Syntax Error if
FormalParameters ContainsSuperCall istrue . -
It is a Syntax Error if
FunctionBody ContainsSuperCall istrue .
The LexicallyDeclaredNames of a
-
It is a Syntax Error if BoundNames of
FormalParameters contains any duplicate elements.
-
It is a Syntax Error if IsSimpleParameterList of
FormalParameterList isfalse and BoundNames ofFormalParameterList contains any duplicate elements.
Multiple occurrences of the same
-
It is a Syntax Error if the LexicallyDeclaredNames of
FunctionStatementList contains any duplicate entries. -
It is a Syntax Error if any element of the LexicallyDeclaredNames of
FunctionStatementList also occurs in the VarDeclaredNames ofFunctionStatementList . -
It is a Syntax Error if ContainsDuplicateLabels of
FunctionStatementList with argument « » istrue . -
It is a Syntax Error if ContainsUndefinedBreakTarget of
FunctionStatementList with argument « » istrue . -
It is a Syntax Error if ContainsUndefinedContinueTarget of
FunctionStatementList with arguments « » and « » istrue .
14.1.3Static Semantics: BoundNames#
- Return the BoundNames of
BindingIdentifier .
- Return «
"*default*"».
"*default*" is used within this specification as a synthetic name for hoistable anonymous functions that are defined using export declarations.
- Return a new empty
List .
- Let names be BoundNames of
FormalsList . - Append to names the BoundNames of
FunctionRestParameter . - Return names.
- Let names be BoundNames of
FormalsList . - Append to names the elements of BoundNames of
FormalParameter . - Return names.
14.1.4Static Semantics: Contains#
With parameter symbol.
- Return
false .
Static semantic rules that depend upon substructure generally do not look into function definitions.
14.1.5Static Semantics: ContainsExpression#
- Return
false .
- Return ContainsExpression of
FunctionRestParameter .
- If ContainsExpression of
FormalsList istrue , returntrue . - Return ContainsExpression of
FunctionRestParameter .
- If ContainsExpression of
FormalsList istrue , returntrue . - Return ContainsExpression of
FormalParameter .
14.1.6Static Semantics: ContainsUseStrict#
- If the
Directive Prologue ofFunctionStatementList contains aUse Strict Directive , returntrue ; otherwise, returnfalse .
14.1.7Static Semantics: ExpectedArgumentCount#
- Return 0.
- Return 0.
- Return the ExpectedArgumentCount of
FormalsList .
The ExpectedArgumentCount of a
- If HasInitializer of
FormalParameter istrue , return 0. - Return 1.
- Let count be the ExpectedArgumentCount of
FormalsList . - If HasInitializer of
FormalsList istrue or HasInitializer ofFormalParameter istrue , return count. - Return count+1.
14.1.8Static Semantics: HasInitializer#
- If HasInitializer of
FormalsList istrue , returntrue . - Return HasInitializer of
FormalParameter .
14.1.9Static Semantics: HasName#
- Return
false .
- Return
true .
14.1.10Static Semantics: IsAnonymousFunctionDefinition ( production )#
The abstract operation IsAnonymousFunctionDefinition determines if its argument is a function definition that does not bind a name. The argument production is the result of parsing an
- If IsFunctionDefinition of production is
false , returnfalse . - Let hasName be the result of HasName of production.
- If hasName is
true , returnfalse . - Return
true .
14.1.11Static Semantics: IsConstantDeclaration#
- Return
false .
14.1.12Static Semantics: IsFunctionDefinition#
- Return
true .
14.1.13Static Semantics: IsSimpleParameterList#
- Return
true .
- Return
false .
- Return
false .
- If IsSimpleParameterList of
FormalsList isfalse , returnfalse . - Return IsSimpleParameterList of
FormalParameter .
- Return IsSimpleParameterList of
BindingElement .
14.1.14Static Semantics: LexicallyDeclaredNames#
- Return a new empty
List .
- Return TopLevelLexicallyDeclaredNames of
StatementList .
14.1.15Static Semantics: LexicallyScopedDeclarations#
- Return a new empty
List .
- Return the TopLevelLexicallyScopedDeclarations of
StatementList .
14.1.16Static Semantics: VarDeclaredNames#
- Return a new empty
List .
- Return TopLevelVarDeclaredNames of
StatementList .
14.1.17Static Semantics: VarScopedDeclarations#
- Return a new empty
List .
- Return the TopLevelVarScopedDeclarations of
StatementList .
14.1.18Runtime Semantics: EvaluateBody#
With parameter functionObject.
- Return the result of evaluating
FunctionStatementList .
14.1.19Runtime Semantics: IteratorBindingInitialization#
With parameters iteratorRecord and environment.
When
- Return
NormalCompletion (empty ).
- Let restIndex be the result of performing IteratorBindingInitialization for
FormalsList using iteratorRecord and environment as the arguments. ReturnIfAbrupt (restIndex).- Return the result of performing IteratorBindingInitialization for
FunctionRestParameter using iteratorRecord and environment as the arguments.
- Let status be the result of performing IteratorBindingInitialization for
FormalsList using iteratorRecord and environment as the arguments. ReturnIfAbrupt (status).- Return the result of performing IteratorBindingInitialization for
FormalParameter using iteratorRecord and environment as the arguments.
- If ContainsExpression of
BindingElement isfalse , return the result of performing IteratorBindingInitialization forBindingElement using iteratorRecord and environment as the arguments. - Let currentContext be the
running execution context . - Let originalEnv be the VariableEnvironment of currentContext.
- Assert: The VariableEnvironment and LexicalEnvironment of currentContext are the same.
- Assert: environment and originalEnv are the same.
- Let paramVarEnv be
NewDeclarativeEnvironment (originalEnv). - Set the VariableEnvironment of currentContext to paramVarEnv.
- Set the LexicalEnvironment of currentContext to paramVarEnv.
- Let result be the result of performing IteratorBindingInitialization for
BindingElement using iteratorRecord and environment as the arguments. - Set the VariableEnvironment of currentContext to originalEnv.
- Set the LexicalEnvironment of currentContext to originalEnv.
- Return result.
The new
- If ContainsExpression of
BindingRestElement isfalse , return the result of performing IteratorBindingInitialization forBindingRestElement using iteratorRecord and environment as the arguments. - Let currentContext be the
running execution context . - Let originalEnv be the VariableEnvironment of currentContext.
- Assert: The VariableEnvironment and LexicalEnvironment of currentContext are the same.
- Assert: environment and originalEnv are the same.
- Let paramVarEnv be
NewDeclarativeEnvironment (originalEnv). - Set the VariableEnvironment of currentContext to paramVarEnv.
- Set the LexicalEnvironment of currentContext to paramVarEnv.
- Let result be the result of performing IteratorBindingInitialization for
BindingRestElement using iteratorRecord and environment as the arguments. - Set the VariableEnvironment of currentContext to originalEnv.
- Set the LexicalEnvironment of currentContext to originalEnv.
- Return result.
The new
14.1.20Runtime Semantics: InstantiateFunctionObject#
With parameter scope.
- If the function code for
FunctionDeclaration isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let name be StringValue of
BindingIdentifier . - Let F be
FunctionCreate (Normal ,FormalParameters ,FunctionBody , scope, strict). - Perform
MakeConstructor (F). - Perform
SetFunctionName (F, name). - Return F.
- If the function code for
FunctionDeclaration isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let F be
FunctionCreate (Normal ,FormalParameters ,FunctionBody , scope, strict). - Perform
MakeConstructor (F). - Perform
SetFunctionName (F,"default"). - Return F.
An anonymous export default declaration.
14.1.21Runtime Semantics: Evaluation#
- Return
NormalCompletion (empty ).
An alternative semantics is provided in
- Return
NormalCompletion (empty ).
- If the function code for
FunctionExpression isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let scope be the LexicalEnvironment of the
running execution context . - Let closure be
FunctionCreate (Normal ,FormalParameters ,FunctionBody , scope, strict). - Perform
MakeConstructor (closure). - Return closure.
- If the function code for
FunctionExpression isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let scope be the
running execution context 's LexicalEnvironment. - Let funcEnv be
NewDeclarativeEnvironment (scope). - Let envRec be funcEnv's
EnvironmentRecord . - Let name be StringValue of
BindingIdentifier . - Perform envRec.CreateImmutableBinding(name,
false ). - Let closure be
FunctionCreate (Normal ,FormalParameters ,FunctionBody , funcEnv, strict). - Perform
MakeConstructor (closure). - Perform
SetFunctionName (closure, name). - Perform envRec.InitializeBinding(name, closure).
- Return closure.
The
A prototype property is automatically created for every function defined using a
- Return
NormalCompletion (undefined ).
14.2Arrow Function Definitions#
Syntax
Supplemental Syntax
When the production
is recognized the following grammar is used to refine the interpretation of
14.2.1Static Semantics: Early Errors#
-
It is a Syntax Error if
ArrowParameters ContainsYieldExpression istrue . -
It is a Syntax Error if ContainsUseStrict of
ConciseBody istrue and IsSimpleParameterList ofArrowParameters isfalse . -
It is a Syntax Error if any element of the BoundNames of
ArrowParameters also occurs in the LexicallyDeclaredNames ofConciseBody .
-
If the [Yield] grammar parameter is present on
ArrowParameters , it is a Syntax Error if the lexical token sequence matched byCoverParenthesizedExpressionAndArrowParameterList cannot be parsed with no tokens left over using[?Yield] ArrowFormalParameters as the goal symbol.[Yield] -
If the [Yield] grammar parameter is not present on
ArrowParameters , it is a Syntax Error if the lexical token sequence matched byCoverParenthesizedExpressionAndArrowParameterList cannot be parsed with no tokens left over using[?Yield] ArrowFormalParameters as the goal symbol. -
All early errors rules for
ArrowFormalParameters and its derived productions also apply to CoveredFormalsList ofCoverParenthesizedExpressionAndArrowParameterList .[?Yield]
14.2.2Static Semantics: BoundNames#
- Let formals be CoveredFormalsList of
CoverParenthesizedExpressionAndArrowParameterList . - Return the BoundNames of formals.
14.2.3Static Semantics: Contains#
With parameter symbol.
- If symbol is not one of
NewTarget ,SuperProperty ,SuperCall ,superorthis, returnfalse . - If
ArrowParameters Contains symbol istrue , returntrue . - Return
ConciseBody Contains symbol.
Normally, Contains does not look inside most function forms. However, Contains is used to detect new.target, this, and super usage within an
- Let formals be CoveredFormalsList of
CoverParenthesizedExpressionAndArrowParameterList . - Return formals Contains symbol.
14.2.4Static Semantics: ContainsExpression#
- Return
false .
14.2.5Static Semantics: ContainsUseStrict#
- Return
false .
14.2.6Static Semantics: ExpectedArgumentCount#
- Return 1.
14.2.7Static Semantics: HasName#
- Return
false .
14.2.8Static Semantics: IsSimpleParameterList#
- Return
true .
- Let formals be CoveredFormalsList of
CoverParenthesizedExpressionAndArrowParameterList . - Return IsSimpleParameterList of formals.
14.2.9Static Semantics: CoveredFormalsList#
- Return this
ArrowParameters .
- If the [Yield] grammar parameter is present for
CoverParenthesizedExpressionAndArrowParameterList , return the result of parsing the lexical token stream matched by[Yield] CoverParenthesizedExpressionAndArrowParameterList using[Yield] ArrowFormalParameters as the goal symbol.[Yield] - If the [Yield] grammar parameter is not present for
CoverParenthesizedExpressionAndArrowParameterList , return the result of parsing the lexical token stream matched by[Yield] CoverParenthesizedExpressionAndArrowParameterList usingArrowFormalParameters as the goal symbol.
14.2.10Static Semantics: LexicallyDeclaredNames#
- Return a new empty
List .
14.2.11Static Semantics: LexicallyScopedDeclarations#
- Return a new empty
List .
14.2.12Static Semantics: VarDeclaredNames#
- Return a new empty
List .
14.2.13Static Semantics: VarScopedDeclarations#
- Return a new empty
List .
14.2.14Runtime Semantics: IteratorBindingInitialization#
With parameters iteratorRecord and environment.
When
- Assert: iteratorRecord.[[Done]] is
false . - Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , set iteratorRecord.[[Done]] totrue . - Else,
- Let v be
IteratorValue (next). - If v is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (v).
- Let v be
- If iteratorRecord.[[Done]] is
true , let v beundefined . - Return the result of performing BindingInitialization for
BindingIdentifier using v and environment as the arguments.
14.2.15Runtime Semantics: EvaluateBody#
With parameter functionObject.
- Let exprRef be the result of evaluating
AssignmentExpression . - Let exprValue be ?
GetValue (exprRef). - Return
Completion {[[Type]]:return , [[Value]]: exprValue, [[Target]]:empty }.
14.2.16Runtime Semantics: Evaluation#
- If the function code for this
ArrowFunction isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let scope be the LexicalEnvironment of the
running execution context . - Let parameters be CoveredFormalsList of
ArrowParameters . - Let closure be
FunctionCreate (Arrow , parameters,ConciseBody , scope, strict). - Return closure.
An arguments, super, this, or new.target. Any reference to arguments, super, this, or new.target within an super, the function object created in step 4 is not made into a method by performing super is always contained within a non-super is accessible via the scope that is captured by the function object of the
14.3Method Definitions#
Syntax
14.3.1Static Semantics: Early Errors#
-
It is a Syntax Error if ContainsUseStrict of
FunctionBody istrue and IsSimpleParameterList ofStrictFormalParameters isfalse . -
It is a Syntax Error if any element of the BoundNames of
StrictFormalParameters also occurs in the LexicallyDeclaredNames ofFunctionBody .
-
It is a Syntax Error if BoundNames of
PropertySetParameterList contains any duplicate elements. -
It is a Syntax Error if ContainsUseStrict of
FunctionBody istrue and IsSimpleParameterList ofPropertySetParameterList isfalse . -
It is a Syntax Error if any element of the BoundNames of
PropertySetParameterList also occurs in the LexicallyDeclaredNames ofFunctionBody .
14.3.2Static Semantics: ComputedPropertyContains#
With parameter symbol.
- Return the result of ComputedPropertyContains for
PropertyName with argument symbol.
14.3.3Static Semantics: ExpectedArgumentCount#
- If HasInitializer of
FormalParameter istrue , return 0. - Return 1.
14.3.4Static Semantics: HasComputedPropertyKey#
- Return IsComputedPropertyKey of
PropertyName .
14.3.5Static Semantics: HasDirectSuper#
- If
StrictFormalParameters ContainsSuperCall istrue , returntrue . - Return
FunctionBody ContainsSuperCall .
- Return
FunctionBody ContainsSuperCall .
- If
PropertySetParameterList ContainsSuperCall istrue , returntrue . - Return
FunctionBody ContainsSuperCall .
14.3.6Static Semantics: PropName#
- Return PropName of
PropertyName .
14.3.7Static Semantics: SpecialMethod#
- Return
false .
- Return
true .
14.3.8Runtime Semantics: DefineMethod#
With parameters object and optional parameter functionPrototype.
- Let propKey be the result of evaluating
PropertyName . ReturnIfAbrupt (propKey).- If the function code for this
MethodDefinition isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let scope be the
running execution context 's LexicalEnvironment. - If functionPrototype was passed as a parameter, let kind be
Normal ; otherwise let kind beMethod . - Let closure be
FunctionCreate (kind,StrictFormalParameters ,FunctionBody , scope, strict). If functionPrototype was passed as a parameter, then pass its value as the prototype optional argument ofFunctionCreate . - Perform
MakeMethod (closure, object). - Return the
Record {[[Key]]: propKey, [[Closure]]: closure}.
14.3.9Runtime Semantics: PropertyDefinitionEvaluation#
With parameters object and enumerable.
- Let methodDef be DefineMethod of
MethodDefinition with argument object. ReturnIfAbrupt (methodDef).- Perform
SetFunctionName (methodDef.[[Closure]], methodDef.[[Key]]). - Let desc be the PropertyDescriptor{[[Value]]: methodDef.[[Closure]], [[Writable]]:
true , [[Enumerable]]: enumerable, [[Configurable]]:true }. - Return ?
DefinePropertyOrThrow (object, methodDef.[[Key]], desc).
See
- Let propKey be the result of evaluating
PropertyName . ReturnIfAbrupt (propKey).- If the function code for this
MethodDefinition isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let scope be the
running execution context 's LexicalEnvironment. - Let formalParameterList be the production
.FormalParameters : [empty] - Let closure be
FunctionCreate (Method , formalParameterList,FunctionBody , scope, strict). - Perform
MakeMethod (closure, object). - Perform
SetFunctionName (closure, propKey,"get"). - Let desc be the PropertyDescriptor{[[Get]]: closure, [[Enumerable]]: enumerable, [[Configurable]]:
true }. - Return ?
DefinePropertyOrThrow (object, propKey, desc).
- Let propKey be the result of evaluating
PropertyName . ReturnIfAbrupt (propKey).- If the function code for this
MethodDefinition isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let scope be the
running execution context 's LexicalEnvironment. - Let closure be
FunctionCreate (Method ,PropertySetParameterList ,FunctionBody , scope, strict). - Perform
MakeMethod (closure, object). - Perform
SetFunctionName (closure, propKey,"set"). - Let desc be the PropertyDescriptor{[[Set]]: closure, [[Enumerable]]: enumerable, [[Configurable]]:
true }. - Return ?
DefinePropertyOrThrow (object, propKey, desc).
14.4Generator Function Definitions#
Syntax
The syntactic context immediately following yield requires use of the
Abstract operations relating to generator objects are defined in
14.4.1Static Semantics: Early Errors#
-
It is a Syntax Error if HasDirectSuper of
GeneratorMethod istrue . -
It is a Syntax Error if
StrictFormalParameters ContainsYieldExpression istrue . -
It is a Syntax Error if ContainsUseStrict of
GeneratorBody istrue and IsSimpleParameterList ofStrictFormalParameters isfalse . -
It is a Syntax Error if any element of the BoundNames of
StrictFormalParameters also occurs in the LexicallyDeclaredNames ofGeneratorBody .
-
If the source code matching this production is strict code, the Early Error rules for
are applied.StrictFormalParameters : FormalParameters -
If the source code matching this production is strict code, it is a Syntax Error if
BindingIdentifier is theIdentifierName evalor theIdentifierName arguments. -
It is a Syntax Error if ContainsUseStrict of
GeneratorBody istrue and IsSimpleParameterList ofFormalParameters isfalse . -
It is a Syntax Error if any element of the BoundNames of
FormalParameters also occurs in the LexicallyDeclaredNames ofGeneratorBody . -
It is a Syntax Error if
FormalParameters ContainsYieldExpression istrue . -
It is a Syntax Error if
FormalParameters ContainsSuperProperty istrue . -
It is a Syntax Error if
GeneratorBody ContainsSuperProperty istrue . -
It is a Syntax Error if
FormalParameters ContainsSuperCall istrue . -
It is a Syntax Error if
GeneratorBody ContainsSuperCall istrue .
14.4.2Static Semantics: BoundNames#
- Return the BoundNames of
BindingIdentifier .
- Return «
"*default*"».
"*default*" is used within this specification as a synthetic name for hoistable anonymous functions that are defined using export declarations.
14.4.3Static Semantics: ComputedPropertyContains#
With parameter symbol.
- Return the result of ComputedPropertyContains for
PropertyName with argument symbol.
14.4.4Static Semantics: Contains#
With parameter symbol.
- Return
false .
Static semantic rules that depend upon substructure generally do not look into function definitions.
14.4.5Static Semantics: HasComputedPropertyKey#
- Return IsComputedPropertyKey of
PropertyName .
14.4.6Static Semantics: HasDirectSuper#
- If
StrictFormalParameters ContainsSuperCall istrue , returntrue . - Return
GeneratorBody ContainsSuperCall .
14.4.7Static Semantics: HasName#
- Return
false .
- Return
true .
14.4.8Static Semantics: IsConstantDeclaration#
- Return
false .
14.4.9Static Semantics: IsFunctionDefinition#
- Return
true .
14.4.10Static Semantics: PropName#
- Return PropName of
PropertyName .
14.4.11Runtime Semantics: EvaluateBody#
With parameter functionObject.
- Let G be ?
OrdinaryCreateFromConstructor (functionObject,"%GeneratorPrototype%", « [[GeneratorState]], [[GeneratorContext]] »). - Perform
GeneratorStart (G,FunctionBody ). - Return
Completion {[[Type]]:return , [[Value]]: G, [[Target]]:empty }.
14.4.12Runtime Semantics: InstantiateFunctionObject#
With parameter scope.
- If the function code for
GeneratorDeclaration isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let name be StringValue of
BindingIdentifier . - Let F be
GeneratorFunctionCreate (Normal ,FormalParameters ,GeneratorBody , scope, strict). - Let prototype be
ObjectCreate (%GeneratorPrototype% ). - Perform
DefinePropertyOrThrow (F,"prototype", PropertyDescriptor{[[Value]]: prototype, [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:false }). - Perform
SetFunctionName (F, name). - Return F.
- If the function code for
GeneratorDeclaration isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let F be
GeneratorFunctionCreate (Normal ,FormalParameters ,GeneratorBody , scope, strict). - Let prototype be
ObjectCreate (%GeneratorPrototype% ). - Perform
DefinePropertyOrThrow (F,"prototype", PropertyDescriptor{[[Value]]: prototype, [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:false }). - Perform
SetFunctionName (F,"default"). - Return F.
An anonymous export default declaration.
14.4.13Runtime Semantics: PropertyDefinitionEvaluation#
With parameter object and enumerable.
- Let propKey be the result of evaluating
PropertyName . ReturnIfAbrupt (propKey).- If the function code for this
GeneratorMethod isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let scope be the
running execution context 's LexicalEnvironment. - Let closure be
GeneratorFunctionCreate (Method ,StrictFormalParameters ,GeneratorBody , scope, strict). - Perform
MakeMethod (closure, object). - Let prototype be
ObjectCreate (%GeneratorPrototype% ). - Perform
DefinePropertyOrThrow (closure,"prototype", PropertyDescriptor{[[Value]]: prototype, [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:false }). - Perform
SetFunctionName (closure, propKey). - Let desc be the PropertyDescriptor{[[Value]]: closure, [[Writable]]:
true , [[Enumerable]]: enumerable, [[Configurable]]:true }. - Return ?
DefinePropertyOrThrow (object, propKey, desc).
14.4.14Runtime Semantics: Evaluation#
- If the function code for this
GeneratorExpression isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let scope be the LexicalEnvironment of the
running execution context . - Let closure be
GeneratorFunctionCreate (Normal ,FormalParameters ,GeneratorBody , scope, strict). - Let prototype be
ObjectCreate (%GeneratorPrototype% ). - Perform
DefinePropertyOrThrow (closure,"prototype", PropertyDescriptor{[[Value]]: prototype, [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:false }). - Return closure.
- If the function code for this
GeneratorExpression isstrict mode code , let strict betrue . Otherwise let strict befalse . - Let scope be the
running execution context 's LexicalEnvironment. - Let funcEnv be
NewDeclarativeEnvironment (scope). - Let envRec be funcEnv's
EnvironmentRecord . - Let name be StringValue of
BindingIdentifier . - Perform envRec.CreateImmutableBinding(name,
false ). - Let closure be
GeneratorFunctionCreate (Normal ,FormalParameters ,GeneratorBody , funcEnv, strict). - Let prototype be
ObjectCreate (%GeneratorPrototype% ). - Perform
DefinePropertyOrThrow (closure,"prototype", PropertyDescriptor{[[Value]]: prototype, [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:false }). - Perform
SetFunctionName (closure, name). - Perform envRec.InitializeBinding(name, closure).
- Return closure.
The
- Return ?
GeneratorYield (CreateIterResultObject (undefined ,false )).
- Let exprRef be the result of evaluating
AssignmentExpression . - Let value be ?
GetValue (exprRef). - Return ?
GeneratorYield (CreateIterResultObject (value,false )).
- Let exprRef be the result of evaluating
AssignmentExpression . - Let value be ?
GetValue (exprRef). - Let iterator be ?
GetIterator (value). - Let received be
NormalCompletion (undefined ). - Repeat
- If received.[[Type]] is
normal , then- Let innerResult be ?
IteratorNext (iterator, received.[[Value]]). - Let done be ?
IteratorComplete (innerResult). - If done is
true , then- Return ?
IteratorValue (innerResult).
- Return ?
- Let received be
GeneratorYield (innerResult).
- Let innerResult be ?
- Else if received.[[Type]] is
throw , then- Let throw be ?
GetMethod (iterator,"throw"). - If throw is not
undefined , then- Let innerResult be ?
Call (throw, iterator, « received.[[Value]] »). - NOTE: Exceptions from the inner iterator
throwmethod are propagated. Normal completions from an innerthrowmethod are processed similarly to an innernext. - If
Type (innerResult) is not Object, throw aTypeError exception. - Let done be ?
IteratorComplete (innerResult). - If done is
true , then- Return ?
IteratorValue (innerResult).
- Return ?
- Let received be
GeneratorYield (innerResult).
- Let innerResult be ?
- Else,
- NOTE: If iterator does not have a
throwmethod, this throw is going to terminate theyield*loop. But first we need to give iterator a chance to clean up. - Perform ?
IteratorClose (iterator,Completion {[[Type]]:normal , [[Value]]:empty , [[Target]]:empty }). - NOTE: The next step throws a
TypeError to indicate that there was ayield*protocol violation: iterator does not have athrowmethod. - Throw a
TypeError exception.
- NOTE: If iterator does not have a
- Let throw be ?
- Else,
- Assert: received.[[Type]] is
return . - Let return be ?
GetMethod (iterator,"return"). - If return is
undefined , returnCompletion (received). - Let innerReturnResult be ?
Call (return, iterator, « received.[[Value]] »). - If
Type (innerReturnResult) is not Object, throw aTypeError exception. - Let done be ?
IteratorComplete (innerReturnResult). - If done is
true , then- Let value be ?
IteratorValue (innerReturnResult). - Return
Completion {[[Type]]:return , [[Value]]: value, [[Target]]:empty }.
- Let value be ?
- Let received be
GeneratorYield (innerReturnResult).
- Assert: received.[[Type]] is
- If received.[[Type]] is
14.5Class Definitions#
Syntax
A class definition is always strict code.
14.5.1Static Semantics: Early Errors#
-
It is a Syntax Error if
ClassHeritage is not present and the following algorithm evaluates totrue :- Let constructor be ConstructorMethod of
ClassBody . - If constructor is
empty , returnfalse . - Return HasDirectSuper of constructor.
- Let constructor be ConstructorMethod of
-
It is a Syntax Error if PrototypePropertyNameList of
ClassElementList contains more than one occurrence of"constructor".
-
It is a Syntax Error if PropName of
MethodDefinition is not"constructor"and HasDirectSuper ofMethodDefinition istrue . -
It is a Syntax Error if PropName of
MethodDefinition is"constructor"and SpecialMethod ofMethodDefinition istrue .
-
It is a Syntax Error if HasDirectSuper of
MethodDefinition istrue . -
It is a Syntax Error if PropName of
MethodDefinition is"prototype".
14.5.2Static Semantics: BoundNames#
- Return the BoundNames of
BindingIdentifier .
- Return «
"*default*"».
14.5.3Static Semantics: ConstructorMethod#
- If
ClassElement is the production , returnClassElement : ; empty . - If IsStatic of
ClassElement istrue , returnempty . - If PropName of
ClassElement is not"constructor", returnempty . - Return
ClassElement .
- Let head be ConstructorMethod of
ClassElementList . - If head is not
empty , return head. - If
ClassElement is the production , returnClassElement : ; empty . - If IsStatic of
ClassElement istrue , returnempty . - If PropName of
ClassElement is not"constructor", returnempty . - Return
ClassElement .
Early Error rules ensure that there is only one method definition named "constructor" and that it is not an accessor property or generator definition.
14.5.4Static Semantics: Contains#
With parameter symbol.
- If symbol is
ClassBody , returntrue . - If symbol is
ClassHeritage , then- If
ClassHeritage is present, returntrue ; otherwise returnfalse .
- If
- Let inHeritage be
ClassHeritage Contains symbol. - If inHeritage is
true , returntrue . - Return the result of ComputedPropertyContains for
ClassBody with argument symbol.
Static semantic rules that depend upon substructure generally do not look into class bodies except for
14.5.5Static Semantics: ComputedPropertyContains#
With parameter symbol.
- Let inList be the result of ComputedPropertyContains for
ClassElementList with argument symbol. - If inList is
true , returntrue . - Return the result of ComputedPropertyContains for
ClassElement with argument symbol.
- Return the result of ComputedPropertyContains for
MethodDefinition with argument symbol.
- Return the result of ComputedPropertyContains for
MethodDefinition with argument symbol.
- Return
false .
14.5.6Static Semantics: HasName#
- Return
false .
- Return
true .
14.5.7Static Semantics: IsConstantDeclaration#
- Return
false .
14.5.8Static Semantics: IsFunctionDefinition#
- Return
true .
14.5.9Static Semantics: IsStatic#
- Return
false .
- Return
true .
- Return
false .
14.5.10Static Semantics: NonConstructorMethodDefinitions#
- If
ClassElement is the production , return a new emptyClassElement : ; List . - If IsStatic of
ClassElement isfalse and PropName ofClassElement is"constructor", return a new emptyList . - Return a
List containingClassElement .
- Let list be NonConstructorMethodDefinitions of
ClassElementList . - If
ClassElement is the production , return list.ClassElement : ; - If IsStatic of
ClassElement isfalse and PropName ofClassElement is"constructor", return list. - Append
ClassElement to the end of list. - Return list.
14.5.11Static Semantics: PrototypePropertyNameList#
- If PropName of
ClassElement isempty , return a new emptyList . - If IsStatic of
ClassElement istrue , return a new emptyList . - Return a
List containing PropName ofClassElement .
- Let list be PrototypePropertyNameList of
ClassElementList . - If PropName of
ClassElement isempty , return list. - If IsStatic of
ClassElement istrue , return list. - Append PropName of
ClassElement to the end of list. - Return list.
14.5.12Static Semantics: PropName#
- Return
empty .
14.5.13Static Semantics: StaticPropertyNameList#
- If PropName of
ClassElement isempty , return a new emptyList . - If IsStatic of
ClassElement isfalse , return a new emptyList . - Return a
List containing PropName ofClassElement .
- Let list be StaticPropertyNameList of
ClassElementList . - If PropName of
ClassElement isempty , return list. - If IsStatic of
ClassElement isfalse , return list. - Append PropName of
ClassElement to the end of list. - Return list.
14.5.14Runtime Semantics: ClassDefinitionEvaluation#
With parameter className.
- Let lex be the LexicalEnvironment of the
running execution context . - Let classScope be
NewDeclarativeEnvironment (lex). - Let classScopeEnvRec be classScope's
EnvironmentRecord . - If className is not
undefined , then- Perform classScopeEnvRec.CreateImmutableBinding(className,
true ).
- Perform classScopeEnvRec.CreateImmutableBinding(className,
- If
ClassHeritage is not present, thenopt - Let protoParent be the intrinsic object
%ObjectPrototype% . - Let constructorParent be the intrinsic object
%FunctionPrototype% .
- Let protoParent be the intrinsic object
- Else,
- Set the
running execution context 's LexicalEnvironment to classScope. - Let superclass be the result of evaluating
ClassHeritage . - Set the
running execution context 's LexicalEnvironment to lex. ReturnIfAbrupt (superclass).- If superclass is
null , then- Let protoParent be
null . - Let constructorParent be the intrinsic object
%FunctionPrototype% .
- Let protoParent be
- Else if
IsConstructor (superclass) isfalse , throw aTypeError exception. - Else,
- Set the
- Let proto be
ObjectCreate (protoParent). - If
ClassBody is not present, let constructor beopt empty . - Else, let constructor be ConstructorMethod of
ClassBody . - If constructor is
empty , then- If
ClassHeritage is present, thenopt - Let constructor be the result of parsing the source text
using the syntactic grammar with the goal symbolconstructor(... args){ super (...args);}MethodDefinition .
- Let constructor be the result of parsing the source text
- Else,
- Let constructor be the result of parsing the source text
using the syntactic grammar with the goal symbolconstructor( ){ }MethodDefinition .
- Let constructor be the result of parsing the source text
- If
- Set the
running execution context 's LexicalEnvironment to classScope. - Let constructorInfo be the result of performing DefineMethod for constructor with arguments proto and constructorParent as the optional functionPrototype argument.
- Assert: constructorInfo is not an
abrupt completion . - Let F be constructorInfo.[[Closure]].
- If
ClassHeritage is present, set F's [[ConstructorKind]] internal slot toopt "derived". - Perform
MakeConstructor (F,false , proto). - Perform
MakeClassConstructor (F). - Perform
CreateMethodProperty (proto,"constructor", F). - If
ClassBody is not present, let methods be a new emptyopt List . - Else, let methods be NonConstructorMethodDefinitions of
ClassBody . - For each
ClassElement m in order from methods- If IsStatic of m is
false , then- Let status be the result of performing PropertyDefinitionEvaluation for m with arguments proto and
false .
- Let status be the result of performing PropertyDefinitionEvaluation for m with arguments proto and
- Else,
- Let status be the result of performing PropertyDefinitionEvaluation for m with arguments F and
false .
- Let status be the result of performing PropertyDefinitionEvaluation for m with arguments F and
- If status is an
abrupt completion , then- Set the
running execution context 's LexicalEnvironment to lex. - Return
Completion (status).
- Set the
- If IsStatic of m is
- Set the
running execution context 's LexicalEnvironment to lex. - If className is not
undefined , then- Perform classScopeEnvRec.InitializeBinding(className, F).
- Return F.
14.5.15Runtime Semantics: BindingClassDeclarationEvaluation#
- Let className be StringValue of
BindingIdentifier . - Let value be the result of ClassDefinitionEvaluation of
ClassTail with argument className. ReturnIfAbrupt (value).- Let hasNameProperty be ?
HasOwnProperty (value,"name"). - If hasNameProperty is
false , performSetFunctionName (value, className). - Let env be the
running execution context 's LexicalEnvironment. - Perform ?
InitializeBoundName (className, value, env). - Return value.
- Return the result of ClassDefinitionEvaluation of
ClassTail with argumentundefined .
14.5.16Runtime Semantics: Evaluation#
- Let status be the result of BindingClassDeclarationEvaluation of this
ClassDeclaration . ReturnIfAbrupt (status).- Return
NormalCompletion (empty ).
- If
BindingIdentifier is not present, let className beopt undefined . - Else, let className be StringValue of
BindingIdentifier . - Let value be the result of ClassDefinitionEvaluation of
ClassTail with argument className. ReturnIfAbrupt (value).- If className is not
undefined , then- Let hasNameProperty be ?
HasOwnProperty (value,"name"). - If hasNameProperty is
false , then- Perform
SetFunctionName (value, className).
- Perform
- Let hasNameProperty be ?
- Return
NormalCompletion (value).
If the class definition included a name static method then that method is not over-written with a name data property for the class name.
14.6Tail Position Calls#
14.6.1Static Semantics: IsInTailPosition(nonterminal)#
The abstract operation IsInTailPosition with argument nonterminal performs the following steps:
- Assert: nonterminal is a parsed grammar production.
- If the source code matching nonterminal is not strict code, return
false . - If nonterminal is not contained within a
FunctionBody orConciseBody , returnfalse . - Let body be the
FunctionBody orConciseBody that most closely contains nonterminal. - If body is the
FunctionBody of aGeneratorBody , returnfalse . - Return the result of HasProductionInTailPosition of body with argument nonterminal.
Tail Position calls are only defined in
14.6.2Static Semantics: HasProductionInTailPosition#
With parameter nonterminal.
nonterminal is a parsed grammar production that represents a specific range of source text. When the following algorithms compare nonterminal to other grammar symbols they are testing whether the same source text was matched by both symbols.
14.6.2.1Statement Rules#
- Return HasProductionInTailPosition of
AssignmentExpression with argument nonterminal.
- Let has be HasProductionInTailPosition of
StatementList with argument nonterminal. - If has is
true , returntrue . - Return HasProductionInTailPosition of
StatementListItem with argument nonterminal.
- Return
false .
- Return HasProductionInTailPosition of
Statement with argument nonterminal.
- Return HasProductionInTailPosition of
LabelledItem with argument nonterminal.
- Return HasProductionInTailPosition of
Expression with argument nonterminal.
- Return HasProductionInTailPosition of
CaseBlock with argument nonterminal.
- Let has be
false . - If the first
CaseClauses is present, let has be HasProductionInTailPosition of the firstCaseClauses with argument nonterminal. - If has is
true , returntrue . - Let has be HasProductionInTailPosition of the
DefaultClause with argument nonterminal. - If has is
true , returntrue . - If the second
CaseClauses is present, let has be HasProductionInTailPosition of the secondCaseClauses with argument nonterminal. - Return has.
- Let has be HasProductionInTailPosition of
CaseClauses with argument nonterminal. - If has is
true , returntrue . - Return HasProductionInTailPosition of
CaseClause with argument nonterminal.
- If
StatementList is present, return HasProductionInTailPosition ofStatementList with argument nonterminal. - Return
false .
- Return HasProductionInTailPosition of
Catch with argument nonterminal.
- Return HasProductionInTailPosition of
Finally with argument nonterminal.
- Return HasProductionInTailPosition of
Block with argument nonterminal.
14.6.2.2Expression Rules#
A potential tail position call that is immediately followed by return
- Return
false .
- Return HasProductionInTailPosition of
AssignmentExpression with argument nonterminal.
- Let has be HasProductionInTailPosition of the first
AssignmentExpression with argument nonterminal. - If has is
true , returntrue . - Return HasProductionInTailPosition of the second
AssignmentExpression with argument nonterminal.
- Return HasProductionInTailPosition of
BitwiseORExpression with argument nonterminal.
- Return HasProductionInTailPosition of
LogicalANDExpression with argument nonterminal.
- If this
CallExpression is nonterminal, returntrue . - Return
false .
- If this
MemberExpression is nonterminal, returntrue . - Return
false .
- Let expr be CoveredParenthesizedExpression of
CoverParenthesizedExpressionAndArrowParameterList . - Return HasProductionInTailPosition of expr with argument nonterminal.
- Return HasProductionInTailPosition of
Expression with argument nonterminal.
14.6.3Runtime Semantics: PrepareForTailCall ( )#
The abstract operation PrepareForTailCall performs the following steps:
- Let leafContext be the
running execution context . - Suspend leafContext.
- Pop leafContext from the
execution context stack . Theexecution context now on the top of the stack becomes therunning execution context . - Assert: leafContext has no further use. It will never be activated as the
running execution context .
A tail position call must either release any transient internal resources associated with the currently executing function
For example, a tail position call should only grow an implementation's activation record stack by the amount that the size of the target function's activation record exceeds the size of the calling function's activation record. If the target function's activation record is smaller, then the total size of the stack should decrease.
15ECMAScript Language: Scripts and Modules#
15.1Scripts#
Syntax
15.1.1Static Semantics: Early Errors#
-
It is a Syntax Error if the LexicallyDeclaredNames of
ScriptBody contains any duplicate entries. -
It is a Syntax Error if any element of the LexicallyDeclaredNames of
ScriptBody also occurs in the VarDeclaredNames ofScriptBody .
-
It is a Syntax Error if
StatementList Containssuperunless the source code containingsuperis eval code that is being processed by adirect eval that is contained in function code that is not the function code of anArrowFunction . -
It is a Syntax Error if
StatementList ContainsNewTarget unless the source code containingNewTarget is eval code that is being processed by adirect eval that is contained in function code that is not the function code of anArrowFunction . -
It is a Syntax Error if ContainsDuplicateLabels of
StatementList with argument « » istrue . -
It is a Syntax Error if ContainsUndefinedBreakTarget of
StatementList with argument « » istrue . -
It is a Syntax Error if ContainsUndefinedContinueTarget of
StatementList with arguments « » and « » istrue .
15.1.2Static Semantics: IsStrict#
- If the
Directive Prologue ofStatementList contains aUse Strict Directive , returntrue ; otherwise, returnfalse .
15.1.3Static Semantics: LexicallyDeclaredNames#
- Return TopLevelLexicallyDeclaredNames of
StatementList .
At the top level of a
15.1.4Static Semantics: LexicallyScopedDeclarations#
- Return TopLevelLexicallyScopedDeclarations of
StatementList .
15.1.5Static Semantics: VarDeclaredNames#
- Return TopLevelVarDeclaredNames of
StatementList .
15.1.6Static Semantics: VarScopedDeclarations#
- Return TopLevelVarScopedDeclarations of
StatementList .
15.1.7Runtime Semantics: Evaluation#
- Return
NormalCompletion (undefined ).
15.1.8Script Records#
A Script Record encapsulates information about a script being evaluated. Each script record contains the fields listed in
| Field Name | Value Type | Meaning |
|---|---|---|
| [[Realm]] |
|
The |
| [[Environment]] |
|
The |
| [[ECMAScriptCode]] | a parse result |
The result of parsing the source text of this module using |
| [[HostDefined]] |
Any, default value is |
Field reserved for use by host environments that need to associate additional information with a script. |
15.1.9ParseScript ( sourceText, realm, hostDefined )#
The abstract operation ParseScript with arguments sourceText,
- Assert: sourceText is an ECMAScript source text (see clause
10 ). - Parse sourceText using
Script as the goal symbol and analyze the parse result for any Early Error conditions. If the parse was successful and no early errors were found, let body be the resulting parse tree. Otherwise, let body be aList of one or moreSyntaxError orReferenceError objects representing the parsing errors and/or early errors. Parsing andearly error detection may be interweaved in an implementation dependent manner. If more than one parsing error orearly error is present, the number and ordering of error objects in the list is implementation dependent, but at least one must be present. - If body is a
List of errors, then return body. - Return
Script Record {[[Realm]]:realm , [[Environment]]:undefined , [[ECMAScriptCode]]: body, [[HostDefined]]: hostDefined}.
An implementation may parse script source text and analyze it for Early Error conditions prior to evaluation of ParseScript for that script source text. However, the reporting of any errors must be deferred until the point where this specification actually performs ParseScript upon that source text.
15.1.10ScriptEvaluation ( scriptRecord )#
- Let globalEnv be scriptRecord.[[Realm]].[[GlobalEnv]].
- Let scriptCxt be a new ECMAScript code
execution context . - Set the Function of scriptCxt to
null . - Set the
Realm of scriptCxt to scriptRecord.[[Realm]]. - Set the ScriptOrModule of scriptCxt to scriptRecord.
- Set the VariableEnvironment of scriptCxt to globalEnv.
- Set the LexicalEnvironment of scriptCxt to globalEnv.
- Suspend the currently
running execution context . - Push scriptCxt on to the
execution context stack ; scriptCxt is now therunning execution context . - Let result be
GlobalDeclarationInstantiation (ScriptBody , globalEnv). - If result.[[Type]] is
normal , then- Let result be the result of evaluating
ScriptBody .
- Let result be the result of evaluating
- If result.[[Type]] is
normal and result.[[Value]] isempty , then- Let result be
NormalCompletion (undefined ).
- Let result be
- Suspend scriptCxt and remove it from the
execution context stack . - Assert: the
execution context stack is not empty. - Resume the context that is now on the top of the
execution context stack as therunning execution context . - Return
Completion (result).
15.1.11Runtime Semantics: GlobalDeclarationInstantiation (script, env)#
When an
GlobalDeclarationInstantiation is performed as follows using arguments script and env. script is the
- Let envRec be env's
EnvironmentRecord . - Assert: envRec is a global
Environment Record . - Let lexNames be the LexicallyDeclaredNames of script.
- Let varNames be the VarDeclaredNames of script.
- For each name in lexNames, do
- If envRec.HasVarDeclaration(name) is
true , throw aSyntaxError exception. - If envRec.HasLexicalDeclaration(name) is
true , throw aSyntaxError exception. - Let hasRestrictedGlobal be ? envRec.HasRestrictedGlobalProperty(name).
- If hasRestrictedGlobal is
true , throw aSyntaxError exception.
- If envRec.HasVarDeclaration(name) is
- For each name in varNames, do
- If envRec.HasLexicalDeclaration(name) is
true , throw aSyntaxError exception.
- If envRec.HasLexicalDeclaration(name) is
- Let varDeclarations be the VarScopedDeclarations of script.
- Let functionsToInitialize be a new empty
List . - Let declaredFunctionNames be a new empty
List . - For each d in varDeclarations, in reverse list order do
- If d is neither a
VariableDeclaration or aForBinding , then- Assert: d is either a
FunctionDeclaration or aGeneratorDeclaration . - NOTE If there are multiple
FunctionDeclaration s for the same name, the last declaration is used. - Let fn be the sole element of the BoundNames of d.
- If fn is not an element of declaredFunctionNames, then
- Let fnDefinable be ? envRec.CanDeclareGlobalFunction(fn).
- If fnDefinable is
false , throw aTypeError exception. - Append fn to declaredFunctionNames.
- Insert d as the first element of functionsToInitialize.
- Assert: d is either a
- If d is neither a
- Let declaredVarNames be a new empty
List . - For each d in varDeclarations, do
- If d is a
VariableDeclaration or aForBinding , then- For each String vn in the BoundNames of d, do
- If vn is not an element of declaredFunctionNames, then
- Let vnDefinable be ? envRec.CanDeclareGlobalVar(vn).
- If vnDefinable is
false , throw aTypeError exception. - If vn is not an element of declaredVarNames, then
- Append vn to declaredVarNames.
- If vn is not an element of declaredFunctionNames, then
- For each String vn in the BoundNames of d, do
- If d is a
- NOTE: No abnormal terminations occur after this algorithm step if the
global object is an ordinary object. However, if theglobal object is a Proxy exotic object it may exhibit behaviours that cause abnormal terminations in some of the following steps. - NOTE: Annex
B.3.3.2 adds additional steps at this point. - Let lexDeclarations be the LexicallyScopedDeclarations of script.
- For each element d in lexDeclarations do
- NOTE Lexically declared names are only instantiated here but not initialized.
- For each element dn of the BoundNames of d do
- If IsConstantDeclaration of d is
true , then- Perform ? envRec.CreateImmutableBinding(dn,
true ).
- Perform ? envRec.CreateImmutableBinding(dn,
- Else,
- Perform ? envRec.CreateMutableBinding(dn,
false ).
- Perform ? envRec.CreateMutableBinding(dn,
- If IsConstantDeclaration of d is
- For each production f in functionsToInitialize, do
- Let fn be the sole element of the BoundNames of f.
- Let fo be the result of performing InstantiateFunctionObject for f with argument env.
- Perform ? envRec.CreateGlobalFunctionBinding(fn, fo,
false ).
- For each String vn in declaredVarNames, in list order do
- Perform ? envRec.CreateGlobalVarBinding(vn,
false ).
- Perform ? envRec.CreateGlobalVarBinding(vn,
- Return
NormalCompletion (empty ).
Early errors specified in
Unlike explicit var or function declarations, properties that are directly created on the
15.1.12Runtime Semantics: ScriptEvaluationJob ( sourceText, hostDefined )#
The job ScriptEvaluationJob with parameters sourceText and hostDefined parses, validates, and evaluates sourceText as a
- Assert: sourceText is an ECMAScript source text (see clause
10 ). - Let
realm bethe current Realm Record . - Let s be
ParseScript (sourceText,realm , hostDefined). - If s is a
List of errors, then- Perform
HostReportErrors (s). NextJob NormalCompletion (undefined ).
- Perform
- Let status be
ScriptEvaluation (s). NextJob Completion (status).
15.2Modules#
Syntax
15.2.1Module Semantics#
15.2.1.1Static Semantics: Early Errors#
-
It is a Syntax Error if the LexicallyDeclaredNames of
ModuleItemList contains any duplicate entries. -
It is a Syntax Error if any element of the LexicallyDeclaredNames of
ModuleItemList also occurs in the VarDeclaredNames ofModuleItemList . -
It is a Syntax Error if the ExportedNames of
ModuleItemList contains any duplicate entries. -
It is a Syntax Error if any element of the ExportedBindings of
ModuleItemList does not also occur in either the VarDeclaredNames ofModuleItemList , or the LexicallyDeclaredNames ofModuleItemList . -
It is a Syntax Error if
ModuleItemList containssuper. -
It is a Syntax Error if
ModuleItemList containsNewTarget . -
It is a Syntax Error if ContainsDuplicateLabels of
ModuleItemList with argument « » istrue . -
It is a Syntax Error if ContainsUndefinedBreakTarget of
ModuleItemList with argument « » istrue . -
It is a Syntax Error if ContainsUndefinedContinueTarget of
ModuleItemList with arguments « » and « » istrue .
The duplicate ExportedNames rule implies that multiple export default
15.2.1.2Static Semantics: ContainsDuplicateLabels#
With argument labelSet.
- Let hasDuplicates be ContainsDuplicateLabels of
ModuleItemList with argument labelSet. - If hasDuplicates is
true , returntrue . - Return ContainsDuplicateLabels of
ModuleItem with argument labelSet.
- Return
false .
15.2.1.3Static Semantics: ContainsUndefinedBreakTarget#
With argument labelSet.
- Let hasUndefinedLabels be ContainsUndefinedBreakTarget of
ModuleItemList with argument labelSet. - If hasUndefinedLabels is
true , returntrue . - Return ContainsUndefinedBreakTarget of
ModuleItem with argument labelSet.
- Return
false .
15.2.1.4Static Semantics: ContainsUndefinedContinueTarget#
With arguments iterationSet and labelSet.
- Let hasUndefinedLabels be ContainsUndefinedContinueTarget of
ModuleItemList with arguments iterationSet and « ». - If hasUndefinedLabels is
true , returntrue . - Return ContainsUndefinedContinueTarget of
ModuleItem with arguments iterationSet and « ».
- Return
false .
15.2.1.5Static Semantics: ExportedBindings#
ExportedBindings are the locally bound names that are explicitly associated with a
- Let names be ExportedBindings of
ModuleItemList . - Append to names the elements of the ExportedBindings of
ModuleItem . - Return names.
- Return a new empty
List .
15.2.1.6Static Semantics: ExportedNames#
ExportedNames are the externally visible names that a
- Let names be ExportedNames of
ModuleItemList . - Append to names the elements of the ExportedNames of
ModuleItem . - Return names.
- Return the ExportedNames of
ExportDeclaration .
- Return a new empty
List .
15.2.1.7Static Semantics: ExportEntries#
- Return a new empty
List .
- Let entries be ExportEntries of
ModuleItemList . - Append to entries the elements of the ExportEntries of
ModuleItem . - Return entries.
- Return a new empty
List .
15.2.1.8Static Semantics: ImportEntries#
- Return a new empty
List .
- Let entries be ImportEntries of
ModuleItemList . - Append to entries the elements of the ImportEntries of
ModuleItem . - Return entries.
- Return a new empty
List .
15.2.1.9Static Semantics: ImportedLocalNames ( importEntries )#
The abstract operation ImportedLocalNames with argument importEntries creates a
15.2.1.10Static Semantics: ModuleRequests#
- Return a new empty
List .
- Return ModuleRequests of
ModuleItem .
- Let moduleNames be ModuleRequests of
ModuleItemList . - Let additionalNames be ModuleRequests of
ModuleItem . - Append to moduleNames each element of additionalNames that is not already an element of moduleNames.
- Return moduleNames.
- Return a new empty
List .
15.2.1.11Static Semantics: LexicallyDeclaredNames#
The LexicallyDeclaredNames of a
- Let names be LexicallyDeclaredNames of
ModuleItemList . - Append to names the elements of the LexicallyDeclaredNames of
ModuleItem . - Return names.
- Return the BoundNames of
ImportDeclaration .
- If
ExportDeclaration isexportVariableStatement , return a new emptyList . - Return the BoundNames of
ExportDeclaration .
- Return LexicallyDeclaredNames of
StatementListItem .
At the top level of a
15.2.1.12Static Semantics: LexicallyScopedDeclarations#
- Return a new empty
List .
- Let declarations be LexicallyScopedDeclarations of
ModuleItemList . - Append to declarations the elements of the LexicallyScopedDeclarations of
ModuleItem . - Return declarations.
- Return a new empty
List .
15.2.1.13Static Semantics: VarDeclaredNames#
- Return a new empty
List .
- Let names be VarDeclaredNames of
ModuleItemList . - Append to names the elements of the VarDeclaredNames of
ModuleItem . - Return names.
- Return a new empty
List .
- If
ExportDeclaration isexportVariableStatement , return BoundNames ofExportDeclaration . - Return a new empty
List .
15.2.1.14Static Semantics: VarScopedDeclarations#
- Return a new empty
List .
- Let declarations be VarScopedDeclarations of
ModuleItemList . - Append to declarations the elements of the VarScopedDeclarations of
ModuleItem . - Return declarations.
- Return a new empty
List .
- If
ExportDeclaration isexportVariableStatement , return VarScopedDeclarations ofVariableStatement . - Return a new empty
List .
15.2.1.15Abstract Module Records#
A Module Record encapsulates structural information about the imports and exports of a single module. This information is used to link the imports and exports of sets of connected modules. A Module Record includes four fields that are only used when evaluating a module.
For specification purposes Module Record values are values of the
Module Record defines the fields listed in
| Field Name | Value Type | Meaning |
|---|---|---|
| [[Realm]] |
|
The |
| [[Environment]] |
|
The |
| [[Namespace]] |
Object | |
The Module Namespace Object ( |
| [[Evaluated]] | Boolean |
Initially |
| [[HostDefined]] |
Any, default value is |
Field reserved for use by host environments that need to associate additional information with a module. |
| Method | Purpose |
|---|---|
| GetExportedNames(exportStarSet) | Return a list of all names that are either directly or indirectly exported from this module. |
| ResolveExport(exportName, resolveSet, exportStarSet) |
Return the binding of a name exported by this module. Bindings are represented by a |
| ModuleDeclarationInstantiation() |
Transitively resolve all module dependencies and create a module |
| ModuleEvaluation() |
Do nothing if this module has already been evaluated. Otherwise, transitively evaluate all module dependences of this module and then evaluate this module. ModuleDeclarationInstantiation must be completed prior to invoking this method. |
15.2.1.16Source Text Module Records#
A Source Text Module Record is used to represent information about a module that was defined from ECMAScript source text (10) that was parsed using the goal symbol
In addition to the fields, defined in
| Field Name | Value Type | Meaning |
|---|---|---|
| [[ECMAScriptCode]] | a parse result |
The result of parsing the source text of this module using |
| [[RequestedModules]] |
|
A |
| [[ImportEntries]] |
|
A |
| [[LocalExportEntries]] |
|
A |
| [[IndirectExportEntries]] |
|
A |
| [[StarExportEntries]] |
|
A |
An ImportEntry
| Field Name | Value Type | Meaning |
|---|---|---|
| [[ModuleRequest]] | String |
String value of the |
| [[ImportName]] | String |
The name under which the desired binding is exported by the module identified by [[ModuleRequest]]. The value "*" indicates that the import request is for the target module's namespace object.
|
| [[LocalName]] | String | The name that is used to locally access the imported value from within the importing module. |
| Import Statement Form | [[ModuleRequest]] | [[ImportName]] | [[LocalName]] |
|---|---|---|---|
import v from "mod";
|
"mod"
|
"default"
|
"v"
|
import * as ns from "mod";
|
"mod"
|
"*"
|
"ns"
|
import {x} from "mod";
|
"mod"
|
"x"
|
"x"
|
import {x as v} from "mod";
|
"mod"
|
"x"
|
"v"
|
import "mod";
|
An ImportEntry |
||
An ExportEntry
| Field Name | Value Type | Meaning |
|---|---|---|
| [[ExportName]] | String | The name used to export this binding by this module. |
| [[ModuleRequest]] | String | null |
The String value of the |
| [[ImportName]] | String | null |
The name under which the desired binding is exported by the module identified by [[ModuleRequest]]. "*" indicates that the export request is for all exported bindings.
|
| [[LocalName]] | String | null |
The name that is used to locally access the exported value from within the importing module. |
| Export Statement Form | [[ExportName]] | [[ModuleRequest]] | [[ImportName]] | [[LocalName]] |
|---|---|---|---|---|
export var v;
|
"v"
|
|
|
"v"
|
export default function f(){}
|
"default"
|
|
|
"f"
|
export default function(){}
|
"default"
|
|
|
"*default*"
|
export default 42;
|
"default"
|
|
|
"*default*"
|
export {x};
|
"x"
|
|
|
"x"
|
export {v as x};
|
"x"
|
|
|
"v"
|
export {x} from "mod";
|
"x"
|
"mod"
|
"x"
|
|
export {v as x} from "mod";
|
"x"
|
"mod"
|
"v"
|
|
export * from "mod";
|
|
"mod"
|
"*"
|
|
The following definitions specify the required concrete methods and other abstract operations for Source Text Module Records
15.2.1.16.1ParseModule ( sourceText, realm, hostDefined )#
The abstract operation ParseModule with arguments sourceText,
- Assert: sourceText is an ECMAScript source text (see clause
10 ). - Parse sourceText using
Module as the goal symbol and analyze the parse result for any Early Error conditions. If the parse was successful and no early errors were found, let body be the resulting parse tree. Otherwise, let body be aList of one or moreSyntaxError orReferenceError objects representing the parsing errors and/or early errors. Parsing andearly error detection may be interweaved in an implementation dependent manner. If more than one parsing error orearly error is present, the number and ordering of error objects in the list is implementation dependent, but at least one must be present. - If body is a
List of errors, then return body. - Let requestedModules be the ModuleRequests of body.
- Let importEntries be ImportEntries of body.
- Let importedBoundNames be
ImportedLocalNames (importEntries). - Let indirectExportEntries be a new empty
List . - Let localExportEntries be a new empty
List . - Let starExportEntries be a new empty
List . - Let exportEntries be ExportEntries of body.
- For each record ee in exportEntries, do
- If ee.[[ModuleRequest]] is
null , then- If ee.[[LocalName]] is not an element of importedBoundNames, then
- Append ee to localExportEntries.
- Else,
- Let ie be the element of importEntries whose [[LocalName]] is the same as ee.[[LocalName]].
- If ie.[[ImportName]] is
"*", then- Assert: this is a re-export of an imported module namespace object.
- Append ee to localExportEntries.
- Else, this is a re-export of a single name
- Append to indirectExportEntries the
Record {[[ModuleRequest]]: ie.[[ModuleRequest]], [[ImportName]]: ie.[[ImportName]], [[LocalName]]:null , [[ExportName]]: ee.[[ExportName]] }.
- Append to indirectExportEntries the
- If ee.[[LocalName]] is not an element of importedBoundNames, then
- Else, if ee.[[ImportName]] is
"*", then- Append ee to starExportEntries.
- Else,
- Append ee to indirectExportEntries.
- If ee.[[ModuleRequest]] is
- Return
Source Text Module Record {[[Realm]]:realm , [[Environment]]:undefined , [[HostDefined]]: hostDefined, [[Namespace]]:undefined , [[Evaluated]]:false , [[ECMAScriptCode]]: body, [[RequestedModules]]: requestedModules, [[ImportEntries]]: importEntries, [[LocalExportEntries]]: localExportEntries, [[StarExportEntries]]: starExportEntries, [[IndirectExportEntries]]: indirectExportEntries}.
An implementation may parse module source text and analyze it for Early Error conditions prior to the evaluation of ParseModule for that module source text. However, the reporting of any errors must be deferred until the point where this specification actually performs ParseModule upon that source text.
15.2.1.16.2GetExportedNames( exportStarSet ) Concrete Method#
The GetExportedNames concrete method of a
- Let module be this
Source Text Module Record . - If exportStarSet contains module, then
- Assert: We've reached the starting point of an
import *circularity. - Return a new empty
List .
- Assert: We've reached the starting point of an
- Append module to exportStarSet.
- Let exportedNames be a new empty
List . - For each ExportEntry
Record e in module.[[LocalExportEntries]], do- Assert: module provides the direct binding for this export.
- Append e.[[ExportName]] to exportedNames.
- For each ExportEntry
Record e in module.[[IndirectExportEntries]], do- Assert: module imports a specific binding for this export.
- Append e.[[ExportName]] to exportedNames.
- For each ExportEntry
Record e in module.[[StarExportEntries]], do- Let requestedModule be ?
HostResolveImportedModule (module, e.[[ModuleRequest]]). - Let starNames be ? requestedModule.GetExportedNames(exportStarSet).
- For each element n of starNames, do
- If
SameValue (n,"default") isfalse , then- If n is not an element of exportedNames, then
- Append n to exportedNames.
- If n is not an element of exportedNames, then
- If
- Let requestedModule be ?
- Return exportedNames.
GetExportedNames does not filter out or throw an exception for names that have ambiguous star export bindings.
15.2.1.16.3ResolveExport( exportName, resolveSet, exportStarSet ) Concrete Method#
The ResolveExport concrete method of a
- Let module be this
Source Text Module Record . - For each
Record {[[Module]], [[ExportName]]} r in resolveSet, do:- If module and r.[[Module]] are the same
Module Record andSameValue (exportName, r.[[ExportName]]) istrue , then- Assert: this is a circular import request.
- Return
null .
- If module and r.[[Module]] are the same
- Append the
Record {[[Module]]: module, [[ExportName]]: exportName} to resolveSet. - For each ExportEntry
Record e in module.[[LocalExportEntries]], do - For each ExportEntry
Record e in module.[[IndirectExportEntries]], do- If
SameValue (exportName, e.[[ExportName]]) istrue , then- Assert: module imports a specific binding for this export.
- Let importedModule be ?
HostResolveImportedModule (module, e.[[ModuleRequest]]). - Let indirectResolution be ? importedModule.ResolveExport(e.[[ImportName]], resolveSet, exportStarSet).
- If indirectResolution is not
null , return indirectResolution.
- If
- If
SameValue (exportName,"default") istrue , then- Assert: A
defaultexport was not explicitly defined by this module. - Throw a
SyntaxError exception. - NOTE A
defaultexport cannot be provided by anexport *.
- Assert: A
- If exportStarSet contains module, return
null . - Append module to exportStarSet.
- Let starResolution be
null . - For each ExportEntry
Record e in module.[[StarExportEntries]], do- Let importedModule be ?
HostResolveImportedModule (module, e.[[ModuleRequest]]). - Let resolution be ? importedModule.ResolveExport(exportName, resolveSet, exportStarSet).
- If resolution is
"ambiguous", return"ambiguous". - If resolution is not
null , then- If starResolution is
null , let starResolution be resolution. - Else,
- Assert: there is more than one
*import that includes the requested name. - If resolution.[[Module]] and starResolution.[[Module]] are not the same
Module Record orSameValue (resolution.[[BindingName]], starResolution.[[BindingName]]) isfalse , return"ambiguous".
- Assert: there is more than one
- If starResolution is
- Let importedModule be ?
- Return starResolution.
ResolveExport attempts to resolve an imported binding to the actual defining module and local binding name. The defining module may be the module represented by the
If a defining module is found a "ambiguous" is returned.
15.2.1.16.4ModuleDeclarationInstantiation( ) Concrete Method#
The ModuleDeclarationInstantiation concrete method of a
- Let module be this
Source Text Module Record . - Let
realm be module.[[Realm]]. - Assert:
realm is notundefined . - Let code be module.[[ECMAScriptCode]].
- If module.[[Environment]] is not
undefined , returnNormalCompletion (empty ). - Let env be
NewModuleEnvironment (realm .[[GlobalEnv]]). - Set module.[[Environment]] to env.
- For each String required that is an element of module.[[RequestedModules]] do,
- NOTE: Before instantiating a module, all of the modules it requested must be available. An implementation may perform this test at any time prior to this point.
- Let requiredModule be ?
HostResolveImportedModule (module, required). - Perform ? requiredModule.ModuleDeclarationInstantiation().
- For each ExportEntry
Record e in module.[[IndirectExportEntries]], do- Let resolution be ? module.ResolveExport(e.[[ExportName]], « », « »).
- If resolution is
null or resolution is"ambiguous", throw aSyntaxError exception.
- Assert: all named exports from module are resolvable.
- Let envRec be env's
EnvironmentRecord . - For each ImportEntry
Record in in module.[[ImportEntries]], do- Let importedModule be ?
HostResolveImportedModule (module, in.[[ModuleRequest]]). - If in.[[ImportName]] is
"*", then- Let namespace be ?
GetModuleNamespace (importedModule). - Perform ! envRec.CreateImmutableBinding(in.[[LocalName]],
true ). - Call envRec.InitializeBinding(in.[[LocalName]], namespace).
- Let namespace be ?
- Else,
- Let resolution be ? importedModule.ResolveExport(in.[[ImportName]], « », « »).
- If resolution is
null or resolution is"ambiguous", throw aSyntaxError exception. - Call envRec.CreateImportBinding(in.[[LocalName]], resolution.[[Module]], resolution.[[BindingName]]).
- Let importedModule be ?
- Let varDeclarations be the VarScopedDeclarations of code.
- Let declaredVarNames be a new empty
List . - For each element d in varDeclarations do
- For each element dn of the BoundNames of d do
- If dn is not an element of declaredVarNames, then
- Perform ! envRec.CreateMutableBinding(dn,
false ). - Call envRec.InitializeBinding(dn,
undefined ). - Append dn to declaredVarNames.
- Perform ! envRec.CreateMutableBinding(dn,
- If dn is not an element of declaredVarNames, then
- For each element dn of the BoundNames of d do
- Let lexDeclarations be the LexicallyScopedDeclarations of code.
- For each element d in lexDeclarations do
- For each element dn of the BoundNames of d do
- If IsConstantDeclaration of d is
true , then- Perform ! envRec.CreateImmutableBinding(dn,
true ).
- Perform ! envRec.CreateImmutableBinding(dn,
- Else,
- Perform ! envRec.CreateMutableBinding(dn,
false ).
- Perform ! envRec.CreateMutableBinding(dn,
- If d is a
GeneratorDeclaration production or aFunctionDeclaration production, then- Let fo be the result of performing InstantiateFunctionObject for d with argument env.
- Call envRec.InitializeBinding(dn, fo).
- If IsConstantDeclaration of d is
- For each element dn of the BoundNames of d do
- Return
NormalCompletion (empty ).
15.2.1.16.5ModuleEvaluation() Concrete Method#
The ModuleEvaluation concrete method of a
- Let module be this
Source Text Module Record . - Assert: ModuleDeclarationInstantiation has already been invoked on module and successfully completed.
- Assert: module.[[Realm]] is not
undefined . - If module.[[Evaluated]] is
true , returnundefined . - Set module.[[Evaluated]] to
true . - For each String required that is an element of module.[[RequestedModules]] do,
- Let requiredModule be ?
HostResolveImportedModule (module, required). - Perform ? requiredModule.ModuleEvaluation().
- Let requiredModule be ?
- Let moduleCxt be a new ECMAScript code
execution context . - Set the Function of moduleCxt to
null . - Set the
Realm of moduleCxt to module.[[Realm]]. - Set the ScriptOrModule of moduleCxt to module.
- Assert: module has been linked and declarations in its
module environment have been instantiated. - Set the VariableEnvironment of moduleCxt to module.[[Environment]].
- Set the LexicalEnvironment of moduleCxt to module.[[Environment]].
- Suspend the currently
running execution context . - Push moduleCxt on to the
execution context stack ; moduleCxt is now therunning execution context . - Let result be the result of evaluating module.[[ECMAScriptCode]].
- Suspend moduleCxt and remove it from the
execution context stack . - Resume the context that is now on the top of the
execution context stack as therunning execution context . - Return
Completion (result).
15.2.1.17Runtime Semantics: HostResolveImportedModule (referencingModule, specifier )#
HostResolveImportedModule is an implementation defined abstract operation that provides the concrete
The implementation of HostResolveImportedModule must conform to the following requirements:
-
The normal return value must be an instance of a concrete subclass of
Module Record . -
If a
Module Record corresponding to the pair referencingModule, specifier does not exist or cannot be created, an exception must be thrown. -
This operation must be idempotent if it completes normally. Each time it is called with a specific referencingModule, specifier pair as arguments it must return the same
Module Record instance.
Multiple different referencingModule, specifier pairs may map to the same
15.2.1.18Runtime Semantics: GetModuleNamespace( module )#
The abstract operation GetModuleNamespace called with argument module performs the following steps:
- Assert: module is an instance of a concrete subclass of
Module Record . - Let namespace be module.[[Namespace]].
- If namespace is
undefined , then- Let exportedNames be ? module.GetExportedNames(« »).
- Let unambiguousNames be a new empty
List . - For each name that is an element of exportedNames,
- Let resolution be ? module.ResolveExport(name, « », « »).
- If resolution is
null , throw aSyntaxError exception. - If resolution is not
"ambiguous", append name to unambiguousNames.
- Let namespace be
ModuleNamespaceCreate (module, unambiguousNames).
- Return namespace.
15.2.1.19Runtime Semantics: TopLevelModuleEvaluationJob ( sourceText, hostDefined )#
A TopLevelModuleEvaluationJob with parameters sourceText and hostDefined is a job that parses, validates, and evaluates sourceText as a
- Assert: sourceText is an ECMAScript source text (see clause
10 ). - Let
realm bethe current Realm Record . - Let m be
ParseModule (sourceText,realm , hostDefined). - If m is a
List of errors, then- Perform
HostReportErrors (m). NextJob NormalCompletion (undefined ).
- Perform
- Let status be m.ModuleDeclarationInstantiation().
- If status is not an
abrupt completion , then- Assert: all dependencies of m have been transitively resolved and m is ready for evaluation.
- Let status be m.ModuleEvaluation().
NextJob Completion (status).
An implementation may parse a sourceText as a
15.2.1.20Runtime Semantics: Evaluation#
- Return
NormalCompletion (undefined ).
- Let result be the result of evaluating
ModuleItemList . - If result.[[Type]] is
normal and result.[[Value]] isempty , then- Return
NormalCompletion (undefined ).
- Return
- Return
Completion (result).
- Let sl be the result of evaluating
ModuleItemList . ReturnIfAbrupt (sl).- Let s be the result of evaluating
ModuleItem . - Return
Completion (UpdateEmpty (s, sl.[[Value]])).
The value of a
- Return
NormalCompletion (empty ).
15.2.2Imports#
Syntax
15.2.2.1Static Semantics: Early Errors#
-
It is a Syntax Error if the BoundNames of
ImportDeclaration contains any duplicate entries.
15.2.2.2Static Semantics: BoundNames#
- Return the BoundNames of
ImportClause .
- Return a new empty
List .
- Let names be the BoundNames of
ImportedDefaultBinding . - Append to names the elements of the BoundNames of
NameSpaceImport . - Return names.
- Let names be the BoundNames of
ImportedDefaultBinding . - Append to names the elements of the BoundNames of
NamedImports . - Return names.
- Return a new empty
List .
- Let names be the BoundNames of
ImportsList . - Append to names the elements of the BoundNames of
ImportSpecifier . - Return names.
- Return the BoundNames of
ImportedBinding .
15.2.2.3Static Semantics: ImportEntries#
- Let module be the sole element of ModuleRequests of
FromClause . - Return ImportEntriesForModule of
ImportClause with argument module.
- Return a new empty
List .
15.2.2.4Static Semantics: ImportEntriesForModule#
With parameter module.
- Let entries be ImportEntriesForModule of
ImportedDefaultBinding with argument module. - Append to entries the elements of the ImportEntriesForModule of
NameSpaceImport with argument module. - Return entries.
- Let entries be ImportEntriesForModule of
ImportedDefaultBinding with argument module. - Append to entries the elements of the ImportEntriesForModule of
NamedImports with argument module. - Return entries.
- Let localName be the sole element of BoundNames of
ImportedBinding . - Let defaultEntry be the
Record {[[ModuleRequest]]: module, [[ImportName]]:"default", [[LocalName]]: localName }. - Return a new
List containing defaultEntry.
- Let localName be the StringValue of
ImportedBinding . - Let entry be the
Record {[[ModuleRequest]]: module, [[ImportName]]:"*", [[LocalName]]: localName }. - Return a new
List containing entry.
- Return a new empty
List .
- Let specs be the ImportEntriesForModule of
ImportsList with argument module. - Append to specs the elements of the ImportEntriesForModule of
ImportSpecifier with argument module. - Return specs.
- Let localName be the sole element of BoundNames of
ImportedBinding . - Let entry be the
Record {[[ModuleRequest]]: module, [[ImportName]]: localName, [[LocalName]]: localName }. - Return a new
List containing entry.
- Let importName be the StringValue of
IdentifierName . - Let localName be the StringValue of
ImportedBinding . - Let entry be the
Record {[[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName }. - Return a new
List containing entry.
15.2.2.5Static Semantics: ModuleRequests#
- Return ModuleRequests of
FromClause .
- Return a
List containing the StringValue ofStringLiteral .
15.2.3Exports#
Syntax
15.2.3.1Static Semantics: Early Errors#
-
For each
IdentifierName n in ReferencedBindings ofExportClause : It is a Syntax Error if StringValue of n is aReservedWord or if the StringValue of n is one of:"implements","interface","let","package","private","protected","public", or"static".
The above rule means that each ReferencedBindings of
15.2.3.2Static Semantics: BoundNames#
- Return a new empty
List .
- Return the BoundNames of
VariableStatement .
- Return the BoundNames of
Declaration .
- Let declarationNames be the BoundNames of
HoistableDeclaration . - If declarationNames does not include the element
"*default*", append"*default*"to declarationNames. - Return declarationNames.
- Let declarationNames be the BoundNames of
ClassDeclaration . - If declarationNames does not include the element
"*default*", append"*default*"to declarationNames. - Return declarationNames.
- Return «
"*default*"».
15.2.3.3Static Semantics: ExportedBindings#
- Return a new empty
List .
- Return the ExportedBindings of
ExportClause .
- Return the BoundNames of
VariableStatement .
- Return the BoundNames of
Declaration .
- Return the BoundNames of this
ExportDeclaration .
- Return a new empty
List .
- Let names be the ExportedBindings of
ExportsList . - Append to names the elements of the ExportedBindings of
ExportSpecifier . - Return names.
- Return a
List containing the StringValue ofIdentifierName .
- Return a
List containing the StringValue of the firstIdentifierName .
15.2.3.4Static Semantics: ExportedNames#
- Return a new empty
List .
- Return the ExportedNames of
ExportClause .
- Return the BoundNames of
VariableStatement .
- Return the BoundNames of
Declaration .
- Return «
"default"».
- Return a new empty
List .
- Let names be the ExportedNames of
ExportsList . - Append to names the elements of the ExportedNames of
ExportSpecifier . - Return names.
- Return a
List containing the StringValue ofIdentifierName .
- Return a
List containing the StringValue of the secondIdentifierName .
15.2.3.5Static Semantics: ExportEntries#
- Let module be the sole element of ModuleRequests of
FromClause . - Let entry be the
Record {[[ModuleRequest]]: module, [[ImportName]]:"*", [[LocalName]]:null , [[ExportName]]:null }. - Return a new
List containing entry.
- Let module be the sole element of ModuleRequests of
FromClause . - Return ExportEntriesForModule of
ExportClause with argument module.
- Return ExportEntriesForModule of
ExportClause with argumentnull .
- Let entries be a new empty
List . - Let names be the BoundNames of
VariableStatement . - Repeat for each name in names,
- Append to entries the
Record {[[ModuleRequest]]:null , [[ImportName]]:null , [[LocalName]]: name, [[ExportName]]: name }.
- Append to entries the
- Return entries.
- Let entries be a new empty
List . - Let names be the BoundNames of
Declaration . - Repeat for each name in names,
- Append to entries the
Record {[[ModuleRequest]]:null , [[ImportName]]:null , [[LocalName]]: name, [[ExportName]]: name }.
- Append to entries the
- Return entries.
- Let names be BoundNames of
HoistableDeclaration . - Let localName be the sole element of names.
- Return a new
List containing theRecord {[[ModuleRequest]]:null , [[ImportName]]:null , [[LocalName]]: localName, [[ExportName]]:"default"}.
- Let names be BoundNames of
ClassDeclaration . - Let localName be the sole element of names.
- Return a new
List containing theRecord {[[ModuleRequest]]:null , [[ImportName]]:null , [[LocalName]]: localName, [[ExportName]]:"default"}.
"*default*" is used within this specification as a synthetic name for anonymous default export values.
15.2.3.6Static Semantics: ExportEntriesForModule#
With parameter module.
- Return a new empty
List .
- Let specs be the ExportEntriesForModule of
ExportsList with argument module. - Append to specs the elements of the ExportEntriesForModule of
ExportSpecifier with argument module. - Return specs.
- Let sourceName be the StringValue of
IdentifierName . - If module is
null , then- Let localName be sourceName.
- Let importName be
null .
- Else,
- Let localName be
null . - Let importName be sourceName.
- Let localName be
- Return a new
List containing theRecord {[[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName }.
- Let sourceName be the StringValue of the first
IdentifierName . - Let exportName be the StringValue of the second
IdentifierName . - If module is
null , then- Let localName be sourceName.
- Let importName be
null .
- Else,
- Let localName be
null . - Let importName be sourceName.
- Let localName be
- Return a new
List containing theRecord {[[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName }.
15.2.3.7Static Semantics: IsConstantDeclaration#
- Return
false .
It is not necessary to treat export default
15.2.3.8Static Semantics: LexicallyScopedDeclarations#
- Return a new empty
List .
- Return a new
List containing DeclarationPart ofDeclaration .
- Return a new
List containing DeclarationPart ofHoistableDeclaration .
- Return a new
List containingClassDeclaration .
- Return a new
List containing thisExportDeclaration .
15.2.3.9Static Semantics: ModuleRequests#
- Return the ModuleRequests of
FromClause .
- Return a new empty
List .
15.2.3.10Static Semantics: ReferencedBindings#
- Return a new empty
List .
- Let names be the ReferencedBindings of
ExportsList . - Append to names the elements of the ReferencedBindings of
ExportSpecifier . - Return names.
- Return a
List containing theIdentifierName .
- Return a
List containing the firstIdentifierName .
15.2.3.11Runtime Semantics: Evaluation#
- Return
NormalCompletion (empty ).
- Return the result of evaluating
VariableStatement .
- Return the result of evaluating
Declaration .
- Return the result of evaluating
HoistableDeclaration .
- Let value be the result of BindingClassDeclarationEvaluation of
ClassDeclaration . ReturnIfAbrupt (value).- Let className be the sole element of BoundNames of
ClassDeclaration . - If className is
"*default*", then- Let hasNameProperty be ?
HasOwnProperty (value,"name"). - If hasNameProperty is
false , performSetFunctionName (value,"default"). - Let env be the
running execution context 's LexicalEnvironment. - Perform ?
InitializeBoundName ("*default*", value, env).
- Let hasNameProperty be ?
- Return
NormalCompletion (empty ).
- Let rhs be the result of evaluating
AssignmentExpression . - Let value be ?
GetValue (rhs). - If
IsAnonymousFunctionDefinition (AssignmentExpression ) istrue , then- Let hasNameProperty be ?
HasOwnProperty (value,"name"). - If hasNameProperty is
false , performSetFunctionName (value,"default").
- Let hasNameProperty be ?
- Let env be the
running execution context 's LexicalEnvironment. - Perform ?
InitializeBoundName ("*default*", value, env). - Return
NormalCompletion (empty ).
16Error Handling and Language Extensions#
An implementation must report most errors at the time the relevant ECMAScript language construct is evaluated. An early error is an error that can be detected and reported prior to the evaluation of any construct in the eval is called and prevent evaluation of the eval code. All errors that are not early errors are runtime errors.
An implementation must report as an early error any occurrence of a condition that is listed in a “Static Semantics: Early Errors” subclause of this specification.
An implementation shall not treat other kinds of errors as early errors even if the compiler can prove that a construct cannot execute without error under any circumstances. An implementation may issue an early warning in such a case, but it should not report the error until the relevant construct is actually executed.
An implementation shall report all errors as specified, except for the following:
-
Except as restricted in
16.2 , an implementation may extendScript syntax,Module syntax, and regular expression pattern or flag syntax. To permit this, all operations (such as callingeval, using a regular expression literal, or using theFunctionorRegExpconstructor) that are allowed to throwSyntaxError are permitted to exhibit implementation-defined behaviour instead of throwingSyntaxError when they encounter an implementation-defined extension to the script syntax or regular expression pattern or flag syntax. -
Except as restricted in
16.2 , an implementation may provide additional types, values, objects, properties, and functions beyond those described in this specification. This may cause constructs (such as looking up a variable in the global scope) to have implementation-defined behaviour instead of throwing an error (such asReferenceError ).
An implementation may define behaviour other than throwing toFixed, toExponential, and toPrecision when the fractionDigits or precision argument is outside the specified range.
16.1HostReportErrors ( errorList )#
HostReportErrors is an implementation-defined abstract operation that allows host environments to report parsing errors, early errors, and runtime errors.
An implementation of HostReportErrors must complete normally in all cases. The default implementation of HostReportErrors is to do nothing.
errorList will be a
16.2Forbidden Extensions#
An implementation must not extend this specification in the following ways:
-
Other than as defined in this specification, ECMAScript Function objects defined using syntactic constructors in
strict mode code must not be created with own properties named"caller"or"arguments"other than those that are created by applying theAddRestrictedFunctionProperties abstract operation to the function. Such own properties also must not be created for function objects defined using anArrowFunction ,MethodDefinition ,GeneratorDeclaration ,GeneratorExpression ,ClassDeclaration , orClassExpression regardless of whether the definition is contained instrict mode code . Built-in functions, strict mode functions created using theFunctionconstructor, generator functions created using theGeneratorconstructor, and functions created using thebindmethod also must not be created with such own properties. -
If an implementation extends non-strict or built-in function objects with an own property named
"caller"the value of that property, as observed using [[Get]] or [[GetOwnProperty]], must not be a strict function object. If it is an accessor property, the function that is the value of the property's [[Get]] attribute must never return a strict function when called. -
The behaviour of the following methods must not be extended except as specified in ECMA-402:
Object.prototype.toLocaleString,Array.prototype.toLocaleString,Number.prototype.toLocaleString,Date.prototype.toLocaleDateString,Date.prototype.toLocaleString,Date.prototype.toLocaleTimeString,String.prototype.localeCompare,%TypedArray%.prototype.toLocaleString. -
The RegExp pattern grammars in
21.2.1 andB.1.4 must not be extended to recognize any of the source characters A-Z or a-z asIdentityEscape when the U grammar parameter is present.[U] -
The Syntactic Grammar must not be extended in any manner that allows the token
:to immediate follow source text that matches theBindingIdentifier nonterminal symbol. -
When processing
strict mode code , the syntax ofNumericLiteral must not be extended to include and the syntax ofLegacyOctalIntegerLiteral DecimalIntegerLiteral must not be extended to include as described inNonOctalDecimalIntegerLiteral B.1.1 . -
TemplateCharacter must not be extended to include as defined inLegacyOctalEscapeSequence B.1.2 . -
When processing
strict mode code , the extensions defined inB.3.2 ,B.3.3 , andB.3.4 must not be supported. -
When parsing for the
Module goal symbol, the lexical grammar extensions defined inB.1.3 must not be supported.
17ECMAScript Standard Built-in Objects#
There are certain built-in objects available whenever an ECMAScript
Unless specified otherwise, a built-in object that is callable as a function is a built-in Function object with the characteristics described in
Many built-in objects are functions: they can be invoked with arguments. Some of them furthermore are constructors: they are functions intended for use with the new operator. For each built-in function, this specification describes the arguments required by that function and the properties of that function object. For each built-in constructor, this specification furthermore describes properties of the prototype object of that constructor and properties of specific object instances returned by a new expression that invokes that constructor.
Unless otherwise specified in the description of a particular function, if a built-in function or constructor is given fewer arguments than the function is specified to require, the function or constructor shall behave exactly as if it had been given sufficient additional arguments, each such argument being the this value” and “NewTarget” have the meanings given in
Unless otherwise specified in the description of a particular function, if a built-in function or constructor described is given more arguments than the function is specified to allow, the extra arguments are evaluated by the call and then ignored by the function. However, an implementation may define implementation specific behaviour relating to such arguments as long as the behaviour is not the throwing of a
Implementations that add additional capabilities to the set of built-in functions are encouraged to do so by adding new functions rather than adding new parameters to existing functions.
Unless otherwise specified every built-in function and every built-in constructor has the Function prototype object, which is the initial value of the expression Function.prototype (
Unless otherwise specified every built-in prototype object has the Object prototype object, which is the initial value of the expression Object.prototype (
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.
Unless otherwise specified, each built-in function defined in this specification is created as if by calling the
Every built-in Function object, including constructors, has a length property whose value is an integer. Unless otherwise specified, this value is equal to the largest number of named arguments shown in the subclause headings for the function description. Optional parameters (which are indicated with brackets: [ ]) or rest parameters (which are shown using the form «...name») are not included in the default argument count.
For example, the function object that is the initial value of the map property of the Array prototype object is described under the subclause heading «Array.prototype.map (callbackFn [ , thisArg])» which shows the two named arguments callbackFn and thisArg, the latter being optional; therefore the value of the length property of that Function object is 1.
Unless otherwise specified, the length property of a built-in Function object has the attributes { [[Writable]]:
Every built-in Function object, including constructors, that is not identified as an anonymous function has a name property whose value is a String. Unless otherwise specified, this value is the name that is given to the function in this specification. For functions that are specified as properties of objects, the name value is the property name string used to access the function. Functions that are specified as get or set accessor functions of built-in properties have "get " or "set " prepended to the property name string. The value of the name property is explicitly specified for each built-in functions whose property key is a Symbol value.
Unless otherwise specified, the name property of a built-in Function object, if it exists, has the attributes { [[Writable]]:
Every other data property described in clauses 18 through 26 and in Annex
Every accessor property described in clauses 18 through 26 and in Annex
18The Global Object#
The unique
The new operator.
The
The value of the [[Prototype]] internal slot of the
In addition to the properties defined in this specification the window property of the
18.1Value Properties of the Global Object#
18.1.1Infinity#
The value of Infinity is
18.1.2NaN#
The value of NaN is
18.1.3undefined#
The value of undefined is
18.2Function Properties of the Global Object#
18.2.1eval (x)#
The eval function is the %eval% intrinsic object. When the eval function is called with one argument x, the following steps are taken:
- Let evalRealm be the value of the
active function object 's [[Realm]] internal slot. - Let strictCaller be
false . - Let directEval be
false . - Return ?
PerformEval (x, evalRealm, strictCaller, directEval).
18.2.1.1Runtime Semantics: PerformEval( x, evalRealm, strictCaller, direct)#
The abstract operation PerformEval with arguments x, evalRealm, strictCaller, and direct performs the following steps:
- Assert: If direct is
false , then strictCaller is alsofalse . - If
Type (x) is not String, return x. - Let script be the ECMAScript code that is the result of parsing x, interpreted as UTF-16 encoded Unicode text as described in
6.1.4 , for the goal symbolScript . If the parse fails, throw aSyntaxError exception. If any early errors are detected, throw aSyntaxError or aReferenceError exception, depending on the type of the error (but see also clause16 ). Parsing andearly error detection may be interweaved in an implementation dependent manner. - If script Contains
ScriptBody isfalse , returnundefined . - Let body be the
ScriptBody of script. - If strictCaller is
true , let strictEval betrue . - Else, let strictEval be IsStrict of script.
- Let ctx be the
running execution context . If direct istrue , ctx will be theexecution context that performed thedirect eval . If direct isfalse , ctx will be theexecution context for the invocation of theevalfunction. - If direct is
true , then- Let lexEnv be
NewDeclarativeEnvironment (ctx's LexicalEnvironment). - Let varEnv be ctx's VariableEnvironment.
- Let lexEnv be
- Else,
- Let lexEnv be
NewDeclarativeEnvironment (evalRealm.[[GlobalEnv]]). - Let varEnv be evalRealm.[[GlobalEnv]].
- Let lexEnv be
- If strictEval is
true , let varEnv be lexEnv. - If ctx is not already suspended, suspend ctx.
- Let evalCxt be a new ECMAScript code
execution context . - Set the evalCxt's Function to
null . - Set the evalCxt's
Realm to evalRealm. - Set the evalCxt's ScriptOrModule to ctx's ScriptOrModule.
- Set the evalCxt's VariableEnvironment to varEnv.
- Set the evalCxt's LexicalEnvironment to lexEnv.
- Push evalCxt on to the
execution context stack ; evalCxt is now therunning execution context . - Let result be
EvalDeclarationInstantiation (body, varEnv, lexEnv, strictEval). - If result.[[Type]] is
normal , then- Let result be the result of evaluating body.
- If result.[[Type]] is
normal and result.[[Value]] isempty , then- Let result be
NormalCompletion (undefined ).
- Let result be
- Suspend evalCxt and remove it from the
execution context stack . - Resume the context that is now on the top of the
execution context stack as therunning execution context . - Return
Completion (result).
The eval code cannot instantiate variable or function bindings in the variable environment of the calling context that invoked the eval if the calling context is evaluating formal parameter initializers or if either the code of the calling context or the eval code is strict code. Instead such bindings are instantiated in a new VariableEnvironment that is only accessible to the eval code. Bindings introduced by let, const, or class declarations are always instantiated in a new LexicalEnvironment.
18.2.1.2Runtime Semantics: EvalDeclarationInstantiation( body, varEnv, lexEnv, strict)#
When the abstract operation EvalDeclarationInstantiation is called with arguments body, varEnv, lexEnv, and strict, the following steps are taken:
- Let varNames be the VarDeclaredNames of body.
- Let varDeclarations be the VarScopedDeclarations of body.
- Let lexEnvRec be lexEnv's
EnvironmentRecord . - Let varEnvRec be varEnv's
EnvironmentRecord . - If strict is
false , then- If varEnvRec is a global
Environment Record , then- For each name in varNames, do
- If varEnvRec.HasLexicalDeclaration(name) is
true , throw aSyntaxError exception. - NOTE:
evalwill not create a global var declaration that would be shadowed by a global lexical declaration.
- If varEnvRec.HasLexicalDeclaration(name) is
- For each name in varNames, do
- Let thisLex be lexEnv.
- Assert: the following loop will terminate.
- Repeat while thisLex is not the same as varEnv,
- Let thisEnvRec be thisLex's
EnvironmentRecord . - If thisEnvRec is not an object
Environment Record , then- NOTE: The environment of with statements cannot contain any lexical declaration so it doesn't need to be checked for var/let hoisting conflicts.
- For each name in varNames, do
- If thisEnvRec.HasBinding(name) is
true , then- Throw a
SyntaxError exception.
- Throw a
- NOTE: A
direct eval will not hoist var declaration over a like-named lexical declaration.
- If thisEnvRec.HasBinding(name) is
- Let thisLex be thisLex's outer environment reference.
- Let thisEnvRec be thisLex's
- If varEnvRec is a global
- Let functionsToInitialize be a new empty
List . - Let declaredFunctionNames be a new empty
List . - For each d in varDeclarations, in reverse list order do
- If d is neither a
VariableDeclaration or aForBinding , then- Assert: d is either a
FunctionDeclaration or aGeneratorDeclaration . - NOTE If there are multiple
FunctionDeclaration s for the same name, the last declaration is used. - Let fn be the sole element of the BoundNames of d.
- If fn is not an element of declaredFunctionNames, then
- If varEnvRec is a global
Environment Record , then- Let fnDefinable be ? varEnvRec.CanDeclareGlobalFunction(fn).
- If fnDefinable is
false , throw aTypeError exception.
- Append fn to declaredFunctionNames.
- Insert d as the first element of functionsToInitialize.
- If varEnvRec is a global
- Assert: d is either a
- If d is neither a
- NOTE: Annex
B.3.3.3 adds additional steps at this point. - Let declaredVarNames be a new empty
List . - For each d in varDeclarations, do
- If d is a
VariableDeclaration or aForBinding , then- For each String vn in the BoundNames of d, do
- If vn is not an element of declaredFunctionNames, then
- If varEnvRec is a global
Environment Record , then- Let vnDefinable be ? varEnvRec.CanDeclareGlobalVar(vn).
- If vnDefinable is
false , throw aTypeError exception.
- If vn is not an element of declaredVarNames, then
- Append vn to declaredVarNames.
- If varEnvRec is a global
- If vn is not an element of declaredFunctionNames, then
- For each String vn in the BoundNames of d, do
- If d is a
- NOTE: No abnormal terminations occur after this algorithm step unless varEnvRec is a global
Environment Record and theglobal object is a Proxy exotic object. - Let lexDeclarations be the LexicallyScopedDeclarations of body.
- For each element d in lexDeclarations do
- NOTE Lexically declared names are only instantiated here but not initialized.
- For each element dn of the BoundNames of d do
- If IsConstantDeclaration of d is
true , then- Perform ? lexEnvRec.CreateImmutableBinding(dn,
true ).
- Perform ? lexEnvRec.CreateImmutableBinding(dn,
- Else,
- Perform ? lexEnvRec.CreateMutableBinding(dn,
false ).
- Perform ? lexEnvRec.CreateMutableBinding(dn,
- If IsConstantDeclaration of d is
- For each production f in functionsToInitialize, do
- Let fn be the sole element of the BoundNames of f.
- Let fo be the result of performing InstantiateFunctionObject for f with argument lexEnv.
- If varEnvRec is a global
Environment Record , then- Perform ? varEnvRec.CreateGlobalFunctionBinding(fn, fo,
true ).
- Perform ? varEnvRec.CreateGlobalFunctionBinding(fn, fo,
- Else,
- Let bindingExists be varEnvRec.HasBinding(fn).
- If bindingExists is
false , then- Let status be ! varEnvRec.CreateMutableBinding(fn,
true ). - Assert: status is not an
abrupt completion because of validation preceding step 12. - Perform ! varEnvRec.InitializeBinding(fn, fo).
- Let status be ! varEnvRec.CreateMutableBinding(fn,
- Else,
- Perform ! varEnvRec.SetMutableBinding(fn, fo,
false ).
- Perform ! varEnvRec.SetMutableBinding(fn, fo,
- For each String vn in declaredVarNames, in list order do
- If varEnvRec is a global
Environment Record , then- Perform ? varEnvRec.CreateGlobalVarBinding(vn,
true ).
- Perform ? varEnvRec.CreateGlobalVarBinding(vn,
- Else,
- Let bindingExists be varEnvRec.HasBinding(vn).
- If bindingExists is
false , then- Let status be ! varEnvRec.CreateMutableBinding(vn,
true ). - Assert: status is not an
abrupt completion because of validation preceding step 12. - Perform ! varEnvRec.InitializeBinding(vn,
undefined ).
- Let status be ! varEnvRec.CreateMutableBinding(vn,
- If varEnvRec is a global
- Return
NormalCompletion (empty ).
An alternative version of this algorithm is described in
18.2.2isFinite (number)#
The isFinite function is the %isFinite% intrinsic object. When the isFinite function is called with one argument number, the following steps are taken:
- Let num be ?
ToNumber (number). - If num is
NaN ,+∞ , or-∞ , returnfalse . - Otherwise, return
true .
18.2.3isNaN (number)#
The isNaN function is the %isNaN% intrinsic object. When the isNaN function is called with one argument number, the following steps are taken:
- Let num be ?
ToNumber (number). - If num is
NaN , returntrue . - Otherwise, return
false .
A reliable way for ECMAScript code to test if a value X is a X !== X. The result will be X is a
18.2.4parseFloat (string)#
The parseFloat function produces a Number value dictated by interpretation of the contents of the string argument as a decimal literal.
The parseFloat function is the %parseFloat% intrinsic object. When the parseFloat function is called with one argument string, the following steps are taken:
- Let inputString be ?
ToString (string). - Let trimmedString be a substring of inputString consisting of the leftmost code unit that is not a
StrWhiteSpaceChar and all code units to the right of that code unit. (In other words, remove leading white space.) If inputString does not contain any such code units, let trimmedString be the empty string. - If neither trimmedString nor any prefix of trimmedString satisfies the syntax of a
StrDecimalLiteral (see7.1.3.1 ), returnNaN . - Let numberString be the longest prefix of trimmedString, which might be trimmedString itself, that satisfies the syntax of a
StrDecimalLiteral . - Let mathFloat be MV of numberString.
- If mathFloat=0, then
- If the first code unit of trimmedString is
"-", return-0 . - Return
+0 .
- If the first code unit of trimmedString is
- Return the Number value for mathFloat.
parseFloat may interpret only a leading portion of string as a Number value; it ignores any code units that cannot be interpreted as part of the notation of an decimal literal, and no indication is given that any such code units were ignored.
18.2.5parseInt (string, radix)#
The parseInt function produces an integer value dictated by interpretation of the contents of the string argument according to the specified radix. Leading white space in string is ignored. If radix is 0x or 0X, in which case a radix of 16 is assumed. If radix is 16, the number may also optionally begin with the code unit pairs 0x or 0X.
The parseInt function is the %parseInt% intrinsic object. When the parseInt function is called, the following steps are taken:
- Let inputString be ?
ToString (string). - Let S be a newly created substring of inputString consisting of the first code unit that is not a
StrWhiteSpaceChar and all code units following that code unit. (In other words, remove leading white space.) If inputString does not contain any such code unit, let S be the empty string. - Let sign be 1.
- If S is not empty and the first code unit of S is 0x002D (HYPHEN-MINUS), let sign be -1.
- If S is not empty and the first code unit of S is 0x002B (PLUS SIGN) or 0x002D (HYPHEN-MINUS), remove the first code unit from S.
- Let R be ?
ToInt32 (radix). - Let stripPrefix be
true . - If R ≠ 0, then
- If R < 2 or R > 36, return
NaN . - If R ≠ 16, let stripPrefix be
false .
- If R < 2 or R > 36, return
- Else R = 0,
- Let R be 10.
- If stripPrefix is
true , then- If the length of S is at least 2 and the first two code units of S are either
"0x"or"0X", remove the first two code units from S and let R be 16.
- If the length of S is at least 2 and the first two code units of S are either
- If S contains a code unit that is not a radix-R digit, let Z be the substring of S consisting of all code units before the first such code unit; otherwise, let Z be S.
- If Z is empty, return
NaN . - Let mathInt be the mathematical integer value that is represented by Z in radix-R notation, using the letters A-Z and a-z for digits with values 10 through 35. (However, if R is 10 and Z contains more than 20 significant digits, every significant digit after the 20th may be replaced by a 0 digit, at the option of the implementation; and if R is not 2, 4, 8, 10, 16, or 32, then mathInt may be an implementation-dependent approximation to the mathematical integer value that is represented by Z in radix-R notation.)
- If mathInt = 0, then
- If sign = -1, return
-0 . - Return
+0 .
- If sign = -1, return
- Let number be the Number value for mathInt.
- Return sign × number.
parseInt may interpret only a leading portion of string as an integer value; it ignores any code units that cannot be interpreted as part of the notation of an integer, and no indication is given that any such code units were ignored.
18.2.6URI Handling Functions#
Uniform Resource Identifiers, or URIs, are Strings that identify resources (e.g. web pages or files) and transport protocols by which to access them (e.g. HTTP or FTP) on the Internet. The ECMAScript language itself does not provide any support for using URIs except for functions that encode and decode URIs as described in
Many implementations of ECMAScript provide additional functions and methods that manipulate web pages; these functions are beyond the scope of this standard.
18.2.6.1URI Syntax and Semantics#
A URI is composed of a sequence of components separated by component separators. The general form is:
:
/
;
?
where the italicized names represent components and “:”, “/”, “;” and “?” are reserved for use as separators. The encodeURI and decodeURI functions are intended to work with complete URIs; they assume that any reserved code units in the URI are intended to have special meaning and so are not encoded. The encodeURIComponent and decodeURIComponent functions are intended to work with the individual component parts of a URI; they assume that any reserved code units represent text and so must be encoded so that they are not interpreted as reserved code units when the component is part of a complete URI.
The following lexical grammar specifies the form of encoded URIs.
Syntax
The above syntax is based upon RFC 2396 and does not reflect changes introduced by the more recent RFC 3986.
Runtime Semantics
When a code unit to be included in a URI is not listed above or is not intended to have the special meaning sometimes given to the reserved code units, that code unit must be encoded. The code unit is transformed into its UTF-8 encoding, with surrogate pairs first converted from UTF-16 to the corresponding code point value. (Note that for code units in the range [0,127] this results in a single octet with the same value.) The resulting sequence of octets is then transformed into a String with each octet represented by an escape sequence of the form "%xx".
18.2.6.1.1Runtime Semantics: Encode ( string, unescapedSet )#
The encoding and escaping process is described by the abstract operation Encode taking two String arguments string and unescapedSet.
- Let strLen be the number of code units in string.
- Let R be the empty String.
- Let k be 0.
- Repeat
- If k equals strLen, return R.
- Let C be the code unit at index k within string.
- If C is in unescapedSet, then
- Let S be a String containing only the code unit C.
- Let R be a new String value computed by concatenating the previous value of R and S.
- Else C is not in unescapedSet,
- If the code unit value of C is not less than 0xDC00 and not greater than 0xDFFF, throw a
URIError exception. - If the code unit value of C is less than 0xD800 or greater than 0xDBFF, then
- Let V be the code unit value of C.
- Else,
- Increase k by 1.
- If k equals strLen, throw a
URIError exception. - Let kChar be the code unit value of the code unit at index k within string.
- If kChar is less than 0xDC00 or greater than 0xDFFF, throw a
URIError exception. - Let V be
UTF16Decode (C, kChar).
- Let Octets be the array of octets resulting by applying the UTF-8 transformation to V, and let L be the array size.
- Let j be 0.
- Repeat, while j < L
- Let jOctet be the value at index j within Octets.
- Let S be a String containing three code units
"%XY"where XY are two uppercase hexadecimal digits encoding the value of jOctet. - Let R be a new String value computed by concatenating the previous value of R and S.
- Increase j by 1.
- If the code unit value of C is not less than 0xDC00 and not greater than 0xDFFF, throw a
- Increase k by 1.
18.2.6.1.2Runtime Semantics: Decode ( string, reservedSet )#
The unescaping and decoding process is described by the abstract operation Decode taking two String arguments string and reservedSet.
- Let strLen be the number of code units in string.
- Let R be the empty String.
- Let k be 0.
- Repeat
- If k equals strLen, return R.
- Let C be the code unit at index k within string.
- If C is not
"%", then- Let S be the String containing only the code unit C.
- Else C is
"%",- Let start be k.
- If k + 2 is greater than or equal to strLen, throw a
URIError exception. - If the code units at index (k + 1) and (k + 2) within string do not represent hexadecimal digits, throw a
URIError exception. - Let B be the 8-bit value represented by the two hexadecimal digits at index (k + 1) and (k + 2).
- Increment k by 2.
- If the most significant bit in B is 0, then
- Let C be the code unit with code unit value B.
- If C is not in reservedSet, then
- Let S be the String containing only the code unit C.
- Else C is in reservedSet,
- Let S be the substring of string from index start to index k inclusive.
- Else the most significant bit in B is 1,
- Let n be the smallest nonnegative integer such that (B << n) & 0x80 is equal to 0.
- If n equals 1 or n is greater than 4, throw a
URIError exception. - Let Octets be an array of 8-bit integers of size n.
- Put B into Octets at index 0.
- If k + (3 × (n - 1)) is greater than or equal to strLen, throw a
URIError exception. - Let j be 1.
- Repeat, while j < n
- Increment k by 1.
- If the code unit at index k within string is not
"%", throw aURIError exception. - If the code units at index (k + 1) and (k + 2) within string do not represent hexadecimal digits, throw a
URIError exception. - Let B be the 8-bit value represented by the two hexadecimal digits at index (k + 1) and (k + 2).
- If the two most significant bits in B are not 10, throw a
URIError exception. - Increment k by 2.
- Put B into Octets at index j.
- Increment j by 1.
- Let V be the value obtained by applying the UTF-8 transformation to Octets, that is, from an array of octets into a 21-bit value. If Octets does not contain a valid UTF-8 encoding of a Unicode code point, throw a
URIError exception. - If V < 0x10000, then
- Let C be the code unit V.
- If C is not in reservedSet, then
- Let S be the String containing only the code unit C.
- Else C is in reservedSet,
- Let S be the substring of string from index start to index k inclusive.
- Else V ≥ 0x10000,
- Let L be (((V - 0x10000) & 0x3FF) + 0xDC00).
- Let H be ((((V - 0x10000) >> 10) & 0x3FF) + 0xD800).
- Let S be the String containing the two code units H and L.
- Let R be a new String value computed by concatenating the previous value of R and S.
- Increase k by 1.
This syntax of Uniform Resource Identifiers is based upon RFC 2396 and does not reflect the more recent RFC 3986 which replaces RFC 2396. A formal description and implementation of UTF-8 is given in RFC 3629.
In UTF-8, characters are encoded using sequences of 1 to 6 octets. The only octet of a sequence of one has the higher-order bit set to 0, the remaining 7 bits being used to encode the character value. In a sequence of n octets, n>1, the initial octet has the n higher-order bits set to 1, followed by a bit set to 0. The remaining bits of that octet contain bits from the value of the character to be encoded. The following octets all have the higher-order bit set to 1 and the following bit set to 0, leaving 6 bits in each to contain bits from the character to be encoded. The possible UTF-8 encodings of ECMAScript characters are specified in
| Code Unit Value | Representation | 1st Octet | 2nd Octet | 3rd Octet | 4th Octet |
|---|---|---|---|---|---|
0x0000 - 0x007F
|
00000000 0zzzzzzz
|
0zzzzzzz
|
|||
0x0080 - 0x07FF
|
00000yyy yyzzzzzz
|
110yyyyy
|
10zzzzzz
|
||
0x0800 - 0xD7FF
|
xxxxyyyy yyzzzzzz
|
1110xxxx
|
10yyyyyy
|
10zzzzzz
|
|
0xD800 - 0xDBFF
followed by 0xDC00 - 0xDFFF
|
110110vv vvwwwwxx
followed by 110111yy yyzzzzzz
|
11110uuu
|
10uuwwww
|
10xxyyyy
|
10zzzzzz
|
0xD800 - 0xDBFF
not followed by 0xDC00 - 0xDFFF
|
causes URIError
|
||||
0xDC00 - 0xDFFF
|
causes URIError
|
||||
0xE000 - 0xFFFF
|
xxxxyyyy yyzzzzzz
|
1110xxxx
|
10yyyyyy
|
10zzzzzz
|
Where
uuuuu = vvvv + 1
to account for the addition of 0x10000 as in Surrogates, section 3.8, of the Unicode Standard.
The range of code unit values 0xD800-0xDFFF is used to encode surrogate pairs; the above transformation combines a UTF-16 surrogate pair into a UTF-32 representation and encodes the resulting 21-bit value in UTF-8. Decoding reconstructs the surrogate pair.
RFC 3629 prohibits the decoding of invalid UTF-8 octet sequences. For example, the invalid sequence C0 80 must not decode into the code unit 0x0000. Implementations of the Decode algorithm are required to throw a
18.2.6.2decodeURI (encodedURI)#
The decodeURI function computes a new version of a URI in which each escape sequence and UTF-8 encoding of the sort that might be introduced by the encodeURI function is replaced with the UTF-16 encoding of the code points that it represents. Escape sequences that could not have been introduced by encodeURI are not replaced.
The decodeURI function is the %decodeURI% intrinsic object. When the decodeURI function is called with one argument encodedURI, the following steps are taken:
- Let uriString be ?
ToString (encodedURI). - Let reservedURISet be a String containing one instance of each code unit valid in
uriReserved plus"#". - Return ?
Decode (uriString, reservedURISet).
The code point "#" is not decoded from escape sequences even though it is not a reserved URI code point.
18.2.6.3decodeURIComponent (encodedURIComponent)#
The decodeURIComponent function computes a new version of a URI in which each escape sequence and UTF-8 encoding of the sort that might be introduced by the encodeURIComponent function is replaced with the UTF-16 encoding of the code points that it represents.
The decodeURIComponent function is the %decodeURIComponent% intrinsic object. When the decodeURIComponent function is called with one argument encodedURIComponent, the following steps are taken:
18.2.6.4encodeURI (uri)#
The encodeURI function computes a new version of a UTF-16 encoded (
The encodeURI function is the %encodeURI% intrinsic object. When the encodeURI function is called with one argument uri, the following steps are taken:
- Let uriString be ?
ToString (uri). - Let unescapedURISet be a String containing one instance of each code unit valid in
uriReserved anduriUnescaped plus"#". - Return ?
Encode (uriString, unescapedURISet).
The code unit "#" is not encoded to an escape sequence even though it is not a reserved or unescaped URI code point.
18.2.6.5encodeURIComponent (uriComponent)#
The encodeURIComponent function computes a new version of a UTF-16 encoded (
The encodeURIComponent function is the %encodeURIComponent% intrinsic object. When the encodeURIComponent function is called with one argument uriComponent, the following steps are taken:
- Let componentString be ?
ToString (uriComponent). - Let unescapedURIComponentSet be a String containing one instance of each code unit valid in
uriUnescaped . - Return ?
Encode (componentString, unescapedURIComponentSet).
18.3Constructor Properties of the Global Object#
18.3.1Array ( . . . )#
See
18.3.2ArrayBuffer ( . . . )#
See
18.3.3Boolean ( . . . )#
See
18.3.4DataView ( . . . )#
See
18.3.5Date ( . . . )#
See
18.3.6Error ( . . . )#
See
18.3.7EvalError ( . . . )#
See
18.3.8Float32Array ( . . . )#
See
18.3.9Float64Array ( . . . )#
See
18.3.10Function ( . . . )#
See
18.3.11Int8Array ( . . . )#
See
18.3.12Int16Array ( . . . )#
See
18.3.13Int32Array ( . . . )#
See
18.3.14Map ( . . . )#
See
18.3.15Number ( . . . )#
See
18.3.16Object ( . . . )#
See
18.3.17Proxy ( . . . )#
See
18.3.18Promise ( . . . )#
See
18.3.19RangeError ( . . . )#
See
18.3.20ReferenceError ( . . . )#
See
18.3.21RegExp ( . . . )#
See
18.3.22Set ( . . . )#
See
18.3.23String ( . . . )#
See
18.3.24Symbol ( . . . )#
See
18.3.25SyntaxError ( . . . )#
See
18.3.26TypeError ( . . . )#
See
18.3.27Uint8Array ( . . . )#
See
18.3.28Uint8ClampedArray ( . . . )#
See
18.3.29Uint16Array ( . . . )#
See
18.3.30Uint32Array ( . . . )#
See
18.3.31URIError ( . . . )#
See
18.3.32WeakMap ( . . . )#
See
18.3.33WeakSet ( . . . )#
See
18.4Other Properties of the Global Object#
18.4.1JSON#
See
18.4.2Math#
See
18.4.3Reflect#
See
19Fundamental Objects#
19.1Object Objects#
19.1.1The Object Constructor#
The Object constructor is the %Object% intrinsic object and the initial value of the Object property of the Object is called as a function rather than as a constructor, it performs a type conversion.
The Object constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition.
19.1.1.1Object ( [ value ] )#
When Object function is called with optional argument value, the following steps are taken:
- If NewTarget is neither
undefined nor the active function, then- Return ?
OrdinaryCreateFromConstructor (NewTarget,"%ObjectPrototype%").
- Return ?
- If value is
null ,undefined or not supplied, returnObjectCreate (%ObjectPrototype% ). - Return
ToObject (value).
The length property of the Object constructor function is 1.
19.1.2Properties of the Object Constructor#
The value of the [[Prototype]] internal slot of the Object constructor is the intrinsic object
Besides the length property, the Object constructor has the following properties:
19.1.2.1Object.assign ( target, ...sources )#
The assign function is used to copy the values of all of the enumerable own properties from one or more source objects to a target object. When the assign function is called, the following steps are taken:
- Let to be ?
ToObject (target). - If only one argument was passed, return to.
- Let sources be the
List of argument values starting with the second argument. - For each element nextSource of sources, in ascending index order,
- Return to.
The length property of the assign method is 2.
19.1.2.2Object.create ( O, Properties )#
The create function creates a new object with a specified prototype. When the create function is called, the following steps are taken:
- If
Type (O) is neither Object nor Null, throw aTypeError exception. - Let obj be
ObjectCreate (O). - If Properties is not
undefined , then- Return ?
ObjectDefineProperties (obj, Properties).
- Return ?
- Return obj.
19.1.2.3Object.defineProperties ( O, Properties )#
The defineProperties function is used to add own properties and/or update the attributes of existing own properties of an object. When the defineProperties function is called, the following steps are taken:
- Return ?
ObjectDefineProperties (O, Properties).
19.1.2.3.1Runtime Semantics: ObjectDefineProperties ( O, Properties )#
The abstract operation ObjectDefineProperties with arguments O and Properties performs the following steps:
- If
Type (O) is not Object, throw aTypeError exception. - Let props be ?
ToObject (Properties). - Let keys be ? props.[[OwnPropertyKeys]]().
- Let descriptors be a new empty
List . - Repeat for each element nextKey of keys in
List order,- Let propDesc be ? props.[[GetOwnProperty]](nextKey).
- If propDesc is not
undefined and propDesc.[[Enumerable]] istrue , then- Let descObj be ?
Get (props, nextKey). - Let desc be ?
ToPropertyDescriptor (descObj). - Append the pair (a two element
List ) consisting of nextKey and desc to the end of descriptors.
- Let descObj be ?
- For each pair from descriptors in list order,
- Let P be the first element of pair.
- Let desc be the second element of pair.
- Perform ?
DefinePropertyOrThrow (O, P, desc).
- Return O.
19.1.2.4Object.defineProperty ( O, P, Attributes )#
The defineProperty function is used to add an own property and/or update the attributes of an existing own property of an object. When the defineProperty function is called, the following steps are taken:
- If
Type (O) is not Object, throw aTypeError exception. - Let key be ?
ToPropertyKey (P). - Let desc be ?
ToPropertyDescriptor (Attributes). - Perform ?
DefinePropertyOrThrow (O, key, desc). - Return O.
19.1.2.5Object.freeze ( O )#
When the freeze function is called, the following steps are taken:
- If
Type (O) is not Object, return O. - Let status be ?
SetIntegrityLevel (O,"frozen"). - If status is
false , throw aTypeError exception. - Return O.
19.1.2.6Object.getOwnPropertyDescriptor ( O, P )#
When the getOwnPropertyDescriptor function is called, the following steps are taken:
- Let obj be ?
ToObject (O). - Let key be ?
ToPropertyKey (P). - Let desc be ? obj.[[GetOwnProperty]](key).
- Return
FromPropertyDescriptor (desc).
19.1.2.7Object.getOwnPropertyNames ( O )#
When the getOwnPropertyNames function is called, the following steps are taken:
- Return ?
GetOwnPropertyKeys (O, String).
19.1.2.8Object.getOwnPropertySymbols ( O )#
When the getOwnPropertySymbols function is called with argument O, the following steps are taken:
- Return ?
GetOwnPropertyKeys (O, Symbol).
19.1.2.8.1Runtime Semantics: GetOwnPropertyKeys ( O, Type )#
The abstract operation GetOwnPropertyKeys is called with arguments O and Type where O is an Object and Type is one of the ECMAScript specification types String or Symbol. The following steps are taken:
- Let obj be ?
ToObject (O). - Let keys be ? obj.[[OwnPropertyKeys]]().
- Let nameList be a new empty
List . - Repeat for each element nextKey of keys in
List order,- If
Type (nextKey) is Type, then- Append nextKey as the last element of nameList.
- If
- Return
CreateArrayFromList (nameList).
19.1.2.9Object.getPrototypeOf ( O )#
When the getPrototypeOf function is called with argument O, the following steps are taken:
- Let obj be ?
ToObject (O). - Return ? obj.[[GetPrototypeOf]]().
19.1.2.10Object.is ( value1, value2 )#
When the is function is called with arguments value1 and value2, the following steps are taken:
- Return
SameValue (value1, value2).
19.1.2.11Object.isExtensible ( O )#
When the isExtensible function is called with argument O, the following steps are taken:
- If
Type (O) is not Object, returnfalse . - Return ?
IsExtensible (O).
19.1.2.12Object.isFrozen ( O )#
When the isFrozen function is called with argument O, the following steps are taken:
- If
Type (O) is not Object, returntrue . - Return ?
TestIntegrityLevel (O,"frozen").
19.1.2.13Object.isSealed ( O )#
When the isSealed function is called with argument O, the following steps are taken:
- If
Type (O) is not Object, returntrue . - Return ?
TestIntegrityLevel (O,"sealed").
19.1.2.14Object.keys ( O )#
When the keys function is called with argument O, the following steps are taken:
- Let obj be ?
ToObject (O). - Let nameList be ?
EnumerableOwnNames (obj). - Return
CreateArrayFromList (nameList).
If an implementation defines a specific order of enumeration for the for-in statement, the same order must be used for the elements of the array returned in step 3.
19.1.2.15Object.preventExtensions ( O )#
When the preventExtensions function is called, the following steps are taken:
- If
Type (O) is not Object, return O. - Let status be ? O.[[PreventExtensions]]().
- If status is
false , throw aTypeError exception. - Return O.
19.1.2.16Object.prototype#
The initial value of Object.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
19.1.2.17Object.seal ( O )#
When the seal function is called, the following steps are taken:
- If
Type (O) is not Object, return O. - Let status be ?
SetIntegrityLevel (O,"sealed"). - If status is
false , throw aTypeError exception. - Return O.
19.1.2.18Object.setPrototypeOf ( O, proto )#
When the setPrototypeOf function is called with arguments O and proto, the following steps are taken:
- Let O be ?
RequireObjectCoercible (O). - If
Type (proto) is neither Object nor Null, throw aTypeError exception. - If
Type (O) is not Object, return O. - Let status be ? O.[[SetPrototypeOf]](proto).
- If status is
false , throw aTypeError exception. - Return O.
19.1.3Properties of the Object Prototype Object#
The Object prototype object is the intrinsic object %ObjectPrototype%. The Object prototype object is an
The value of the [[Prototype]] internal slot of the Object prototype object is
19.1.3.1Object.prototype.constructor#
The initial value of Object.prototype.constructor is the intrinsic object
19.1.3.2Object.prototype.hasOwnProperty ( V )#
When the hasOwnProperty method is called with argument V, the following steps are taken:
- Let P be ?
ToPropertyKey (V). - Let O be ?
ToObject (this value). - Return ?
HasOwnProperty (O, P).
The ordering of steps 1 and 2 is chosen to ensure that any exception that would have been thrown by step 1 in previous editions of this specification will continue to be thrown even if the
19.1.3.3Object.prototype.isPrototypeOf ( V )#
When the isPrototypeOf method is called with argument V, the following steps are taken:
The ordering of steps 1 and 2 preserves the behaviour specified by previous editions of this specification for the case where V is not an object and the
19.1.3.4Object.prototype.propertyIsEnumerable ( V )#
When the propertyIsEnumerable method is called with argument V, the following steps are taken:
- Let P be ?
ToPropertyKey (V). - Let O be ?
ToObject (this value). - Let desc be ? O.[[GetOwnProperty]](P).
- If desc is
undefined , returnfalse . - Return the value of desc.[[Enumerable]].
This method does not consider objects in the prototype chain.
The ordering of steps 1 and 2 is chosen to ensure that any exception that would have been thrown by step 1 in previous editions of this specification will continue to be thrown even if the
19.1.3.5Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )#
When the toLocaleString method is called, the following steps are taken:
- Let O be the
this value. - Return ?
Invoke (O,"toString").
The optional parameters to this function are not used but are intended to correspond to the parameter pattern used by ECMA-402 toLocalString functions. Implementations that do not include ECMA-402 support must not use those parameter positions for other purposes.
This function provides a generic toLocaleString implementation for objects that have no locale-specific toString behaviour. Array, Number, Date, and Typed Arrays provide their own locale-sensitive toLocaleString methods.
ECMA-402 intentionally does not provide an alternative to this default implementation.
19.1.3.6Object.prototype.toString ( )#
When the toString method is called, the following steps are taken:
- If the
this value isundefined , return"[object Undefined]". - If the
this value isnull , return"[object Null]". - Let O be
ToObject (this value). - Let isArray be ?
IsArray (O). - If isArray is
true , let builtinTag be"Array". - Else, if O is an exotic String object, let builtinTag be
"String". - Else, if O has an [[ParameterMap]] internal slot, let builtinTag be
"Arguments". - Else, if O has a [[Call]] internal method, let builtinTag be
"Function". - Else, if O has an [[ErrorData]] internal slot, let builtinTag be
"Error". - Else, if O has a [[BooleanData]] internal slot, let builtinTag be
"Boolean". - Else, if O has a [[NumberData]] internal slot, let builtinTag be
"Number". - Else, if O has a [[DateValue]] internal slot, let builtinTag be
"Date". - Else, if O has a [[RegExpMatcher]] internal slot, let builtinTag be
"RegExp". - Else, let builtinTag be
"Object". - Let tag be ?
Get (O, @@toStringTag). - If
Type (tag) is not String, let tag be builtinTag. - Return the String that is the result of concatenating
"[object ", tag, and"]".
This function is the %ObjProto_toString% intrinsic object.
Historically, this function was occasionally used to access the String value of the [[Class]] internal slot that was used in previous editions of this specification as a nominal type tag for various built-in objects. The above definition of toString preserves compatibility for legacy code that uses toString as a test for those specific kinds of built-in objects. It does not provide a reliable type testing mechanism for other kinds of built-in or program defined objects. In addition, programs can use @@toStringTag in ways that will invalidate the reliability of such legacy type tests.
19.1.3.7Object.prototype.valueOf ( )#
When the valueOf method is called, the following steps are taken:
- Return ?
ToObject (this value).
This function is the %ObjProto_valueOf% intrinsic object.
19.1.4Properties of Object Instances#
Object instances have no special properties beyond those inherited from the Object prototype object.
19.2Function Objects#
19.2.1The Function Constructor#
The Function constructor is the %Function% intrinsic object and the initial value of the Function property of the Function is called as a function rather than as a constructor, it creates and initializes a new Function object. Thus the function call Function(…) is equivalent to the object creation expression new Function(…) with the same arguments.
The Function constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified Function behaviour must include a super call to the Function constructor to create and initialize a subclass instances with the internal slots necessary for built-in function behaviour. All ECMAScript syntactic forms for defining function objects create instances of Function. There is no syntactic means to create instances of Function subclasses except for the built-in Generator Function subclass.
19.2.1.1Function ( p1, p2, … , pn, body )#
The last argument specifies the body (executable code) of a function; any preceding arguments specify formal parameters.
When the Function function is called with some arguments p1, p2, … , pn, body (where n might be 0, that is, there are no “p” arguments, and where body might also not be provided), the following steps are taken:
- Let C be the
active function object . - Let args be the argumentsList that was passed to this function by [[Call]] or [[Construct]].
- Return ?
CreateDynamicFunction (C, NewTarget,"normal", args).
It is permissible but not necessary to have one argument for each formal parameter to be specified. For example, all three of the following expressions produce the same result:
new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")
19.2.1.1.1Runtime Semantics: CreateDynamicFunction(constructor, newTarget, kind, args)#
The abstract operation CreateDynamicFunction is called with arguments constructor, newTarget, kind, and args. constructor is the constructor function that is performing this action, newTarget is the constructor that new was initially applied to, kind is either "normal" or "generator", and args is a
- If newTarget is
undefined , let newTarget be constructor. - If kind is
"normal", then- Let goal be the grammar symbol
FunctionBody . - Let parameterGoal be the grammar symbol
FormalParameters . - Let fallbackProto be
"%FunctionPrototype%".
- Let goal be the grammar symbol
- Else,
- Let goal be the grammar symbol
GeneratorBody . - Let parameterGoal be the grammar symbol
FormalParameters .[Yield] - Let fallbackProto be
"%Generator%".
- Let goal be the grammar symbol
- Let argCount be the number of elements in args.
- Let P be the empty String.
- If argCount = 0, let bodyText be the empty String.
- Else if argCount = 1, let bodyText be args[0].
- Else argCount > 1,
- Let firstArg be args[0].
- Let P be ?
ToString (firstArg). - Let k be 1.
- Repeat, while k < argCount-1
- Let nextArg be args[k].
- Let nextArgString be ?
ToString (nextArg). - Let P be the result of concatenating the previous value of P, the String
","(a comma), and nextArgString. - Increase k by 1.
- Let bodyText be args[k].
- Let bodyText be ?
ToString (bodyText). - Let parameters be the result of parsing P, interpreted as UTF-16 encoded Unicode text as described in
6.1.4 , using parameterGoal as the goal symbol. Throw aSyntaxError exception if the parse fails. - Let body be the result of parsing bodyText, interpreted as UTF-16 encoded Unicode text as described in
6.1.4 , using goal as the goal symbol. Throw aSyntaxError exception if the parse fails. - If bodyText is
strict mode code , then let strict betrue , else let strict befalse . - If any static semantics errors are detected for parameters or body, throw a
SyntaxError or aReferenceError exception, depending on the type of the error. If strict istrue , the Early Error rules for are applied. Parsing andStrictFormalParameters : FormalParameters early error detection may be interweaved in an implementation dependent manner. - If ContainsUseStrict of body is
true and IsSimpleParameterList of parameters isfalse , throw aSyntaxError exception. - If any element of the BoundNames of parameters also occurs in the LexicallyDeclaredNames of body, throw a
SyntaxError exception. - If body Contains
SuperCall istrue , throw aSyntaxError exception. - If parameters Contains
SuperCall istrue , throw aSyntaxError exception. - If body Contains
SuperProperty istrue , throw aSyntaxError exception. - If parameters Contains
SuperProperty istrue , throw aSyntaxError exception. - If kind is
"generator", then- If parameters Contains
YieldExpression istrue , throw aSyntaxError exception.
- If parameters Contains
- If strict is
true , then- If BoundNames of parameters contains any duplicate elements, throw a
SyntaxError exception.
- If BoundNames of parameters contains any duplicate elements, throw a
- Let proto be ?
GetPrototypeFromConstructor (newTarget, fallbackProto). - Let F be
FunctionAllocate (proto, strict, kind). - Let realmF be the value of F's [[Realm]] internal slot.
- Let scope be realmF.[[GlobalEnv]].
- Perform
FunctionInitialize (F,Normal , parameters, body, scope). - If kind is
"generator", then- Let prototype be
ObjectCreate (%GeneratorPrototype% ). - Perform
DefinePropertyOrThrow (F,"prototype", PropertyDescriptor{[[Value]]: prototype, [[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:false }).
- Let prototype be
- Else, perform
MakeConstructor (F). - Perform
SetFunctionName (F,"anonymous"). - Return F.
A prototype property is automatically created for every function created using CreateDynamicFunction, to provide for the possibility that the function will be used as a constructor.
19.2.2Properties of the Function Constructor#
The Function constructor is itself a built-in function object. The value of the [[Prototype]] internal slot of the Function constructor is the intrinsic object
The value of the [[Extensible]] internal slot of the Function constructor is
The Function constructor has the following properties:
19.2.2.1Function.length#
This is a data property with a value of 1. This property has the attributes { [[Writable]]:
19.2.2.2Function.prototype#
The value of Function.prototype is
This property has the attributes { [[Writable]]:
19.2.3Properties of the Function Prototype Object#
The Function prototype object is the intrinsic object %FunctionPrototype%. The Function prototype object is itself a built-in function object. When invoked, it accepts any arguments and returns
The Function prototype object is specified to be a function object to ensure compatibility with ECMAScript code that was created prior to the ECMAScript 2015 specification.
The value of the [[Prototype]] internal slot of the Function prototype object is the intrinsic object
The Function prototype object does not have a prototype property.
The value of the length property of the Function prototype object is 0.
The value of the name property of the Function prototype object is the empty String.
19.2.3.1Function.prototype.apply ( thisArg, argArray )#
When the apply method is called on an object func with arguments thisArg and argArray, the following steps are taken:
- If
IsCallable (func) isfalse , throw aTypeError exception. - If argArray is
null orundefined , then- Perform
PrepareForTailCall (). - Return ?
Call (func, thisArg).
- Perform
- Let argList be ?
CreateListFromArrayLike (argArray). - Perform
PrepareForTailCall (). - Return ?
Call (func, thisArg, argList).
The thisArg value is passed without modification as the
If func is an arrow function or a
19.2.3.2Function.prototype.bind ( thisArg, ...args)#
When the bind method is called with argument thisArg and zero or more args, it performs the following steps:
- Let Target be the
this value. - If
IsCallable (Target) isfalse , throw aTypeError exception. - Let args be a new (possibly empty)
List consisting of all of the argument values provided after thisArg in order. - Let F be ?
BoundFunctionCreate (Target, thisArg, args). - Let targetHasLength be ?
HasOwnProperty (Target,"length"). - If targetHasLength is
true , then - Else let L be 0.
- Perform !
DefinePropertyOrThrow (F,"length", PropertyDescriptor {[[Value]]: L, [[Writable]]:false , [[Enumerable]]:false , [[Configurable]]:true }). - Let targetName be ?
Get (Target,"name"). - If
Type (targetName) is not String, let targetName be the empty string. - Perform
SetFunctionName (F, targetName,"bound"). - Return F.
Function objects created using Function.prototype.bind are exotic objects. They also do not have a prototype property.
If Target is an arrow function or a
19.2.3.3Function.prototype.call (thisArg, ...args)#
When the call method is called on an object func with argument, thisArg and zero or more args, the following steps are taken:
- If
IsCallable (func) isfalse , throw aTypeError exception. - Let argList be a new empty
List . - If this method was called with more than one argument, then in left to right order, starting with the second argument, append each argument as the last element of argList.
- Perform
PrepareForTailCall (). - Return ?
Call (func, thisArg, argList).
The thisArg value is passed without modification as the
If func is an arrow function or a
19.2.3.4Function.prototype.constructor#
The initial value of Function.prototype.constructor is the intrinsic object
19.2.3.5Function.prototype.toString ( )#
When the toString method is called on an object func, the following steps are taken:
- If func is a Bound Function exotic object, then
- Return an implementation-dependent String source code representation of func. The representation must conform to the rules below. It is implementation dependent whether the representation includes
bound function information or information about the target function.
- Return an implementation-dependent String source code representation of func. The representation must conform to the rules below. It is implementation dependent whether the representation includes
- If
Type (func) is Object and is either a built-in function object or has an [[ECMAScriptCode]] internal slot, then- Return an implementation-dependent String source code representation of func. The representation must conform to the rules below.
- Throw a
TypeError exception.
toString Representation Requirements:
-
The string representation must have the syntax of a
FunctionDeclaration ,FunctionExpression ,GeneratorDeclaration ,GeneratorExpression ,ClassDeclaration ,ClassExpression ,ArrowFunction ,MethodDefinition , orGeneratorMethod depending upon the actual characteristics of the object. - The use and placement of white space, line terminators, and semicolons within the representation String is implementation-dependent.
-
If the object was defined using ECMAScript code and the returned string representation is not in the form of a
MethodDefinition orGeneratorMethod then the representation must be such that if the string is evaluated, usingevalin a lexical context that is equivalent to the lexical context used to create the original object, it will result in a new functionally equivalent object. In that case the returned source code must not mention freely any variables that were not mentioned freely by the original function's source code, even if these “extra” names were originally in scope. -
If the implementation cannot produce a source code string that meets these criteria then it must return a string for which
evalwill throw aSyntaxError exception.
19.2.3.6Function.prototype [ @@hasInstance ] ( V )#
When the @@hasInstance method of an object F is called with value V, the following steps are taken:
- Let F be the
this value. - Return ?
OrdinaryHasInstance (F, V).
The value of the name property of this function is "[Symbol.hasInstance]".
This property has the attributes { [[Writable]]:
This is the default implementation of @@hasInstance that most functions inherit. @@hasInstance is called by the instanceof operator to determine whether a value is an instance of a specific constructor. An expression such as
v instanceof F
evaluates as
F[@@hasInstance](v)
A constructor function can control which objects are recognized as its instances by instanceof by exposing a different @@hasInstance method on the function.
This property is non-writable and non-configurable to prevent tampering that could be used to globally expose the target function of a
19.2.4Function Instances#
Every function instance is an ECMAScript function object and has the internal slots listed in Function.prototype.bind method (
The Function instances have the following properties:
19.2.4.1length#
The value of the length property is an integer that indicates the typical number of arguments expected by the function. However, the language permits the function to be invoked with some other number of arguments. The behaviour of a function when invoked on a number of arguments other than the number specified by its length property depends on the function. This property has the attributes { [[Writable]]:
19.2.4.2name#
The value of the name property is an String that is descriptive of the function. The name has no semantic significance but is typically a variable or property name that is used to refer to the function at its point of definition in ECMAScript code. This property has the attributes { [[Writable]]:
Anonymous functions objects that do not have a contextual name associated with them by this specification do not have a name own property but inherit the name property of
19.2.4.3prototype#
Function instances that can be used as a constructor have a prototype property. Whenever such a function instance is created another ordinary object is also created and is the initial value of the function's prototype property. Unless otherwise specified, the value of the prototype property is used to initialize the [[Prototype]] internal slot of the object created when that function is invoked as a constructor.
This property has the attributes { [[Writable]]:
Function objects created using Function.prototype.bind, or by evaluating a prototype property.
19.3Boolean Objects#
19.3.1The Boolean Constructor#
The Boolean constructor is the %Boolean% intrinsic object and the initial value of the Boolean property of the Boolean is called as a function rather than as a constructor, it performs a type conversion.
The Boolean constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified Boolean behaviour must include a super call to the Boolean constructor to create and initialize the subclass instance with a [[BooleanData]] internal slot.
19.3.1.1Boolean ( value )#
When Boolean is called with argument value, the following steps are taken:
- Let b be
ToBoolean (value). - If NewTarget is
undefined , return b. - Let O be ?
OrdinaryCreateFromConstructor (NewTarget,"%BooleanPrototype%", « [[BooleanData]] »). - Set the value of O's [[BooleanData]] internal slot to b.
- Return O.
19.3.2Properties of the Boolean Constructor#
The value of the [[Prototype]] internal slot of the Boolean constructor is the intrinsic object
The Boolean constructor has the following properties:
19.3.2.1Boolean.prototype#
The initial value of Boolean.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
19.3.3Properties of the Boolean Prototype Object#
The Boolean prototype object is the intrinsic object %BooleanPrototype%. The Boolean prototype object is an ordinary object. The Boolean prototype is itself a Boolean object; it has a [[BooleanData]] internal slot with the value
The value of the [[Prototype]] internal slot of the Boolean prototype object is the intrinsic object
19.3.3.1thisBooleanValue ( value )#
The abstract operation thisBooleanValue(value) performs the following steps:
19.3.3.2Boolean.prototype.constructor#
The initial value of Boolean.prototype.constructor is the intrinsic object
19.3.3.3Boolean.prototype.toString ( )#
The following steps are taken:
- Let b be ?
thisBooleanValue (this value). - If b is
true , return"true"; else return"false".
19.3.3.4Boolean.prototype.valueOf ( )#
The following steps are taken:
- Return ?
thisBooleanValue (this value).
19.3.4Properties of Boolean Instances#
Boolean instances are ordinary objects that inherit properties from the Boolean prototype object. Boolean instances have a [[BooleanData]] internal slot. The [[BooleanData]] internal slot is the Boolean value represented by this Boolean object.
19.4Symbol Objects#
19.4.1The Symbol Constructor#
The Symbol constructor is the %Symbol% intrinsic object and the initial value of the Symbol property of the Symbol is called as a function, it returns a new Symbol value.
The Symbol constructor is not intended to be used with the new operator or to be subclassed. It may be used as the value of an extends clause of a class definition but a super call to the Symbol constructor will cause an exception.
19.4.1.1Symbol ( [ description ] )#
When Symbol is called with optional argument description, the following steps are taken:
- If NewTarget is not
undefined , throw aTypeError exception. - If description is
undefined , let descString beundefined . - Else, let descString be ?
ToString (description). - Return a new unique Symbol value whose [[Description]] value is descString.
19.4.2Properties of the Symbol Constructor#
The value of the [[Prototype]] internal slot of the Symbol constructor is the intrinsic object
The Symbol constructor has the following properties:
19.4.2.1Symbol.for ( key )#
When Symbol.for is called with argument key it performs the following steps:
- Let stringKey be ?
ToString (key). - For each element e of the GlobalSymbolRegistry
List ,- If
SameValue (e.[[Key]], stringKey) istrue , return e.[[Symbol]].
- If
- Assert: GlobalSymbolRegistry does not currently contain an entry for stringKey.
- Let newSymbol be a new unique Symbol value whose [[Description]] value is stringKey.
- Append the
Record { [[Key]]: stringKey, [[Symbol]]: newSymbol } to the GlobalSymbolRegistryList . - Return newSymbol.
The GlobalSymbolRegistry is a
19.4.2.2Symbol.hasInstance#
The initial value of Symbol.hasInstance is the well known symbol @@hasInstance (
This property has the attributes { [[Writable]]:
19.4.2.3Symbol.isConcatSpreadable#
The initial value of Symbol.isConcatSpreadable is the well known symbol @@isConcatSpreadable (
This property has the attributes { [[Writable]]:
19.4.2.4Symbol.iterator#
The initial value of Symbol.iterator is the well known symbol @@iterator (
This property has the attributes { [[Writable]]:
19.4.2.5Symbol.keyFor ( sym )#
When Symbol.keyFor is called with argument sym it performs the following steps:
19.4.2.6Symbol.match#
The initial value of Symbol.match is the well known symbol @@match (
This property has the attributes { [[Writable]]:
19.4.2.7Symbol.prototype#
The initial value of Symbol.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
19.4.2.8Symbol.replace#
The initial value of Symbol.replace is the well known symbol @@replace (
This property has the attributes { [[Writable]]:
19.4.2.9Symbol.search#
The initial value of Symbol.search is the well known symbol @@search (
This property has the attributes { [[Writable]]:
19.4.2.10Symbol.species#
The initial value of Symbol.species is the well known symbol @@species (
This property has the attributes { [[Writable]]:
19.4.2.11Symbol.split#
The initial value of Symbol.split is the well known symbol @@split (
This property has the attributes { [[Writable]]:
19.4.2.12Symbol.toPrimitive#
The initial value of Symbol.toPrimitive is the well known symbol @@toPrimitive (
This property has the attributes { [[Writable]]:
19.4.2.13Symbol.toStringTag#
The initial value of Symbol.toStringTag is the well known symbol @@toStringTag (
This property has the attributes { [[Writable]]:
19.4.2.14Symbol.unscopables#
The initial value of Symbol.unscopables is the well known symbol @@unscopables (
This property has the attributes { [[Writable]]:
19.4.3Properties of the Symbol Prototype Object#
The Symbol prototype object is the intrinsic object %SymbolPrototype%. The Symbol prototype object is an ordinary object. It is not a Symbol instance and does not have a [[SymbolData]] internal slot.
The value of the [[Prototype]] internal slot of the Symbol prototype object is the intrinsic object
19.4.3.1Symbol.prototype.constructor#
The initial value of Symbol.prototype.constructor is the intrinsic object
19.4.3.2Symbol.prototype.toString ( )#
The following steps are taken:
- Let s be the
this value. - If
Type (s) is Symbol, let sym be s. - Else,
- If
Type (s) is not Object, throw aTypeError exception. - If s does not have a [[SymbolData]] internal slot, throw a
TypeError exception. - Let sym be the value of s's [[SymbolData]] internal slot.
- If
- Return
SymbolDescriptiveString (sym).
19.4.3.2.1Runtime Semantics: SymbolDescriptiveString ( sym )#
When the abstract operation SymbolDescriptiveString is called with argument sym, the following steps are taken:
19.4.3.3Symbol.prototype.valueOf ( )#
The following steps are taken:
19.4.3.4Symbol.prototype [ @@toPrimitive ] ( hint )#
This function is called by ECMAScript language operators to convert a Symbol object to a primitive value. The allowed values for hint are "default", "number", and "string".
When the @@toPrimitive method is called with argument hint, the following steps are taken:
The value of the name property of this function is "[Symbol.toPrimitive]".
This property has the attributes { [[Writable]]:
19.4.3.5Symbol.prototype [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "Symbol".
This property has the attributes { [[Writable]]:
19.4.4Properties of Symbol Instances#
Symbol instances are ordinary objects that inherit properties from the Symbol prototype object. Symbol instances have a [[SymbolData]] internal slot. The [[SymbolData]] internal slot is the Symbol value represented by this Symbol object.
19.5Error Objects#
Instances of Error objects are thrown as exceptions when runtime errors occur. The Error objects may also serve as base objects for user-defined exception classes.
19.5.1The Error Constructor#
The Error constructor is the %Error% intrinsic object and the initial value of the Error property of the Error is called as a function rather than as a constructor, it creates and initializes a new Error object. Thus the function call Error(…) is equivalent to the object creation expression new Error(…) with the same arguments.
The Error constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified Error behaviour must include a super call to the Error constructor to create and initialize subclass instances with a [[ErrorData]] internal slot.
19.5.1.1Error ( message )#
When the Error function is called with argument message, the following steps are taken:
- If NewTarget is
undefined , let newTarget be theactive function object , else let newTarget be NewTarget. - Let O be ?
OrdinaryCreateFromConstructor (newTarget,"%ErrorPrototype%", « [[ErrorData]] »). - If message is not
undefined , then- Let msg be ?
ToString (message). - Let msgDesc be the PropertyDescriptor{[[Value]]: msg, [[Writable]]:
true , [[Enumerable]]:false , [[Configurable]]:true }. - Perform !
DefinePropertyOrThrow (O,"message", msgDesc).
- Let msg be ?
- Return O.
19.5.2Properties of the Error Constructor#
The value of the [[Prototype]] internal slot of the Error constructor is the intrinsic object
The Error constructor has the following properties:
19.5.2.1Error.prototype#
The initial value of Error.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
19.5.3Properties of the Error Prototype Object#
The Error prototype object is the intrinsic object %ErrorPrototype%. The Error prototype object is an ordinary object. It is not an Error instance and does not have an [[ErrorData]] internal slot.
The value of the [[Prototype]] internal slot of the Error prototype object is the intrinsic object
19.5.3.1Error.prototype.constructor#
The initial value of Error.prototype.constructor is the intrinsic object
19.5.3.2Error.prototype.message#
The initial value of Error.prototype.message is the empty String.
19.5.3.3Error.prototype.name#
The initial value of Error.prototype.name is "Error".
19.5.3.4Error.prototype.toString ( )#
The following steps are taken:
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - Let name be ?
Get (O,"name"). - If name is
undefined , let name be"Error"; otherwise let name be ?ToString (name). - Let msg be ?
Get (O,"message"). - If msg is
undefined , let msg be the empty String; otherwise let msg be ?ToString (msg). - If name is the empty String, return msg.
- If msg is the empty String, return name.
- Return the result of concatenating name, the code unit 0x003A (COLON), the code unit 0x0020 (SPACE), and msg.
19.5.4Properties of Error Instances#
Error instances are ordinary objects that inherit properties from the Error prototype object and have an [[ErrorData]] internal slot whose value is Object.prototype.toString.
19.5.5Native Error Types Used in This Standard#
A new instance of one of the NativeError objects below is thrown when a runtime error is detected. All of these objects share the same structure, as described in
19.5.5.1EvalError#
This exception is not currently used within this specification. This object remains for compatibility with previous editions of this specification.
19.5.5.2RangeError#
Indicates a value that is not in the set or range of allowable values.
19.5.5.3ReferenceError#
Indicate that an invalid reference value has been detected.
19.5.5.4SyntaxError#
Indicates that a parsing error has occurred.
19.5.5.5TypeError#
TypeError is used to indicate an unsuccessful operation when none of the other NativeError objects are an appropriate indication of the failure cause.
19.5.5.6URIError#
Indicates that one of the global URI handling functions was used in a way that is incompatible with its definition.
19.5.6NativeError Object Structure#
When an ECMAScript implementation detects a runtime error, it throws a new instance of one of the NativeError objects defined in name property of the prototype object, and in the implementation-defined message property of the prototype object.
For each error object, references to NativeError in the definition should be replaced with the appropriate error object name from
19.5.6.1NativeError Constructors#
When a NativeError constructor is called as a function rather than as a constructor, it creates and initializes a new NativeError object. A call of the object as a function is equivalent to calling it as a constructor with the same arguments. Thus the function call NativeError(…) is equivalent to the object creation expression new NativeError(…) with the same arguments.
Each NativeError constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified NativeError behaviour must include a super call to the NativeError constructor to create and initialize subclass instances with a [[ErrorData]] internal slot.
19.5.6.1.1NativeError ( message )#
When a NativeError function is called with argument message, the following steps are taken:
- If NewTarget is
undefined , let newTarget be theactive function object , else let newTarget be NewTarget. - Let O be ?
OrdinaryCreateFromConstructor (newTarget,"%NativeErrorPrototype%", « [[ErrorData]] »). - If message is not
undefined , then- Let msg be ?
ToString (message). - Let msgDesc be the PropertyDescriptor{[[Value]]: msg, [[Writable]]:
true , [[Enumerable]]:false , [[Configurable]]:true }. - Perform !
DefinePropertyOrThrow (O,"message", msgDesc).
- Let msg be ?
- Return O.
The actual value of the string passed in step 2 is either "%EvalErrorPrototype%", "%RangeErrorPrototype%", "%ReferenceErrorPrototype%", "%SyntaxErrorPrototype%", "%TypeErrorPrototype%", or "%URIErrorPrototype%" corresponding to which NativeError constructor is being defined.
19.5.6.2Properties of the NativeError Constructors#
The value of the [[Prototype]] internal slot of a NativeError constructor is the intrinsic object
Each NativeError constructor has a name property whose value is the String value `"NativeError"`.
Each NativeError constructor has the following properties:
19.5.6.2.1NativeError.prototype#
The initial value of NativeError.prototype is a NativeError prototype object (
This property has the attributes { [[Writable]]:
19.5.6.3Properties of the NativeError Prototype Objects#
Each NativeError prototype object is an ordinary object. It is not an Error instance and does not have an [[ErrorData]] internal slot.
The value of the [[Prototype]] internal slot of each NativeError prototype object is the intrinsic object
19.5.6.3.1NativeError.prototype.constructor#
The initial value of the constructor property of the prototype for a given NativeError constructor is the corresponding intrinsic object %NativeError% (
19.5.6.3.2NativeError.prototype.message#
The initial value of the message property of the prototype for a given NativeError constructor is the empty String.
19.5.6.3.3NativeError.prototype.name#
The initial value of the name property of the prototype for a given NativeError constructor is a string consisting of the name of the constructor (the name used instead of NativeError).
19.5.6.4Properties of NativeError Instances#
NativeError instances are ordinary objects that inherit properties from their NativeError prototype object and have an [[ErrorData]] internal slot whose value is Object.prototype.toString (
20Numbers and Dates#
20.1Number Objects#
20.1.1The Number Constructor#
The Number constructor is the %Number% intrinsic object and the initial value of the Number property of the Number is called as a function rather than as a constructor, it performs a type conversion.
The Number constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified Number behaviour must include a super call to the Number constructor to create and initialize the subclass instance with a [[NumberData]] internal slot.
20.1.1.1Number ( value )#
When Number is called with argument number, the following steps are taken:
- If no arguments were passed to this function invocation, let n be
+0 . - Else, let n be ?
ToNumber (value). - If NewTarget is
undefined , return n. - Let O be ?
OrdinaryCreateFromConstructor (NewTarget,"%NumberPrototype%", « [[NumberData]] »). - Set the value of O's [[NumberData]] internal slot to n.
- Return O.
20.1.2Properties of the Number Constructor#
The value of the [[Prototype]] internal slot of the Number constructor is the intrinsic object
The Number constructor has the following properties:
20.1.2.1Number.EPSILON#
The value of Number.EPSILON is the difference between 1 and the smallest value greater than 1 that is representable as a Number value, which is approximately 2.2204460492503130808472633361816 x 10-16.
This property has the attributes { [[Writable]]:
20.1.2.2Number.isFinite ( number )#
When the Number.isFinite is called with one argument number, the following steps are taken:
- If
Type (number) is not Number, returnfalse . - If number is
NaN ,+∞ , or-∞ , returnfalse . - Otherwise, return
true .
20.1.2.3Number.isInteger ( number )#
When the Number.isInteger is called with one argument number, the following steps are taken:
20.1.2.4Number.isNaN ( number )#
When the Number.isNaN is called with one argument number, the following steps are taken:
- If
Type (number) is not Number, returnfalse . - If number is
NaN , returntrue . - Otherwise, return
false .
This function differs from the global isNaN function (
20.1.2.5Number.isSafeInteger ( number )#
When the Number.isSafeInteger is called with one argument number, the following steps are taken:
20.1.2.6Number.MAX_SAFE_INTEGER#
The value of Number.MAX_SAFE_INTEGER is the largest integer n such that n and n + 1 are both exactly representable as a Number value.
The value of Number.MAX_SAFE_INTEGER is 9007199254740991 (253-1).
This property has the attributes { [[Writable]]:
20.1.2.7Number.MAX_VALUE#
The value of Number.MAX_VALUE is the largest positive finite value of the Number type, which is approximately
This property has the attributes { [[Writable]]:
20.1.2.8Number.MIN_SAFE_INTEGER#
The value of Number.MIN_SAFE_INTEGER is the smallest integer n such that n and n - 1 are both exactly representable as a Number value.
The value of Number.MIN_SAFE_INTEGER is -9007199254740991 (-(253-1)).
This property has the attributes { [[Writable]]:
20.1.2.9Number.MIN_VALUE#
The value of Number.MIN_VALUE is the smallest positive value of the Number type, which is approximately
In the IEEE 754-2008 double precision binary representation, the smallest possible value is a denormalized number. If an implementation does not support denormalized values, the value of Number.MIN_VALUE must be the smallest non-zero positive value that can actually be represented by the implementation.
This property has the attributes { [[Writable]]:
20.1.2.10Number.NaN#
The value of Number.NaN is
This property has the attributes { [[Writable]]:
20.1.2.11Number.NEGATIVE_INFINITY#
The value of Number.NEGATIVE_INFINITY is
This property has the attributes { [[Writable]]:
20.1.2.12Number.parseFloat ( string )#
The value of the Number.parseFloat data property is the same built-in function object that is the value of the parseFloat property of the
20.1.2.13Number.parseInt ( string, radix )#
The value of the Number.parseInt data property is the same built-in function object that is the value of the parseInt property of the
20.1.2.14Number.POSITIVE_INFINITY#
The value of Number.POSITIVE_INFINITY is
This property has the attributes { [[Writable]]:
20.1.2.15Number.prototype#
The initial value of Number.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
20.1.3Properties of the Number Prototype Object#
The Number prototype object is the intrinsic object %NumberPrototype%. The Number prototype object is an ordinary object. The Number prototype is itself a Number object; it has a [[NumberData]] internal slot with the value
The value of the [[Prototype]] internal slot of the Number prototype object is the intrinsic object
Unless explicitly stated otherwise, the methods of the Number prototype object defined below are not generic and the
The abstract operation thisNumberValue(value) performs the following steps:
The phrase “this Number value” within the specification of a method refers to the result returned by calling the abstract operation thisNumberValue with the
20.1.3.1Number.prototype.constructor#
The initial value of Number.prototype.constructor is the intrinsic object
20.1.3.2Number.prototype.toExponential ( fractionDigits )#
Return a String containing this Number value represented in decimal exponential notation with one digit before the significand's decimal point and fractionDigits digits after the significand's decimal point. If fractionDigits is
- Let x be ? thisNumberValue(
this value). - Let f be ?
ToInteger (fractionDigits). - Assert: f is 0, when fractionDigits is
undefined . - If x is
NaN , return the String"NaN". - Let s be the empty String.
- If x < 0, then
- Let s be
"-". - Let x be -x.
- Let s be
- If x =
+∞ , then- Return the concatenation of the Strings s and
"Infinity".
- Return the concatenation of the Strings s and
- If f < 0 or f > 20, throw a
RangeError exception. However, an implementation is permitted to extend the behaviour oftoExponentialfor values of f less than 0 or greater than 20. In this casetoExponentialwould not necessarily throwRangeError for such values. - If x = 0, then
- Let m be the String consisting of f+1 occurrences of the code unit 0x0030 (DIGIT ZERO).
- Let e be 0.
- Else x ≠ 0,
- If fractionDigits is not
undefined , then- Let e and n be integers such that 10f ≤ n < 10f+1 and for which the exact mathematical value of n × 10e-f - x is as close to zero as possible. If there are two such sets of e and n, pick the e and n for which n × 10e-f is larger.
- Else fractionDigits is
undefined ,- Let e, n, and f be integers such that f ≥ 0, 10f ≤ n < 10f+1, the Number value for n × 10e-f is x, and f is as small as possible. Note that the decimal representation of n has f+1 digits, n is not divisible by 10, and the least significant digit of n is not necessarily uniquely determined by these criteria.
- Let m be the String consisting of the digits of the decimal representation of n (in order, with no leading zeroes).
- If fractionDigits is not
- If f ≠ 0, then
- Let a be the first element of m, and let b be the remaining f elements of m.
- Let m be the concatenation of the three Strings a,
".", and b.
- If e = 0, then
- Let c be
"+". - Let d be
"0".
- Let c be
- Else,
- If e > 0, let c be
"+". - Else e ≤ 0,
- Let c be
"-". - Let e be -e.
- Let c be
- Let d be the String consisting of the digits of the decimal representation of e (in order, with no leading zeroes).
- If e > 0, let c be
- Let m be the concatenation of the four Strings m,
"e", c, and d. - Return the concatenation of the Strings s and m.
If the toExponential method is called with more than one argument, then the behaviour is undefined (see clause
For implementations that provide more accurate conversions than required by the rules above, it is recommended that the following alternative version of step 10.b.i be used as a guideline:
- Let e, n, and f be integers such that f ≥ 0, 10f ≤ n < 10f+1, the Number value for n × 10e-f is x, and f is as small as possible. If there are multiple possibilities for n, choose the value of n for which n × 10e-f is closest in value to x. If there are two such possible values of n, choose the one that is even.
20.1.3.3Number.prototype.toFixed ( fractionDigits )#
toFixed returns a String containing this Number value represented in decimal fixed-point notation with fractionDigits digits after the decimal point. If fractionDigits is
The following steps are performed:
- Let x be ? thisNumberValue(
this value). - Let f be ?
ToInteger (fractionDigits). (If fractionDigits isundefined , this step produces the value 0.) - If f < 0 or f > 20, throw a
RangeError exception. However, an implementation is permitted to extend the behaviour oftoFixedfor values of f less than 0 or greater than 20. In this casetoFixedwould not necessarily throwRangeError for such values. - If x is
NaN , return the String"NaN". - Let s be the empty String.
- If x < 0, then
- Let s be
"-". - Let x be -x.
- Let s be
- If x ≥ 1021, then
- Let m be !
ToString (x).
- Let m be !
- Else x < 1021,
- Let n be an integer for which the exact mathematical value of n ÷ 10f - x is as close to zero as possible. If there are two such n, pick the larger n.
- If n = 0, let m be the String
"0". Otherwise, let m be the String consisting of the digits of the decimal representation of n (in order, with no leading zeroes). - If f ≠ 0, then
- Let k be the number of elements in m.
- If k ≤ f, then
- Let z be the String consisting of f+1-k occurrences of the code unit 0x0030 (DIGIT ZERO).
- Let m be the concatenation of Strings z and m.
- Let k be f + 1.
- Let a be the first k-f elements of m, and let b be the remaining f elements of m.
- Let m be the concatenation of the three Strings a,
".", and b.
- Return the concatenation of the Strings s and m.
If the toFixed method is called with more than one argument, then the behaviour is undefined (see clause
The output of toFixed may be more precise than toString for some values because toString only prints enough significant digits to distinguish the number from adjacent number values. For example,
(1000000000000000128).toString() returns "1000000000000000100", while
(1000000000000000128).toFixed(0) returns "1000000000000000128".
20.1.3.4Number.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ])#
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the Number.prototype.toLocaleString method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleString method is used.
Produces a String value that represents this Number value formatted according to the conventions of the host environment's current locale. This function is implementation-dependent, and it is permissible, but not encouraged, for it to return the same thing as toString.
The meanings of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
20.1.3.5Number.prototype.toPrecision ( precision )#
Return a String containing this Number value represented either in decimal exponential notation with one digit before the significand's decimal point and
- Let x be ? thisNumberValue(
this value). - If precision is
undefined , return !ToString (x). - Let p be ?
ToInteger (precision). - If x is
NaN , return the String"NaN". - Let s be the empty String.
- If x < 0, then
- Let s be code unit 0x002D (HYPHEN-MINUS).
- Let x be -x.
- If x =
+∞ , then- Return the String that is the concatenation of s and
"Infinity".
- Return the String that is the concatenation of s and
- If p < 1 or p > 21, throw a
RangeError exception. However, an implementation is permitted to extend the behaviour oftoPrecisionfor values of p less than 1 or greater than 21. In this casetoPrecisionwould not necessarily throwRangeError for such values. - If x = 0, then
- Let m be the String consisting of p occurrences of the code unit 0x0030 (DIGIT ZERO).
- Let e be 0.
- Else x ≠ 0,
- Let e and n be integers such that 10p-1 ≤ n < 10p and for which the exact mathematical value of n × 10e-p+1 - x is as close to zero as possible. If there are two such sets of e and n, pick the e and n for which n × 10e-p+1 is larger.
- Let m be the String consisting of the digits of the decimal representation of n (in order, with no leading zeroes).
- If e < -6 or e ≥ p, then
- Assert: e ≠ 0.
- Let a be the first element of m, and let b be the remaining p-1 elements of m.
- Let m be the concatenation of a,
".", and b. - If e > 0, then
- Let c be code unit 0x002B (PLUS SIGN).
- Else e < 0,
- Let c be code unit 0x002D (HYPHEN-MINUS).
- Let e be -e.
- Let d be the String consisting of the digits of the decimal representation of e (in order, with no leading zeroes).
- Return the concatenation of s, m, code unit 0x0065 (LATIN SMALL LETTER E), c, and d.
- If e = p-1, return the concatenation of the Strings s and m.
- If e ≥ 0, then
- Let m be the concatenation of the first e+1 elements of m, the code unit 0x002E (FULL STOP), and the remaining p- (e+1) elements of m.
- Else e < 0,
- Let m be the String formed by the concatenation of code unit 0x0030 (DIGIT ZERO), code unit 0x002E (FULL STOP), -(e+1) occurrences of code unit 0x0030 (DIGIT ZERO), and the String m.
- Return the String that is the concatenation of s and m.
If the toPrecision method is called with more than one argument, then the behaviour is undefined (see clause
20.1.3.6Number.prototype.toString ( [ radix ] )#
The optional radix should be an integer value in the inclusive range 2 to 36. If radix not present or is
The following steps are performed:
- Let x be ? thisNumberValue(
this value). - If radix is not present, let radixNumber be 10.
- Else if radix is
undefined , let radixNumber be 10. - Else let radixNumber be ?
ToInteger (radix). - If radixNumber < 2 or radixNumber > 36, throw a
RangeError exception. - If radixNumber = 10, return !
ToString (x). - Return the String representation of this Number value using the radix specified by radixNumber. Letters
a-zare used for digits with values 10 through 35. The precise algorithm is implementation-dependent, however the algorithm should be a generalization of that specified in7.1.12.1 .
The toString function is not generic; it throws a
The length property of the toString method is 1.
20.1.3.7Number.prototype.valueOf ( )#
- Return ? thisNumberValue(
this value).
20.1.4Properties of Number Instances#
Number instances are ordinary objects that inherit properties from the Number prototype object. Number instances also have a [[NumberData]] internal slot. The [[NumberData]] internal slot is the Number value represented by this Number object.
20.2The Math Object#
The Math object is the %Math% intrinsic object and the initial value of the Math property of the
The value of the [[Prototype]] internal slot of the Math object is the intrinsic object
The Math object is not a function object. It does not have a [[Construct]] internal method; it is not possible to use the Math object as a constructor with the new operator. The Math object also does not have a [[Call]] internal method; it is not possible to invoke the Math object as a function.
In this specification, the phrase “the Number value for x” has a technical meaning defined in
20.2.1Value Properties of the Math Object#
20.2.1.1Math.E#
The Number value for e, the base of the natural logarithms, which is approximately 2.7182818284590452354.
This property has the attributes { [[Writable]]:
20.2.1.2Math.LN10#
The Number value for the natural logarithm of 10, which is approximately 2.302585092994046.
This property has the attributes { [[Writable]]:
20.2.1.3Math.LN2#
The Number value for the natural logarithm of 2, which is approximately 0.6931471805599453.
This property has the attributes { [[Writable]]:
20.2.1.4Math.LOG10E#
The Number value for the base-10 logarithm of e, the base of the natural logarithms; this value is approximately 0.4342944819032518.
This property has the attributes { [[Writable]]:
The value of Math.LOG10E is approximately the reciprocal of the value of Math.LN10.
20.2.1.5Math.LOG2E#
The Number value for the base-2 logarithm of e, the base of the natural logarithms; this value is approximately 1.4426950408889634.
This property has the attributes { [[Writable]]:
The value of Math.LOG2E is approximately the reciprocal of the value of Math.LN2.
20.2.1.6Math.PI#
The Number value for π, the ratio of the circumference of a circle to its diameter, which is approximately 3.1415926535897932.
This property has the attributes { [[Writable]]:
20.2.1.7Math.SQRT1_2#
The Number value for the square root of ½, which is approximately 0.7071067811865476.
This property has the attributes { [[Writable]]:
The value of Math.SQRT1_2 is approximately the reciprocal of the value of Math.SQRT2.
20.2.1.8Math.SQRT2#
The Number value for the square root of 2, which is approximately 1.4142135623730951.
This property has the attributes { [[Writable]]:
20.2.1.9Math [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "Math".
This property has the attributes { [[Writable]]:
20.2.2Function Properties of the Math Object#
Each of the following Math object functions applies the
In the function descriptions below, the symbols
The behaviour of the functions acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, cos, cosh, exp, expm1, hypot, log,log1p, log2, log10, pow, random, sin, sinh, sqrt, tan, and tanh is not precisely specified here except to require specific results for certain argument values that represent boundary cases of interest. For other argument values, these functions are intended to compute approximations to the results of familiar mathematical functions, but some latitude is allowed in the choice of approximation algorithms. The general intent is that an implementer should be able to use the same mathematical library for ECMAScript on a given hardware platform that is available to C programmers on that platform.
Although the choice of algorithms is left to the implementation, it is recommended (but not specified by this standard) that implementations use the approximation algorithms for IEEE 754-2008 arithmetic contained in fdlibm, the freely distributable mathematical library from Sun Microsystems (http://www.netlib.org/fdlibm).
20.2.2.1Math.abs ( x )#
Returns the absolute value of x; the result has the same magnitude as x but has positive sign.
-
If x is
NaN , the result isNaN . -
If x is
-0 , the result is+0 . -
If x is
-∞ , the result is+∞ .
20.2.2.2Math.acos ( x )#
Returns an implementation-dependent approximation to the arc cosine of x. The result is expressed in radians and ranges from
-
If x is
NaN , the result isNaN . -
If x is greater than 1, the result is
NaN . -
If x is less than -1, the result is
NaN . -
If x is exactly 1, the result is
+0 .
20.2.2.3Math.acosh ( x )#
Returns an implementation-dependent approximation to the inverse hyperbolic cosine of x.
-
If x is
NaN , the result isNaN . -
If x is less than 1, the result is
NaN . -
If x is 1, the result is
+0 . -
If x is
+∞ , the result is+∞ .
20.2.2.4Math.asin ( x )#
Returns an implementation-dependent approximation to the arc sine of x. The result is expressed in radians and ranges from -π/2 to +π/2.
-
If x is
NaN , the result isNaN . -
If x is greater than 1, the result is
NaN . -
If x is less than -1, the result is
NaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 .
20.2.2.5Math.asinh ( x )#
Returns an implementation-dependent approximation to the inverse hyperbolic sine of x.
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ .
20.2.2.6Math.atan ( x )#
Returns an implementation-dependent approximation to the arc tangent of x. The result is expressed in radians and ranges from -π/2 to +π/2.
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is an implementation-dependent approximation to +π/2. -
If x is
-∞ , the result is an implementation-dependent approximation to -π/2.
20.2.2.7Math.atanh ( x )#
Returns an implementation-dependent approximation to the inverse hyperbolic tangent of x.
-
If x is
NaN , the result isNaN . -
If x is less than -1, the result is
NaN . -
If x is greater than 1, the result is
NaN . -
If x is -1, the result is
-∞ . -
If x is +1, the result is
+∞ . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 .
20.2.2.8Math.atan2 ( y, x )#
Returns an implementation-dependent approximation to the arc tangent of the quotient
-
If either x or y is
NaN , the result isNaN . -
If y>0 and x is
+0 , the result is an implementation-dependent approximation to +π/2. -
If y>0 and x is
-0 , the result is an implementation-dependent approximation to +π/2. -
If y is
+0 and x>0, the result is+0 . -
If y is
+0 and x is+0 , the result is+0 . -
If y is
+0 and x is-0 , the result is an implementation-dependent approximation to +π. -
If y is
+0 and x<0, the result is an implementation-dependent approximation to +π. -
If y is
-0 and x>0, the result is-0 . -
If y is
-0 and x is+0 , the result is-0 . -
If y is
-0 and x is-0 , the result is an implementation-dependent approximation to -π. -
If y is
-0 and x<0, the result is an implementation-dependent approximation to -π. -
If y<0 and x is
+0 , the result is an implementation-dependent approximation to -π/2. -
If y<0 and x is
-0 , the result is an implementation-dependent approximation to -π/2. -
If y>0 and y is finite and x is
+∞ , the result is+0 . -
If y>0 and y is finite and x is
-∞ , the result is an implementation-dependent approximation to +π. -
If y<0 and y is finite and x is
+∞ , the result is-0 . -
If y<0 and y is finite and x is
-∞ , the result is an implementation-dependent approximation to -π. -
If y is
+∞ and x is finite, the result is an implementation-dependent approximation to +π/2. -
If y is
-∞ and x is finite, the result is an implementation-dependent approximation to -π/2. -
If y is
+∞ and x is+∞ , the result is an implementation-dependent approximation to +π/4. -
If y is
+∞ and x is-∞ , the result is an implementation-dependent approximation to +3π/4. -
If y is
-∞ and x is+∞ , the result is an implementation-dependent approximation to -π/4. -
If y is
-∞ and x is-∞ , the result is an implementation-dependent approximation to -3π/4.
20.2.2.9Math.cbrt ( x )#
Returns an implementation-dependent approximation to the cube root of x.
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ .
20.2.2.10Math.ceil ( x )#
Returns the smallest (closest to
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ . -
If x is less than 0 but greater than -1, the result is
-0 .
The value of Math.ceil(x) is the same as the value of -Math.floor(-x).
20.2.2.11Math.clz32 ( x )#
When Math.clz32 is called with one argument x, the following steps are taken:
- Let n be
ToUint32 (x). - Let p be the number of leading zero bits in the 32-bit binary representation of n.
- Return p.
If n is 0, p will be 32. If the most significant bit of the 32-bit binary encoding of n is 1, p will be 0.
20.2.2.12Math.cos ( x )#
Returns an implementation-dependent approximation to the cosine of x. The argument is expressed in radians.
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is 1. -
If x is
-0 , the result is 1. -
If x is
+∞ , the result isNaN . -
If x is
-∞ , the result isNaN .
20.2.2.13Math.cosh ( x )#
Returns an implementation-dependent approximation to the hyperbolic cosine of x.
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is 1. -
If x is
-0 , the result is 1. -
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is+∞ .
The value of cosh(x) is the same as (exp(x) + exp(-x))/2.
20.2.2.14Math.exp ( x )#
Returns an implementation-dependent approximation to the exponential function of x (e raised to the power of x, where e is the base of the natural logarithms).
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is 1. -
If x is
-0 , the result is 1. -
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is+0 .
20.2.2.15Math.expm1 ( x )#
Returns an implementation-dependent approximation to subtracting 1 from the exponential function of x (e raised to the power of x, where e is the base of the natural logarithms). The result is computed in a way that is accurate even when the value of x is close 0.
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is -1.
20.2.2.16Math.floor ( x )#
Returns the greatest (closest to
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ . -
If x is greater than 0 but less than 1, the result is
+0 .
The value of Math.floor(x) is the same as the value of -Math.ceil(-x).
20.2.2.17Math.fround ( x )#
When Math.fround is called with argument x, the following steps are taken:
- If x is
NaN , returnNaN . - If x is one of
+0 ,-0 ,+∞ ,-∞ , return x. - Let x32 be the result of converting x to a value in IEEE 754-2008 binary32 format using roundTiesToEven.
- Let x64 be the result of converting x32 to a value in IEEE 754-2008 binary64 format.
- Return the ECMAScript Number value corresponding to x64.
20.2.2.18Math.hypot ( value1, value2, ...values )#
Math.hypot returns an implementation-dependent approximation of the square root of the sum of squares of its arguments.
-
If no arguments are passed, the result is
+0 . -
If any argument is
+∞ , the result is+∞ . -
If any argument is
-∞ , the result is+∞ . -
If no argument is
+∞ or-∞ , and any argument isNaN , the result isNaN . -
If all arguments are either
+0 or-0 , the result is+0 .
Implementations should take care to avoid the loss of precision from overflows and underflows that are prone to occur in naive implementations when this function is called with two or more arguments.
20.2.2.19Math.imul ( x, y )#
When the Math.imul is called with arguments x and y, the following steps are taken:
20.2.2.20Math.log ( x )#
Returns an implementation-dependent approximation to the natural logarithm of x.
-
If x is
NaN , the result isNaN . -
If x is less than 0, the result is
NaN . -
If x is
+0 or-0 , the result is-∞ . -
If x is 1, the result is
+0 . -
If x is
+∞ , the result is+∞ .
20.2.2.21Math.log1p ( x )#
Returns an implementation-dependent approximation to the natural logarithm of 1 + x. The result is computed in a way that is accurate even when the value of x is close to zero.
-
If x is
NaN , the result isNaN . -
If x is less than -1, the result is
NaN . -
If x is -1, the result is
-∞ . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is+∞ .
20.2.2.22Math.log10 ( x )#
Returns an implementation-dependent approximation to the base 10 logarithm of x.
-
If x is
NaN , the result isNaN . -
If x is less than 0, the result is
NaN . -
If x is
+0 , the result is-∞ . -
If x is
-0 , the result is-∞ . -
If x is 1, the result is
+0 . -
If x is
+∞ , the result is+∞ .
20.2.2.23Math.log2 ( x )#
Returns an implementation-dependent approximation to the base 2 logarithm of x.
-
If x is
NaN , the result isNaN . -
If x is less than 0, the result is
NaN . -
If x is
+0 , the result is-∞ . -
If x is
-0 , the result is-∞ . -
If x is 1, the result is
+0 . -
If x is
+∞ , the result is+∞ .
20.2.2.24Math.max ( value1, value2, ...values )#
Given zero or more arguments, calls
-
If no arguments are given, the result is
-∞ . -
If any value is
NaN , the result isNaN . -
The comparison of values to determine the largest value is done using the
Abstract Relational Comparison algorithm except that+0 is considered to be larger than-0 .
20.2.2.25Math.min ( value1, value2, ...values )#
Given zero or more arguments, calls
-
If no arguments are given, the result is
+∞ . -
If any value is
NaN , the result isNaN . -
The comparison of values to determine the smallest value is done using the
Abstract Relational Comparison algorithm except that+0 is considered to be larger than-0 .
20.2.2.26Math.pow ( base, exponent )#
-
Return the result of
Applying the ** operator with base and exponent as specified in12.7.3.4 .
20.2.2.27Math.random ( )#
Returns a Number value with positive sign, greater than or equal to 0 but less than 1, chosen randomly or pseudo randomly with approximately uniform distribution over that range, using an implementation-dependent algorithm or strategy. This function takes no arguments.
Each Math.random function created for distinct realms must produce a distinct sequence of values from successive calls.
20.2.2.28Math.round ( x )#
Returns the Number value that is closest to x and is equal to a mathematical integer. If two integer Number values are equally close to x, then the result is the Number value that is closer to
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ . -
If x is greater than 0 but less than 0.5, the result is
+0 . -
If x is less than 0 but greater than or equal to -0.5, the result is
-0 .
Math.round(3.5) returns 4, but Math.round(-3.5) returns -3.
The value of Math.round(x) is not always the same as the value of Math.floor(x+0.5). When x is Math.round(x) returns Math.floor(x+0.5) returns Math.round(x) may also differ from the value of Math.floor(x+0.5)because of internal rounding when computing x+0.5.
20.2.2.29Math.sign (x)#
Returns the sign of the x, indicating whether x is positive, negative or zero.
-
If x is
NaN , the result isNaN . -
If x is
-0 , the result is-0 . -
If x is
+0 , the result is+0 . -
If x is negative and not
-0 , the result is -1. -
If x is positive and not
+0 , the result is +1.
20.2.2.30Math.sin ( x )#
Returns an implementation-dependent approximation to the sine of x. The argument is expressed in radians.
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ or-∞ , the result isNaN .
20.2.2.31Math.sinh ( x )#
Returns an implementation-dependent approximation to the hyperbolic sine of x.
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ .
The value of sinh(x) is the same as (exp(x) - exp(-x))/2.
20.2.2.32Math.sqrt ( x )#
Returns an implementation-dependent approximation to the square root of x.
-
If x is
NaN , the result isNaN . -
If x is less than 0, the result is
NaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is+∞ .
20.2.2.33Math.tan ( x )#
Returns an implementation-dependent approximation to the tangent of x. The argument is expressed in radians.
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ or-∞ , the result isNaN .
20.2.2.34Math.tanh ( x )#
Returns an implementation-dependent approximation to the hyperbolic tangent of x.
-
If x is
NaN , the result isNaN . -
If x is
+0 , the result is+0 . -
If x is
-0 , the result is-0 . -
If x is
+∞ , the result is +1. -
If x is
-∞ , the result is -1.
The value of tanh(x) is the same as (exp(x) - exp(-x))/(exp(x) + exp(-x)).
20.2.2.35Math.trunc ( x )#
Returns the integral part of the number x, removing any fractional digits. If x is already an integer, the result is x.
-
If x is
NaN , the result isNaN . -
If x is
-0 , the result is-0 . -
If x is
+0 , the result is+0 . -
If x is
+∞ , the result is+∞ . -
If x is
-∞ , the result is-∞ . -
If x is greater than 0 but less than 1, the result is
+0 . -
If x is less than 0 but greater than -1, the result is
-0 .
20.3Date Objects#
20.3.1Overview of Date Objects and Definitions of Abstract Operations#
The following functions are abstract operations that operate on time values (defined in
20.3.1.1Time Values and Time Range#
A Date object contains a Number indicating a particular instant in time to within a millisecond. Such a Number is called a time value. A time value may also be
Time is measured in ECMAScript in milliseconds since 01 January, 1970 UTC. In time values leap seconds are ignored. It is assumed that there are exactly 86,400,000 milliseconds per day. ECMAScript Number values can represent all integers from -9,007,199,254,740,992 to 9,007,199,254,740,992; this range suffices to measure times to millisecond precision for any instant that is within approximately 285,616 years, either forward or backward, from 01 January, 1970 UTC.
The actual range of times supported by ECMAScript Date objects is slightly smaller: exactly -100,000,000 days to 100,000,000 days measured relative to midnight at the beginning of 01 January, 1970 UTC. This gives a range of 8,640,000,000,000,000 milliseconds to either side of 01 January, 1970 UTC.
The exact moment of midnight at the beginning of 01 January, 1970 UTC is represented by the value
20.3.1.2Day Number and Time within Day#
A given
where the number of milliseconds per day is
The remainder is called the time within the day:
20.3.1.3Year Number#
ECMAScript uses an extrapolated Gregorian system to map a day number to a year number and to determine the month and date within that year. In this system, leap years are precisely those which are (divisible by 4) and ((not divisible by 100) or (divisible by 400)). The number of days in year number y is therefore defined by
All non-leap years have 365 days with the usual number of days per month and leap years have an extra day in February. The day number of the first day of year y is given by:
The
A
(t) = the largest integer y (closest to positive infinity) such that
(y) ≤ t
The leap-year function is 1 for a time within a leap year and otherwise is zero:
20.3.1.4Month Number#
Months are identified by an integer in the range 0 to 11, inclusive. The mapping MonthFromTime(t) from a
where
A month value of 0 specifies January; 1 specifies February; 2 specifies March; 3 specifies April; 4 specifies May; 5 specifies June; 6 specifies July; 7 specifies August; 8 specifies September; 9 specifies October; 10 specifies November; and 11 specifies December. Note that
20.3.1.5Date Number#
A date number is identified by an integer in the range 1 through 31, inclusive. The mapping DateFromTime(t) from a
20.3.1.6Week Day#
The weekday for a particular
A weekday value of 0 specifies Sunday; 1 specifies Monday; 2 specifies Tuesday; 3 specifies Wednesday; 4 specifies Thursday; 5 specifies Friday; and 6 specifies Saturday. Note that
20.3.1.7Local Time Zone Adjustment#
An implementation of ECMAScript is expected to determine the local time zone adjustment. The local time zone adjustment is a value LocalTZA measured in milliseconds which when added to UTC represents the local standard time. Daylight saving time is not reflected by LocalTZA.
It is recommended that implementations use the time zone information of the IANA Time Zone Database http://www.iana.org/time-zones/.
20.3.1.8Daylight Saving Time Adjustment#
An implementation dependent algorithm using best available information on time zones to determine the local daylight saving time adjustment DaylightSavingTA(t), measured in milliseconds. An implementation of ECMAScript is expected to make its best effort to determine the local daylight saving time adjustment.
It is recommended that implementations use the time zone information of the IANA Time Zone Database http://www.iana.org/time-zones/.
20.3.1.9LocalTime ( t )#
The abstract operation LocalTime with argument t converts t from UTC to local time by performing the following steps:
- Return t +
LocalTZA + DaylightSavingTA(t).
20.3.1.10UTC ( t )#
The abstract operation UTC with argument t converts t from local time to UTC is defined by performing the following steps:
20.3.1.11Hours, Minutes, Second, and Milliseconds#
The following abstract operations are useful in decomposing time values:
where
20.3.1.12MakeTime (hour, min, sec, ms)#
The abstract operation MakeTime calculates a number of milliseconds from its four arguments, which must be ECMAScript Number values. This operator functions as follows:
- If hour is not finite or min is not finite or sec is not finite or ms is not finite, return
NaN . - Let h be
ToInteger (hour). - Let m be
ToInteger (min). - Let s be
ToInteger (sec). - Let milli be
ToInteger (ms). - Let t be h
*msPerHour +m*msPerMinute +s*msPerSecond +milli, performing the arithmetic according to IEEE 754-2008 rules (that is, as if using the ECMAScript operators*and+). - Return t.
20.3.1.13MakeDay (year, month, date)#
The abstract operation MakeDay calculates a number of days from its three arguments, which must be ECMAScript Number values. This operator functions as follows:
- If year is not finite or month is not finite or date is not finite, return
NaN . - Let y be
ToInteger (year). - Let m be
ToInteger (month). - Let dt be
ToInteger (date). - Let ym be y +
floor (m / 12). - Let mn be m
modulo 12. - Find a value t such that
YearFromTime (t) is ym andMonthFromTime (t) is mn andDateFromTime (t) is 1; but if this is not possible (because some argument is out of range), returnNaN . - Return
Day (t) + dt - 1.
20.3.1.14MakeDate (day, time)#
The abstract operation MakeDate calculates a number of milliseconds from its two arguments, which must be ECMAScript Number values. This operator functions as follows:
- If day is not finite or time is not finite, return
NaN . - Return day ×
msPerDay + time.
20.3.1.15TimeClip (time)#
The abstract operation TimeClip calculates a number of milliseconds from its argument, which must be an ECMAScript Number value. This operator functions as follows:
The point of step 4 is that an implementation is permitted a choice of internal representations of time values, for example as a 64-bit signed integer or as a 64-bit floating-point value. Depending on the implementation, this internal representation may or may not distinguish
20.3.1.16Date Time String Format#
ECMAScript defines a string interchange format for date-times based upon a simplification of the ISO 8601 Extended Format. The format is as follows: YYYY-MM-DDTHH:mm:ss.sssZ
Where the fields are as follows:
YYYY
|
is the decimal digits of the year 0000 to 9999 in the Gregorian calendar. |
-
|
"-" (hyphen) appears literally twice in the string.
|
MM
|
is the month of the year from 01 (January) to 12 (December). |
DD
|
is the day of the month from 01 to 31. |
T
|
"T" appears literally in the string, to indicate the beginning of the time element.
|
HH
|
is the number of complete hours that have passed since midnight as two decimal digits from 00 to 24. |
:
|
":" (colon) appears literally twice in the string.
|
mm
|
is the number of complete minutes since the start of the hour as two decimal digits from 00 to 59. |
ss
|
is the number of complete seconds since the start of the minute as two decimal digits from 00 to 59. |
.
|
"." (dot) appears literally in the string.
|
sss
|
is the number of complete milliseconds since the start of the second as three decimal digits. |
Z
|
is the time zone offset specified as "Z" (for UTC) or either "+" or "-" followed by a time expression HH:mm
|
This format includes date-only forms:
YYYY
YYYY-MM
YYYY-MM-DD
It also includes “date-time” forms that consist of one of the above date-only forms immediately followed by one of the following time forms with an optional time zone offset appended:
THH:mm
THH:mm:ss
THH:mm:ss.sss
All numbers must be base 10. If the MM or DD fields are absent "01" is used as the value. If the HH, mm, or ss fields are absent "00" is used as the value and the value of an absent sss field is "000". When the time zone offset is absent, date-only forms are interpreted as a UTC time and date-time forms are interpreted as a local time.
Illegal values (out-of-bounds as well as syntax errors) in a format string means that the format string is not a valid instance of this format.
As every day both starts and ends with midnight, the two notations 00:00 and 24:00 are available to distinguish the two midnights that can be associated with one date. This means that the following two notations refer to exactly the same point in time: 1995-02-04T24:00 and 1995-02-05T00:00
There exists no international standard that specifies abbreviations for civil time zones like CET, EST, etc. and sometimes the same abbreviation is even used for two very different time zones. For this reason, ISO 8601 and this format specifies numeric representations of date and time.
20.3.1.16.1Extended Years#
ECMAScript requires the ability to specify 6 digit years (extended years); approximately 285,426 years, either forward or backward, from 01 January, 1970 UTC. To represent years before 0 or after 9999, ISO 8601 permits the expansion of the year representation, but only by prior agreement between the sender and the receiver. In the simplified ECMAScript format such an expanded year representation shall have 2 extra year digits and is always prefixed with a + or - sign. The year 0 is considered positive and hence prefixed with a + sign.
Examples of extended years:
|
-283457-03-21T15:00:59.008Z |
283458 B.C. |
|
-000001-01-01T00:00:00Z |
2 B.C. |
|
+000000-01-01T00:00:00Z |
1 B.C. |
|
+000001-01-01T00:00:00Z |
1 A.D. |
|
+001970-01-01T00:00:00Z |
1970 A.D. |
|
+002009-12-15T00:00:00Z |
2009 A.D. |
|
+287396-10-12T08:59:00.992Z |
287396 A.D. |
20.3.2The Date Constructor#
The Date constructor is the %Date% intrinsic object and the initial value of the Date property of the Date is called as a function rather than as a constructor, it returns a String representing the current time (UTC).
The Date constructor is a single function whose behaviour is overloaded based upon the number and types of its arguments.
The Date constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified Date behaviour must include a super call to the Date constructor to create and initialize the subclass instance with a [[DateValue]] internal slot.
The length property of the Date constructor function is 7.
20.3.2.1Date ( year, month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] )#
This description applies only if the Date constructor is called with at least two arguments.
When the Date function is called, the following steps are taken:
- Let numberOfArgs be the number of arguments passed to this function call.
- Assert: numberOfArgs ≥ 2.
- If NewTarget is not
undefined , then- Let y be ?
ToNumber (year). - Let m be ?
ToNumber (month). - If date is supplied, let dt be ?
ToNumber (date); else let dt be 1. - If hours is supplied, let h be ?
ToNumber (hours); else let h be 0. - If minutes is supplied, let min be ?
ToNumber (minutes); else let min be 0. - If seconds is supplied, let s be ?
ToNumber (seconds); else let s be 0. - If ms is supplied, let milli be ?
ToNumber (ms); else let milli be 0. - If y is not
NaN and 0 ≤ToInteger (y) ≤ 99, let yr be 1900+ToInteger (y); otherwise, let yr be y. - Let finalDate be
MakeDate (MakeDay (yr, m, dt),MakeTime (h, min, s, milli)). - Let O be ?
OrdinaryCreateFromConstructor (NewTarget,"%DatePrototype%", « [[DateValue]] »). - Set the [[DateValue]] internal slot of O to
TimeClip (UTC (finalDate)). - Return O.
- Let y be ?
- Else,
- Let now be the Number that is the
time value (UTC) identifying the current time. - Return
ToDateString (now).
- Let now be the Number that is the
20.3.2.2Date ( value )#
This description applies only if the Date constructor is called with exactly one argument.
When the Date function is called, the following steps are taken:
- Let numberOfArgs be the number of arguments passed to this function call.
- Assert: numberOfArgs = 1.
- If NewTarget is not
undefined , then- If
Type (value) is Object and value has a [[DateValue]] internal slot, then- Let tv be
thisTimeValue (value).
- Let tv be
- Else,
- Let v be ?
ToPrimitive (value). - If
Type (v) is String, then- Let tv be the result of parsing v as a date, in exactly the same manner as for the
parsemethod (20.3.3.2 ). If the parse resulted in anabrupt completion , tv is theCompletion Record . ReturnIfAbrupt (tv).
- Let tv be the result of parsing v as a date, in exactly the same manner as for the
- Else,
- Let tv be ?
ToNumber (v).
- Let tv be ?
- Let v be ?
- Let O be ?
OrdinaryCreateFromConstructor (NewTarget,"%DatePrototype%", « [[DateValue]] »). - Set the [[DateValue]] internal slot of O to
TimeClip (tv). - Return O.
- If
- Else,
- Let now be the Number that is the
time value (UTC) identifying the current time. - Return
ToDateString (now).
- Let now be the Number that is the
20.3.2.3Date ( )#
This description applies only if the Date constructor is called with no arguments.
When the Date function is called, the following steps are taken:
- Let numberOfArgs be the number of arguments passed to this function call.
- Assert: numberOfArgs = 0.
- If NewTarget is not
undefined , then- Let O be ?
OrdinaryCreateFromConstructor (NewTarget,"%DatePrototype%", « [[DateValue]] »). - Set the [[DateValue]] internal slot of O to the
time value (UTC) identifying the current time. - Return O.
- Let O be ?
- Else,
- Let now be the Number that is the
time value (UTC) identifying the current time. - Return
ToDateString (now).
- Let now be the Number that is the
20.3.3Properties of the Date Constructor#
The value of the [[Prototype]] internal slot of the Date constructor is the intrinsic object
The Date constructor has the following properties:
20.3.3.1Date.now ( )#
The now function returns a Number value that is the now.
20.3.3.2Date.parse ( string )#
The parse function applies the parse interprets the resulting String as a date and time; it returns a Number, the UTC Date.parse to return
If x is any Date object whose milliseconds amount is zero within a particular implementation of ECMAScript, then all of the following expressions should produce the same numeric value in that implementation, if all the properties referenced have their initial values:
x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())
However, the expression
Date.parse(x.toLocaleString())
is not required to produce the same Number value as the preceding three expressions and, in general, the value produced by Date.parse is implementation-dependent when given any String value that does not conform to the Date Time String Format (toString or toUTCString method.
20.3.3.3Date.prototype#
The initial value of Date.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
20.3.3.4Date.UTC ( year, month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] )#
When the UTC function is called with fewer than two arguments, the behaviour is implementation-dependent. When the UTC function is called with two to seven arguments, it computes the date from year, month and (optionally) date, hours, minutes, seconds and ms. The following steps are taken:
- Let y be ?
ToNumber (year). - Let m be ?
ToNumber (month). - If date is supplied, let dt be ?
ToNumber (date); else let dt be 1. - If hours is supplied, let h be ?
ToNumber (hours); else let h be 0. - If minutes is supplied, let min be ?
ToNumber (minutes); else let min be 0. - If seconds is supplied, let s be ?
ToNumber (seconds); else let s be 0. - If ms is supplied, let milli be ?
ToNumber (ms); else let milli be 0. - If y is not
NaN and 0 ≤ToInteger (y) ≤ 99, let yr be 1900+ToInteger (y); otherwise, let yr be y. - Return
TimeClip (MakeDate (MakeDay (yr, m, dt),MakeTime (h, min, s, milli))).
The length property of the UTC function is 7.
The UTC function differs from the Date constructor in two ways: it returns a
20.3.4Properties of the Date Prototype Object#
The Date prototype object is the intrinsic object %DatePrototype%. The Date prototype object is itself an ordinary object. It is not a Date instance and does not have a [[DateValue]] internal slot.
The value of the [[Prototype]] internal slot of the Date prototype object is the intrinsic object
Unless explicitly defined otherwise, the methods of the Date prototype object defined below are not generic and the
The abstract operation thisTimeValue(value) performs the following steps:
- If
Type (value) is Object and value has a [[DateValue]] internal slot, then- Return the value of value's [[DateValue]] internal slot.
- Throw a
TypeError exception.
In following descriptions of functions that are properties of the Date prototype object, the phrase “this Date object” refers to the object that is the
20.3.4.1Date.prototype.constructor#
The initial value of Date.prototype.constructor is the intrinsic object
20.3.4.2Date.prototype.getDate ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
DateFromTime (LocalTime (t)).
20.3.4.3Date.prototype.getDay ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
WeekDay (LocalTime (t)).
20.3.4.4Date.prototype.getFullYear ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
YearFromTime (LocalTime (t)).
20.3.4.5Date.prototype.getHours ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
HourFromTime (LocalTime (t)).
20.3.4.6Date.prototype.getMilliseconds ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
msFromTime (LocalTime (t)).
20.3.4.7Date.prototype.getMinutes ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
MinFromTime (LocalTime (t)).
20.3.4.8Date.prototype.getMonth ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
MonthFromTime (LocalTime (t)).
20.3.4.9Date.prototype.getSeconds ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
SecFromTime (LocalTime (t)).
20.3.4.10Date.prototype.getTime ( )#
The following steps are performed:
- Return ?
thisTimeValue (this value).
20.3.4.11Date.prototype.getTimezoneOffset ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return (t -
LocalTime (t)) /msPerMinute .
20.3.4.12Date.prototype.getUTCDate ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
DateFromTime (t).
20.3.4.13Date.prototype.getUTCDay ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
WeekDay (t).
20.3.4.14Date.prototype.getUTCFullYear ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
YearFromTime (t).
20.3.4.15Date.prototype.getUTCHours ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
HourFromTime (t).
20.3.4.16Date.prototype.getUTCMilliseconds ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
msFromTime (t).
20.3.4.17Date.prototype.getUTCMinutes ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
MinFromTime (t).
20.3.4.18Date.prototype.getUTCMonth ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
MonthFromTime (t).
20.3.4.19Date.prototype.getUTCSeconds ( )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
SecFromTime (t).
20.3.4.20Date.prototype.setDate ( date )#
The following steps are performed:
- Let t be
LocalTime (?thisTimeValue (this value)). - Let dt be ?
ToNumber (date). - Let newDate be
MakeDate (MakeDay (YearFromTime (t),MonthFromTime (t), dt),TimeWithinDay (t)). - Let u be
TimeClip (UTC (newDate)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
20.3.4.21Date.prototype.setFullYear ( year [ , month [ , date ] ] )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , let t be+0 ; otherwise, let t beLocalTime (t). - Let y be ?
ToNumber (year). - If month is not specified, let m be
MonthFromTime (t); otherwise, let m be ?ToNumber (month). - If date is not specified, let dt be
DateFromTime (t); otherwise, let dt be ?ToNumber (date). - Let newDate be
MakeDate (MakeDay (y, m, dt),TimeWithinDay (t)). - Let u be
TimeClip (UTC (newDate)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
The length property of the setFullYear method is 3.
If month is not specified, this method behaves as if month were specified with the value getMonth(). If date is not specified, it behaves as if date were specified with the value getDate().
20.3.4.22Date.prototype.setHours ( hour [ , min [ , sec [ , ms ] ] ] )#
The following steps are performed:
- Let t be
LocalTime (?thisTimeValue (this value)). - Let h be ?
ToNumber (hour). - If min is not specified, let m be
MinFromTime (t); otherwise, let m be ?ToNumber (min). - If sec is not specified, let s be
SecFromTime (t); otherwise, let s be ?ToNumber (sec). - If ms is not specified, let milli be
msFromTime (t); otherwise, let milli be ?ToNumber (ms). - Let date be
MakeDate (Day (t),MakeTime (h, m, s, milli)). - Let u be
TimeClip (UTC (date)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
The length property of the setHours method is 4.
If min is not specified, this method behaves as if min were specified with the value getMinutes(). If sec is not specified, it behaves as if sec were specified with the value getSeconds(). If ms is not specified, it behaves as if ms were specified with the value getMilliseconds().
20.3.4.23Date.prototype.setMilliseconds ( ms )#
The following steps are performed:
- Let t be
LocalTime (?thisTimeValue (this value)). - Let ms be ?
ToNumber (ms). - Let time be
MakeTime (HourFromTime (t),MinFromTime (t),SecFromTime (t), ms). - Let u be
TimeClip (UTC (MakeDate (Day (t), time))). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
20.3.4.24Date.prototype.setMinutes ( min [ , sec [ , ms ] ] )#
The following steps are performed:
- Let t be
LocalTime (?thisTimeValue (this value)). - Let m be ?
ToNumber (min). - If sec is not specified, let s be
SecFromTime (t); otherwise, let s be ?ToNumber (sec). - If ms is not specified, let milli be
msFromTime (t); otherwise, let milli be ?ToNumber (ms). - Let date be
MakeDate (Day (t),MakeTime (HourFromTime (t), m, s, milli)). - Let u be
TimeClip (UTC (date)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
The length property of the setMinutes method is 3.
If sec is not specified, this method behaves as if sec were specified with the value getSeconds(). If ms is not specified, this behaves as if ms were specified with the value getMilliseconds().
20.3.4.25Date.prototype.setMonth ( month [ , date ] )#
The following steps are performed:
- Let t be
LocalTime (?thisTimeValue (this value)). - Let m be ?
ToNumber (month). - If date is not specified, let dt be
DateFromTime (t); otherwise, let dt be ?ToNumber (date). - Let newDate be
MakeDate (MakeDay (YearFromTime (t), m, dt),TimeWithinDay (t)). - Let u be
TimeClip (UTC (newDate)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
The length property of the setMonth method is 2.
If date is not specified, this method behaves as if date were specified with the value getDate().
20.3.4.26Date.prototype.setSeconds ( sec [ , ms ] )#
The following steps are performed:
- Let t be
LocalTime (?thisTimeValue (this value)). - Let s be ?
ToNumber (sec). - If ms is not specified, let milli be
msFromTime (t); otherwise, let milli be ?ToNumber (ms). - Let date be
MakeDate (Day (t),MakeTime (HourFromTime (t),MinFromTime (t), s, milli)). - Let u be
TimeClip (UTC (date)). - Set the [[DateValue]] internal slot of this Date object to u.
- Return u.
The length property of the setSeconds method is 2.
If ms is not specified, this method behaves as if ms were specified with the value getMilliseconds().
20.3.4.27Date.prototype.setTime ( time )#
The following steps are performed:
- Perform ?
thisTimeValue (this value). - Let t be ?
ToNumber (time). - Let v be
TimeClip (t). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
20.3.4.28Date.prototype.setUTCDate ( date )#
- Let t be ?
thisTimeValue (this value). - Let dt be ?
ToNumber (date). - Let newDate be
MakeDate (MakeDay (YearFromTime (t),MonthFromTime (t), dt),TimeWithinDay (t)). - Let v be
TimeClip (newDate). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
20.3.4.29Date.prototype.setUTCFullYear ( year [ , month [ , date ] ] )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , let t be+0 . - Let y be ?
ToNumber (year). - If month is not specified, let m be
MonthFromTime (t); otherwise, let m be ?ToNumber (month). - If date is not specified, let dt be
DateFromTime (t); otherwise, let dt be ?ToNumber (date). - Let newDate be
MakeDate (MakeDay (y, m, dt),TimeWithinDay (t)). - Let v be
TimeClip (newDate). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
The length property of the setUTCFullYear method is 3.
If month is not specified, this method behaves as if month were specified with the value getUTCMonth(). If date is not specified, it behaves as if date were specified with the value getUTCDate().
20.3.4.30Date.prototype.setUTCHours ( hour [ , min [ , sec [ , ms ] ] ] )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - Let h be ?
ToNumber (hour). - If min is not specified, let m be
MinFromTime (t); otherwise, let m be ?ToNumber (min). - If sec is not specified, let s be
SecFromTime (t); otherwise, let s be ?ToNumber (sec). - If ms is not specified, let milli be
msFromTime (t); otherwise, let milli be ?ToNumber (ms). - Let newDate be
MakeDate (Day (t),MakeTime (h, m, s, milli)). - Let v be
TimeClip (newDate). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
The length property of the setUTCHours method is 4.
If min is not specified, this method behaves as if min were specified with the value getUTCMinutes(). If sec is not specified, it behaves as if sec were specified with the value getUTCSeconds(). If ms is not specified, it behaves as if ms were specified with the value getUTCMilliseconds().
20.3.4.31Date.prototype.setUTCMilliseconds ( ms )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - Let milli be ?
ToNumber (ms). - Let time be
MakeTime (HourFromTime (t),MinFromTime (t),SecFromTime (t), milli). - Let v be
TimeClip (MakeDate (Day (t), time)). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
20.3.4.32Date.prototype.setUTCMinutes ( min [ , sec [ , ms ] ] )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - Let m be ?
ToNumber (min). - If sec is not specified, let s be
SecFromTime (t). - Else,
- Let s be ?
ToNumber (sec).
- Let s be ?
- If ms is not specified, let milli be
msFromTime (t). - Else,
- Let milli be ?
ToNumber (ms).
- Let milli be ?
- Let date be
MakeDate (Day (t),MakeTime (HourFromTime (t), m, s, milli)). - Let v be
TimeClip (date). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
The length property of the setUTCMinutes method is 3.
If sec is not specified, this method behaves as if sec were specified with the value getUTCSeconds(). If ms is not specified, it function behaves as if ms were specified with the value return by getUTCMilliseconds().
20.3.4.33Date.prototype.setUTCMonth ( month [ , date ] )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - Let m be ?
ToNumber (month). - If date is not specified, let dt be
DateFromTime (t). - Else,
- Let dt be ?
ToNumber (date).
- Let dt be ?
- Let newDate be
MakeDate (MakeDay (YearFromTime (t), m, dt),TimeWithinDay (t)). - Let v be
TimeClip (newDate). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
The length property of the setUTCMonth method is 2.
If date is not specified, this method behaves as if date were specified with the value getUTCDate().
20.3.4.34Date.prototype.setUTCSeconds ( sec [ , ms ] )#
The following steps are performed:
- Let t be ?
thisTimeValue (this value). - Let s be ?
ToNumber (sec). - If ms is not specified, let milli be
msFromTime (t). - Else,
- Let milli be ?
ToNumber (ms).
- Let milli be ?
- Let date be
MakeDate (Day (t),MakeTime (HourFromTime (t),MinFromTime (t), s, milli)). - Let v be
TimeClip (date). - Set the [[DateValue]] internal slot of this Date object to v.
- Return v.
The length property of the setUTCSeconds method is 2.
If ms is not specified, this method behaves as if ms were specified with the value getUTCMilliseconds().
20.3.4.35Date.prototype.toDateString ( )#
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “date” portion of the Date in the current time zone in a convenient, human-readable form.
20.3.4.36Date.prototype.toISOString ( )#
This function returns a String value representing the instance in time corresponding to
20.3.4.37Date.prototype.toJSON ( key )#
This function provides a String representation of a Date object for use by JSON.stringify (
When the toJSON method is called with argument key, the following steps are taken:
- Let O be ?
ToObject (this value). - Let tv be ?
ToPrimitive (O, hint Number). - If
Type (tv) is Number and tv is not finite, returnnull . - Return ?
Invoke (O,"toISOString").
The argument is ignored.
The toJSON function is intentionally generic; it does not require that its toISOString method.
20.3.4.38Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )#
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the Date.prototype.toLocaleDateString method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleDateString method is used.
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “date” portion of the Date in the current time zone in a convenient, human-readable form that corresponds to the conventions of the host environment's current locale.
The meaning of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
20.3.4.39Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )#
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the Date.prototype.toLocaleString method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleString method is used.
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the Date in the current time zone in a convenient, human-readable form that corresponds to the conventions of the host environment's current locale.
The meaning of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
20.3.4.40Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )#
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the Date.prototype.toLocaleTimeString method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleTimeString method is used.
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “time” portion of the Date in the current time zone in a convenient, human-readable form that corresponds to the conventions of the host environment's current locale.
The meaning of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
20.3.4.41Date.prototype.toString ( )#
The following steps are performed:
- Let O be this Date object.
- If O does not have a [[DateValue]] internal slot, then
- Let tv be
NaN .
- Let tv be
- Else,
- Let tv be
thisTimeValue (O).
- Let tv be
- Return
ToDateString (tv).
For any Date object d whose milliseconds amount is zero, the result of Date.parse(d.toString()) is equal to d.valueOf(). See
The toString function is intentionally generic; it does not require that its
20.3.4.41.1Runtime Semantics: ToDateString(tv)#
The following steps are performed:
- Assert:
Type (tv) is Number. - If tv is
NaN , return"Invalid Date". - Return an implementation-dependent String value that represents tv as a date and time in the current time zone using a convenient, human-readable form.
20.3.4.42Date.prototype.toTimeString ( )#
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent the “time” portion of the Date in the current time zone in a convenient, human-readable form.
20.3.4.43Date.prototype.toUTCString ( )#
This function returns a String value. The contents of the String are implementation-dependent, but are intended to represent
The intent is to produce a String representation of a date that is more readable than the format specified in "T" used to separate the date and time elements.
20.3.4.44Date.prototype.valueOf ( )#
The following steps are performed:
- Return ?
thisTimeValue (this value).
20.3.4.45Date.prototype [ @@toPrimitive ] ( hint )#
This function is called by ECMAScript language operators to convert a Date object to a primitive value. The allowed values for hint are "default", "number", and "string". Date objects, are unique among built-in ECMAScript object in that they treat "default" as being equivalent to "string", All other built-in ECMAScript objects treat "default" as being equivalent to "number".
When the @@toPrimitive method is called with argument hint, the following steps are taken:
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If hint is the String value
"string"or the String value"default", then- Let tryFirst be
"string".
- Let tryFirst be
- Else if hint is the String value
"number", then- Let tryFirst be
"number".
- Let tryFirst be
- Else, throw a
TypeError exception. - Return ? OrdinaryToPrimitive(O, tryFirst).
The value of the name property of this function is "[Symbol.toPrimitive]".
This property has the attributes { [[Writable]]:
20.3.5Properties of Date Instances#
Date instances are ordinary objects that inherit properties from the Date prototype object. Date instances also have a [[DateValue]] internal slot. The [[DateValue]] internal slot is the
21Text Processing#
21.1String Objects#
21.1.1The String Constructor#
The String constructor is the %String% intrinsic object and the initial value of the String property of the String is called as a function rather than as a constructor, it performs a type conversion.
The String constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified String behaviour must include a super call to the String constructor to create and initialize the subclass instance with a [[StringData]] internal slot.
21.1.1.1String ( value )#
When String is called with argument value, the following steps are taken:
- If no arguments were passed to this function invocation, let s be
"". - Else,
- If NewTarget is
undefined andType (value) is Symbol, returnSymbolDescriptiveString (value). - Let s be ?
ToString (value).
- If NewTarget is
- If NewTarget is
undefined , return s. - Return ?
StringCreate (s, ?GetPrototypeFromConstructor (NewTarget,"%StringPrototype%")).
21.1.2Properties of the String Constructor#
The value of the [[Prototype]] internal slot of the String constructor is the intrinsic object
The String constructor has the following properties:
21.1.2.1String.fromCharCode ( ...codeUnits )#
The String.fromCharCode function may be called with any number of arguments which form the rest parameter codeUnits. The following steps are taken:
- Let codeUnits be a
List containing the arguments passed to this function. - Let length be the number of elements in codeUnits.
- Let elements be a new empty
List . - Let nextIndex be 0.
- Repeat while nextIndex < length
- Let next be codeUnits[nextIndex].
- Let nextCU be ?
ToUint16 (next). - Append nextCU to the end of elements.
- Let nextIndex be nextIndex + 1.
- Return the String value whose elements are, in order, the elements in the
List elements. If length is 0, the empty string is returned.
The length property of the fromCharCode function is 1.
21.1.2.2String.fromCodePoint ( ...codePoints )#
The String.fromCodePoint function may be called with any number of arguments which form the rest parameter codePoints. The following steps are taken:
- Let codePoints be a
List containing the arguments passed to this function. - Let length be the number of elements in codePoints.
- Let elements be a new empty
List . - Let nextIndex be 0.
- Repeat while nextIndex < length
- Let next be codePoints[nextIndex].
- Let nextCP be ?
ToNumber (next). - If
SameValue (nextCP,ToInteger (nextCP)) isfalse , throw aRangeError exception. - If nextCP < 0 or nextCP > 0x10FFFF, throw a
RangeError exception. - Append the elements of the
UTF16Encoding of nextCP to the end of elements. - Let nextIndex be nextIndex + 1.
- Return the String value whose elements are, in order, the elements in the
List elements. If length is 0, the empty string is returned.
The length property of the fromCodePoint function is 1.
21.1.2.3String.prototype#
The initial value of String.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
21.1.2.4String.raw ( template, ...substitutions )#
The String.raw function may be called with a variable number of arguments. The first argument is template and the remainder of the arguments form the
- Let substitutions be a
List consisting of all of the arguments passed to this function, starting with the second argument. If fewer than two arguments were passed, theList is empty. - Let numberOfSubstitutions be the number of elements in substitutions.
- Let cooked be ?
ToObject (template). - Let raw be ?
ToObject (?Get (cooked,"raw")). - Let literalSegments be ?
ToLength (?Get (raw,"length")). - If literalSegments ≤ 0, return the empty string.
- Let stringElements be a new empty
List . - Let nextIndex be 0.
- Repeat
- Let nextKey be !
ToString (nextIndex). - Let nextSeg be ?
ToString (?Get (raw, nextKey)). - Append in order the code unit elements of nextSeg to the end of stringElements.
- If nextIndex + 1 = literalSegments, then
- Return the String value whose code units are, in order, the elements in the
List stringElements. If stringElements has no elements, the empty string is returned.
- Return the String value whose code units are, in order, the elements in the
- If nextIndex < numberOfSubstitutions, let next be substitutions[nextIndex].
- Else, let next be the empty String.
- Let nextSub be ?
ToString (next). - Append in order the code unit elements of nextSub to the end of stringElements.
- Let nextIndex be nextIndex + 1.
- Let nextKey be !
String.raw is intended for use as a tag function of a Tagged Template (
21.1.3Properties of the String Prototype Object#
The String prototype object is the intrinsic object %StringPrototype%. The String prototype object is an ordinary object. The String prototype is itself a String object; it has a [[StringData]] internal slot with the value
The value of the [[Prototype]] internal slot of the String prototype object is the intrinsic object
Unless explicitly stated otherwise, the methods of the String prototype object defined below are not generic and the
The abstract operation thisStringValue(value) performs the following steps:
The phrase “this String value” within the specification of a method refers to the result returned by calling the abstract operation thisStringValue with the
21.1.3.1String.prototype.charAt ( pos )#
Returns a single element String containing the code unit at index pos in the String value resulting from converting this object to a String. If there is no element at that index, the result is the empty String. The result is a String value, not a String object.
If pos is a value of Number type that is an integer, then the result of x.charAt(pos) is equal to the result of x.substring(pos, pos+1).
When the charAt method is called with one argument pos, the following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let position be ?
ToInteger (pos). - Let size be the number of elements in S.
- If position < 0 or position ≥ size, return the empty String.
- Return a String of length 1, containing one code unit from S, namely the code unit at index position.
The charAt function is intentionally generic; it does not require that its
21.1.3.2String.prototype.charCodeAt ( pos )#
Returns a Number (a nonnegative integer less than 216) that is the code unit value of the string element at index pos in the String resulting from converting this object to a String. If there is no element at that index, the result is
When the charCodeAt method is called with one argument pos, the following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let position be ?
ToInteger (pos). - Let size be the number of elements in S.
- If position < 0 or position ≥ size, return
NaN . - Return a value of Number type, whose value is the code unit value of the element at index position in the String S.
The charCodeAt function is intentionally generic; it does not require that its
21.1.3.3String.prototype.codePointAt ( pos )#
Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point value of the UTF-16 encoded code point (
When the codePointAt method is called with one argument pos, the following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let position be ?
ToInteger (pos). - Let size be the number of elements in S.
- If position < 0 or position ≥ size, return
undefined . - Let first be the code unit value of the element at index position in the String S.
- If first < 0xD800 or first > 0xDBFF or position+1 = size, return first.
- Let second be the code unit value of the element at index position+1 in the String S.
- If second < 0xDC00 or second > 0xDFFF, return first.
- Return
UTF16Decode (first, second).
The codePointAt function is intentionally generic; it does not require that its
21.1.3.4String.prototype.concat ( ...args )#
When the concat method is called it returns a String consisting of the code units of the this object (converted to a String) followed by the code units of each of the arguments converted to a String. The result is a String value, not a String object.
When the concat method is called with zero or more arguments, the following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let args be a
List whose elements are the arguments passed to this function. - Let R be S.
- Repeat, while args is not empty
- Remove the first element from args and let next be the value of that element.
- Let nextString be ?
ToString (next). - Let R be the String value consisting of the code units of the previous value of R followed by the code units of nextString.
- Return R.
The length property of the concat method is 1.
The concat function is intentionally generic; it does not require that its
21.1.3.5String.prototype.constructor#
The initial value of String.prototype.constructor is the intrinsic object
21.1.3.6String.prototype.endsWith ( searchString [ , endPosition ] )#
The following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let isRegExp be ?
IsRegExp (searchString). - If isRegExp is
true , throw aTypeError exception. - Let searchStr be ?
ToString (searchString). - Let len be the number of elements in S.
- If endPosition is
undefined , let pos be len, else let pos be ?ToInteger (endPosition). - Let end be
min (max (pos, 0), len). - Let searchLength be the number of elements in searchStr.
- Let start be end - searchLength.
- If start is less than 0, return
false . - If the sequence of elements of S starting at start of length searchLength is the same as the full element sequence of searchStr, return
true . - Otherwise, return
false .
Returns
Throwing an exception if the first argument is a RegExp is specified in order to allow future editions to define extensions that allow such argument values.
The endsWith function is intentionally generic; it does not require that its
21.1.3.7String.prototype.includes ( searchString [ , position ] )#
The includes method takes two arguments, searchString and position, and performs the following steps:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let isRegExp be ?
IsRegExp (searchString). - If isRegExp is
true , throw aTypeError exception. - Let searchStr be ?
ToString (searchString). - Let pos be ?
ToInteger (position). (If position isundefined , this step produces the value 0.) - Let len be the number of elements in S.
- Let start be
min (max (pos, 0), len). - Let searchLen be the number of elements in searchStr.
- If there exists any integer k not smaller than start such that k + searchLen is not greater than len, and for all nonnegative integers j less than searchLen, the code unit at index k+j of S is the same as the code unit at index j of searchStr, return
true ; but if there is no such integer k, returnfalse .
If searchString appears as a substring of the result of converting this object to a String, at one or more indices that are greater than or equal to position, return
Throwing an exception if the first argument is a RegExp is specified in order to allow future editions to define extensions that allow such argument values.
The includes function is intentionally generic; it does not require that its
21.1.3.8String.prototype.indexOf ( searchString [ , position ] )#
If searchString appears as a substring of the result of converting this object to a String, at one or more indices that are greater than or equal to position, then the smallest such index is returned; otherwise, -1 is returned. If position is
The indexOf method takes two arguments, searchString and position, and performs the following steps:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let searchStr be ?
ToString (searchString). - Let pos be ?
ToInteger (position). (If position isundefined , this step produces the value 0.) - Let len be the number of elements in S.
- Let start be
min (max (pos, 0), len). - Let searchLen be the number of elements in searchStr.
- Return the smallest possible integer k not smaller than start such that k+searchLen is not greater than len, and for all nonnegative integers j less than searchLen, the code unit at index k+j of S is the same as the code unit at index j of searchStr; but if there is no such integer k, return the value
-1.
The indexOf function is intentionally generic; it does not require that its
21.1.3.9String.prototype.lastIndexOf ( searchString [ , position ] )#
If searchString appears as a substring of the result of converting this object to a String at one or more indices that are smaller than or equal to position, then the greatest such index is returned; otherwise, -1 is returned. If position is
The lastIndexOf method takes two arguments, searchString and position, and performs the following steps:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let searchStr be ?
ToString (searchString). - Let numPos be ?
ToNumber (position). (If position isundefined , this step produces the valueNaN .) - If numPos is
NaN , let pos be+∞ ; otherwise, let pos beToInteger (numPos). - Let len be the number of elements in S.
- Let start be
min (max (pos, 0), len). - Let searchLen be the number of elements in searchStr.
- Return the largest possible nonnegative integer k not larger than start such that k+searchLen is not greater than len, and for all nonnegative integers j less than searchLen, the code unit at index k+j of S is the same as the code unit at index j of searchStr; but if there is no such integer k, return the value
-1.
The lastIndexOf function is intentionally generic; it does not require that its
21.1.3.10String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )#
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the localeCompare method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the localeCompare method is used.
When the localeCompare method is called with argument that, it returns a Number other than
Before performing the comparisons, the following steps are performed to prepare the Strings:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let That be ?
ToString (that).
The meaning of the optional second and third parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not assign any other interpretation to those parameter positions.
The localeCompare method, if considered as a function of two arguments
The actual return values are implementation-defined to permit implementers to encode additional information in the value, but the function is required to define a total ordering on all Strings. This function must treat Strings that are canonically equivalent according to the Unicode standard as identical and must return 0 when comparing Strings that are considered canonically equivalent.
The localeCompare method itself is not directly suitable as an argument to Array.prototype.sort because the latter requires a function of two arguments.
This function is intended to rely on whatever language-sensitive comparison functionality is available to the ECMAScript environment from the host environment, and to compare according to the rules of the host environment's current locale. However, regardless of the host provided comparison capabilities, this function must treat Strings that are canonically equivalent according to the Unicode standard as identical. It is recommended that this function should not honour Unicode compatibility equivalences or decompositions. For a definition and discussion of canonical equivalence see the Unicode Standard, chapters 2 and 3, as well as Unicode Standard Annex #15, Unicode Normalization Forms (http://www.unicode.org/reports/tr15/) and Unicode Technical Note #5, Canonical Equivalence in Applications (http://www.unicode.org/notes/tn5/). Also see Unicode Technical Standard #10, Unicode Collation Algorithm (http://www.unicode.org/reports/tr10/).
The localeCompare function is intentionally generic; it does not require that its
21.1.3.11String.prototype.match ( regexp )#
When the match method is called with argument regexp, the following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - If regexp is neither
undefined nornull , then - Let S be ?
ToString (O). - Let rx be ?
RegExpCreate (regexp,undefined ). - Return ?
Invoke (rx, @@match, « S »).
The match function is intentionally generic; it does not require that its
21.1.3.12String.prototype.normalize ( [ form ] )#
When the normalize method is called with one argument form, the following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - If form is not provided or form is
undefined , let form be"NFC". - Let f be ?
ToString (form). - If f is not one of
"NFC","NFD","NFKC", or"NFKD", throw aRangeError exception. - Let ns be the String value that is the result of normalizing S into the normalization form named by f as specified in http://www.unicode.org/reports/tr15/tr15-29.html.
- Return ns.
The normalize function is intentionally generic; it does not require that its
21.1.3.13String.prototype.repeat ( count )#
The following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let n be ?
ToInteger (count). - If n < 0, throw a
RangeError exception. - If n is
+∞ , throw aRangeError exception. - Let T be a String value that is made from n copies of S appended together. If n is 0, T is the empty String.
- Return T.
This method creates a String consisting of the code units of the this object (converted to String) repeated count times.
The repeat function is intentionally generic; it does not require that its
21.1.3.14String.prototype.replace (searchValue, replaceValue )#
When the replace method is called with arguments searchValue and replaceValue, the following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - If searchValue is neither
undefined nornull , then - Let string be ?
ToString (O). - Let searchString be ?
ToString (searchValue). - Let functionalReplace be
IsCallable (replaceValue). - If functionalReplace is
false , then- Let replaceValue be ?
ToString (replaceValue).
- Let replaceValue be ?
- Search string for the first occurrence of searchString and let pos be the index within string of the first code unit of the matched substring and let matched be searchString. If no occurrences of searchString were found, return string.
- If functionalReplace is
true , then - Else,
- Let captures be a new empty
List . - Let replStr be
GetSubstitution (matched, string, pos, captures, replaceValue).
- Let captures be a new empty
- Let tailPos be pos + the number of code units in matched.
- Let newString be the String formed by concatenating the first pos code units of string, replStr, and the trailing substring of string starting at index tailPos. If pos is 0, the first element of the concatenation will be the empty String.
- Return newString.
The replace function is intentionally generic; it does not require that its
21.1.3.14.1Runtime Semantics: GetSubstitution(matched, str, position, captures, replacement)#
The abstract operation GetSubstitution performs the following steps:
- Assert:
Type (matched) is String. - Let matchLength be the number of code units in matched.
- Assert:
Type (str) is String. - Let stringLength be the number of code units in str.
- Assert: position is a nonnegative integer.
- Assert: position ≤ stringLength.
- Assert: captures is a possibly empty
List of Strings. - Assert:
Type (replacement) is String. - Let tailPos be position + matchLength.
- Let m be the number of elements in captures.
- Let result be a String value derived from replacement by copying code unit elements from replacement to result while performing replacements as specified in
Table 46 . These$replacements are done left-to-right, and, once such a replacement is performed, the new replacement text is not subject to further replacements. - Return result.
| Code units | Unicode Characters | Replacement text |
|---|---|---|
| 0x0024, 0x0024 |
$$
|
$
|
| 0x0024, 0x0026 |
$&
|
matched |
| 0x0024, 0x0060 |
$`
|
If position is 0, the replacement is the empty String. Otherwise the replacement is the substring of str that starts at index 0 and whose last code unit is at index position - 1. |
| 0x0024, 0x0027 |
$'
|
If tailPos ≥ stringLength, the replacement is the empty String. Otherwise the replacement is the substring of str that starts at index tailPos and continues to the end of str. |
|
0x0024, N
Where 0x0031 ≤ N ≤ 0x0039 |
$n where
n is one of 1 2 3 4 5 6 7 8 9 and $n is not followed by a decimal digit
|
The nth element of captures, where n is a single digit in the range 1 to 9. If n≤m and the nth element of captures is |
|
0x0024, N, N
Where 0x0030 ≤ N ≤ 0x0039 |
$nn where
n is one of 0 1 2 3 4 5 6 7 8 9
|
The nnth element of captures, where nn is a two-digit decimal number in the range 01 to 99. If nn≤m and the nnth element of captures is |
| 0x0024 |
$ in any context that does not match any of the above.
|
$
|
21.1.3.15String.prototype.search ( regexp )#
When the search method is called with argument regexp, the following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - If regexp is neither
undefined nornull , then - Let string be ?
ToString (O). - Let rx be ?
RegExpCreate (regexp,undefined ). - Return ?
Invoke (rx, @@search, « string »).
The search function is intentionally generic; it does not require that its
21.1.3.16String.prototype.slice ( start, end )#
The slice method takes two arguments, start and end, and returns a substring of the result of converting this object to a String, starting from index start and running to, but not including, index end (or through the end of the String if end is
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let len be the number of elements in S.
- Let intStart be ?
ToInteger (start). - If end is
undefined , let intEnd be len; else let intEnd be ?ToInteger (end). - If intStart < 0, let from be
max (len + intStart, 0); otherwise let from bemin (intStart, len). - If intEnd < 0, let to be
max (len + intEnd, 0); otherwise let to bemin (intEnd, len). - Let span be
max (to - from, 0). - Return a String value containing span consecutive elements from S beginning with the element at index from.
The slice function is intentionally generic; it does not require that its
21.1.3.17String.prototype.split ( separator, limit )#
Returns an Array object into which substrings of the result of converting this object to a String have been stored. The substrings are determined by searching from left to right for occurrences of separator; these occurrences are not part of any substring in the returned array, but serve to divide up the String value. The value of separator may be a String of any length or it may be an object, such as an RegExp, that has a @@split method.
When the split method is called, the following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - If separator is neither
undefined nornull , then - Let S be ?
ToString (O). - Let A be
ArrayCreate (0). - Let lengthA be 0.
- If limit is
undefined , let lim be 232-1; else let lim be ?ToUint32 (limit). - Let s be the number of elements in S.
- Let p be 0.
- Let R be ?
ToString (separator). - If lim = 0, return A.
- If separator is
undefined , then- Perform !
CreateDataProperty (A,"0", S). - Return A.
- Perform !
- If s = 0, then
- Let z be
SplitMatch (S, 0, R). - If z is not
false , return A. - Perform !
CreateDataProperty (A,"0", S). - Return A.
- Let z be
- Let q be p.
- Repeat, while q ≠ s
- Let e be
SplitMatch (S, q, R). - If e is
false , let q be q+1. - Else e is an integer index ≤ s,
- If e = p, let q be q+1.
- Else e ≠ p,
- Let T be a String value equal to the substring of S consisting of the code units at indices p (inclusive) through q (exclusive).
- Perform !
CreateDataProperty (A, !ToString (lengthA), T). - Increment lengthA by 1.
- If lengthA = lim, return A.
- Let p be e.
- Let q be p.
- Let e be
- Let T be a String value equal to the substring of S consisting of the code units at indices p (inclusive) through s (exclusive).
- Perform !
CreateDataProperty (A, !ToString (lengthA), T). - Return A.
The value of separator may be an empty String. In this case, separator does not match the empty substring at the beginning or end of the input String, nor does it match the empty substring at the end of the previous separator match. If separator is the empty String, the String is split up into individual code unit elements; the length of the result array equals the length of the String, and each substring contains one code unit.
If the
If separator is
The split function is intentionally generic; it does not require that its
21.1.3.17.1Runtime Semantics: SplitMatch ( S, q, R )#
The abstract operation SplitMatch takes three parameters, a String S, an integer q, and a String R, and performs the following steps in order to return either
- Assert:
Type (R) is String. - Let r be the number of code units in R.
- Let s be the number of code units in S.
- If q+r > s, return
false . - If there exists an integer i between 0 (inclusive) and r (exclusive) such that the code unit at index q+i of S is different from the code unit at index i of R, return
false . - Return q+r.
21.1.3.18String.prototype.startsWith ( searchString [ , position ] )#
The following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let isRegExp be ?
IsRegExp (searchString). - If isRegExp is
true , throw aTypeError exception. - Let searchStr be ?
ToString (searchString). - Let pos be ?
ToInteger (position). (If position isundefined , this step produces the value 0.) - Let len be the number of elements in S.
- Let start be
min (max (pos, 0), len). - Let searchLength be the number of elements in searchStr.
- If searchLength+start is greater than len, return
false . - If the sequence of elements of S starting at start of length searchLength is the same as the full element sequence of searchStr, return
true . - Otherwise, return
false .
This method returns
Throwing an exception if the first argument is a RegExp is specified in order to allow future editions to define extensions that allow such argument values.
The startsWith function is intentionally generic; it does not require that its
21.1.3.19String.prototype.substring ( start, end )#
The substring method takes two arguments, start and end, and returns a substring of the result of converting this object to a String, starting from index start and running to, but not including, index end of the String (or through the end of the String if end is
If either argument is
If start is larger than end, they are swapped.
The following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let len be the number of elements in S.
- Let intStart be ?
ToInteger (start). - If end is
undefined , let intEnd be len; else let intEnd be ?ToInteger (end). - Let finalStart be
min (max (intStart, 0), len). - Let finalEnd be
min (max (intEnd, 0), len). - Let from be
min (finalStart, finalEnd). - Let to be
max (finalStart, finalEnd). - Return a String whose length is to - from, containing code units from S, namely the code units with indices from through to - 1, in ascending order.
The substring function is intentionally generic; it does not require that its
21.1.3.20String.prototype.toLocaleLowerCase ( [ reserved1 [ , reserved2 ] ] )#
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the toLocaleLowerCase method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleLowerCase method is used.
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in
This function works exactly the same as toLowerCase except that its result is intended to yield the correct result for the host environment's current locale, rather than a locale-independent result. There will only be a difference in the few cases (such as Turkish) where the rules for that language conflict with the regular Unicode case mappings.
The meaning of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
The toLocaleLowerCase function is intentionally generic; it does not require that its
21.1.3.21String.prototype.toLocaleUpperCase ([ reserved1 [ , reserved2 ] ] )#
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the toLocaleUpperCase method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleUpperCase method is used.
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in
This function works exactly the same as toUpperCase except that its result is intended to yield the correct result for the host environment's current locale, rather than a locale-independent result. There will only be a difference in the few cases (such as Turkish) where the rules for that language conflict with the regular Unicode case mappings.
The meaning of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
The toLocaleUpperCase function is intentionally generic; it does not require that its
21.1.3.22String.prototype.toLowerCase ( )#
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let cpList be a
List containing in order the code points as defined in6.1.4 of S, starting at the first element of S. - For each code point c in cpList, if the Unicode Character Database provides a language insensitive lower case equivalent of c, then replace c in cpList with that equivalent code point(s).
- Let cuList be a new empty
List . - For each code point c in cpList, in order, append to cuList the elements of the
UTF16Encoding of c. - Let L be a String whose elements are, in order, the elements of cuList.
- Return L.
The result must be derived according to the locale-insensitive case mappings in the Unicode Character Database (this explicitly includes not only the UnicodeData.txt file, but also all locale-insensitive mappings in the SpecialCasings.txt file that accompanies it).
The case mapping of some code points may produce multiple code points. In this case the result String may not be the same length as the source String. Because both toUpperCase and toLowerCase have context-sensitive behaviour, the functions are not symmetrical. In other words, s.toUpperCase().toLowerCase() is not necessarily equal to s.toLowerCase().
The toLowerCase function is intentionally generic; it does not require that its
21.1.3.23String.prototype.toString ( )#
When the toString method is called, the following steps are taken:
- Return ? thisStringValue(
this value).
For a String object, the toString method happens to return the same thing as the valueOf method.
21.1.3.24String.prototype.toUpperCase ( )#
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in
This function behaves in exactly the same way as String.prototype.toLowerCase, except that code points are mapped to their uppercase equivalents as specified in the Unicode Character Database.
The toUpperCase function is intentionally generic; it does not require that its
21.1.3.25String.prototype.trim ( )#
This function interprets a String value as a sequence of UTF-16 encoded code points, as described in
The following steps are taken:
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let T be a String value that is a copy of S with both leading and trailing white space removed. The definition of white space is the union of
WhiteSpace andLineTerminator . When determining whether a Unicode code point is in Unicode general category “Zs”, code unit sequences are interpreted as UTF-16 encoded code point sequences as specified in6.1.4 . - Return T.
The trim function is intentionally generic; it does not require that its
21.1.3.26String.prototype.valueOf ( )#
When the valueOf method is called, the following steps are taken:
- Return ? thisStringValue(
this value).
21.1.3.27String.prototype [ @@iterator ] ( )#
When the @@iterator method is called it returns an Iterator object (
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Return
CreateStringIterator (S).
The value of the name property of this function is "[Symbol.iterator]".
21.1.4Properties of String Instances#
String instances are String exotic objects and have the internal methods specified for such objects. String instances inherit properties from the String prototype object. String instances also have a [[StringData]] internal slot.
String instances have a length property, and a set of enumerable properties with integer indexed names.
21.1.4.1length#
The number of elements in the String value represented by this String object.
Once a String object is initialized, this property is unchanging. It has the attributes { [[Writable]]:
21.1.5String Iterator Objects#
An String Iterator is an object, that represents a specific iteration over some specific String instance object. There is not a named constructor for String Iterator objects. Instead, String iterator objects are created by calling certain methods of String instance objects.
21.1.5.1CreateStringIterator Abstract Operation#
Several methods of String objects return Iterator objects. The abstract operation CreateStringIterator with argument string is used to create such iterator objects. It performs the following steps:
- Assert:
Type (string) is String. - Let iterator be
ObjectCreate (%StringIteratorPrototype% , « [[IteratedString]], [[StringIteratorNextIndex]] »). - Set iterator's [[IteratedString]] internal slot to string.
- Set iterator's [[StringIteratorNextIndex]] internal slot to 0.
- Return iterator.
21.1.5.2The %StringIteratorPrototype% Object#
All String Iterator Objects inherit properties from the %StringIteratorPrototype% intrinsic object. The %StringIteratorPrototype% object is an ordinary object and its [[Prototype]] internal slot is the
21.1.5.2.1%StringIteratorPrototype%.next ( )#
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have all of the internal slots of an String Iterator Instance (
21.1.5.3 ), throw aTypeError exception. - Let s be the value of the [[IteratedString]] internal slot of O.
- If s is
undefined , returnCreateIterResultObject (undefined ,true ). - Let position be the value of the [[StringIteratorNextIndex]] internal slot of O.
- Let len be the number of elements in s.
- If position ≥ len, then
- Set the value of the [[IteratedString]] internal slot of O to
undefined . - Return
CreateIterResultObject (undefined ,true ).
- Set the value of the [[IteratedString]] internal slot of O to
- Let first be the code unit value at index position in s.
- If first < 0xD800 or first > 0xDBFF or position+1 = len, let resultString be the string consisting of the single code unit first.
- Else,
- Let second be the code unit value at index position+1 in the String S.
- If second < 0xDC00 or second > 0xDFFF, let resultString be the string consisting of the single code unit first.
- Else, let resultString be the string consisting of the code unit first followed by the code unit second.
- Let resultSize be the number of code units in resultString.
- Set the value of the [[StringIteratorNextIndex]] internal slot of O to position + resultSize.
- Return
CreateIterResultObject (resultString,false ).
21.1.5.2.2%StringIteratorPrototype% [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "String Iterator".
This property has the attributes { [[Writable]]:
21.1.5.3Properties of String Iterator Instances#
String Iterator instances are ordinary objects that inherit properties from the
| Internal Slot | Description |
|---|---|
| [[IteratedString]] | The String value whose elements are being iterated. |
| [[StringIteratorNextIndex]] | The integer index of the next string index to be examined by this iteration. |
21.2RegExp (Regular Expression) Objects#
A RegExp object contains a regular expression and the associated flags.
The form and functionality of regular expressions is modelled after the regular expression facility in the Perl 5 programming language.
21.2.1Patterns#
The RegExp constructor applies the following grammar to the input pattern String. An error occurs if the grammar cannot interpret the String as an expansion of
Syntax
Each \u u u \u
21.2.1.1Static Semantics: Early Errors#
-
It is a Syntax Error if the MV of
HexDigits > 1114111.
21.2.2Pattern Semantics#
A regular expression pattern is converted into an internal procedure using the process described below. An implementation is encouraged to use more efficient algorithms than the ones listed below, as long as the results are the same. The internal procedure is used as the value of a RegExp object's [[RegExpMatcher]] internal slot.
A "u". A BMP pattern matches against a String interpreted as consisting of a sequence of 16-bit values that are Unicode code points in the range of the Basic Multilingual Plane. A Unicode pattern matches against a String interpreted as consisting of Unicode code points encoded using UTF-16. In the context of describing the behaviour of a BMP pattern “character” means a single 16-bit Unicode BMP code point. In the context of describing the behaviour of a Unicode pattern “character” means a UTF-16 encoded code point (
The syntax and semantics of
For example, consider a pattern expressed in source text as the single non-BMP character U+1D11E (MUSICAL SYMBOL G CLEF). Interpreted as a Unicode pattern, it would be a single element (character)
Patterns are passed to the RegExp constructor as ECMAScript String values in which non-BMP characters are UTF-16 encoded. For example, the single character MUSICAL SYMBOL G CLEF pattern, expressed as a String value, is a String of length 2 whose elements were the code units 0xD834 and 0xDD1E. So no further translation of the string would be necessary to process it as a BMP pattern consisting of two pattern characters. However, to process it as a Unicode pattern
An implementation may not actually perform such translations to or from UTF-16, but the semantics of this specification requires that the result of pattern matching be as if such translations were performed.
21.2.2.1Notation#
The descriptions below use the following variables:
-
Input is a
List consisting of all of the characters, in order, of the String being matched by the regular expression pattern. Each character is either a code unit or a code point, depending upon the kind of pattern involved. The notation Input[n] means the nth character of Input, where n can range between 0 (inclusive) and InputLength (exclusive). - InputLength is the number of characters in Input.
-
NcapturingParens is the total number of left capturing parentheses (i.e. the total number of times the
production is expanded) in the pattern. A left capturing parenthesis is anyAtom :: ( Disjunction ) (pattern character that is matched by the(terminal of the production.Atom :: ( Disjunction ) -
IgnoreCase is
true if the RegExp object's [[OriginalFlags]] internal slot contains"i"and otherwise isfalse . -
Multiline is
true if the RegExp object's [[OriginalFlags]] internal slot contains"m"and otherwise isfalse . -
Unicode is
true if the RegExp object's [[OriginalFlags]] internal slot contains"u"and otherwise isfalse .
Furthermore, the descriptions below use the following internal data structures:
- A CharSet is a mathematical set of characters, either code units or code points depending up the state of the Unicode flag. “All characters” means either all code unit values or all code point values also depending upon the state if Unicode.
-
A State is an ordered pair (endIndex, captures) where endIndex is an integer and captures is a
List of NcapturingParens values. States are used to represent partial match states in the regular expression matching algorithms. The endIndex is one plus the index of the last input character matched so far by the pattern, while captures holds the results of capturing parentheses. The nth element of captures is either aList that represents the value obtained by the nth set of capturing parentheses orundefined if the nth set of capturing parentheses hasn't been reached yet. Due to backtracking, many States may be in use at any time during the matching process. -
A MatchResult is either a State or the special token
failure that indicates that the match failed. -
A Continuation procedure is an internal closure (i.e. an internal procedure with some arguments already bound to values) that takes one State argument and returns a MatchResult result. If an internal closure references variables which are bound in the function that creates the closure, the closure uses the values that these variables had at the time the closure was created. The Continuation attempts to match the remaining portion (specified by the closure's already-bound arguments) of the pattern against Input, starting at the intermediate state given by its State argument. If the match succeeds, the Continuation returns the final State that it reached; if the match fails, the Continuation returns
failure . - A Matcher procedure is an internal closure that takes two arguments — a State and a Continuation — and returns a MatchResult result. A Matcher attempts to match a middle subpattern (specified by the closure's already-bound arguments) of the pattern against Input, starting at the intermediate state given by its State argument. The Continuation argument should be a closure that matches the rest of the pattern. After matching the subpattern of a pattern to obtain a new State, the Matcher then calls Continuation on that new State to test if the rest of the pattern can match as well. If it can, the Matcher returns the State returned by Continuation; if not, the Matcher may try different choices at its choice points, repeatedly calling Continuation until it either succeeds or all possibilities have been exhausted.
-
An AssertionTester procedure is an internal closure that takes a State argument and returns a Boolean result. The assertion tester tests a specific condition (specified by the closure's already-bound arguments) against the current place in Input and returns
true if the condition matched orfalse if not. -
An EscapeValue is either a character or an integer. An EscapeValue is used to denote the interpretation of a
DecimalEscape escape sequence: a character ch means that the escape sequence is interpreted as the character ch, while an integer n means that the escape sequence is interpreted as a backreference to the nth set of capturing parentheses.
21.2.2.2Pattern#
The production
- Evaluate
Disjunction to obtain a Matcher m. - Return an internal closure that takes two arguments, a String str and an integer index, and performs the following steps:
- Assert: index ≤ the number of elements in str.
- If Unicode is
true , let Input be aList consisting of the sequence of code points of str interpreted as a UTF-16 encoded (6.1.4 ) Unicode string. Otherwise, let Input be aList consisting of the sequence of code units that are the elements of str. Input will be used throughout the algorithms in21.2.2 . Each element of Input is considered to be a character. - Let InputLength be the number of characters contained in Input. This variable will be used throughout the algorithms in
21.2.2 . - Let listIndex be the index into Input of the character that was obtained from element index of str.
- Let c be a Continuation that always returns its State argument as a successful MatchResult.
- Let cap be a
List of NcapturingParensundefined values, indexed 1 through NcapturingParens. - Let x be the State (listIndex, cap).
- Call m(x, c) and return its result.
A Pattern evaluates (“compiles”) to an internal procedure value.
21.2.2.3Disjunction#
The production
The production
- Evaluate
Alternative to obtain a Matcher m1. - Evaluate
Disjunction to obtain a Matcher m2. - Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following steps when evaluated:
- Call m1(x, c) and let r be its result.
- If r is not
failure , return r. - Call m2(x, c) and return its result.
The | regular expression operator separates two alternatives. The pattern first tries to match the left | produce
/a|ab/.exec("abc")
returns the result "a" and not "ab". Moreover,
/((a)|(ab))((c)|(bc))/.exec("abc")
returns the array
["abc", "a", "a", undefined, "bc", undefined, "bc"]
and not
["abc", "ab", undefined, "ab", "c", "c", undefined]
21.2.2.4Alternative#
The production
The production
- Evaluate
Alternative to obtain a Matcher m1. - Evaluate
Term to obtain a Matcher m2. - Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following steps when evaluated:
- Create a Continuation d that takes a State argument y and returns the result of calling m2(y, c).
- Call m1(x, d) and return its result.
Consecutive
21.2.2.5Term#
The production
- Evaluate
Assertion to obtain an AssertionTester t. - Call t(x) and let r be the resulting Boolean value.
- If r is
false , returnfailure . - Call c(x) and return its result.
The production
- Return the Matcher that is the result of evaluating
Atom .
The production
- Evaluate
Atom to obtain a Matcher m. - Evaluate
Quantifier to obtain the three results: an integer min, an integer (or ∞) max, and Boolean greedy. - If max is finite and less than min, throw a
SyntaxError exception. - Let parenIndex be the number of left capturing parentheses in the entire regular expression that occur to the left of this production expansion's
Term . This is the total number of times the production is expanded prior to this production'sAtom :: ( Disjunction ) Term plus the total number of productions enclosing thisAtom :: ( Disjunction ) Term . - Let parenCount be the number of left capturing parentheses in the expansion of this production's
Atom . This is the total number of productions enclosed by this production'sAtom :: ( Disjunction ) Atom . - Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following steps when evaluated:
- Call
RepeatMatcher (m, min, max, greedy, x, c, parenIndex, parenCount) and return its result.
- Call
21.2.2.5.1Runtime Semantics: RepeatMatcher Abstract Operation#
The abstract operation RepeatMatcher takes eight parameters, a Matcher m, an integer min, an integer (or ∞) max, a Boolean greedy, a State x, a Continuation c, an integer parenIndex, and an integer parenCount, and performs the following steps:
- If max is zero, return c(x).
- Create an internal Continuation closure d that takes one State argument y and performs the following steps when evaluated:
- If min is zero and y's endIndex is equal to x's endIndex, return
failure . - If min is zero, let min2 be zero; otherwise let min2 be min-1.
- If max is ∞, let max2 be ∞; otherwise let max2 be max-1.
- Call
RepeatMatcher (m, min2, max2, greedy, y, c, parenIndex, parenCount) and return its result.
- If min is zero and y's endIndex is equal to x's endIndex, return
- Let cap be a fresh copy of x's captures
List . - For every integer k that satisfies parenIndex < k and k ≤ parenIndex+parenCount, set cap[k] to
undefined . - Let e be x's endIndex.
- Let xr be the State (e, cap).
- If min is not zero, return m(xr, d).
- If greedy is
false , then- Call c(x) and let z be its result.
- If z is not
failure , return z. - Call m(xr, d) and return its result.
- Call m(xr, d) and let z be its result.
- If z is not
failure , return z. - Call c(x) and return its result.
An
If the
Compare
/a[a-z]{2,4}/.exec("abcdefghi")
which returns "abcde" with
/a[a-z]{2,4}?/.exec("abcdefghi")
which returns "abc".
Consider also
/(aa|aabaac|ba|b|c)*/.exec("aabaac")
which, by the choice point ordering above, returns the array
["aaba", "ba"]
and not any of:
["aabaac", "aabaac"]
["aabaac", "c"]
The above ordering of choice points can be used to write a regular expression that calculates the greatest common divisor of two numbers (represented in unary notation). The following example calculates the gcd of 10 and 15:
"aaaaaaaaaa,aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/,"$1")
which returns the gcd in unary notation "aaaaa".
Step 4 of the RepeatMatcher clears
/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")
which returns the array
["zaacbbbcac", "z", "ac", "a", undefined, "c"]
and not
["zaacbbbcac", "z", "ac", "a", "bbb", "c"]
because each iteration of the outermost * clears all captured Strings contained in the quantified
Step 1 of the RepeatMatcher's d closure states that, once the minimum number of repetitions has been satisfied, any more expansions of
/(a*)*/.exec("b")
or the slightly more complicated:
/(a*)b\1+/.exec("baaaac")
which returns the array
["b", ""]
21.2.2.6Assertion#
The production
- Let e be x's endIndex.
- If e is zero, return
true . - If Multiline is
false , returnfalse . - If the character Input[e-1] is one of
LineTerminator , returntrue . - Return
false .
Even when the y flag is used with a pattern, ^ always matches only at the beginning of Input, or (if Multiline is
The production
- Let e be x's endIndex.
- If e is equal to InputLength, return
true . - If Multiline is
false , returnfalse . - If the character Input[e] is one of
LineTerminator , returntrue . - Return
false .
The production
- Let e be x's endIndex.
- Call
IsWordChar (e-1) and let a be the Boolean result. - Call
IsWordChar (e) and let b be the Boolean result. - If a is
true and b isfalse , returntrue . - If a is
false and b istrue , returntrue . - Return
false .
The production
- Let e be x's endIndex.
- Call
IsWordChar (e-1) and let a be the Boolean result. - Call
IsWordChar (e) and let b be the Boolean result. - If a is
true and b isfalse , returnfalse . - If a is
false and b istrue , returnfalse . - Return
true .
The production
- Evaluate
Disjunction to obtain a Matcher m. - Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following steps:
- Let d be a Continuation that always returns its State argument as a successful MatchResult.
- Call m(x, d) and let r be its result.
- If r is
failure , returnfailure . - Let y be r's State.
- Let cap be y's captures
List . - Let xe be x's endIndex.
- Let z be the State (xe, cap).
- Call c(z) and return its result.
The production
- Evaluate
Disjunction to obtain a Matcher m. - Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following steps:
- Let d be a Continuation that always returns its State argument as a successful MatchResult.
- Call m(x, d) and let r be its result.
- If r is not
failure , returnfailure . - Call c(x) and return its result.
21.2.2.6.1Runtime Semantics: IsWordChar Abstract Operation#
The abstract operation IsWordChar takes an integer parameter e and performs the following steps:
- If e is -1 or e is InputLength, return
false . - Let c be the character Input[e].
- If c is one of the sixty-three characters below, return
true .abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_ - Return
false .
21.2.2.7Quantifier#
The production
- Evaluate
QuantifierPrefix to obtain the two results: an integer min and an integer (or ∞) max. - Return the three results min, max, and
true .
The production
- Evaluate
QuantifierPrefix to obtain the two results: an integer min and an integer (or ∞) max. - Return the three results min, max, and
false .
The production
- Return the two results 0 and ∞.
The production
- Return the two results 1 and ∞.
The production
- Return the two results 0 and 1.
The production
- Let i be the MV of
DecimalDigits (see11.8.3 ). - Return the two results i and i.
The production
- Let i be the MV of
DecimalDigits . - Return the two results i and ∞.
The production
- Let i be the MV of the first
DecimalDigits . - Let j be the MV of the second
DecimalDigits . - Return the two results i and j.
21.2.2.8Atom#
The production
- Let ch be the character matched by
PatternCharacter . - Let A be a one-element CharSet containing the character ch.
- Call
CharacterSetMatcher (A,false ) and return its Matcher result.
The production
- Let A be the set of all characters except
LineTerminator . - Call
CharacterSetMatcher (A,false ) and return its Matcher result.
The production
- Return the Matcher that is the result of evaluating
AtomEscape .
The production
- Evaluate
CharacterClass to obtain a CharSet A and a Boolean invert. - Call
CharacterSetMatcher (A, invert) and return its Matcher result.
The production
- Evaluate
Disjunction to obtain a Matcher m. - Let parenIndex be the number of left capturing parentheses in the entire regular expression that occur to the left of this production expansion's initial left parenthesis. This is the total number of times the
production is expanded prior to this production'sAtom :: ( Disjunction ) Atom plus the total number of productions enclosing thisAtom :: ( Disjunction ) Atom . - Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following steps:
- Create an internal Continuation closure d that takes one State argument y and performs the following steps:
- Call m(x, d) and return its result.
The production
- Return the Matcher that is the result of evaluating
Disjunction .
21.2.2.8.1Runtime Semantics: CharacterSetMatcher Abstract Operation#
The abstract operation CharacterSetMatcher takes two arguments, a CharSet A and a Boolean flag invert, and performs the following steps:
- Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following steps when evaluated:
- Let e be x's endIndex.
- If e is InputLength, return
failure . - Let ch be the character Input[e].
- Let cc be
Canonicalize (ch). - If invert is
false , then- If there does not exist a member a of set A such that
Canonicalize (a) is cc, returnfailure .
- If there does not exist a member a of set A such that
- Else invert is
true ,- If there exists a member a of set A such that
Canonicalize (a) is cc, returnfailure .
- If there exists a member a of set A such that
- Let cap be x's captures
List . - Let y be the State (e+1, cap).
- Call c(y) and return its result.
21.2.2.8.2Runtime Semantics: Canonicalize ( ch )#
The abstract operation Canonicalize takes a character parameter ch and performs the following steps:
- If IgnoreCase is
false , return ch. - If Unicode is
true , then- If the file CaseFolding.txt of the Unicode Character Database provides a simple or common case folding mapping for ch, return the result of applying that mapping to ch.
- Else, return ch.
- Else,
- Assert: ch is a UTF-16 code unit.
- Let s be the ECMAScript String value consisting of the single code unit ch.
- Let u be the same result produced as if by performing the algorithm for
String.prototype.toUpperCaseusing s as thethis value. - Assert: u is a String value.
- If u does not consist of a single code unit, return ch.
- Let cu be u's single code unit element.
- If ch's code unit value ≥ 128 and cu's code unit value < 128, return ch.
- Return cu.
Parentheses of the form ( ) serve both to group the components of the \ followed by a nonzero decimal number), referenced in a replace String, or returned as part of an array from the regular expression matching internal procedure. To inhibit the capturing behaviour of parentheses, use the form (?: ) instead.
The form (?= ) specifies a zero-width positive lookahead. In order for it to succeed, the pattern inside (?= form (this unusual behaviour is inherited from Perl). This only matters when the
For example,
/(?=(a+))/.exec("baaabac")
matches the empty String immediately after the first b and therefore returns the array:
["", "aaa"]
To illustrate the lack of backtracking into the lookahead, consider:
/(?=(a+))a*b\1/.exec("baaabac")
This expression returns
["aba", "a"]
and not:
["aaaba", "a"]
The form (?! ) specifies a zero-width negative lookahead. In order for it to succeed, the pattern inside
/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")
looks for an a not immediately followed by some positive number n of a's, a b, another n a's (specified by the first \2) and a c. The second \2 is outside the negative lookahead, so it matches against
["baaabaac", "ba", undefined, "abaac"]
In case-insignificant matches when Unicode is "ß" (U+00DF) to "SS". It may however map a code point outside the Basic Latin range to a character within, for example, "ſ" (U+017F) to "s". Such characters are not mapped if Unicode is /[a-z]/i, but they will match /[a-z]/ui.
21.2.2.9AtomEscape#
The production
- Evaluate
DecimalEscape to obtain an EscapeValue E. - If E is a character, then
- Let ch be E's character.
- Let A be a one-element CharSet containing the character ch.
- Call
CharacterSetMatcher (A,false ) and return its Matcher result.
- Assert: E must be an integer.
- Let n be that integer.
- If n=0 or n>NcapturingParens, throw a
SyntaxError exception. - Return an internal Matcher closure that takes two arguments, a State x and a Continuation c, and performs the following steps:
- Let cap be x's captures
List . - Let s be cap[n].
- If s is
undefined , return c(x). - Let e be x's endIndex.
- Let len be s's length.
- Let f be e+len.
- If f>InputLength, return
failure . - If there exists an integer i between 0 (inclusive) and len (exclusive) such that
Canonicalize (s[i]) is not the same character value asCanonicalize (Input[e+i]), returnfailure . - Let y be the State (f, cap).
- Call c(y) and return its result.
- Let cap be x's captures
The production
- Evaluate
CharacterEscape to obtain a character ch. - Let A be a one-element CharSet containing the character ch.
- Call
CharacterSetMatcher (A,false ) and return its Matcher result.
The production
- Evaluate
CharacterClassEscape to obtain a CharSet A. - Call
CharacterSetMatcher (A,false ) and return its Matcher result.
An escape sequence of the form \ followed by a nonzero decimal number n matches the result of the nth set of capturing parentheses (see 0). It is an error if the regular expression has fewer than n capturing parentheses. If the regular expression has n or more capturing parentheses but the nth one is
21.2.2.10CharacterEscape#
The production
| ControlEscape | Character Value | Code Point | Unicode Name | Symbol |
|---|---|---|---|---|
t
|
9 |
U+0009
|
CHARACTER TABULATION | <HT> |
n
|
10 |
U+000A
|
LINE FEED (LF) | <LF> |
v
|
11 |
U+000B
|
LINE TABULATION | <VT> |
f
|
12 |
U+000C
|
FORM FEED (FF) | <FF> |
r
|
13 |
U+000D
|
CARRIAGE RETURN (CR) | <CR> |
The production
- Let ch be the character matched by
ControlLetter . - Let i be ch's character value.
- Let j be the remainder of dividing i by 32.
- Return the character whose character value is j.
The production
- Return the character whose code is the SV of
HexEscapeSequence .
The production
- Return the result of evaluating
RegExpUnicodeEscapeSequence .
The production
- Return the character matched by
IdentityEscape .
The production
- Let lead be the result of evaluating
LeadSurrogate . - Let trail be the result of evaluating
TrailSurrogate . - Let cp be
UTF16Decode (lead, trail). - Return the character whose character value is cp.
The production
- Return the character whose code is the result of evaluating
LeadSurrogate .
The production
- Return the character whose code is the result of evaluating
TrailSurrogate .
The production
- Return the character whose code is the result of evaluating
NonSurrogate .
The production
- Return the character whose code is the SV of
Hex4Digits .
The production
- Return the character whose code is the MV of
HexDigits .
The production
- Return the character whose code is the SV of
Hex4Digits .
The production
- Return the character whose code is the SV of
Hex4Digits .
The production
- Return the character whose code is the SV of
Hex4Digits .
21.2.2.11DecimalEscape#
The production
- Let i be the MV of
DecimalIntegerLiteral . - If i is zero, return the EscapeValue consisting of the character U+0000 (NULL).
- Return the EscapeValue consisting of the integer i.
The definition of “the MV of
If \ is followed by a decimal number n whose first digit is not 0, then the escape sequence is considered to be a backreference. It is an error if n is greater than the total number of left capturing parentheses in the entire regular expression. \0 represents the <NUL> character and cannot be followed by a decimal digit.
21.2.2.12CharacterClassEscape#
The production 0 through 9 inclusive.
The production
The production
The production
The production
a
|
b
|
c
|
d
|
e
|
f
|
g
|
h
|
i
|
j
|
k
|
l
|
m
|
n
|
o
|
p
|
q
|
r
|
s
|
t
|
u
|
v
|
w
|
x
|
y
|
z
|
A
|
B
|
C
|
D
|
E
|
F
|
G
|
H
|
I
|
J
|
K
|
L
|
M
|
N
|
O
|
P
|
Q
|
R
|
S
|
T
|
U
|
V
|
W
|
X
|
Y
|
Z
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
_
|
The production
21.2.2.13CharacterClass#
The production
The production
21.2.2.14ClassRanges#
The production
The production
21.2.2.15NonemptyClassRanges#
The production
- Return the CharSet that is the result of evaluating
ClassAtom .
The production
- Evaluate
ClassAtom to obtain a CharSet A. - Evaluate
NonemptyClassRangesNoDash to obtain a CharSet B. - Return the union of CharSets A and B.
The production
- Evaluate the first
ClassAtom to obtain a CharSet A. - Evaluate the second
ClassAtom to obtain a CharSet B. - Evaluate
ClassRanges to obtain a CharSet C. - Call
CharacterRange (A, B) and let D be the resulting CharSet. - Return the union of CharSets D and C.
21.2.2.15.1Runtime Semantics: CharacterRange Abstract Operation#
The abstract operation CharacterRange takes two CharSet parameters A and B and performs the following steps:
- If A does not contain exactly one character or B does not contain exactly one character, throw a
SyntaxError exception. - Let a be the one character in CharSet A.
- Let b be the one character in CharSet B.
- Let i be the character value of character a.
- Let j be the character value of character b.
- If i > j, throw a
SyntaxError exception. - Return the set containing all characters numbered i through j, inclusive.
21.2.2.16NonemptyClassRangesNoDash#
The production
- Return the CharSet that is the result of evaluating
ClassAtom .
The production
- Evaluate
ClassAtomNoDash to obtain a CharSet A. - Evaluate
NonemptyClassRangesNoDash to obtain a CharSet B. - Return the union of CharSets A and B.
The production
- Evaluate
ClassAtomNoDash to obtain a CharSet A. - Evaluate
ClassAtom to obtain a CharSet B. - Evaluate
ClassRanges to obtain a CharSet C. - Call
CharacterRange (A, B) and let D be the resulting CharSet. - Return the union of CharSets D and C.
Even if the pattern ignores case, the case of the two ends of a range is significant in determining which characters belong to the range. Thus, for example, the pattern /[E-F]/i matches only the letters E, F, e, and f, while the pattern /[E-f]/i matches all upper and lower-case letters in the Unicode Basic Latin block as well as the symbols [, \, ], ^, _, and `.
A - character can be treated literally or it can denote a range. It is treated literally if it is the first or last character of
21.2.2.17ClassAtom#
The production -.
The production
21.2.2.18ClassAtomNoDash#
The production
- Return the CharSet containing the character matched by
SourceCharacter .
The production
- Return the CharSet that is the result of evaluating
ClassEscape .
21.2.2.19ClassEscape#
The production
- Evaluate
DecimalEscape to obtain an EscapeValue E. - If E is not a character, throw a
SyntaxError exception. - Let ch be E's character.
- Return the one-element CharSet containing the character ch.
The production
- Return the CharSet containing the single character <BS> U+0008 (BACKSPACE).
The production
- Return the CharSet containing the single character - U+002D (HYPHEN-MINUS).
The production
- Return the CharSet containing the single character that is the result of evaluating
CharacterEscape .
The production
- Return the CharSet that is the result of evaluating
CharacterClassEscape .
A \b, \B, and backreferences. Inside a \b means the backspace character, while \B and backreferences raise errors. Using a backreference inside a
21.2.3The RegExp Constructor#
The RegExp constructor is the %RegExp% intrinsic object and the initial value of the RegExp property of the RegExp is called as a function rather than as a constructor, it creates and initializes a new RegExp object. Thus the function call RegExp(…) is equivalent to the object creation expression new RegExp(…) with the same arguments.
The RegExp constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified RegExp behaviour must include a super call to the RegExp constructor to create and initialize subclass instances with the necessary internal slots.
21.2.3.1RegExp ( pattern, flags )#
The following steps are taken:
- Let patternIsRegExp be ?
IsRegExp (pattern). - If NewTarget is not
undefined , let newTarget be NewTarget. - Else,
- Let newTarget be the
active function object . - If patternIsRegExp is
true and flags isundefined , then
- Let newTarget be the
- If
Type (pattern) is Object and pattern has a [[RegExpMatcher]] internal slot, then- Let P be the value of pattern's [[OriginalSource]] internal slot.
- If flags is
undefined , let F be the value of pattern's [[OriginalFlags]] internal slot. - Else, let F be flags.
- Else if patternIsRegExp is
true , then - Else,
- Let P be pattern.
- Let F be flags.
- Let O be ?
RegExpAlloc (newTarget). - Return ?
RegExpInitialize (O, P, F).
If pattern is supplied using a
21.2.3.2Abstract Operations for the RegExp Constructor#
21.2.3.2.1Runtime Semantics: RegExpAlloc ( newTarget )#
When the abstract operation RegExpAlloc with argument newTarget is called, the following steps are taken:
- Let obj be ?
OrdinaryCreateFromConstructor (newTarget,"%RegExpPrototype%", « [[RegExpMatcher]], [[OriginalSource]], [[OriginalFlags]] »). - Perform !
DefinePropertyOrThrow (obj,"lastIndex", PropertyDescriptor {[[Writable]]:true , [[Enumerable]]:false , [[Configurable]]:false }). - Return obj.
21.2.3.2.2Runtime Semantics: RegExpInitialize ( obj, pattern, flags )#
When the abstract operation RegExpInitialize with arguments obj, pattern, and flags is called, the following steps are taken:
- If pattern is
undefined , let P be the empty String. - Else, let P be ?
ToString (pattern). - If flags is
undefined , let F be the empty String. - Else, let F be ?
ToString (flags). - If F contains any code unit other than
"g","i","m","u", or"y"or if it contains the same code unit more than once, throw aSyntaxError exception. - If F contains
"u", let BMP befalse ; else let BMP betrue . - If BMP is
true , then- Parse P using the grammars in
21.2.1 and interpreting each of its 16-bit elements as a Unicode BMP code point. UTF-16 decoding is not applied to the elements. The goal symbol for the parse isPattern . Throw aSyntaxError exception if P did not conform to the grammar, if any elements of P were not matched by the parse, or if any Early Error conditions exist. - Let patternCharacters be a
List whose elements are the code unit elements of P.
- Parse P using the grammars in
- Else,
- Parse P using the grammars in
21.2.1 and interpreting P as UTF-16 encoded Unicode code points (6.1.4 ). The goal symbol for the parse isPattern . Throw a[U] SyntaxError exception if P did not conform to the grammar, if any elements of P were not matched by the parse, or if any Early Error conditions exist. - Let patternCharacters be a
List whose elements are the code points resulting from applying UTF-16 decoding to P's sequence of elements.
- Parse P using the grammars in
- Set the value of obj's [[OriginalSource]] internal slot to P.
- Set the value of obj's [[OriginalFlags]] internal slot to F.
- Set obj's [[RegExpMatcher]] internal slot to the internal procedure that evaluates the above parse of P by applying the semantics provided in
21.2.2 using patternCharacters as the pattern'sList ofSourceCharacter values and F as the flag parameters. - Perform ?
Set (obj,"lastIndex", 0,true ). - Return obj.
21.2.3.2.3Runtime Semantics: RegExpCreate ( P, F )#
When the abstract operation RegExpCreate with arguments P and F is called, the following steps are taken:
- Let obj be ?
RegExpAlloc (%RegExp% ). - Return ?
RegExpInitialize (obj, P, F).
21.2.3.2.4Runtime Semantics: EscapeRegExpPattern ( P, F )#
When the abstract operation EscapeRegExpPattern with arguments P and F is called, the following occurs:
- Let S be a String in the form of a
Pattern (Pattern if F contains[U] "u") equivalent to P interpreted as UTF-16 encoded Unicode code points (6.1.4 ), in which certain code points are escaped as described below. S may or may not be identical to P; however, the internal procedure that would result from evaluating S as aPattern (Pattern if F contains[U] "u") must behave identically to the internal procedure given by the constructed object's [[RegExpMatcher]] internal slot. Multiple calls to this abstract operation using the same values for P and F must produce identical results. - The code points
/or anyLineTerminator occurring in the pattern shall be escaped in S as necessary to ensure that the String value formed by concatenating the Strings"/", S,"/", and F can be parsed (in an appropriate lexical context) as aRegularExpressionLiteral that behaves identically to the constructed regular expression. For example, if P is"/", then S could be"\/"or"\u002F", among other possibilities, but not"/", because///followed by F would be parsed as aSingleLineComment rather than aRegularExpressionLiteral . If P is the empty String, this specification can be met by letting S be"(?:)". - Return S.
21.2.4Properties of the RegExp Constructor#
The value of the [[Prototype]] internal slot of the RegExp constructor is the intrinsic object
The RegExp constructor has the following properties:
21.2.4.1RegExp.prototype#
The initial value of RegExp.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
21.2.4.2get RegExp [ @@species ]#
RegExp[@@species] is an accessor property whose set accessor function is
- Return the
this value.
The value of the name property of this function is "get [Symbol.species]".
RegExp prototype methods normally use their this object's constructor to create a derived object. However, a subclass constructor may over-ride that default behaviour by redefining its @@species property.
21.2.5Properties of the RegExp Prototype Object#
The RegExp prototype object is the intrinsic object %RegExpPrototype%. The RegExp prototype object is an ordinary object. It is not a RegExp instance and does not have a [[RegExpMatcher]] internal slot or any of the other internal slots of RegExp instance objects.
The value of the [[Prototype]] internal slot of the RegExp prototype object is the intrinsic object
The RegExp prototype object does not have a valueOf property of its own; however, it inherits the valueOf property from the Object prototype object.
21.2.5.1RegExp.prototype.constructor#
The initial value of RegExp.prototype.constructor is the intrinsic object
21.2.5.2RegExp.prototype.exec ( string )#
Performs a regular expression match of string against the regular expression and returns an Array object containing the results of the match, or
The String
- Let R be the
this value. - If
Type (R) is not Object, throw aTypeError exception. - If R does not have a [[RegExpMatcher]] internal slot, throw a
TypeError exception. - Let S be ?
ToString (string). - Return ?
RegExpBuiltinExec (R, S).
21.2.5.2.1Runtime Semantics: RegExpExec ( R, S )#
The abstract operation RegExpExec with arguments R and S performs the following steps:
- Assert:
Type (R) is Object. - Assert:
Type (S) is String. - Let exec be ?
Get (R,"exec"). - If
IsCallable (exec) istrue , then - If R does not have a [[RegExpMatcher]] internal slot, throw a
TypeError exception. - Return ?
RegExpBuiltinExec (R, S).
If a callable exec property is not found this algorithm falls back to attempting to use the built-in RegExp matching algorithm. This provides compatible behaviour for code written for prior editions where most built-in algorithms that use regular expressions did not perform a dynamic property lookup of exec.
21.2.5.2.2Runtime Semantics: RegExpBuiltinExec ( R, S )#
The abstract operation RegExpBuiltinExec with arguments R and S performs the following steps:
- Assert: R is an initialized RegExp instance.
- Assert:
Type (S) is String. - Let length be the number of code units in S.
- Let lastIndex be ?
ToLength (?Get (R,"lastIndex")). - Let global be
ToBoolean (?Get (R,"global")). - Let sticky be
ToBoolean (?Get (R,"sticky")). - If global is
false and sticky isfalse , let lastIndex be 0. - Let matcher be the value of R's [[RegExpMatcher]] internal slot.
- Let flags be the value of R's [[OriginalFlags]] internal slot.
- If flags contains
"u", let fullUnicode betrue , else let fullUnicode befalse . - Let matchSucceeded be
false . - Repeat, while matchSucceeded is
false - If lastIndex > length, then
- Perform ?
Set (R,"lastIndex", 0,true ). - Return
null .
- Perform ?
- Let r be matcher(S, lastIndex).
- If r is
failure , then- If sticky is
true , then- Perform ?
Set (R,"lastIndex", 0,true ). - Return
null .
- Perform ?
- Let lastIndex be
AdvanceStringIndex (S, lastIndex, fullUnicode).
- If sticky is
- Else,
- Assert: r is a State.
- Set matchSucceeded to
true .
- If lastIndex > length, then
- Let e be r's endIndex value.
- If fullUnicode is
true , then- e is an index into the Input character list, derived from S, matched by matcher. Let eUTF be the smallest index into S that corresponds to the character at element e of Input. If e is greater than or equal to the length of Input, then eUTF is the number of code units in S.
- Let e be eUTF.
- If global is
true or sticky istrue , then- Perform ?
Set (R,"lastIndex", e,true ).
- Perform ?
- Let n be the length of r's captures
List . (This is the same value as21.2.2.1 's NcapturingParens.) - Let A be
ArrayCreate (n + 1). - Assert: The value of A's
"length"property is n + 1. - Let matchIndex be lastIndex.
- Perform !
CreateDataProperty (A,"index", matchIndex). - Perform !
CreateDataProperty (A,"input", S). - Let matchedSubstr be the matched substring (i.e. the portion of S between offset lastIndex inclusive and offset e exclusive).
- Perform !
CreateDataProperty (A,"0", matchedSubstr). - For each integer i such that i > 0 and i ≤ n
- Let captureI be ith element of r's captures
List . - If captureI is
undefined , let capturedValue beundefined . - Else if fullUnicode is
true , then- Assert: captureI is a
List of code points. - Let capturedValue be a string whose code units are the
UTF16Encoding of the code points of captureI.
- Assert: captureI is a
- Else, fullUnicode is
false ,- Assert: captureI is a
List of code units. - Let capturedValue be a string consisting of the code units of captureI.
- Assert: captureI is a
- Perform !
CreateDataProperty (A, !ToString (i), capturedValue).
- Let captureI be ith element of r's captures
- Return A.
21.2.5.2.3AdvanceStringIndex ( S, index, unicode )#
The abstract operation AdvanceStringIndex with arguments S, index, and unicode performs the following steps:
- Assert:
Type (S) is String. - Assert: index is an integer such that 0≤index≤253-1.
- Assert:
Type (unicode) is Boolean. - If unicode is
false , return index+1. - Let length be the number of code units in S.
- If index+1 ≥ length, return index+1.
- Let first be the code unit value at index index in S.
- If first < 0xD800 or first > 0xDBFF, return index+1.
- Let second be the code unit value at index index+1 in S.
- If second < 0xDC00 or second > 0xDFFF, return index+1.
- Return index+2.
21.2.5.3get RegExp.prototype.flags#
RegExp.prototype.flags is an accessor property whose set accessor function is
- Let R be the
this value. - If
Type (R) is not Object, throw aTypeError exception. - Let result be the empty String.
- Let global be
ToBoolean (?Get (R,"global")). - If global is
true , append"g"as the last code unit of result. - Let ignoreCase be
ToBoolean (?Get (R,"ignoreCase")). - If ignoreCase is
true , append"i"as the last code unit of result. - Let multiline be
ToBoolean (?Get (R,"multiline")). - If multiline is
true , append"m"as the last code unit of result. - Let unicode be
ToBoolean (?Get (R,"unicode")). - If unicode is
true , append"u"as the last code unit of result. - Let sticky be
ToBoolean (?Get (R,"sticky")). - If sticky is
true , append"y"as the last code unit of result. - Return result.
21.2.5.4get RegExp.prototype.global#
RegExp.prototype.global is an accessor property whose set accessor function is
- Let R be the
this value. - If
Type (R) is not Object, throw aTypeError exception. - If R does not have an [[OriginalFlags]] internal slot, throw a
TypeError exception. - Let flags be the value of R's [[OriginalFlags]] internal slot.
- If flags contains the code unit
"g", returntrue . - Return
false .
21.2.5.5get RegExp.prototype.ignoreCase#
RegExp.prototype.ignoreCase is an accessor property whose set accessor function is
- Let R be the
this value. - If
Type (R) is not Object, throw aTypeError exception. - If R does not have an [[OriginalFlags]] internal slot, throw a
TypeError exception. - Let flags be the value of R's [[OriginalFlags]] internal slot.
- If flags contains the code unit
"i", returntrue . - Return
false .
21.2.5.6RegExp.prototype [ @@match ] ( string )#
When the @@match method is called with argument string, the following steps are taken:
- Let rx be the
this value. - If
Type (rx) is not Object, throw aTypeError exception. - Let S be ?
ToString (string). - Let global be
ToBoolean (?Get (rx,"global")). - If global is
false , then- Return ?
RegExpExec (rx, S).
- Return ?
- Else global is
true ,- Let fullUnicode be
ToBoolean (?Get (rx,"unicode")). - Perform ?
Set (rx,"lastIndex", 0,true ). - Let A be
ArrayCreate (0). - Let n be 0.
- Repeat,
- Let result be ?
RegExpExec (rx, S). - If result is
null , then- If n=0, return
null . - Else, return A.
- If n=0, return
- Else result is not
null ,- Let matchStr be ?
ToString (?Get (result,"0")). - Let status be
CreateDataProperty (A, !ToString (n), matchStr). - Assert: status is
true . - If matchStr is the empty String, then
- Let thisIndex be ?
ToLength (?Get (rx,"lastIndex")). - Let nextIndex be
AdvanceStringIndex (S, thisIndex, fullUnicode). - Perform ?
Set (rx,"lastIndex", nextIndex,true ).
- Let thisIndex be ?
- Increment n.
- Let matchStr be ?
- Let result be ?
- Let fullUnicode be
The value of the name property of this function is "[Symbol.match]".
The @@match property is used by the
21.2.5.7get RegExp.prototype.multiline#
RegExp.prototype.multiline is an accessor property whose set accessor function is
- Let R be the
this value. - If
Type (R) is not Object, throw aTypeError exception. - If R does not have an [[OriginalFlags]] internal slot, throw a
TypeError exception. - Let flags be the value of R's [[OriginalFlags]] internal slot.
- If flags contains the code unit
"m", returntrue . - Return
false .
21.2.5.8RegExp.prototype [ @@replace ] ( string, replaceValue )#
When the @@replace method is called with arguments string and replaceValue, the following steps are taken:
- Let rx be the
this value. - If
Type (rx) is not Object, throw aTypeError exception. - Let S be ?
ToString (string). - Let lengthS be the number of code unit elements in S.
- Let functionalReplace be
IsCallable (replaceValue). - If functionalReplace is
false , then- Let replaceValue be ?
ToString (replaceValue).
- Let replaceValue be ?
- Let global be
ToBoolean (?Get (rx,"global")). - If global is
true , then - Let results be a new empty
List . - Let done be
false . - Repeat, while done is
false - Let result be ?
RegExpExec (rx, S). - If result is
null , set done totrue . - Else result is not
null ,- Append result to the end of results.
- If global is
false , set done totrue . - Else,
- Let result be ?
- Let accumulatedResult be the empty String value.
- Let nextSourcePosition be 0.
- Repeat, for each result in results,
- Let nCaptures be ?
ToLength (?Get (result,"length")). - Let nCaptures be
max (nCaptures - 1, 0). - Let matched be ?
ToString (?Get (result,"0")). - Let matchLength be the number of code units in matched.
- Let position be ?
ToInteger (?Get (result,"index")). - Let position be
max (min (position, lengthS), 0). - Let n be 1.
- Let captures be a new empty
List . - Repeat while n ≤ nCaptures
- If functionalReplace is
true , then - Else,
- Let replacement be
GetSubstitution (matched, S, position, captures, replaceValue).
- Let replacement be
- If position ≥ nextSourcePosition, then
- NOTE position should not normally move backwards. If it does, it is an indication of an ill-behaving RegExp subclass or use of an access triggered side-effect to change the global flag or other characteristics of rx. In such cases, the corresponding substitution is ignored.
- Let accumulatedResult be the String formed by concatenating the code units of the current value of accumulatedResult with the substring of S consisting of the code units from nextSourcePosition (inclusive) up to position (exclusive) and with the code units of replacement.
- Let nextSourcePosition be position + matchLength.
- Let nCaptures be ?
- If nextSourcePosition ≥ lengthS, return accumulatedResult.
- Return the String formed by concatenating the code units of accumulatedResult with the substring of S consisting of the code units from nextSourcePosition (inclusive) up through the final code unit of S (inclusive).
The value of the name property of this function is "[Symbol.replace]".
21.2.5.9RegExp.prototype [ @@search ] ( string )#
When the @@search method is called with argument string, the following steps are taken:
- Let rx be the
this value. - If
Type (rx) is not Object, throw aTypeError exception. - Let S be ?
ToString (string). - Let previousLastIndex be ?
Get (rx,"lastIndex"). - Perform ?
Set (rx,"lastIndex", 0,true ). - Let result be ?
RegExpExec (rx, S). - Perform ?
Set (rx,"lastIndex", previousLastIndex,true ). - If result is
null , return -1. - Return ?
Get (result,"index").
The value of the name property of this function is "[Symbol.search]".
The lastIndex and global properties of this RegExp object are ignored when performing the search. The lastIndex property is left unchanged.
21.2.5.10get RegExp.prototype.source#
RegExp.prototype.source is an accessor property whose set accessor function is
- Let R be the
this value. - If
Type (R) is not Object, throw aTypeError exception. - If R does not have an [[OriginalSource]] internal slot, throw a
TypeError exception. - If R does not have an [[OriginalFlags]] internal slot, throw a
TypeError exception. - Let src be the value of R's [[OriginalSource]] internal slot.
- Let flags be the value of R's [[OriginalFlags]] internal slot.
- Return
EscapeRegExpPattern (src, flags).
21.2.5.11RegExp.prototype [ @@split ] ( string, limit )#
Returns an Array object into which substrings of the result of converting string to a String have been stored. The substrings are determined by searching from left to right for matches of the
The /a*?/[Symbol.split]("ab") evaluates to the array ["a","b"], while /a*/[Symbol.split]("ab") evaluates to the array ["","b"].)
If the string is (or converts to) the empty String, the result depends on whether the regular expression can match the empty String. If it can, the result array contains no elements. Otherwise, the result array contains one element, which is the empty String.
If the regular expression contains capturing parentheses, then each time separator is matched the results (including any
/<(\/)?([^<>]+)>/[Symbol.split]("A<B>bold</B>and<CODE>coded</CODE>")
evaluates to the array
["A",undefined,"B","bold","/","B","and",undefined,"CODE","coded","/","CODE",""]
If limit is not
When the @@split method is called, the following steps are taken:
- Let rx be the
this value. - If
Type (rx) is not Object, throw aTypeError exception. - Let S be ?
ToString (string). - Let C be ?
SpeciesConstructor (rx,%RegExp% ). - Let flags be ?
ToString (?Get (rx,"flags")). - If flags contains
"u", let unicodeMatching betrue . - Else, let unicodeMatching be
false . - If flags contains
"y", let newFlags be flags. - Else, let newFlags be the string that is the concatenation of flags and
"y". - Let splitter be ?
Construct (C, « rx, newFlags »). - Let A be
ArrayCreate (0). - Let lengthA be 0.
- If limit is
undefined , let lim be 232-1; else let lim be ?ToUint32 (limit). - Let size be the number of elements in S.
- Let p be 0.
- If lim = 0, return A.
- If size = 0, then
- Let z be ?
RegExpExec (splitter, S). - If z is not
null , return A. - Perform !
CreateDataProperty (A,"0", S). - Return A.
- Let z be ?
- Let q be p.
- Repeat, while q < size
- Perform ?
Set (splitter,"lastIndex", q,true ). - Let z be ?
RegExpExec (splitter, S). - If z is
null , let q beAdvanceStringIndex (S, q, unicodeMatching). - Else z is not
null ,- Let e be ?
ToLength (?Get (splitter,"lastIndex")). - Let e be
min (e, size). - If e = p, let q be
AdvanceStringIndex (S, q, unicodeMatching). - Else e ≠ p,
- Let T be a String value equal to the substring of S consisting of the elements at indices p (inclusive) through q (exclusive).
- Perform !
CreateDataProperty (A, !ToString (lengthA), T). - Let lengthA be lengthA + 1.
- If lengthA = lim, return A.
- Let p be e.
- Let numberOfCaptures be ?
ToLength (?Get (z,"length")). - Let numberOfCaptures be
max (numberOfCaptures-1, 0). - Let i be 1.
- Repeat, while i ≤ numberOfCaptures,
- Let nextCapture be ?
Get (z, !ToString (i)). - Perform !
CreateDataProperty (A, !ToString (lengthA), nextCapture). - Let i be i + 1.
- Let lengthA be lengthA + 1.
- If lengthA = lim, return A.
- Let nextCapture be ?
- Let q be p.
- Let e be ?
- Perform ?
- Let T be a String value equal to the substring of S consisting of the elements at indices p (inclusive) through size (exclusive).
- Perform !
CreateDataProperty (A, !ToString (lengthA), T). - Return A.
The value of the name property of this function is "[Symbol.split]".
The @@split method ignores the value of the global and sticky properties of this RegExp object.
21.2.5.12get RegExp.prototype.sticky#
RegExp.prototype.sticky is an accessor property whose set accessor function is
- Let R be the
this value. - If
Type (R) is not Object, throw aTypeError exception. - If R does not have an [[OriginalFlags]] internal slot, throw a
TypeError exception. - Let flags be the value of R's [[OriginalFlags]] internal slot.
- If flags contains the code unit
"y", returntrue . - Return
false .
21.2.5.13RegExp.prototype.test ( S )#
The following steps are taken:
- Let R be the
this value. - If
Type (R) is not Object, throw aTypeError exception. - Let string be ?
ToString (S). - Let match be ?
RegExpExec (R, string). - If match is not
null , returntrue ; else returnfalse .
21.2.5.14RegExp.prototype.toString ( )#
The returned String has the form of a
21.2.5.15get RegExp.prototype.unicode#
RegExp.prototype.unicode is an accessor property whose set accessor function is
- Let R be the
this value. - If
Type (R) is not Object, throw aTypeError exception. - If R does not have an [[OriginalFlags]] internal slot, throw a
TypeError exception. - Let flags be the value of R's [[OriginalFlags]] internal slot.
- If flags contains the code unit
"u", returntrue . - Return
false .
21.2.6Properties of RegExp Instances#
RegExp instances are ordinary objects that inherit properties from the RegExp prototype object. RegExp instances have internal slots [[RegExpMatcher]], [[OriginalSource]], and [[OriginalFlags]]. The value of the [[RegExpMatcher]] internal slot is an implementation dependent representation of the
Prior to ECMAScript 2015, RegExp instances were specified as having the own data properties source, global, ignoreCase, and multiline. Those properties are now specified as accessor properties of RegExp.prototype.
RegExp instances also have the following property:
21.2.6.1lastIndex#
The value of the lastIndex property specifies the String index at which to start the next match. It is coerced to an integer when used (see
22Indexed Collections#
22.1Array Objects#
Array objects are exotic objects that give special treatment to a certain class of property names. See
22.1.1The Array Constructor#
The Array constructor is the %Array% intrinsic object and the initial value of the Array property of the Array is called as a function rather than as a constructor, it also creates and initializes a new Array object. Thus the function call Array(…) is equivalent to the object creation expression new Array(…) with the same arguments.
The Array constructor is a single function whose behaviour is overloaded based upon the number and types of its arguments.
The Array constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the exotic Array behaviour must include a super call to the Array constructor to initialize subclass instances that are exotic Array objects. However, most of the Array.prototype methods are generic methods that are not dependent upon their this value being an exotic Array object.
The length property of the Array constructor function is 1.
22.1.1.1Array ( )#
This description applies if and only if the Array constructor is called with no arguments.
- Let numberOfArgs be the number of arguments passed to this function call.
- Assert: numberOfArgs = 0.
- If NewTarget is
undefined , let newTarget be theactive function object , else let newTarget be NewTarget. - Let proto be ?
GetPrototypeFromConstructor (newTarget,"%ArrayPrototype%"). - Return
ArrayCreate (0, proto).
22.1.1.2Array (len)#
This description applies if and only if the Array constructor is called with exactly one argument.
- Let numberOfArgs be the number of arguments passed to this function call.
- Assert: numberOfArgs = 1.
- If NewTarget is
undefined , let newTarget be theactive function object , else let newTarget be NewTarget. - Let proto be ?
GetPrototypeFromConstructor (newTarget,"%ArrayPrototype%"). - Let array be
ArrayCreate (0, proto). - If
Type (len) is not Number, then- Let defineStatus be
CreateDataProperty (array,"0", len). - Assert: defineStatus is
true . - Let intLen be 1.
- Let defineStatus be
- Else,
- Let intLen be
ToUint32 (len). - If intLen ≠ len, throw a
RangeError exception.
- Let intLen be
- Perform !
Set (array,"length", intLen,true ). - Return array.
22.1.1.3Array (...items )#
This description applies if and only if the Array constructor is called with at least two arguments.
When the Array function is called, the following steps are taken:
- Let numberOfArgs be the number of arguments passed to this function call.
- Assert: numberOfArgs ≥ 2.
- If NewTarget is
undefined , let newTarget be theactive function object , else let newTarget be NewTarget. - Let proto be ?
GetPrototypeFromConstructor (newTarget,"%ArrayPrototype%"). - Let array be ?
ArrayCreate (numberOfArgs, proto). - Let k be 0.
- Let items be a zero-origined
List containing the argument items in order. - Repeat, while k < numberOfArgs
- Let Pk be !
ToString (k). - Let itemK be items[k].
- Let defineStatus be
CreateDataProperty (array, Pk, itemK). - Assert: defineStatus is
true . - Increase k by 1.
- Let Pk be !
- Assert: the value of array's
lengthproperty is numberOfArgs. - Return array.
22.1.2Properties of the Array Constructor#
The value of the [[Prototype]] internal slot of the Array constructor is the intrinsic object
The Array constructor has the following properties:
22.1.2.1Array.from ( items [ , mapfn [ , thisArg ] ] )#
When the from method is called with argument items and optional arguments mapfn and thisArg, the following steps are taken:
- Let C be the
this value. - If mapfn is
undefined , let mapping befalse . - Else,
- If
IsCallable (mapfn) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let mapping be
true .
- If
- Let usingIterator be ?
GetMethod (items, @@iterator). - If usingIterator is not
undefined , then- If
IsConstructor (C) istrue , then- Let A be ?
Construct (C).
- Let A be ?
- Else,
- Let A be
ArrayCreate (0).
- Let A be
- Let iterator be ?
GetIterator (items, usingIterator). - Let k be 0.
- Repeat
- If k ≥ 253-1, then
- Let error be
Completion {[[Type]]:throw , [[Value]]: a newly createdTypeError object, [[Target]]:empty }. - Return ?
IteratorClose (iterator, error).
- Let error be
- Let Pk be !
ToString (k). - Let next be ?
IteratorStep (iterator). - If next is
false , then- Perform ?
Set (A,"length", k,true ). - Return A.
- Perform ?
- Let nextValue be ?
IteratorValue (next). - If mapping is
true , then- Let mappedValue be
Call (mapfn, T, « nextValue, k »). - If mappedValue is an
abrupt completion , return ?IteratorClose (iterator, mappedValue). - Let mappedValue be mappedValue.[[Value]].
- Let mappedValue be
- Else, let mappedValue be nextValue.
- Let defineStatus be
CreateDataPropertyOrThrow (A, Pk, mappedValue). - If defineStatus is an
abrupt completion , return ?IteratorClose (iterator, defineStatus). - Increase k by 1.
- If k ≥ 253-1, then
- If
- NOTE: items is not an Iterable so assume it is an array-like object.
- Let arrayLike be !
ToObject (items). - Let len be ?
ToLength (?Get (arrayLike,"length")). - If
IsConstructor (C) istrue , then- Let A be ?
Construct (C, « len »).
- Let A be ?
- Else,
- Let A be ?
ArrayCreate (len).
- Let A be ?
- Let k be 0.
- Repeat, while k < len
- Let Pk be !
ToString (k). - Let kValue be ?
Get (arrayLike, Pk). - If mapping is
true , then- Let mappedValue be ?
Call (mapfn, T, « kValue, k »).
- Let mappedValue be ?
- Else, let mappedValue be kValue.
- Perform ?
CreateDataPropertyOrThrow (A, Pk, mappedValue). - Increase k by 1.
- Let Pk be !
- Perform ?
Set (A,"length", len,true ). - Return A.
The from function is an intentionally generic factory method; it does not require that its
22.1.2.2Array.isArray ( arg )#
The isArray function takes one argument arg, and performs the following steps:
- Return ?
IsArray (arg).
22.1.2.3Array.of ( ...items )#
When the of method is called with any number of arguments, the following steps are taken:
- Let len be the actual number of arguments passed to this function.
- Let items be the
List of arguments passed to this function. - Let C be the
this value. - If
IsConstructor (C) istrue , then- Let A be ?
Construct (C, « len »).
- Let A be ?
- Else,
- Let A be ?
ArrayCreate (len).
- Let A be ?
- Let k be 0.
- Repeat, while k < len
- Let kValue be items[k].
- Let Pk be !
ToString (k). - Perform ?
CreateDataPropertyOrThrow (A, Pk, kValue). - Increase k by 1.
- Perform ?
Set (A,"length", len,true ). - Return A.
The items argument is assumed to be a well-formed rest argument value.
The of function is an intentionally generic factory method; it does not require that its
22.1.2.4Array.prototype#
The value of Array.prototype is
This property has the attributes { [[Writable]]:
22.1.2.5get Array [ @@species ]#
Array[@@species] is an accessor property whose set accessor function is
- Return the
this value.
The value of the name property of this function is "get [Symbol.species]".
Array prototype methods normally use their this object's constructor to create a derived object. However, a subclass constructor may over-ride that default behaviour by redefining its @@species property.
22.1.3Properties of the Array Prototype Object#
The Array prototype object is the intrinsic object %ArrayPrototype%. The Array prototype object is an Array exotic objects and has the internal methods specified for such objects. It has a length property whose initial value is 0 and whose attributes are { [[Writable]]:
The value of the [[Prototype]] internal slot of the Array prototype object is the intrinsic object
The Array prototype object is specified to be an Array exotic object to ensure compatibility with ECMAScript code that was created prior to the ECMAScript 2015 specification.
22.1.3.1Array.prototype.concat ( ...arguments )#
When the concat method is called with zero or more arguments, it returns an array containing the array elements of the object followed by the array elements of each argument in order.
The following steps are taken:
- Let O be ?
ToObject (this value). - Let A be ?
ArraySpeciesCreate (O, 0). - Let n be 0.
- Let items be a
List whose first element is O and whose subsequent elements are, in left to right order, the arguments that were passed to this function invocation. - Repeat, while items is not empty
- Remove the first element from items and let E be the value of the element.
- Let spreadable be ?
IsConcatSpreadable (E). - If spreadable is
true , then- Let k be 0.
- Let len be ?
ToLength (?Get (E,"length")). - If n + len > 253-1, throw a
TypeError exception. - Repeat, while k < len
- Let P be !
ToString (k). - Let exists be ?
HasProperty (E, P). - If exists is
true , then- Let subElement be ?
Get (E, P). - Perform ?
CreateDataPropertyOrThrow (A, !ToString (n), subElement).
- Let subElement be ?
- Increase n by 1.
- Increase k by 1.
- Let P be !
- Else E is added as a single item rather than spread,
- If n≥253-1, throw a
TypeError exception. - Perform ?
CreateDataPropertyOrThrow (A, !ToString (n), E). - Increase n by 1.
- If n≥253-1, throw a
- Perform ?
Set (A,"length", n,true ). - Return A.
The length property of the concat method is 1.
The explicit setting of the length property in step 6 is necessary to ensure that its value is correct in situations where the trailing elements of the result Array are not present.
The concat function is intentionally generic; it does not require that its
22.1.3.1.1Runtime Semantics: IsConcatSpreadable ( O )#
The abstract operation IsConcatSpreadable with argument O performs the following steps:
22.1.3.2Array.prototype.constructor#
The initial value of Array.prototype.constructor is the intrinsic object
22.1.3.3Array.prototype.copyWithin (target, start [ , end ] )#
The copyWithin method takes up to three arguments target, start and end.
The end argument is optional with the length of the
The following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - Let relativeTarget be ?
ToInteger (target). - If relativeTarget < 0, let to be
max ((len + relativeTarget), 0); else let to bemin (relativeTarget, len). - Let relativeStart be ?
ToInteger (start). - If relativeStart < 0, let from be
max ((len + relativeStart), 0); else let from bemin (relativeStart, len). - If end is
undefined , let relativeEnd be len; else let relativeEnd be ?ToInteger (end). - If relativeEnd < 0, let final be
max ((len + relativeEnd), 0); else let final bemin (relativeEnd, len). - Let count be
min (final-from, len-to). - If from<to and to<from+count, then
- Let direction be -1.
- Let from be from + count - 1.
- Let to be to + count - 1.
- Else,
- Let direction be 1.
- Repeat, while count > 0
- Let fromKey be !
ToString (from). - Let toKey be !
ToString (to). - Let fromPresent be ?
HasProperty (O, fromKey). - If fromPresent is
true , then - Else fromPresent is
false ,- Perform ?
DeletePropertyOrThrow (O, toKey).
- Perform ?
- Let from be from + direction.
- Let to be to + direction.
- Let count be count - 1.
- Let fromKey be !
- Return O.
The copyWithin function is intentionally generic; it does not require that its
22.1.3.4Array.prototype.entries ( )#
The following steps are taken:
- Let O be ?
ToObject (this value). - Return
CreateArrayIterator (O,"key+value").
22.1.3.5Array.prototype.every ( callbackfn [ , thisArg ] )#
callbackfn should be a function that accepts three arguments and returns a value that is coercible to the Boolean value every calls callbackfn once for each element present in the array, in ascending order, until it finds one where callbackfn returns every immediately returns every will return
If a thisArg parameter is provided, it will be used as the
callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.
every does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by every is set before the first call to callbackfn. Elements which are appended to the array after the call to every begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time every visits them; elements that are deleted after the call to every begins and before being visited are not visited. every acts like the "for all" quantifier in mathematics. In particular, for an empty array, it returns
When the every method is called with one or two arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let k be 0.
- Repeat, while k < len
- Let Pk be !
ToString (k). - Let kPresent be ?
HasProperty (O, Pk). - If kPresent is
true , then - Increase k by 1.
- Let Pk be !
- Return
true .
The every function is intentionally generic; it does not require that its
22.1.3.6Array.prototype.fill (value [ , start [ , end ] ] )#
The fill method takes up to three arguments value, start and end.
The start and end arguments are optional with default values of 0 and the length of the
The following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - Let relativeStart be ?
ToInteger (start). - If relativeStart < 0, let k be
max ((len + relativeStart), 0); else let k bemin (relativeStart, len). - If end is
undefined , let relativeEnd be len; else let relativeEnd be ?ToInteger (end). - If relativeEnd < 0, let final be
max ((len + relativeEnd), 0); else let final bemin (relativeEnd, len). - Repeat, while k < final
- Return O.
The fill function is intentionally generic; it does not require that its
22.1.3.7Array.prototype.filter ( callbackfn [ , thisArg ] )#
callbackfn should be a function that accepts three arguments and returns a value that is coercible to the Boolean value filter calls callbackfn once for each element in the array, in ascending order, and constructs a new array of all the values for which callbackfn returns
If a thisArg parameter is provided, it will be used as the
callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.
filter does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by filter is set before the first call to callbackfn. Elements which are appended to the array after the call to filter begins will not be visited by callbackfn. If existing elements of the array are changed their value as passed to callbackfn will be the value at the time filter visits them; elements that are deleted after the call to filter begins and before being visited are not visited.
When the filter method is called with one or two arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let A be ?
ArraySpeciesCreate (O, 0). - Let k be 0.
- Let to be 0.
- Repeat, while k < len
- Let Pk be !
ToString (k). - Let kPresent be ?
HasProperty (O, Pk). - If kPresent is
true , then- Let kValue be ?
Get (O, Pk). - Let selected be
ToBoolean (?Call (callbackfn, T, « kValue, k, O »)). - If selected is
true , then- Perform ?
CreateDataPropertyOrThrow (A, !ToString (to), kValue). - Increase to by 1.
- Perform ?
- Let kValue be ?
- Increase k by 1.
- Let Pk be !
- Return A.
The filter function is intentionally generic; it does not require that its
22.1.3.8Array.prototype.find ( predicate [ , thisArg ] )#
The find method is called with one or two arguments, predicate and thisArg.
predicate should be a function that accepts three arguments and returns a value that is coercible to a Boolean value. find calls predicate once for each element of the array, in ascending order, until it finds one where predicate returns find immediately returns that element value. Otherwise, find returns
If a thisArg parameter is provided, it will be used as the
predicate is called with three arguments: the value of the element, the index of the element, and the object being traversed.
find does not directly mutate the object on which it is called but the object may be mutated by the calls to predicate.
The range of elements processed by find is set before the first call to callbackfn. Elements that are appended to the array after the call to find begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to predicate will be the value at the time that find visits them.
When the find method is called, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If
IsCallable (predicate) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let k be 0.
- Repeat, while k < len
- Return
undefined .
The find function is intentionally generic; it does not require that its
22.1.3.9Array.prototype.findIndex ( predicate [ , thisArg ] )#
predicate should be a function that accepts three arguments and returns a value that is coercible to the Boolean value findIndex calls predicate once for each element of the array, in ascending order, until it finds one where predicate returns findIndex immediately returns the index of that element value. Otherwise, findIndex returns -1.
If a thisArg parameter is provided, it will be used as the
predicate is called with three arguments: the value of the element, the index of the element, and the object being traversed.
findIndex does not directly mutate the object on which it is called but the object may be mutated by the calls to predicate.
The range of elements processed by findIndex is set before the first call to callbackfn. Elements that are appended to the array after the call to findIndex begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to predicate will be the value at the time that findIndex visits them.
When the findIndex method is called with one or two arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If
IsCallable (predicate) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let k be 0.
- Repeat, while k < len
- Return -1.
The findIndex function is intentionally generic; it does not require that its
22.1.3.10Array.prototype.forEach ( callbackfn [ , thisArg ] )#
callbackfn should be a function that accepts three arguments. forEach calls callbackfn once for each element present in the array, in ascending order. callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a thisArg parameter is provided, it will be used as the
callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.
forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
When the forEach method is called with one or two arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let k be 0.
- Repeat, while k < len
- Let Pk be !
ToString (k). - Let kPresent be ?
HasProperty (O, Pk). - If kPresent is
true , then - Increase k by 1.
- Let Pk be !
- Return
undefined .
The forEach function is intentionally generic; it does not require that its
22.1.3.11Array.prototype.includes ( searchElement [ , fromIndex ] )#
includes compares searchElement to the elements of the array, in ascending order, using the
The optional second argument fromIndex defaults to 0 (i.e. the whole array is searched). If it is greater than or equal to the length of the array,
When the includes method is called, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If len is 0, return
false . - Let n be ?
ToInteger (fromIndex). (If fromIndex isundefined , this step produces the value 0.) - If n ≥ 0, then
- Let k be n.
- Else n < 0,
- Let k be len + n.
- If k < 0, let k be 0.
- Repeat, while k < len
- Let elementK be the result of ?
Get (O, !ToString (k)). - If
SameValueZero (searchElement, elementK) istrue , returntrue . - Increase k by 1.
- Let elementK be the result of ?
- Return
false .
The includes function is intentionally generic; it does not require that its
The includes method intentionally differs from the similar indexOf method in two ways. First, it uses the
22.1.3.12Array.prototype.indexOf ( searchElement [ , fromIndex ] )#
indexOf compares searchElement to the elements of the array, in ascending order, using the
The optional second argument fromIndex defaults to 0 (i.e. the whole array is searched). If it is greater than or equal to the length of the array, -1 is returned, i.e. the array will not be searched. If it is negative, it is used as the offset from the end of the array to compute fromIndex. If the computed index is less than 0, the whole array will be searched.
When the indexOf method is called with one or two arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If len is 0, return -1.
- Let n be ?
ToInteger (fromIndex). (If fromIndex isundefined , this step produces the value 0.) - If n ≥ len, return -1.
- If n ≥ 0, then
- If n is
-0 , let k be+0 ; else let k be n.
- If n is
- Else n < 0,
- Let k be len + n.
- If k < 0, let k be 0.
- Repeat, while k < len
- Let kPresent be ?
HasProperty (O, !ToString (k)). - If kPresent is
true , then- Let elementK be ?
Get (O, !ToString (k)). - Let same be the result of performing
Strict Equality Comparison searchElement === elementK. - If same is
true , return k.
- Let elementK be ?
- Increase k by 1.
- Let kPresent be ?
- Return -1.
The indexOf function is intentionally generic; it does not require that its
22.1.3.13Array.prototype.join (separator)#
The elements of the array are converted to Strings, and these Strings are then concatenated, separated by occurrences of the separator. If no separator is provided, a single comma is used as the separator.
The join method takes one argument, separator, and performs the following steps:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If separator is
undefined , let separator be the single-element String",". - Let sep be ?
ToString (separator). - If len is zero, return the empty String.
- Let element0 be
Get (O,"0"). - If element0 is
undefined ornull , let R be the empty String; otherwise, let R be ?ToString (element0). - Let k be
1. - Repeat, while k < len
- Return R.
The join function is intentionally generic; it does not require that its
22.1.3.14Array.prototype.keys ( )#
The following steps are taken:
- Let O be ?
ToObject (this value). - Return
CreateArrayIterator (O,"key").
22.1.3.15Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )#
lastIndexOf compares searchElement to the elements of the array in descending order using the
The optional second argument fromIndex defaults to the array's length minus one (i.e. the whole array is searched). If it is greater than or equal to the length of the array, the whole array will be searched. If it is negative, it is used as the offset from the end of the array to compute fromIndex. If the computed index is less than 0, -1 is returned.
When the lastIndexOf method is called with one or two arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If len is 0, return -1.
- If argument fromIndex was passed, let n be ?
ToInteger (fromIndex); else let n be len-1. - If n ≥ 0, then
- If n is
-0 , let k be+0 ; else let k bemin (n, len - 1).
- If n is
- Else n < 0,
- Let k be len + n.
- Repeat, while k ≥ 0
- Let kPresent be ?
HasProperty (O, !ToString (k)). - If kPresent is
true , then- Let elementK be ?
Get (O, !ToString (k)). - Let same be the result of performing
Strict Equality Comparison searchElement === elementK. - If same is
true , return k.
- Let elementK be ?
- Decrease k by 1.
- Let kPresent be ?
- Return -1.
The lastIndexOf function is intentionally generic; it does not require that its
22.1.3.16Array.prototype.map ( callbackfn [ , thisArg ] )#
callbackfn should be a function that accepts three arguments. map calls callbackfn once for each element in the array, in ascending order, and constructs a new Array from the results. callbackfn is called only for elements of the array which actually exist; it is not called for missing elements of the array.
If a thisArg parameter is provided, it will be used as the
callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.
map does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by map is set before the first call to callbackfn. Elements which are appended to the array after the call to map begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time map visits them; elements that are deleted after the call to map begins and before being visited are not visited.
When the map method is called with one or two arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let A be ?
ArraySpeciesCreate (O, len). - Let k be 0.
- Repeat, while k < len
- Let Pk be !
ToString (k). - Let kPresent be ?
HasProperty (O, Pk). - If kPresent is
true , then- Let kValue be ?
Get (O, Pk). - Let mappedValue be ?
Call (callbackfn, T, « kValue, k, O »). - Perform ?
CreateDataPropertyOrThrow (A, Pk, mappedValue).
- Let kValue be ?
- Increase k by 1.
- Let Pk be !
- Return A.
The map function is intentionally generic; it does not require that its
22.1.3.17Array.prototype.pop ( )#
The last element of the array is removed from the array and returned.
When the pop method is called, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If len is zero, then
- Perform ?
Set (O,"length", 0,true ). - Return
undefined .
- Perform ?
- Else len > 0,
- Let newLen be len-1.
- Let indx be !
ToString (newLen). - Let element be ?
Get (O, indx). - Perform ?
DeletePropertyOrThrow (O, indx). - Perform ?
Set (O,"length", newLen,true ). - Return element.
The pop function is intentionally generic; it does not require that its
22.1.3.18Array.prototype.push ( ...items )#
The arguments are appended to the end of the array, in the order in which they appear. The new length of the array is returned as the result of the call.
When the push method is called with zero or more arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - Let items be a
List whose elements are, in left to right order, the arguments that were passed to this function invocation. - Let argCount be the number of elements in items.
- If len + argCount > 253-1, throw a
TypeError exception. - Repeat, while items is not empty
- Perform ?
Set (O,"length", len,true ). - Return len.
The length property of the push method is 1.
The push function is intentionally generic; it does not require that its
22.1.3.19Array.prototype.reduce ( callbackfn [ , initialValue ] )#
callbackfn should be a function that takes four arguments. reduce calls the callback, as a function, once for each element present in the array, in ascending order.
callbackfn is called with four arguments: the previousValue (value from the previous call to callbackfn), the currentValue (value of the current element), the currentIndex, and the object being traversed. The first time that callback is called, the previousValue and currentValue can be one of two values. If an initialValue was provided in the call to reduce, then previousValue will be equal to initialValue and currentValue will be equal to the first value in the array. If no initialValue was provided, then previousValue will be equal to the first value in the array and currentValue will be equal to the second. It is a
reduce does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by reduce is set before the first call to callbackfn. Elements that are appended to the array after the call to reduce begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time reduce visits them; elements that are deleted after the call to reduce begins and before being visited are not visited.
When the reduce method is called with one or two arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If len is 0 and initialValue is not present, throw a
TypeError exception. - Let k be 0.
- If initialValue is present, then
- Set accumulator to initialValue.
- Else initialValue is not present,
- Let kPresent be
false . - Repeat, while kPresent is
false and k < len- Let Pk be !
ToString (k). - Let kPresent be ?
HasProperty (O, Pk). - If kPresent is
true , then- Let accumulator be ?
Get (O, Pk).
- Let accumulator be ?
- Increase k by 1.
- Let Pk be !
- If kPresent is
false , throw aTypeError exception.
- Let kPresent be
- Repeat, while k < len
- Let Pk be !
ToString (k). - Let kPresent be ?
HasProperty (O, Pk). - If kPresent is
true , then - Increase k by 1.
- Let Pk be !
- Return accumulator.
The reduce function is intentionally generic; it does not require that its
22.1.3.20Array.prototype.reduceRight ( callbackfn [ , initialValue ] )#
callbackfn should be a function that takes four arguments. reduceRight calls the callback, as a function, once for each element present in the array, in descending order.
callbackfn is called with four arguments: the previousValue (value from the previous call to callbackfn), the currentValue (value of the current element), the currentIndex, and the object being traversed. The first time the function is called, the previousValue and currentValue can be one of two values. If an initialValue was provided in the call to reduceRight, then previousValue will be equal to initialValue and currentValue will be equal to the last value in the array. If no initialValue was provided, then previousValue will be equal to the last value in the array and currentValue will be equal to the second-to-last value. It is a
reduceRight does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by reduceRight is set before the first call to callbackfn. Elements that are appended to the array after the call to reduceRight begins will not be visited by callbackfn. If existing elements of the array are changed by callbackfn, their value as passed to callbackfn will be the value at the time reduceRight visits them; elements that are deleted after the call to reduceRight begins and before being visited are not visited.
When the reduceRight method is called with one or two arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If len is 0 and initialValue is not present, throw a
TypeError exception. - Let k be len-1.
- If initialValue is present, then
- Set accumulator to initialValue.
- Else initialValue is not present,
- Let kPresent be
false . - Repeat, while kPresent is
false and k ≥ 0- Let Pk be !
ToString (k). - Let kPresent be ?
HasProperty (O, Pk). - If kPresent is
true , then- Let accumulator be ?
Get (O, Pk).
- Let accumulator be ?
- Decrease k by 1.
- Let Pk be !
- If kPresent is
false , throw aTypeError exception.
- Let kPresent be
- Repeat, while k ≥ 0
- Let Pk be !
ToString (k). - Let kPresent be ?
HasProperty (O, Pk). - If kPresent is
true , then - Decrease k by 1.
- Let Pk be !
- Return accumulator.
The reduceRight function is intentionally generic; it does not require that its this value be an Array object. Therefore it can be transferred to other kinds of objects for use as a method.
22.1.3.21Array.prototype.reverse ( )#
The elements of the array are rearranged so as to reverse their order. The object is returned as the result of the call.
When the reverse method is called, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - Let middle be
floor (len/2). - Let lower be 0.
- Repeat, while lower ≠ middle
- Let upper be len - lower - 1.
- Let upperP be !
ToString (upper). - Let lowerP be !
ToString (lower). - Let lowerExists be ?
HasProperty (O, lowerP). - If lowerExists is
true , then- Let lowerValue be ?
Get (O, lowerP).
- Let lowerValue be ?
- Let upperExists be ?
HasProperty (O, upperP). - If upperExists is
true , then- Let upperValue be ?
Get (O, upperP).
- Let upperValue be ?
- If lowerExists is
true and upperExists istrue , then - Else if lowerExists is
false and upperExists istrue , then- Perform ?
Set (O, lowerP, upperValue,true ). - Perform ?
DeletePropertyOrThrow (O, upperP).
- Perform ?
- Else if lowerExists is
true and upperExists isfalse , then- Perform ?
DeletePropertyOrThrow (O, lowerP). - Perform ?
Set (O, upperP, lowerValue,true ).
- Perform ?
- Else both lowerExists and upperExists are
false ,- No action is required.
- Increase lower by 1.
- Return O.
The reverse function is intentionally generic; it does not require that its
22.1.3.22Array.prototype.shift ( )#
The first element of the array is removed from the array and returned.
When the shift method is called, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If len is zero, then
- Perform ?
Set (O,"length", 0,true ). - Return
undefined .
- Perform ?
- Let first be ?
Get (O,"0"). - Let k be 1.
- Repeat, while k < len
- Let from be !
ToString (k). - Let to be !
ToString (k-1). - Let fromPresent be ?
HasProperty (O, from). - If fromPresent is
true , then - Else fromPresent is
false ,- Perform ?
DeletePropertyOrThrow (O, to).
- Perform ?
- Increase k by 1.
- Let from be !
- Perform ?
DeletePropertyOrThrow (O, !ToString (len-1)). - Perform ?
Set (O,"length", len-1,true ). - Return first.
The shift function is intentionally generic; it does not require that its
22.1.3.23Array.prototype.slice (start, end)#
The slice method takes two arguments, start and end, and returns an array containing the elements of the array from element start up to, but not including, element end (or through the end of the array if end is
The following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - Let relativeStart be ?
ToInteger (start). - If relativeStart < 0, let k be
max ((len + relativeStart), 0); else let k bemin (relativeStart, len). - If end is
undefined , let relativeEnd be len; else let relativeEnd be ?ToInteger (end). - If relativeEnd < 0, let final be
max ((len + relativeEnd), 0); else let final bemin (relativeEnd, len). - Let count be
max (final - k, 0). - Let A be ?
ArraySpeciesCreate (O, count). - Let n be 0.
- Repeat, while k < final
- Let Pk be !
ToString (k). - Let kPresent be ?
HasProperty (O, Pk). - If kPresent is
true , then- Let kValue be ?
Get (O, Pk). - Perform ?
CreateDataPropertyOrThrow (A, !ToString (n), kValue).
- Let kValue be ?
- Increase k by 1.
- Increase n by 1.
- Let Pk be !
- Perform ?
Set (A,"length", n,true ). - Return A.
The explicit setting of the length property of the result Array in step 11 was necessary in previous editions of ECMAScript to ensure that its length was correct in situations where the trailing elements of the result Array were not present. Setting length became unnecessary starting in ES2015 when the result Array was initialized to its proper length rather than an empty Array but is carried forward to preserve backward compatibility.
The slice function is intentionally generic; it does not require that its
22.1.3.24Array.prototype.some ( callbackfn [ , thisArg ] )#
callbackfn should be a function that accepts three arguments and returns a value that is coercible to the Boolean value some calls callbackfn once for each element present in the array, in ascending order, until it finds one where callbackfn returns some immediately returns some returns
If a thisArg parameter is provided, it will be used as the
callbackfn is called with three arguments: the value of the element, the index of the element, and the object being traversed.
some does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
The range of elements processed by some is set before the first call to callbackfn. Elements that are appended to the array after the call to some begins will not be visited by callbackfn. If existing elements of the array are changed, their value as passed to callbackfn will be the value at the time that some visits them; elements that are deleted after the call to some begins and before being visited are not visited. some acts like the "exists" quantifier in mathematics. In particular, for an empty array, it returns
When the some method is called with one or two arguments, the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let k be 0.
- Repeat, while k < len
- Let Pk be !
ToString (k). - Let kPresent be ?
HasProperty (O, Pk). - If kPresent is
true , then - Increase k by 1.
- Let Pk be !
- Return
false .
The some function is intentionally generic; it does not require that its
22.1.3.25Array.prototype.sort (comparefn)#
The elements of this array are sorted. The sort is not necessarily stable (that is, elements that compare equal do not necessarily remain in their original order). If comparefn is not
Upon entry, the following steps are performed to initialize evaluation of the sort function:
Within this specification of the sort method, an object, obj, is said to be sparse if the following algorithm returns
- For each integer i in the range 0≤i< len
- Let elem be obj.[[GetOwnProperty]](!
ToString (i)). - If elem is
undefined , returntrue .
- Let elem be obj.[[GetOwnProperty]](!
- Return
false .
The sort order is the ordering, after completion of this function, of the integer indexed property values of obj whose integer indexes are less than len. The result of the sort function is then determined as follows:
If comparefn is not
Let proto be obj.[[GetPrototypeOf]](). If proto is not
- obj is sparse
- 0 ≤ j < len
-
HasProperty (proto,ToString (j)) istrue .
The sort order is also implementation defined if obj is sparse and any of the following conditions are true:
-
IsExtensible (obj) isfalse . -
Any integer index property of obj whose name is a nonnegative integer less than len is a data property whose [[Configurable]] attribute is
false .
The sort order is also implementation defined if any of the following conditions are true:
- If obj is an exotic object (including Proxy exotic objects) whose behaviour for [[Get]], [[Set]], [[Delete]], and [[GetOwnProperty]] is not the ordinary object implementation of these internal methods.
-
If any index property of obj whose name is a nonnegative integer less than len is an accessor property or is a data property whose [[Writable]] attribute is
false . -
If comparefn is
undefined and the application ofToString to any value passed as an argument toSortCompare modifies obj or any object on obj's prototype chain. -
If comparefn is
undefined and all applications ofToString , to any specific value passed as an argument toSortCompare , do not produce the same result.
The following steps are taken:
- Perform an implementation-dependent sequence of calls to the [[Get]] and [[Set]] internal methods of obj, to the
DeletePropertyOrThrow andHasOwnProperty abstract operation with obj as the first argument, and toSortCompare (described below), such that:- The property key argument for each call to [[Get]], [[Set]],
HasOwnProperty , orDeletePropertyOrThrow is the string representation of a nonnegative integer less than len. - The arguments for calls to
SortCompare are values returned by a previous call to the [[Get]] internal method, unless the properties accessed by those previous calls did not exist according toHasOwnProperty . If both perspective arguments toSortCompare correspond to non-existent properties, use+0 instead of callingSortCompare . If only the first perspective argument is non-existent use +1. If only the second perspective argument is non-existent use -1. - If obj is not sparse then
DeletePropertyOrThrow must not be called. - If any [[Set]] call returns
false aTypeError exception is thrown. - If an
abrupt completion is returned from any of these operations, it is immediately returned as the value of this function.
- The property key argument for each call to [[Get]], [[Set]],
- Return obj.
Unless the sort order is specified above to be implementation-defined, the returned object must have the following two characteristics:
-
There must be some mathematical permutation π of the nonnegative integers less than len, such that for every nonnegative integer j less than len, if property
old[j] existed, thennew[π(j)] is exactly the same value asold[j] . But if propertyold[j] did not exist, thennew[π(j)] does not exist. -
Then for all nonnegative integers j and k, each less than len, if
(seeSortCompare (old[j], old[k]) < 0SortCompare below), thennew[π(j)] < new[π(k)] .
Here the notation
A function comparefn is a consistent comparison function for a set of values S if all of the requirements below are met for all values a, b, and c (possibly the same value) in the set S: The notation
-
Calling comparefn(a, b) always returns the same value v when given a specific pair of values a and b as its two arguments. Furthermore,
Type (v) is Number, and v is notNaN . Note that this implies that exactly one of a <CF b, a =CF b, and a >CF b will be true for a given pair of a and b. - Calling comparefn(a, b) does not modify obj or any object on obj's prototype chain.
- a =CF a (reflexivity)
- If a =CF b, then b =CF a (symmetry)
- If a =CF b and b =CF c, then a =CF c (transitivity of =CF)
- If a <CF b and b <CF c, then a <CF c (transitivity of <CF)
- If a >CF b and b >CF c, then a >CF c (transitivity of >CF)
The above conditions are necessary and sufficient to ensure that comparefn divides the set S into equivalence classes and that these equivalence classes are totally ordered.
The sort function is intentionally generic; it does not require that its
22.1.3.25.1Runtime Semantics: SortCompare( x, y )#
The SortCompare abstract operation is called with two arguments x and y. It also has access to the comparefn argument passed to the current invocation of the sort method. The following steps are taken:
- If x and y are both
undefined , return+0 . - If x is
undefined , return 1. - If y is
undefined , return -1. - If the argument comparefn is not
undefined , then - Let xString be ?
ToString (x). - Let yString be ?
ToString (y). - Let xSmaller be the result of performing
Abstract Relational Comparison xString < yString. - If xSmaller is
true , return -1. - Let ySmaller be the result of performing
Abstract Relational Comparison yString < xString. - If ySmaller is
true , return 1. - Return
+0 .
Because non-existent property values always compare greater than
Method calls performed by the
22.1.3.26Array.prototype.splice (start, deleteCount, ...items )#
When the splice method is called with two or more arguments start, deleteCount and zero or more items, the deleteCount elements of the array starting at integer index start are replaced by the arguments items. An Array object containing the deleted elements (if any) is returned.
The following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - Let relativeStart be ?
ToInteger (start). - If relativeStart < 0, let actualStart be
max ((len + relativeStart), 0); else let actualStart bemin (relativeStart, len). - If the number of actual arguments is 0, then
- Let insertCount be 0.
- Let actualDeleteCount be 0.
- Else if the number of actual arguments is 1, then
- Let insertCount be 0.
- Let actualDeleteCount be len - actualStart.
- Else,
- If len+insertCount-actualDeleteCount > 253-1, throw a
TypeError exception. - Let A be ?
ArraySpeciesCreate (O, actualDeleteCount). - Let k be 0.
- Repeat, while k < actualDeleteCount
- Let from be !
ToString (actualStart+k). - Let fromPresent be ?
HasProperty (O, from). - If fromPresent is
true , then- Let fromValue be ?
Get (O, from). - Perform ?
CreateDataPropertyOrThrow (A, !ToString (k), fromValue).
- Let fromValue be ?
- Increment k by 1.
- Let from be !
- Perform ?
Set (A,"length", actualDeleteCount,true ). - Let items be a
List whose elements are, in left to right order, the portion of the actual argument list starting with the third argument. The list is empty if fewer than three arguments were passed. - Let itemCount be the number of elements in items.
- If itemCount < actualDeleteCount, then
- Let k be actualStart.
- Repeat, while k < (len - actualDeleteCount)
- Let from be !
ToString (k+actualDeleteCount). - Let to be !
ToString (k+itemCount). - Let fromPresent be ?
HasProperty (O, from). - If fromPresent is
true , then - Else fromPresent is
false ,- Perform ?
DeletePropertyOrThrow (O, to).
- Perform ?
- Increase k by 1.
- Let from be !
- Let k be len.
- Repeat, while k > (len - actualDeleteCount + itemCount)
- Perform ?
DeletePropertyOrThrow (O, !ToString (k-1)). - Decrease k by 1.
- Perform ?
- Else if itemCount > actualDeleteCount, then
- Let k be (len - actualDeleteCount).
- Repeat, while k > actualStart
- Let from be !
ToString (k + actualDeleteCount - 1). - Let to be !
ToString (k + itemCount - 1). - Let fromPresent be ?
HasProperty (O, from). - If fromPresent is
true , then - Else fromPresent is
false ,- Perform ?
DeletePropertyOrThrow (O, to).
- Perform ?
- Decrease k by 1.
- Let from be !
- Let k be actualStart.
- Repeat, while items is not empty
- Perform ?
Set (O,"length", len - actualDeleteCount + itemCount,true ). - Return A.
The explicit setting of the length property of the result Array in step 19 was necessary in previous editions of ECMAScript to ensure that its length was correct in situations where the trailing elements of the result Array were not present. Setting length became unnecessary starting in ES2015 when the result Array was initialized to its proper length rather than an empty Array but is carried forward to preserve backward compatibility.
The splice function is intentionally generic; it does not require that its
22.1.3.27Array.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )#
An ECMAScript implementation that includes the ECMA-402 Internationalization API must implement the Array.prototype.toLocaleString method as specified in the ECMA-402 specification. If an ECMAScript implementation does not include the ECMA-402 API the following specification of the toLocaleString method is used.
The first edition of ECMA-402 did not include a replacement specification for the Array.prototype.toLocaleString method.
The meanings of the optional parameters to this method are defined in the ECMA-402 specification; implementations that do not include ECMA-402 support must not use those parameter positions for anything else.
The following steps are taken:
- Let array be ?
ToObject (this value). - Let len be ?
ToLength (?Get (array,"length")). - Let separator be the String value for the list-separator String appropriate for the host environment's current locale (this is derived in an implementation-defined way).
- If len is zero, return the empty String.
- Let firstElement be ?
Get (array,"0"). - If firstElement is
undefined ornull , then- Let R be the empty String.
- Else,
- Let k be
1. - Repeat, while k < len
- Return R.
The elements of the array are converted to Strings using their toLocaleString methods, and these Strings are then concatenated, separated by occurrences of a separator String that has been derived in an implementation-defined locale-specific way. The result of calling this function is intended to be analogous to the result of toString, except that the result of this function is intended to be locale-specific.
The toLocaleString function is intentionally generic; it does not require that its
22.1.3.28Array.prototype.toString ( )#
When the toString method is called, the following steps are taken:
- Let array be ?
ToObject (this value). - Let func be ?
Get (array,"join"). - If
IsCallable (func) isfalse , let func be the intrinsic function%ObjProto_toString% . - Return ?
Call (func, array).
The toString function is intentionally generic; it does not require that its
22.1.3.29Array.prototype.unshift ( ...items )#
The arguments are prepended to the start of the array, such that their order within the array is the same as the order in which they appear in the argument list.
When the unshift method is called with zero or more arguments item1, item2, etc., the following steps are taken:
- Let O be ?
ToObject (this value). - Let len be ?
ToLength (?Get (O,"length")). - Let argCount be the number of actual arguments.
- If argCount > 0, then
- If len+argCount > 253-1, throw a
TypeError exception. - Let k be len.
- Repeat, while k > 0,
- Let from be !
ToString (k-1). - Let to be !
ToString (k+argCount-1). - Let fromPresent be ?
HasProperty (O, from). - If fromPresent is
true , then - Else fromPresent is
false ,- Perform ?
DeletePropertyOrThrow (O, to).
- Perform ?
- Decrease k by 1.
- Let from be !
- Let j be 0.
- Let items be a
List whose elements are, in left to right order, the arguments that were passed to this function invocation. - Repeat, while items is not empty
- If len+argCount > 253-1, throw a
- Perform ?
Set (O,"length", len+argCount,true ). - Return len+argCount.
The length property of the unshift method is 1.
The unshift function is intentionally generic; it does not require that its
22.1.3.30Array.prototype.values ( )#
The following steps are taken:
- Let O be ?
ToObject (this value). - Return
CreateArrayIterator (O,"value").
This function is the %ArrayProto_values% intrinsic object.
22.1.3.31Array.prototype [ @@iterator ] ( )#
The initial value of the @@iterator property is the same function object as the initial value of the Array.prototype.values property.
22.1.3.32Array.prototype [ @@unscopables ]#
The initial value of the @@unscopables data property is an object created by the following steps:
- Let blackList be
ObjectCreate (null ). - Perform
CreateDataProperty (blackList,"copyWithin",true ). - Perform
CreateDataProperty (blackList,"entries",true ). - Perform
CreateDataProperty (blackList,"fill",true ). - Perform
CreateDataProperty (blackList,"find",true ). - Perform
CreateDataProperty (blackList,"findIndex",true ). - Perform
CreateDataProperty (blackList,"includes",true ). - Perform
CreateDataProperty (blackList,"keys",true ). - Perform
CreateDataProperty (blackList,"values",true ). - Assert: Each of the above calls will return
true . - Return blackList.
This property has the attributes { [[Writable]]:
The own property names of this object are property names that were not included as standard properties of Array.prototype prior to the ECMAScript 2015 specification. These names are ignored for with statement binding purposes in order to preserve the behaviour of existing code that might use one of these names as a binding in an outer scope that is shadowed by a with statement whose binding object is an Array object.
22.1.4Properties of Array Instances#
Array instances are Array exotic objects and have the internal methods specified for such objects. Array instances inherit properties from the Array prototype object.
Array instances have a length property, and a set of enumerable properties with array index names.
22.1.4.1length#
The length property of an Array instance is a data property whose value is always numerically greater than the name of every configurable own property whose name is an array index.
The length property initially has the attributes { [[Writable]]:
Reducing the value of the length property has the side-effect of deleting own array elements whose array index is between the old and new length values. However, non-configurable properties can not be deleted. Attempting to set the length property of an Array object to a value that is numerically less than or equal to the largest numeric own property name of an existing non-configurable array indexed property of the array will result in the length being set to a numeric value that is one greater than that non-configurable numeric own property name. See
22.1.5Array Iterator Objects#
An Array Iterator is an object, that represents a specific iteration over some specific Array instance object. There is not a named constructor for Array Iterator objects. Instead, Array iterator objects are created by calling certain methods of Array instance objects.
22.1.5.1CreateArrayIterator Abstract Operation#
Several methods of Array objects return Iterator objects. The abstract operation CreateArrayIterator with arguments array and kind is used to create such iterator objects. It performs the following steps:
- Assert:
Type (array) is Object. - Let iterator be
ObjectCreate (%ArrayIteratorPrototype% , « [[IteratedObject]], [[ArrayIteratorNextIndex]], [[ArrayIterationKind]] »). - Set iterator's [[IteratedObject]] internal slot to array.
- Set iterator's [[ArrayIteratorNextIndex]] internal slot to 0.
- Set iterator's [[ArrayIterationKind]] internal slot to kind.
- Return iterator.
22.1.5.2The %ArrayIteratorPrototype% Object#
All Array Iterator Objects inherit properties from the %ArrayIteratorPrototype% intrinsic object. The %ArrayIteratorPrototype% object is an ordinary object and its [[Prototype]] internal slot is the
22.1.5.2.1%ArrayIteratorPrototype%.next( )#
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have all of the internal slots of an Array Iterator Instance (
22.1.5.3 ), throw aTypeError exception. - Let a be the value of the [[IteratedObject]] internal slot of O.
- If a is
undefined , returnCreateIterResultObject (undefined ,true ). - Let index be the value of the [[ArrayIteratorNextIndex]] internal slot of O.
- Let itemKind be the value of the [[ArrayIterationKind]] internal slot of O.
- If a has a [[TypedArrayName]] internal slot, then
- Let len be the value of a's [[ArrayLength]] internal slot.
- Else,
- If index ≥ len, then
- Set the value of the [[IteratedObject]] internal slot of O to
undefined . - Return
CreateIterResultObject (undefined ,true ).
- Set the value of the [[IteratedObject]] internal slot of O to
- Set the value of the [[ArrayIteratorNextIndex]] internal slot of O to index+1.
- If itemKind is
"key", returnCreateIterResultObject (index,false ). - Let elementKey be !
ToString (index). - Let elementValue be ?
Get (a, elementKey). - If itemKind is
"value", let result be elementValue. - Else,
- Assert: itemKind is
"key+value". - Let result be
CreateArrayFromList (« index, elementValue »).
- Assert: itemKind is
- Return
CreateIterResultObject (result,false ).
22.1.5.2.2%ArrayIteratorPrototype% [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "Array Iterator".
This property has the attributes { [[Writable]]:
22.1.5.3Properties of Array Iterator Instances#
Array Iterator instances are ordinary objects that inherit properties from the
| Internal Slot | Description |
|---|---|
| [[IteratedObject]] | The object whose array elements are being iterated. |
| [[ArrayIteratorNextIndex]] | The integer index of the next integer index to be examined by this iteration. |
| [[ArrayIterationKind]] |
A String value that identifies what is returned for each element of the iteration. The possible values are: "key", "value", "key+value".
|
22.2TypedArray Objects#
TypedArray objects present an array-like view of an underlying binary data buffer (
| Constructor Name and Intrinsic | Element Type | Element Size | Conversion Operation | Description | Equivalent C Type |
|---|---|---|---|---|---|
|
Int8Array
%Int8Array% |
Int8 | 1 |
|
8-bit 2's complement signed integer | signed char |
|
Uint8Array
%Uint8Array% |
Uint8 | 1 |
|
8-bit unsigned integer | unsigned char |
|
Uint8ClampedArray
%Uint8ClampedArray% |
Uint8C | 1 |
|
8-bit unsigned integer (clamped conversion) | unsigned char |
|
Int16Array
%Int16Array% |
Int16 | 2 |
|
16-bit 2's complement signed integer | short |
|
Uint16Array
%Uint16Array% |
Uint16 | 2 |
|
16-bit unsigned integer | unsigned short |
|
Int32Array
%Int32Array% |
Int32 | 4 |
|
32-bit 2's complement signed integer | int |
|
Uint32Array
%Uint32Array% |
Uint32 | 4 |
|
32-bit unsigned integer | unsigned int |
|
Float32Array
%Float32Array% |
Float32 | 4 | 32-bit IEEE floating point | float | |
|
Float64Array
%Float64Array% |
Float64 | 8 | 64-bit IEEE floating point | double |
In the definitions below, references to TypedArray should be replaced with the appropriate constructor name from the above table. The phrase “the element size in bytes” refers to the value in the Element Size column of the table in the row corresponding to the constructor. The phrase “element Type” refers to the value in the Element Type column for that row.
22.2.1The %TypedArray% Intrinsic Object#
The %TypedArray% intrinsic object is a constructor function object that all of the TypedArray constructor object inherit from. %TypedArray% and its corresponding prototype object provide common properties that are inherited by all TypedArray constructors and their instances. The %TypedArray% intrinsic does not have a global name or appear as a property of the
The %TypedArray% intrinsic function object acts as the abstract superclass of the various TypedArray constructors. Because it is an abstract class constructor it will throw an error when invoked. The TypeArray constructors do not perform a super call to it.
22.2.1.1%TypedArray%()#
The
- Throw a
TypeError exception.
The length property of the
22.2.2Properties of the %TypedArray% Intrinsic Object#
The value of the [[Prototype]] internal slot of
The name property of the "TypedArray".
The
22.2.2.1%TypedArray%.from ( source [ , mapfn [ , thisArg ] ] )#
When the from method is called with argument source, and optional arguments mapfn and thisArg, the following steps are taken:
- Let C be the
this value. - If
IsConstructor (C) isfalse , throw aTypeError exception. - If mapfn was supplied and mapfn is not
undefined , then- If
IsCallable (mapfn) isfalse , throw aTypeError exception. - Let mapping be
true .
- If
- Else, let mapping be
false . - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let arrayLike be ?
IterableToArrayLike (source). - Let len be ?
ToLength (?Get (arrayLike,"length")). - Let targetObj be ?
TypedArrayCreate (C, « len »). - Let k be 0.
- Repeat, while k < len
- Return targetObj.
22.2.2.1.1Runtime Semantics: IterableToArrayLike( items )#
The abstract operation IterableToArrayLike performs the following steps:
- Let usingIterator be ?
GetMethod (items, @@iterator). - If usingIterator is not
undefined , then- Let iterator be ?
GetIterator (items, usingIterator). - Let values be a new empty
List . - Let next be
true . - Repeat, while next is not
false - Let next be ?
IteratorStep (iterator). - If next is not
false , then- Let nextValue be ?
IteratorValue (next). - Append nextValue to the end of the
List values.
- Let nextValue be ?
- Let next be ?
- Return
CreateArrayFromList (values).
- Let iterator be ?
- NOTE: items is not an Iterable so assume it is already an array-like object.
- Return !
ToObject (items).
22.2.2.2%TypedArray%.of ( ...items )#
When the of method is called with any number of arguments, the following steps are taken:
- Let len be the actual number of arguments passed to this function.
- Let items be the
List of arguments passed to this function. - Let C be the
this value. - If
IsConstructor (C) isfalse , throw aTypeError exception. - Let newObj be ?
TypedArrayCreate (C, « len »). - Let k be 0.
- Repeat, while k < len
- Return newObj.
The items argument is assumed to be a well-formed rest argument value.
22.2.2.3%TypedArray%.prototype#
The initial value of
This property has the attributes { [[Writable]]:
22.2.2.4get %TypedArray% [ @@species ]#
- Return the
this value.
The value of the name property of this function is "get [Symbol.species]".
this object's constructor to create a derived object. However, a subclass constructor may over-ride that default behaviour by redefining its @@species property.
22.2.3Properties of the %TypedArrayPrototype% Object#
The value of the [[Prototype]] internal slot of the %TypedArrayPrototype% object is the intrinsic object
22.2.3.1get %TypedArray%.prototype.buffer#
prototype.buffer is an accessor property whose set accessor function is
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have a [[ViewedArrayBuffer]] internal slot, throw a
TypeError exception. - Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- Return buffer.
22.2.3.2get %TypedArray%.prototype.byteLength#
prototype.byteLength is an accessor property whose set accessor function is
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have a [[ViewedArrayBuffer]] internal slot, throw a
TypeError exception. - Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , return 0. - Let size be the value of O's [[ByteLength]] internal slot.
- Return size.
22.2.3.3get %TypedArray%.prototype.byteOffset#
prototype.byteOffset is an accessor property whose set accessor function is
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have a [[ViewedArrayBuffer]] internal slot, throw a
TypeError exception. - Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , return 0. - Let offset be the value of O's [[ByteOffset]] internal slot.
- Return offset.
22.2.3.4%TypedArray%.prototype.constructor#
The initial value of
22.2.3.5%TypedArray%.prototype.copyWithin (target, start [ , end ] )#
.prototype.copyWithin is a distinct function that implements the same algorithm as Array.prototype.copyWithin as defined in "length" and the actual copying of values in step 12 must be performed in a manner that preserves the bit-level encoding of the source data
The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.5.1Runtime Semantics: ValidateTypedArray ( O )#
When called with argument O, the following steps are taken:
- If
Type (O) is not Object, throw aTypeError exception. - If O does not have a [[TypedArrayName]] internal slot, throw a
TypeError exception. - If O does not have a [[ViewedArrayBuffer]] internal slot, throw a
TypeError exception. - Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - Return buffer.
22.2.3.6%TypedArray%.prototype.entries ( )#
The following steps are taken:
- Let O be the
this value. - Perform ?
ValidateTypedArray (O). - Return
CreateArrayIterator (O,"key+value").
22.2.3.7%TypedArray%.prototype.every ( callbackfn [ , thisArg ] )#
.prototype.every is a distinct function that implements the same algorithm as Array.prototype.every as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.8%TypedArray%.prototype.fill (value [ , start [ , end ] ] )#
.prototype.fill is a distinct function that implements the same algorithm as Array.prototype.fill as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.9%TypedArray%.prototype.filter ( callbackfn [ , thisArg ] )#
The interpretation and use of the arguments of .prototype.filter are the same as for Array.prototype.filter as defined in
When the filter method is called with one or two arguments, the following steps are taken:
- Let O be the
this value. - Perform ?
ValidateTypedArray (O). - Let len be the value of O's [[ArrayLength]] internal slot.
- If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let kept be a new empty
List . - Let k be 0.
- Let captured be 0.
- Repeat, while k < len
- Let A be ?
TypedArraySpeciesCreate (O, « captured »). - Let n be 0.
- For each element e of kept
- Return A.
This function is not generic. The
22.2.3.10%TypedArray%.prototype.find (predicate [ , thisArg ] )#
.prototype.find is a distinct function that implements the same algorithm as Array.prototype.find as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.11%TypedArray%.prototype.findIndex ( predicate [ , thisArg ] )#
.prototype.findIndex is a distinct function that implements the same algorithm as Array.prototype.findIndex as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.12%TypedArray%.prototype.forEach ( callbackfn [ , thisArg ] )#
.prototype.forEach is a distinct function that implements the same algorithm as Array.prototype.forEach as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.13%TypedArray%.prototype.indexOf (searchElement [ , fromIndex ] )#
.prototype.indexOf is a distinct function that implements the same algorithm as Array.prototype.indexOf as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.14%TypedArray%.prototype.includes ( searchElement [ , fromIndex ] )#
%TypedArray%.prototype.includes is a distinct function that implements the same algorithm as Array.prototype.includes as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.15%TypedArray%.prototype.join ( separator )#
.prototype.join is a distinct function that implements the same algorithm as Array.prototype.join as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.16%TypedArray%.prototype.keys ( )#
The following steps are taken:
- Let O be the
this value. - Perform ?
ValidateTypedArray (O). - Return
CreateArrayIterator (O,"key").
22.2.3.17%TypedArray%.prototype.lastIndexOf ( searchElement [ , fromIndex ] )#
.prototype.lastIndexOf is a distinct function that implements the same algorithm as Array.prototype.lastIndexOf as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.18get %TypedArray%.prototype.length#
prototype.length is an accessor property whose set accessor function is
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have a [[TypedArrayName]] internal slot, throw a
TypeError exception. - Assert: O has [[ViewedArrayBuffer]] and [[ArrayLength]] internal slots.
- Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , return 0. - Let length be the value of O's [[ArrayLength]] internal slot.
- Return length.
This function is not generic. The
22.2.3.19%TypedArray%.prototype.map ( callbackfn [ , thisArg ] )#
The interpretation and use of the arguments of .prototype.map are the same as for Array.prototype.map as defined in
When the map method is called with one or two arguments, the following steps are taken:
- Let O be the
this value. - Perform ?
ValidateTypedArray (O). - Let len be the value of O's [[ArrayLength]] internal slot.
- If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let A be ?
TypedArraySpeciesCreate (O, « len »). - Let k be 0.
- Repeat, while k < len
- Return A.
This function is not generic. The
22.2.3.20%TypedArray%.prototype.reduce ( callbackfn [ , initialValue ] )#
.prototype.reduce is a distinct function that implements the same algorithm as Array.prototype.reduce as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.21%TypedArray%.prototype.reduceRight ( callbackfn [ , initialValue ] )#
.prototype.reduceRight is a distinct function that implements the same algorithm as Array.prototype.reduceRight as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.22%TypedArray%.prototype.reverse ( )#
.prototype.reverse is a distinct function that implements the same algorithm as Array.prototype.reverse as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.23%TypedArray%.prototype.set ( overloaded [ , offset ])#
.prototype.set is a single function whose behaviour is overloaded based upon the type of its first argument.
This function is not generic. The
22.2.3.23.1%TypedArray%.prototype.set (array [ , offset ] )#
Sets multiple values in this TypedArray, reading the values from the object array. The optional offset value indicates the first element index in this TypedArray where values are written. If omitted, it is assumed to be 0.
- Assert: array is any
ECMAScript language value other than an Object with a [[TypedArrayName]] internal slot. If it is such an Object, the definition in22.2.3.23.2 applies. - Let target be the
this value. - If
Type (target) is not Object, throw aTypeError exception. - If target does not have a [[TypedArrayName]] internal slot, throw a
TypeError exception. - Assert: target has a [[ViewedArrayBuffer]] internal slot.
- Let targetOffset be ?
ToInteger (offset). - If targetOffset < 0, throw a
RangeError exception. - Let targetBuffer be the value of target's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (targetBuffer) istrue , throw aTypeError exception. - Let targetLength be the value of target's [[ArrayLength]] internal slot.
- Let targetName be the String value of target's [[TypedArrayName]] internal slot.
- Let targetElementSize be the Number value of the Element Size value specified in
Table 50 for targetName. - Let targetType be the String value of the Element Type value in
Table 50 for targetName. - Let targetByteOffset be the value of target's [[ByteOffset]] internal slot.
- Let src be ?
ToObject (array). - Let srcLength be ?
ToLength (?Get (src,"length")). - If srcLength + targetOffset > targetLength, throw a
RangeError exception. - Let targetByteIndex be targetOffset × targetElementSize + targetByteOffset.
- Let k be 0.
- Let limit be targetByteIndex + targetElementSize × srcLength.
- Repeat, while targetByteIndex < limit
- Let Pk be !
ToString (k). - Let kNumber be ?
ToNumber (?Get (src, Pk)). - If
IsDetachedBuffer (targetBuffer) istrue , throw aTypeError exception. - Perform
SetValueInBuffer (targetBuffer, targetByteIndex, targetType, kNumber). - Set k to k + 1.
- Set targetByteIndex to targetByteIndex + targetElementSize.
- Let Pk be !
- Return
undefined .
22.2.3.23.2%TypedArray%.prototype.set(typedArray [ , offset ] )#
Sets multiple values in this TypedArray, reading the values from the typedArray argument object. The optional offset value indicates the first element index in this TypedArray where values are written. If omitted, it is assumed to be 0.
- Assert: typedArray has a [[TypedArrayName]] internal slot. If it does not, the definition in
22.2.3.23.1 applies. - Let target be the
this value. - If
Type (target) is not Object, throw aTypeError exception. - If target does not have a [[TypedArrayName]] internal slot, throw a
TypeError exception. - Assert: target has a [[ViewedArrayBuffer]] internal slot.
- Let targetOffset be ?
ToInteger (offset). - If targetOffset < 0, throw a
RangeError exception. - Let targetBuffer be the value of target's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (targetBuffer) istrue , throw aTypeError exception. - Let targetLength be the value of target's [[ArrayLength]] internal slot.
- Let srcBuffer be the value of typedArray's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (srcBuffer) istrue , throw aTypeError exception. - Let targetName be the String value of target's [[TypedArrayName]] internal slot.
- Let targetType be the String value of the Element Type value in
Table 50 for targetName. - Let targetElementSize be the Number value of the Element Size value specified in
Table 50 for targetName. - Let targetByteOffset be the value of target's [[ByteOffset]] internal slot.
- Let srcName be the String value of typedArray's [[TypedArrayName]] internal slot.
- Let srcType be the String value of the Element Type value in
Table 50 for srcName. - Let srcElementSize be the Number value of the Element Size value specified in
Table 50 for srcName. - Let srcLength be the value of typedArray's [[ArrayLength]] internal slot.
- Let srcByteOffset be the value of typedArray's [[ByteOffset]] internal slot.
- If srcLength + targetOffset > targetLength, throw a
RangeError exception. - If
SameValue (srcBuffer, targetBuffer) istrue , then- Let srcBuffer be ?
CloneArrayBuffer (targetBuffer, srcByteOffset,%ArrayBuffer% ). - NOTE:
%ArrayBuffer% is used to clone targetBuffer because is it known to not have any observable side-effects. - Let srcByteIndex be 0.
- Let srcBuffer be ?
- Else, let srcByteIndex be srcByteOffset.
- Let targetByteIndex be targetOffset × targetElementSize + targetByteOffset.
- Let limit be targetByteIndex + targetElementSize × srcLength.
- If
SameValue (srcType, targetType) isfalse , then- Repeat, while targetByteIndex < limit
- Let value be
GetValueFromBuffer (srcBuffer, srcByteIndex, srcType). - Perform
SetValueInBuffer (targetBuffer, targetByteIndex, targetType, value). - Set srcByteIndex to srcByteIndex + srcElementSize.
- Set targetByteIndex to targetByteIndex + targetElementSize.
- Let value be
- Repeat, while targetByteIndex < limit
- Else,
- NOTE: If srcType and targetType are the same, the transfer must be performed in a manner that preserves the bit-level encoding of the source data.
- Repeat, while targetByteIndex < limit
- Let value be
GetValueFromBuffer (srcBuffer, srcByteIndex,"Uint8"). - Perform
SetValueInBuffer (targetBuffer, targetByteIndex,"Uint8", value). - Set srcByteIndex to srcByteIndex + 1.
- Set targetByteIndex to targetByteIndex + 1.
- Let value be
- Return
undefined .
22.2.3.24%TypedArray%.prototype.slice ( start, end )#
The interpretation and use of the arguments of .prototype.slice are the same as for Array.prototype.slice as defined in
- Let O be the
this value. - Perform ?
ValidateTypedArray (O). - Let len be the value of O's [[ArrayLength]] internal slot.
- Let relativeStart be ?
ToInteger (start). - If relativeStart < 0, let k be
max ((len + relativeStart), 0); else let k bemin (relativeStart, len). - If end is
undefined , let relativeEnd be len; else let relativeEnd be ?ToInteger (end). - If relativeEnd < 0, let final be
max ((len + relativeEnd), 0); else let final bemin (relativeEnd, len). - Let count be
max (final - k, 0). - Let A be ?
TypedArraySpeciesCreate (O, « count »). - Let srcName be the String value of O's [[TypedArrayName]] internal slot.
- Let srcType be the String value of the Element Type value in
Table 50 for srcName. - Let targetName be the String value of A's [[TypedArrayName]] internal slot.
- Let targetType be the String value of the Element Type value in
Table 50 for targetName. - If
SameValue (srcType, targetType) isfalse , then - Else if count > 0, then
- Let srcBuffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (srcBuffer) istrue , throw aTypeError exception. - Let targetBuffer be the value of A's [[ViewedArrayBuffer]] internal slot.
- Let elementSize be the Number value of the Element Size value specified in
Table 50 for srcType. - NOTE: If srcType and targetType are the same, the transfer must be performed in a manner that preserves the bit-level encoding of the source data.
- Let srcByteOffet be the value of O's [[ByteOffset]] internal slot.
- Let targetByteIndex be A's [[ByteOffset]] internal slot.
- Let srcByteIndex be (k × elementSize) + srcByteOffet.
- Let limit be targetByteIndex + count × elementSize.
- Repeat, while targetByteIndex < limit
- Let value be
GetValueFromBuffer (srcBuffer, srcByteIndex,"Uint8"). - Perform
SetValueInBuffer (targetBuffer, targetByteIndex,"Uint8", value). - Increase srcByteIndex by 1.
- Increase targetByteIndex by 1.
- Let value be
- Return A.
This function is not generic. The
22.2.3.25%TypedArray%.prototype.some ( callbackfn [ , thisArg ] )#
.prototype.some is a distinct function that implements the same algorithm as Array.prototype.some as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
22.2.3.26%TypedArray%.prototype.sort ( comparefn )#
.prototype.sort is a distinct function that, except as described below, implements the same requirements as those of Array.prototype.sort as defined in .prototype.sort specification may be optimized with the knowledge that the
This function is not generic. The
Upon entry, the following steps are performed to initialize evaluation of the sort function. These steps are used instead of the entry steps in
- Let obj be the
this value. - Let buffer be ?
ValidateTypedArray (obj). - Let len be the value of obj's [[ArrayLength]] internal slot.
The implementation defined sort order condition for exotic objects is not applied by .prototype.sort.
The following version of .prototype.sort. It performs a numeric comparison rather than the string comparison used in sort method.
When the TypedArray
- Assert: Both
Type (x) andType (y) is Number. - If the argument comparefn is not
undefined , then- Let v be ?
Call (comparefn,undefined , « x, y »). - If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - If v is
NaN , return+0 . - Return v.
- Let v be ?
- If x and y are both
NaN , return+0 . - If x is
NaN , return 1. - If y is
NaN , return -1. - If x < y, return -1.
- If x > y, return 1.
- If x is
-0 and y is+0 , return -1. - If x is
+0 and y is-0 , return 1. - Return
+0 .
Because
22.2.3.27%TypedArray%.prototype.subarray( begin, end )#
Returns a new TypedArray object whose element type is the same as this TypedArray and whose ArrayBuffer is the same as the ArrayBuffer of this TypedArray, referencing the elements at begin, inclusive, up to end, exclusive. If either begin or end is negative, it refers to an index from the end of the array, as opposed to from the beginning.
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have a [[TypedArrayName]] internal slot, throw a
TypeError exception. - Assert: O has a [[ViewedArrayBuffer]] internal slot.
- Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- Let srcLength be the value of O's [[ArrayLength]] internal slot.
- Let relativeBegin be ?
ToInteger (begin). - If relativeBegin < 0, let beginIndex be
max ((srcLength + relativeBegin), 0); else let beginIndex bemin (relativeBegin, srcLength). - If end is
undefined , let relativeEnd be srcLength; else, let relativeEnd be ?ToInteger (end). - If relativeEnd < 0, let endIndex be
max ((srcLength + relativeEnd), 0); else let endIndex bemin (relativeEnd, srcLength). - Let newLength be
max (endIndex - beginIndex, 0). - Let constructorName be the String value of O's [[TypedArrayName]] internal slot.
- Let elementSize be the Number value of the Element Size value specified in
Table 50 for constructorName. - Let srcByteOffset be the value of O's [[ByteOffset]] internal slot.
- Let beginByteOffset be srcByteOffset + beginIndex × elementSize.
- Let argumentsList be « buffer, beginByteOffset, newLength ».
- Return ?
TypedArraySpeciesCreate (O, argumentsList).
This function is not generic. The
22.2.3.28%TypedArray%.prototype.toLocaleString ([ reserved1 [ , reserved2 ] ])#
.prototype.toLocaleString is a distinct function that implements the same algorithm as Array.prototype.toLocaleString as defined in "length". The implementation of the algorithm may be optimized with the knowledge that the
This function is not generic.
If the ECMAScript implementation includes the ECMA-402 Internationalization API this function is based upon the algorithm for Array.prototype.toLocaleString that is in the ECMA-402 specification.
22.2.3.29%TypedArray%.prototype.toString ( )#
The initial value of the .prototype.toString data property is the same built-in function object as the Array.prototype.toString method defined in
22.2.3.30%TypedArray%.prototype.values ( )#
The following steps are taken:
- Let O be the
this value. - Perform ?
ValidateTypedArray (O). - Return
CreateArrayIterator (O,"value").
22.2.3.31%TypedArray%.prototype [ @@iterator ] ( )#
The initial value of the @@iterator property is the same function object as the initial value of the .prototype.values property.
22.2.3.32get %TypedArray%.prototype [ @@toStringTag ]#
prototype[@@toStringTag] is an accessor property whose set accessor function is
- Let O be the
this value. - If
Type (O) is not Object, returnundefined . - If O does not have a [[TypedArrayName]] internal slot, return
undefined . - Let name be the value of O's [[TypedArrayName]] internal slot.
- Assert: name is a String value.
- Return name.
This property has the attributes { [[Enumerable]]:
The initial value of the name property of this function is "get [Symbol.toStringTag]".
22.2.4The TypedArray Constructors#
Each of the TypedArray constructor objects is an intrinsic object that has the structure described below, differing only in the name used as the constructor name instead of TypedArray, in
The TypedArray intrinsic constructor functions are single functions whose behaviour is overloaded based upon the number and types of its arguments. The actual behaviour of a call of TypedArray depends upon the number and kind of arguments that are passed to it.
The TypedArray constructors are not intended to be called as a function and will throw an exception when called in that manner.
The TypedArray constructors are designed to be subclassable. They may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified TypedArray behaviour must include a super call to the TypedArray constructor to create and initialize the subclass instance with the internal state necessary to support the %TypedArray%.prototype built-in methods.
The length property of the TypedArray constructor function is 3.
22.2.4.1TypedArray ( )#
This description applies only if the TypedArray function is called with no arguments.
- If NewTarget is
undefined , throw aTypeError exception. - Let constructorName be the String value of the Constructor Name value specified in
Table 50 for this TypedArray constructor. - Return ?
AllocateTypedArray (constructorName, NewTarget,"%TypedArrayPrototype%", 0).
22.2.4.2TypedArray ( length )#
This description applies only if the TypedArray function is called with at least one argument and the Type of the first argument is not Object.
TypedArray called with argument length performs the following steps:
- Assert:
Type (length) is not Object. - If NewTarget is
undefined , throw aTypeError exception. - If length is
undefined , throw aTypeError exception. - Let numberLength be ?
ToNumber (length). - Let elementLength be
ToLength (numberLength). - If
SameValueZero (numberLength, elementLength) isfalse , throw aRangeError exception. - Let constructorName be the String value of the Constructor Name value specified in
Table 50 for this TypedArray constructor. - Return ?
AllocateTypedArray (constructorName, NewTarget,"%TypedArrayPrototype%", elementLength).
22.2.4.2.1Runtime Semantics: AllocateTypedArray (constructorName, newTarget, defaultProto [ , length ])#
The abstract operation AllocateTypedArray with arguments constructorName, newTarget, defaultProto and optional argument length is used to validate and create an instance of a TypedArray constructor. constructorName is required to be the name of a TypedArray constructor in
- Let proto be ?
GetPrototypeFromConstructor (newTarget, defaultProto). - Let obj be
IntegerIndexedObjectCreate (proto, « [[ViewedArrayBuffer]], [[TypedArrayName]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] »). - Assert: The [[ViewedArrayBuffer]] internal slot of obj is
undefined . - Set obj's [[TypedArrayName]] internal slot to constructorName.
- If length was not passed, then
- Set obj's [[ByteLength]] internal slot to 0.
- Set obj's [[ByteOffset]] internal slot to 0.
- Set obj's [[ArrayLength]] internal slot to 0.
- Else,
- Perform ?
AllocateTypedArrayBuffer (obj, length).
- Perform ?
- Return obj.
22.2.4.2.2Runtime Semantics: AllocateTypedArrayBuffer ( O, length )#
The abstract operation AllocateTypedArrayBuffer with arguments O and length allocates and associates an ArrayBuffer with the TypedArray instance O. It performs the following steps:
- Assert: O is an Object that has a [[ViewedArrayBuffer]] internal slot.
- Assert: The [[ViewedArrayBuffer]] internal slot of O is
undefined . - Assert: length ≥ 0.
- Let constructorName be the String value of O's [[TypedArrayName]] internal slot.
- Let elementSize be the Element Size value in
Table 50 for constructorName. - Let byteLength be elementSize × length.
- Let data be ?
AllocateArrayBuffer (%ArrayBuffer% , byteLength). - Set O's [[ViewedArrayBuffer]] internal slot to data.
- Set O's [[ByteLength]] internal slot to byteLength.
- Set O's [[ByteOffset]] internal slot to 0.
- Set O's [[ArrayLength]] internal slot to length.
- Return O.
22.2.4.3TypedArray ( typedArray )#
This description applies only if the TypedArray function is called with at least one argument and the Type of the first argument is Object and that object has a [[TypedArrayName]] internal slot.
TypedArray called with argument typedArray performs the following steps:
- Assert:
Type (typedArray) is Object and typedArray has a [[TypedArrayName]] internal slot. - If NewTarget is
undefined , throw aTypeError exception. - Let constructorName be the String value of the Constructor Name value specified in
Table 50 for this TypedArray constructor. - Let O be ?
AllocateTypedArray (constructorName, NewTarget,"%TypedArrayPrototype%"). - Let srcArray be typedArray.
- Let srcData be the value of srcArray's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (srcData) istrue , throw aTypeError exception. - Let constructorName be the String value of O's [[TypedArrayName]] internal slot.
- Let elementType be the String value of the Element Type value in
Table 50 for constructorName. - Let elementLength be the value of srcArray's [[ArrayLength]] internal slot.
- Let srcName be the String value of srcArray's [[TypedArrayName]] internal slot.
- Let srcType be the String value of the Element Type value in
Table 50 for srcName. - Let srcElementSize be the Element Size value in
Table 50 for srcName. - Let srcByteOffset be the value of srcArray's [[ByteOffset]] internal slot.
- Let elementSize be the Element Size value in
Table 50 for constructorName. - Let byteLength be elementSize × elementLength.
- If
SameValue (elementType, srcType) istrue , then- Let data be ?
CloneArrayBuffer (srcData, srcByteOffset).
- Let data be ?
- Else,
- Let bufferConstructor be ?
SpeciesConstructor (srcData,%ArrayBuffer% ). - Let data be ?
AllocateArrayBuffer (bufferConstructor, byteLength). - If
IsDetachedBuffer (srcData) istrue , throw aTypeError exception. - Let srcByteIndex be srcByteOffset.
- Let targetByteIndex be 0.
- Let count be elementLength.
- Repeat, while count > 0
- Let value be
GetValueFromBuffer (srcData, srcByteIndex, srcType). - Perform
SetValueInBuffer (data, targetByteIndex, elementType, value). - Set srcByteIndex to srcByteIndex + srcElementSize.
- Set targetByteIndex to targetByteIndex + elementSize.
- Decrement count by 1.
- Let value be
- Let bufferConstructor be ?
- Set O's [[ViewedArrayBuffer]] internal slot to data.
- Set O's [[ByteLength]] internal slot to byteLength.
- Set O's [[ByteOffset]] internal slot to 0.
- Set O's [[ArrayLength]] internal slot to elementLength.
- Return O.
22.2.4.4TypedArray ( object )#
This description applies only if the TypedArray function is called with at least one argument and the Type of the first argument is Object and that object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]] internal slot.
TypedArray called with argument object performs the following steps:
- Assert:
Type (object) is Object and object does not have either a [[TypedArrayName]] or an [[ArrayBufferData]] internal slot. - If NewTarget is
undefined , throw aTypeError exception. - Let constructorName be the String value of the Constructor Name value specified in
Table 50 for this TypedArray constructor. - Let O be ?
AllocateTypedArray (constructorName, NewTarget,"%TypedArrayPrototype%"). - Let arrayLike be ?
IterableToArrayLike (object). - Let len be ?
ToLength (?Get (arrayLike,"length")). - Perform ?
AllocateTypedArrayBuffer (O, len). - Let k be 0.
- Repeat, while k < len
- Return O.
22.2.4.5TypedArray ( buffer [ , byteOffset [ , length ] ] )#
This description applies only if the TypedArray function is called with at least one argument and the Type of the first argument is Object and that object has an [[ArrayBufferData]] internal slot.
TypedArray called with arguments buffer, byteOffset, and length performs the following steps:
- Assert:
Type (buffer) is Object and buffer has an [[ArrayBufferData]] internal slot. - If NewTarget is
undefined , throw aTypeError exception. - Let constructorName be the String value of the Constructor Name value specified in
Table 50 for this TypedArray constructor. - Let O be ?
AllocateTypedArray (constructorName, NewTarget,"%TypedArrayPrototype%"). - Let constructorName be the String value of O's [[TypedArrayName]] internal slot.
- Let elementSize be the Number value of the Element Size value in
Table 50 for constructorName. - Let offset be ?
ToInteger (byteOffset). - If offset < 0, throw a
RangeError exception. - If offset is
-0 , let offset be+0 . - If offset
modulo elementSize ≠ 0, throw aRangeError exception. - If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - Let bufferByteLength be the value of buffer's [[ArrayBufferByteLength]] internal slot.
- If length is
undefined , then- If bufferByteLength
modulo elementSize ≠ 0, throw aRangeError exception. - Let newByteLength be bufferByteLength - offset.
- If newByteLength < 0, throw a
RangeError exception.
- If bufferByteLength
- Else,
- Let newLength be ?
ToLength (length). - Let newByteLength be newLength × elementSize.
- If offset+newByteLength > bufferByteLength, throw a
RangeError exception.
- Let newLength be ?
- Set O's [[ViewedArrayBuffer]] internal slot to buffer.
- Set O's [[ByteLength]] internal slot to newByteLength.
- Set O's [[ByteOffset]] internal slot to offset.
- Set O's [[ArrayLength]] internal slot to newByteLength / elementSize.
- Return O.
22.2.4.6TypedArrayCreate ( constructor, argumentList )#
The abstract operation TypedArrayCreate with arguments constructor and argumentList is used to specify the creation of a new TypedArray object using a constructor function. It performs the following steps:
- Let newTypedArray be ?
Construct (constructor, argumentList). - Perform ?
ValidateTypedArray (newTypedArray). - If argumentList is a
List of a single Number, then- If the value of newTypedArray's [[ArrayLength]] internal slot < argumentList[0], throw a
TypeError exception.
- If the value of newTypedArray's [[ArrayLength]] internal slot < argumentList[0], throw a
- Return newTypedArray.
22.2.4.7TypedArraySpeciesCreate ( exemplar, argumentList )#
The abstract operation TypedArraySpeciesCreate with arguments exemplar and argumentList is used to specify the creation of a new TypedArray object using a constructor function that is derived from exemplar. It performs the following steps:
- Assert: exemplar is an Object that has a [[TypedArrayName]] internal slot.
- Let defaultConstructor be the intrinsic object listed in column one of
Table 50 for the value of exemplar's [[TypedArrayName]] internal slot. - Let constructor be ?
SpeciesConstructor (exemplar, defaultConstructor). - Return ?
TypedArrayCreate (constructor, argumentList).
22.2.5Properties of the TypedArray Constructors#
The value of the [[Prototype]] internal slot of each TypedArray constructor is the
Each TypedArray constructor has a name property whose value is the String value of the constructor name specified for it in
Each TypedArray constructor has the following properties:
22.2.5.1TypedArray.BYTES_PER_ELEMENT#
The value of TypedArray.BYTES_PER_ELEMENT is the Number value of the Element Size value specified in
This property has the attributes { [[Writable]]:
22.2.5.2TypedArray.prototype#
The initial value of TypedArray.prototype is the corresponding TypedArray prototype intrinsic object (
This property has the attributes { [[Writable]]:
22.2.6Properties of TypedArray Prototype Objects#
The value of the [[Prototype]] internal slot of a TypedArray prototype object is the intrinsic object
22.2.6.1TypedArray.prototype.BYTES_PER_ELEMENT#
The value of TypedArray.prototype.BYTES_PER_ELEMENT is the Number value of the Element Size value specified in
This property has the attributes { [[Writable]]:
22.2.6.2TypedArray.prototype.constructor#
The initial value of a TypedArray.prototype.constructor is the corresponding %TypedArray% intrinsic object.
22.2.7Properties of TypedArray Instances#
TypedArray instances are Integer Indexed exotic objects. Each TypedArray instance inherits properties from the corresponding TypedArray prototype object. Each TypedArray instance has the following internal slots: [[TypedArrayName]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]], and [[ArrayLength]].
23Keyed Collection#
23.1Map Objects#
Map objects are collections of key/value pairs where both the keys and values may be arbitrary ECMAScript language values. A distinct key value may only occur in one key/value pair within the Map's collection. Distinct key values are discriminated using the
Map object must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements in the collection. The data structures used in this Map objects specification is only intended to describe the required observable semantics of Map objects. It is not intended to be a viable implementation model.
23.1.1The Map Constructor#
The Map constructor is the %Map% intrinsic object and the initial value of the Map property of the Map is not intended to be called as a function and will throw an exception when called in that manner.
The Map constructor is designed to be subclassable. It may be used as the value in an extends clause of a class definition. Subclass constructors that intend to inherit the specified Map behaviour must include a super call to the Map constructor to create and initialize the subclass instance with the internal state necessary to support the Map.prototype built-in methods.
23.1.1.1Map ( [ iterable ] )#
When the Map function is called with optional argument, the following steps are taken:
- If NewTarget is
undefined , throw aTypeError exception. - Let map be ?
OrdinaryCreateFromConstructor (NewTarget,"%MapPrototype%", « [[MapData]] »). - Set map's [[MapData]] internal slot to a new empty
List . - If iterable is not present, let iterable be
undefined . - If iterable is either
undefined ornull , let iter beundefined . - Else,
- Let adder be ?
Get (map,"set"). - If
IsCallable (adder) isfalse , throw aTypeError exception. - Let iter be ?
GetIterator (iterable).
- Let adder be ?
- If iter is
undefined , return map. - Repeat
- Let next be ?
IteratorStep (iter). - If next is
false , return map. - Let nextItem be ?
IteratorValue (next). - If
Type (nextItem) is not Object, then- Let error be
Completion {[[Type]]:throw , [[Value]]: a newly createdTypeError object, [[Target]]:empty }. - Return ?
IteratorClose (iter, error).
- Let error be
- Let k be
Get (nextItem,"0"). - If k is an
abrupt completion , return ?IteratorClose (iter, k). - Let v be
Get (nextItem,"1"). - If v is an
abrupt completion , return ?IteratorClose (iter, v). - Let status be
Call (adder, map, « k.[[Value]], v.[[Value]] »). - If status is an
abrupt completion , return ?IteratorClose (iter, status).
- Let next be ?
If the parameter iterable is present, it is expected to be an object that implements an @@iterator method that returns an iterator object that produces a two element array-like object whose first element is a value that will be used as a Map key and whose second element is the value to associate with that key.
23.1.2Properties of the Map Constructor#
The value of the [[Prototype]] internal slot of the Map constructor is the intrinsic object
The Map constructor has the following properties:
23.1.2.1Map.prototype#
The initial value of Map.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
23.1.2.2get Map [ @@species ]#
Map[@@species] is an accessor property whose set accessor function is
- Return the
this value.
The value of the name property of this function is "get [Symbol.species]".
Methods that create derived collection objects should call @@species to determine the constructor to use to create the derived objects. Subclass constructor may over-ride @@species to change the default constructor assignment.
23.1.3Properties of the Map Prototype Object#
The Map prototype object is the intrinsic object %MapPrototype%. The value of the [[Prototype]] internal slot of the Map prototype object is the intrinsic object
23.1.3.1Map.prototype.clear ( )#
The following steps are taken:
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[MapData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of M's [[MapData]] internal slot. - Repeat for each
Record {[[Key]], [[Value]]} p that is an element of entries,- Set p.[[Key]] to
empty . - Set p.[[Value]] to
empty .
- Set p.[[Key]] to
- Return
undefined .
The existing [[MapData]]
23.1.3.2Map.prototype.constructor#
The initial value of Map.prototype.constructor is the intrinsic object
23.1.3.3Map.prototype.delete ( key )#
The following steps are taken:
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[MapData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of M's [[MapData]] internal slot. - Repeat for each
Record {[[Key]], [[Value]]} p that is an element of entries,- If p.[[Key]] is not
empty andSameValueZero (p.[[Key]], key) istrue , then- Set p.[[Key]] to
empty . - Set p.[[Value]] to
empty . - Return
true .
- Set p.[[Key]] to
- If p.[[Key]] is not
- Return
false .
The value
23.1.3.4Map.prototype.entries ( )#
The following steps are taken:
- Let M be the
this value. - Return ?
CreateMapIterator (M,"key+value").
23.1.3.5Map.prototype.forEach ( callbackfn [ , thisArg ] )#
When the forEach method is called with one or two arguments, the following steps are taken:
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[MapData]] internal slot, throw a
TypeError exception. - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let entries be the
List that is the value of M's [[MapData]] internal slot. - Repeat for each
Record {[[Key]], [[Value]]} e that is an element of entries, in original key insertion order- If e.[[Key]] is not
empty , then- Perform ?
Call (callbackfn, T, « e.[[Value]], e.[[Key]], M »).
- Perform ?
- If e.[[Key]] is not
- Return
undefined .
callbackfn should be a function that accepts three arguments. forEach calls callbackfn once for each key/value pair present in the map object, in key insertion order. callbackfn is called only for keys of the map which actually exist; it is not called for keys that have been deleted from the map.
If a thisArg parameter is provided, it will be used as the
callbackfn is called with three arguments: the value of the item, the key of the item, and the Map object being traversed.
forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn. Each entry of a map's [[MapData]] is only visited once. New keys added after the call to forEach begins are visited. A key will be revisited if it is deleted after it has been visited and then re-added before the forEach call completes. Keys that are deleted after the call to forEach begins and before being visited are not visited unless the key is added again before the forEach call completes.
23.1.3.6Map.prototype.get ( key )#
The following steps are taken:
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[MapData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of M's [[MapData]] internal slot. - Repeat for each
Record {[[Key]], [[Value]]} p that is an element of entries,- If p.[[Key]] is not
empty andSameValueZero (p.[[Key]], key) istrue , return p.[[Value]].
- If p.[[Key]] is not
- Return
undefined .
23.1.3.7Map.prototype.has ( key )#
The following steps are taken:
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[MapData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of M's [[MapData]] internal slot. - Repeat for each
Record {[[Key]], [[Value]]} p that is an element of entries,- If p.[[Key]] is not
empty andSameValueZero (p.[[Key]], key) istrue , returntrue .
- If p.[[Key]] is not
- Return
false .
23.1.3.8Map.prototype.keys ( )#
The following steps are taken:
- Let M be the
this value. - Return ?
CreateMapIterator (M,"key").
23.1.3.9Map.prototype.set ( key, value )#
The following steps are taken:
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[MapData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of M's [[MapData]] internal slot. - Repeat for each
Record {[[Key]], [[Value]]} p that is an element of entries,- If p.[[Key]] is not
empty andSameValueZero (p.[[Key]], key) istrue , then- Set p.[[Value]] to value.
- Return M.
- If p.[[Key]] is not
- If key is
-0 , let key be+0 . - Let p be the
Record {[[Key]]: key, [[Value]]: value}. - Append p as the last element of entries.
- Return M.
23.1.3.10get Map.prototype.size#
Map.prototype.size is an accessor property whose set accessor function is
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[MapData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of M's [[MapData]] internal slot. - Let count be 0.
- For each
Record {[[Key]], [[Value]]} p that is an element of entries- If p.[[Key]] is not
empty , set count to count+1.
- If p.[[Key]] is not
- Return count.
23.1.3.11Map.prototype.values ( )#
The following steps are taken:
- Let M be the
this value. - Return ?
CreateMapIterator (M,"value").
23.1.3.12Map.prototype [ @@iterator ] ( )#
The initial value of the @@iterator property is the same function object as the initial value of the entries property.
23.1.3.13Map.prototype [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "Map".
This property has the attributes { [[Writable]]:
23.1.4Properties of Map Instances#
Map instances are ordinary objects that inherit properties from the Map prototype. Map instances also have a [[MapData]] internal slot.
23.1.5Map Iterator Objects#
A Map Iterator is an object, that represents a specific iteration over some specific Map instance object. There is not a named constructor for Map Iterator objects. Instead, map iterator objects are created by calling certain methods of Map instance objects.
23.1.5.1CreateMapIterator Abstract Operation#
Several methods of Map objects return Iterator objects. The abstract operation CreateMapIterator with arguments map and kind is used to create such iterator objects. It performs the following steps:
- If
Type (map) is not Object, throw aTypeError exception. - If map does not have a [[MapData]] internal slot, throw a
TypeError exception. - Let iterator be
ObjectCreate (%MapIteratorPrototype% , « [[Map]], [[MapNextIndex]], [[MapIterationKind]] »). - Set iterator's [[Map]] internal slot to map.
- Set iterator's [[MapNextIndex]] internal slot to 0.
- Set iterator's [[MapIterationKind]] internal slot to kind.
- Return iterator.
23.1.5.2The %MapIteratorPrototype% Object#
All Map Iterator Objects inherit properties from the %MapIteratorPrototype% intrinsic object. The %MapIteratorPrototype% intrinsic object is an ordinary object and its [[Prototype]] internal slot is the
23.1.5.2.1%MapIteratorPrototype%.next ( )#
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have all of the internal slots of a Map Iterator Instance (
23.1.5.3 ), throw aTypeError exception. - Let m be the value of the [[Map]] internal slot of O.
- Let index be the value of the [[MapNextIndex]] internal slot of O.
- Let itemKind be the value of the [[MapIterationKind]] internal slot of O.
- If m is
undefined , returnCreateIterResultObject (undefined ,true ). - Assert: m has a [[MapData]] internal slot.
- Let entries be the
List that is the value of the [[MapData]] internal slot of m. - Repeat while index is less than the total number of elements of entries. The number of elements must be redetermined each time this method is evaluated.
- Let e be the
Record {[[Key]], [[Value]]} that is the value of entries[index]. - Set index to index+1.
- Set the [[MapNextIndex]] internal slot of O to index.
- If e.[[Key]] is not
empty , then- If itemKind is
"key", let result be e.[[Key]]. - Else if itemKind is
"value", let result be e.[[Value]]. - Else,
- Assert: itemKind is
"key+value". - Let result be
CreateArrayFromList (« e.[[Key]], e.[[Value]] »).
- Assert: itemKind is
- Return
CreateIterResultObject (result,false ).
- If itemKind is
- Let e be the
- Set the [[Map]] internal slot of O to
undefined . - Return
CreateIterResultObject (undefined ,true ).
23.1.5.2.2%MapIteratorPrototype% [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "Map Iterator".
This property has the attributes { [[Writable]]:
23.1.5.3Properties of Map Iterator Instances#
Map Iterator instances are ordinary objects that inherit properties from the
| Internal Slot | Description |
|---|---|
| [[Map]] | The Map object that is being iterated. |
| [[MapNextIndex]] | The integer index of the next Map data element to be examined by this iterator. |
| [[MapIterationKind]] |
A String value that identifies what is to be returned for each element of the iteration. The possible values are: "key", "value", "key+value".
|
23.2Set Objects#
Set objects are collections of ECMAScript language values. A distinct value may only occur once as an element of a Set's collection. Distinct values are discriminated using the
Set objects must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements in the collection. The data structures used in this Set objects specification is only intended to describe the required observable semantics of Set objects. It is not intended to be a viable implementation model.
23.2.1The Set Constructor#
The Set constructor is the %Set% intrinsic object and the initial value of the Set property of the Set is not intended to be called as a function and will throw an exception when called in that manner.
The Set constructor is designed to be subclassable. It may be used as the value in an extends clause of a class definition. Subclass constructors that intend to inherit the specified Set behaviour must include a super call to the Set constructor to create and initialize the subclass instance with the internal state necessary to support the Set.prototype built-in methods.
23.2.1.1Set ( [ iterable ] )#
When the Set function is called with optional argument iterable, the following steps are taken:
- If NewTarget is
undefined , throw aTypeError exception. - Let set be ?
OrdinaryCreateFromConstructor (NewTarget,"%SetPrototype%", « [[SetData]] »). - Set set's [[SetData]] internal slot to a new empty
List . - If iterable is not present, let iterable be
undefined . - If iterable is either
undefined ornull , let iter beundefined . - Else,
- Let adder be ?
Get (set,"add"). - If
IsCallable (adder) isfalse , throw aTypeError exception. - Let iter be ?
GetIterator (iterable).
- Let adder be ?
- If iter is
undefined , return set. - Repeat
- Let next be ?
IteratorStep (iter). - If next is
false , return set. - Let nextValue be ?
IteratorValue (next). - Let status be
Call (adder, set, « nextValue.[[Value]] »). - If status is an
abrupt completion , return ?IteratorClose (iter, status).
- Let next be ?
23.2.2Properties of the Set Constructor#
The value of the [[Prototype]] internal slot of the Set constructor is the intrinsic object
The Set constructor has the following properties:
23.2.2.1Set.prototype#
The initial value of Set.prototype is the intrinsic
This property has the attributes { [[Writable]]:
23.2.2.2get Set [ @@species ]#
Set[@@species] is an accessor property whose set accessor function is
- Return the
this value.
The value of the name property of this function is "get [Symbol.species]".
Methods that create derived collection objects should call @@species to determine the constructor to use to create the derived objects. Subclass constructor may over-ride @@species to change the default constructor assignment.
23.2.3Properties of the Set Prototype Object#
The Set prototype object is the intrinsic object %SetPrototype%. The value of the [[Prototype]] internal slot of the Set prototype object is the intrinsic object
23.2.3.1Set.prototype.add ( value )#
The following steps are taken:
- Let S be the
this value. - If
Type (S) is not Object, throw aTypeError exception. - If S does not have a [[SetData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of S's [[SetData]] internal slot. - Repeat for each e that is an element of entries,
- If e is not
empty andSameValueZero (e, value) istrue , then- Return S.
- If e is not
- If value is
-0 , let value be+0 . - Append value as the last element of entries.
- Return S.
23.2.3.2Set.prototype.clear ( )#
The following steps are taken:
- Let S be the
this value. - If
Type (S) is not Object, throw aTypeError exception. - If S does not have a [[SetData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of S's [[SetData]] internal slot. - Repeat for each e that is an element of entries,
- Replace the element of entries whose value is e with an element whose value is
empty .
- Replace the element of entries whose value is e with an element whose value is
- Return
undefined .
The existing [[SetData]]
23.2.3.3Set.prototype.constructor#
The initial value of Set.prototype.constructor is the intrinsic object
23.2.3.4Set.prototype.delete ( value )#
The following steps are taken:
- Let S be the
this value. - If
Type (S) is not Object, throw aTypeError exception. - If S does not have a [[SetData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of S's [[SetData]] internal slot. - Repeat for each e that is an element of entries,
- If e is not
empty andSameValueZero (e, value) istrue , then- Replace the element of entries whose value is e with an element whose value is
empty . - Return
true .
- Replace the element of entries whose value is e with an element whose value is
- If e is not
- Return
false .
The value
23.2.3.5Set.prototype.entries ( )#
The following steps are taken:
- Let S be the
this value. - Return ?
CreateSetIterator (S,"key+value").
For iteration purposes, a Set appears similar to a Map where each entry has the same value for its key and value.
23.2.3.6Set.prototype.forEach ( callbackfn [ , thisArg ] )#
When the forEach method is called with one or two arguments, the following steps are taken:
- Let S be the
this value. - If
Type (S) is not Object, throw aTypeError exception. - If S does not have a [[SetData]] internal slot, throw a
TypeError exception. - If
IsCallable (callbackfn) isfalse , throw aTypeError exception. - If thisArg was supplied, let T be thisArg; else let T be
undefined . - Let entries be the
List that is the value of S's [[SetData]] internal slot. - Repeat for each e that is an element of entries, in original insertion order
- If e is not
empty , then- Perform ?
Call (callbackfn, T, « e, e, S »).
- Perform ?
- If e is not
- Return
undefined .
callbackfn should be a function that accepts three arguments. forEach calls callbackfn once for each value present in the set object, in value insertion order. callbackfn is called only for values of the Set which actually exist; it is not called for keys that have been deleted from the set.
If a thisArg parameter is provided, it will be used as the
callbackfn is called with three arguments: the first two arguments are a value contained in the Set. The same value is passed for both arguments. The Set object being traversed is passed as the third argument.
The callbackfn is called with three arguments to be consistent with the call back functions used by forEach methods for Map and Array. For Sets, each item value is considered to be both the key and the value.
forEach does not directly mutate the object on which it is called but the object may be mutated by the calls to callbackfn.
Each value is normally visited only once. However, a value will be revisited if it is deleted after it has been visited and then re-added before the forEach call completes. Values that are deleted after the call to forEach begins and before being visited are not visited unless the value is added again before the forEach call completes. New values added after the call to forEach begins are visited.
23.2.3.7Set.prototype.has ( value )#
The following steps are taken:
- Let S be the
this value. - If
Type (S) is not Object, throw aTypeError exception. - If S does not have a [[SetData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of S's [[SetData]] internal slot. - Repeat for each e that is an element of entries,
- If e is not
empty andSameValueZero (e, value) istrue , returntrue .
- If e is not
- Return
false .
23.2.3.8Set.prototype.keys ( )#
The initial value of the keys property is the same function object as the initial value of the values property.
For iteration purposes, a Set appears similar to a Map where each entry has the same value for its key and value.
23.2.3.9get Set.prototype.size#
Set.prototype.size is an accessor property whose set accessor function is
- Let S be the
this value. - If
Type (S) is not Object, throw aTypeError exception. - If S does not have a [[SetData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of S's [[SetData]] internal slot. - Let count be 0.
- For each e that is an element of entries
- If e is not
empty , set count to count+1.
- If e is not
- Return count.
23.2.3.10Set.prototype.values ( )#
The following steps are taken:
- Let S be the
this value. - Return ?
CreateSetIterator (S,"value").
23.2.3.11Set.prototype [ @@iterator ] ( )#
The initial value of the @@iterator property is the same function object as the initial value of the values property.
23.2.3.12Set.prototype [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "Set".
This property has the attributes { [[Writable]]:
23.2.4Properties of Set Instances#
Set instances are ordinary objects that inherit properties from the Set prototype. Set instances also have a [[SetData]] internal slot.
23.2.5Set Iterator Objects#
A Set Iterator is an ordinary object, with the structure defined below, that represents a specific iteration over some specific Set instance object. There is not a named constructor for Set Iterator objects. Instead, set iterator objects are created by calling certain methods of Set instance objects.
23.2.5.1CreateSetIterator Abstract Operation#
Several methods of Set objects return Iterator objects. The abstract operation CreateSetIterator with arguments set and kind is used to create such iterator objects. It performs the following steps:
- If
Type (set) is not Object, throw aTypeError exception. - If set does not have a [[SetData]] internal slot, throw a
TypeError exception. - Let iterator be
ObjectCreate (%SetIteratorPrototype% , « [[IteratedSet]], [[SetNextIndex]], [[SetIterationKind]] »). - Set iterator's [[IteratedSet]] internal slot to set.
- Set iterator's [[SetNextIndex]] internal slot to 0.
- Set iterator's [[SetIterationKind]] internal slot to kind.
- Return iterator.
23.2.5.2The %SetIteratorPrototype% Object#
All Set Iterator Objects inherit properties from the %SetIteratorPrototype% intrinsic object. The %SetIteratorPrototype% intrinsic object is an ordinary object and its [[Prototype]] internal slot is the
23.2.5.2.1%SetIteratorPrototype%.next ( )#
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have all of the internal slots of a Set Iterator Instance (
23.2.5.3 ), throw aTypeError exception. - Let s be the value of the [[IteratedSet]] internal slot of O.
- Let index be the value of the [[SetNextIndex]] internal slot of O.
- Let itemKind be the value of the [[SetIterationKind]] internal slot of O.
- If s is
undefined , returnCreateIterResultObject (undefined ,true ). - Assert: s has a [[SetData]] internal slot.
- Let entries be the
List that is the value of the [[SetData]] internal slot of s. - Repeat while index is less than the total number of elements of entries. The number of elements must be redetermined each time this method is evaluated.
- Let e be entries[index].
- Set index to index+1.
- Set the [[SetNextIndex]] internal slot of O to index.
- If e is not
empty , then- If itemKind is
"key+value", then- Return
CreateIterResultObject (CreateArrayFromList (« e, e »),false ).
- Return
- Return
CreateIterResultObject (e,false ).
- If itemKind is
- Set the [[IteratedSet]] internal slot of O to
undefined . - Return
CreateIterResultObject (undefined ,true ).
23.2.5.2.2%SetIteratorPrototype% [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "Set Iterator".
This property has the attributes { [[Writable]]:
23.2.5.3Properties of Set Iterator Instances#
Set Iterator instances are ordinary objects that inherit properties from the
| Internal Slot | Description |
|---|---|
| [[IteratedSet]] | The Set object that is being iterated. |
| [[SetNextIndex]] | The integer index of the next Set data element to be examined by this iterator |
| [[SetIterationKind]] |
A String value that identifies what is to be returned for each element of the iteration. The possible values are: "key", "value", "key+value". "key" and "value" have the same meaning.
|
23.3WeakMap Objects#
WeakMap objects are collections of key/value pairs where the keys are objects and values may be arbitrary ECMAScript language values. A WeakMap may be queried to see if it contains a key/value pair with a specific key, but no mechanism is provided for enumerating the objects it holds as keys. If an object that is being used as the key of a WeakMap key/value pair is only reachable by following a chain of references that start within that WeakMap, then that key/value pair is inaccessible and is automatically removed from the WeakMap. WeakMap implementations must detect and remove such key/value pairs and any associated resources.
An implementation may impose an arbitrarily determined latency between the time a key/value pair of a WeakMap becomes inaccessible and the time when the key/value pair is removed from the WeakMap. If this latency was observable to ECMAScript program, it would be a source of indeterminacy that could impact program execution. For that reason, an ECMAScript implementation must not provide any means to observe a key of a WeakMap that does not require the observer to present the observed key.
WeakMap objects must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of key/value pairs in the collection. The data structure used in this WeakMap objects specification are only intended to describe the required observable semantics of WeakMap objects. It is not intended to be a viable implementation model.
WeakMap and WeakSets are intended to provide mechanisms for dynamically associating state with an object in a manner that does not “leak” memory resources if, in the absence of the WeakMap or WeakSet, the object otherwise became inaccessible and subject to resource reclamation by the implementation's garbage collection mechanisms. This characteristic can be achieved by using an inverted per-object mapping of weak map instances to keys. Alternatively each weak map may internally store its key to value mappings but this approach requires coordination between the WeakMap or WeakSet implementation and the garbage collector. The following references describe mechanism that may be useful to implementations of WeakMap and WeakSets:
Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (OOPSLA '97), A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183, http://doi.acm.org/10.1145/263698.263733.
Alexandra Barros, Roberto Ierusalimschy, Eliminating Cycles in Weak Tables. Journal of Universal Computer Science - J.UCS, vol. 14, no. 21, pp. 3481-3497, 2008, http://www.jucs.org/jucs_14_21/eliminating_cycles_in_weak
23.3.1The WeakMap Constructor#
The WeakMap constructor is the %WeakMap% intrinsic object and the initial value of the WeakMap property of the WeakMap is not intended to be called as a function and will throw an exception when called in that manner.
The WeakMap constructor is designed to be subclassable. It may be used as the value in an extends clause of a class definition. Subclass constructors that intend to inherit the specified WeakMap behaviour must include a super call to the WeakMap constructor to create and initialize the subclass instance with the internal state necessary to support the WeakMap.prototype built-in methods.
23.3.1.1WeakMap ( [ iterable ] )#
When the WeakMap function is called with optional argument iterable, the following steps are taken:
- If NewTarget is
undefined , throw aTypeError exception. - Let map be ?
OrdinaryCreateFromConstructor (NewTarget,"%WeakMapPrototype%", « [[WeakMapData]] »). - Set map's [[WeakMapData]] internal slot to a new empty
List . - If iterable is not present, let iterable be
undefined . - If iterable is either
undefined ornull , let iter beundefined . - Else,
- Let adder be ?
Get (map,"set"). - If
IsCallable (adder) isfalse , throw aTypeError exception. - Let iter be ?
GetIterator (iterable).
- Let adder be ?
- If iter is
undefined , return map. - Repeat
- Let next be ?
IteratorStep (iter). - If next is
false , return map. - Let nextItem be ?
IteratorValue (next). - If
Type (nextItem) is not Object, then- Let error be
Completion {[[Type]]:throw , [[Value]]: a newly createdTypeError object, [[Target]]:empty }. - Return ?
IteratorClose (iter, error).
- Let error be
- Let k be
Get (nextItem,"0"). - If k is an
abrupt completion , return ?IteratorClose (iter, k). - Let v be
Get (nextItem,"1"). - If v is an
abrupt completion , return ?IteratorClose (iter, v). - Let status be
Call (adder, map, « k.[[Value]], v.[[Value]] »). - If status is an
abrupt completion , return ?IteratorClose (iter, status).
- Let next be ?
If the parameter iterable is present, it is expected to be an object that implements an @@iterator method that returns an iterator object that produces a two element array-like object whose first element is a value that will be used as a WeakMap key and whose second element is the value to associate with that key.
23.3.2Properties of the WeakMap Constructor#
The value of the [[Prototype]] internal slot of the WeakMap constructor is the intrinsic object
The WeakMap constructor has the following properties:
23.3.2.1WeakMap.prototype#
The initial value of WeakMap.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
23.3.3Properties of the WeakMap Prototype Object#
The WeakMap prototype object is the intrinsic object %WeakMapPrototype%. The value of the [[Prototype]] internal slot of the WeakMap prototype object is the intrinsic object
23.3.3.1WeakMap.prototype.constructor#
The initial value of WeakMap.prototype.constructor is the intrinsic object
23.3.3.2WeakMap.prototype.delete ( key )#
The following steps are taken:
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[WeakMapData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of M's [[WeakMapData]] internal slot. - If
Type (key) is not Object, returnfalse . - Repeat for each
Record {[[Key]], [[Value]]} p that is an element of entries,- If p.[[Key]] is not
empty andSameValue (p.[[Key]], key) istrue , then- Set p.[[Key]] to
empty . - Set p.[[Value]] to
empty . - Return
true .
- Set p.[[Key]] to
- If p.[[Key]] is not
- Return
false .
The value
23.3.3.3WeakMap.prototype.get ( key )#
The following steps are taken:
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[WeakMapData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of M's [[WeakMapData]] internal slot. - If
Type (key) is not Object, returnundefined . - Repeat for each
Record {[[Key]], [[Value]]} p that is an element of entries,- If p.[[Key]] is not
empty andSameValue (p.[[Key]], key) istrue , return p.[[Value]].
- If p.[[Key]] is not
- Return
undefined .
23.3.3.4WeakMap.prototype.has ( key )#
The following steps are taken:
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[WeakMapData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of M's [[WeakMapData]] internal slot. - If
Type (key) is not Object, returnfalse . - Repeat for each
Record {[[Key]], [[Value]]} p that is an element of entries,- If p.[[Key]] is not
empty andSameValue (p.[[Key]], key) istrue , returntrue .
- If p.[[Key]] is not
- Return
false .
23.3.3.5WeakMap.prototype.set ( key, value )#
The following steps are taken:
- Let M be the
this value. - If
Type (M) is not Object, throw aTypeError exception. - If M does not have a [[WeakMapData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of M's [[WeakMapData]] internal slot. - If
Type (key) is not Object, throw aTypeError exception. - Repeat for each
Record {[[Key]], [[Value]]} p that is an element of entries,- If p.[[Key]] is not
empty andSameValue (p.[[Key]], key) istrue , then- Set p.[[Value]] to value.
- Return M.
- If p.[[Key]] is not
- Let p be the
Record {[[Key]]: key, [[Value]]: value}. - Append p as the last element of entries.
- Return M.
23.3.3.6WeakMap.prototype [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "WeakMap".
This property has the attributes { [[Writable]]:
23.3.4Properties of WeakMap Instances#
WeakMap instances are ordinary objects that inherit properties from the WeakMap prototype. WeakMap instances also have a [[WeakMapData]] internal slot.
23.4WeakSet Objects#
WeakSet objects are collections of objects. A distinct object may only occur once as an element of a WeakSet's collection. A WeakSet may be queried to see if it contains a specific object, but no mechanism is provided for enumerating the objects it holds. If an object that is contained by a WeakSet is only reachable by following a chain of references that start within that WeakSet, then that object is inaccessible and is automatically removed from the WeakSet. WeakSet implementations must detect and remove such objects and any associated resources.
An implementation may impose an arbitrarily determined latency between the time an object contained in a WeakSet becomes inaccessible and the time when the object is removed from the WeakSet. If this latency was observable to ECMAScript program, it would be a source of indeterminacy that could impact program execution. For that reason, an ECMAScript implementation must not provide any means to determine if a WeakSet contains a particular object that does not require the observer to present the observed object.
WeakSet objects must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements in the collection. The data structure used in this WeakSet objects specification is only intended to describe the required observable semantics of WeakSet objects. It is not intended to be a viable implementation model.
See the NOTE in
23.4.1The WeakSet Constructor#
The WeakSet constructor is the %WeakSet% intrinsic object and the initial value of the WeakSet property of the WeakSet is not intended to be called as a function and will throw an exception when called in that manner.
The WeakSet constructor is designed to be subclassable. It may be used as the value in an extends clause of a class definition. Subclass constructors that intend to inherit the specified WeakSet behaviour must include a super call to the WeakSet constructor to create and initialize the subclass instance with the internal state necessary to support the WeakSet.prototype built-in methods.
23.4.1.1WeakSet ( [ iterable ] )#
When the WeakSet function is called with optional argument iterable, the following steps are taken:
- If NewTarget is
undefined , throw aTypeError exception. - Let set be ?
OrdinaryCreateFromConstructor (NewTarget,"%WeakSetPrototype%", « [[WeakSetData]] »). - Set set's [[WeakSetData]] internal slot to a new empty
List . - If iterable is not present, let iterable be
undefined . - If iterable is either
undefined ornull , let iter beundefined . - Else,
- Let adder be ?
Get (set,"add"). - If
IsCallable (adder) isfalse , throw aTypeError exception. - Let iter be ?
GetIterator (iterable).
- Let adder be ?
- If iter is
undefined , return set. - Repeat
- Let next be ?
IteratorStep (iter). - If next is
false , return set. - Let nextValue be ?
IteratorValue (next). - Let status be
Call (adder, set, « nextValue »). - If status is an
abrupt completion , return ?IteratorClose (iter, status).
- Let next be ?
23.4.2Properties of the WeakSet Constructor#
The value of the [[Prototype]] internal slot of the WeakSet constructor is the intrinsic object
The WeakSet constructor has the following properties:
23.4.2.1WeakSet.prototype#
The initial value of WeakSet.prototype is the intrinsic
This property has the attributes { [[Writable]]:
23.4.3Properties of the WeakSet Prototype Object#
The WeakSet prototype object is the intrinsic object %WeakSetPrototype%. The value of the [[Prototype]] internal slot of the WeakSet prototype object is the intrinsic object
23.4.3.1WeakSet.prototype.add ( value )#
The following steps are taken:
- Let S be the
this value. - If
Type (S) is not Object, throw aTypeError exception. - If S does not have a [[WeakSetData]] internal slot, throw a
TypeError exception. - If
Type (value) is not Object, throw aTypeError exception. - Let entries be the
List that is the value of S's [[WeakSetData]] internal slot. - Repeat for each e that is an element of entries,
- If e is not
empty andSameValue (e, value) istrue , then- Return S.
- If e is not
- Append value as the last element of entries.
- Return S.
23.4.3.2WeakSet.prototype.constructor#
The initial value of WeakSet.prototype.constructor is the
23.4.3.3WeakSet.prototype.delete ( value )#
The following steps are taken:
- Let S be the
this value. - If
Type (S) is not Object, throw aTypeError exception. - If S does not have a [[WeakSetData]] internal slot, throw a
TypeError exception. - If
Type (value) is not Object, returnfalse . - Let entries be the
List that is the value of S's [[WeakSetData]] internal slot. - Repeat for each e that is an element of entries,
- If e is not
empty andSameValue (e, value) istrue , then- Replace the element of entries whose value is e with an element whose value is
empty . - Return
true .
- Replace the element of entries whose value is e with an element whose value is
- If e is not
- Return
false .
The value
23.4.3.4WeakSet.prototype.has ( value )#
The following steps are taken:
- Let S be the
this value. - If
Type (S) is not Object, throw aTypeError exception. - If S does not have a [[WeakSetData]] internal slot, throw a
TypeError exception. - Let entries be the
List that is the value of S's [[WeakSetData]] internal slot. - If
Type (value) is not Object, returnfalse . - Repeat for each e that is an element of entries,
- If e is not
empty andSameValue (e, value) istrue , returntrue .
- If e is not
- Return
false .
23.4.3.5WeakSet.prototype [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "WeakSet".
This property has the attributes { [[Writable]]:
23.4.4Properties of WeakSet Instances#
WeakSet instances are ordinary objects that inherit properties from the WeakSet prototype. WeakSet instances also have a [[WeakSetData]] internal slot.
24Structured Data#
24.1ArrayBuffer Objects#
24.1.1Abstract Operations For ArrayBuffer Objects#
24.1.1.1AllocateArrayBuffer ( constructor, byteLength )#
The abstract operation AllocateArrayBuffer with arguments constructor and byteLength is used to create an ArrayBuffer object. It performs the following steps:
- Let obj be ?
OrdinaryCreateFromConstructor (constructor,"%ArrayBufferPrototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]] »). - Assert: byteLength is an integer value ≥ 0.
- Let block be ?
CreateByteDataBlock (byteLength). - Set obj's [[ArrayBufferData]] internal slot to block.
- Set obj's [[ArrayBufferByteLength]] internal slot to byteLength.
- Return obj.
24.1.1.2IsDetachedBuffer ( arrayBuffer )#
The abstract operation IsDetachedBuffer with argument arrayBuffer performs the following steps:
- Assert:
Type (arrayBuffer) is Object and it has an [[ArrayBufferData]] internal slot. - If arrayBuffer's [[ArrayBufferData]] internal slot is
null , returntrue . - Return
false .
24.1.1.3DetachArrayBuffer ( arrayBuffer )#
The abstract operation DetachArrayBuffer with argument arrayBuffer performs the following steps:
- Assert:
Type (arrayBuffer) is Object and it has [[ArrayBufferData]] and [[ArrayBufferByteLength]] internal slots. - Set arrayBuffer's [[ArrayBufferData]] internal slot to
null . - Set arrayBuffer's [[ArrayBufferByteLength]] internal slot to 0.
- Return
NormalCompletion (null ).
Detaching an ArrayBuffer instance disassociates the
24.1.1.4CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] )#
The abstract operation CloneArrayBuffer takes three parameters, an ArrayBuffer srcBuffer, an integer srcByteOffset and optionally a constructor function cloneConstructor. It creates a new ArrayBuffer whose data is a copy of srcBuffer's data starting at srcByteOffset. This operation performs the following steps:
- Assert:
Type (srcBuffer) is Object and it has an [[ArrayBufferData]] internal slot. - If cloneConstructor is not present, then
- Let cloneConstructor be ?
SpeciesConstructor (srcBuffer,%ArrayBuffer% ). - If
IsDetachedBuffer (srcBuffer) istrue , throw aTypeError exception.
- Let cloneConstructor be ?
- Else, Assert:
IsConstructor (cloneConstructor) istrue . - Let srcLength be the value of srcBuffer's [[ArrayBufferByteLength]] internal slot.
- Assert: srcByteOffset ≤ srcLength.
- Let cloneLength be srcLength - srcByteOffset.
- Let srcBlock be the value of srcBuffer's [[ArrayBufferData]] internal slot.
- Let targetBuffer be ?
AllocateArrayBuffer (cloneConstructor, cloneLength). - If
IsDetachedBuffer (srcBuffer) istrue , throw aTypeError exception. - Let targetBlock be the value of targetBuffer's [[ArrayBufferData]] internal slot.
- Perform
CopyDataBlockBytes (targetBlock, 0, srcBlock, srcByteOffset, cloneLength). - Return targetBuffer.
24.1.1.5GetValueFromBuffer ( arrayBuffer, byteIndex, type [ , isLittleEndian ] )#
The abstract operation GetValueFromBuffer takes four parameters, an ArrayBuffer arrayBuffer, an integer byteIndex, a String type, and optionally a Boolean isLittleEndian. This operation performs the following steps:
- Assert:
IsDetachedBuffer (arrayBuffer) isfalse . - Assert: There are sufficient bytes in arrayBuffer starting at byteIndex to represent a value of type.
- Assert: byteIndex is an integer value ≥ 0.
- Let block be arrayBuffer's [[ArrayBufferData]] internal slot.
- Let elementSize be the Number value of the Element Size value specified in
Table 50 for Element Type type. - Let rawValue be a
List of elementSize containing, in order, the elementSize sequence of bytes starting with block[byteIndex]. - If isLittleEndian is not present, set isLittleEndian to either
true orfalse . The choice is implementation dependent and should be the alternative that is most efficient for the implementation. An implementation must use the same value each time this step is executed and the same value must be used for the corresponding step in theSetValueInBuffer abstract operation. - If isLittleEndian is
false , reverse the order of the elements of rawValue. - If type is
"Float32", then- Let value be the byte elements of rawValue concatenated and interpreted as a little-endian bit string encoding of an IEEE 754-2008 binary32 value.
- If value is an IEEE 754-2008 binary32 NaN value, return the
NaN Number value. - Return the Number value that corresponds to value.
- If type is
"Float64", then- Let value be the byte elements of rawValue concatenated and interpreted as a little-endian bit string encoding of an IEEE 754-2008 binary64 value.
- If value is an IEEE 754-2008 binary64 NaN value, return the
NaN Number value. - Return the Number value that corresponds to value.
- If the first code unit of type is
"U", then- Let intValue be the byte elements of rawValue concatenated and interpreted as a bit string encoding of an unsigned little-endian binary number.
- Else,
- Let intValue be the byte elements of rawValue concatenated and interpreted as a bit string encoding of a binary little-endian 2's complement number of bit length elementSize × 8.
- Return the Number value that corresponds to intValue.
24.1.1.6SetValueInBuffer ( arrayBuffer, byteIndex, type, value [ , isLittleEndian ] )#
The abstract operation SetValueInBuffer takes five parameters, an ArrayBuffer arrayBuffer, an integer byteIndex, a String type, a Number value, and optionally a Boolean isLittleEndian. This operation performs the following steps:
- Assert:
IsDetachedBuffer (arrayBuffer) isfalse . - Assert: There are sufficient bytes in arrayBuffer starting at byteIndex to represent a value of type.
- Assert: byteIndex is an integer value ≥ 0.
- Assert:
Type (value) is Number. - Let block be arrayBuffer's [[ArrayBufferData]] internal slot.
- Assert: block is not
undefined . - If isLittleEndian is not present, set isLittleEndian to either
true orfalse . The choice is implementation dependent and should be the alternative that is most efficient for the implementation. An implementation must use the same value each time this step is executed and the same value must be used for the corresponding step in theGetValueFromBuffer abstract operation. - If type is
"Float32", then- Set rawBytes to a
List containing the 4 bytes that are the result of converting value to IEEE 754-2008 binary32 format using “Round to nearest, ties to even” rounding mode. If isLittleEndian isfalse , the bytes are arranged in big endian order. Otherwise, the bytes are arranged in little endian order. If value isNaN , rawValue may be set to any implementation chosen IEEE 754-2008 binary64 format Not-a-Number encoding. An implementation must always choose the same encoding for each implementation distinguishableNaN value.
- Set rawBytes to a
- Else, if type is
"Float64", then- Set rawBytes to a
List containing the 8 bytes that are the IEEE 754-2008 binary64 format encoding of value. If isLittleEndian isfalse , the bytes are arranged in big endian order. Otherwise, the bytes are arranged in little endian order. If value isNaN , rawValue may be set to any implementation chosen IEEE 754-2008 binary32 format Not-a-Number encoding. An implementation must always choose the same encoding for each implementation distinguishableNaN value.
- Set rawBytes to a
- Else,
- Let n be the Number value of the Element Size specified in
Table 50 for Element Type type. - Let convOp be the abstract operation named in the Conversion Operation column in
Table 50 for Element Type type. - Let intValue be convOp(value).
- If intValue ≥ 0, then
- Let rawBytes be a
List containing the n-byte binary encoding of intValue. If isLittleEndian isfalse , the bytes are ordered in big endian order. Otherwise, the bytes are ordered in little endian order.
- Let rawBytes be a
- Else,
- Let rawBytes be a
List containing the n-byte binary 2's complement encoding of intValue. If isLittleEndian isfalse , the bytes are ordered in big endian order. Otherwise, the bytes are ordered in little endian order.
- Let rawBytes be a
- Let n be the Number value of the Element Size specified in
- Store the individual bytes of rawBytes into block, in order, starting at block[byteIndex].
- Return
NormalCompletion (undefined ).
24.1.2The ArrayBuffer Constructor#
The ArrayBuffer constructor is the %ArrayBuffer% intrinsic object and the initial value of the ArrayBuffer property of the ArrayBuffer is not intended to be called as a function and will throw an exception when called in that manner.
The ArrayBuffer constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified ArrayBuffer behaviour must include a super call to the ArrayBuffer constructor to create and initialize subclass instances with the internal state necessary to support the ArrayBuffer.prototype built-in methods.
24.1.2.1ArrayBuffer ( length )#
ArrayBuffer called with argument length performs the following steps:
- If NewTarget is
undefined , throw aTypeError exception. - Let numberLength be ?
ToNumber (length). - Let byteLength be
ToLength (numberLength). - If
SameValueZero (numberLength, byteLength) isfalse , throw aRangeError exception. - Return ?
AllocateArrayBuffer (NewTarget, byteLength).
24.1.3Properties of the ArrayBuffer Constructor#
The value of the [[Prototype]] internal slot of the ArrayBuffer constructor is the intrinsic object
The ArrayBuffer constructor has the following properties:
24.1.3.1ArrayBuffer.isView ( arg )#
The isView function takes one argument arg, and performs, the following steps are taken:
- If
Type (arg) is not Object, returnfalse . - If arg has a [[ViewedArrayBuffer]] internal slot, return
true . - Return
false .
24.1.3.2ArrayBuffer.prototype#
The initial value of ArrayBuffer.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
24.1.3.3get ArrayBuffer [ @@species ]#
ArrayBuffer[@@species] is an accessor property whose set accessor function is
- Return the
this value.
The value of the name property of this function is "get [Symbol.species]".
ArrayBuffer prototype methods normally use their this object's constructor to create a derived object. However, a subclass constructor may over-ride that default behaviour by redefining its @@species property.
24.1.4Properties of the ArrayBuffer Prototype Object#
The ArrayBuffer prototype object is the intrinsic object %ArrayBufferPrototype%. The value of the [[Prototype]] internal slot of the ArrayBuffer prototype object is the intrinsic object
24.1.4.1get ArrayBuffer.prototype.byteLength#
ArrayBuffer.prototype.byteLength is an accessor property whose set accessor function is
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have an [[ArrayBufferData]] internal slot, throw a
TypeError exception. - If
IsDetachedBuffer (O) istrue , throw aTypeError exception. - Let length be the value of O's [[ArrayBufferByteLength]] internal slot.
- Return length.
24.1.4.2ArrayBuffer.prototype.constructor#
The initial value of ArrayBuffer.prototype.constructor is the intrinsic object
24.1.4.3ArrayBuffer.prototype.slice ( start, end )#
The following steps are taken:
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have an [[ArrayBufferData]] internal slot, throw a
TypeError exception. - If
IsDetachedBuffer (O) istrue , throw aTypeError exception. - Let len be the value of O's [[ArrayBufferByteLength]] internal slot.
- Let relativeStart be ?
ToInteger (start). - If relativeStart < 0, let first be
max ((len + relativeStart), 0); else let first bemin (relativeStart, len). - If end is
undefined , let relativeEnd be len; else let relativeEnd be ?ToInteger (end). - If relativeEnd < 0, let final be
max ((len + relativeEnd), 0); else let final bemin (relativeEnd, len). - Let newLen be
max (final-first, 0). - Let ctor be ?
SpeciesConstructor (O,%ArrayBuffer% ). - Let new be ?
Construct (ctor, « newLen »). - If new does not have an [[ArrayBufferData]] internal slot, throw a
TypeError exception. - If
IsDetachedBuffer (new) istrue , throw aTypeError exception. - If
SameValue (new, O) istrue , throw aTypeError exception. - If the value of new's [[ArrayBufferByteLength]] internal slot < newLen, throw a
TypeError exception. - NOTE: Side-effects of the above steps may have detached O.
- If
IsDetachedBuffer (O) istrue , throw aTypeError exception. - Let fromBuf be the value of O's [[ArrayBufferData]] internal slot.
- Let toBuf be the value of new's [[ArrayBufferData]] internal slot.
- Perform
CopyDataBlockBytes (toBuf, 0, fromBuf, first, newLen). - Return new.
24.1.4.4ArrayBuffer.prototype [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "ArrayBuffer".
This property has the attributes { [[Writable]]:
24.1.5Properties of the ArrayBuffer Instances#
ArrayBuffer instances inherit properties from the ArrayBuffer prototype object. ArrayBuffer instances each have an [[ArrayBufferData]] internal slot and an [[ArrayBufferByteLength]] internal slot.
ArrayBuffer instances whose [[ArrayBufferData]] is
24.2DataView Objects#
24.2.1Abstract Operations For DataView Objects#
24.2.1.1GetViewValue ( view, requestIndex, isLittleEndian, type )#
The abstract operation GetViewValue with arguments view, requestIndex, isLittleEndian, and type is used by functions on DataView instances is to retrieve values from the view's buffer. It performs the following steps:
- If
Type (view) is not Object, throw aTypeError exception. - If view does not have a [[DataView]] internal slot, throw a
TypeError exception. - Let numberIndex be ?
ToNumber (requestIndex). - Let getIndex be
ToInteger (numberIndex). - If numberIndex ≠ getIndex or getIndex < 0, throw a
RangeError exception. - Let isLittleEndian be
ToBoolean (isLittleEndian). - Let buffer be the value of view's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - Let viewOffset be the value of view's [[ByteOffset]] internal slot.
- Let viewSize be the value of view's [[ByteLength]] internal slot.
- Let elementSize be the Number value of the Element Size value specified in
Table 50 for Element Type type. - If getIndex + elementSize > viewSize, throw a
RangeError exception. - Let bufferIndex be getIndex + viewOffset.
- Return
GetValueFromBuffer (buffer, bufferIndex, type, isLittleEndian).
24.2.1.2SetViewValue ( view, requestIndex, isLittleEndian, type, value )#
The abstract operation SetViewValue with arguments view, requestIndex, isLittleEndian, type, and value is used by functions on DataView instances to store values into the view's buffer. It performs the following steps:
- If
Type (view) is not Object, throw aTypeError exception. - If view does not have a [[DataView]] internal slot, throw a
TypeError exception. - Let numberIndex be ?
ToNumber (requestIndex). - Let getIndex be
ToInteger (numberIndex). - If numberIndex ≠ getIndex or getIndex < 0, throw a
RangeError exception. - Let numberValue be ?
ToNumber (value). - Let isLittleEndian be
ToBoolean (isLittleEndian). - Let buffer be the value of view's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - Let viewOffset be the value of view's [[ByteOffset]] internal slot.
- Let viewSize be the value of view's [[ByteLength]] internal slot.
- Let elementSize be the Number value of the Element Size value specified in
Table 50 for Element Type type. - If getIndex + elementSize > viewSize, throw a
RangeError exception. - Let bufferIndex be getIndex + viewOffset.
- Return
SetValueInBuffer (buffer, bufferIndex, type, numberValue, isLittleEndian).
24.2.2The DataView Constructor#
The DataView constructor is the %DataView% intrinsic object and the initial value of the DataView property of the DataView is not intended to be called as a function and will throw an exception when called in that manner.
The DataView constructor is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified DataView behaviour must include a super call to the DataView constructor to create and initialize subclass instances with the internal state necessary to support the DataView.prototype built-in methods.
24.2.2.1DataView (buffer, byteOffset, byteLength )#
DataView called with arguments buffer, byteOffset, and byteLength performs the following steps:
- If NewTarget is
undefined , throw aTypeError exception. - If
Type (buffer) is not Object, throw aTypeError exception. - If buffer does not have an [[ArrayBufferData]] internal slot, throw a
TypeError exception. - Let numberOffset be ?
ToNumber (byteOffset). - Let offset be
ToInteger (numberOffset). - If numberOffset ≠ offset or offset < 0, throw a
RangeError exception. - If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - Let bufferByteLength be the value of buffer's [[ArrayBufferByteLength]] internal slot.
- If offset > bufferByteLength, throw a
RangeError exception. - If byteLength is
undefined , then- Let viewByteLength be bufferByteLength - offset.
- Else,
- Let viewByteLength be ?
ToLength (byteLength). - If offset+viewByteLength > bufferByteLength, throw a
RangeError exception.
- Let viewByteLength be ?
- Let O be ?
OrdinaryCreateFromConstructor (NewTarget,"%DataViewPrototype%", « [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] »). - Set O's [[DataView]] internal slot to
true . - Set O's [[ViewedArrayBuffer]] internal slot to buffer.
- Set O's [[ByteLength]] internal slot to viewByteLength.
- Set O's [[ByteOffset]] internal slot to offset.
- Return O.
24.2.3Properties of the DataView Constructor#
The value of the [[Prototype]] internal slot of the DataView constructor is the intrinsic object
The DataView constructor has the following properties:
24.2.3.1DataView.prototype#
The initial value of DataView.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
24.2.4Properties of the DataView Prototype Object#
The DataView prototype object is the intrinsic object %DataViewPrototype%. The value of the [[Prototype]] internal slot of the DataView prototype object is the intrinsic object
24.2.4.1get DataView.prototype.buffer#
DataView.prototype.buffer is an accessor property whose set accessor function is
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have a [[ViewedArrayBuffer]] internal slot, throw a
TypeError exception. - Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- Return buffer.
24.2.4.2get DataView.prototype.byteLength#
DataView.prototype.byteLength is an accessor property whose set accessor function is
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have a [[ViewedArrayBuffer]] internal slot, throw a
TypeError exception. - Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - Let size be the value of O's [[ByteLength]] internal slot.
- Return size.
24.2.4.3get DataView.prototype.byteOffset#
DataView.prototype.byteOffset is an accessor property whose set accessor function is
- Let O be the
this value. - If
Type (O) is not Object, throw aTypeError exception. - If O does not have a [[ViewedArrayBuffer]] internal slot, throw a
TypeError exception. - Let buffer be the value of O's [[ViewedArrayBuffer]] internal slot.
- If
IsDetachedBuffer (buffer) istrue , throw aTypeError exception. - Let offset be the value of O's [[ByteOffset]] internal slot.
- Return offset.
24.2.4.4DataView.prototype.constructor#
The initial value of DataView.prototype.constructor is the intrinsic object
24.2.4.5DataView.prototype.getFloat32 ( byteOffset [ , littleEndian ] )#
When the getFloat32 method is called with argument byteOffset and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
GetViewValue (v, byteOffset, littleEndian,"Float32").
24.2.4.6DataView.prototype.getFloat64 ( byteOffset [ , littleEndian ] )#
When the getFloat64 method is called with argument byteOffset and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
GetViewValue (v, byteOffset, littleEndian,"Float64").
24.2.4.7DataView.prototype.getInt8 ( byteOffset )#
When the getInt8 method is called with argument byteOffset, the following steps are taken:
- Let v be the
this value. - Return ?
GetViewValue (v, byteOffset,true ,"Int8").
24.2.4.8DataView.prototype.getInt16 ( byteOffset [ , littleEndian ] )#
When the getInt16 method is called with argument byteOffset and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
GetViewValue (v, byteOffset, littleEndian,"Int16").
24.2.4.9DataView.prototype.getInt32 ( byteOffset [ , littleEndian ] )#
When the getInt32 method is called with argument byteOffset and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
undefined . - Return ?
GetViewValue (v, byteOffset, littleEndian,"Int32").
24.2.4.10DataView.prototype.getUint8 ( byteOffset )#
When the getUint8 method is called with argument byteOffset, the following steps are taken:
- Let v be the
this value. - Return ?
GetViewValue (v, byteOffset,true ,"Uint8").
24.2.4.11DataView.prototype.getUint16 ( byteOffset [ , littleEndian ] )#
When the getUint16 method is called with argument byteOffset and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
GetViewValue (v, byteOffset, littleEndian,"Uint16").
24.2.4.12DataView.prototype.getUint32 ( byteOffset [ , littleEndian ] )#
When the getUint32 method is called with argument byteOffset and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
GetViewValue (v, byteOffset, littleEndian,"Uint32").
24.2.4.13DataView.prototype.setFloat32 ( byteOffset, value [ , littleEndian ] )#
When the setFloat32 method is called with arguments byteOffset and value and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
SetViewValue (v, byteOffset, littleEndian,"Float32", value).
24.2.4.14DataView.prototype.setFloat64 ( byteOffset, value [ , littleEndian ] )#
When the setFloat64 method is called with arguments byteOffset and value and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
SetViewValue (v, byteOffset, littleEndian,"Float64", value).
24.2.4.15DataView.prototype.setInt8 ( byteOffset, value )#
When the setInt8 method is called with arguments byteOffset and value, the following steps are taken:
- Let v be the
this value. - Return ?
SetViewValue (v, byteOffset,true ,"Int8", value).
24.2.4.16DataView.prototype.setInt16 ( byteOffset, value [ , littleEndian ] )#
When the setInt16 method is called with arguments byteOffset and value and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
SetViewValue (v, byteOffset, littleEndian,"Int16", value).
24.2.4.17DataView.prototype.setInt32 ( byteOffset, value [ , littleEndian ] )#
When the setInt32 method is called with arguments byteOffset and value and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
SetViewValue (v, byteOffset, littleEndian,"Int32", value).
24.2.4.18DataView.prototype.setUint8 ( byteOffset, value )#
When the setUint8 method is called with arguments byteOffset and value, the following steps are taken:
- Let v be the
this value. - Return ?
SetViewValue (v, byteOffset,true ,"Uint8", value).
24.2.4.19DataView.prototype.setUint16 ( byteOffset, value [ , littleEndian ] )#
When the setUint16 method is called with arguments byteOffset and value and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
SetViewValue (v, byteOffset, littleEndian,"Uint16", value).
24.2.4.20DataView.prototype.setUint32 ( byteOffset, value [ , littleEndian ] )#
When the setUint32 method is called with arguments byteOffset and value and optional argument littleEndian, the following steps are taken:
- Let v be the
this value. - If littleEndian is not present, let littleEndian be
false . - Return ?
SetViewValue (v, byteOffset, littleEndian,"Uint32", value).
24.2.4.21DataView.prototype [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "DataView".
This property has the attributes { [[Writable]]:
24.2.5Properties of DataView Instances#
DataView instances are ordinary objects that inherit properties from the DataView prototype object. DataView instances each have [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], and [[ByteOffset]] internal slots.
The value of the [[DataView]] internal slot is not used within this specification. The simple presence of that internal slot is used within the specification to identify objects created using the DataView constructor.
24.3The JSON Object#
The JSON object is the %JSON% intrinsic object and the initial value of the JSON property of the parse and stringify, that are used to parse and construct JSON texts. The JSON Data Interchange Format is defined in ECMA-404. The JSON interchange format used in this specification is exactly that described by ECMA-404.
Conforming implementations of JSON.parse and JSON.stringify must support the exact interchange format described in the ECMA-404 specification without any deletions or extensions to the format.
The value of the [[Prototype]] internal slot of the JSON object is the intrinsic object
The JSON object does not have a [[Construct]] internal method; it is not possible to use the JSON object as a constructor with the new operator.
The JSON object does not have a [[Call]] internal method; it is not possible to invoke the JSON object as a function.
24.3.1JSON.parse ( text [ , reviver ] )#
The parse function parses a JSON text (a JSON-formatted String) and produces an ECMAScript value. The JSON format is a subset of the syntax for ECMAScript literals, Array Initializers and Object Initializers. After parsing, JSON objects are realized as ECMAScript objects. JSON arrays are realized as ECMAScript Array instances. JSON strings, numbers, booleans, and null are realized as ECMAScript Strings, Numbers, Booleans, and
The optional reviver parameter is a function that takes two parameters, key and value. It can filter and transform the results. It is called with each of the key/value pairs produced by the parse, and its return value is used instead of the original value. If it returns what it received, the structure is not modified. If it returns
- Let JText be ?
ToString (text). - Parse JText interpreted as UTF-16 encoded Unicode points (
6.1.4 ) as a JSON text as specified in ECMA-404. Throw aSyntaxError exception if JText is not a valid JSON text as defined in that specification. - Let scriptText be the result of concatenating
"(", JText, and");". - Let completion be the result of parsing and evaluating scriptText as if it was the source text of an ECMAScript
Script , but using the alternative definition ofDoubleStringCharacter provided below. The extended PropertyDefinitionEvaluation semantics defined inB.3.1 must not be used during the evaluation. - Let unfiltered be completion.[[Value]].
- Assert: unfiltered will be either a primitive value or an object that is defined by either an
ArrayLiteral or anObjectLiteral . - If
IsCallable (reviver) istrue , then- Let root be
ObjectCreate (%ObjectPrototype% ). - Let rootName be the empty String.
- Let status be
CreateDataProperty (root, rootName, unfiltered). - Assert: status is
true . - Return ?
InternalizeJSONProperty (root, rootName).
- Let root be
- Else,
- Return unfiltered.
The length property of the parse function is 2.
JSON allows Unicode code units 0x2028 (LINE SEPARATOR) and 0x2029 (PARAGRAPH SEPARATOR) to directly appear in String literals without using an escape sequence. This is enabled by using the following alternative definition of
-
The SV of
is theDoubleStringCharacter :: SourceCharacter but not one of " or\ orU+0000 through U+001F UTF16Encoding of the code point value ofSourceCharacter .
The syntax of a valid JSON text is a subset of the ECMAScript
24.3.1.1Runtime Semantics: InternalizeJSONProperty( holder, name)#
The abstract operation InternalizeJSONProperty is a recursive abstract operation that takes two parameters: a holder object and the String name of a property in that object. InternalizeJSONProperty uses the value of reviver that was originally passed to the above parse function.
- Let val be ?
Get (holder, name). - If
Type (val) is Object, then- Let isArray be ?
IsArray (val). - If isArray is
true , then- Set I to 0.
- Let len be ?
ToLength (?Get (val,"length")). - Repeat while I < len,
- Let newElement be ?
InternalizeJSONProperty (val, !ToString (I)). - If newElement is
undefined , then- Perform ? val.[[Delete]](!
ToString (I)).
- Perform ? val.[[Delete]](!
- Else,
- Perform ?
CreateDataProperty (val, !ToString (I), newElement). - NOTE This algorithm intentionally does not throw an exception if
CreateDataProperty returnsfalse .
- Perform ?
- Add 1 to I.
- Let newElement be ?
- Else,
- Let keys be ?
EnumerableOwnNames (val). - For each String P in keys do,
- Let newElement be ?
InternalizeJSONProperty (val, P). - If newElement is
undefined , then- Perform ? val.[[Delete]](P).
- Else,
- Perform ?
CreateDataProperty (val, P, newElement). - NOTE This algorithm intentionally does not throw an exception if
CreateDataProperty returnsfalse .
- Perform ?
- Let newElement be ?
- Let keys be ?
- Let isArray be ?
- Return ?
Call (reviver, holder, « name, val »).
It is not permitted for a conforming implementation of JSON.parse to extend the JSON grammars. If an implementation wishes to support a modified or extended JSON interchange format it must do so by defining a different parse function.
In the case where there are duplicate name Strings within an object, lexically preceding values for the same key shall be overwritten.
24.3.2JSON.stringify ( value [ , replacer [ , space ] ] )#
The stringify function returns a String in UTF-16 encoded JSON format representing an ECMAScript value. It can take three parameters. The value parameter is an ECMAScript value, which is usually an object or array, although it can also be a String, Boolean, Number or
These are the steps in stringifying an object:
- Let stack be a new empty
List . - Let indent be the empty String.
- Let PropertyList and ReplacerFunction be
undefined . - If
Type (replacer) is Object, then- If
IsCallable (replacer) istrue , then- Let ReplacerFunction be replacer.
- Else,
- Let isArray be ?
IsArray (replacer). - If isArray is
true , then- Let PropertyList be a new empty
List . - Let len be ?
ToLength (?Get (replacer,"length")). - Let k be 0.
- Repeat while k<len,
- Let v be ?
Get (replacer, !ToString (k)). - Let item be
undefined . - If
Type (v) is String, let item be v. - Else if
Type (v) is Number, let item be !ToString (v). - Else if
Type (v) is Object, then- If v has a [[StringData]] or [[NumberData]] internal slot, let item be ?
ToString (v).
- If v has a [[StringData]] or [[NumberData]] internal slot, let item be ?
- If item is not
undefined and item is not currently an element of PropertyList, then- Append item to the end of PropertyList.
- Let k be k+1.
- Let v be ?
- Let PropertyList be a new empty
- Let isArray be ?
- If
- If
Type (space) is Object, then - If
Type (space) is Number, then - Else if
Type (space) is String, then- If the number of elements in space is 10 or less, set gap to space; otherwise set gap to a String consisting of the first 10 elements of space.
- Else,
- Set gap to the empty String.
- Let wrapper be
ObjectCreate (%ObjectPrototype% ). - Let status be
CreateDataProperty (wrapper, the empty String, value). - Assert: status is
true . - Return ?
SerializeJSONProperty (the empty String, wrapper).
The length property of the stringify function is 3.
JSON structures are allowed to be nested to any depth, but they must be acyclic. If value is or contains a cyclic structure, then the stringify function must throw a
a = [];
a[0] = a;
my_text = JSON.stringify(a); // This must throw a TypeError.
Symbolic primitive values are rendered as follows:
-
The
null value is rendered in JSON text as the Stringnull. -
The
undefined value is not rendered. -
The
true value is rendered in JSON text as the Stringtrue. -
The
false value is rendered in JSON text as the Stringfalse.
String values are wrapped in QUOTATION MARK (") code units. The code units " and \ are escaped with \ prefixes. Control characters code units are replaced with escape sequences \uHHHH, or with the shorter forms, \b (BACKSPACE), \f (FORM FEED), \n (LINE FEED), \r (CARRIAGE RETURN), \t (CHARACTER TABULATION).
Finite numbers are stringified as if by calling null.
Values that do not have a JSON representation (such as null. In objects an unrepresentable value causes the property to be excluded from stringification.
An object is rendered as U+007B (LEFT CURLY BRACKET) followed by zero or more properties, separated with a U+002C (COMMA), closed with a U+007D (RIGHT CURLY BRACKET). A property is a quoted String representing the key or property name, a U+003A (COLON), and then the stringified property value. An array is rendered as an opening U+005B (LEFT SQUARE BRACKET followed by zero or more values, separated with a U+002C (COMMA), closed with a U+005D (RIGHT SQUARE BRACKET).
24.3.2.1Runtime Semantics: SerializeJSONProperty ( key, holder )#
The abstract operation SerializeJSONProperty with arguments key, and holder has access to ReplacerFunction from the invocation of the stringify method. Its algorithm is as follows:
- Let value be ?
Get (holder, key). - If
Type (value) is Object, then- Let toJSON be ?
Get (value,"toJSON"). - If
IsCallable (toJSON) istrue , then- Let value be ?
Call (toJSON, value, « key »).
- Let value be ?
- Let toJSON be ?
- If ReplacerFunction is not
undefined , then- Let value be ?
Call (ReplacerFunction, holder, « key, value »).
- Let value be ?
- If
Type (value) is Object, then - If value is
null , return"null". - If value is
true , return"true". - If value is
false , return"false". - If
Type (value) is String, returnQuoteJSONString (value). - If
Type (value) is Number, then- If value is finite, return !
ToString (value). - Else, return
"null".
- If value is finite, return !
- If
Type (value) is Object andIsCallable (value) isfalse , then- Let isArray be ?
IsArray (value). - If isArray is
true , return ?SerializeJSONArray (value). - Else, return ?
SerializeJSONObject (value).
- Let isArray be ?
- Return
undefined .
24.3.2.2Runtime Semantics: QuoteJSONString ( value )#
The abstract operation QuoteJSONString with argument value wraps a String value in QUOTATION MARK code units and escapes certain other code units within it.
- Let product be code unit 0x0022 (QUOTATION MARK).
- For each code unit C in value
- If C is 0x0022 (QUOTATION MARK) or 0x005C (REVERSE SOLIDUS), then
- Let product be the concatenation of product and code unit 0x005C (REVERSE SOLIDUS).
- Let product be the concatenation of product and C.
- Else if C is 0x0008 (BACKSPACE), 0x000C (FORM FEED), 0x000A (LINE FEED), 0x000D (CARRIAGE RETURN), or 0x0009 (CHARACTER TABULATION), then
- Let product be the concatenation of product and code unit 0x005C (REVERSE SOLIDUS).
- Let abbrev be the String value corresponding to the value of C as follows:
BACKSPACE "b"FORM FEED (FF) "f"LINE FEED (LF) "n"CARRIAGE RETURN (CR) "r"CHARACTER TABULATION "t" - Let product be the concatenation of product and abbrev.
- Else if C has a code unit value less than 0x0020 (SPACE), then
- Let product be the concatenation of product and code unit 0x005C (REVERSE SOLIDUS).
- Let product be the concatenation of product and
"u". - Let hex be the string result of converting the numeric code unit value of C to a String of four hexadecimal digits. Alphabetic hexadecimal digits are presented as lowercase Latin letters.
- Let product be the concatenation of product and hex.
- Else,
- Let product be the concatenation of product and C.
- If C is 0x0022 (QUOTATION MARK) or 0x005C (REVERSE SOLIDUS), then
- Let product be the concatenation of product and code unit 0x0022 (QUOTATION MARK).
- Return product.
24.3.2.3Runtime Semantics: SerializeJSONObject ( value )#
The abstract operation SerializeJSONObject with argument value serializes an object. It has access to the stack, indent, gap, and PropertyList values of the current invocation of the stringify method.
- If stack contains value, throw a
TypeError exception because the structure is cyclical. - Append value to stack.
- Let stepback be indent.
- Let indent be the concatenation of indent and gap.
- If PropertyList is not
undefined , then- Let K be PropertyList.
- Else,
- Let K be ?
EnumerableOwnNames (value).
- Let K be ?
- Let partial be a new empty
List . - For each element P of K,
- Let strP be ?
SerializeJSONProperty (P, value). - If strP is not
undefined , then- Let member be
QuoteJSONString (P). - Let member be the concatenation of member and the string
":". - If gap is not the empty String, then
- Let member be the concatenation of member and code unit 0x0020 (SPACE).
- Let member be the concatenation of member and strP.
- Append member to partial.
- Let member be
- Let strP be ?
- If partial is empty, then
- Let final be
"{}".
- Let final be
- Else,
- If gap is the empty String, then
- Let properties be a String formed by concatenating all the element Strings of partial with each adjacent pair of Strings separated with code unit 0x002C (COMMA). A comma is not inserted either before the first String or after the last String.
- Let final be the result of concatenating
"{", properties, and"}".
- Else gap is not the empty String
- Let separator be the result of concatenating code unit 0x002C (COMMA), code unit 0x000A (LINE FEED), and indent.
- Let properties be a String formed by concatenating all the element Strings of partial with each adjacent pair of Strings separated with separator. The separator String is not inserted either before the first String or after the last String.
- Let final be the result of concatenating
"{", code unit 0x000A (LINE FEED), indent, properties, code unit 0x000A (LINE FEED), stepback, and"}".
- If gap is the empty String, then
- Remove the last element of stack.
- Let indent be stepback.
- Return final.
24.3.2.4Runtime Semantics: SerializeJSONArray ( value )#
The abstract operation SerializeJSONArray with argument value serializes an array. It has access to the stack, indent, and gap values of the current invocation of the stringify method.
- If stack contains value, throw a
TypeError exception because the structure is cyclical. - Append value to stack.
- Let stepback be indent.
- Let indent be the concatenation of indent and gap.
- Let partial be a new empty
List . - Let len be ?
ToLength (?Get (value,"length")). - Let index be 0.
- Repeat while index < len
- Let strP be ?
SerializeJSONProperty (!ToString (index), value). - If strP is
undefined , then- Append
"null"to partial.
- Append
- Else,
- Append strP to partial.
- Increment index by 1.
- Let strP be ?
- If partial is empty, then
- Let final be
"[]".
- Let final be
- Else,
- If gap is the empty String, then
- Let properties be a String formed by concatenating all the element Strings of partial with each adjacent pair of Strings separated with code unit 0x002C (COMMA). A comma is not inserted either before the first String or after the last String.
- Let final be the result of concatenating
"[", properties, and"]".
- Else,
- Let separator be the result of concatenating code unit 0x002C (COMMA), code unit 0x000A (LINE FEED), and indent.
- Let properties be a String formed by concatenating all the element Strings of partial with each adjacent pair of Strings separated with separator. The separator String is not inserted either before the first String or after the last String.
- Let final be the result of concatenating
"[", code unit 0x000A (LINE FEED), indent, properties, code unit 0x000A (LINE FEED), stepback, and"]".
- If gap is the empty String, then
- Remove the last element of stack.
- Let indent be stepback.
- Return final.
The representation of arrays includes only the elements between zero and array.length - 1
24.3.3JSON [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "JSON".
This property has the attributes { [[Writable]]:
25Control Abstraction Objects#
25.1Iteration#
25.1.1Common Iteration Interfaces#
An interface is a set of property keys whose associated values match a specific specification. Any object that provides all the properties as described by an interface's specification conforms to that interface. An interface is not represented by a distinct object. There may be many separately implemented objects that conform to any interface. An individual object may conform to multiple interfaces.
25.1.1.1The Iterable Interface#
The Iterable interface includes the property described in
| Property | Value | Requirements |
|---|---|---|
@@iterator
|
A function that returns an Iterator object. | The returned object must conform to the Iterator interface. |
25.1.1.2The Iterator Interface#
An object that implements the Iterator interface must include the property in
| Property | Value | Requirements |
|---|---|---|
next
|
A function that returns an IteratorResult object. |
The returned object must conform to the IteratorResult interface. If a previous call to the next method of an Iterator has returned an IteratorResult object whose done property is next method of that object should also return an IteratorResult object whose done property is |
Arguments may be passed to the next function but their interpretation and validity is dependent upon the target Iterator. The for-of statement and other common users of Iterators do not pass any arguments, so Iterator objects that expect to be used in such a manner must be prepared to deal with being called with no arguments.
| Property | Value | Requirements |
|---|---|---|
return
|
A function that returns an IteratorResult object. |
The returned object must conform to the IteratorResult interface. Invoking this method notifies the Iterator object that the caller does not intend to make any more next method calls to the Iterator. The returned IteratorResult object will typically have a done property whose value is value property with the value passed as the argument of the return method. However, this requirement is not enforced.
|
throw
|
A function that returns an IteratorResult object. |
The returned object must conform to the IteratorResult interface. Invoking this method notifies the Iterator object that the caller has detected an error condition. The argument may be used to identify the error condition and typically will be an exception object. A typical response is to throw the value passed as the argument. If the method does not throw, the returned IteratorResult object will typically have a done property whose value is |
Typically callers of these methods should check for their existence before invoking them. Certain ECMAScript language features including for-of, yield*, and array destructuring call these methods after performing an existence check. Most ECMAScript library functions that accept Iterable objects as arguments also conditionally call them.
25.1.1.3The IteratorResult Interface#
The IteratorResult interface includes the properties listed in
| Property | Value | Requirements |
|---|---|---|
done
|
Either |
This is the result status of an iterator next method call. If the end of the iterator was reached done is done is done property (either own or inherited) does not exist, it is consider to have the value |
value
|
Any |
If done is value is value property may be absent from the conforming object if it does not inherit an explicit value property.
|
25.1.2The %IteratorPrototype% Object#
The value of the [[Prototype]] internal slot of the %IteratorPrototype% object is the intrinsic object
All objects defined in this specification that implement the Iterator interface also inherit from %IteratorPrototype%. ECMAScript code may also define objects that inherit from %IteratorPrototype%.The %IteratorPrototype% object provides a place where additional methods that are applicable to all iterator objects may be added.
The following expression is one way that ECMAScript code can access the %IteratorPrototype% object:
Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))
25.1.2.1%IteratorPrototype% [ @@iterator ] ( )#
The following steps are taken:
- Return the
this value.
The value of the name property of this function is "[Symbol.iterator]".
25.2GeneratorFunction Objects#
Generator Function objects are functions that are usually created by evaluating
25.2.1The GeneratorFunction Constructor#
The GeneratorFunction constructor is the %GeneratorFunction% intrinsic. When GeneratorFunction is called as a function rather than as a constructor, it creates and initializes a new GeneratorFunction object. Thus the function call GeneratorFunction (…) is equivalent to the object creation expression new GeneratorFunction (…) with the same arguments.
GeneratorFunction is designed to be subclassable. It may be used as the value of an extends clause of a class definition. Subclass constructors that intend to inherit the specified GeneratorFunction behaviour must include a super call to the GeneratorFunction constructor to create and initialize subclass instances with the internal slots necessary for built-in GeneratorFunction behaviour. All ECMAScript syntactic forms for defining generator function objects create direct instances of GeneratorFunction. There is no syntactic means to create instances of GeneratorFunction subclasses.
25.2.1.1GeneratorFunction (p1, p2, … , pn, body)#
The last argument specifies the body (executable code) of a generator function; any preceding arguments specify formal parameters.
When the GeneratorFunction function is called with some arguments p1, p2, … , pn, body (where n might be 0, that is, there are no “p” arguments, and where body might also not be provided), the following steps are taken:
- Let C be the
active function object . - Let args be the argumentsList that was passed to this function by [[Call]] or [[Construct]].
- Return ?
CreateDynamicFunction (C, NewTarget,"generator", args).
See NOTE for
25.2.2Properties of the GeneratorFunction Constructor#
The GeneratorFunction constructor is a standard built-in function object that inherits from the Function constructor. The value of the [[Prototype]] internal slot of the GeneratorFunction constructor is the intrinsic object
The value of the [[Extensible]] internal slot of the GeneratorFunction constructor is
The value of the name property of the GeneratorFunction is "GeneratorFunction".
The GeneratorFunction constructor has the following properties:
25.2.2.1GeneratorFunction.length#
This is a data property with a value of 1. This property has the attributes { [[Writable]]:
25.2.2.2GeneratorFunction.prototype#
The initial value of GeneratorFunction.prototype is the intrinsic object %Generator%.
This property has the attributes { [[Writable]]:
25.2.3Properties of the GeneratorFunction Prototype Object#
The GeneratorFunction prototype object is an ordinary object. It is not a function object and does not have an [[ECMAScriptCode]] internal slot or any other of the internal slots listed in
The value of the [[Prototype]] internal slot of the GeneratorFunction prototype object is the
25.2.3.1GeneratorFunction.prototype.constructor#
The initial value of GeneratorFunction.prototype.constructor is the intrinsic object
This property has the attributes { [[Writable]]:
25.2.3.2GeneratorFunction.prototype.prototype#
The value of GeneratorFunction.prototype.prototype is the
This property has the attributes { [[Writable]]:
25.2.3.3GeneratorFunction.prototype [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "GeneratorFunction".
This property has the attributes { [[Writable]]:
25.2.4GeneratorFunction Instances#
Every GeneratorFunction instance is an ECMAScript function object and has the internal slots listed in "generator".
Each GeneratorFunction instance has the following own properties:
25.2.4.1length#
The value of the length property is an integer that indicates the typical number of arguments expected by the GeneratorFunction. However, the language permits the function to be invoked with some other number of arguments. The behaviour of a GeneratorFunction when invoked on a number of arguments other than the number specified by its length property depends on the function.
This property has the attributes { [[Writable]]:
25.2.4.2name#
The specification for the name property of Function instances given in
25.2.4.3prototype#
Whenever a GeneratorFunction instance is created another ordinary object is also created and is the initial value of the generator function's prototype property. The value of the prototype property is used to initialize the [[Prototype]] internal slot of a newly created Generator object when the generator function object is invoked using [[Call]].
This property has the attributes { [[Writable]]:
Unlike function instances, the object that is the value of the a GeneratorFunction's prototype property does not have a constructor property whose value is the GeneratorFunction instance.
25.3Generator Objects#
A Generator object is an instance of a generator function and conforms to both the Iterator and Iterable interfaces.
Generator instances directly inherit properties from the object that is the value of the prototype property of the Generator function that created the instance. Generator instances indirectly inherit properties from the Generator Prototype intrinsic,
25.3.1Properties of Generator Prototype#
The Generator prototype object is the %GeneratorPrototype% intrinsic. It is also the initial value of the prototype property of the %Generator% intrinsic (the GeneratorFunction.prototype).
The Generator prototype is an ordinary object. It is not a Generator instance and does not have a [[GeneratorState]] internal slot.
The value of the [[Prototype]] internal slot of the Generator prototype object is the intrinsic object
All Generator instances indirectly inherit properties of the Generator prototype object.
25.3.1.1Generator.prototype.constructor#
The initial value of Generator.prototype.constructor is the intrinsic object %Generator%.
This property has the attributes { [[Writable]]:
25.3.1.2Generator.prototype.next ( value )#
The next method performs the following steps:
- Let g be the
this value. - Return ?
GeneratorResume (g, value).
25.3.1.3Generator.prototype.return ( value )#
The return method performs the following steps:
- Let g be the
this value. - Let C be
Completion {[[Type]]:return , [[Value]]: value, [[Target]]:empty }. - Return ?
GeneratorResumeAbrupt (g, C).
25.3.1.4Generator.prototype.throw ( exception )#
The throw method performs the following steps:
- Let g be the
this value. - Let C be
Completion {[[Type]]:throw , [[Value]]: exception, [[Target]]:empty }. - Return ?
GeneratorResumeAbrupt (g, C).
25.3.1.5Generator.prototype [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "Generator".
This property has the attributes { [[Writable]]:
25.3.2Properties of Generator Instances#
Generator instances are initially created with the internal slots described in
| Internal Slot | Description |
|---|---|
| [[GeneratorState]] |
The current execution state of the generator. The possible values are: "suspendedStart", "suspendedYield", "executing", and "completed".
|
| [[GeneratorContext]] |
The |
25.3.3Generator Abstract Operations#
25.3.3.1GeneratorStart (generator, generatorBody)#
The abstract operation GeneratorStart with arguments generator and generatorBody performs the following steps:
- Assert: The value of generator's [[GeneratorState]] internal slot is
undefined . - Let genContext be the
running execution context . - Set the Generator component of genContext to generator.
- Set the code evaluation state of genContext such that when evaluation is resumed for that
execution context the following steps will be performed:- Let result be the result of evaluating generatorBody.
- Assert: If we return here, the generator either threw an exception or performed either an implicit or explicit return.
- Remove genContext from the
execution context stack and restore theexecution context that is at the top of theexecution context stack as therunning execution context . - Set generator's [[GeneratorState]] internal slot to
"completed". - Once a generator enters the
"completed"state it never leaves it and its associatedexecution context is never resumed. Any execution state associated with generator can be discarded at this point. - If result is a normal completion, let resultValue be
undefined . - Else,
- If result.[[Type]] is
return , let resultValue be result.[[Value]]. - Else, return
Completion (result).
- If result.[[Type]] is
- Return
CreateIterResultObject (resultValue,true ).
- Set generator's [[GeneratorContext]] internal slot to genContext.
- Set generator's [[GeneratorState]] internal slot to
"suspendedStart". - Return
NormalCompletion (undefined ).
25.3.3.2GeneratorValidate ( generator )#
The abstract operation GeneratorValidate with argument generator performs the following steps:
- If
Type (generator) is not Object, throw aTypeError exception. - If generator does not have a [[GeneratorState]] internal slot, throw a
TypeError exception. - Assert: generator also has a [[GeneratorContext]] internal slot.
- Let state be the value of generator's [[GeneratorState]] internal slot.
- If state is
"executing", throw aTypeError exception. - Return state.
25.3.3.3GeneratorResume ( generator, value )#
The abstract operation GeneratorResume with arguments generator and value performs the following steps:
- Let state be ?
GeneratorValidate (generator). - If state is
"completed", returnCreateIterResultObject (undefined ,true ). - Assert: state is either
"suspendedStart"or"suspendedYield". - Let genContext be the value of generator's [[GeneratorContext]] internal slot.
- Let methodContext be the
running execution context . - Suspend methodContext.
- Set generator's [[GeneratorState]] internal slot to
"executing". - Push genContext onto the
execution context stack ; genContext is now therunning execution context . - Resume the suspended evaluation of genContext using
NormalCompletion (value) as the result of the operation that suspended it. Let result be the value returned by the resumed computation. - Assert: When we return here, genContext has already been removed from the
execution context stack and methodContext is the currentlyrunning execution context . - Return
Completion (result).
25.3.3.4GeneratorResumeAbrupt (generator, abruptCompletion)#
The abstract operation GeneratorResumeAbrupt with arguments generator and abruptCompletion performs the following steps:
- Let state be ?
GeneratorValidate (generator). - If state is
"suspendedStart", then- Set generator's [[GeneratorState]] internal slot to
"completed". - Once a generator enters the
"completed"state it never leaves it and its associatedexecution context is never resumed. Any execution state associated with generator can be discarded at this point. - Let state be
"completed".
- Set generator's [[GeneratorState]] internal slot to
- If state is
"completed", then- If abruptCompletion.[[Type]] is
return , then- Return
CreateIterResultObject (abruptCompletion.[[Value]],true ).
- Return
- Return
Completion (abruptCompletion).
- If abruptCompletion.[[Type]] is
- Assert: state is
"suspendedYield". - Let genContext be the value of generator's [[GeneratorContext]] internal slot.
- Let methodContext be the
running execution context . - Suspend methodContext.
- Set generator's [[GeneratorState]] internal slot to
"executing". - Push genContext onto the
execution context stack ; genContext is now therunning execution context . - Resume the suspended evaluation of genContext using abruptCompletion as the result of the operation that suspended it. Let result be the completion record returned by the resumed computation.
- Assert: When we return here, genContext has already been removed from the
execution context stack and methodContext is the currentlyrunning execution context . - Return
Completion (result).
25.3.3.5GeneratorYield ( iterNextObj )#
The abstract operation GeneratorYield with argument iterNextObj performs the following steps:
- Assert: iterNextObj is an Object that implements the IteratorResult interface.
- Let genContext be the
running execution context . - Assert: genContext is the
execution context of a generator. - Let generator be the value of the Generator component of genContext.
- Set the value of generator's [[GeneratorState]] internal slot to
"suspendedYield". - Remove genContext from the
execution context stack and restore theexecution context that is at the top of theexecution context stack as therunning execution context . - Set the code evaluation state of genContext such that when evaluation is resumed with a
Completion resumptionValue the following steps will be performed:- Return resumptionValue.
- NOTE: This returns to the evaluation of the
YieldExpression production that originally called this abstract operation.
- Return
NormalCompletion (iterNextObj). - NOTE: This returns to the evaluation of the operation that had most previously resumed evaluation of genContext.
25.4Promise Objects#
A Promise is an object that is used as a placeholder for the eventual results of a deferred (and possibly asynchronous) computation.
Any Promise object is in one of three mutually exclusive states: fulfilled, rejected, and pending:
-
A promise
pis fulfilled ifp.then(f, r)will immediately enqueue a Job to call the functionf. -
A promise
pis rejected ifp.then(f, r)will immediately enqueue a Job to call the functionr. - A promise is pending if it is neither fulfilled nor rejected.
A promise is said to be settled if it is not pending, i.e. if it is either fulfilled or rejected.
A promise is resolved if it is settled or if it has been “locked in” to match the state of another promise. Attempting to resolve or reject a resolved promise has no effect. A promise is unresolved if it is not resolved. An unresolved promise is always in the pending state. A resolved promise may be pending, fulfilled or rejected.
25.4.1Promise Abstract Operations#
25.4.1.1PromiseCapability Records#
A PromiseCapability is a
PromiseCapability Records have the fields listed in
| Field Name | Value | Meaning |
|---|---|---|
| [[Promise]] | An object | An object that is usable as a promise. |
| [[Resolve]] | A function object | The function that is used to resolve the given promise object. |
| [[Reject]] | A function object | The function that is used to reject the given promise object. |
25.4.1.1.1IfAbruptRejectPromise ( value, capability )#
IfAbruptRejectPromise is a short hand for a sequence of algorithm steps that use a PromiseCapability record. An algorithm step of the form:
IfAbruptRejectPromise (value, capability).
means the same thing as:
- If value is an
abrupt completion , then- Perform ?
Call (capability.[[Reject]],undefined , « value.[[Value]] »). - Return capability.[[Promise]].
- Perform ?
- Else if value is a
Completion Record , let value be value.[[Value]].
25.4.1.2PromiseReaction Records#
The PromiseReaction is a
PromiseReaction records have the fields listed in
| Field Name | Value | Meaning |
|---|---|---|
| [[Capabilities]] | A PromiseCapability record | The capabilities of the promise for which this record provides a reaction handler. |
| [[Handler]] | A function object or a String |
The function that should be applied to the incoming value, and whose return value will govern what happens to the derived promise. If [[Handler]] is "Identity" it is equivalent to a function that simply returns its first argument. If [[Handler]] is "Thrower" it is equivalent to a function that throws its first argument as an exception.
|
25.4.1.3CreateResolvingFunctions ( promise )#
When CreateResolvingFunctions is performed with argument promise, the following steps are taken:
- Let alreadyResolved be a new
Record { [[Value]]:false }. - Let resolve be a new built-in function object as defined in Promise Resolve Functions (
25.4.1.3.2 ). - Set the [[Promise]] internal slot of resolve to promise.
- Set the [[AlreadyResolved]] internal slot of resolve to alreadyResolved.
- Let reject be a new built-in function object as defined in Promise Reject Functions (
25.4.1.3.1 ). - Set the [[Promise]] internal slot of reject to promise.
- Set the [[AlreadyResolved]] internal slot of reject to alreadyResolved.
- Return a new
Record { [[Resolve]]: resolve, [[Reject]]: reject }.
25.4.1.3.1Promise Reject Functions#
A promise reject function is an anonymous built-in function that has [[Promise]] and [[AlreadyResolved]] internal slots.
When a promise reject function F is called with argument reason, the following steps are taken:
- Assert: F has a [[Promise]] internal slot whose value is an Object.
- Let promise be the value of F's [[Promise]] internal slot.
- Let alreadyResolved be the value of F's [[AlreadyResolved]] internal slot.
- If alreadyResolved.[[Value]] is
true , returnundefined . - Set alreadyResolved.[[Value]] to
true . - Return
RejectPromise (promise, reason).
The length property of a promise reject function is 1.
25.4.1.3.2Promise Resolve Functions#
A promise resolve function is an anonymous built-in function that has [[Promise]] and [[AlreadyResolved]] internal slots.
When a promise resolve function F is called with argument resolution, the following steps are taken:
- Assert: F has a [[Promise]] internal slot whose value is an Object.
- Let promise be the value of F's [[Promise]] internal slot.
- Let alreadyResolved be the value of F's [[AlreadyResolved]] internal slot.
- If alreadyResolved.[[Value]] is
true , returnundefined . - Set alreadyResolved.[[Value]] to
true . - If
SameValue (resolution, promise) istrue , then- Let selfResolutionError be a newly created
TypeError object. - Return
RejectPromise (promise, selfResolutionError).
- Let selfResolutionError be a newly created
- If
Type (resolution) is not Object, then- Return
FulfillPromise (promise, resolution).
- Return
- Let then be
Get (resolution,"then"). - If then is an
abrupt completion , then- Return
RejectPromise (promise, then.[[Value]]).
- Return
- Let thenAction be then.[[Value]].
- If
IsCallable (thenAction) isfalse , then- Return
FulfillPromise (promise, resolution).
- Return
- Perform
EnqueueJob ("PromiseJobs",PromiseResolveThenableJob , « promise, resolution, thenAction »). - Return
undefined .
The length property of a promise resolve function is 1.
25.4.1.4FulfillPromise ( promise, value)#
When the FulfillPromise abstract operation is called with arguments promise and value, the following steps are taken:
- Assert: the value of promise's [[PromiseState]] internal slot is
"pending". - Let reactions be the value of promise's [[PromiseFulfillReactions]] internal slot.
- Set the value of promise's [[PromiseResult]] internal slot to value.
- Set the value of promise's [[PromiseFulfillReactions]] internal slot to
undefined . - Set the value of promise's [[PromiseRejectReactions]] internal slot to
undefined . - Set the value of promise's [[PromiseState]] internal slot to
"fulfilled". - Return
TriggerPromiseReactions (reactions, value).
25.4.1.5NewPromiseCapability ( C )#
The abstract operation NewPromiseCapability takes a constructor function, and attempts to use that constructor function in the fashion of the built-in Promise constructor to create a Promise object and extract its resolve and reject functions. The promise plus the resolve and reject functions are used to initialize a new PromiseCapability record which is returned as the value of this abstract operation.
- If
IsConstructor (C) isfalse , throw aTypeError exception. - NOTE C is assumed to be a constructor function that supports the parameter conventions of the
Promiseconstructor (see25.4.3.1 ). - Let promiseCapability be a new PromiseCapability { [[Promise]]:
undefined , [[Resolve]]:undefined , [[Reject]]:undefined }. - Let executor be a new built-in function object as defined in GetCapabilitiesExecutor Functions (
25.4.1.5.1 ). - Set the [[Capability]] internal slot of executor to promiseCapability.
- Let promise be ?
Construct (C, « executor »). - If
IsCallable (promiseCapability.[[Resolve]]) isfalse , throw aTypeError exception. - If
IsCallable (promiseCapability.[[Reject]]) isfalse , throw aTypeError exception. - Set promiseCapability.[[Promise]] to promise.
- Return promiseCapability.
This abstract operation supports Promise subclassing, as it is generic on any constructor that calls a passed executor function argument in the same way as the Promise constructor. It is used to generalize static methods of the Promise constructor to any subclass.
25.4.1.5.1GetCapabilitiesExecutor Functions#
A GetCapabilitiesExecutor function is an anonymous built-in function that has a [[Capability]] internal slot.
When a GetCapabilitiesExecutor function F is called with arguments resolve and reject, the following steps are taken:
- Assert: F has a [[Capability]] internal slot whose value is a PromiseCapability
Record . - Let promiseCapability be the value of F's [[Capability]] internal slot.
- If promiseCapability.[[Resolve]] is not
undefined , throw aTypeError exception. - If promiseCapability.[[Reject]] is not
undefined , throw aTypeError exception. - Set promiseCapability.[[Resolve]] to resolve.
- Set promiseCapability.[[Reject]] to reject.
- Return
undefined .
The length property of a GetCapabilitiesExecutor function is 2.
25.4.1.6IsPromise ( x )#
The abstract operation IsPromise checks for the promise brand on an object.
- If
Type (x) is not Object, returnfalse . - If x does not have a [[PromiseState]] internal slot, return
false . - Return
true .
25.4.1.7RejectPromise ( promise, reason )#
When the RejectPromise abstract operation is called with arguments promise and reason, the following steps are taken:
- Assert: the value of promise's [[PromiseState]] internal slot is
"pending". - Let reactions be the value of promise's [[PromiseRejectReactions]] internal slot.
- Set the value of promise's [[PromiseResult]] internal slot to reason.
- Set the value of promise's [[PromiseFulfillReactions]] internal slot to
undefined . - Set the value of promise's [[PromiseRejectReactions]] internal slot to
undefined . - Set the value of promise's [[PromiseState]] internal slot to
"rejected". - If the value of promise's [[PromiseIsHandled]] internal slot is
false , performHostPromiseRejectionTracker (promise,"reject"). - Return
TriggerPromiseReactions (reactions, reason).
25.4.1.8TriggerPromiseReactions ( reactions, argument )#
The abstract operation TriggerPromiseReactions takes a collection of PromiseReactionRecords and enqueues a new Job for each record. Each such Job processes the [[Handler]] of the PromiseReactionRecord, and if the [[Handler]] is a function calls it passing the given argument.
- Repeat for each reaction in reactions, in original insertion order
- Perform
EnqueueJob ("PromiseJobs",PromiseReactionJob , « reaction, argument »).
- Perform
- Return
undefined .
25.4.1.9HostPromiseRejectionTracker ( promise, operation )#
HostPromiseRejectionTracker is an implementation-defined abstract operation that allows host environments to track promise rejections.
An implementation of HostPromiseRejectionTracker must complete normally in all cases. The default implementation of HostPromiseRejectionTracker is to do nothing.
HostPromiseRejectionTracker is called in two scenarios:
- When a promise is rejected without any handlers, it is called with its operation argument set to
"reject". - When a handler is added to a rejected promise for the first time, it is called with its operation argument set to
"handle".
A typical implementation of HostPromiseRejectionTracker might try to notify developers of unhandled rejections, while also being careful to notify them if such previous notifications are later invalidated by new handlers being attached.
If operation is "handle", an implementation should not hold a reference to promise in a way that would interfere with garbage collection. An implementation may hold a reference to promise if operation is "reject", since it is expected that rejections will be rare and not on hot code paths.
25.4.2Promise Jobs#
25.4.2.1PromiseReactionJob ( reaction, argument )#
The job PromiseReactionJob with parameters reaction and argument applies the appropriate handler to the incoming value, and uses the handler's return value to resolve or reject the derived promise associated with that handler.
- Assert: reaction is a PromiseReaction
Record . - Let promiseCapability be reaction.[[Capabilities]].
- Let handler be reaction.[[Handler]].
- If handler is
"Identity", let handlerResult beNormalCompletion (argument). - Else if handler is
"Thrower", let handlerResult beCompletion {[[Type]]:throw , [[Value]]: argument, [[Target]]:empty }. - Else, let handlerResult be
Call (handler,undefined , « argument »). - If handlerResult is an
abrupt completion , then- Let status be
Call (promiseCapability.[[Reject]],undefined , « handlerResult.[[Value]] »). NextJob Completion (status).
- Let status be
- Let status be
Call (promiseCapability.[[Resolve]],undefined , « handlerResult.[[Value]] »). NextJob Completion (status).
25.4.2.2PromiseResolveThenableJob ( promiseToResolve, thenable, then)#
The job PromiseResolveThenableJob with parameters promiseToResolve, thenable, and then performs the following steps:
- Let resolvingFunctions be
CreateResolvingFunctions (promiseToResolve). - Let thenCallResult be
Call (then, thenable, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »). - If thenCallResult is an
abrupt completion , then- Let status be
Call (resolvingFunctions.[[Reject]],undefined , « thenCallResult.[[Value]] »). NextJob Completion (status).
- Let status be
NextJob Completion (thenCallResult).
This Job uses the supplied thenable and its then method to resolve the given promise. This process must take place as a Job to ensure that the evaluation of the then method occurs after evaluation of any surrounding code has completed.
25.4.3The Promise Constructor#
The Promise constructor is the %Promise% intrinsic object and the initial value of the Promise property of the Promise is not intended to be called as a function and will throw an exception when called in that manner.
The Promise constructor is designed to be subclassable. It may be used as the value in an extends clause of a class definition. Subclass constructors that intend to inherit the specified Promise behaviour must include a super call to the Promise constructor to create and initialize the subclass instance with the internal state necessary to support the Promise and Promise.prototype built-in methods.
25.4.3.1Promise ( executor )#
When the Promise function is called with argument executor, the following steps are taken:
- If NewTarget is
undefined , throw aTypeError exception. - If
IsCallable (executor) isfalse , throw aTypeError exception. - Let promise be ?
OrdinaryCreateFromConstructor (NewTarget,"%PromisePrototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] »). - Set promise's [[PromiseState]] internal slot to
"pending". - Set promise's [[PromiseFulfillReactions]] internal slot to a new empty
List . - Set promise's [[PromiseRejectReactions]] internal slot to a new empty
List . - Set promise's [[PromiseIsHandled]] internal slot to
false . - Let resolvingFunctions be
CreateResolvingFunctions (promise). - Let completion be
Call (executor,undefined , « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »). - If completion is an
abrupt completion , then- Perform ?
Call (resolvingFunctions.[[Reject]],undefined , « completion.[[Value]] »).
- Perform ?
- Return promise.
The executor argument must be a function object. It is called for initiating and reporting completion of the possibly deferred action represented by this Promise object. The executor is called with two arguments: resolve and reject. These are functions that may be used by the executor function to report eventual completion or failure of the deferred computation. Returning from the executor function does not mean that the deferred action has been completed but only that the request to eventually perform the deferred action has been accepted.
The resolve function that is passed to an executor function accepts a single argument. The executor code may eventually call the resolve function to indicate that it wishes to resolve the associated Promise object. The argument passed to the resolve function represents the eventual value of the deferred action and can be either the actual fulfillment value or another Promise object which will provide the value if it is fulfilled.
The reject function that is passed to an executor function accepts a single argument. The executor code may eventually call the reject function to indicate that the associated Promise is rejected and will never be fulfilled. The argument passed to the reject function is used as the rejection value of the promise. Typically it will be an Error object.
The resolve and reject functions passed to an executor function by the Promise constructor have the capability to actually resolve and reject the associated promise. Subclasses may have different constructor behaviour that passes in customized values for resolve and reject.
25.4.4Properties of the Promise Constructor#
The value of the [[Prototype]] internal slot of the Promise constructor is the intrinsic object
The Promise constructor has the following properties:
25.4.4.1Promise.all ( iterable )#
The all function returns a new promise which is fulfilled with an array of fulfillment values for the passed promises, or rejects with the reason of the first passed promise that rejects. It resolves all elements of the passed iterable to promises as it runs this algorithm.
- Let C be the
this value. - If
Type (C) is not Object, throw aTypeError exception. - Let promiseCapability be ?
NewPromiseCapability (C). - Let iterator be
GetIterator (iterable). IfAbruptRejectPromise (iterator, promiseCapability).- Let iteratorRecord be
Record {[[Iterator]]: iterator, [[Done]]:false }. - Let result be
PerformPromiseAll (iteratorRecord, C, promiseCapability). - If result is an
abrupt completion , then- If iteratorRecord.[[Done]] is
false , let result beIteratorClose (iterator, result). IfAbruptRejectPromise (result, promiseCapability).
- If iteratorRecord.[[Done]] is
- Return
Completion (result).
The all function requires its Promise constructor.
25.4.4.1.1Runtime Semantics: PerformPromiseAll( iteratorRecord, constructor, resultCapability)#
When the PerformPromiseAll abstract operation is called with arguments iteratorRecord, constructor, and resultCapability, the following steps are taken:
- Assert: constructor is a constructor function.
- Assert: resultCapability is a PromiseCapability record.
- Let values be a new empty
List . - Let remainingElementsCount be a new
Record { [[Value]]: 1 }. - Let index be 0.
- Repeat
- Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , then- Set iteratorRecord.[[Done]] to
true . - Set remainingElementsCount.[[Value]] to remainingElementsCount.[[Value]] - 1.
- If remainingElementsCount.[[Value]] is 0, then
- Let valuesArray be
CreateArrayFromList (values). - Perform ?
Call (resultCapability.[[Resolve]],undefined , « valuesArray »).
- Let valuesArray be
- Return resultCapability.[[Promise]].
- Set iteratorRecord.[[Done]] to
- Let nextValue be
IteratorValue (next). - If nextValue is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (nextValue).- Append
undefined to values. - Let nextPromise be ?
Invoke (constructor,"resolve", « nextValue »). - Let resolveElement be a new built-in function object as defined in Promise.all Resolve Element Functions.
- Set the [[AlreadyCalled]] internal slot of resolveElement to a new
Record {[[Value]]:false }. - Set the [[Index]] internal slot of resolveElement to index.
- Set the [[Values]] internal slot of resolveElement to values.
- Set the [[Capabilities]] internal slot of resolveElement to resultCapability.
- Set the [[RemainingElements]] internal slot of resolveElement to remainingElementsCount.
- Set remainingElementsCount.[[Value]] to remainingElementsCount.[[Value]] + 1.
- Perform ?
Invoke (nextPromise,"then", « resolveElement, resultCapability.[[Reject]] »). - Set index to index + 1.
- Let next be
25.4.4.1.2Promise.all Resolve Element Functions#
A Promise.all resolve element function is an anonymous built-in function that is used to resolve a specific Promise.all element. Each Promise.all resolve element function has [[Index]], [[Values]], [[Capabilities]], [[RemainingElements]], and [[AlreadyCalled]] internal slots.
When a Promise.all resolve element function F is called with argument x, the following steps are taken:
- Let alreadyCalled be the value of F's [[AlreadyCalled]] internal slot.
- If alreadyCalled.[[Value]] is
true , returnundefined . - Set alreadyCalled.[[Value]] to
true . - Let index be the value of F's [[Index]] internal slot.
- Let values be the value of F's [[Values]] internal slot.
- Let promiseCapability be the value of F's [[Capabilities]] internal slot.
- Let remainingElementsCount be the value of F's [[RemainingElements]] internal slot.
- Set values[index] to x.
- Set remainingElementsCount.[[Value]] to remainingElementsCount.[[Value]] - 1.
- If remainingElementsCount.[[Value]] is 0, then
- Let valuesArray be
CreateArrayFromList (values). - Return ?
Call (promiseCapability.[[Resolve]],undefined , « valuesArray »).
- Let valuesArray be
- Return
undefined .
The length property of a Promise.all resolve element function is 1.
25.4.4.2Promise.prototype#
The initial value of Promise.prototype is the intrinsic object
This property has the attributes { [[Writable]]:
25.4.4.3Promise.race ( iterable )#
The race function returns a new promise which is settled in the same way as the first passed promise to settle. It resolves all elements of the passed iterable to promises as it runs this algorithm.
- Let C be the
this value. - If
Type (C) is not Object, throw aTypeError exception. - Let promiseCapability be ?
NewPromiseCapability (C). - Let iterator be
GetIterator (iterable). IfAbruptRejectPromise (iterator, promiseCapability).- Let iteratorRecord be
Record {[[Iterator]]: iterator, [[Done]]:false }. - Let result be
PerformPromiseRace (iteratorRecord, promiseCapability, C). - If result is an
abrupt completion , then- If iteratorRecord.[[Done]] is
false , let result beIteratorClose (iterator, result). IfAbruptRejectPromise (result, promiseCapability).
- If iteratorRecord.[[Done]] is
- Return
Completion (result).
If the iterable argument is empty or if none of the promises in iterable ever settle then the pending promise returned by this method will never be settled.
The race function expects its Promise constructor. It also expects that its resolve method.
25.4.4.3.1Runtime Semantics: PerformPromiseRace ( iteratorRecord, promiseCapability, C )#
When the PerformPromiseRace abstract operation is called with arguments iteratorRecord, promiseCapability, and C, the following steps are taken:
- Repeat
- Let next be
IteratorStep (iteratorRecord.[[Iterator]]). - If next is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (next).- If next is
false , then- Set iteratorRecord.[[Done]] to
true . - Return promiseCapability.[[Promise]].
- Set iteratorRecord.[[Done]] to
- Let nextValue be
IteratorValue (next). - If nextValue is an
abrupt completion , set iteratorRecord.[[Done]] totrue . ReturnIfAbrupt (nextValue).- Let nextPromise be ?
Invoke (C,"resolve", « nextValue »). - Perform ?
Invoke (nextPromise,"then", « promiseCapability.[[Resolve]], promiseCapability.[[Reject]] »).
- Let next be
25.4.4.4Promise.reject ( r )#
The reject function returns a new promise rejected with the passed argument.
- Let C be the
this value. - If
Type (C) is not Object, throw aTypeError exception. - Let promiseCapability be ?
NewPromiseCapability (C). - Perform ?
Call (promiseCapability.[[Reject]],undefined , « r »). - Return promiseCapability.[[Promise]].
The reject function expects its Promise constructor.
25.4.4.5Promise.resolve ( x )#
The resolve function returns either a new promise resolved with the passed argument, or the argument itself if the argument is a promise produced by this constructor.
- Let C be the
this value. - If
Type (C) is not Object, throw aTypeError exception. - If
IsPromise (x) istrue , then - Let promiseCapability be ?
NewPromiseCapability (C). - Perform ?
Call (promiseCapability.[[Resolve]],undefined , « x »). - Return promiseCapability.[[Promise]].
The resolve function expects its Promise constructor.
25.4.4.6get Promise [ @@species ]#
Promise[@@species] is an accessor property whose set accessor function is
- Return the
this value.
The value of the name property of this function is "get [Symbol.species]".
Promise prototype methods normally use their this object's constructor to create a derived object. However, a subclass constructor may over-ride that default behaviour by redefining its @@species property.
25.4.5Properties of the Promise Prototype Object#
The Promise prototype object is the intrinsic object %PromisePrototype%. The value of the [[Prototype]] internal slot of the Promise prototype object is the intrinsic object
25.4.5.1Promise.prototype.catch ( onRejected )#
When the catch method is called with argument onRejected, the following steps are taken:
- Let promise be the
this value. - Return ?
Invoke (promise,"then", «undefined , onRejected »).
25.4.5.2Promise.prototype.constructor#
The initial value of Promise.prototype.constructor is the intrinsic object
25.4.5.3Promise.prototype.then ( onFulfilled, onRejected )#
When the then method is called with arguments onFulfilled and onRejected, the following steps are taken:
- Let promise be the
this value. - If
IsPromise (promise) isfalse , throw aTypeError exception. - Let C be ?
SpeciesConstructor (promise,%Promise% ). - Let resultCapability be ?
NewPromiseCapability (C). - Return
PerformPromiseThen (promise, onFulfilled, onRejected, resultCapability).
25.4.5.3.1PerformPromiseThen ( promise, onFulfilled, onRejected, resultCapability )#
The abstract operation PerformPromiseThen performs the “then” operation on promise using onFulfilled and onRejected as its settlement actions. The result is resultCapability's promise.
- Assert:
IsPromise (promise) istrue . - Assert: resultCapability is a PromiseCapability record.
- If
IsCallable (onFulfilled) isfalse , then- Let onFulfilled be
"Identity".
- Let onFulfilled be
- If
IsCallable (onRejected) isfalse , then- Let onRejected be
"Thrower".
- Let onRejected be
- Let fulfillReaction be the PromiseReaction { [[Capabilities]]: resultCapability, [[Handler]]: onFulfilled }.
- Let rejectReaction be the PromiseReaction { [[Capabilities]]: resultCapability, [[Handler]]: onRejected}.
- If the value of promise's [[PromiseState]] internal slot is
"pending", then - Else if the value of promise's [[PromiseState]] internal slot is
"fulfilled", then- Let value be the value of promise's [[PromiseResult]] internal slot.
- Perform
EnqueueJob ("PromiseJobs",PromiseReactionJob , « fulfillReaction, value »).
- Else,
- Assert: The value of promise's [[PromiseState]] internal slot is
"rejected". - Let reason be the value of promise's [[PromiseResult]] internal slot.
- If the value of promise's [[PromiseIsHandled]] internal slot is
false , performHostPromiseRejectionTracker (promise,"handle"). - Perform
EnqueueJob ("PromiseJobs",PromiseReactionJob , « rejectReaction, reason »).
- Assert: The value of promise's [[PromiseState]] internal slot is
- Set promise's [[PromiseIsHandled]] internal slot to
true . - Return resultCapability.[[Promise]].
25.4.5.4Promise.prototype [ @@toStringTag ]#
The initial value of the @@toStringTag property is the String value "Promise".
This property has the attributes { [[Writable]]:
25.4.6Properties of Promise Instances#
Promise instances are ordinary objects that inherit properties from the Promise prototype object (the intrinsic,
| Internal Slot | Description |
|---|---|
| [[PromiseState]] |
A String value that governs how a promise will react to incoming calls to its then method. The possible values are: "pending", "fulfilled", and "rejected".
|
| [[PromiseResult]] |
The value with which the promise has been fulfilled or rejected, if any. Only meaningful if [[PromiseState]] is not "pending".
|
| [[PromiseFulfillReactions]] |
A "pending" state to the "fulfilled" state.
|
| [[PromiseRejectReactions]] |
A "pending" state to the "rejected" state.
|
| [[PromiseIsHandled]] | A boolean indicating whether the promise has ever had a fulfillment or rejection handler; used in unhandled rejection tracking. |
26Reflection#
26.1The Reflect Object#
The Reflect object is the %Reflect% intrinsic object and the initial value of the Reflect property of the
The value of the [[Prototype]] internal slot of the Reflect object is the intrinsic object
The Reflect object is not a function object. It does not have a [[Construct]] internal method; it is not possible to use the Reflect object as a constructor with the new operator. The Reflect object also does not have a [[Call]] internal method; it is not possible to invoke the Reflect object as a function.
26.1.1Reflect.apply ( target, thisArgument, argumentsList )#
When the apply function is called with arguments target, thisArgument, and argumentsList, the following steps are taken:
- If
IsCallable (target) isfalse , throw aTypeError exception. - Let args be ?
CreateListFromArrayLike (argumentsList). - Perform
PrepareForTailCall (). - Return ?
Call (target, thisArgument, args).
26.1.2Reflect.construct ( target, argumentsList [ , newTarget ] )#
When the construct function is called with arguments target, argumentsList, and newTarget, the following steps are taken:
- If
IsConstructor (target) isfalse , throw aTypeError exception. - If newTarget is not present, let newTarget be target.
- Else, if
IsConstructor (newTarget) isfalse , throw aTypeError exception. - Let args be ?
CreateListFromArrayLike (argumentsList). - Return ?
Construct (target, args, newTarget).
26.1.3Reflect.defineProperty ( target, propertyKey, attributes )#
When the defineProperty function is called with arguments target, propertyKey, and attributes, the following steps are taken:
- If
Type (target) is not Object, throw aTypeError exception. - Let key be ?
ToPropertyKey (propertyKey). - Let desc be ?
ToPropertyDescriptor (attributes). - Return ? target.[[DefineOwnProperty]](key, desc).
26.1.4Reflect.deleteProperty ( target, propertyKey )#
When the deleteProperty function is called with arguments target and propertyKey, the following steps are taken:
- If
Type (target) is not Object, throw aTypeError exception. - Let key be ?
ToPropertyKey (propertyKey). - Return ? target.[[Delete]](key).
26.1.5Reflect.get ( target, propertyKey [ , receiver ])#
When the get function is called with arguments target, propertyKey, and receiver, the following steps are taken:
- If
Type (target) is not Object, throw aTypeError exception. - Let key be ?
ToPropertyKey (propertyKey). - If receiver is not present, then
- Let receiver be target.
- Return ? target.[[Get]](key, receiver).
26.1.6Reflect.getOwnPropertyDescriptor ( target, propertyKey )#
When the getOwnPropertyDescriptor function is called with arguments target and propertyKey, the following steps are taken:
- If
Type (target) is not Object, throw aTypeError exception. - Let key be ?
ToPropertyKey (propertyKey). - Let desc be ? target.[[GetOwnProperty]](key).
- Return
FromPropertyDescriptor (desc).
26.1.7Reflect.getPrototypeOf ( target )#
When the getPrototypeOf function is called with argument target, the following steps are taken:
- If
Type (target) is not Object, throw aTypeError exception. - Return ? target.[[GetPrototypeOf]]().
26.1.8Reflect.has ( target, propertyKey )#
When the has function is called with arguments target and propertyKey, the following steps are taken:
- If
Type (target) is not Object, throw aTypeError exception. - Let key be ?
ToPropertyKey (propertyKey). - Return ? target.[[HasProperty]](key).
26.1.9Reflect.isExtensible (target)#
When the isExtensible function is called with argument target, the following steps are taken:
- If
Type (target) is not Object, throw aTypeError exception. - Return ? target.[[IsExtensible]]().
26.1.10Reflect.ownKeys ( target )#
When the ownKeys function is called with argument target, the following steps are taken:
- If
Type (target) is not Object, throw aTypeError exception. - Let keys be ? target.[[OwnPropertyKeys]]().
- Return
CreateArrayFromList (keys).
26.1.11Reflect.preventExtensions ( target )#
When the preventExtensions function is called with argument target, the following steps are taken:
- If
Type (target) is not Object, throw aTypeError exception. - Return ? target.[[PreventExtensions]]().
26.1.12Reflect.set ( target, propertyKey, V [ , receiver ] )#
When the set function is called with arguments target, V, propertyKey, and receiver, the following steps are taken:
- If
Type (target) is not Object, throw aTypeError exception. - Let key be ?
ToPropertyKey (propertyKey). - If receiver is not present, then
- Let receiver be target.
- Return ? target.[[Set]](key, V, receiver).
26.1.13Reflect.setPrototypeOf ( target, proto )#
When the setPrototypeOf function is called with arguments target and proto, the following steps are taken:
26.2Proxy Objects#
26.2.1The Proxy Constructor#
The Proxy constructor is the %Proxy% intrinsic object and the initial value of the Proxy property of the Proxy is not intended to be called as a function and will throw an exception when called in that manner.
26.2.1.1Proxy ( target, handler )#
When Proxy is called with arguments target and handler performs the following steps:
- If NewTarget is
undefined , throw aTypeError exception. - Return ?
ProxyCreate (target, handler).
26.2.2Properties of the Proxy Constructor#
The value of the [[Prototype]] internal slot of the Proxy constructor is the intrinsic object
The Proxy constructor does not have a prototype property because proxy exotic objects do not have a [[Prototype]] internal slot that requires initialization.
The Proxy constructor has the following properties:
26.2.2.1Proxy.revocable ( target, handler )#
The Proxy.revocable function is used to create a revocable Proxy object. When Proxy.revocable is called with arguments target and handler, the following steps are taken:
- Let p be ?
ProxyCreate (target, handler). - Let revoker be a new built-in function object as defined in
26.2.2.1.1 . - Set the [[RevocableProxy]] internal slot of revoker to p.
- Let result be
ObjectCreate (%ObjectPrototype% ). - Perform
CreateDataProperty (result,"proxy", p). - Perform
CreateDataProperty (result,"revoke", revoker). - Return result.
26.2.2.1.1Proxy Revocation Functions#
A Proxy revocation function is an anonymous function that has the ability to invalidate a specific Proxy object.
Each Proxy revocation function has a [[RevocableProxy]] internal slot.
When a Proxy revocation function, F, is called, the following steps are taken:
- Let p be the value of F's [[RevocableProxy]] internal slot.
- If p is
null , returnundefined . - Set the value of F's [[RevocableProxy]] internal slot to
null . - Assert: p is a Proxy object.
- Set the [[ProxyTarget]] internal slot of p to
null . - Set the [[ProxyHandler]] internal slot of p to
null . - Return
undefined .
The length property of a Proxy revocation function is 0.
26.3Module Namespace Objects#
A Module Namespace Object is a module namespace exotic object that provides runtime property-based access to a module's exported bindings. There is no constructor function for Module Namespace Objects. Instead, such an object is created for each module that is imported by an
In addition to the properties specified in
26.3.1@@toStringTag#
The initial value of the @@toStringTag property is the String value "Module".
This property has the attributes { [[Writable]]:
26.3.2[ @@iterator ] ( )#
When the @@iterator method is called with no arguments, the following steps are taken:
- Let N be the
this value. - If N is not a module namespace exotic object, throw a
TypeError exception. - Let exports be the value of N's [[Exports]] internal slot.
- Return !
CreateListIterator (exports).
The value of the name property of this function is "[Symbol.iterator]".
AGrammar Summary#
A.1Lexical Grammar#
await is only treated as a
The following tokens are also considered to be
A.2Expressions#
When processing the production
In certain circumstances when processing the production
A.3Statements#
A.4Functions and Classes#
When the production
A.5Scripts and Modules#
A.6Number Conversions#
All grammar symbols not explicitly defined by the
A.7Universal Resource Identifier Character Classes#
A.8Regular Expressions#
Each \u u u \u
BAdditional ECMAScript Features for Web Browsers#
The ECMAScript language syntax and semantics defined in this annex are required when the ECMAScript host is a web browser. The content of this annex is normative but optional if the ECMAScript host is not a web browser.
This annex describes various legacy features and other characteristics of web browser based ECMAScript implementations. All of the language features and behaviours specified in this annex have one or more undesirable characteristics and in the absence of legacy usage would be removed from this specification. However, the usage of these features by large numbers of existing web pages means that web browsers must continue to support them. The specifications in this annex define the requirements for interoperable implementations of these legacy features.
These features are not considered part of the core ECMAScript language. Programmers should not use or assume the existence of these features and behaviours when writing new ECMAScript code. ECMAScript implementations are discouraged from implementing these features unless the implementation is part of a web browser or is required to run the same legacy ECMAScript code that web browsers encounter.
B.1Additional Syntax#
B.1.1Numeric Literals#
The syntax and semantics of
Syntax
B.1.1.1Static Semantics#
-
The MV of
is the MV ofLegacyOctalIntegerLiteral :: 0 OctalDigit OctalDigit . -
The MV of
is (the MV ofLegacyOctalIntegerLiteral :: LegacyOctalIntegerLiteral OctalDigit LegacyOctalIntegerLiteral times 8) plus the MV ofOctalDigit . -
The MV of
is the MV ofDecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral NonOctalDecimalIntegerLiteral . -
The MV of
is the MV ofNonOctalDecimalIntegerLiteral :: 0 NonOctalDigit NonOctalDigit . -
The MV of
is (the MV ofNonOctalDecimalIntegerLiteral :: LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit LegacyOctalLikeDecimalIntegerLiteral times 10) plus the MV ofNonOctalDigit . -
The MV of
is (the MV ofNonOctalDecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral DecimalDigit NonOctalDecimalIntegerLiteral times 10) plus the MV ofDecimalDigit . -
The MV of
is the MV ofLegacyOctalLikeDecimalIntegerLiteral :: 0 OctalDigit OctalDigit . -
The MV of
is (the MV ofLegacyOctalLikeDecimalIntegerLiteral :: LegacyOctalLikeDecimalIntegerLiteral OctalDigit LegacyOctalLikeDecimalIntegerLiteral times 10) plus the MV ofOctalDigit . -
The MV of
is 8.NonOctalDigit :: 8 -
The MV of
is 9.NonOctalDigit :: 9
B.1.2String Literals#
The syntax and semantics of
Syntax
This definition of
B.1.2.1Static Semantics#
-
The SV of
is the SV of theEscapeSequence :: LegacyOctalEscapeSequence LegacyOctalEscapeSequence . -
The SV of
is the code unit whose value is the MV of theLegacyOctalEscapeSequence :: OctalDigit OctalDigit . -
The SV of
is the code unit whose value is (8 times the MV of theLegacyOctalEscapeSequence :: ZeroToThree OctalDigit ZeroToThree ) plus the MV of theOctalDigit . -
The SV of
is the code unit whose value is (8 times the MV of theLegacyOctalEscapeSequence :: FourToSeven OctalDigit FourToSeven ) plus the MV of theOctalDigit . -
The SV of
is the code unit whose value is (64 (that is, 82) times the MV of theLegacyOctalEscapeSequence :: ZeroToThree OctalDigit OctalDigit ZeroToThree ) plus (8 times the MV of the firstOctalDigit ) plus the MV of the secondOctalDigit . -
The MV of
is 0.ZeroToThree :: 0 -
The MV of
is 1.ZeroToThree :: 1 -
The MV of
is 2.ZeroToThree :: 2 -
The MV of
is 3.ZeroToThree :: 3 -
The MV of
is 4.FourToSeven :: 4 -
The MV of
is 5.FourToSeven :: 5 -
The MV of
is 6.FourToSeven :: 6 -
The MV of
is 7.FourToSeven :: 7
B.1.4Regular Expressions Patterns#
The syntax of
This alternative pattern grammar and semantics only changes the syntax and semantics of BMP patterns. The following grammar extensions include productions parameterized with the [U] parameter. However, none of these extensions change the syntax of Unicode patterns recognized when parsing with the [U] parameter present on the goal symbol.
Syntax
When the same left hand sides occurs with both [+U] and [~U] guards it is to control the disambiguation priority.
B.1.4.1Pattern Semantics#
The semantics of
Within
Term (
The production
The production
The production
Assertion (
The production
Assertion (
Atom (
The production
- Throw a
SyntaxError exception.
The production
- Let ch be the character represented by
ExtendedPatternCharacter . - Let A be a one-element CharSet containing the character ch.
- Call
CharacterSetMatcher (A,false ) and return its Matcher result.
CharacterEscape (
The production
NonemptyClassRanges (
The production
- Evaluate the first
ClassAtomInRange to obtain a CharSet A. - Evaluate the second
ClassAtomInRange to obtain a CharSet B. - Evaluate
ClassRanges to obtain a CharSet C. - Call
CharacterRangeOrUnion (A, B) and let D be the resulting CharSet. - Return the union of CharSets D and C.
NonemptyClassRangesNoDash (
The production
- Evaluate
ClassAtomNoDashInRange to obtain a CharSet A. - Evaluate
ClassAtomInRange to obtain a CharSet B. - Evaluate
ClassRanges to obtain a CharSet C. - Call
CharacterRangeOrUnion (A, B) and let D be the resulting CharSet. - Return the union of CharSets D and C.
ClassAtom (
The production -.
The production
ClassAtomNoDash (
The production
The production
The production
ClassEscape (
The production
- Evaluate
DecimalEscape to obtain an EscapeValue E. - Assert: E is a character.
- Let ch be E's character.
- Return the one-element CharSet containing the character ch.
The production
- Let ch be the character matched by
ClassControlLetter . - Let i be ch's character value.
- Let j be the remainder of dividing i by 32.
- Return the character whose character value is j.
B.1.4.1.1Runtime Semantics: CharacterRangeOrUnion Abstract Operation#
The abstract operation
- If A does not contain exactly one character or B does not contain exactly one character, then
- Let C be the CharSet containing the single character - U+002D (HYPHEN-MINUS).
- Return the union of CharSets A, B and C.
- Return
CharacterRange (A, B).
B.2Additional Built-in Properties#
When the ECMAScript host is a web browser the following additional properties of the standard built-in objects are defined.
B.2.1Additional Properties of the Global Object#
The entries in
B.2.1.1escape (string)#
The escape function is a property of the
For those code units being replaced whose value is 0x00FF or less, a two-digit escape sequence of the form %xx is used. For those characters being replaced whose code unit value is greater than 0x00FF, a four-digit escape sequence of the form %uxxxx is used.
The escape function is the %escape% intrinsic object. When the escape function is called with one argument string, the following steps are taken:
- Let string be ?
ToString (string). - Let length be the number of code units in string.
- Let R be the empty string.
- Let k be 0.
- Repeat, while k < length,
- Let char be the code unit (represented as a 16-bit unsigned integer) at index k within string.
- If char is one of the code units in
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./", then- Let S be a String containing the single code unit char.
- Else if char ≥ 256, then
- Let S be a String containing six code units
"%uwxyz"where wxyz are the code units of the four hexadecimal digits encoding the value of char.
- Let S be a String containing six code units
- Else, char < 256
- Let S be a String containing three code units
"%xy"where xy are the code units of two hexadecimal digits encoding the value of char.
- Let S be a String containing three code units
- Let R be a new String value computed by concatenating the previous value of R and S.
- Increase k by 1.
- Return R.
The encoding is partly based on the encoding described in RFC 1738, but the entire encoding specified in this standard is described above without regard to the contents of RFC 1738. This encoding does not reflect changes to RFC 1738 made by RFC 3986.
B.2.1.2unescape (string)#
The unescape function is a property of the escape function is replaced with the code unit that it represents.
The unescape function is the %unescape% intrinsic object. When the unescape function is called with one argument string, the following steps are taken:
- Let string be ?
ToString (string). - Let length be the number of code units in string.
- Let R be the empty String.
- Let k be 0.
- Repeat, while k ≠ length
- Let c be the code unit at index k within string.
- If c is
%, then- If k ≤ length-6 and the code unit at index k+1 within string is
uand the four code units at indices k+2, k+3, k+4, and k+5 within string are all hexadecimal digits, then- Let c be the code unit whose value is the integer represented by the four hexadecimal digits at indices k+2, k+3, k+4, and k+5 within string.
- Increase k by 5.
- Else if k ≤ length-3 and the two code units at indices k+1 and k+2 within string are both hexadecimal digits, then
- Let c be the code unit whose value is the integer represented by two zeroes plus the two hexadecimal digits at indices k+1 and k+2 within string.
- Increase k by 2.
- If k ≤ length-6 and the code unit at index k+1 within string is
- Let R be a new String value computed by concatenating the previous value of R and c.
- Increase k by 1.
- Return R.
B.2.2Additional Properties of the Object.prototype Object#
B.2.2.1Object.prototype.__proto__#
Object.prototype.__proto__ is an accessor property with attributes { [[Enumerable]]:
B.2.2.1.1get Object.prototype.__proto__#
The value of the [[Get]] attribute is a built-in function that requires no arguments. It performs the following steps:
- Let O be ?
ToObject (this value). - Return ? O.[[GetPrototypeOf]]().
B.2.2.1.2set Object.prototype.__proto__#
The value of the [[Set]] attribute is a built-in function that takes an argument proto. It performs the following steps:
- Let O be ?
RequireObjectCoercible (this value). - If
Type (proto) is neither Object nor Null, returnundefined . - If
Type (O) is not Object, returnundefined . - Let status be ? O.[[SetPrototypeOf]](proto).
- If status is
false , throw aTypeError exception. - Return
undefined .
B.2.3Additional Properties of the String.prototype Object#
B.2.3.1String.prototype.substr (start, length)#
The substr method takes two arguments, start and length, and returns a substring of the result of converting the
- Let O be ?
RequireObjectCoercible (this value). - Let S be ?
ToString (O). - Let intStart be ?
ToInteger (start). - If length is
undefined , let end be+∞ ; otherwise let end be ?ToInteger (length). - Let size be the number of code units in S.
- If intStart < 0, let intStart be
max (size + intStart, 0). - Let resultLength be
min (max (end, 0), size - intStart). - If resultLength ≤ 0, return the empty String
"". - Return a String containing resultLength consecutive code units from S beginning with the code unit at index intStart.
The substr function is intentionally generic; it does not require that its
B.2.3.2String.prototype.anchor ( name )#
When the anchor method is called with argument name, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"a","name", name).
B.2.3.2.1Runtime Semantics: CreateHTML ( string, tag, attribute, value )#
The abstract operation
- Let str be ?
RequireObjectCoercible (string). - Let S be ?
ToString (str). - Let p1 be the String value that is the concatenation of
"<"and tag. - If attribute is not the empty String, then
- Let V be ?
ToString (value). - Let escapedV be the String value that is the same as V except that each occurrence of the code unit 0x0022 (QUOTATION MARK) in V has been replaced with the six code unit sequence
""". - Let p1 be the String value that is the concatenation of the following String values:
- The String value of p1
- Code unit 0x0020 (SPACE)
- The String value of attribute
- Code unit 0x003D (EQUALS SIGN)
- Code unit 0x0022 (QUOTATION MARK)
- The String value of escapedV
- Code unit 0x0022 (QUOTATION MARK)
- Let V be ?
- Let p2 be the String value that is the concatenation of p1 and
">". - Let p3 be the String value that is the concatenation of p2 and S.
- Let p4 be the String value that is the concatenation of p3,
"</", tag, and">". - Return p4.
B.2.3.3String.prototype.big ()#
When the big method is called with no arguments, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"big","","").
B.2.3.4String.prototype.blink ()#
When the blink method is called with no arguments, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"blink","","").
B.2.3.5String.prototype.bold ()#
When the bold method is called with no arguments, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"b","","").
B.2.3.6String.prototype.fixed ()#
When the fixed method is called with no arguments, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"tt","","").
B.2.3.7String.prototype.fontcolor ( color )#
When the fontcolor method is called with argument color, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"font","color", color).
B.2.3.8String.prototype.fontsize ( size )#
When the fontsize method is called with argument size, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"font","size", size).
B.2.3.9String.prototype.italics ()#
When the italics method is called with no arguments, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"i","","").
B.2.3.10String.prototype.link ( url )#
When the link method is called with argument url, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"a","href", url).
B.2.3.11String.prototype.small ()#
When the small method is called with no arguments, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"small","","").
B.2.3.12String.prototype.strike ()#
When the strike method is called with no arguments, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"strike","","").
B.2.3.13String.prototype.sub ()#
When the sub method is called with no arguments, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"sub","","").
B.2.3.14String.prototype.sup ()#
When the sup method is called with no arguments, the following steps are taken:
- Let S be the
this value. - Return ?
CreateHTML (S,"sup","","").
B.2.4Additional Properties of the Date.prototype Object#
B.2.4.1Date.prototype.getYear ( )#
The getFullYear method is preferred for nearly all purposes, because it avoids the “year 2000 problem.”
When the getYear method is called with no arguments, the following steps are taken:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , returnNaN . - Return
YearFromTime (LocalTime (t)) - 1900.
B.2.4.2Date.prototype.setYear (year)#
The setFullYear method is preferred for nearly all purposes, because it avoids the “year 2000 problem.”
When the setYear method is called with one argument year, the following steps are taken:
- Let t be ?
thisTimeValue (this value). - If t is
NaN , let t be+0 ; otherwise, let t beLocalTime (t). - Let y be ?
ToNumber (year). - If y is
NaN , set the [[DateValue]] internal slot of this Date object toNaN and returnNaN . - If y is not
NaN and 0 ≤ToInteger (y) ≤ 99, let yyyy beToInteger (y) + 1900. - Else, let yyyy be y.
- Let d be
MakeDay (yyyy,MonthFromTime (t),DateFromTime (t)). - Let date be
UTC (MakeDate (d,TimeWithinDay (t))). - Set the [[DateValue]] internal slot of this Date object to
TimeClip (date). - Return the value of the [[DateValue]] internal slot of this Date object.
B.2.4.3Date.prototype.toGMTString ( )#
The property toUTCString is preferred. The toGMTString property is provided principally for compatibility with old code. It is recommended that the toUTCString property be used in new ECMAScript code.
The function object that is the initial value of Date.prototype.toGMTString is the same function object that is the initial value of Date.prototype.toUTCString.
B.2.5Additional Properties of the RegExp.prototype Object#
B.2.5.1RegExp.prototype.compile (pattern, flags )#
When the compile method is called with arguments pattern and flags, the following steps are taken:
- Let O be the
this value. - If
Type (O) is not Object orType (O) is Object and O does not have a [[RegExpMatcher]] internal slot, then- Throw a
TypeError exception.
- Throw a
- If
Type (pattern) is Object and pattern has a [[RegExpMatcher]] internal slot, then- If flags is not
undefined , throw aTypeError exception. - Let P be the value of pattern's [[OriginalSource]] internal slot.
- Let F be the value of pattern's [[OriginalFlags]] internal slot.
- If flags is not
- Else,
- Let P be pattern.
- Let F be flags.
- Return ?
RegExpInitialize (O, P, F).
The compile method completely reinitializes the
B.3Other Additional Features#
B.3.1__proto__ Property Names in Object Initializers#
The following Early Error rule is added to those in
-
It is a Syntax Error if PropertyNameList of
PropertyDefinitionList contains any duplicate entries for"__proto__"and at least two of those entries were obtained from productions of the form .PropertyDefinition : PropertyName : AssignmentExpression
The
In
is replaced with the following definition:
- Let propKey be the result of evaluating
PropertyName . ReturnIfAbrupt (propKey).- Let exprValueRef be the result of evaluating
AssignmentExpression . - Let propValue be ?
GetValue (exprValueRef). - If propKey is the String value
"__proto__"and if IsComputedPropertyKey(propKey) isfalse , then- If
Type (propValue) is either Object or Null, then- Return object.[[SetPrototypeOf]](propValue).
- Return
NormalCompletion (empty ).
- If
- If
IsAnonymousFunctionDefinition (AssignmentExpression ) istrue , then- Let hasNameProperty be ?
HasOwnProperty (propValue,"name"). - If hasNameProperty is
false , performSetFunctionName (propValue, propKey).
- Let hasNameProperty be ?
- Assert: enumerable is
true . - Return
CreateDataPropertyOrThrow (object, propKey, propValue).
B.3.2Labelled Function Declarations#
Prior to ECMAScript 2015, the specification of
- It is a Syntax Error if any strict mode source code matches this rule.
B.3.3Block-Level Function Declarations Web Legacy Compatibility Semantics#
Prior to ECMAScript 2015, the ECMAScript specification did not define the occurrence of a
-
A function is declared and only referenced within a single block
-
A
FunctionDeclaration whoseBindingIdentifier is the name f occurs exactly once within the function code of an enclosing function g and that declaration is nested within aBlock . -
No other declaration of f that is not a
vardeclaration occurs within the function code of g -
All occurrences of f as an
IdentifierReference are within theStatementList of theBlock containing the declaration of f.
-
A
-
A function is declared and possibly used within a single
Block but also referenced by an inner function definition that is not contained within that sameBlock .-
A
FunctionDeclaration whoseBindingIdentifier is the name f occurs exactly once within the function code of an enclosing function g and that declaration is nested within aBlock . -
No other declaration of f that is not a
vardeclaration occurs within the function code of g -
There may be occurrences of f as an
IdentifierReference within theStatementList of theBlock containing the declaration of f. -
There is at least one occurrence of f as an
IdentifierReference within another function h that is nested within g and no other declaration of f shadows the references to f from within h. - All invocations of h occur after the declaration of f has been evaluated.
-
A
-
A function is declared and possibly used within a single block but also referenced within subsequent blocks.
-
A
FunctionDeclaration whoseBindingIdentifier is the name f occurs exactly once within the function code of an enclosing function g and that declaration is nested within aBlock . -
No other declaration of f that is not a
vardeclaration occurs within the function code of g -
There may be occurrences of f as an
IdentifierReference within theStatementList of theBlock containing the declaration of f. -
There is at least one occurrence of f as an
IdentifierReference within the function code of g that lexically follows theBlock containing the declaration of f.
-
A
The first use case is interoperable with the semantics of
ECMAScript 2015 interoperability for the second and third use cases requires the following extensions to the clause
If an ECMAScript implementation has a mechanism for reporting diagnostic warning messages, a warning should be produced when code contains a
B.3.3.1Changes to FunctionDeclarationInstantiation#
During
- If strict is
false , then- For each
FunctionDeclaration f that is directly contained in theStatementList of aBlock ,CaseClause , orDefaultClause ,- Let F be StringValue of the
BindingIdentifier ofFunctionDeclaration f. - If replacing the
FunctionDeclaration f with aVariableStatement that has F as aBindingIdentifier would not produce any Early Errors for func and F is not an element of BoundNames of argumentsList, then- NOTE A var binding for F is only instantiated here if it is neither a VarDeclaredName, the name of a formal parameter, or another
FunctionDeclaration . - If instantiatedVarNames does not contain F, then
- Perform ! varEnvRec.CreateMutableBinding(F,
false ). - Perform varEnvRec.InitializeBinding(F,
undefined ). - Append F to instantiatedVarNames.
- Perform ! varEnvRec.CreateMutableBinding(F,
- When the
FunctionDeclaration f is evaluated, perform the following steps in place of theFunctionDeclaration Evaluation algorithm provided in14.1.21 :- Let fenv be the
running execution context 's VariableEnvironment. - Let fenvRec be fenv's
EnvironmentRecord . - Let benv be the
running execution context 's LexicalEnvironment. - Let benvRec be benv's
EnvironmentRecord . - Let fobj be ! benvRec.GetBindingValue(F,
false ). - Perform ! fenvRec.SetMutableBinding(F, fobj,
false ). - Return
NormalCompletion (empty ).
- Let fenv be the
- NOTE A var binding for F is only instantiated here if it is neither a VarDeclaredName, the name of a formal parameter, or another
- Let F be StringValue of the
- For each
B.3.3.2Changes to GlobalDeclarationInstantiation#
During
- Let strict be IsStrict of script
- If strict is
false , then- Let declaredFunctionOrVarNames be a new empty
List . - Append to declaredFunctionOrVarNames the elements of declaredFunctionNames.
- Append to declaredFunctionOrVarNames the elements of declaredVarNames.
- For each
FunctionDeclaration f that is directly contained in theStatementList of aBlock ,CaseClause , orDefaultClause Contained within script,- Let F be StringValue of the
BindingIdentifier ofFunctionDeclaration f. - If replacing the
FunctionDeclaration f with aVariableStatement that has F as aBindingIdentifier would not produce any Early Errors for script, then- If envRec.HasLexicalDeclaration(F) is
false , then- Let fnDefinable be ? envRec.CanDeclareGlobalFunction(F).
- If fnDefinable is
true , then- NOTE A var binding for F is only instantiated here if it is neither a VarDeclaredName nor the name of another
FunctionDeclaration . - If declaredFunctionOrVarNames does not contain F, then
- Perform ? envRec.CreateGlobalFunctionBinding(F,
undefined ,false ). - Append F to declaredFunctionOrVarNames.
- Perform ? envRec.CreateGlobalFunctionBinding(F,
- When the
FunctionDeclaration f is evaluated, perform the following steps in place of theFunctionDeclaration Evaluation algorithm provided in14.1.21 :- Let genv be the
running execution context 's VariableEnvironment. - Let genvRec be genv's
EnvironmentRecord . - Let benv be the
running execution context 's LexicalEnvironment. - Let benvRec be benv's
EnvironmentRecord . - Let fobj be ! benvRec.GetBindingValue(F,
false ). - Perform ? genvRec.SetMutableBinding(F, fobj,
false ). - Return
NormalCompletion (empty ).
- Let genv be the
- NOTE A var binding for F is only instantiated here if it is neither a VarDeclaredName nor the name of another
- If envRec.HasLexicalDeclaration(F) is
- Let F be StringValue of the
- Let declaredFunctionOrVarNames be a new empty
B.3.3.3Changes to EvalDeclarationInstantiation#
During
- If strict is
false , then- Let declaredFunctionOrVarNames be a new empty
List . - Append to declaredFunctionOrVarNames the elements of declaredFunctionNames.
- Append to declaredFunctionOrVarNames the elements of declaredVarNames.
- For each
FunctionDeclaration f that is directly contained in theStatementList of aBlock ,CaseClause , orDefaultClause Contained within body,- Let F be StringValue of the
BindingIdentifier ofFunctionDeclaration f. - If replacing the
FunctionDeclaration f with aVariableStatement that has F as aBindingIdentifier would not produce any Early Errors for body, then- Let bindingExists be
false . - Let thisLex be lexEnv.
- Assert: the following loop will terminate.
- Repeat while thisLex is not the same as varEnv,
- Let thisEnvRec be thisLex's
EnvironmentRecord . - If thisEnvRec is not an object
Environment Record , then- If thisEnvRec.HasBinding(F) is
true , then- Let bindingExists be
true .
- Let bindingExists be
- If thisEnvRec.HasBinding(F) is
- Let thisLex be thisLex's outer environment reference.
- Let thisEnvRec be thisLex's
- If bindingExists is
false and varEnvRec is a globalEnvironment Record , then- If varEnvRec.HasLexicalDeclaration(F) is
false , then- Let fnDefinable be ? varEnvRec.CanDeclareGlobalFunction(F).
- Else,
- Let fnDefinable be
false .
- Let fnDefinable be
- If varEnvRec.HasLexicalDeclaration(F) is
- Else,
- Let fnDefinable be
true .
- Let fnDefinable be
- If bindingExists is
false and fnDefinable istrue , then- If declaredFunctionOrVarNames does not contain F, then
- If varEnvRec is a global
Environment Record , then- Perform ? varEnvRec.CreateGlobalFunctionBinding(F,
undefined ,true ).
- Perform ? varEnvRec.CreateGlobalFunctionBinding(F,
- Else,
- Let bindingExists be varEnvRec.HasBinding(F).
- If bindingExists is
false , then- Perform ! varEnvRec.CreateMutableBinding(F,
true ). - Perform ! varEnvRec.InitializeBinding(F,
undefined ).
- Perform ! varEnvRec.CreateMutableBinding(F,
- Append F to declaredFunctionOrVarNames.
- If varEnvRec is a global
- When the
FunctionDeclaration f is evaluated, perform the following steps in place of theFunctionDeclaration Evaluation algorithm provided in14.1.21 :- Let genv be the
running execution context 's VariableEnvironment. - Let genvRec be genv's
EnvironmentRecord . - Let benv be the
running execution context 's LexicalEnvironment. - Let benvRec be benv's
EnvironmentRecord . - Let fobj be ! benvRec.GetBindingValue(F,
false ). - Perform ? genvRec.SetMutableBinding(F, fobj,
false ). - Return
NormalCompletion (empty ).
- Let genv be the
- If declaredFunctionOrVarNames does not contain F, then
- Let bindingExists be
- Let F be StringValue of the
- Let declaredFunctionOrVarNames be a new empty
B.3.4FunctionDeclarations in IfStatement Statement Clauses#
The following rules for
The above rules are only applied when parsing code that is not
B.3.5VariableStatements in Catch Blocks#
The content of subclause
-
It is a Syntax Error if BoundNames of
CatchParameter contains any duplicate elements. -
It is a Syntax Error if any element of the BoundNames of
CatchParameter also occurs in the LexicallyDeclaredNames ofBlock . -
It is a Syntax Error if any element of the BoundNames of
CatchParameter also occurs in the VarDeclaredNames ofBlock unlessCatchParameter is and that element is only bound by aCatchParameter : BindingIdentifier VariableStatement , theVariableDeclarationList of a for statement, or theForBinding of a for-in statement.
The var declarations that bind a name that is also bound by the var declarations will assign to the corresponding catch parameter rather than the var binding. The relaxation of the normal static semantic rule does not apply to names only bound by for-of statements.
This modified behaviour also applies to var and function declarations introduced by
Step 5.d.ii.2.a.i is replaced by:
- If thisEnvRec is not the
Environment Record for aCatch clause, throw aSyntaxError exception. - If name is bound by any syntactic form other than a
FunctionDeclaration , aVariableStatement , theVariableDeclarationList of a for statement, or theForBinding of a for-in statement, throw aSyntaxError exception.
Step 9.d.ii.4.b.i.i is replaced by:
- If thisEnvRec is not the
Environment Record for aCatch clause, let bindingExists betrue .
CThe Strict Mode of ECMAScript#
The strict mode restriction and exceptions
-
implements,interface,let,package,private,protected,public,static, andyieldare reserved words withinstrict mode code . (11.6.2 ). -
A conforming implementation, when processing
strict mode code , must not extend, as described inB.1.1 , the syntax ofNumericLiteral to includeLegacyOctalIntegerLiteral , nor extend the syntax ofDecimalIntegerLiteral to includeNonOctalDecimalIntegerLiteral . -
A conforming implementation, when processing
strict mode code , may not extend the syntax ofEscapeSequence to includeLegacyOctalEscapeSequence as described inB.1.2 . -
Assignment to an undeclared identifier or otherwise unresolvable reference does not create a property in the
global object . When a simple assignment occurs withinstrict mode code , itsLeftHandSideExpression must not evaluate to an unresolvableReference . If it does aReferenceError exception is thrown (6.2.3.2 ). TheLeftHandSideExpression also may not be a reference to a data property with the attribute value {[[Writable]]:false }, to an accessor property with the attribute value {[[Set]]:undefined }, nor to a non-existent property of an object whose [[Extensible]] internal slot has the valuefalse . In these cases aTypeErrorexception is thrown (12.15 ). -
The identifier
evalorargumentsmay not appear as theLeftHandSideExpression of an Assignment operator (12.15 ) or of aUpdateExpression (12.4 ) or as theUnaryExpression operated upon by a Prefix Increment (12.4.6 ) or a Prefix Decrement (12.4.7 ) operator. -
Arguments objects for strict mode functions define non-configurable accessor properties named
"caller"and"callee"which throw aTypeError exception on access (9.2.7 ). -
Arguments objects for strict mode functions do not dynamically share their array indexed property values with the corresponding formal parameter bindings of their functions. (
9.4.4 ). -
For strict mode functions, if an arguments object is created the binding of the local identifier
argumentsto the arguments object is immutable and hence may not be the target of an assignment expression. (9.2.12 ). -
It is a
SyntaxError if theIdentifierName evalor theIdentifierName argumentsoccurs as aBindingIdentifier withinstrict mode code (12.1.1 ). -
Strict mode eval code cannot instantiate variables or functions in the variable environment of the caller to eval. Instead, a new variable environment is created and that environment is used for declaration binding instantiation for the eval code (
18.2.1 ). -
If
this is evaluated withinstrict mode code , then thethis value is not coerced to an object. Athis value ofnull orundefined is not converted to theglobal object and primitive values are not converted to wrapper objects. Thethis value passed via a function call (including calls made usingFunction.prototype.applyandFunction.prototype.call) do not coerce the passed this value to an object (9.2.1.2 ,19.2.3.1 ,19.2.3.3 ). -
When a
deleteoperator occurs withinstrict mode code , aSyntaxError is thrown if itsUnaryExpression is a direct reference to a variable, function argument, or function name (12.5.3.1 ). -
When a
deleteoperator occurs withinstrict mode code , aTypeError is thrown if the property to be deleted has the attribute { [[Configurable]]:false } (12.5.3.2 ). -
Strict mode code may not include aWithStatement . The occurrence of aWithStatement in such a context is aSyntaxError (13.11.1 ). -
It is a
SyntaxError if aTryStatement with aCatch occurs withinstrict mode code and theIdentifier of theCatch production isevalorarguments(13.15.1 ). -
It is a
SyntaxError if the sameBindingIdentifier appears more than once in theFormalParameters of a strict mode function. An attempt to create such a function using aFunctionorGeneratorconstructor is aSyntaxError (14.1.2 ,19.2.1.1.1 ). -
An implementation may not extend, beyond that defined in this specification, the meanings within strict mode functions of properties named
callerorargumentsof function instances. ECMAScript code may not create or modify properties with these names on function objects that correspond to strict mode functions (16.2 ).
DCorrections and Clarifications in ECMAScript 2015 with Possible Compatibility Impact#
"z".
"Invalid Date".
source property of an RegExp instance must be expressed using an escape sequence. Edition 5.1 only required the escaping of "/".
String.prototype.match and String.prototype.replace was incorrect for cases where the pattern argument was a RegExp value whose global is flag set. The previous specifications stated that for each attempt to match the pattern, if lastIndex did not change it should be incremented by 1. The correct behaviour is that lastIndex should be incremented by one only if the pattern matched the empty string.
Array.prototype.sort. ECMAScript 2015 specifies that such as value is treated as if
EAdditions and Changes That Introduce Incompatibilities with Prior Editions#
let followed by the token [ is the start of a
( token of a for statement is immediately followed by the token sequence let [ then the let is treated as the start of a
let [ then the let is treated as the start of a
in keyword. The value of that expression was always discarded. In ECMAScript 2015, the ForBinding in that same position does not allow the occurrence of such an initializer.
var declaration for the same
eval whose eval code includes a var or FunctionDeclaration declaration that binds the same
prototype own property. In the previous edition, they were constructors and had a prototype property.
Object.freeze is not an object it is treated as if it was a non-extensible ordinary object with no own properties. In the previous edition, a non-object argument always causes a
Object.getOwnPropertyDescriptor is not an object an attempt is made to coerce the argument using
Object.getOwnPropertyNames is not an object an attempt is made to coerce the argument using
Object.getPrototypeOf is not an object an attempt is made to coerce the argument using
Object.isExtensible is not an object it is treated as if it was a non-extensible ordinary object with no own properties. In the previous edition, a non-object argument always causes a
Object.isFrozen is not an object it is treated as if it was a non-extensible ordinary object with no own properties. In the previous edition, a non-object argument always causes a
Object.isSealed is not an object it is treated as if it was a non-extensible ordinary object with no own properties. In the previous edition, a non-object argument always causes a
Object.keys is not an object an attempt is made to coerce the argument using
Object.preventExtensions is not an object it is treated as if it was a non-extensible ordinary object with no own properties. In the previous edition, a non-object argument always causes a
Object.seal is not an object it is treated as if it was a non-extensible ordinary object with no own properties. In the previous edition, a non-object argument always causes a
length property of function instances is configurable. In previous editions it was non-configurable.
String.prototype.localeCompare function must treat Strings that are canonically equivalent according to the Unicode standard as being identical. In previous editions implementations were permitted to ignore canonical equivalence and could instead use a bit-wise comparison.
String.prototype.trim method is defined to recognize white space code points that may exists outside of the Unicode BMP. However, as of Unicode 7 no such code points are defined. In previous editions such code points would not have been recognized as white space.
source, global, ignoreCase, and multiline are accessor properties defined on the RegExp prototype object. In previous editions they were data properties defined on RegExp instances
FBibliography#
- IEEE Std 754-2008: IEEE Standard for Floating-Point Arithmetic. Institute of Electrical and Electronic Engineers, New York (2008)
-
The Unicode Standard, Version 8.0.0 or successor.
<http://www.unicode.org/versions/latest> -
Unicode Standard Annex #15, Unicode Normalization Forms, version Unicode 8.0.0, or successor.
<http://www.unicode.org/reports/tr15/> - Unicode Standard Annex #31, Unicode Identifiers and Pattern Syntax, version Unicode 8.0.0, or successor. <http://www.unicode.org/reports/tr31/>
- Unicode Technical Note #5: Canonical Equivalence in Applications, available at <http://www.unicode.org/notes/tn5/>
- Unicode Technical Standard #10: Unicode Collation Algorithm version 8.0.0, or successor, available at <http://www.unicode.org/reports/tr10/>
- IANA Time Zone Database at <http://www.iana.org/time-zones>
- ISO 8601:2004(E) Data elements and interchange formats – Information interchange — Representation of dates and times
- RFC 1738 “Uniform Resource Locators (URL)”, available at <http://tools.ietf.org/html/rfc1738>
- RFC 2396 “Uniform Resource Identifiers (URI): Generic Syntax”, available at <http://tools.ietf.org/html/rfc2396>
- RFC 3629 “UTF-8, a transformation format of ISO 10646”, available at <http://tools.ietf.org/html/rfc3629>
GCopyright & Software License#
Ecma International
Rue du Rhone 114
CH-1204 Geneva
Tel: +41 22 849 6000
Fax: +41 22 849 6001
Web: http://www.ecma-international.org
Copyright Notice
© 2016 Ecma International
This document may be copied, published and distributed to others, and certain derivative works of it may be prepared, copied, published, and distributed, in whole or in part, provided that the above copyright notice and this Copyright License and Disclaimer are included on all such copies and derivative works. The only derivative works that are permissible under this Copyright License and Disclaimer are:
(i) works which incorporate all or portion of this document for the purpose of providing commentary or explanation (such as an annotated version of the document),
(ii) works which incorporate all or portion of this document for the purpose of incorporating features that provide accessibility,
(iii) translations of this document into languages other than English and into different formats and
(iv) works by making use of this specification in standard conformant products by implementing (e.g. by copy and paste wholly or partly) the functionality therein.
However, the content of this document itself may not be modified in any way, including by removing the copyright notice or references to Ecma International, except as required to translate it into languages other than English or into a different format.
The official version of an Ecma International document is the English language version on the Ecma International website. In the event of discrepancies between a translated version and the official version, the official version shall govern.
The limited permissions granted above are perpetual and will not be revoked by Ecma International or its successors or assigns.
This document and the information contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE."
Software License
All Software contained in this document ("Software") is protected by copyright and is being made available under the "BSD License", included below. This Software may be subject to third party rights (rights from parties other than Ecma International), including patent rights, and no licenses under such third party rights are granted under this license even if the third party concerned is a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT http://www.ecma-international.org/memento/codeofconduct.htm FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- Neither the name of the authors nor Ecma International may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.