초안 ECMA-262 / 2025년 7월 28일

ECMAScript® 2026 언어 명세서

이 명세에 대해

https://tc39.es/ecma262/ 문서는 가장 정확하고 최신의 ECMAScript 명세입니다. 이 문서에는 최근 연간 스냅샷의 내용과 스냅샷 이후에 완료된 모든 완료된 제안 (제안 프로세스에서 Stage 4에 도달하여 여러 구현에서 적용되었고 다음 실질적인 개정에 포함될 예정인 것)이 포함되어 있습니다.

이 문서는 단일 페이지여러 페이지로 제공됩니다.

이 명세에 기여하기

이 명세는 ECMAScript 커뮤니티의 도움으로 GitHub에서 개발되고 있습니다. 이 명세의 개발에 기여할 수 있는 방법은 여러 가지가 있습니다:

이 문서가 어떻게 만들어지는지에 대한 자세한 내용은 콜로폰을 참고하세요.

소개

이 Ecma 표준은 ECMAScript 2026 언어를 정의합니다. 이것은 ECMAScript 언어 명세의 열일곱 번째 에디션입니다. 1997년 첫 번째 에디션이 출판된 이후, ECMAScript는 세계에서 가장 널리 사용되는 범용 프로그래밍 언어 중 하나로 성장했습니다. 주로 웹 브라우저에 내장된 언어로 잘 알려져 있지만, 서버 및 임베디드 애플리케이션에서도 널리 채택되었습니다.

ECMAScript는 여러 원천 기술을 기반으로 하며, 그 중 가장 잘 알려진 것은 JavaScript(넷스케이프)와 JScript(마이크로소프트)입니다. 이 언어는 넷스케이프의 Brendan Eich가 발명했으며, 처음으로 그 회사의 Navigator 2.0 브라우저에 등장했습니다. 이후 넷스케이프의 모든 브라우저와 마이크로소프트의 Internet Explorer 3.0부터 모든 브라우저에 포함되었습니다.

ECMAScript 언어 명세의 개발은 1996년 11월에 시작되었습니다. 이 Ecma 표준의 첫 번째 에디션은 1997년 6월 Ecma 총회에서 채택되었습니다.

그 Ecma 표준은 ISO/IEC JTC 1에 신속 채택 절차 하에 제출되었으며, 1998년 4월 국제 표준 ISO/IEC 16262로 승인되었습니다. 1998년 6월 Ecma 총회에서 ISO/IEC 16262와 완전히 일치시키기 위해 ECMA-262 두 번째 에디션이 승인되었습니다. 첫 번째와 두 번째 에디션의 차이점은 편집상의 변경입니다.

표준의 세 번째 에디션에서는 강력한 정규식, 향상된 문자열 처리, 새로운 제어문, try/catch 예외 처리, 오류 정의 강화, 숫자 출력 포맷 및 향후 언어 성장에 대비한 사소한 변경이 도입되었습니다. ECMAScript 표준의 세 번째 에디션은 1999년 12월 Ecma 총회에서 채택되었으며, 2002년 6월 ISO/IEC 16262:2002로 출판되었습니다.

세 번째 에디션 출판 이후, ECMAScript는 월드와이드웹과 함께 엄청난 채택을 이루었으며, 사실상 모든 웹 브라우저에서 지원되는 프로그래밍 언어가 되었습니다. ECMAScript의 네 번째 에디션을 개발하기 위한 중요한 작업이 이루어졌으나, 그 작업은 완성되지 않았고 네 번째 에디션으로 출판되지 않았습니다. 다만 일부 내용은 여섯 번째 에디션 개발에 통합되었습니다.

ECMAScript의 다섯 번째 에디션(ECMA-262 5번째 에디션으로 출판됨)은 브라우저 구현에서 일반적으로 사용되는 언어 명세의 사실상 해석을 공식화하였고, 세 번째 에디션 출판 이후 등장한 새로운 기능 지원을 추가했습니다. 이러한 기능에는 접근자 속성, 객체의 반영적 생성 및 검사, 속성 특성의 프로그램 제어, 추가 배열 조작 함수, JSON 객체 인코딩 포맷 지원, 그리고 향상된 오류 검사와 프로그램 보안을 제공하는 엄격 모드가 포함됩니다. 다섯 번째 에디션은 2009년 12월 Ecma 총회에서 채택되었습니다.

다섯 번째 에디션은 신속 채택 절차에 따라 ISO/IEC JTC 1에 제출되어 국제 표준 ISO/IEC 16262:2011로 승인되었습니다. ECMAScript 표준의 5.1 에디션은 사소한 수정이 반영되었으며 ISO/IEC 16262:2011과 동일한 텍스트입니다. 5.1 에디션은 2011년 6월 Ecma 총회에서 채택되었습니다.

여섯 번째 에디션의 집중 개발은 2009년에 시작되었으며, 다섯 번째 에디션이 출판 준비 중이었습니다. 하지만 그 이전에도 1999년 세 번째 에디션 출판 이후 상당한 실험과 언어 개선 디자인 작업이 이루어졌습니다. 실제로 여섯 번째 에디션의 완성은 15년간의 노력의 결실입니다. 이 에디션의 목표는 대규모 애플리케이션, 라이브러리 제작, 그리고 ECMAScript를 다른 언어의 컴파일 타겟으로 사용하는 데 더 나은 지원을 제공하는 것이었습니다. 주요 개선사항에는 모듈, 클래스 선언, 렉시컬 블록 스코프, 이터레이터와 제너레이터, 비동기 프로그래밍을 위한 프라미스, 구조 분해 패턴, 적절한 꼬리 호출이 포함되었습니다. ECMAScript 내장 라이브러리는 맵, 셋, 2진 숫자 값 배열 등의 추가 데이터 추상화 지원과 문자열 및 정규식에서 유니코드 보충 문자 추가 지원을 포함하여 더욱 확장되었습니다. 내장 객체는 서브클래싱을 통해 확장 가능해졌습니다. 여섯 번째 에디션은 정기적이고 점진적인 언어 및 라이브러리 개선의 토대를 제공합니다. 여섯 번째 에디션은 2015년 6월 총회에서 채택되었습니다.

ECMAScript 2016은 Ecma TC39의 새로운 연간 릴리즈 주기와 공개 개발 프로세스 하에서 릴리즈된 첫 번째 ECMAScript 에디션입니다. 텍스트 소스 문서는 ECMAScript 2015 소스에서 제작되어 GitHub에서 추가 개발의 기반이 되었습니다. 표준 개발 기간 동안 수백 개의 풀 리퀘스트와 이슈가 제출되어 수천 건의 버그 수정, 편집 개선 및 기타 향상 작업이 이루어졌습니다. 또한 Ecmarkup, Ecmarkdown, Grammarkdown 등 여러 소프트웨어 도구가 개발되었습니다. ES2016에는 새로운 거듭제곱 연산자와 Array.prototypeincludes 메서드가 추가되었습니다.

ECMAScript 2017은 Async 함수, 공유 메모리, Atomics, 그리고 더 작은 언어 및 라이브러리 개선, 버그 수정, 편집 업데이트를 도입했습니다. Async 함수는 프라미스를 반환하는 함수에 대한 문법을 제공하여 비동기 프로그래밍 경험을 향상시킵니다. 공유 메모리와 Atomics는 병렬 CPU에서도 명확한 실행 순서를 보장하는 원자적 연산을 사용하여 다중 에이전트 프로그램이 통신할 수 있는 새로운 메모리 모델을 도입했습니다. 또한 객체에 대한 새로운 정적 메서드인 Object.values, Object.entries, Object.getOwnPropertyDescriptors도 포함되었습니다.

ECMAScript 2018은 비동기 이터레이터 프로토콜과 async 제너레이터를 통해 비동기 반복 지원을 도입했습니다. 또한 네 가지 새로운 정규식 기능(dotAll 플래그, 명명된 캡처 그룹, 유니코드 속성 이스케이프, 그리고 look-behind 어설션)과 객체의 rest 및 spread 속성을 추가했습니다.

ECMAScript 2019는 Array.prototypeflatflatMap 함수를 통한 배열 평탄화, Object.entries의 반환값을 새 객체로 바로 변환하는 Object.fromEntries, 더 나은 이름의 String.prototype.trimStarttrimEnd 내장 함수(기존 비표준 trimLeft, trimRight 대체용) 등 몇 가지 새로운 내장 함수를 도입했습니다. 또한 문법 및 의미론에 대한 소규모 업데이트(선택적 catch 바인딩 파라미터, JSON과 일치시키기 위해 문자열 리터럴에서 U+2028 및 U+2029 허용 등)가 포함되었습니다. 기타 업데이트에는 Array.prototype.sort의 안정적 정렬 요구, JSON.stringify의 입력에 상관없이 올바른 UTF-8 반환 요구, Function.prototype.toString의 명확화(원본 소스 텍스트 또는 표준 플레이스홀더 반환 요구)가 있습니다.

ECMAScript 2020, 11번째 에디션은 문자열의 matchAll 메서드(글로벌 정규식으로 생성된 모든 매치 객체에 대한 이터레이터 생성), import() 문법(동적 지정자로 모듈을 비동기적으로 import), BigInt(임의 정밀도의 정수를 다루는 새로운 숫자 원시 타입), Promise.allSettled(짧은 회로 없음), globalThis(글로벌 this 값 접근의 범용 방법), 모듈 내 export * as ns from 'module' 문법, for-in 열거 순서의 표준화 강화, 모듈 내에서 컨텍스트 정보를 담을 수 있는 import.meta 객체, nullish 값(undefined 또는 null)을 다루기 위한 새로운 문법(nullish 병합 연산자, 옵셔널 체이닝 연산자) 등을 도입했습니다.

ECMAScript 2021, 12번째 에디션은 문자열의 replaceAll 메서드, Promise.any(입력값이 fulfill될 때 짧은 회로), AggregateError(여러 오류를 한 번에 표현하는 새로운 오류 타입), 논리 할당 연산자(??=, &&=, ||=), WeakRef(가비지 컬렉션에서 객체를 보존하지 않고 참조), FinalizationRegistry(가비지 컬렉션 시 정리 작업 등록 및 해제 관리), 숫자 리터럴 구분자(1_000), Array.prototype.sort의 구현 정의 정렬 순서 정렬 순서의 경우 감소 등 다양한 기능을 도입했습니다.

ECMAScript 2022, 13번째 에디션은 모듈의 최상위에서 await 사용을 허용하는 기능, 클래스 내의 새로운 요소(퍼블릭 및 프라이빗 인스턴스 필드, 퍼블릭 및 프라이빗 정적 필드, 프라이빗 인스턴스 메서드 및 접근자, 프라이빗 정적 메서드 및 접근자), 클래스 내 정적 블록(클래스별 평가 초기화 수행), #x in obj 문법(객체에 프라이빗 필드 존재 여부 테스트), /d 플래그(정규식 매치 인덱스 제공), Error 객체의 cause 속성(에러의 원인 연쇄 기록), 문자열, 배열, TypedArrayat 메서드(상대 인덱싱 지원), Object.hasOwn(Object.prototype.hasOwnProperty의 편리한 대안) 등을 도입했습니다.

ECMAScript 2023, 14번째 에디션은 Array.prototypeTypedArray.prototypetoSorted, toReversed, with, findLast, findLastIndex 메서드, Array.prototypetoSpliced 메서드, 파일 시작 부분에 #! 주석 지원(실행 가능한 ECMAScript 파일 지원 향상), 대부분의 심볼을 weak 컬렉션의 키로 사용 가능 등 기능을 도입했습니다.

ECMAScript 2024, 15번째 에디션은 ArrayBuffer 및 SharedArrayBuffer의 리사이즈 및 전송 기능, 문자열 집합 작업을 위한 고급 기능의 새로운 RegExp /v 플래그, Promise 생성 편의 메서드 Promise.withResolvers, 데이터 집계용 Object.groupByMap.groupBy 메서드, 공유 메모리 변경을 비동기적으로 대기하는 Atomics.waitAsync 메서드, 문자열의 올바른 유니코드만 포함되는지 검사 및 보장하는 String.prototype.isWellFormedString.prototype.toWellFormed 메서드 등을 도입했습니다.

ECMAScript 2025, 16번째 에디션은 이터레이터 작업을 위한 새로운 Iterator 글로벌과 관련 정적 및 프로토타입 메서드, Set.prototype의 일반적 셋 연산 메서드, JSON 모듈 import 및 import된 모듈의 속성 선언 문법, 정규식 내 안전한 문자열 사용을 위한 RegExp.escape 메서드, 정규식 내에서 인라인으로 modifier 플래그 활성/비활성화 문법, 함수의 반환값이 프라미스일 수도 아닐 수도 있을 때 항상 프라미스로 반환하는 Promise.try 메서드, 새로운 Float16Array TypedArray 종류와 관련 DataView.prototype.getFloat16, DataView.prototype.setFloat16, Math.f16round 메서드를 도입했습니다.

Ecma TC39 내에서 많은 조직을 대표하는 수십 명의 개인이 이 에디션과 이전 에디션의 개발에 매우 중요한 기여를 했습니다. 또한 TC39의 ECMAScript 작업을 지원하는 활발한 커뮤니티가 생겨났습니다. 이 커뮤니티는 수많은 초안 검토, 수천 건의 버그 리포트 제출, 구현 실험, 테스트 스위트 기여, ECMAScript에 대한 전 세계 개발자 교육 등 다양한 활동을 했습니다. 모든 기여자와 조직을 식별하고 인정하는 것은 불가능합니다.

Allen Wirfs-Brock
ECMA-262, 프로젝트 에디터, 6번째 에디션

Brian Terlson
ECMA-262, 프로젝트 에디터, 7번째 ~ 10번째 에디션

Jordan Harband
ECMA-262, 프로젝트 에디터, 10번째 ~ 12번째 에디션

Shu-yu Guo
ECMA-262, 프로젝트 에디터, 12번째 ~ 16번째 에디션

Michael Ficarra
ECMA-262, 프로젝트 에디터, 12번째 ~ 16번째 에디션

Kevin Gibbons
ECMA-262, 프로젝트 에디터, 12번째 ~ 16번째 에디션

1 범위

이 표준은 ECMAScript 2026 범용 프로그래밍 언어를 정의합니다.

2 적합성

ECMAScript의 준수 구현체는 이 명세서에 기술된 모든 타입, 값, 객체, 프로퍼티, 함수, 프로그램 구문 및 의미론을 제공하고 지원해야 합니다.

ECMAScript의 준수 구현체는 소스 텍스트 입력을 최신 버전의 유니코드 표준 및 ISO/IEC 10646에 따라 해석해야 합니다.

다양한 인간 언어와 국가에서 사용되는 언어적, 문화적 관습에 적응이 필요한 프로그램을 지원하는 API를 제공하는 ECMAScript의 준수 구현체는 이 명세서와 호환되는 ECMA-402의 최신판에서 정의된 인터페이스를 구현해야 합니다.

ECMAScript의 준수 구현체는 이 명세서에 기술된 것 이외의 추가 타입, 값, 객체, 프로퍼티, 함수 등을 제공할 수 있습니다. 특히, 준수 구현체는 명세서에 기술되지 않은 프로퍼티와 그 값, 그리고 명세서에 기술된 객체에 대해 추가 프로퍼티를 제공할 수 있습니다.

ECMAScript의 준수 구현체는 이 명세서에 기술되지 않은 프로그램 및 정규식 구문을 지원할 수 있습니다. 특히, 준수 구현체는 이 명세서의 예약어로 지정된 “미래 12.7.2”를 사용하는 프로그램 구문을 지원할 수 있습니다.

ECMAScript의 준수 구현체는 17.1절에서 금지 확장으로 명시된 어떤 확장도 구현해서는 안 됩니다.

ECMAScript의 준수 구현체는 구현 정의, 구현 근사, 또는 호스트 정의가 아닌 어떤 기능도 재정의해서는 안 됩니다.

ECMAScript의 준수 구현체는 규범적 선택 사항 절을 구현할지 말지 선택할 수 있습니다. 어떤 규범적 선택 사항 동작을 구현하는 경우, 해당 규범적 선택 사항 절의 모든 동작을 구현해야 합니다. 규범적 선택 사항 절은 아래와 같이 색상 박스에 “Normative Optional”이라는 단어로 표시됩니다.

2.1 규범적 선택 사항 절 제목 예시

절 내용 예시.

ECMAScript의 준수 구현체는 규범적 선택 사항으로도 표시되지 않는 레거시 절을 반드시 구현해야 합니다. 레거시 절 내에 명시된 모든 언어 기능과 동작은 하나 이상의 바람직하지 않은 특성을 가지고 있습니다. 그러나 기존 애플리케이션에서 계속 사용되고 있기 때문에 이 명세서에서 제거할 수 없습니다. 이러한 기능은 ECMAScript 언어의 핵심에 해당하지 않습니다. 새로운 ECMAScript 코드를 작성할 때 프로그래머는 이러한 기능과 동작을 사용하거나 존재를 가정해서는 안 됩니다.

2.2 레거시 절 제목 예시

절 내용 예시.

2.3 레거시 규범적 선택 사항 절 제목 예시

절 내용 예시.

3 규범적 참고문헌

다음에 참조된 문서는 이 문서의 적용에 필수적입니다. 날짜가 명시된 참고문헌의 경우, 인용된 판만 적용됩니다. 날짜가 명시되지 않은 참고문헌의 경우, 해당 문서의 최신판(모든 개정 포함)이 적용됩니다.

IEEE 754-2019, IEEE 부동소수점 산술 표준.

유니코드 표준.
https://unicode.org/versions/latest

ISO/IEC 10646, 정보 기술 — 범용 다중-옥텟 인코딩 문자 집합(UCS) 및 Amendment 1:2005, Amendment 2:2006, Amendment 3:2008, Amendment 4:2008, 그리고 추가 개정 및 정오표, 또는 후속판.

ECMA-402, ECMAScript 국제화 API 명세, 특히 이 명세의 해당 연도판.
https://www.ecma-international.org/publications-and-standards/standards/ecma-402/

ECMA-404, JSON 데이터 교환 포맷.
https://www.ecma-international.org/publications-and-standards/standards/ecma-404/

4 개요

이 절은 ECMAScript 언어에 대한 비규범적 개요를 포함합니다.

ECMAScript는 호스트 환경 내에서 계산을 수행하고 계산 객체를 조작하기 위한 객체 지향 프로그래밍 언어입니다. 여기서 정의된 ECMAScript는 계산적으로 자급자족하는 것을 목표로 하지 않습니다. 실제로, 이 명세에는 외부 데이터 입력이나 계산 결과 출력을 위한 규정이 없습니다. 대신, ECMAScript 프로그램의 계산 환경은 이 명세에 설명된 객체 및 기타 기능뿐만 아니라, 환경별 객체도 제공할 것으로 예상되며, 이러한 객체의 설명과 동작은 이 명세의 범위를 벗어나지만 특정 속성에 접근하거나 ECMAScript 프로그램에서 호출할 수 있는 함수가 있을 수 있음을 나타냅니다.

ECMAScript는 원래 스크립트 언어로 설계되었으나, 현재는 범용 프로그래밍 언어로 널리 사용되고 있습니다. 스크립트 언어는 기존 시스템의 기능을 조작, 사용자화, 자동화하는 데 사용되는 프로그래밍 언어입니다. 이러한 시스템에서는 이미 유용한 기능이 사용자 인터페이스를 통해 제공되고, 스크립트 언어는 해당 기능을 프로그램 제어로 노출하는 수단입니다. 이렇게 기존 시스템이 호스트 환경의 객체와 기능을 제공하여 스크립트 언어의 역량을 완성합니다. 스크립트 언어는 전문가와 비전문가 모두 사용할 수 있도록 설계되었습니다.

ECMAScript는 원래 웹 스크립트 언어로 설계되어 브라우저에서 웹 페이지에 생동감을 부여하거나 웹 기반 클라이언트-서버 구조에서 서버 계산을 수행하는 메커니즘을 제공했습니다. ECMAScript는 이제 다양한 호스트 환경에서 핵심 스크립트 기능을 제공합니다. 따라서 핵심 언어는 특정 호스트 환경과 별도로 이 문서에서 명세됩니다.

ECMAScript의 사용은 단순 스크립트에서 벗어나 현재는 여러 환경과 규모에서 모든 프로그래밍 작업에 사용됩니다. ECMAScript의 사용이 확장됨에 따라 제공하는 기능과 설비도 확장되었습니다. ECMAScript는 이제 완전한 범용 프로그래밍 언어입니다.

4.1 웹 스크립팅

웹 브라우저는 클라이언트 측 계산을 위한 ECMAScript 호스트 환경을 제공합니다. 여기에는 예를 들어, 창, 메뉴, 팝업, 대화 상자, 텍스트 영역, 앵커, 프레임, 히스토리, 쿠키, 입출력을 나타내는 객체 등이 포함됩니다. 또한 호스트 환경은 포커스 변경, 페이지 및 이미지 로딩, 언로드, 오류 및 중단, 선택, 폼 제출, 마우스 동작 등 이벤트에 스크립트 코드를 연결하는 방법을 제공합니다. 스크립트 코드는 HTML 내에 나타나며, 표시되는 페이지는 사용자 인터페이스 요소와 고정 및 계산된 텍스트 및 이미지의 조합입니다. 스크립트 코드는 사용자 상호작용에 반응하며, 메인 프로그램이 필요하지 않습니다.

웹 서버는 요청, 클라이언트, 파일을 나타내는 객체, 데이터 잠금 및 공유 메커니즘 등 서버 측 계산을 위한 별도의 호스트 환경을 제공합니다. 브라우저 측과 서버 측 스크립팅을 함께 사용하면, 사용자 맞춤형 웹 애플리케이션에서 클라이언트와 서버 간에 계산을 분산시킬 수 있습니다.

ECMAScript를 지원하는 각 웹 브라우저와 서버는 자체 호스트 환경을 제공하여 ECMAScript 실행 환경을 완성합니다.

4.2 호스트와 구현체

호스트 환경에 ECMAScript 통합을 돕기 위해, 이 명세는 특정 기능(예: 추상 연산)의 정의를 전체 또는 일부 외부 소스에 위임합니다. 편집상, 이 명세는 다음과 같은 위임 유형을 구분합니다.

구현체는 부록 D에 열거된 기능이나 구현 정의 또는 구현 근사로 표시된 기능을 외부에서 추가 정의하는 소스입니다. 비공식적으로, 구현체는 특정 웹 브라우저와 같은 구체적인 산출물을 의미합니다.

구현 정의 기능은 추가적인 자격 없이 정의를 외부 소스에 위임하는 기능입니다. 이 명세는 특정 동작에 대한 권고를 하지 않으며, 준수 구현체는 이 명세가 제시하는 제약 내에서 어떤 동작이든 자유롭게 선택할 수 있습니다.

구현 근사 기능은 이상적인 동작을 권고하면서 정의를 외부 소스에 위임하는 기능입니다. 준수 구현체는 이 명세가 제시하는 제약 내에서 어떤 동작이든 자유롭게 선택할 수 있지만, 이상적인 동작에 근접하도록 노력해야 합니다. Math.exp와 같은 일부 수학 연산은 구현 근사에 해당합니다.

호스트는 부록 D에 열거된 기능을 추가 정의하지만, 그 외의 구현 정의 또는 구현 근사 기능은 추가 정의하지 않는 외부 소스입니다. 비공식적으로, 호스트는 부록 D를 통해 이 명세와 같은 방식으로 연결되는 모든 구현체 집합(모든 웹 브라우저 집합 등)을 의미합니다. 호스트는 종종 WHATWG HTML(https://html.spec.whatwg.org/)과 같은 외부 명세입니다. 즉, 호스트 정의 기능은 종종 외부 명세에서 추가로 정의됩니다.

호스트 후크는 전체 또는 일부가 외부 소스에 의해 정의되는 추상 연산입니다. 모든 호스트 후크는 부록 D에 나열되어야 합니다. 호스트 후크는 최소한 다음 요구사항을 충족해야 합니다:

호스트 정의 기능은 추가적인 자격 없이 정의를 외부 소스에 위임하며, 부록 D에 나열되어야 합니다. 호스트가 아닌 구현체도 호스트 정의 기능에 대한 정의를 제공할 수 있습니다.

호스트 환경은 모든 호스트 정의 기능에 대한 구체적 정의 선택입니다. 호스트 환경에는 일반적으로 호스트 정의 속성으로 입력을 얻거나 출력을 제공하는 객체 또는 함수가 포함되고, 이는 글로벌 객체에 속합니다.

이 명세는 항상 가장 구체적인 용어를 사용하는 편집 관례를 따릅니다. 예를 들어, 어떤 기능이 호스트 정의라면, 구현 정의로 언급해서는 안 됩니다.

호스트와 구현체 모두 이 명세가 정의한 언어 타입, 명세 타입, 추상 연산, 문법 생성규칙, 내장 객체, 내장 심볼을 통해 이 명세와 인터페이스할 수 있습니다.

4.3 ECMAScript 개요

다음은 ECMAScript에 대한 비공식적 개요입니다. 언어의 모든 부분이 설명된 것은 아니며, 이 개요는 표준의 일부가 아닙니다.

ECMAScript는 객체 기반입니다. 기본 언어 및 호스트 기능이 객체로 제공되며, ECMAScript 프로그램은 서로 통신하는 객체 집합입니다. ECMAScript에서 객체는 0개 이상의 프로퍼티로 이루어진 컬렉션이며, 각 프로퍼티는 해당 프로퍼티의 사용 방식을 결정하는 속성을 가집니다. 예를 들어, 프로퍼티의 Writable 속성이 false로 설정된 경우, ECMAScript 코드가 해당 프로퍼티에 다른 값을 할당하려는 모든 시도는 실패합니다. 프로퍼티는 다른 객체, 프리미티브 값, 또는 함수를 저장하는 컨테이너입니다. 프리미티브 값은 다음 내장 타입 중 하나에 속합니다: Undefined, Null, Boolean, Number, BigInt, String, Symbol; 객체는 내장 타입 Object에 속하며, 함수는 호출 가능한 객체입니다. 객체에 프로퍼티로 연결된 함수를 메서드라고 합니다.

ECMAScript는 ECMAScript 엔티티 정의를 완성하는 내장 객체 집합도 정의합니다. 이러한 내장 객체에는 글로벌 객체, 언어의 런타임 의미론에 기본적인 객체들(Object, Function, Boolean, Symbol, 다양한 Error 객체), 숫자 값을 나타내고 조작하는 객체들(Math, Number, Date), 텍스트 처리 객체(String, RegExp), 값이 인덱스된 컬렉션(Array 및 9종의 Typed Array), 키 기반 컬렉션(Map, Set 객체), 구조화된 데이터 지원(JSON 객체, ArrayBuffer, SharedArrayBuffer, DataView), 제어 추상화를 지원하는 객체(제너레이터 함수, Promise 객체), 그리고 반영 객체(Proxy, Reflect)가 포함됩니다.

ECMAScript는 내장 연산자 집합도 정의합니다. ECMAScript 연산자에는 다양한 단항 연산, 곱셈 연산자, 덧셈 연산자, 비트 시프트 연산자, 관계 연산자, 동등성 연산자, 이진 비트 연산자, 이진 논리 연산자, 할당 연산자, 쉼표 연산자가 포함됩니다.

대규모 ECMAScript 프로그램은 모듈을 통해 지원되며, 프로그램을 여러 문(statement) 및 선언(declaration) 시퀀스로 분할할 수 있습니다. 각 모듈은 다른 모듈에서 제공되어야 할 선언과, 다른 모듈에서 사용할 수 있는 자신의 선언을 명시적으로 식별합니다.

ECMAScript 문법은 의도적으로 Java 문법과 유사하게 설계되었습니다. ECMAScript 문법은 쉽게 사용할 수 있는 스크립트 언어가 되도록 완화되어 있습니다. 예를 들어, 변수는 타입 선언이 필요하지 않으며, 프로퍼티에 타입이 연결되지 않고, 정의된 함수도 호출보다 먼저 선언될 필요가 없습니다.

4.3.1 객체

ECMAScript에는 클래스 정의 구문이 포함되어 있지만, ECMAScript 객체는 C++, Smalltalk, Java와 같은 언어의 객체처럼 근본적으로 클래스 기반이 아닙니다. 대신, 객체는 리터럴 표기법이나 생성자를 통해 여러 방식으로 생성될 수 있으며, 생성자는 객체를 생성한 후 초기 값을 프로퍼티에 할당하여 객체 전체 또는 일부를 초기화하는 코드를 실행합니다. 각 생성자"prototype"이라는 프로퍼티를 가지는 함수로, 프로토타입 기반 상속공유 프로퍼티를 구현합니다. 객체는 new 표현식에서 생성자를 사용하여 생성됩니다. 예를 들어, new Date(2009, 11)은 새로운 Date 객체를 생성합니다. new 없이 생성자를 호출하면, 그 결과는 생성자에 따라 다릅니다. 예를 들어, Date()는 객체가 아니라 현재 날짜와 시간의 문자열 표현을 반환합니다.

생성자로 생성된 모든 객체는 암시적 참조(객체의 프로토타입이라 함)를 가지며, 이는 해당 생성자"prototype" 프로퍼티 값입니다. 또한, 프로토타입은 자신의 프로토타입에 대한 null이 아닌 암시적 참조를 가질 수 있습니다. 이를 프로토타입 체인이라고 합니다. 객체의 프로퍼티에 대한 참조가 이루어지면, 해당 참조는 프로토타입 체인에서 그 이름의 프로퍼티를 가진 첫 번째 객체의 프로퍼티에 대한 참조입니다. 즉, 먼저 직접 언급된 객체에서 프로퍼티를 찾고, 해당 객체에 프로퍼티가 있으면 그 프로퍼티를 참조하며, 없다면 그 객체의 프로토타입을 다음으로 검사합니다.

그림 1: 객체/프로토타입 관계
상자와 화살표가 많은 이미지.

클래스 기반 객체 지향 언어에서는 일반적으로 상태는 인스턴스가, 메서드는 클래스가 가지며, 상속은 구조와 동작에만 적용됩니다. ECMAScript에서는 상태와 메서드가 객체에 포함되며, 구조, 동작, 상태 모두 상속됩니다.

프로토타입에 특정 프로퍼티가 있지만 직접 해당 프로퍼티를 가지지 않는 모든 객체는 그 프로퍼티와 값을 공유합니다. 그림 1은 이를 보여줍니다:

CF생성자(그리고 객체)입니다. new 표현식을 통해 5개 객체가 생성되었습니다: cf1, cf2, cf3, cf4, cf5. 각 객체는 "q1""q2"라는 프로퍼티를 가집니다. 점선은 암시적 프로토타입 관계를 나타냅니다. 예를 들어, cf3의 프로토타입은 CFp입니다. 생성자 CF는 두 개의 프로퍼티("P1", "P2")를 가지지만, CFp, cf1, cf2, cf3, cf4, cf5에서는 볼 수 없습니다. CFp"CFP1" 프로퍼티는 cf1, cf2, cf3, cf4, cf5에서 공유되며(CF에서는 공유되지 않음), CFp의 암시적 프로토타입 체인에서 "q1", "q2", "CFP1"이 아닌 다른 프로퍼티도 마찬가지로 공유됩니다. CFCFp 사이에는 암시적 프로토타입 링크가 없습니다.

대부분의 클래스 기반 객체 언어와 달리, 객체에는 값을 할당하여 동적으로 프로퍼티를 추가할 수 있습니다. 즉, 생성자는 생성된 객체의 모든 프로퍼티를 반드시 명명하거나 값을 할당할 필요가 없습니다. 위 다이어그램에서 cf1, cf2, cf3, cf4, cf5에 대해 CFp에 새 값을 할당하여 새로운 공유 프로퍼티를 추가할 수 있습니다.

ECMAScript 객체는 본질적으로 클래스 기반은 아니지만, 공통된 생성자 함수, 프로토타입 객체, 메서드 패턴에 기반하여 클래스와 유사한 추상화를 정의하는 것이 편리한 경우가 많습니다. ECMAScript 내장 객체 자체도 이러한 클래스와 유사한 패턴을 따릅니다. ECMAScript 2015부터 ECMAScript 언어에는 내장 객체가 사용하는 클래스와 유사한 추상화 패턴에 맞는 객체를 간결하게 정의할 수 있는 문법적 클래스 정의가 포함되어 있습니다.

4.3.2 ECMAScript의 엄격 변형(strict variant)

ECMAScript 언어는 일부 사용자가 언어의 일부 기능 사용을 제한하고자 할 수도 있음을 인식합니다. 이는 보안, 오류 발생 가능성이 높은 기능 회피, 향상된 오류 검사, 기타 이유 등으로 이루어질 수 있습니다. 이를 지원하기 위해, ECMAScript는 엄격 변형(strict variant)을 정의합니다. 엄격 변형은 일반 ECMAScript 언어의 일부 구문적·의미론적 기능을 제외하고, 일부 기능의 상세 의미론을 수정합니다. 엄격 변형에서는 비엄격(non-strict) 언어 형태에서는 오류로 지정되지 않은 상황에서도 오류 예외를 던져야 하는 추가 오류 조건도 지정합니다.

ECMAScript의 엄격 변형은 일반적으로 언어의 엄격 모드(strict mode)라고 불립니다. 엄격 모드 선택 및 엄격 모드 구문과 의미론 사용은 ECMAScript 소스 텍스트 단위 수준에서 명시적으로 이루어지며, 이는 11.2.2에서 설명되어 있습니다. 엄격 모드는 구문 소스 텍스트 단위 수준에서 선택되므로, 엄격 모드는 해당 소스 텍스트 단위 내에서만 국지적으로 적용되는 제한을 부과합니다. 엄격 모드는 여러 소스 텍스트 단위에 걸쳐 일관되게 동작해야 하는 ECMAScript 의미론의 어떤 측면도 제한하거나 수정하지 않습니다. 완전한 ECMAScript 프로그램은 엄격 모드 및 비엄격 모드 ECMAScript 소스 텍스트 단위를 모두 포함할 수 있습니다. 이 경우, 실제로 엄격 모드 소스 텍스트 단위 내에서 정의된 코드를 실행할 때만 엄격 모드가 적용됩니다.

이 명세를 준수하려면, ECMAScript 구현체는 이 명세에서 정의된 전체 제한 없는 ECMAScript 언어와 엄격 변형 ECMAScript 언어를 모두 구현해야 합니다. 또한, 구현체는 제한 없는 소스 텍스트 단위와 엄격 모드 소스 텍스트 단위를 하나의 복합 프로그램으로 결합하는 것도 지원해야 합니다.

4.4 용어 및 정의

이 문서의 목적상, 다음 용어와 정의가 적용됩니다.

4.4.1 implementation-approximated

implementation-approximated 기능은 외부 소스에 의해 전체 또는 일부가 정의되지만, 이 명세서에서 권장되는 이상적인 동작을 가집니다.

4.4.2 implementation-defined

implementation-defined 기능은 이 명세서 외부의 소스에 의해 전체 또는 일부가 정의됩니다.

4.4.3 host-defined

implementation-defined와 동일합니다.

참고

편집상, 4.2 절을 참고하세요.

4.4.4 type

6 절에서 정의된 데이터 값 집합

4.4.5 primitive value

Undefined, Null, Boolean, Number, BigInt, Symbol, String 타입 중 하나의 멤버로, 6 절에서 정의됨

참고

프리미티브 값은 언어 구현의 가장 낮은 수준에서 직접적으로 표현되는 데이터입니다.

4.4.6 object

Object 타입의 멤버

참고

객체는 프로퍼티의 집합이며 단일 프로토타입 객체를 가집니다. 프로토타입은 null일 수 있습니다.

4.4.7 constructor

객체를 생성하고 초기화하는 함수 객체

참고

constructor"prototype" 프로퍼티 값은 상속과 공유 프로퍼티를 구현하는 프로토타입 객체입니다.

4.4.8 prototype

다른 객체에 공유 프로퍼티를 제공하는 객체

참고

constructor가 객체를 생성하면, 그 객체는 프로퍼티 참조를 해결하기 위해 constructor"prototype" 프로퍼티를 암시적으로 참조합니다. constructor"prototype" 프로퍼티는 프로그램 표현식 constructor.prototype으로 참조할 수 있습니다. 객체의 프로토타입에 프로퍼티를 추가하면, 그 프로토타입을 공유하는 모든 객체가 상속을 통해 해당 프로퍼티를 공유합니다. 또는, Object.create 내장 함수를 사용하여 명시적으로 지정된 프로토타입으로 새 객체를 생성할 수도 있습니다.

4.4.9 ordinary object

모든 객체가 지원해야 하는 필수 내부 메서드에 대해 기본 동작을 가지는 객체

4.4.10 exotic object

필수 내부 메서드 중 하나 이상에 대해 기본 동작을 가지지 않는 객체

참고

ordinary object가 아닌 모든 객체는 exotic object입니다.

4.4.11 standard object

이 명세서에서 의미론이 정의된 객체

4.4.12 built-in object

ECMAScript 구현체에 의해 명세되고 제공되는 객체

참고

표준 내장 객체는 이 명세서에서 정의되어 있습니다. ECMAScript 구현체는 추가 내장 객체 종류를 명세하고 제공할 수 있습니다.

4.4.13 undefined value

변수가 값이 할당되지 않았을 때 사용되는 프리미티브 값

4.4.14 Undefined type

유일한 값이 undefined인 타입

4.4.15 null value

어떤 객체 값도 의도적으로 존재하지 않음을 나타내는 프리미티브 값

4.4.16 Null type

유일한 값이 null인 타입

4.4.17 Boolean value

Boolean type의 멤버

참고

Boolean 값은 truefalse 단 두 가지입니다.

4.4.18 Boolean type

truefalse 프리미티브 값으로 구성된 타입

4.4.19 Boolean object

표준 내장 Boolean 생성자의 인스턴스인 Object type의 멤버

참고

Boolean 객체는 new 표현식에서 Boolean 생성자를 사용하여 Boolean 값을 인자로 전달하여 생성됩니다. 결과 객체는 Boolean 값을 가지는 내부 슬롯을 갖습니다. Boolean 객체는 Boolean 값으로 강제 변환될 수 있습니다.

4.4.20 String value

finite 16비트 부호 없는 integer 값의 0개 이상의 순서 있는 시퀀스인 프리미티브 값

참고

문자열 값은 String type의 멤버입니다. 시퀀스 내 각 integer 값은 일반적으로 UTF-16 텍스트의 16비트 단위를 나타냅니다. 그러나 ECMAScript는 값에 대해 16비트 부호 없는 integer이어야 한다는 것 외에는 제한이나 요구사항을 두지 않습니다.

4.4.21 String type

모든 가능한 문자열 값의 집합

4.4.22 String object

표준 내장 String 생성자의 인스턴스인 Object type의 멤버

참고

문자열 객체는 new 표현식에서 String 생성자를 사용하여 문자열 값을 인자로 전달하여 생성됩니다. 결과 객체는 문자열 값을 가지는 내부 슬롯을 갖습니다. 문자열 객체는 String 생성자를 함수로 호출하여 문자열 값으로 강제 변환할 수 있습니다 (22.1.1.1).

4.4.23 Number value

프리미티브 값으로, IEEE 754-2019 값에 해당하는 배정밀도 64비트 이진 형식 값

참고

숫자 값은 Number type의 멤버이며, 숫자의 직접적인 표현입니다.

4.4.24 Number type

NaN(“not a number”), +∞𝔽(양의 무한대), -∞𝔽(음의 무한대)을 포함한 모든 가능한 Number 값의 집합

4.4.25 Number object

표준 내장 Number 생성자의 인스턴스인 Object type의 멤버

참고

Number 객체는 new 표현식에서 Number 생성자를 사용하여 숫자 값을 인자로 전달하여 생성됩니다. 결과 객체는 숫자 값을 가지는 내부 슬롯을 갖습니다. Number 객체는 Number 생성자를 함수로 호출하여 숫자 값으로 강제 변환할 수 있습니다 (21.1.1.1).

4.4.26 Infinity

양의 무한대 숫자 값

4.4.27 NaN

IEEE 754-2019 NaN(“not a number”) 값인 숫자 값

4.4.28 BigInt value

임의 정밀도의 integer 값에 해당하는 프리미티브 값

4.4.29 BigInt type

모든 가능한 BigInt 값의 집합

4.4.30 BigInt object

표준 내장 BigInt 생성자의 인스턴스인 Object type의 멤버

4.4.31 Symbol value

고유하며, 문자열이 아닌 객체 프로퍼티 키를 나타내는 프리미티브 값

4.4.32 Symbol type

모든 가능한 심볼 값의 집합

4.4.33 Symbol object

표준 내장 Symbol 생성자의 인스턴스인 Object type의 멤버

4.4.34 function

서브루틴으로 호출될 수 있는 Object type의 멤버

참고

함수는 자신의 프로퍼티 외에도, 호출될 때 동작을 결정하는 실행 코드와 상태를 포함합니다. 함수의 코드는 ECMAScript로 작성되었을 수도 있고 아닐 수도 있습니다.

4.4.35 built-in function

함수인 내장 객체

참고

내장 함수의 예로 parseIntMath.exp가 있습니다. 호스트 또는 구현체는 이 명세서에 기술되지 않은 추가 내장 함수를 제공할 수 있습니다.

4.4.36 built-in constructor

생성자인 내장 함수

참고

내장 생성자의 예로 ObjectFunction이 있습니다. 호스트 또는 구현체는 이 명세서에 기술되지 않은 추가 내장 생성자를 제공할 수 있습니다.

4.4.37 property

키(String 값 또는 Symbol 값)와 값을 연결하는 객체의 일부

참고

프로퍼티의 형태에 따라 값은 데이터 값(프리미티브 값, 객체 또는 함수 객체)으로 직접 표현되거나, 접근자 함수 쌍으로 간접적으로 표현될 수 있습니다.

4.4.38 method

프로퍼티 값인 함수

참고

함수가 객체의 메서드로 호출될 때, 해당 객체는 함수의 this 값으로 전달됩니다.

4.4.39 built-in method

내장 함수인 메서드

참고

표준 내장 메서드는 이 명세서에서 정의되어 있습니다. 호스트 또는 구현체는 이 명세서에 기술되지 않은 추가 내장 메서드를 제공할 수 있습니다.

4.4.40 attribute

프로퍼티의 특성을 정의하는 내부 값

4.4.41 own property

해당 객체에 직접 포함된 프로퍼티

4.4.42 inherited property

객체의 프로퍼티 중 직접 포함된 것이 아니지만, 객체의 프로토타입(직접 또는 상속된)에 있는 프로퍼티

4.5 이 명세의 구성

이 명세의 나머지 부분은 다음과 같이 구성되어 있습니다:

5절에서는 명세 전체에서 사용되는 표기 관례를 정의합니다.

6절부터 10절까지는 ECMAScript 프로그램이 동작하는 실행 환경을 정의합니다.

11절부터 17절까지는 모든 언어 기능의 구문적 인코딩과 실행 의미론을 포함하여 실제 ECMAScript 프로그래밍 언어를 정의합니다.

18절부터 28절까지는 ECMAScript 표준 라이브러리를 정의합니다. 여기에는 ECMAScript 프로그램이 실행 시 사용할 수 있는 모든 표준 객체의 정의가 포함됩니다.

29절에서는 SharedArrayBuffer 기반 메모리의 접근 및 Atomics 객체 메서드의 메모리 일관성 모델을 설명합니다.

5 표기 규칙

5.1 구문 및 렉시컬 문법

5.1.1 문맥 자유 문법

문맥 자유 문법은 여러 개의 생산으로 구성됩니다. 각 생산은 비단말 기호라는 추상적인 기호를 왼쪽에 가지고, 0개 이상의 비단말 및 단말 기호오른쪽에 나열합니다. 각 문법에서 단말 기호는 지정된 알파벳에서 가져옵니다.

연쇄 생산이란 오른쪽에 정확히 하나의 비단말 기호와 0개 이상의 단말 기호만을 가지는 생산을 말합니다.

특정 문맥 자유 문법은 목표 기호라 불리는 하나의 구별된 비단말로 구성된 문장에서 시작하여, 시퀀스 내의 아무 비단말이나 그 비단말이 왼쪽이 되는 생산의 오른쪽으로 반복적으로 대체함으로써 결과적으로 생성할 수 있는 단말 기호의 모든 가능한 시퀀스 집합(언어)을 지정합니다. 이 집합은 유한하거나 무한할 수 있습니다.

5.1.2 렉시컬 및 정규식 문법

ECMAScript의 렉시컬 문법12절에 제공됩니다. 이 문법의 단말 기호는 SourceCharacter에서 정의된 규칙에 따라 Unicode 코드 포인트입니다(11.1 참조). 이 문법은 목표 기호 InputElementDiv, InputElementTemplateTail, InputElementRegExp, InputElementRegExpOrTemplateTail, InputElementHashbangOrRegExp 등에서 시작하여, 이러한 코드 포인트 시퀀스가 입력 요소 시퀀스로 번역되는 방식을 정의합니다.

공백 문자와 주석을 제외한 입력 요소는 ECMAScript의 구문 문법의 단말 기호가 되며, 이를 ECMAScript 토큰이라 부릅니다. 이 토큰들은 예약어, 식별자, 리터럴, ECMAScript 언어의 구분자입니다. 또한, 줄 종결자는 토큰으로 간주되지 않지만 입력 요소 스트림의 일부가 되어 자동 세미콜론 삽입 과정(12.10)을 안내합니다. 단순 공백 및 한 줄 주석은 버려지며, 구문 문법을 위한 입력 요소 스트림에는 나타나지 않습니다. MultiLineComment(즉, 여러 줄에 걸쳐 있을 수 있는 /**/ 형태의 주석)는 줄 종결자가 없으면 단순히 버려집니다. 그러나 MultiLineComment가 하나 이상의 줄 종결자를 포함하는 경우, 단일 줄 종결자로 대체되어 구문 문법을 위한 입력 요소 스트림의 일부가 됩니다.

ECMAScript의 정규식 문법22.2.1에 제공됩니다. 이 문법 역시 SourceCharacter로 정의된 코드 포인트를 단말 기호로 사용합니다. 이 문법은 목표 기호 Pattern에서 시작하여, 코드 포인트 시퀀스가 정규식 패턴으로 변환되는 방법을 설명합니다.

렉시컬 및 정규식 문법의 생산은 구분 기호로 두 개의 콜론 “::”을 사용하여 구분됩니다. 렉시컬 문법과 정규식 문법은 일부 생산을 공유합니다.

5.1.3 숫자 문자열 문법

숫자 문자열 문법7.1.4.1에서 나타납니다. 이 문법은 SourceCharacter를 단말 기호로 사용하며, 목표 기호 StringNumericLiteral에서 시작하여 문자열을 숫자 값으로 변환하는 데 사용됩니다(이는 숫자 리터럴의 렉시컬 문법과 유사하지만 다릅니다).

숫자 문자열 문법의 생산은 세 개의 콜론 “:::”으로 구분되며, 소스 텍스트 파싱에는 절대 사용되지 않습니다.

5.1.4 구문 문법

ECMAScript의 구문 문법13부터 16까지의 절에 제공됩니다. 이 문법은 렉시컬 문법에서 정의된 ECMAScript 토큰을 단말 기호로 사용합니다(5.1.2). 목표 기호 ScriptModule에서 시작하여, 토큰 시퀀스가 ECMAScript 프로그램의 구문적으로 올바른 독립 구성 요소를 형성하는 방법을 설명합니다.

코드 포인트 스트림을 ECMAScript Script 또는 Module로 파싱할 때, 먼저 렉시컬 문법을 반복적으로 적용하여 입력 요소 스트림으로 변환합니다. 그 후 이 입력 요소 스트림을 단일 구문 문법 적용으로 파싱합니다. 입력 스트림의 토큰들이 목표 비단말(Script 또는 Module)의 단일 인스턴스로 파싱될 수 없거나 토큰이 남아 있다면 구문 오류입니다.

파싱에 성공하면, 파싱 트리라는 루트가 있는 트리 구조를 생성합니다. 각 노드는 파싱 노드입니다. 각 파싱 노드는 문법 기호의 인스턴스이며, 해당 기호로부터 유도될 수 있는 소스 텍스트의 범위를 나타냅니다. 파싱 트리의 루트 노드(소스 텍스트 전체를 나타냄)는 파싱의 목표 기호의 인스턴스입니다. 파싱 노드가 비단말의 인스턴스인 경우, 그 비단말을 왼쪽으로 하는 생산의 인스턴스이기도 합니다. 또한, 오른쪽에 있는 각 기호마다 0개 이상의 자식을 가지며, 각 자식은 해당 기호의 파싱 노드 인스턴스입니다.

새로운 파싱 노드는 파서 호출마다 인스턴스화되며 동일한 소스 텍스트라도 파싱 간에는 재사용되지 않습니다. 파싱 노드는 동일한 소스 텍스트 범위를 나타내고, 동일한 문법 기호의 인스턴스이며, 동일한 파서 호출에서 생성된 경우에만 동일한 파싱 노드로 간주됩니다.

참고 1

동일한 문자열을 여러 번 파싱하면 서로 다른 파싱 노드가 생성됩니다. 예를 들어,

let str = "1 + 1;";
eval(str);
eval(str);

eval 호출은 str의 값을 ECMAScript 소스 텍스트로 변환하고, 각기 독립적으로 파싱하여 별도의 파싱 노드 트리를 생성합니다. 각 파싱은 동일한 문자열 값에서 유래했더라도 트리는 서로 다릅니다.

참고 2
파싱 노드는 명세상의 산물이며, 구현체는 유사한 데이터 구조를 사용할 필요는 없습니다.

구문 문법의 생산은 구분 기호로 하나의 콜론 “:”만을 사용합니다.

13부터 16까지 제시된 구문 문법은 ECMAScript Script 또는 Module에 대해 허용되는 토큰 시퀀스의 완전한 설명이 아닙니다. 특정 추가 토큰 시퀀스도 허용되는데, 이는 특정 위치(예: 줄 종결자 앞)에 세미콜론만 추가하면 문법에서 설명될 수 있는 시퀀스입니다. 또한, 문법에서 설명된 일부 토큰 시퀀스는 특정 “어색한” 위치에 줄 종결자가 나타나면 허용되지 않습니다.

특정 경우, 모호성을 피하기 위해 구문 문법은 유효한 ECMAScript Script 또는 Module를 형성하지 않는 토큰 시퀀스도 허용하는 일반화된 생산을 사용합니다. 예를 들어, 객체 리터럴 및 객체 구조 분해 패턴에서 이 기법이 사용됩니다. 이러한 경우, 허용되는 토큰 시퀀스를 더욱 제한하는 보조 문법이 제공됩니다. 일반적으로 조기 오류 규칙은 특정 문맥에서 "PN포함해야 한다"라고 명시합니다. 여기서 P는 일반화된 생산의 파싱 노드 인스턴스이며 N은 보조 문법의 비단말입니다. 이는 다음을 의미합니다:

  1. P가 원래 매칭한 토큰 시퀀스를 N목표 기호로 하여 다시 파싱합니다. N이 문법 파라미터를 가지면, P가 원래 파싱될 때와 동일한 값으로 설정합니다.
  2. 토큰 시퀀스가 N의 단일 인스턴스로 파싱될 수 있고, 토큰이 남지 않으면:
    1. 해당 P에 대해 고유한 N 인스턴스를 "P포함하는 N”이라고 부릅니다.
    2. N 및 그 파생 생산에 대한 모든 조기 오류 규칙은 P가 포함하는 N에도 적용됩니다.
  3. 그렇지 않으면(파싱이 실패하면) 조기 문법 오류입니다.

5.1.5 문법 표기법

5.1.5.1 단말 기호

ECMAScript 문법에서 일부 단말 기호는 고정폭 글꼴로 표시됩니다. 이러한 기호는 소스 텍스트에 정확히 작성된 대로 나타나야 합니다. 이 방식으로 지정된 모든 단말 기호 코드 포인트는 기본 라틴 블록의 적절한 Unicode 코드 포인트로 이해되어야 하며, 다른 Unicode 범위의 유사한 코드 포인트와는 다릅니다. 단말 기호의 코드 포인트는 \ UnicodeEscapeSequence로 표현할 수 없습니다.

단말 기호가 개별 Unicode 코드 포인트인 문법(즉, 렉시컬, 정규식, 숫자 문자열 문법)에서, 생산 내 여러 고정폭 코드 포인트가 연속적으로 나타나는 것은 동일한 시퀀스의 코드 포인트를 각각 독립된 단말 기호로 작성하는 것에 대한 간단한 약어입니다.

예를 들어, 다음 생산:

HexIntegerLiteral :: 0x HexDigits

는 다음과 같은 약어입니다:

HexIntegerLiteral :: 0 x HexDigits

반대로, 구문 문법에서는 고정폭 코드 포인트가 연속적으로 나타나면 하나의 단일 단말 기호입니다.

단말 기호는 다음 두 가지 형태도 있습니다:

  • 렉시컬 및 정규식 문법에서는 일반적으로 인쇄되는 표현이 없는 Unicode 코드 포인트가 대신 "<ABBREV>" 형태로 표시되며, "ABBREV"는 해당 코드 포인트 또는 코드 포인트 집합을 위한 기억법입니다. 이러한 형태는 유니코드 포맷-컨트롤 문자, 공백 문자, 줄 종결자에서 정의됩니다.
  • 구문 문법에서는 특정 단말 기호(예: IdentifierName, RegularExpressionLiteral)는 이탤릭체로 나타나는데, 이는 해당 이름의 비단말을 렉시컬 문법에서 참조하기 때문입니다.

5.1.5.2 비단말 기호 및 생산

비단말 기호는 이탤릭체로 표시됩니다. 비단말의 정의(생산이라고도 함)는 정의되는 비단말의 이름 뒤에 하나 이상의 콜론이 붙어 도입됩니다. (콜론의 개수는 해당 생산이 속하는 문법을 나타냅니다.) 비단말의 하나 이상의 대체 오른쪽 부분이 뒤따라 나열됩니다. 예를 들어, 구문 정의는 다음과 같습니다:

WhileStatement : while ( Expression ) Statement

이 정의는 WhileStatement 비단말이 while 토큰, 이어서 왼쪽 괄호 토큰, 이어서 Expression, 이어서 오른쪽 괄호 토큰, 이어서 Statement를 나타냄을 의미합니다. ExpressionStatement는 각각 비단말입니다. 또 다른 예시로, 구문 정의는 다음과 같습니다:

ArgumentList : AssignmentExpression ArgumentList , AssignmentExpression

이 정의는 ArgumentList가 하나의 AssignmentExpression 또는 ArgumentList 뒤에 쉼표, 그리고 AssignmentExpression가 올 수 있음을 의미합니다. 이 ArgumentList 정의는 재귀적이며, 자기 자신을 기준으로 정의됩니다. 결과적으로 ArgumentList는 쉼표로 구분된 임의의 개수의 인수를 포함할 수 있으며, 각 인수 식은 AssignmentExpression 입니다. 이러한 비단말의 재귀적 정의는 흔합니다.

5.1.5.3 선택적 기호

단말 또는 비단말 뒤에 나타날 수 있는 아래첨자 접미사 “opt”는 선택적 기호임을 나타냅니다. 선택적 기호가 포함된 대안은 실제로 선택적 요소를 생략한 오른쪽과 포함한 오른쪽의 두 가지를 지정합니다. 이는 다음을 의미합니다:

VariableDeclaration : BindingIdentifier Initializeropt

는 다음과 같은 편리한 약어입니다:

VariableDeclaration : BindingIdentifier BindingIdentifier Initializer

그리고 다음과 같습니다:

ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement

는 다음과 같은 편리한 약어입니다:

ForStatement : for ( LexicalDeclaration ; Expressionopt ) Statement for ( LexicalDeclaration Expression ; Expressionopt ) Statement

이는 다시 다음과 같은 약어입니다:

ForStatement : for ( LexicalDeclaration ; ) Statement for ( LexicalDeclaration ; Expression ) Statement for ( LexicalDeclaration Expression ; ) Statement for ( LexicalDeclaration Expression ; Expression ) Statement

즉, 이 예시에서 ForStatement 비단말은 실제로 네 가지 대안 오른쪽을 가집니다.

5.1.5.4 문법 파라미터

생산은 아래첨자 주석 "[parameters]" 형태로 파라미터화될 수 있으며, 이는 생산에서 정의된 비단말 기호의 접미사로 나타날 수 있습니다. “parameters”는 하나의 이름 또는 쉼표로 구분된 이름 목록일 수 있습니다. 파라미터화된 생산은 해당 파라미터 이름의 모든 조합에 대한 생산 집합을 나타내는 약어로, 파라미터화된 비단말 기호 뒤에 언더스코어와 함께 붙여집니다. 이는 다음을 의미합니다:

StatementList[Return] : ReturnStatement ExpressionStatement

는 다음과 같은 편리한 약어입니다:

StatementList : ReturnStatement ExpressionStatement StatementList_Return : ReturnStatement ExpressionStatement

그리고 다음과 같습니다:

StatementList[Return, In] : ReturnStatement ExpressionStatement

는 다음과 같은 약어입니다:

StatementList : ReturnStatement ExpressionStatement StatementList_Return : ReturnStatement ExpressionStatement StatementList_In : ReturnStatement ExpressionStatement StatementList_Return_In : ReturnStatement ExpressionStatement

여러 파라미터는 조합적으로 많은 생산을 생성하며, 이들 모두가 반드시 완전한 문법에서 참조되는 것은 아닙니다.

생산의 오른쪽에 있는 비단말 참조 역시 파라미터화될 수 있습니다. 예를 들어:

StatementList : ReturnStatement ExpressionStatement[+In]

는 다음과 동일합니다:

StatementList : ReturnStatement ExpressionStatement_In

그리고 다음과 같습니다:

StatementList : ReturnStatement ExpressionStatement[~In]

는 다음과 동일합니다:

StatementList : ReturnStatement ExpressionStatement

비단말 참조는 파라미터 목록과 “opt” 접미사를 모두 가질 수 있습니다. 예를 들어:

VariableDeclaration : BindingIdentifier Initializer[+In]opt

는 다음과 같은 약어입니다:

VariableDeclaration : BindingIdentifier BindingIdentifier Initializer_In

오른쪽 비단말 참조에 파라미터 이름 앞에 “?”를 붙이면, 해당 파라미터 값이 현재 생산의 왼쪽 기호 참조에 나타나는 파라미터 이름에 의존함을 의미합니다. 예를 들어:

VariableDeclaration[In] : BindingIdentifier Initializer[?In]

는 다음과 같은 약어입니다:

VariableDeclaration : BindingIdentifier Initializer VariableDeclaration_In : BindingIdentifier Initializer_In

오른쪽 대안에 “[+parameter]”가 접두사로 붙으면, 해당 대안은 지정된 파라미터가 생산의 비단말 기호 참조에 사용될 때만 사용할 수 있습니다. “[~parameter]”가 접두사로 붙으면, 해당 대안은 지정된 파라미터가 사용되지 않을 때만 사용할 수 있습니다. 이는 다음을 의미합니다:

StatementList[Return] : [+Return] ReturnStatement ExpressionStatement

는 다음과 같은 약어입니다:

StatementList : ExpressionStatement StatementList_Return : ReturnStatement ExpressionStatement

그리고 다음과 같습니다:

StatementList[Return] : [~Return] ReturnStatement ExpressionStatement

는 다음과 같은 약어입니다:

StatementList : ReturnStatement ExpressionStatement StatementList_Return : ExpressionStatement

5.1.5.5 one of

문법 정의에서 콜론 뒤에 “one of”가 나오면, 다음 줄 또는 줄들에 있는 각 단말 기호가 대안 정의임을 나타냅니다. 예를 들어, ECMAScript의 렉시컬 문법에는 다음과 같은 생산이 있습니다:

NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9

이는 다음과 같은 간편한 약어입니다:

NonZeroDigit :: 1 2 3 4 5 6 7 8 9

5.1.5.6 [empty]

생산의 오른쪽에 “[empty]”라는 문구가 나타나면, 해당 생산의 오른쪽에 단말 또는 비단말이 없음을 나타냅니다.

5.1.5.7 전방 탐색 제한

생산의 오른쪽에 “[lookahead = seq]” 문구가 나타나면, 해당 생산은 토큰 시퀀스 seq가 즉시 뒤따르는 입력 토큰 시퀀스의 접두사인 경우에만 사용할 수 있음을 나타냅니다. 마찬가지로 “[lookahead ∈ set]”에서 set유한하고 비어 있지 않은 토큰 시퀀스 집합일 때, 해당 생산은 집합의 일부 요소가 즉시 뒤따르는 토큰 시퀀스의 접두사인 경우에만 사용할 수 있음을 나타냅니다. 편의를 위해 집합을 비단말로도 쓸 수 있는데, 이 경우 해당 비단말이 확장될 수 있는 모든 토큰 시퀀스의 집합을 나타냅니다. 만약 비단말이 무한히 많은 토큰 시퀀스로 확장될 수 있다면 이는 편집상 오류로 간주됩니다.

이 조건들은 부정될 수 있습니다. “[lookahead ≠ seq]”는 seq가 즉시 뒤따르는 입력 토큰 시퀀스의 접두사가 아닌 경우에만 해당 생산을 사용할 수 있음을 나타내며, “[lookahead ∉ set]”는 어느 요소도 즉시 뒤따르는 토큰 시퀀스의 접두사가 아닌 경우에만 해당 생산을 사용할 수 있음을 나타냅니다.

예시로, 다음 정의가 주어졌을 때:

DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9 DecimalDigits :: DecimalDigit DecimalDigits DecimalDigit

다음과 같은 정의에서:

LookaheadExample :: n [lookahead ∉ { 1, 3, 5, 7, 9 }] DecimalDigits DecimalDigit [lookahead ∉ DecimalDigit]

이 정의는 n 문자 뒤에 하나 이상의 십진수 숫자가 오는데, 첫 번째 숫자가 짝수인 경우, 또는 십진수 숫자가 뒤에 다른 십진수 숫자가 오지 않는 경우를 매칭합니다.

이러한 문구가 구문 문법에서 사용될 때는, 즉시 뒤따르는 토큰 시퀀스를 명확하게 식별하는 것이 불가능할 수 있습니다. 이후 토큰을 결정하려면 이후 위치에서 사용할 렉시컬 목표 기호를 알아야 하기 때문입니다. 따라서 구문 문법에서 이러한 제한이 사용될 때, 토큰 시퀀스 seq가 전방 탐색 제한에(집합의 일부로 포함되는 경우 포함하여) 나타나고, 사용되는 렉시컬 목표 기호의 선택에 따라 seq가 결과 토큰 시퀀스의 접두사가 될 수 있는지 여부가 달라진다면, 이는 편집상 오류로 간주됩니다.

5.1.5.8 [여기 LineTerminator 없음]

구문 문법의 생산 오른쪽에 “[여기 LineTerminator 없음]”이라는 문구가 나타나면, 해당 생산은 제한된 생산임을 의미합니다. 즉, 입력 스트림의 지정된 위치에 LineTerminator가 발생하면 사용할 수 없습니다. 예를 들어, 다음 생산:

ThrowStatement : throw [여기 LineTerminator 없음] Expression ;

이 생산은 throw 토큰과 Expression 사이에 LineTerminator가 스크립트에 있으면 사용할 수 없음을 나타냅니다.

제한된 생산에 의해 LineTerminator의 존재가 금지되지 않는 한, 입력 요소 스트림 내의 연속된 두 토큰 사이에는 임의의 개수의 LineTerminator가 있어도 스크립트의 구문적 허용성에는 영향을 주지 않습니다.

5.1.5.9 but not

생산의 오른쪽에 “but not” 문구를 사용하여, 확장 중 특정 경우를 허용하지 않음을 지정할 수 있습니다. 예를 들어, 다음 생산:

Identifier :: IdentifierName but not ReservedWord

이 정의는 Identifier 비단말이 IdentifierName로 대체될 수 있으나, 같은 코드 포인트 시퀀스가 ReservedWord로도 대체될 수 있다면 허용되지 않음을 의미합니다.

5.1.5.10 설명적 문구

마지막으로, 경우에 따라 모든 대안을 나열하는 것이 비현실적일 때 몇몇 비단말 기호는 산세리프체 설명 문구로 서술됩니다:

SourceCharacter :: 모든 Unicode 코드 포인트

5.2 알고리즘 규칙

명세에서는 종종 번호가 매겨진 목록을 사용하여 알고리즘의 단계를 지정합니다. 이러한 알고리즘은 ECMAScript 언어 구성 요소의 필수 의미를 정확히 명시하는 데 사용됩니다. 이 알고리즘들은 특정 구현 기법의 사용을 암시하려는 의도가 아닙니다. 실제로는 주어진 기능을 구현할 때 더 효율적인 알고리즘이 있을 수 있습니다.

알고리즘은 명시적으로 매개변수화될 수 있으며, 쉼표로 구분된 순서의 별칭 이름 시퀀스를 사용하여, 알고리즘 단계 내에서 해당 위치에 전달된 인수를 참조할 수 있습니다. 선택적 매개변수는 괄호([ , name ])로 둘러싸여 있으며, 알고리즘 단계 내에서는 필수 매개변수와 다르지 않습니다. 나머지 매개변수(rest parameter)는 매개변수 목록의 끝에 ...name 형태로 나타나며, 필수 및 선택적 매개변수 뒤에 제공된 모든 인수를 List에 담습니다. 추가 인수가 없다면 해당 List는 비어 있습니다.

알고리즘 단계는 순차적 하위 단계로 세분화될 수 있습니다. 하위 단계는 들여쓰기되며, 자체적으로 추가 하위 단계로 나눌 수 있습니다. 개요 번호 규칙에 따라 첫 번째 하위 단계는 소문자 알파벳, 두 번째 하위 단계는 소문자 로마 숫자가 사용됩니다. 세 단계보다 많으면 네 번째 단계는 숫자 라벨을 사용하며, 예시는 다음과 같습니다:

  1. 최상위 단계
    1. 하위 단계.
    2. 하위 단계.
      1. 하위하위 단계.
        1. 하위하위하위 단계
          1. 하위하위하위하위 단계
            1. 하위하위하위하위하위 단계

단계 또는 하위 단계는 “if” 조건문으로 작성되어 그 하위 단계를 조건부로 적용할 수 있습니다. 이 경우, 조건이 참일 때만 하위 단계가 적용됩니다. 단계 또는 하위 단계가 “else”로 시작하면, 같은 수준의 앞선 “if” 조건문의 부정 조건입니다.

단계는 그 하위 단계를 반복적으로 적용한다고 명시할 수 있습니다.

Assert:”로 시작하는 단계는 알고리즘의 불변 조건을 주장합니다. 이러한 주장은 암묵적인 알고리즘적 불변 조건을 명시적으로 드러내기 위해 사용됩니다. 이러한 주장은 추가적인 의미적 요구사항을 부과하지 않으므로 구현체에서 반드시 검사할 필요는 없습니다. 오로지 알고리즘을 명확히 하기 위해 사용됩니다.

알고리즘 단계에서는 “Let x be someValue” 형태로 명명된 별칭(alias)을 선언할 수 있습니다. 이 별칭은 참조처럼 동작하여 xsomeValue 모두 동일한 데이터 기반을 참조하며, 둘 중 하나를 변경하면 모두에게 반영됩니다. 참조와 같은 동작을 피하고 싶다면 “Let x be a copy of someValue”처럼 오른쪽 값을 복사하도록 명시해야 하며, 이는 someValue의 얕은 복사본을 생성합니다.

한 번 선언된 별칭은 이후 단계에서 참조할 수 있으며, 별칭 선언 이전의 단계에서는 참조해서는 안 됩니다. 별칭은 “Set x to someOtherValue” 형태로 수정할 수 있습니다.

5.2.1 추상 연산

명세의 여러 부분에서 사용될 수 있도록, 일부 알고리즘은 추상 연산이라 불리며, 이름이 붙고 매개변수화된 함수 형태로 작성되어 다른 알고리즘에서 이름으로 참조될 수 있습니다. 추상 연산은 보통 OperationName(arg1, arg2)과 같은 함수 호출 방식으로 참조됩니다. 일부 추상 연산은 클래스와 유사한 명세 추상화의 다형적으로 호출되는 메서드로 취급되기도 합니다. 이러한 메서드형 추상 연산은 일반적으로 someValue.OperationName(arg1, arg2)와 같은 메서드 호출 방식으로 참조됩니다.

5.2.2 구문 지향 연산

구문 지향 연산이란, 하나 이상의 ECMAScript 문법 생산에 연결된 알고리즘으로 구성된 이름 있는 연산입니다. 여러 대안 정의가 있는 생산은 일반적으로 각 대안마다 별도의 알고리즘을 가집니다. 알고리즘이 문법 생산에 연결되면, 해당 대안의 단말 및 비단말 기호를 알고리즘의 매개변수처럼 참조할 수 있습니다. 이 방식에서 비단말 기호는 소스 텍스트를 파싱할 때 실제로 일치한 대안 정의를 참조합니다. 문법 생산이나 그로부터 파생된 파싱 노드가 일치시킨 소스 텍스트란, 일치에 참여한 첫 번째 단말부터 마지막 단말까지의 소스 텍스트 부분을 의미합니다.

알고리즘이 생산 대안에 연결되면, 대안은 일반적으로 “[ ]” 문법 주석 없이 표시됩니다. 이러한 주석은 대안의 구문 인식에만 영향을 주며, 연결된 의미에는 영향을 주지 않습니다.

구문 지향 연산은 파싱 노드와 필요하다면 추가 매개변수를 전달하여, 다음 알고리즘의 1, 3, 4 단계 규칙을 따라 호출됩니다:

  1. Let status be SyntaxDirectedOperation of SomeNonTerminal.
  2. Let someParseNode be the parse of some source text.
  3. Perform SyntaxDirectedOperation of someParseNode.
  4. Perform SyntaxDirectedOperation of someParseNode with argument "value".

명시적으로 달리 지정하지 않는 한, 모든 연쇄 생산은 해당 생산의 왼쪽 비단말에 적용될 수 있는 모든 연산에 대한 암묵적 정의를 가집니다. 암묵적 정의는 동일한 연산을 동일한 매개변수로, 해당 연쇄 생산의 유일한 오른쪽 비단말에 다시 적용한 뒤 그 결과를 반환합니다. 예를 들어, 어떤 알고리즘이 “Return Evaluation of Block” 단계를 가진다고 가정하고, 다음과 같은 생산이 있다고 합시다:

Block : { StatementList }

하지만 Evaluation 연산이 해당 생산에 알고리즘을 연결하지 않았다면, Evaluation 연산은 암묵적으로 다음과 같은 연결을 포함합니다:

런타임 의미: Evaluation

Block : { StatementList }
  1. Return Evaluation of StatementList.

5.2.3 런타임 의미

런타임에 호출되어야 할 의미를 명시하는 알고리즘을 런타임 의미라 합니다. 런타임 의미는 추상 연산이나 구문 지향 연산으로 정의됩니다.

5.2.3.1 Completion ( completionRecord )

추상 연산 Completion은 completionRecord (Completion Record) 인자를 받아 Completion Record를 반환합니다. 이는 Completion Record가 반환됨을 강조할 때 사용됩니다. 다음 단계를 수행합니다:

  1. Assert: completionRecordCompletion Record이다.
  2. completionRecord를 반환한다.

5.2.3.2 예외 던지기

예외를 던지라고 하는 알고리즘 단계, 예:

  1. TypeError 예외를 던진다.

는 다음과 동일한 의미입니다:

  1. Return ThrowCompletion(새롭게 생성된 TypeError 객체).

5.2.3.3 ReturnIfAbrupt

다음과 같은 알고리즘 단계 혹은 동등한 단계:

  1. ReturnIfAbrupt(argument).

는 다음과 동일한 의미입니다:

  1. Assert: argumentCompletion Record이다.
  2. 만약 argumentabrupt completion이면, Completion(argument)를 반환한다.
  3. 그렇지 않으면, argumentargument.[[Value]]로 설정한다.

다음과 같은 알고리즘 단계 혹은 동등한 단계:

  1. ReturnIfAbrupt(AbstractOperation()).

는 다음과 동일한 의미입니다:

  1. hygienicTemp를 AbstractOperation()의 결과로 설정한다.
  2. Assert: hygienicTempCompletion Record이다.
  3. 만약 hygienicTempabrupt completion이면, Completion(hygienicTemp)를 반환한다.
  4. 그렇지 않으면, hygienicTemphygienicTemp.[[Value]]로 설정한다.

hygienicTemp는 ReturnIfAbrupt와 관련된 단계 내에서만 잠시 사용됩니다.

다음과 같은 알고리즘 단계 혹은 동등한 단계:

  1. result를 AbstractOperation(ReturnIfAbrupt(argument))의 결과로 설정한다.

는 다음과 동일한 의미입니다:

  1. Assert: argumentCompletion Record이다.
  2. 만약 argumentabrupt completion이면, Completion(argument)를 반환한다.
  3. 그렇지 않으면, argumentargument.[[Value]]로 설정한다.
  4. result를 AbstractOperation(argument)의 결과로 설정한다.

5.2.3.4 ReturnIfAbrupt 약어

추상 연산구문 지향 연산 호출 앞에 ?가 붙으면, 결과 Completion RecordReturnIfAbrupt를 적용해야 함을 나타냅니다. 예:

  1. ? OperationName().

다음 단계와 동일합니다:

  1. ReturnIfAbrupt(OperationName()).

유사하게, 메서드 호출 방식에서는 다음 단계:

  1. someValue.OperationName().

다음과 동일합니다:

  1. ReturnIfAbrupt(someValue.OperationName()).

유사하게, ! 접두사는 뒤따르는 추상 또는 구문 지향 연산abrupt completion을 반환하지 않고, 결과 Completion Record[[Value]] 필드를 연산의 반환 값으로 사용해야 함을 나타냅니다. 예:

  1. Let val be ! OperationName().

다음 단계와 동일합니다:

  1. Let val be OperationName().
  2. Assert: valnormal completion이다.
  3. valval.[[Value]]로 설정한다.

구문 지향 연산런타임 의미에서 ! 또는 ?를 연산 호출 앞에 붙여 이 약어를 사용합니다:

  1. Perform ! SyntaxDirectedOperation of NonTerminal.

5.2.3.5 암묵적 정상 완료

추상 연산에서 Completion Record를 반환한다고 선언된 알고리즘과 모든 내장 함수에서, 반환값은 먼저 NormalCompletion에 전달되고, 그 결과가 실제로 사용됩니다. 이 규칙은 Completion 알고리즘 내부나, 반환값이 해당 단계에서 명확히 Completion Record로 표시된 경우에는 적용되지 않습니다. 이러한 경우는 다음과 같습니다:

이러한 추상 연산에서 다른 방식으로 Completion Record가 반환되면 편집상 오류입니다. 예를 들어, 이러한 추상 연산 내에서,

  1. Return true.

는 다음과 같은 단계와 동일합니다:

  1. Return NormalCompletion(true).

또는

  1. Let completion be NormalCompletion(true).
  2. Return Completion(completion).

또는

  1. Return Completion Record { [[Type]]: normal, [[Value]]: true, [[Target]]: empty  }.

ReturnIfAbrupt 확장 규칙을 통해, 다음 예시는 허용됩니다. 확장된 단계 내에서는 Completion의 결과가 비정상(abrupt)인 경우 직접 반환되고, 정상(normal)인 경우 언랩 후 암묵적으로 NormalCompletion이 적용됩니다.

  1. Return ? completion.

다음 예시는 Completion Record가 해당 단계에서 명시적으로 표시되지 않고 반환되므로 편집상 오류입니다.

  1. Let completion be NormalCompletion(true).
  2. Return completion.

5.2.4 정적 의미

문맥 자유 문법만으로는 입력 요소 스트림이 평가 가능한 유효한 ECMAScript Script 또는 Module인지 결정하는 모든 규칙을 표현하기에는 충분하지 않습니다. 어떤 상황에서는 ECMAScript 알고리즘 규칙이나 산문적 요구사항으로 표현되는 추가 규칙이 필요합니다. 이러한 규칙은 항상 문법 생산에 연결되며, 해당 생산의 정적 의미라 불립니다.

정적 의미 규칙은 이름을 가지며, 보통 알고리즘으로 정의됩니다. 이름 있는 정적 의미 규칙은 문법 생산에 연결되고, 여러 대안 정의가 있는 생산은 각 대안마다 적용 가능한 이름 있는 정적 의미 규칙에 대해 별도의 알고리즘을 가집니다.

정적 의미 규칙의 특수한 종류가 조기 오류 규칙입니다. 조기 오류 규칙은 특정 문법 생산과 연결된 조기 오류 조건을 정의합니다(17 절 참조). 대부분의 조기 오류 규칙에 대한 Evaluation 호출은 명세 알고리즘 내에서 명시적으로 호출되지 않습니다. 적합한 구현체는 Script 또는 Module을 최초로 평가하기 전에, 해당 Script 또는 Module을 파싱하는 데 사용된 모든 생산의 조기 오류 규칙을 검사해야 합니다. 만약 조기 오류 규칙이 위반되면, 해당 Script 또는 Module은 유효하지 않으며 평가될 수 없습니다.

5.2.5 수학 연산

이 명세에서는 다음과 같은 종류의 수치 값을 참조합니다:

  • 수학적 값: 임의의 실수. 기본 숫자 타입으로 사용됩니다.
  • 확장 수학적 값: 수학적 값과 함께 +∞, -∞를 포함합니다.
  • 숫자(Number): IEEE 754-2019 binary64(배정밀도 부동소수점) 값.
  • BigInt: ECMAScript 언어 값으로 임의의 정수를 일대일로 나타냅니다.

이 명세에서 수치 값은 아래첨자 접미사를 통해 서로 다른 숫자 종류로 구분됩니다. 𝔽는 Number, 는 BigInt를 의미합니다. 접미사가 없는 수치 값은 수학적 값을 의미합니다. 대부분의 수치 값은 10진수로 표기되며, 0x로 시작하는 경우 16진수 값입니다.

일반적으로 명세에서 "the length of y" 또는 "the integer represented by the four hexadecimal digits ..."처럼 숫자 종류를 명시하지 않을 때는 수학적 값을 의미합니다. Number 또는 BigInt 값은 명시적으로 표시됩니다. 예: "the Number value for the number of code points in …" 또는 "the BigInt value for …".

명세에서 정수(integer)란 별도 명시가 없는 한 수학적 값정수 집합에 속하는 값을 의미합니다. 정수(Number)유한 Number 값 중 수학적 값정수 집합에 속하는 값을 의미합니다.

+, ×, =, ≥ 등의 수치 연산자는 피연산자의 타입에 따라 해당 연산을 의미합니다. 수학적 값에 적용하면 일반적인 수학 연산을 의미합니다. 확장 수학적 값에 적용하면 확장 실수에 대한 연산을 의미하며, 결정할 수 없는 형태는 정의되지 않으며 명세에서 사용하면 편집상 오류입니다. Number에 적용하면 IEEE 754-2019의 관련 연산을 의미합니다. BigInt에 적용하면 해당 BigInt의 수학적 값에 대한 일반적인 수학 연산을 의미합니다. 서로 다른 타입의 피연산자(예: Number와 수학적 값)에 적용된 수치 연산자는 정의되지 않으며, 명세에서 사용하면 편집상 오류입니다.

수학적 값과 Number 또는 BigInt 간 변환은 항상 명시적으로 이루어집니다. 수학적 값 또는 확장 수학적 값 x를 Number로 변환하는 것은 "the Number value for x" 또는 𝔽(x)으로 표기하며, 6.1.6.1에서 정의됩니다. 정수 x를 BigInt로 변환하는 것은 "the BigInt value for x" 또는 ℤ(x)으로 표기합니다. Number 또는 BigInt x수학적 값으로 변환하는 것은 "the mathematical value of x" 또는 ℝ(x)으로 표기합니다. mathematical value of +0𝔽-0𝔽수학적 값 0입니다. mathematical value of 비-유한 값은 정의되지 않습니다. extended mathematical value of x유한 값에서는 mathematical value of x와 동일하며, +∞𝔽-∞𝔽에는 +∞, -∞이고, NaN에는 정의되지 않습니다.

수학 함수 abs(x)x의 절대값을 반환하며, x < 0이면 -x, 그렇지 않으면 x 자체입니다.

수학 함수 min(x1, x2, … , xN)x1부터 xN 중 가장 작은 값을 반환합니다. max(x1, x2, ..., xN)는 가장 큰 값을 반환합니다. 이 함수들의 정의역과 치역은 확장 수학적 값입니다.

표기 “x modulo y”(y유한이며 0이 아니어야 함)은 y와 부호가 같거나 0인 k 값을 계산하며, abs(k) < abs(y)이고, x - k = q × y정수 q가 존재합니다.

“the result of clamping x between lower and upper”(x확장 수학적 값, lower, upper수학적 값이고 lowerupper)은 x < lowerlower를, x > upperupper를, 그렇지 않으면 x를 반환합니다.

수학 함수 floor(x)x보다 크지 않은 가장 큰 정수(+∞에 가장 가까운)를 반환합니다.

참고

floor(x) = x - (x modulo 1).

수학 함수 truncate(x)x의 소수 부분을 제거하여 0에 가까워지도록 반올림합니다. x < 0이면 -floor(-x), 그렇지 않으면 floor(x)을 반환합니다.

수학 함수 min, max, abs, floor, truncate는 Number와 BigInt에는 정의되지 않으며, 비-수학적 값 인수가 사용되면 편집상 오류입니다.

구간(interval)은 하한 a에서 상한 b까지의, 같은 숫자 타입의 값을 요소로 가지는 (무한하거나 비어 있을 수 있는) 집합입니다. 각 경계는 포함 또는 배타로 설명됩니다. 다음 네 가지 구간이 있습니다:

  • 구간 a(포함)에서 b(포함)까지, 즉 포함 구간 a에서 b까지는 axb인 같은 타입의 값 x를 모두 포함합니다.
  • 구간 a(포함)에서 b(배타)까지는 ax < b인 값을 모두 포함합니다.
  • 구간 a(배타)에서 b(포함)까지는 a < xb인 값을 모두 포함합니다.
  • 구간 a(배타)에서 b(배타)까지는 a < x < b인 값을 모두 포함합니다.

예를 들어, 1(포함)에서 2(배타)까지의 구간은 1과 2 사이의 모든 수학적 값을 포함하며, 1은 포함하고 2는 포함하지 않습니다. 구간 정의를 위해 -0𝔽 < +0𝔽이므로, 예를 들어 하한이 +0𝔽포함 구간+0𝔽는 포함하지만 -0𝔽는 포함하지 않습니다. NaN은 어떤 구간에도 포함되지 않습니다.

5.2.6 값 표기법

이 명세에서 ECMAScript 언어 값굵은 글씨로 표시됩니다. 예시로 null, true, "hello" 등이 있습니다. 이는 ECMAScript 소스 텍스트(예: Function.prototype.apply 또는 let n = 42;)와 구별됩니다.

5.2.7 동일성(Identity)

이 명세에서는 명세 값과 ECMAScript 언어 값 모두 동등성 비교를 수행합니다. 비교 시 값은 두 범주로 나뉩니다. 동일성 없는 값(value without identity)은 모든 고유 특성이 같으면 서로 동등합니다— 예: 정수의 크기, 시퀀스의 길이 등. 동일성 없는 값은 특성을 완전히 기술하는 것만으로도 나타낼 수 있습니다. 반면, 동일성 있는 값(value with identity)은 고유하며 자기 자신과만 동등합니다. 동일성 있는 값은 동일성 없는 값과 같지만 identity라 불리는 추가적이고 유일하며 변하지 않는 특성을 가집니다. 기존 동일성 있는 값에 대한 참조는 단순히 특성을 기술하는 것만으로 생성할 수 없으며, 반드시 명시적으로 전달되어야 합니다. 동일성 있는 값 중 일부는 변경 가능(mutable)하며, 특성(동일성 제외)이 변경될 수 있어 모든 참조자에게 새로운 특성이 관찰됩니다. 동일성 없는 값은 동일성 있는 값과 절대 동등하지 않습니다.

명세 관점에서 “is”는 두 값을 동등성 비교하는 데 사용되며(예: “If bool is true, then ...”), “contains”는 리스트 내에서 동등성 비교로 값을 찾는 데 사용됩니다(예: "If list contains a Record r such that r.[[Foo]] is true, then ..."). 명세 동일성은 이러한 비교의 결과를 결정하며, 이 명세에서 공리적으로 정의됩니다.

ECMAScript 언어 관점에서는, 언어 값은 SameValue 추상 연산 및 그에 의해 전이적으로 호출되는 추상 연산으로 비교됩니다. 이 비교 추상 연산 알고리즘이 ECMAScript 언어 값언어 동일성을 결정합니다.

명세 값에 대해, 동일성 없는 값의 예는 수학적 값, 확장 수학적 값, ECMAScript 소스 텍스트, 서로게이트 페어, Directive Prologues 등, UTF-16 코드 유닛, Unicode 코드 포인트, enum, 추상 연산구문 지향 연산, host hook, 순서쌍 등입니다. 명세 동일성을 가지는 값의 예는 Record(Property Descriptor, PrivateElement 등 포함), 파싱 노드, List, SetRelation, Abstract Closure, Data Block, Private Name, 실행 컨텍스트, 실행 컨텍스트 스택, agent signifier, WaiterList Record 등입니다.

명세 동일성은 ECMAScript 언어 값Symbol.for로 생성된 Symbol 값을 제외하고는 모두 언어 동일성과 일치합니다. 명세 동일성도, 언어 동일성도 가지지 않는 ECMAScript 언어 값은 undefined, null, Boolean, String, Number, BigInt입니다. 명세 동일성과 언어 동일성을 모두 가지는 ECMAScript 언어 값은 Symbol(Symbol.for로 생성된 것은 제외)과 Object입니다. Symbol.for로 생성된 Symbol 값은 명세 동일성은 있으나 언어 동일성은 없습니다.

6 ECMAScript 데이터 타입과 값

이 명세의 알고리즘은 각 값이 관련 타입을 가진 값을 다룹니다. 가능한 값 타입은 바로 이 절에서 정의된 타입들입니다. 타입은 ECMAScript 언어 타입과 명세 타입으로 더 분류됩니다.

6.1 ECMAScript 언어 타입

ECMAScript 언어 타입은 ECMAScript 프로그래머가 ECMAScript 언어를 사용하여 직접 다루는 값에 해당합니다. ECMAScript 언어 타입에는 Undefined, Null, Boolean, String, Symbol, Number, BigInt, Object가 있습니다. ECMAScript 언어 값은 ECMAScript 언어 타입으로 특징지어지는 값입니다.

6.1.1 Undefined 타입

Undefined 타입은 undefined라 불리는 정확히 하나의 값을 가집니다. 값이 할당되지 않은 변수는 undefined 값을 가집니다.

6.1.2 Null 타입

Null 타입은 null이라 불리는 정확히 하나의 값을 가집니다.

6.1.3 Boolean 타입

Boolean 타입truefalse라 불리는 두 값을 가지는 논리적 개체를 나타냅니다.

6.1.4 String 타입

String 타입은 253 - 1개의 요소까지 0개 이상의 16비트 부호 없는 정수 값(“요소”)의 모든 순서 있는 시퀀스의 집합입니다. String 타입은 일반적으로 실행 중인 ECMAScript 프로그램에서 텍스트 데이터를 표현하는 데 사용되며, 이 경우 String의 각 요소는 UTF-16 코드 유닛 값으로 처리됩니다. 각 요소는 시퀀스 내에서 위치를 차지합니다. 이 위치는 0 이상의 정수로 인덱싱됩니다. 첫 번째 요소(있다면)는 인덱스 0에, 그 다음 요소는 인덱스 1에, 이런 식으로 이어집니다. String의 길이는 그 안의 요소(즉, 16비트 값) 개수입니다. 빈 문자열은 길이가 0이며 요소를 포함하지 않습니다.

String 내용을 해석하지 않는 ECMAScript 연산은 추가 의미를 적용하지 않습니다. String 값을 해석하는 연산은 각 요소를 하나의 UTF-16 코드 유닛으로 처리합니다. 하지만 ECMAScript는 이러한 코드 유닛의 값이나 관계를 제한하지 않으므로, String 내용을 UTF-16로 인코딩된 유니코드 코드 포인트 시퀀스로 추가 해석하는 연산은 잘못된 서브시퀀스를 고려해야 합니다. 그러한 연산은 다음 규칙에 따라 0xD800부터 0xDBFF까지의 포함 구간에 있는 코드 유닛(유니코드 표준에서 선행 서러게이트, 더 공식적으로는 고서러게이트 코드 유닛)과 0xDC00부터 0xDFFF까지의 포함 구간에 있는 코드 유닛(후행 서러게이트, 더 공식적으로는 저서러게이트 코드 유닛)을 특별히 처리합니다:

String.prototype.normalize 함수(22.1.3.15)는 String 값을 명시적으로 정규화하는 데 사용할 수 있습니다. String.prototype.localeCompare(22.1.3.12)는 내부적으로 String 값을 정규화하지만, 그 외 연산은 문자열을 암묵적으로 정규화하지 않습니다. 연산 결과는 달리 명시되지 않는 한, 언어 또는 로케일에 민감하지 않습니다.

참고

이 설계의 근거는 문자열 구현을 최대한 단순하고 빠르게 유지하기 위함이었습니다. ECMAScript 소스 텍스트가 정규형 C(Normalized Form C)라면, 문자열 리터럴도 유니코드 이스케이프 시퀀스를 포함하지 않는 한 정규화됨이 보장됩니다.

이 명세에서 “A, B, ...의 문자열 연결(string-concatenation)”(각 인자는 String 값, 코드 유닛, 코드 유닛 시퀀스임)은 각 인자의 코드 유닛(순서대로)을 이어붙인(순서대로) 코드 유닛 시퀀스로 구성된 String 값을 의미합니다.

SinclusiveStart에서 exclusiveEnd까지의 부분 문자열(substring)”(S는 String 값 또는 코드 유닛 시퀀스, inclusiveStartexclusiveEnd정수)는 S의 인덱스 inclusiveStart에서 시작해 exclusiveEnd 바로 앞까지의 연속된 코드 유닛으로 구성된 String 값을 의미합니다(만약 inclusiveStart = exclusiveEnd이면 빈 문자열). “to” 접미사가 생략되면 S의 길이가 exclusiveEnd 값으로 사용됩니다.

ASCII 단어 문자”는 다음 String 값을 의미합니다. 이 값은 유니코드 기본 라틴 블록 내의 모든 문자와 숫자 및 U+005F(LOW LINE)만으로 구성됩니다:
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_".
역사적 이유로 여러 알고리즘에서 의미가 있습니다.

6.1.4.1 StringIndexOf ( string, searchValue, fromIndex )

추상 연산 StringIndexOf는 string(String), searchValue(String), fromIndex(0 이상의 정수)를 인자로 받고, 0 이상의 정수 또는 not-found를 반환합니다. 다음 단계를 수행합니다:

  1. lenstring의 길이로 설정한다.
  2. searchValue가 빈 문자열이고 fromIndexlen이면 fromIndex를 반환한다.
  3. searchLensearchValue의 길이로 설정한다.
  4. fromIndexilen - searchLen인 모든 정수 i에 대해 오름차순으로 다음을 수행한다:
    1. candidatestringi에서 i + searchLen까지의 부분 문자열로 설정한다.
    2. candidatesearchValue와 같으면 i를 반환한다.
  5. not-found를 반환한다.
참고 1

searchValue가 빈 문자열이고 fromIndexstring의 길이인 경우, 이 알고리즘은 fromIndex를 반환합니다. 빈 문자열은 문자열 내의 모든 위치(마지막 코드 유닛 뒤까지 포함)에서 발견되는 것으로 간주됩니다.

참고 2

이 알고리즘은 fromIndex + searchValue의 길이가 string의 길이를 초과하면 항상 not-found를 반환합니다.

6.1.4.2 StringLastIndexOf ( string, searchValue, fromIndex )

추상 연산 StringLastIndexOf는 string(String), searchValue(String), fromIndex(0 이상의 정수)를 인자로 받고, 0 이상의 정수 또는 not-found를 반환합니다. 다음 단계를 수행합니다:

  1. lenstring의 길이로 설정한다.
  2. searchLensearchValue의 길이로 설정한다.
  3. Assert: fromIndex + searchLenlen.
  4. 0 ≤ ifromIndex인 모든 정수 i에 대해 내림차순으로 다음을 수행한다:
    1. candidatestringi에서 i + searchLen까지의 부분 문자열로 설정한다.
    2. candidatesearchValue와 같으면 i를 반환한다.
  5. not-found를 반환한다.
참고

searchValue가 빈 문자열인 경우, 이 알고리즘은 fromIndex를 반환합니다. 빈 문자열은 문자열 내의 모든 위치(마지막 코드 유닛 뒤까지 포함)에서 발견되는 것으로 간주됩니다.

6.1.5 심볼(Symbol) 타입

Symbol 타입은 객체 프로퍼티의 키로 사용할 수 있는 모든 문자열이 아닌 값의 집합입니다(6.1.7).

모든 Symbol 값은 고유하며 변경할 수 없습니다.

각 Symbol 값은 [[Description]]이라 불리는 관련 값을 변경 불가능하게 보유하며, 이는 undefined 또는 문자열 값입니다.

6.1.5.1 잘 알려진 심볼(Well-Known Symbols)

잘 알려진 심볼은 이 명세의 알고리즘에서 명시적으로 참조되는 내장 Symbol 값입니다. 일반적으로 명세 알고리즘의 확장 포인트로 사용되는 프로퍼티의 키로 사용됩니다. 별도 명시가 없는 한, 잘 알려진 심볼 값은 모든 realm(9.3)에서 공유됩니다.

이 명세에서는 잘 알려진 심볼을 표준 내장 표기법(intrinsic notation)을 사용하여 참조하며, 내장은 표 1에 나열된 값 중 하나입니다.

참고
이전 판 명세에서는 @@name 형태의 표기를 사용했으나, 현재 판에서는 %Symbol.name%를 사용합니다. 특히 다음 이름이 사용되었습니다: @@asyncIterator, @@hasInstance, @@isConcatSpreadable, @@iterator, @@match, @@matchAll, @@replace, @@search, @@species, @@split, @@toPrimitive, @@toStringTag, 그리고 @@unscopables.
표 1: 잘 알려진 심볼(Well-known Symbols)
명세 이름 [[Description]] 값 및 목적
%Symbol.asyncIterator% "Symbol.asyncIterator" 객체의 기본 비동기 이터레이터(async iterator)를 반환하는 메서드입니다. for-await-of 문의 의미론에서 호출됩니다.
%Symbol.hasInstance% "Symbol.hasInstance" 생성자(constructor) 객체가 특정 객체를 자신의 인스턴스로 인식하는지 결정하는 메서드입니다. instanceof 연산자의 의미론에서 호출됩니다.
%Symbol.isConcatSpreadable% "Symbol.isConcatSpreadable" true일 경우 Array.prototype.concat에 의해 객체가 배열 요소로 펼쳐져 평탄화(flatten)되어야 함을 나타내는 불리언 프로퍼티입니다.
%Symbol.iterator% "Symbol.iterator" 객체의 기본 이터레이터(iterator)를 반환하는 메서드입니다. for-of 문의 의미론에서 호출됩니다.
%Symbol.match% "Symbol.match" 정규식이 문자열과 매칭되는지 확인하는 정규식 메서드입니다. String.prototype.match 메서드에서 호출됩니다.
%Symbol.matchAll% "Symbol.matchAll" 정규식이 문자열 전체에서 매칭되는 부분을 이터레이터(iterator)로 반환하는 정규식 메서드입니다. String.prototype.matchAll 메서드에서 호출됩니다.
%Symbol.replace% "Symbol.replace" 문자열에서 매칭된 부분 문자열을 대체하는 정규식 메서드입니다. String.prototype.replace 메서드에서 호출됩니다.
%Symbol.search% "Symbol.search" 문자열 내에서 정규식이 매칭되는 인덱스를 반환하는 정규식 메서드입니다. String.prototype.search 메서드에서 호출됩니다.
%Symbol.species% "Symbol.species" 파생 객체를 생성하는 데 사용되는 생성자 함수인 함수 값 프로퍼티입니다.
%Symbol.split% "Symbol.split" 정규식과 매칭되는 인덱스에서 문자열을 분할하는 정규식 메서드입니다. String.prototype.split 메서드에서 호출됩니다.
%Symbol.toPrimitive% "Symbol.toPrimitive" 객체를 대응하는 원시값(primitive value)으로 변환하는 메서드입니다. ToPrimitive 추상 연산에서 호출됩니다.
%Symbol.toStringTag% "Symbol.toStringTag" 객체의 기본 문자열 설명을 생성할 때 사용하는 문자열 값 프로퍼티입니다. 내장 메서드 Object.prototype.toString에서 접근됩니다.
%Symbol.unscopables% "Symbol.unscopables" 자신의 프로퍼티 이름 및 상속된 프로퍼티 이름이 관련 객체의 with 환경 바인딩에서 제외되는 프로퍼티 이름인 객체 값 프로퍼티입니다.

6.1.6 숫자 타입

ECMAScript에는 두 가지 내장 숫자 타입이 있습니다: Number와 BigInt. 아래 추상 연산들은 이러한 숫자 타입에 대해 정의되어 있습니다. "결과" 열에는 반환 타입과, 일부 연산 호출 시 비정상 완료(abrupt completion)가 반환될 수 있는지 여부가 표시됩니다.

표 2: 숫자 타입 연산
연산(Operation) 예시 소스(Example source) Evaluation 의미론에서 호출됨 결과(Result)
Number::unaryMinus -x 단항 - 연산자 Number
BigInt::unaryMinus BigInt
Number::bitwiseNOT ~x 비트 NOT 연산자 (~) Number
BigInt::bitwiseNOT BigInt
Number::exponentiate x ** y 거듭제곱 연산자Math.pow ( base, exponent ) Number
BigInt::exponentiate BigInt를 포함하는 정상 완료(normal completion) 또는 예외 완료(throw completion)
Number::multiply x * y 곱셈 연산자(Multiplicative Operators) Number
BigInt::multiply BigInt
Number::divide x / y 곱셈 연산자(Multiplicative Operators) Number
BigInt::divide BigInt를 포함하는 정상 완료(normal completion) 또는 예외 완료(throw completion)
Number::remainder x % y 곱셈 연산자(Multiplicative Operators) Number
BigInt::remainder BigInt를 포함하는 정상 완료(normal completion) 또는 예외 완료(throw completion)
Number::add x ++
++ x
x + y
후위 증가 연산자(Postfix Increment Operator), 전위 증가 연산자(Prefix Increment Operator), 더하기 연산자(+) (The Addition Operator) Number
BigInt::add BigInt
Number::subtract x --
-- x
x - y
후위 감소 연산자(Postfix Decrement Operator), 전위 감소 연산자(Prefix Decrement Operator), 빼기 연산자(-) (The Subtraction Operator) Number
BigInt::subtract BigInt
Number::leftShift x << y 왼쪽 시프트 연산자(<<) (The Left Shift Operator) Number
BigInt::leftShift BigInt
Number::signedRightShift x >> y 부호 있는 오른쪽 시프트 연산자(>>) (The Signed Right Shift Operator) Number
BigInt::signedRightShift BigInt
Number::unsignedRightShift x >>> y 부호 없는 오른쪽 시프트 연산자(>>>) (The Unsigned Right Shift Operator) Number
BigInt::unsignedRightShift 예외 완료(throw completion)
Number::lessThan x < y
x > y
x <= y
x >= y
관계 연산자(Relational Operators), IsLessThan ( x, y, LeftFirst ) Boolean 또는 undefined (정렬되지 않은 입력)
BigInt::lessThan Boolean
Number::equal x == y
x != y
x === y
x !== y
동등 연산자(Equality Operators), IsStrictlyEqual ( x, y ) Boolean
BigInt::equal
Number::sameValue Object.is(x, y) 객체 내부 메서드, SameValue ( x, y )를 통해 정확한 값 비교 Boolean
Number::sameValueZero [x].includes(y) SameValueZero ( x, y )를 통해, +0𝔽-0𝔽의 차이를 무시하고 값 비교 (Array, Map, Set 메서드 등) Boolean
Number::bitwiseAND x & y 이진 비트 연산자(Binary Bitwise Operators) Number
BigInt::bitwiseAND BigInt
Number::bitwiseXOR x ^ y Number
BigInt::bitwiseXOR BigInt
Number::bitwiseOR x | y Number
BigInt::bitwiseOR BigInt
Number::toString String(x) 다양한 표현식 및 내장 함수에서, ToString ( argument )을 통해 호출됨 String
BigInt::toString

숫자 타입은 일반적으로 정밀도 손실이나 잘림(truncation) 없이 변환할 수 없기 때문에, ECMAScript 언어에서는 이러한 타입 간에 암묵적인 변환을 제공하지 않습니다. 프로그래머는 다른 타입을 요구하는 함수를 호출할 때 Number 또는 BigInt 함수를 명시적으로 호출하여 타입을 변환해야 합니다.

참고

ECMAScript의 초판 및 이후 판에서는 일부 연산자에 대해 정밀도 손실이나 잘림(truncate)이 발생할 수 있는 암묵적 숫자 변환을 제공했습니다. 이러한 레거시 암묵 변환은 하위 호환성을 위해 유지되지만, BigInt에는 제공되지 않습니다. 이는 프로그래머의 실수 가능성을 줄이고, 미래 판에서는 일반화된 값 타입(value types) 도입의 여지를 남기기 위함입니다.

6.1.6.1 Number 타입

Number 타입은 정확히 18,437,736,874,454,810,627개(즉, 264 - 253 + 3) 값을 가지며, IEEE 754-2019에서 지정된 IEEE 배정밀도 부동소수점(binary64) 값을 나타냅니다. 단, IEEE 표준의 9,007,199,254,740,990개(즉, 253 - 2) NaN 값은 ECMAScript에서는 하나의 특별한 NaN 값으로 표현됩니다. (NaN 값은 프로그램 표현식 NaN으로 생성됩니다.) 일부 구현에서는 외부 코드가 다양한 NaN 값을 구분할 수 있지만, 그러한 동작은 구현 정의(implementation-defined)입니다. ECMAScript 코드에서는 모든 NaN 값은 서로 구별되지 않습니다.

참고

Number 값이 ArrayBuffer(25.1)나 SharedArrayBuffer(25.2)에 저장된 후 관찰되는 비트 패턴은 ECMAScript 구현에서 사용하는 Number 값의 내부 표현과 반드시 같지 않을 수 있습니다.

그 외에도 양의 무한대(positive Infinity)음의 무한대(negative Infinity)라는 두 개의 특별한 값이 있습니다. 간결하게 각각 +∞𝔽-∞𝔽로도 설명합니다. (이 두 무한대 Number 값은 +Infinity(또는 Infinity)와 -Infinity 표현식으로 생성됩니다.)

나머지 18,437,736,874,454,810,624개(즉, 264 - 253) 값은 유한(finite) 숫자라 불립니다. 이 중 절반은 양수, 절반은 음수입니다. 모든 유한 양의 Number 값에는 동일한 크기의 음수 값이 대응됩니다.

양의 0(positive zero)와 음의 0(negative zero)도 있습니다. 간결하게 각각 +0𝔽-0𝔽로 설명합니다. (이 두 0 값은 +0(또는 0)과 -0 표현식으로 생성됩니다.)

18,437,736,874,454,810,622개(즉, 264 - 253 - 2) 유한 0이 아닌 값은 두 가지 종류가 있습니다:

18,428,729,675,200,069,632개(즉, 264 - 254)는 정규화(normalized)되어 있으며, 다음과 같은 형태를 가집니다:

s × m × 2e

여기서 s는 1 또는 -1, m정수이며 구간(interval) [252, 253)에 속하고, e정수이며 포함 구간 [-1074, 971]에 속합니다.

나머지 9,007,199,254,740,990개(즉, 253 - 2) 값은 비정규화(denormalized)되어 있으며, 다음과 같은 형태를 가집니다:

s × m × 2e

여기서 s는 1 또는 -1, m정수이며 구간(interval) (0, 252)에 속하고, e는 -1074입니다.

크기가 253 이하인 모든 양의 및 음의 정수는 Number 타입으로 표현 가능합니다. 정수 0은 Number 타입에서 +0𝔽-0𝔽 두 가지로 표현됩니다.

유한 숫자가 0이 아니고 위의 두 형태 중 정수 m이 홀수이면 홀수 시그니피컨드(odd significand)를 가지며, 그렇지 않으면 짝수 시그니피컨드(even significand)를 가집니다.

이 명세에서 “the Number value for x”라는 문구에서 x가 정확한 실수(π와 같은 무리수 포함)를 나타낼 때, 다음 방식으로 Number 값을 선택함을 의미합니다. Number 타입의 모든 유한 값 집합에서 -0𝔽을 제거하고, Number 타입으로 표현할 수 없는 두 값을 추가합니다: 21024(+1 × 253 × 2971)와 -21024(-1 × 253 × 2971). 이 집합에서 x에 가장 가까운 값을 선택합니다. 두 값이 동일하게 가까울 경우, 짝수 시그니피컨드를 가진 값을 선택합니다. 이때 두 추가 값 21024-21024은 짝수 시그니피컨드를 가진 것으로 간주합니다. 마지막으로, 21024가 선택되면 +∞𝔽로, -21024가 선택되면 -∞𝔽로, +0𝔽가 선택되면 x < 0일 때만 -0𝔽로 바꿉니다. 그 외의 경우 선택한 값을 그대로 사용합니다. 그 결과가 Number value for x입니다. (이 절차는 IEEE 754-2019의 roundTiesToEven 모드와 정확히 일치합니다.)

Number value for +∞는 +∞𝔽이고, Number value for -∞는 -∞𝔽입니다.

일부 ECMAScript 연산자는 정수의 특정 범위(예: 포함 구간 -231부터 231 - 1까지, 또는 포함 구간 0부터 216 - 1까지)만 다룹니다. 이러한 연산자는 Number 타입의 모든 값을 허용하지만, 우선 해당 값을 기대하는 범위의 정수 값으로 변환합니다. 숫자 변환 연산에 대한 설명은 7.1를 참조하세요.

6.1.6.1.1 Number::unaryMinus ( x )

추상 연산 Number::unaryMinus는 인자 x(Number)를 받고 Number를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. xNaN이면 NaN을 반환한다.
  2. x의 부호를 반전한 값을 반환한다. 즉, 크기는 같지만 부호가 반대인 Number를 계산한다.

6.1.6.1.2 Number::bitwiseNOT ( x )

추상 연산 Number::bitwiseNOT는 인자 x(Number)를 받고 정수(Number)를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. oldValue를 ! ToInt32(x)로 설정한다.
  2. oldValue의 비트 보수를 반환한다. 결과의 수학적 값은 32비트 2의 보수 비트열로 정확히 표현된다.

6.1.6.1.3 Number::exponentiate ( base, exponent )

추상 연산 Number::exponentiate는 인자 base(Number), exponent(Number)를 받고 Number를 반환합니다. baseexponent 거듭제곱한 결과를 나타내는 구현 근사값을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. exponentNaN이면 NaN을 반환한다.
  2. exponent+0𝔽 또는 -0𝔽이면 1𝔽을 반환한다.
  3. baseNaN이면 NaN을 반환한다.
  4. base+∞𝔽이면
    1. exponent > +0𝔽이면 +∞𝔽을 반환하고, 아니면 +0𝔽을 반환한다.
  5. base-∞𝔽이면
    1. exponent > +0𝔽이면
      1. exponent가 홀수 정수(Number)이면 -∞𝔽을 반환, 아니면 +∞𝔽을 반환한다.
    2. 그 외
      1. exponent가 홀수 정수(Number)이면 -0𝔽을 반환, 아니면 +0𝔽을 반환한다.
  6. base+0𝔽이면
    1. exponent > +0𝔽이면 +0𝔽을 반환, 아니면 +∞𝔽을 반환한다.
  7. base-0𝔽이면
    1. exponent > +0𝔽이면
      1. exponent가 홀수 정수(Number)이면 -0𝔽을 반환, 아니면 +0𝔽을 반환한다.
    2. 그 외
      1. exponent가 홀수 정수(Number)이면 -∞𝔽을 반환, 아니면 +∞𝔽을 반환한다.
  8. Assert: base유한(finite)이며 +0𝔽 또는 -0𝔽이 아니다.
  9. exponent+∞𝔽이면
    1. abs((base)) > 1이면 +∞𝔽 반환
    2. abs((base)) = 1이면 NaN 반환
    3. abs((base)) < 1이면 +0𝔽 반환
  10. exponent-∞𝔽이면
    1. abs((base)) > 1이면 +0𝔽 반환
    2. abs((base)) = 1이면 NaN 반환
    3. abs((base)) < 1이면 +∞𝔽 반환
  11. Assert: exponent유한(finite)이며 +0𝔽 또는 -0𝔽이 아니다.
  12. base < -0𝔽이고 exponent정수(Number)가 아니면 NaN 반환
  13. 구현 근사값 Number 값을 반환하며, 이는 (base)를 (exponent) 거듭제곱한 값이다.
참고

base1𝔽 또는 -1𝔽이고 exponent+∞𝔽 또는 -∞𝔽인 경우, 또는 base1𝔽이고 exponentNaN인 경우의 base ** exponent 결과는 IEEE 754-2019와 다릅니다. ECMAScript 초판은 이 연산에서 NaN을 반환했지만, 이후 IEEE 754에서는 1𝔽을 명시합니다. 호환성 유지를 위해 ECMAScript의 역사적 동작을 따릅니다.

6.1.6.1.4 Number::multiply ( x, y )

추상 연산 Number::multiply는 인자 x(Number), y(Number)를 받고 Number를 반환합니다. IEEE 754-2019 배정밀도 이진 산술 규칙에 따라 곱셈을 수행하여 xy의 곱을 생성합니다. 호출 시 다음 단계를 수행합니다:

  1. xNaN이거나 yNaN이면 NaN 반환
  2. x+∞𝔽 또는 -∞𝔽이면
    1. y+0𝔽 또는 -0𝔽이면 NaN 반환
    2. y > +0𝔽이면 x 반환
    3. -x 반환
  3. y+∞𝔽 또는 -∞𝔽이면
    1. x+0𝔽 또는 -0𝔽이면 NaN 반환
    2. x > +0𝔽이면 y 반환
    3. -y 반환
  4. x-0𝔽이면
    1. y-0𝔽이거나 y < -0𝔽이면 +0𝔽 반환
    2. 그 외에는 -0𝔽 반환
  5. y-0𝔽이면
    1. x < -0𝔽이면 +0𝔽 반환
    2. 그 외에는 -0𝔽 반환
  6. 𝔽((x) × (y)) 반환
참고

유한(finite) 정밀 곱셈은 교환법칙은 성립하지만, 항상 결합법칙이 성립하는 것은 아닙니다.

6.1.6.1.5 Number::divide ( x, y )

추상 연산 Number::divide는 인자 x(Number), y(Number)를 받고 Number를 반환합니다. IEEE 754-2019 배정밀도 이진 산술 규칙에 따라 나눗셈을 수행하며, x를 피제수(dividend), y를 제수(divisor)로 하여 몫을 생성합니다. 호출 시 다음 단계를 수행합니다:

  1. xNaN이거나 yNaN이면 NaN 반환
  2. x+∞𝔽 또는 -∞𝔽이면
    1. y+∞𝔽 또는 -∞𝔽이면 NaN 반환
    2. y+0𝔽 또는 y > +0𝔽이면 x 반환
    3. -x 반환
  3. y+∞𝔽이면
    1. x+0𝔽 또는 x > +0𝔽이면 +0𝔽 반환, 아니면 -0𝔽 반환
  4. y-∞𝔽이면
    1. x+0𝔽 또는 x > +0𝔽이면 -0𝔽 반환, 아니면 +0𝔽 반환
  5. x+0𝔽 또는 -0𝔽이면
    1. y+0𝔽 또는 -0𝔽이면 NaN 반환
    2. y > +0𝔽이면 x 반환
    3. -x 반환
  6. y+0𝔽이면
    1. x > +0𝔽이면 +∞𝔽 반환, 아니면 -∞𝔽 반환
  7. y-0𝔽이면
    1. x > +0𝔽이면 -∞𝔽 반환, 아니면 +∞𝔽 반환
  8. 𝔽((x) / (y)) 반환

6.1.6.1.6 Number::remainder ( n, d )

추상 연산 Number::remainder는 인자 n(Number), d(Number)를 받고 Number를 반환합니다. n을 피제수(dividend), d를 제수(divisor)로 하는 암시적 나눗셈에서의 나머지를 구합니다. 호출 시 다음 단계를 수행합니다:

  1. nNaN이거나 dNaN이면 NaN을 반환한다.
  2. n+∞𝔽 또는 -∞𝔽이면 NaN을 반환한다.
  3. d+∞𝔽 또는 -∞𝔽이면 n을 반환한다.
  4. d+0𝔽 또는 -0𝔽이면 NaN을 반환한다.
  5. n+0𝔽 또는 -0𝔽이면 n을 반환한다.
  6. Assert: nd유한이며 0이 아니다.
  7. quotient(n) / (d)로 설정한다.
  8. qtruncate(quotient)로 설정한다.
  9. r(n) - ((d) × q)로 설정한다.
  10. r = 0이고 n < -0𝔽이면 -0𝔽을 반환한다.
  11. 𝔽(r)을 반환한다.
참고 1

C와 C++에서 나머지 연산자는 정수 피연산자만 허용하지만, ECMAScript에서는 부동소수점 피연산자도 허용합니다.

참고 2

% 연산자로 계산된 부동소수점 나머지 연산 결과는 IEEE 754-2019에서 정의한 "나머지(remainder)" 연산과 동일하지 않습니다. IEEE의 "remainder" 연산은 잘림이 아닌 반올림 나눗셈에서의 나머지를 계산하므로, 일반적인 정수 나머지 연산자와는 다릅니다. ECMAScript에서는 부동소수점 % 연산이 Java 정수 나머지 연산자와 유사하게 동작하도록 정의되어 있으며, 이는 C 표준 라이브러리의 fmod 함수와 비교할 수 있습니다.

6.1.6.1.7 Number::add ( x, y )

추상 연산 Number::add는 인자 x(Number), y(Number)를 받고 Number를 반환합니다. IEEE 754-2019 배정밀도 이진 산술 규칙에 따라 덧셈을 수행하여 인자의 합을 생성합니다. 호출 시 다음 단계를 수행합니다:

  1. xNaN이거나 yNaN이면 NaN 반환
  2. x+∞𝔽이고 y-∞𝔽이면 NaN 반환
  3. x-∞𝔽이고 y+∞𝔽이면 NaN 반환
  4. x+∞𝔽 또는 -∞𝔽이면 x 반환
  5. y+∞𝔽 또는 -∞𝔽이면 y 반환
  6. Assert: xy는 모두 유한이다.
  7. x-0𝔽이고 y-0𝔽이면 -0𝔽 반환
  8. 𝔽((x) + (y)) 반환
참고

유한 정밀 덧셈은 교환법칙은 성립하지만, 항상 결합법칙이 성립하는 것은 아닙니다.

6.1.6.1.8 Number::subtract ( x, y )

추상 연산 Number::subtract는 인자 x(Number), y(Number)를 받고 Number를 반환합니다. 뺄셈을 수행하여 피감수(minuend) x와 감수(subtrahend) y의 차를 생성합니다. 호출 시 다음 단계를 수행합니다:

  1. Number::add(x, Number::unaryMinus(y))를 반환한다.
참고

언제나 x - yx + (-y)와 동일한 결과를 생성합니다.

6.1.6.1.9 Number::leftShift ( x, y )

추상 연산 Number::leftShift는 인자 x(Number), y(Number)를 받고 정수(Number)를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. lNum을 ! ToInt32(x)로 설정한다.
  2. rNum을 ! ToUint32(y)로 설정한다.
  3. shiftCount(rNum) modulo 32로 설정한다.
  4. lNumshiftCount 비트만큼 왼쪽 시프트한 결과를 반환한다. 결과의 수학적 값은 32비트 2의 보수 비트열로 정확히 표현된다.

6.1.6.1.10 Number::signedRightShift ( x, y )

추상 연산 Number::signedRightShift는 인자 x(Number), y(Number)를 받고 정수(Number)를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. lNum을 ! ToInt32(x)로 설정한다.
  2. rNum을 ! ToUint32(y)로 설정한다.
  3. shiftCount(rNum) modulo 32로 설정한다.
  4. lNumshiftCount 비트만큼 부호 확장(right shift with sign extension) 하여 오른쪽 시프트한 결과를 반환한다. 최상위 비트가 전파된다. 결과의 수학적 값은 32비트 2의 보수 비트열로 정확히 표현된다.

6.1.6.1.11 Number::unsignedRightShift ( x, y )

추상 연산 Number::unsignedRightShift는 인자 x(Number), y(Number)를 받고 정수(Number)를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. lNum을 ! ToUint32(x)로 설정한다.
  2. rNum을 ! ToUint32(y)로 설정한다.
  3. shiftCount(rNum) modulo 32로 설정한다.
  4. lNumshiftCount 비트만큼 0으로 채우며 오른쪽 시프트한 결과를 반환한다. 비워진 비트는 0으로 채워진다. 결과의 수학적 값은 32비트 부호 없는 비트열로 정확히 표현된다.

6.1.6.1.12 Number::lessThan ( x, y )

추상 연산 Number::lessThan는 인자 x(Number), y(Number)를 받고 Boolean 또는 undefined를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. xNaN이면 undefined 반환
  2. yNaN이면 undefined 반환
  3. xy이면 false 반환
  4. x+0𝔽이고 y-0𝔽이면 false 반환
  5. x-0𝔽이고 y+0𝔽이면 false 반환
  6. x+∞𝔽이면 false 반환
  7. y+∞𝔽이면 true 반환
  8. y-∞𝔽이면 false 반환
  9. x-∞𝔽이면 true 반환
  10. Assert: xy유한이다.
  11. (x) < (y)이면 true 반환, 아니면 false 반환

6.1.6.1.13 Number::equal ( x, y )

추상 연산 Number::equal는 인자 x(Number), y(Number)를 받고 Boolean을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. xNaN이면 false 반환
  2. yNaN이면 false 반환
  3. xy이면 true 반환
  4. x+0𝔽이고 y-0𝔽이면 true 반환
  5. x-0𝔽이고 y+0𝔽이면 true 반환
  6. false 반환

6.1.6.1.14 Number::sameValue ( x, y )

추상 연산 Number::sameValue는 인자 x(Number), y(Number)를 받고 Boolean을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. xNaN이고 yNaN이면 true 반환
  2. x+0𝔽이고 y-0𝔽이면 false 반환
  3. x-0𝔽이고 y+0𝔽이면 false 반환
  4. xy이면 true 반환
  5. false 반환

6.1.6.1.15 Number::sameValueZero ( x, y )

추상 연산 Number::sameValueZero는 인자 x(Number), y(Number)를 받고 Boolean을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. xNaN이고 yNaN이면 true 반환
  2. x+0𝔽이고 y-0𝔽이면 true 반환
  3. x-0𝔽이고 y+0𝔽이면 true 반환
  4. xy이면 true 반환
  5. false 반환

6.1.6.1.16 NumberBitwiseOp ( op, x, y )

추상 연산 NumberBitwiseOp는 인자 op(&, ^, 또는 |), x(Number), y(Number)를 받고 정수(Number)를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. lNum을 ! ToInt32(x)로 설정한다.
  2. rNum을 ! ToInt32(y)로 설정한다.
  3. lBits(lNum)을 나타내는 32비트 2의 보수 비트열로 설정한다.
  4. rBits(rNum)을 나타내는 32비트 2의 보수 비트열로 설정한다.
  5. op&이면
    1. resultlBitsrBits에 비트 AND 연산을 적용한 결과로 설정한다.
  6. 그 외 op^이면
    1. resultlBitsrBits에 비트 XOR 연산을 적용한 결과로 설정한다.
  7. 그 외
    1. Assert: op|이다.
    2. resultlBitsrBits에 비트 OR 연산을 적용한 결과로 설정한다.
  8. result 32비트 2의 보수 비트열이 나타내는 정수Number 값을 반환한다.

6.1.6.1.17 Number::bitwiseAND ( x, y )

추상 연산 Number::bitwiseAND는 인자 x(Number), y(Number)를 받고 정수(Number)를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. NumberBitwiseOp(&, x, y)를 반환한다.

6.1.6.1.18 Number::bitwiseXOR ( x, y )

추상 연산 Number::bitwiseXOR는 인자 x(Number), y(Number)를 받고 정수(Number)를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. NumberBitwiseOp(^, x, y)를 반환한다.

6.1.6.1.19 Number::bitwiseOR ( x, y )

추상 연산 Number::bitwiseOR는 인자 x(Number), y(Number)를 받고 정수(Number)를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. NumberBitwiseOp(|, x, y)를 반환한다.

6.1.6.1.20 Number::toString ( x, radix )

추상 연산 Number::toString은 인자 x(Number), radix(정수, 포함 구간 2~36)을 받고 String을 반환합니다. xradix 진법 위치 표기법(positional numeral system)으로 String으로 표현합니다. r 진법으로 수를 표현할 때 사용하는 숫자는 "0123456789abcdefghijklmnopqrstuvwxyz"의 앞 r 코드 유닛을 순서대로 사용합니다. 크기가 1𝔽 이상인 숫자의 표현에는 선행 0이 포함되지 않습니다. 호출 시 다음 단계를 수행합니다:

  1. xNaN이면 "NaN" 반환
  2. x+0𝔽 또는 -0𝔽이면 "0" 반환
  3. x < -0𝔽이면 string-concatenation("-", Number::toString(-x, radix)) 반환
  4. x+∞𝔽이면 "Infinity" 반환
  5. n, k, s정수로 정한다. k ≥ 1이며, radixk - 1s < radixk이고, 𝔽(s × radixn - k)가 x이며, k는 최소가 되도록 한다. ksradix로 표현할 때의 자릿수이며, sradix로 나누어떨어지지 않으며, 최하위 자릿수는 반드시 유일하게 결정되지는 않는다.
  6. radix ≠ 10 또는 n포함 구간 -5~21에 있으면
    1. nk이면
      1. sradix로 표현한 k자리 코드 유닛과, n - k개의 0x0030(DIGIT ZERO) 코드 유닛을 string-concatenation하여 반환한다.
    2. 그 외 n > 0이면
      1. sradix로 표현한 상위 n자리 코드 유닛, 0x002E(FULL STOP) 코드 유닛, 나머지 k - n자리 코드 유닛을 string-concatenation하여 반환한다.
    3. 그 외
      1. Assert: n ≤ 0.
      2. 0x0030(DIGIT ZERO), 0x002E(FULL STOP), -n개의 0x0030(DIGIT ZERO), sradix로 표현한 k자리 코드 유닛을 string-concatenation하여 반환한다.
  7. NOTE: 이 경우 입력은 1.2e+3과 같은 과학적 E 표기로 표현된다.
  8. Assert: radix는 10이다.
  9. n < 0이면
    1. exponentSign을 0x002D(HYPHEN-MINUS) 코드 유닛으로 설정한다.
  10. 그 외
    1. exponentSign을 0x002B(PLUS SIGN) 코드 유닛으로 설정한다.
  11. k = 1이면
    1. 단일 자리 s 코드 유닛, 0x0065(LATIN SMALL LETTER E), exponentSign, abs(n - 1)를 10진수로 표현한 코드 유닛을 string-concatenation하여 반환한다.
  12. 상위 자리 s의 10진수 코드 유닛, 0x002E(FULL STOP), 나머지 k - 1자리 10진수 코드 유닛, 0x0065(LATIN SMALL LETTER E), exponentSign, abs(n - 1)를 10진수로 표현한 코드 유닛을 string-concatenation하여 반환한다.
참고 1

다음 사항은 구현 가이드라인으로 유용할 수 있지만, 표준의 규범적 요구사항은 아닙니다:

  • x가 -0𝔽이 아닌 모든 Number 값이면, ToNumber(ToString(x))는 x와 같다.
  • s의 최하위 자릿수는 5 단계의 요구조건에 따라 항상 유일하게 결정되지 않는다.
참고 2

규칙보다 더 정확한 변환을 제공하는 구현에서는 아래 대체 버전의 5 단계를 가이드라인으로 사용하는 것이 권장됩니다:

  1. n, k, s정수로 정한다. k ≥ 1, radixk - 1s < radixk, 𝔽(s × radixn - k)가 x이며, k는 최소가 되도록 한다. s의 후보가 여러 개일 경우, s × radixn - k(x)에 가장 가까운 값을 s로 선택한다. 두 후보가 있을 경우 짝수 값을 선택한다. ksradix로 표현할 때의 자릿수이며, sradix로 나누어떨어지지 않는다.
참고 3

ECMAScript 구현자는 David M. Gay가 작성한 부동소수점 이진-10진 변환 관련 논문 및 코드를 참고할 수 있습니다:

Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions. Numerical Analysis, Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). 1990년 11월 30일.
https://ampl.com/_archive/first-website/REFS/rounding.pdf.
관련 코드: http://netlib.sandia.gov/fp/dtoa.c
http://netlib.sandia.gov/fp/g_fmt.c.
여러 netlib 미러 사이트에서도 찾을 수 있습니다.

6.1.6.2 BigInt 타입

BigInt 타입정수 값을 나타냅니다. 값의 크기는 제한이 없으며, 특정 비트 폭에 국한되지 않습니다. 별도 언급이 없는 한, 연산은 일반적으로 정확한 수학적 결과를 제공합니다. 이진 연산에서는 BigInt가 2의 보수 이진 문자열로 동작하며, 음수는 왼쪽으로 무한히 비트가 설정된 것으로 취급됩니다.

6.1.6.2.1 BigInt::unaryMinus ( x )

추상 연산 BigInt::unaryMinus는 인자 x(BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. x = 0이면 0를 반환한다.
  2. -x를 반환한다.

6.1.6.2.2 BigInt::bitwiseNOT ( x )

추상 연산 BigInt::bitwiseNOT는 인자 x(BigInt)를 받고 BigInt를 반환합니다. x의 1의 보수 값을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. -x - 1를 반환한다.

6.1.6.2.3 BigInt::exponentiate ( base, exponent )

추상 연산 BigInt::exponentiate는 인자 base(BigInt), exponent(BigInt)를 받고 정상 완료 BigInt 또는 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. exponent < 0이면 RangeError 예외를 던진다.
  2. base = 0이고 exponent = 0이면 1를 반환한다.
  3. baseexponent 거듭제곱한 값을 반환한다.

6.1.6.2.4 BigInt::multiply ( x, y )

추상 연산 BigInt::multiply는 인자 x(BigInt), y(BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. x × y를 반환한다.
참고
결과가 입력보다 훨씬 더 큰 비트폭을 갖더라도 정확한 수학적 결과가 반환됩니다.

6.1.6.2.5 BigInt::divide ( x, y )

추상 연산 BigInt::divide는 인자 x(BigInt), y(BigInt)를 받고 정상 완료 BigInt 또는 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. y = 0이면 RangeError 예외를 던진다.
  2. quotient(x) / (y)로 설정한다.
  3. (truncate(quotient))를 반환한다.

6.1.6.2.6 BigInt::remainder ( n, d )

추상 연산 BigInt::remainder는 인자 n(BigInt), d(BigInt)를 받고 정상 완료 BigInt 또는 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. d = 0이면 RangeError 예외를 던진다.
  2. n = 0이면 0를 반환한다.
  3. quotient(n) / (d)로 설정한다.
  4. q(truncate(quotient))로 설정한다.
  5. n - (d × q)를 반환한다.
참고
결과의 부호는 피제수의 부호와 동일합니다.

6.1.6.2.7 BigInt::add ( x, y )

추상 연산 BigInt::add는 인자 x(BigInt), y(BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. x + y를 반환한다.

6.1.6.2.8 BigInt::subtract ( x, y )

추상 연산 BigInt::subtract는 인자 x(BigInt), y(BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. x - y를 반환한다.

6.1.6.2.9 BigInt::leftShift ( x, y )

추상 연산 BigInt::leftShift는 인자 x(BigInt), y(BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. y < 0이면
    1. (floor((x) / 2-(y)))를 반환한다.
  2. x × 2y를 반환한다.
참고
여기서 의미론은 BigInt를 무한 길이의 2의 보수 이진 문자열로 간주한 비트 시프트와 동일해야 합니다.

6.1.6.2.10 BigInt::signedRightShift ( x, y )

추상 연산 BigInt::signedRightShift는 인자 x(BigInt), y(BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. BigInt::leftShift(x, -y)를 반환한다.

6.1.6.2.11 BigInt::unsignedRightShift ( x, y )

추상 연산 BigInt::unsignedRightShift는 인자 x(BigInt), y(BigInt)를 받고 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. TypeError 예외를 던진다.

6.1.6.2.12 BigInt::lessThan ( x, y )

추상 연산 BigInt::lessThan는 인자 x(BigInt), y(BigInt)를 받고 Boolean을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. (x) < (y)이면 true 반환, 아니면 false 반환

6.1.6.2.13 BigInt::equal ( x, y )

추상 연산 BigInt::equal는 인자 x(BigInt), y(BigInt)를 받고 Boolean을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. (x) = (y)이면 true 반환, 아니면 false 반환

6.1.6.2.14 BinaryAnd ( x, y )

추상 연산 BinaryAnd는 인자 x(0 또는 1), y(0 또는 1)를 받고 0 또는 1을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. x = 1이고 y = 1이면 1 반환
  2. 그 외에는 0 반환

6.1.6.2.15 BinaryOr ( x, y )

추상 연산 BinaryOr는 인자 x(0 또는 1), y(0 또는 1)를 받고 0 또는 1을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. x = 1 또는 y = 1이면 1 반환
  2. 그 외에는 0 반환

6.1.6.2.16 BinaryXor ( x, y )

추상 연산 BinaryXor는 인자 x(0 또는 1), y(0 또는 1)를 받고 0 또는 1을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. x = 1이고 y = 0이면 1 반환
  2. 그 외 x = 0이고 y = 1이면 1 반환
  3. 그 외에는 0 반환

6.1.6.2.17 BigIntBitwiseOp ( op, x, y )

추상 연산 BigIntBitwiseOp는 인자 op(&, ^, |), x(BigInt), y(BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. x(x)로 설정한다.
  2. y(y)로 설정한다.
  3. result를 0으로 설정한다.
  4. shift를 0으로 설정한다.
  5. 반복, (x = 0 또는 x = -1)이고 (y = 0 또는 y = -1)일 때까지
    1. xDigitx modulo 2로 설정한다.
    2. yDigity modulo 2로 설정한다.
    3. op&이면
      1. resultresult + 2shift × BinaryAnd(xDigit, yDigit)로 설정한다.
    4. 그 외 op|이면
      1. resultresult + 2shift × BinaryOr(xDigit, yDigit)로 설정한다.
    5. 그 외
      1. Assert: op^이다.
      2. resultresult + 2shift × BinaryXor(xDigit, yDigit)로 설정한다.
    6. shiftshift + 1로 설정한다.
    7. x를 (x - xDigit) / 2로 설정한다.
    8. y를 (y - yDigit) / 2로 설정한다.
  6. op&이면
    1. tmpBinaryAnd(x modulo 2, y modulo 2)로 설정한다.
  7. 그 외 op|이면
    1. tmpBinaryOr(x modulo 2, y modulo 2)로 설정한다.
  8. 그 외
    1. Assert: op^이다.
    2. tmpBinaryXor(x modulo 2, y modulo 2)로 설정한다.
  9. tmp ≠ 0이면
    1. resultresult - 2shift로 설정한다.
    2. 참고: 이 연산은 부호를 확장합니다.
  10. BigInt value for result를 반환한다.

6.1.6.2.18 BigInt::bitwiseAND ( x, y )

추상 연산 BigInt::bitwiseAND는 인자 x(BigInt), y(BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. BigIntBitwiseOp(&, x, y)를 반환한다.

6.1.6.2.19 BigInt::bitwiseXOR ( x, y )

추상 연산 BigInt::bitwiseXOR는 인자 x(BigInt), y(BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. BigIntBitwiseOp(^, x, y)를 반환한다.

6.1.6.2.20 BigInt::bitwiseOR ( x, y )

추상 연산 BigInt::bitwiseOR는 인자 x(BigInt), y(BigInt)를 받고 BigInt를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. BigIntBitwiseOp(|, x, y)를 반환한다.

6.1.6.2.21 BigInt::toString ( x, radix )

추상 연산 BigInt::toString은 인자 x(BigInt), radix(정수, 포함 구간 2~36)을 받고 String을 반환합니다. xradix 진법 위치 표기법으로 String으로 표현합니다. r 진법으로 BigInt를 표현할 때 사용하는 숫자는 "0123456789abcdefghijklmnopqrstuvwxyz"의 앞 r 코드 유닛을 순서대로 사용합니다. 0이 아닌 BigInt의 표현에는 결코 선행 0이 포함되지 않습니다. 호출 시 다음 단계를 수행합니다:

  1. x < 0이면 string-concatenation("-", BigInt::toString(-x, radix))를 반환한다.
  2. xradix로 표현한 String 값을 반환한다.

6.1.7 오브젝트 타입

Object 타입 인스턴스(간단히 “오브젝트”라 부름)는 프로퍼티의 집합을 나타냅니다. 각 프로퍼티는 데이터 프로퍼티 또는 접근자 프로퍼티입니다:

  • 데이터 프로퍼티는 키 값을 ECMAScript 언어 값과 Boolean 속성 집합에 연결합니다.
  • 접근자 프로퍼티는 키 값을 하나 또는 두 개의 접근자 함수와 Boolean 속성 집합에 연결합니다. 접근자 함수는 해당 프로퍼티에 연결된 ECMAScript 언어 값를 저장하거나 검색하는 데 사용됩니다.

오브젝트의 프로퍼티는 프로퍼티 키를 사용하여 고유하게 식별됩니다. 프로퍼티 키는 문자열(String) 또는 심볼(Symbol)입니다. 빈 문자열을 포함한 모든 문자열과 심볼은 프로퍼티 키로 사용할 수 있습니다. 프로퍼티 이름프로퍼티 키문자열(String)인 값입니다.

정수 인덱스프로퍼티 이름 n으로, CanonicalNumericIndexString(n)이 정수(Number)포함 구간 +0𝔽 ~ 𝔽(253 - 1) 내에서 반환하는 경우를 의미합니다. 배열 인덱스정수 인덱스 n으로, CanonicalNumericIndexString(n)이 정수(Number)포함 구간 +0𝔽 ~ 𝔽(232 - 2) 내에서 반환하는 경우를 의미합니다.

참고

모든 음이 아닌 안전 정수는 해당하는 정수 인덱스가 있습니다. 32비트 부호 없는 정수232 - 1을 제외한 모든 값은 해당하는 배열 인덱스가 있습니다. "-0"정수 인덱스배열 인덱스에 해당하지 않습니다.

프로퍼티 키는 프로퍼티 및 그 값을 접근하는 데 사용됩니다. 프로퍼티 접근 방법에는 get(값 조회)과 set(값 할당)의 두 가지가 있습니다. get/set 접근으로 접근 가능한 프로퍼티에는 오브젝트의 자신의 프로퍼티(own properties)와, 프로퍼티 상속 관계를 통해 다른 연관 객체가 제공하는 상속 프로퍼티(inherited properties)가 포함됩니다. 상속 프로퍼티는 연관 객체의 own이나 inherited 프로퍼티일 수 있습니다. 한 오브젝트의 모든 own 프로퍼티는 서로 다른 키 값을 가져야 합니다.

모든 오브젝트는 논리적으로 프로퍼티의 집합이지만, 프로퍼티 접근 및 조작의 의미론에 따라 여러 형태의 오브젝트가 존재합니다. 다양한 오브젝트 형태에 대한 정의는 6.1.7.2를 참고하세요.

또한 일부 오브젝트는 호출할 수 있습니다. 이들은 함수 또는 함수 오브젝트라 부르며, 아래에서 더 자세히 설명합니다. ECMAScript의 모든 함수는 Object 타입의 멤버입니다.

6.1.7.1 프로퍼티 속성

속성은 이 명세에서 표 3에 설명된 대로 객체 프로퍼티의 상태를 정의하고 설명하는 데 사용됩니다. 명시적으로 지정하지 않는 한, 각 속성의 초기값은 기본값(Default Value)입니다.

표 3: 객체 프로퍼티의 속성
속성 이름 해당 프로퍼티 타입 값의 도메인 기본값 설명
[[Value]] 데이터 프로퍼티 ECMAScript 언어 값 undefined get 접근 시 프로퍼티에서 조회되는 값입니다.
[[Writable]] 데이터 프로퍼티 Boolean false false일 경우, ECMAScript 코드에서 [[Set]]으로 [[Value]] 속성을 변경하려 해도 성공하지 않습니다.
[[Get]] 접근자 프로퍼티 오브젝트 또는 undefined undefined 값이 오브젝트라면, 반드시 함수 오브젝트여야 합니다. 함수의 [[Call]] 내부 메서드(표 5)가 빈 인자 리스트로 호출되어, get 접근 시마다 프로퍼티 값을 반환합니다.
[[Set]] 접근자 프로퍼티 오브젝트 또는 undefined undefined 값이 오브젝트라면, 반드시 함수 오브젝트여야 합니다. 함수의 [[Call]] 내부 메서드(표 5)가 단일 인자로 할당값을 넘겨 호출되며, set 접근 시마다 실행됩니다. 프로퍼티의 [[Set]] 내부 메서드의 효과는, 이후 [[Get]] 내부 메서드 호출 결과에 영향을 줄 수도 있고, 주지 않을 수도 있습니다.
[[Enumerable]] 데이터 프로퍼티 또는 접근자 프로퍼티 Boolean false true이면, for-in 반복문(14.7.5)에 의해 열거됩니다. 그렇지 않으면, 해당 프로퍼티는 비열거형(non-enumerable)입니다.
[[Configurable]] 데이터 프로퍼티 또는 접근자 프로퍼티 Boolean false false인 경우, 해당 프로퍼티를 삭제하거나, 데이터 프로퍼티접근자 프로퍼티로, 또는 반대로 변경하거나, (기존 [[Value]] 교체나 [[Writable]]false로 변경하는 경우를 제외하고) 속성에 변경을 가하려 해도 실패합니다.

6.1.7.2 오브젝트 내부 메서드와 내부 슬롯

ECMAScript에서 오브젝트의 실제 의미론은 내부 메서드라 불리는 알고리즘으로 지정됩니다. ECMAScript 엔진의 각 오브젝트는 런타임 동작을 정의하는 일련의 내부 메서드와 연관되어 있습니다. 이러한 내부 메서드는 ECMAScript 언어의 일부가 아니며, 명세상 설명 목적으로만 정의됩니다. 하지만 ECMAScript 구현 내의 각 오브젝트는 해당 내부 메서드가 명세한 대로 동작해야 합니다. 그 구현 방식은 구현체에 따라 다릅니다.

내부 메서드 이름은 다형적입니다. 즉, 동일한 내부 메서드 이름이 호출될 때 오브젝트 값에 따라 서로 다른 알고리즘이 실행될 수 있습니다. 내부 메서드가 호출되는 실제 오브젝트가 "타겟"입니다. 런타임 시 어떤 알고리즘이 오브젝트가 지원하지 않는 내부 메서드를 사용하려고 하면 TypeError 예외가 발생합니다.

내부 슬롯은 오브젝트와 연관된 내부 상태를 나타내며, 다양한 ECMAScript 명세 알고리즘에서 사용됩니다. 내부 슬롯은 오브젝트 프로퍼티가 아니며 상속되지도 않습니다. 내부 슬롯 명세에 따라 해당 상태는 ECMAScript 언어 타입 또는 명세 타입 값일 수 있습니다. 별도 명시가 없는 한, 내부 슬롯은 오브젝트 생성 과정에서 할당되며, 동적으로 추가될 수 없습니다. 별도 명시가 없는 한, 내부 슬롯의 초기값은 undefined입니다. 명세의 다양한 알고리즘은 내부 슬롯이 있는 오브젝트를 생성합니다. 하지만 ECMAScript 언어 자체에서는 오브젝트에 내부 슬롯을 직접 연결할 방법이 없습니다.

모든 오브젝트는 [[PrivateElements]]라는 내부 슬롯을 갖는데, 이는 List 타입의 PrivateElements 목록입니다. 이 List는 해당 오브젝트의 private 필드, 메서드, 접근자의 값을 나타냅니다. 초기값은 빈 List입니다.

내부 메서드와 내부 슬롯은 명세에서 [[ ]]로 감싸서 표기됩니다.

표 4는 ECMAScript 코드로 생성하거나 조작할 수 있는 모든 오브젝트에 적용되는 필수 내부 메서드를 요약합니다. 모든 오브젝트는 이 필수 내부 메서드의 알고리즘을 가져야 합니다. 그러나 모든 오브젝트가 반드시 동일한 알고리즘을 사용하는 것은 아닙니다.

일반 오브젝트는 다음 조건을 모두 만족하는 오브젝트입니다:

  • 표 4에 나열된 내부 메서드에 대해, 10.1에 정의된 메서드를 사용한다.
  • 오브젝트에 [[Call]] 내부 메서드가 있으면, 10.2.1 또는 10.3.1 중 하나를 사용한다.
  • 오브젝트에 [[Construct]] 내부 메서드가 있으면, 10.2.2 또는 10.3.2 중 하나를 사용한다.

이색 오브젝트(exotic object)일반 오브젝트가 아닌 오브젝트입니다.

이 명세는 오브젝트의 내부 메서드에 따라 다양한 이색 오브젝트 유형을 구분합니다. 어떤 오브젝트가 특정 종류의 이색 오브젝트(예: 배열 이색 오브젝트 또는 바운드 함수 이색 오브젝트 등)와 동작상 동일하더라도 명세된 내부 메서드 모음을 모두 갖추지 않으면 그 종류로 인식되지 않습니다.

표 4의 “시그니처(Signature)” 열 및 유사한 표들은 각 내부 메서드의 호출 패턴을 설명합니다. 호출 패턴에는 항상 괄호로 감싼 설명적 인자 이름들이 포함됩니다. 인자 이름이 ECMAScript 타입명과 같으면 해당 타입이어야 함을 의미합니다. 내부 메서드가 명시적으로 반환값을 가지면 인자 목록 뒤에 “→”와 반환 타입이 붙습니다. 이 시그니처에 쓰인 타입 이름은 6절 정의에 다음 명칭이 추가된 것입니다. “any”는 ECMAScript 언어 타입 중 아무 값이나 올 수 있음을 의미합니다.

내부 메서드는 인자 외에도 항상 호출 타겟 오브젝트에 접근할 수 있습니다.

내부 메서드는 암시적으로 Completion Record를 반환합니다. 이는 normal completion(호출 패턴에서 제시된 반환 타입 값을 감쌈) 또는 throw completion일 수 있습니다.

표 4: 필수 내부 메서드
내부 메서드 시그니처 설명
[[GetPrototypeOf]] ( ) Object | Null 이 오브젝트의 상속 프로퍼티를 제공하는 오브젝트를 결정합니다. null은 상속 프로퍼티가 없음을 의미합니다.
[[SetPrototypeOf]] (Object | Null) Boolean 이 오브젝트를 상속 프로퍼티를 제공하는 다른 오브젝트와 연결합니다. null을 넘기면 상속 프로퍼티가 없음을 의미합니다. 연산이 성공하면 true, 실패하면 false를 반환합니다.
[[IsExtensible]] ( ) Boolean 이 오브젝트에 추가 프로퍼티를 추가할 수 있는지 여부를 결정합니다.
[[PreventExtensions]] ( ) Boolean 이 오브젝트에 새 프로퍼티를 추가할 수 있는지 제어합니다. 연산이 성공하면 true, 실패하면 false를 반환합니다.
[[GetOwnProperty]] (propertyKey) Undefined | Property Descriptor 이 오브젝트의 own 프로퍼티 중 propertyKey를 키로 하는 프로퍼티에 대한 Property Descriptor를 반환하거나, 해당 프로퍼티가 없으면 undefined를 반환합니다.
[[DefineOwnProperty]] (propertyKey, PropertyDescriptor) Boolean propertyKey를 키로 하는 own 프로퍼티를 PropertyDescriptor로 기술된 상태로 생성하거나 변경합니다. 성공하면 true, 아니면 false를 반환합니다.
[[HasProperty]] (propertyKey) Boolean 이 오브젝트에 propertyKey를 키로 하는 own 또는 상속 프로퍼티가 있는지 Boolean 값으로 반환합니다.
[[Get]] (propertyKey, Receiver) any 이 오브젝트에서 propertyKey를 키로 하는 프로퍼티의 값을 반환합니다. 프로퍼티 값을 얻기 위해 ECMAScript 코드를 실행해야 하는 경우, Receiver가 코드 평가 시 this 값으로 사용됩니다.
[[Set]] (propertyKey, value, Receiver) Boolean propertyKey에 해당하는 프로퍼티의 값을 value로 설정합니다. 프로퍼티 값을 설정하기 위해 ECMAScript 코드를 실행해야 하는 경우, Receiver가 코드 평가 시 this 값으로 사용됩니다. 설정에 성공하면 true, 실패하면 false를 반환합니다.
[[Delete]] (propertyKey) Boolean 이 오브젝트에서 propertyKey를 키로 하는 own 프로퍼티를 삭제합니다. 프로퍼티가 삭제되지 않고 여전히 존재하면 false를 반환합니다. 프로퍼티가 삭제됐거나 존재하지 않으면 true를 반환합니다.
[[OwnPropertyKeys]] ( ) List of property keys 이 오브젝트의 own 프로퍼티 키 전체를 요소로 갖는 List를 반환합니다.

표 5는 함수로 호출 가능한 오브젝트가 지원하는 추가 필수 내부 메서드를 요약합니다. 함수 오브젝트[[Call]] 내부 메서드를 지원하는 오브젝트이고, 생성자[[Construct]] 내부 메서드를 지원하는 오브젝트입니다. [[Construct]]를 지원하는 모든 오브젝트는 반드시 [[Call]]도 지원해야 합니다. 즉, 모든 생성자함수 오브젝트여야 합니다. 따라서 생성자생성자 함수 또는 생성자 함수 오브젝트라고도 부를 수 있습니다.

표 5: 함수 오브젝트의 추가 필수 내부 메서드
내부 메서드 시그니처 설명
[[Call]] (any, List of any) any 이 오브젝트와 연관된 코드를 실행합니다. 함수 호출 표현식으로 호출됩니다. 내부 메서드의 인자는 this 값과, 호출 표현식으로 함수에 전달된 인자를 요소로 갖는 List입니다. 이 내부 메서드를 구현한 오브젝트는 호출 가능(callable)합니다.
[[Construct]] (List of any, Object) Object 오브젝트를 생성합니다. new 연산자나 super 호출을 통해 실행됩니다. 내부 메서드의 첫 번째 인자는 List로, 생성자 호출 또는 super 호출의 인자들을 요소로 갖습니다. 두 번째 인자는 new 연산자가 처음 적용된 오브젝트입니다. 이 내부 메서드를 구현한 오브젝트를 생성자라 합니다. 함수 오브젝트가 반드시 생성자인 것은 아니며, [[Construct]] 내부 메서드가 없는 함수 오브젝트도 있습니다.

일반 오브젝트와 표준 이색 오브젝트의 필수 내부 메서드의 의미론은 10절에 명시되어 있습니다. 만약 이색 오브젝트의 내부 메서드를 구현에서 지원하지 않는 경우, 해당 사용 시 TypeError 예외를 반드시 발생시켜야 합니다.

6.1.7.3 필수 내부 메서드의 불변 조건

ECMAScript 엔진의 오브젝트 내부 메서드는 아래에 명시된 불변 조건(invariant)을 반드시 준수해야 합니다. 이 명세의 일반 ECMAScript 오브젝트 및 모든 표준 이색 오브젝트는 이러한 불변 조건을 유지합니다. ECMAScript Proxy 오브젝트는 [[ProxyHandler]] 오브젝트의 트랩(trap) 결과에 대한 런타임 검사를 통해 이 불변 조건을 유지합니다.

구현체가 제공하는 이색 오브젝트도 반드시 이 불변 조건을 지켜야 합니다. 이러한 불변 조건이 위반되면 ECMAScript 코드에서 예측 불가한 동작이나 보안 문제가 발생할 수 있습니다. 단, 이 불변 조건 위반이 구현체의 메모리 안전성을 절대 해쳐서는 안 됩니다.

구현체는 필수 내부 메서드의 기능을 우회적으로 제공하여 이 불변 조건을 우회할 수 있게 해서는 안 됩니다.

정의(Definitions):

  • 내부 메서드의 target은 해당 내부 메서드가 호출되는 오브젝트입니다.
  • [[IsExtensible]] 내부 메서드가 false를 반환하거나, [[PreventExtensions]] 내부 메서드가 true를 반환한 경우 그 타겟은 비확장(non-extensible)입니다.
  • 존재하지 않는(non-existent) 프로퍼티란 비확장 타겟에 own 프로퍼티로 존재하지 않는 프로퍼티입니다.
  • SameValue에 대한 참조는 SameValue 알고리즘의 정의에 따릅니다.

반환 값(Return value):

모든 내부 메서드의 반환 값은 다음 중 하나를 가지는 Completion Record여야 합니다:

  • [[Type]] = normal, [[Target]] = empty, [[Value]] = 해당 내부 메서드의 아래에 명시된 "정상 반환 타입(normal return type)"의 값
  • [[Type]] = throw, [[Target]] = empty, [[Value]] = 임의의 ECMAScript 언어 값
참고 1

내부 메서드는 continue completion, break completion, return completion을 반환해서는 안 됩니다.

[[GetPrototypeOf]] ( )

  • 정상 반환 타입은 Object 또는 Null입니다.
  • 타겟이 비확장이고 [[GetPrototypeOf]]가 값 V를 반환한 경우, 이후 모든 [[GetPrototypeOf]] 호출은 SameValueV와 동일한 값을 반환해야 합니다.
참고 2

오브젝트의 프로토타입 체인은 유한 길이를 가져야 합니다(즉, 어떤 오브젝트에서 시작해 [[GetPrototypeOf]] 내부 메서드를 재귀적으로 적용하면 결국 null에 도달해야 함). 하지만 프로토타입 체인에 일반 오브젝트의 정의를 따르지 않는 이색 오브젝트가 포함되면 이 조건은 오브젝트 수준에서 강제할 수 없습니다. 이러한 순환 프로토타입 체인은 오브젝트 프로퍼티 접근 시 무한 루프를 야기할 수 있습니다.

[[SetPrototypeOf]] ( V )

  • 정상 반환 타입은 Boolean입니다.
  • 타겟이 비확장일 때, V가 타겟의 관찰된 [[GetPrototypeOf]] 값과 SameValue가 아닌 한 [[SetPrototypeOf]]는 반드시 false를 반환해야 합니다.

[[IsExtensible]] ( )

  • 정상 반환 타입은 Boolean입니다.
  • [[IsExtensible]]false를 반환한 경우, 이후 해당 타겟의 모든 [[IsExtensible]] 호출은 false를 반환해야 합니다.

[[PreventExtensions]] ( )

  • 정상 반환 타입은 Boolean입니다.
  • [[PreventExtensions]]true를 반환한 경우, 이후 해당 타겟의 모든 [[IsExtensible]] 호출은 false를 반환해야 하며, 타겟은 이제 비확장으로 간주합니다.

[[GetOwnProperty]] ( P )

  • 정상 반환 타입은 Property Descriptor 또는 Undefined입니다.
  • 반환값이 Property Descriptor이면, 반드시 모든 필드가 채워진 Property Descriptor여야 합니다.
  • P가 비설정 가능/비쓰기 가능 own 데이터 프로퍼티로 기술된 경우, 이후의 모든 [[GetOwnProperty]] ( P ) 호출은 [[Value]]P[[Value]]SameValueProperty Descriptor를 반환해야 합니다.
  • P[[Writable]][[Value]] 이외의 속성이 변할 수 있거나, 프로퍼티가 삭제될 수 있다면 P[[Configurable]] 속성은 true여야 합니다.
  • [[Writable]] 속성이 false에서 true로 바뀔 수 있다면, [[Configurable]] 속성도 true여야 합니다.
  • 타겟이 비확장이고 P가 존재하지 않는 own 프로퍼티라면, 이후의 모든 [[GetOwnProperty]] (P) 호출은 P를 존재하지 않는 것으로 설명해야 하며, 즉 [[GetOwnProperty]] (P)는 undefined를 반환해야 합니다.
참고 3

세 번째 불변 조건의 결과로, 어떤 프로퍼티가 데이터 프로퍼티로 기술되고 시간이 지남에 따라 다른 값을 반환할 수 있는 경우, 해당 프로퍼티의 [[Writable]]이나 [[Configurable]] 속성, 또는 둘 다 true여야 합니다. 비록 그 값을 바꿀 수 있는 메커니즘이 다른 필수 내부 메서드로 노출되어 있지 않더라도 말입니다.

[[DefineOwnProperty]] ( P, Desc )

  • 정상 반환 타입은 Boolean입니다.
  • [[DefineOwnProperty]]P가 타겟의 비설정 가능 own 프로퍼티로 관찰된 적이 있다면, 아래 둘 중 하나가 아닌 한 반드시 false를 반환해야 합니다:
    1. P가 쓰기 가능한 데이터 프로퍼티이다. 비설정 가능 쓰기 가능한 데이터 프로퍼티는 비설정 가능 비쓰기 가능한 데이터 프로퍼티로 변경될 수 있다.
    2. Desc의 모든 속성이 P의 속성과 SameValue이다.
  • [[DefineOwnProperty]] (P, Desc)는 타겟이 비확장이면서 P가 존재하지 않는 own 프로퍼티라면 반드시 false를 반환해야 합니다. 즉, 비확장 타겟 오브젝트에는 새 프로퍼티를 추가할 수 없습니다.

[[HasProperty]] ( P )

  • 정상 반환 타입은 Boolean입니다.
  • P가 타겟의 비설정 가능 own 데이터 또는 접근자 프로퍼티로 관찰된 적이 있다면, [[HasProperty]]true를 반환해야 합니다.

[[Get]] ( P, Receiver )

  • 정상 반환 타입은 ECMAScript 언어 타입 중 임의의 값입니다.
  • P가 값 V를 가진 비설정 가능/비쓰기 가능 own 데이터 프로퍼티로 관찰된 적이 있다면, [[Get]]은 반드시 VSameValue인 값을 반환해야 합니다.
  • P[[Get]] 속성이 undefined인 비설정 가능 own 접근자 프로퍼티로 관찰된 적이 있다면, [[Get]] 연산은 반드시 undefined를 반환해야 합니다.

[[Set]] ( P, V, Receiver )

  • 정상 반환 타입은 Boolean입니다.
  • P가 비설정 가능/비쓰기 가능 own 데이터 프로퍼티로 관찰된 적이 있다면, [[Set]]VP[[Value]]SameValue인 경우를 제외하고 반드시 false를 반환해야 합니다.
  • P[[Set]] 속성이 undefined인 비설정 가능 own 접근자 프로퍼티로 관찰된 적이 있다면, [[Set]] 연산은 반드시 false를 반환해야 합니다.

[[Delete]] ( P )

  • 정상 반환 타입은 Boolean입니다.
  • P가 타겟의 비설정 가능 own 데이터 또는 접근자 프로퍼티로 관찰된 적이 있다면, [[Delete]]false를 반환해야 합니다.

[[OwnPropertyKeys]] ( )

  • 정상 반환 타입은 List입니다.
  • 반환된 List에는 중복 항목이 없어야 합니다.
  • 반환된 List의 각 요소는 프로퍼티 키여야 합니다.
  • 반환된 List에는 이전에 관찰된 모든 비설정 가능 own 프로퍼티의 키가 반드시 포함되어야 합니다.
  • 타겟이 비확장일 경우, 반환된 List에는 [[GetOwnProperty]]로 관찰 가능한 타겟의 모든 own 프로퍼티의 키만 포함되어야 합니다.

[[Call]] ( )

[[Construct]] ( )

  • 정상 반환 타입은 Object입니다.
  • 타겟은 [[Call]] 내부 메서드도 반드시 가지고 있어야 합니다.

6.1.7.4 잘 알려진 내장 객체

잘 알려진 내장 객체들은 이 명세의 알고리즘에 의해 명시적으로 참조되는 내장 객체들이며, 일반적으로 realm별로 고유한 정체성을 가진다. 별도로 명시되지 않는 한, 각 내장 객체는 실제로는 각 realm마다 유사한 객체 집합에 해당한다.

이 명세에서 %name%과 같은 참조는 현재 realm에 연결된, 해당 name에 해당하는 내장 객체를 의미한다. %name.a.b%와 같은 참조는, ECMAScript 코드가 평가되기 전에 내장 객체 %name%의 "a" 속성의 값에서 "b" 속성을 접근한 것과 같다. 현재 realm과 그 내장 객체들의 결정 방법은 9.4에 설명되어 있다. 잘 알려진 내장 객체들의 목록은 표 6에 나와 있다.

표 6: 잘 알려진 내장 객체
내장 이름 전역 이름 ECMAScript 언어 연관성
%AggregateError% AggregateError AggregateError 생성자 (20.5.7.1)
%Array% Array Array 생성자 (23.1.1)
%ArrayBuffer% ArrayBuffer ArrayBuffer 생성자 (25.1.4)
%ArrayIteratorPrototype% Array Iterator 객체의 프로토타입 (23.1.5)
%AsyncFromSyncIteratorPrototype% Async-from-Sync Iterator 객체의 프로토타입 (27.1.6)
%AsyncFunction% async 함수 객체생성자 (27.7.1)
%AsyncGeneratorFunction% async generator 함수 객체생성자 (27.4.1)
%AsyncGeneratorPrototype% async generator 객체의 프로토타입 (27.6)
%AsyncIteratorPrototype% 모든 표준 내장 async iterator 객체가 간접적으로 상속하는 객체
%Atomics% Atomics Atomics 객체 (25.4)
%BigInt% BigInt BigInt 생성자 (21.2.1)
%BigInt64Array% BigInt64Array BigInt64Array 생성자 (23.2)
%BigUint64Array% BigUint64Array BigUint64Array 생성자 (23.2)
%Boolean% Boolean Boolean 생성자 (20.3.1)
%DataView% DataView DataView 생성자 (25.3.2)
%Date% Date Date 생성자 (21.4.2)
%decodeURI% decodeURI decodeURI 함수 (19.2.6.1)
%decodeURIComponent% decodeURIComponent decodeURIComponent 함수 (19.2.6.2)
%encodeURI% encodeURI encodeURI 함수 (19.2.6.3)
%encodeURIComponent% encodeURIComponent encodeURIComponent 함수 (19.2.6.4)
%Error% Error Error 생성자 (20.5.1)
%eval% eval eval 함수 (19.2.1)
%EvalError% EvalError EvalError 생성자 (20.5.5.1)
%FinalizationRegistry% FinalizationRegistry FinalizationRegistry 생성자 (26.2.1)
%Float16Array% Float16Array Float16Array 생성자 (23.2)
%Float32Array% Float32Array Float32Array 생성자 (23.2)
%Float64Array% Float64Array Float64Array 생성자 (23.2)
%ForInIteratorPrototype% For-In Iterator 객체의 프로토타입 (14.7.5.10)
%Function% Function Function 생성자 (20.2.1)
%GeneratorFunction% generator 함수 객체생성자 (27.3.1)
%GeneratorPrototype% generator 객체의 프로토타입 (27.5)
%Int8Array% Int8Array Int8Array 생성자 (23.2)
%Int16Array% Int16Array Int16Array 생성자 (23.2)
%Int32Array% Int32Array Int32Array 생성자 (23.2)
%isFinite% isFinite isFinite 함수 (19.2.2)
%isNaN% isNaN isNaN 함수 (19.2.3)
%Iterator% Iterator Iterator 생성자 (27.1.3.1)
%IteratorHelperPrototype% Iterator Helper 객체의 프로토타입 (27.1.2.1)
%JSON% JSON JSON 객체 (25.5)
%Map% Map Map 생성자 (24.1.1)
%MapIteratorPrototype% Map Iterator 객체의 프로토타입 (24.1.5)
%Math% Math Math 객체 (21.3)
%Number% Number Number 생성자 (21.1.1)
%Object% Object Object 생성자 (20.1.1)
%parseFloat% parseFloat parseFloat 함수 (19.2.4)
%parseInt% parseInt parseInt 함수 (19.2.5)
%Promise% Promise Promise 생성자 (27.2.3)
%Proxy% Proxy Proxy 생성자 (28.2.1)
%RangeError% RangeError RangeError 생성자 (20.5.5.2)
%ReferenceError% ReferenceError ReferenceError 생성자 (20.5.5.3)
%Reflect% Reflect Reflect 객체 (28.1)
%RegExp% RegExp RegExp 생성자 (22.2.4)
%RegExpStringIteratorPrototype% RegExp String Iterator 객체의 프로토타입 (22.2.9)
%Set% Set Set 생성자 (24.2.2)
%SetIteratorPrototype% Set Iterator 객체의 프로토타입 (24.2.6)
%SharedArrayBuffer% SharedArrayBuffer SharedArrayBuffer 생성자 (25.2.3)
%String% String String 생성자 (22.1.1)
%StringIteratorPrototype% String Iterator 객체의 프로토타입 (22.1.5)
%Symbol% Symbol Symbol 생성자 (20.4.1)
%SyntaxError% SyntaxError SyntaxError 생성자 (20.5.5.4)
%ThrowTypeError% 함수 객체로, 무조건 %TypeError%의 새 인스턴스를 throw함
%TypedArray% 모든 typed Array 생성자의 슈퍼 클래스 (23.2.1)
%TypeError% TypeError TypeError 생성자 (20.5.5.5)
%Uint8Array% Uint8Array Uint8Array 생성자 (23.2)
%Uint8ClampedArray% Uint8ClampedArray Uint8ClampedArray 생성자 (23.2)
%Uint16Array% Uint16Array Uint16Array 생성자 (23.2)
%Uint32Array% Uint32Array Uint32Array 생성자 (23.2)
%URIError% URIError URIError 생성자 (20.5.5.6)
%WeakMap% WeakMap WeakMap 생성자 (24.3.1)
%WeakRef% WeakRef WeakRef 생성자 (26.1.1)
%WeakSet% WeakSet WeakSet 생성자 (24.4.1)
%WrapForValidIteratorPrototype% Iterator.from에서 반환되는 래핑된 iterator 객체의 프로토타입 (27.1.3.2.1.1)
참고

표 102에 추가 항목이 있습니다.

6.2 ECMAScript 명세 타입

명세 타입은 ECMAScript 언어 구성 요소와 ECMAScript 언어 타입의 의미를 설명하기 위해 알고리즘 내에서 사용되는 메타값에 해당한다. 명세 타입에는 Reference Record, List, Completion Record, Property Descriptor, Environment Record, Abstract Closure, 그리고 Data Block이 포함된다. 명세 타입 값은 명세상의 산출물로, ECMAScript 구현 내의 특정 엔티티에 반드시 대응하지는 않는다. 명세 타입 값은 ECMAScript 표현식 평가의 중간 결과를 설명하는 데 사용될 수 있지만, 이러한 값은 객체의 프로퍼티나 ECMAScript 언어 변수의 값으로 저장될 수 없다.

6.2.1 Enum 명세 타입

Enums는 명세 내부에서만 사용되는 값으로, ECMAScript 코드에서는 직접적으로 관찰할 수 없다. Enum은 sans-serif 글꼴로 표기된다. 예를 들어, Completion Record[[Type]] 필드는 normal, return, 또는 throw와 같은 값을 가진다. Enum은 이름 외의 특징이 없다. Enum의 이름은 단지 다른 Enum과 구분하기 위한 용도일 뿐이며, 사용법이나 문맥상의 의미를 암시하지 않는다.

6.2.2 List와 Record 명세 타입

List 타입은 new 표현식의 인수 리스트 평가( 13.3.8 참고), 함수 호출, 기타 값의 간단한 순서형 리스트가 필요한 알고리즘의 설명에 사용된다. List 타입의 값은 개별 값으로 구성된 리스트 요소들의 단순한 순서 시퀀스이다. 이 시퀀스의 길이는 임의일 수 있다. 리스트의 요소는 0부터 시작하는 인덱스로 임의 접근이 가능하다. 표기상의 편의를 위해 배열과 유사한 문법으로 List 요소에 접근할 수 있다. 예를 들어, arguments[2]는 List arguments의 세 번째 요소를 의미한다.

알고리즘이 List의 요소를 순서 지정 없이 반복할 때, 사용되는 순서는 List의 요소 순서이다.

이 명세 내에서 표기상의 편의를 위해, 리터럴 문법으로 새 List 값을 표현할 수 있다. 예를 들어, « 1, 2 »는 두 개의 요소를 가지며 각각 특정 값으로 초기화된 List 값을 정의한다. 새로운 빈 List는 « »로 표현할 수 있다.

이 명세에서 "the list-concatenation of A, B, ..." (각 인수가 비어 있을 수도 있는 List임)은 각 인수의 요소(순서대로)를 연결한 새로운 List 값을 의미한다.

List of String에 대해 "sorted according to lexicographic code unit order"라는 문구는, 짧은 문자열의 길이만큼 각 코드 유닛의 숫자값으로 정렬하고, 모두 같으면 짧은 문자열을 긴 문자열보다 먼저 정렬함을 의미한다. 이는 IsLessThan 추상 연산에서 설명된다.

Record 타입은 이 명세의 알고리즘 내에서 데이터 집합을 설명하는 데 사용된다. Record 타입 값은 하나 이상의 이름 붙은 필드로 구성된다. 각 필드의 값은 ECMAScript 언어 값 또는 명세 값이다. 필드 이름은 항상 이중 대괄호로 감싸며, 예를 들어 [[Value]]와 같다.

이 명세 내에서 표기상의 편의를 위해, 객체 리터럴과 유사한 문법으로 Record 값을 표현할 수 있다. 예를 들어, { [[Field1]]: 42, [[Field2]]: false, [[Field3]]: empty }는 세 개의 필드를 각각 특정 값으로 초기화한 Record 값을 정의한다. 필드 이름의 순서는 중요하지 않다. 명시적으로 나열되지 않은 필드는 존재하지 않는 것으로 간주한다.

명세 텍스트와 알고리즘에서는 점 표기법을 사용해 Record 값의 특정 필드를 참조할 수 있다. 예를 들어, 위에서 보인 record R에 대해 R.[[Field2]]는 “R의 [[Field2]]라는 이름의 필드”를 의미한다.

자주 사용되는 Record 필드 조합의 스키마는 이름을 붙일 수 있으며, 그 이름을 리터럴 Record 값에 접두사로 사용하여 특정 집합의 종류를 명확히 할 수 있다. 예: PropertyDescriptor { [[Value]]: 42, [[Writable]]: false, [[Configurable]]: true }.

6.2.3 Set과 Relation 명세 타입

Set 타입은 메모리 모델에서 사용하기 위한 비순서 요소의 집합을 설명하는 데 사용된다. ECMAScript의 같은 이름을 가진 컬렉션 타입과는 다르다. 혼동을 피하기 위해, 이 명세에서는 ECMAScript 컬렉션의 인스턴스를 항상 "Set 객체"라고 부른다. Set 타입의 값은 중복 없는 단순한 요소 집합이며, 요소를 추가하거나 제거할 수 있다. Set끼리는 합집합, 교집합, 차집합 연산이 가능하다.

Relation 타입은 Set에 대한 제약 조건을 설명하는 데 사용된다. Relation 타입의 값은 값 도메인에서의 순서쌍의 Set이다. 예를 들어, 이벤트에 대한 Relation은 이벤트 순서쌍의 집합이다. Relation RR의 값 도메인에 속한 두 값 ab에 대해, a R b는 순서쌍 (a, b)가 R의 멤버임을 의미하는 약칭이다. Relation이 어떤 조건에 대해 최소 Relation일 때, 이는 그 조건을 만족하는 가장 작은 Relation임을 의미한다.

strict partial order는 Relation 값 R이 다음 조건을 만족할 때를 말한다.

  • 모든 a, b, cR의 도메인에 있을 때:

    • a R a가 아니다.
    • a R b이고 b R c이면, a R c이다.
참고 1

위 두 속성은 각각 반사성 없음(irreflexivity)과 추이성(transitivity)이라 한다.

strict total order는 Relation 값 R이 다음 조건을 만족할 때를 말한다.

  • 모든 a, b, cR의 도메인에 있을 때:

    • ab와 같거나 a R b이거나 b R a이다.
    • a R a가 아니다.
    • a R b이고 b R c이면, a R c이다.
참고 2

위 세 속성은 각각 전체성(totality), 반사성 없음(irreflexivity), 추이성(transitivity)이라 한다.

6.2.4 완료 레코드 명세 타입

완료 레코드 명세 타입은 값의 런타임 전파와 break, continue, return, throw와 같이 비지역적 제어 흐름 전이를 수행하는 구문의 동작과 같은 제어 흐름을 설명하는 데 사용된다.

완료 레코드는 표 7에 정의된 필드를 가진다.

표 7: 완료 레코드 필드
필드 이름 의미
[[Type]] normal, break, continue, return, 또는 throw 발생한 완료의 타입.
[[Value]] 완료 레코드가 아닌 임의의 값 생성된 값.
[[Target]] 문자열 또는 empty 지정된 제어 전이의 대상 레이블.

다음과 같은 축약 용어가 때때로 완료 레코드를 지칭하는 데 사용된다.

  • 정상 완료[[Type]] 값이 normal인 모든 완료 레코드를 의미한다.
  • break 완료[[Type]] 값이 break인 모든 완료 레코드를 의미한다.
  • continue 완료[[Type]] 값이 continue인 모든 완료 레코드를 의미한다.
  • return 완료[[Type]] 값이 return인 모든 완료 레코드를 의미한다.
  • throw 완료[[Type]] 값이 throw인 모든 완료 레코드를 의미한다.
  • 비정상 완료[[Type]] 값이 normal이 아닌 모든 완료 레코드를 의미한다.
  • 특정 값이 포함된 정상 완료[[Value]] 필드에 해당 타입의 값을 가진 정상 완료를 의미한다.

이 명세에서 정의된 호출 가능한 객체는 정상 완료 또는 throw 완료만 반환해야 한다. 그 외의 완료 레코드를 반환하는 것은 편집상의 오류로 간주된다.

구현 정의 호출 가능한 객체는 정상 완료 또는 throw 완료만 반환해야 한다.

6.2.4.1 NormalCompletion ( value )

추상 연산 NormalCompletion은 value (완료 레코드가 아닌 임의의 값)를 인수로 받아 정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 완료 레코드 { [[Type]]: normal, [[Value]]: value, [[Target]]: empty }를 반환한다.

6.2.4.2 ThrowCompletion ( value )

추상 연산 ThrowCompletion은 value (ECMAScript 언어 값)를 인수로 받아 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 완료 레코드 { [[Type]]: throw, [[Value]]: value, [[Target]]: empty }를 반환한다.

6.2.4.3 ReturnCompletion ( value )

추상 연산 ReturnCompletion은 value (ECMAScript 언어 값)를 인수로 받아 return 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 완료 레코드 { [[Type]]: return, [[Value]]: value, [[Target]]: empty }를 반환한다.

6.2.4.4 UpdateEmpty ( completionRecord, value )

추상 연산 UpdateEmpty는 completionRecord ( 완료 레코드 )와 value ( 완료 레코드가 아닌 임의의 값 )를 인수로 받아 완료 레코드를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: completionRecordreturn 완료 또는 throw 완료인 경우, completionRecord.[[Value]]empty가 아니어야 한다.
  2. 만약 completionRecord.[[Value]]empty가 아니라면, ? completionRecord를 반환한다.
  3. 완료 레코드 { [[Type]]: completionRecord.[[Type]], [[Value]]: value, [[Target]]: completionRecord.[[Target]] }를 반환한다.

6.2.5 Reference Record 명세 타입

Reference Record 타입은 delete, typeof, 대입 연산자, super 키워드 및 기타 언어 기능의 동작을 설명하는 데 사용된다. 예를 들어, 대입의 왼쪽 피연산자는 Reference Record를 생성해야 한다.

Reference Record는 해석된 이름 또는 (아직 해석되지 않았을 수도 있는) 프로퍼티 바인딩이며, 그 필드는 표 8에 정의되어 있다.

표 8: Reference Record 필드
필드 이름 의미
[[Base]] ECMAScript 언어 값 또는 Environment Record 혹은 unresolvable 바인딩을 보유하는 값 또는 Environment Record. [[Base]]unresolvable이면 바인딩을 해결할 수 없음을 나타낸다.
[[ReferencedName]] ECMAScript 언어 값 또는 Private Name 바인딩의 이름. [[Base]] 값이 Environment Record일 때는 항상 문자열이다. 그렇지 않으면, 문자열이나 심볼이 아닌 ECMAScript 언어 값일 수 있으며, ToPropertyKey가 수행될 때까지 유지된다.
[[Strict]] Boolean true이면 Reference Recordstrict mode 코드에서 생성된 것이고, false이면 그렇지 않다.
[[ThisValue]] ECMAScript 언어 값 또는 empty empty가 아닌 경우, 해당 Reference Recordsuper 키워드를 사용하여 표현된 프로퍼티 바인딩을 나타내며, 이를 Super Reference Record라 한다. 이 경우 [[Base]] 값은 Environment Record가 될 수 없다. 이때 [[ThisValue]] 필드는 this 값(Reference Record가 생성될 당시의 값)을 보유한다.

Reference Record를 다루기 위해 이 명세에서 다음 추상 연산들이 사용된다:

6.2.5.1 IsPropertyReference ( V )

추상 연산 IsPropertyReference는 인수 V ( Reference Record )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. V.[[Base]]unresolvable이면 false를 반환한다.
  2. V.[[Base]]Environment Record이면 false를, 아니면 true를 반환한다.

6.2.5.2 IsUnresolvableReference ( V )

추상 연산 IsUnresolvableReference는 인수 V ( Reference Record )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. V.[[Base]]unresolvable이면 true를, 아니면 false를 반환한다.

6.2.5.3 IsSuperReference ( V )

추상 연산 IsSuperReference는 인수 V ( Reference Record )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. V.[[ThisValue]]empty가 아니면 true를, 아니면 false를 반환한다.

6.2.5.4 IsPrivateReference ( V )

추상 연산 IsPrivateReference는 인수 V ( Reference Record )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. V.[[ReferencedName]]Private Name이면 true를, 아니면 false를 반환한다.

6.2.5.5 GetValue ( V )

추상 연산 GetValue는 인수 V ( Reference Record 또는 ECMAScript 언어 값 )를 받아 특정 값을 포함하는 정상 완료 ECMAScript 언어 값 또는 비정상 완료 중 하나를 반환한다. 호출 시 다음 단계를 수행한다:

  1. VReference Record가 아니면 V를 반환한다.
  2. IsUnresolvableReference(V) 가 true이면 ReferenceError 예외를 throw한다.
  3. IsPropertyReference(V) 가 true이면, 다음을 수행한다:
    1. baseObj를 ? ToObject(V.[[Base]])로 설정한다.
    2. IsPrivateReference(V) 가 true이면, 다음을 수행한다:
      1. PrivateGet(baseObj, V.[[ReferencedName]])를 반환한다.
    3. V.[[ReferencedName]]property key가 아니면, 다음을 수행한다:
      1. V.[[ReferencedName]]을 ? ToPropertyKey(V.[[ReferencedName]])로 설정한다.
    4. baseObj.[[Get]](V.[[ReferencedName]], GetThisValue(V))를 반환한다.
  4. 그 외의 경우,
    1. baseV.[[Base]]로 설정한다.
    2. Assert: baseEnvironment Record여야 한다.
    3. base.GetBindingValue(V.[[ReferencedName]], V.[[Strict]])를 반환한다 (9.1 참고).
참고

3.a 단계에서 생성될 수 있는 객체는 위 추상 연산과 ordinary object[[Get]] 내부 메서드 외부에서는 접근할 수 없다. 구현체는 실제 객체 생성을 생략할 수 있다.

6.2.5.6 PutValue ( V, W )

추상 연산 PutValue는 인수 V ( Reference Record 또는 ECMAScript 언어 값 )와 W ( ECMAScript 언어 값 )를 받아, 특정 값을 포함하는 정상 완료 unused 또는 비정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. VReference Record가 아니면 ReferenceError 예외를 throw한다.
  2. IsUnresolvableReference(V) 가 true이면, 다음을 수행한다:
    1. V.[[Strict]]true이면 ReferenceError 예외를 throw한다.
    2. globalObjGetGlobalObject()로 설정한다.
    3. Set(globalObj, V.[[ReferencedName]], W, false)를 수행한다.
    4. unused를 반환한다.
  3. IsPropertyReference(V) 가 true이면, 다음을 수행한다:
    1. baseObj를 ? ToObject(V.[[Base]])로 설정한다.
    2. IsPrivateReference(V) 가 true이면, 다음을 수행한다:
      1. PrivateSet(baseObj, V.[[ReferencedName]], W)를 반환한다.
    3. V.[[ReferencedName]]property key가 아니면, 다음을 수행한다:
      1. V.[[ReferencedName]]을 ? ToPropertyKey(V.[[ReferencedName]])로 설정한다.
    4. succeeded를 ? baseObj.[[Set]](V.[[ReferencedName]], W, GetThisValue(V))로 설정한다.
    5. succeededfalse이고 V.[[Strict]]true이면 TypeError 예외를 throw한다.
    6. unused를 반환한다.
  4. 그 외의 경우,
    1. baseV.[[Base]]로 설정한다.
    2. Assert: baseEnvironment Record여야 한다.
    3. base.SetMutableBinding(V.[[ReferencedName]], W, V.[[Strict]])를 반환한다 (9.1 참고).
참고

3.a 단계에서 생성될 수 있는 객체는 위 추상 연산과 ordinary object[[Set]] 내부 메서드 외부에서는 접근할 수 없다. 구현체는 실제 객체 생성을 생략할 수 있다.

6.2.5.7 GetThisValue ( V )

추상 연산 GetThisValue는 인수 V ( Reference Record )를 받아 ECMAScript 언어 값을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: IsPropertyReference(V) 가 true임을 보장한다.
  2. IsSuperReference(V) 가 true이면 V.[[ThisValue]]를, 아니면 V.[[Base]]를 반환한다.

6.2.5.8 InitializeReferencedBinding ( V, W )

추상 연산 InitializeReferencedBinding은 인수 V ( Reference Record )와 W ( ECMAScript 언어 값 )를 받아, 특정 값을 포함하는 정상 완료 unused 또는 비정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: IsUnresolvableReference(V) 가 false임을 보장한다.
  2. baseV.[[Base]]로 설정한다.
  3. Assert: baseEnvironment Record여야 한다.
  4. base.InitializeBinding(V.[[ReferencedName]], W)를 반환한다.

6.2.5.9 MakePrivateReference ( baseValue, privateIdentifier )

추상 연산 MakePrivateReference는 인수 baseValue ( ECMAScript 언어 값 )와 privateIdentifier (문자열)을 받아 Reference Record를 반환한다. 호출 시 다음 단계를 수행한다:

  1. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 설정한다.
  2. Assert: privateEnvnull이 아님을 보장한다.
  3. privateNameResolvePrivateIdentifier(privateEnv, privateIdentifier)로 설정한다.
  4. 다음과 같은 Reference Record를 반환한다: { [[Base]]: baseValue, [[ReferencedName]]: privateName, [[Strict]]: true, [[ThisValue]]: empty }.

6.2.6 프로퍼티 디스크립터 명세 타입

Property Descriptor 타입은 객체 프로퍼티 속성의 조작 및 구체화(reification)를 설명하는 데 사용된다. Property Descriptor는 0개 이상의 필드를 가진 Record이며, 각 필드의 이름은 속성 이름이고 값은 6.1.7.1에 명시된 해당 속성 값이다. 이 명세 내에서 리터럴 Property Descriptor 레코드의 태그로 사용되는 스키마 이름은 “PropertyDescriptor”이다.

Property Descriptor 값은 특정 필드의 존재 또는 사용에 따라 데이터 프로퍼티 디스크립터와 접근자 프로퍼티 디스크립터로 더 분류될 수 있다. 데이터 프로퍼티 디스크립터는 [[Value]] 또는 [[Writable]]라는 이름의 필드가 포함된 것이다. 접근자 프로퍼티 디스크립터는 [[Get]] 또는 [[Set]]라는 이름의 필드가 포함된 것이다. 어떤 Property Descriptor도 [[Enumerable]][[Configurable]]라는 이름의 필드를 가질 수 있다. Property Descriptor 값은 데이터 프로퍼티 디스크립터이면서 접근자 프로퍼티 디스크립터일 수는 없지만, 둘 다 아닐 수는 있다(이 경우 일반 프로퍼티 디스크립터이다). 완전히 채워진 Property Descriptor는 접근자 프로퍼티 디스크립터 또는 데이터 프로퍼티 디스크립터 중 하나이면서 표 3에 명시된 모든 해당 필드를 가진 것이다.

Property Descriptor 값을 다루기 위해 이 명세에서는 다음 추상 연산들이 사용된다:

6.2.6.1 IsAccessorDescriptor ( Desc )

추상 연산 IsAccessorDescriptor는 인수 Desc ( Property Descriptor )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Desc[[Get]] 필드가 있으면 true를 반환한다.
  2. Desc[[Set]] 필드가 있으면 true를 반환한다.
  3. false를 반환한다.

6.2.6.2 IsDataDescriptor ( Desc )

추상 연산 IsDataDescriptor는 인수 Desc ( Property Descriptor )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Desc[[Value]] 필드가 있으면 true를 반환한다.
  2. Desc[[Writable]] 필드가 있으면 true를 반환한다.
  3. false를 반환한다.

6.2.6.3 IsGenericDescriptor ( Desc )

추상 연산 IsGenericDescriptor는 인수 Desc ( Property Descriptor )를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. IsAccessorDescriptor(Desc) 가 true이면 false를 반환한다.
  2. IsDataDescriptor(Desc) 가 true이면 false를 반환한다.
  3. true를 반환한다.

6.2.6.4 FromPropertyDescriptor ( Desc )

추상 연산 FromPropertyDescriptor는 인수 Desc ( Property Descriptor 또는 undefined )를 받아 객체 또는 undefined를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Descundefined이면 undefined를 반환한다.
  2. objOrdinaryObjectCreate(%Object.prototype%)로 설정한다.
  3. Assert: obj는 자체 프로퍼티가 없는 확장 가능한 ordinary object여야 한다.
  4. Desc[[Value]] 필드가 있으면, 다음을 수행한다:
    1. CreateDataPropertyOrThrow(obj, "value", Desc.[[Value]])를 수행한다.
  5. Desc[[Writable]] 필드가 있으면, 다음을 수행한다:
    1. CreateDataPropertyOrThrow(obj, "writable", Desc.[[Writable]])를 수행한다.
  6. Desc[[Get]] 필드가 있으면, 다음을 수행한다:
    1. CreateDataPropertyOrThrow(obj, "get", Desc.[[Get]])를 수행한다.
  7. Desc[[Set]] 필드가 있으면, 다음을 수행한다:
    1. CreateDataPropertyOrThrow(obj, "set", Desc.[[Set]])를 수행한다.
  8. Desc[[Enumerable]] 필드가 있으면, 다음을 수행한다:
    1. CreateDataPropertyOrThrow(obj, "enumerable", Desc.[[Enumerable]])를 수행한다.
  9. Desc[[Configurable]] 필드가 있으면, 다음을 수행한다:
    1. CreateDataPropertyOrThrow(obj, "configurable", Desc.[[Configurable]])를 수행한다.
  10. obj를 반환한다.

6.2.6.5 ToPropertyDescriptor ( Obj )

추상 연산 ToPropertyDescriptor는 인수 Obj ( ECMAScript 언어 값 )를 받아, 특정 값을 포함하는 정상 완료 Property Descriptor 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Obj객체가 아니면, TypeError 예외를 throw한다.
  2. desc를 처음에는 필드가 없는 새로운 Property Descriptor로 설정한다.
  3. hasEnumerable을 ? HasProperty(Obj, "enumerable")로 설정한다.
  4. hasEnumerabletrue이면, 다음을 수행한다:
    1. enumerableToBoolean(? Get(Obj, "enumerable"))로 설정한다.
    2. desc.[[Enumerable]]enumerable을 할당한다.
  5. hasConfigurable을 ? HasProperty(Obj, "configurable")로 설정한다.
  6. hasConfigurabletrue이면, 다음을 수행한다:
    1. configurableToBoolean(? Get(Obj, "configurable"))로 설정한다.
    2. desc.[[Configurable]]configurable을 할당한다.
  7. hasValue를 ? HasProperty(Obj, "value")로 설정한다.
  8. hasValuetrue이면, 다음을 수행한다:
    1. value를 ? Get(Obj, "value")로 설정한다.
    2. desc.[[Value]]value를 할당한다.
  9. hasWritable을 ? HasProperty(Obj, "writable")로 설정한다.
  10. hasWritabletrue이면, 다음을 수행한다:
    1. writableToBoolean(? Get(Obj, "writable"))로 설정한다.
    2. desc.[[Writable]]writable을 할당한다.
  11. hasGet을 ? HasProperty(Obj, "get")로 설정한다.
  12. hasGettrue이면, 다음을 수행한다:
    1. getter를 ? Get(Obj, "get")로 설정한다.
    2. IsCallable(getter) 가 false이고 getterundefined가 아니면 TypeError 예외를 throw한다.
    3. desc.[[Get]]getter를 할당한다.
  13. hasSet을 ? HasProperty(Obj, "set")로 설정한다.
  14. hasSettrue이면, 다음을 수행한다:
    1. setter를 ? Get(Obj, "set")로 설정한다.
    2. IsCallable(setter) 가 false이고 setterundefined가 아니면 TypeError 예외를 throw한다.
    3. desc.[[Set]]setter를 할당한다.
  15. desc[[Get]] 필드가 있거나 desc[[Set]] 필드가 있으면, 다음을 수행한다:
    1. desc[[Value]] 필드가 있거나 desc[[Writable]] 필드가 있으면 TypeError 예외를 throw한다.
  16. desc를 반환한다.

6.2.6.6 CompletePropertyDescriptor ( Desc )

추상 연산 CompletePropertyDescriptor는 인수 Desc ( Property Descriptor )를 받아 unused를 반환한다. 호출 시 다음 단계를 수행한다:

  1. likeRecord { [[Value]]: undefined, [[Writable]]: false, [[Get]]: undefined, [[Set]]: undefined, [[Enumerable]]: false, [[Configurable]]: false }로 설정한다.
  2. IsGenericDescriptor(Desc)가 true이거나 IsDataDescriptor(Desc)가 true이면, 다음을 수행한다:
    1. Desc[[Value]] 필드가 없으면 Desc.[[Value]]like.[[Value]]로 설정한다.
    2. Desc[[Writable]] 필드가 없으면 Desc.[[Writable]]like.[[Writable]]로 설정한다.
  3. 그 외의 경우,
    1. Desc[[Get]] 필드가 없으면 Desc.[[Get]]like.[[Get]]로 설정한다.
    2. Desc[[Set]] 필드가 없으면 Desc.[[Set]]like.[[Set]]로 설정한다.
  4. Desc[[Enumerable]] 필드가 없으면 Desc.[[Enumerable]]like.[[Enumerable]]로 설정한다.
  5. Desc[[Configurable]] 필드가 없으면 Desc.[[Configurable]]like.[[Configurable]]로 설정한다.
  6. unused를 반환한다.

6.2.7 환경 레코드 명세 타입

Environment Record 타입은 중첩 함수와 블록에서의 이름 해석 동작을 설명하는 데 사용된다. 이 타입과 그에 대한 연산들은 9.1에 정의되어 있다.

6.2.8 추상 클로저 명세 타입

Abstract Closure 명세 타입은 알고리즘 단계와 값들의 집합을 함께 참조하는 데 사용된다. Abstract Closure는 메타값이며, closure(arg1, arg2)와 같은 함수 호출 방식으로 호출된다. 추상 연산과 마찬가지로, 호출 시 Abstract Closure에 명시된 알고리즘 단계를 수행한다.

Abstract Closure를 생성하는 알고리즘 단계에서는 "capture"라는 동사 뒤에 별칭(alias) 목록을 사용해 값을 캡처한다. Abstract Closure가 생성될 때, 각 별칭에 연결된 값을 그 시점에 캡처한다. Abstract Closure가 호출될 때 수행할 알고리즘을 명시하는 단계에서는, 캡처된 각 값은 해당 별칭을 통해 참조된다.

Abstract Closure가 Completion Record를 반환하는 경우, 해당 Completion Record정상 완료 또는 throw 완료여야 한다.

Abstract Closure는 다음 예시처럼 다른 알고리즘의 일부로 인라인으로 생성된다.

  1. addend를 41로 한다.
  2. closure를 매개변수 (x)를 가지며 addend를 캡처하고, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure로 한다:
    1. x + addend를 반환한다.
  3. valclosure(1)로 한다.
  4. Assert: val은 42이다.

6.2.9 데이터 블록

Data Block 명세 타입은 구분되는 변경 가능한 바이트 크기(8비트) 정수 값들의 시퀀스를 설명하는 데 사용된다. byte value정수이며, 구간 [0, 255]에 속한다. Data Block 값은 고정된 개수의 바이트로 생성되며, 각 바이트의 초기값은 0이다.

이 명세 내 표기상의 편의를 위해, 배열과 유사한 문법을 사용해 Data Block 값의 개별 바이트에 접근할 수 있다. 이 표기법은 Data Block 값을 0부터 시작하는 정수-인덱스 바이트 시퀀스로 나타낸다. 예를 들어, db가 5바이트 Data Block 값이면 db[2]는 세 번째 바이트를 의미한다.

여러 agent에서 동시에 참조할 수 있는 메모리에 위치한 데이터 블록은 Shared Data Block으로 지정된다. Shared Data Block은 정체성(동등성 판단 목적)을 주소와 무관하게 가진다: 이는 프로세스의 가상 주소가 아니라 그 블록이 대표하는 메모리 위치 집합에 묶여 있다. 두 데이터 블록이 동일하다는 것은 그들이 포함하는 위치 집합이 동일할 때뿐이다. 그렇지 않으면 서로 다르며, 각자 위치 집합의 교집합은 없다. 마지막으로 Shared Data Block은 일반 Data Block과 구별된다.

Shared Data Block의 의미는 Shared Data Block 이벤트메모리 모델에 의해 정의된다. 아래 추상 연산들은 Shared Data Block 이벤트를 도입하며, 평가 의미와 메모리 모델의 이벤트 의미를 연결하는 인터페이스 역할을 한다. 이벤트들은 candidate execution을 구성하며, 메모리 모델이 필터로 작동한다. 전체 의미는 메모리 모델를 참조할 것.

Shared Data Block 이벤트Record로 모델링되며, 메모리 모델에 정의되어 있다.

Data Block 값을 다루기 위해 이 명세에서는 다음 추상 연산들이 사용된다:

6.2.9.1 CreateByteDataBlock ( size )

추상 연산 CreateByteDataBlock은 size (음이 아닌 정수)를 인수로 받아, 특정 값을 포함하는 정상 완료 Data Block 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. size > 253 - 1이면 RangeError 예외를 throw한다.
  2. dbsize 바이트로 구성된 새로운 Data Block 값으로 한다. 만약 그런 Data Block의 생성을 할 수 없는 경우 RangeError 예외를 throw한다.
  3. db의 모든 바이트를 0으로 설정한다.
  4. db를 반환한다.

6.2.9.2 CreateSharedByteDataBlock ( size )

추상 연산 CreateSharedByteDataBlock은 size (음이 아닌 정수) 를 인수로 받아, 특정 값을 포함하는 정상 완료 Shared Data Block 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. dbsize 바이트로 구성된 새로운 Shared Data Block 값으로 한다. 그런 Shared Data Block의 생성을 할 수 없는 경우 RangeError 예외를 throw한다.
  2. execution주변 agentAgent Record[[CandidateExecution]] 필드로 한다.
  3. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record로 한다.
  4. zero를 « 0 »으로 한다.
  5. db의 각 인덱스 i에 대해, 다음을 수행한다:
    1. WriteSharedMemory { [[Order]]: init, [[NoTear]]: true, [[Block]]: db, [[ByteIndex]]: i, [[ElementSize]]: 1, [[Payload]]: zero }를 eventsRecord.[[EventList]]에 추가한다.
  6. db를 반환한다.

6.2.9.3 CopyDataBlockBytes ( toBlock, toIndex, fromBlock, fromIndex, count )

추상 연산 CopyDataBlockBytes는 인수 toBlock ( Data Block 또는 Shared Data Block ), toIndex (음이 아닌 정수), fromBlock ( Data Block 또는 Shared Data Block ), fromIndex (음이 아닌 정수), count (음이 아닌 정수)를 받아 unused를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: fromBlocktoBlock은 서로 다른 값이어야 한다.
  2. fromSizefromBlock의 바이트 수로 한다.
  3. Assert: fromIndex + countfromSize 여야 한다.
  4. toSizetoBlock의 바이트 수로 한다.
  5. Assert: toIndex + counttoSize 여야 한다.
  6. count > 0인 동안 반복한다:
    1. fromBlockShared Data Block이면, 다음을 수행한다:
      1. execution주변 agentAgent Record[[CandidateExecution]] 필드로 한다.
      2. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record로 한다.
      3. bytesList로, 유일한 요소는 비결정적으로 선택된 byte value로 한다.
      4. 참고: 구현에서는 bytes가 하드웨어의 비원자적 읽기 명령의 결과일 수 있다. 이 비결정성은 메모리 모델의 의미 처방으로, 약한 일관성을 가진 하드웨어의 관찰 가능한 동작을 설명한다.
      5. readEventReadSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: fromBlock, [[ByteIndex]]: fromIndex, [[ElementSize]]: 1 }로 한다.
      6. readEventeventsRecord.[[EventList]]에 추가한다.
      7. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: bytes }를 execution.[[ChosenValues]]에 추가한다.
      8. toBlockShared Data Block이면, 다음을 수행한다:
        1. WriteSharedMemory { [[Order]]: unordered, [[NoTear]]: true, [[Block]]: toBlock, [[ByteIndex]]: toIndex, [[ElementSize]]: 1, [[Payload]]: bytes } 를 eventsRecord.[[EventList]]에 추가한다.
      9. 그 외의 경우,
        1. toBlock[toIndex]에 bytes[0]을 설정한다.
    2. 그 외의 경우,
      1. Assert: toBlockShared Data Block이 아니어야 한다.
      2. toBlock[toIndex]에 fromBlock[fromIndex]를 설정한다.
    3. toIndextoIndex + 1로 한다.
    4. fromIndexfromIndex + 1로 한다.
    5. countcount - 1로 한다.
  7. unused를 반환한다.

6.2.10 PrivateElement 명세 타입

PrivateElement 타입은 private 클래스 필드, 메서드, 접근자의 명세에 사용되는 Record이다. Property Descriptor는 private 요소에 사용되지 않지만, private 필드는 비구성, 비열거, 쓰기 가능한 데이터 프로퍼티와 유사하게 동작하고, private 메서드는 비구성, 비열거, 쓰기 불가능한 데이터 프로퍼티와 유사하며, private 접근자는 비구성, 비열거 접근자 프로퍼티와 유사하게 동작한다.

PrivateElement 타입의 값은 Record 값이며, 그 필드는 표 9에 정의되어 있다. 이러한 값은 PrivateElements라 한다.

표 9: PrivateElement 필드
필드 이름 해당 필드가 존재하는 [[Kind]] 필드의 값 의미
[[Key]] 모두 Private Name 필드, 메서드, 접근자의 이름.
[[Kind]] 모두 field, method, 또는 accessor 요소의 종류.
[[Value]] fieldmethod ECMAScript 언어 값 필드의 값.
[[Get]] accessor 함수 객체 또는 undefined private 접근자의 getter.
[[Set]] accessor 함수 객체 또는 undefined private 접근자의 setter.

6.2.11 ClassFieldDefinition Record 명세 타입

ClassFieldDefinition 타입은 클래스 필드 명세에 사용되는 Record이다.

ClassFieldDefinition 타입의 값은 Record 값이며, 그 필드는 표 10에 정의되어 있다. 이러한 값은 ClassFieldDefinition Record라 한다.

표 10: ClassFieldDefinition Record 필드
필드 이름 의미
[[Name]] Private Name, 문자열, 또는 심볼 필드의 이름.
[[Initializer]] ECMAScript 함수 객체 또는 empty 해당하는 경우, 필드의 이니셜라이저.

6.2.12 Private Name

Private Name 명세 타입은 전역적으로 고유한 값(다른 Private Name과 구분되는 값, 비록 외견상 구별이 불가능하더라도)으로, private 클래스 요소(필드, 메서드, 접근자)의 키를 나타내는 데 사용된다. 각 Private Name은 불변의 [[Description]]을 가지며, 이는 문자열 값이다. Private Name은 PrivateFieldAdd 또는 PrivateMethodOrAccessorAdd로 어떤 ECMAScript 객체에도 설치할 수 있으며, PrivateGetPrivateSet을 사용해 읽거나 쓸 수 있다.

6.2.13 ClassStaticBlockDefinition 레코드 명세 타입

ClassStaticBlockDefinition Record는 클래스 정적 초기화 블록의 실행 가능한 코드를 캡슐화하는 데 사용되는 Record 값이다.

ClassStaticBlockDefinition Record는 표 11에 나열된 필드를 가진다.

표 11: ClassStaticBlockDefinition Record 필드
필드 이름 의미
[[BodyFunction]] ECMAScript 함수 객체 클래스의 정적 초기화 시 호출되는 함수 객체

7 추상 연산

이 연산들은 ECMAScript 언어의 일부가 아니며, 오직 ECMAScript 언어 의미의 명세를 돕기 위해 여기에 정의되어 있다. 다른, 더 특화된 추상 연산들은 이 명세 전반에 걸쳐 정의되어 있다.

7.1 타입 변환

ECMAScript 언어는 필요에 따라 암시적으로 자동 타입 변환을 수행한다. 특정 구문의 의미를 명확히 하기 위해 일련의 변환 추상 연산을 정의하는 것이 유용하다. 변환 추상 연산들은 다형적이며, 어떤 ECMAScript 언어 타입의 값도 인수로 받을 수 있다. 하지만 다른 명세 타입은 이 연산들과 함께 사용되지 않는다.

BigInt 타입은 ECMAScript 언어에서 암시적 변환을 가지지 않는다. 프로그래머는 다른 타입의 값을 변환하려면 BigInt를 명시적으로 호출해야 한다.

7.1.1 ToPrimitive ( input [ , preferredType ] )

추상 연산 ToPrimitive는 인수 input (ECMAScript 언어 값)과 선택적 인수 preferredType (string 또는 number)을 받아, 특정 값을 포함하는 정상 완료 ECMAScript 언어 값 또는 throw 완료를 반환한다. 이 연산은 input 인수를 Object 타입이 아닌 값으로 변환한다. 만약 객체가 둘 이상의 원시 타입으로 변환 가능하다면, 선택적 힌트 preferredType을 사용해 그 타입을 우선시할 수 있다. 호출 시 다음 단계를 수행한다:

  1. input객체이면, 다음을 수행한다:
    1. exoticToPrim를 ? GetMethod(input, %Symbol.toPrimitive%)로 한다.
    2. exoticToPrimundefined가 아니면, 다음을 수행한다:
      1. preferredType이 없으면, 다음을 수행한다:
        1. hint"default"로 한다.
      2. 그 외 preferredTypestring이면, 다음을 수행한다:
        1. hint"string"로 한다.
      3. 그 외의 경우,
        1. Assert: preferredTypenumber임을 보장한다.
        2. hint"number"로 한다.
      4. result를 ? Call(exoticToPrim, input, « hint »)로 한다.
      5. result객체가 아니면, result를 반환한다.
      6. TypeError 예외를 throw한다.
    3. preferredType이 없으면 preferredTypenumber로 한다.
    4. OrdinaryToPrimitive(input, preferredType)를 반환한다.
  2. input을 반환한다.
참고

ToPrimitive가 힌트 없이 호출될 때 기본적으로 number 힌트로 동작한다. 그러나 객체는 %Symbol.toPrimitive% 메서드를 정의함으로써 이 동작을 오버라이드할 수 있다. 이 명세에서 정의된 객체 중 Date( 21.4.4.45 참고 )와 Symbol 객체( 20.4.3.5 참고 )만이 기본 ToPrimitive 동작을 오버라이드한다. Date는 힌트가 없을 때 string으로 동작한다.

7.1.1.1 OrdinaryToPrimitive ( O, hint )

추상 연산 OrdinaryToPrimitive는 인수 O(객체)와 hint(string 또는 number)를 받아, 특정 값을 포함하는 정상 완료 ECMAScript 언어 값 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. hintstring이면, 다음을 수행한다:
    1. methodNames를 « "toString", "valueOf" »로 한다.
  2. 그 외의 경우,
    1. methodNames를 « "valueOf", "toString" »로 한다.
  3. methodNames의 각 요소 name에 대해, 다음을 수행한다:
    1. method를 ? Get(O, name)로 한다.
    2. IsCallable(method) 가 true이면, 다음을 수행한다:
      1. result를 ? Call(method, O)로 한다.
      2. result객체가 아니면, result를 반환한다.
  4. TypeError 예외를 throw한다.

7.1.2 ToBoolean ( argument )

추상 연산 ToBoolean은 인수 argument (ECMAScript 언어 값)를 받아 Boolean을 반환한다. 이 연산은 argument를 Boolean 타입 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. argumentBoolean이면, argument를 반환한다.
  2. argumentundefined, null, +0𝔽, -0𝔽, NaN, 0, 또는 빈 문자열 중 하나이면 false를 반환한다.
  3. 참고: 이 단계는 B.3.6.1 절에서 대체된다.
  4. true를 반환한다.

7.1.3 ToNumeric ( value )

추상 연산 ToNumeric은 인수 value (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 Number 또는 BigInt, 또는 throw 완료를 반환한다. 이 연산은 value를 Number 또는 BigInt로 변환해 반환한다. 호출 시 다음 단계를 수행한다:

  1. primValue를 ? ToPrimitive(value, number)로 한다.
  2. primValueBigInt이면, primValue를 반환한다.
  3. ToNumber(primValue)를 반환한다.

7.1.4 ToNumber ( argument )

추상 연산 ToNumber는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 Number 또는 throw 완료를 반환한다. 이 연산은 argument를 Number 타입 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. argumentNumber이면, argument를 반환한다.
  2. argument가 Symbol 또는 BigInt이면, TypeError 예외를 throw한다.
  3. argumentundefined이면 NaN을 반환한다.
  4. argumentnull 또는 false이면 +0𝔽을 반환한다.
  5. argumenttrue이면 1𝔽을 반환한다.
  6. argument문자열이면, StringToNumber(argument)를 반환한다.
  7. Assert: argument객체임을 보장한다.
  8. primValue를 ? ToPrimitive(argument, number)로 한다.
  9. Assert: primValue객체가 아님을 보장한다.
  10. ToNumber(primValue)를 반환한다.

7.1.4.1 문자열 타입에 적용된 ToNumber

추상 연산 StringToNumber는 다음 문법을 사용해 문자열 값을 Number 값으로 변환하는 방법을 명세한다.

구문

StringNumericLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpaceopt StrWhiteSpaceChar ::: WhiteSpace LineTerminator StrNumericLiteral ::: StrDecimalLiteral NonDecimalIntegerLiteral[~Sep] StrDecimalLiteral ::: StrUnsignedDecimalLiteral + StrUnsignedDecimalLiteral - StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral ::: Infinity DecimalDigits[~Sep] . DecimalDigits[~Sep]opt ExponentPart[~Sep]opt . DecimalDigits[~Sep] ExponentPart[~Sep]opt DecimalDigits[~Sep] ExponentPart[~Sep]opt

위에 명시적으로 정의되지 않은 모든 문법 기호는 숫자 리터럴에 대한 어휘 문법(12.9.3)에서 사용된 정의를 따른다.

참고

StringNumericLiteralNumericLiteral의 구문에는 몇 가지 차이가 있다는 점에 유의해야 한다:

7.1.4.1.1 StringToNumber ( str )

추상 연산 StringToNumber는 인수 str(문자열)을 받아 Number를 반환한다. 호출 시 다음 단계를 수행한다:

  1. literalParseText(str, StringNumericLiteral)로 한다.
  2. literal오류의 리스트이면 NaN을 반환한다.
  3. literalStringNumericValue를 반환한다.

7.1.4.1.2 런타임 의미: StringNumericValue

구문 지시 연산 StringNumericValue는 인수를 받지 않고 Number를 반환한다.

참고

StringNumericLiteral을 Number 값으로 변환하는 과정은 전체적으로 NumericValueNumericLiteral에 대해 결정되는 과정( 12.9.3 참고 )과 유사하지만, 세부 사항은 약간 다르다.

다음 생성 규칙별로 조각(piecewise) 정의된다:

StringNumericLiteral ::: StrWhiteSpaceopt
  1. +0𝔽을 반환한다.
StringNumericLiteral ::: StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
  1. StrNumericLiteralStringNumericValue를 반환한다.
StrNumericLiteral ::: NonDecimalIntegerLiteral
  1. 𝔽(MV of NonDecimalIntegerLiteral)를 반환한다.
StrDecimalLiteral ::: - StrUnsignedDecimalLiteral
  1. aStrUnsignedDecimalLiteralStringNumericValue로 한다.
  2. a+0𝔽이면 -0𝔽을 반환한다.
  3. -a를 반환한다.
StrUnsignedDecimalLiteral ::: Infinity
  1. +∞𝔽을 반환한다.
StrUnsignedDecimalLiteral ::: DecimalDigits . DecimalDigitsopt ExponentPartopt
  1. 첫 번째 DecimalDigits의 MV를 a로 한다.
  2. 두 번째 DecimalDigits가 존재하면, 다음을 수행한다:
    1. 두 번째 DecimalDigits의 MV를 b로 한다.
    2. 두 번째 DecimalDigits의 코드 포인트 개수를 n으로 한다.
  3. 그 외의 경우,
    1. b를 0으로 한다.
    2. n을 0으로 한다.
  4. ExponentPart가 존재하면, eExponentPart의 MV로 한다. 그렇지 않으면 e를 0으로 한다.
  5. RoundMVResult((a + (b × 10-n)) × 10e)를 반환한다.
StrUnsignedDecimalLiteral ::: . DecimalDigits ExponentPartopt
  1. DecimalDigits의 MV를 b로 한다.
  2. ExponentPart가 존재하면, eExponentPart의 MV로 한다. 그렇지 않으면 e를 0으로 한다.
  3. DecimalDigits의 코드 포인트 개수를 n으로 한다.
  4. RoundMVResult(b × 10e - n)를 반환한다.
StrUnsignedDecimalLiteral ::: DecimalDigits ExponentPartopt
  1. DecimalDigits의 MV를 a로 한다.
  2. ExponentPart가 존재하면, eExponentPart의 MV로 한다. 그렇지 않으면 e를 0으로 한다.
  3. RoundMVResult(a × 10e)를 반환한다.

7.1.4.1.3 RoundMVResult ( n )

추상 연산 RoundMVResult는 인수 n(수학적 값)을 받아 Number를 반환한다. 이 연산은 n구현 정의 방식으로 Number로 변환한다. 이 추상 연산에서, 숫자는 0이 아니거나 왼쪽에 0이 아닌 숫자가 있고 오른쪽에도 0이 아닌 숫자가 있을 때 유효 숫자(significant)로 간주한다. 이 추상 연산에서, "수학적 값이 나타내는" 어떤 수학적 값의 표현은 "수학적 값의 10진수 표현"의 역이다. 호출 시 다음 단계를 수행한다:

  1. n의 10진수 표현이 20자리 이하의 유효 숫자를 가지면 𝔽(n)를 반환한다.
  2. option1n의 10진수 표현에서 20번째 이후의 유효 숫자를 0으로 바꾼 결과가 나타내는 수학적 값로 한다.
  3. option2n의 10진수 표현에서 20번째 이후의 유효 숫자를 0으로 바꾸고, 그 20번째 자릿수를(필요하다면 올림하면서) 1 증가시킨 결과가 나타내는 수학적 값로 한다.
  4. chosen구현 정의 방식으로 option1 또는 option2 중에서 선택한다.
  5. 𝔽(chosen)를 반환한다.

7.1.5 ToIntegerOrInfinity ( argument )

추상 연산 ToIntegerOrInfinity는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 정수, +∞, 또는 -∞, 또는 throw 완료를 반환한다. 이 연산은 argument를 Number 값의 소수 부분을 잘라낸 정수로 변환하거나, 해당 Number 값이 무한대일 경우 +∞ 또는 -∞로 변환한다. 호출 시 다음 단계를 수행한다:

  1. number를 ? ToNumber(argument)로 한다.
  2. numberNaN, +0𝔽, 또는 -0𝔽 중 하나이면 0을 반환한다.
  3. number+∞𝔽이면 +∞를 반환한다.
  4. number-∞𝔽이면 -∞를 반환한다.
  5. truncate((number))를 반환한다.
참고
𝔽(ToIntegerOrInfinity(x))는 어떤 x에 대해서도 -0𝔽을 반환하지 않는다. 소수 부분의 절단은 x수학적 값으로 변환한 후 수행된다.

7.1.6 ToInt32 ( argument )

추상 연산 ToInt32는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 정수 Number 또는 throw 완료를 반환한다. 이 연산은 argument정수 Number 232개 중 [-231, 231-1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. number를 ? ToNumber(argument)로 한다.
  2. number유한이 아니거나 number+0𝔽 또는 -0𝔽이면 +0𝔽을 반환한다.
  3. inttruncate((number))로 한다.
  4. int32bitint modulo 232로 한다.
  5. int32bit ≥ 231이면 𝔽(int32bit - 232)를, 아니면 𝔽(int32bit)를 반환한다.
참고

위 ToInt32 정의에 따라:

  • ToInt32 추상 연산은 멱등적이다: 그것이 생성한 결과에 다시 적용하면 값이 바뀌지 않는다.
  • ToInt32(ToUint32(x))는 모든 x에 대해 ToInt32(x)와 같다. (+∞𝔽-∞𝔽+0𝔽으로 매핑되는 것은 이 속성을 보존하기 위함이다.)
  • ToInt32는 -0𝔽+0𝔽으로 매핑한다.

7.1.7 ToUint32 ( argument )

추상 연산 ToUint32는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 정수 Number 또는 throw 완료를 반환한다. 이 연산은 argument정수 Number 232개 중 [+0, 232-1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. number를 ? ToNumber(argument)로 한다.
  2. number유한이 아니거나 number+0𝔽 또는 -0𝔽이면 +0𝔽을 반환한다.
  3. inttruncate((number))로 한다.
  4. int32bitint modulo 232로 한다.
  5. 𝔽(int32bit)를 반환한다.
참고

위 ToUint32 정의에 따라:

  • 5 단계가 ToUint32와 ToInt32의 유일한 차이점이다.
  • ToUint32 추상 연산은 멱등적이다: 그것이 생성한 결과에 다시 적용하면 값이 바뀌지 않는다.
  • ToUint32(ToInt32(x))는 모든 x에 대해 ToUint32(x)와 같다. (+∞𝔽-∞𝔽+0𝔽으로 매핑되는 것은 이 속성을 보존하기 위함이다.)
  • ToUint32는 -0𝔽+0𝔽으로 매핑한다.

7.1.8 ToInt16 ( argument )

추상 연산 ToInt16은 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 정수 Number 또는 throw 완료를 반환한다. 이 연산은 argument정수 Number 216개 중 [-215, 215-1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. number를 ? ToNumber(argument)로 한다.
  2. number유한이 아니거나 number+0𝔽 또는 -0𝔽이면 +0𝔽을 반환한다.
  3. inttruncate((number))로 한다.
  4. int16bitint modulo 216로 한다.
  5. int16bit ≥ 215이면 𝔽(int16bit - 216)를, 아니면 𝔽(int16bit)를 반환한다.

7.1.9 ToUint16 ( argument )

추상 연산 ToUint16은 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 정수 Number 또는 throw 완료를 반환한다. 이 연산은 argument정수 Number 216개 중 [+0, 216-1] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. number를 ? ToNumber(argument)로 한다.
  2. number유한이 아니거나 number+0𝔽 또는 -0𝔽이면 +0𝔽을 반환한다.
  3. inttruncate((number))로 한다.
  4. int16bitint modulo 216로 한다.
  5. 𝔽(int16bit)를 반환한다.
참고

위 ToUint16 정의에 따라:

  • 4 단계의 216 대입만이 ToUint32와 ToUint16의 유일한 차이점이다.
  • ToUint16은 -0𝔽+0𝔽으로 매핑한다.

7.1.10 ToInt8 ( argument )

추상 연산 ToInt8은 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 정수 Number 또는 throw 완료를 반환한다. 이 연산은 argument정수 Number 28개 중 [-128, 127] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. number를 ? ToNumber(argument)로 한다.
  2. number유한이 아니거나 number+0𝔽 또는 -0𝔽이면 +0𝔽을 반환한다.
  3. inttruncate((number))로 한다.
  4. int8bitint modulo 28로 한다.
  5. int8bit ≥ 27이면 𝔽(int8bit - 28)를, 아니면 𝔽(int8bit)를 반환한다.

7.1.11 ToUint8 ( argument )

추상 연산 ToUint8은 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 정수 Number 또는 throw 완료를 반환한다. 이 연산은 argument정수 Number 28개 중 [+0, 255] 구간 내의 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. number를 ? ToNumber(argument)로 한다.
  2. number유한이 아니거나 number+0𝔽 또는 -0𝔽이면 +0𝔽을 반환한다.
  3. inttruncate((number))로 한다.
  4. int8bitint modulo 28로 한다.
  5. 𝔽(int8bit)를 반환한다.

7.1.12 ToUint8Clamp ( argument )

추상 연산 ToUint8Clamp는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 정수 Number 또는 throw 완료를 반환한다. 이 연산은 argument를 28개의 정수 Number 값 중 [+0, 255] 구간 내로 클램프하고 반올림한다. 호출 시 다음 단계를 수행한다:

  1. number를 ? ToNumber(argument)로 한다.
  2. numberNaN이면 +0𝔽을 반환한다.
  3. mvnumber의 확장 수학적 값으로 한다.
  4. clampedmv를 0과 255 사이로 클램프한 결과로 한다.
  5. ffloor(clamped)로 한다.
  6. clamped < f + 0.5이면 𝔽(f)를 반환한다.
  7. clamped > f + 0.5이면 𝔽(f + 1)을 반환한다.
  8. f가 짝수면 𝔽(f)를, 아니면 𝔽(f + 1)을 반환한다.
참고

다른 대부분의 ECMAScript 정수 변환 연산과 달리, ToUint8Clamp는 소수 값을 절단(truncate)하지 않고 반올림(round)한다. 또한 "홀수 올림(round half up)"이 아닌 "짝수 쪽으로 반올림(round half to even)" 타이브레이킹을 사용한다. 이는 Math.round와 다르다.

7.1.13 ToBigInt ( argument )

추상 연산 ToBigInt는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 BigInt 또는 throw 완료를 반환한다. 이 연산은 argument를 BigInt 값으로 변환하거나, Number로의 암시적 변환이 필요한 경우 예외를 던진다. 호출 시 다음 단계를 수행한다:

  1. prim을 ? ToPrimitive(argument, number)로 한다.
  2. prim표 12에서 어떤 값에 해당하는지에 따라 결과를 반환한다.
표 12: BigInt 변환
인수 타입 결과
Undefined TypeError 예외를 throw한다.
Null TypeError 예외를 throw한다.
Boolean primtrue1n, false0n을 반환한다.
BigInt prim을 반환한다.
Number TypeError 예외를 throw한다.
String
  1. nStringToBigInt(prim)로 한다.
  2. nundefinedSyntaxError 예외를 throw한다.
  3. n을 반환한다.
Symbol TypeError 예외를 throw한다.

7.1.14 StringToBigInt ( str )

추상 연산 StringToBigInt는 인수 str (문자열)을 받아 BigInt 또는 undefined를 반환한다. 호출 시 다음 단계를 수행한다:

  1. literalParseText(str, StringIntegerLiteral)로 한다.
  2. literal오류의 리스트undefined를 반환한다.
  3. mvliteral의 MV로 한다.
  4. Assert: mv정수여야 한다.
  5. (mv)를 반환한다.

7.1.14.1 StringIntegerLiteral 문법

StringToBigInt는 다음 문법을 사용한다.

구문

StringIntegerLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrIntegerLiteral StrWhiteSpaceopt StrIntegerLiteral ::: SignedInteger[~Sep] NonDecimalIntegerLiteral[~Sep]

7.1.14.2 런타임 의미: MV

7.1.15 ToBigInt64 ( argument )

추상 연산 ToBigInt64는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 BigInt 또는 throw 완료를 반환한다. 이 연산은 argument[-263, 263-1] 구간의 264 BigInt 값 중 하나로 변환한다. 호출 시 다음 단계를 수행한다:

  1. n을 ? ToBigInt(argument)로 한다.
  2. int64bit(n) modulo 264로 한다.
  3. int64bit ≥ 263이면 (int64bit - 264)를, 아니면 (int64bit)를 반환한다.

7.1.16 ToBigUint64 ( argument )

추상 연산 ToBigUint64는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 BigInt 또는 throw 완료를 반환한다. 이 연산은 argument[0, 264-1] 구간의 264 BigInt 값 중 하나로 변환한다. 호출 시 다음 단계를 수행한다:

  1. n을 ? ToBigInt(argument)로 한다.
  2. int64bit(n) modulo 264로 한다.
  3. (int64bit)를 반환한다.

7.1.17 ToString ( argument )

추상 연산 ToString은 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 문자열 또는 throw 완료를 반환한다. 이 연산은 argument를 String 타입 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. argument문자열이면 argument를 반환한다.
  2. argument심볼이면 TypeError 예외를 throw한다.
  3. argumentundefined이면 "undefined"를 반환한다.
  4. argumentnull이면 "null"를 반환한다.
  5. argumenttrue이면 "true"를 반환한다.
  6. argumentfalse이면 "false"를 반환한다.
  7. argumentNumber이면 Number::toString(argument, 10)을 반환한다.
  8. argumentBigInt이면 BigInt::toString(argument, 10)을 반환한다.
  9. Assert: argument객체임을 보장한다.
  10. primValue를 ? ToPrimitive(argument, string)로 한다.
  11. Assert: primValue객체가 아님을 보장한다.
  12. ToString(primValue)를 반환한다.

7.1.18 ToObject ( argument )

추상 연산 ToObject는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 객체 또는 throw 완료를 반환한다. 이 연산은 argument표 13에 따라 객체 타입 값으로 변환한다:

표 13: ToObject 변환
인수 타입 결과
Undefined TypeError 예외를 throw한다.
Null TypeError 예외를 throw한다.
Boolean [[BooleanData]] 내부 슬롯이 argument로 설정된 새로운 Boolean 객체를 반환한다. Boolean 객체에 대한 설명은 20.3 참고.
Number [[NumberData]] 내부 슬롯이 argument로 설정된 새로운 Number 객체를 반환한다. Number 객체에 대한 설명은 21.1 참고.
String [[StringData]] 내부 슬롯이 argument로 설정된 새로운 String 객체를 반환한다. String 객체에 대한 설명은 22.1 참고.
Symbol [[SymbolData]] 내부 슬롯이 argument로 설정된 새로운 Symbol 객체를 반환한다. Symbol 객체에 대한 설명은 20.4 참고.
BigInt [[BigIntData]] 내부 슬롯이 argument로 설정된 새로운 BigInt 객체를 반환한다. BigInt 객체에 대한 설명은 21.2 참고.
Object argument를 반환한다.

7.1.19 ToPropertyKey ( argument )

추상 연산 ToPropertyKey는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 프로퍼티 키 또는 throw 완료를 반환한다. 이 연산은 argument프로퍼티 키로 사용할 수 있는 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. key를 ? ToPrimitive(argument, string)로 한다.
  2. key심볼이면, 다음을 수행한다:
    1. key를 반환한다.
  3. ToString(key)를 반환한다.

7.1.20 ToLength ( argument )

추상 연산 ToLength는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 음이 아닌 정수 Number 또는 throw 완료를 반환한다. 이 연산은 argument를 배열과 유사한 객체의 길이로 사용하기에 적합한 음이 아닌 정수 Number로 클램프 및 절단한다. 호출 시 다음 단계를 수행한다:

  1. len을 ? ToIntegerOrInfinity(argument)로 한다.
  2. len ≤ 0이면 +0𝔽을 반환한다.
  3. 𝔽(min(len, 253 - 1))를 반환한다.

7.1.21 CanonicalNumericIndexString ( argument )

추상 연산 CanonicalNumericIndexString는 인수 argument(문자열)를 받아 Number 또는 undefined를 반환한다. argument"-0"이거나 어떤 Number 값 n에 대해 ToString(n)과 정확히 일치하면, 해당 Number 값을 반환한다. 그렇지 않으면 undefined를 반환한다. 호출 시 다음 단계를 수행한다:

  1. argument"-0"이면 -0𝔽을 반환한다.
  2. n을 ! ToNumber(argument)로 한다.
  3. ToString(n)이 argument와 같으면 n을 반환한다.
  4. undefined를 반환한다.

표준 숫자 문자열(canonical numeric string)은 CanonicalNumericIndexString 추상 연산이 undefined를 반환하지 않는 모든 문자열이다.

7.1.22 ToIndex ( value )

추상 연산 ToIndex는 인수 value (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 음이 아닌 정수 또는 throw 완료를 반환한다. 이 연산은 value정수로 변환하고, 그 값이 음이 아니면서 정수 인덱스에 해당하면 그 정수를 반환한다. 그렇지 않으면 예외를 던진다. 호출 시 다음 단계를 수행한다:

  1. integer를 ? ToIntegerOrInfinity(value)로 한다.
  2. integer[0, 253 - 1] 구간에 없으면 RangeError 예외를 throw한다.
  3. integer를 반환한다.

7.2 테스트 및 비교 연산

7.2.1 RequireObjectCoercible ( argument )

추상 연산 RequireObjectCoercible는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 ECMAScript 언어 값 또는 throw 완료를 반환한다. 이 연산은 argumentToObject를 통해 객체로 변환할 수 없을 경우 오류를 던진다. 표 14에 정의되어 있다:

표 14: RequireObjectCoercible 결과
인수 타입 결과
Undefined TypeError 예외를 throw한다.
Null TypeError 예외를 throw한다.
Boolean argument를 반환한다.
Number argument를 반환한다.
String argument를 반환한다.
Symbol argument를 반환한다.
BigInt argument를 반환한다.
Object argument를 반환한다.

7.2.2 IsArray ( argument )

추상 연산 IsArray는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 Boolean 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. argument객체가 아니면 false를 반환한다.
  2. argumentArray 이그조틱 객체이면 true를 반환한다.
  3. argumentProxy 이그조틱 객체이면, 다음을 수행한다:
    1. ValidateNonRevokedProxy(argument)를 수행한다.
    2. proxyTargetargument.[[ProxyTarget]]로 한다.
    3. IsArray(proxyTarget)를 반환한다.
  4. false를 반환한다.

7.2.3 IsCallable ( argument )

추상 연산 IsCallable은 인수 argument (ECMAScript 언어 값)를 받아 Boolean을 반환한다. 이 연산은 argument[[Call]] 내부 메서드를 가진 호출 가능한 함수인지 판단한다. 호출 시 다음 단계를 수행한다:

  1. argument객체가 아니면 false를 반환한다.
  2. argument[[Call]] 내부 메서드를 가지고 있으면 true를 반환한다.
  3. false를 반환한다.

7.2.4 IsConstructor ( argument )

추상 연산 IsConstructor는 인수 argument (ECMAScript 언어 값)를 받아 Boolean을 반환한다. 이 연산은 argument함수 객체이면서 [[Construct]] 내부 메서드를 갖는지 판단한다. 호출 시 다음 단계를 수행한다:

  1. argument객체가 아니면 false를 반환한다.
  2. argument[[Construct]] 내부 메서드를 가지고 있으면 true를 반환한다.
  3. false를 반환한다.

7.2.5 IsExtensible ( O )

추상 연산 IsExtensible은 인수 O(객체)를 받아, 특정 값을 포함하는 정상 완료 Boolean 또는 throw 완료를 반환한다. 이 연산은 O에 추가 프로퍼티를 추가할 수 있는지 판단하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. O.[[IsExtensible]]()를 반환한다.

7.2.6 IsRegExp ( argument )

추상 연산 IsRegExp는 인수 argument (ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 Boolean 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. argument객체가 아니면 false를 반환한다.
  2. matcher를 ? Get(argument, %Symbol.match%)로 한다.
  3. matcherundefined가 아니면, ToBoolean(matcher)를 반환한다.
  4. argument[[RegExpMatcher]] 내부 슬롯을 가지고 있으면 true를 반환한다.
  5. false를 반환한다.

7.2.7 정적 의미: IsStringWellFormedUnicode ( string )

추상 연산 IsStringWellFormedUnicode는 인수 string(문자열)을 받아 Boolean을 반환한다. string6.1.4에서 설명된 대로 UTF-16 인코딩 코드 포인트의 시퀀스로 해석하고, 이것이 well formed한 UTF-16 시퀀스인지 판단한다. 호출 시 다음 단계를 수행한다:

  1. lenstring의 길이로 한다.
  2. k를 0으로 한다.
  3. k < len인 동안 반복한다:
    1. cpCodePointAt(string, k)로 한다.
    2. cp.[[IsUnpairedSurrogate]]true이면 false를 반환한다.
    3. kk + cp.[[CodeUnitCount]]로 설정한다.
  4. true를 반환한다.

7.2.8 SameType ( x, y )

추상 연산 SameType은 인수 x(ECMAScript 언어 값)와 y(ECMAScript 언어 값)를 받아 Boolean을 반환한다. 두 인수가 동일한 타입인지 판별한다. 호출 시 다음 단계를 수행한다:

  1. xundefined이고 yundefined이면 true를 반환한다.
  2. xnull이고 ynull이면 true를 반환한다.
  3. xBoolean이고 yBoolean이면 true를 반환한다.
  4. xNumber이고 yNumber이면 true를 반환한다.
  5. xBigInt이고 yBigInt이면 true를 반환한다.
  6. xSymbol이고 ySymbol이면 true를 반환한다.
  7. xString이고 yString이면 true를 반환한다.
  8. x객체이고 y객체이면 true를 반환한다.
  9. false를 반환한다.

7.2.9 SameValue ( x, y )

추상 연산 SameValue는 인수 x(ECMAScript 언어 값)와 y(ECMAScript 언어 값)를 받아 Boolean을 반환한다. 두 인수가 같은 값인지 판단한다. 호출 시 다음 단계를 수행한다:

  1. SameType(x, y)가 false이면 false를 반환한다.
  2. xNumber이면, 다음을 수행한다:
    1. Number::sameValue(x, y)를 반환한다.
  3. SameValueNonNumber(x, y)를 반환한다.
참고

이 알고리즘은 IsStrictlyEqual 알고리즘과는 모든 NaN 값을 동일하게 취급하고 +0𝔽-0𝔽을 구분한다는 점에서 다르다.

7.2.10 SameValueZero ( x, y )

추상 연산 SameValueZero는 인수 x(ECMAScript 언어 값)와 y(ECMAScript 언어 값)를 받아 Boolean을 반환한다. 두 인수가 같은 값인지 판단하되, +0𝔽-0𝔽의 차이를 무시한다. 호출 시 다음 단계를 수행한다:

  1. SameType(x, y)가 false이면 false를 반환한다.
  2. xNumber이면, 다음을 수행한다:
    1. Number::sameValueZero(x, y)를 반환한다.
  3. SameValueNonNumber(x, y)를 반환한다.
참고

SameValueZero는 SameValue와 다르게 +0𝔽-0𝔽을 동일하게 취급한다.

7.2.11 SameValueNonNumber ( x, y )

추상 연산 SameValueNonNumber는 인수 x(ECMAScript 언어 값, Number 제외)와 y(ECMAScript 언어 값, Number 제외)를 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: SameType(x, y)가 true임을 보장한다.
  2. xundefined 또는 null이면 true를 반환한다.
  3. xBigInt이면, 다음을 수행한다:
    1. BigInt::equal(x, y)를 반환한다.
  4. xString이면, 다음을 수행한다:
    1. xy가 길이가 같고 모든 위치의 코드 유닛이 같으면 true를, 그렇지 않으면 false를 반환한다.
  5. xBoolean이면, 다음을 수행한다:
    1. xy가 모두 true이거나 모두 false이면 true를, 그렇지 않으면 false를 반환한다.
  6. 참고: 다른 모든 ECMAScript 언어 값은 동일성(identity)으로 비교한다.
  7. xy와 동일하면 true를, 그렇지 않으면 false를 반환한다.
참고 1
설명 목적으로 일부 경우가 불필요하게 별도로 처리되어 있다.
참고 2
"xy와 동일하다"의 구체적인 의미는 5.2.7에 자세히 설명되어 있다.

7.2.12 IsLessThan ( x, y, LeftFirst )

추상 연산 IsLessThan은 인수 x(ECMAScript 언어 값), y(ECMAScript 언어 값), LeftFirst(Boolean)을 받아, 특정 값을 포함하는 정상 완료 Boolean 또는 undefined, 또는 throw 완료를 반환한다. 이 연산은 비교 x < y의 의미를 제공하며, true, false, undefined(피연산자 중 하나 이상이 NaN인 경우)을 반환한다. LeftFirst 플래그는 xy에 부수 효과가 있을 수 있을 때 연산의 순서를 제어하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. LeftFirsttrue이면, 다음을 수행한다:
    1. px를 ? ToPrimitive(x, number)로 한다.
    2. py를 ? ToPrimitive(y, number)로 한다.
  2. 그 외의 경우:
    1. 참고: 평가 순서를 유지하기 위해 평가 순서를 반대로 한다.
    2. py를 ? ToPrimitive(y, number)로 한다.
    3. px를 ? ToPrimitive(x, number)로 한다.
  3. px문자열이고 py문자열이면, 다음을 수행한다:
    1. lxpx의 길이로 한다.
    2. lypy의 길이로 한다.
    3. 0 ≤ i < min(lx, ly)인 모든 정수 i에 대해, 오름차순으로 다음을 수행한다:
      1. cxpx의 인덱스 i에 있는 코드 유닛의 숫자 값으로 한다.
      2. cypy의 인덱스 i에 있는 코드 유닛의 숫자 값으로 한다.
      3. cx < cy이면 true를 반환한다.
      4. cx > cy이면 false를 반환한다.
    4. lx < ly이면 true를, 아니면 false를 반환한다.
  4. 그 외의 경우:
    1. pxBigInt이고 py문자열이면, 다음을 수행한다:
      1. nyStringToBigInt(py)로 한다.
      2. nyundefined이면 undefined를 반환한다.
      3. BigInt::lessThan(px, ny)를 반환한다.
    2. px문자열이고 pyBigInt이면, 다음을 수행한다:
      1. nxStringToBigInt(px)로 한다.
      2. nxundefined이면 undefined를 반환한다.
      3. BigInt::lessThan(nx, py)를 반환한다.
    3. 참고: pxpy는 원시값이므로 평가 순서는 중요하지 않다.
    4. nx를 ? ToNumeric(px)로 한다.
    5. ny를 ? ToNumeric(py)로 한다.
    6. SameType(nx, ny)가 true이면, 다음을 수행한다:
      1. nxNumber이면, 다음을 수행한다:
        1. Number::lessThan(nx, ny)를 반환한다.
      2. 그 외의 경우:
        1. Assert: nxBigInt임을 보장한다.
        2. BigInt::lessThan(nx, ny)를 반환한다.
    7. Assert: nxBigInt이고 nyNumber이거나, nxNumber이고 nyBigInt임을 보장한다.
    8. nx 또는 nyNaN이면 undefined를 반환한다.
    9. nx-∞𝔽이거나 ny+∞𝔽이면 true를 반환한다.
    10. nx+∞𝔽이거나 ny-∞𝔽이면 false를 반환한다.
    11. (nx) < (ny)이면 true를, 아니면 false를 반환한다.
참고 1

3 단계는 1.c ( 13.15.3 )에서 논리합 대신 논리곱을 사용한다는 점에서 다르다.

참고 2

문자열의 비교는 UTF-16 코드 유닛의 시퀀스에 대한 단순한 사전식(lexicographic) 정렬을 사용한다. 유니코드 명세에 정의된 문자/문자열 동등성 및 정렬 순서의 더 복잡하고 의미론적인 정의는 사용하지 않는다. 따라서 유니코드 표준에서 정규적으로 동등하지만 정규화 형식이 다른 String 값은 같지 않다고 판정될 수 있다. 또한, 코드 유닛 기준 사전식 정렬은 서러게이트 쌍이 포함된 문자열의 코드 포인트 기준 정렬과 다를 수 있다.

7.2.13 IsLooselyEqual ( x, y )

추상 연산 IsLooselyEqual는 인수 x(ECMAScript 언어 값)와 y(ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 Boolean 또는 throw 완료를 반환한다. 이 연산은 == 연산자의 의미를 제공한다. 호출 시 다음 단계를 수행한다:

  1. SameType(x, y)가 true면, 다음을 수행한다:
    1. IsStrictlyEqual(x, y)를 반환한다.
  2. xnull이고 yundefined이면 true를 반환한다.
  3. xundefined이고 ynull이면 true를 반환한다.
  4. 참고: 이 단계는 B.3.6.2 절에서 대체된다.
  5. xNumber이고 yString이면, ! IsLooselyEqual(x, ! ToNumber(y))를 반환한다.
  6. xString이고 yNumber이면, ! IsLooselyEqual(! ToNumber(x), y)를 반환한다.
  7. xBigInt이고 yString이면, 다음을 수행한다:
    1. nStringToBigInt(y)로 한다.
    2. nundefined이면 false를 반환한다.
    3. IsLooselyEqual(x, n)을 반환한다.
  8. xString이고 yBigInt이면, ! IsLooselyEqual(y, x)를 반환한다.
  9. xBoolean이면, ! IsLooselyEqual(! ToNumber(x), y)를 반환한다.
  10. yBoolean이면, ! IsLooselyEqual(x, ! ToNumber(y))를 반환한다.
  11. x가 String, Number, BigInt, Symbol 중 하나이고 y객체이면, ! IsLooselyEqual(x, ? ToPrimitive(y))를 반환한다.
  12. x객체이고 y가 String, Number, BigInt, Symbol 중 하나이면, ! IsLooselyEqual(? ToPrimitive(x), y)를 반환한다.
  13. xBigInt이고 yNumber이거나, xNumber이고 yBigInt이면, 다음을 수행한다:
    1. x유한이 아니거나 y유한이 아니면 false를 반환한다.
    2. (x) = (y)이면 true를, 아니면 false를 반환한다.
  14. false를 반환한다.

7.2.14 IsStrictlyEqual ( x, y )

추상 연산 IsStrictlyEqual은 인수 x (ECMAScript 언어 값)와 y (ECMAScript 언어 값)를 받아 Boolean을 반환한다. 이 연산은 === 연산자의 의미를 제공한다. 호출 시 다음 단계를 수행한다:

  1. SameType(x, y)가 false이면 false를 반환한다.
  2. xNumber이면, 다음을 수행한다:
    1. Number::equal(x, y)를 반환한다.
  3. SameValueNonNumber(x, y)를 반환한다.
참고

이 알고리즘은 부호 있는 0과 NaN 처리에서 SameValue 알고리즘과 다르다.

7.3 객체에 대한 연산

7.3.1 MakeBasicObject ( internalSlotsList )

추상 연산 MakeBasicObject는 인수 internalSlotsList(내부 슬롯 이름의 List)를 받아 객체를 반환한다. 이는 일반 객체특수 객체를 포함하여 알고리즘적으로 생성되는 모든 ECMAScript 객체의 근원이다. 이는 모든 객체 생성에 사용되는 공통 단계를 분리하고 객체 생성을 중앙 집중화한다. 호출 시 다음 단계를 수행한다:

  1. internalSlotsListinternalSlotsList와 « [[PrivateElements]] »의 list-concatenation으로 설정한다.
  2. objinternalSlotsList의 각 이름에 대해 내부 슬롯을 가지는 새로 생성된 객체로 한다.
  3. 참고: 객체 내부 메서드 및 내부 슬롯에 설명된 바와 같이, 각 내부 슬롯의 초기 값은 별도로 명시되지 않는 한 undefined이다.
  4. obj.[[PrivateElements]]를 새로운 빈 List로 설정한다.
  5. obj의 필수 내부 메서드를 일반 객체10.1에 명시된 기본 정의로 설정한다.
  6. Assert: 호출자가 obj[[GetPrototypeOf]][[SetPrototypeOf]] 필수 내부 메서드를 모두 재정의하지 않는 경우, internalSlotsList[[Prototype]]을 포함한다.
  7. Assert: 호출자가 obj[[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]] 필수 내부 메서드를 모두 재정의하지 않는 경우, internalSlotsList[[Extensible]]을 포함한다.
  8. internalSlotsList[[Extensible]]가 포함되어 있으면 obj.[[Extensible]]true로 설정한다.
  9. obj를 반환한다.
참고

이 명세 내에서 특수 객체추상 연산 (ArrayCreate, BoundFunctionCreate 등)에서 먼저 MakeBasicObject를 호출해 기본 객체를 얻고, 그 후에 해당 객체의 일부 또는 전체 내부 메서드를 재정의함으로써 생성된다. 특수 객체 생성을 캡슐화하기 위해, 객체의 필수 내부 메서드는 이러한 연산 외부에서 변경되지 않는다.

7.3.2 Get ( O, P )

추상 연산 Get은 인수 O(객체), P(프로퍼티 키)를 받아, 특정 값을 포함하는 정상 완료 ECMAScript 언어 값 또는 throw 완료를 반환한다. 이 연산은 객체의 특정 프로퍼티 값을 조회할 때 사용된다. 호출 시 다음 단계를 수행한다:

  1. O.[[Get]](P, O)를 반환한다.

7.3.3 GetV ( V, P )

추상 연산 GetV는 인수 V(ECMAScript 언어 값), P(프로퍼티 키)를 받아, 특정 값을 포함하는 정상 완료 ECMAScript 언어 값 또는 throw 완료를 반환한다. 이 연산은 ECMAScript 언어 값의 특정 프로퍼티 값을 조회할 때 사용된다. 만약 값이 객체가 아니면, 해당 타입에 맞는 래퍼 객체를 사용해 프로퍼티 조회를 수행한다. 호출 시 다음 단계를 수행한다:

  1. O를 ? ToObject(V)로 한다.
  2. O.[[Get]](P, V)를 반환한다.

7.3.4 Set ( O, P, V, Throw )

추상 연산 Set은 인수 O(객체), P(프로퍼티 키), V(ECMAScript 언어 값), Throw(Boolean)을 받아, 특정 값을 포함하는 정상 완료 unused 또는 throw 완료를 반환한다. 이 연산은 객체의 특정 프로퍼티 값을 설정할 때 사용된다. V는 프로퍼티에 할당할 새 값이다. 호출 시 다음 단계를 수행한다:

  1. success를 ? O.[[Set]](P, V, O)로 한다.
  2. successfalse이고 Throwtrue이면 TypeError 예외를 throw한다.
  3. unused를 반환한다.

7.3.5 CreateDataProperty ( O, P, V )

추상 연산 CreateDataProperty는 인수 O(객체), P(프로퍼티 키), V(ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 Boolean 또는 throw 완료를 반환한다. 이 연산은 객체의 새로운 자기 프로퍼티를 생성하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. newDesc를 PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }로 한다.
  2. O.[[DefineOwnProperty]](P, newDesc)를 반환한다.
참고

이 추상 연산은 ECMAScript 언어의 할당 연산자로 생성된 프로퍼티와 동일한 기본 속성으로 프로퍼티를 생성한다. 일반적으로 프로퍼티는 이미 존재하지 않는다. 만약 존재하고 설정 불가이거나 O가 확장 가능하지 않다면, [[DefineOwnProperty]]false를 반환한다.

7.3.6 CreateDataPropertyOrThrow ( O, P, V )

추상 연산 CreateDataPropertyOrThrow는 인수 O(객체), P(프로퍼티 키), V(ECMAScript 언어 값)를 받아, 특정 값을 포함하는 정상 완료 unused 또는 throw 완료를 반환한다. 이 연산은 객체의 새로운 자기 프로퍼티를 생성하는 데 사용된다. 요청된 프로퍼티 갱신을 수행할 수 없으면 TypeError 예외를 던진다. 호출 시 다음 단계를 수행한다:

  1. success를 ? CreateDataProperty(O, P, V)로 한다.
  2. successfalse이면 TypeError 예외를 throw한다.
  3. unused를 반환한다.
참고

이 추상 연산은 ECMAScript 언어의 할당 연산자로 생성된 프로퍼티와 동일한 기본 속성으로 프로퍼티를 생성한다. 일반적으로 프로퍼티는 이미 존재하지 않는다. 만약 존재하고 설정 불가이거나 O가 확장 가능하지 않다면, [[DefineOwnProperty]]false를 반환하고, 이 연산은 TypeError 예외를 던진다.

7.3.7 CreateNonEnumerableDataPropertyOrThrow ( O, P, V )

추상 연산 CreateNonEnumerableDataPropertyOrThrow는 인수 O(객체), P(프로퍼티 키), V(ECMAScript 언어 값)를 받아 unused를 반환한다. 이 연산은 일반 객체의 새로운 비열거형 자기 프로퍼티를 생성하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. Assert: O는 비설정 불가 프로퍼티가 없는 일반적이고 확장 가능한 객체이다.
  2. newDesc를 PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }로 한다.
  3. DefinePropertyOrThrow(O, P, newDesc)를 수행한다.
  4. unused를 반환한다.
참고

이 추상 연산은 ECMAScript 언어의 할당 연산자로 생성된 프로퍼티와 동일한 기본 속성으로 프로퍼티를 생성하지만, 열거형이 아니다. 일반적으로 프로퍼티는 이미 존재하지 않는다. 만약 존재한다면 DefinePropertyOrThrow가 정상적으로 완료됨이 보장된다.

7.3.8 DefinePropertyOrThrow ( O, P, desc )

추상 연산 DefinePropertyOrThrow는 인수 O(객체), P(프로퍼티 키), desc(프로퍼티 디스크립터)를 받아, 특정 값을 포함하는 정상 완료 unused 또는 throw 완료를 반환한다. 이 연산은 객체의 [[DefineOwnProperty]] 내부 메서드를 호출하여, 요청된 프로퍼티 갱신을 수행할 수 없을 경우 TypeError 예외를 던진다. 호출 시 다음 단계를 수행한다:

  1. success를 ? O.[[DefineOwnProperty]](P, desc)로 한다.
  2. successfalse이면 TypeError 예외를 throw한다.
  3. unused를 반환한다.

7.3.9 DeletePropertyOrThrow ( O, P )

추상 연산 DeletePropertyOrThrow는 인수 O(객체), P(프로퍼티 키)를 받아, 특정 값을 포함하는 정상 완료 unused 또는 throw 완료를 반환한다. 이 연산은 객체의 특정 자기 프로퍼티를 제거하는 데 사용된다. 해당 프로퍼티가 설정 불가라면 예외를 던진다. 호출 시 다음 단계를 수행한다:

  1. success를 ? O.[[Delete]](P)로 한다.
  2. successfalse이면 TypeError 예외를 throw한다.
  3. unused를 반환한다.

7.3.10 GetMethod ( V, P )

추상 연산 GetMethod는 인수 V(ECMAScript 언어 값), P(프로퍼티 키)를 받아, 특정 값을 포함하는 정상 완료 함수 객체 또는 undefined, 혹은 throw 완료를 반환한다. 이 연산은 해당 프로퍼티의 값이 함수일 것으로 기대되는 ECMAScript 언어 값의 특정 프로퍼티 값을 가져오는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. func를 ? GetV(V, P)로 한다.
  2. funcundefined 또는 null이면 undefined를 반환한다.
  3. IsCallable(func)이 false이면 TypeError 예외를 throw한다.
  4. func를 반환한다.

7.3.11 HasProperty ( O, P )

추상 연산 HasProperty는 인수 O(객체), P(프로퍼티 키)를 받아, 특정 값을 포함하는 정상 완료 Boolean 또는 throw 완료를 반환한다. 이 연산은 객체에 지정된 프로퍼티 키의 프로퍼티가 존재하는지(자기 또는 상속 포함) 확인하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. O.[[HasProperty]](P)를 반환한다.

7.3.12 HasOwnProperty ( O, P )

추상 연산 HasOwnProperty는 인수 O(객체), P(프로퍼티 키)를 받아, 특정 값을 포함하는 정상 완료 Boolean 또는 throw 완료를 반환한다. 이 연산은 객체에 지정된 프로퍼티 키의 자기 프로퍼티가 존재하는지 확인하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. desc를 ? O.[[GetOwnProperty]](P)로 한다.
  2. descundefined이면 false를 반환한다.
  3. true를 반환한다.

7.3.13 Call ( F, V [ , argumentsList ] )

추상 연산 Call은 인수 F(ECMAScript 언어 값), V(ECMAScript 언어 값), 선택적 인수 argumentsList(ECMAScript 언어 값의 List)를 받아, 특정 값을 포함하는 정상 완료 ECMAScript 언어 값 또는 throw 완료를 반환한다. 이 연산은 함수 객체의 [[Call]] 내부 메서드를 호출하는 데 사용된다. F가 함수 객체이고, V[[Call]]this 값이며, argumentsList는 내부 메서드의 해당 인수로 전달된다. argumentsList가 없으면, 새로운 빈 List가 사용된다. 호출 시 다음 단계를 수행한다:

  1. argumentsList가 없으면, argumentsList를 새로운 빈 List로 설정한다.
  2. IsCallable(F)가 false이면 TypeError 예외를 throw한다.
  3. F.[[Call]](V, argumentsList)를 반환한다.

7.3.14 Construct ( F [ , argumentsList [ , newTarget ] ] )

추상 연산 Construct는 인수 F(생성자)와 선택적 인수 argumentsList(ListECMAScript 언어 값), newTarget(생성자)를 받아, 특정 값을 포함하는 정상 완료 객체 또는 throw 완료를 반환한다. 이 연산은 함수 객체[[Construct]] 내부 메서드를 호출하는 데 사용된다. argumentsListnewTarget는 내부 메서드의 해당 인수로 전달되는 값이다. argumentsList가 없으면 새로운 빈 List가 사용된다. newTarget가 없으면 F가 사용된다. 호출 시 다음 단계를 수행한다:

  1. newTarget가 없으면 newTargetF로 설정한다.
  2. argumentsList가 없으면 argumentsList를 새로운 빈 List로 설정한다.
  3. F.[[Construct]](argumentsList, newTarget)를 반환한다.
참고

newTarget가 없으면 이 연산은 new F(...argumentsList)와 같다.

7.3.15 SetIntegrityLevel ( O, level )

추상 연산 SetIntegrityLevel은 인수 O(객체), level(sealed 또는 frozen)를 받아, 특정 값을 포함하는 정상 완료 Boolean 또는 throw 완료를 반환한다. 이 연산은 객체의 자기 프로퍼티 집합을 고정하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. status를 ? O.[[PreventExtensions]]()로 한다.
  2. statusfalse이면 false를 반환한다.
  3. keys를 ? O.[[OwnPropertyKeys]]()로 한다.
  4. levelsealed이면,
    1. keys의 각 요소 k에 대해, 다음을 수행한다:
      1. DefinePropertyOrThrow(O, k, PropertyDescriptor { [[Configurable]]: false })를 수행한다.
  5. 그 외의 경우,
    1. Assert: levelfrozen이다.
    2. keys의 각 요소 k에 대해, 다음을 수행한다:
      1. currentDesc를 ? O.[[GetOwnProperty]](k)로 한다.
      2. currentDescundefined가 아니면, 다음을 수행한다:
        1. IsAccessorDescriptor(currentDesc) 가 true이면,
          1. desc를 PropertyDescriptor { [[Configurable]]: false }로 한다.
        2. 그 외의 경우,
          1. desc를 PropertyDescriptor { [[Configurable]]: false, [[Writable]]: false }로 한다.
        3. DefinePropertyOrThrow(O, k, desc)를 수행한다.
  6. true를 반환한다.

7.3.16 TestIntegrityLevel ( O, level )

추상 연산 TestIntegrityLevel은 인수 O(객체), level(sealed 또는 frozen)를 받아, 특정 값을 포함하는 정상 완료 Boolean 또는 throw 완료를 반환한다. 이 연산은 객체의 자기 프로퍼티 집합이 고정되어 있는지 판단하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. extensible를 ? IsExtensible(O)로 한다.
  2. extensibletrue이면 false를 반환한다.
  3. 참고: 객체가 확장 가능하면, 프로퍼티는 검사하지 않는다.
  4. keys를 ? O.[[OwnPropertyKeys]]()로 한다.
  5. keys의 각 요소 k에 대해, 다음을 수행한다:
    1. currentDesc를 ? O.[[GetOwnProperty]](k)로 한다.
    2. currentDescundefined가 아니면, 다음을 수행한다:
      1. currentDesc.[[Configurable]]true이면 false를 반환한다.
      2. levelfrozen이고 IsDataDescriptor(currentDesc) 가 true이면,
        1. currentDesc.[[Writable]]true이면 false를 반환한다.
  6. true를 반환한다.

7.3.17 CreateArrayFromList ( elements )

추상 연산 CreateArrayFromList는 인수 elements(ListECMAScript 언어 값)를 받아, 배열을 반환한다. 이 연산은 elements가 제공하는 요소로 구성된 배열을 생성하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. array를 ! ArrayCreate(0)으로 한다.
  2. n을 0으로 한다.
  3. elements의 각 요소 e에 대해, 다음을 수행한다:
    1. CreateDataPropertyOrThrow(array, ! ToString(𝔽(n)), e)를 수행한다.
    2. nn + 1로 설정한다.
  4. array를 반환한다.

7.3.18 LengthOfArrayLike ( obj )

추상 연산 LengthOfArrayLike는 인수 obj(객체)를 받아, 정상 완료로 음이 아닌 정수 또는 throw 완료를 반환한다. 이 연산은 배열과 유사한 객체의 "length" 프로퍼티 값을 반환한다. 호출 시 다음 단계를 수행한다:

  1. (? ToLength(? Get(obj, "length")))를 반환한다.

배열과 유사한 객체란 이 연산이 정상 완료를 반환하는 모든 객체이다.

참고 1
일반적으로 배열과 유사한 객체는 정수 인덱스 이름을 가진 프로퍼티도 가진다. 하지만 이는 이 정의의 필수 조건이 아니다.
참고 2
배열과 문자열 객체는 배열과 유사한 객체의 예시이다.

7.3.19 CreateListFromArrayLike ( obj [ , validElementTypes ] )

추상 연산 CreateListFromArrayLike는 인수 obj(ECMAScript 언어 값)와 선택적 인수 validElementTypes(all 또는 property-key)를 받아, 정상 완료 List (요소는 ECMAScript 언어 값) 또는 throw 완료를 반환한다. 이 연산은 obj의 인덱스 프로퍼티로부터 제공되는 요소들로 구성된 List 값을 생성하는 데 사용된다. validElementTypes는 요소로 허용되는 값의 타입을 나타낸다. 호출 시 다음 단계를 수행한다:

  1. validElementTypes가 주어지지 않으면, validElementTypesall로 설정한다.
  2. obj객체가 아니면 TypeError 예외를 throw한다.
  3. len을 ? LengthOfArrayLike(obj)로 한다.
  4. list를 새로운 빈 List로 한다.
  5. index를 0으로 한다.
  6. index < len 동안 반복한다,
    1. indexName을 ! ToString(𝔽(index))로 한다.
    2. next를 ? Get(obj, indexName)로 한다.
    3. validElementTypesproperty-key이고 next프로퍼티 키가 아니면 TypeError 예외를 throw한다.
    4. nextlist에 추가한다.
    5. indexindex + 1로 한다.
  7. list를 반환한다.

7.3.20 Invoke ( V, P [ , argumentsList ] )

추상 연산 Invoke는 인수 V(ECMAScript 언어 값), P(프로퍼티 키), 선택적 인수 argumentsList(ECMAScript 언어 값의 List)를 받아, 정상 완료 ECMAScript 언어 값 또는 throw 완료를 반환한다. 이 연산은 ECMAScript 언어 값의 메서드 프로퍼티를 호출하는 데 사용된다. V는 프로퍼티 조회 지점이자 호출 시 this 값으로 사용된다. argumentsList는 메서드에 전달되는 인자 값들의 목록이다. argumentsList가 없다면 새로운 빈 List가 사용된다. 호출 시 다음 단계를 수행한다:

  1. argumentsList가 없으면 argumentsList를 새로운 빈 List로 한다.
  2. func를 ? GetV(V, P)로 한다.
  3. Call(func, V, argumentsList)를 반환한다.

7.3.21 OrdinaryHasInstance ( C, O )

추상 연산 OrdinaryHasInstance는 인수 C(ECMAScript 언어 값), O(ECMAScript 언어 값)를 받아, 정상 완료 Boolean 또는 throw 완료를 반환한다. 이 연산은 OC가 제공하는 인스턴스 객체 상속 경로에서 상속받는지의 기본 알고리즘을 구현한다. 호출 시 다음 단계를 수행한다:

  1. IsCallable(C)가 false이면 false를 반환한다.
  2. C[[BoundTargetFunction]] 내부 슬롯이 있으면,
    1. BCC.[[BoundTargetFunction]]로 한다.
    2. InstanceofOperator(O, BC)를 반환한다.
  3. O객체가 아니면 false를 반환한다.
  4. P를 ? Get(C, "prototype")로 한다.
  5. P객체가 아니면 TypeError 예외를 throw한다.
  6. 반복한다,
    1. O를 ? O.[[GetPrototypeOf]]()로 한다.
    2. Onull이면 false를 반환한다.
    3. SameValue(P, O)가 true이면 true를 반환한다.

7.3.22 SpeciesConstructor ( O, defaultConstructor )

추상 연산 SpeciesConstructor는 인수 O(객체), defaultConstructor(생성자)를 받아, 정상 완료생성자 또는 throw 완료를 반환한다. 이 연산은 O로부터 파생된 새 객체를 생성하는 데 사용할 생성자를 검색하는 데 사용된다. defaultConstructorO에서 생성자 %Symbol.species% 프로퍼티를 찾을 수 없을 때 사용된다. 호출 시 다음 단계를 수행한다:

  1. C를 ? Get(O, "constructor")로 한다.
  2. Cundefined이면 defaultConstructor를 반환한다.
  3. C객체가 아니면 TypeError 예외를 throw한다.
  4. S를 ? Get(C, %Symbol.species%)로 한다.
  5. Sundefined 또는 null이면 defaultConstructor를 반환한다.
  6. IsConstructor(S)가 true이면 S를 반환한다.
  7. TypeError 예외를 throw한다.

7.3.23 EnumerableOwnProperties ( O, kind )

추상 연산 EnumerableOwnProperties는 인수 O(객체), kind(key, value, key+value)를 받아, 정상 완료 List (ECMAScript 언어 값) 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. ownKeys를 ? O.[[OwnPropertyKeys]]()로 한다.
  2. results를 새로운 빈 List로 한다.
  3. ownKeys의 각 요소 key에 대해, 다음을 수행한다:
    1. key문자열이면, 다음을 수행한다:
      1. desc를 ? O.[[GetOwnProperty]](key)로 한다.
      2. descundefined가 아니고 desc.[[Enumerable]]true이면, 다음을 수행한다:
        1. kindkey이면,
          1. keyresults에 추가한다.
        2. 그 외의 경우,
          1. value를 ? Get(O, key)로 한다.
          2. kindvalue이면,
            1. valueresults에 추가한다.
          3. 그 외의 경우,
            1. Assert: kindkey+value임을 보장한다.
            2. entryCreateArrayFromListkey, value »)로 한다.
            3. entryresults에 추가한다.
  4. results를 반환한다.

7.3.24 GetFunctionRealm ( obj )

추상 연산 GetFunctionRealm은 인수 obj(함수 객체)를 받아, 정상 완료 Realm Record 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. obj[[Realm]] 내부 슬롯이 있으면,
    1. obj.[[Realm]]을 반환한다.
  2. objbound function exotic object이면,
    1. boundTargetFunctionobj.[[BoundTargetFunction]]로 한다.
    2. GetFunctionRealm(boundTargetFunction)을 반환한다.
  3. objProxy exotic object이면,
    1. ValidateNonRevokedProxy(obj)를 수행한다.
    2. proxyTargetobj.[[ProxyTarget]]로 한다.
    3. Assert: proxyTarget함수 객체임을 보장한다.
    4. GetFunctionRealm(proxyTarget)을 반환한다.
  4. 현재 Realm Record를 반환한다.
참고

4 단계는 obj[[Realm]] 내부 슬롯이 없는 비표준 함수 특수 객체일 때만 도달한다.

7.3.25 CopyDataProperties ( target, source, excludedItems )

추상 연산 CopyDataProperties는 인수 target(객체), source(ECMAScript 언어 값), excludedItems(프로퍼티 키의 List)를 받아, 정상 완료 unused 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. sourceundefined 또는 null이면, unused를 반환한다.
  2. from을 ! ToObject(source)로 한다.
  3. keys를 ? from.[[OwnPropertyKeys]]()로 한다.
  4. keys의 각 요소 nextKey에 대해, 다음을 수행한다:
    1. excludedfalse로 한다.
    2. excludedItems의 각 요소 e에 대해, 다음을 수행한다:
      1. SameValue(e, nextKey)가 true이면,
        1. excludedtrue로 설정한다.
    3. excludedfalse이면, 다음을 수행한다:
      1. desc를 ? from.[[GetOwnProperty]](nextKey)로 한다.
      2. descundefined가 아니고 desc.[[Enumerable]]true이면, 다음을 수행한다:
        1. propValue를 ? Get(from, nextKey)로 한다.
        2. CreateDataPropertyOrThrow(target, nextKey, propValue)를 수행한다.
  5. unused를 반환한다.
참고

여기서 전달된 target은 항상 새로 생성된 객체이므로, 오류가 발생해도 직접 접근할 수 없다.

7.3.26 PrivateElementFind ( O, P )

추상 연산 PrivateElementFind는 인수 O(객체), P(프라이빗 이름)를 받아, PrivateElement 또는 empty를 반환한다. 호출 시 다음 단계를 수행한다:

  1. O.[[PrivateElements]]PrivateElement pe가 존재하고, pe.[[Key]]P와 같으면,
    1. pe를 반환한다.
  2. empty를 반환한다.

7.3.27 PrivateFieldAdd ( O, P, value )

추상 연산 PrivateFieldAdd는 인수 O(객체), P(프라이빗 이름), value(ECMAScript 언어 값)를 받아, 정상 완료 unused 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 호스트가 웹 브라우저이면,
    1. HostEnsureCanAddPrivateElement(O)를 수행한다.
  2. entryPrivateElementFind(O, P)로 한다.
  3. entryempty가 아니면 TypeError 예외를 throw한다.
  4. PrivateElement { [[Key]]: P, [[Kind]]: field, [[Value]]: value }를 O.[[PrivateElements]]에 추가한다.
  5. unused를 반환한다.

7.3.28 PrivateMethodOrAccessorAdd ( O, method )

추상 연산 PrivateMethodOrAccessorAdd는 인수 O(객체), method(PrivateElement)를 받아, 정상 완료 unused 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: method.[[Kind]]method 또는 accessor임을 보장한다.
  2. 호스트가 웹 브라우저이면,
    1. HostEnsureCanAddPrivateElement(O)를 수행한다.
  3. entryPrivateElementFind(O, method.[[Key]])로 한다.
  4. entryempty가 아니면 TypeError 예외를 throw한다.
  5. methodO.[[PrivateElements]]에 추가한다.
  6. unused를 반환한다.
참고

프라이빗 메서드와 접근자의 값은 인스턴스 간에 공유된다. 이 연산은 메서드나 접근자의 새 복사본을 생성하지 않는다.

7.3.29 HostEnsureCanAddPrivateElement ( O )

호스트 정의 추상 연산 HostEnsureCanAddPrivateElement는 인수 O(객체)를 받아, 정상 완료 unused 또는 throw 완료를 반환한다. 이 연산은 호스트 환경이 특정 호스트 정의 특수 객체에 프라이빗 요소 추가를 방지할 수 있도록 한다.

HostEnsureCanAddPrivateElement의 구현은 다음 요구사항을 따라야 한다:

HostEnsureCanAddPrivateElement의 기본 구현은 NormalCompletion(unused)을 반환하는 것이다.

이 추상 연산은 ECMAScript 호스트가 웹 브라우저인 경우에만 호출된다.

7.3.30 PrivateGet ( O, P )

추상 연산 PrivateGet은 인수 O(객체), P(프라이빗 이름)를 받아, 정상 완료 ECMAScript 언어 값 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. entryPrivateElementFind(O, P)로 한다.
  2. entryempty이면 TypeError 예외를 throw한다.
  3. entry.[[Kind]]field 또는 method이면,
    1. entry.[[Value]]를 반환한다.
  4. Assert: entry.[[Kind]]accessor임을 보장한다.
  5. entry.[[Get]]undefined이면 TypeError 예외를 throw한다.
  6. getterentry.[[Get]]로 한다.
  7. Call(getter, O)를 반환한다.

7.3.31 PrivateSet ( O, P, value )

추상 연산 PrivateSet은 인수 O(객체), P(프라이빗 이름), value(ECMAScript 언어 값)를 받아, 정상 완료 unused 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. entryPrivateElementFind(O, P)로 한다.
  2. entryempty이면 TypeError 예외를 throw한다.
  3. entry.[[Kind]]field이면,
    1. entry.[[Value]]value를 할당한다.
  4. 그 외 entry.[[Kind]]method이면,
    1. TypeError 예외를 throw한다.
  5. 그 외의 경우,
    1. Assert: entry.[[Kind]]accessor임을 보장한다.
    2. entry.[[Set]]undefined이면 TypeError 예외를 throw한다.
    3. setterentry.[[Set]]로 한다.
    4. Call(setter, O, « value » )를 수행한다.
  6. unused를 반환한다.

7.3.32 DefineField ( receiver, fieldRecord )

추상 연산 DefineField는 인수 receiver(객체), fieldRecord(ClassFieldDefinition Record)를 받아, 정상 완료 unused 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. fieldNamefieldRecord.[[Name]]로 한다.
  2. initializerfieldRecord.[[Initializer]]로 한다.
  3. initializerempty가 아니면,
    1. initValue를 ? Call(initializer, receiver)로 한다.
  4. 그 외의 경우,
    1. initValueundefined로 한다.
  5. fieldName프라이빗 이름이면,
    1. PrivateFieldAdd(receiver, fieldName, initValue)를 수행한다.
  6. 그 외의 경우,
    1. Assert: fieldName프로퍼티 키임을 보장한다.
    2. CreateDataPropertyOrThrow(receiver, fieldName, initValue)를 수행한다.
  7. unused를 반환한다.

7.3.33 InitializeInstanceElements ( O, constructor )

추상 연산 InitializeInstanceElements는 인수 O(객체), constructor(ECMAScript 함수 객체)를 받아, 정상 완료 unused 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. methodsconstructor.[[PrivateMethods]]로 한다.
  2. methods의 각 PrivateElement method에 대해, 다음을 수행한다:
    1. PrivateMethodOrAccessorAdd(O, method)를 수행한다.
  3. fieldsconstructor.[[Fields]]로 한다.
  4. fields의 각 요소 fieldRecord에 대해, 다음을 수행한다:
    1. DefineField(O, fieldRecord)를 수행한다.
  5. unused를 반환한다.

7.3.34 AddValueToKeyedGroup ( groups, key, value )

추상 연산 AddValueToKeyedGroup은 인수 groups(ListRecord이며, 필드 [[Key]](ECMAScript 언어 값)와 [[Elements]](ListECMAScript 언어 값)), key(ECMAScript 언어 값), value(ECMAScript 언어 값)를 받아 unused를 반환한다. 호출 시 다음 단계를 수행한다:

  1. groups의 각 Record { [[Key]], [[Elements]] } g에 대해, 다음을 수행한다:
    1. SameValue(g.[[Key]], key)가 true이면,
      1. Assert: groups의 정확히 하나의 요소만 이 조건을 만족한다.
      2. valueg.[[Elements]]에 추가한다.
      3. unused를 반환한다.
  2. groupRecord { [[Key]]: key, [[Elements]]: « value » }로 한다.
  3. groupgroups에 추가한다.
  4. unused를 반환한다.

7.3.35 GroupBy ( items, callback, keyCoercion )

추상 연산 GroupBy는 인수 items(ECMAScript 언어 값), callback(ECMAScript 언어 값), keyCoercion(property 또는 collection)를 받아, 정상 완료 List (Record이며, 필드 [[Key]](ECMAScript 언어 값) 및 [[Elements]](ListECMAScript 언어 값)), 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. RequireObjectCoercible(items)를 수행한다.
  2. IsCallable(callback)이 false이면 TypeError 예외를 throw한다.
  3. groups를 새로운 빈 List로 한다.
  4. iteratorRecord를 ? GetIterator(items, sync)로 한다.
  5. k를 0으로 한다.
  6. 반복한다,
    1. k ≥ 253 - 1이면,
      1. errorThrowCompletion(새로 생성된 TypeError 객체)로 한다.
      2. IteratorClose(iteratorRecord, error)를 반환한다.
    2. next를 ? IteratorStepValue(iteratorRecord)로 한다.
    3. nextdone이면,
      1. groups를 반환한다.
    4. valuenext로 한다.
    5. keyCompletion(Call(callback, undefined, « value, 𝔽(k) »))로 한다.
    6. IfAbruptCloseIterator(key, iteratorRecord)를 수행한다.
    7. keyCoercionproperty이면,
      1. keyCompletion(ToPropertyKey(key))로 설정한다.
      2. IfAbruptCloseIterator(key, iteratorRecord)를 수행한다.
    8. 그 외의 경우,
      1. Assert: keyCoercioncollection임을 보장한다.
      2. keyCanonicalizeKeyedCollectionKey(key)로 설정한다.
    9. AddValueToKeyedGroup(groups, key, value)를 수행한다.
    10. kk + 1로 설정한다.

7.3.36 SetterThatIgnoresPrototypeProperties ( thisValue, home, p, v )

추상 연산 SetterThatIgnoresPrototypeProperties는 인수 thisValue(ECMAScript 언어 값), home(객체), p(프로퍼티 키), v(ECMAScript 언어 값)를 받아, 정상 완료 unused 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. thisValue객체가 아니면,
    1. TypeError 예외를 throw한다.
  2. SameValue(thisValue, home)가 true이면,
    1. 참고: 여기서 예외를 던지는 것은 home 객체의 strict mode 코드에서 쓰기 불가 데이터 프로퍼티에 대입하는 효과를 모방한다.
    2. TypeError 예외를 throw한다.
  3. desc를 ? thisValue.[[GetOwnProperty]](p)로 한다.
  4. descundefined이면,
    1. CreateDataPropertyOrThrow(thisValue, p, v)를 수행한다.
  5. 그 외의 경우,
    1. Set(thisValue, p, v, true)를 수행한다.
  6. unused를 반환한다.

7.4 반복자 객체에 대한 연산

공통 반복 인터페이스(27.1 참조).

7.4.1 반복자 레코드

반복자 레코드Record 값으로, 반복자 또는 비동기 반복자next 메서드를 캡슐화하는 데 사용된다.

반복자 레코드는 표 15에 나열된 필드를 가진다.

표 15: 반복자 레코드 필드
필드 이름 의미
[[Iterator]] 객체 반복자 인터페이스 또는 비동기 반복자 인터페이스를 따르는 객체.
[[NextMethod]] ECMAScript 언어 값 [[Iterator]] 객체의 next 메서드.
[[Done]] 불린 반복자가 완료되었거나 닫혔는지 여부.

7.4.2 GetIteratorDirect ( obj )

추상 연산 GetIteratorDirect는 인수 obj(객체)를 받아, 정상 완료반복자 레코드 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. nextMethod를 ? Get(obj, "next")로 한다.
  2. iteratorRecord반복자 레코드 { [[Iterator]]: obj, [[NextMethod]]: nextMethod, [[Done]]: false }로 한다.
  3. iteratorRecord를 반환한다.

7.4.3 GetIteratorFromMethod ( obj, method )

추상 연산 GetIteratorFromMethod는 인수 obj(ECMAScript 언어 값), method(함수 객체)를 받아, 정상 완료반복자 레코드 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. iterator를 ? Call(method, obj)로 한다.
  2. iterator객체가 아니면 TypeError 예외를 throw한다.
  3. GetIteratorDirect(iterator)를 반환한다.

7.4.4 GetIterator ( obj, kind )

추상 연산 GetIterator는 인수 obj(ECMAScript 언어 값), kind(sync 또는 async)를 받아, 정상 완료반복자 레코드 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. kindasync이면,
    1. method를 ? GetMethod(obj, %Symbol.asyncIterator%)로 한다.
    2. methodundefined이면,
      1. syncMethod를 ? GetMethod(obj, %Symbol.iterator%)로 한다.
      2. syncMethodundefined이면 TypeError 예외를 throw한다.
      3. syncIteratorRecord를 ? GetIteratorFromMethod(obj, syncMethod)로 한다.
      4. CreateAsyncFromSyncIterator(syncIteratorRecord)를 반환한다.
  2. 그 외의 경우,
    1. method를 ? GetMethod(obj, %Symbol.iterator%)로 한다.
  3. methodundefined이면 TypeError 예외를 throw한다.
  4. GetIteratorFromMethod(obj, method)를 반환한다.

7.4.5 GetIteratorFlattenable ( obj, primitiveHandling )

추상 연산 GetIteratorFlattenable는 인수 obj(ECMAScript 언어 값), primitiveHandling(iterate-string-primitives 또는 reject-primitives)를 받아, 정상 완료반복자 레코드 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. obj객체가 아니면,
    1. primitiveHandlingreject-primitives이면 TypeError 예외를 throw한다.
    2. Assert: primitiveHandlingiterate-string-primitives임을 보장한다.
    3. obj문자열이 아니면, TypeError 예외를 throw한다.
  2. method를 ? GetMethod(obj, %Symbol.iterator%)로 한다.
  3. methodundefined이면,
    1. iteratorobj로 한다.
  4. 그 외의 경우,
    1. iterator를 ? Call(method, obj)로 한다.
  5. iterator객체가 아니면 TypeError 예외를 throw한다.
  6. GetIteratorDirect(iterator)를 반환한다.

7.4.6 IteratorNext ( iteratorRecord [ , value ] )

추상 연산 IteratorNext는 인수 iteratorRecord(반복자 레코드), 선택적 인수 value(ECMAScript 언어 값)를 받아, 정상 완료 객체 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. value가 없으면,
    1. resultCompletion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]))로 한다.
  2. 그 외의 경우,
    1. resultCompletion(Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « value »))로 한다.
  3. resultthrow 완료이면,
    1. iteratorRecord.[[Done]]true로 설정한다.
    2. result를 반환한다.
  4. result를 ! result로 설정한다.
  5. result객체가 아니면,
    1. iteratorRecord.[[Done]]true로 설정한다.
    2. TypeError 예외를 throw한다.
  6. result를 반환한다.

7.4.7 IteratorComplete ( iteratorResult )

추상 연산 IteratorComplete는 인수 iteratorResult(객체)를 받아, 정상 완료 불린 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. ToBoolean(? Get(iteratorResult, "done"))를 반환한다.

7.4.8 IteratorValue ( iteratorResult )

추상 연산 IteratorValue는 인수 iteratorResult(객체)를 받아, 정상 완료 ECMAScript 언어 값 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Get(iteratorResult, "value")를 반환한다.

7.4.9 IteratorStep ( iteratorRecord )

추상 연산 IteratorStep은 인수 iteratorRecord(반복자 레코드)를 받아, 정상 완료 객체 또는 done, 또는 throw 완료를 반환한다. iteratorRecord.[[Iterator]]iteratorRecord.[[NextMethod]]를 호출하여 다음 값을 요청하고, 끝에 도달하면 done를 반환하며, 다음 값이 있으면 IteratorResult 객체를 반환한다. 호출 시 다음 단계를 수행한다:

  1. result를 ? IteratorNext(iteratorRecord)로 한다.
  2. doneCompletion(IteratorComplete(result))로 한다.
  3. donethrow 완료이면,
    1. iteratorRecord.[[Done]]true로 설정한다.
    2. done을 반환한다.
  4. done을 ! done으로 설정한다.
  5. donetrue이면,
    1. iteratorRecord.[[Done]]true로 설정한다.
    2. done를 반환한다.
  6. result를 반환한다.

7.4.10 IteratorStepValue ( iteratorRecord )

추상 연산 IteratorStepValue는 인수 iteratorRecord(반복자 레코드)를 받아, 정상 완료 ECMAScript 언어 값 또는 done, 또는 throw 완료를 반환한다. iteratorRecord.[[Iterator]]iteratorRecord.[[NextMethod]]를 호출하여 다음 값을 요청하고, 끝에 도달하면 done를 반환하며, 다음 값이 있으면 그 값을 반환한다. 호출 시 다음 단계를 수행한다:

  1. result를 ? IteratorStep(iteratorRecord)로 한다.
  2. resultdone이면,
    1. done를 반환한다.
  3. valueCompletion(IteratorValue(result))로 한다.
  4. valuethrow 완료이면,
    1. iteratorRecord.[[Done]]true로 설정한다.
  5. value를 반환한다.

7.4.11 IteratorClose ( iteratorRecord, completion )

추상 연산 IteratorClose는 인수 iteratorRecord(반복자 레코드), completion(Completion Record)를 받아, Completion Record를 반환한다. 이는 반복자가 완료 상태가 되었을 때 수행해야 할 동작을 알리는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. Assert: iteratorRecord.[[Iterator]]객체임을 보장한다.
  2. iteratoriteratorRecord.[[Iterator]]로 한다.
  3. innerResultCompletion(GetMethod(iterator, "return"))로 한다.
  4. innerResult정상 완료이면,
    1. returninnerResult.[[Value]]로 한다.
    2. returnundefined이면 ? completion을 반환한다.
    3. innerResultCompletion(Call(return, iterator))로 설정한다.
  5. completionthrow 완료이면 ? completion을 반환한다.
  6. innerResultthrow 완료이면 ? innerResult를 반환한다.
  7. innerResult.[[Value]]객체가 아니면 TypeError 예외를 throw한다.
  8. completion을 반환한다.

7.4.12 IfAbruptCloseIterator ( value, iteratorRecord )

IfAbruptCloseIterator는 반복자 레코드를 사용하는 알고리즘 단계 시퀀스의 약식 표현이다. 다음과 같은 알고리즘 단계는:

  1. IfAbruptCloseIterator(value, iteratorRecord).

다음과 동일하다:

  1. Assert: valueCompletion Record이다.
  2. valueabrupt 완료이면, ? IteratorClose(iteratorRecord, value)를 반환한다.
  3. 그 외의 경우, value를 ! value로 설정한다.

7.4.13 AsyncIteratorClose ( iteratorRecord, completion )

추상 연산 AsyncIteratorClose는 인수 iteratorRecord(반복자 레코드), completion(Completion Record)를 받아, Completion Record를 반환한다. 이는 비동기 반복자가 완료 상태가 되었을 때 수행해야 할 동작을 알리는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. Assert: iteratorRecord.[[Iterator]]객체임을 보장한다.
  2. iteratoriteratorRecord.[[Iterator]]로 한다.
  3. innerResultCompletion(GetMethod(iterator, "return"))로 한다.
  4. innerResult정상 완료이면,
    1. returninnerResult.[[Value]]로 한다.
    2. returnundefined이면 ? completion을 반환한다.
    3. innerResultCompletion(Call(return, iterator))로 설정한다.
    4. innerResult정상 완료이면, innerResultCompletion(Await(innerResult.[[Value]]))로 설정한다.
  5. completionthrow 완료이면 ? completion을 반환한다.
  6. innerResultthrow 완료이면 ? innerResult를 반환한다.
  7. innerResult.[[Value]]객체가 아니면 TypeError 예외를 throw한다.
  8. completion을 반환한다.

7.4.14 CreateIteratorResultObject ( value, done )

추상 연산 CreateIteratorResultObject는 인수 value(ECMAScript 언어 값), done(불린)을 받아, IteratorResult 인터페이스를 따르는 객체를 반환한다. 호출 시 다음 단계를 수행한다:

  1. objOrdinaryObjectCreate(%Object.prototype%)로 한다.
  2. CreateDataPropertyOrThrow(obj, "value", value)를 수행한다.
  3. CreateDataPropertyOrThrow(obj, "done", done)를 수행한다.
  4. obj를 반환한다.

7.4.15 CreateListIteratorRecord ( list )

추상 연산 CreateListIteratorRecord는 인수 list(ECMAScript 언어 값의 List)를 받아, 반복자 레코드를 반환한다. 이 연산은 [[NextMethod]]list의 요소를 차례로 반환하는 반복자 레코드를 생성한다. 호출 시 다음 단계를 수행한다:

  1. closure를 인수가 없고 list를 캡처하는 새로운 Abstract Closure로 한다. 호출 시 다음 단계를 수행한다:
    1. list의 각 요소 E에 대해, 다음을 수행한다:
      1. GeneratorYield(CreateIteratorResultObject(E, false))를 수행한다.
    2. NormalCompletion(undefined)을 반환한다.
  2. iteratorCreateIteratorFromClosure(closure, empty, %Iterator.prototype%)로 한다.
  3. 반복자 레코드 { [[Iterator]]: iterator, [[NextMethod]]: %GeneratorPrototype.next%, [[Done]]: false }를 반환한다.
참고

리스트 반복자 객체는 ECMAScript 코드에서 직접 접근할 수 없다.

7.4.16 IteratorToList ( iteratorRecord )

추상 연산 IteratorToList는 인수 iteratorRecord(반복자 레코드)를 받아, 정상 완료 ECMAScript 언어 값의 List 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. values를 새로운 빈 List로 한다.
  2. 반복한다,
    1. next를 ? IteratorStepValue(iteratorRecord)로 한다.
    2. nextdone이면,
      1. values를 반환한다.
    3. nextvalues에 추가한다.

8 구문 지시 연산

이 절에 정의된 것 외에도, 특수화된 구문 지시 연산이 이 명세 전반에 걸쳐 정의되어 있다.

8.1 런타임 의미론: 평가

구문 지시 연산 Evaluation은 인수를 받지 않고 Completion Record를 반환한다.

참고
이 연산의 정의는 본 명세의 "ECMAScript 언어" 절들에 분산되어 있다. 각 정의는 해당 생성 규칙의 정의 위치 뒤에 나타난다.

8.2 스코프 분석

8.2.1 정적 의미론: BoundNames

구문 지시 연산 BoundNames는 인수를 받지 않고 문자열의 List를 반환한다.

참고

"*default*"는 이 명세 내에서, 별도의 이름이 없는 모듈의 기본 내보내기(default export)에 대한 합성 이름으로 사용된다. 해당 이름으로 모듈의 [[Environment]]에 항목이 생성되고, 해당 값이 보관된다. ResolveExport ( exportName [ , resolveSet ] )를 호출해 "default"라는 내보내기를 해석하면, [[BindingName]]"*default*"ResolvedBinding Record를 반환하게 되며, 이는 모듈의 [[Environment]]에서 위에서 언급한 값으로 해석된다. 이는 명세의 편의를 위해서만 이루어지며, 익명 기본 내보내기 또한 다른 내보내기와 동일하게 해석할 수 있도록 한다. 이 "*default*" 문자열은 ECMAScript 코드나 모듈 연결 알고리즘에서는 접근할 수 없다.

이는 다음 생성 규칙들에 대해 분할적으로 정의된다:

BindingIdentifier : Identifier
  1. 리스트의 유일한 요소가 StringValueIdentifier를 반환한다.
BindingIdentifier : yield
  1. « "yield" »를 반환한다.
BindingIdentifier : await
  1. « "await" »를 반환한다.
LexicalDeclaration : LetOrConst BindingList ;
  1. BoundNames of BindingList를 반환한다.
BindingList : BindingList , LexicalBinding
  1. names1BoundNames of BindingList로 한다.
  2. names2BoundNames of LexicalBinding로 한다.
  3. list-concatenation of names1names2를 반환한다.
LexicalBinding : BindingIdentifier Initializeropt
  1. BoundNames of BindingIdentifier를 반환한다.
LexicalBinding : BindingPattern Initializer
  1. BoundNames of BindingPattern를 반환한다.
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
  1. names1BoundNames of VariableDeclarationList로 한다.
  2. names2BoundNames of VariableDeclaration로 한다.
  3. list-concatenation of names1names2를 반환한다.
VariableDeclaration : BindingIdentifier Initializeropt
  1. BoundNames of BindingIdentifier를 반환한다.
VariableDeclaration : BindingPattern Initializer
  1. BoundNames of BindingPattern를 반환한다.
ObjectBindingPattern : { }
  1. 새로운 빈 리스트를 반환한다.
ObjectBindingPattern : { BindingPropertyList , BindingRestProperty }
  1. names1BoundNames of BindingPropertyList로 한다.
  2. names2BoundNames of BindingRestProperty로 한다.
  3. list-concatenation of names1names2를 반환한다.
ArrayBindingPattern : [ Elisionopt ]
  1. 새로운 빈 리스트를 반환한다.
ArrayBindingPattern : [ Elisionopt BindingRestElement ]
  1. BoundNames of BindingRestElement를 반환한다.
ArrayBindingPattern : [ BindingElementList , Elisionopt ]
  1. BoundNames of BindingElementList를 반환한다.
ArrayBindingPattern : [ BindingElementList , Elisionopt BindingRestElement ]
  1. names1BoundNames of BindingElementList로 한다.
  2. names2BoundNames of BindingRestElement로 한다.
  3. list-concatenation of names1names2를 반환한다.
BindingPropertyList : BindingPropertyList , BindingProperty
  1. names1BoundNames of BindingPropertyList로 한다.
  2. names2BoundNames of BindingProperty로 한다.
  3. list-concatenation of names1names2를 반환한다.
BindingElementList : BindingElementList , BindingElisionElement
  1. names1BoundNames of BindingElementList로 한다.
  2. names2BoundNames of BindingElisionElement로 한다.
  3. list-concatenation of names1names2를 반환한다.
BindingElisionElement : Elisionopt BindingElement
  1. BoundNames of BindingElement를 반환한다.
BindingProperty : PropertyName : BindingElement
  1. BoundNames of BindingElement를 반환한다.
SingleNameBinding : BindingIdentifier Initializeropt
  1. BoundNames of BindingIdentifier를 반환한다.
BindingElement : BindingPattern Initializeropt
  1. BoundNames of BindingPattern를 반환한다.
ForDeclaration : LetOrConst ForBinding
  1. BoundNames of ForBinding를 반환한다.
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. BoundNames of BindingIdentifier를 반환한다.
FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
  1. « "*default*" »를 반환한다.
FormalParameters : [empty]
  1. 새로운 빈 리스트를 반환한다.
FormalParameters : FormalParameterList , FunctionRestParameter
  1. names1BoundNames of FormalParameterList로 한다.
  2. names2BoundNames of FunctionRestParameter로 한다.
  3. list-concatenation of names1names2를 반환한다.
FormalParameterList : FormalParameterList , FormalParameter
  1. names1BoundNames of FormalParameterList로 한다.
  2. names2BoundNames of FormalParameter로 한다.
  3. list-concatenation of names1names2를 반환한다.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsArrowFormalParameters로 한다. 이 CoverParenthesizedExpressionAndArrowParameterListcovered한 것이다.
  2. BoundNames of formals를 반환한다.
GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
  1. BoundNames of BindingIdentifier를 반환한다.
GeneratorDeclaration : function * ( FormalParameters ) { GeneratorBody }
  1. « "*default*" »를 반환한다.
AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
  1. BoundNames of BindingIdentifier를 반환한다.
AsyncGeneratorDeclaration : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. « "*default*" »를 반환한다.
ClassDeclaration : class BindingIdentifier ClassTail
  1. BoundNames of BindingIdentifier를 반환한다.
ClassDeclaration : class ClassTail
  1. « "*default*" »를 반환한다.
AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
  1. BoundNames of BindingIdentifier를 반환한다.
AsyncFunctionDeclaration : async function ( FormalParameters ) { AsyncFunctionBody }
  1. « "*default*" »를 반환한다.
CoverCallExpressionAndAsyncArrowHead : MemberExpression Arguments
  1. headAsyncArrowHead로 한다. 이 CoverCallExpressionAndAsyncArrowParameterListcovered한 것이다.
  2. BoundNames of head를 반환한다.
ImportDeclaration : import ImportClause FromClause WithClauseopt ;
  1. BoundNames of ImportClause를 반환한다.
ImportDeclaration : import ModuleSpecifier WithClauseopt ;
  1. 새로운 빈 리스트를 반환한다.
ImportClause : ImportedDefaultBinding , NameSpaceImport
  1. names1BoundNames of ImportedDefaultBinding로 한다.
  2. names2BoundNames of NameSpaceImport로 한다.
  3. list-concatenation of names1names2를 반환한다.
ImportClause : ImportedDefaultBinding , NamedImports
  1. names1BoundNames of ImportedDefaultBinding로 한다.
  2. names2BoundNames of NamedImports로 한다.
  3. list-concatenation of names1names2를 반환한다.
NamedImports : { }
  1. 새로운 빈 리스트를 반환한다.
ImportsList : ImportsList , ImportSpecifier
  1. names1BoundNames of ImportsList로 한다.
  2. names2BoundNames of ImportSpecifier로 한다.
  3. list-concatenation of names1names2를 반환한다.
ImportSpecifier : ModuleExportName as ImportedBinding
  1. BoundNames of ImportedBinding를 반환한다.
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ;
  1. 새로운 빈 리스트를 반환한다.
ExportDeclaration : export VariableStatement
  1. BoundNames of VariableStatement를 반환한다.
ExportDeclaration : export Declaration
  1. BoundNames of Declaration를 반환한다.
ExportDeclaration : export default HoistableDeclaration
  1. declarationNamesBoundNames of HoistableDeclaration로 한다.
  2. 만약 declarationNames"*default*" 요소가 없다면, "*default*"declarationNames에 추가한다.
  3. declarationNames를 반환한다.
ExportDeclaration : export default ClassDeclaration
  1. declarationNamesBoundNames of ClassDeclaration로 한다.
  2. 만약 declarationNames"*default*" 요소가 없다면, "*default*"declarationNames에 추가한다.
  3. declarationNames를 반환한다.
ExportDeclaration : export default AssignmentExpression ;
  1. « "*default*" »를 반환한다.

8.2.2 정적 의미론: DeclarationPart

구문 지향 연산 DeclarationPart는 인자를 받지 않으며 파스 노드를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:

HoistableDeclaration : FunctionDeclaration
  1. FunctionDeclaration를 반환한다.
HoistableDeclaration : GeneratorDeclaration
  1. GeneratorDeclaration를 반환한다.
HoistableDeclaration : AsyncFunctionDeclaration
  1. AsyncFunctionDeclaration를 반환한다.
HoistableDeclaration : AsyncGeneratorDeclaration
  1. AsyncGeneratorDeclaration를 반환한다.
Declaration : ClassDeclaration
  1. ClassDeclaration를 반환한다.
Declaration : LexicalDeclaration
  1. LexicalDeclaration를 반환한다.

8.2.3 정적 의미론: IsConstantDeclaration

구문 지향 연산 IsConstantDeclaration은 인자를 받지 않으며 불리언을 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:

LexicalDeclaration : LetOrConst BindingList ;
  1. IsConstantDeclaration of LetOrConst를 반환한다.
LetOrConst : let
  1. false를 반환한다.
LetOrConst : const
  1. true를 반환한다.
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody } GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody } AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody }
  1. false를 반환한다.
ClassDeclaration : class BindingIdentifier ClassTail class ClassTail
  1. false를 반환한다.
ExportDeclaration : export ExportFromClause FromClause ; export NamedExports ; export default AssignmentExpression ;
  1. false를 반환한다.
참고

export default AssignmentExpression를 상수 선언으로 취급할 필요는 없다. 모듈의 default 객체를 참조하는 내부 바운드 이름에 할당을 허용하는 구문이 존재하지 않기 때문이다.

8.2.4 정적 의미론: LexicallyDeclaredNames

구문 지향 연산 LexicallyDeclaredNames는 인자를 받지 않으며 문자열의 리스트를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:

Block : { }
  1. 새로운 빈 리스트를 반환한다.
StatementList : StatementList StatementListItem
  1. names1LexicallyDeclaredNames of StatementList로 한다.
  2. names2LexicallyDeclaredNames of StatementListItem로 한다.
  3. list-concatenation of names1names2를 반환한다.
StatementListItem : Statement
  1. 만약 Statement Statement : LabelledStatement 인 경우, LexicallyDeclaredNames of LabelledStatement를 반환한다.
  2. 새로운 빈 리스트를 반환한다.
StatementListItem : Declaration
  1. BoundNames of Declaration를 반환한다.
CaseBlock : { }
  1. 새로운 빈 리스트를 반환한다.
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 첫 번째 CaseClauses가 존재하면, names1LexicallyDeclaredNames of 첫 번째 CaseClauses로 한다.
  2. 그렇지 않으면, names1을 새로운 빈 리스트로 한다.
  3. names2LexicallyDeclaredNames of DefaultClause로 한다.
  4. 두 번째 CaseClauses가 존재하면, names3LexicallyDeclaredNames of 두 번째 CaseClauses로 한다.
  5. 그렇지 않으면, names3을 새로운 빈 리스트로 한다.
  6. list-concatenation of names1, names2, names3를 반환한다.
CaseClauses : CaseClauses CaseClause
  1. names1LexicallyDeclaredNames of CaseClauses로 한다.
  2. names2LexicallyDeclaredNames of CaseClause로 한다.
  3. list-concatenation of names1names2를 반환한다.
CaseClause : case Expression : StatementListopt
  1. StatementList가 존재하면, LexicallyDeclaredNames of StatementList를 반환한다.
  2. 새로운 빈 리스트를 반환한다.
DefaultClause : default : StatementListopt
  1. StatementList가 존재하면, LexicallyDeclaredNames of StatementList를 반환한다.
  2. 새로운 빈 리스트를 반환한다.
LabelledStatement : LabelIdentifier : LabelledItem
  1. LexicallyDeclaredNames of LabelledItem를 반환한다.
LabelledItem : Statement
  1. 새로운 빈 리스트를 반환한다.
LabelledItem : FunctionDeclaration
  1. BoundNames of FunctionDeclaration를 반환한다.
FunctionStatementList : [empty]
  1. 새로운 빈 리스트를 반환한다.
FunctionStatementList : StatementList
  1. TopLevelLexicallyDeclaredNames of StatementList를 반환한다.
ClassStaticBlockStatementList : [empty]
  1. 새로운 빈 리스트를 반환한다.
ClassStaticBlockStatementList : StatementList
  1. TopLevelLexicallyDeclaredNames of StatementList를 반환한다.
ConciseBody : ExpressionBody
  1. 새로운 빈 리스트를 반환한다.
AsyncConciseBody : ExpressionBody
  1. 새로운 빈 리스트를 반환한다.
Script : [empty]
  1. 새로운 빈 리스트를 반환한다.
ScriptBody : StatementList
  1. TopLevelLexicallyDeclaredNames of StatementList를 반환한다.
참고 1

Script의 최상위 레벨에서는, 함수 선언이 렉시컬 선언이 아니라 var 선언처럼 취급된다.

참고 2

Module의 LexicallyDeclaredNames에는 그 안의 모든 import 바인딩의 이름이 포함된다.

ModuleItemList : ModuleItemList ModuleItem
  1. names1LexicallyDeclaredNames of ModuleItemList로 한다.
  2. names2LexicallyDeclaredNames of ModuleItem로 한다.
  3. list-concatenation of names1names2를 반환한다.
ModuleItem : ImportDeclaration
  1. BoundNames of ImportDeclaration를 반환한다.
ModuleItem : ExportDeclaration
  1. 만약 ExportDeclarationexport VariableStatement인 경우, 새로운 빈 리스트를 반환한다.
  2. BoundNames of ExportDeclaration를 반환한다.
ModuleItem : StatementListItem
  1. LexicallyDeclaredNames of StatementListItem를 반환한다.
참고 3

Module의 최상위 레벨에서는, 함수 선언이 var 선언이 아니라 렉시컬 선언처럼 취급된다.

8.2.5 정적 의미론: LexicallyScopedDeclarations

구문 지향 연산 LexicallyScopedDeclarations는 인자를 받지 않으며 리스트 (파스 노드의 리스트)를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:

StatementList : StatementList StatementListItem
  1. declarations1LexicallyScopedDeclarations of StatementList로 한다.
  2. declarations2LexicallyScopedDeclarations of StatementListItem로 한다.
  3. list-concatenation of declarations1declarations2를 반환한다.
StatementListItem : Statement
  1. 만약 Statement Statement : LabelledStatement 인 경우, LexicallyScopedDeclarations of LabelledStatement를 반환한다.
  2. 새로운 빈 리스트를 반환한다.
StatementListItem : Declaration
  1. 리스트를 반환한다. 유일한 요소는 DeclarationPart of Declaration이다.
CaseBlock : { }
  1. 새로운 빈 리스트를 반환한다.
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 첫 번째 CaseClauses가 존재하면, declarations1LexicallyScopedDeclarations of 첫 번째 CaseClauses로 한다.
  2. 그렇지 않으면, declarations1을 새로운 빈 리스트로 한다.
  3. declarations2LexicallyScopedDeclarations of DefaultClause로 한다.
  4. 두 번째 CaseClauses가 존재하면, declarations3LexicallyScopedDeclarations of 두 번째 CaseClauses로 한다.
  5. 그렇지 않으면, declarations3을 새로운 빈 리스트로 한다.
  6. list-concatenation of declarations1, declarations2, declarations3를 반환한다.
CaseClauses : CaseClauses CaseClause
  1. declarations1LexicallyScopedDeclarations of CaseClauses로 한다.
  2. declarations2LexicallyScopedDeclarations of CaseClause로 한다.
  3. list-concatenation of declarations1declarations2를 반환한다.
CaseClause : case Expression : StatementListopt
  1. StatementList가 존재하면, LexicallyScopedDeclarations of StatementList를 반환한다.
  2. 새로운 빈 리스트를 반환한다.
DefaultClause : default : StatementListopt
  1. StatementList가 존재하면, LexicallyScopedDeclarations of StatementList를 반환한다.
  2. 새로운 빈 리스트를 반환한다.
LabelledStatement : LabelIdentifier : LabelledItem
  1. LexicallyScopedDeclarations of LabelledItem를 반환한다.
LabelledItem : Statement
  1. 새로운 빈 리스트를 반환한다.
LabelledItem : FunctionDeclaration
  1. « FunctionDeclaration »를 반환한다.
FunctionStatementList : [empty]
  1. 새로운 빈 리스트를 반환한다.
FunctionStatementList : StatementList
  1. TopLevelLexicallyScopedDeclarations of StatementList를 반환한다.
ClassStaticBlockStatementList : [empty]
  1. 새로운 빈 리스트를 반환한다.
ClassStaticBlockStatementList : StatementList
  1. TopLevelLexicallyScopedDeclarations of StatementList를 반환한다.
ConciseBody : ExpressionBody
  1. 새로운 빈 리스트를 반환한다.
AsyncConciseBody : ExpressionBody
  1. 새로운 빈 리스트를 반환한다.
Script : [empty]
  1. 새로운 빈 리스트를 반환한다.
ScriptBody : StatementList
  1. TopLevelLexicallyScopedDeclarations of StatementList를 반환한다.
Module : [empty]
  1. 새로운 빈 리스트를 반환한다.
ModuleItemList : ModuleItemList ModuleItem
  1. declarations1LexicallyScopedDeclarations of ModuleItemList로 한다.
  2. declarations2LexicallyScopedDeclarations of ModuleItem로 한다.
  3. list-concatenation of declarations1declarations2를 반환한다.
ModuleItem : ImportDeclaration
  1. 새로운 빈 리스트를 반환한다.
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement
  1. 새로운 빈 리스트를 반환한다.
ExportDeclaration : export Declaration
  1. 리스트를 반환한다. 유일한 요소는 DeclarationPart of Declaration이다.
ExportDeclaration : export default HoistableDeclaration
  1. 리스트를 반환한다. 유일한 요소는 DeclarationPart of HoistableDeclaration이다.
ExportDeclaration : export default ClassDeclaration
  1. 리스트를 반환한다. 유일한 요소는 ClassDeclaration이다.
ExportDeclaration : export default AssignmentExpression ;
  1. 리스트를 반환한다. 유일한 요소는 이 ExportDeclaration이다.

8.2.6 정적 의미론: VarDeclaredNames

구문 지향 연산 VarDeclaredNames는 인자를 받지 않으며 문자열의 리스트를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:

Statement : EmptyStatement ExpressionStatement ContinueStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement
  1. 새로운 빈 리스트를 반환한다.
Block : { }
  1. 새로운 빈 리스트를 반환한다.
StatementList : StatementList StatementListItem
  1. names1VarDeclaredNames of StatementList로 한다.
  2. names2VarDeclaredNames of StatementListItem로 한다.
  3. list-concatenation of names1names2를 반환한다.
StatementListItem : Declaration
  1. 새로운 빈 리스트를 반환한다.
VariableStatement : var VariableDeclarationList ;
  1. BoundNames of VariableDeclarationList를 반환한다.
IfStatement : if ( Expression ) Statement else Statement
  1. names1VarDeclaredNames of 첫 번째 Statement로 한다.
  2. names2VarDeclaredNames of 두 번째 Statement로 한다.
  3. list-concatenation of names1names2를 반환한다.
IfStatement : if ( Expression ) Statement
  1. VarDeclaredNames of Statement를 반환한다.
DoWhileStatement : do Statement while ( Expression ) ;
  1. VarDeclaredNames of Statement를 반환한다.
WhileStatement : while ( Expression ) Statement
  1. VarDeclaredNames of Statement를 반환한다.
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. VarDeclaredNames of Statement를 반환한다.
ForStatement : for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
  1. names1BoundNames of VariableDeclarationList로 한다.
  2. names2VarDeclaredNames of Statement로 한다.
  3. list-concatenation of names1names2를 반환한다.
ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. VarDeclaredNames of Statement를 반환한다.
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. VarDeclaredNames of Statement를 반환한다.
ForInOfStatement : for ( var ForBinding in Expression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement
  1. names1BoundNames of ForBinding로 한다.
  2. names2VarDeclaredNames of Statement로 한다.
  3. list-concatenation of names1names2를 반환한다.
참고

이 절은 부록 B.3.5에 의해 확장된다.

WithStatement : with ( Expression ) Statement
  1. VarDeclaredNames of Statement를 반환한다.
SwitchStatement : switch ( Expression ) CaseBlock
  1. VarDeclaredNames of CaseBlock를 반환한다.
CaseBlock : { }
  1. 새로운 빈 리스트를 반환한다.
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 첫 번째 CaseClauses가 존재하면, names1VarDeclaredNames of 첫 번째 CaseClauses로 한다.
  2. 그렇지 않으면, names1을 새로운 빈 리스트로 한다.
  3. names2VarDeclaredNames of DefaultClause로 한다.
  4. 두 번째 CaseClauses가 존재하면, names3VarDeclaredNames of 두 번째 CaseClauses로 한다.
  5. 그렇지 않으면, names3을 새로운 빈 리스트로 한다.
  6. list-concatenation of names1, names2, names3를 반환한다.
CaseClauses : CaseClauses CaseClause
  1. names1VarDeclaredNames of CaseClauses로 한다.
  2. names2VarDeclaredNames of CaseClause로 한다.
  3. list-concatenation of names1names2를 반환한다.
CaseClause : case Expression : StatementListopt
  1. StatementList가 존재하면, VarDeclaredNames of StatementList를 반환한다.
  2. 새로운 빈 리스트를 반환한다.
DefaultClause : default : StatementListopt
  1. StatementList가 존재하면, VarDeclaredNames of StatementList를 반환한다.
  2. 새로운 빈 리스트를 반환한다.
LabelledStatement : LabelIdentifier : LabelledItem
  1. VarDeclaredNames of LabelledItem를 반환한다.
LabelledItem : FunctionDeclaration
  1. 새로운 빈 리스트를 반환한다.
TryStatement : try Block Catch
  1. names1VarDeclaredNames of Block로 한다.
  2. names2VarDeclaredNames of Catch로 한다.
  3. list-concatenation of names1names2를 반환한다.
TryStatement : try Block Finally
  1. names1VarDeclaredNames of Block로 한다.
  2. names2VarDeclaredNames of Finally로 한다.
  3. list-concatenation of names1names2를 반환한다.
TryStatement : try Block Catch Finally
  1. names1VarDeclaredNames of Block로 한다.
  2. names2VarDeclaredNames of Catch로 한다.
  3. names3VarDeclaredNames of Finally로 한다.
  4. list-concatenation of names1, names2, names3를 반환한다.
Catch : catch ( CatchParameter ) Block
  1. VarDeclaredNames of Block를 반환한다.
FunctionStatementList : [empty]
  1. 새로운 빈 리스트를 반환한다.
FunctionStatementList : StatementList
  1. TopLevelVarDeclaredNames of StatementList를 반환한다.
ClassStaticBlockStatementList : [empty]
  1. 새로운 빈 리스트를 반환한다.
ClassStaticBlockStatementList : StatementList
  1. TopLevelVarDeclaredNames of StatementList를 반환한다.
ConciseBody : ExpressionBody
  1. 새로운 빈 리스트를 반환한다.
AsyncConciseBody : ExpressionBody
  1. 새로운 빈 리스트를 반환한다.
Script : [empty]
  1. 새로운 빈 리스트를 반환한다.
ScriptBody : StatementList
  1. TopLevelVarDeclaredNames of StatementList를 반환한다.
ModuleItemList : ModuleItemList ModuleItem
  1. names1VarDeclaredNames of ModuleItemList로 한다.
  2. names2VarDeclaredNames of ModuleItem로 한다.
  3. list-concatenation of names1names2를 반환한다.
ModuleItem : ImportDeclaration
  1. 새로운 빈 리스트를 반환한다.
ModuleItem : ExportDeclaration
  1. 만약 ExportDeclarationexport VariableStatement인 경우, BoundNames of ExportDeclaration를 반환한다.
  2. 새로운 빈 리스트를 반환한다.

8.2.7 정적 의미론: VarScopedDeclarations

구문 지향 연산 VarScopedDeclarations는 인자를 받지 않으며 리스트 (파스 노드의 리스트)를 반환한다. 다음 생산 규칙에 대해 조각별로 정의된다:

Statement : EmptyStatement ExpressionStatement ContinueStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement
  1. 새로운 빈 리스트를 반환한다.
Block : { }
  1. 새로운 빈 리스트를 반환한다.
StatementList : StatementList StatementListItem
  1. declarations1VarScopedDeclarations of StatementList로 한다.
  2. declarations2VarScopedDeclarations of StatementListItem로 한다.
  3. list-concatenation of declarations1declarations2를 반환한다.
StatementListItem : Declaration
  1. 새로운 빈 리스트를 반환한다.
VariableDeclarationList : VariableDeclaration
  1. « VariableDeclaration »를 반환한다.
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
  1. declarations1VarScopedDeclarations of VariableDeclarationList로 한다.
  2. list-concatenation of declarations1과 « VariableDeclaration »를 반환한다.
IfStatement : if ( Expression ) Statement else Statement
  1. declarations1VarScopedDeclarations of 첫 번째 Statement로 한다.
  2. declarations2VarScopedDeclarations of 두 번째 Statement로 한다.
  3. list-concatenation of declarations1declarations2를 반환한다.
IfStatement : if ( Expression ) Statement
  1. VarScopedDeclarations of Statement를 반환한다.
DoWhileStatement : do Statement while ( Expression ) ;
  1. VarScopedDeclarations of Statement를 반환한다.
WhileStatement : while ( Expression ) Statement
  1. VarScopedDeclarations of Statement를 반환한다.
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. VarScopedDeclarations of Statement를 반환한다.
ForStatement : for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
  1. declarations1VarScopedDeclarations of VariableDeclarationList로 한다.
  2. declarations2VarScopedDeclarations of Statement로 한다.
  3. list-concatenation of declarations1declarations2를 반환한다.
ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. VarScopedDeclarations of Statement를 반환한다.
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. VarScopedDeclarations of Statement를 반환한다.
ForInOfStatement : for ( var ForBinding in Expression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement
  1. declarations1을(를) « ForBinding »로 둔다.
  2. declarations2을(를) VarScopedDeclarations of Statement로 둔다.
  3. list-concatenation을(를) declarations1declarations2에 대해 반환한다.
참고

이 섹션은 부록 B.3.5에서 확장됩니다.

WithStatement : with ( Expression ) Statement
  1. VarScopedDeclarations of Statement을(를) 반환한다.
SwitchStatement : switch ( Expression ) CaseBlock
  1. VarScopedDeclarations of CaseBlock을(를) 반환한다.
CaseBlock : { }
  1. 새로운 빈 List를 반환한다.
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 첫 번째 CaseClauses가 존재하면, declarations1을(를) 첫 번째 VarScopedDeclarations of CaseClauses로 둔다.
  2. 그렇지 않으면, declarations1을(를) 새로운 빈 List로 둔다.
  3. declarations2을(를) VarScopedDeclarations of DefaultClause로 둔다.
  4. 두 번째 CaseClauses가 존재하면, declarations3을(를) 두 번째 VarScopedDeclarations of CaseClauses로 둔다.
  5. 그렇지 않으면, declarations3을(를) 새로운 빈 List로 둔다.
  6. list-concatenation을(를) declarations1, declarations2, declarations3에 대해 반환한다.
CaseClauses : CaseClauses CaseClause
  1. declarations1을(를) VarScopedDeclarations of CaseClauses로 둔다.
  2. declarations2을(를) VarScopedDeclarations of CaseClause로 둔다.
  3. list-concatenation을(를) declarations1declarations2에 대해 반환한다.
CaseClause : case Expression : StatementListopt
  1. StatementList 가 존재하면, VarScopedDeclarations of StatementList을(를) 반환한다.
  2. 새로운 빈 List를 반환한다.
DefaultClause : default : StatementListopt
  1. StatementList 가 존재하면, VarScopedDeclarations of StatementList을(를) 반환한다.
  2. 새로운 빈 List를 반환한다.
LabelledStatement : LabelIdentifier : LabelledItem
  1. VarScopedDeclarations of LabelledItem을(를) 반환한다.
LabelledItem : FunctionDeclaration
  1. 새로운 빈 List를 반환한다.
TryStatement : try Block Catch
  1. declarations1을(를) VarScopedDeclarations of Block로 둔다.
  2. declarations2을(를) VarScopedDeclarations of Catch로 둔다.
  3. list-concatenation을(를) declarations1declarations2에 대해 반환한다.
TryStatement : try Block Finally
  1. declarations1을(를) VarScopedDeclarations of Block로 둔다.
  2. declarations2을(를) VarScopedDeclarations of Finally로 둔다.
  3. list-concatenation을(를) declarations1declarations2에 대해 반환한다.
TryStatement : try Block Catch Finally
  1. declarations1을(를) VarScopedDeclarations of Block로 둔다.
  2. declarations2을(를) VarScopedDeclarations of Catch로 둔다.
  3. declarations3을(를) VarScopedDeclarations of Finally로 둔다.
  4. list-concatenation을(를) declarations1, declarations2, declarations3에 대해 반환한다.
Catch : catch ( CatchParameter ) Block
  1. VarScopedDeclarations of Block을(를) 반환한다.
FunctionStatementList : [empty]
  1. 새로운 빈 List를 반환한다.
FunctionStatementList : StatementList
  1. TopLevelVarScopedDeclarations of StatementList를 반환한다.
ClassStaticBlockStatementList : [empty]
  1. 새로운 빈 List를 반환한다.
ClassStaticBlockStatementList : StatementList
  1. TopLevelVarScopedDeclarations of StatementList를 반환한다.
ConciseBody : ExpressionBody
  1. 새로운 빈 List를 반환한다.
AsyncConciseBody : ExpressionBody
  1. 새로운 빈 List를 반환한다.
Script : [empty]
  1. 새로운 빈 List를 반환한다.
ScriptBody : StatementList
  1. TopLevelVarScopedDeclarations of StatementList를 반환한다.
Module : [empty]
  1. 새로운 빈 List를 반환한다.
ModuleItemList : ModuleItemList ModuleItem
  1. declarations1을(를) VarScopedDeclarations of ModuleItemList로 둔다.
  2. declarations2을(를) VarScopedDeclarations of ModuleItem로 둔다.
  3. list-concatenation을(를) declarations1declarations2에 대해 반환한다.
ModuleItem : ImportDeclaration
  1. 새로운 빈 List를 반환한다.
ModuleItem : ExportDeclaration
  1. ExportDeclaration이(가) export VariableStatement라면, VarScopedDeclarations of VariableStatement을(를) 반환한다.
  2. 새로운 빈 List를 반환한다.

8.2.8 정적 의미론: TopLevelLexicallyDeclaredNames

구문 지시 연산 TopLevelLexicallyDeclaredNames는 인자가 없으며 문자열의 List를 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:

StatementList : StatementList StatementListItem
  1. names1TopLevelLexicallyDeclaredNames of StatementList로 둔다.
  2. names2TopLevelLexicallyDeclaredNames of StatementListItem로 둔다.
  3. list-concatenationnames1names2에 대해 반환한다.
StatementListItem : Statement
  1. 새 빈 List를 반환한다.
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration 라면,
    1. 새 빈 List를 반환한다.
  2. BoundNames of Declaration를 반환한다.
참고

함수나 스크립트의 최상위 레벨에서는 함수 선언이 렉시컬 선언이 아닌 var 선언처럼 취급된다.

8.2.9 정적 의미론: TopLevelLexicallyScopedDeclarations

구문 지시 연산 TopLevelLexicallyScopedDeclarations는 인자가 없으며 List구문 노드를 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:

StatementList : StatementList StatementListItem
  1. declarations1TopLevelLexicallyScopedDeclarations of StatementList로 둔다.
  2. declarations2TopLevelLexicallyScopedDeclarations of StatementListItem로 둔다.
  3. list-concatenationdeclarations1declarations2에 대해 반환한다.
StatementListItem : Statement
  1. 새 빈 List를 반환한다.
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration 라면,
    1. 새 빈 List를 반환한다.
  2. « Declaration »를 반환한다.

8.2.10 정적 의미론: TopLevelVarDeclaredNames

구문 지시 연산 TopLevelVarDeclaredNames는 인자가 없으며 문자열의 List를 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:

StatementList : StatementList StatementListItem
  1. names1TopLevelVarDeclaredNames of StatementList로 둔다.
  2. names2TopLevelVarDeclaredNames of StatementListItem로 둔다.
  3. list-concatenationnames1names2에 대해 반환한다.
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration 라면,
    1. BoundNames of HoistableDeclaration를 반환한다.
  2. 새 빈 List를 반환한다.
StatementListItem : Statement
  1. Statement Statement : LabelledStatement 라면, TopLevelVarDeclaredNames of Statement를 반환한다.
  2. VarDeclaredNames of Statement를 반환한다.
참고

함수 또는 스크립트의 최상위 레벨에서 내부 함수 선언은 var 선언으로 취급된다.

LabelledStatement : LabelIdentifier : LabelledItem
  1. TopLevelVarDeclaredNames of LabelledItem를 반환한다.
LabelledItem : Statement
  1. Statement Statement : LabelledStatement 라면, TopLevelVarDeclaredNames of Statement를 반환한다.
  2. VarDeclaredNames of Statement를 반환한다.
LabelledItem : FunctionDeclaration
  1. BoundNames of FunctionDeclaration를 반환한다.

8.2.11 정적 의미론: TopLevelVarScopedDeclarations

구문 지시 연산 TopLevelVarScopedDeclarations는 인자를 받지 않고 List파스 노드를 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:

StatementList : StatementList StatementListItem
  1. declarations1TopLevelVarScopedDeclarations of StatementList로 둔다.
  2. declarations2TopLevelVarScopedDeclarations of StatementListItem로 둔다.
  3. list-concatenationdeclarations1declarations2에 대해 반환한다.
StatementListItem : Statement
  1. Statement Statement : LabelledStatement 라면, TopLevelVarScopedDeclarations of Statement를 반환한다.
  2. VarScopedDeclarations of Statement를 반환한다.
StatementListItem : Declaration
  1. Declaration Declaration : HoistableDeclaration 라면,
    1. declarationDeclarationPart of HoistableDeclaration로 둔다.
    2. « declaration »를 반환한다.
  2. 새 빈 List를 반환한다.
LabelledStatement : LabelIdentifier : LabelledItem
  1. TopLevelVarScopedDeclarations of LabelledItem를 반환한다.
LabelledItem : Statement
  1. Statement Statement : LabelledStatement 라면, TopLevelVarScopedDeclarations of Statement를 반환한다.
  2. VarScopedDeclarations of Statement를 반환한다.
LabelledItem : FunctionDeclaration
  1. « FunctionDeclaration »를 반환한다.

8.3 레이블

8.3.1 정적 의미론: ContainsDuplicateLabels

구문 지시 연산 ContainsDuplicateLabels는 labelSet (문자열의 List) 인자를 받고, Boolean을 반환한다. 이는 다음 생성 규칙에 대해 조각별로 정의된다:

Statement : VariableStatement EmptyStatement ExpressionStatement ContinueStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement Block : { } StatementListItem : Declaration
  1. false를 반환한다.
StatementList : StatementList StatementListItem
  1. hasDuplicatesContainsDuplicateLabels of StatementList (인자 labelSet)로 둔다.
  2. 만약 hasDuplicatestrue라면, true를 반환한다.
  3. ContainsDuplicateLabels of StatementListItem (인자 labelSet)를 반환한다.
IfStatement : if ( Expression ) Statement else Statement
  1. hasDuplicateContainsDuplicateLabels of 첫 번째 Statement (인자 labelSet)로 둔다.
  2. 만약 hasDuplicatetrue라면, true를 반환한다.
  3. 두 번째 ContainsDuplicateLabels of Statement (인자 labelSet)를 반환한다.
IfStatement : if ( Expression ) Statement
  1. ContainsDuplicateLabels of Statement (인자 labelSet)를 반환한다.
DoWhileStatement : do Statement while ( Expression ) ;
  1. ContainsDuplicateLabels of Statement (인자 labelSet)를 반환한다.
WhileStatement : while ( Expression ) Statement
  1. ContainsDuplicateLabels of Statement (인자 labelSet)를 반환한다.
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. ContainsDuplicateLabels of Statement (인자 labelSet)를 반환한다.
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. ContainsDuplicateLabels of Statement (인자 labelSet)를 반환한다.
참고

이 섹션은 부록 B.3.5에서 확장된다.

WithStatement : with ( Expression ) Statement
  1. ContainsDuplicateLabels of Statement (인자 labelSet)를 반환한다.
SwitchStatement : switch ( Expression ) CaseBlock
  1. ContainsDuplicateLabels of CaseBlock (인자 labelSet)를 반환한다.
CaseBlock : { }
  1. false를 반환한다.
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 첫 번째 CaseClauses가 존재하면,
    1. 첫 번째 ContainsDuplicateLabels of CaseClauses (인자 labelSet)가 true라면, true를 반환한다.
  2. ContainsDuplicateLabels of DefaultClause (인자 labelSet)가 true라면, true를 반환한다.
  3. 두 번째 CaseClauses가 존재하지 않으면, false를 반환한다.
  4. 두 번째 ContainsDuplicateLabels of CaseClauses (인자 labelSet)를 반환한다.
CaseClauses : CaseClauses CaseClause
  1. hasDuplicatesContainsDuplicateLabels of CaseClauses (인자 labelSet)로 둔다.
  2. hasDuplicatestrue라면, true를 반환한다.
  3. ContainsDuplicateLabels of CaseClause (인자 labelSet)를 반환한다.
CaseClause : case Expression : StatementListopt
  1. StatementList가 존재하면, ContainsDuplicateLabels of StatementList (인자 labelSet)를 반환한다.
  2. false를 반환한다.
DefaultClause : default : StatementListopt
  1. StatementList가 존재하면, ContainsDuplicateLabels of StatementList (인자 labelSet)를 반환한다.
  2. false를 반환한다.
LabelledStatement : LabelIdentifier : LabelledItem
  1. labelStringValue of LabelIdentifier로 둔다.
  2. labelSetlabel이 포함되어 있으면, true를 반환한다.
  3. newLabelSetlist-concatenation of labelSet 및 « label »로 둔다.
  4. ContainsDuplicateLabels of LabelledItem (인자 newLabelSet)를 반환한다.
LabelledItem : FunctionDeclaration
  1. false를 반환한다.
TryStatement : try Block Catch
  1. hasDuplicatesContainsDuplicateLabels of Block (인자 labelSet)로 둔다.
  2. hasDuplicatestrue라면, true를 반환한다.
  3. ContainsDuplicateLabels of Catch (인자 labelSet)를 반환한다.
TryStatement : try Block Finally
  1. hasDuplicatesContainsDuplicateLabels of Block (인자 labelSet)로 둔다.
  2. hasDuplicatestrue라면, true를 반환한다.
  3. ContainsDuplicateLabels of Finally (인자 labelSet)를 반환한다.
TryStatement : try Block Catch Finally
  1. ContainsDuplicateLabels of Block (인자 labelSet)가 true라면, true를 반환한다.
  2. ContainsDuplicateLabels of Catch (인자 labelSet)가 true라면, true를 반환한다.
  3. ContainsDuplicateLabels of Finally (인자 labelSet)를 반환한다.
Catch : catch ( CatchParameter ) Block
  1. ContainsDuplicateLabels of Block (인자 labelSet)를 반환한다.
FunctionStatementList : [empty]
  1. false를 반환한다.
ClassStaticBlockStatementList : [empty]
  1. false를 반환한다.
ModuleItemList : ModuleItemList ModuleItem
  1. hasDuplicatesContainsDuplicateLabels of ModuleItemList (인자 labelSet)로 둔다.
  2. hasDuplicatestrue라면, true를 반환한다.
  3. ContainsDuplicateLabels of ModuleItem (인자 labelSet)를 반환한다.
ModuleItem : ImportDeclaration ExportDeclaration
  1. false를 반환한다.

8.3.2 정적 의미론: ContainsUndefinedBreakTarget

구문 지향 연산 ContainsUndefinedBreakTarget는 labelSet (문자열의 List) 인수를 받고 불리언을 반환한다. 다음 생성 규칙들에 대해 조각별로 정의된다:

Statement : VariableStatement EmptyStatement ExpressionStatement ContinueStatement ReturnStatement ThrowStatement DebuggerStatement Block : { } StatementListItem : Declaration
  1. false를 반환한다.
StatementList : StatementList StatementListItem
  1. hasUndefinedLabelsContainsUndefinedBreakTarget (StatementList, labelSet 인수)로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. ContainsUndefinedBreakTarget (StatementListItem, labelSet 인수)를 반환한다.
IfStatement : if ( Expression ) Statement else Statement
  1. hasUndefinedLabels를 첫 번째 StatementlabelSet 인수로 ContainsUndefinedBreakTarget의 결과로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. 두 번째 StatementlabelSet 인수로 ContainsUndefinedBreakTarget의 결과를 반환한다.
IfStatement : if ( Expression ) Statement
  1. ContainsUndefinedBreakTarget (Statement, labelSet 인수)를 반환한다.
DoWhileStatement : do Statement while ( Expression ) ;
  1. ContainsUndefinedBreakTarget (Statement, labelSet 인수)를 반환한다.
WhileStatement : while ( Expression ) Statement
  1. ContainsUndefinedBreakTarget (Statement, labelSet 인수)를 반환한다.
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. ContainsUndefinedBreakTarget (Statement, labelSet 인수)를 반환한다.
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. ContainsUndefinedBreakTarget (Statement, labelSet 인수)를 반환한다.
참고

이 절은 부록 B.3.5에 의해 확장된다.

BreakStatement : break ;
  1. false를 반환한다.
BreakStatement : break LabelIdentifier ;
  1. labelSetStringValue (LabelIdentifier)가 포함되어 있지 않으면 true를 반환한다.
  2. false를 반환한다.
WithStatement : with ( Expression ) Statement
  1. ContainsUndefinedBreakTarget (Statement, labelSet 인수)를 반환한다.
SwitchStatement : switch ( Expression ) CaseBlock
  1. ContainsUndefinedBreakTarget (CaseBlock, labelSet 인수)를 반환한다.
CaseBlock : { }
  1. false를 반환한다.
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 첫 번째 CaseClauses가 있으면,
    1. 첫 번째 CaseClauseslabelSet 인수로 ContainsUndefinedBreakTarget의 결과가 true이면 true를 반환한다.
  2. DefaultClauselabelSet 인수로 ContainsUndefinedBreakTarget의 결과가 true이면 true를 반환한다.
  3. 두 번째 CaseClauses가 없으면 false를 반환한다.
  4. 두 번째 CaseClauseslabelSet 인수로 ContainsUndefinedBreakTarget의 결과를 반환한다.
CaseClauses : CaseClauses CaseClause
  1. hasUndefinedLabelsContainsUndefinedBreakTarget (CaseClauses, labelSet 인수)로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. ContainsUndefinedBreakTarget (CaseClause, labelSet 인수)를 반환한다.
CaseClause : case Expression : StatementListopt
  1. StatementList가 있으면 ContainsUndefinedBreakTarget (StatementList, labelSet 인수)를 반환한다.
  2. false를 반환한다.
DefaultClause : default : StatementListopt
  1. StatementList가 있으면 ContainsUndefinedBreakTarget (StatementList, labelSet 인수)를 반환한다.
  2. false를 반환한다.
LabelledStatement : LabelIdentifier : LabelledItem
  1. labelStringValue(LabelIdentifier)로 한다.
  2. newLabelSetlist-concatenation(labelSet, « label  »)로 한다.
  3. ContainsUndefinedBreakTarget (LabelledItem, newLabelSet 인수)를 반환한다.
LabelledItem : FunctionDeclaration
  1. false를 반환한다.
TryStatement : try Block Catch
  1. hasUndefinedLabelsContainsUndefinedBreakTarget (Block, labelSet 인수)로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. ContainsUndefinedBreakTarget (Catch, labelSet 인수)를 반환한다.
TryStatement : try Block Finally
  1. hasUndefinedLabelsContainsUndefinedBreakTarget (Block, labelSet 인수)로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. ContainsUndefinedBreakTarget (Finally, labelSet 인수)를 반환한다.
TryStatement : try Block Catch Finally
  1. ContainsUndefinedBreakTarget (Block, labelSet 인수)가 true이면 true를 반환한다.
  2. ContainsUndefinedBreakTarget (Catch, labelSet 인수)가 true이면 true를 반환한다.
  3. ContainsUndefinedBreakTarget (Finally, labelSet 인수)를 반환한다.
Catch : catch ( CatchParameter ) Block
  1. ContainsUndefinedBreakTarget (Block, labelSet 인수)를 반환한다.
FunctionStatementList : [empty]
  1. false를 반환한다.
ClassStaticBlockStatementList : [empty]
  1. false를 반환한다.
ModuleItemList : ModuleItemList ModuleItem
  1. hasUndefinedLabelsContainsUndefinedBreakTarget (ModuleItemList, labelSet 인수)로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. ContainsUndefinedBreakTarget (ModuleItem, labelSet 인수)를 반환한다.
ModuleItem : ImportDeclaration ExportDeclaration
  1. false를 반환한다.

8.3.3 정적 의미론: ContainsUndefinedContinueTarget

구문 지향 연산 ContainsUndefinedContinueTarget는 iterationSet (문자열의 List), labelSet (문자열의 List) 인수를 받고 불리언을 반환한다. 다음 생성 규칙들에 대해 조각별로 정의된다:

Statement : VariableStatement EmptyStatement ExpressionStatement BreakStatement ReturnStatement ThrowStatement DebuggerStatement Block : { } StatementListItem : Declaration
  1. false를 반환한다.
Statement : BlockStatement
  1. ContainsUndefinedContinueTarget (BlockStatement, iterationSet, « »)의 결과를 반환한다.
BreakableStatement : IterationStatement
  1. newIterationSetlist-concatenation(iterationSet, labelSet)로 한다.
  2. ContainsUndefinedContinueTarget (IterationStatement, newIterationSet, « »)의 결과를 반환한다.
StatementList : StatementList StatementListItem
  1. hasUndefinedLabelsContainsUndefinedContinueTarget (StatementList, iterationSet, « »)의 결과로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. ContainsUndefinedContinueTarget (StatementListItem, iterationSet, « »)의 결과를 반환한다.
IfStatement : if ( Expression ) Statement else Statement
  1. hasUndefinedLabels를 첫 번째 StatementiterationSet, « » 인수로 ContainsUndefinedContinueTarget의 결과로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. 두 번째 StatementiterationSet, « » 인수로 ContainsUndefinedContinueTarget의 결과를 반환한다.
IfStatement : if ( Expression ) Statement
  1. ContainsUndefinedContinueTarget (Statement, iterationSet, « »)의 결과를 반환한다.
DoWhileStatement : do Statement while ( Expression ) ;
  1. ContainsUndefinedContinueTarget (Statement, iterationSet, « »)의 결과를 반환한다.
WhileStatement : while ( Expression ) Statement
  1. ContainsUndefinedContinueTarget (Statement, iterationSet, « »)의 결과를 반환한다.
ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. ContainsUndefinedContinueTarget (Statement, iterationSet, « »)의 결과를 반환한다.
ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement
  1. ContainsUndefinedContinueTarget (Statement, iterationSet, « »)의 결과를 반환한다.
참고

이 절은 부록 B.3.5에 의해 확장된다.

ContinueStatement : continue ;
  1. false를 반환한다.
ContinueStatement : continue LabelIdentifier ;
  1. iterationSetStringValue(LabelIdentifier)가 포함되어 있지 않으면 true를 반환한다.
  2. false를 반환한다.
WithStatement : with ( Expression ) Statement
  1. ContainsUndefinedContinueTarget (Statement, iterationSet, « »)의 결과를 반환한다.
SwitchStatement : switch ( Expression ) CaseBlock
  1. ContainsUndefinedContinueTarget (CaseBlock, iterationSet, « »)의 결과를 반환한다.
CaseBlock : { }
  1. false를 반환한다.
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. 첫 번째 CaseClauses가 있으면,
    1. 첫 번째 CaseClausesiterationSet, « » 인수로 ContainsUndefinedContinueTarget의 결과가 true이면 true를 반환한다.
  2. DefaultClauseiterationSet, « » 인수로 ContainsUndefinedContinueTarget의 결과가 true이면 true를 반환한다.
  3. 두 번째 CaseClauses가 없으면 false를 반환한다.
  4. 두 번째 CaseClausesiterationSet, « » 인수로 ContainsUndefinedContinueTarget의 결과를 반환한다.
CaseClauses : CaseClauses CaseClause
  1. hasUndefinedLabelsContainsUndefinedContinueTarget (CaseClauses, iterationSet, « »)의 결과로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. ContainsUndefinedContinueTarget (CaseClause, iterationSet, « »)의 결과를 반환한다.
CaseClause : case Expression : StatementListopt
  1. StatementList가 있으면 ContainsUndefinedContinueTarget (StatementList, iterationSet, « »)의 결과를 반환한다.
  2. false를 반환한다.
DefaultClause : default : StatementListopt
  1. StatementList가 있으면 ContainsUndefinedContinueTarget (StatementList, iterationSet, « »)의 결과를 반환한다.
  2. false를 반환한다.
LabelledStatement : LabelIdentifier : LabelledItem
  1. labelStringValue(LabelIdentifier)로 한다.
  2. newLabelSetlist-concatenation(labelSet, « label  »)로 한다.
  3. ContainsUndefinedContinueTarget (LabelledItem, iterationSet, newLabelSet)의 결과를 반환한다.
LabelledItem : FunctionDeclaration
  1. false를 반환한다.
TryStatement : try Block Catch
  1. hasUndefinedLabelsContainsUndefinedContinueTarget (Block, iterationSet, « »)의 결과로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. ContainsUndefinedContinueTarget (Catch, iterationSet, « »)의 결과를 반환한다.
TryStatement : try Block Finally
  1. hasUndefinedLabelsContainsUndefinedContinueTarget (Block, iterationSet, « »)의 결과로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. ContainsUndefinedContinueTarget (Finally, iterationSet, « »)의 결과를 반환한다.
TryStatement : try Block Catch Finally
  1. ContainsUndefinedContinueTarget (Block, iterationSet, « »)의 결과가 true이면 true를 반환한다.
  2. ContainsUndefinedContinueTarget (Catch, iterationSet, « »)의 결과가 true이면 true를 반환한다.
  3. ContainsUndefinedContinueTarget (Finally, iterationSet, « »)의 결과를 반환한다.
Catch : catch ( CatchParameter ) Block
  1. ContainsUndefinedContinueTarget (Block, iterationSet, « »)의 결과를 반환한다.
FunctionStatementList : [empty]
  1. false를 반환한다.
ClassStaticBlockStatementList : [empty]
  1. false를 반환한다.
ModuleItemList : ModuleItemList ModuleItem
  1. hasUndefinedLabelsContainsUndefinedContinueTarget (ModuleItemList, iterationSet, « »)의 결과로 한다.
  2. hasUndefinedLabelstrue이면, true를 반환한다.
  3. ContainsUndefinedContinueTarget (ModuleItem, iterationSet, « »)의 결과를 반환한다.
ModuleItem : ImportDeclaration ExportDeclaration
  1. false를 반환한다.

8.4 함수 이름 추론

8.4.1 정적 의미론: HasName

구문 지향 연산 HasName은 인수를 받지 않으며 불리언을 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprParenthesizedExpression로 한다. 이는 CoverCoverParenthesizedExpressionAndArrowParameterList이다.
  2. IsFunctionDefinitionexpr 값이 false이면, false를 반환한다.
  3. expr에 대한 HasName의 값을 반환한다.
FunctionExpression : function ( FormalParameters ) { FunctionBody } GeneratorExpression : function * ( FormalParameters ) { GeneratorBody } AsyncGeneratorExpression : async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionExpression : async function ( FormalParameters ) { AsyncFunctionBody } ArrowFunction : ArrowParameters => ConciseBody AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody ClassExpression : class ClassTail
  1. false를 반환한다.
FunctionExpression : function BindingIdentifier ( FormalParameters ) { FunctionBody } GeneratorExpression : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionExpression : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } ClassExpression : class BindingIdentifier ClassTail
  1. true를 반환한다.

8.4.2 정적 의미론: IsFunctionDefinition

구문 지향 연산 IsFunctionDefinition은 인수를 받지 않으며 불리언을 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprParenthesizedExpression로 한다. 이는 CoverCoverParenthesizedExpressionAndArrowParameterList이다.
  2. expr에 대한 IsFunctionDefinition 값을 반환한다.
PrimaryExpression : this IdentifierReference Literal ArrayLiteral ObjectLiteral RegularExpressionLiteral TemplateLiteral MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName MemberExpression TemplateLiteral SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier NewExpression : new NewExpression LeftHandSideExpression : CallExpression OptionalExpression UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- ++ UnaryExpression -- UnaryExpression UnaryExpression : delete UnaryExpression void UnaryExpression typeof UnaryExpression + UnaryExpression - UnaryExpression ~ UnaryExpression ! UnaryExpression AwaitExpression ExponentiationExpression : UpdateExpression ** ExponentiationExpression MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression AdditiveExpression : AdditiveExpression + MultiplicativeExpression AdditiveExpression - MultiplicativeExpression ShiftExpression : ShiftExpression << AdditiveExpression ShiftExpression >> AdditiveExpression ShiftExpression >>> AdditiveExpression RelationalExpression : RelationalExpression < ShiftExpression RelationalExpression > ShiftExpression RelationalExpression <= ShiftExpression RelationalExpression >= ShiftExpression RelationalExpression instanceof ShiftExpression RelationalExpression in ShiftExpression PrivateIdentifier in ShiftExpression EqualityExpression : EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression BitwiseANDExpression : BitwiseANDExpression & EqualityExpression BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression LogicalANDExpression : LogicalANDExpression && BitwiseORExpression LogicalORExpression : LogicalORExpression || LogicalANDExpression CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression AssignmentExpression : YieldExpression LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression Expression : Expression , AssignmentExpression
  1. false를 반환한다.
AssignmentExpression : ArrowFunction AsyncArrowFunction FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody } GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody } ClassExpression : class BindingIdentifieropt ClassTail
  1. true를 반환한다.

8.4.3 정적 의미론: IsAnonymousFunctionDefinition ( expr )

추상 연산 IsAnonymousFunctionDefinition은 expr ( AssignmentExpression 파스 노드, Initializer 파스 노드, 또는 Expression 파스 노드 ) 인수를 받고 불리언을 반환한다. 이 연산은 인수가 이름을 바인딩하지 않는 함수 정의인지 판별한다. 호출 시 다음 단계를 수행한다:

  1. IsFunctionDefinition (expr)이 false이면, false를 반환한다.
  2. hasNameHasName(expr)로 한다.
  3. hasNametrue이면, false를 반환한다.
  4. true를 반환한다.

8.4.4 정적 의미론: IsIdentifierRef

구문 지향 연산 IsIdentifierRef는 인수를 받지 않으며 불리언을 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:

PrimaryExpression : IdentifierReference
  1. true를 반환한다.
PrimaryExpression : this Literal ArrayLiteral ObjectLiteral FunctionExpression ClassExpression GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral CoverParenthesizedExpressionAndArrowParameterList MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName MemberExpression TemplateLiteral SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier NewExpression : new NewExpression LeftHandSideExpression : CallExpression OptionalExpression
  1. false를 반환한다.

8.4.5 실행 의미론: NamedEvaluation

구문 지향 연산 NamedEvaluation은 name ( 프로퍼티 키 또는 Private Name) 인수를 받고 정상 완료 값을 포함한 함수 객체 또는 급작스런 완료를 반환한다. 다음 생성 규칙에 대해 조각별로 정의된다:

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprParenthesizedExpression로 한다. 이는 CoverCoverParenthesizedExpressionAndArrowParameterList이다.
  2. NamedEvaluation(expr, name)의 결과를 반환한다.
ParenthesizedExpression : ( Expression )
  1. Assert: IsAnonymousFunctionDefinition(Expression)이 true이다.
  2. NamedEvaluation(Expression, name)의 결과를 반환한다.
FunctionExpression : function ( FormalParameters ) { FunctionBody }
  1. InstantiateOrdinaryFunctionExpression (FunctionExpression, name)의 결과를 반환한다.
GeneratorExpression : function * ( FormalParameters ) { GeneratorBody }
  1. InstantiateGeneratorFunctionExpression (GeneratorExpression, name)의 결과를 반환한다.
AsyncGeneratorExpression : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. InstantiateAsyncGeneratorFunctionExpression (AsyncGeneratorExpression, name)의 결과를 반환한다.
AsyncFunctionExpression : async function ( FormalParameters ) { AsyncFunctionBody }
  1. InstantiateAsyncFunctionExpression (AsyncFunctionExpression, name)의 결과를 반환한다.
ArrowFunction : ArrowParameters => ConciseBody
  1. InstantiateArrowFunctionExpression (ArrowFunction, name)의 결과를 반환한다.
AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. InstantiateAsyncArrowFunctionExpression (AsyncArrowFunction, name)의 결과를 반환한다.
ClassExpression : class ClassTail
  1. value를 ? ClassDefinitionEvaluation(ClassTail, undefined, name)의 결과로 한다.
  2. value.[[SourceText]]source text matched by ClassExpression로 설정한다.
  3. value를 반환한다.

8.5 포함(Contains)

8.5.1 정적 의미: 포함(Contains)

구문 지향 연산 Contains는 symbol (문법 심볼)을 인자로 받아 Boolean을 반환한다.

아래에 명시되지 않은 이 명세의 모든 문법 생성 alternative는 암묵적으로 다음과 같은 기본 Contains 정의를 가진다:

  1. 파스 노드(Parse Node)의 각 자식 노드 child에 대해, 다음을 수행한다:
    1. childsymbol의 인스턴스라면, true를 반환한다.
    2. child가 비단말(nonterminal)의 인스턴스라면,
      1. containedchild Contains symbol의 결과로 둔다.
      2. containedtrue이면 true를 반환한다.
  2. false를 반환한다.
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody } FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody } GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody } GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody } AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody } AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }
  1. false를 반환한다.
참고 1

하위 구조에 의존하는 정적 의미 규칙들은 일반적으로 함수 정의 내부를 들여다보지 않는다.

ClassTail : ClassHeritageopt { ClassBody }
  1. symbolClassBody라면, true를 반환한다.
  2. symbolClassHeritage라면, 다음을 수행한다:
    1. ClassHeritage가 존재하면 true를, 그렇지 않으면 false를 반환한다.
  3. ClassHeritage가 존재하면, 다음을 수행한다:
    1. ClassHeritage Contains symboltrue라면 true를 반환한다.
  4. ClassBodyComputedPropertyContains 결과를 symbol 인자로 반환한다.
참고 2

하위 구조에 의존하는 정적 의미 규칙들은 일반적으로 PropertyName을 제외하고 클래스 바디 내부를 들여다보지 않는다.

ClassStaticBlock : static { ClassStaticBlockBody }
  1. false를 반환한다.
참고 3

하위 구조에 의존하는 정적 의미 규칙들은 static 초기화 블록 내부를 일반적으로 들여다보지 않는다.

ArrowFunction : ArrowParameters => ConciseBody
  1. symbolNewTarget, SuperProperty, SuperCall, super, 또는 this 중 하나가 아니라면 false를 반환한다.
  2. ArrowParameters Contains symboltrue라면, true를 반환한다.
  3. ConciseBody Contains symbol의 결과를 반환한다.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsArrowFormalParameters로 두는데, 이는 coveredCoverParenthesizedExpressionAndArrowParameterList에서 나온다.
  2. formals Contains symbol의 결과를 반환한다.
AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody
  1. symbolNewTarget, SuperProperty, SuperCall, super, 또는 this 중 하나가 아니라면 false를 반환한다.
  2. AsyncConciseBody Contains symbol의 결과를 반환한다.
AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. symbolNewTarget, SuperProperty, SuperCall, super, 또는 this 중 하나가 아니라면 false를 반환한다.
  2. headAsyncArrowHead로 두는데, 이는 coveredCoverCallExpressionAndAsyncArrowHead에서 나온다.
  3. head Contains symboltrue라면, true를 반환한다.
  4. AsyncConciseBody Contains symbol의 결과를 반환한다.
참고 4

Contains는 ArrowFunction 또는 AsyncArrowFunction 내에서 new.target, this, super 사용을 감지하는 데 사용된다.

PropertyDefinition : MethodDefinition
  1. symbolMethodDefinition라면 true를 반환한다.
  2. MethodDefinitionComputedPropertyContains 결과를 symbol 인자로 반환한다.
LiteralPropertyName : IdentifierName
  1. false를 반환한다.
MemberExpression : MemberExpression . IdentifierName
  1. MemberExpression Contains symboltrue라면, true를 반환한다.
  2. false를 반환한다.
SuperProperty : super . IdentifierName
  1. symbolReservedWord super라면 true를 반환한다.
  2. false를 반환한다.
CallExpression : CallExpression . IdentifierName
  1. CallExpression Contains symboltrue라면, true를 반환한다.
  2. false를 반환한다.
OptionalChain : ?. IdentifierName
  1. false를 반환한다.
OptionalChain : OptionalChain . IdentifierName
  1. OptionalChain Contains symboltrue라면, true를 반환한다.
  2. false를 반환한다.

8.5.2 정적 의미: ComputedPropertyContains

구문 지향 연산 ComputedPropertyContains는 symbol (문법 심볼)을 인자로 받아 Boolean을 반환한다. 이 연산은 아래의 생성 규칙들에 대해 부분적으로 정의된다.

ClassElementName : PrivateIdentifier PropertyName : LiteralPropertyName
  1. false를 반환한다.
PropertyName : ComputedPropertyName
  1. ComputedPropertyName Contains symbol의 결과를 반환한다.
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. ClassElementNameComputedPropertyContains 결과를 symbol 인자로 반환한다.
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. ClassElementNameComputedPropertyContains 결과를 symbol 인자로 반환한다.
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. ClassElementNameComputedPropertyContains 결과를 symbol 인자로 반환한다.
ClassElementList : ClassElementList ClassElement
  1. inListClassElementListComputedPropertyContains 결과로 symbol 인자를 사용하여 구한다.
  2. inListtrue라면, true를 반환한다.
  3. ClassElementComputedPropertyContains 결과를 symbol 인자로 반환한다.
ClassElement : ClassStaticBlock
  1. false를 반환한다.
ClassElement : ;
  1. false를 반환한다.
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. ClassElementNameComputedPropertyContains 결과를 symbol 인자로 반환한다.
FieldDefinition : ClassElementName Initializeropt
  1. ClassElementNameComputedPropertyContains 결과를 symbol 인자로 반환한다.

8.6 기타

이 연산들은 명세 전반의 여러 곳에서 사용됩니다.

8.6.1 런타임 의미론: InstantiateFunctionObject

구문 지시 연산 InstantiateFunctionObject는 env (Environment Record)와 privateEnv (PrivateEnvironment Record 또는 null) 인자를 받고, ECMAScript 함수 객체를 반환합니다. 이는 다음 생성 규칙에 따라 부분적으로 정의됩니다:

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody }
  1. InstantiateOrdinaryFunctionObjectFunctionDeclaration에 대해 envprivateEnv 인자를 넣어 호출한 결과를 반환한다.
GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody }
  1. InstantiateGeneratorFunctionObjectGeneratorDeclaration에 대해 envprivateEnv 인자를 넣어 호출한 결과를 반환한다.
AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. InstantiateAsyncGeneratorFunctionObjectAsyncGeneratorDeclaration 에 대해 envprivateEnv 인자를 넣어 호출한 결과를 반환한다.
AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody }
  1. InstantiateAsyncFunctionObjectAsyncFunctionDeclaration에 대해 envprivateEnv 인자를 넣어 호출한 결과를 반환한다.

8.6.2 런타임 의미론: BindingInitialization

구문 지시 연산 BindingInitialization은 value (ECMAScript 언어 값)과 environment (Environment Record 또는 undefined) 인자를 받고, unused를 포함하는 정상 완료 또는 비정상 완료 중 하나를 반환한다.

참고

environmentundefined가 전달되는 것은 초기화 값을 할당할 때 PutValue 연산을 사용해야 함을 나타낸다. 이는 var 문과 일부 비엄격 함수의 명시적 매개변수 목록(자세한 내용은 10.2.11 참고)에 해당한다. 이런 경우 렉시컬 바인딩이 호이스팅되고, 초기화식이 평가되기 전에 미리 초기화된다.

다음 생성 규칙에 따라 부분적으로 정의된다:

BindingIdentifier : Identifier
  1. nameStringValue of Identifier로 둔다.
  2. InitializeBoundName(name, value, environment)를 반환한다.
BindingIdentifier : yield
  1. InitializeBoundName("yield", value, environment)를 반환한다.
BindingIdentifier : await
  1. InitializeBoundName("await", value, environment)를 반환한다.
BindingPattern : ObjectBindingPattern
  1. RequireObjectCoercible(value)를 수행한다.
  2. BindingInitialization of ObjectBindingPatternvalue, environment 인자로 호출한 결과를 반환한다.
BindingPattern : ArrayBindingPattern
  1. iteratorRecord를 ? GetIterator(value, sync)로 둔다.
  2. resultCompletion(IteratorBindingInitialization of ArrayBindingPatterniteratorRecord, environment 인자로 호출)로 둔다.
  3. 만약 iteratorRecord.[[Done]]false라면, ? IteratorClose(iteratorRecord, result)를 반환한다.
  4. result를 반환한다.
ObjectBindingPattern : { }
  1. unused를 반환한다.
ObjectBindingPattern : { BindingPropertyList } { BindingPropertyList , }
  1. PropertyBindingInitialization of BindingPropertyListvalue, environment 인자로 호출한다.
  2. unused를 반환한다.
ObjectBindingPattern : { BindingRestProperty }
  1. excludedNames를 새로운 빈 List로 둔다.
  2. RestBindingInitialization of BindingRestPropertyvalue, environment, excludedNames 인자로 호출한 결과를 반환한다.
ObjectBindingPattern : { BindingPropertyList , BindingRestProperty }
  1. excludedNames를 ? PropertyBindingInitialization of BindingPropertyListvalue, environment 인자로 호출한 결과로 둔다.
  2. RestBindingInitialization of BindingRestPropertyvalue, environment, excludedNames 인자로 호출한 결과를 반환한다.

8.6.2.1 InitializeBoundName ( name, value, environment )

추상 연산 InitializeBoundName은 name (문자열), value (ECMAScript 언어 값), 그리고 environment (Environment Record 또는 undefined) 인자를 받고, unused를 포함하는 정상 완료 또는 비정상 완료 중 하나를 반환한다. 다음 단계를 수행한다:

  1. 만약 environmentundefined가 아니라면,
    1. environment.InitializeBinding(name, value)을 수행한다.
    2. unused를 반환한다.
  2. 그 외의 경우,
    1. lhs를 ? ResolveBinding(name)로 둔다.
    2. PutValue(lhs, value)를 반환한다.

8.6.3 런타임 의미론: IteratorBindingInitialization

구문 지시 연산 IteratorBindingInitialization은 iteratorRecord (Iterator Record 타입)와 environment (Environment Record 또는 undefined) 인자를 받고, unused를 포함하는 정상 완료 또는 비정상 완료 중 하나를 반환한다.

참고

environmentundefined가 전달될 경우, 초기화 값 할당에 PutValue 연산을 사용해야 함을 나타낸다. 이는 비엄격 함수의 명시적 매개변수 목록에 해당한다. 이 경우 동일한 이름의 매개변수가 여러 개 있을 수 있으므로, 명시적 매개변수 바인딩을 미리 초기화한다.

다음 생성 규칙에 따라 부분적으로 정의된다:

ArrayBindingPattern : [ ]
  1. unused를 반환한다.
ArrayBindingPattern : [ Elision ]
  1. IteratorDestructuringAssignmentEvaluation of ElisioniteratorRecord 인자를 넣어 호출한 결과를 반환한다.
ArrayBindingPattern : [ Elisionopt BindingRestElement ]
  1. 만약 Elision이 존재한다면,
    1. IteratorDestructuringAssignmentEvaluation of ElisioniteratorRecord 인자를 넣어 호출한다.
  2. IteratorBindingInitialization of BindingRestElementiteratorRecord, environment 인자를 넣어 호출한 결과를 반환한다.
ArrayBindingPattern : [ BindingElementList , Elision ]
  1. IteratorBindingInitialization of BindingElementListiteratorRecord, environment 인자를 넣어 호출한다.
  2. IteratorDestructuringAssignmentEvaluation of ElisioniteratorRecord 인자를 넣어 호출한 결과를 반환한다.
ArrayBindingPattern : [ BindingElementList , Elisionopt BindingRestElement ]
  1. IteratorBindingInitialization of BindingElementListiteratorRecord, environment 인자를 넣어 호출한다.
  2. 만약 Elision이 존재한다면,
    1. IteratorDestructuringAssignmentEvaluation of ElisioniteratorRecord 인자를 넣어 호출한다.
  3. IteratorBindingInitialization of BindingRestElementiteratorRecord, environment 인자를 넣어 호출한 결과를 반환한다.
BindingElementList : BindingElementList , BindingElisionElement
  1. IteratorBindingInitialization of BindingElementListiteratorRecord, environment 인자를 넣어 호출한다.
  2. IteratorBindingInitialization of BindingElisionElementiteratorRecord, environment 인자를 넣어 호출한 결과를 반환한다.
BindingElisionElement : Elision BindingElement
  1. IteratorDestructuringAssignmentEvaluation of ElisioniteratorRecord 인자를 넣어 호출한다.
  2. IteratorBindingInitialization of BindingElementiteratorRecord, environment 인자를 넣어 호출한 결과를 반환한다.
SingleNameBinding : BindingIdentifier Initializeropt
  1. bindingIdStringValue of BindingIdentifier로 둔다.
  2. lhs를 ? ResolveBinding(bindingId, environment)로 둔다.
  3. vundefined로 둔다.
  4. 만약 iteratorRecord.[[Done]]false라면,
    1. next를 ? IteratorStepValue(iteratorRecord)로 둔다.
    2. 만약 nextdone이 아니라면,
      1. vnext를 할당한다.
  5. 만약 Initializer가 존재하고 vundefined라면,
    1. 만약 IsAnonymousFunctionDefinition(Initializer)가 true라면,
      1. v에 ? NamedEvaluation of InitializerbindingId 인자로 호출한 결과를 할당한다.
    2. 그 외의 경우,
      1. defaultValue를 ? Evaluation of Initializer로 둔다.
      2. v에 ? GetValue(defaultValue)를 할당한다.
  6. 만약 environmentundefined라면, ? PutValue(lhs, v)를 반환한다.
  7. InitializeReferencedBinding(lhs, v)를 반환한다.
BindingElement : BindingPattern Initializeropt
  1. vundefined로 둔다.
  2. 만약 iteratorRecord.[[Done]]false라면,
    1. next를 ? IteratorStepValue(iteratorRecord)로 둔다.
    2. 만약 nextdone이 아니라면,
      1. vnext를 할당한다.
  3. 만약 Initializer가 존재하고 vundefined라면,
    1. defaultValue를 ? Evaluation of Initializer로 둔다.
    2. v에 ? GetValue(defaultValue)를 할당한다.
  4. BindingInitialization of BindingPatternv, environment 인자를 넣어 호출한 결과를 반환한다.
BindingRestElement : ... BindingIdentifier
  1. lhs를 ? ResolveBinding(StringValue of BindingIdentifier, environment)로 둔다.
  2. A를 ! ArrayCreate(0)로 둔다.
  3. n을 0으로 둔다.
  4. 반복,
    1. nextdone으로 둔다.
    2. 만약 iteratorRecord.[[Done]]false라면,
      1. next를 ? IteratorStepValue(iteratorRecord)로 둔다.
    3. 만약 nextdone이라면,
      1. 만약 environmentundefined라면, ? PutValue(lhs, A)를 반환한다.
      2. InitializeReferencedBinding(lhs, A)를 반환한다.
    4. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), next))를 수행한다.
    5. nn + 1로 갱신한다.
BindingRestElement : ... BindingPattern
  1. A를 ! ArrayCreate(0)로 둔다.
  2. n을 0으로 둔다.
  3. 반복,
    1. nextdone으로 둔다.
    2. 만약 iteratorRecord.[[Done]]false라면,
      1. next를 ? IteratorStepValue(iteratorRecord)로 둔다.
    3. 만약 nextdone이라면,
      1. BindingInitialization of BindingPatternA, environment 인자를 넣어 호출한 결과를 반환한다.
    4. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), next))를 수행한다.
    5. nn + 1로 갱신한다.
FormalParameters : [empty]
  1. unused를 반환한다.
FormalParameters : FormalParameterList , FunctionRestParameter
  1. IteratorBindingInitialization of FormalParameterListiteratorRecord, environment 인자를 넣어 호출한다.
  2. IteratorBindingInitialization of FunctionRestParameteriteratorRecord, environment 인자를 넣어 호출한 결과를 반환한다.
FormalParameterList : FormalParameterList , FormalParameter
  1. IteratorBindingInitialization of FormalParameterListiteratorRecord, environment 인자를 넣어 호출한다.
  2. IteratorBindingInitialization of FormalParameteriteratorRecord, environment 인자를 넣어 호출한 결과를 반환한다.
ArrowParameters : BindingIdentifier
  1. vundefined로 둔다.
  2. Assert: iteratorRecord.[[Done]]false임을 보장한다.
  3. next를 ? IteratorStepValue(iteratorRecord)로 둔다.
  4. 만약 nextdone이 아니라면,
    1. vnext를 할당한다.
  5. BindingInitialization of BindingIdentifierv, environment 인자를 넣어 호출한 결과를 반환한다.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsArrowFormalParameters로 두는데, 이는 covered by CoverParenthesizedExpressionAndArrowParameterList에 해당한다.
  2. IteratorBindingInitialization of formalsiteratorRecord, environment 인자를 넣어 호출한 결과를 반환한다.
AsyncArrowBindingIdentifier : BindingIdentifier
  1. vundefined로 둔다.
  2. Assert: iteratorRecord.[[Done]]false임을 보장한다.
  3. next를 ? IteratorStepValue(iteratorRecord)로 둔다.
  4. 만약 nextdone이 아니라면,
    1. vnext를 할당한다.
  5. BindingInitialization of BindingIdentifierv, environment 인자를 넣어 호출한 결과를 반환한다.

8.6.4 정적 의미론: AssignmentTargetType

구문 지시 연산 AssignmentTargetType은 인자를 받지 않으며, simple, web-compat, 또는 invalid 중 하나를 반환한다. 이는 다음 생성 규칙에 따라 부분적으로 정의된다:

IdentifierReference : Identifier
  1. 만약 IsStrict(이 IdentifierReference)가 true이고, StringValue of Identifier"eval" 또는 "arguments"인 경우, invalid를 반환한다.
  2. simple를 반환한다.
IdentifierReference : yield await CallExpression : CallExpression [ Expression ] CallExpression . IdentifierName CallExpression . PrivateIdentifier MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName SuperProperty MemberExpression . PrivateIdentifier
  1. simple를 반환한다.
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprParenthesizedExpression로 두는데, 이는 covered by CoverParenthesizedExpressionAndArrowParameterList에 해당한다.
  2. exprAssignmentTargetType을 반환한다.
CallExpression : CoverCallExpressionAndAsyncArrowHead CallExpression Arguments
  1. 만약 host가 웹 브라우저이거나 함수 호출 할당 대상에 대한 런타임 오류를 지원하고, IsStrict(이 CallExpression)가 false라면,
    1. web-compat를 반환한다.
  2. invalid를 반환한다.
PrimaryExpression : this Literal ArrayLiteral ObjectLiteral FunctionExpression ClassExpression GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral CallExpression : SuperCall ImportCall CallExpression TemplateLiteral NewExpression : new NewExpression MemberExpression : MemberExpression TemplateLiteral new MemberExpression Arguments NewTarget : new . target ImportMeta : import . meta LeftHandSideExpression : OptionalExpression UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- ++ UnaryExpression -- UnaryExpression UnaryExpression : delete UnaryExpression void UnaryExpression typeof UnaryExpression + UnaryExpression - UnaryExpression ~ UnaryExpression ! UnaryExpression AwaitExpression ExponentiationExpression : UpdateExpression ** ExponentiationExpression MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression AdditiveExpression : AdditiveExpression + MultiplicativeExpression AdditiveExpression - MultiplicativeExpression ShiftExpression : ShiftExpression << AdditiveExpression ShiftExpression >> AdditiveExpression ShiftExpression >>> AdditiveExpression RelationalExpression : RelationalExpression < ShiftExpression RelationalExpression > ShiftExpression RelationalExpression <= ShiftExpression RelationalExpression >= ShiftExpression RelationalExpression instanceof ShiftExpression RelationalExpression in ShiftExpression PrivateIdentifier in ShiftExpression EqualityExpression : EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression BitwiseANDExpression : BitwiseANDExpression & EqualityExpression BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression LogicalANDExpression : LogicalANDExpression && BitwiseORExpression LogicalORExpression : LogicalORExpression || LogicalANDExpression CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression AssignmentExpression : YieldExpression ArrowFunction AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression Expression : Expression , AssignmentExpression
  1. invalid를 반환한다.

8.6.5 정적 의미론: PropName

구문 지시 연산 PropName은 인자를 받지 않으며, 문자열 또는 empty를 반환한다. 이는 다음 생성 규칙에 따라 부분적으로 정의된다:

PropertyDefinition : IdentifierReference
  1. IdentifierReferenceStringValue를 반환한다.
PropertyDefinition : ... AssignmentExpression
  1. empty를 반환한다.
PropertyDefinition : PropertyName : AssignmentExpression
  1. PropertyNamePropName을 반환한다.
LiteralPropertyName : IdentifierName AttributeKey : IdentifierName
  1. IdentifierNameStringValue를 반환한다.
LiteralPropertyName : StringLiteral AttributeKey : StringLiteral
  1. StringLiteralSV를 반환한다.
LiteralPropertyName : NumericLiteral
  1. nbrNumericLiteralNumericValue로 둔다.
  2. ToString(nbr)을 반환한다.
ComputedPropertyName : [ AssignmentExpression ]
  1. empty를 반환한다.
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. ClassElementNamePropName을 반환한다.
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. ClassElementNamePropName을 반환한다.
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. ClassElementNamePropName을 반환한다.
ClassElement : ClassStaticBlock
  1. empty를 반환한다.
ClassElement : ;
  1. empty를 반환한다.
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. ClassElementNamePropName을 반환한다.
FieldDefinition : ClassElementName Initializeropt
  1. ClassElementNamePropName을 반환한다.
ClassElementName : PrivateIdentifier
  1. empty를 반환한다.

9 실행 가능한 코드와 실행 컨텍스트

9.1 환경 레코드

Environment Record는 ECMAScript 코드의 렉시컬 중첩 구조에 기반하여 Identifier들을 특정 변수와 함수에 연관시키기 위해 사용되는 명세 타입입니다. 보통 환경 레코드는 FunctionDeclaration, BlockStatement, 또는 Catch 절과 같이 ECMAScript 코드의 특정 구문 구조와 연결됩니다. 이와 같은 코드가 평가될 때마다, 해당 코드가 생성하는 식별자 바인딩을 기록하기 위해 새로운 환경 레코드가 생성됩니다.

모든 환경 레코드는 [[OuterEnv]] 필드를 가지며, 이 값은 null이거나 외부 환경 레코드를 참조합니다. 이 필드는 환경 레코드 값들의 논리적 중첩 구조를 모델링하는 데 사용됩니다. (내부) 환경 레코드의 외부 참조는 논리적으로 그 내부 환경 레코드를 둘러싸는 환경 레코드를 참조합니다. 외부 환경 레코드는 물론 그 자체로 또 다른 외부 환경 레코드를 가질 수 있습니다. 하나의 환경 레코드는 여러 내부 환경 레코드의 외부 환경이 될 수 있습니다. 예를 들어, FunctionDeclaration이 두 개의 중첩된 FunctionDeclaration을 포함한다면, 각 중첩 함수의 환경 레코드는 현재 평가 중인 외부 함수의 환경 레코드를 외부 환경 레코드로 갖게 됩니다.

환경 레코드는 오직 명세상의 메커니즘일 뿐이며, ECMAScript 구현의 어떤 특정 산출물과 반드시 대응할 필요는 없습니다. ECMAScript 프로그램이 이러한 값을 직접적으로 접근하거나 조작하는 것은 불가능합니다.

9.1.1 환경 레코드 타입 계층

환경 레코드Environment Record가 추상 클래스이고, 세 가지 구체적 하위 클래스를 가지는 단순한 객체 지향 계층으로 생각할 수 있습니다: 선언적 환경 레코드, 객체 환경 레코드, 그리고 전역 환경 레코드. 함수 환경 레코드모듈 환경 레코드선언적 환경 레코드의 하위 클래스입니다.

  • Environment Record (추상)

    • 선언적 환경 레코드FunctionDeclaration, VariableDeclaration, Catch 절 등과 같이, 식별자 바인딩을 ECMAScript 언어 값에 직접적으로 연결하는 ECMAScript 언어 구문 요소의 효과를 정의하는 데 사용됩니다.

      • 함수 환경 레코드는 ECMAScript 함수 객체의 호출에 대응하며, 해당 함수 내의 최상위 선언에 대한 바인딩을 포함합니다. 또한 새로운 this 바인딩을 설정할 수 있습니다. 그리고 super 메서드 호출을 지원하기 위한 상태도 캡처합니다.

      • 모듈 환경 레코드Module의 최상위 선언에 대한 바인딩을 포함합니다. 또한 Module이 명시적으로 가져온 바인딩도 포함합니다. 그 [[OuterEnv]]전역 환경 레코드입니다.

    • 객체 환경 레코드WithStatement 등과 같이 식별자 바인딩을 어떤 객체의 프로퍼티와 연결하는 ECMAScript 요소의 효과를 정의하는 데 사용됩니다.

    • 전역 환경 레코드Script의 전역 선언에 사용됩니다. 이 레코드는 외부 환경을 가지지 않으며, 그 [[OuterEnv]]null입니다. 미리 식별자 바인딩이 채워져 있을 수 있으며, 글로벌 객체와 연관되어 있어, 그 프로퍼티들이 전역 환경의 일부 식별자 바인딩을 제공합니다. ECMAScript 코드가 실행됨에 따라 글로벌 객체에 프로퍼티가 추가될 수 있고, 초기 프로퍼티들이 수정될 수도 있습니다.

환경 레코드 추상 클래스에는 표 16에 정의된 추상 명세 메서드가 포함되어 있습니다. 이 추상 메서드들은 각 구체적 하위 클래스마다 서로 다른 구체적 알고리즘을 가집니다.

표 16: 환경 레코드의 추상 메서드
메서드 목적
HasBinding(N) 환경 레코드가 문자열 값 N에 대한 바인딩을 가지고 있는지 확인합니다. 가지고 있다면 true를, 아니라면 false를 반환합니다.
CreateMutableBinding(N, D) 환경 레코드에 새로운(아직 초기화되지 않은) 변경 가능한 바인딩을 생성합니다. 문자열 값 N은 바인딩될 이름의 텍스트입니다. 불리언 인자 Dtrue라면, 이 바인딩은 이후 삭제될 수 있습니다.
CreateImmutableBinding(N, S) 환경 레코드에 새로운(아직 초기화되지 않은) 변경 불가능한 바인딩을 생성합니다. 문자열 값 N은 바인딩될 이름의 텍스트입니다. Strue라면, 초기화 후 값을 설정하려는 시도는 엄격 모드 여부와 관계없이 항상 예외를 발생시킵니다.
InitializeBinding(N, V) 환경 레코드에 이미 존재하지만 아직 초기화되지 않은 바인딩의 값을 설정합니다. 문자열 값 N은 바인딩될 이름의 텍스트입니다. V는 바인딩에 대한 값이며, ECMAScript 언어 타입의 값입니다.
SetMutableBinding(N, V, S) 환경 레코드에 이미 존재하는 변경 가능한 바인딩의 값을 설정합니다. 문자열 값 N은 바인딩될 이름의 텍스트입니다. V는 바인딩에 대한 값이며, ECMAScript 언어 타입의 값일 수 있습니다. S불리언 플래그입니다. Strue이며 바인딩에 값을 설정할 수 없으면 TypeError 예외를 발생시킵니다.
GetBindingValue(N, S) 환경 레코드에서 이미 존재하는 바인딩의 값을 반환합니다. 문자열 값 N은 바인딩될 이름의 텍스트입니다. S엄격 모드 코드에서 시작되었거나 엄격 모드 참조语 의미가 요구되는 참조를 식별하는 데 사용됩니다. Strue이고 바인딩이 존재하지 않으면 ReferenceError 예외를 발생시킵니다. 바인딩이 존재하지만 초기화되지 않았다면 S의 값과 상관없이 ReferenceError가 발생합니다.
DeleteBinding(N) 환경 레코드에서 바인딩을 삭제합니다. 문자열 값 N은 바인딩될 이름의 텍스트입니다. N에 대한 바인딩이 존재하면 해당 바인딩을 제거하고 true를 반환합니다. 바인딩이 존재하나 삭제할 수 없는 경우 false를 반환합니다. 바인딩이 존재하지 않으면 true를 반환합니다.
HasThisBinding() 환경 레코드this 바인딩을 설정하는지 확인합니다. 그렇다면 true, 아니라면 false를 반환합니다.
HasSuperBinding() 환경 레코드super 메서드 바인딩을 설정하는지 확인합니다. 그렇다면 true, 아니라면 false를 반환합니다. true를 반환한다면 환경 레코드함수 환경 레코드임을 의미하지만, 그 역은 성립하지 않습니다.
WithBaseObject() 환경 레코드with 문과 연관되어 있다면, with 객체를 반환합니다. 그렇지 않으면 undefined를 반환합니다.

9.1.1.1 선언적 환경 레코드

선언적 환경 레코드는 변수, 상수, let, class, module, import, 그리고/또는 함수 선언을 포함하는 ECMAScript 프로그램 스코프와 연관되어 있습니다. 선언적 환경 레코드는 그 스코프 내에 포함된 선언들이 정의하는 식별자 집합을 바인딩합니다.

9.1.1.1.1 HasBinding ( N )

선언적 환경 레코드 envRec의 HasBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상 완료를 반환합니다. 이 메서드는 인자로 받은 식별자가 레코드에 바인딩된 식별자 중 하나인지 판단합니다. 호출 시 다음 단계를 수행합니다:

  1. envRecN에 대한 바인딩을 가지고 있다면 true를 반환한다.
  2. false를 반환한다.

9.1.1.1.2 CreateMutableBinding ( N, D )

선언적 환경 레코드 envRec의 CreateMutableBinding 구체 메서드는 N (문자열)과 D (불리언)를 인자로 받아 unused를 포함하는 정상 완료를 반환합니다. 이름 N에 대해 초기화되지 않은 새로운 변경 가능한 바인딩을 생성합니다. 이 환경 레코드 내에 N에 대한 바인딩이 이미 존재해서는 안 됩니다. Dtrue이면, 새로 생성된 바인딩은 삭제 대상임이 표시됩니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: envRec가 이미 N에 대한 바인딩을 가지고 있지 않음을 보장한다.
  2. envRec에 대해 N에 대한 변경 가능한 바인딩을 생성하고, 초기화되지 않았음을 기록한다. Dtrue이면, 새로 생성된 바인딩이 이후 DeleteBinding 호출로 삭제될 수 있음을 기록한다.
  3. unused를 반환한다.

9.1.1.1.3 CreateImmutableBinding ( N, S )

선언적 환경 레코드 envRec의 CreateImmutableBinding 구체 메서드는 N (문자열)과 S (불리언)를 인자로 받아 unused를 포함하는 정상 완료를 반환합니다. 이름 N에 대해 초기화되지 않은 새로운 변경 불가능한 바인딩을 생성합니다. 이 환경 레코드 내에 N에 대한 바인딩이 이미 존재해서는 안 됩니다. Strue이면, 새로 생성된 바인딩이 strict 바인딩임을 표시합니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: envRec가 이미 N에 대한 바인딩을 가지고 있지 않음을 보장한다.
  2. envRec에 대해 N에 대한 변경 불가능한 바인딩을 생성하고, 초기화되지 않았음을 기록한다. Strue이면, 새로 생성된 바인딩이 strict 바인딩임을 기록한다.
  3. unused를 반환한다.

9.1.1.1.4 InitializeBinding ( N, V )

선언적 환경 레코드 envRec의 InitializeBinding 구체 메서드는 N (문자열)과 V (ECMAScript 언어 값)를 인자로 받아 unused를 포함하는 정상 완료를 반환합니다. 이 메서드는 이름이 N인 식별자의 현재 바인딩의 값을 V로 설정합니다. N에 대한 초기화되지 않은 바인딩이 이미 존재해야 합니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: envRecN에 대한 초기화되지 않은 바인딩이 존재함을 보장한다.
  2. envRecN에 대한 바인딩 값을 V로 설정한다.
  3. envRecN에 대한 바인딩이 초기화되었음을 기록한다.
  4. unused를 반환한다.

9.1.1.1.5 SetMutableBinding ( N, V, S )

선언적 환경 레코드 envRec의 SetMutableBinding 구체 메서드는 N (문자열), V (ECMAScript 언어 값), S (불리언)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 이름이 N인 식별자의 현재 바인딩의 값을 V로 변경하려고 시도합니다. N에 대한 바인딩이 보통 이미 존재하지만, 드물게 존재하지 않을 수도 있습니다. 바인딩이 변경 불가능한 경우 Strue이면 TypeError를 발생시킵니다. 호출 시 다음 단계를 수행합니다:

  1. 만약 envRecN에 대한 바인딩이 존재하지 않는다면,
    1. Strue이면 ReferenceError 예외를 발생시킨다.
    2. envRec.CreateMutableBinding(N, true)을 수행한다.
    3. envRec.InitializeBinding(N, V)을 수행한다.
    4. unused를 반환한다.
  2. envRecN에 대한 바인딩이 strict 바인딩이라면, Strue로 설정한다.
  3. envRecN에 대한 바인딩이 아직 초기화되지 않았다면,
    1. ReferenceError 예외를 발생시킨다.
  4. 그 외에 envRecN에 대한 바인딩이 변경 가능한 바인딩이라면,
    1. 그 값을 V로 변경한다.
  5. 그 외의 경우,
    1. Assert: 이는 변경 불가능한 바인딩의 값을 변경하려는 시도임을 보장한다.
    2. Strue이면 TypeError 예외를 발생시킨다.
  6. unused를 반환한다.
참고

다음과 같은 ECMAScript 코드는 1 단계에서 바인딩이 존재하지 않게 되는 결과를 초래할 수 있습니다:

function f() { eval("var x; x = (delete x, 0);"); }

9.1.1.1.6 GetBindingValue ( N, S )

선언적 환경 레코드 envRec의 GetBindingValue 구체 메서드는 N (문자열)과 S (불리언)를 인자로 받아 ECMAScript 언어 값을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 이름이 N인 바인딩된 식별자의 값을 반환합니다. 바인딩이 존재하지만 아직 초기화되지 않았다면 S 값과 무관하게 ReferenceError 예외가 발생합니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: envRecN에 대한 바인딩을 가지고 있음을 보장한다.
  2. envRecN에 대한 바인딩이 초기화되지 않았다면 ReferenceError 예외를 발생시킨다.
  3. envRecN에 현재 바인딩된 값을 반환한다.

9.1.1.1.7 DeleteBinding ( N )

선언적 환경 레코드 envRec의 DeleteBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상 완료를 반환합니다. 이 메서드는 삭제 대상임이 명시적으로 지정된 바인딩만 삭제할 수 있습니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: envRecN에 대한 바인딩을 가지고 있음을 보장한다.
  2. envRecN에 대한 바인딩을 삭제할 수 없다면 false를 반환한다.
  3. envRec에서 N에 대한 바인딩을 제거한다.
  4. true를 반환한다.

9.1.1.1.8 HasThisBinding ( )

선언적 환경 레코드 envRec의 HasThisBinding 구체 메서드는 인자가 없으며 false를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. false를 반환한다.
참고

일반적인 선언적 환경 레코드 (즉, 함수 환경 레코드모듈 환경 레코드가 아닌 것)는 this 바인딩을 제공하지 않습니다.

9.1.1.1.9 HasSuperBinding ( )

선언적 환경 레코드 envRec의 HasSuperBinding 구체 메서드는 인자가 없으며 false를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. false를 반환한다.
참고

일반적인 선언적 환경 레코드 (즉, 함수 환경 레코드모듈 환경 레코드가 아닌 것)는 super 바인딩을 제공하지 않습니다.

9.1.1.1.10 WithBaseObject ( )

선언적 환경 레코드 envRec의 WithBaseObject 구체 메서드는 인자가 없으며 undefined를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. undefined를 반환한다.

9.1.1.2 객체 환경 레코드

객체 환경 레코드는 자신의 바인딩 객체라 불리는 객체와 연관되어 있습니다. 객체 환경 레코드는 바인딩 객체의 프로퍼티 이름에 직접적으로 대응하는 문자열 식별자 이름 집합을 바인딩합니다. 프로퍼티 키IdentifierName 형태의 문자열이 아닌 것들은 바인딩된 식별자 집합에 포함되지 않습니다. 자신의 [[Enumerable]] 특성 설정과 상관없이 소유 및 상속된 프로퍼티 모두 집합에 포함됩니다. 객체에 프로퍼티가 동적으로 추가되거나 삭제될 수 있기 때문에, 객체 환경 레코드에 바인딩된 식별자 집합은 프로퍼티 추가/삭제 연산의 부수 효과로 잠재적으로 변경될 수 있습니다. 이런 부수 효과로 생성된 모든 바인딩은 해당 프로퍼티의 Writable 특성이 false이어도 변경 가능한 바인딩으로 간주합니다. 객체 환경 레코드에는 변경 불가능한(immutable) 바인딩이 존재하지 않습니다.

with 문(14.11)을 위해 생성된 객체 환경 레코드는 바인딩 객체를 함수 호출에서 암시적 this 값으로 제공할 수 있습니다. 이 기능은 불리언 타입의 [[IsWithEnvironment]] 필드로 제어됩니다.

객체 환경 레코드는 표 17에 나열된 추가 상태 필드를 가집니다.

표 17: 객체 환경 레코드의 추가 필드
필드 이름 의미
[[BindingObject]] 객체 환경 레코드의 바인딩 객체.
[[IsWithEnvironment]] 불리언 환경 레코드with 문을 위해 생성된 것인지를 나타냅니다.

9.1.1.2.1 HasBinding ( N )

객체 환경 레코드 envRec의 HasBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 연관된 바인딩 객체에 N이라는 이름의 프로퍼티가 존재하는지 판단합니다. 호출 시 다음 단계를 수행합니다:

  1. bindingObjectenvRec.[[BindingObject]]로 둔다.
  2. foundBinding를 ? HasProperty(bindingObject, N)로 둔다.
  3. foundBindingfalse라면 false를 반환한다.
  4. envRec.[[IsWithEnvironment]]false라면 true를 반환한다.
  5. unscopables를 ? Get(bindingObject, %Symbol.unscopables%)로 둔다.
  6. unscopables객체라면,
    1. blockedToBoolean(? Get(unscopables, N))로 둔다.
    2. blockedtrue라면 false를 반환한다.
  7. true를 반환한다.

9.1.1.2.2 CreateMutableBinding ( N, D )

객체 환경 레코드 envRec의 CreateMutableBinding 구체 메서드는 N (문자열)과 D (불리언)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 환경 레코드와 연관된 바인딩 객체에 N이라는 이름의 프로퍼티를 생성하고, 그 값을 undefined로 초기화합니다. Dtrue면 새 프로퍼티의 [[Configurable]] 특성을 true로, 아니면 false로 설정합니다. 호출 시 다음 단계를 수행합니다:

  1. bindingObjectenvRec.[[BindingObject]]로 둔다.
  2. DefinePropertyOrThrow(bindingObject, N, PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: D })를 수행한다.
  3. unused를 반환한다.
참고

보통 envRecN에 대한 바인딩을 갖지 않지만, 만약 갖고 있다면 DefinePropertyOrThrow의 의미론에 따라 기존 바인딩이 대체되거나 가려지거나, 비정상 완료가 반환될 수 있습니다.

9.1.1.2.3 CreateImmutableBinding ( N, S )

객체 환경 레코드의 CreateImmutableBinding 구체 메서드는 이 명세 안에서 사용되지 않습니다.

9.1.1.2.4 InitializeBinding ( N, V )

객체 환경 레코드 envRec의 InitializeBinding 구체 메서드는 N (문자열)과 V (ECMAScript 언어 값)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 이름이 N인 식별자의 현재 바인딩 값을 V로 설정합니다. 호출 시 다음 단계를 수행합니다:

  1. envRec.SetMutableBinding(N, V, false)을 수행한다.
  2. unused를 반환한다.
참고

이 명세에서 객체 환경 레코드에 대한 CreateMutableBinding의 모든 사용은 곧바로 같은 이름에 대해 InitializeBinding을 호출합니다. 따라서 이 명세는 객체 환경 레코드의 바인딩 초기화 상태를 명시적으로 추적하지 않습니다.

9.1.1.2.5 SetMutableBinding ( N, V, S )

객체 환경 레코드 envRec의 SetMutableBinding 구체 메서드는 N (문자열), V (ECMAScript 언어 값), S (불리언)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 환경 레코드와 연관된 바인딩 객체의 N이라는 이름의 프로퍼티 값을 V로 설정하려고 시도합니다. N이라는 이름의 프로퍼티가 보통 이미 존재하지만, 존재하지 않거나 쓰기 불가능한 경우 오류 처리는 S에 따라 결정됩니다. 호출 시 다음 단계를 수행합니다:

  1. bindingObjectenvRec.[[BindingObject]]로 둔다.
  2. stillExists를 ? HasProperty(bindingObject, N)로 둔다.
  3. stillExistsfalse이고 Strue라면 ReferenceError 예외를 발생시킨다.
  4. Set(bindingObject, N, V, S)를 수행한다.
  5. unused를 반환한다.

9.1.1.2.6 GetBindingValue ( N, S )

객체 환경 레코드 envRec의 GetBindingValue 구체 메서드는 N (문자열)과 S (불리언)를 인자로 받아 ECMAScript 언어 값을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 연관된 바인딩 객체의 N 이름의 프로퍼티 값을 반환합니다. 프로퍼티는 이미 존재해야 하지만, 존재하지 않을 경우 결과는 S에 따라 달라집니다. 호출 시 다음 단계를 수행합니다:

  1. bindingObjectenvRec.[[BindingObject]]로 둔다.
  2. value를 ? HasProperty(bindingObject, N)로 둔다.
  3. valuefalse라면,
    1. Sfalse라면 undefined를 반환하고, 아니면 ReferenceError 예외를 발생시킨다.
  4. Get(bindingObject, N)를 반환한다.

9.1.1.2.7 DeleteBinding ( N )

객체 환경 레코드 envRec의 DeleteBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 환경 객체의 [[Configurable]] 특성이 true인 프로퍼티에 대응되는 바인딩만 삭제할 수 있습니다. 호출 시 다음 단계를 수행합니다:

  1. bindingObjectenvRec.[[BindingObject]]로 둔다.
  2. bindingObject.[[Delete]](N)를 반환한다.

9.1.1.2.8 HasThisBinding ( )

객체 환경 레코드 envRec의 HasThisBinding 구체 메서드는 인자가 없으며 false를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. false를 반환한다.
참고

객체 환경 레코드this 바인딩을 제공하지 않습니다.

9.1.1.2.9 HasSuperBinding ( )

객체 환경 레코드 envRec의 HasSuperBinding 구체 메서드는 인자가 없으며 false를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. false를 반환한다.
참고

객체 환경 레코드super 바인딩을 제공하지 않습니다.

9.1.1.2.10 WithBaseObject ( )

객체 환경 레코드 envRec의 WithBaseObject 구체 메서드는 인자가 없으며 객체 또는 undefined를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. envRec.[[IsWithEnvironment]]true라면, envRec.[[BindingObject]]를 반환한다.
  2. 그렇지 않으면 undefined를 반환한다.

9.1.1.3 함수 환경 레코드

함수 환경 레코드선언적 환경 레코드이며, 함수의 최상위 스코프를 표현하는 데 사용되고, 함수가 ArrowFunction이 아닐 경우 this 바인딩을 제공합니다. 함수가 ArrowFunction이 아니고 super를 참조한다면, 해당 함수 환경 레코드는 함수 내부에서 super 메서드 호출을 수행하는 데 사용되는 상태도 포함합니다.

함수 환경 레코드는 표 18에 나열된 추가 상태 필드를 가집니다.

표 18: 함수 환경 레코드의 추가 필드
필드 이름 의미
[[ThisValue]] ECMAScript 언어 값 이 함수 호출에 사용되는 this 값입니다.
[[ThisBindingStatus]] lexical, initialized, 또는 uninitialized 값이 lexical라면, 이는 ArrowFunction이며 로컬 this 값을 가지지 않습니다.
[[FunctionObject]] ECMAScript 함수 객체 환경 레코드가 생성된 호출을 야기한 함수 객체입니다.
[[NewTarget]] 생성자 또는 undefined 환경 레코드[[Construct]] 내부 메서드에 의해 생성되었다면, [[NewTarget]][[Construct]]newTarget 파라미터 값입니다. 그렇지 않으면 값은 undefined입니다.

함수 환경 레코드는 선언적 환경 레코드의 모든 메서드(표 16 참조)를 지원하며, HasThisBinding과 HasSuperBinding을 제외한 모든 메서드는 동일한 명세를 따릅니다. 또한, 함수 환경 레코드는 표 19에 나열된 메서드들도 지원합니다:

표 19: 함수 환경 레코드의 추가 메서드
메서드 목적
GetThisBinding() 환경 레코드this 바인딩 값을 반환합니다. this 바인딩이 초기화되지 않았다면 ReferenceError를 발생시킵니다.

9.1.1.3.1 BindThisValue ( envRec, V )

추상 연산 BindThisValue는 envRec (함수 환경 레코드)와 V (ECMAScript 언어 값)를 인자로 받아, unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 연산은 envRec.[[ThisValue]]를 세팅하고, 초기화되었음을 기록합니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: envRec.[[ThisBindingStatus]]lexical이 아님을 보장한다.
  2. envRec.[[ThisBindingStatus]]initialized라면, ReferenceError 예외를 발생시킨다.
  3. envRec.[[ThisValue]]V로 설정한다.
  4. envRec.[[ThisBindingStatus]]initialized로 설정한다.
  5. unused를 반환한다.

9.1.1.3.2 HasThisBinding ( )

함수 환경 레코드 envRec의 HasThisBinding 구체 메서드는 인자가 없으며 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. envRec.[[ThisBindingStatus]]lexical이면 false를, 아니면 true를 반환한다.

9.1.1.3.3 HasSuperBinding ( )

함수 환경 레코드 envRec의 HasSuperBinding 구체 메서드는 인자가 없으며 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. envRec.[[ThisBindingStatus]]lexical라면 false를 반환한다.
  2. envRec.[[FunctionObject]].[[HomeObject]]undefined라면 false를, 아니면 true를 반환한다.

9.1.1.3.4 GetThisBinding ( )

함수 환경 레코드 envRec의 GetThisBinding 구체 메서드는 인자가 없으며 ECMAScript 언어 값을 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: envRec.[[ThisBindingStatus]]lexical이 아님을 보장한다.
  2. envRec.[[ThisBindingStatus]]uninitialized라면 ReferenceError 예외를 발생시킨다.
  3. envRec.[[ThisValue]]를 반환한다.

9.1.1.3.5 GetSuperBase ( envRec )

추상 연산 GetSuperBase는 envRec (함수 환경 레코드)를 인자로 받아 객체, null, 또는 undefined를 반환합니다. 이 연산은 envRec에 바인딩된 super 프로퍼티 접근의 기반이 되는 객체를 반환합니다. 값이 undefined이면, 그러한 접근이 런타임 오류를 발생시킴을 나타냅니다. 호출 시 다음 단계를 수행합니다:

  1. homeenvRec.[[FunctionObject]].[[HomeObject]]로 둔다.
  2. homeundefined라면 undefined를 반환한다.
  3. Assert: homeordinary object임을 보장한다.
  4. home.[[GetPrototypeOf]]()의 결과를 반환한다.

9.1.1.4 전역 환경 레코드

전역 환경 레코드는 공통 realm에서 처리되는 모든 ECMAScript Script 요소가 공유하는 가장 바깥쪽 스코프를 나타내는 데 사용됩니다. 전역 환경 레코드는 내장 글로벌(19), 글로벌 객체의 프로퍼티, 그리고 Script 내에서 발생하는 모든 최상위 선언(8.2.9, 8.2.11)에 대한 바인딩을 제공합니다.

전역 환경 레코드는 논리적으로 단일 레코드이지만, 객체 환경 레코드선언적 환경 레코드를 캡슐화하는 복합체로 명세되어 있습니다. 객체 환경 레코드의 기반 객체는 관련 Realm Record글로벌 객체입니다. 이 글로벌 객체는 전역 환경 레코드의 GetThisBinding 구체 메서드가 반환하는 값입니다. 전역 환경 레코드의 객체 환경 레코드 구성요소에는 모든 내장 글로벌(19)과 글로벌 코드에 포함된 FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, 또는 VariableStatement로 도입된 바인딩이 포함됩니다. 글로벌 코드의 그 밖의 모든 ECMAScript 선언에 대한 바인딩은 전역 환경 레코드의 선언적 환경 레코드 구성 요소에 포함됩니다.

프로퍼티는 글로벌 객체에 직접 생성될 수 있습니다. 따라서 전역 환경 레코드의 객체 환경 레코드 구성 요소에는 FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, VariableDeclaration 선언에 의해 명시적으로 생성된 바인딩과 글로벌 객체의 프로퍼티로 암묵적으로 생성된 바인딩이 모두 포함될 수 있습니다. 어떤 바인딩이 선언을 통해 명시적으로 생성되었는지 식별하기 위해, 전역 환경 레코드는 CreateGlobalVarBindingCreateGlobalFunctionBinding 추상 연산에 사용된 이름 목록을 유지합니다.

전역 환경 레코드는 표 20의 추가 필드와 표 21의 추가 메서드를 가집니다.

표 20: 전역 환경 레코드의 추가 필드
필드 이름 의미
[[ObjectRecord]] 객체 환경 레코드 바인딩 객체는 글로벌 객체입니다. 여기에는 관련 realm의 글로벌 코드에서 내장 바인딩, FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, VariableDeclaration의 바인딩이 포함됩니다.
[[GlobalThisValue]] 객체 글로벌 스코프에서 this가 반환하는 값입니다. 호스트는 어떤 ECMAScript 객체 값이라도 제공할 수 있습니다.
[[DeclarativeRecord]] 선언적 환경 레코드 관련 realm 코드의 글로벌 코드 내에서 FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, VariableDeclaration 바인딩을 제외한 모든 선언의 바인딩을 포함합니다.
표 21: 전역 환경 레코드의 추가 메서드
메서드 목적
GetThisBinding() 환경 레코드this 바인딩 값을 반환합니다.

9.1.1.4.1 HasBinding ( N )

전역 환경 레코드 envRec의 HasBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 인자 식별자가 레코드에 바인딩된 식별자 중 하나인지 판단합니다. 호출 시 다음 단계를 수행합니다:

  1. DclRecenvRec.[[DeclarativeRecord]]로 둔다.
  2. DclRec.HasBinding(N)이 true라면 true를 반환한다.
  3. ObjRecenvRec.[[ObjectRecord]]로 둔다.
  4. ObjRec.HasBinding(N)을 반환한다.

9.1.1.4.2 CreateMutableBinding ( N, D )

전역 환경 레코드 envRec의 CreateMutableBinding 구체 메서드는 N (문자열)과 D (불리언)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이름 N에 대해 초기화되지 않은 새로운 변경 가능한 바인딩을 생성합니다. 바인딩은 관련 DeclarativeRecord에 생성됩니다. DeclarativeRecord에 N에 대한 바인딩이 이미 존재해서는 안 됩니다. Dtrue이면, 새로 생성된 바인딩은 삭제 대상임이 표시됩니다. 호출 시 다음 단계를 수행합니다:

  1. DclRecenvRec.[[DeclarativeRecord]]로 둔다.
  2. DclRec.HasBinding(N)이 true라면 TypeError 예외를 발생시킨다.
  3. DclRec.CreateMutableBinding(N, D)을 반환한다.

9.1.1.4.3 CreateImmutableBinding ( N, S )

전역 환경 레코드 envRec의 CreateImmutableBinding 구체 메서드는 N (문자열)과 S (불리언)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이름 N에 대해 초기화되지 않은 새로운 변경 불가능한 바인딩을 생성합니다. 이 환경 레코드 내에 N에 대한 바인딩이 이미 존재해서는 안 됩니다. Strue이면, 새로 생성된 바인딩이 strict 바인딩임을 표시합니다. 호출 시 다음 단계를 수행합니다:

  1. DclRecenvRec.[[DeclarativeRecord]]로 둔다.
  2. DclRec.HasBinding(N)이 true라면 TypeError 예외를 발생시킨다.
  3. DclRec.CreateImmutableBinding(N, S)을 반환한다.

9.1.1.4.4 InitializeBinding ( N, V )

전역 환경 레코드 envRec의 InitializeBinding 구체 메서드는 N (문자열)과 V (ECMAScript 언어 값)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 이름이 N인 식별자의 현재 바인딩 값을 V로 설정합니다. N에 대한 초기화되지 않은 바인딩이 이미 존재해야 합니다. 호출 시 다음 단계를 수행합니다:

  1. DclRecenvRec.[[DeclarativeRecord]]로 둔다.
  2. DclRec.HasBinding(N)이 true라면,
    1. DclRec.InitializeBinding(N, V)을 반환한다.
  3. Assert: 바인딩이 존재한다면, 반드시 객체 환경 레코드에 존재해야 한다.
  4. ObjRecenvRec.[[ObjectRecord]]로 둔다.
  5. ObjRec.InitializeBinding(N, V)을 반환한다.

9.1.1.4.5 SetMutableBinding ( N, V, S )

전역 환경 레코드 envRec의 SetMutableBinding 구체 메서드는 N (문자열), V (ECMAScript 언어 값), S (불리언)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 이름이 N인 식별자의 현재 바인딩 값을 V로 변경하려고 시도합니다. 바인딩이 변경 불가능한 경우 Strue이면 TypeError를 발생시킵니다. N이라는 이름의 프로퍼티가 보통 이미 존재하지만, 존재하지 않거나 쓰기 불가능한 경우 오류 처리는 S에 따라 결정됩니다. 호출 시 다음 단계를 수행합니다:

  1. DclRecenvRec.[[DeclarativeRecord]]로 둔다.
  2. DclRec.HasBinding(N)이 true라면,
    1. DclRec.SetMutableBinding(N, V, S)을 반환한다.
  3. ObjRecenvRec.[[ObjectRecord]]로 둔다.
  4. ObjRec.SetMutableBinding(N, V, S)을 반환한다.

9.1.1.4.6 GetBindingValue ( N, S )

전역 환경 레코드 envRec의 GetBindingValue 구체 메서드는 N (문자열)과 S (불리언)를 인자로 받아 ECMAScript 언어 값을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 이름이 N인 바인딩된 식별자의 값을 반환합니다. 바인딩이 초기화되지 않은 바인딩이면 ReferenceError 예외를 발생시킵니다. N이라는 이름의 프로퍼티가 보통 이미 존재하지만, 존재하지 않거나 쓰기 불가능한 경우 결과는 S에 따라 결정됩니다. 호출 시 다음 단계를 수행합니다:

  1. DclRecenvRec.[[DeclarativeRecord]]로 둔다.
  2. DclRec.HasBinding(N)이 true라면,
    1. DclRec.GetBindingValue(N, S)을 반환한다.
  3. ObjRecenvRec.[[ObjectRecord]]로 둔다.
  4. ObjRec.GetBindingValue(N, S)을 반환한다.

9.1.1.4.7 DeleteBinding ( N )

전역 환경 레코드 envRec의 DeleteBinding 구체 메서드는 N (문자열)을 인자로 받아 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 삭제 대상임이 명시적으로 지정된 바인딩만 삭제할 수 있습니다. 호출 시 다음 단계를 수행합니다:

  1. DclRecenvRec.[[DeclarativeRecord]]로 둔다.
  2. DclRec.HasBinding(N)이 true라면,
    1. DclRec.DeleteBinding(N)을 반환한다.
  3. ObjRecenvRec.[[ObjectRecord]]로 둔다.
  4. globalObjectObjRec.[[BindingObject]]로 둔다.
  5. existingProp를 ? HasOwnProperty(globalObject, N)로 둔다.
  6. existingProptrue라면,
    1. ObjRec.DeleteBinding(N)을 반환한다.
  7. true를 반환한다.

9.1.1.4.8 HasThisBinding ( )

전역 환경 레코드 envRec의 HasThisBinding 구체 메서드는 인자가 없으며 true를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. true를 반환한다.
참고

전역 환경 레코드는 항상 this 바인딩을 제공합니다.

9.1.1.4.9 HasSuperBinding ( )

전역 환경 레코드 envRec의 HasSuperBinding 구체 메서드는 인자가 없으며 false를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. false를 반환한다.
참고

전역 환경 레코드super 바인딩을 제공하지 않습니다.

9.1.1.4.10 WithBaseObject ( )

전역 환경 레코드 envRec의 WithBaseObject 구체 메서드는 인자가 없으며 undefined를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. undefined를 반환한다.

9.1.1.4.11 GetThisBinding ( )

전역 환경 레코드 envRec의 GetThisBinding 구체 메서드는 인자가 없으며 객체를 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. envRec.[[GlobalThisValue]]를 반환한다.

9.1.1.4.12 HasLexicalDeclaration ( envRec, N )

추상 연산 HasLexicalDeclaration은 envRec (전역 환경 레코드)와 N (문자열)을 인자로 받아 불리언을 반환합니다. 이 연산은 인자 식별자가 LexicalDeclaration 또는 ClassDeclaration과 같은 렉시컬 선언을 사용해 envRec에 바인딩되어 있는지 판단합니다. 호출 시 다음 단계를 수행합니다:

  1. DclRecenvRec.[[DeclarativeRecord]]로 둔다.
  2. DclRec.HasBinding(N)을 반환한다.

9.1.1.4.13 HasRestrictedGlobalProperty ( envRec, N )

추상 연산 HasRestrictedGlobalProperty는 envRec (전역 환경 레코드)와 N (문자열)을 인자로 받아 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 연산은 인자 식별자가 글로벌 객체의 글로벌 렉시컬 바인딩에 의해 가려져서는 안 되는 프로퍼티 이름인지 판단합니다. 호출 시 다음 단계를 수행합니다:

  1. ObjRecenvRec.[[ObjectRecord]]로 둔다.
  2. globalObjectObjRec.[[BindingObject]]로 둔다.
  3. existingProp를 ? globalObject.[[GetOwnProperty]](N)로 둔다.
  4. existingPropundefined라면 false를 반환한다.
  5. existingProp.[[Configurable]]true라면 false를 반환한다.
  6. true를 반환한다.
참고

글로벌 객체에 var나 function 선언을 사용하지 않고 직접 생성된 프로퍼티가 존재할 수 있습니다. 글로벌 렉시컬 바인딩은 글로벌 객체의 non-configurable 프로퍼티와 같은 이름으로는 생성될 수 없습니다. "undefined" 글로벌 프로퍼티가 그 예입니다.

9.1.1.4.14 CanDeclareGlobalVar ( envRec, N )

추상 연산 CanDeclareGlobalVar는 envRec (전역 환경 레코드)와 N (문자열)을 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 연산은 동일한 N 인자로 CreateGlobalVarBinding을 호출할 경우 성공할지 판단합니다. 중복 var 선언 및 기존 글로벌 객체 프로퍼티에 대한 var 선언은 허용됩니다. 호출 시 다음 단계를 수행합니다:

  1. ObjRecenvRec.[[ObjectRecord]]로 둔다.
  2. globalObjectObjRec.[[BindingObject]]로 둔다.
  3. hasProperty를 ? HasOwnProperty(globalObject, N)로 둔다.
  4. hasPropertytrue라면 true를 반환한다.
  5. IsExtensible(globalObject)를 반환한다.

9.1.1.4.15 CanDeclareGlobalFunction ( envRec, N )

추상 연산 CanDeclareGlobalFunction은 envRec (전역 환경 레코드)와 N (문자열)을 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 연산은 동일한 N 인자로 CreateGlobalFunctionBinding을 호출할 경우 성공할지 판단합니다. 호출 시 다음 단계를 수행합니다:

  1. ObjRecenvRec.[[ObjectRecord]]로 둔다.
  2. globalObjectObjRec.[[BindingObject]]로 둔다.
  3. existingProp를 ? globalObject.[[GetOwnProperty]](N)로 둔다.
  4. existingPropundefined라면, ? IsExtensible(globalObject)를 반환한다.
  5. existingProp.[[Configurable]]true라면 true를 반환한다.
  6. IsDataDescriptor(existingProp)가 true이고 existingProp의 특성 값이 { [[Writable]]: true, [[Enumerable]]: true }라면 true를 반환한다.
  7. false를 반환한다.

9.1.1.4.16 CreateGlobalVarBinding ( envRec, N, D )

추상 연산 CreateGlobalVarBinding은 envRec (전역 환경 레코드), N (문자열), D (불리언)를 인자로 받아, unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 연관된 객체 환경 레코드에 변경 가능한 바인딩을 생성 및 초기화합니다. 바인딩이 이미 존재한다면 재사용하며, 이미 초기화된 것으로 간주합니다. 호출 시 다음 단계를 수행합니다:

  1. ObjRecenvRec.[[ObjectRecord]]로 둔다.
  2. globalObjectObjRec.[[BindingObject]]로 둔다.
  3. hasProperty를 ? HasOwnProperty(globalObject, N)로 둔다.
  4. extensible을 ? IsExtensible(globalObject)로 둔다.
  5. hasPropertyfalse이고 extensibletrue라면,
    1. ObjRec.CreateMutableBinding(N, D)을 수행한다.
    2. ObjRec.InitializeBinding(N, undefined)을 수행한다.
  6. unused를 반환한다.

9.1.1.4.17 CreateGlobalFunctionBinding ( envRec, N, V, D )

추상 연산 CreateGlobalFunctionBinding은 envRec (전역 환경 레코드), N (문자열), V (ECMAScript 언어 값), D (불리언)를 인자로 받아, unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 연관된 객체 환경 레코드에 변경 가능한 바인딩을 생성 및 초기화합니다. 바인딩이 이미 존재한다면 대체합니다. 호출 시 다음 단계를 수행합니다:

  1. ObjRecenvRec.[[ObjectRecord]]로 둔다.
  2. globalObjectObjRec.[[BindingObject]]로 둔다.
  3. existingProp를 ? globalObject.[[GetOwnProperty]](N)로 둔다.
  4. existingPropundefined이거나 existingProp.[[Configurable]]true라면,
    1. desc를 PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: D }로 둔다.
  5. 그 외의 경우,
    1. desc를 PropertyDescriptor { [[Value]]: V }로 둔다.
  6. DefinePropertyOrThrow(globalObject, N, desc)을 수행한다.
  7. Set(globalObject, N, V, false)을 수행한다.
  8. unused를 반환한다.
참고

전역 함수 선언은 항상 글로벌 객체의 own 프로퍼티로 표현됩니다. 가능할 경우, 기존 own 프로퍼티를 표준 특성 값 집합을 가지도록 재설정합니다. 7 단계는 InitializeBinding 구체 메서드를 호출하는 것과 동등하며, globalObject가 Proxy인 경우 동일한 Proxy trap 호출 시퀀스를 생성합니다.

9.1.1.5 모듈 환경 레코드

모듈 환경 레코드선언적 환경 레코드로, ECMAScript Module의 외부 스코프를 표현하는 데 사용됩니다. 일반적인 변경 가능/불변 바인딩 외에, 모듈 환경 레코드는 다른 환경 레코드에 존재하는 대상 바인딩에 간접적으로 접근할 수 있는 변경 불가능한 import 바인딩도 제공합니다.

모듈 환경 레코드는 선언적 환경 레코드의 모든 메서드(표 16 참조)를 지원하며, GetBindingValue, DeleteBinding, HasThisBinding, GetThisBinding을 제외한 모든 메서드는 동일한 명세를 따릅니다. 또한, 모듈 환경 레코드는 표 22에 나열된 메서드들도 지원합니다:

표 22: 모듈 환경 레코드의 추가 메서드
메서드 목적
GetThisBinding() 환경 레코드this 바인딩의 값을 반환합니다.

9.1.1.5.1 GetBindingValue ( N, S )

모듈 환경 레코드 envRec의 GetBindingValue 구체 메서드는 N (문자열), S (불리언)를 인자로 받아 ECMAScript 언어 값을 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 메서드는 이름이 N인 바인딩된 식별자의 값을 반환합니다. 단, 바인딩이 간접 바인딩인 경우 대상 바인딩의 값을 반환합니다. 바인딩이 존재하지만 아직 초기화되지 않았다면 ReferenceError가 발생합니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: Strue임을 보장한다.
  2. Assert: envRecN에 대한 바인딩이 존재함을 보장한다.
  3. N에 대한 바인딩이 간접 바인딩이라면,
    1. 이 바인딩이 생성될 때 제공된 indirection 값 MN2를 얻는다.
    2. targetEnvM.[[Environment]]로 둔다.
    3. targetEnvempty라면 ReferenceError 예외를 발생시킨다.
    4. targetEnv.GetBindingValue(N2, true)를 반환한다.
  4. envRecN에 대한 바인딩이 초기화되지 않았다면 ReferenceError 예외를 발생시킨다.
  5. envRecN에 현재 바인딩된 값을 반환한다.
참고

S는 항상 true입니다. 왜냐하면 Module은 항상 엄격 모드 코드이기 때문입니다.

9.1.1.5.2 DeleteBinding ( N )

모듈 환경 레코드의 DeleteBinding 구체 메서드는 이 명세 안에서 사용되지 않습니다.

참고

모듈 환경 레코드는 엄격 코드 내에서만 사용되며, 조기 오류 규칙에 의해 엄격 코드 내에서 Reference Record모듈 환경 레코드 바인딩으로 해석되는 경우 delete 연산자를 사용할 수 없습니다. 13.5.1.1 참고.

9.1.1.5.3 HasThisBinding ( )

모듈 환경 레코드 envRec의 HasThisBinding 구체 메서드는 인자가 없으며 true를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. true를 반환한다.
참고

모듈 환경 레코드는 항상 this 바인딩을 제공합니다.

9.1.1.5.4 GetThisBinding ( )

모듈 환경 레코드 envRec의 GetThisBinding 구체 메서드는 인자가 없으며 undefined를 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. undefined를 반환한다.

9.1.1.5.5 CreateImportBinding ( envRec, N, M, N2 )

추상 연산 CreateImportBinding은 envRec (모듈 환경 레코드), N (문자열), M (모듈 레코드), N2 (문자열)을 인자로 받아 unused를 반환합니다. N에 대해 초기화된 변경 불가능한 간접 바인딩을 새롭게 생성합니다. envRec 내에 이미 N에 대한 바인딩이 존재해서는 안 됩니다. N2M모듈 환경 레코드에 존재하는 바인딩의 이름입니다. 새 바인딩에 대한 값 접근은 간접적으로 대상 바인딩의 값을 접근합니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: envRecN에 대한 바인딩이 이미 존재하지 않음을 보장한다.
  2. Assert: M.[[Environment]]가 인스턴스화될 때 N2에 대한 직접 바인딩을 가지게 됨을 보장한다.
  3. envRecN에 대해 MN2를 대상 바인딩으로 참조하는 변경 불가능한 간접 바인딩을 생성하고, 이 바인딩이 초기화되었음을 기록한다.
  4. unused를 반환한다.

9.1.2 환경 레코드 연산

다음의 추상 연산들은 이 명세에서 환경 레코드에 대해 동작할 때 사용됩니다:

9.1.2.1 GetIdentifierReference ( env, name, strict )

추상 연산 GetIdentifierReference는 env (환경 레코드 또는 null), name (문자열), strict (불리언)을 인자로 받아, Reference Record를 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. envnull이면,
    1. Reference Record { [[Base]]: unresolvable, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty }를 반환한다.
  2. exists를 ? env.HasBinding(name)로 둔다.
  3. existstrue이면,
    1. Reference Record { [[Base]]: env, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty }를 반환한다.
  4. 그 외의 경우,
    1. outerenv.[[OuterEnv]]로 둔다.
    2. GetIdentifierReference(outer, name, strict)를 반환한다.

9.1.2.2 NewDeclarativeEnvironment ( E )

추상 연산 NewDeclarativeEnvironment는 E (환경 레코드 또는 null)를 인자로 받아 선언적 환경 레코드를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. env를 새로운 선언적 환경 레코드 (바인딩 없음)로 둔다.
  2. env.[[OuterEnv]]E로 설정한다.
  3. env를 반환한다.

9.1.2.3 NewObjectEnvironment ( O, W, E )

추상 연산 NewObjectEnvironment는 O (객체), W (불리언), E (환경 레코드 또는 null)를 인자로 받아 객체 환경 레코드를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. env를 새로운 객체 환경 레코드로 둔다.
  2. env.[[BindingObject]]O로 설정한다.
  3. env.[[IsWithEnvironment]]W로 설정한다.
  4. env.[[OuterEnv]]E로 설정한다.
  5. env를 반환한다.

9.1.2.4 NewFunctionEnvironment ( F, newTarget )

추상 연산 NewFunctionEnvironment는 F (ECMAScript 함수 객체), newTarget (객체 또는 undefined)를 인자로 받아 함수 환경 레코드를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. env를 새로운 함수 환경 레코드 (바인딩 없음)로 둔다.
  2. env.[[FunctionObject]]F로 설정한다.
  3. F.[[ThisMode]]lexical이면, env.[[ThisBindingStatus]]lexical로 설정한다.
  4. 그 외의 경우, env.[[ThisBindingStatus]]uninitialized로 설정한다.
  5. env.[[NewTarget]]newTarget로 설정한다.
  6. env.[[OuterEnv]]F.[[Environment]]로 설정한다.
  7. env를 반환한다.

9.1.2.5 NewGlobalEnvironment ( G, thisValue )

추상 연산 NewGlobalEnvironment는 G (객체), thisValue (객체)를 인자로 받아 전역 환경 레코드를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. objRecNewObjectEnvironment(G, false, null)로 둔다.
  2. dclRecNewDeclarativeEnvironment(null)로 둔다.
  3. env를 새로운 전역 환경 레코드로 둔다.
  4. env.[[ObjectRecord]]objRec로 설정한다.
  5. env.[[GlobalThisValue]]thisValue로 설정한다.
  6. env.[[DeclarativeRecord]]dclRec로 설정한다.
  7. env.[[OuterEnv]]null로 설정한다.
  8. env를 반환한다.

9.1.2.6 NewModuleEnvironment ( E )

추상 연산 NewModuleEnvironment는 E (환경 레코드)를 인자로 받아 모듈 환경 레코드를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. env를 새로운 모듈 환경 레코드 (바인딩 없음)로 둔다.
  2. env.[[OuterEnv]]E로 설정한다.
  3. env를 반환한다.

9.2 PrivateEnvironment 레코드

PrivateEnvironment 레코드는 ECMAScript 코드 내의 ClassDeclarationClassExpression의 렉시컬 중첩 구조를 기반으로 Private Name을 추적하기 위해 사용되는 명세 메커니즘입니다. 이들은 환경 레코드와 유사하지만 구분됩니다. 각 PrivateEnvironment 레코드는 하나의 ClassDeclaration 또는 ClassExpression에 연관됩니다. 해당 클래스가 평가될 때마다, 그 클래스에서 선언된 Private Name을 기록하기 위해 새로운 PrivateEnvironment 레코드가 생성됩니다.

PrivateEnvironment 레코드표 23에 정의된 필드를 가집니다.

표 23: PrivateEnvironment 레코드 필드
필드명 값 타입 의미
[[OuterPrivateEnvironment]] PrivateEnvironment 레코드 또는 null 가장 가까운 포함 클래스의 PrivateEnvironment 레코드. 이 PrivateEnvironment 레코드가 연관된 클래스가 다른 클래스에 포함되어 있지 않으면 null.
[[Names]] List of Private Name 이 클래스가 선언한 Private Name 목록.

9.2.1 PrivateEnvironment 레코드 연산

다음의 추상 연산들은 이 명세에서 PrivateEnvironment 레코드에 대해 동작할 때 사용됩니다:

9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )

추상 연산 NewPrivateEnvironment는 outerPrivateEnv (PrivateEnvironment 레코드 또는 null)를 인자로 받아 PrivateEnvironment 레코드를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. names를 새로운 빈 List로 둔다.
  2. PrivateEnvironment 레코드 { [[OuterPrivateEnvironment]]: outerPrivateEnv, [[Names]]: names }를 반환한다.

9.2.1.2 ResolvePrivateIdentifier ( privateEnv, identifier )

추상 연산 ResolvePrivateIdentifier는 privateEnv (PrivateEnvironment 레코드), identifier (문자열)를 인자로 받아 Private Name를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. namesprivateEnv.[[Names]]로 둔다.
  2. names의 각 Private Name pn에 대해,
    1. pn.[[Description]]identifier라면,
      1. pn를 반환한다.
  3. outerPrivateEnvprivateEnv.[[OuterPrivateEnvironment]]로 둔다.
  4. Assert: outerPrivateEnvnull이 아님을 보장한다.
  5. ResolvePrivateIdentifier(outerPrivateEnv, identifier)를 반환한다.

9.3 Realm

평가되기 전에, 모든 ECMAScript 코드는 realm에 연관되어야 합니다. 개념적으로, realm은 일련의 내장 객체 집합, ECMAScript 글로벌 환경, 그 글로벌 환경의 범위 내에서 로드된 모든 ECMAScript 코드, 기타 관련 상태와 리소스로 구성됩니다.

realm은 이 명세에서 Realm Record로 표현되며, 표 24에 명시된 필드를 가집니다:

표 24: Realm Record 필드
필드명 의미
[[AgentSignifier]] agent signifier realm을 소유하는 agent
[[Intrinsics]] Record (필드명은 intrinsic 키, 값은 객체) realm에 연관된 코드가 사용하는 intrinsic 값들
[[GlobalObject]] 객체 realm글로벌 객체
[[GlobalEnv]] 전역 환경 레코드 realm의 글로벌 환경
[[TemplateMap]] List of Records (필드: [[Site]] (TemplateLiteral Parse Node), [[Array]] (배열))

템플릿 객체는 각 realm마다 Realm Record[[TemplateMap]]을 사용해 별도로 정규화됩니다. 각 [[Site]] 값은 Parse Node이며, TemplateLiteral입니다. 연관된 [[Array]] 값은 태그 함수에 전달되는 해당 템플릿 객체입니다.

참고 1
어떤 Parse Node가 도달 불가능해지면, 그에 대응하는 [[Array]]도 도달 불가능해지며, 구현체가 그 쌍을 [[TemplateMap]] 리스트에서 제거하더라도 관찰 불가합니다.
[[LoadedModules]] List of LoadedModuleRequest Record

realm이 import한 specifier 문자열에서 해석된 Module Record로의 맵입니다. 리스트에는 Record r1, r2가 ModuleRequestsEqual(r1, r2)가 true인 경우 같이 존재할 수 없습니다.

참고 2
HostLoadImportedModule (16.2.1.10 참고 1)에서 언급했듯, Realm Record[[LoadedModules]]import() 표현식이 active script나 module이 없는 컨텍스트에서 실행될 때만 사용됩니다.
[[HostDefined]] 아무 값 (기본값은 undefined) 호스트Realm Record에 추가 정보를 연결할 필요가 있을 때 사용하는 필드입니다.

9.3.1 InitializeHostDefinedRealm ( )

추상 연산 InitializeHostDefinedRealm는 인자가 없으며, unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. realm을 새로운 Realm Record로 둔다.
  2. CreateIntrinsics(realm)을 수행한다.
  3. realm.[[AgentSignifier]]AgentSignifier()로 설정한다.
  4. realm.[[TemplateMap]]을 새로운 빈 List로 설정한다.
  5. newContext를 새로운 실행 컨텍스트로 둔다.
  6. newContext의 Function을 null로 설정한다.
  7. newContextRealmrealm으로 설정한다.
  8. newContext의 ScriptOrModule을 null로 설정한다.
  9. newContext실행 컨텍스트 스택에 푸시한다; newContext실행 중인 실행 컨텍스트가 된다.
  10. 호스트realm글로벌 객체익조틱 객체를 사용해야 한다면,
    1. global을 그런 객체로, 호스트 정의 방식으로 생성한다.
  11. 그 외의 경우,
    1. globalOrdinaryObjectCreate(realm.[[Intrinsics]].[[%Object.prototype%]])로 둔다.
  12. 호스트realm의 글로벌 스코프의 this 바인딩이 글로벌 객체 이외의 객체를 반환해야 한다면,
    1. thisValue를 그런 객체로, 호스트 정의 방식으로 생성한다.
  13. 그 외의 경우,
    1. thisValueglobal로 둔다.
  14. realm.[[GlobalObject]]global로 설정한다.
  15. realm.[[GlobalEnv]]NewGlobalEnvironment(global, thisValue)로 설정한다.
  16. SetDefaultGlobalBindings(realm)을 수행한다.
  17. 호스트 정의 글로벌 객체 프로퍼티들을 global에 생성한다.
  18. unused를 반환한다.

9.3.2 CreateIntrinsics ( realmRec )

추상 연산 CreateIntrinsics는 realmRec (Realm Record)를 인자로 받아 unused를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. realmRec.[[Intrinsics]]를 새로운 Record로 설정한다.
  2. realmRec.[[Intrinsics]]의 각 필드를 표 6에 명시된 값들로 설정한다. 필드명은 표의 첫 번째 열에 기재된 이름이다. 각 필드의 값은, 이 명세의 각 객체 명세에 따라 완전히, 재귀적으로 프로퍼티 값이 채워진 새로운 객체 값이다. 모든 객체 프로퍼티 값은 새로 생성된 객체 값이어야 한다. 내장 함수 객체인 값은 CreateBuiltinFunction(steps, length, name, slots, realmRec, prototype)을 수행하여 생성한다. steps는 명세에 정의된 함수 정의, name은 함수의 "name" 프로퍼티 초기값, length"length" 초기값, slots는 함수의 내부 슬롯명(있으면), prototype은 함수의 [[Prototype]] 내부 슬롯의 명세 값이다. intrinsic 및 그 프로퍼티 생성 순서는 아직 생성되지 않은 객체에 의존하지 않도록 해야 한다.
  3. AddRestrictedFunctionProperties(realmRec.[[Intrinsics]].[[%Function.prototype%]], realmRec)을 수행한다.
  4. unused를 반환한다.

9.3.3 SetDefaultGlobalBindings ( realmRec )

추상 연산 SetDefaultGlobalBindings는 realmRec (Realm Record)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. globalrealmRec.[[GlobalObject]]로 둔다.
  2. 19 절에 명시된 글로벌 객체의 각 프로퍼티에 대해,
    1. name프로퍼티 이름의 문자열 값으로 둔다.
    2. desc를 완전히 채워진 데이터 Property Descriptor로 둔다. 여기에는 프로퍼티에 대한 명시된 특성이 포함된다. 19.2, 19.3, 19.4에 나열된 프로퍼티의 경우 [[Value]] 특성 값은 realmRec의 해당 intrinsic 객체이다.
    3. DefinePropertyOrThrow(global, name, desc)를 수행한다.
  3. unused를 반환한다.

9.4 실행 컨텍스트

실행 컨텍스트는 ECMAScript 구현체가 코드의 런타임 평가를 추적하기 위해 사용하는 명세 장치입니다. 특정 시점에, 실제로 코드를 실행 중인 agent마다 최대 하나의 실행 컨텍스트만 존재할 수 있습니다. 이를 agent실행 중인 실행 컨텍스트라 합니다. 이 명세에서 실행 중인 실행 컨텍스트에 대한 모든 참조는 상위 agent실행 중인 실행 컨텍스트를 나타냅니다.

실행 컨텍스트 스택은 실행 컨텍스트들을 추적하는 데 사용됩니다. 실행 중인 실행 컨텍스트는 항상 이 스택의 맨 위 요소입니다. 현재 실행 중인 실행 컨텍스트와 연관된 실행 코드에서 아직 연관되지 않은 실행 코드로 제어가 이동할 때마다, 새 실행 컨텍스트가 생성되어 스택에 푸시되고 실행 중인 실행 컨텍스트가 됩니다.

실행 컨텍스트는 연관된 코드의 실행 진행을 추적하는 데 필요한 구현체 고유의 상태를 포함합니다. 각 실행 컨텍스트는 최소한 표 25에 나열된 상태 구성 요소를 가집니다.

표 25: 모든 실행 컨텍스트의 상태 구성 요소
구성 요소 목적
code evaluation state 실행 컨텍스트와 연관된 코드의 평가, 일시 중단, 재개를 수행하는 데 필요한 상태.
Function 실행 컨텍스트함수 객체의 코드를 평가 중이면, 이 구성 요소의 값은 해당 함수 객체입니다. 만약 Script 또는 Module의 코드를 평가 중이면, 값은 null입니다.
Realm 연관된 코드가 ECMAScript 리소스에 접근할 때 사용하는 Realm Record.
ScriptOrModule 연관된 코드가 기원한 Module Record 또는 Script Record. InitializeHostDefinedRealm에서 생성된 최초의 실행 컨텍스트처럼 기원 스크립트나 모듈이 없는 경우, 값은 null입니다.

Evaluation실행 중인 실행 컨텍스트에 의해 여러 정의된 지점에서 일시 중단될 수 있습니다. 일단 실행 중인 실행 컨텍스트가 일시 중단되면, 다른 실행 컨텍스트가 실행 중인 실행 컨텍스트가 되어 자신의 코드를 평가하기 시작할 수 있습니다. 이후 일시 중단된 실행 컨텍스트가 다시 실행 중인 실행 컨텍스트가 되어 코드 평가를 중단된 지점부터 재개할 수 있습니다. 실행 컨텍스트들 간의 실행 중인 실행 컨텍스트 상태의 전이는 보통 스택과 같은 후입선출(LIFO) 방식으로 발생합니다. 다만, 일부 ECMAScript 기능은 실행 중인 실행 컨텍스트의 비-LIFO 전이를 요구합니다.

실행 중인 실행 컨텍스트Realm 구성 요소 값을 현재 Realm Record라고도 합니다. 실행 중인 실행 컨텍스트의 Function 구성 요소는 활성 함수 객체라고도 합니다.

ECMAScript 코드 실행 컨텍스트표 26에 나열된 추가 상태 구성 요소를 가집니다.

표 26: ECMAScript 코드 실행 컨텍스트의 추가 상태 구성 요소
구성 요소 목적
LexicalEnvironment 실행 컨텍스트 내 코드에서 식별자 참조를 해결할 때 사용하는 환경 레코드.
VariableEnvironment 실행 컨텍스트 내에서 VariableStatement에 의해 생성된 바인딩을 보관하는 환경 레코드.
PrivateEnvironment 가장 가까운 포함 클래스 내 ClassElement에 의해 생성된 Private Name을 보관하는 PrivateEnvironment 레코드. 포함 클래스가 없으면 null.

실행 컨텍스트의 LexicalEnvironment, VariableEnvironment 구성 요소는 항상 환경 레코드입니다.

Generator의 평가를 나타내는 실행 컨텍스트는 표 27에 나열된 추가 상태 구성 요소를 가집니다.

표 27: Generator 실행 컨텍스트의 추가 상태 구성 요소
구성 요소 목적
Generator 실행 컨텍스트가 평가하는 Generator.

대부분의 상황에서 이 명세 내 알고리즘이 직접 다루는 것은 실행 중인 실행 컨텍스트 (즉, 실행 컨텍스트 스택의 맨 위)입니다. 따라서 “LexicalEnvironment”, “VariableEnvironment”라는 용어가 한정 없이 사용될 때는 실행 중인 실행 컨텍스트의 해당 구성 요소를 의미합니다.

실행 컨텍스트는 순수 명세 메커니즘으로, ECMAScript 구현의 실제 산출물과 반드시 대응하지 않습니다. ECMAScript 코드가 실행 컨텍스트를 직접 접근하거나 관찰하는 것은 불가능합니다.

9.4.1 GetActiveScriptOrModule ( )

추상 연산 GetActiveScriptOrModule은 인자가 없으며, Script Record, Module Record 또는 null을 반환합니다. 실행 중인 실행 컨텍스트를 기반으로 현재 실행 중인 스크립트 또는 모듈을 결정하는 데 사용됩니다. 호출 시 다음 단계를 수행합니다:

  1. 실행 컨텍스트 스택이 비어있으면 null을 반환한다.
  2. ec실행 컨텍스트 스택에서 ScriptOrModule 구성 요소가 null이 아닌 맨 위의 실행 컨텍스트로 둔다.
  3. 그런 실행 컨텍스트가 존재하지 않으면 null을 반환하고, 그렇지 않으면 ec의 ScriptOrModule을 반환한다.

9.4.2 ResolveBinding ( name [ , env ] )

추상 연산 ResolveBinding은 name (문자열) 및 선택적 env (환경 레코드 또는 undefined)를 인자로 받아, Reference Record를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이 연산은 name의 바인딩을 결정하는 데 사용됩니다. env를 명시적으로 지정하면 해당 환경 레코드에서 바인딩을 탐색합니다. 호출 시 다음 단계를 수행합니다:

  1. env가 생략되었거나 envundefined라면,
    1. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 설정한다.
  2. Assert: env환경 레코드임을 보장한다.
  3. strictIsStrict(현재 평가 중인 구문 생성 규칙)로 둔다.
  4. GetIdentifierReference(env, name, strict)를 반환한다.
참고

ResolveBinding의 결과는 항상 [[ReferencedName]] 필드가 nameReference Record입니다.

9.4.3 GetThisEnvironment ( )

추상 연산 GetThisEnvironment는 인자가 없으며 환경 레코드를 반환합니다. 현재 키워드 this의 바인딩을 제공하는 환경 레코드를 찾습니다. 호출 시 다음 단계를 수행합니다:

  1. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 둔다.
  2. 반복,
    1. existsenv.HasThisBinding()으로 둔다.
    2. existstrue라면 env를 반환한다.
    3. outerenv.[[OuterEnv]]로 둔다.
    4. Assert: outernull이 아님을 보장한다.
    5. envouter로 설정한다.
참고

2 단계의 루프는 환경 리스트가 항상 this 바인딩을 가진 글로벌 환경에서 끝나므로 반드시 종료됩니다.

9.4.4 ResolveThisBinding ( )

추상 연산 ResolveThisBinding은 인자가 없으며 ECMAScript 언어 값을 포함하는 정상 완료 또는 throw completion을 반환합니다. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 사용하여 키워드 this의 바인딩을 결정합니다. 호출 시 다음 단계를 수행합니다:

  1. envRecGetThisEnvironment()로 둔다.
  2. envRec.GetThisBinding()을 반환한다.

9.4.5 GetNewTarget ( )

추상 연산 GetNewTarget은 인자가 없으며 객체 또는 undefined를 반환합니다. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 사용해 NewTarget 값을 결정합니다. 호출 시 다음 단계를 수행합니다:

  1. envRecGetThisEnvironment()로 둔다.
  2. Assert: envRec[[NewTarget]] 필드를 가지고 있음을 보장한다.
  3. envRec.[[NewTarget]]을 반환한다.

9.4.6 GetGlobalObject ( )

추상 연산 GetGlobalObject는 인자가 없으며 객체를 반환합니다. 현재 실행 중인 실행 컨텍스트가 사용하는 글로벌 객체를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. currentRealm현재 Realm Record로 둔다.
  2. currentRealm.[[GlobalObject]]를 반환한다.

9.5 잡과 잡을 큐에 넣는 호스트 연산

잡(Job)은 파라미터가 없는 추상 클로저(Abstract Closure)로, 다른 ECMAScript 계산이 현재 진행 중이 아닐 때 ECMAScript 계산을 시작합니다.

은 ECMAScript 호스트 환경에 의해 특정 에이전트에서 실행이 예약됩니다. 이 명세는 잡 예약을 위한 호스트 훅HostEnqueueGenericJob, HostEnqueueFinalizationRegistryCleanupJob, HostEnqueuePromiseJob, HostEnqueueTimeoutJob을 설명합니다. 이 명세의 호스트 훅은 잡 예약에 추가 제약을 가하는 방식에 따라 구성되어 있습니다. 호스트는 잡을 예약하는 추가 추상 연산을 정의할 수 있습니다. 이러한 연산은 추상 클로저realm(Realm Record 또는 null)를 인자로 받습니다. Realm Record가 제공되면, 이 연산들은 해당 realm을 소유하는 에이전트에서 미래의 어느 시점에 잡 실행을 예약합니다. realm 대신 null이 제공되면, 잡은 ECMAScript 코드를 실행하지 않습니다. 구현은 다음 요구사항을 따라야 합니다:

참고 1
호스트 환경의 스케줄링을 동일하게 처리할 필요는 없습니다. 예를 들어, 웹 브라우저와 Node.js는 Promise 처리 잡을 다른 작업보다 더 높은 우선순위로 취급합니다. 앞으로의 기능에서는 그렇게 높은 우선순위로 처리되지 않는 잡이 추가될 수도 있습니다.

특정 시점에 scriptOrModule(Script Record, Module Record 또는 null)이 다음 조건을 모두 만족하면 활성 스크립트 또는 모듈(active script or module)입니다:

특정 시점에 실행이 다음 조건을 모두 만족하면 ECMAScript 코드 평가 준비 상태(prepared to evaluate ECMAScript code)입니다:

참고 2

호스트 환경실행 컨텍스트 스택실행 컨텍스트를 푸시함으로써 코드 평가 준비 상태로 만들 수 있습니다. 구체적인 단계는 구현 정의입니다.

Realm의 구체적인 선택은 호스트 환경에 달려 있습니다. 이 초기 실행 컨텍스트Realm는 콜백 함수가 호출되기 전까지만 사용됩니다. Promise 핸들러 같은 관련 콜백 함수가 호출되면, 해당 호출은 자체적으로 실행 컨텍스트Realm를 푸시합니다.

특정 종류의 은 추가 준수 요구사항을 가집니다.

9.5.1 JobCallback 레코드

JobCallback 레코드Record 값으로, 함수 객체호스트 정의 값을 저장하는 데 사용됩니다. 을 통해 호스트가 큐에 넣는 함수 객체는 추가 호스트 정의 컨텍스트를 가질 수 있습니다. 그 상태를 전파하려면, 추상 클로저는 함수 객체를 직접 캡처하고 호출하지 말고, HostMakeJobCallbackHostCallJobCallback을 사용해야 합니다.

참고

예를 들어 WHATWG HTML 명세(https://html.spec.whatwg.org/)는 Promise 콜백의 incumbent settings object를 전파하기 위해 호스트 정의 값을 사용합니다.

JobCallback 레코드는 표 28에 나열된 필드를 가집니다.

표 28: JobCallback 레코드 필드
필드 명 의미
[[Callback]] 함수 객체 이 호출될 때 실행할 함수입니다.
[[HostDefined]] 임의의 값 (기본값 empty) 호스트가 사용하는 필드입니다.

9.5.2 HostMakeJobCallback ( callback )

호스트 정의 추상 연산 HostMakeJobCallback은 callback(함수 객체)를 인자로 받아 JobCallback 레코드를 반환합니다.

HostMakeJobCallback의 구현은 다음을 준수해야 합니다:

HostMakeJobCallback의 기본 구현은 호출 시 다음 단계를 수행합니다:

  1. JobCallback 레코드 { [[Callback]]: callback, [[HostDefined]]: empty }를 반환한다.

웹 브라우저가 아닌 ECMAScript 호스트는 HostMakeJobCallback의 기본 구현을 사용해야 합니다.

참고

이 연산은 콜백이 결국 예약·실행 책임이 있는 함수에 전달될 때 호출됩니다. 예를 들어 promise.then(thenAction)Promise.prototype.then을 호출할 때 thenAction에 대해 MakeJobCallback을 호출하며, 리액션 을 스케줄링할 때가 아닙니다.

9.5.3 HostCallJobCallback ( jobCallback, V, argumentsList )

호스트 정의 추상 연산 HostCallJobCallback은 jobCallback (JobCallback 레코드), V (ECMAScript 언어 값), argumentsList (List of ECMAScript 언어 값)을 인자로 받아, ECMAScript 언어 값을 포함하는 정상 완료 또는 throw completion을 반환합니다.

HostCallJobCallback의 구현은 다음을 준수해야 합니다:

  • Call(jobCallback.[[Callback]], V, argumentsList)를 수행하고 그 결과를 반환해야 합니다.
참고

이 요구사항은 호스트가 이 명세에서 정의한 함수 객체[[Call]] 동작을 변경할 수 없음을 의미합니다.

HostCallJobCallback의 기본 구현은 호출 시 다음 단계를 수행합니다:

  1. Assert: IsCallable(jobCallback.[[Callback]])가 true임을 보장한다.
  2. Call(jobCallback.[[Callback]], V, argumentsList)를 반환한다.

웹 브라우저가 아닌 ECMAScript 호스트는 HostCallJobCallback의 기본 구현을 사용해야 합니다.

9.5.4 HostEnqueueGenericJob ( job, realm )

호스트 정의 추상 연산 HostEnqueueGenericJob은 job( 추상 클로저), realm(Realm Record)를 인자로 받아 unused를 반환합니다. jobrealm이 소유한 에이전트realm에 예약합니다. 이 알고리즘에서 사용하는 추상 클로저는 우선순위나 순서 등 추가 제약 없이 예약되는 것을 의도합니다.

HostEnqueueGenericJob의 구현은 9.5의 요구사항을 따라야 합니다.

9.5.5 HostEnqueuePromiseJob ( job, realm )

호스트 정의 추상 연산 HostEnqueuePromiseJob은 job( 추상 클로저), realm(Realm Record 또는 null)를 인자로 받아 unused를 반환합니다. job을 미래의 어느 시점에 실행하도록 예약합니다. 이 알고리즘의 추상 클로저는 Promise 처리와 관련되거나 Promise 처리 연산과 같은 우선순위로 예약되는 것을 의도합니다.

HostEnqueuePromiseJob의 구현은 9.5의 요구사항과 다음을 따라야 합니다:

참고

NewPromiseResolveThenableJob이 반환하는 realm은 보통 then 함수 객체GetFunctionRealm을 호출한 결과입니다. NewPromiseReactionJob이 반환하는 realm은 핸들러가 undefined가 아니면 핸들러에 GetFunctionRealm을 호출한 결과, 핸들러가 undefinedrealmnull입니다. 둘 다 GetFunctionRealm이 비정상적으로 종료(예: 리보크된 Proxy에 호출)되면 realm은 호출 시점의 현재 Realm Record입니다. realmnull이면 사용자 ECMAScript 코드를 평가하지 않으며, 새로운 ECMAScript 객체(예: Error 객체)도 생성되지 않습니다. WHATWG HTML 명세(https://html.spec.whatwg.org/)는 예를 들어 realm을 스크립트 실행 가능 여부 점검, entry 개념 등에 사용합니다.

9.5.6 HostEnqueueTimeoutJob ( timeoutJob, realm, milliseconds )

호스트 정의 추상 연산 HostEnqueueTimeoutJob은 timeoutJob( 추상 클로저), realm(Realm Record), milliseconds(음이 아닌 유한 숫자)를 인자로 받아 unused를 반환합니다. timeoutJobrealm이 소유한 에이전트realm에서 최소 milliseconds 밀리초 후에 실행되도록 예약합니다.

HostEnqueueTimeoutJob의 구현은 9.5의 요구사항을 따라야 합니다.

9.6 에이전트

에이전트는 ECMAScript 실행 컨텍스트 집합, 실행 컨텍스트 스택, 실행 중인 실행 컨텍스트, 에이전트 레코드, 실행 스레드로 구성됩니다. 실행 스레드를 제외한 모든 구성 요소는 해당 에이전트에만 독점적으로 속합니다.

에이전트실행 스레드는 다른 에이전트와 독립적으로 해당 에이전트실행 컨텍스트에서 알고리즘 단계를 실행합니다. 단, 실행 스레드가 여러 에이전트에 의해 공유될 수는 있지만, 해당 스레드를 공유하는 에이전트 중 어느 것도 [[CanBlock]] 필드가 true에이전트 레코드를 가져서는 안 됩니다.

참고 1

예를 들어, 일부 웹 브라우저는 하나의 실행 스레드를 브라우저 창의 여러 무관한 탭에서 공유하기도 합니다.

에이전트실행 스레드가 알고리즘 단계를 실행하는 동안 그 에이전트는 해당 단계들의 상위 에이전트입니다. 이 단계들은 상위 에이전트를 사용해 에이전트가 보유한 명세 수준의 실행 객체들, 즉 실행 중인 실행 컨텍스트, 실행 컨텍스트 스택, 에이전트 레코드의 필드에 접근합니다.

에이전트 식별자(agent signifier)에이전트를 식별하기 위해 사용되는 전역적으로 유일한 불투명 값입니다.

표 29: 에이전트 레코드 필드
필드명 의미
[[LittleEndian]] 불리언 GetValueFromBufferSetValueInBuffer 알고리즘에서 isLittleEndian 파라미터가 필요할 때 계산되는 기본값입니다. 선택은 구현 정의이며, 구현에 가장 효율적인 대안을 선택해야 합니다. 일단 값이 관찰되면 변경될 수 없습니다.
[[CanBlock]] 불리언 에이전트가 블록할 수 있는지 여부를 결정합니다.
[[Signifier]] 에이전트 식별자 자신이 속한 에이전트 클러스터 내에서 에이전트를 유일하게 식별합니다.
[[IsLockFree1]] 불리언 1-바이트 값에 대한 원자적 연산이 lock-free라면 true, 아니면 false입니다.
[[IsLockFree2]] 불리언 2-바이트 값에 대한 원자적 연산이 lock-free라면 true, 아니면 false입니다.
[[IsLockFree8]] 불리언 8-바이트 값에 대한 원자적 연산이 lock-free라면 true, 아니면 false입니다.
[[CandidateExecution]] candidate execution 레코드 메모리 모델 참고.
[[KeptAlive]] List (객체 또는 심볼) 초기값은 새로운 빈 List로, 현재 이 끝날 때까지 생존해야 하는 객체/심볼 목록을 나타냅니다.
[[ModuleAsyncEvaluationCount]] 정수 초기값은 0이며, 비동기 또는 비동기 의존성이 있는 모듈의 [[AsyncEvaluationOrder]] 필드에 고유하게 증가하는 값을 할당하는 데 사용됩니다.

[[Signifier]], [[IsLockFree1]], [[IsLockFree2]]의 값은 에이전트 클러스터 내의 어떤 에이전트에라도 관찰되면 변경될 수 없습니다.

참고 2

[[IsLockFree1]][[IsLockFree2]]의 값은 반드시 하드웨어에 의해 결정되는 것은 아니며, 구현 선택에 따라 시간 및 ECMAScript 구현별로 달라질 수 있습니다.

[[IsLockFree4]] 필드는 없습니다. 4바이트 원자 연산은 항상 lock-free입니다.

실제로, 원자 연산이 어떤 종류의 락을 사용한다면 lock-free가 아닙니다. lock-free는 wait-free와는 다릅니다. lock-free 원자 연산을 완료하는 데 필요한 머신 스텝 수에 상한이 없습니다.

크기 n의 원자 접근이 lock-free여도, 크기 n의 비원자 접근의 (관측된) 원자성에 대해서는 아무것도 보장하지 않습니다. 비원자 접근은 여전히 여러 번의 별도 메모리 접근으로 수행될 수 있습니다. 자세한 내용은 ReadSharedMemoryWriteSharedMemory를 참고하세요.

참고 3

에이전트는 명세 메커니즘일 뿐이며, 실제 ECMAScript 구현의 어떤 구체적 산출물과 반드시 대응하지는 않습니다.

9.6.1 AgentSignifier ( )

추상 연산 AgentSignifier는 인자가 없으며 에이전트 식별자를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. AR상위 에이전트에이전트 레코드로 둔다.
  2. AR.[[Signifier]]를 반환한다.

9.6.2 AgentCanSuspend ( )

추상 연산 AgentCanSuspend는 인자가 없으며 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. AR상위 에이전트에이전트 레코드로 둔다.
  2. AR.[[CanBlock]]을 반환한다.
참고

일부 환경에서는 특정 에이전트가 일시 정지(suspend)하는 것이 비합리적일 수 있습니다. 예를 들어, 웹 브라우저 환경에서는 문서의 메인 이벤트 처리 스레드는 일시 정지를 허용하지 않으면서 워커의 이벤트 처리 스레드는 허용할 수 있습니다.

9.6.3 IncrementModuleAsyncEvaluationCount ( )

추상 연산 IncrementModuleAsyncEvaluationCount는 인자가 없으며 정수를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. AR상위 에이전트에이전트 레코드로 둔다.
  2. countAR.[[ModuleAsyncEvaluationCount]]로 둔다.
  3. AR.[[ModuleAsyncEvaluationCount]]count + 1로 설정한다.
  4. count를 반환한다.
참고

이 값은 보류 중인 모듈들 간의 상대적인 평가 순서를 추적하는 데만 사용됩니다. 구현은 보류 중인 모듈이 없을 때 [[ModuleAsyncEvaluationCount]]를 0으로 눈에 띄지 않게 초기화할 수 있습니다.

9.7 에이전트 클러스터

에이전트 클러스터는 공유 메모리에서 동작하여 통신할 수 있는 에이전트의 최대 집합입니다.

참고 1

서로 다른 에이전트 내의 프로그램들은 명세되지 않은 방법으로 메모리를 공유할 수 있습니다. 최소한, SharedArrayBuffer의 백업 메모리는 클러스터 내의 에이전트들 간에 공유될 수 있습니다.

메시지 전달로는 통신할 수 있지만 메모리는 공유할 수 없는 에이전트가 있을 수 있습니다. 이들은 결코 같은 에이전트 클러스터에 속하지 않습니다.

모든 에이전트는 정확히 하나의 에이전트 클러스터에 속합니다.

참고 2

클러스터 내의 에이전트가 항상 동시에 살아 있을 필요는 없습니다. 에이전트 A가 또 다른 에이전트 B를 생성한 뒤 A가 종료되고, B에이전트 C를 생성했다고 합시다. 만약 AB와 메모리를 공유할 수 있고, BC와 메모리를 공유할 수 있다면, 세 에이전트는 같은 클러스터에 속합니다.

클러스터 내의 모든 에이전트는 각각의 에이전트 레코드[[LittleEndian]] 필드 값이 동일해야 합니다.

참고 3

에이전트 클러스터 내의 서로 다른 에이전트[[LittleEndian]] 값이 다르면, 멀티바이트 데이터의 공유 메모리 사용이 어려워집니다.

클러스터 내의 모든 에이전트는 각각의 에이전트 레코드[[IsLockFree1]] 필드 값이 동일해야 하며, [[IsLockFree2]] 필드도 마찬가지입니다.

클러스터 내의 모든 에이전트는 각각의 에이전트 레코드[[Signifier]] 값이 달라야 합니다.

임베딩(embedding)은 에이전트의 지식이나 협조 없이 에이전트의 진행을 중단(비활성화)하거나 재개(활성화)할 수 있습니다. 이럴 경우, 임베딩은 클러스터 내 일부 에이전트만 활성 상태로 두고 나머지 에이전트를 무기한 비활성화된 상태로 남겨두어서는 안 됩니다.

참고 4

이 제한의 목적은 다른 에이전트가 비활성화되어 있는 동안 어떤 에이전트가 교착 상태에 빠지거나 기아 상태에 빠지는 상황을 방지하기 위함입니다. 예를 들어, 문서와 독립적인 수명을 가진 HTML shared worker가, 그런 독립 문서의 dedicated worker와 메모리를 공유할 수 있도록 허용한다면, 그리고 문서와 그 dedicated worker가 dedicated worker가 락을 보유한 상태에서 비활성화된다면(예: 문서가 윈도우의 history에 푸시됨), shared worker가 그 락을 얻으려 하면 dedicated worker가 다시 활성화될 때까지(혹은 영원히) 대기하게 됩니다. 그 동안 다른 윈도우의 워커들이 shared worker에 접근하려 하면 기아 상태가 됩니다.

이 제한의 의미는 임베딩 내 같은 suspend/wake 집합에 속하지 않은 에이전트끼리는 메모리 공유가 불가능하다는 점입니다.

임베딩은 클러스터 내 다른 에이전트의 사전 지식이나 협조 없이 에이전트를 종료시킬 수 있습니다. 만약 에이전트가 자기 자신이나 클러스터 내 다른 에이전트의 프로그래밍적 동작이 아니라 클러스터 외부의 힘에 의해 종료된다면, 임베딩은 두 가지 전략 중 하나를 선택해야 합니다: 클러스터 내 모든 에이전트를 종료시키거나, 클러스터 내 남은 구성원이 종료 사실을 감지할 수 있도록 신뢰할 수 있는 API를 제공하고, 종료 데이터에는 종료된 에이전트를 식별할 수 있는 충분한 정보를 포함해야 합니다.

참고 5

이런 종료의 예시로는: 별도 프로세스에서 실행되는 에이전트를 운영 체제나 사용자가 종료시키는 경우, 임베딩 자체가 같은 프로세스 내에서 실행되는 에이전트를 종료시키는 경우(에이전트별 자원 관리로 에이전트가 runaway임이 감지됨) 등이 있습니다.

아래 명세 값과 그로부터 추이적으로 도달 가능한 값들은 정확히 하나의 에이전트 클러스터에 속합니다.

클러스터 내 어떤 에이전트에 의한 ECMAScript 코드 평가 이전에, 클러스터 내 모든 에이전트 레코드[[CandidateExecution]] 필드는 초기 candidate execution으로 설정됩니다. 초기 candidate execution빈 candidate execution으로, [[EventsRecords]] 필드는, 각 에이전트에 대해, [[AgentSignifier]] 필드가 해당 에이전트에이전트 식별자이고, [[EventList]][[AgentSynchronizesWith]] 필드가 빈 ListAgent Events Record를 포함하는 List입니다.

참고 6

에이전트 클러스터 내 모든 에이전트에이전트 레코드[[CandidateExecution]] 필드에 있는 같은 candidate execution을 공유합니다. candidate execution메모리 모델에서 사용하는 명세 메커니즘입니다.

참고 7

에이전트 클러스터는 명세 메커니즘일 뿐이며, ECMAScript 구현의 어떤 실제 산출물과 반드시 대응하지는 않습니다.

9.8 전진 진행(Forward Progress)

에이전트전진 진행(forward progress)한다는 것은 이 명세에 따라 평가 단계를 수행하는 것입니다.

에이전트실행 중인 실행 컨텍스트가 동기적으로, 그리고 무기한 외부 이벤트를 기다릴 때 블록(blocked) 상태가 됩니다. 이 의미에서 블록될 수 있는 것은 에이전트에이전트 레코드[[CanBlock]] 필드가 true인 경우뿐입니다. 비차단(unblocked) 에이전트는 블록되지 않은 에이전트입니다.

구현체는 다음을 보장해야 합니다:

참고

이와 메모리 모델의 라이브니스 보장은 모든 seq-cst 쓰기가 결국 모든 에이전트에서 관찰 가능해짐을 보장합니다.

9.9 WeakRef 및 FinalizationRegistry 대상의 처리 모델

9.9.1 목표

이 명세는 어떤 객체나 심볼도 가비지 컬렉션된다는 보장을 하지 않습니다. 라이브(live)하지 않은 객체나 심볼은 오랜 시간이 지난 뒤에 해제될 수도 있고, 전혀 해제되지 않을 수도 있습니다. 이 때문에, 이 명세는 가비지 컬렉션에 의해 트리거되는 동작을 설명할 때 "may"라는 용어를 사용합니다.

WeakRefFinalizationRegistry의 의미론은 특정 시점에 발생하는 두 연산에 기반합니다:

  • WeakRef.prototype.deref가 호출될 때, (만약 undefined가 반환되지 않는다면) 참조 대상은 살아 있게 유지되며, 이후의 동기적 접근도 동일한 값을 반환합니다. 이 목록은 ClearKeptObjects 추상 연산을 사용해 동기 작업이 완료될 때 재설정됩니다.
  • FinalizationRegistry에 등록된 객체나 심볼이 도달 불가능해질 때, FinalizationRegistry의 cleanup 콜백 호출이, 동기 ECMAScript 실행이 완료된 뒤, 결국 일어날 수 있습니다. FinalizationRegistry cleanup은 CleanupFinalizationRegistry 추상 연산으로 수행됩니다.

이들 동작(ClearKeptObjects 또는 CleanupFinalizationRegistry)은 동기 ECMAScript 실행을 중단할 수 없습니다. 호스트가 더 긴 동기 ECMAScript 실행을 조립할 수도 있으므로, 이 명세는 ClearKeptObjectsCleanupFinalizationRegistry 예약을 호스트 환경에 위임합니다.

일부 ECMAScript 구현은 백그라운드에서, 또는 ECMAScript가 유휴 상태일 때 동작하는 가비지 컬렉터를 포함합니다. 호스트 환경CleanupFinalizationRegistry의 스케줄을 제어하도록 하면, finalizer 작업을 실행하기 위해 ECMAScript 실행을 재개할 수 있으므로, 보유 중인 값을 해제하고 전체 메모리 사용량을 줄일 수 있습니다.

9.9.2 라이브니스(Liveness)

어떤 객체/심볼 집합 S에 대해 S에 대한 가상 WeakRef-무시(hypothetical WeakRef-oblivious) 실행이란, S의 원소를 참조 대상으로 하는 WeakRefDeref의 결과가 항상 undefined를 반환하는 실행입니다.

참고 1
WeakRef-oblivious와 liveness는 두 가지 개념을 포착합니다. 첫째, WeakRef 자체는 참조 대상을 살아 있게 만들지 않습니다. 둘째, 라이브니스의 순환(cycles)은 값이 live임을 의미하지 않습니다. 예를 들어, v의 라이브니스 판정이 WeakRef 참조 대상 r의 라이브니스 판정에 의존할 때, r의 라이브니스는 v의 라이브니스를 전제할 수 없습니다(순환 논증 불가).
참고 2
WeakRef-obliviousness는 순환을 고려하기 위해 개별 값이 아닌 객체/심볼의 집합에 대해 정의됩니다. 만약 개별 값에 대해 정의한다면, 순환 내의 WeakRef 참조 대상은 그 정체성이 오직 순환 내 다른 WeakRef 참조 대상을 통해서만 관찰될지라도 live로 간주될 것입니다.
참고 3
구어적으로, 어떤 객체나 심볼이 포함된 모든 집합이 live라면, 그 객체나 심볼이 live라고 말합니다.

실행 중 아무 시점에서, 객체/심볼 집합 S가 다음 조건 중 하나를 만족하면 live라고 간주합니다:

  • S의 어떤 원소라도 어떤 에이전트[[KeptAlive]] List에 포함되어 있다.
  • S 내의 어떤 값의 정체성이 관찰되는, S에 대해 유효한 미래 가상 WeakRef-oblivious 실행이 존재한다.
참고 4
두 번째 조건은, 어떤 값의 정체성이 non-WeakRef 수단으로 관찰될 수 있다면 live임을 포착하려는 의도입니다. 값의 정체성은 엄격 동등성 비교나, Map의 키로 사용되는 것을 관찰함으로써 관찰될 수 있습니다.
참고 5

객체나 심볼이 필드, 내부 슬롯, 프로퍼티에 존재한다는 사실만으로 해당 값이 live임을 의미하지 않습니다. 예를 들어, 해당 값이 프로그램에 다시 전달되지 않는다면 관찰될 수 없습니다.

이것은 WeakMap의 키, WeakSet의 멤버, 그리고 FinalizationRegistry Cell 레코드의 [[WeakRefTarget]], [[UnregisterToken]] 필드에 해당합니다.

위 정의는, WeakMap 내의 키가 live가 아니라면, 해당 값 또한 반드시 live일 필요가 없음을 의미합니다.

참고 6
라이브니스는 WeakRef 엔진이 비워서는 안 되는 최소 보장입니다. 여기 정의된 라이브니스는 판정 불능(undecidable)입니다. 실제로 엔진은 도달성(reachability) 등 보수적 근사치를 사용합니다. 구현의 재량이 큽니다.

9.9.3 실행

아무 시점에서, 객체/심볼 집합 Slive가 아니라면, ECMAScript 구현은 다음 단계를 원자적으로 수행할 수 있습니다:

  1. S의 각 원소 value에 대해,
    1. ref.[[WeakRefTarget]]value인 모든 WeakRef ref에 대해,
      1. ref.[[WeakRefTarget]]empty로 설정한다.
    2. fg.[[Cells]]cell이 있고 cell.[[WeakRefTarget]]value인 모든 FinalizationRegistry fg레코드 cell에 대해,
      1. cell.[[WeakRefTarget]]empty로 설정한다.
      2. 선택적으로, HostEnqueueFinalizationRegistryCleanupJob(fg)을 수행한다.
    3. map.[[WeakMapData]]r이 있고 r.[[Key]]value인 모든 WeakMap map레코드 r에 대해,
      1. r.[[Key]]empty로 설정한다.
      2. r.[[Value]]empty로 설정한다.
    4. set.[[WeakSetData]]value가 포함된 모든 WeakSet set에 대해,
      1. set.[[WeakSetData]]의 값이 value인 요소를 empty 값으로 교체한다.
참고 1

라이브니스 정의와 함께, 이 절은 구현체가 WeakRef에 대해 적용할 수 있는 최적화를 명시합니다.

객체의 정체성을 관찰하지 않고 객체에 접근하는 것이 가능합니다. 도달하지 않는 객체의 프로퍼티에 대한 데드 변수 제거, 스칼라 치환 등 최적화가 허용됩니다. 이 경우 해당 객체를 가리키는 WeakRef가 관찰 가능하게 비워지는 것도 허용됩니다.

반면, 객체의 정체성이 관찰 가능하고, 해당 객체가 WeakRef[[WeakRefTarget]] 내부 슬롯에 있을 때, rematerialization 등 WeakRef를 관찰 가능하게 비우는 최적화는 금지됩니다.

HostEnqueueFinalizationRegistryCleanupJob 호출은 선택적이므로, FinalizationRegistry에 등록된 객체가 반드시 FinalizationRegistrylive로 유지하는 것은 아닙니다. 구현체는 어떤 이유로든 FinalizationRegistry 콜백을 생략할 수 있습니다(예: FinalizationRegistry 자체가 dead가 되거나, 앱이 종료 중인 경우 등).

참고 2

구현체는 non-live 객체/심볼의 최대 집합에 대해 반드시 WeakRef를 비울 필요는 없습니다.

구현체가 live가 아닌 S 집합에 대해 WeakRef를 비우기로 선택했다면, 이 정의는 S의 모든 값에 대해 동시에 WeakRef를 비워야 함을 요구합니다. 즉, 구현체가 v를 가리키는 WeakRef만 비우고, 나머지 WeakRef를 그대로 두어 v의 값을 관찰할 수 있다면, 이는 준수(conformant)하지 않습니다.

9.9.4 호스트 훅

9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob ( finalizationRegistry )

호스트 정의 추상 연산 HostEnqueueFinalizationRegistryCleanupJob은 finalizationRegistry (FinalizationRegistry)를 인자로 받아 unused를 반환합니다.

cleanupJobfinalizationRegistry를 캡처하고, 호출 시 다음 단계를 수행하는 파라미터 없는 추상 클로저로 둔다:

  1. cleanupResultCompletion(CleanupFinalizationRegistry(finalizationRegistry))로 둔다.
  2. cleanupResultabrupt completion이라면, 오류 리포팅을 위한 호스트 정의 단계를 수행한다.
  3. unused를 반환한다.

HostEnqueueFinalizationRegistryCleanupJob의 구현은 cleanupJob을 미래의 어느 시점에 실행하도록 예약합니다(가능하다면). 또한 9.5의 요구사항을 따라야 합니다.

9.10 ClearKeptObjects ( )

ClearKeptObjects 추상 연산은 인자를 받지 않으며 unused를 반환합니다. ECMAScript 구현은 동기적 ECMAScript 실행 시퀀스가 완료될 때 ClearKeptObjects를 호출해야 합니다. 호출 시 다음 단계를 수행합니다:

  1. agentRecord상위 에이전트에이전트 레코드로 둔다.
  2. agentRecord.[[KeptAlive]]를 새로운 빈 List로 설정한다.
  3. unused를 반환한다.

9.11 AddToKeptObjects ( value )

AddToKeptObjects 추상 연산은 value(객체 또는 심볼)를 인자로 받아 unused를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. agentRecord상위 에이전트에이전트 레코드로 둔다.
  2. agentRecord.[[KeptAlive]]value를 추가한다.
  3. unused를 반환한다.
참고
AddToKeptObjects 추상 연산이 대상 객체나 심볼로 호출되면, 대상은 ClearKeptObjects가 호출될 때까지 해당 대상을 강하게 참조하는 목록에 추가됩니다.

9.12 CleanupFinalizationRegistry ( finalizationRegistry )

CleanupFinalizationRegistry 추상 연산은 finalizationRegistry (FinalizationRegistry)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: finalizationRegistry[[Cells]][[CleanupCallback]] 내부 슬롯을 가진다.
  2. callbackfinalizationRegistry.[[CleanupCallback]]로 둔다.
  3. finalizationRegistry.[[Cells]]레코드 cell이 있고 cell.[[WeakRefTarget]]empty인 동안, 구현체는 다음 단계를 수행할 수 있다:
    1. 그런 cell 중 아무거나 선택한다.
    2. finalizationRegistry.[[Cells]]에서 cell을 제거한다.
    3. HostCallJobCallback(callback, undefined, « cell.[[HeldValue]] »)를 수행한다.
  4. unused를 반환한다.

9.13 CanBeHeldWeakly ( v )

CanBeHeldWeakly 추상 연산은 v (ECMAScript 언어 값)를 인자로 받아 불리언을 반환합니다. v가 약 참조로 사용하기에 적합할 때에만 true를 반환합니다. 약 참조로 사용하기에 적합한 값만 WeakMap의 키, WeakSet의 요소, WeakRef의 대상, 또는 FinalizationRegistry의 대상 중 하나가 될 수 있습니다. 호출 시 다음 단계를 수행합니다:

  1. v객체라면, true를 반환한다.
  2. v심볼이고 KeyForSymbol(v)가 undefined라면, true를 반환한다.
  3. false를 반환한다.
참고

언어 정체성(language identity)이 없는 언어 값은 사전 참조 없이 나타날 수 있으므로 약 참조로 사용하기에 부적합합니다. Symbol.for로 생성된 Symbol 값은 다른 Symbol 값과 달리 언어 정체성이 없으므로 약 참조로 사용하기에 부적합합니다. well-known 심볼은 거의 수집되지 않지만, 그 수가 제한적이므로 다양한 구현 방식으로 관리 가능해 약 참조로 사용에 적합하다고 봅니다. 그러나 live WeakMap에 well-known 심볼에 연관된 값이 있다면, 해당 값은 거의 수집되지 않으며 구현체에 따라 메모리 리소스가 "누수"될 수 있습니다.

10 일반 객체와 익조틱 객체의 동작

10.1 일반 객체 내부 메서드와 내부 슬롯

모든 일반 객체[[Prototype]]이라는 내부 슬롯을 갖습니다. 이 내부 슬롯의 값은 null 또는 객체이며, 상속을 구현하는 데 사용됩니다. 만약 속성 P일반 객체 O에 존재하지 않고, [[Prototype]] 객체에 존재한다면, P[[Prototype]] 객체의 데이터 프로퍼티를 참조하는 경우, O는 get 접근에 대해 상속하여 P가 마치 O의 프로퍼티인 것처럼 동작합니다. P[[Prototype]] 객체의 쓰기 가능한 데이터 프로퍼티를 참조하면, O에서 P에 set 접근 시 OP라는 새로운 데이터 프로퍼티가 생성됩니다. P[[Prototype]] 객체의 쓰기 불가능한 데이터 프로퍼티를 참조하면, O에서 P에 set 접근이 실패합니다. P[[Prototype]] 객체의 접근자 프로퍼티를 참조하면, 접근자는 O에 대해 get/set 모두 상속됩니다.

모든 일반 객체는 불리언 값의 [[Extensible]] 내부 슬롯을 가지며, 이는 6.1.7.3에 명시된 확장성 관련 내부 메서드 불변식을 충족시키는 데 사용됩니다. 즉, 객체의 [[Extensible]] 내부 슬롯 값이 false로 설정되면, 더 이상 객체에 프로퍼티를 추가하거나, [[Prototype]] 내부 슬롯을 수정하거나, [[Extensible]] 값을 다시 true로 변경할 수 없습니다.

이후 알고리즘 설명에서, O일반 객체, P프로퍼티 키 값, V는 임의의 ECMAScript 언어 값, Desc프로퍼티 디스크립터 레코드라 가정합니다.

일반 객체 내부 메서드는 같은 이름의 추상 연산에 위임합니다. 만약 그러한 추상 연산이 다른 내부 메서드에 의존하면, 직접 추상 연산을 호출하는 대신 O에서 내부 메서드를 호출합니다. 이러한 의미론은 익조틱 객체에 대해 일반 객체 내부 메서드를 적용할 때, 오버라이드된 내부 메서드가 호출되도록 보장합니다.

10.1.1 [[GetPrototypeOf]] ( )

일반 객체 O[[GetPrototypeOf]] 내부 메서드는 인자를 받지 않으며, 객체 또는 null을 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. OrdinaryGetPrototypeOf(O)를 반환한다.

10.1.1.1 OrdinaryGetPrototypeOf ( O )

OrdinaryGetPrototypeOf 추상 연산은 O (객체)를 인자로 받아, 객체 또는 null을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. O.[[Prototype]]을 반환한다.

10.1.2 [[SetPrototypeOf]] ( V )

일반 객체 O[[SetPrototypeOf]] 내부 메서드는 V(객체 또는 null)를 인자로 받아, 불리언을 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. OrdinarySetPrototypeOf(O, V)를 반환한다.

10.1.2.1 OrdinarySetPrototypeOf ( O, V )

OrdinarySetPrototypeOf 추상 연산은 O (객체), V (객체 또는 null)를 인자로 받아 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. currentO.[[Prototype]]으로 둔다.
  2. SameValue(V, current)가 true라면, true를 반환한다.
  3. extensibleO.[[Extensible]]로 둔다.
  4. extensiblefalse라면, false를 반환한다.
  5. pV로 둔다.
  6. donefalse로 둔다.
  7. 반복: donefalse인 동안,
    1. pnull이면,
      1. donetrue로 설정한다.
    2. 그 외 SameValue(p, O)가 true이면,
      1. false를 반환한다.
    3. 그 외,
      1. p.[[GetPrototypeOf]]일반 객체 내부 메서드(10.1.1)가 아니라면, donetrue로 설정한다.
      2. 그 외, pp.[[Prototype]]으로 설정한다.
  8. O.[[Prototype]]V로 설정한다.
  9. true를 반환한다.
참고

7 단계의 루프는 일반 객체 정의의 [[GetPrototypeOf]], [[SetPrototypeOf]]만을 사용하는 객체만 포함된 프로토타입 체인에 순환이 없음을 보장합니다.

10.1.3 [[IsExtensible]] ( )

일반 객체 O[[IsExtensible]] 내부 메서드는 인자를 받지 않으며, 불리언을 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. OrdinaryIsExtensible(O)를 반환한다.

10.1.3.1 OrdinaryIsExtensible ( O )

OrdinaryIsExtensible 추상 연산은 O (객체)를 인자로 받아 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. O.[[Extensible]]을 반환한다.

10.1.4 [[PreventExtensions]] ( )

일반 객체 O[[PreventExtensions]] 내부 메서드는 인자를 받지 않으며, true를 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. OrdinaryPreventExtensions(O)를 반환한다.

10.1.4.1 OrdinaryPreventExtensions ( O )

OrdinaryPreventExtensions 추상 연산은 O (객체)를 인자로 받아 true를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. O.[[Extensible]]false로 설정한다.
  2. true를 반환한다.

10.1.5 [[GetOwnProperty]] ( P )

일반 객체 O[[GetOwnProperty]] 내부 메서드는 P(프로퍼티 키)를 인자로 받아, 프로퍼티 디스크립터 또는 undefined를 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. OrdinaryGetOwnProperty(O, P)를 반환한다.

10.1.5.1 OrdinaryGetOwnProperty ( O, P )

OrdinaryGetOwnProperty 추상 연산은 O(객체), P(프로퍼티 키)를 인자로 받아, 프로퍼티 디스크립터 또는 undefined를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. O에 키 P를 가진 자체 프로퍼티가 없으면, undefined를 반환한다.
  2. D를 필드가 없는 새 프로퍼티 디스크립터로 둔다.
  3. XO의 키 P를 가진 자체 프로퍼티로 둔다.
  4. X데이터 프로퍼티이면,
    1. D.[[Value]]X[[Value]] 특성 값으로 설정한다.
    2. D.[[Writable]]X[[Writable]] 특성 값으로 설정한다.
  5. 그 외,
    1. Assert: X접근자 프로퍼티이다.
    2. D.[[Get]]X[[Get]] 특성 값으로 설정한다.
    3. D.[[Set]]X[[Set]] 특성 값으로 설정한다.
  6. D.[[Enumerable]]X[[Enumerable]] 특성 값으로 설정한다.
  7. D.[[Configurable]]X[[Configurable]] 특성 값으로 설정한다.
  8. D를 반환한다.

10.1.6 [[DefineOwnProperty]] ( P, Desc )

일반 객체 O[[DefineOwnProperty]] 내부 메서드는 P(프로퍼티 키), Desc(프로퍼티 디스크립터)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. OrdinaryDefineOwnProperty(O, P, Desc)를 반환한다.

10.1.6.1 OrdinaryDefineOwnProperty ( O, P, Desc )

OrdinaryDefineOwnProperty 추상 연산은 O(객체), P(프로퍼티 키), Desc(프로퍼티 디스크립터)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. current를 ? O.[[GetOwnProperty]](P)로 둔다.
  2. extensible을 ? IsExtensible(O)로 둔다.
  3. ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current)를 반환한다.

10.1.6.2 IsCompatiblePropertyDescriptor ( Extensible, Desc, Current )

IsCompatiblePropertyDescriptor 추상 연산은 Extensible(불리언), Desc(프로퍼티 디스크립터), Current(프로퍼티 디스크립터 또는 undefined)를 인자로 받아 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateAndApplyPropertyDescriptor(undefined, "", Extensible, Desc, Current)를 반환한다.

10.1.6.3 ValidateAndApplyPropertyDescriptor ( O, P, extensible, Desc, current )

추상 연산 ValidateAndApplyPropertyDescriptor는 O (객체 또는 undefined), P (프로퍼티 키), extensible (불리언), Desc (프로퍼티 디스크립터), current (프로퍼티 디스크립터 또는 undefined)를 인자로 받고, 불리언을 반환한다. Desc가 지정된 extensibility와 현재 프로퍼티 current를 가진 객체의 프로퍼티로써 적용 가능하여 불변성을 유지할 수 있을 때, 그리고 그 경우에만 true를 반환한다. 그런 적용이 가능하고 Oundefined가 아니면 프로퍼티 이름 P에 대해 실제로 적용한다(필요하다면 생성). 호출 시 다음 단계를 수행한다:

  1. Assert: P프로퍼티 키이다.
  2. currentundefined라면,
    1. extensiblefalse라면 false를 반환한다.
    2. Oundefined라면 true를 반환한다.
    3. IsAccessorDescriptor(Desc) 가 true라면,
      1. 객체 O에 이름이 P인 자신의 접근자 프로퍼티를 생성한다. 이 프로퍼티의 [[Get]], [[Set]], [[Enumerable]], [[Configurable]] 속성은 Desc에 해당 필드가 있으면 그 값으로, 없으면 기본값으로 설정한다.
    4. 그 외의 경우,
      1. 객체 O에 이름이 P인 자신의 데이터 프로퍼티를 생성한다. 이 프로퍼티의 [[Value]], [[Writable]], [[Enumerable]], [[Configurable]] 속성은 Desc에 해당 필드가 있으면 그 값으로, 없으면 기본값으로 설정한다.
    5. true를 반환한다.
  3. Assert: current모든 필드가 채워진 프로퍼티 디스크립터이다.
  4. Desc가 아무 필드도 갖고 있지 않으면 true를 반환한다.
  5. current.[[Configurable]]false라면,
    1. Desc[[Configurable]] 필드가 있고 Desc.[[Configurable]]true라면 false를 반환한다.
    2. Desc[[Enumerable]] 필드가 있고 Desc.[[Enumerable]]current.[[Enumerable]]와 다르면 false를 반환한다.
    3. IsGenericDescriptor(Desc) 가 false이고, IsAccessorDescriptor(Desc) 가 IsAccessorDescriptor(current)와 다르면 false를 반환한다.
    4. IsAccessorDescriptor(current) 가 true라면,
      1. Desc[[Get]] 필드가 있고 SameValue(Desc.[[Get]], current.[[Get]])가 false라면 false를 반환한다.
      2. Desc[[Set]] 필드가 있고 SameValue(Desc.[[Set]], current.[[Set]])가 false라면 false를 반환한다.
    5. 그 외에 current.[[Writable]]false라면,
      1. Desc[[Writable]] 필드가 있고 Desc.[[Writable]]true라면 false를 반환한다.
      2. 참고: SameValueNaN 값에 대해 true를 반환하지만, 다른 방식으로는 구분될 수 있다. 여기서 반환하는 것은 객체 O의 기존 프로퍼티가 변경되지 않음을 보장한다.
      3. Desc[[Value]] 필드가 있으면, SameValue(Desc.[[Value]], current.[[Value]])를 반환한다.
  6. Oundefined가 아니면,
    1. IsDataDescriptor(current) 가 true이고 IsAccessorDescriptor(Desc) 가 true라면,
      1. Desc[[Configurable]] 필드가 있으면 configurableDesc.[[Configurable]]로, 없으면 current.[[Configurable]]로 둔다.
      2. Desc[[Enumerable]] 필드가 있으면 enumerableDesc.[[Enumerable]]로, 없으면 current.[[Enumerable]]로 둔다.
      3. 객체 O의 이름이 P인 프로퍼티를 접근자 프로퍼티로 교체한다. [[Configurable]][[Enumerable]] 속성은 각각 configurableenumerable로, [[Get]][[Set]] 속성은 Desc에 해당 필드가 있으면 그 값, 없으면 기본값으로 설정한다.
    2. 그 외에 IsAccessorDescriptor(current) 가 true이고 IsDataDescriptor(Desc) 가 true라면,
      1. Desc[[Configurable]] 필드가 있으면 configurableDesc.[[Configurable]]로, 없으면 current.[[Configurable]]로 둔다.
      2. Desc[[Enumerable]] 필드가 있으면 enumerableDesc.[[Enumerable]]로, 없으면 current.[[Enumerable]]로 둔다.
      3. 객체 O의 이름이 P인 프로퍼티를 데이터 프로퍼티로 교체한다. [[Configurable]][[Enumerable]] 속성은 각각 configurableenumerable로, [[Value]][[Writable]] 속성은 Desc에 해당 필드가 있으면 그 값, 없으면 기본값으로 설정한다.
    3. 그 외의 경우,
      1. Desc의 각 필드에 대해, 객체 O의 이름이 P인 프로퍼티의 해당 속성을 그 값으로 설정한다.
  7. true를 반환한다.

10.1.7 [[HasProperty]] ( P )

일반 객체 O[[HasProperty]] 내부 메서드는 P (프로퍼티 키)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. OrdinaryHasProperty(O, P)를 반환한다.

10.1.7.1 OrdinaryHasProperty ( O, P )

OrdinaryHasProperty 추상 연산은 O (객체)와 P (프로퍼티 키)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. hasOwn을 ? O.[[GetOwnProperty]](P)로 둔다.
  2. hasOwnundefined가 아니면 true를 반환한다.
  3. parent를 ? O.[[GetPrototypeOf]]()로 둔다.
  4. parentnull이 아니면,
    1. parent.[[HasProperty]](P)를 반환한다.
  5. false를 반환한다.

10.1.8 [[Get]] ( P, Receiver )

일반 객체 O[[Get]] 내부 메서드는 P (프로퍼티 키), Receiver (ECMAScript 언어 값)를 인자로 받아, ECMAScript 언어 값를 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. OrdinaryGet(O, P, Receiver)를 반환한다.

10.1.8.1 OrdinaryGet ( O, P, Receiver )

OrdinaryGet 추상 연산은 O (객체), P (프로퍼티 키), Receiver (ECMAScript 언어 값)를 인자로 받아, ECMAScript 언어 값를 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. desc를 ? O.[[GetOwnProperty]](P)로 둔다.
  2. descundefined이면,
    1. parent를 ? O.[[GetPrototypeOf]]()로 둔다.
    2. parentnull이면 undefined를 반환한다.
    3. parent.[[Get]](P, Receiver)를 반환한다.
  3. IsDataDescriptor(desc) 가 true이면 desc.[[Value]]를 반환한다.
  4. Assert: IsAccessorDescriptor(desc) 가 true이다.
  5. getterdesc.[[Get]]로 둔다.
  6. getterundefined이면 undefined를 반환한다.
  7. Call(getter, Receiver)를 반환한다.

10.1.9 [[Set]] ( P, V, Receiver )

일반 객체 O[[Set]] 내부 메서드는 P (프로퍼티 키), V (ECMAScript 언어 값), Receiver (ECMAScript 언어 값)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. OrdinarySet(O, P, V, Receiver)를 반환한다.

10.1.9.1 OrdinarySet ( O, P, V, Receiver )

OrdinarySet 추상 연산은 O (객체), P (프로퍼티 키), V (ECMAScript 언어 값), Receiver (ECMAScript 언어 값)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. ownDesc를 ? O.[[GetOwnProperty]](P)로 둔다.
  2. OrdinarySetWithOwnDescriptor(O, P, V, Receiver, ownDesc)를 반환한다.

10.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )

OrdinarySetWithOwnDescriptor 추상 연산은 O (객체), P (프로퍼티 키), V (ECMAScript 언어 값), Receiver (ECMAScript 언어 값), ownDesc (프로퍼티 디스크립터 또는 undefined)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. ownDescundefined라면,
    1. parent를 ? O.[[GetPrototypeOf]]()로 둔다.
    2. parentnull이 아니면,
      1. parent.[[Set]](P, V, Receiver)를 반환한다.
    3. 그 외의 경우,
      1. ownDesc를 PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }로 설정한다.
  2. IsDataDescriptor(ownDesc) 가 true라면,
    1. ownDesc.[[Writable]]false이면 false를 반환한다.
    2. Receiver객체가 아니면 false를 반환한다.
    3. existingDescriptor를 ? Receiver.[[GetOwnProperty]](P)로 둔다.
    4. existingDescriptorundefined가 아니면,
      1. IsAccessorDescriptor(existingDescriptor) 가 true이면 false를 반환한다.
      2. existingDescriptor.[[Writable]]false이면 false를 반환한다.
      3. valueDesc를 PropertyDescriptor { [[Value]]: V }로 둔다.
      4. Receiver.[[DefineOwnProperty]](P, valueDesc)를 반환한다.
    5. 그 외의 경우,
      1. Assert: Receiver 에는 현재 P 프로퍼티가 없다.
      2. CreateDataProperty(Receiver, P, V)를 반환한다.
  3. Assert: IsAccessorDescriptor(ownDesc) 가 true이다.
  4. setterownDesc.[[Set]]로 둔다.
  5. setterundefined이면 false를 반환한다.
  6. Call(setter, Receiver, « V »)를 수행한다.
  7. true를 반환한다.

10.1.10 [[Delete]] ( P )

일반 객체 O[[Delete]] 내부 메서드는 P (프로퍼티 키)를 인자로 받고, 불리언을 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. OrdinaryDelete(O, P)를 반환한다.

10.1.10.1 OrdinaryDelete ( O, P )

OrdinaryDelete 추상 연산은 O (객체)와 P (프로퍼티 키)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. desc를 ? O.[[GetOwnProperty]](P)로 둔다.
  2. descundefined이면 true를 반환한다.
  3. desc.[[Configurable]]true이면,
    1. O에서 이름이 P인 자신의 프로퍼티를 제거한다.
    2. true를 반환한다.
  4. false를 반환한다.

10.1.11 [[OwnPropertyKeys]] ( )

일반 객체 O[[OwnPropertyKeys]] 내부 메서드는 인자를 받지 않으며, 프로퍼티 키의 리스트를 포함하는 정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. OrdinaryOwnPropertyKeys(O)를 반환한다.

10.1.11.1 OrdinaryOwnPropertyKeys ( O )

OrdinaryOwnPropertyKeys 추상 연산은 O (객체)를 인자로 받아, 프로퍼티 키리스트를 반환한다. 호출 시 다음 단계를 수행한다:

  1. keys를 새로운 빈 List로 둔다.
  2. O의 각 자신의 프로퍼티 키 P 중, P배열 인덱스인 경우, 숫자 인덱스 오름차순으로,
    1. Pkeys에 추가한다.
  3. O의 각 자신의 프로퍼티 키 P 중, P문자열이고 배열 인덱스가 아닌 경우, 프로퍼티 생성 시점 오름차순으로,
    1. Pkeys에 추가한다.
  4. O의 각 자신의 프로퍼티 키 P 중, P심볼인 경우, 프로퍼티 생성 시점 오름차순으로,
    1. Pkeys에 추가한다.
  5. keys를 반환한다.

10.1.12 OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] )

OrdinaryObjectCreate 추상 연산은 proto (객체 또는 null), 선택적 additionalInternalSlotsList (내부 슬롯 이름의 리스트)를 인자로 받아 객체를 반환한다. 이는 새로운 일반 객체의 런타임 생성을 명세하는 데 사용된다. additionalInternalSlotsList에는 [[Prototype]], [[Extensible]] 외에 객체의 일부로 정의되어야 하는 추가 내부 슬롯의 이름이 포함된다. additionalInternalSlotsList가 생략되면, 새로운 빈 List가 사용된다. 호출 시 다음 단계를 수행한다:

  1. internalSlotsList를 « [[Prototype]], [[Extensible]] »로 둔다.
  2. additionalInternalSlotsList가 있으면, internalSlotsList리스트 연결 결과(internalSlotsList + additionalInternalSlotsList)로 설정한다.
  3. OMakeBasicObject(internalSlotsList)로 둔다.
  4. O.[[Prototype]]proto로 설정한다.
  5. O를 반환한다.
참고

OrdinaryObjectCreate는 MakeBasicObject만 호출하는 것처럼 보이지만, 이 연산을 사용하는 것은 일반 객체(exotic이 아님)를 생성하려는 의도를 명확히 전달합니다. 따라서, 이 명세 내에서 OrdinaryObjectCreate를 호출한 후 그 객체의 내부 메서드를 변경해서 exotic으로 만드는 알고리즘은 없습니다. exotic 객체를 생성하는 연산은 직접 MakeBasicObject를 호출합니다.

10.1.13 OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )

OrdinaryCreateFromConstructor 추상 연산은 constructor (함수 객체), intrinsicDefaultProto (문자열), 선택적 internalSlotsList (내부 슬롯 이름의 리스트)를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion을 반환한다. 이는 [[Prototype]] 값을 constructor"prototype" 프로퍼티에서 가져오고, 없으면 intrinsicDefaultProto로 지정된 intrinsic을 사용하는 일반 객체를 생성한다. internalSlotsList에는 객체의 일부로 정의해야 하는 추가 내부 슬롯의 이름이 들어있다. internalSlotsList가 생략되면, 새로운 빈 List가 사용된다. 호출 시 다음 단계를 수행한다:

  1. Assert: intrinsicDefaultProto는 명세에서 정의한 intrinsic 객체의 이름이다. 해당 객체는 객체의 [[Prototype]] 값으로 사용하도록 지정된 intrinsic이어야 한다.
  2. proto를 ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto)로 둔다.
  3. internalSlotsList가 있으면 slotsListinternalSlotsList로 둔다.
  4. 그 외에는 slotsList를 새로운 빈 List로 둔다.
  5. OrdinaryObjectCreate(proto, slotsList)를 반환한다.

10.1.14 GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )

GetPrototypeFromConstructor 추상 연산은 constructor (함수 객체), intrinsicDefaultProto (문자열)를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion을 반환한다. 이는 특정 constructor에 대해 객체를 만들 때 사용할 [[Prototype]] 값을 결정한다. 값은 constructor"prototype" 프로퍼티에서 가져오고, 없으면 intrinsicDefaultProto로 지정된 intrinsic이 사용된다. 호출 시 다음 단계를 수행한다:

  1. Assert: intrinsicDefaultProto는 명세에서 정의한 intrinsic 객체의 이름이다. 해당 객체는 객체의 [[Prototype]] 값으로 사용하도록 지정된 intrinsic이어야 한다.
  2. proto를 ? Get(constructor, "prototype")로 둔다.
  3. proto객체가 아니면,
    1. realm을 ? GetFunctionRealm(constructor)로 둔다.
    2. protorealmintrinsicDefaultProto 이름의 intrinsic 객체로 설정한다.
  4. proto를 반환한다.
참고

constructor[[Prototype]] 값을 제공하지 않으면, 사용되는 기본값은 realm에서 가져오며, 실행 중인 실행 컨텍스트에서 가져오지 않는다.

10.1.15 RequireInternalSlot ( O, internalSlot )

RequireInternalSlot 추상 연산은 O (ECMAScript 언어 값), internalSlot (내부 슬롯 이름)을 인자로 받아, unused를 포함하는 정상 완료 또는 throw completion을 반환한다. O객체가 아니거나 해당 내부 슬롯이 없으면 예외를 던진다. 호출 시 다음 단계를 수행한다:

  1. O객체가 아니면 TypeError 예외를 던진다.
  2. OinternalSlot 내부 슬롯이 없으면 TypeError 예외를 던진다.
  3. unused를 반환한다.

10.2 ECMAScript 함수 객체

ECMAScript 함수 객체는 렉시컬 환경을 닫아 매개변수를 가진 ECMAScript 코드를 캡슐화하고, 그 코드의 동적 평가를 지원합니다. ECMAScript 함수 객체일반 객체이며, 다른 일반 객체와 동일한 내부 슬롯과 내부 메서드를 가집니다. ECMAScript 함수 객체의 코드는 엄격 모드 코드 (11.2.2) 또는 비엄격 코드일 수 있습니다. ECMAScript 함수 객체 중 그 코드가 엄격 모드 코드인 것을 엄격 함수라 합니다. 코드가 엄격 모드 코드가 아닌 것은 비엄격 함수라 합니다.

[[Extensible]][[Prototype]] 외에, ECMAScript 함수 객체표 30에 나열된 내부 슬롯도 가집니다.

표 30: ECMAScript 함수 객체의 내부 슬롯
내부 슬롯 타입 설명
[[Environment]] 환경 레코드 함수가 닫힌 환경 레코드. 함수 코드 평가 시 외부 환경으로 사용됩니다.
[[PrivateEnvironment]] PrivateEnvironment 레코드 또는 null 함수가 닫힌 PrivateEnvironment 레코드. 이 함수가 클래스 내부에 있지 않으면 null입니다. 내부 클래스 코드 평가 시 외부 PrivateEnvironment로 사용됩니다.
[[FormalParameters]] 파스 노드 함수의 형식적 매개변수 목록을 정의하는 소스 텍스트의 루트 파스 노드입니다.
[[ECMAScriptCode]] 파스 노드 함수 본문을 정의하는 소스 텍스트의 루트 파스 노드입니다.
[[ConstructorKind]] base 또는 derived 함수가 파생 클래스 생성자인지 여부입니다.
[[Realm]] Realm Record 함수가 생성된 realm이며, 함수 평가 시 접근되는 intrinsic 객체를 제공합니다.
[[ScriptOrModule]] Script Record 또는 Module Record 함수가 생성된 스크립트 또는 모듈입니다.
[[ThisMode]] lexical, strict, 또는 global 함수의 형식 매개변수 및 코드 본문 내에서 this 참조가 해석되는 방식을 정의합니다. lexicalthis가 렉시컬 상위 함수의 this 값을 참조함을 의미합니다. strict는 함수 호출 시 제공된 this 값을 그대로 사용함을 의미합니다. globalthis 값이 undefined 또는 null이면 글로벌 객체로 해석하고, 그 외의 값은 ToObject를 거쳐 객체로 변환합니다.
[[Strict]] 불리언 true엄격 함수, false비엄격 함수입니다.
[[HomeObject]] 객체 함수가 super를 사용할 경우, super 프로퍼티 탐색이 시작되는 객체의 [[GetPrototypeOf]]를 제공합니다.
[[SourceText]] 유니코드 코드 포인트의 시퀀스 함수를 정의하는 소스 텍스트입니다.
[[Fields]] 레코드 리스트 (ClassFieldDefinition 레코드) 함수가 클래스일 경우, 클래스의 비정적 필드 및 해당 이니셜라이저를 나타내는 레코드 리스트입니다.
[[PrivateMethods]] 레코드 리스트 (PrivateElement) 함수가 클래스일 경우, 클래스의 비정적 private 메서드 및 접근자를 나타내는 리스트입니다.
[[ClassFieldInitializerName]] 문자열, 심볼, Private Name, 또는 empty 함수가 클래스 필드의 이니셜라이저로 생성된 경우, 필드의 NamedEvaluation에 사용할 이름입니다. 그렇지 않으면 empty입니다.
[[IsClassConstructor]] 불리언 함수가 클래스 생성자인지 나타냅니다. (true이면 함수의 [[Call]]을 호출하는 즉시 TypeError 예외가 발생합니다.)

모든 ECMAScript 함수 객체는 여기에 정의된 [[Call]] 내부 메서드를 가집니다. 생성자이기도 한 ECMAScript 함수는 [[Construct]] 내부 메서드도 추가로 가집니다.

10.2.1 [[Call]] ( thisArgument, argumentsList )

ECMAScript 함수 객체 F[[Call]] 내부 메서드는 thisArgument (ECMAScript 언어 값), argumentsList (ECMAScript 언어 값 리스트)를 인자로 받아, ECMAScript 언어 값를 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. callerContext실행 중인 실행 컨텍스트로 둔다.
  2. calleeContextPrepareForOrdinaryCall(F, undefined)로 둔다.
  3. Assert: calleeContext가 이제 실행 중인 실행 컨텍스트임을 보장한다.
  4. F.[[IsClassConstructor]]true이면,
    1. error를 새로 생성된 TypeError 객체로 둔다.
    2. 참고: errorcalleeContext 내에서 F와 연관된 Realm Record에서 생성된다.
    3. calleeContext실행 컨텍스트 스택에서 제거하고, callerContext실행 중인 실행 컨텍스트로 복원한다.
    4. ThrowCompletion(error)를 반환한다.
  5. OrdinaryCallBindThis(F, calleeContext, thisArgument)를 수행한다.
  6. resultCompletion(OrdinaryCallEvaluateBody(F, argumentsList))로 둔다.
  7. calleeContext실행 컨텍스트 스택에서 제거하고, callerContext실행 중인 실행 컨텍스트로 복원한다.
  8. resultreturn completion이면 result.[[Value]]를 반환한다.
  9. Assert: resultthrow completion임을 보장한다.
  10. result를 반환한다.
참고

실행 컨텍스트 스택에서 calleeContext7단계에서 제거될 때, accessible Generator에 의해 나중에 재개(resume)될 수 있도록 일시 정지(suspend) 상태라면 파괴되어서는 안 됩니다.

10.2.1.1 PrepareForOrdinaryCall ( F, newTarget )

추상 연산 PrepareForOrdinaryCall은 F (ECMAScript 함수 객체), newTarget (객체 또는 undefined)를 인자로 받아 실행 컨텍스트를 반환한다. 호출 시 다음 단계를 수행한다:

  1. callerContext실행 중인 실행 컨텍스트로 둔다.
  2. calleeContext를 새로운 ECMAScript 코드 실행 컨텍스트로 둔다.
  3. calleeContext의 Function을 F로 설정한다.
  4. calleeRealmF.[[Realm]]으로 둔다.
  5. calleeContextRealmcalleeRealm으로 설정한다.
  6. calleeContext의 ScriptOrModule을 F.[[ScriptOrModule]]로 설정한다.
  7. localEnvNewFunctionEnvironment(F, newTarget)로 둔다.
  8. calleeContext의 LexicalEnvironment를 localEnv로 설정한다.
  9. calleeContext의 VariableEnvironment를 localEnv로 설정한다.
  10. calleeContext의 PrivateEnvironment를 F.[[PrivateEnvironment]]로 설정한다.
  11. callerContext가 이미 일시 정지(suspended) 상태가 아니면, callerContext를 일시 정지시킨다.
  12. calleeContext실행 컨텍스트 스택에 푸시한다; calleeContext는 이제 실행 중인 실행 컨텍스트이다.
  13. 참고: 이 시점 이후 생성된 모든 예외 객체는 calleeRealm과 연관된다.
  14. calleeContext를 반환한다.

10.2.1.2 OrdinaryCallBindThis ( F, calleeContext, thisArgument )

추상 연산 OrdinaryCallBindThis는 F (ECMAScript 함수 객체), calleeContext (실행 컨텍스트), thisArgument (ECMAScript 언어 값)을 인자로 받아 unused를 반환한다. 호출 시 다음 단계를 수행한다:

  1. thisModeF.[[ThisMode]]로 둔다.
  2. thisModelexical이면 unused를 반환한다.
  3. calleeRealmF.[[Realm]]으로 둔다.
  4. localEnvcalleeContext의 LexicalEnvironment로 둔다.
  5. thisModestrict이면,
    1. thisValuethisArgument로 둔다.
  6. 그 외의 경우,
    1. thisArgumentundefinednull이면,
      1. globalEnvcalleeRealm.[[GlobalEnv]]로 둔다.
      2. Assert: globalEnvGlobal Environment Record이다.
      3. thisValueglobalEnv.[[GlobalThisValue]]로 둔다.
    2. 그 외에는,
      1. thisValue를 ! ToObject(thisArgument)로 둔다.
      2. 참고: ToObjectcalleeRealm을 사용해 래퍼 객체를 생성한다.
  7. Assert: localEnvFunction Environment Record이다.
  8. Assert: 다음 단계는 localEnv.[[ThisBindingStatus]]initialized가 아니므로 abrupt completion을 반환하지 않는다.
  9. BindThisValue(localEnv, thisValue)를 수행한다.
  10. unused를 반환한다.

10.2.1.3 Runtime Semantics: EvaluateBody

구문 지시 연산(syntax-directed operation) EvaluateBody는 functionObject (ECMAScript 함수 객체), argumentsList (ECMAScript 언어 값 리스트)를 인자로 받아 return completion 또는 throw completion을 반환한다. 아래 프로덕션별로 정의된다:

FunctionBody : FunctionStatementList
  1. EvaluateFunctionBody of FunctionBody with arguments functionObject and argumentsList를 반환한다.
ConciseBody : ExpressionBody
  1. EvaluateConciseBody of ConciseBody with arguments functionObject and argumentsList를 반환한다.
GeneratorBody : FunctionBody
  1. EvaluateGeneratorBody of GeneratorBody with arguments functionObject and argumentsList를 반환한다.
AsyncGeneratorBody : FunctionBody
  1. EvaluateAsyncGeneratorBody of AsyncGeneratorBody with arguments functionObject and argumentsList를 반환한다.
AsyncFunctionBody : FunctionBody
  1. EvaluateAsyncFunctionBody of AsyncFunctionBody with arguments functionObject and argumentsList를 반환한다.
AsyncConciseBody : ExpressionBody
  1. EvaluateAsyncConciseBody of AsyncConciseBody with arguments functionObject and argumentsList를 반환한다.
Initializer : = AssignmentExpression
  1. Assert: argumentsList는 비어 있다.
  2. Assert: functionObject.[[ClassFieldInitializerName]]empty가 아니다.
  3. IsAnonymousFunctionDefinition(AssignmentExpression)가 true라면,
    1. value를 ? NamedEvaluation of Initializer with argument functionObject.[[ClassFieldInitializerName]]로 둔다.
  4. 그 외에는,
    1. rhs를 ? Evaluation of AssignmentExpression로 둔다.
    2. value를 ? GetValue(rhs)로 둔다.
  5. ReturnCompletion(value)를 반환한다.
참고

필드 이니셜라이저(Field initializer)는 함수 경계로 간주되지만, FunctionDeclarationInstantiation 호출은 관찰 가능한 효과가 없으므로 생략된다.

ClassStaticBlockBody : ClassStaticBlockStatementList
  1. Assert: argumentsList는 비어 있다.
  2. EvaluateClassStaticBlockBody of ClassStaticBlockBody with argument functionObject를 반환한다.

10.2.1.4 OrdinaryCallEvaluateBody ( F, argumentsList )

OrdinaryCallEvaluateBody 추상 연산은 F (ECMAScript 함수 객체)와 argumentsList (ECMAScript 언어 값의 리스트)를 인자로 받아, return completion 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. EvaluateBody of F.[[ECMAScriptCode]] with arguments FargumentsList를 반환한다.

10.2.2 [[Construct]] ( argumentsList, newTarget )

ECMAScript 함수 객체 F[[Construct]] 내부 메서드는 argumentsList (ECMAScript 언어 값의 리스트)와 newTarget (생성자)를 인자로 받고, 객체를 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. callerContext실행 중인 실행 컨텍스트로 둔다.
  2. kindF.[[ConstructorKind]]로 둔다.
  3. kindbase이면,
    1. thisArgument를 ? OrdinaryCreateFromConstructor(newTarget, "%Object.prototype%")로 둔다.
  4. calleeContextPrepareForOrdinaryCall(F, newTarget)로 둔다.
  5. Assert: calleeContext가 현재 실행 중인 실행 컨텍스트임을 보장한다.
  6. kindbase이면,
    1. OrdinaryCallBindThis(F, calleeContext, thisArgument)를 수행한다.
    2. initializeResultCompletion(InitializeInstanceElements(thisArgument, F))로 둔다.
    3. initializeResultabrupt completion이면,
      1. calleeContext실행 컨텍스트 스택에서 제거하고, callerContext실행 중인 실행 컨텍스트로 복원한다.
      2. initializeResult를 반환한다.
  7. constructorEnvcalleeContext의 LexicalEnvironment로 둔다.
  8. resultCompletion(OrdinaryCallEvaluateBody(F, argumentsList))로 둔다.
  9. calleeContext실행 컨텍스트 스택에서 제거하고, callerContext실행 중인 실행 컨텍스트로 복원한다.
  10. resultthrow completion이면,
    1. result를 반환한다.
  11. Assert: resultreturn completion임을 보장한다.
  12. result.[[Value]]객체이면, result.[[Value]]를 반환한다.
  13. kindbase이면 thisArgument를 반환한다.
  14. result.[[Value]]undefined가 아니면 TypeError 예외를 던진다.
  15. thisBinding을 ? constructorEnv.GetThisBinding()으로 둔다.
  16. Assert: thisBinding객체임을 보장한다.
  17. thisBinding을 반환한다.

10.2.3 OrdinaryFunctionCreate ( functionPrototype, sourceText, ParameterList, Body, thisMode, env, privateEnv )

OrdinaryFunctionCreate 추상 연산은 functionPrototype (객체), sourceText (유니코드 코드 포인트 시퀀스), ParameterList (파스 노드), Body (파스 노드), thisMode (lexical-this 또는 non-lexical-this), env (환경 레코드), privateEnv (PrivateEnvironment 레코드 또는 null)를 인자로 받아, ECMAScript 함수 객체를 반환한다. 이 연산은 기본 [[Call]] 내부 메서드를 가지며 [[Construct]] 내부 메서드는 없는(단, MakeConstructor와 같은 연산으로 추가될 수 있음) 새 함수를 런타임에 생성하는 데 사용된다. sourceText는 생성할 함수의 문법 정의 소스 텍스트이다. 호출 시 다음 단계를 수행한다:

  1. internalSlotsList표 30에 나열된 내부 슬롯으로 둔다.
  2. FOrdinaryObjectCreate(functionPrototype, internalSlotsList)로 둔다.
  3. F.[[Call]]10.2.1에서 정의된 것으로 설정한다.
  4. F.[[SourceText]]sourceText로 설정한다.
  5. F.[[FormalParameters]]ParameterList로 설정한다.
  6. F.[[ECMAScriptCode]]Body로 설정한다.
  7. StrictIsStrict(Body)로 둔다.
  8. F.[[Strict]]Strict로 설정한다.
  9. thisModelexical-this이면 F.[[ThisMode]]lexical로 설정한다.
  10. 그 외에 Stricttrue이면 F.[[ThisMode]]strict로 설정한다.
  11. 그 외에는 F.[[ThisMode]]global로 설정한다.
  12. F.[[IsClassConstructor]]false로 설정한다.
  13. F.[[Environment]]env로 설정한다.
  14. F.[[PrivateEnvironment]]privateEnv로 설정한다.
  15. F.[[ScriptOrModule]]GetActiveScriptOrModule()로 설정한다.
  16. F.[[Realm]]현재 Realm Record로 설정한다.
  17. F.[[HomeObject]]undefined로 설정한다.
  18. F.[[Fields]]를 새로운 빈 List로 설정한다.
  19. F.[[PrivateMethods]]를 새로운 빈 List로 설정한다.
  20. F.[[ClassFieldInitializerName]]empty로 설정한다.
  21. lenExpectedArgumentCount of ParameterList로 둔다.
  22. SetFunctionLength(F, len)을 수행한다.
  23. F를 반환한다.

10.2.4 AddRestrictedFunctionProperties ( F, realm )

AddRestrictedFunctionProperties 추상 연산은 F (함수 객체)와 realm (Realm Record)를 인자로 받아 unused를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: realm.[[Intrinsics]].[[%ThrowTypeError%]]가 존재하며 초기화되어 있어야 한다.
  2. throwerrealm.[[Intrinsics]].[[%ThrowTypeError%]]로 둔다.
  3. DefinePropertyOrThrow(F, "caller", PropertyDescriptor { [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
  4. DefinePropertyOrThrow(F, "arguments", PropertyDescriptor { [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
  5. unused를 반환한다.

10.2.4.1 %ThrowTypeError% ( )

이 함수는 %ThrowTypeError% intrinsic 객체이다.

이것은 각 realm마다 하나씩 정의되는 익명 내장 함수 객체이다.

호출 시 다음 단계를 수행한다:

  1. TypeError 예외를 던진다.

이 함수의 [[Extensible]] 내부 슬롯의 값은 false이다.

이 함수의 "length" 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }이다.

이 함수의 "name" 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }이다.

10.2.5 MakeConstructor ( F [ , writablePrototype [ , prototype ] ] )

추상 연산 MakeConstructor는 F (ECMAScript 함수 객체 또는 내장 함수 객체), 선택적 writablePrototype (불리언), prototype (객체)을 인자로 받아 unused를 반환한다. 이 연산은 F생성자로 변환한다. 호출 시 다음 단계를 수행한다:

  1. F가 ECMAScript 함수 객체라면,
    1. Assert: IsConstructor(F)가 false임을 보장한다.
    2. Assert: F는 확장 가능한 객체이며 "prototype" 자신의 프로퍼티를 갖지 않는다.
    3. F.[[Construct]]10.2.2에서 정의된 것으로 설정한다.
  2. 그 외의 경우,
    1. F.[[Construct]]10.3.2에서 정의된 것으로 설정한다.
  3. F.[[ConstructorKind]]base로 설정한다.
  4. writablePrototype이 생략되었으면 writablePrototypetrue로 설정한다.
  5. prototype이 생략되었으면,
    1. prototypeOrdinaryObjectCreate(%Object.prototype%)로 설정한다.
    2. DefinePropertyOrThrow(prototype, "constructor", PropertyDescriptor { [[Value]]: F, [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
  6. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  7. unused를 반환한다.

10.2.6 MakeClassConstructor ( F )

추상 연산 MakeClassConstructor는 F (ECMAScript 함수 객체)를 인자로 받아 unused를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: F.[[IsClassConstructor]]false임을 보장한다.
  2. F.[[IsClassConstructor]]true로 설정한다.
  3. unused를 반환한다.

10.2.7 MakeMethod ( F, homeObject )

추상 연산 MakeMethod는 F (ECMAScript 함수 객체)와 homeObject (객체)를 인자로 받아 unused를 반환한다. 이 연산은 F를 메서드로 설정한다. 호출 시 다음 단계를 수행한다:

  1. Assert: homeObject일반 객체임을 보장한다.
  2. F.[[HomeObject]]homeObject로 설정한다.
  3. unused를 반환한다.

10.2.8 DefineMethodProperty ( homeObject, key, closure, enumerable )

추상 연산 DefineMethodProperty는 homeObject (객체), key (프로퍼티 키 또는 Private Name), closure (함수 객체), enumerable (불리언)을 인자로 받고, 정상 완료로서 PrivateElement 또는 unused를 반환하거나, abrupt completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: homeObject는 일반적이고 확장 가능한 객체임을 보장한다.
  2. keyPrivate Name라면,
    1. PrivateElement { [[Key]]: key, [[Kind]]: method, [[Value]]: closure }를 반환한다.
  3. 그 외의 경우,
    1. desc를 PropertyDescriptor { [[Value]]: closure, [[Writable]]: true, [[Enumerable]]: enumerable, [[Configurable]]: true }로 둔다.
    2. DefinePropertyOrThrow(homeObject, key, desc)를 수행한다.
    3. 참고: DefinePropertyOrThrow는 클래스 정적 메서드의 key"prototype"일 때만 abrupt completion을 반환한다.
    4. unused를 반환한다.

10.2.9 SetFunctionName ( F, name [ , prefix ] )

추상 연산 SetFunctionName은 F (함수 객체), name (프로퍼티 키 또는 Private Name), 선택적 prefix (문자열)를 인자로 받아 unused를 반환한다. 이 연산은 F"name" 프로퍼티를 추가한다. 호출 시 다음 단계를 수행한다:

  1. Assert: F"name" 자신의 프로퍼티가 없는 확장 가능한 객체임을 보장한다.
  2. name심볼이면,
    1. descriptionname[[Description]] 값으로 둔다.
    2. descriptionundefined이면 name을 빈 문자열로 설정한다.
    3. 그 외에는 name문자열 연결"[", description, "]"을 합친 것으로 설정한다.
  3. 그 외에 namePrivate Name이면,
    1. namename.[[Description]]로 설정한다.
  4. F[[InitialName]] 내부 슬롯이 있으면,
    1. F.[[InitialName]]name으로 설정한다.
  5. prefix가 있으면,
    1. name문자열 연결prefix, 코드 유닛 0x0020(SPACE), name을 합친 것으로 설정한다.
    2. F[[InitialName]] 내부 슬롯이 있으면,
      1. 선택적으로 F.[[InitialName]]name으로 설정한다.
  6. DefinePropertyOrThrow(F, "name", PropertyDescriptor { [[Value]]: name, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
  7. unused를 반환한다.

10.2.10 SetFunctionLength ( F, length )

추상 연산 SetFunctionLength는 F (함수 객체), length (0 이상의 정수 또는 +∞)를 인자로 받아 unused를 반환한다. 이 연산은 F"length" 프로퍼티를 추가한다. 호출 시 다음 단계를 수행한다:

  1. Assert: F"length" 자신의 프로퍼티가 없는 확장 가능한 객체임을 보장한다.
  2. DefinePropertyOrThrow(F, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
  3. unused를 반환한다.

10.2.11 FunctionDeclarationInstantiation ( func, argumentsList )

추상 연산 FunctionDeclarationInstantiation은 func (ECMAScript 함수 객체), argumentsList (ECMAScript 언어 값의 리스트)를 인자로 받아, unused를 포함하는 정상 완료 또는 throw completion을 반환한다. func실행 컨텍스트가 설정될 함수 객체이다.

참고 1

ECMAScript 함수의 평가를 위해 실행 컨텍스트가 설정되면 새로운 Function Environment Record가 생성되고, 각 형식 매개변수에 대한 바인딩이 해당 Environment Record에 인스턴스화된다. 함수 본문의 각 선언도 인스턴스화된다. 함수의 형식 매개변수에 기본값 이니셜라이저가 없으면 본문 선언은 매개변수와 같은 Environment Record에서 인스턴스화된다. 기본값 매개변수 이니셜라이저가 있으면, 본문 선언을 위한 두 번째 Environment Record가 생성된다. 형식 매개변수와 함수는 FunctionDeclarationInstantiation의 일부로 초기화된다. 그 외의 모든 바인딩은 함수 본문 평가 중에 초기화된다.

호출 시 다음 단계를 수행한다:

  1. calleeContext실행 중인 실행 컨텍스트로 둔다.
  2. codefunc.[[ECMAScriptCode]]로 둔다.
  3. strictfunc.[[Strict]]로 둔다.
  4. formalsfunc.[[FormalParameters]]로 둔다.
  5. parameterNamesBoundNames of formals로 둔다.
  6. parameterNames에 중복 항목이 있으면 hasDuplicatestrue로, 아니면 false로 둔다.
  7. simpleParameterListIsSimpleParameterList of formals로 둔다.
  8. hasParameterExpressionsContainsExpression of formals로 둔다.
  9. varNamesVarDeclaredNames of code로 둔다.
  10. varDeclarationsVarScopedDeclarations of code로 둔다.
  11. lexicalNamesLexicallyDeclaredNames of code로 둔다.
  12. functionNames를 새로운 빈 List로 둔다.
  13. functionsToInitialize를 새로운 빈 List로 둔다.
  14. varDeclarations의 각 요소 d에 대해, List의 역순으로, 다음을 수행한다:
    1. dVariableDeclaration, ForBinding, BindingIdentifier 중 어느 것도 아니면,
      1. Assert: dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration 중 하나이다.
      2. fnBoundNames of d의 유일한 요소로 둔다.
      3. functionNamesfn이 포함되어 있지 않으면,
        1. fnfunctionNames의 첫 번째 요소로 삽입한다.
        2. 참고: 같은 이름의 함수 선언이 여러 번 있으면 마지막 선언이 사용된다.
        3. dfunctionsToInitialize의 첫 번째 요소로 삽입한다.
  15. argumentsObjectNeededtrue로 둔다.
  16. func.[[ThisMode]]lexical이면,
    1. 참고: 화살표 함수는 arguments 객체를 갖지 않는다.
    2. argumentsObjectNeededfalse로 설정한다.
  17. 그 외에 parameterNames"arguments"가 포함되어 있으면,
    1. argumentsObjectNeededfalse로 설정한다.
  18. 그 외에 hasParameterExpressionsfalse이면,
    1. functionNames"arguments"가 포함되어 있거나 lexicalNames"arguments"가 포함되어 있으면,
      1. argumentsObjectNeededfalse로 설정한다.
  19. stricttrue이거나 hasParameterExpressionsfalse이면,
    1. 참고: 엄격 모드 코드에서 eval 호출은 외부 바인딩을 볼 수 있는 새로운 바인딩을 만들 수 없으므로 매개변수에 대해 단일 Environment Record만 필요하다.
    2. envcalleeContext의 LexicalEnvironment로 둔다.
  20. 그 외의 경우,
    1. 참고: 형식 매개변수 목록에서 직접 eval 호출로 생성된 바인딩이 매개변수가 선언된 환경 외부에 있도록 별도의 Environment Record가 필요하다.
    2. calleeEnvcalleeContext의 LexicalEnvironment로 둔다.
    3. envNewDeclarativeEnvironment(calleeEnv)로 둔다.
    4. Assert: calleeContext의 VariableEnvironment와 calleeEnv는 같은 Environment Record이다.
    5. calleeContext의 LexicalEnvironment를 env로 설정한다.
  21. parameterNames의 각 문자열 paramName에 대해,
    1. alreadyDeclared를 ! env.HasBinding(paramName)으로 둔다.
    2. 참고: Early errors는 중복 매개변수 이름이 비엄격 함수에서만 발생하고, 이때 기본값이나 rest 파라미터가 없어야 함을 보장한다.
    3. alreadyDeclaredfalse이면,
      1. env.CreateMutableBinding(paramName, false)을 수행한다.
      2. hasDuplicatestrue이면,
        1. env.InitializeBinding(paramName, undefined)을 수행한다.
  22. argumentsObjectNeededtrue이면,
    1. stricttrue이거나 simpleParameterListfalse이면,
      1. aoCreateUnmappedArgumentsObject(argumentsList)로 둔다.
    2. 그 외의 경우,
      1. 참고: rest 파라미터, 기본값 이니셜라이저, 구조 분해 파라미터가 없는 비엄격 함수에만 mapped arguments 객체가 제공된다.
      2. aoCreateMappedArgumentsObject(func, formals, argumentsList, env)로 둔다.
    3. stricttrue이면,
      1. env.CreateImmutableBinding("arguments", false)을 수행한다.
      2. 참고: 엄격 모드 코드에서는 early errors가 이 바인딩에 할당을 시도하는 것을 방지하므로, mutability가 관찰되지 않는다.
    4. 그 외의 경우,
      1. env.CreateMutableBinding("arguments", false)을 수행한다.
    5. env.InitializeBinding("arguments", ao)를 수행한다.
    6. parameterBindingslist-concatenation of parameterNames 및 « "arguments" »로 둔다.
  23. 그 외의 경우,
    1. parameterBindingsparameterNames로 둔다.
  24. iteratorRecordCreateListIteratorRecord(argumentsList)로 둔다.
  25. hasDuplicatestrue이면,
    1. usedEnvundefined로 둔다.
  26. 그 외의 경우,
    1. usedEnvenv로 둔다.
  27. 참고: 다음 단계는 ReturnCompletion을 반환할 수 없다. 왜냐하면 식 위치에서 그런 완료가 발생할 수 있는 유일한 방법은 YieldExpression을 사용하는 것인데, 이는 15.5.115.6.1의 Early Error 규칙에 의해 파라미터 리스트에서 금지되어 있기 때문이다.
  28. IteratorBindingInitialization of formals with arguments iteratorRecordusedEnv를 수행한다.
  29. hasParameterExpressionsfalse이면,
    1. 참고: 매개변수와 top-level var를 위해 단일 Environment Record만 필요하다.
    2. instantiatedVarNamesparameterBindings의 복사본으로 둔다.
    3. varNames의 각 요소 n에 대해,
      1. instantiatedVarNamesn이 없으면,
        1. ninstantiatedVarNames에 추가한다.
        2. env.CreateMutableBinding(n, false)을 수행한다.
        3. env.InitializeBinding(n, undefined)을 수행한다.
    4. varEnvenv로 둔다.
  30. 그 외의 경우,
    1. 참고: 형식 매개변수 리스트 내 식에서 생성된 클로저가 함수 본문 내 선언을 볼 수 없도록 별도의 Environment Record가 필요하다.
    2. varEnvNewDeclarativeEnvironment(env)로 둔다.
    3. calleeContext의 VariableEnvironment를 varEnv로 설정한다.
    4. instantiatedVarNames를 새로운 빈 List로 둔다.
    5. varNames의 각 요소 n에 대해,
      1. instantiatedVarNamesn이 없으면,
        1. ninstantiatedVarNames에 추가한다.
        2. varEnv.CreateMutableBinding(n, false)을 수행한다.
        3. parameterBindingsn이 없거나 functionNamesn이 있으면,
          1. initialValueundefined로 둔다.
        4. 그 외의 경우,
          1. initialValue를 ! env.GetBindingValue(n, false)로 둔다.
        5. varEnv.InitializeBinding(n, initialValue)를 수행한다.
        6. 참고: 형식 매개변수와 같은 이름의 var는 해당 초기화된 파라미터와 같은 값을 처음 가진다.
  31. 참고: 부록 B.3.2.1은 이 위치에 추가 단계를 둔다.
  32. strictfalse이면,
    1. lexEnvNewDeclarativeEnvironment(varEnv)로 둔다.
    2. 참고: 비엄격 함수는 top-level lexical 선언을 위해 별도의 Environment Record를 사용하며, 이는 직접 eval이 eval 코드로 도입한 var 범위 선언이 기존 top-level lexical 선언과 충돌하는지 판단할 수 있도록 한다. 엄격 함수에는 필요하지 않다. 엄격 직접 eval은 항상 모든 선언을 새로운 Environment Record에 위치시킨다.
  33. 그 외의 경우,
    1. lexEnvvarEnv로 둔다.
  34. calleeContext의 LexicalEnvironment를 lexEnv로 설정한다.
  35. lexDeclarationsLexicallyScopedDeclarations of code로 둔다.
  36. lexDeclarations의 각 요소 d에 대해,
    1. 참고: lexical 선언된 이름은 함수/제너레이터 선언, 형식 매개변수, var 이름과 같을 수 없다. lexical 선언된 이름은 여기서 인스턴스화만 되고 초기화되지 않는다.
    2. BoundNames of d의 각 요소 dn에 대해,
      1. IsConstantDeclaration of dtrue이면,
        1. lexEnv.CreateImmutableBinding(dn, true)를 수행한다.
      2. 그 외의 경우,
        1. lexEnv.CreateMutableBinding(dn, false)를 수행한다.
  37. privateEnvcalleeContext의 PrivateEnvironment로 둔다.
  38. functionsToInitialize의 각 파스 노드 f에 대해,
    1. fnBoundNames of f의 유일한 요소로 둔다.
    2. foInstantiateFunctionObject of f with arguments lexEnvprivateEnv로 둔다.
    3. varEnv.SetMutableBinding(fn, fo, false)를 수행한다.
  39. unused를 반환한다.
참고 2

B.3.2 는 ECMAScript 2015 이전의 웹 브라우저 구현과의 하위 호환성을 위해 위 알고리즘에 대한 확장을 제공한다.

10.3 내장 함수 객체

내장 함수 객체일반 객체이며, 일반 객체에 대한 10.1의 요구사항을 반드시 만족해야 합니다.

모든 일반 객체에 요구되는 내부 슬롯(자세한 내용은 10.1 참고) 외에, 내장 함수 객체는 다음 내부 슬롯도 반드시 가져야 합니다:

  • [[Realm]]: 함수가 생성된 realm을 나타내는 Realm Record.
  • [[InitialName]]: 함수의 초기 이름을 나타내는 문자열. 20.2.3.5에서 사용됩니다.

내장 함수 객체[[Prototype]] 내부 슬롯의 초기값은 별도의 명시가 없는 한 %Function.prototype%입니다.

내장 함수 객체10.3.1에 정의된 [[Call]] 내부 메서드를 반드시 가져야 합니다.

내장 함수 객체는 “생성자”로 기술되어 있거나, 이 명세의 어떤 알고리즘이 명시적으로 [[Construct]] 내부 메서드를 설정한 경우에만 [[Construct]] 내부 메서드를 가집니다. 이러한 [[Construct]] 내부 메서드는 반드시 10.3.2에 정의된 내용을 따라야 합니다.

구현체는 이 명세에 정의되지 않은 추가적인 내장 함수 객체를 제공할 수 있습니다.

10.3.1 [[Call]] ( thisArgument, argumentsList )

내장 함수 객체 F[[Call]] 내부 메서드는 thisArgument (ECMAScript 언어 값), argumentsList (ECMAScript 언어 값의 리스트)를 인자로 받아, ECMAScript 언어 값를 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. BuiltinCallOrConstruct(F, thisArgument, argumentsList, undefined)를 반환한다.

10.3.2 [[Construct]] ( argumentsList, newTarget )

내장 함수 객체 F[[Construct]] 내부 메서드(존재하는 경우)는 argumentsList (ECMAScript 언어 값의 리스트), newTarget (생성자)를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. result를 ? BuiltinCallOrConstruct(F, uninitialized, argumentsList, newTarget)로 둔다.
  2. Assert: result객체임을 보장한다.
  3. result를 반환한다.

10.3.3 BuiltinCallOrConstruct ( F, thisArgument, argumentsList, newTarget )

BuiltinCallOrConstruct 추상 연산은 F (내장 함수 객체), thisArgument (ECMAScript 언어 값 또는 uninitialized), argumentsList (ECMAScript 언어 값의 리스트), newTarget (생성자 또는 undefined)를 인자로 받아, ECMAScript 언어 값를 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. callerContext실행 중인 실행 컨텍스트로 둔다.
  2. callerContext가 이미 일시정지(suspended) 상태가 아니면, callerContext를 일시정지시킨다.
  3. calleeContext를 새로운 실행 컨텍스트로 둔다.
  4. calleeContext의 Function을 F로 설정한다.
  5. calleeRealmF.[[Realm]]로 둔다.
  6. calleeContextRealmcalleeRealm으로 설정한다.
  7. calleeContext의 ScriptOrModule을 null로 설정한다.
  8. calleeContext의 구현체 정의 초기화(implementation-defined initialization)를 수행한다.
  9. calleeContext실행 컨텍스트 스택에 푸시한다; calleeContext는 이제 실행 중인 실행 컨텍스트이다.
  10. resultCompletion Record로, F를 이 명세에 정의된 대로 평가한 결과로 둔다. thisArgumentuninitialized이면 this 값은 미초기화 상태이고, 아니면 thisArgumentthis 값을 제공한다. argumentsList는 명명된 파라미터를 제공하며, newTarget은 NewTarget 값을 제공한다.
  11. 참고: F가 이 문서에서 정의된 경우, “the specification of F”는 알고리즘 단계 또는 그 외 수단으로 명세된 동작이다.
  12. calleeContext실행 컨텍스트 스택에서 제거하고, callerContext실행 중인 실행 컨텍스트로 복원한다.
  13. result를 반환한다.
참고

calleeContext실행 컨텍스트 스택에서 제거될 때, 접근 가능한 Generator에 의해 나중에 재개(resume)될 수 있도록 일시정지(suspend) 상태라면 파괴되어서는 안 됩니다.

10.3.4 CreateBuiltinFunction ( behaviour, length, name, additionalInternalSlotsList [ , realm [ , prototype [ , prefix ] ] ] )

CreateBuiltinFunction 추상 연산은 behaviour (Abstract Closure, 알고리즘 단계 집합, 또는 명세 내에서 함수 동작을 정의한 기타 수단), length (0 이상의 정수 또는 +∞), name (프로퍼티 키 또는 Private Name), additionalInternalSlotsList (내부 슬롯 이름 리스트), 그리고 선택적 realm (Realm Record), prototype (객체 또는 null), prefix (문자열)을 인자로 받아 내장 함수 객체를 반환한다. additionalInternalSlotsList에는 객체의 일부로 정의되어야 하는 추가 내부 슬롯 이름이 포함된다. 이 연산은 내장 함수 객체를 생성한다. 호출 시 다음 단계를 수행한다:

  1. realm이 없으면 realm현재 Realm Record로 설정한다.
  2. prototype이 없으면 prototyperealm.[[Intrinsics]].[[%Function.prototype%]]로 설정한다.
  3. internalSlotsList를, 생성할 내장 함수 객체에 대해 10.3이 요구하는 모든 내부 슬롯의 이름을 포함하는 List로 둔다.
  4. internalSlotsList 끝에 additionalInternalSlotsList의 모든 요소를 추가한다.
  5. func를, 호출 시 behaviour에서 명시된 대로 해당 인자를 파라미터 값으로 사용하여 행동하는 새로운 내장 함수 객체로 둔다. 새 함수 객체internalSlotsList의 이름을 가진 내부 슬롯들과, [[InitialName]] 내부 슬롯을 가진다.
  6. func.[[Prototype]]prototype으로 설정한다.
  7. func.[[Extensible]]true로 설정한다.
  8. func.[[Realm]]realm으로 설정한다.
  9. func.[[InitialName]]null로 설정한다.
  10. SetFunctionLength(func, length)를 수행한다.
  11. prefix가 없으면,
    1. SetFunctionName(func, name)을 수행한다.
  12. 그 외의 경우,
    1. SetFunctionName(func, name, prefix)를 수행한다.
  13. func를 반환한다.

이 명세에 정의된 모든 내장 함수는 CreateBuiltinFunction 추상 연산을 호출하여 생성된다.

10.4 내장 익조틱(Exotic) 객체의 내부 메서드와 슬롯

이 명세는 여러 종류의 내장 익조틱 객체를 정의합니다. 이러한 객체들은 몇몇 특정 상황을 제외하면 일반적으로 일반 객체와 비슷하게 동작합니다. 아래의 익조틱 객체들은 별도로 명시된 경우를 제외하고는 일반 객체의 내부 메서드를 사용합니다:

10.4.1 바운드 함수 익조틱 객체

바운드 함수 익조틱 객체는 또 다른 함수 객체를 감싸는 익조틱 객체입니다. 바운드 함수 익조틱 객체는 호출 가능하며([[Call]] 내부 메서드를 가지고 있을 수 있고, [[Construct]] 내부 메서드도 가질 수 있습니다), 이를 호출하면 일반적으로 감싸고 있는 함수가 호출됩니다.

객체가 [[Call]] 및 (해당되는 경우) [[Construct]] 내부 메서드가 아래 구현을 따르고, 그 외의 필수 내부 메서드는 10.1의 정의를 따른다면, 그 객체는 바운드 함수 익조틱 객체입니다. 이러한 메서드는 BoundFunctionCreate에서 설치됩니다.

바운드 함수 익조틱 객체표 30에 나열된 ECMAScript 함수 객체의 내부 슬롯을 가지지 않습니다. 대신, [[Prototype]][[Extensible]]와 더불어 표 31에 나열된 내부 슬롯을 가집니다.

표 31: 바운드 함수 익조틱 객체의 내부 슬롯
내부 슬롯 타입 설명
[[BoundTargetFunction]] 호출 가능한 객체 감싸고 있는 함수 객체.
[[BoundThis]] ECMAScript 언어 값 감싸고 있는 함수를 호출할 때 항상 this 값으로 전달되는 값입니다.
[[BoundArguments]] 리스트 (ECMAScript 언어 값의 리스트) 감싸고 있는 함수를 호출할 때 항상 첫 번째 인수로 전달되는 값들의 리스트입니다.

10.4.1.1 [[Call]] ( thisArgument, argumentsList )

바운드 함수 익조틱 객체 F[[Call]] 내부 메서드는 thisArgument (ECMAScript 언어 값), argumentsList (ECMAScript 언어 값 리스트)를 인자로 받아, ECMAScript 언어 값를 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. targetF.[[BoundTargetFunction]]으로 둔다.
  2. boundThisF.[[BoundThis]]로 둔다.
  3. boundArgsF.[[BoundArguments]]로 둔다.
  4. args리스트 연결(boundArgs, argumentsList)로 둔다.
  5. Call(target, boundThis, args)를 반환한다.

10.4.1.2 [[Construct]] ( argumentsList, newTarget )

바운드 함수 익조틱 객체 F[[Construct]] 내부 메서드는 argumentsList (ECMAScript 언어 값 리스트), newTarget (생성자)를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. targetF.[[BoundTargetFunction]]으로 둔다.
  2. Assert: IsConstructor(target)가 true임을 보장한다.
  3. boundArgsF.[[BoundArguments]]로 둔다.
  4. args리스트 연결(boundArgs, argumentsList)로 둔다.
  5. SameValue(F, newTarget)가 true이면, newTargettarget으로 설정한다.
  6. Construct(target, args, newTarget)를 반환한다.

10.4.1.3 BoundFunctionCreate ( targetFunction, boundThis, boundArgs )

BoundFunctionCreate 추상 연산은 targetFunction (함수 객체), boundThis (ECMAScript 언어 값), boundArgs (ECMAScript 언어 값 리스트)를 인자로 받아, 함수 객체를 포함하는 정상 완료 또는 throw completion을 반환한다. 이 연산은 새로운 바운드 함수 익조틱 객체의 생성을 명세하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. proto를 ? targetFunction.[[GetPrototypeOf]]()로 둔다.
  2. internalSlotsList리스트 연결로 « [[Prototype]], [[Extensible]] »와 표 31에 나열된 내부 슬롯들을 합친 것으로 둔다.
  3. objMakeBasicObject(internalSlotsList)로 둔다.
  4. obj.[[Prototype]]proto로 설정한다.
  5. obj.[[Call]]10.4.1.1에서 설명한 대로 설정한다.
  6. IsConstructor(targetFunction) 가 true이면,
    1. obj.[[Construct]]10.4.1.2에서 설명한 대로 설정한다.
  7. obj.[[BoundTargetFunction]]targetFunction으로 설정한다.
  8. obj.[[BoundThis]]boundThis로 설정한다.
  9. obj.[[BoundArguments]]boundArgs로 설정한다.
  10. obj를 반환한다.

10.4.2 배열 익조틱 객체

배열(Array)은 익조틱 객체로, 배열 인덱스 프로퍼티 키에 대해 특별한 처리를 합니다(자세한 내용은 6.1.7 참고). 프로퍼티 이름배열 인덱스인 프로퍼티는 요소(element)라고도 부릅니다. 모든 배열은 항상 0 이상의 정수(Number) 값을 가지며, 그 수학적 값이 232 미만인, 변경 불가능(non-configurable)한 "length" 프로퍼티를 가집니다. "length" 프로퍼티의 값은 그 이름이 배열 인덱스인 모든 자신의 프로퍼티 이름보다 숫자적으로 큽니다. 배열의 자신의 프로퍼티가 생성되거나 변경될 때마다 이 불변식(invariant)을 유지하기 위해 다른 프로퍼티들도 필요에 따라 조정됩니다. 구체적으로, 이름이 배열 인덱스인 자신의 프로퍼티가 추가되면, 필요하다면 "length" 프로퍼티의 값을 해당 배열 인덱스의 수치값 + 1로 변경합니다. 그리고 "length"의 값이 변경될 때마다, 그 값 이상인 모든 배열 인덱스 이름을 가진 자신의 프로퍼티를 삭제합니다. 이 제약은 배열의 자신의 프로퍼티에만 적용되며, "length"배열 인덱스 프로퍼티가 프로토타입에서 상속된 경우에는 영향을 미치지 않습니다.

객체의 [[DefineOwnProperty]] 내부 메서드가 아래 구현을 따르고, 그 외의 필수 내부 메서드가 10.1의 정의를 따른다면, 그 객체는 배열 익조틱 객체(또는 간단히 배열)입니다. 이러한 메서드는 ArrayCreate에서 설치됩니다.

10.4.2.1 [[DefineOwnProperty]] ( P, Desc )

배열 익조틱 객체 A[[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키), Desc (프로퍼티 디스크립터)를 인자로 받고, 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. P"length"이면,
    1. ArraySetLength(A, Desc)를 반환합니다.
  2. 그 외에 P배열 인덱스이면,
    1. lengthDescOrdinaryGetOwnProperty(A, "length")로 둔다.
    2. Assert: lengthDescundefined가 아님을 보장합니다.
    3. Assert: IsDataDescriptor(lengthDesc)가 true임을 보장합니다.
    4. Assert: lengthDesc.[[Configurable]]false임을 보장합니다.
    5. lengthlengthDesc.[[Value]]로 둔다.
    6. Assert: length가 0 이상의 정수(Number)임을 보장합니다.
    7. index를 ! ToUint32(P)로 둡니다.
    8. indexlength이고 lengthDesc.[[Writable]]false이면, false를 반환합니다.
    9. succeeded를 ! OrdinaryDefineOwnProperty(A, P, Desc)로 둡니다.
    10. succeededfalse이면, false를 반환합니다.
    11. indexlength이면,
      1. lengthDesc.[[Value]]index + 1𝔽로 설정합니다.
      2. succeeded를 ! OrdinaryDefineOwnProperty(A, "length", lengthDesc)로 둡니다.
      3. Assert: succeededtrue임을 보장합니다.
    12. true를 반환합니다.
  3. OrdinaryDefineOwnProperty(A, P, Desc)를 반환합니다.

10.4.2.2 ArrayCreate ( length [ , proto ] )

ArrayCreate 추상 연산은 length (0 이상의 정수), 선택적 proto (객체)를 인자로 받아, 배열 익조틱 객체를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이는 새로운 배열 생성 시 사용됩니다. 호출 시 다음 단계를 수행합니다:

  1. length > 232 - 1이면 RangeError 예외를 던집니다.
  2. proto가 없으면 proto%Array.prototype%로 설정합니다.
  3. AMakeBasicObject[[Prototype]], [[Extensible]] »)로 둡니다.
  4. A.[[Prototype]]proto로 설정합니다.
  5. A.[[DefineOwnProperty]]10.4.2.1에 명시된 대로 설정합니다.
  6. OrdinaryDefineOwnProperty(A, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행합니다.
  7. A를 반환합니다.

10.4.2.3 ArraySpeciesCreate ( originalArray, length )

ArraySpeciesCreate 추상 연산은 originalArray (객체), length (0 이상의 정수)를 인자로 받아, 객체를 포함하는 정상 완료 또는 throw completion을 반환합니다. 이는 originalArray에서 파생된 생성자 함수를 사용해 새로운 배열 또는 유사 객체를 생성할 때 사용됩니다. 여기서 생성자 함수가 반드시 Array를 반환할 필요는 없습니다. 호출 시 다음 단계를 수행합니다:

  1. isArray를 ? IsArray(originalArray)로 둡니다.
  2. isArrayfalse이면 ? ArrayCreate(length)를 반환합니다.
  3. C를 ? Get(originalArray, "constructor")로 둡니다.
  4. IsConstructor(C)가 true이면,
    1. thisRealm현재 Realm Record로 둡니다.
    2. realmC를 ? GetFunctionRealm(C)로 둡니다.
    3. thisRealmrealmC가 동일한 Realm Record가 아니면,
      1. SameValue(C, realmC.[[Intrinsics]].[[%Array%]])가 true이면 Cundefined로 둡니다.
  5. C객체이면,
    1. C를 ? Get(C, %Symbol.species%)로 둡니다.
    2. Cnull이면 Cundefined로 둡니다.
  6. Cundefined이면 ? ArrayCreate(length)를 반환합니다.
  7. IsConstructor(C)가 false이면 TypeError 예외를 던집니다.
  8. Construct(C, « 𝔽(length) »)를 반환합니다.
참고

originalArrayrealm실행 중인 실행 컨텍스트realm와 다를 때, 표준 내장 Array 생성자로 생성된 경우에는 실행 중인 실행 컨텍스트realm에서 새로운 배열이 생성됩니다. 이는 ArraySpeciesCreate를 사용하는 Array.prototype 메서드가 역사적으로 웹 브라우저에서 이런 동작을 보였던 것과의 호환성을 유지하기 위한 것입니다.

10.4.2.4 ArraySetLength ( A, Desc )

ArraySetLength 추상 연산은 A (배열), Desc (프로퍼티 디스크립터)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. Desc[[Value]] 필드가 없으면,
    1. OrdinaryDefineOwnProperty(A, "length", Desc)를 반환합니다.
  2. newLenDescDesc의 복사본으로 둔다.
  3. newLen를 ? ToUint32(Desc.[[Value]])로 둔다.
  4. numberLen를 ? ToNumber(Desc.[[Value]])로 둔다.
  5. SameValueZero(newLen, numberLen)이 false이면 RangeError 예외를 던집니다.
  6. newLenDesc.[[Value]]newLen로 설정합니다.
  7. oldLenDescOrdinaryGetOwnProperty(A, "length")로 둡니다.
  8. Assert: oldLenDescundefined가 아님을 보장합니다.
  9. Assert: IsDataDescriptor(oldLenDesc)가 true임을 보장합니다.
  10. Assert: oldLenDesc.[[Configurable]]false임을 보장합니다.
  11. oldLenoldLenDesc.[[Value]]로 둡니다.
  12. newLenoldLen이면,
    1. OrdinaryDefineOwnProperty(A, "length", newLenDesc)를 반환합니다.
  13. oldLenDesc.[[Writable]]false이면, false를 반환합니다.
  14. newLenDesc[[Writable]] 필드가 없거나 newLenDesc.[[Writable]]true이면,
    1. newWritabletrue로 둡니다.
  15. 그 외의 경우,
    1. 참고: [[Writable]] 속성을 false로 설정하는 것은 요소 삭제에 실패하는 경우를 대비해 미룹니다.
    2. newWritablefalse로 둡니다.
    3. newLenDesc.[[Writable]]true로 설정합니다.
  16. succeeded를 ! OrdinaryDefineOwnProperty(A, "length", newLenDesc)로 둡니다.
  17. succeededfalse이면, false를 반환합니다.
  18. 자신의 프로퍼티 키 P 중, P배열 인덱스이고, ! ToUint32(P) ≥ newLen인 모든 P에 대해, 내림차순 숫자 인덱스 순으로,
    1. deleteSucceeded를 ! A.[[Delete]](P)로 둡니다.
    2. deleteSucceededfalse이면,
      1. newLenDesc.[[Value]]를 ! ToUint32(P) + 1𝔽로 설정합니다.
      2. newWritablefalse이면, newLenDesc.[[Writable]]false로 설정합니다.
      3. OrdinaryDefineOwnProperty(A, "length", newLenDesc)를 수행합니다.
      4. false를 반환합니다.
  19. newWritablefalse이면,
    1. succeeded를 ! OrdinaryDefineOwnProperty(A, "length", PropertyDescriptor { [[Writable]]: false })로 둡니다.
    2. Assert: succeededtrue임을 보장합니다.
  20. true를 반환합니다.
참고

34 단계에서 Desc.[[Value]]가 객체인 경우 valueOf 메서드가 두 번 호출됩니다. 이는 2판(Edition 2) 명세에서 이 효과를 명시한 이후로 유지되고 있는 레거시 동작입니다.

10.4.3 문자열 익조틱 객체

String 객체는 문자열 값을 캡슐화하고, 해당 문자열 값의 각 코드 유닛 요소에 대응하는 가상 정수 인덱스 데이터 프로퍼티를 노출하는 익조틱 객체입니다. 문자열 익조틱 객체는 항상 캡슐화된 문자열 값의 길이를 값으로 갖는 "length"라는 이름의 데이터 프로퍼티를 가집니다. 코드 유닛 데이터 프로퍼티"length" 프로퍼티 모두 쓰기 불가 및 재정의 불가(non-configurable)입니다.

객체의 [[GetOwnProperty]], [[DefineOwnProperty]], [[OwnPropertyKeys]] 내부 메서드가 아래 구현을 따르고, 그 외의 필수 내부 메서드는 10.1의 정의를 따른다면, 그 객체는 문자열 익조틱 객체(혹은 간단히 String 객체)입니다. 이 메서드들은 StringCreate에서 설치됩니다.

문자열 익조틱 객체일반 객체와 동일한 내부 슬롯을 가지며, 추가로 [[StringData]] 내부 슬롯을 가집니다.

10.4.3.1 [[GetOwnProperty]] ( P )

문자열 익조틱 객체 S[[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키)를 인자로 받아, 프로퍼티 디스크립터 또는 undefined를 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. descOrdinaryGetOwnProperty(S, P)로 둡니다.
  2. descundefined가 아니면 desc를 반환합니다.
  3. StringGetOwnProperty(S, P)를 반환합니다.

10.4.3.2 [[DefineOwnProperty]] ( P, Desc )

문자열 익조틱 객체 S[[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키), Desc (프로퍼티 디스크립터)를 인자로 받아, 불리언을 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. stringDescStringGetOwnProperty(S, P)로 둡니다.
  2. stringDescundefined가 아니면,
    1. extensibleS.[[Extensible]]로 둔다.
    2. IsCompatiblePropertyDescriptor(extensible, Desc, stringDesc)를 반환한다.
  3. OrdinaryDefineOwnProperty(S, P, Desc)를 반환한다.

10.4.3.3 [[OwnPropertyKeys]] ( )

문자열 익조틱 객체 O[[OwnPropertyKeys]] 내부 메서드는 인자를 받지 않으며, 프로퍼티 키리스트를 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. keys를 새로운 빈 리스트로 둔다.
  2. strO.[[StringData]]로 둔다.
  3. Assert: str문자열임을 보장한다.
  4. lenstr의 길이로 둔다.
  5. 0 ≤ i < len인 모든 정수 i에 대해 오름차순으로,
    1. ToString(𝔽(i))를 keys에 추가한다.
  6. 자신의 프로퍼티 키 P 중, P배열 인덱스이고, ! ToIntegerOrInfinity(P) ≥ len인 모든 P에 대해 오름차순 숫자 인덱스 순서대로,
    1. Pkeys에 추가한다.
  7. 자신의 프로퍼티 키 P 중, P문자열이고 배열 인덱스가 아닌 모든 P에 대해 프로퍼티 생성 시점의 오름차순 순서대로,
    1. Pkeys에 추가한다.
  8. 자신의 프로퍼티 키 P 중, P심볼인 모든 P에 대해 프로퍼티 생성 시점의 오름차순 순서대로,
    1. Pkeys에 추가한다.
  9. keys를 반환한다.

10.4.3.4 StringCreate ( value, prototype )

StringCreate 추상 연산은 value (문자열), prototype (객체)를 인자로 받아 문자열 익조틱 객체를 반환한다. 이는 새로운 문자열 익조틱 객체의 생성을 명세하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. SMakeBasicObject[[Prototype]], [[Extensible]], [[StringData]] »)로 둔다.
  2. S.[[Prototype]]prototype으로 설정한다.
  3. S.[[StringData]]value로 설정한다.
  4. S.[[GetOwnProperty]]10.4.3.1에 명시된 대로 설정한다.
  5. S.[[DefineOwnProperty]]10.4.3.2에 명시된 대로 설정한다.
  6. S.[[OwnPropertyKeys]]10.4.3.3에 명시된 대로 설정한다.
  7. lengthvalue의 길이로 둔다.
  8. DefinePropertyOrThrow(S, "length", PropertyDescriptor { [[Value]]: 𝔽(length), [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  9. S를 반환한다.

10.4.3.5 StringGetOwnProperty ( S, P )

StringGetOwnProperty 추상 연산은 S ([[StringData]] 내부 슬롯이 있는 객체), P (프로퍼티 키)를 인자로 받아, 프로퍼티 디스크립터 또는 undefined를 반환한다. 호출 시 다음 단계를 수행한다:

  1. P문자열이 아니면 undefined를 반환한다.
  2. indexCanonicalNumericIndexString(P)로 둔다.
  3. index정수(Number)가 아니면 undefined를 반환한다.
  4. index-0𝔽이거나 index < -0𝔽이면 undefined를 반환한다.
  5. strS.[[StringData]]로 둔다.
  6. Assert: str문자열임을 보장한다.
  7. lenstr의 길이로 둔다.
  8. (index) ≥ len이면 undefined를 반환한다.
  9. resultStrsubstring(str, (index), (index) + 1)로 둔다.
  10. PropertyDescriptor { [[Value]]: resultStr, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }를 반환한다.

10.4.4 Arguments 익조틱 객체

대부분의 ECMAScript 함수는 arguments 객체를 코드에서 사용할 수 있도록 제공합니다. 함수 정의의 특성에 따라, arguments 객체는 일반 객체이거나 arguments 익조틱 객체입니다. arguments 익조틱 객체익조틱 객체로, 배열 인덱스 프로퍼티가 관련 ECMAScript 함수의 호출 시 형식 매개변수 바인딩과 매핑됩니다.

객체의 내부 메서드가 아래 구현을 따르고, 여기 명시되지 않은 메서드는 10.1의 정의를 따른다면, 그 객체는 arguments 익조틱 객체입니다. 이러한 메서드는 CreateMappedArgumentsObject에서 설치됩니다.

참고 1

CreateUnmappedArgumentsObject 는 이 절에 포함되어 있지만, arguments 익조틱 객체가 아니라 일반 객체를 생성합니다.

Arguments 익조틱 객체일반 객체와 동일한 내부 슬롯을 가지고 있습니다. 또한 [[ParameterMap]] 내부 슬롯을 가집니다. 일반 arguments 객체도 [[ParameterMap]] 내부 슬롯을 가지지만, 그 값은 항상 undefined입니다. 일반 arguments 객체에서 [[ParameterMap]] 내부 슬롯은 Object.prototype.toString (20.1.3.6)에서 해당 객체임을 식별하는 데만 사용됩니다.

참고 2

arguments 익조틱 객체정수 인덱스 데이터 프로퍼티 중 이름이 해당 함수 객체의 형식 매개변수 개수보다 작은 것은 처음에 함수 실행 컨텍스트의 인수 바인딩과 값을 공유합니다. 즉, 프로퍼티를 변경하면 인수 바인딩의 값도 바뀌고 그 반대도 마찬가지입니다. 이 대응은 해당 프로퍼티를 삭제 후 재정의하거나 접근자 프로퍼티로 바꾸면 끊어집니다. arguments 객체가 일반 객체라면, 프로퍼티의 값은 함수에 전달된 인수의 복사본일 뿐이며, 프로퍼티 값과 형식 매개변수 값 사이에 동적 연결은 없습니다.

참고 3

ParameterMap 객체와 그 프로퍼티 값은 arguments 객체와 인수 바인딩의 대응을 명세하기 위한 장치로 사용됩니다. ParameterMap 객체와 그 프로퍼티 값 객체는 ECMAScript 코드에서 직접 관찰할 수 없습니다. 명세된 의미론을 구현하기 위해, ECMAScript 구현체는 실제로 이러한 객체를 생성하거나 사용할 필요가 없습니다.

참고 4

일반 arguments 객체는 접근 시 TypeError 예외를 던지는 "callee"라는 이름의 변경 불가 접근자 프로퍼티를 정의합니다. arguments 익조틱 객체"callee" 프로퍼티에 대해 좀 더 구체적인 의미를 가지며, 이는 일부 비엄격 함수에 대해서만 생성됩니다. 일반 variant에서 이 프로퍼티를 정의하는 것은, ECMAScript 구현체가 이와 다른 방법으로 프로퍼티를 정의하지 않도록 보장하기 위함입니다.

참고 5

ECMAScript의 arguments 익조틱 객체 구현체는 역사적으로 "caller"라는 접근자 프로퍼티를 포함하는 경우가 있었습니다. ECMAScript 2017 이전에는 이 명세서에 일반 arguments 객체에 대해 예외를 던지는 "caller" 프로퍼티 정의가 포함되어 있었습니다. 현재는 구현체가 더 이상 이 확장을 포함하지 않으므로, ECMAScript 2017에서 이 요구사항을 삭제하였습니다.

10.4.4.1 [[GetOwnProperty]] ( P )

arguments 익조틱 객체 args[[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키)를 인자로 받아, 프로퍼티 디스크립터 또는 undefined를 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. descOrdinaryGetOwnProperty(args, P)로 둔다.
  2. descundefined이면 undefined를 반환한다.
  3. mapargs.[[ParameterMap]]로 둔다.
  4. isMapped를 ! HasOwnProperty(map, P)로 둔다.
  5. isMappedtrue이면,
    1. desc.[[Value]]를 ! Get(map, P)로 설정한다.
  6. desc를 반환한다.

10.4.4.2 [[DefineOwnProperty]] ( P, Desc )

arguments 익조틱 객체 args[[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키), Desc (프로퍼티 디스크립터)를 인자로 받아 불리언을 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. mapargs.[[ParameterMap]]로 둔다.
  2. isMapped를 ! HasOwnProperty(map, P)로 둔다.
  3. newArgDescDesc로 둔다.
  4. isMappedtrue이고 IsDataDescriptor(Desc) 가 true이면,
    1. Desc[[Value]] 필드가 없고, Desc[[Writable]] 필드가 있으면서 Desc.[[Writable]]false이면,
      1. newArgDescDesc의 복사본으로 둔다.
      2. newArgDesc.[[Value]]를 ! Get(map, P)로 설정한다.
  5. allowed를 ! OrdinaryDefineOwnProperty(args, P, newArgDesc)로 둔다.
  6. allowedfalse이면 false를 반환한다.
  7. isMappedtrue이면,
    1. IsAccessorDescriptor(Desc) 가 true이면,
      1. map.[[Delete]](P)를 수행한다.
    2. 그 외의 경우,
      1. Desc[[Value]] 필드가 있으면,
        1. Assert: 아래 Set은 반드시 성공한다. arguments 객체에 의해 매핑되는 형식 매개변수는 항상 writable이다.
        2. Set(map, P, Desc.[[Value]], false)를 수행한다.
      2. Desc[[Writable]] 필드가 있고 Desc.[[Writable]]false이면,
        1. map.[[Delete]](P)를 수행한다.
  8. true를 반환한다.

10.4.4.3 [[Get]] ( P, Receiver )

arguments 익조틱 객체 args[[Get]] 내부 메서드는 P (프로퍼티 키), Receiver (ECMAScript 언어 값)를 인자로 받아, ECMAScript 언어 값를 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. mapargs.[[ParameterMap]]로 둔다.
  2. isMapped를 ! HasOwnProperty(map, P)로 둔다.
  3. isMappedfalse이면,
    1. OrdinaryGet(args, P, Receiver)를 반환한다.
  4. 그 외의 경우,
    1. Assert: mapP에 대한 형식 매개변수 매핑이 있음을 보장한다.
    2. Get(map, P)를 반환한다.

10.4.4.4 [[Set]] ( P, V, Receiver )

arguments 익조틱 객체 args[[Set]] 내부 메서드는 P (프로퍼티 키), V (ECMAScript 언어 값), Receiver (ECMAScript 언어 값)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. SameValue(args, Receiver)가 false이면,
    1. isMappedfalse로 둔다.
  2. 그 외의 경우,
    1. mapargs.[[ParameterMap]]로 둔다.
    2. isMapped를 ! HasOwnProperty(map, P)로 둔다.
  3. isMappedtrue이면,
    1. Assert: 아래 Set은 반드시 성공한다. arguments 객체에 의해 매핑되는 형식 매개변수는 항상 writable이다.
    2. Set(map, P, V, false)를 수행한다.
  4. OrdinarySet(args, P, V, Receiver)를 반환한다.

10.4.4.5 [[Delete]] ( P )

arguments 익조틱 객체 args[[Delete]] 내부 메서드는 P (프로퍼티 키)를 인자로 받아, 불리언을 포함하는 정상 완료 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. mapargs.[[ParameterMap]]로 둔다.
  2. isMapped를 ! HasOwnProperty(map, P)로 둔다.
  3. result를 ? OrdinaryDelete(args, P)로 둔다.
  4. resulttrue이고 isMappedtrue이면,
    1. map.[[Delete]](P)를 수행한다.
  5. result를 반환한다.

10.4.4.6 CreateUnmappedArgumentsObject ( argumentsList )

추상 연산 CreateUnmappedArgumentsObject는 argumentsList (ECMAScript 언어 값의 리스트)를 인자로 받아, 일반 객체를 반환한다. 호출 시 다음 단계를 수행한다:

  1. lenargumentsList의 요소 개수로 둔다.
  2. objOrdinaryObjectCreate(%Object.prototype%, « [[ParameterMap]] »)로 둔다.
  3. obj.[[ParameterMap]]undefined로 설정한다.
  4. DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(len), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
  5. index를 0으로 둔다.
  6. index < len인 동안 반복한다:
    1. valargumentsList[index]로 둔다.
    2. CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), val)를 수행한다.
    3. indexindex + 1로 설정한다.
  7. DefinePropertyOrThrow(obj, %Symbol.iterator%, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
  8. DefinePropertyOrThrow(obj, "callee", PropertyDescriptor { [[Get]]: %ThrowTypeError%, [[Set]]: %ThrowTypeError%, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  9. obj를 반환한다.

10.4.4.7 CreateMappedArgumentsObject ( func, formals, argumentsList, env )

추상 연산 CreateMappedArgumentsObject는 func (객체), formals (파스 노드), argumentsList (ECMAScript 언어 값의 리스트), env (환경 레코드)를 인자로 받아, arguments 익조틱 객체를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: formals는 rest 파라미터, 바인딩 패턴, 이니셜라이저를 포함하지 않는다. 중복 식별자를 포함할 수 있다.
  2. lenargumentsList의 요소 개수로 둔다.
  3. objMakeBasicObject[[Prototype]], [[Extensible]], [[ParameterMap]] »)로 둔다.
  4. obj.[[GetOwnProperty]]10.4.4.1에 명시된 대로 설정한다.
  5. obj.[[DefineOwnProperty]]10.4.4.2에 명시된 대로 설정한다.
  6. obj.[[Get]]10.4.4.3에 명시된 대로 설정한다.
  7. obj.[[Set]]10.4.4.4에 명시된 대로 설정한다.
  8. obj.[[Delete]]10.4.4.5에 명시된 대로 설정한다.
  9. obj.[[Prototype]]%Object.prototype%로 설정한다.
  10. mapOrdinaryObjectCreate(null)로 둔다.
  11. obj.[[ParameterMap]]map으로 설정한다.
  12. parameterNamesBoundNames of formals로 둔다.
  13. numberOfParametersparameterNames의 요소 개수로 둔다.
  14. index를 0으로 둔다.
  15. index < len인 동안 반복한다:
    1. valargumentsList[index]로 둔다.
    2. CreateDataPropertyOrThrow(obj, ! ToString(𝔽(index)), val)를 수행한다.
    3. indexindex + 1로 설정한다.
  16. DefinePropertyOrThrow(obj, "length", PropertyDescriptor { [[Value]]: 𝔽(len), [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
  17. mappedNames를 새로운 빈 리스트로 둔다.
  18. indexnumberOfParameters - 1로 둔다.
  19. index ≥ 0인 동안 반복한다:
    1. nameparameterNames[index]로 둔다.
    2. mappedNamesname이 없으면,
      1. namemappedNames에 추가한다.
      2. index < len이면,
        1. gMakeArgGetter(name, env)로 둔다.
        2. pMakeArgSetter(name, env)로 둔다.
        3. map.[[DefineOwnProperty]](! ToString(𝔽(index)), PropertyDescriptor { [[Set]]: p, [[Get]]: g, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
    3. indexindex - 1로 설정한다.
  20. DefinePropertyOrThrow(obj, %Symbol.iterator%, PropertyDescriptor { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
  21. DefinePropertyOrThrow(obj, "callee", PropertyDescriptor { [[Value]]: func, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true })를 수행한다.
  22. obj를 반환한다.

10.4.4.7.1 MakeArgGetter ( name, env )

추상 연산 MakeArgGetter는 name (문자열), env (환경 레코드)를 인자로 받아, 함수 객체를 반환한다. 이 연산은 env에서 name에 바인딩된 값을 반환하는 내장 함수 객체를 생성한다. 호출 시 다음 단계를 수행한다:

  1. getterClosure를, nameenv를 캡처하며, 인자가 없고, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure로 둔다:
    1. NormalCompletion(! env.GetBindingValue(name, false))을 반환한다.
  2. getterCreateBuiltinFunction(getterClosure, 0, "", « »)로 둔다.
  3. 참고: getter는 ECMAScript 코드에서 직접 접근할 수 없다.
  4. getter를 반환한다.

10.4.4.7.2 MakeArgSetter ( name, env )

추상 연산 MakeArgSetter는 name (문자열), env (환경 레코드)를 인자로 받아, 함수 객체를 반환한다. 이 연산은 env에서 name에 바인딩된 값을 설정하는 내장 함수 객체를 생성한다. 호출 시 다음 단계를 수행한다:

  1. setterClosure를, nameenv를 캡처하며, (value) 인자를 받고, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure로 둔다:
    1. NormalCompletion(! env.SetMutableBinding(name, value, false))을 반환한다.
  2. setterCreateBuiltinFunction(setterClosure, 1, "", « »)로 둔다.
  3. 참고: setter는 ECMAScript 코드에서 직접 접근할 수 없다.
  4. setter를 반환한다.

10.4.5 TypedArray 익조틱 객체

TypedArray익조틱 객체로, 프로퍼티 키정규 숫자 문자열인 것들을 특별하게 처리하며, 그 중 경계 내의 정수 인덱스에 해당하는 값은 균일 타입의 요소 인덱싱에 사용하고, 나머지는 프로토타입 체인 탐색 없이 존재하지 않는 것으로 강제하는 불변식을 유지합니다.

참고

어떤 Number n에 대해서도 ToString(n)은 정규 숫자 문자열이므로, 구현체는 실제로 문자열 변환을 수행하지 않고도 Number를 프로퍼티 키로 간주하여 TypedArray에 사용할 수 있습니다.

TypedArray일반 객체와 동일한 내부 슬롯을 가지며, 추가로 [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] 내부 슬롯을 가집니다.

객체의 [[PreventExtensions]], [[GetOwnProperty]], [[HasProperty]], [[DefineOwnProperty]], [[Get]], [[Set]], [[Delete]], [[OwnPropertyKeys]] 내부 메서드가 이 절의 정의를 따르고, 그 외의 필수 내부 메서드는 10.1의 정의를 따른다면, 그 객체는 TypedArray입니다. 이러한 메서드는 TypedArrayCreate로 설치됩니다.

10.4.5.1 [[PreventExtensions]] ( )

TypedArray O[[PreventExtensions]] 내부 메서드는 인자를 받지 않으며, 불리언을 포함하는 정상 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. 참고: 6.1.7.3의 확장성 관련 불변식에 따라, O가 프로퍼티를 얻거나(또는 잃고 다시 얻거나) 할 수 있으면(예: 내부 버퍼가 리사이즈될 때 정수 인덱스 프로퍼티), 이 메서드는 true를 반환할 수 없습니다.
  2. IsTypedArrayFixedLength(O) 가 false이면 false를 반환합니다.
  3. OrdinaryPreventExtensions(O)를 반환합니다.

10.4.5.2 [[GetOwnProperty]] ( P )

TypedArray O[[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키)를 인자로 받고, 프로퍼티 디스크립터 또는 undefined를 포함하는 정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. P문자열이면,
    1. numericIndexCanonicalNumericIndexString(P)로 둔다.
    2. numericIndexundefined가 아니면,
      1. valueTypedArrayGetElement(O, numericIndex)로 둔다.
      2. valueundefinedundefined를 반환한다.
      3. PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }를 반환한다.
  2. OrdinaryGetOwnProperty(O, P)를 반환한다.

10.4.5.3 [[HasProperty]] ( P )

TypedArray O[[HasProperty]] 내부 메서드는 P (프로퍼티 키)를 인자로 받고, 불리언 또는 throw completion을 포함하는 정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. P문자열이면,
    1. numericIndexCanonicalNumericIndexString(P)로 둔다.
    2. numericIndexundefined가 아니면 IsValidIntegerIndex(O, numericIndex)를 반환한다.
  2. OrdinaryHasProperty(O, P)를 반환한다.

10.4.5.4 [[DefineOwnProperty]] ( P, Desc )

TypedArray O[[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키), Desc (프로퍼티 디스크립터)를 인자로 받고, 불리언 또는 throw completion을 포함하는 정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. P문자열이면,
    1. numericIndexCanonicalNumericIndexString(P)로 둔다.
    2. numericIndexundefined가 아니면,
      1. IsValidIntegerIndex(O, numericIndex)가 falsefalse를 반환한다.
      2. Desc[[Configurable]] 필드가 있고 Desc.[[Configurable]]falsefalse를 반환한다.
      3. Desc[[Enumerable]] 필드가 있고 Desc.[[Enumerable]]falsefalse를 반환한다.
      4. IsAccessorDescriptor(Desc)가 truefalse를 반환한다.
      5. Desc[[Writable]] 필드가 있고 Desc.[[Writable]]falsefalse를 반환한다.
      6. Desc[[Value]] 필드가 있으면, ? TypedArraySetElement(O, numericIndex, Desc.[[Value]])를 수행한다.
      7. true를 반환한다.
  2. OrdinaryDefineOwnProperty(O, P, Desc)를 반환한다.

10.4.5.5 [[Get]] ( P, Receiver )

TypedArray O[[Get]] 내부 메서드는 P (프로퍼티 키), Receiver (ECMAScript 언어 값)를 인자로 받고, ECMAScript 언어 값 또는 throw completion을 포함하는 정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. P문자열이면,
    1. numericIndexCanonicalNumericIndexString(P)로 둔다.
    2. numericIndexundefined가 아니면,
      1. TypedArrayGetElement(O, numericIndex)를 반환한다.
  2. OrdinaryGet(O, P, Receiver)를 반환한다.

10.4.5.6 [[Set]] ( P, V, Receiver )

TypedArray O[[Set]] 내부 메서드는 P (프로퍼티 키), V (ECMAScript 언어 값), Receiver (ECMAScript 언어 값)를 인자로 받고, 불리언 또는 throw completion을 포함하는 정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. P문자열이면,
    1. numericIndexCanonicalNumericIndexString(P)로 둔다.
    2. numericIndexundefined가 아니면,
      1. SameValue(O, Receiver)가 true이면,
        1. TypedArraySetElement(O, numericIndex, V)를 수행한다.
        2. true를 반환한다.
      2. IsValidIntegerIndex(O, numericIndex)가 false이면 true를 반환한다.
  2. OrdinarySet(O, P, V, Receiver)를 반환한다.

10.4.5.7 [[Delete]] ( P )

TypedArray O[[Delete]] 내부 메서드는 P (프로퍼티 키)를 인자로 받고, 불리언을 포함하는 정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. P문자열이면,
    1. numericIndexCanonicalNumericIndexString(P)로 둔다.
    2. numericIndexundefined가 아니면,
      1. IsValidIntegerIndex(O, numericIndex)가 false이면 true를 반환하고, 아니면 false를 반환한다.
  2. OrdinaryDelete(O, P)를 반환한다.

10.4.5.8 [[OwnPropertyKeys]] ( )

[[OwnPropertyKeys]] 내부 메서드는 TypedArray O에 대해 인수를 받지 않으며, 정상 완성 레코드(normal completion)에 담긴 리스트(List)를 반환합니다. 반환되는 리스트는 프로퍼티 키(property keys)로 구성됩니다. 호출 시 다음 절차를 수행합니다:

  1. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)로 설정한다.
  2. keys를 새로운 비어있는 리스트(List)로 설정한다.
  3. IsTypedArrayOutOfBounds(taRecord) 가 false라면,
    1. lengthTypedArrayLength(taRecord)로 설정한다.
    2. 0 ≤ i < length를 만족하는 정수(integer) i 각각에 대해, 오름차순으로, 다음을 수행한다:
      1. ToString(𝔽(i))의 결과를 keys에 추가한다.
  4. O의 자신의 프로퍼티 키(property key) P 각각에 대해, P문자열(String)이고 P정수 인덱스(integer index)가 아닌 경우, 프로퍼티 생성의 시간 순서대로 다음을 수행한다:
    1. Pkeys에 추가한다.
  5. O의 자신의 프로퍼티 키(property key) P 각각에 대해, P심볼(Symbol)인 경우, 프로퍼티 생성의 시간 순서대로 다음을 수행한다:
    1. Pkeys에 추가한다.
  6. keys를 반환한다.

10.4.5.9 TypedArray With Buffer Witness Records

TypedArray With Buffer Witness Record레코드(Record) 값으로, TypedArray와 함께 버퍼의 바이트 길이 캐시를 캡슐화합니다. 이는 확장 가능한 SharedArrayBuffer를 볼 때, 바이트 길이 데이터 블록에 대한 단일 공유 메모리 읽기 이벤트가 보장되도록 돕기 위해 사용됩니다.

TypedArray With Buffer Witness Record에는 표 32에 나열된 필드가 있습니다.

표 32: TypedArray With Buffer Witness Record 필드
Field Name Value Meaning
[[Object]] TypedArray 바이트 길이가 로드되는 TypedArray.
[[CachedBufferByteLength]] 음수가 아닌 정수(integer) 또는 detached 레코드가 생성될 때 객체의 [[ViewedArrayBuffer]]의 바이트 길이.

10.4.5.10 MakeTypedArrayWithBufferWitnessRecord ( obj, order )

추상 연산 MakeTypedArrayWithBufferWitnessRecord는 인수 obj (TypedArray) 와 order (seq-cst 또는 unordered)를 받아 TypedArray With Buffer Witness Record를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. bufferobj.[[ViewedArrayBuffer]]로 설정한다.
  2. IsDetachedBuffer(buffer) 가 true이면,
    1. byteLengthdetached로 설정한다.
  3. 그 외의 경우,
    1. byteLengthArrayBufferByteLength(buffer, order)의 결과로 설정한다.
  4. TypedArray With Buffer Witness Record { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength } 를 반환한다.

10.4.5.11 TypedArrayCreate ( prototype )

추상 연산 TypedArrayCreate는 prototype (객체)을 인수로 받아 TypedArray를 반환한다. 이는 새로운 TypedArrays를 생성하는 방법을 명시하는 데 사용된다. 호출 시 다음 단계를 수행한다:

  1. internalSlotsList를 « [[Prototype]], [[Extensible]], [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] »로 한다.
  2. AMakeBasicObject(internalSlotsList)로 한다.
  3. A.[[PreventExtensions]]10.4.5.1에 명시된 대로 설정한다.
  4. A.[[GetOwnProperty]]10.4.5.2에 명시된 대로 설정한다.
  5. A.[[HasProperty]]10.4.5.3에 명시된 대로 설정한다.
  6. A.[[DefineOwnProperty]]10.4.5.4에 명시된 대로 설정한다.
  7. A.[[Get]]10.4.5.5에 명시된 대로 설정한다.
  8. A.[[Set]]10.4.5.6에 명시된 대로 설정한다.
  9. A.[[Delete]]10.4.5.7에 명시된 대로 설정한다.
  10. A.[[OwnPropertyKeys]]10.4.5.8에 명시된 대로 설정한다.
  11. A.[[Prototype]]prototype으로 설정한다.
  12. A를 반환한다.

10.4.5.12 TypedArrayByteLength ( taRecord )

추상 연산 TypedArrayByteLength는 taRecord (TypedArray With Buffer Witness Record)를 인수로 받아 0 이상의 정수(integer)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. IsTypedArrayOutOfBounds(taRecord) 가 true이면 0을 반환한다.
  2. lengthTypedArrayLength(taRecord)로 한다.
  3. length = 0이면 0을 반환한다.
  4. OtaRecord.[[Object]]로 한다.
  5. O.[[ByteLength]]auto가 아니면 O.[[ByteLength]]를 반환한다.
  6. elementSizeTypedArrayElementSize(O)로 한다.
  7. length × elementSize를 반환한다.

10.4.5.13 TypedArrayLength ( taRecord )

추상 연산 TypedArrayLength는 taRecord (TypedArray With Buffer Witness Record)를 인수로 받아 0 이상의 정수(integer)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: IsTypedArrayOutOfBounds(taRecord) 는 false이다.
  2. OtaRecord.[[Object]]로 한다.
  3. O.[[ArrayLength]]auto가 아니면 O.[[ArrayLength]]를 반환한다.
  4. Assert: IsFixedLengthArrayBuffer(O.[[ViewedArrayBuffer]])는 false이다.
  5. byteOffsetO.[[ByteOffset]]로 한다.
  6. elementSizeTypedArrayElementSize(O)로 한다.
  7. byteLengthtaRecord.[[CachedBufferByteLength]]로 한다.
  8. Assert: byteLengthdetached가 아니다.
  9. floor((byteLength - byteOffset) / elementSize)를 반환한다.

10.4.5.14 IsTypedArrayOutOfBounds ( taRecord )

추상 연산 IsTypedArrayOutOfBounds는 taRecord (TypedArray With Buffer Witness Record)를 인수로 받아 불리언 값을 반환한다. 이 연산은 객체의 수치 프로퍼티가 기본 버퍼의 범위 내에 포함되지 않은 인덱스를 참조하는지 검사한다. 호출 시 다음 단계를 수행한다:

  1. OtaRecord.[[Object]]로 한다.
  2. bufferByteLengthtaRecord.[[CachedBufferByteLength]]로 한다.
  3. Assert: IsDetachedBuffer(O.[[ViewedArrayBuffer]])는 true이고 오직 bufferByteLengthdetached일 때만 그렇다.
  4. bufferByteLengthdetached이면 true를 반환한다.
  5. byteOffsetStartO.[[ByteOffset]]로 한다.
  6. O.[[ArrayLength]]auto이면,
    1. byteOffsetEndbufferByteLength로 한다.
  7. 그 외의 경우,
    1. elementSizeTypedArrayElementSize(O)로 한다.
    2. byteOffsetEndbyteOffsetStart + O.[[ArrayLength]] × elementSize로 한다.
  8. byteOffsetStart > bufferByteLength이거나 byteOffsetEnd > bufferByteLength이면 true를 반환한다.
  9. 참고: 길이가 0인 TypedArrays는 out-of-bounds로 간주하지 않는다.
  10. false를 반환한다.

10.4.5.15 IsTypedArrayFixedLength ( O )

추상 연산 IsTypedArrayFixedLength는 O (TypedArray)를 인수로 받아 불리언 값을 반환한다. 호출 시 다음 단계를 수행한다:

  1. O.[[ArrayLength]]auto이면 false를 반환한다.
  2. bufferO.[[ViewedArrayBuffer]]로 한다.
  3. IsFixedLengthArrayBuffer(buffer) 가 false이고 IsSharedArrayBuffer(buffer) 가 false이면 false를 반환한다.
  4. true를 반환한다.

10.4.5.16 IsValidIntegerIndex ( O, index )

추상 연산 IsValidIntegerIndex는 O (TypedArray)와 index (숫자)를 인수로 받아 불리언 값을 반환한다. 호출 시 다음 단계를 수행한다:

  1. IsDetachedBuffer(O.[[ViewedArrayBuffer]])가 true이면 false를 반환한다.
  2. index정수(Number)가 아니면 false를 반환한다.
  3. index-0𝔽이거나 index < -0𝔽이면 false를 반환한다.
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(O, unordered)로 한다.
  5. 참고: O의 backing buffer가 확장 가능한 SharedArrayBuffer일 때 bounds 체크는 동기화 연산이 아니다.
  6. IsTypedArrayOutOfBounds(taRecord) 가 true이면 false를 반환한다.
  7. lengthTypedArrayLength(taRecord)로 한다.
  8. (index) ≥ length이면 false를 반환한다.
  9. true를 반환한다.

10.4.5.17 TypedArrayGetElement ( O, index )

추상 연산 TypedArrayGetElement는 O (TypedArray)와 index (숫자)를 인수로 받아 숫자(Number), BigInt 또는 undefined를 반환한다. 호출 시 다음 단계를 수행한다:

  1. IsValidIntegerIndex(O, index)가 false이면 undefined를 반환한다.
  2. offsetO.[[ByteOffset]]로 한다.
  3. elementSizeTypedArrayElementSize(O)로 한다.
  4. byteIndexInBuffer를 ((index) × elementSize) + offset로 한다.
  5. elementTypeTypedArrayElementType(O)로 한다.
  6. GetValueFromBuffer(O.[[ViewedArrayBuffer]], byteIndexInBuffer, elementType, true, unordered)의 결과를 반환한다.

10.4.5.18 TypedArraySetElement ( O, index, value )

추상 연산 TypedArraySetElement는 O (TypedArray), index (숫자), value (ECMAScript 언어 값)을 인수로 받아 normal completion containing unused 또는 throw completion을 반환한다. 호출 시 다음 단계를 수행한다:

  1. O.[[ContentType]]bigint이면, numValue를 ? ToBigInt(value)로 한다.
  2. 그 외에는, numValue를 ? ToNumber(value)로 한다.
  3. IsValidIntegerIndex(O, index)가 true이면,
    1. offsetO.[[ByteOffset]]로 한다.
    2. elementSizeTypedArrayElementSize(O)로 한다.
    3. byteIndexInBuffer를 ((index) × elementSize) + offset으로 한다.
    4. elementTypeTypedArrayElementType(O)로 한다.
    5. SetValueInBuffer(O.[[ViewedArrayBuffer]], byteIndexInBuffer, elementType, numValue, true, unordered)를 수행한다.
  4. unused를 반환한다.
참고

이 연산은 항상 성공하는 것처럼 보이지만, TypedArray의 끝을 넘어 쓰기를 시도하거나 분리(detached)된 ArrayBuffer를 사용하는 TypedArray에 쓰기를 시도하면 아무 효과가 없다.

10.4.5.19 IsArrayBufferViewOutOfBounds ( O )

추상 연산 IsArrayBufferViewOutOfBounds는 O (TypedArray 또는 DataView)를 인수로 받아 불리언 값을 반환한다. 이 연산은 TypedArray의 수치 프로퍼티 또는 DataView 객체의 메서드가 기본 데이터 블록의 범위 내에 포함되지 않은 인덱스를 참조할 수 있는지 검사한다. 이 추상 연산은 상위 명세에서 편의를 위해 존재한다. 호출 시 다음 단계를 수행한다:

  1. O[[DataView]] 내부 슬롯이 있으면,
    1. viewRecordMakeDataViewWithBufferWitnessRecord(O, seq-cst)로 한다.
    2. IsViewOutOfBounds(viewRecord)의 결과를 반환한다.
  2. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)로 한다.
  3. IsTypedArrayOutOfBounds(taRecord)의 결과를 반환한다.

10.4.6 모듈 네임스페이스 이그조틱 객체(Module Namespace Exotic Objects)

모듈 네임스페이스 이그조틱 객체이그조틱 객체로, ECMAScript Module에서 내보낸 바인딩을 노출합니다(자세한 내용은 16.2.3 참조). 모듈 네임스페이스 이그조틱 객체의 문자열 키를 갖는 자신의 프로퍼티와 Module이 내보낸 바인딩 이름 사이에는 일대일 대응이 있습니다. 내보낸 바인딩에는 export *로 간접적으로 내보낸 바인딩도 포함됩니다. 각 문자열 값의 자신의 프로퍼티 키는 해당 내보낸 바인딩 이름의 StringValue입니다. 이것들은 모듈 네임스페이스 이그조틱 객체의 유일한 문자열 키 프로퍼티입니다. 각 프로퍼티의 속성은 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false }입니다. 모듈 네임스페이스 이그조틱 객체는 확장할 수 없습니다.

객체의 [[GetPrototypeOf]], [[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]], [[GetOwnProperty]], [[DefineOwnProperty]], [[HasProperty]], [[Get]], [[Set]], [[Delete]], [[OwnPropertyKeys]] 내부 메서드가 이 절의 정의를 사용하고, 나머지 필수 내부 메서드는 10.1의 정의를 사용하는 경우, 그 객체는 모듈 네임스페이스 이그조틱 객체입니다. 이러한 메서드는 ModuleNamespaceCreate에 의해 설치됩니다.

모듈 네임스페이스 이그조틱 객체표 33에 정의된 내부 슬롯을 가집니다.

표 33: 모듈 네임스페이스 이그조틱 객체의 내부 슬롯
내부 슬롯 타입 설명
[[Module]] Module Record 이 네임스페이스가 내보내는 Module Record 입니다.
[[Exports]] 문자열 리스트(List) 이 객체의 자신의 프로퍼티로 노출되는 내보낸 이름의 문자열 값으로 이루어진 리스트(List)입니다. 리스트는 사전식 코드 유닛 순서로 정렬됩니다.

10.4.6.1 [[GetPrototypeOf]] ( )

모듈 네임스페이스 이그조틱 객체[[GetPrototypeOf]] 내부 메서드는 인수를 받지 않으며 정상 완성(normal completion)에 담긴 null을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. null을 반환한다.

10.4.6.2 [[SetPrototypeOf]] ( V )

모듈 네임스페이스 이그조틱 객체 O[[SetPrototypeOf]] 내부 메서드는 V (객체 또는 null)를 인수로 받아 정상 완성(normal completion)에 담긴 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. SetImmutablePrototype(O, V)의 결과를 반환한다.

10.4.6.3 [[IsExtensible]] ( )

모듈 네임스페이스 이그조틱 객체[[IsExtensible]] 내부 메서드는 인수를 받지 않으며 정상 완성(normal completion)에 담긴 false를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. false를 반환한다.

10.4.6.4 [[PreventExtensions]] ( )

모듈 네임스페이스 이그조틱 객체[[PreventExtensions]] 내부 메서드는 인수를 받지 않으며 정상 완성(normal completion)에 담긴 true를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. true를 반환한다.

10.4.6.5 [[GetOwnProperty]] ( P )

모듈 네임스페이스 이그조틱 객체 O[[GetOwnProperty]] 내부 메서드는 P (프로퍼티 키)를 인수로 받아 정상 완성(normal completion)에 담긴 프로퍼티 디스크립터(Property Descriptor) 또는 undefined를 반환하거나, throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. P심볼(Symbol)이면, OrdinaryGetOwnProperty(O, P)를 반환한다.
  2. exportsO.[[Exports]]로 한다.
  3. exportsP를 포함하지 않으면 undefined를 반환한다.
  4. value를 ? O.[[Get]](P, O)로 한다.
  5. PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false  }를 반환한다.

10.4.6.6 [[DefineOwnProperty]] ( P, Desc )

모듈 네임스페이스 이그조틱 객체 O[[DefineOwnProperty]] 내부 메서드는 P (프로퍼티 키)와 Desc (프로퍼티 디스크립터(Property Descriptor))를 인수로 받아 정상 완성(normal completion)에 담긴 불리언이나 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. P심볼(Symbol)이면, ! OrdinaryDefineOwnProperty(O, P, Desc)를 반환한다.
  2. current를 ? O.[[GetOwnProperty]](P)로 한다.
  3. currentundefined이면 false를 반환한다.
  4. Desc[[Configurable]] 필드가 있고 Desc.[[Configurable]]true이면 false를 반환한다.
  5. Desc[[Enumerable]] 필드가 있고 Desc.[[Enumerable]]false이면, false를 반환한다.
  6. IsAccessorDescriptor(Desc) 가 true이면 false를 반환한다.
  7. Desc[[Writable]] 필드가 있고 Desc.[[Writable]]false이면, false를 반환한다.
  8. Desc[[Value]] 필드가 있으면, SameValue(Desc.[[Value]], current.[[Value]])를 반환한다.
  9. true를 반환한다.

10.4.6.7 [[HasProperty]] ( P )

모듈 네임스페이스 이그조틱 객체 O[[HasProperty]] 내부 메서드는 P (프로퍼티 키)를 인수로 받아 정상 완성(normal completion)에 담긴 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. P심볼(Symbol)이면, ! OrdinaryHasProperty(O, P)를 반환한다.
  2. exportsO.[[Exports]]로 한다.
  3. exportsP가 포함되어 있으면 true를 반환한다.
  4. false를 반환한다.

10.4.6.8 [[Get]] ( P, Receiver )

모듈 네임스페이스 이그조틱 객체 O[[Get]] 내부 메서드는 P (프로퍼티 키)와 Receiver (ECMAScript 언어 값)를 인수로 받아 정상 완성(normal completion)에 담긴 ECMAScript 언어 값 또는 throw completion을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. P심볼(Symbol)이면,
    1. OrdinaryGet(O, P, Receiver)를 반환한다.
  2. exportsO.[[Exports]]로 한다.
  3. exportsP를 포함하지 않으면 undefined를 반환한다.
  4. mO.[[Module]]로 한다.
  5. bindingm.ResolveExport(P)로 한다.
  6. Assert: bindingResolvedBinding 레코드이다.
  7. targetModulebinding.[[Module]]로 한다.
  8. Assert: targetModuleundefined가 아니다.
  9. binding.[[BindingName]]namespace이면,
    1. GetModuleNamespace(targetModule)를 반환한다.
  10. targetEnvtargetModule.[[Environment]]로 한다.
  11. targetEnvempty이면 ReferenceError 예외를 던진다.
  12. targetEnv.GetBindingValue(binding.[[BindingName]], true)를 반환한다.
참고

ResolveExport는 부작용이 없습니다. 이 연산이 특정 exportName, resolveSet 쌍을 인수로 받아 호출될 때마다 항상 같은 결과를 반환해야 합니다. 구현체는 각 [[Exports]]에 대해 ResolveExport 결과를 미리 계산하거나 캐시할 수 있습니다.

10.4.6.9 [[Set]] ( P, V, Receiver )

모듈 네임스페이스 이그조틱 객체[[Set]] 내부 메서드는 P (프로퍼티 키), V (ECMAScript 언어 값), Receiver (ECMAScript 언어 값)를 인수로 받아 정상 완성(normal completion)에 담긴 false를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. false를 반환한다.

10.4.6.10 [[Delete]] ( P )

모듈 네임스페이스 이그조틱 객체 O[[Delete]] 내부 메서드는 P (프로퍼티 키)를 인수로 받아 정상 완성(normal completion)에 담긴 불리언을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. P심볼(Symbol)이면,
    1. OrdinaryDelete(O, P)를 반환한다.
  2. exportsO.[[Exports]]로 한다.
  3. exportsP가 포함되어 있으면 false를 반환한다.
  4. true를 반환한다.

10.4.6.11 [[OwnPropertyKeys]] ( )

모듈 네임스페이스 이그조틱 객체 O[[OwnPropertyKeys]] 내부 메서드는 인수를 받지 않으며, 정상 완성(normal completion)에 담긴 프로퍼티 키의 리스트(List)를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. exportsO.[[Exports]]로 한다.
  2. symbolKeysOrdinaryOwnPropertyKeys(O)로 한다.
  3. exportssymbolKeys리스트 연결(list-concatenation) 결과를 반환한다.

10.4.6.12 ModuleNamespaceCreate ( module, exports )

추상 연산 ModuleNamespaceCreate는 module (Module Record)와 exports (문자열의 리스트(List))를 인수로 받아 module namespace exotic object를 반환한다. 이는 새로운 module namespace exotic objects의 생성을 명시하는 데 사용된다. 호출 시 다음 절차를 수행한다:

  1. Assert: module.[[Namespace]]empty이다.
  2. internalSlotsList표 33에 나열된 내부 슬롯들로 한다.
  3. MMakeBasicObject(internalSlotsList)로 한다.
  4. M의 필수 내부 메서드들을 10.4.6에 명시된 정의로 설정한다.
  5. M.[[Module]]module을 할당한다.
  6. sortedExportsexports의 요소들을 lexicographic code unit order에 따라 정렬한 리스트(List)로 한다.
  7. M.[[Exports]]sortedExports를 할당한다.
  8. 28.3에 정의된 대로 M의 자신의 프로퍼티들을 생성한다.
  9. module.[[Namespace]]M을 할당한다.
  10. M을 반환한다.

10.4.7 불변 프로토타입 이그조틱 객체(Immutable Prototype Exotic Objects)

불변 프로토타입 이그조틱 객체이그조틱 객체이며, 초기화된 후 변경되지 않는 [[Prototype]] 내부 슬롯을 가진다.

객체의 [[SetPrototypeOf]] 내부 메서드가 다음 구현을 사용할 때, 그 객체는 불변 프로토타입 이그조틱 객체이다. (다른 필수 내부 메서드는 구체적인 불변 프로토타입 이그조틱 객체에 따라 임의의 구현을 사용할 수 있다.)

참고

다른 이그조틱 객체와 달리, 불변 프로토타입 이그조틱 객체에 대해 별도의 생성 추상 연산이 제공되지 않는다. 이는 이 객체들이 %Object.prototype%호스트 환경에서만 사용되며, 호스트 환경에서는 관련 객체가 다른 방식으로 이그조틱할 수 있으므로 별도의 생성 연산이 필요하기 때문이다.

10.4.7.1 [[SetPrototypeOf]] ( V )

불변 프로토타입 이그조틱 객체 O[[SetPrototypeOf]] 내부 메서드는 인수 V (객체 또는 null)를 받아 정상 완료(normal completion) 불리언 또는 throw completion을 반환한다. 호출 시 다음 절차를 수행한다:

  1. SetImmutablePrototype(O, V)를 반환한다.

10.4.7.2 SetImmutablePrototype ( O, V )

추상 연산 SetImmutablePrototype은 O (객체)와 V (객체 또는 null)를 인수로 받아 정상 완료(normal completion) 불리언 또는 throw completion을 반환한다. 호출 시 다음 절차를 수행한다:

  1. current를 ? O.[[GetPrototypeOf]]()로 한다.
  2. SameValue(V, current)가 true이면 true를 반환한다.
  3. false를 반환한다.

10.5 프록시 객체 내부 메서드 및 내부 슬롯

프록시 객체는 익조틱 객체로, 필수 내부 메서드가 부분적으로 ECMAScript 코드로 구현되어 있습니다. 모든 프록시 객체는 [[ProxyHandler]]라는 내부 슬롯을 가집니다. [[ProxyHandler]]의 값은 프록시의 핸들러 객체라 불리는 객체이거나 null입니다. 핸들러 객체의 메서드들(표 34 참고)은 하나 이상의 프록시 객체 내부 메서드의 구현을 보강하는 데 사용될 수 있습니다. 모든 프록시 객체는 또한 [[ProxyTarget]]이라는 내부 슬롯을 가지며, 그 값은 객체이거나 null입니다. 이 객체를 프록시의 타겟 객체라고 합니다.

객체가 필수 내부 메서드([[Call]][[Construct]]를 포함, 해당되는 경우) 구현에 이 절의 정의를 사용하는 경우, 해당 객체를 프록시 익조틱 객체라고 합니다. 이러한 내부 메서드는 ProxyCreate에서 설치됩니다.

표 34: 프록시 핸들러 메서드
내부 메서드 핸들러 메서드
[[GetPrototypeOf]] getPrototypeOf
[[SetPrototypeOf]] setPrototypeOf
[[IsExtensible]] isExtensible
[[PreventExtensions]] preventExtensions
[[GetOwnProperty]] getOwnPropertyDescriptor
[[DefineOwnProperty]] defineProperty
[[HasProperty]] has
[[Get]] get
[[Set]] set
[[Delete]] deleteProperty
[[OwnPropertyKeys]] ownKeys
[[Call]] apply
[[Construct]] construct

핸들러 메서드가 프록시 객체 내부 메서드의 구현을 제공하기 위해 호출될 때, 핸들러 메서드에는 프록시의 타겟 객체가 인자로 전달됩니다. 프록시의 핸들러 객체는 모든 필수 내부 메서드에 해당하는 메서드를 반드시 가질 필요는 없습니다. 프록시에 대해 내부 메서드를 호출할 때 핸들러 객체에 해당 트랩 메서드가 없으면, 프록시의 타겟 객체의 해당 내부 메서드가 호출됩니다.

프록시 객체의 [[ProxyHandler]][[ProxyTarget]] 내부 슬롯은 객체가 생성될 때 항상 초기화되며 일반적으로 수정할 수 없습니다. 일부 프록시 객체는 이후에 해제(revoke)될 수 있도록 생성됩니다. 프록시가 해제되면 해당 프록시의 [[ProxyHandler]][[ProxyTarget]] 내부 슬롯이 null로 설정되어, 이후 해당 프록시 객체의 내부 메서드 호출 시 TypeError 예외가 발생하게 됩니다.

프록시 객체는 내부 메서드의 구현을 임의의 ECMAScript 코드로 제공할 수 있으므로, 핸들러 메서드가 6.1.7.3에 정의된 불변 조건(invariant)을 위반하는 프록시 객체를 정의하는 것도 가능합니다. 6.1.7.3에 정의된 일부 내부 메서드 불변 조건은 본질적인 무결성 불변 조건입니다. 이러한 불변 조건은 본 절에 명시된 프록시 객체 내부 메서드에 의해 명시적으로 강제됩니다. ECMAScript 구현체는 모든 가능한 불변 조건 위반에도 견고해야 합니다.

다음 알고리즘 설명에서, O는 ECMAScript 프록시 객체, P프로퍼티 키 값, VECMAScript 언어 값, Desc프로퍼티 디스크립터 레코드라고 가정합니다.

10.5.1 [[GetPrototypeOf]] ( )

프록시 익조틱 객체 O[[GetPrototypeOf]] 내부 메서드는 인자를 받지 않으며, 객체 또는 null을 포함하는 정상 완료이거나 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "getPrototypeOf")로 한다.
  6. trapundefined이면,
    1. target.[[GetPrototypeOf]]()를 반환한다.
  7. handlerProto를 ? Call(trap, handler, « target »)로 한다.
  8. handlerProto객체가 아니고 null도 아니면, TypeError 예외를 발생시킨다.
  9. extensibleTarget을 ? IsExtensible(target)로 한다.
  10. extensibleTargettrue이면 handlerProto를 반환한다.
  11. targetProto를 ? target.[[GetPrototypeOf]]()로 한다.
  12. SameValue(handlerProto, targetProto)가 false이면, TypeError 예외를 발생시킨다.
  13. handlerProto를 반환한다.
참고

프록시 객체의 [[GetPrototypeOf]]는 다음 불변 조건을 강제합니다:

  • [[GetPrototypeOf]]의 결과는 객체 또는 null이어야 합니다.
  • 타겟 객체가 확장 가능하지 않은 경우, 프록시 객체에 적용된 [[GetPrototypeOf]]는 타겟 객체에 적용된 [[GetPrototypeOf]]와 동일한 값을 반환해야 합니다.

10.5.2 [[SetPrototypeOf]] ( V )

프록시 익조틱 객체 O[[SetPrototypeOf]] 내부 메서드는 인자 V(객체 또는 null)를 받고, 불리언을 포함하는 정상 완료이거나 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "setPrototypeOf")로 한다.
  6. trapundefined이면,
    1. target.[[SetPrototypeOf]](V)를 반환한다.
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, V »))로 한다.
  8. booleanTrapResultfalse이면 false를 반환한다.
  9. extensibleTarget을 ? IsExtensible(target)로 한다.
  10. extensibleTargettrue이면 true를 반환한다.
  11. targetProto를 ? target.[[GetPrototypeOf]]()로 한다.
  12. SameValue(V, targetProto)가 false이면 TypeError 예외를 발생시킨다.
  13. true를 반환한다.
참고

프록시 객체의 [[SetPrototypeOf]]는 다음 불변 조건을 강제합니다:

  • [[SetPrototypeOf]]의 결과는 불리언 값이어야 합니다.
  • 타겟 객체가 확장 가능하지 않은 경우, 인자 값은 타겟 객체에 적용된 [[GetPrototypeOf]]의 결과와 동일해야 합니다.

10.5.3 [[IsExtensible]] ( )

프록시 익조틱 객체 O[[IsExtensible]] 내부 메서드는 인자를 받지 않으며, 불리언을 포함하는 정상 완료이거나 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "isExtensible")로 한다.
  6. trapundefined이면,
    1. IsExtensible(target)을 반환한다.
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target »))로 한다.
  8. targetResult를 ? IsExtensible(target)로 한다.
  9. booleanTrapResulttargetResult와 다르면 TypeError 예외를 발생시킨다.
  10. booleanTrapResult를 반환한다.
참고

프록시 객체의 [[IsExtensible]]는 다음 불변 조건을 강제합니다:

  • [[IsExtensible]]의 결과는 불리언 값이어야 합니다.
  • 프록시 객체에 적용된 [[IsExtensible]]는 동일한 인자와 함께 프록시 객체의 타겟 객체에 적용된 [[IsExtensible]]와 동일한 값을 반환해야 합니다.

10.5.4 [[PreventExtensions]] ( )

프록시 익조틱 객체 O[[PreventExtensions]] 내부 메서드는 인자를 받지 않으며, 불리언을 포함하는 정상 완료이거나 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "preventExtensions")로 한다.
  6. trapundefined이면,
    1. target.[[PreventExtensions]]()를 반환한다.
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target »))로 한다.
  8. booleanTrapResulttrue이면,
    1. extensibleTarget을 ? IsExtensible(target)로 한다.
    2. extensibleTargettrue이면 TypeError 예외를 발생시킨다.
  9. booleanTrapResult를 반환한다.
참고

프록시 객체의 [[PreventExtensions]]는 다음 불변 조건을 강제합니다:

  • [[PreventExtensions]]의 결과는 불리언 값이어야 합니다.
  • 프록시 객체에 적용된 [[PreventExtensions]]는 프록시 객체의 타겟 객체에 적용된 [[IsExtensible]]false일 때만 true를 반환합니다.

10.5.5 [[GetOwnProperty]] ( P )

프록시 익조틱 객체 O[[GetOwnProperty]] 내부 메서드는 인자 P (프로퍼티 키)를 받고, 정상 완료프로퍼티 디스크립터 또는 undefined을, 혹은 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "getOwnPropertyDescriptor")로 한다.
  6. trapundefined이면,
    1. target.[[GetOwnProperty]](P)를 반환한다.
  7. trapResultObj를 ? Call(trap, handler, « target, P »)로 한다.
  8. trapResultObj객체가 아니고 undefined도 아니면, TypeError 예외를 발생시킨다.
  9. targetDesc를 ? target.[[GetOwnProperty]](P)로 한다.
  10. trapResultObjundefined이면,
    1. targetDescundefined이면 undefined를 반환한다.
    2. targetDesc.[[Configurable]]false이면 TypeError 예외를 발생시킨다.
    3. extensibleTarget를 ? IsExtensible(target)로 한다.
    4. extensibleTargetfalse이면 TypeError 예외를 발생시킨다.
    5. undefined를 반환한다.
  11. extensibleTarget를 ? IsExtensible(target)로 한다.
  12. resultDesc를 ? ToPropertyDescriptor(trapResultObj)로 한다.
  13. CompletePropertyDescriptor(resultDesc)를 수행한다.
  14. validIsCompatiblePropertyDescriptor(extensibleTarget, resultDesc, targetDesc)로 한다.
  15. validfalse이면 TypeError 예외를 발생시킨다.
  16. resultDesc.[[Configurable]]false이면,
    1. targetDescundefined이거나 targetDesc.[[Configurable]]true이면,
      1. TypeError 예외를 발생시킨다.
    2. resultDesc[[Writable]] 필드를 가지고 resultDesc.[[Writable]]false이면,
      1. Assert: targetDesc[[Writable]] 필드를 가진다.
      2. targetDesc.[[Writable]]true이면 TypeError 예외를 발생시킨다.
  17. resultDesc를 반환한다.
참고

프록시 객체의 [[GetOwnProperty]]는 다음 불변 조건을 강제합니다:

  • [[GetOwnProperty]]의 결과는 객체 또는 undefined여야 합니다.
  • 타겟 객체에 비구성 가능(Non-configurable) 자체 프로퍼티가 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수 없습니다.
  • 타겟 객체가 확장 불가능(Non-extensible)하고 해당 프로퍼티가 자체 프로퍼티로 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수 없습니다.
  • 타겟 객체가 확장 불가능하고 해당 프로퍼티가 자체 프로퍼티로 존재하지 않는 경우, 해당 프로퍼티는 존재하는 것으로 보고될 수 없습니다.
  • 타겟 객체에 비구성 가능 자체 프로퍼티가 존재하지 않는 한, 프로퍼티를 비구성 가능으로 보고할 수 없습니다.
  • 타겟 객체에 비구성 가능, 비쓰기 가능(non-writable) 자체 프로퍼티가 존재하지 않는 한, 프로퍼티를 동시에 비구성 가능 및 비쓰기 가능으로 보고할 수 없습니다.

10.5.6 [[DefineOwnProperty]] ( P, Desc )

프록시 익조틱 객체 O[[DefineOwnProperty]] 내부 메서드는 인자 P (프로퍼티 키)와 Desc (프로퍼티 디스크립터)를 받아 정상 완료로 불리언을, 혹은 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "defineProperty")로 한다.
  6. trapundefined이면,
    1. target.[[DefineOwnProperty]](P, Desc)를 반환한다.
  7. descObjFromPropertyDescriptor(Desc)로 한다.
  8. booleanTrapResultToBoolean(? Call(trap, handler, « target, P, descObj »))로 한다.
  9. booleanTrapResultfalse이면 false를 반환한다.
  10. targetDesc를 ? target.[[GetOwnProperty]](P)로 한다.
  11. extensibleTarget를 ? IsExtensible(target)로 한다.
  12. Desc[[Configurable]] 필드를 가지고 Desc.[[Configurable]]false이면,
    1. settingConfigFalsetrue로 한다.
  13. 그 외에는,
    1. settingConfigFalsefalse로 한다.
  14. targetDescundefined이면,
    1. extensibleTargetfalse이면 TypeError 예외를 발생시킨다.
    2. settingConfigFalsetrue이면 TypeError 예외를 발생시킨다.
  15. 그 외에는,
    1. IsCompatiblePropertyDescriptor(extensibleTarget, Desc, targetDesc)가 false이면 TypeError 예외를 발생시킨다.
    2. settingConfigFalsetrue이고 targetDesc.[[Configurable]]true이면 TypeError 예외를 발생시킨다.
    3. IsDataDescriptor(targetDesc) 가 true이고 targetDesc.[[Configurable]]false이며 targetDesc.[[Writable]]true이면,
      1. Desc[[Writable]] 필드를 가지고 Desc.[[Writable]]false이면 TypeError 예외를 발생시킨다.
  16. true를 반환한다.
참고

프록시 객체의 [[DefineOwnProperty]]는 다음 불변 조건을 강제합니다:

  • [[DefineOwnProperty]]의 결과는 불리언 값이어야 합니다.
  • 타겟 객체가 확장 불가능하면 프로퍼티를 추가할 수 없습니다.
  • 타겟 객체에 해당하는 비구성 가능 자체 프로퍼티가 존재하지 않는 한, 프로퍼티를 비구성 가능으로 만들 수 없습니다.
  • 타겟 객체에 해당하는 비구성 가능, 비쓰기 가능 자체 프로퍼티가 존재하지 않는 한, 비구성 가능 프로퍼티를 비쓰기 가능으로 만들 수 없습니다.
  • 프로퍼티에 해당하는 타겟 객체 프로퍼티가 존재할 때, 그 프로퍼티의 프로퍼티 디스크립터[[DefineOwnProperty]]로 적용해도 예외가 발생하지 않아야 합니다.

10.5.7 [[HasProperty]] ( P )

프록시 익조틱 객체 O[[HasProperty]] 내부 메서드는 인자 P (프로퍼티 키)를 받고, 정상 완료로 불리언을, 혹은 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "has")로 한다.
  6. trapundefined이면,
    1. target.[[HasProperty]](P)를 반환한다.
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, P »))로 한다.
  8. booleanTrapResultfalse이면,
    1. targetDesc를 ? target.[[GetOwnProperty]](P)로 한다.
    2. targetDescundefined가 아니면,
      1. targetDesc.[[Configurable]]false이면 TypeError 예외를 발생시킨다.
      2. extensibleTarget를 ? IsExtensible(target)로 한다.
      3. extensibleTargetfalse이면 TypeError 예외를 발생시킨다.
  9. booleanTrapResult를 반환한다.
참고

프록시 객체의 [[HasProperty]]는 다음 불변 조건을 강제합니다:

  • [[HasProperty]]의 결과는 불리언 값이어야 합니다.
  • 타겟 객체에 비구성 가능 자체 프로퍼티가 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수 없습니다.
  • 타겟 객체가 확장 불가능하고 해당 프로퍼티가 자체 프로퍼티로 존재할 때, 해당 프로퍼티는 존재하지 않는 것으로 보고될 수 없습니다.

10.5.8 [[Get]] ( P, Receiver )

프록시 익조틱 객체 O[[Get]] 내부 메서드는 인자 P (프로퍼티 키)와 Receiver (ECMAScript 언어 값)를 받고, 정상 완료ECMAScript 언어 값을, 혹은 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "get")로 한다.
  6. trapundefined이면,
    1. target.[[Get]](P, Receiver)를 반환한다.
  7. trapResult를 ? Call(trap, handler, « target, P, Receiver »)로 한다.
  8. targetDesc를 ? target.[[GetOwnProperty]](P)로 한다.
  9. targetDescundefined가 아니고 targetDesc.[[Configurable]]false이면,
    1. IsDataDescriptor(targetDesc) 가 true이고 targetDesc.[[Writable]]false이면,
      1. SameValue(trapResult, targetDesc.[[Value]])가 false이면 TypeError 예외를 발생시킨다.
    2. IsAccessorDescriptor(targetDesc) 가 true이고 targetDesc.[[Get]]undefined이면,
      1. trapResultundefined가 아니면 TypeError 예외를 발생시킨다.
  10. trapResult를 반환한다.
참고

프록시 객체의 [[Get]]는 다음 불변 조건을 강제합니다:

  • 비쓰기 가능, 비구성 가능 자체 데이터 프로퍼티의 경우, 해당 프로퍼티에 대해 보고되는 값은 타겟 객체 프로퍼티의 값과 같아야 합니다.
  • 접근자 프로퍼티이면서 [[Get]] 속성이 undefined인 비구성 가능 자체 프로퍼티의 경우, 해당 프로퍼티에 대해 보고되는 값은 undefined여야 합니다.

10.5.9 [[Set]] ( P, V, Receiver )

프록시 익조틱 객체 O[[Set]] 내부 메서드는 P(프로퍼티 키), V(ECMAScript 언어 값), Receiver(ECMAScript 언어 값)을 인자로 받고, 불리언을 포함하는 정상 완료 또는 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "set")로 한다.
  6. trapundefined이면,
    1. target.[[Set]](P, V, Receiver)를 반환한다.
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, P, V, Receiver »))로 한다.
  8. booleanTrapResultfalse이면 false를 반환한다.
  9. targetDesc를 ? target.[[GetOwnProperty]](P)로 한다.
  10. targetDescundefined가 아니고 targetDesc.[[Configurable]]false이면,
    1. IsDataDescriptor(targetDesc) 가 true이고 targetDesc.[[Writable]]false이면,
      1. SameValue(V, targetDesc.[[Value]])가 false이면 TypeError 예외를 발생시킨다.
    2. IsAccessorDescriptor(targetDesc) 가 true이면,
      1. targetDesc.[[Set]]undefined이면 TypeError 예외를 발생시킨다.
  11. true를 반환한다.
참고

프록시 객체의 [[Set]]는 다음 불변 조건을 강제합니다:

  • [[Set]]의 결과는 불리언 값이어야 합니다.
  • 타겟 객체의 해당 프로퍼티가 비가변(non-configurable) 및 비가변(non-writable) 자체 데이터 프로퍼티인 경우, 해당 프로퍼티의 값을 타겟 객체의 값과 다르게 변경할 수 없습니다.
  • 타겟 객체의 해당 프로퍼티가 비가변(non-configurable) 자체 접근자 프로퍼티이고, 그 [[Set]] 속성이 undefined인 경우 해당 프로퍼티 값을 설정할 수 없습니다.

10.5.10 [[Delete]] ( P )

프록시 익조틱 객체 O[[Delete]] 내부 메서드는 P(프로퍼티 키)를 인자로 받고, 불리언을 포함하는 정상 완료 또는 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "deleteProperty")로 한다.
  6. trapundefined이면,
    1. target.[[Delete]](P)를 반환한다.
  7. booleanTrapResultToBoolean(? Call(trap, handler, « target, P »))로 한다.
  8. booleanTrapResultfalse이면 false를 반환한다.
  9. targetDesc를 ? target.[[GetOwnProperty]](P)로 한다.
  10. targetDescundefined이면 true를 반환한다.
  11. targetDesc.[[Configurable]]false이면 TypeError 예외를 발생시킨다.
  12. extensibleTarget를 ? IsExtensible(target)로 한다.
  13. extensibleTargetfalse이면 TypeError 예외를 발생시킨다.
  14. true를 반환한다.
참고

프록시 객체의 [[Delete]]는 다음 불변 조건을 강제합니다:

  • [[Delete]]의 결과는 불리언 값입니다.
  • 타겟 객체에 비가변(non-configurable) 자체 프로퍼티로 존재하는 경우, 해당 프로퍼티가 삭제된 것으로 보고할 수 없습니다.
  • 타겟 객체에 자체 프로퍼티로 존재하고, 타겟 객체가 비확장 가능(non-extensible)한 경우, 해당 프로퍼티가 삭제된 것으로 보고할 수 없습니다.

10.5.11 [[OwnPropertyKeys]] ( )

프록시 익조틱 객체 O[[OwnPropertyKeys]] 내부 메서드는 인자를 받지 않으며, 프로퍼티 키들의 List를 포함하는 정상 완료 또는 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "ownKeys")로 한다.
  6. trapundefined이면,
    1. target.[[OwnPropertyKeys]]()를 반환한다.
  7. trapResultArray를 ? Call(trap, handler, « target »))로 한다.
  8. trapResult를 ? CreateListFromArrayLike(trapResultArray, property-key)로 한다.
  9. trapResult가 중복 항목을 포함하면 TypeError 예외를 발생시킨다.
  10. extensibleTarget를 ? IsExtensible(target)로 한다.
  11. targetKeys를 ? target.[[OwnPropertyKeys]]()로 한다.
  12. Assert: targetKeys프로퍼티 키들의 List이다.
  13. Assert: targetKeys는 중복 항목을 포함하지 않는다.
  14. targetConfigurableKeys를 새로운 빈 List로 한다.
  15. targetNonconfigurableKeys를 새로운 빈 List로 한다.
  16. targetKeys의 각 요소 key에 대해, 다음을 수행한다:
    1. desc를 ? target.[[GetOwnProperty]](key)로 한다.
    2. descundefined가 아니고 desc.[[Configurable]]false이면,
      1. keytargetNonconfigurableKeys에 추가한다.
    3. 그 외에는,
      1. keytargetConfigurableKeys에 추가한다.
  17. extensibleTargettrue이고 targetNonconfigurableKeys가 비어 있으면,
    1. trapResult를 반환한다.
  18. uncheckedResultKeystrapResult의 요소들로 이루어진 List로 한다.
  19. targetNonconfigurableKeys의 각 요소 key에 대해, 다음을 수행한다:
    1. uncheckedResultKeyskey가 없으면 TypeError 예외를 발생시킨다.
    2. keyuncheckedResultKeys에서 제거한다.
  20. extensibleTargettrue이면 trapResult를 반환한다.
  21. targetConfigurableKeys의 각 요소 key에 대해, 다음을 수행한다:
    1. uncheckedResultKeyskey가 없으면 TypeError 예외를 발생시킨다.
    2. keyuncheckedResultKeys에서 제거한다.
  22. uncheckedResultKeys가 비어 있지 않으면 TypeError 예외를 발생시킨다.
  23. trapResult를 반환한다.
참고

프록시 객체의 [[OwnPropertyKeys]]는 다음 불변 조건을 강제합니다:

  • [[OwnPropertyKeys]]의 결과는 List입니다.
  • 반환된 List에는 중복 항목이 없어야 합니다.
  • 반환된 List의 각 요소는 프로퍼티 키여야 합니다.
  • 결과 List에는 타겟 객체의 모든 비가변 자체 프로퍼티의 키가 포함되어야 합니다.
  • 타겟 객체가 비확장 가능(non-extensible)한 경우, 결과 List에는 타겟 객체의 모든 자체 프로퍼티의 키만 포함되어야 하며, 다른 값은 포함될 수 없습니다.

10.5.12 [[Call]] ( thisArgument, argumentsList )

프록시 익조틱 객체 O[[Call]] 내부 메서드는 thisArgument(ECMAScript 언어 값), argumentsList(ECMAScript 언어 값들의 List)를 인자로 받고, ECMAScript 언어 값을 포함하는 정상 완료 또는 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. handlerO.[[ProxyHandler]]로 한다.
  4. Assert: handler객체이다.
  5. trap을 ? GetMethod(handler, "apply")로 한다.
  6. trapundefined이면,
    1. Call(target, thisArgument, argumentsList)를 반환한다.
  7. argArrayCreateArrayFromList(argumentsList)로 한다.
  8. Call(trap, handler, « target, thisArgument, argArray »)를 반환한다.
참고

프록시 익조틱 객체[[ProxyTarget]] 내부 슬롯의 초기 값이 [[Call]] 내부 메서드를 가진 객체인 경우에만 [[Call]] 내부 메서드를 가집니다.

10.5.13 [[Construct]] ( argumentsList, newTarget )

프록시 익조틱 객체 O[[Construct]] 내부 메서드는 argumentsList(ECMAScript 언어 값들의 List), newTarget(생성자)를 인자로 받고, 객체를 포함하는 정상 완료 또는 예외 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ValidateNonRevokedProxy(O)를 수행한다.
  2. targetO.[[ProxyTarget]]로 한다.
  3. Assert: IsConstructor(target)가 true임을 확인한다.
  4. handlerO.[[ProxyHandler]]로 한다.
  5. Assert: handler객체이다.
  6. trap을 ? GetMethod(handler, "construct")로 한다.
  7. trapundefined이면,
    1. Construct(target, argumentsList, newTarget)를 반환한다.
  8. argArrayCreateArrayFromList(argumentsList)로 한다.
  9. newObj를 ? Call(trap, handler, « target, argArray, newTarget »)로 한다.
  10. newObj객체가 아니면 TypeError 예외를 발생시킨다.
  11. newObj를 반환한다.
참고 1

프록시 익조틱 객체[[ProxyTarget]] 내부 슬롯의 초기 값이 [[Construct]] 내부 메서드를 가진 객체인 경우에만 [[Construct]] 내부 메서드를 가집니다.

참고 2

프록시 객체의 [[Construct]]는 다음 불변 조건을 강제합니다:

  • [[Construct]]의 결과는 반드시 객체여야 합니다.

10.5.14 ValidateNonRevokedProxy ( proxy )

추상 연산 ValidateNonRevokedProxy는 인자 proxy(프록시 익조틱 객체)를 받고, unused를 포함하는 정상 완료 또는 예외 완료를 반환합니다. proxy가 해제(revoked)된 경우 TypeError 예외를 발생시킵니다. 호출 시 다음 단계를 수행합니다:

  1. proxy.[[ProxyTarget]]null이면, TypeError 예외를 발생시킨다.
  2. Assert: proxy.[[ProxyHandler]]null이 아니다.
  3. unused를 반환한다.

10.5.15 ProxyCreate ( target, handler )

추상 연산 ProxyCreate는 인자 target(ECMAScript 언어 값)과 handler(ECMAScript 언어 값)를 받고, 프록시 익조틱 객체를 포함하는 정상 완료 또는 예외 완료를 반환합니다. 새로운 프록시 객체를 생성할 때 사용됩니다. 호출 시 다음 단계를 수행합니다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. handler객체가 아니면, TypeError 예외를 발생시킨다.
  3. PMakeBasicObject[[ProxyHandler]], [[ProxyTarget]] »)로 한다.
  4. P의 필수 내부 메서드들([[Call]][[Construct]] 제외)에 10.5에 지정된 정의를 설정한다.
  5. IsCallable(target)이 true이면,
    1. P.[[Call]]10.5.12에 명시된 대로 설정한다.
    2. IsConstructor(target) 이 true이면,
      1. P.[[Construct]]10.5.13에 명시된 대로 설정한다.
  6. P.[[ProxyTarget]]target으로 설정한다.
  7. P.[[ProxyHandler]]handler로 설정한다.
  8. P를 반환한다.

11 ECMAScript 언어: 소스 텍스트

11.1 소스 텍스트

구문

SourceCharacter :: 임의의 유니코드 코드 포인트

ECMAScript 소스 텍스트는 유니코드 코드 포인트들의 시퀀스이다. U+0000부터 U+10FFFF까지의 모든 유니코드 코드 포인트 값(서러게이트 코드 포인트 포함)은 ECMAScript 문법에서 허용되는 곳에 ECMAScript 소스 텍스트에 나타날 수 있다. ECMAScript 소스 텍스트를 저장하고 교환하는 데 사용되는 실제 인코딩은 이 명세와 관련없다. 외부 소스 텍스트 인코딩과 무관하게, 표준 ECMAScript 구현체는 소스 텍스트를 동등한 SourceCharacter 값들의 시퀀스처럼 처리하며, 각 SourceCharacter는 유니코드 코드 포인트이다. 표준 ECMAScript 구현체는 소스 텍스트의 정규화(normalization)를 수행하거나, 수행하는 것처럼 동작할 필요가 없다.

조합 문자 시퀀스(combining character sequence)의 구성 요소는 사용자가 전체 시퀀스를 하나의 문자로 인식할 수도 있지만, 각각 개별 유니코드 코드 포인트로 취급된다.

참고

문자열 리터럴, 정규 표현식 리터럴, 템플릿 리터럴, 식별자에서는 어떤 유니코드 코드 포인트도 해당 코드 포인트의 숫자 값을 명시적으로 표현하는 유니코드 이스케이프 시퀀스를 사용하여 나타낼 수 있다. 주석 내에서는 이러한 이스케이프 시퀀스가 주석의 일부로 무시된다.

ECMAScript는 유니코드 이스케이프 시퀀스의 동작에서 Java 프로그래밍 언어와 다르다. 예를 들어, Java 프로그램에서 유니코드 이스케이프 시퀀스 \u000A가 한 줄짜리 주석 내에 나타나면, 이는 줄 종결자(유니코드 코드 포인트 U+000A는 LINE FEED (LF))로 해석되어 다음 코드 포인트는 주석의 일부가 아니다. 마찬가지로, Java 프로그램의 문자열 리터럴 내에 \u000A가 나타나면, 이것도 줄 종결자로 해석되어 문자열 리터럴 내에 허용되지 않는다—문자열 리터럴 값에 LINE FEED (LF)를 포함하려면 \n을 사용해야 한다. ECMAScript 프로그램에서는 주석 내에 등장하는 유니코드 이스케이프 시퀀스가 해석되지 않으므로 주석의 종료에 기여할 수 없다. 또한, ECMAScript 프로그램의 문자열 리터럴 내에 나타나는 유니코드 이스케이프 시퀀스는 항상 리터럴 값에 포함되며, 줄 종결자나 문자열 리터럴을 종료시킬 수 있는 코드 포인트로 해석되지 않는다.

11.1.1 정적 의미: UTF16EncodeCodePoint ( cp )

추상 연산 UTF16EncodeCodePoint는 인자 cp(유니코드 코드 포인트)를 받아 문자열을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: 0 ≤ cp ≤ 0x10FFFF.
  2. cp ≤ 0xFFFF이면, 숫자 값이 cp인 코드 유닛으로 구성된 문자열 값을 반환한다.
  3. cu1을 (cp - 0x10000) / 0x400의 내림(floor)값에 0xD800을 더한 값인 코드 유닛으로 한다.
  4. cu2를 (cp - 0x10000) modulo 0x400의 값에 0xDC00을 더한 값인 코드 유닛으로 한다.
  5. cu1cu2문자열 연결하여 반환한다.

11.1.2 정적 의미: CodePointsToString ( text )

추상 연산 CodePointsToString은 인자 text(유니코드 코드 포인트 시퀀스)를 받아 문자열을 반환한다. text6.1.4에 설명된 대로 문자열 값으로 변환한다. 호출 시 다음 단계를 수행한다:

  1. result를 빈 문자열로 한다.
  2. text의 각 코드 포인트 cp에 대해, 다음을 수행한다:
    1. resultresultUTF16EncodeCodePoint(cp)의 문자열 연결로 설정한다.
  3. result를 반환한다.

11.1.3 정적 의미: UTF16SurrogatePairToCodePoint ( lead, trail )

추상 연산 UTF16SurrogatePairToCodePoint는 인자 lead(코드 유닛), trail(코드 유닛)을 받아 코드 포인트를 반환한다. UTF-16 서러게이트 쌍을 코드 포인트로 변환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: lead리딩 서러게이트이고 trail트레일링 서러게이트이다.
  2. cp를 (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000으로 한다.
  3. 코드 포인트 cp를 반환한다.

11.1.4 정적 의미: CodePointAt ( string, position )

추상 연산 CodePointAt은 인자 string(문자열), position(음이 아닌 정수)를 받아, Record 타입의 [[CodePoint]](코드 포인트), [[CodeUnitCount]](양의 정수), [[IsUnpairedSurrogate]](불리언) 필드를 가진 결과를 반환한다. string6.1.4에 설명된 대로 UTF-16 인코딩 코드 포인트 시퀀스로 해석하고, position 위치의 코드 유닛에서 시작하는 코드 포인트 하나를 읽는다. 호출 시 다음 단계를 수행한다:

  1. sizestring의 길이로 한다.
  2. Assert: position ≥ 0이고 position < size이다.
  3. firststringposition 인덱스의 코드 유닛으로 한다.
  4. cpfirst의 숫자 값과 동일한 숫자 값을 가지는 코드 포인트로 한다.
  5. first리딩 서러게이트도 아니고 트레일링 서러게이트도 아니면,
    1. 다음 Record를 반환한다: { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false }.
  6. first트레일링 서러게이트이거나 position + 1 = size이면,
    1. 다음 Record를 반환한다: { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }.
  7. secondstringposition+1 인덱스의 코드 유닛으로 한다.
  8. second트레일링 서러게이트가 아니면,
    1. 다음 Record를 반환한다: { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true }.
  9. cpUTF16SurrogatePairToCodePoint(first, second)로 한다.
  10. 다음 Record를 반환한다: { [[CodePoint]]: cp, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false }.

11.1.5 정적 의미: StringToCodePoints ( string )

추상 연산 StringToCodePoints는 인자 string(문자열)을 받아 코드 포인트들의 List를 반환한다. string6.1.4에 설명된 대로 UTF-16 인코딩 유니코드 텍스트로 해석하여 결과로 유니코드 코드 포인트 시퀀스를 반환한다. 호출 시 다음 단계를 수행한다:

  1. codePoints를 새로운 빈 List로 한다.
  2. sizestring의 길이로 한다.
  3. position을 0으로 한다.
  4. position < size인 동안 반복한다:
    1. cpCodePointAt(string, position)으로 한다.
    2. cp.[[CodePoint]]codePoints에 추가한다.
    3. positionposition + cp.[[CodeUnitCount]]로 설정한다.
  5. codePoints를 반환한다.

11.1.6 정적 의미: ParseText ( sourceText, goalSymbol )

추상 연산 ParseText는 인자 sourceText(문자열 또는 유니코드 코드 포인트 시퀀스), goalSymbol(ECMAScript 문법의 비종결 기호(nonterminal))을 받아, 파스 노드(Parse Node) 또는 비어 있지 않은 ListSyntaxError 객체들을 반환한다. 호출 시 다음 단계를 수행한다:

  1. sourceText문자열이면, sourceTextStringToCodePoints(sourceText)로 설정한다.
  2. goalSymbol목표 심볼(goal symbol)로 하여 sourceText를 파싱하고, 파싱 결과에서 조기 에러(early error) 조건을 분석한다. 파싱과 조기 에러 탐지는 구현 정의 방식으로 상호 교차될 수 있다.
  3. 파싱이 성공하고 조기 에러가 발견되지 않았다면, 파싱으로 얻어진 파스 트리의 루트에서 파스 노드(goalSymbol의 인스턴스)를 반환한다.
  4. 그렇지 않으면, 파싱 오류 및/또는 조기 에러를 나타내는 하나 이상의 SyntaxError 객체들의 List를 반환한다. 둘 이상의 파싱 오류 또는 조기 에러가 있는 경우, 오류 객체의 개수와 순서는 구현 정의이지만, 하나 이상은 반드시 포함되어야 한다.
참고 1

특정 위치에 조기 에러가 있고, 이후 위치에 구문 오류가 있는 텍스트를 생각해보자. 파싱 후 조기 에러 탐지 단계를 수행하는 구현체는 구문 오류만 보고하고 조기 에러 탐지를 진행하지 않을 수도 있다. 두 단계를 교차(interleave)하는 구현체는 조기 에러만 보고하고 구문 오류를 찾지 않을 수도 있다. 세 번째 구현체는 두 에러 모두를 보고할 수도 있다. 이 모든 동작은 적합하다.

참고 2

17절도 참고할 것.

11.2 소스 코드의 종류

ECMAScript 코드에는 네 가지 종류가 있다:

참고 1

함수 코드는 일반적으로 함수 정의(15.2), 화살표 함수 정의(15.3), 메서드 정의(15.4), 제너레이터 함수 정의(15.5), 비동기 함수 정의(15.8), 비동기 제너레이터 함수 정의(15.6), 비동기 화살표 함수(15.9)의 본문으로 제공된다. 함수 코드는 Function 생성자(20.2.1.1), GeneratorFunction 생성자(27.3.1.1), AsyncFunction 생성자(27.7.1.1), AsyncGeneratorFunction 생성자(27.4.1.1)의 인자에서도 유도된다.

참고 2

함수 코드에 BindingIdentifier가 포함되는 실질적인 효과는, 엄격 모드 코드(strict mode code)에 대한 조기 에러(Early Errors)가 "use strict" 지시문이 본문에 포함된 함수의 이름이 되는 BindingIdentifier에도 적용된다는 것이다. 이때 바깥쪽 코드는 엄격 모드 코드가 아닐 수 있다.

11.2.1 지시문 프롤로그와 use strict 지시문

지시문 프롤로그ExpressionStatement 들이 StatementListItem 또는 ModuleItem의 처음에 연속적으로 등장하는 가장 긴 시퀀스로, FunctionBody, ScriptBody, ModuleBody의 선두에 위치한다. 이 시퀀스의 각 ExpressionStatement는 오로지 StringLiteral 토큰과 세미콜론으로만 구성되어야 한다. 세미콜론은 명시적으로 존재할 수도 있고, 자동 세미콜론 삽입(12.10)에 의해 삽입될 수도 있다. 지시문 프롤로그는 빈 시퀀스일 수도 있다.

use strict 지시문지시문 프롤로그 내의 ExpressionStatement 중에서, StringLiteral이 정확히 "use strict" 또는 'use strict' 코드 포인트 시퀀스와 일치하는 것이다. use strict 지시문에는 EscapeSequenceLineContinuation가 포함될 수 없다.

지시문 프롤로그에는 둘 이상의 use strict 지시문이 포함될 수 있다. 그러나, 구현체는 이러한 경우 경고를 표시할 수 있다.

참고

지시문 프롤로그ExpressionStatement들은 포함한 프로덕션이 평가될 때 정상적으로 평가된다. 구현체는 지시문 프롤로그 내에 존재하지만 use strict 지시문이 아닌 ExpressionStatement에 대해 구현 정의의 의미를 부여할 수 있다. 적절한 알림 메커니즘이 존재한다면, 구현체는 지시문 프롤로그 내에서 구현에서 정의된 의미가 없는 use strict 지시문이 아닌 ExpressionStatement을 만났을 때 경고를 표시해야 한다.

11.2.2 엄격 모드 코드(Strict Mode Code)

ECMAScript 구문 단위는 제한 없는 모드 또는 엄격 모드 문법 및 의미론(4.3.2)으로 처리될 수 있다. 다음과 같은 상황에서 코드는 엄격 모드 코드로 해석된다:

엄격 모드 코드가 아닌 ECMAScript 코드는 비엄격(non-strict) 코드라고 한다.

11.2.2.1 정적 의미: IsStrict ( node )

추상 연산 IsStrict는 인자 node(파스 노드(Parse Node))를 받아 불리언을 반환한다. 호출 시 다음 단계를 수행한다:

  1. node가 매칭한 소스 텍스트엄격 모드 코드이면 true를 반환하고, 그렇지 않으면 false를 반환한다.

11.2.3 비-ECMAScript 함수

ECMAScript 구현체는 실행 동작이 호스트 정의 실행 코드 형태로 표현되는 함수 익조틱 객체의 평가를 지원할 수 있다. 함수 객체가 ECMAScript 코드 내에서 정의되었는지, 내장 함수인지는 그러한 함수 객체를 호출하거나, 그에 의해 호출되는 ECMAScript 코드의 관점에서는 관찰할 수 없다.

12 ECMAScript 언어: 렉시컬 문법

ECMAScript Script 또는 Module의 소스 텍스트는 먼저 입력 요소들의 시퀀스로 변환된다. 입력 요소란 토큰, 줄 종결자, 주석, 또는 공백이다. 소스 텍스트는 왼쪽에서 오른쪽으로 스캔되며, 가능한 한 가장 긴 코드 포인트 시퀀스를 다음 입력 요소로 반복적으로 선택한다.

렉시컬 입력 요소의 식별은 입력 요소를 소비하는 구문 문법 컨텍스트에 따라 민감하게 달라지는 여러 상황이 있다. 이는 렉시컬 문법에 여러 목표 심볼이 필요함을 의미한다. InputElementHashbangOrRegExp 목표는 Script 또는 Module의 시작 부분에서 사용된다. InputElementRegExpOrTemplateTail 목표는 RegularExpressionLiteral, TemplateMiddle, 또는 TemplateTail이 허용되는 구문 문법 컨텍스트에서 사용된다. InputElementRegExp 목표 심볼RegularExpressionLiteral이 허용되지만 TemplateMiddle 또는 TemplateTail은 허용되지 않는 모든 구문 문법 컨텍스트에서 사용된다. InputElementTemplateTail 목표는 TemplateMiddle 또는 TemplateTail이 허용되고 RegularExpressionLiteral은 허용되지 않는 모든 구문 문법 컨텍스트에서 사용된다. 그 외의 모든 컨텍스트에서는 InputElementDiv가 렉시컬 목표 심볼로 사용된다.

참고

여러 렉시컬 목표를 사용하는 것은 자동 세미콜론 삽입에 영향을 줄 수 있는 렉시컬 모호성이 없도록 보장한다. 예를 들어, 선행하는 나눗셈 또는 나눗셈 할당과 선행하는 RegularExpressionLiteral이 모두 허용되는 구문 문법 컨텍스트는 없다. 이것은 세미콜론 삽입(자세한 내용은 12.10 참고)에 영향을 받지 않는다. 예를 들어 다음과 같은 경우:

a = b
/hi/g.exec(c).map(d);

여기서 LineTerminator 뒤의 첫 번째 공백·주석이 아닌 코드 포인트가 U+002F(SOLIDUS)이고, 구문 컨텍스트가 나눗셈 또는 나눗셈 할당을 허용한다면, 해당 LineTerminator 위치에 세미콜론이 삽입되지 않는다. 즉, 위의 예시는 다음과 동일하게 해석된다:

a = b / hi / g.exec(c).map(d);

구문

InputElementDiv :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator RightBracePunctuator InputElementRegExp :: WhiteSpace LineTerminator Comment CommonToken RightBracePunctuator RegularExpressionLiteral InputElementRegExpOrTemplateTail :: WhiteSpace LineTerminator Comment CommonToken RegularExpressionLiteral TemplateSubstitutionTail InputElementTemplateTail :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator TemplateSubstitutionTail InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral

12.1 유니코드 형식 제어 문자

유니코드 형식 제어 문자(즉, 유니코드 문자 데이터베이스에서 “Cf” 범주에 속하는 문자들, 예: LEFT-TO-RIGHT MARK 또는 RIGHT-TO-LEFT MARK)는 상위 수준의 프로토콜(마크업 언어 등)이 없는 경우에 텍스트 범위의 서식을 제어하는 데 사용되는 제어 코드입니다.

편집과 표시를 용이하게 하기 위해 소스 텍스트에 형식 제어 문자를 허용하는 것이 유용합니다. 모든 형식 제어 문자는 주석, 문자열 리터럴, 템플릿 리터럴, 정규 표현식 리터럴 내에서 사용할 수 있습니다.

U+FEFF(ZERO WIDTH NO-BREAK SPACE)는 주로 텍스트의 시작 부분에서 유니코드임을 표시하고 텍스트의 인코딩과 바이트 순서를 감지할 수 있도록 하는 형식 제어 문자입니다. 이러한 목적을 가진 <ZWNBSP> 문자는 파일을 연결(concatenate)하는 등의 작업 결과로 텍스트의 시작 이후에도 나타날 수 있습니다. ECMAScript 소스 텍스트에서 <ZWNBSP> 코드 포인트는 주석, 문자열 리터럴, 템플릿 리터럴, 정규 표현식 리터럴 외부에서는 공백 문자로 취급됩니다(자세한 내용은 12.2 참고).

12.2 공백(White Space)

공백 코드 포인트는 소스 텍스트의 가독성을 높이고, 토큰(분할 불가능한 렉시컬 단위)들 사이를 구분하는 데 사용되지만, 그 외에는 의미가 없습니다. 공백 코드 포인트는 어떤 두 토큰 사이에도, 입력의 시작이나 끝에도 올 수 있습니다. 공백 코드 포인트는 StringLiteral, RegularExpressionLiteral, Template, TemplateSubstitutionTail 내에도 등장할 수 있으며, 이 경우에는 리터럴 값의 일부를 이루는 의미 있는 코드 포인트로 간주됩니다. 또한 Comment 내에도 등장할 수 있지만, 다른 종류의 토큰 내에는 등장할 수 없습니다.

ECMAScript에서의 공백 코드 포인트는 표 35에 나열되어 있습니다.

표 35: 공백 코드 포인트
코드 포인트 이름 약어
U+0009 CHARACTER TABULATION <TAB>
U+000B LINE TABULATION <VT>
U+000C FORM FEED (FF) <FF>
U+FEFF ZERO WIDTH NO-BREAK SPACE <ZWNBSP>
일반 범주 “Space_Separator”의 임의의 코드 포인트 <USP>
참고 1

U+0020(SPACE) 및 U+00A0(NO-BREAK SPACE) 코드 포인트는 <USP>에 포함됩니다.

참고 2

표 35에 나열된 코드 포인트 외에는, ECMAScript WhiteSpace는 유니코드 “White_Space” 속성을 가진 코드 포인트 중 일반 범주 “Space_Separator”(“Zs”)로 분류되지 않은 모든 코드 포인트를 의도적으로 제외합니다.

구문

WhiteSpace :: <TAB> <VT> <FF> <ZWNBSP> <USP>

12.3 줄 종결자(Line Terminators)

공백 코드 포인트와 마찬가지로, 줄 종결자 코드 포인트도 소스 텍스트의 가독성을 높이고, 토큰(분할 불가능한 렉시컬 단위) 사이를 구분하는 데 사용됩니다. 하지만 공백 코드 포인트와 달리, 줄 종결자는 구문 문법의 동작에 일부 영향을 미칩니다. 일반적으로 줄 종결자는 어떤 두 토큰 사이에도 올 수 있지만, 구문 문법에 의해 금지되는 위치도 일부 있습니다. 줄 종결자는 자동 세미콜론 삽입(12.10) 과정에도 영향을 미칩니다. 줄 종결자는 StringLiteral, Template, TemplateSubstitutionTail 토큰 이외의 어떤 토큰 내에도 올 수 없습니다. <LF>와 <CR> 줄 종결자는 StringLiteral 토큰 내에 LineContinuation의 일부로 나타나는 경우를 제외하고는 올 수 없습니다.

줄 종결자는 MultiLineComment 내에는 올 수 있지만, SingleLineComment 내에는 올 수 없습니다.

줄 종결자는 정규 표현식에서 \s 클래스에 의해 매칭되는 공백 코드 포인트 집합에 포함됩니다.

ECMAScript의 줄 종결자 코드 포인트들은 표 36에 나열되어 있습니다.

표 36: 줄 종결자 코드 포인트
코드 포인트 유니코드 이름 약어
U+000A LINE FEED (LF) <LF>
U+000D CARRIAGE RETURN (CR) <CR>
U+2028 LINE SEPARATOR <LS>
U+2029 PARAGRAPH SEPARATOR <PS>

표 36에 있는 유니코드 코드 포인트만 줄 종결자로 취급됩니다. 다른 줄 바꿈 또는 줄 나눔 유니코드 코드 포인트는 줄 종결자로 취급되지 않으며, 표 35의 조건을 만족하는 경우에만 공백으로 취급됩니다. <CR><LF> 시퀀스는 줄 종결자로 자주 사용됩니다. 이는 줄 번호를 보고(report)할 때 하나의 SourceCharacter로 간주되어야 합니다.

구문

LineTerminator :: <LF> <CR> <LS> <PS> LineTerminatorSequence :: <LF> <CR> [lookahead ≠ <LF>] <LS> <PS> <CR> <LF>

12.4 주석

주석은 한 줄 또는 여러 줄일 수 있습니다. 여러 줄 주석은 중첩될 수 없습니다.

한 줄 주석에는 LineTerminator 코드 포인트를 제외한 임의의 유니코드 코드 포인트가 올 수 있고, 일반적으로 토큰은 항상 가능한 한 가장 길게 취해지므로, 한 줄 주석은 // 마커에서 그 줄의 끝까지의 모든 코드 포인트로 구성됩니다. 그러나, 줄 끝의 LineTerminator는 한 줄 주석의 일부로 간주되지 않습니다. 이는 렉시컬 문법에서 별도로 인식되며, 구문 문법의 입력 요소 스트림의 일부가 됩니다. 이 점은 매우 중요한데, 한 줄 주석의 존재 여부가 자동 세미콜론 삽입 과정에 영향을 주지 않음을 의미합니다(자세한 내용은 12.10 참고).

주석은 공백처럼 동작하며 버려집니다. 단, MultiLineComment에 줄 종결자 코드 포인트가 포함되어 있다면, 해당 전체 주석은 구문 문법 파싱 목적상 LineTerminator로 간주됩니다.

구문

Comment :: MultiLineComment SingleLineComment MultiLineComment :: /* MultiLineCommentCharsopt */ MultiLineCommentChars :: MultiLineNotAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt PostAsteriskCommentChars :: MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt MultiLineNotAsteriskChar :: SourceCharacter *는 제외 MultiLineNotForwardSlashOrAsteriskChar :: SourceCharacter / 또는 *는 제외 SingleLineComment :: // SingleLineCommentCharsopt SingleLineCommentChars :: SingleLineCommentChar SingleLineCommentCharsopt SingleLineCommentChar :: SourceCharacter LineTerminator는 제외

이 절의 일부 생성규칙은 B.1.1 절에서 대체 정의가 주어집니다.

12.5 해시뱅 주석(Hashbang Comments)

해시뱅 주석은 위치에 민감하며, 다른 주석과 마찬가지로 구문 문법의 입력 요소 스트림에서 버려집니다.

구문

HashbangComment :: #! SingleLineCommentCharsopt

12.6 토큰

구문

CommonToken :: IdentifierName PrivateIdentifier Punctuator NumericLiteral StringLiteral Template 참고

DivPunctuator, RegularExpressionLiteral, RightBracePunctuator, TemplateSubstitutionTail 생성규칙들은 CommonToken 생성규칙에 포함되지 않는 추가 토큰을 도출합니다.

12.7 이름과 키워드

IdentifierNameReservedWord는 Unicode Standard Annex #31, Identifier and Pattern Syntax에 명시된 기본 식별자 문법(Default Identifier Syntax)을 약간 수정하여 해석되는 토큰입니다. ReservedWordIdentifierName의 열거된 부분집합입니다. 구문 문법은 IdentifierIdentifierName이면서 ReservedWord가 아닌 것으로 정의합니다. 유니코드 식별자 문법은 유니코드 표준에 명시된 문자 속성을 기반으로 합니다. 최신 버전의 유니코드 표준에서 지정된 범주의 유니코드 코드 포인트는 모든 호환 ECMAScript 구현체에서 해당 범주로 다뤄져야 합니다. ECMAScript 구현체는 이후 유니코드 표준 버전에 정의된 식별자 코드 포인트도 인식할 수 있습니다.

참고 1

이 표준은 다음의 특정 코드 포인트를 추가로 허용합니다: U+0024(DOLLAR SIGN)와 U+005F(LOW LINE)은 IdentifierName 어디에서든 사용할 수 있습니다.

구문

PrivateIdentifier :: # IdentifierName IdentifierName :: IdentifierStart IdentifierName IdentifierPart IdentifierStart :: IdentifierStartChar \ UnicodeEscapeSequence IdentifierPart :: IdentifierPartChar \ UnicodeEscapeSequence IdentifierStartChar :: UnicodeIDStart $ _ IdentifierPartChar :: UnicodeIDContinue $ AsciiLetter :: one of a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z UnicodeIDStart :: 유니코드 속성 “ID_Start”를 가진 임의의 유니코드 코드 포인트 UnicodeIDContinue :: 유니코드 속성 “ID_Continue”를 가진 임의의 유니코드 코드 포인트

비종결 기호 UnicodeEscapeSequence의 정의는 12.9.4에 나와 있습니다.

참고 2

비종결 기호 IdentifierPartUnicodeIDContinue를 통해 _를 도출합니다.

참고 3

유니코드 속성 “ID_Start” 및 “ID_Continue”를 가진 코드 포인트 집합에는 각각 “Other_ID_Start” 및 “Other_ID_Continue” 속성을 가진 코드 포인트도 포함됩니다.

12.7.1 식별자 이름

IdentifierName 내에는 유니코드 이스케이프 시퀀스를 사용할 수 있으며, 이 경우 해당 시퀀스는 UnicodeEscapeSequenceIdentifierCodePoint와 동일한 하나의 유니코드 코드 포인트를 기여합니다. UnicodeEscapeSequence 앞의 \는 코드 포인트에 기여하지 않습니다. UnicodeEscapeSequence는, 그렇지 않으면 유효하지 않은 IdentifierName에 코드 포인트를 기여하는 데 사용할 수 없습니다. 즉, \ UnicodeEscapeSequence 시퀀스를 해당하는 SourceCharacter로 대체해도, 결과가 여전히 동일한 IdentifierName의 정확히 동일한 SourceCharacter 시퀀스가 되어야 합니다. 이 명세 내의 IdentifierName 해석은, 이스케이프 시퀀스가 특정 코드 포인트에 기여했는지 여부와 관계없이 실제 코드 포인트를 기반으로 합니다.

유니코드 표준에 따라 정규적으로 동등한 두 IdentifierName은, 각 UnicodeEscapeSequence를 대체한 후에 코드 포인트의 정확히 동일한 시퀀스로 표현되지 않는 한, 동일하지 않습니다.

12.7.1.1 정적 의미: 조기 에러(Early Errors)

IdentifierStart :: \ UnicodeEscapeSequence IdentifierPart :: \ UnicodeEscapeSequence

12.7.1.2 정적 의미: IdentifierCodePoints

구문-지향 연산 IdentifierCodePoints는 인자를 받지 않으며, 코드 포인트들의 List를 반환합니다. 다음 생성규칙들에 대해 부분적으로 정의됩니다:

IdentifierName :: IdentifierStart
  1. cpIdentifierStartIdentifierCodePoint로 한다.
  2. « cp »를 반환한다.
IdentifierName :: IdentifierName IdentifierPart
  1. cps를 파생된 IdentifierNameIdentifierCodePoints로 한다.
  2. cpIdentifierPartIdentifierCodePoint로 한다.
  3. cps와 « cp »의 리스트 연결을 반환한다.

12.7.1.3 정적 의미: IdentifierCodePoint

구문-지향 연산 IdentifierCodePoint는 인자를 받지 않으며, 코드 포인트를 반환합니다. 다음 생성규칙들에 대해 부분적으로 정의됩니다:

IdentifierStart :: IdentifierStartChar
  1. IdentifierStartChar가 매칭한 코드 포인트를 반환한다.
IdentifierPart :: IdentifierPartChar
  1. IdentifierPartChar가 매칭한 코드 포인트를 반환한다.
UnicodeEscapeSequence :: u Hex4Digits
  1. Hex4Digits의 MV와 동일한 숫자 값을 가지는 코드 포인트를 반환한다.
UnicodeEscapeSequence :: u{ CodePoint }
  1. CodePoint의 MV와 동일한 숫자 값을 가지는 코드 포인트를 반환한다.

12.7.2 키워드와 예약어

키워드IdentifierName과 일치하지만, 구문적으로 사용되는 토큰입니다. 즉, 구문 생성규칙에서 고정폭(fixed width) 글꼴로 문자 그대로 등장합니다. ECMAScript의 키워드에는 if, while, async, await 등 여러 가지가 있습니다.

예약어는 식별자로 사용할 수 없는 IdentifierName입니다. 많은 키워드가 예약어이지만, 일부는 아니기도 하며, 일부는 특정 컨텍스트에서만 예약어입니다. ifwhile은 예약어입니다. await는 async 함수와 모듈 내에서만 예약어입니다. async는 예약어가 아니며, 변수명이나 statement label로 자유롭게 사용할 수 있습니다.

이 명세는 문법 생성규칙과 조기 에러 규칙의 조합으로 어떤 이름이 유효한 식별자인지, 어떤 이름이 예약어인지 명시합니다. 아래 ReservedWord 목록의 모든 토큰(단, awaityield는 제외)은 무조건적으로 예약어입니다. awaityield의 예외는 13.1에서 파라미터화된 구문 생성규칙을 통해 명시됩니다. 마지막으로, 여러 조기 에러 규칙이 유효한 식별자의 집합을 제한합니다. 자세한 내용은 13.1.1, 14.3.1.1, 14.7.5.1, 15.7.1 참고. 요약하면, 식별자 이름에는 다섯 가지 범주가 있습니다:

  • 항상 식별자로 허용되고 키워드가 아닌 것들(Math, window, toString, _ 등)

  • 식별자로 절대 허용되지 않는 것들(아래 ReservedWord 목록 중 awaityield를 제외한 것들)

  • 컨텍스트에 따라 식별자로 허용되는 것들(awaityield)

  • 엄격 모드 코드에서 컨텍스트에 따라 식별자로 허용되지 않는 것들: let, static, implements, interface, package, private, protected, public

  • 항상 식별자로 허용되지만, 특정 구문 생성규칙 내에서 Identifier가 허용되지 않는 위치에서 키워드로도 등장하는 것들(as, async, from, get, meta, of, set, target)

조건부 키워드 또는 컨텍스트 키워드라는 용어는 마지막 세 범주에 속하는 키워드들을 일컫기도 하며, 이들은 어떤 컨텍스트에서는 식별자로, 어떤 컨텍스트에서는 키워드로 사용될 수 있습니다.

구문

ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield 참고 1

5.1.5에 따라, 문법의 키워드는 특정 SourceCharacter 시퀀스에 문자 그대로 매칭됩니다. 키워드 내의 코드 포인트는 \ UnicodeEscapeSequence로 표현될 수 없습니다.

IdentifierName 내에는 \ UnicodeEscapeSequence를 포함할 수 있지만, els\u{65}와 같이 "else"라는 이름의 변수를 선언할 수는 없습니다. 조기 에러 규칙은 13.1.1에서 예약어와 StringValue가 같은 식별자를 금지합니다.

참고 2

enum은 현재 이 명세에서 키워드로 사용되지 않습니다. 이는 미래의 예약어(future reserved word)로, 향후 언어 확장을 위해 예약되어 있습니다.

마찬가지로 implements, interface, package, private, protected, public엄격 모드 코드 내에서 미래의 예약어입니다.

참고 3

argumentseval은 키워드는 아니지만, 엄격 모드 코드 내에서는 일부 제한을 받습니다. 자세한 내용은 13.1.1, 8.6.4, 15.2.1, 15.5.1, 15.6.1, 15.8.1를 참고하세요.

12.8 구두점(Punctuators)

구문

Punctuator :: OptionalChainingPunctuator OtherPunctuator OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit] OtherPunctuator :: one of { ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>= >>>= &= |= ^= &&= ||= ??= => DivPunctuator :: / /= RightBracePunctuator :: }

12.9 리터럴

12.9.1 Null 리터럴

구문

NullLiteral :: null

12.9.2 불리언 리터럴

구문

BooleanLiteral :: true false

12.9.3 숫자 리터럴

구문

NumericLiteralSeparator :: _ NumericLiteral :: DecimalLiteral DecimalBigIntegerLiteral NonDecimalIntegerLiteral[+Sep] NonDecimalIntegerLiteral[+Sep] BigIntLiteralSuffix LegacyOctalIntegerLiteral DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix NonZeroDigit DecimalDigits[+Sep]opt BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits[+Sep] BigIntLiteralSuffix NonDecimalIntegerLiteral[Sep] :: BinaryIntegerLiteral[?Sep] OctalIntegerLiteral[?Sep] HexIntegerLiteral[?Sep] BigIntLiteralSuffix :: n DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits[+Sep]opt ExponentPart[+Sep]opt . DecimalDigits[+Sep] ExponentPart[+Sep]opt DecimalIntegerLiteral ExponentPart[+Sep]opt DecimalIntegerLiteral :: 0 NonZeroDigit NonZeroDigit NumericLiteralSeparatoropt DecimalDigits[+Sep] NonOctalDecimalIntegerLiteral DecimalDigits[Sep] :: DecimalDigit DecimalDigits[?Sep] DecimalDigit [+Sep] DecimalDigits[+Sep] NumericLiteralSeparator DecimalDigit DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9 NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9 ExponentPart[Sep] :: ExponentIndicator SignedInteger[?Sep] ExponentIndicator :: one of e E SignedInteger[Sep] :: DecimalDigits[?Sep] + DecimalDigits[?Sep] - DecimalDigits[?Sep] BinaryIntegerLiteral[Sep] :: 0b BinaryDigits[?Sep] 0B BinaryDigits[?Sep] BinaryDigits[Sep] :: BinaryDigit BinaryDigits[?Sep] BinaryDigit [+Sep] BinaryDigits[+Sep] NumericLiteralSeparator BinaryDigit BinaryDigit :: one of 0 1 OctalIntegerLiteral[Sep] :: 0o OctalDigits[?Sep] 0O OctalDigits[?Sep] OctalDigits[Sep] :: OctalDigit OctalDigits[?Sep] OctalDigit [+Sep] OctalDigits[+Sep] NumericLiteralSeparator OctalDigit LegacyOctalIntegerLiteral :: 0 OctalDigit LegacyOctalIntegerLiteral OctalDigit NonOctalDecimalIntegerLiteral :: 0 NonOctalDigit LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit NonOctalDecimalIntegerLiteral DecimalDigit LegacyOctalLikeDecimalIntegerLiteral :: 0 OctalDigit LegacyOctalLikeDecimalIntegerLiteral OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 NonOctalDigit :: one of 8 9 HexIntegerLiteral[Sep] :: 0x HexDigits[?Sep] 0X HexDigits[?Sep] HexDigits[Sep] :: HexDigit HexDigits[?Sep] HexDigit [+Sep] HexDigits[+Sep] NumericLiteralSeparator HexDigit HexDigit :: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

SourceCharacterNumericLiteral 바로 뒤에 오면 안 되며, IdentifierStart 또는 DecimalDigit이면 안 된다.

참고

예를 들어: 3in은 오류이며, 3in 두 입력 요소가 아니다.

12.9.3.1 정적 의미: 초기 에러

NumericLiteral :: LegacyOctalIntegerLiteral DecimalIntegerLiteral :: NonOctalDecimalIntegerLiteral
  • 이 생성물에 대해 IsStricttrue인 경우 구문 오류이다.
참고
비엄격 코드에서는 이 구문이 레거시이다.

12.9.3.2 정적 의미: MV

숫자 리터럴은 Number 타입 또는 BigInt 타입의 값을 나타낸다.

12.9.3.3 정적 의미론: NumericValue

구문 지향 연산 NumericValue는 인자를 받지 않으며, Number 또는 BigInt를 반환한다. 다음의 각 생성 규칙에 대해 개별적으로 정의된다:

NumericLiteral :: DecimalLiteral
  1. DecimalLiteral의 MV에 RoundMVResult를 적용한 값을 반환한다.
NumericLiteral :: NonDecimalIntegerLiteral
  1. NonDecimalIntegerLiteral의 MV에 𝔽를 적용한 값을 반환한다.
NumericLiteral :: LegacyOctalIntegerLiteral
  1. LegacyOctalIntegerLiteral의 MV에 𝔽를 적용한 값을 반환한다.
NumericLiteral :: NonDecimalIntegerLiteral BigIntLiteralSuffix
  1. NonDecimalIntegerLiteral의 MV에 대해 BigInt value for를 반환한다.
DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix
  1. 0을 반환한다.
DecimalBigIntegerLiteral :: NonZeroDigit BigIntLiteralSuffix
  1. NonZeroDigit의 MV에 대해 BigInt value for를 반환한다.
DecimalBigIntegerLiteral :: NonZeroDigit DecimalDigits BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits BigIntLiteralSuffix
  1. nDecimalDigits 내에서 NumericLiteralSeparator를 제외한 코드 포인트 개수로 한다.
  2. mv를 (NonZeroDigit의 MV × 10n) + DecimalDigits의 MV로 한다.
  3. (mv)를 반환한다.

12.9.4 문자열 리터럴

참고 1

문자열 리터럴은 작은따옴표 또는 큰따옴표로 감싸진 0개 이상의 유니코드 코드 포인트로 구성된다. 유니코드 코드 포인트는 이스케이프 시퀀스로도 표현될 수 있다. 모든 코드 포인트는 문자열 리터럴에 문자 그대로 나타날 수 있지만, 닫는 따옴표 코드 포인트, U+005C (역슬래시), U+000D (캐리지 리턴), U+000A (줄 바꿈)는 제외된다. 어떤 코드 포인트든 이스케이프 시퀀스 형태로 나타날 수 있다. 문자열 리터럴은 ECMAScript 문자열 값으로 평가된다. 이러한 문자열 값을 생성할 때 유니코드 코드 포인트는 11.1.1에서 정의된 대로 UTF-16으로 인코딩된다. Basic Multilingual Plane에 속한 코드 포인트는 문자열의 단일 코드 유닛 요소로 인코딩된다. 그 외의 모든 코드 포인트는 문자열의 두 코드 유닛 요소로 인코딩된다.

구문

StringLiteral :: " DoubleStringCharactersopt " ' SingleStringCharactersopt ' DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharactersopt SingleStringCharacters :: SingleStringCharacter SingleStringCharactersopt DoubleStringCharacter :: SourceCharacter but not one of " or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation SingleStringCharacter :: SourceCharacter but not one of ' or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation LineContinuation :: \ LineTerminatorSequence EscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence HexEscapeSequence UnicodeEscapeSequence CharacterEscapeSequence :: SingleEscapeCharacter NonEscapeCharacter SingleEscapeCharacter :: one of ' " \ b f n r t v NonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter or LineTerminator EscapeCharacter :: SingleEscapeCharacter DecimalDigit x u LegacyOctalEscapeSequence :: 0 [lookahead ∈ { 8, 9 }] NonZeroOctalDigit [lookahead ∉ OctalDigit] ZeroToThree OctalDigit [lookahead ∉ OctalDigit] FourToSeven OctalDigit ZeroToThree OctalDigit OctalDigit NonZeroOctalDigit :: OctalDigit but not 0 ZeroToThree :: one of 0 1 2 3 FourToSeven :: one of 4 5 6 7 NonOctalDecimalEscapeSequence :: one of 8 9 HexEscapeSequence :: x HexDigit HexDigit UnicodeEscapeSequence :: u Hex4Digits u{ CodePoint } Hex4Digits :: HexDigit HexDigit HexDigit HexDigit

비단말 기호 HexDigit의 정의는 12.9.3에 있다. SourceCharacter11.1에 정의되어 있다.

참고 2

<LF>와 <CR>은 LineContinuation의 일부로서 빈 코드 포인트 시퀀스를 생성하는 경우를 제외하고 문자열 리터럴에 나타날 수 없다. 문자열 리터럴의 문자열 값에 이를 포함시키는 올바른 방법은 \n 또는 \u000A와 같은 이스케이프 시퀀스를 사용하는 것이다.

12.9.4.1 정적 의미론: 초기 에러

EscapeSequence :: LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence
  • IsStrict(이 생성 규칙)이 true이면 구문 에러이다.
참고 1
비엄격 코드에서는 이 구문이 Legacy이다.
참고 2

문자열 리터럴이 Use Strict 지시문 앞에 올 수 있으며, 이 경우 둘러싸는 코드가 엄격 모드가 된다. 구현체는 이러한 리터럴에 대해 위 규칙을 적용해야 한다. 예를 들어, 다음 소스 텍스트는 구문 에러를 포함한다:

function invalid() { "\7"; "use strict"; }

12.9.4.2 정적 의미론: SV

구문 지향 연산 SV는 인자를 받지 않으며, 문자열을 반환한다.

문자열 리터럴은 String 타입의 값을 의미한다. SV는 문자열 리터럴의 다양한 부분에 재귀적으로 적용되어 문자열 값을 생성한다. 이 과정의 일부로, 문자열 리터럴 내의 일부 유니코드 코드 포인트는 아래 또는 12.9.3에서 설명한 대로 수학적 값을 갖는 것으로 해석된다.

표 37: 문자열 단일 문자 이스케이프 시퀀스
이스케이프 시퀀스 코드 유닛 값 유니코드 문자 이름 기호
\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) \

12.9.4.3 정적 의미론: MV

12.9.5 정규 표현식 리터럴

노트 1

정규 표현식 리터럴은 평가될 때마다 RegExp 객체로 변환되는 입력 요소입니다 (22.2 참조). 프로그램 내의 두 정규 표현식 리터럴은, 두 리터럴의 내용이 동일하더라도 서로 ===로 비교될 때 같지 않은 정규 표현식 객체로 평가됩니다. RegExp 객체는 new RegExp 또는 RegExp 생성자를 함수로 호출하여 런타임에 생성할 수도 있습니다 (22.2.4 참조).

아래의 생성 규칙은 정규 표현식 리터럴의 구문을 설명하며, 입력 요소 스캐너가 정규 표현식 리터럴의 끝을 찾을 때 사용됩니다. RegularExpressionBodyRegularExpressionFlags를 구성하는 소스 텍스트는 이후 더 엄격한 ECMAScript 정규 표현식 문법을 사용하여 다시 파싱됩니다 (22.2.1).

구현체는 22.2.1에 정의된 ECMAScript 정규 표현식 문법을 확장할 수 있지만, 아래에 정의된 RegularExpressionBodyRegularExpressionFlags 생성 규칙 또는 이 생성 규칙들이 사용하는 생성 규칙은 확장할 수 없습니다.

구문

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags RegularExpressionBody :: RegularExpressionFirstChar RegularExpressionChars RegularExpressionChars :: [empty] RegularExpressionChars RegularExpressionChar RegularExpressionFirstChar :: RegularExpressionNonTerminator 단, * 또는 \ 또는 / 또는 [ 중 하나가 아니어야 함 RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionChar :: RegularExpressionNonTerminator 단, \ 또는 / 또는 [ 중 하나가 아니어야 함 RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionBackslashSequence :: \ RegularExpressionNonTerminator RegularExpressionNonTerminator :: SourceCharacter LineTerminator가 아니어야 함 RegularExpressionClass :: [ RegularExpressionClassChars ] RegularExpressionClassChars :: [empty] RegularExpressionClassChars RegularExpressionClassChar RegularExpressionClassChar :: RegularExpressionNonTerminator 단, ] 또는 \ 중 하나가 아니어야 함 RegularExpressionBackslashSequence RegularExpressionFlags :: [empty] RegularExpressionFlags IdentifierPartChar 노트 2

정규 표현식 리터럴은 비어 있을 수 없습니다; 빈 정규 표현식 리터럴을 나타내는 대신, 코드 유닛 시퀀스 //는 단일 행 주석을 시작합니다. 빈 정규 표현식을 지정하려면 /(?:)/을 사용하세요.

12.9.5.1 정적 의미론: BodyText

구문 지시 연산 BodyText는 인수를 받지 않으며 소스 텍스트를 반환합니다. 다음 생성 규칙에 대해 개별적으로 정의됩니다:

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
  1. RegularExpressionBody로 인식된 소스 텍스트를 반환한다.

12.9.5.2 정적 의미론: FlagText

구문 지시 연산 FlagText는 인수를 받지 않으며 소스 텍스트를 반환합니다. 다음 생성 규칙에 대해 개별적으로 정의됩니다:

RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags
  1. RegularExpressionFlags로 인식된 소스 텍스트를 반환한다.

12.9.6 템플릿 리터럴 렉시컬 구성 요소

구문

Template :: NoSubstitutionTemplate TemplateHead NoSubstitutionTemplate :: ` TemplateCharactersopt ` TemplateHead :: ` TemplateCharactersopt ${ TemplateSubstitutionTail :: TemplateMiddle TemplateTail TemplateMiddle :: } TemplateCharactersopt ${ TemplateTail :: } TemplateCharactersopt ` TemplateCharacters :: TemplateCharacter TemplateCharactersopt TemplateCharacter :: $ [lookahead ≠ {] \ TemplateEscapeSequence \ NotEscapeSequence LineContinuation LineTerminatorSequence SourceCharacter 단, ` 또는 \ 또는 $ 또는 LineTerminator 중 하나가 아니어야 함 TemplateEscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] HexEscapeSequence UnicodeEscapeSequence NotEscapeSequence :: 0 DecimalDigit DecimalDigit 단, 0이 아니어야 함 x [lookahead ∉ HexDigit] x HexDigit [lookahead ∉ HexDigit] u [lookahead ∉ HexDigit] [lookahead ≠ {] u HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit] u { [lookahead ∉ HexDigit] u { NotCodePoint [lookahead ∉ HexDigit] u { CodePoint [lookahead ∉ HexDigit] [lookahead ≠ }] NotCodePoint :: HexDigits[~Sep] 단, HexDigits의 MV가 0x10FFFF보다 커야 함 CodePoint :: HexDigits[~Sep] 단, HexDigits의 MV가 0x10FFFF 이하여야 함 노트

TemplateSubstitutionTailInputElementTemplateTail 대안 렉시컬 목표에서 사용됩니다.

12.9.6.1 정적 의미론: TV

구문 지시 연산 TV는 인수를 받지 않으며 String 또는 undefined를 반환합니다. 템플릿 리터럴 구성 요소는 TV에 의해 String 타입 값으로 해석됩니다. TV는 템플릿 객체의 인덱스드 구성 요소(일상적으로 템플릿 값)를 구성하는 데 사용됩니다. TV에서 이스케이프 시퀀스는 해당 이스케이프 시퀀스가 나타내는 유니코드 코드 포인트의 UTF-16 코드 유닛(들)로 대체됩니다.

12.9.6.2 정적 의미론: TRV

구문 지시 연산 TRV는 인수를 받지 않으며 String을 반환합니다. 템플릿 리터럴 구성 요소는 TRV에 의해 String 타입 값으로 해석됩니다. TRV는 템플릿 객체의 원시(raw) 구성 요소(일상적으로 템플릿 원시 값)를 구성하는 데 사용됩니다. TRV는 TV와 유사하지만, TRV에서는 이스케이프 시퀀스가 리터럴에 나타난 그대로 해석된다는 점이 다릅니다.

노트

TVLineContinuation의 코드 유닛을 제외하지만, TRV는 이를 포함합니다. <CR><LF>와 <CR> LineTerminatorSequenceTV와 TRV 모두에서 <LF>로 정규화됩니다. <CR> 또는 <CR><LF> 시퀀스를 포함하려면 TemplateEscapeSequence를 명시적으로 사용해야 합니다.

12.10 자동 세미콜론 삽입

대부분의 ECMAScript 문장과 선언은 세미콜론으로 끝나야 합니다. 이러한 세미콜론은 소스 텍스트에 항상 명시적으로 나타낼 수 있습니다. 하지만 편의를 위해, 특정 상황에서는 이러한 세미콜론을 소스 텍스트에서 생략할 수 있습니다. 이러한 상황에서는 세미콜론이 자동으로 소스 코드 토큰 스트림에 삽입된다고 설명합니다.

12.10.1 자동 세미콜론 삽입 규칙

다음 규칙에서 “토큰(token)”은 목표 심볼로 현재 렉시컬 분석에서 인식된 실제 렉시컬 토큰을 의미하며, 이는 12절에 설명되어 있습니다.

세미콜론 삽입의 기본 규칙은 세 가지가 있습니다:

  1. 소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 어떤 생산 규칙에도 허용되지 않는 토큰(offending token이라 함)을 만나면, 다음 조건 중 하나라도 참이면 그 토큰 앞에 세미콜론이 자동으로 삽입됩니다:

    • offending token이 이전 토큰과 하나 이상의 LineTerminator로 구분되어 있는 경우.
    • offending token이 }인 경우.
    • 이전 토큰이 )이고, 삽입된 세미콜론이 do-while 문(14.7.2)의 종료 세미콜론으로 파싱되는 경우.
  2. 소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 토큰 입력 스트림의 끝에 도달하고 파서가 입력 토큰 스트림을 목표 비단말의 단일 인스턴스로 파싱할 수 없는 경우, 입력 스트림의 끝에 세미콜론이 자동으로 삽입됩니다.
  3. 소스 텍스트를 왼쪽에서 오른쪽으로 파싱할 때, 어떤 토큰이 문법의 어떤 생산 규칙에 의해 허용되지만, 그 생산 규칙이 제한된 생산(restricted production)이고 그 토큰이 “[no LineTerminator here]” 주석 바로 다음에 오는 터미널 또는 비단말의 첫 번째 토큰(따라서 restricted token이라 함)이며, 그 restricted token이 이전 토큰과 하나 이상의 LineTerminator로 구분되어 있다면, 해당 restricted token 앞에 세미콜론이 자동으로 삽입됩니다.

하지만, 앞선 규칙들에 대한 추가적인 우선 조건이 있습니다: 세미콜론이 자동으로 삽입되어 빈 문장(empty statement)이 되거나, for문 헤더의 두 세미콜론 중 하나가 되면, 세미콜론은 절대 자동 삽입되지 않습니다(14.7.4 참조).

노트

다음은 문법에서 유일하게 제한된 생산(restricted production)입니다:

UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; YieldExpression[In, Await] : yield yield [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await] yield [no LineTerminator here] * AssignmentExpression[?In, +Yield, ?Await] ArrowFunction[In, Yield, Await] : ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In] AsyncFunctionDeclaration[Yield, Await, Default] : async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } [+Default] async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionExpression : async [no LineTerminator here] function BindingIdentifier[~Yield, +Await]opt ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncMethod[Yield, Await] : async [no LineTerminator here] ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncGeneratorDeclaration[Yield, Await, Default] : async [no LineTerminator here] function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } [+Default] async [no LineTerminator here] function * ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorExpression : async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await]opt ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorMethod[Yield, Await] : async [no LineTerminator here] * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncArrowFunction[In, Yield, Await] : async [no LineTerminator here] AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here] => AsyncConciseBody[?In] CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In] AsyncArrowHead : async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]

이러한 제한된 생산의 실질적 효과는 다음과 같습니다:

  • ++ 또는 -- 토큰이 후위 연산자로 처리되는 위치에서, 그 앞에 하나 이상의 LineTerminator가 있으면, ++ 또는 -- 앞에 세미콜론이 자동 삽입됩니다.
  • continue, break, return, throw, yield 토큰이 등장하고, 그 다음 토큰 앞에 LineTerminator가 있으면, 해당 토큰 뒤에 세미콜론이 자동 삽입됩니다.
  • 화살표 함수(arrow function) 파라미터 뒤에 LineTerminator가 오고, 그 뒤에 => 토큰이 오면, 세미콜론이 자동 삽입되고 해당 구두점은 구문 오류를 발생시킵니다.
  • async 토큰 뒤에 LineTerminator가 오고, 그 다음에 function 또는 IdentifierName 또는 ( 토큰이 오면, 세미콜론이 자동 삽입되고 async는 다음 토큰들과 같은 식이나 클래스 요소의 일부로 처리되지 않습니다.
  • async 토큰 뒤에 LineTerminator가 오고, 그 다음에 * 토큰이 오면, 세미콜론이 자동 삽입되고 해당 구두점은 구문 오류를 발생시킵니다.

이로 인해 ECMAScript 프로그래머에게 실질적으로 권장되는 사항은 다음과 같습니다:

  • 후위 ++ 또는 -- 연산자는 피연산자와 같은 줄에 있어야 합니다.
  • Expressionreturn 또는 throw문에 있거나, AssignmentExpressionyield 표현식에 있을 때는, 그 시작이 return, throw, yield 토큰과 같은 줄에 있어야 합니다.
  • LabelIdentifierbreak 또는 continue 문에 있을 때는, break 또는 continue 토큰과 같은 줄에 있어야 합니다.
  • 화살표 함수의 파라미터 끝과 =>는 같은 줄에 있어야 합니다.
  • 비동기 함수나 메서드 앞의 async 토큰은 바로 뒤 토큰과 같은 줄에 있어야 합니다.

12.10.2 자동 세미콜론 삽입의 예시

이 절은 규범적인 내용이 아닙니다.

다음 소스는

{ 1 2 } 3

자동 세미콜론 삽입 규칙이 있더라도 ECMAScript 문법에서 유효한 문장이 아닙니다. 반면, 다음 소스

{ 1
2 } 3

도 ECMAScript 문법상 유효한 문장은 아니지만, 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:

{ 1
;2 ;} 3;

이것은 유효한 ECMAScript 문장입니다.

다음 소스

for (a; b
)

는 유효한 ECMAScript 문장이 아니며, 자동 세미콜론 삽입에 의해 변경되지 않습니다. 그 이유는 for 문 헤더에 필요한 세미콜론이기 때문입니다. 자동 세미콜론 삽입은 for 문 헤더의 두 세미콜론 중 하나를 절대 삽입하지 않습니다.

다음 소스

return
a + b

는 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:

return;
a + b;
노트 1

a + b 식은 return 문에 의해 반환되는 값으로 처리되지 않습니다. 그 이유는 LineTerminatorreturn 토큰과 그 뒤 토큰 사이에 있기 때문입니다.

다음 소스

a = b
++c

는 자동 세미콜론 삽입에 의해 다음과 같이 변환됩니다:

a = b;
++c;
노트 2

++ 토큰은 변수 b에 적용되는 후위 연산자로 처리되지 않습니다. 그 이유는 LineTerminatorb++ 사이에 있기 때문입니다.

다음 소스

if (a > b)
else c = d

는 유효한 ECMAScript 문장이 아니며, else 토큰 앞에 자동 세미콜론 삽입으로 변경되지 않습니다. 그 이유는 그 경우 자동 삽입된 세미콜론이 빈 문장(empty statement)이 되기 때문입니다.

다음 소스

a = b + c
(d + e).print()

는 자동 세미콜론 삽입에 의해 변환되지 않습니다. 그 이유는 두 번째 줄이 괄호로 시작하는 식이기 때문에, 전체가 함수 호출의 인수 목록으로 해석될 수 있기 때문입니다:

a = b + c(d + e).print()

대입문이 왼쪽 괄호로 시작해야 하는 상황에서는, 자동 세미콜론 삽입에 의존하기보다는 명시적으로 이전 문장의 끝에 세미콜론을 추가하는 것이 좋습니다.

12.10.3 자동 세미콜론 삽입의 흥미로운 사례

이 절은 규범적인 내용이 아닙니다.

ECMAScript 프로그램은 자동 세미콜론 삽입에 의존해 아주 적은 세미콜론만으로 작성될 수도 있습니다. 위에서 설명한 대로, 세미콜론은 모든 줄 바꿈마다 삽입되지 않으며, 자동 세미콜론 삽입은 여러 토큰이 줄 바꿈을 가로지르는지에 따라 달라질 수 있습니다.

ECMAScript에 새로운 문법 기능이 추가됨에 따라, 자동 세미콜론 삽입에 의존하는 라인 앞에서 문법 생산이 달라지는 추가 문법 생산이 추가될 수 있습니다.

이 절에서는, 세미콜론이 삽입될 수도 있고 아닐 수도 있는 위치(즉, 앞선 소스 텍스트에 따라 달라지는 위치)를 자동 세미콜론 삽입의 흥미로운 사례로 간주합니다. 이 절의 나머지 부분에서는 이 버전의 ECMAScript에서 자동 세미콜론 삽입의 여러 흥미로운 사례를 설명합니다.

12.10.3.1 Statement List에서의 자동 세미콜론 삽입의 흥미로운 사례

StatementList에서, 많은 StatementListItem은 세미콜론으로 끝나며, 자동 세미콜론 삽입을 통해 생략할 수 있습니다. 위 규칙의 결과로, 표현식이 끝나는 줄의 끝에서 다음 줄이 아래 항목 중 하나로 시작한다면, 세미콜론이 필요합니다:

  • 여는 괄호((). 세미콜론이 없으면 두 줄이 CallExpression으로 해석됩니다.
  • 여는 대괄호([). 세미콜론이 없으면 두 줄이 속성 접근으로 해석되며, ArrayLiteral 또는 ArrayAssignmentPattern로 해석되지 않습니다.
  • 템플릿 리터럴(`). 세미콜론이 없으면 두 줄이 태그드 템플릿(13.3.11)으로 해석되며, 앞의 표현식이 MemberExpression이 됩니다.
  • 단항 + 또는 -. 세미콜론이 없으면 두 줄이 해당 이항 연산자의 사용으로 해석됩니다.
  • 정규 표현식 리터럴. 세미콜론이 없으면 두 줄이 / MultiplicativeOperator로 해석될 수 있으며(예를 들어 정규식에 플래그가 있을 때).

12.10.3.2 자동 세미콜론 삽입과 “[no LineTerminator here]” 사례

이 절은 규범적인 내용이 아닙니다.

ECMAScript에는 “[no LineTerminator here]”를 포함하는 문법 생산이 있습니다. 이러한 생산은 때때로 문법에서 피연산자를 선택적으로 허용하기 위한 수단으로 쓰입니다. 이러한 위치에 LineTerminator를 도입하면, 선택적 피연산자가 없는 문법 생산을 사용하게 되어 문법 생산이 바뀝니다.

이 절의 나머지 부분에서는 이 버전의 ECMAScript에서 “[no LineTerminator here]”를 사용하는 여러 생산을 설명합니다.

12.10.3.2.1 선택적 피연산자와 “[no LineTerminator here]”가 있는 문법 생산 목록

13 ECMAScript 언어: 표현식

13.1 식별자

구문

IdentifierReference[Yield, Await] : Identifier [~Yield] yield [~Await] await BindingIdentifier[Yield, Await] : Identifier yield await LabelIdentifier[Yield, Await] : Identifier [~Yield] yield [~Await] await Identifier : IdentifierName but not ReservedWord 참고

yieldawait는 문법에서 BindingIdentifier로 허용되며, 아래 정적 의미에서 금지되어, 다음과 같은 경우 자동 세미콜론 삽입을 방지한다.

let
await 0;

13.1.1 정적 의미: 초기 에러

BindingIdentifier : Identifier IdentifierReference : yield BindingIdentifier : yield LabelIdentifier : yield
  • IsStrict(이 생성규칙)이 true이면 구문 에러이다.
IdentifierReference : await BindingIdentifier : await LabelIdentifier : await BindingIdentifier[Yield, Await] : yield
  • 이 생성규칙이 [Yield] 매개변수를 가지면 구문 에러이다.
BindingIdentifier[Yield, Await] : await
  • 이 생성규칙이 [Await] 매개변수를 가지면 구문 에러이다.
IdentifierReference[Yield, Await] : Identifier BindingIdentifier[Yield, Await] : Identifier LabelIdentifier[Yield, Await] : Identifier
  • 이 생성규칙이 [Yield] 매개변수를 가지고, IdentifierStringValue"yield"이면 구문 에러이다.
  • 이 생성규칙이 [Await] 매개변수를 가지고, IdentifierStringValue"await"이면 구문 에러이다.
Identifier : IdentifierName but not ReservedWord 참고

IdentifierNameStringValueIdentifierName의 모든 유니코드 이스케이프 시퀀스를 정규화하므로, IdentifierReservedWord의 코드 포인트 시퀀스가 동일하도록 이스케이프를 사용할 수 없다.

13.1.2 정적 의미: StringValue

구문-지시 연산 StringValue는 인자를 받지 않으며 문자열을 반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:

IdentifierName :: IdentifierStart IdentifierName IdentifierPart
  1. idTextUnescapedIdentifierNameIdentifierCodePoints로 한다.
  2. CodePointsToString(idTextUnescaped)를 반환한다.
IdentifierReference : yield BindingIdentifier : yield LabelIdentifier : yield
  1. "yield"를 반환한다.
IdentifierReference : await BindingIdentifier : await LabelIdentifier : await
  1. "await"를 반환한다.
Identifier : IdentifierName but not ReservedWord
  1. IdentifierNameStringValue를 반환한다.
PrivateIdentifier :: # IdentifierName
  1. 0x0023(샾, #)과 IdentifierNameStringValue문자열 결합하여 반환한다.
ModuleExportName : StringLiteral
  1. StringLiteralSV를 반환한다.

13.1.3 런타임 의미: 평가

IdentifierReference : Identifier
  1. IdentifierStringValueResolveBinding을(를) 호출한 결과를 반환한다.
IdentifierReference : yield
  1. ResolveBinding("yield")의 결과를 반환한다.
IdentifierReference : await
  1. ResolveBinding("await")의 결과를 반환한다.
참고 1

IdentifierReference의 평가 결과는 항상 Reference 타입의 값이다.

참고 2

비엄격 코드에서는, 키워드 yield를 식별자로 사용할 수 있다. IdentifierReference의 평가 결과는 yield의 바인딩을 Identifier로서 해석한 것과 같이 된다. 초기 에러 제한은 이러한 평가가 비엄격 코드에서만 발생할 수 있도록 보장한다.

13.2 기본 표현식

구문

PrimaryExpression[Yield, Await] : this IdentifierReference[?Yield, ?Await] Literal ArrayLiteral[?Yield, ?Await] ObjectLiteral[?Yield, ?Await] FunctionExpression ClassExpression[?Yield, ?Await] GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral[?Yield, ?Await, ~Tagged] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] : ( Expression[+In, ?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ) ( ) ( ... BindingIdentifier[?Yield, ?Await] ) ( ... BindingPattern[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingIdentifier[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingPattern[?Yield, ?Await] )

보조 구문

다음 생성규칙의 인스턴스를 처리할 때
PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList의 해석은 다음 문법을 사용하여 보정된다:

ParenthesizedExpression[Yield, Await] : ( Expression[+In, ?Yield, ?Await] )

13.2.1 this 키워드

13.2.1.1 런타임 의미: 평가

PrimaryExpression : this
  1. ResolveThisBinding()를 반환한다.

13.2.2 식별자 참조

IdentifierReference에 대해서는 13.1를 참조하라.

13.2.3 리터럴

구문

Literal : NullLiteral BooleanLiteral NumericLiteral StringLiteral

13.2.3.1 런타임 의미: 평가

Literal : NullLiteral
  1. null을 반환한다.
Literal : BooleanLiteral
  1. BooleanLiteral이 토큰 false이면 false를 반환한다.
  2. BooleanLiteral이 토큰 true이면 true를 반환한다.
Literal : NumericLiteral
  1. NumericLiteralNumericValue12.9.3에 정의된 대로 반환한다.
Literal : StringLiteral
  1. StringLiteralSV12.9.4.2에 정의된 대로 반환한다.

13.2.4 배열 이니셜라이저

참고

ArrayLiteral은 대괄호로 둘러싸인, 0개 이상의 각 요소가 배열의 원소를 나타내는 표현식으로 이루어진 리스트를 사용하여 배열(Array)의 초기화를 기술하는 표현식이다. 요소들은 반드시 리터럴일 필요는 없으며, 배열 이니셜라이저가 평가될 때마다 각각 평가된다.

배열 요소는 요소 리스트의 시작, 중간, 끝 모두에서 생략될 수 있다. 요소 리스트에서 콤마가 AssignmentExpression 앞에 오지 않는 경우(즉, 시작이거나 또 다른 콤마 뒤), 해당 빠진 배열 요소는 배열의 길이에 기여하며 이후 요소의 인덱스를 증가시킨다. 생략된 배열 요소는 정의되지 않는다. 배열의 끝에 요소가 생략된 경우, 해당 요소는 배열의 길이에 기여하지 않는다.

구문

ArrayLiteral[Yield, Await] : [ Elisionopt ] [ ElementList[?Yield, ?Await] ] [ ElementList[?Yield, ?Await] , Elisionopt ] ElementList[Yield, Await] : Elisionopt AssignmentExpression[+In, ?Yield, ?Await] Elisionopt SpreadElement[?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt AssignmentExpression[+In, ?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt SpreadElement[?Yield, ?Await] Elision : , Elision , SpreadElement[Yield, Await] : ... AssignmentExpression[+In, ?Yield, ?Await]

13.2.4.1 런타임 의미: ArrayAccumulation

구문-지시 연산 ArrayAccumulation은 인수 array(배열)와 nextIndex(정수)를 받아, 정상 완료(normal completion)정수를 반환하거나, 비정상 완료(abrupt completion)를 반환한다. 다음 생성규칙에 따라 구체적으로 정의된다:

Elision : ,
  1. lennextIndex + 1로 한다.
  2. Set(array, "length", 𝔽(len), true)를 수행한다.
  3. 참고: 위 단계에서 len이 232 - 1을 초과하면 예외가 발생한다.
  4. len을 반환한다.
Elision : Elision ,
  1. ArrayAccumulationElision에 대해 array와 (nextIndex + 1)을 인수로 호출한 결과를 반환한다.
ElementList : Elisionopt AssignmentExpression
  1. Elision이 존재하면,
    1. nextIndex를 ? ArrayAccumulationElision에 대해 arraynextIndex를 인수로 호출한 결과로 설정한다.
  2. initResult를 ? EvaluationAssignmentExpression에 대해 호출한 결과로 한다.
  3. initValue를 ? GetValue(initResult)로 한다.
  4. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue)를 수행한다.
  5. nextIndex + 1을 반환한다.
ElementList : Elisionopt SpreadElement
  1. Elision이 존재하면,
    1. nextIndex를 ? ArrayAccumulationElision에 대해 arraynextIndex를 인수로 호출한 결과로 설정한다.
  2. ArrayAccumulationSpreadElement에 대해 arraynextIndex를 인수로 호출한 결과를 반환한다.
ElementList : ElementList , Elisionopt AssignmentExpression
  1. nextIndex를 ? ArrayAccumulationElementList에 대해 arraynextIndex를 인수로 호출한 결과로 설정한다.
  2. Elision이 존재하면,
    1. nextIndex를 ? ArrayAccumulationElision에 대해 arraynextIndex를 인수로 호출한 결과로 설정한다.
  3. initResult를 ? EvaluationAssignmentExpression에 대해 호출한 결과로 한다.
  4. initValue를 ? GetValue(initResult)로 한다.
  5. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), initValue)를 수행한다.
  6. nextIndex + 1을 반환한다.
ElementList : ElementList , Elisionopt SpreadElement
  1. nextIndex를 ? ArrayAccumulationElementList에 대해 arraynextIndex를 인수로 호출한 결과로 설정한다.
  2. Elision이 존재하면,
    1. nextIndex를 ? ArrayAccumulationElision에 대해 arraynextIndex를 인수로 호출한 결과로 설정한다.
  3. ArrayAccumulationSpreadElement에 대해 arraynextIndex를 인수로 호출한 결과를 반환한다.
SpreadElement : ... AssignmentExpression
  1. spreadRef를 ? EvaluationAssignmentExpression에 대해 호출한 결과로 한다.
  2. spreadObj를 ? GetValue(spreadRef)로 한다.
  3. iteratorRecord를 ? GetIterator(spreadObj, sync)로 한다.
  4. 반복한다,
    1. next를 ? IteratorStepValue(iteratorRecord)로 한다.
    2. nextdone이면 nextIndex를 반환한다.
    3. CreateDataPropertyOrThrow(array, ! ToString(𝔽(nextIndex)), next)를 수행한다.
    4. nextIndexnextIndex + 1로 설정한다.
참고

CreateDataPropertyOrThrow는 표준 내장 Array 프로토타입 객체[[Set]]을 이용한 새로운 자체 속성 생성을 막는 방식으로 수정된 경우에도, 배열에 자체 속성이 정의되도록 보장하기 위해 사용된다.

13.2.4.2 런타임 의미: 평가

ArrayLiteral : [ Elisionopt ]
  1. array를 ! ArrayCreate(0)로 한다.
  2. Elision이 존재하면,
    1. ArrayAccumulationElision에 대해 array와 0을 인수로 호출하여 수행한다.
  3. array를 반환한다.
ArrayLiteral : [ ElementList ]
  1. array를 ! ArrayCreate(0)로 한다.
  2. ArrayAccumulationElementList에 대해 array와 0을 인수로 호출하여 수행한다.
  3. array를 반환한다.
ArrayLiteral : [ ElementList , Elisionopt ]
  1. array를 ! ArrayCreate(0)로 한다.
  2. nextIndex를 ? ArrayAccumulationElementList에 대해 array와 0을 인수로 호출한 결과로 한다.
  3. Elision이 존재하면,
    1. ArrayAccumulationElision에 대해 arraynextIndex를 인수로 호출하여 수행한다.
  4. array를 반환한다.

13.2.5 객체 이니셜라이저

참고 1

객체 이니셜라이저는 객체(Object)의 초기화를 기술하는 표현식으로, 리터럴과 유사한 형태로 작성된다. 중괄호로 감싸진 0개 이상의 프로퍼티 키와 해당 값의 쌍의 리스트이다. 값은 반드시 리터럴일 필요는 없으며, 객체 이니셜라이저가 평가될 때마다 각각 평가된다.

구문

ObjectLiteral[Yield, Await] : { } { PropertyDefinitionList[?Yield, ?Await] } { PropertyDefinitionList[?Yield, ?Await] , } PropertyDefinitionList[Yield, Await] : PropertyDefinition[?Yield, ?Await] PropertyDefinitionList[?Yield, ?Await] , PropertyDefinition[?Yield, ?Await] PropertyDefinition[Yield, Await] : IdentifierReference[?Yield, ?Await] CoverInitializedName[?Yield, ?Await] PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await] MethodDefinition[?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] PropertyName[Yield, Await] : LiteralPropertyName ComputedPropertyName[?Yield, ?Await] LiteralPropertyName : IdentifierName StringLiteral NumericLiteral ComputedPropertyName[Yield, Await] : [ AssignmentExpression[+In, ?Yield, ?Await] ] CoverInitializedName[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] Initializer[In, Yield, Await] : = AssignmentExpression[?In, ?Yield, ?Await] 참고 2

MethodDefinition15.4에서 정의된다.

참고 3

특정 맥락에서는 ObjectLiteral이 더 제한적인 2차 문법을 감싸는 커버 문법으로 사용된다. CoverInitializedName 생성규칙은 이러한 2차 문법을 완전히 커버하기 위해 필요하다. 그러나 이 생성규칙을 사용하는 경우, 실제 ObjectLiteral이 기대되는 일반적인 맥락에서는 초기 구문 에러가 발생한다.

13.2.5.1 정적 의미: 초기 에러

PropertyDefinition : MethodDefinition

실제 객체 이니셜라이저를 설명하는 것 이외에도, ObjectLiteral 생성규칙은 ObjectAssignmentPattern의 커버 문법(cover grammar)으로도 사용될 수 있으며, CoverParenthesizedExpressionAndArrowParameterList의 일부로 인식될 수 있다. ObjectLiteralObjectAssignmentPattern이 요구되는 문맥에 나타나는 경우, 아래 초기 에러 규칙들은 적용되지 않는다. 또한, CoverParenthesizedExpressionAndArrowParameterList 또는 CoverCallExpressionAndAsyncArrowHead을 처음 파싱할 때도 적용되지 않는다.

PropertyDefinition : CoverInitializedName
  • 이 생성규칙에 소스 텍스트가 일치하면 구문 에러이다.
참고 1

이 생성규칙은 ObjectLiteralObjectAssignmentPattern의 커버 문법으로 사용될 수 있도록 존재한다. 실제 객체 이니셜라이저에는 등장할 수 없다.

ObjectLiteral : { PropertyDefinitionList } { PropertyDefinitionList , } 참고 2

PropertyNameList가 반환하는 List에는 ComputedPropertyName을 사용하여 정의된 프로퍼티 이름이 포함되지 않는다.

13.2.5.2 정적 의미: IsComputedPropertyKey

구문-지시 연산 IsComputedPropertyKey는 인수를 받지 않으며 불리언을 반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:

PropertyName : LiteralPropertyName
  1. false를 반환한다.
PropertyName : ComputedPropertyName
  1. true를 반환한다.

13.2.5.3 정적 의미: PropertyNameList

구문-지시 연산 PropertyNameList는 인수를 받지 않으며 문자열의 List를 반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:

PropertyDefinitionList : PropertyDefinition
  1. propNamePropertyDefinitionPropName으로 한다.
  2. propNameempty이면, 새로운 빈 List를 반환한다.
  3. « propName »를 반환한다.
PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
  1. listPropertyDefinitionListPropertyNameList로 한다.
  2. propNamePropertyDefinitionPropName로 한다.
  3. propNameempty이면, list를 반환한다.
  4. list와 « propName »의 list-concatenation을 반환한다.

13.2.5.4 런타임 의미: 평가

ObjectLiteral : { }
  1. OrdinaryObjectCreate(%Object.prototype%)를 반환한다.
ObjectLiteral : { PropertyDefinitionList } { PropertyDefinitionList , }
  1. objOrdinaryObjectCreate(%Object.prototype%)로 한다.
  2. PropertyDefinitionListPropertyDefinitionEvaluationobj를 인수로 하여 호출한다.
  3. obj를 반환한다.
LiteralPropertyName : IdentifierName
  1. IdentifierNameStringValue를 반환한다.
LiteralPropertyName : StringLiteral
  1. StringLiteralSV를 반환한다.
LiteralPropertyName : NumericLiteral
  1. nbrNumericLiteralNumericValue로 한다.
  2. ToString(nbr)을 반환한다.
ComputedPropertyName : [ AssignmentExpression ]
  1. exprValue를 ? EvaluationAssignmentExpression에 대해 호출한 결과로 한다.
  2. propName을 ? GetValue(exprValue)로 한다.
  3. ToPropertyKey(propName)를 반환한다.

13.2.5.5 런타임 의미: PropertyDefinitionEvaluation

구문-지시 연산 PropertyDefinitionEvaluation은 인수 object(객체)를 받고, 정상 완료(normal completion) unused 또는 비정상 완료(abrupt completion)를 반환한다. 다음 생성규칙에 대해 분할적으로 정의된다:

PropertyDefinitionList : PropertyDefinitionList , PropertyDefinition
  1. PropertyDefinitionEvaluationPropertyDefinitionList에 대해 object를 인수로 호출하여 수행한다.
  2. PropertyDefinitionEvaluationPropertyDefinition에 대해 object를 인수로 호출하여 수행한다.
  3. unused를 반환한다.
PropertyDefinition : ... AssignmentExpression
  1. exprValue를 ? EvaluationAssignmentExpression에 대해 호출한 결과로 한다.
  2. fromValue를 ? GetValue(exprValue)로 한다.
  3. excludedNames를 새로운 빈 List로 한다.
  4. CopyDataProperties(object, fromValue, excludedNames)를 수행한다.
  5. unused를 반환한다.
PropertyDefinition : IdentifierReference
  1. propNameIdentifierReferenceStringValue로 한다.
  2. exprValue를 ? EvaluationIdentifierReference에 대해 호출한 결과로 한다.
  3. propValue를 ? GetValue(exprValue)로 한다.
  4. Assert: object는 일반적이고 확장 가능한 객체이며 비구성 가능(non-configurable) 속성이 없어야 한다.
  5. CreateDataPropertyOrThrow(object, propName, propValue)를 수행한다.
  6. unused를 반환한다.
PropertyDefinition : PropertyName : AssignmentExpression
  1. propKey를 ? EvaluationPropertyName에 대해 호출한 결과로 한다.
  2. PropertyDefinitionParseJSON을 위해 평가 중인 Script 내에 포함되어 있다면,
    1. isProtoSetterfalse로 한다.
  3. 그렇지 않고, propKey"__proto__"이고 PropertyNameIsComputedPropertyKeyfalse라면,
    1. isProtoSettertrue로 한다.
  4. 그 외의 경우,
    1. isProtoSetterfalse로 한다.
  5. IsAnonymousFunctionDefinition(AssignmentExpression)이 true이고, isProtoSetterfalse라면,
    1. propValue를 ? NamedEvaluationAssignmentExpressionpropKey를 인수로 호출한 결과로 한다.
  6. 그 외의 경우,
    1. exprValueRef를 ? EvaluationAssignmentExpression에 대해 호출한 결과로 한다.
    2. propValue를 ? GetValue(exprValueRef)로 한다.
  7. isProtoSettertrue라면,
    1. propValue객체이거나 propValuenull이라면,
      1. object.[[SetPrototypeOf]](propValue)를 수행한다.
    2. unused를 반환한다.
  8. Assert: object는 일반적이고 확장 가능한 객체이며 비구성 가능(non-configurable) 속성이 없어야 한다.
  9. CreateDataPropertyOrThrow(object, propKey, propValue)를 수행한다.
  10. unused를 반환한다.
PropertyDefinition : MethodDefinition
  1. MethodDefinitionEvaluationMethodDefinition에 대해 objecttrue를 인수로 호출하여 수행한다.
  2. unused를 반환한다.

13.2.6 함수 정의 표현식

15.2에서 PrimaryExpression : FunctionExpression 를 참조하라.

15.5에서 PrimaryExpression : GeneratorExpression 를 참조하라.

15.7에서 PrimaryExpression : ClassExpression 를 참조하라.

15.8에서 PrimaryExpression : AsyncFunctionExpression 를 참조하라.

15.6에서 PrimaryExpression : AsyncGeneratorExpression 를 참조하라.

13.2.7 정규 표현식 리터럴

구문

12.9.5를 참조하라.

13.2.7.1 정적 의미: 초기 에러

PrimaryExpression : RegularExpressionLiteral

13.2.7.2 정적 의미: IsValidRegularExpressionLiteral ( literal )

추상 연산 IsValidRegularExpressionLiteral은 인수 literal(RegularExpressionLiteral 파스 노드)를 받고 불리언을 반환한다. 이 연산은 인수가 유효한 정규 표현식 리터럴인지 판단한다. 호출 시 다음 단계를 수행한다:

  1. flagsliteralFlagText로 한다.
  2. flagsd, g, i, m, s, u, v, y 이외의 코드 포인트가 포함되어 있거나, flags에 동일한 코드 포인트가 두 번 이상 포함되어 있으면 false를 반환한다.
  3. flagsu가 포함되어 있으면 utrue로, 아니면 false로 한다.
  4. flagsv가 포함되어 있으면 vtrue로, 아니면 false로 한다.
  5. patternTextliteralBodyText로 한다.
  6. ufalse이고 vfalse이면,
    1. stringValueCodePointsToString(patternText)로 한다.
    2. patternTextstringValue의 각 16비트 요소를 유니코드 BMP 코드 포인트로 해석하여 얻은 코드 포인트 시퀀스로 설정한다. UTF-16 디코딩은 적용하지 않는다.
  7. parseResultParsePattern(patternText, u, v)로 한다.
  8. parseResult파스 노드라면 true를, 그렇지 않으면 false를 반환한다.

13.2.7.3 런타임 의미: 평가

PrimaryExpression : RegularExpressionLiteral
  1. patternCodePointsToString(BodyText of RegularExpressionLiteral)로 한다.
  2. flagsCodePointsToString(FlagText of RegularExpressionLiteral)로 한다.
  3. RegExpCreate(pattern, flags)를 반환한다.

13.2.8 템플릿 리터럴

구문

TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate SubstitutionTemplate[?Yield, ?Await, ?Tagged] SubstitutionTemplate[Yield, Await, Tagged] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged] TemplateSpans[Yield, Await, Tagged] : TemplateTail TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail TemplateMiddleList[Yield, Await, Tagged] : TemplateMiddle Expression[+In, ?Yield, ?Await] TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]

13.2.8.1 정적 의미론: 초기 에러

TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate TemplateLiteral[Yield, Await, Tagged] : SubstitutionTemplate[?Yield, ?Await, ?Tagged] SubstitutionTemplate[Yield, Await, Tagged] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged] TemplateSpans[Yield, Await, Tagged] : TemplateTail TemplateMiddleList[Yield, Await, Tagged] : TemplateMiddle Expression[+In, ?Yield, ?Await] TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await]

13.2.8.2 정적 의미론: TemplateStrings

구문 지향 연산 TemplateStrings는 raw (불리언)를 인수로 받고, 문자열 또는 undefined리스트를 반환한다. 이는 다음 생산식들에 대해 부분적으로 정의된다:

TemplateLiteral : NoSubstitutionTemplate
  1. « TemplateString(NoSubstitutionTemplate, raw) »를 반환한다.
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. head를 « TemplateString(TemplateHead, raw) »로 한다.
  2. tailTemplateStrings of TemplateSpans with argument raw로 한다.
  3. headtail리스트 결합을 반환한다.
TemplateSpans : TemplateTail
  1. « TemplateString(TemplateTail, raw) »를 반환한다.
TemplateSpans : TemplateMiddleList TemplateTail
  1. middleTemplateStrings of TemplateMiddleList with argument raw로 한다.
  2. tail을 « TemplateString(TemplateTail, raw) »로 한다.
  3. middletail리스트 결합을 반환한다.
TemplateMiddleList : TemplateMiddle Expression
  1. « TemplateString(TemplateMiddle, raw) »를 반환한다.
TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. frontTemplateStrings of TemplateMiddleList with argument raw로 한다.
  2. last를 « TemplateString(TemplateMiddle, raw) »로 한다.
  3. frontlast리스트 결합을 반환한다.

13.2.8.3 정적 의미론: TemplateString ( templateToken, raw )

추상 연산 TemplateString은 templateToken (NoSubstitutionTemplate 파스 노드, TemplateHead 파스 노드, TemplateMiddle 파스 노드, 또는 TemplateTail 파스 노드)와 raw (불리언)를 인수로 받고, 문자열 또는 undefined를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 만약 rawtrue이면,
    1. stringTRV of templateToken으로 한다.
  2. 그 외에는,
    1. stringTV of templateToken으로 한다.
  3. string을 반환한다.
참고

이 연산은 rawfalse이고 templateTokenNotEscapeSequence가 포함된 경우 undefined를 반환한다. 그 외의 경우에는 문자열을 반환한다.

13.2.8.4 GetTemplateObject ( templateLiteral )

추상 연산 GetTemplateObject는 templateLiteral (파스 노드)를 인수로 받고, 배열을 반환한다. 호출 시 다음 단계를 수행한다:

  1. realm현재 Realm Record로 한다.
  2. templateRegistryrealm.[[TemplateMap]]으로 한다.
  3. templateRegistry의 각 요소 e에 대해,
    1. 만약 e.[[Site]]동일한 파스 노드templateLiteral과 같다면,
      1. e.[[Array]]를 반환한다.
  4. rawStringsTemplateStrings of templateLiteral with argument true로 한다.
  5. Assert: rawStrings문자열 리스트이다.
  6. cookedStringsTemplateStrings of templateLiteral with argument false로 한다.
  7. count리스트 cookedStrings의 요소 개수로 한다.
  8. Assert: count ≤ 232 - 1.
  9. template을 ! ArrayCreate(count)로 한다.
  10. rawObj를 ! ArrayCreate(count)로 한다.
  11. index를 0으로 한다.
  12. index < count 동안 반복,
    1. prop을 ! ToString(𝔽(index))로 한다.
    2. cookedValuecookedStrings[index]로 한다.
    3. DefinePropertyOrThrow(template, prop, PropertyDescriptor { [[Value]]: cookedValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false })를 수행한다.
    4. rawValuerawStrings[index]로 한다.
    5. DefinePropertyOrThrow(rawObj, prop, PropertyDescriptor { [[Value]]: rawValue, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false })를 수행한다.
    6. indexindex + 1로 한다.
  13. SetIntegrityLevel(rawObj, frozen)을 수행한다.
  14. DefinePropertyOrThrow(template, "raw", PropertyDescriptor { [[Value]]: rawObj, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  15. SetIntegrityLevel(template, frozen)을 수행한다.
  16. Record { [[Site]]: templateLiteral, [[Array]]: template }를 realm.[[TemplateMap]]에 추가한다.
  17. template을 반환한다.
참고 1

템플릿 객체의 생성은 비정상 완료를 일으킬 수 없다.

참고 2

realm의 프로그램 코드에 있는 각 TemplateLiteral는 태그드 템플릿 평가에 사용되는 고유한 템플릿 객체와 연결되어 있다 (13.2.8.6). 템플릿 객체는 frozen 상태이며, 특정 태그드 템플릿이 평가될 때마다 동일한 템플릿 객체가 사용된다. 템플릿 객체가 TemplateLiteral의 첫 평가 시점에 지연 생성(lazy)되는지 혹은 사전에 미리 생성되는지는 구현 선택 사항이며, ECMAScript 코드에서는 관찰할 수 없다.

참고 3

이 명세의 미래 버전에서는 템플릿 객체의 추가적인 non-enumerable 프로퍼티가 정의될 수 있다.

13.2.8.5 런타임 의미론: SubstitutionEvaluation

구문 지향 연산 SubstitutionEvaluation은 인수를 받지 않으며, 리스트비정상 완료를 반환한다. 다음 생산식들에 대해 정의된다:

TemplateSpans : TemplateTail
  1. 새로운 빈 리스트를 반환한다.
TemplateSpans : TemplateMiddleList TemplateTail
  1. SubstitutionEvaluation of TemplateMiddleList의 결과를 반환한다.
TemplateMiddleList : TemplateMiddle Expression
  1. subRef를 ? Evaluation of Expression의 결과로 한다.
  2. sub를 ? GetValue(subRef)로 한다.
  3. « sub »를 반환한다.
TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. preceding을 ? SubstitutionEvaluation of TemplateMiddleList의 결과로 한다.
  2. nextRef를 ? Evaluation of Expression의 결과로 한다.
  3. next를 ? GetValue(nextRef)로 한다.
  4. preceding과 « next »의 리스트 결합을 반환한다.

13.2.8.6 런타임 의미론: 평가

TemplateLiteral : NoSubstitutionTemplate
  1. TV of NoSubstitutionTemplate12.9.6에 정의된 대로 반환한다.
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. headTV of TemplateHead로 하고, 12.9.6에 정의된 대로 한다.
  2. subRef를 ? Evaluation of Expression의 결과로 한다.
  3. sub를 ? GetValue(subRef)로 한다.
  4. middle을 ? ToString(sub)로 한다.
  5. tail을 ? Evaluation of TemplateSpans의 결과로 한다.
  6. head, middle, tail문자열 결합을 반환한다.
참고 1

Expression 값에 적용되는 문자열 변환 의미는 String.prototype.concat과 같으며 + 연산자와는 다르다.

TemplateSpans : TemplateTail
  1. TV of TemplateTail12.9.6에 정의된 대로 반환한다.
TemplateSpans : TemplateMiddleList TemplateTail
  1. head를 ? Evaluation of TemplateMiddleList의 결과로 한다.
  2. tailTV of TemplateTail12.9.6에 정의된 대로 한다.
  3. headtail문자열 결합을 반환한다.
TemplateMiddleList : TemplateMiddle Expression
  1. headTV of TemplateMiddle12.9.6에 정의된 대로 한다.
  2. subRef를 ? Evaluation of Expression의 결과로 한다.
  3. sub를 ? GetValue(subRef)로 한다.
  4. middle을 ? ToString(sub)로 한다.
  5. headmiddle문자열 결합을 반환한다.
참고 2

Expression 값에 적용되는 문자열 변환 의미는 String.prototype.concat과 같으며 + 연산자와는 다르다.

TemplateMiddleList : TemplateMiddleList TemplateMiddle Expression
  1. rest를 ? Evaluation of TemplateMiddleList의 결과로 한다.
  2. middleTV of TemplateMiddle12.9.6에 정의된 대로 한다.
  3. subRef를 ? Evaluation of Expression의 결과로 한다.
  4. sub를 ? GetValue(subRef)로 한다.
  5. last를 ? ToString(sub)로 한다.
  6. rest, middle, last문자열 결합을 반환한다.
참고 3

Expression 값에 적용되는 문자열 변환 의미는 String.prototype.concat과 같으며 + 연산자와는 다르다.

13.2.9 그룹화 연산자

13.2.9.1 정적 의미론: 초기 에러

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList

13.2.9.2 런타임 의미론: 평가

PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprParenthesizedExpression로 한다. 이는 포함된 CoverParenthesizedExpressionAndArrowParameterList이다.
  2. Evaluation of expr를 반환한다.
ParenthesizedExpression : ( Expression )
  1. Evaluation of Expression을 반환한다. 이 값은 Reference 타입일 수 있다.
참고

이 알고리즘은 Evaluation of Expression의 결과에 GetValue를 적용하지 않는다. 그 주요 동기는 deletetypeof와 같은 연산자가 괄호로 묶인 표현식에 적용될 수 있도록 하기 위함이다.

13.3 좌변식(Left-Hand-Side Expressions)

구문

MemberExpression[Yield, Await] : PrimaryExpression[?Yield, ?Await] MemberExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] MemberExpression[?Yield, ?Await] . IdentifierName MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] SuperProperty[?Yield, ?Await] MetaProperty new MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await] MemberExpression[?Yield, ?Await] . PrivateIdentifier SuperProperty[Yield, Await] : super [ Expression[+In, ?Yield, ?Await] ] super . IdentifierName MetaProperty : NewTarget ImportMeta NewTarget : new . target ImportMeta : import . meta NewExpression[Yield, Await] : MemberExpression[?Yield, ?Await] new NewExpression[?Yield, ?Await] CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] SuperCall[?Yield, ?Await] ImportCall[?Yield, ?Await] CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await] CallExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] CallExpression[?Yield, ?Await] . IdentifierName CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] CallExpression[?Yield, ?Await] . PrivateIdentifier SuperCall[Yield, Await] : super Arguments[?Yield, ?Await] ImportCall[Yield, Await] : import ( AssignmentExpression[+In, ?Yield, ?Await] ,opt ) import ( AssignmentExpression[+In, ?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ,opt ) Arguments[Yield, Await] : ( ) ( ArgumentList[?Yield, ?Await] ) ( ArgumentList[?Yield, ?Await] , ) ArgumentList[Yield, Await] : AssignmentExpression[+In, ?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , ... AssignmentExpression[+In, ?Yield, ?Await] OptionalExpression[Yield, Await] : MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalChain[Yield, Await] : ?. Arguments[?Yield, ?Await] ?. [ Expression[+In, ?Yield, ?Await] ] ?. IdentifierName ?. TemplateLiteral[?Yield, ?Await, +Tagged] ?. PrivateIdentifier OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await] OptionalChain[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] OptionalChain[?Yield, ?Await] . IdentifierName OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] OptionalChain[?Yield, ?Await] . PrivateIdentifier LeftHandSideExpression[Yield, Await] : NewExpression[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalExpression[?Yield, ?Await]

보충 구문

다음 생성식을 처리할 때
CallExpression : CoverCallExpressionAndAsyncArrowHead
CoverCallExpressionAndAsyncArrowHead의 해석은 다음 문법을 사용하여 보완된다:

CallMemberExpression[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

13.3.1 정적 의미론

13.3.1.1 정적 의미론: 초기 에러

OptionalChain : ?. TemplateLiteral OptionalChain TemplateLiteral
  • 이 생성식에 의해 소스 텍스트가 일치하는 경우 구문 오류이다.
참고

이 생성식은 다음 코드에 자동 세미콜론 삽입 규칙(12.10)이 적용되는 것을 방지하기 위해 존재한다:

a?.b
`c`

이 코드는 두 개의 유효한 문장으로 해석되어야 한다. 목적은 선택적 체이닝 없이 유사한 코드와 일관성을 유지하는 것이다:

a.b
`c`

이 코드는 유효한 문장이며, 자동 세미콜론 삽입이 적용되지 않는다.

ImportMeta : import . meta

13.3.2 프로퍼티 접근자

참고

프로퍼티는 점 표기법(dot notation)을 사용하여 이름으로 접근할 수 있다:

또는 대괄호 표기법(bracket notation)을 사용할 수 있다:

점 표기법은 다음 구문 변환에 의해 설명된다:

이는 동작상 다음과 동일하다:

MemberExpression [ <identifier-name-string> ]

그리고 마찬가지로

이는 동작상 다음과 동일하다:

CallExpression [ <identifier-name-string> ]

여기서 <identifier-name-string>은 IdentifierNameStringValue이다.

13.3.2.1 런타임 의미론: 평가

MemberExpression : MemberExpression [ Expression ]
  1. baseReference를 ? Evaluation of MemberExpression의 결과로 한다.
  2. baseValue를 ? GetValue(baseReference)로 한다.
  3. strictIsStrict(this MemberExpression)로 한다.
  4. EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict)를 반환한다.
MemberExpression : MemberExpression . IdentifierName
  1. baseReference를 ? Evaluation of MemberExpression의 결과로 한다.
  2. baseValue를 ? GetValue(baseReference)로 한다.
  3. strictIsStrict(this MemberExpression)로 한다.
  4. EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict)를 반환한다.
MemberExpression : MemberExpression . PrivateIdentifier
  1. baseReference를 ? Evaluation of MemberExpression의 결과로 한다.
  2. baseValue를 ? GetValue(baseReference)로 한다.
  3. fieldNameStringStringValue of PrivateIdentifier로 한다.
  4. MakePrivateReference(baseValue, fieldNameString)를 반환한다.
CallExpression : CallExpression [ Expression ]
  1. baseReference를 ? Evaluation of CallExpression의 결과로 한다.
  2. baseValue를 ? GetValue(baseReference)로 한다.
  3. strictIsStrict(this CallExpression)로 한다.
  4. EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict)를 반환한다.
CallExpression : CallExpression . IdentifierName
  1. baseReference를 ? Evaluation of CallExpression의 결과로 한다.
  2. baseValue를 ? GetValue(baseReference)로 한다.
  3. strictIsStrict(this CallExpression)로 한다.
  4. EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict)를 반환한다.
CallExpression : CallExpression . PrivateIdentifier
  1. baseReference를 ? Evaluation of CallExpression의 결과로 한다.
  2. baseValue를 ? GetValue(baseReference)로 한다.
  3. fieldNameStringStringValue of PrivateIdentifier로 한다.
  4. MakePrivateReference(baseValue, fieldNameString)를 반환한다.

13.3.3 EvaluatePropertyAccessWithExpressionKey ( baseValue, expression, strict )

추상 연산 EvaluatePropertyAccessWithExpressionKey는 baseValue (ECMAScript 언어 값), expression (Expression 파스 노드), strict (불리언)를 인수로 받고, 정상 완료(normal completion)가 담긴 Reference Record 또는 비정상 완료(abrupt completion)를 반환한다. 실행 시 다음 단계를 수행한다:

  1. propertyNameReference를 ? Evaluation of expression의 결과로 한다.
  2. propertyNameValue를 ? GetValue(propertyNameReference)로 한다.
  3. 참고: 대부분의 경우 ToPropertyKey가 이 단계 바로 뒤에 propertyNameValue에 적용된다. 하지만 a[b] = c의 경우 c의 평가가 끝난 뒤에 적용된다.
  4. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyNameValue, [[Strict]]: strict, [[ThisValue]]: empty }를 반환한다.

13.3.4 EvaluatePropertyAccessWithIdentifierKey ( baseValue, identifierName, strict )

추상 연산 EvaluatePropertyAccessWithIdentifierKey는 baseValue (ECMAScript 언어 값), identifierName (IdentifierName 파스 노드), strict (불리언)를 인수로 받고, Reference Record를 반환한다. 실행 시 다음 단계를 수행한다:

  1. propertyNameStringStringValue of identifierName로 한다.
  2. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyNameString, [[Strict]]: strict, [[ThisValue]]: empty }를 반환한다.

13.3.5 new 연산자

13.3.5.1 런타임 의미론: 평가

NewExpression : new NewExpression
  1. EvaluateNew(NewExpression, empty)를 반환한다.
MemberExpression : new MemberExpression Arguments
  1. EvaluateNew(MemberExpression, Arguments)를 반환한다.

13.3.5.1.1 EvaluateNew ( constructExpr, arguments )

추상 연산 EvaluateNew는 constructExpr (NewExpression 파스 노드 또는 MemberExpression 파스 노드)와 arguments (empty 또는 Arguments 파스 노드)를 인수로 받고, 정상 완료(normal completion)가 담긴 ECMAScript 언어 값 또는 비정상 완료(abrupt completion)를 반환한다. 실행 시 다음 단계를 수행한다:

  1. ref를 ? Evaluation of constructExpr의 결과로 한다.
  2. constructor를 ? GetValue(ref)로 한다.
  3. 만약 argumentsempty이면,
    1. argList를 새로운 빈 리스트로 한다.
  4. 그 외에는,
    1. argList를 ? ArgumentListEvaluation of arguments의 결과로 한다.
  5. IsConstructor(constructor) 가 false이면 TypeError 예외를 throw한다.
  6. Construct(constructor, argList)를 반환한다.

13.3.6 함수 호출

13.3.6.1 런타임 의미론: 평가

CallExpression : CoverCallExpressionAndAsyncArrowHead
  1. exprCallMemberExpression로 한다. 이는 포함된 CoverCallExpressionAndAsyncArrowHead이다.
  2. memberExprexprMemberExpression로 한다.
  3. argumentsexprArguments로 한다.
  4. ref를 ? Evaluation of memberExpr의 결과로 한다.
  5. func를 ? GetValue(ref)로 한다.
  6. 만약 refReference Record이고, IsPropertyReference(ref) 가 false이며, ref.[[ReferencedName]]"eval"이면,
    1. SameValue(func, %eval%)가 true이면,
      1. argList를 ? ArgumentListEvaluation of arguments의 결과로 한다.
      2. argList에 요소가 없다면 undefined를 반환한다.
      3. evalArgargList의 첫 번째 요소로 한다.
      4. IsStrict(this CallExpression)가 true이면 strictCallertrue로, 그렇지 않으면 strictCallerfalse로 한다.
      5. PerformEval(evalArg, strictCaller, true)의 결과를 반환한다.
  7. thisCall을 this CallExpression로 한다.
  8. tailCallIsInTailPosition(thisCall)로 한다.
  9. EvaluateCall(func, ref, arguments, tailCall)의 결과를 반환한다.

CallExpression의 평가가 6.a.v 단계를 실행하면, 이는 직접 eval(direct eval)이다.

CallExpression : CallExpression Arguments
  1. ref를 ? Evaluation of CallExpression의 결과로 한다.
  2. func를 ? GetValue(ref)로 한다.
  3. thisCall을 this CallExpression로 한다.
  4. tailCallIsInTailPosition(thisCall)로 한다.
  5. EvaluateCall(func, ref, Arguments, tailCall)의 결과를 반환한다.

13.3.6.2 EvaluateCall ( func, ref, arguments, tailPosition )

추상 연산 EvaluateCall은 func (ECMAScript 언어 값), ref (ECMAScript 언어 값 또는 Reference Record), arguments (파스 노드), tailPosition (불리언)를 인수로 받고, 정상 완료가 담긴 ECMAScript 언어 값 또는 비정상 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. refReference Record라면,
    1. IsPropertyReference(ref) 가 true라면,
      1. thisValueGetThisValue(ref)로 한다.
    2. 그 외에는,
      1. refEnvref.[[Base]]로 한다.
      2. Assert: refEnvEnvironment Record이다.
      3. thisValuerefEnv.WithBaseObject()로 한다.
  2. 그 외에는,
    1. thisValueundefined로 한다.
  3. argList를 ? ArgumentListEvaluation of arguments의 결과로 한다.
  4. func객체가 아니면 TypeError 예외를 throw한다.
  5. IsCallable(func)가 false이면 TypeError 예외를 throw한다.
  6. tailPositiontrue이면, PrepareForTailCall()를 수행한다.
  7. Call(func, thisValue, argList)의 결과를 반환한다.

13.3.7 super 키워드

13.3.7.1 런타임 의미론: 평가

SuperProperty : super [ Expression ]
  1. envGetThisEnvironment()로 한다.
  2. actualThis를 ? env.GetThisBinding()으로 한다.
  3. propertyNameReference를 ? Evaluation of Expression의 결과로 한다.
  4. propertyNameValue를 ? GetValue(propertyNameReference)로 한다.
  5. strictIsStrict(this SuperProperty)로 한다.
  6. 참고: 대부분의 경우, ToPropertyKey가 이 단계 직후 propertyNameValue에 대해 수행된다. 그러나 super[b] = c의 경우 c의 평가가 끝난 뒤에 수행된다.
  7. MakeSuperPropertyReference(actualThis, propertyNameValue, strict)를 반환한다.
SuperProperty : super . IdentifierName
  1. envGetThisEnvironment()로 한다.
  2. actualThis를 ? env.GetThisBinding()으로 한다.
  3. propertyKeyStringValue of IdentifierName로 한다.
  4. strictIsStrict(this SuperProperty)로 한다.
  5. MakeSuperPropertyReference(actualThis, propertyKey, strict)를 반환한다.
SuperCall : super Arguments
  1. newTargetGetNewTarget()로 한다.
  2. Assert: newTarget생성자이다.
  3. funcGetSuperConstructor()로 한다.
  4. argList를 ? ArgumentListEvaluation of Arguments의 결과로 한다.
  5. IsConstructor(func)가 false이면 TypeError 예외를 throw한다.
  6. result를 ? Construct(func, argList, newTarget)의 결과로 한다.
  7. thisERGetThisEnvironment()로 한다.
  8. Assert: thisER함수 환경 레코드(Function Environment Record)이다.
  9. BindThisValue(thisER, result)를 수행한다.
  10. FthisER.[[FunctionObject]]로 한다.
  11. Assert: F는 ECMAScript 함수 객체(function object)이다.
  12. InitializeInstanceElements(result, F)를 수행한다.
  13. result를 반환한다.

13.3.7.2 GetSuperConstructor ( )

추상 연산 GetSuperConstructor는 인수를 받지 않으며 ECMAScript 언어 값을 반환한다. 호출 시 다음 단계를 수행한다:

  1. envRecGetThisEnvironment()로 한다.
  2. Assert: envRec함수 환경 레코드(Function Environment Record)이다.
  3. activeFunctionenvRec.[[FunctionObject]]로 한다.
  4. Assert: activeFunction은 ECMAScript 함수 객체(function object)이다.
  5. superConstructor를 ! activeFunction.[[GetPrototypeOf]]()의 결과로 한다.
  6. superConstructor를 반환한다.

13.3.7.3 MakeSuperPropertyReference ( actualThis, propertyKey, strict )

추상 연산 MakeSuperPropertyReference는 actualThis (ECMAScript 언어 값), propertyKey (ECMAScript 언어 값), strict (불리언)를 인수로 받고, Super Reference Record를 반환한다. 호출 시 다음 단계를 수행한다:

  1. envGetThisEnvironment()로 한다.
  2. Assert: env.HasSuperBinding()이 true이다.
  3. Assert: env함수 환경 레코드(Function Environment Record)이다.
  4. baseValueGetSuperBase(env)로 한다.
  5. Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyKey, [[Strict]]: strict, [[ThisValue]]: actualThis }를 반환한다.

13.3.8 인수 목록

참고

인수 목록의 평가는 값들의 리스트를 생성한다.

13.3.8.1 런타임 의미론: ArgumentListEvaluation

구문 지향 연산 ArgumentListEvaluation은 인수를 받지 않으며, 리스트에 담긴 ECMAScript 언어 값들의 정상 완료(normal completion) 또는 비정상 완료(abrupt completion)를 반환한다. 다음 생산식에 대해 부분적으로 정의된다:

Arguments : ( )
  1. 새로운 빈 리스트를 반환한다.
ArgumentList : AssignmentExpression
  1. ref를 ? Evaluation of AssignmentExpression의 결과로 한다.
  2. arg를 ? GetValue(ref)로 한다.
  3. « arg »를 반환한다.
ArgumentList : ... AssignmentExpression
  1. list를 새로운 빈 리스트로 한다.
  2. spreadRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
  3. spreadObj를 ? GetValue(spreadRef)로 한다.
  4. iteratorRecord를 ? GetIterator(spreadObj, sync)로 한다.
  5. 반복,
    1. next를 ? IteratorStepValue(iteratorRecord)로 한다.
    2. nextdone이면 list를 반환한다.
    3. nextlist에 추가한다.
ArgumentList : ArgumentList , AssignmentExpression
  1. precedingArgs를 ? ArgumentListEvaluation of ArgumentList의 결과로 한다.
  2. ref를 ? Evaluation of AssignmentExpression의 결과로 한다.
  3. arg를 ? GetValue(ref)로 한다.
  4. precedingArgs와 « arg »의 리스트 결합을 반환한다.
ArgumentList : ArgumentList , ... AssignmentExpression
  1. precedingArgs를 ? ArgumentListEvaluation of ArgumentList의 결과로 한다.
  2. spreadRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
  3. iteratorRecord를 ? GetIterator(? GetValue(spreadRef), sync)로 한다.
  4. 반복,
    1. next를 ? IteratorStepValue(iteratorRecord)로 한다.
    2. nextdone이면 precedingArgs를 반환한다.
    3. nextprecedingArgs에 추가한다.
TemplateLiteral : NoSubstitutionTemplate
  1. templateLiteral을 this TemplateLiteral로 한다.
  2. siteObjGetTemplateObject(templateLiteral)로 한다.
  3. « siteObj »를 반환한다.
TemplateLiteral : SubstitutionTemplate
  1. templateLiteral을 this TemplateLiteral로 한다.
  2. siteObjGetTemplateObject(templateLiteral)로 한다.
  3. remaining을 ? ArgumentListEvaluation of SubstitutionTemplate의 결과로 한다.
  4. « siteObj »와 remaining리스트 결합을 반환한다.
SubstitutionTemplate : TemplateHead Expression TemplateSpans
  1. firstSubRef를 ? Evaluation of Expression의 결과로 한다.
  2. firstSub를 ? GetValue(firstSubRef)로 한다.
  3. restSub를 ? SubstitutionEvaluation of TemplateSpans의 결과로 한다.
  4. Assert: restSub는 비어 있을 수도 있는 리스트이다.
  5. « firstSub »와 restSub리스트 결합을 반환한다.

13.3.9 옵셔널 체이닝

참고
옵셔널 체이닝은 하나 이상의 프로퍼티 접근 또는 함수 호출로 이루어진 체인으로, 그 첫 번째가 ?. 토큰으로 시작한다.

13.3.9.1 런타임 의미론: 평가

OptionalExpression : MemberExpression OptionalChain
  1. baseReference를 ? Evaluation of MemberExpression의 결과로 한다.
  2. baseValue를 ? GetValue(baseReference)로 한다.
  3. 만약 baseValueundefined 또는 null이면,
    1. undefined를 반환한다.
  4. ChainEvaluation of OptionalChainbaseValuebaseReference를 인수로 하여 호출한 결과를 반환한다.
OptionalExpression : CallExpression OptionalChain
  1. baseReference를 ? Evaluation of CallExpression의 결과로 한다.
  2. baseValue를 ? GetValue(baseReference)로 한다.
  3. 만약 baseValueundefined 또는 null이면,
    1. undefined를 반환한다.
  4. ChainEvaluation of OptionalChainbaseValuebaseReference를 인수로 하여 호출한 결과를 반환한다.
OptionalExpression : OptionalExpression OptionalChain
  1. baseReference를 ? Evaluation of OptionalExpression의 결과로 한다.
  2. baseValue를 ? GetValue(baseReference)로 한다.
  3. 만약 baseValueundefined 또는 null이면,
    1. undefined를 반환한다.
  4. ChainEvaluation of OptionalChainbaseValuebaseReference를 인수로 하여 호출한 결과를 반환한다.

13.3.9.2 런타임 의미론: ChainEvaluation

구문 지향 연산 ChainEvaluation은 baseValue (ECMAScript 언어 값), baseReference (ECMAScript 언어 값 또는 Reference Record)를 인수로 받고, 정상 완료(normal completion)가 담긴 ECMAScript 언어 값 또는 Reference Record 또는 비정상 완료(abrupt completion)를 반환한다. 다음 생산식에 대해 부분적으로 정의된다:

OptionalChain : ?. Arguments
  1. thisChain을 this OptionalChain로 한다.
  2. tailCallIsInTailPosition(thisChain)로 한다.
  3. EvaluateCall(baseValue, baseReference, Arguments, tailCall)의 결과를 반환한다.
OptionalChain : ?. [ Expression ]
  1. strictIsStrict(this OptionalChain)로 한다.
  2. EvaluatePropertyAccessWithExpressionKey(baseValue, Expression, strict)의 결과를 반환한다.
OptionalChain : ?. IdentifierName
  1. strictIsStrict(this OptionalChain)로 한다.
  2. EvaluatePropertyAccessWithIdentifierKey(baseValue, IdentifierName, strict)의 결과를 반환한다.
OptionalChain : ?. PrivateIdentifier
  1. fieldNameStringStringValue of PrivateIdentifier로 한다.
  2. MakePrivateReference(baseValue, fieldNameString)의 결과를 반환한다.
OptionalChain : OptionalChain Arguments
  1. optionalChainOptionalChain로 한다.
  2. newReference를 ? ChainEvaluation of optionalChainbaseValuebaseReference를 인수로 하여 호출한 결과로 한다.
  3. newValue를 ? GetValue(newReference)로 한다.
  4. thisChain을 this OptionalChain로 한다.
  5. tailCallIsInTailPosition(thisChain)로 한다.
  6. EvaluateCall(newValue, newReference, Arguments, tailCall)의 결과를 반환한다.
OptionalChain : OptionalChain [ Expression ]
  1. optionalChainOptionalChain로 한다.
  2. newReference를 ? ChainEvaluation of optionalChainbaseValuebaseReference를 인수로 하여 호출한 결과로 한다.
  3. newValue를 ? GetValue(newReference)로 한다.
  4. strictIsStrict(this OptionalChain)로 한다.
  5. EvaluatePropertyAccessWithExpressionKey(newValue, Expression, strict)의 결과를 반환한다.
OptionalChain : OptionalChain . IdentifierName
  1. optionalChainOptionalChain로 한다.
  2. newReference를 ? ChainEvaluation of optionalChainbaseValuebaseReference를 인수로 하여 호출한 결과로 한다.
  3. newValue를 ? GetValue(newReference)로 한다.
  4. strictIsStrict(this OptionalChain)로 한다.
  5. EvaluatePropertyAccessWithIdentifierKey(newValue, IdentifierName, strict)의 결과를 반환한다.
OptionalChain : OptionalChain . PrivateIdentifier
  1. optionalChainOptionalChain로 한다.
  2. newReference를 ? ChainEvaluation of optionalChainbaseValuebaseReference를 인수로 하여 호출한 결과로 한다.
  3. newValue를 ? GetValue(newReference)로 한다.
  4. fieldNameStringStringValue of PrivateIdentifier로 한다.
  5. MakePrivateReference(newValue, fieldNameString)의 결과를 반환한다.

13.3.10 import 호출

13.3.10.1 런타임 의미론: 평가

ImportCall : import ( AssignmentExpression ,opt )
  1. EvaluateImportCall(AssignmentExpression)을 반환한다.
ImportCall : import ( AssignmentExpression , AssignmentExpression ,opt )
  1. EvaluateImportCall(첫 번째 AssignmentExpression, 두 번째 AssignmentExpression)을 반환한다.

13.3.10.2 EvaluateImportCall ( specifierExpression [ , optionsExpression ] )

추상 연산 EvaluateImportCall은 specifierExpression (파스 노드)와 선택적 인수 optionsExpression (파스 노드)를 인수로 받고, 프로미스가 담긴 정상 완료(normal completion) 또는 비정상 완료(abrupt completion)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. referrerGetActiveScriptOrModule()로 한다.
  2. referrernull이면 referrer현재 Realm Record로 설정한다.
  3. specifierRef를 ? Evaluation of specifierExpression의 결과로 한다.
  4. specifier를 ? GetValue(specifierRef)로 한다.
  5. optionsExpression이 존재하면,
    1. optionsRef를 ? Evaluation of optionsExpression의 결과로 한다.
    2. options를 ? GetValue(optionsRef)로 한다.
  6. 그 외에는,
    1. optionsundefined로 한다.
  7. promiseCapability를 ! NewPromiseCapability(%Promise%)로 한다.
  8. specifierStringCompletion(ToString(specifier))로 한다.
  9. IfAbruptRejectPromise(specifierString, promiseCapability)를 수행한다.
  10. attributes를 새로운 빈 리스트로 한다.
  11. optionsundefined가 아니면,
    1. options객체가 아니면,
      1. Call(promiseCapability.[[Reject]], undefined, « 새로 생성된 TypeError 객체 »)를 수행한다.
      2. promiseCapability.[[Promise]]를 반환한다.
    2. attributesObjCompletion(Get(options, "with"))로 한다.
    3. IfAbruptRejectPromise(attributesObj, promiseCapability)를 수행한다.
    4. attributesObj가 undefined가 아니면,
      1. attributesObj가 객체가 아니면,
        1. Call(promiseCapability.[[Reject]], undefined, « 새로 생성된 TypeError 객체 »)를 수행한다.
        2. promiseCapability.[[Promise]]를 반환한다.
      2. entriesCompletion(EnumerableOwnProperties(attributesObj, key+value))로 한다.
      3. IfAbruptRejectPromise(entries, promiseCapability)를 수행한다.
      4. entries의 각 요소 entry에 대해,
        1. key를 ! Get(entry, "0")로 한다.
        2. value를 ! Get(entry, "1")로 한다.
        3. key가 문자열이면,
          1. value가 문자열이 아니면,
            1. Call(promiseCapability.[[Reject]], undefined, « 새로 생성된 TypeError 객체 »)를 수행한다.
            2. promiseCapability.[[Promise]]를 반환한다.
          2. ImportAttribute Record { [[Key]]: key, [[Value]]: value }를 attributes에 추가한다.
    5. AllImportAttributesSupported(attributes) 가 false라면,
      1. Call(promiseCapability.[[Reject]], undefined, « 새로 생성된 TypeError 객체 »)를 수행한다.
      2. promiseCapability.[[Promise]]를 반환한다.
    6. attributes를 각 [[Key]] 필드 값을 UTF-16 코드 유닛의 시퀀스로 취급하여 사전식(lexicographic)으로 정렬한다. 참고: 이 정렬은 호스트가 속성의 열거 순서에 따라 동작을 바꾸지 못하도록 금지하는 목적에서만 관찰 가능하다.
  12. moduleRequestModuleRequest Record { [[Specifier]]: specifierString, [[Attributes]]: attributes }로 한다.
  13. HostLoadImportedModule(referrer, moduleRequest, empty, promiseCapability)를 수행한다.
  14. promiseCapability.[[Promise]]를 반환한다.

13.3.10.3 ContinueDynamicImport ( promiseCapability, moduleCompletion )

추상 연산 ContinueDynamicImport는 promiseCapability (PromiseCapability Record), moduleCompletion (정상 완료(normal completion)가 담긴 Module Record 또는 throw completion)를 인수로 받고 unused를 반환한다. 이는 import() 호출로 시작된 동적 import의 처리를 완료하며, 그 호출이 반환한 프로미스를 적절히 resolve 또는 reject 한다. 호출 시 다음 단계를 수행한다:

  1. moduleCompletion비정상 완료(abrupt completion)라면,
    1. Call(promiseCapability.[[Reject]], undefined, « moduleCompletion.[[Value]] »)를 수행한다.
    2. unused를 반환한다.
  2. modulemoduleCompletion.[[Value]]로 한다.
  3. loadPromisemodule.LoadRequestedModules()로 한다.
  4. rejectedClosure를 매개변수 (reason)를 가지며 promiseCapability를 캡처하고, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure로 한다:
    1. Call(promiseCapability.[[Reject]], undefined, « reason »)를 수행한다.
    2. NormalCompletion(undefined)을 반환한다.
  5. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « »)로 한다.
  6. linkAndEvaluateClosure를 매개변수 없이 module, promiseCapability, onRejected를 캡처하고, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure로 한다:
    1. linkCompletion(module.Link())로 한다.
    2. link비정상 완료(abrupt completion)라면,
      1. Call(promiseCapability.[[Reject]], undefined, « link.[[Value]] »)를 수행한다.
      2. NormalCompletion(undefined)을 반환한다.
    3. evaluatePromisemodule.Evaluate()로 한다.
    4. fulfilledClosure를 매개변수 없이 modulepromiseCapability를 캡처하고, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure로 한다:
      1. namespaceGetModuleNamespace(module)로 한다.
      2. Call(promiseCapability.[[Resolve]], undefined, « namespace »)를 수행한다.
      3. NormalCompletion(undefined)을 반환한다.
    5. onFulfilledCreateBuiltinFunction(fulfilledClosure, 0, "", « »)로 한다.
    6. PerformPromiseThen(evaluatePromise, onFulfilled, onRejected)를 수행한다.
    7. unused를 반환한다.
  7. linkAndEvaluateCreateBuiltinFunction(linkAndEvaluateClosure, 0, "", « »)로 한다.
  8. PerformPromiseThen(loadPromise, linkAndEvaluate, onRejected)를 수행한다.
  9. unused를 반환한다.

13.3.11 태그드 템플릿

참고

태그드 템플릿은 함수 호출로, 호출의 인수들은 TemplateLiteral (13.2.8)에서 유도된다. 실제 인수에는 템플릿 객체(13.2.8.4)와 TemplateLiteral 내에 포함된 표현식들을 평가하여 얻은 값들이 포함된다.

13.3.11.1 런타임 의미론: 평가

MemberExpression : MemberExpression TemplateLiteral
  1. tagRef를 ? Evaluation of MemberExpression의 결과로 한다.
  2. tagFunc를 ? GetValue(tagRef)로 한다.
  3. thisCall을 this MemberExpression로 한다.
  4. tailCallIsInTailPosition(thisCall)로 한다.
  5. EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall)의 결과를 반환한다.
CallExpression : CallExpression TemplateLiteral
  1. tagRef를 ? Evaluation of CallExpression의 결과로 한다.
  2. tagFunc를 ? GetValue(tagRef)로 한다.
  3. thisCall을 this CallExpression로 한다.
  4. tailCallIsInTailPosition(thisCall)로 한다.
  5. EvaluateCall(tagFunc, tagRef, TemplateLiteral, tailCall)의 결과를 반환한다.

13.3.12 메타 프로퍼티

13.3.12.1 런타임 의미론: 평가

NewTarget : new . target
  1. GetNewTarget()를 반환한다.
ImportMeta : import . meta
  1. moduleGetActiveScriptOrModule()로 한다.
  2. Assert: module소스 텍스트 모듈 레코드(Source Text Module Record)이다.
  3. importMetamodule.[[ImportMeta]]로 한다.
  4. importMetaempty이면,
    1. importMetaOrdinaryObjectCreate(null)로 설정한다.
    2. importMetaValuesHostGetImportMetaProperties(module)로 한다.
    3. importMetaValues의 각 Record { [[Key]], [[Value]] } p에 대해,
      1. CreateDataPropertyOrThrow(importMeta, p.[[Key]], p.[[Value]])를 수행한다.
    4. HostFinalizeImportMeta(importMeta, module)를 수행한다.
    5. module.[[ImportMeta]]importMeta로 설정한다.
    6. importMeta를 반환한다.
  5. 그 외에는,
    1. Assert: importMeta 객체이다.
    2. importMeta를 반환한다.

13.3.12.1.1 HostGetImportMetaProperties ( moduleRecord )

호스트 정의 추상 연산 HostGetImportMetaProperties는 moduleRecord (모듈 레코드(Module Record))를 인수로 받고, 리스트(List)를 반환한다. 리스트는 Record들로 구성되며, 각 Record는 [[Key]] (프로퍼티 키)와 [[Value]] (ECMAScript 언어 값) 필드를 가진다. 이 연산은 호스트import.meta에서 반환되는 객체에 프로퍼티 키와 값을 제공할 수 있도록 한다.

HostGetImportMetaProperties의 기본 구현은 새로운 빈 리스트(List)를 반환한다.

13.3.12.1.2 HostFinalizeImportMeta ( importMeta, moduleRecord )

호스트 정의 추상 연산 HostFinalizeImportMeta는 importMeta (객체)와 moduleRecord (모듈 레코드(Module Record))를 인수로 받고 unused를 반환한다. 이 연산은 호스트import.meta에서 반환되는 객체를 ECMAScript 코드에 노출하기 전에 특별한 처리를 할 수 있도록 한다.

대부분의 호스트HostGetImportMetaProperties만 정의하고, HostFinalizeImportMeta는 기본 동작을 사용하면 된다. 그러나 HostFinalizeImportMeta는 호스트가 객체를 직접 조작해야 할 경우를 위한 "탈출구"를 제공한다.

HostFinalizeImportMeta의 기본 구현은 unused를 반환한다.

13.4 증감식

구문

UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] [여기에 LineTerminator 없음] ++ LeftHandSideExpression[?Yield, ?Await] [여기에 LineTerminator 없음] -- ++ UnaryExpression[?Yield, ?Await] -- UnaryExpression[?Yield, ?Await]

13.4.1 정적 의미론: 초기 에러

UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- UpdateExpression : ++ UnaryExpression -- UnaryExpression

13.4.2 후위 증가 연산자

13.4.2.1 런타임 의미론: 평가

UpdateExpression : LeftHandSideExpression ++
  1. lhs를 ? Evaluation of LeftHandSideExpression의 결과로 한다.
  2. LeftHandSideExpressionAssignmentTargetTypeweb-compat이면, ReferenceError 예외를 발생시킨다.
  3. oldValue를 ? ToNumeric(? GetValue(lhs))로 한다.
  4. oldValueNumber이면,
    1. newValueNumber::add(oldValue, 1𝔽)로 한다.
  5. 그 외에는,
    1. Assert: oldValueBigInt이다.
    2. newValueBigInt::add(oldValue, 1)로 한다.
  6. PutValue(lhs, newValue)를 수행한다.
  7. oldValue를 반환한다.

13.4.3 후위 감소 연산자

13.4.3.1 런타임 의미론: 평가

UpdateExpression : LeftHandSideExpression --
  1. lhs를 ? Evaluation of LeftHandSideExpression의 결과로 한다.
  2. LeftHandSideExpressionAssignmentTargetTypeweb-compat이면, ReferenceError 예외를 발생시킨다.
  3. oldValue를 ? ToNumeric(? GetValue(lhs))로 한다.
  4. oldValueNumber이면,
    1. newValueNumber::subtract(oldValue, 1𝔽)로 한다.
  5. 그 외에는,
    1. Assert: oldValueBigInt이다.
    2. newValueBigInt::subtract(oldValue, 1)로 한다.
  6. PutValue(lhs, newValue)를 수행한다.
  7. oldValue를 반환한다.

13.4.4 전위 증가 연산자

13.4.4.1 런타임 의미론: 평가

UpdateExpression : ++ UnaryExpression
  1. expr를 ? Evaluation of UnaryExpression의 결과로 한다.
  2. UnaryExpressionAssignmentTargetTypeweb-compat이면, ReferenceError 예외를 발생시킨다.
  3. oldValue를 ? ToNumeric(? GetValue(expr))로 한다.
  4. oldValueNumber이면,
    1. newValueNumber::add(oldValue, 1𝔽)로 한다.
  5. 그 외에는,
    1. Assert: oldValueBigInt이다.
    2. newValueBigInt::add(oldValue, 1)로 한다.
  6. PutValue(expr, newValue)를 수행한다.
  7. newValue를 반환한다.

13.4.5 전위 감소 연산자

13.4.5.1 런타임 의미론: 평가

UpdateExpression : -- UnaryExpression
  1. expr를 ? Evaluation of UnaryExpression의 결과로 한다.
  2. UnaryExpressionAssignmentTargetTypeweb-compat이면, ReferenceError 예외를 발생시킨다.
  3. oldValue를 ? ToNumeric(? GetValue(expr))로 한다.
  4. oldValueNumber이면,
    1. newValueNumber::subtract(oldValue, 1𝔽)로 한다.
  5. 그 외에는,
    1. Assert: oldValueBigInt이다.
    2. newValueBigInt::subtract(oldValue, 1)로 한다.
  6. PutValue(expr, newValue)를 수행한다.
  7. newValue를 반환한다.

13.5 단항 연산자

구문

UnaryExpression[Yield, Await] : UpdateExpression[?Yield, ?Await] delete UnaryExpression[?Yield, ?Await] void UnaryExpression[?Yield, ?Await] typeof UnaryExpression[?Yield, ?Await] + UnaryExpression[?Yield, ?Await] - UnaryExpression[?Yield, ?Await] ~ UnaryExpression[?Yield, ?Await] ! UnaryExpression[?Yield, ?Await] [+Await] AwaitExpression[?Yield]

13.5.1 delete 연산자

13.5.1.1 정적 의미론: 초기 에러

UnaryExpression : delete UnaryExpression 참고

마지막 규칙은 delete (((foo)))와 같은 표현식이 첫 번째 규칙의 재귀적 적용으로 인해 초기 에러를 발생시킴을 의미한다.

13.5.1.2 런타임 의미론: 평가

UnaryExpression : delete UnaryExpression
  1. ref를 ? Evaluation of UnaryExpression의 결과로 한다.
  2. refReference Record가 아니면, true를 반환한다.
  3. IsUnresolvableReference(ref) 가 true이면,
    1. Assert: ref.[[Strict]]false이다.
    2. true를 반환한다.
  4. IsPropertyReference(ref) 가 true이면,
    1. Assert: IsPrivateReference(ref) 가 false이다.
    2. IsSuperReference(ref) 가 true이면, ReferenceError 예외를 발생시킨다.
    3. baseObj를 ? ToObject(ref.[[Base]])로 한다.
    4. ref.[[ReferencedName]]프로퍼티 키가 아니면,
      1. ref.[[ReferencedName]]를 ? ToPropertyKey(ref.[[ReferencedName]])로 설정한다.
    5. deleteStatus를 ? baseObj.[[Delete]](ref.[[ReferencedName]])로 한다.
    6. deleteStatusfalse이고 ref.[[Strict]]true이면, TypeError 예외를 발생시킨다.
    7. deleteStatus를 반환한다.
  5. 그 외에는,
    1. baseref.[[Base]]로 한다.
    2. Assert: baseEnvironment Record이다.
    3. base.DeleteBinding(ref.[[ReferencedName]])을 반환한다.
참고 1

delete 연산자가 strict mode 코드 내에서 등장하면, 그 UnaryExpression이 변수, 함수 인수, 또는 함수 이름에 대한 직접 참조인 경우 SyntaxError 예외가 발생한다. 또한, delete 연산자가 strict mode 코드 내에 있고 삭제 대상 프로퍼티의 속성이 { [[Configurable]]: false }(또는 삭제할 수 없는 경우)이면 TypeError 예외가 발생한다.

참고 2

4.c 단계에서 생성될 수 있는 객체는 위의 추상 연산과 일반 객체 [[Delete]] 내부 메서드 외부에서는 접근할 수 없다. 실제 구현에서는 실제로 객체를 생성하지 않을 수도 있다.

13.5.2 void 연산자

13.5.2.1 런타임 의미론: 평가

UnaryExpression : void UnaryExpression
  1. expr를 ? Evaluation of UnaryExpression의 결과로 한다.
  2. GetValue(expr)를 수행한다.
  3. undefined를 반환한다.
참고

GetValue는 그 값이 사용되지 않더라도 관찰 가능한 부작용이 있을 수 있으므로 반드시 호출되어야 한다.

13.5.3 typeof 연산자

13.5.3.1 런타임 의미론: 평가

UnaryExpression : typeof UnaryExpression
  1. val를 ? Evaluation of UnaryExpression의 결과로 한다.
  2. valReference Record이면,
    1. IsUnresolvableReference(val) 가 true이면 "undefined"를 반환한다.
  3. val를 ? GetValue(val)로 한다.
  4. valundefined이면 "undefined"를 반환한다.
  5. valnull이면 "object"를 반환한다.
  6. valString이면 "string"를 반환한다.
  7. valSymbol이면 "symbol"를 반환한다.
  8. valBoolean이면 "boolean"를 반환한다.
  9. valNumber이면 "number"를 반환한다.
  10. valBigInt이면 "bigint"를 반환한다.
  11. Assert: val객체이다.
  12. 참고: 이 단계는 B.3.6.3 절에서 대체된다.
  13. val[[Call]] 내부 메서드가 있으면 "function"를 반환한다.
  14. "object"를 반환한다.

13.5.4 단항 + 연산자

참고

단항 + 연산자는 피연산자를 Number 타입으로 변환한다.

13.5.4.1 런타임 의미론: 평가

UnaryExpression : + UnaryExpression
  1. expr를 ? Evaluation of UnaryExpression의 결과로 한다.
  2. ToNumber(? GetValue(expr))를 반환한다.

13.5.5 단항 - 연산자

참고

단항 - 연산자는 피연산자를 숫자 값으로 변환한 뒤 부호를 반전시킨다. +0𝔽의 부호를 반전하면 -0𝔽이 되고, -0𝔽의 부호를 반전하면 +0𝔽이 된다.

13.5.5.1 런타임 의미론: 평가

UnaryExpression : - UnaryExpression
  1. expr를 ? Evaluation of UnaryExpression의 결과로 한다.
  2. oldValue를 ? ToNumeric(? GetValue(expr))로 한다.
  3. oldValueNumber이면,
    1. Number::unaryMinus(oldValue)를 반환한다.
  4. 그 외에는,
    1. Assert: oldValueBigInt이다.
    2. BigInt::unaryMinus(oldValue)를 반환한다.

13.5.6 비트 NOT 연산자 (~)

13.5.6.1 런타임 의미론: 평가

UnaryExpression : ~ UnaryExpression
  1. expr를 ? Evaluation of UnaryExpression의 결과로 한다.
  2. oldValue를 ? ToNumeric(? GetValue(expr))로 한다.
  3. oldValueNumber이면,
    1. Number::bitwiseNOT(oldValue)를 반환한다.
  4. 그 외에는,
    1. Assert: oldValueBigInt이다.
    2. BigInt::bitwiseNOT(oldValue)를 반환한다.

13.5.7 논리 NOT 연산자 (!)

13.5.7.1 런타임 의미론: 평가

UnaryExpression : ! UnaryExpression
  1. expr를 ? Evaluation of UnaryExpression의 결과로 한다.
  2. oldValueToBoolean(? GetValue(expr))로 한다.
  3. oldValuetrue이면 false를 반환한다.
  4. true를 반환한다.

13.6 거듭제곱 연산자

구문

ExponentiationExpression[Yield, Await] : UnaryExpression[?Yield, ?Await] UpdateExpression[?Yield, ?Await] ** ExponentiationExpression[?Yield, ?Await]

13.6.1 런타임 의미론: 평가

ExponentiationExpression : UpdateExpression ** ExponentiationExpression
  1. EvaluateStringOrNumericBinaryExpression(UpdateExpression, **, ExponentiationExpression)를 반환한다.

13.7 곱셈 연산자

구문

MultiplicativeExpression[Yield, Await] : ExponentiationExpression[?Yield, ?Await] MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await] MultiplicativeOperator : one of * / % 참고
  • * 연산자는 곱셈을 수행하여 피연산자의 곱을 생성한다.
  • / 연산자는 나눗셈을 수행하여 피연산자의 몫을 생성한다.
  • % 연산자는 암묵적 나눗셈에서 피연산자의 나머지를 반환한다.

13.7.1 런타임 의미론: 평가

MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression
  1. opText소스 텍스트에서 일치하는 MultiplicativeOperator의 값으로 한다.
  2. EvaluateStringOrNumericBinaryExpression(MultiplicativeExpression, opText, ExponentiationExpression)를 반환한다.

13.8 덧셈 연산자

구문

AdditiveExpression[Yield, Await] : MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] + MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] - MultiplicativeExpression[?Yield, ?Await]

13.8.1 덧셈 연산자 (+)

참고

덧셈 연산자는 문자열 연결 또는 숫자 덧셈을 수행한다.

13.8.1.1 런타임 의미론: 평가

AdditiveExpression : AdditiveExpression + MultiplicativeExpression
  1. EvaluateStringOrNumericBinaryExpression(AdditiveExpression, +, MultiplicativeExpression)를 반환한다.

13.8.2 뺄셈 연산자 (-)

참고

- 연산자는 뺄셈을 수행하여 피연산자의 차를 생성한다.

13.8.2.1 런타임 의미론: 평가

AdditiveExpression : AdditiveExpression - MultiplicativeExpression
  1. EvaluateStringOrNumericBinaryExpression(AdditiveExpression, -, MultiplicativeExpression)를 반환한다.

13.9 비트 시프트 연산자

구문

ShiftExpression[Yield, Await] : AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] << AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >> AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >>> AdditiveExpression[?Yield, ?Await]

13.9.1 왼쪽 시프트 연산자 (<<)

참고

왼쪽 피연산자를 오른쪽 피연산자가 지정한 만큼 비트 단위로 왼쪽으로 시프트(이동)한다.

13.9.1.1 런타임 의미론: 평가

ShiftExpression : ShiftExpression << AdditiveExpression
  1. EvaluateStringOrNumericBinaryExpression(ShiftExpression, <<, AdditiveExpression)를 반환한다.

13.9.2 부호 있는 오른쪽 시프트 연산자 (>>)

참고

왼쪽 피연산자를 오른쪽 피연산자가 지정한 만큼 부호 비트를 채우며 비트 단위로 오른쪽으로 시프트(이동)한다.

13.9.2.1 런타임 의미론: 평가

ShiftExpression : ShiftExpression >> AdditiveExpression
  1. EvaluateStringOrNumericBinaryExpression(ShiftExpression, >>, AdditiveExpression)를 반환한다.

13.9.3 부호 없는 오른쪽 시프트 연산자 (>>> )

참고

왼쪽 피연산자를 오른쪽 피연산자가 지정한 만큼 0으로 채우며 비트 단위로 오른쪽으로 시프트(이동)한다.

13.9.3.1 런타임 의미론: 평가

ShiftExpression : ShiftExpression >>> AdditiveExpression
  1. EvaluateStringOrNumericBinaryExpression(ShiftExpression, >>>, AdditiveExpression)를 반환한다.

13.10 관계 연산자

참고 1

관계 연산자를 평가한 결과는 항상 Boolean 타입이며, 피연산자 간의 관계가 연산자가 지정한 관계를 만족하는지 여부를 나타낸다.

구문

RelationalExpression[In, Yield, Await] : ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] < ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] > ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] <= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] >= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] instanceof ShiftExpression[?Yield, ?Await] [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await] [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await] 참고 2

[In] 문법 매개변수는 관계식에서 in 연산자와 for 문에서의 in 연산자를 혼동하지 않도록 필요하다.

13.10.1 런타임 의미론: 평가

RelationalExpression : RelationalExpression < ShiftExpression
  1. lRef를 ? Evaluation of RelationalExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of ShiftExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. r를 ? IsLessThan(lVal, rVal, true)로 한다.
  6. rundefined이면 false를, 아니면 r를 반환한다.
RelationalExpression : RelationalExpression > ShiftExpression
  1. lRef를 ? Evaluation of RelationalExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of ShiftExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. r를 ? IsLessThan(rVal, lVal, false)로 한다.
  6. rundefined이면 false를, 아니면 r를 반환한다.
RelationalExpression : RelationalExpression <= ShiftExpression
  1. lRef를 ? Evaluation of RelationalExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of ShiftExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. r를 ? IsLessThan(rVal, lVal, false)로 한다.
  6. rtrue 또는 undefined이면 false를, 아니면 true를 반환한다.
RelationalExpression : RelationalExpression >= ShiftExpression
  1. lRef를 ? Evaluation of RelationalExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of ShiftExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. r를 ? IsLessThan(lVal, rVal, true)로 한다.
  6. rtrue 또는 undefined이면 false를, 아니면 true를 반환한다.
RelationalExpression : RelationalExpression instanceof ShiftExpression
  1. lRef를 ? Evaluation of RelationalExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of ShiftExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. InstanceofOperator(lVal, rVal)를 반환한다.
RelationalExpression : RelationalExpression in ShiftExpression
  1. lRef를 ? Evaluation of RelationalExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of ShiftExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. rVal객체가 아니면, TypeError 예외를 throw한다.
  6. HasProperty(rVal, ? ToPropertyKey(lVal))를 반환한다.
RelationalExpression : PrivateIdentifier in ShiftExpression
  1. privateIdentifierStringValue of PrivateIdentifier로 한다.
  2. rRef를 ? Evaluation of ShiftExpression의 결과로 한다.
  3. rVal를 ? GetValue(rRef)로 한다.
  4. rVal객체가 아니면, TypeError 예외를 throw한다.
  5. privateEnv실행 중인 실행 컨텍스트(running execution context)의 PrivateEnvironment로 한다.
  6. Assert: privateEnvnull이 아니다.
  7. privateNameResolvePrivateIdentifier(privateEnv, privateIdentifier)로 한다.
  8. PrivateElementFind(rVal, privateName)이 empty가 아니면 true를 반환한다.
  9. false를 반환한다.

13.10.2 InstanceofOperator ( V, target )

추상 연산 InstanceofOperator는 V (ECMAScript 언어 값)와 target (ECMAScript 언어 값)을 인수로 받고, Boolean이 담긴 정상 완료 또는 throw completion를 반환한다. 이 연산은 target%Symbol.hasInstance% 메서드를 참조하거나, 없을 경우 target"prototype" 프로퍼티 값이 V의 프로토타입 체인에 존재하는지를 확인하여 Vtarget의 인스턴스인지 판별한다. 호출 시 다음 단계를 수행한다:

  1. target객체가 아니면, TypeError 예외를 throw한다.
  2. instOfHandler를 ? GetMethod(target, %Symbol.hasInstance%)로 한다.
  3. instOfHandlerundefined가 아니면,
    1. ToBoolean(? Call(instOfHandler, target, « V »))를 반환한다.
  4. IsCallable(target)이 false이면 TypeError 예외를 throw한다.
  5. OrdinaryHasInstance(target, V)를 반환한다.
참고

단계 45%Symbol.hasInstance% 메서드를 사용하지 않는 이전 ECMAScript 판과의 호환성을 제공한다. 객체가 %Symbol.hasInstance%를 정의하거나 상속하지 않은 경우 기본 instanceof 의미론을 사용한다.

13.11 동등 연산자

참고

동등 연산자를 평가한 결과는 항상 Boolean 타입이며, 연산자가 지칭하는 관계가 두 피연산자 사이에 성립하는지 여부를 나타낸다.

구문

EqualityExpression[In, Yield, Await] : RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] == RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] != RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] === RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] !== RelationalExpression[?In, ?Yield, ?Await]

13.11.1 런타임 의미론: 평가

EqualityExpression : EqualityExpression == RelationalExpression
  1. lRef를 ? Evaluation of EqualityExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of RelationalExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. IsLooselyEqual(rVal, lVal)을 반환한다.
EqualityExpression : EqualityExpression != RelationalExpression
  1. lRef를 ? Evaluation of EqualityExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of RelationalExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. r를 ? IsLooselyEqual(rVal, lVal)로 한다.
  6. rtrue이면 false를, 아니면 true를 반환한다.
EqualityExpression : EqualityExpression === RelationalExpression
  1. lRef를 ? Evaluation of EqualityExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of RelationalExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. IsStrictlyEqual(rVal, lVal)을 반환한다.
EqualityExpression : EqualityExpression !== RelationalExpression
  1. lRef를 ? Evaluation of EqualityExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of RelationalExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. rIsStrictlyEqual(rVal, lVal)로 한다.
  6. rtrue이면 false를, 아니면 true를 반환한다.
참고 1

위의 동등 연산 정의에 따르면:

  • 문자열 비교를 강제하려면: `${a}` == `${b}`를 사용한다.
  • 숫자 비교를 강제하려면: +a == +b를 사용한다.
  • 불리언 비교를 강제하려면: !a == !b를 사용한다.
참고 2

동등 연산자는 다음 불변식을 유지한다:

  • A != B!(A == B)와 동치이다.
  • A == BB == A와 동치이나, AB의 평가 순서는 다를 수 있다.
참고 3

동등 연산자는 항상 추이적이지 않다. 예를 들어 동일한 문자열 값을 갖는 두 개의 서로 다른 String 객체가 있을 수 있다. 각 String 객체는 == 연산자에 의해 그 문자열 값과 동등하게 평가되지만, 두 String 객체끼리는 동등하지 않다. 예시:

  • new String("a") == "a""a" == new String("a")는 모두 true이다.
  • new String("a") == new String("a")false이다.
참고 4

문자열의 비교는 코드 유닛 값 시퀀스에 대한 단순 동등성 테스트를 사용한다. 유니코드 명세에 정의된 문자 또는 문자열 동등성 및 정렬 순서의 더 복잡한 의미론적 정의를 사용하지 않는다. 따라서 유니코드 표준에 따라 정규화된 문자열 값이라도 서로 다르다고 평가될 수 있다. 사실상 이 알고리즘은 두 문자열이 이미 정규화된 형태임을 전제로 한다.

13.12 이진 비트 연산자

구문

BitwiseANDExpression[In, Yield, Await] : EqualityExpression[?In, ?Yield, ?Await] BitwiseANDExpression[?In, ?Yield, ?Await] & EqualityExpression[?In, ?Yield, ?Await] BitwiseXORExpression[In, Yield, Await] : BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseXORExpression[?In, ?Yield, ?Await] ^ BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseORExpression[In, Yield, Await] : BitwiseXORExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] | BitwiseXORExpression[?In, ?Yield, ?Await]

13.12.1 런타임 의미론: 평가

BitwiseANDExpression : BitwiseANDExpression & EqualityExpression
  1. EvaluateStringOrNumericBinaryExpression(BitwiseANDExpression, &, EqualityExpression)를 반환한다.
BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression
  1. EvaluateStringOrNumericBinaryExpression(BitwiseXORExpression, ^, BitwiseANDExpression)를 반환한다.
BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression
  1. EvaluateStringOrNumericBinaryExpression(BitwiseORExpression, |, BitwiseXORExpression)를 반환한다.

13.13 이진 논리 연산자

구문

LogicalANDExpression[In, Yield, Await] : BitwiseORExpression[?In, ?Yield, ?Await] LogicalANDExpression[?In, ?Yield, ?Await] && BitwiseORExpression[?In, ?Yield, ?Await] LogicalORExpression[In, Yield, Await] : LogicalANDExpression[?In, ?Yield, ?Await] LogicalORExpression[?In, ?Yield, ?Await] || LogicalANDExpression[?In, ?Yield, ?Await] CoalesceExpression[In, Yield, Await] : CoalesceExpressionHead[?In, ?Yield, ?Await] ?? BitwiseORExpression[?In, ?Yield, ?Await] CoalesceExpressionHead[In, Yield, Await] : CoalesceExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] ShortCircuitExpression[In, Yield, Await] : LogicalORExpression[?In, ?Yield, ?Await] CoalesceExpression[?In, ?Yield, ?Await] 참고

&& 또는 || 연산자가 생성하는 값은 반드시 Boolean 타입일 필요는 없다. 생성되는 값은 항상 두 피연산자 중 하나의 값이 된다.

13.13.1 런타임 의미론: 평가

LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
  1. lRef를 ? Evaluation of LogicalANDExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. ToBoolean(lVal)이 false이면 lVal를 반환한다.
  4. rRef를 ? Evaluation of BitwiseORExpression의 결과로 한다.
  5. GetValue(rRef)를 반환한다.
LogicalORExpression : LogicalORExpression || LogicalANDExpression
  1. lRef를 ? Evaluation of LogicalORExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. ToBoolean(lVal)이 true이면 lVal를 반환한다.
  4. rRef를 ? Evaluation of LogicalANDExpression의 결과로 한다.
  5. GetValue(rRef)를 반환한다.
CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression
  1. lRef를 ? Evaluation of CoalesceExpressionHead의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. lValundefined 또는 null이면,
    1. rRef를 ? Evaluation of BitwiseORExpression의 결과로 한다.
    2. GetValue(rRef)를 반환한다.
  4. 그 외에는,
    1. lVal를 반환한다.

13.14 조건 연산자 (? :)

구문

ConditionalExpression[In, Yield, Await] : ShortCircuitExpression[?In, ?Yield, ?Await] ShortCircuitExpression[?In, ?Yield, ?Await] ? AssignmentExpression[+In, ?Yield, ?Await] : AssignmentExpression[?In, ?Yield, ?Await] 참고

ECMAScript에서 ConditionalExpression의 문법은 C와 Java와 약간 다릅니다. C와 Java는 두 번째 부분식에 Expression을 허용하지만, 세 번째 식은 ConditionalExpression으로 제한합니다. ECMAScript에서 이 차이를 둔 이유는 조건문의 어느 쪽 분기에도 할당식을 둘 수 있도록 하고, 가운데 식으로 콤마 식이 오는 혼란스럽고 거의 쓸모없는 경우를 없애기 위함입니다.

13.14.1 런타임 의미론: 평가

ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
  1. lRef를 ? Evaluation of ShortCircuitExpression의 결과로 한다.
  2. lValToBoolean(? GetValue(lRef))로 한다.
  3. lValtrue이면,
    1. trueRef를 ? Evaluation of 첫 번째 AssignmentExpression의 결과로 한다.
    2. GetValue(trueRef)를 반환한다.
  4. 그 외에는,
    1. falseRef를 ? Evaluation of 두 번째 AssignmentExpression의 결과로 한다.
    2. GetValue(falseRef)를 반환한다.

13.15 할당 연산자

구문

AssignmentExpression[In, Yield, Await] : ConditionalExpression[?In, ?Yield, ?Await] [+Yield] YieldExpression[?In, ?Await] ArrowFunction[?In, ?Yield, ?Await] AsyncArrowFunction[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] AssignmentOperator AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] &&= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ||= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ??= AssignmentExpression[?In, ?Yield, ?Await] AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |= **=

13.15.1 정적 의미론: 초기 에러

AssignmentExpression : LeftHandSideExpression = AssignmentExpression AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression

13.15.2 런타임 의미론: 평가

AssignmentExpression : LeftHandSideExpression = AssignmentExpression
  1. LeftHandSideExpressionObjectLiteral도 아니고 ArrayLiteral도 아니면,
    1. lRef를 ? Evaluation of LeftHandSideExpression의 결과로 한다.
    2. LeftHandSideExpressionAssignmentTargetTypeweb-compat이면 ReferenceError 예외를 throw한다.
    3. IsAnonymousFunctionDefinition(AssignmentExpression)이 true이고 IsIdentifierRef of LeftHandSideExpressiontrue이면,
      1. lhsStringValue of LeftHandSideExpression로 한다.
      2. rVal를 ? NamedEvaluation of AssignmentExpression with argument lhs로 한다.
    4. 그 외에는,
      1. rRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
      2. rVal를 ? GetValue(rRef)로 한다.
    5. PutValue(lRef, rVal)를 수행한다.
    6. rVal를 반환한다.
  2. assignmentPatternAssignmentPattern으로 하며, 이는 커버(cover)되어야 하며 LeftHandSideExpression에 의해 포함된다.
  3. rRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. DestructuringAssignmentEvaluation of assignmentPattern with argument rVal을 수행한다.
  6. rVal를 반환한다.
AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression
  1. lRef를 ? Evaluation of LeftHandSideExpression의 결과로 한다.
  2. LeftHandSideExpressionAssignmentTargetTypeweb-compat이면 ReferenceError 예외를 throw한다.
  3. lVal를 ? GetValue(lRef)로 한다.
  4. rRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
  5. rVal를 ? GetValue(rRef)로 한다.
  6. assignmentOpText소스 텍스트에서 일치하는 AssignmentOperator의 값으로 한다.
  7. opText를 다음 표에서 assignmentOpText에 해당하는 유니코드 코드 포인트 시퀀스로 한다:
    assignmentOpText opText
    **= **
    *= *
    /= /
    %= %
    += +
    -= -
    <<= <<
    >>= >>
    >>>= >>>
    &= &
    ^= ^
    |= |
  8. r를 ? ApplyStringOrNumericBinaryOperator(lVal, opText, rVal)로 한다.
  9. PutValue(lRef, r)를 수행한다.
  10. r를 반환한다.
AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression
  1. lRef를 ? Evaluation of LeftHandSideExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. ToBoolean(lVal)이 false이면 lVal를 반환한다.
  4. IsAnonymousFunctionDefinition(AssignmentExpression)이 true이고 IsIdentifierRef of LeftHandSideExpressiontrue이면,
    1. lhsStringValue of LeftHandSideExpression로 한다.
    2. rVal를 ? NamedEvaluation of AssignmentExpression with argument lhs로 한다.
  5. 그 외에는,
    1. rRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
    2. rVal를 ? GetValue(rRef)로 한다.
  6. PutValue(lRef, rVal)를 수행한다.
  7. rVal를 반환한다.
AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression
  1. lRef를 ? Evaluation of LeftHandSideExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. ToBoolean(lVal)이 true이면 lVal를 반환한다.
  4. IsAnonymousFunctionDefinition(AssignmentExpression)이 true이고 IsIdentifierRef of LeftHandSideExpressiontrue이면,
    1. lhsStringValue of LeftHandSideExpression로 한다.
    2. rVal를 ? NamedEvaluation of AssignmentExpression with argument lhs로 한다.
  5. 그 외에는,
    1. rRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
    2. rVal를 ? GetValue(rRef)로 한다.
  6. PutValue(lRef, rVal)를 수행한다.
  7. rVal를 반환한다.
AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression
  1. lRef를 ? Evaluation of LeftHandSideExpression의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. lValundefined도 아니고 null도 아니면 lVal를 반환한다.
  4. IsAnonymousFunctionDefinition(AssignmentExpression)이 true이고 IsIdentifierRef of LeftHandSideExpressiontrue이면,
    1. lhsStringValue of LeftHandSideExpression로 한다.
    2. rVal를 ? NamedEvaluation of AssignmentExpression with argument lhs로 한다.
  5. 그 외에는,
    1. rRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
    2. rVal를 ? GetValue(rRef)로 한다.
  6. PutValue(lRef, rVal)를 수행한다.
  7. rVal를 반환한다.
참고

이 표현식이 strict mode 코드 내에 있을 때, 1.e, 3, 2, 2, 2 단계의 lRef가 해결할 수 없는 참조라면 런타임 오류가 발생하며, ReferenceError 예외가 throw된다. 또한 9, 6, 6, 6 단계의 lRef데이터 프로퍼티로서 { [[Writable]]: false } 속성을 갖거나, 접근자 프로퍼티로서 { [[Set]]: undefined } 속성을 갖거나, IsExtensiblefalse를 반환하는 객체의 존재하지 않는 프로퍼티라면 TypeError 예외가 throw된다.

13.15.3 ApplyStringOrNumericBinaryOperator ( lVal, opText, rVal )

추상 연산 ApplyStringOrNumericBinaryOperator는 lVal (ECMAScript 언어 값), opText (**, *, /, %, +, -, <<, >>, >>>, &, ^, 또는 |), rVal (ECMAScript 언어 값)을 인수로 받으며, String, BigInt 또는 Number가 담긴 정상 완료 또는 throw completion를 반환한다. 호출 시 다음 단계를 수행한다:

  1. opText+이면,
    1. lPrim을 ? ToPrimitive(lVal)로 한다.
    2. rPrim을 ? ToPrimitive(rVal)로 한다.
    3. lPrimString이거나 rPrimString이면,
      1. lStr을 ? ToString(lPrim)로 한다.
      2. rStr을 ? ToString(rPrim)로 한다.
      3. lStrrStr문자열 연결(string-concatenation) 결과를 반환한다.
    4. lVallPrim으로 설정한다.
    5. rValrPrim으로 설정한다.
  2. NOTE: 이 시점에서 반드시 숫자 연산이어야 한다.
  3. lNum을 ? ToNumeric(lVal)로 한다.
  4. rNum을 ? ToNumeric(rVal)로 한다.
  5. SameType(lNum, rNum)이 false이면, TypeError 예외를 throw한다.
  6. lNumBigInt이면,
    1. opText**이면, ? BigInt::exponentiate(lNum, rNum)를 반환한다.
    2. opText/이면, ? BigInt::divide(lNum, rNum)를 반환한다.
    3. opText%이면, ? BigInt::remainder(lNum, rNum)를 반환한다.
    4. opText>>>이면, ? BigInt::unsignedRightShift(lNum, rNum)를 반환한다.
    5. operation을 아래 표에서 opText와 연관된 추상 연산으로 한다:
      opText operation
      * BigInt::multiply
      + BigInt::add
      - BigInt::subtract
      << BigInt::leftShift
      >> BigInt::signedRightShift
      & BigInt::bitwiseAND
      ^ BigInt::bitwiseXOR
      | BigInt::bitwiseOR
  7. 그 외에는,
    1. Assert: lNumNumber임을 보장한다.
    2. operation을 아래 표에서 opText와 연관된 추상 연산으로 한다:
      opText operation
      ** Number::exponentiate
      * Number::multiply
      / Number::divide
      % Number::remainder
      + Number::add
      - Number::subtract
      << Number::leftShift
      >> Number::signedRightShift
      >>> Number::unsignedRightShift
      & Number::bitwiseAND
      ^ Number::bitwiseXOR
      | Number::bitwiseOR
  8. operation(lNum, rNum)을 반환한다.
참고 1

단계 ToPrimitive의 호출에는 힌트가 제공되지 않는다(1.a, 1.b). 표준 객체(날짜 객체 제외)는 힌트가 없으면 number가 주어진 것처럼 동작하며, 날짜 객체는 string이 주어진 것처럼 동작한다. Exotic 객체는 힌트가 없을 때 다르게 동작할 수 있다.

참고 2

1.c 단계는 3 단계 및 IsLessThan 알고리즘과 달리 논리합(or) 연산을 사용한다.

13.15.4 EvaluateStringOrNumericBinaryExpression ( leftOperand, opText, rightOperand )

추상 연산 EvaluateStringOrNumericBinaryExpression는 leftOperand (파스 노드(Parse Node)), opText (유니코드 코드 포인트의 시퀀스), rightOperand (파스 노드(Parse Node))를 인수로 받고, String, BigInt, Number가 담긴 정상 완료(normal completion) 또는 비정상 완료(abrupt completion)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. lRef를 ? Evaluation of leftOperand의 결과로 한다.
  2. lVal를 ? GetValue(lRef)로 한다.
  3. rRef를 ? Evaluation of rightOperand의 결과로 한다.
  4. rVal를 ? GetValue(rRef)로 한다.
  5. ApplyStringOrNumericBinaryOperator(lVal, opText, rVal)를 반환한다.

13.15.5 구조 분해 할당

보충 구문

다음의 생성식의 인스턴스 처리를 수행할 때
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression의 해석은 다음 문법을 사용하여 정교화된다:

AssignmentPattern[Yield, Await] : ObjectAssignmentPattern[?Yield, ?Await] ArrayAssignmentPattern[?Yield, ?Await] ObjectAssignmentPattern[Yield, Await] : { } { AssignmentRestProperty[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] , AssignmentRestProperty[?Yield, ?Await]opt } ArrayAssignmentPattern[Yield, Await] : [ Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] [ AssignmentElementList[?Yield, ?Await] ] [ AssignmentElementList[?Yield, ?Await] , Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] AssignmentRestProperty[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] AssignmentPropertyList[Yield, Await] : AssignmentProperty[?Yield, ?Await] AssignmentPropertyList[?Yield, ?Await] , AssignmentProperty[?Yield, ?Await] AssignmentElementList[Yield, Await] : AssignmentElisionElement[?Yield, ?Await] AssignmentElementList[?Yield, ?Await] , AssignmentElisionElement[?Yield, ?Await] AssignmentElisionElement[Yield, Await] : Elisionopt AssignmentElement[?Yield, ?Await] AssignmentProperty[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt PropertyName[?Yield, ?Await] : AssignmentElement[?Yield, ?Await] AssignmentElement[Yield, Await] : DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt AssignmentRestElement[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] DestructuringAssignmentTarget[Yield, Await] : LeftHandSideExpression[?Yield, ?Await]

13.15.5.1 정적 의미론: 초기 에러

AssignmentProperty : IdentifierReference Initializeropt AssignmentRestProperty : ... DestructuringAssignmentTarget DestructuringAssignmentTarget : LeftHandSideExpression

13.15.5.2 런타임 의미론: DestructuringAssignmentEvaluation

구문 지시 연산 DestructuringAssignmentEvaluation은 value (ECMAScript 언어 값)을 인수로 받아, 정상 완료 unused 또는 비정상 완료를 반환한다. 아래 생성식에 대해 조각별로 정의된다:

ObjectAssignmentPattern : { }
  1. RequireObjectCoercible(value)를 수행한다.
  2. unused를 반환한다.
ObjectAssignmentPattern : { AssignmentPropertyList } { AssignmentPropertyList , }
  1. RequireObjectCoercible(value)를 수행한다.
  2. PropertyDestructuringAssignmentEvaluation of AssignmentPropertyListvalue 인수를 넘겨 수행한다.
  3. unused를 반환한다.
ObjectAssignmentPattern : { AssignmentRestProperty }
  1. RequireObjectCoercible(value)를 수행한다.
  2. excludedNames를 비어 있는 새 List로 한다.
  3. RestDestructuringAssignmentEvaluation of AssignmentRestPropertyvalue, excludedNames 인수를 넘겨 수행한 결과를 반환한다.
ObjectAssignmentPattern : { AssignmentPropertyList , AssignmentRestProperty }
  1. RequireObjectCoercible(value)를 수행한다.
  2. excludedNames를 ? PropertyDestructuringAssignmentEvaluation of AssignmentPropertyListvalue 인수를 넘겨 수행한 결과로 한다.
  3. RestDestructuringAssignmentEvaluation of AssignmentRestPropertyvalue, excludedNames 인수를 넘겨 수행한 결과를 반환한다.
ArrayAssignmentPattern : [ ]
  1. iteratorRecord를 ? GetIterator(value, sync)로 한다.
  2. IteratorClose(iteratorRecord, NormalCompletion(unused))를 반환한다.
ArrayAssignmentPattern : [ Elision ]
  1. iteratorRecord를 ? GetIterator(value, sync)로 한다.
  2. resultCompletion(IteratorDestructuringAssignmentEvaluation of ElisioniteratorRecord 인수를 넘겨 수행한 결과)로 한다.
  3. iteratorRecord.[[Done]]false이면, ? IteratorClose(iteratorRecord, result)를 반환한다.
  4. result를 반환한다.
ArrayAssignmentPattern : [ Elisionopt AssignmentRestElement ]
  1. iteratorRecord를 ? GetIterator(value, sync)로 한다.
  2. Elision이 존재하면,
    1. statusCompletion(IteratorDestructuringAssignmentEvaluation of ElisioniteratorRecord 인수를 넘겨 수행한 결과)로 한다.
    2. status비정상 완료라면,
      1. Assert: iteratorRecord.[[Done]]true임을 보장한다.
      2. status를 반환한다.
  3. resultCompletion(IteratorDestructuringAssignmentEvaluation of AssignmentRestElementiteratorRecord 인수를 넘겨 수행한 결과)로 한다.
  4. iteratorRecord.[[Done]]false이면, ? IteratorClose(iteratorRecord, result)를 반환한다.
  5. result를 반환한다.
ArrayAssignmentPattern : [ AssignmentElementList ]
  1. iteratorRecord를 ? GetIterator(value, sync)로 한다.
  2. resultCompletion(IteratorDestructuringAssignmentEvaluation of AssignmentElementListiteratorRecord 인수를 넘겨 수행한 결과)로 한다.
  3. iteratorRecord.[[Done]]false이면, ? IteratorClose(iteratorRecord, result)를 반환한다.
  4. result를 반환한다.
ArrayAssignmentPattern : [ AssignmentElementList , Elisionopt AssignmentRestElementopt ]
  1. iteratorRecord를 ? GetIterator(value, sync)로 한다.
  2. statusCompletion(IteratorDestructuringAssignmentEvaluation of AssignmentElementListiteratorRecord 인수를 넘겨 수행한 결과)로 한다.
  3. status비정상 완료라면,
    1. iteratorRecord.[[Done]]false이면, ? IteratorClose(iteratorRecord, status)를 반환한다.
    2. status를 반환한다.
  4. Elision이 존재하면,
    1. statusCompletion(IteratorDestructuringAssignmentEvaluation of ElisioniteratorRecord 인수를 넘겨 수행한 결과)로 한다.
    2. status비정상 완료라면,
      1. Assert: iteratorRecord.[[Done]]true임을 보장한다.
      2. status를 반환한다.
  5. AssignmentRestElement이 존재하면,
    1. statusCompletion(IteratorDestructuringAssignmentEvaluation of AssignmentRestElementiteratorRecord 인수를 넘겨 수행한 결과)로 한다.
  6. iteratorRecord.[[Done]]false이면, ? IteratorClose(iteratorRecord, status)를 반환한다.
  7. status를 반환한다.

13.15.5.3 런타임 의미론: PropertyDestructuringAssignmentEvaluation

구문 지시 연산 PropertyDestructuringAssignmentEvaluation은 value (ECMAScript 언어 값)을 인수로 받고, 정상 완료(normal completion)List (모든 구조 분해된 프로퍼티 키의 리스트) 또는 비정상 완료(abrupt completion)를 반환한다. 아래 생성식에 대해 조각별로 정의된다:

AssignmentPropertyList : AssignmentPropertyList , AssignmentProperty
  1. propertyNames를 ? PropertyDestructuringAssignmentEvaluation of AssignmentPropertyListvalue 인수를 넘겨 수행한 결과로 한다.
  2. nextNames를 ? PropertyDestructuringAssignmentEvaluation of AssignmentPropertyvalue 인수를 넘겨 수행한 결과로 한다.
  3. propertyNamesnextNames리스트 연결(list-concatenation) 결과를 반환한다.
AssignmentProperty : IdentifierReference Initializeropt
  1. PStringValue of IdentifierReference로 한다.
  2. lRef를 ? ResolveBinding(P)로 한다.
  3. v를 ? GetV(value, P)로 한다.
  4. Initializer가 존재하고 vundefined이면,
    1. IsAnonymousFunctionDefinition(Initializer)이 true이면,
      1. v를 ? NamedEvaluation of InitializerP 인수를 넘겨 수행한 결과로 설정한다.
    2. 그 외에는,
      1. defaultValue를 ? Evaluation of Initializer 결과로 한다.
      2. v를 ? GetValue(defaultValue)로 한다.
  5. PutValue(lRef, v)를 수행한다.
  6. « P »를 반환한다.
AssignmentProperty : PropertyName : AssignmentElement
  1. name을 ? Evaluation of PropertyName로 한다.
  2. KeyedDestructuringAssignmentEvaluation of AssignmentElementvalue, name 인수를 넘겨 수행한다.
  3. « name »를 반환한다.

13.15.5.4 런타임 의미론: RestDestructuringAssignmentEvaluation

구문 지시 연산 RestDestructuringAssignmentEvaluation은 value (ECMAScript 언어 값)과 excludedNames (List 타입의 프로퍼티 키 리스트)를 인수로 받고, 정상 완료(normal completion) unused 또는 비정상 완료(abrupt completion)를 반환한다. 아래 생성식에 대해 조각별로 정의된다:

AssignmentRestProperty : ... DestructuringAssignmentTarget
  1. lRef를 ? Evaluation of DestructuringAssignmentTarget의 결과로 한다.
  2. restObjOrdinaryObjectCreate(%Object.prototype%)로 한다.
  3. CopyDataProperties(restObj, value, excludedNames)를 수행한다.
  4. PutValue(lRef, restObj)를 반환한다.

13.15.5.5 런타임 의미론: IteratorDestructuringAssignmentEvaluation

구문 지시 연산 IteratorDestructuringAssignmentEvaluation은 iteratorRecord (이터레이터 레코드)를 인수로 받고, 정상 완료(normal completion) unused 또는 비정상 완료(abrupt completion)를 반환한다. 아래 생성식에 대해 조각별로 정의된다:

AssignmentElementList : AssignmentElisionElement
  1. IteratorDestructuringAssignmentEvaluation of AssignmentElisionElementiteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
AssignmentElementList : AssignmentElementList , AssignmentElisionElement
  1. IteratorDestructuringAssignmentEvaluation of AssignmentElementListiteratorRecord 인수를 넘겨 수행한다.
  2. IteratorDestructuringAssignmentEvaluation of AssignmentElisionElementiteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
AssignmentElisionElement : AssignmentElement
  1. IteratorDestructuringAssignmentEvaluation of AssignmentElementiteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
AssignmentElisionElement : Elision AssignmentElement
  1. IteratorDestructuringAssignmentEvaluation of ElisioniteratorRecord 인수를 넘겨 수행한다.
  2. IteratorDestructuringAssignmentEvaluation of AssignmentElementiteratorRecord 인수를 넘겨 수행한 결과를 반환한다.
Elision : ,
  1. iteratorRecord.[[Done]]false이면,
    1. IteratorStep(iteratorRecord)를 수행한다.
  2. unused를 반환한다.
Elision : Elision ,
  1. IteratorDestructuringAssignmentEvaluation of ElisioniteratorRecord 인수를 넘겨 수행한다.
  2. iteratorRecord.[[Done]]false이면,
    1. IteratorStep(iteratorRecord)를 수행한다.
  3. unused를 반환한다.
AssignmentElement : DestructuringAssignmentTarget Initializeropt
  1. DestructuringAssignmentTargetObjectLiteral도 아니고 ArrayLiteral도 아니면,
    1. lRef를 ? Evaluation of DestructuringAssignmentTarget의 결과로 한다.
  2. valueundefined로 한다.
  3. iteratorRecord.[[Done]]false이면,
    1. next를 ? IteratorStepValue(iteratorRecord)로 한다.
    2. nextdone이 아니면,
      1. valuenext로 설정한다.
  4. Initializer가 존재하고 valueundefined이면,
    1. IsAnonymousFunctionDefinition(Initializer)이 true이고 IsIdentifierRef of DestructuringAssignmentTargettrue이면,
      1. targetStringValue of DestructuringAssignmentTarget로 한다.
      2. v를 ? NamedEvaluation of Initializertarget 인수를 넘겨 수행한 결과로 설정한다.
    2. 그 외에는,
      1. defaultValue를 ? Evaluation of Initializer 결과로 한다.
      2. v를 ? GetValue(defaultValue)로 설정한다.
  5. 그 외에는,
    1. vvalue로 한다.
  6. DestructuringAssignmentTargetObjectLiteral 또는 ArrayLiteral인 경우,
    1. nestedAssignmentPatternAssignmentPattern으로 한다. 이는 커버(cover)되어야 하며 DestructuringAssignmentTarget에 의해 포함된다.
    2. DestructuringAssignmentEvaluation of nestedAssignmentPatternv 인수를 넘겨 수행한 결과를 반환한다.
  7. PutValue(lRef, v)를 반환한다.
참고

왼쪽에서 오른쪽으로의 평가 순서는 구조 분해 패턴이 아닌 DestructuringAssignmentTarget을 이터레이터에 접근하거나 Initializer를 평가하기 전에 평가함으로써 유지된다.

AssignmentRestElement : ... DestructuringAssignmentTarget
  1. DestructuringAssignmentTargetObjectLiteral도 아니고 ArrayLiteral도 아니면,
    1. lRef를 ? Evaluation of DestructuringAssignmentTarget의 결과로 한다.
  2. A를 ! ArrayCreate(0)으로 한다.
  3. n을 0으로 한다.
  4. iteratorRecord.[[Done]]false인 동안 반복한다,
    1. next를 ? IteratorStepValue(iteratorRecord)로 한다.
    2. nextdone이 아니면,
      1. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), next)를 수행한다.
      2. nn + 1로 설정한다.
  5. DestructuringAssignmentTargetObjectLiteral도 아니고 ArrayLiteral도 아니면,
    1. PutValue(lRef, A)를 반환한다.
  6. nestedAssignmentPatternAssignmentPattern으로 하고, 이는 커버(cover)되어야 하며 DestructuringAssignmentTarget에 의해 포함된다.
  7. DestructuringAssignmentEvaluation of nestedAssignmentPatternA 인수를 넘겨 수행한 결과를 반환한다.

13.15.5.6 런타임 의미론: KeyedDestructuringAssignmentEvaluation

구문 지시 연산 KeyedDestructuringAssignmentEvaluation은 value (ECMAScript 언어 값)과 propertyName (프로퍼티 키)를 인수로 받고, 정상 완료(normal completion) unused 또는 비정상 완료(abrupt completion)를 반환한다. 아래 생성식에 대해 조각별로 정의된다:

AssignmentElement : DestructuringAssignmentTarget Initializeropt
  1. DestructuringAssignmentTargetObjectLiteral도 아니고 ArrayLiteral도 아니면,
    1. lRef를 ? Evaluation of DestructuringAssignmentTarget의 결과로 한다.
  2. v를 ? GetV(value, propertyName)로 한다.
  3. Initializer가 존재하고 vundefined이면,
    1. IsAnonymousFunctionDefinition(Initializer)이 true이고 IsIdentifierRef of DestructuringAssignmentTargettrue이면,
      1. targetStringValue of DestructuringAssignmentTarget로 한다.
      2. rhsValue를 ? NamedEvaluation of Initializertarget 인수를 넘겨 수행한 결과로 한다.
    2. 그 외에는,
      1. defaultValue를 ? Evaluation of Initializer 결과로 한다.
      2. rhsValue를 ? GetValue(defaultValue)로 한다.
  4. 그 외에는,
    1. rhsValuev로 한다.
  5. DestructuringAssignmentTargetObjectLiteral 또는 ArrayLiteral인 경우,
    1. assignmentPatternAssignmentPattern으로 한다. 이는 커버(cover)되어야 하며 DestructuringAssignmentTarget에 의해 포함된다.
    2. DestructuringAssignmentEvaluation of assignmentPatternrhsValue 인수를 넘겨 수행한 결과를 반환한다.
  6. PutValue(lRef, rhsValue)를 반환한다.

13.16 콤마 연산자 ( , )

구문

Expression[In, Yield, Await] : AssignmentExpression[?In, ?Yield, ?Await] Expression[?In, ?Yield, ?Await] , AssignmentExpression[?In, ?Yield, ?Await]

13.16.1 런타임 의미론: 평가

Expression : Expression , AssignmentExpression
  1. lRef를 ? Evaluation of Expression의 결과로 한다.
  2. GetValue(lRef)를 수행한다.
  3. rRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
  4. GetValue(rRef)를 반환한다.
참고

GetValue 는 값이 사용되지 않더라도 관측 가능한 부수 효과가 있을 수 있으므로 반드시 호출되어야 한다.

14 ECMAScript 언어: 문과 선언

구문

Statement[Yield, Await, Return] : BlockStatement[?Yield, ?Await, ?Return] VariableStatement[?Yield, ?Await] EmptyStatement ExpressionStatement[?Yield, ?Await] IfStatement[?Yield, ?Await, ?Return] BreakableStatement[?Yield, ?Await, ?Return] ContinueStatement[?Yield, ?Await] BreakStatement[?Yield, ?Await] [+Return] ReturnStatement[?Yield, ?Await] WithStatement[?Yield, ?Await, ?Return] LabelledStatement[?Yield, ?Await, ?Return] ThrowStatement[?Yield, ?Await] TryStatement[?Yield, ?Await, ?Return] DebuggerStatement Declaration[Yield, Await] : HoistableDeclaration[?Yield, ?Await, ~Default] ClassDeclaration[?Yield, ?Await, ~Default] LexicalDeclaration[+In, ?Yield, ?Await] HoistableDeclaration[Yield, Await, Default] : FunctionDeclaration[?Yield, ?Await, ?Default] GeneratorDeclaration[?Yield, ?Await, ?Default] AsyncFunctionDeclaration[?Yield, ?Await, ?Default] AsyncGeneratorDeclaration[?Yield, ?Await, ?Default] BreakableStatement[Yield, Await, Return] : IterationStatement[?Yield, ?Await, ?Return] SwitchStatement[?Yield, ?Await, ?Return]

14.1 문 의미론

14.1.1 런타임 의미론: 평가

HoistableDeclaration : GeneratorDeclaration AsyncFunctionDeclaration AsyncGeneratorDeclaration
  1. empty를 반환한다.
HoistableDeclaration : FunctionDeclaration
  1. Evaluation of FunctionDeclaration의 결과를 반환한다.
BreakableStatement : IterationStatement SwitchStatement
  1. newLabelSet을 비어 있는 새 List로 한다.
  2. LabelledEvaluation of this BreakableStatementnewLabelSet 인수를 넘겨 수행한 결과를 반환한다.

14.2 블록

구문

BlockStatement[Yield, Await, Return] : Block[?Yield, ?Await, ?Return] Block[Yield, Await, Return] : { StatementList[?Yield, ?Await, ?Return]opt } StatementList[Yield, Await, Return] : StatementListItem[?Yield, ?Await, ?Return] StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return] StatementListItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] Declaration[?Yield, ?Await]

14.2.1 정적 의미론: 초기 에러

Block : { StatementList }

14.2.2 런타임 의미론: 평가

Block : { }
  1. empty를 반환한다.
Block : { StatementList }
  1. oldEnv실행 중인 실행 컨텍스트(running execution context)의 LexicalEnvironment로 한다.
  2. blockEnvNewDeclarativeEnvironment(oldEnv)로 한다.
  3. BlockDeclarationInstantiation(StatementList, blockEnv)를 수행한다.
  4. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 blockEnv로 설정한다.
  5. blockValueCompletion(Evaluation of StatementList)의 결과로 한다.
  6. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정한다.
  7. blockValue를 반환한다.
참고 1

어떤 방식으로 Block에서 벗어나더라도 LexicalEnvironment는 항상 이전 상태로 복원된다.

StatementList : StatementList StatementListItem
  1. sl을 ? Evaluation of StatementList의 결과로 한다.
  2. sCompletion(Evaluation of StatementListItem)의 결과로 한다.
  3. UpdateEmpty(s, sl)를 반환한다.
참고 2

StatementList의 값은 StatementList 내 마지막 값 생성 항목의 값이다. 예를 들어, 다음 eval 함수 호출은 모두 1을 반환한다:

eval("1;;;;;")
eval("1;{}")
eval("1;var a;")

14.2.3 BlockDeclarationInstantiation ( code, env )

추상 연산 BlockDeclarationInstantiation은 code (파스 노드(Parse Node))와 env (선언적 환경 레코드(Declarative Environment Record))를 인수로 받고 unused를 반환한다. code는 블록의 본문에 해당하는 파스 노드(Parse Node)이다. env는 바인딩이 생성될 환경 레코드(Environment Record)이다.

참고

Block 또는 CaseBlock이 평가될 때, 새로운 선언적 환경 레코드가 생성되고, 블록 내 선언된 각 블록 범위 변수, 상수, 함수, 클래스에 대한 바인딩이 환경 레코드에 인스턴스화된다.

호출 시 다음 단계를 수행한다:

  1. declarationsLexicallyScopedDeclarations of code로 한다.
  2. privateEnv실행 중인 실행 컨텍스트(running execution context)의 PrivateEnvironment로 한다.
  3. declarations의 각 요소 d에 대해, 다음을 수행한다:
    1. BoundNames of d의 각 요소 dn에 대해, 다음을 수행한다:
      1. IsConstantDeclaration of dtrue이면,
        1. env.CreateImmutableBinding(dn, true)을 수행한다.
      2. 그 외에는,
        1. env.CreateMutableBinding(dn, false)을 수행한다. 참고: 이 단계는 B.3.2.6 절에서 대체된다.
    2. dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration 중 하나라면, 다음을 수행한다:
      1. fnBoundNames of d의 유일한 요소로 한다.
      2. foInstantiateFunctionObject of denvprivateEnv 인수를 넘겨 수행한 결과로 한다.
      3. env.InitializeBinding(fn, fo)를 수행한다. 참고: 이 단계는 B.3.2.6 절에서 대체된다.
  4. unused를 반환한다.

14.3 선언과 변수 문

14.3.1 let 및 const 선언

참고

letconst 선언은 실행 중인 실행 컨텍스트(running execution context)의 LexicalEnvironment에 스코프를 갖는 변수를 정의한다. 이 변수들은 해당 환경 레코드(Environment Record)가 인스턴스화될 때 생성되지만, 변수의 LexicalBinding이 평가되기 전까지는 어떠한 방식으로든 접근할 수 없다. LexicalBindingInitializer를 포함하는 경우, 해당 변수는 InitializerAssignmentExpressionLexicalBinding이 평가될 때 값을 할당받으며, 변수 생성 시 할당받지 않는다. let 선언 내의 LexicalBindingInitializer가 없는 경우, 해당 변수는 LexicalBinding이 평가될 때 undefined가 할당된다.

구문

LexicalDeclaration[In, Yield, Await] : LetOrConst BindingList[?In, ?Yield, ?Await] ; LetOrConst : let const BindingList[In, Yield, Await] : LexicalBinding[?In, ?Yield, ?Await] BindingList[?In, ?Yield, ?Await] , LexicalBinding[?In, ?Yield, ?Await] LexicalBinding[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]

14.3.1.1 정적 의미론: 초기 에러

LexicalDeclaration : LetOrConst BindingList ; LexicalBinding : BindingIdentifier Initializeropt

14.3.1.2 런타임 의미론: 평가

LexicalDeclaration : LetOrConst BindingList ;
  1. Evaluation of BindingList를 수행한다.
  2. empty를 반환한다.
BindingList : BindingList , LexicalBinding
  1. Evaluation of BindingList를 수행한다.
  2. Evaluation of LexicalBinding을 반환한다.
LexicalBinding : BindingIdentifier
  1. lhs를 ! ResolveBinding(StringValue of BindingIdentifier)로 한다.
  2. InitializeReferencedBinding(lhs, undefined)를 수행한다.
  3. empty를 반환한다.
참고

정적 의미론 규칙에 의해 이 형태의 LexicalBindingconst 선언에 등장하는 일은 없다.

LexicalBinding : BindingIdentifier Initializer
  1. bindingIdStringValue of BindingIdentifier로 한다.
  2. lhs를 ! ResolveBinding(bindingId)로 한다.
  3. IsAnonymousFunctionDefinition(Initializer)이 true이면,
    1. value를 ? NamedEvaluation of InitializerbindingId 인수를 넘겨 수행한 결과로 한다.
  4. 그 외에는,
    1. rhs를 ? Evaluation of Initializer의 결과로 한다.
    2. value를 ? GetValue(rhs)로 한다.
  5. InitializeReferencedBinding(lhs, value)를 수행한다.
  6. empty를 반환한다.
LexicalBinding : BindingPattern Initializer
  1. rhs를 ? Evaluation of Initializer의 결과로 한다.
  2. value를 ? GetValue(rhs)로 한다.
  3. env실행 중인 실행 컨텍스트(running execution context)의 LexicalEnvironment로 한다.
  4. BindingInitialization of BindingPatternvalueenv를 인수로 넘겨 수행한 결과를 반환한다.

14.3.2 변수 문

참고

var 문은 실행 중인 실행 컨텍스트(running execution context)의 VariableEnvironment에 스코프를 갖는 변수를 선언한다. var 변수는 해당 환경 레코드(Environment Record)가 인스턴스화될 때 생성되고, 생성 시 undefined로 초기화된다. 어떤 VariableEnvironment의 스코프 내에서는 동일한 BindingIdentifier가 둘 이상의 VariableDeclaration에 나타날 수 있으나, 이 선언들은 모여 하나의 변수만 정의한다. VariableDeclarationInitializer를 포함하는 경우, 해당 변수는 InitializerAssignmentExpressionVariableDeclaration이 실행될 때 값을 할당받으며, 변수 생성 시 할당받지 않는다.

구문

VariableStatement[Yield, Await] : var VariableDeclarationList[+In, ?Yield, ?Await] ; VariableDeclarationList[In, Yield, Await] : VariableDeclaration[?In, ?Yield, ?Await] VariableDeclarationList[?In, ?Yield, ?Await] , VariableDeclaration[?In, ?Yield, ?Await] VariableDeclaration[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]

14.3.2.1 런타임 의미론: 평가

VariableStatement : var VariableDeclarationList ;
  1. Evaluation of VariableDeclarationList를 수행한다.
  2. empty를 반환한다.
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
  1. Evaluation of VariableDeclarationList를 수행한다.
  2. Evaluation of VariableDeclaration을 반환한다.
VariableDeclaration : BindingIdentifier
  1. empty를 반환한다.
VariableDeclaration : BindingIdentifier Initializer
  1. bindingIdStringValue of BindingIdentifier로 한다.
  2. lhs를 ? ResolveBinding(bindingId)로 한다.
  3. IsAnonymousFunctionDefinition(Initializer)가 true이면,
    1. value를 ? NamedEvaluation of InitializerbindingId 인수를 넘겨 수행한 결과로 한다.
  4. 그 외에는,
    1. rhs를 ? Evaluation of Initializer의 결과로 한다.
    2. value를 ? GetValue(rhs)로 한다.
  5. PutValue(lhs, value)를 수행한다.
  6. empty를 반환한다.
참고

VariableDeclaration이 with 문 내부에 중첩되어 있고 해당 BindingIdentifier가 with 문의 바인딩 객체의 프로퍼티 이름(property name)과 같으면, 5 단계는 VariableEnvironment 바인딩 대신 프로퍼티에 value를 할당한다.

VariableDeclaration : BindingPattern Initializer
  1. rhs를 ? Evaluation of Initializer의 결과로 한다.
  2. rVal을 ? GetValue(rhs)로 한다.
  3. BindingInitialization of BindingPatternrValundefined를 인수로 넘겨 수행한 결과를 반환한다.

14.3.3 구조 분해 바인딩 패턴

구문

BindingPattern[Yield, Await] : ObjectBindingPattern[?Yield, ?Await] ArrayBindingPattern[?Yield, ?Await] ObjectBindingPattern[Yield, Await] : { } { BindingRestProperty[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] , BindingRestProperty[?Yield, ?Await]opt } ArrayBindingPattern[Yield, Await] : [ Elisionopt BindingRestElement[?Yield, ?Await]opt ] [ BindingElementList[?Yield, ?Await] ] [ BindingElementList[?Yield, ?Await] , Elisionopt BindingRestElement[?Yield, ?Await]opt ] BindingRestProperty[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] BindingPropertyList[Yield, Await] : BindingProperty[?Yield, ?Await] BindingPropertyList[?Yield, ?Await] , BindingProperty[?Yield, ?Await] BindingElementList[Yield, Await] : BindingElisionElement[?Yield, ?Await] BindingElementList[?Yield, ?Await] , BindingElisionElement[?Yield, ?Await] BindingElisionElement[Yield, Await] : Elisionopt BindingElement[?Yield, ?Await] BindingProperty[Yield, Await] : SingleNameBinding[?Yield, ?Await] PropertyName[?Yield, ?Await] : BindingElement[?Yield, ?Await] BindingElement[Yield, Await] : SingleNameBinding[?Yield, ?Await] BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt SingleNameBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt BindingRestElement[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] ... BindingPattern[?Yield, ?Await]

14.3.3.1 런타임 의미론: PropertyBindingInitialization

구문 지시 연산 PropertyBindingInitialization은 value (ECMAScript 언어 값)과 environment (환경 레코드(Environment Record) 또는 undefined)를 인수로 받고, 정상 완료(normal completion)List (모든 바인딩된 프로퍼티 키의 리스트) 또는 비정상 완료(abrupt completion)를 반환한다. 모든 바인딩된 프로퍼티 이름의 리스트를 수집한다. 다음 생성식에 대해 조각별로 정의된다:

BindingPropertyList : BindingPropertyList , BindingProperty
  1. boundNames를 ? PropertyBindingInitialization of BindingPropertyListvalueenvironment를 인수로 넘겨 수행한 결과로 한다.
  2. nextNames를 ? PropertyBindingInitialization of BindingPropertyvalueenvironment를 인수로 넘겨 수행한 결과로 한다.
  3. boundNamesnextNames리스트 연결(list-concatenation) 결과를 반환한다.
BindingProperty : SingleNameBinding
  1. nameBoundNames of SingleNameBinding의 유일한 요소로 한다.
  2. KeyedBindingInitialization of SingleNameBindingvalue, environment, name을 인수로 넘겨 수행한다.
  3. « name »를 반환한다.
BindingProperty : PropertyName : BindingElement
  1. P를 ? Evaluation of PropertyName의 결과로 한다.
  2. KeyedBindingInitialization of BindingElementvalue, environment, P를 인수로 넘겨 수행한다.
  3. « P »를 반환한다.

14.3.3.2 런타임 의미론: RestBindingInitialization

구문 지시 연산 RestBindingInitialization은 value (ECMAScript 언어 값), environment (환경 레코드(Environment Record) 또는 undefined), excludedNames (List 타입의 프로퍼티 키 리스트)를 인수로 받고, 정상 완료(normal completion) unused 또는 비정상 완료(abrupt completion)를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

BindingRestProperty : ... BindingIdentifier
  1. lhs를 ? ResolveBinding(StringValue of BindingIdentifier, environment)로 한다.
  2. restObjOrdinaryObjectCreate(%Object.prototype%)로 한다.
  3. CopyDataProperties(restObj, value, excludedNames)를 수행한다.
  4. environmentundefined이면, ? PutValue(lhs, restObj)를 반환한다.
  5. InitializeReferencedBinding(lhs, restObj)를 반환한다.

14.3.3.3 런타임 의미론: KeyedBindingInitialization

구문 지시 연산 KeyedBindingInitialization은 value (ECMAScript 언어 값), environment (환경 레코드(Environment Record) 또는 undefined), propertyName (프로퍼티 키)를 인수로 받고, 정상 완료(normal completion) unused 또는 비정상 완료(abrupt completion)를 반환한다.

참고

environmentundefined가 전달되는 경우, 초기화 값을 할당하기 위해 PutValue 연산을 사용해야 함을 나타낸다. 이는 비엄격 함수(non-strict functions)의 형식적 매개변수 리스트의 경우이다. 이런 경우, 동일한 이름의 여러 매개변수가 있을 수 있으므로 형식적 매개변수 바인딩이 미리 초기화된다.

다음 생성식에 대해 조각별로 정의된다:

BindingElement : BindingPattern Initializeropt
  1. v를 ? GetV(value, propertyName)로 한다.
  2. Initializer가 존재하고 vundefined이면,
    1. defaultValue를 ? Evaluation of Initializer의 결과로 한다.
    2. v를 ? GetValue(defaultValue)로 설정한다.
  3. BindingInitialization of BindingPatternvenvironment를 인수로 넘겨 수행한 결과를 반환한다.
SingleNameBinding : BindingIdentifier Initializeropt
  1. bindingIdStringValue of BindingIdentifier로 한다.
  2. lhs를 ? ResolveBinding(bindingId, environment)로 한다.
  3. v를 ? GetV(value, propertyName)로 한다.
  4. Initializer가 존재하고 vundefined이면,
    1. IsAnonymousFunctionDefinition(Initializer)가 true이면,
      1. v를 ? NamedEvaluation of InitializerbindingId 인수를 넘겨 수행한 결과로 설정한다.
    2. 그 외에는,
      1. defaultValue를 ? Evaluation of Initializer의 결과로 한다.
      2. v를 ? GetValue(defaultValue)로 설정한다.
  5. environmentundefined이면, ? PutValue(lhs, v)를 반환한다.
  6. InitializeReferencedBinding(lhs, v)를 반환한다.

14.4 빈 문

구문

EmptyStatement : ;

14.4.1 런타임 의미론: 평가

EmptyStatement : ;
  1. empty를 반환한다.

14.5 표현식 문

구문

ExpressionStatement[Yield, Await] : [lookahead ∉ { {, function, async [no LineTerminator here] function, class, let [ }] Expression[+In, ?Yield, ?Await] ; 참고

ExpressionStatement는 U+007B(LEFT CURLY BRACKET)로 시작할 수 없다. 왜냐하면 이는 Block과 혼동될 수 있기 때문이다. ExpressionStatementfunction 또는 class 키워드로 시작할 수 없는데, 이는 FunctionDeclaration, GeneratorDeclaration, 또는 ClassDeclaration과 혼동될 수 있기 때문이다. ExpressionStatementasync function으로 시작할 수 없는데, 이는 AsyncFunctionDeclaration 또는 AsyncGeneratorDeclaration과 혼동될 수 있기 때문이다. ExpressionStatementlet [의 두 토큰 시퀀스로 시작할 수 없는데, 이는 LexicalDeclaration의 첫 LexicalBindingArrayBindingPatternlet 선언과 혼동될 수 있기 때문이다.

14.5.1 런타임 의미론: 평가

ExpressionStatement : Expression ;
  1. exprRef를 ? Evaluation of Expression의 결과로 한다.
  2. GetValue(exprRef)를 반환한다.

14.6 if

구문

IfStatement[Yield, Await, Return] : if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] else Statement[?Yield, ?Await, ?Return] if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [lookahead ≠ else] 참고
lookahead 제한 [lookahead ≠ else]는 고전적인 "dangling else" 문제를 일반적인 방식으로 해결한다. 즉, 연관된 if의 선택이 모호할 경우, else는 후보 if들 중 가장 가까운(가장 안쪽의) 것과 연관된다.

14.6.1 정적 의미론: 초기 에러

IfStatement : if ( Expression ) Statement else Statement IfStatement : if ( Expression ) Statement 참고

이 규칙은 B.3.1에 명시된 확장이 구현된 경우에만 적용해야 한다.

14.6.2 런타임 의미론: 평가

IfStatement : if ( Expression ) Statement else Statement
  1. exprRef를 ? Evaluation of Expression의 결과로 한다.
  2. exprValueToBoolean(? GetValue(exprRef))의 결과로 한다.
  3. exprValuetrue이면,
    1. stmtCompletionCompletion(Evaluation of 첫 번째 Statement)의 결과로 한다.
  4. 그 외에는,
    1. stmtCompletionCompletion(Evaluation of 두 번째 Statement)의 결과로 한다.
  5. UpdateEmpty(stmtCompletion, undefined)를 반환한다.
IfStatement : if ( Expression ) Statement
  1. exprRef를 ? Evaluation of Expression의 결과로 한다.
  2. exprValueToBoolean(? GetValue(exprRef))의 결과로 한다.
  3. exprValuefalse이면,
    1. undefined를 반환한다.
  4. 그 외에는,
    1. stmtCompletionCompletion(Evaluation of Statement)의 결과로 한다.
    2. UpdateEmpty(stmtCompletion, undefined)를 반환한다.

14.7 반복문

구문

IterationStatement[Yield, Await, Return] : DoWhileStatement[?Yield, ?Await, ?Return] WhileStatement[?Yield, ?Await, ?Return] ForStatement[?Yield, ?Await, ?Return] ForInOfStatement[?Yield, ?Await, ?Return]

14.7.1 의미론

14.7.1.1 LoopContinues ( completion, labelSet )

추상 연산 LoopContinues는 completion (Completion Record) 와 labelSet (문자열 리스트(List of Strings))를 인수로 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. completionnormal completion이면 true를 반환한다.
  2. completioncontinue completion이 아니면 false를 반환한다.
  3. completion.[[Target]]empty이면 true를 반환한다.
  4. labelSetcompletion.[[Target]]을 포함하면 true를 반환한다.
  5. false를 반환한다.
참고

Statement 부분의 IterationStatement 내부에서는 ContinueStatement 를 사용하여 새로운 반복을 시작할 수 있다.

14.7.1.2 런타임 의미론: LoopEvaluation

구문 지시 연산 LoopEvaluation은 labelSet (문자열 리스트(List of Strings))를 인수로 받고, 정상 완료(normal completion)ECMAScript 언어 값 또는 비정상 완료(abrupt completion)를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

IterationStatement : DoWhileStatement
  1. DoWhileLoopEvaluation of DoWhileStatementlabelSet 인수를 넘겨 수행한 결과를 반환한다.
IterationStatement : WhileStatement
  1. WhileLoopEvaluation of WhileStatementlabelSet 인수를 넘겨 수행한 결과를 반환한다.
IterationStatement : ForStatement
  1. ForLoopEvaluation of ForStatementlabelSet 인수를 넘겨 수행한 결과를 반환한다.
IterationStatement : ForInOfStatement
  1. ForInOfLoopEvaluation of ForInOfStatementlabelSet 인수를 넘겨 수행한 결과를 반환한다.

14.7.2 do-while

구문

DoWhileStatement[Yield, Await, Return] : do Statement[?Yield, ?Await, ?Return] while ( Expression[+In, ?Yield, ?Await] ) ;

14.7.2.1 정적 의미론: 초기 에러

DoWhileStatement : do Statement while ( Expression ) ; 참고

이 규칙은 B.3.1에 명시된 확장이 구현된 경우에만 적용된다.

14.7.2.2 런타임 의미론: DoWhileLoopEvaluation

구문 지시 연산 DoWhileLoopEvaluation은 labelSet (문자열 리스트(List of Strings))를 인수로 받고, 정상 완료(normal completion)ECMAScript 언어 값 또는 비정상 완료(abrupt completion)를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

DoWhileStatement : do Statement while ( Expression ) ;
  1. Vundefined로 한다.
  2. 반복한다,
    1. stmtResultCompletion(Evaluation of Statement)의 결과로 한다.
    2. LoopContinues(stmtResult, labelSet)가 false이면, ? UpdateEmpty(stmtResult, V)를 반환한다.
    3. stmtResult.[[Value]]empty가 아니면, VstmtResult.[[Value]]를 설정한다.
    4. exprRef를 ? Evaluation of Expression의 결과로 한다.
    5. exprValue를 ? GetValue(exprRef)의 결과로 한다.
    6. ToBoolean(exprValue) 가 false이면 V를 반환한다.

14.7.3 while

구문

WhileStatement[Yield, Await, Return] : while ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return]

14.7.3.1 정적 의미론: 초기 에러

WhileStatement : while ( Expression ) Statement 참고

이 규칙은 B.3.1에 명시된 확장이 구현된 경우에만 적용한다.

14.7.3.2 런타임 의미론: WhileLoopEvaluation

구문 지시 연산 WhileLoopEvaluation은 labelSet (문자열 리스트(List of Strings))를 인수로 받고, 정상 완료(normal completion)ECMAScript 언어 값 또는 비정상 완료(abrupt completion)를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

WhileStatement : while ( Expression ) Statement
  1. Vundefined로 한다.
  2. 반복한다,
    1. exprRef를 ? Evaluation of Expression의 결과로 한다.
    2. exprValue를 ? GetValue(exprRef)의 결과로 한다.
    3. ToBoolean(exprValue) 가 false이면 V를 반환한다.
    4. stmtResultCompletion(Evaluation of Statement)의 결과로 한다.
    5. LoopContinues(stmtResult, labelSet)가 false이면, ? UpdateEmpty(stmtResult, V)를 반환한다.
    6. stmtResult.[[Value]]empty가 아니면, VstmtResult.[[Value]]를 설정한다.

14.7.4 for

구문

ForStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] Expression[~In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( var VariableDeclarationList[~In, ?Yield, ?Await] ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( LexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return]

14.7.4.1 정적 의미론: 초기 에러

ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement 참고

이 규칙은 B.3.1에 명시된 확장이 구현된 경우에만 적용된다.

ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement

14.7.4.2 런타임 의미론: ForLoopEvaluation

구문 지시 연산 ForLoopEvaluation은 labelSet (문자열 리스트(List of Strings))를 인수로 받고, 정상 완료(normal completion)ECMAScript 언어 값 또는 비정상 완료(abrupt completion)를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. 첫 번째 Expression이 존재하면,
    1. exprRef를 ? Evaluation of 첫 번째 Expression의 결과로 한다.
    2. GetValue(exprRef)를 수행한다.
  2. 두 번째 Expression이 존재하면 test를 두 번째 Expression로, 아니면 testempty로 한다.
  3. 세 번째 Expression이 존재하면 increment를 세 번째 Expression로, 아니면 incrementempty로 한다.
  4. ForBodyEvaluation(test, increment, Statement, « », labelSet)을 반환한다.
ForStatement : for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
  1. Evaluation of VariableDeclarationList를 수행한다.
  2. 첫 번째 Expression이 존재하면 test를 첫 번째 Expression로, 아니면 testempty로 한다.
  3. 두 번째 Expression이 존재하면 increment를 두 번째 Expression로, 아니면 incrementempty로 한다.
  4. ForBodyEvaluation(test, increment, Statement, « », labelSet)을 반환한다.
ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. oldEnv실행 중인 실행 컨텍스트(running execution context)의 LexicalEnvironment로 한다.
  2. loopEnvNewDeclarativeEnvironment(oldEnv)로 한다.
  3. isConstIsConstantDeclaration of LexicalDeclaration의 결과로 한다.
  4. boundNamesBoundNames of LexicalDeclaration의 결과로 한다.
  5. boundNames의 각 요소 dn에 대해, 다음을 수행한다:
    1. isConsttrue이면,
      1. loopEnv.CreateImmutableBinding(dn, true)을 수행한다.
    2. 그 외에는,
      1. loopEnv.CreateMutableBinding(dn, false)을 수행한다.
  6. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 loopEnv로 설정한다.
  7. forDclCompletion(Evaluation of LexicalDeclaration)의 결과로 한다.
  8. forDcl비정상 완료(abrupt completion)이면,
    1. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정한다.
    2. forDcl을 반환한다.
  9. isConstfalse이면 perIterationLetsboundNames로, 아니면 perIterationLets를 비어 있는 List로 한다.
  10. 첫 번째 Expression이 존재하면 test를 첫 번째 Expression로, 아니면 testempty로 한다.
  11. 두 번째 Expression이 존재하면 increment를 두 번째 Expression로, 아니면 incrementempty로 한다.
  12. bodyResultCompletion(ForBodyEvaluation(test, increment, Statement, perIterationLets, labelSet))의 결과로 한다.
  13. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정한다.
  14. bodyResult를 반환한다.

14.7.4.3 ForBodyEvaluation ( test, increment, stmt, perIterationBindings, labelSet )

추상 연산 ForBodyEvaluation은 test (Expression 파스 노드(Parse Node) 또는 empty), increment (Expression 파스 노드(Parse Node) 또는 empty), stmt (Statement 파스 노드(Parse Node)), perIterationBindings (문자열 리스트(List of Strings)), labelSet (문자열 리스트(List of Strings))를 인수로 받고, 정상 완료(normal completion)ECMAScript 언어 값 또는 비정상 완료(abrupt completion)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Vundefined로 한다.
  2. CreatePerIterationEnvironment(perIterationBindings)를 수행한다.
  3. 반복한다,
    1. testempty가 아니면,
      1. testRef를 ? Evaluation of test의 결과로 한다.
      2. testValue를 ? GetValue(testRef)의 결과로 한다.
      3. ToBoolean(testValue) 가 false이면 V를 반환한다.
    2. resultCompletion(Evaluation of stmt)의 결과로 한다.
    3. LoopContinues(result, labelSet)가 false이면, ? UpdateEmpty(result, V)를 반환한다.
    4. result.[[Value]]empty가 아니면, Vresult.[[Value]]를 설정한다.
    5. CreatePerIterationEnvironment(perIterationBindings)를 수행한다.
    6. incrementempty가 아니면,
      1. incRef를 ? Evaluation of increment의 결과로 한다.
      2. GetValue(incRef)를 수행한다.

14.7.4.4 CreatePerIterationEnvironment ( perIterationBindings )

추상 연산 CreatePerIterationEnvironment는 perIterationBindings (문자열 리스트(List of Strings))를 인수로 받고, 정상 완료(normal completion) unused 또는 throw completion를 반환한다. 호출 시 다음 단계를 수행한다:

  1. perIterationBindings에 요소가 하나라도 있으면,
    1. lastIterationEnv실행 중인 실행 컨텍스트(running execution context)의 LexicalEnvironment로 한다.
    2. outerlastIterationEnv.[[OuterEnv]]로 한다.
    3. Assert: outernull이 아니다.
    4. thisIterationEnvNewDeclarativeEnvironment(outer)로 한다.
    5. perIterationBindings의 각 요소 bn에 대해, 다음을 수행한다:
      1. thisIterationEnv.CreateMutableBinding(bn, false)를 수행한다.
      2. lastValue를 ? lastIterationEnv.GetBindingValue(bn, true)로 한다.
      3. thisIterationEnv.InitializeBinding(bn, lastValue)를 수행한다.
    6. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 thisIterationEnv로 설정한다.
  2. unused를 반환한다.

14.7.5 for-in, for-of, 그리고 for-await-of

구문

ForInOfStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] LeftHandSideExpression[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( [lookahead ∉ { let, async of }] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( [lookahead ≠ let] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] ForDeclaration[Yield, Await] : LetOrConst ForBinding[?Yield, ?Await] ForBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] 참고

이 절은 부록 B.3.5에 의해 확장된다.

14.7.5.1 정적 의미론: 초기 에러

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement 참고

이 규칙은 B.3.1에 명시된 확장이 구현된 경우에만 적용된다.

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement ForInOfStatement : for ( ForDeclaration in Expression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement

14.7.5.2 정적 의미론: IsDestructuring

구문 지시 연산 IsDestructuring은 인수를 받지 않으며 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:

MemberExpression : PrimaryExpression
  1. PrimaryExpressionObjectLiteral 또는 ArrayLiteral인 경우, true를 반환한다.
  2. false를 반환한다.
MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName MemberExpression TemplateLiteral SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier NewExpression : new NewExpression LeftHandSideExpression : CallExpression OptionalExpression
  1. false를 반환한다.
ForDeclaration : LetOrConst ForBinding
  1. IsDestructuring of ForBinding의 결과를 반환한다.
ForBinding : BindingIdentifier
  1. false를 반환한다.
ForBinding : BindingPattern
  1. true를 반환한다.
참고

이 절은 부록 B.3.5에 의해 확장된다.

14.7.5.3 런타임 의미론: ForDeclarationBindingInitialization

구문 지시 연산 ForDeclarationBindingInitialization은 value (ECMAScript 언어 값)과 environment (환경 레코드(Environment Record) 또는 undefined)를 인수로 받고, 정상 완료(normal completion) unused 또는 비정상 완료(abrupt completion)를 반환한다.

참고

environmentundefined가 전달되면, 초기화 값을 할당하기 위해 PutValue 연산을 사용해야 함을 나타낸다. 이는 var 문과 일부 비엄격 함수(non-strict functions)의 형식적 매개변수 리스트의 경우이다( 10.2.11 참조). 이러한 경우, 렉시컬 바인딩이 호이스팅되고 초기화자 평가 전에 미리 초기화된다.

다음 생성식에 대해 조각별로 정의된다:

ForDeclaration : LetOrConst ForBinding
  1. BindingInitialization of ForBindingvalueenvironment를 인수로 넘겨 수행한 결과를 반환한다.

14.7.5.4 런타임 의미론: ForDeclarationBindingInstantiation

구문 지시 연산 ForDeclarationBindingInstantiation은 environment (선언적 환경 레코드(Declarative Environment Record))를 인수로 받고 unused를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

ForDeclaration : LetOrConst ForBinding
  1. ForBindingBoundNames의 각 요소 name에 대해, 다음을 수행한다:
    1. IsConstantDeclaration of LetOrConsttrue이면,
      1. environment.CreateImmutableBinding(name, true)를 수행한다.
    2. 그 외에는,
      1. environment.CreateMutableBinding(name, false)를 수행한다.
  2. unused를 반환한다.

14.7.5.5 런타임 의미론: ForInOfLoopEvaluation

구문 지시 연산 ForInOfLoopEvaluation은 labelSet (문자열 리스트(List of Strings))를 인수로 받고, 정상 완료(normal completion)ECMAScript 언어 값 또는 비정상 완료(abrupt completion)를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », Expression, enumerate)의 결과로 한다.
  2. ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, enumerate, assignment, labelSet)을 반환한다.
ForInOfStatement : for ( var ForBinding in Expression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », Expression, enumerate)의 결과로 한다.
  2. ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, enumerate, var-binding, labelSet)을 반환한다.
ForInOfStatement : for ( ForDeclaration in Expression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, Expression, enumerate)의 결과로 한다.
  2. ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, enumerate, lexical-binding, labelSet)을 반환한다.
ForInOfStatement : for ( LeftHandSideExpression of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate)의 결과로 한다.
  2. ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet)을 반환한다.
ForInOfStatement : for ( var ForBinding of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate)의 결과로 한다.
  2. ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, iterate, var-binding, labelSet)을 반환한다.
ForInOfStatement : for ( ForDeclaration of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, AssignmentExpression, iterate)의 결과로 한다.
  2. ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, iterate, lexical-binding, labelSet)을 반환한다.
ForInOfStatement : for await ( LeftHandSideExpression of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », AssignmentExpression, async-iterate)의 결과로 한다.
  2. ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet, async)을 반환한다.
ForInOfStatement : for await ( var ForBinding of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », AssignmentExpression, async-iterate)의 결과로 한다.
  2. ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, iterate, var-binding, labelSet, async)을 반환한다.
ForInOfStatement : for await ( ForDeclaration of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(BoundNames of ForDeclaration, AssignmentExpression, async-iterate)의 결과로 한다.
  2. ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, iterate, lexical-binding, labelSet, async)을 반환한다.
참고

이 절은 부록 B.3.5에 의해 확장된다.

14.7.5.6 ForIn/OfHeadEvaluation ( uninitializedBoundNames, expr, iterationKind )

추상 연산 ForIn/OfHeadEvaluation은 uninitializedBoundNames (문자열의 리스트(List)), expr (Expression 파스 노드(Parse Node) 또는 AssignmentExpression 파스 노드(Parse Node)), iterationKind (enumerate, iterate, 또는 async-iterate)를 인수로 받고, 정상 완료(normal completion)이터레이터 레코드(Iterator Record) 또는 비정상 완료(abrupt completion)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. oldEnv실행 중인 실행 컨텍스트(running execution context)의 LexicalEnvironment로 한다.
  2. uninitializedBoundNames가 비어 있지 않으면,
    1. Assert: uninitializedBoundNames에 중복 항목이 없어야 한다.
    2. newEnvNewDeclarativeEnvironment(oldEnv)로 한다.
    3. uninitializedBoundNames의 각 문자열 name에 대해,
      1. newEnv.CreateMutableBinding(name, false)을 수행한다.
    4. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 newEnv로 설정한다.
  3. exprRefCompletion(Evaluation of expr)의 결과로 한다.
  4. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정한다.
  5. exprValue를 ? GetValue(? exprRef)의 결과로 한다.
  6. iterationKindenumerate이면,
    1. exprValueundefined 또는 null이면,
      1. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: empty }를 반환한다.
    2. obj를 ! ToObject(exprValue)로 한다.
    3. iteratorEnumerateObjectProperties(obj)의 결과로 한다.
    4. nextMethod를 ! GetV(iterator, "next")의 결과로 한다.
    5. 이터레이터 레코드(Iterator Record) { [[Iterator]]: iterator, [[NextMethod]]: nextMethod, [[Done]]: false }를 반환한다.
  7. 그 외에는,
    1. Assert: iterationKinditerate 또는 async-iterate이어야 한다.
    2. iterationKindasync-iterate이면 iteratorKindasync로 한다.
    3. 그 외에는 iteratorKindsync로 한다.
    4. Return ? GetIterator(exprValue, iteratorKind).

14.7.5.7 ForIn/OfBodyEvaluation ( lhs, stmt, iteratorRecord, iterationKind, lhsKind, labelSet [ , iteratorKind ] )

추상 연산 ForIn/OfBodyEvaluation은 lhs (파스 노드(Parse Node)), stmt (Statement 파스 노드(Parse Node)), iteratorRecord (이터레이터 레코드(Iterator Record)), iterationKind (enumerate 또는 iterate), lhsKind (assignment, var-binding, 또는 lexical-binding), labelSet (문자열의 리스트(List)), 그리고 선택적 인수 iteratorKind (sync 또는 async)를 인수로 받고, 정상 완료(normal completion)ECMAScript 언어 값 또는 비정상 완료(abrupt completion)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. iteratorKind가 주어지지 않았다면, iteratorKindsync로 설정한다.
  2. oldEnv실행 중인 실행 컨텍스트(running execution context)의 LexicalEnvironment로 한다.
  3. Vundefined로 한다.
  4. destructuringIsDestructuring of lhs의 결과로 한다.
  5. destructuringtrue이고 lhsKindassignment이면,
    1. Assert: lhsLeftHandSideExpression이어야 한다.
    2. assignmentPatternlhscover하는 AssignmentPattern으로 한다.
  6. 반복한다,
    1. nextResult를 ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])의 결과로 한다.
    2. iteratorKindasync이면, nextResult를 ? Await(nextResult)의 결과로 설정한다.
    3. nextResult객체가 아니면, TypeError 예외를 발생시킨다.
    4. done을 ? IteratorComplete(nextResult)의 결과로 한다.
    5. donetrue이면 V를 반환한다.
    6. nextValue를 ? IteratorValue(nextResult)의 결과로 한다.
    7. lhsKindassignment 또는 var-binding이면,
      1. destructuringtrue이면,
        1. lhsKindassignment이면,
          1. statusCompletion(DestructuringAssignmentEvaluation of assignmentPatternnextValue 인수를 넘겨 수행한 결과)로 한다.
        2. 그 외에는,
          1. Assert: lhsKindvar-binding이어야 한다.
          2. Assert: lhsForBinding이어야 한다.
          3. statusCompletion(BindingInitialization of lhsnextValueundefined를 인수로 넘겨 수행한 결과)로 한다.
      2. 그 외에는,
        1. lhsRefCompletion(Evaluation of lhs)의 결과로 한다. (이것은 반복적으로 평가될 수 있다.)
        2. lhsKindassignment이고 AssignmentTargetType of lhsweb-compat이면, ReferenceError 예외를 발생시킨다.
        3. lhsRef비정상 완료이면,
          1. statuslhsRef로 한다.
        4. 그 외에는,
          1. statusCompletion(PutValue(lhsRef.[[Value]], nextValue))의 결과로 한다.
    8. 그 외에는,
      1. Assert: lhsKindlexical-binding이어야 한다.
      2. Assert: lhsForDeclaration이어야 한다.
      3. iterationEnvNewDeclarativeEnvironment(oldEnv)로 한다.
      4. ForDeclarationBindingInstantiation of lhsiterationEnv 인수를 넘겨 수행한다.
      5. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 iterationEnv로 설정한다.
      6. destructuringtrue이면,
        1. statusCompletion(ForDeclarationBindingInitialization of lhsnextValueiterationEnv를 인수로 넘겨 수행한 결과)로 한다.
      7. 그 외에는,
        1. Assert: lhs는 단일 이름을 바인딩한다.
        2. lhsNameBoundNames of lhs의 유일한 요소로 한다.
        3. lhsRef를 ! ResolveBinding(lhsName)로 한다.
        4. statusCompletion(InitializeReferencedBinding(lhsRef, nextValue))의 결과로 한다.
    9. status비정상 완료이면,
      1. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정한다.
      2. iteratorKindasync이면, ? AsyncIteratorClose(iteratorRecord, status)를 반환한다.
      3. iterationKindenumerate이면,
        1. status를 반환한다.
      4. 그 외에는,
        1. Assert: iterationKinditerate이어야 한다.
        2. IteratorClose(iteratorRecord, status)를 반환한다.
    10. resultCompletion(Evaluation of stmt)의 결과로 한다.
    11. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정한다.
    12. LoopContinues(result, labelSet)이 false이면,
      1. iterationKindenumerate이면,
        1. UpdateEmpty(result, V)를 반환한다.
      2. 그 외에는,
        1. Assert: iterationKinditerate이어야 한다.
        2. statusCompletion(UpdateEmpty(result, V))의 결과로 한다.
        3. iteratorKindasync이면, ? AsyncIteratorClose(iteratorRecord, status)를 반환한다.
        4. IteratorClose(iteratorRecord, status)를 반환한다.
    13. result.[[Value]]empty가 아니면, Vresult.[[Value]]를 설정한다.

14.7.5.8 런타임 의미론: 평가

BindingIdentifier : Identifier yield await
  1. bindingIdBindingIdentifierStringValue로 한다.
  2. ResolveBinding(bindingId)를 반환한다.

14.7.5.9 EnumerateObjectProperties ( O )

추상 연산 EnumerateObjectProperties는 인수 O (객체)를 받고, 이터레이터 객체(iterator object)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 이터레이터 객체를 반환한다. 이 객체의 next 메서드는 O의 열거 가능한 프로퍼티의 모든 문자열 키를 순회한다. 이터레이터 객체는 ECMAScript 코드에서 직접 접근할 수 없다. 프로퍼티 열거의 메커니즘과 순서는 명시되어 있지 않지만, 아래 명시된 규칙을 따라야 한다.

이터레이터throwreturn 메서드는 null이며, 호출되지 않는다. 이터레이터next 메서드는 객체의 프로퍼티가 프로퍼티 키로 반환되어야 하는지 판별한다. 반환되는 프로퍼티 키에는 심볼(Symbol) 키가 포함되지 않는다. 대상 객체의 프로퍼티는 열거 도중 삭제될 수 있다. 이터레이터next 메서드가 처리하기 전에 삭제된 프로퍼티는 무시된다. 열거 도중 새 프로퍼티가 추가된 경우, 새로 추가된 프로퍼티가 반드시 열거될 필요는 없다. 프로퍼티 이름은 어떤 열거에서도 이터레이터next 메서드에서 최대 한 번만 반환된다.

대상 객체의 프로퍼티를 열거할 때, 프로토타입, 프로토타입의 프로토타입 등도 재귀적으로 열거 대상에 포함된다. 단, 프로토타입의 프로퍼티가 이터레이터next 메서드에 의해 이미 처리된 이름과 같은 경우는 건너뛴다. 프로토타입 객체의 [[Enumerable]] 속성 값은 이미 처리된 프로퍼티 판정에 고려되지 않는다. 프로토타입 객체의 열거 가능한 프로퍼티 이름은 EnumerateObjectProperties를 해당 프로토타입 객체에 대해 호출하여 얻어야 한다. EnumerateObjectProperties는 대상 객체의 [[OwnPropertyKeys]] 내부 메서드를 호출하여 자신의 프로퍼티 키를 얻어야 한다. 프로퍼티 속성 정보는 [[GetOwnProperty]] 내부 메서드를 호출하여 얻어야 한다.

또한 O나 그 프로토타입 체인의 어떤 객체도 프록시 이색 객체(Proxy exotic object), TypedArray, 모듈 네임스페이스 이색 객체(module namespace exotic object), 또는 구현체가 제공하는 이색 객체(exotic object)가 아닌 경우, 이터레이터이터레이터와 동일하게 동작해야 하며, 이는 CreateForInIterator(O)가 반환하는 이터레이터와 동일하다. 단, 다음 조건 중 하나가 발생할 때까지이다:

  • O나 그 프로토타입 체인의 객체의 [[Prototype]] 내부 슬롯의 값이 변경됨
  • O나 그 프로토타입 체인의 객체에서 프로퍼티가 제거됨
  • O의 프로토타입 체인의 객체에 프로퍼티가 추가됨
  • O나 그 프로토타입 체인의 객체의 프로퍼티의 [[Enumerable]] 속성 값이 변경됨
참고 1

ECMAScript 구현체는 14.7.5.10.2.1의 알고리즘을 직접 구현할 필요는 없다. 위 단락의 제약조건이 위반되지 않는 한, 어떤 동작도 이 알고리즘과 다르지 않으면 된다.

아래는 이러한 규칙을 준수하는 ECMAScript generator 함수의 정보적 정의이다:

function* EnumerateObjectProperties(obj) {
  const visited = new Set();
  for (const key of Reflect.ownKeys(obj)) {
    if (typeof key === "symbol") continue;
    const desc = Reflect.getOwnPropertyDescriptor(obj, key);
    if (desc) {
      visited.add(key);
      if (desc.enumerable) yield key;
    }
  }
  const proto = Reflect.getPrototypeOf(obj);
  if (proto === null) return;
  for (const protoKey of EnumerateObjectProperties(proto)) {
    if (!visited.has(protoKey)) yield protoKey;
  }
}
참고 2
이색 객체(exotic objects)의 목록은, 구현체들이 전통적으로 이러한 경우에 대해 동작이 달랐고, 다른 경우에는 일치한다는 점에 근거하여 결정되었다. 이 경우에는 CreateForInIterator와의 일치가 요구되지 않는다.

14.7.5.10 for-in 이터레이터 객체

for-in 이터레이터는 특정 객체에 대한 특정 반복(iteration)을 나타내는 객체이다. for-in 이터레이터 객체는 ECMAScript 코드에서 직접 접근할 수 없으며, EnumerateObjectProperties의 동작을 설명하기 위한 목적으로만 존재한다.

14.7.5.10.1 CreateForInIterator ( object )

추상 연산 CreateForInIterator는 인수 object (객체)를 받고, for-in 이터레이터를 반환한다. 이 연산은 object의 자신의 및 상속받은 열거 가능한 문자열 프로퍼티를 특정 순서로 순회하는 for-in 이터레이터 객체를 생성한다. 호출 시 다음 단계를 수행한다:

  1. iteratorOrdinaryObjectCreate(%ForInIteratorPrototype%, « [[Object]], [[ObjectWasVisited]], [[VisitedKeys]], [[RemainingKeys]] »)로 한다.
  2. iterator.[[Object]]object를 설정한다.
  3. iterator.[[ObjectWasVisited]]false를 설정한다.
  4. iterator.[[VisitedKeys]]에 새로운 빈 리스트(List)를 설정한다.
  5. iterator.[[RemainingKeys]]에 새로운 빈 리스트(List)를 설정한다.
  6. iterator를 반환한다.

14.7.5.10.2 %ForInIteratorPrototype% 객체

%ForInIteratorPrototype% 객체:

14.7.5.10.2.1 %ForInIteratorPrototype%.next ( )

  1. Othis 값으로 한다.
  2. Assert: O객체이다.
  3. Assert: Ofor-in 이터레이터 인스턴스의 모든 내부 슬롯을 가진다 (14.7.5.10.3).
  4. objectO.[[Object]]로 한다.
  5. 반복한다,
    1. O.[[ObjectWasVisited]]false이면,
      1. keys를 ? object.[[OwnPropertyKeys]]()로 한다.
      2. keys의 각 요소 key에 대해,
        1. key문자열(String)이면,
          1. keyO.[[RemainingKeys]]에 추가한다.
      3. O.[[ObjectWasVisited]]true를 설정한다.
    2. O.[[RemainingKeys]]가 비어있지 않은 동안 반복한다,
      1. rO.[[RemainingKeys]]의 첫 번째 요소로 한다.
      2. O.[[RemainingKeys]]의 첫 번째 요소를 제거한다.
      3. O.[[VisitedKeys]]r이 없다면,
        1. desc를 ? object.[[GetOwnProperty]](r)로 한다.
        2. descundefined가 아니면,
          1. rO.[[VisitedKeys]]에 추가한다.
          2. desc.[[Enumerable]]true이면, CreateIteratorResultObject(r, false)를 반환한다.
    3. object를 ? object.[[GetPrototypeOf]]()로 한다.
    4. O.[[Object]]object를 설정한다.
    5. O.[[ObjectWasVisited]]false를 설정한다.
    6. objectnull이면, CreateIteratorResultObject(undefined, true)를 반환한다.

14.7.5.10.3 for-in 이터레이터 인스턴스의 프로퍼티

for-in 이터레이터 인스턴스는 일반 객체(ordinary objects)이며, %ForInIteratorPrototype% 내재 객체를 상속한다. for-in 이터레이터 인스턴스는 표 38에 나열된 내부 슬롯으로 생성된다.

표 38: for-in 이터레이터 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[Object]] 객체 반복 대상이 되는 객체 값.
[[ObjectWasVisited]] 불리언(Boolean) true이면 이터레이터[[Object]]에서 [[OwnPropertyKeys]]를 호출한 적이 있고, 그렇지 않으면 false이다.
[[VisitedKeys]] 문자열의 리스트(List) 현재까지 이 이터레이터에서 반환한 값들.
[[RemainingKeys]] 문자열의 리스트(List) 현재 객체에서 프로토타입의 프로퍼티(프로토타입이 null이 아닌 경우)로 넘어가기 전에 반환해야 할 값들.

14.8 continue

구문

ContinueStatement[Yield, Await] : continue ; continue [여기에 LineTerminator가 없음] LabelIdentifier[?Yield, ?Await] ;

14.8.1 정적 의미론: 초기 에러

ContinueStatement : continue ; continue LabelIdentifier ;
  • ContinueStatement가 함수나 static 초기화 블록 경계를 넘지 않고 직접적으로 또는 간접적으로 IterationStatement 내에 중첩되어 있지 않으면 구문 오류이다.

14.8.2 런타임 의미론: 평가

ContinueStatement : continue ;
  1. Completion Record { [[Type]]: continue, [[Value]]: empty, [[Target]]: empty }를 반환한다.
ContinueStatement : continue LabelIdentifier ;
  1. labelLabelIdentifierStringValue로 한다.
  2. Completion Record { [[Type]]: continue, [[Value]]: empty, [[Target]]: label }를 반환한다.

14.9 break

구문

BreakStatement[Yield, Await] : break ; break [여기에 LineTerminator가 없음] LabelIdentifier[?Yield, ?Await] ;

14.9.1 정적 의미론: 초기 에러

BreakStatement : break ;

14.9.2 런타임 의미론: 평가

BreakStatement : break ;
  1. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: empty }를 반환한다.
BreakStatement : break LabelIdentifier ;
  1. labelLabelIdentifierStringValue로 한다.
  2. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: label }를 반환한다.

14.10 return

구문

ReturnStatement[Yield, Await] : return ; return [여기에 LineTerminator가 없음] Expression[+In, ?Yield, ?Await] ; 참고

return 문은 함수의 실행을 중단시키고, 대부분의 경우 호출자에게 값을 반환한다. Expression이 생략되면 반환 값은 undefined이다. 그렇지 않으면 반환 값은 Expression의 값이다. return 문은 주변 문맥에 따라 실제로는 호출자에게 값을 반환하지 않을 수도 있다. 예를 들어 try 블록에서 return 문이 실행될 때는 Completion Recordfinally 블록 평가 중에 다른 Completion Record로 대체될 수 있다.

14.10.1 런타임 의미론: 평가

ReturnStatement : return ;
  1. ReturnCompletion(undefined)를 반환한다.
ReturnStatement : return Expression ;
  1. exprRef를 ? Evaluation of Expression의 결과로 한다.
  2. exprValue를 ? GetValue(exprRef)의 결과로 한다.
  3. GetGeneratorKind()가 async이면 exprValue를 ? Await(exprValue)의 결과로 한다.
  4. ReturnCompletion(exprValue)를 반환한다.

14.11 with

참고 1

레거시 with 문의 사용은 새로운 ECMAScript 코드에서 지양해야 한다. 엄격 모드 코드비엄격 코드 모두에서 허용되는 구조 분해 할당과 같은 대안을 고려하라.

구문

WithStatement[Yield, Await, Return] : with ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] 참고 2

with 문은 계산된 객체에 대한 객체 환경 레코드실행 중인 실행 컨텍스트의 렉시컬 환경에 추가한다. 그런 다음 이 확장된 렉시컬 환경을 사용하여 문을 실행한다. 마지막으로 원래의 렉시컬 환경으로 복원한다.

14.11.1 정적 의미론: 초기 에러

WithStatement : with ( Expression ) Statement 참고

두 번째 규칙은 B.3.1에 명시된 확장이 구현된 경우에만 적용된다.

14.11.2 런타임 의미론: 평가

WithStatement : with ( Expression ) Statement
  1. val을 ? Evaluation of Expression의 결과로 한다.
  2. obj를 ? ToObject(? GetValue(val))의 결과로 한다.
  3. oldEnv실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  4. newEnvNewObjectEnvironment(obj, true, oldEnv)로 한다.
  5. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 newEnv로 설정한다.
  6. CCompletion(Evaluation of Statement)의 결과로 한다.
  7. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정한다.
  8. UpdateEmpty(C, undefined)를 반환한다.
참고

내포된 Statement를 정상적으로 또는 비정상 완료나 예외로 벗어나더라도, 렉시컬 환경은 항상 원래 상태로 복원된다.

14.12 switch

구문

SwitchStatement[Yield, Await, Return] : switch ( Expression[+In, ?Yield, ?Await] ) CaseBlock[?Yield, ?Await, ?Return] CaseBlock[Yield, Await, Return] : { CaseClauses[?Yield, ?Await, ?Return]opt } { CaseClauses[?Yield, ?Await, ?Return]opt DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]opt } CaseClauses[Yield, Await, Return] : CaseClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return] CaseClause[?Yield, ?Await, ?Return] CaseClause[Yield, Await, Return] : case Expression[+In, ?Yield, ?Await] : StatementList[?Yield, ?Await, ?Return]opt DefaultClause[Yield, Await, Return] : default : StatementList[?Yield, ?Await, ?Return]opt

14.12.1 정적 의미론: 초기 에러

SwitchStatement : switch ( Expression ) CaseBlock

14.12.2 런타임 의미론: CaseBlockEvaluation

구문 지시 연산 CaseBlockEvaluation은 인수 input (ECMAScript 언어 값)을 받고, 정상 완료ECMAScript 언어 값 또는 비정상 완료를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

CaseBlock : { }
  1. undefined를 반환한다.
CaseBlock : { CaseClauses }
  1. Vundefined로 한다.
  2. ACaseClausesCaseClause 항목들의 소스 텍스트 순서 리스트로 한다.
  3. foundfalse로 한다.
  4. A의 각 CaseClause C에 대해, 다음을 수행한다:
    1. foundfalse이면,
      1. found를 ? CaseClauseIsSelected(C, input)의 결과로 설정한다.
    2. foundtrue이면,
      1. RCompletion(Evaluation of C)의 결과로 한다.
      2. R.[[Value]]empty가 아니면, VR.[[Value]]를 설정한다.
      3. R비정상 완료이면, ? UpdateEmpty(R, V)를 반환한다.
  5. V를 반환한다.
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. Vundefined로 한다.
  2. 첫 번째 CaseClauses가 존재하면,
    1. A를 첫 번째 CaseClausesCaseClause 항목들의 소스 텍스트 순서 리스트로 한다.
  3. 그 외에는,
    1. A를 새로운 빈 리스트로 한다.
  4. foundfalse로 한다.
  5. A의 각 CaseClause C에 대해, 다음을 수행한다:
    1. foundfalse이면,
      1. found를 ? CaseClauseIsSelected(C, input)의 결과로 설정한다.
    2. foundtrue이면,
      1. RCompletion(Evaluation of C)의 결과로 한다.
      2. R.[[Value]]empty가 아니면, VR.[[Value]]를 설정한다.
      3. R비정상 완료이면, ? UpdateEmpty(R, V)를 반환한다.
  6. foundInBfalse로 한다.
  7. 두 번째 CaseClauses가 존재하면,
    1. B를 두 번째 CaseClausesCaseClause 항목들의 소스 텍스트 순서 리스트로 한다.
  8. 그 외에는,
    1. B를 새로운 빈 리스트로 한다.
  9. foundfalse이면,
    1. B의 각 CaseClause C에 대해, 다음을 수행한다:
      1. foundInBfalse이면,
        1. foundInB를 ? CaseClauseIsSelected(C, input)의 결과로 설정한다.
      2. foundInBtrue이면,
        1. RCompletion(Evaluation of CaseClause C)의 결과로 한다.
        2. R.[[Value]]empty가 아니면, VR.[[Value]]를 설정한다.
        3. R비정상 완료이면, ? UpdateEmpty(R, V)를 반환한다.
  10. foundInBtrue이면 V를 반환한다.
  11. defaultRCompletion(Evaluation of DefaultClause)의 결과로 한다.
  12. defaultR.[[Value]]empty가 아니면, VdefaultR.[[Value]]를 설정한다.
  13. defaultR비정상 완료이면, ? UpdateEmpty(defaultR, V)를 반환한다.
  14. 참고: 다음은 두 번째 CaseClauses의 또 다른 완전 반복이다.
  15. B의 각 CaseClause C에 대해, 다음을 수행한다:
    1. RCompletion(Evaluation of CaseClause C)의 결과로 한다.
    2. R.[[Value]]empty가 아니면, VR.[[Value]]를 설정한다.
    3. R비정상 완료이면, ? UpdateEmpty(R, V)를 반환한다.
  16. V를 반환한다.

14.12.3 CaseClauseIsSelected ( C, input )

추상 연산 CaseClauseIsSelected는 인수 C (CaseClause 파스 노드(Parse Node))와 input (ECMAScript 언어 값)을 받고, 정상 완료로 불리언(Boolean) 또는 비정상 완료를 반환한다. 이 연산은 Cinput과 일치하는지 판단한다. 호출 시 다음 단계를 수행한다:

  1. Assert: C는 다음 생성식의 인스턴스이다: CaseClause : case Expression : StatementListopt .
  2. exprRefCExpression에 대해 ? Evaluation의 결과로 한다.
  3. clauseSelector를 ? GetValue(exprRef)의 결과로 한다.
  4. IsStrictlyEqual(input, clauseSelector)를 반환한다.
참고

이 연산은 CStatementList(있는 경우)를 실행하지 않는다. CaseBlock 알고리즘은 이 반환 값을 사용하여 어느 StatementList부터 실행을 시작할지 결정한다.

14.12.4 런타임 의미론: 평가

SwitchStatement : switch ( Expression ) CaseBlock
  1. exprRef를 ? Evaluation of Expression의 결과로 한다.
  2. switchValue를 ? GetValue(exprRef)의 결과로 한다.
  3. oldEnv실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  4. blockEnvNewDeclarativeEnvironment(oldEnv)로 한다.
  5. BlockDeclarationInstantiation(CaseBlock, blockEnv)를 수행한다.
  6. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 blockEnv로 설정한다.
  7. RCompletion(CaseBlockEvaluation of CaseBlockswitchValue 인수를 넘겨 수행한 결과)로 한다.
  8. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정한다.
  9. R을 반환한다.
참고

SwitchStatement에서 제어가 어떻게 빠져나가든, LexicalEnvironment는 항상 원래 상태로 복원된다.

CaseClause : case Expression :
  1. empty를 반환한다.
CaseClause : case Expression : StatementList
  1. Evaluation of StatementList의 결과를 반환한다.
DefaultClause : default :
  1. empty를 반환한다.
DefaultClause : default : StatementList
  1. Evaluation of StatementList의 결과를 반환한다.

14.13 레이블문

구문

LabelledStatement[Yield, Await, Return] : LabelIdentifier[?Yield, ?Await] : LabelledItem[?Yield, ?Await, ?Return] LabelledItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] FunctionDeclaration[?Yield, ?Await, ~Default] 참고

Statement는 레이블로 접두사를 붙일 수 있다. 레이블문은 레이블이 붙은 breakcontinue 문과 함께 사용할 때만 쓰인다. ECMAScript에는 goto 문이 없다. StatementLabelledStatement의 일부일 수 있으며, 이는 다시 LabelledStatement의 일부일 수도 있고, 계속 반복된다. 이렇게 도입된 레이블들은 개별 문들의 의미를 설명할 때 "현재 레이블 집합(current label set)"이라고 한다.

14.13.1 정적 의미론: 초기 에러

LabelledItem : FunctionDeclaration
  • 이 생성식에 의해 소스 텍스트가 매치되면 구문 오류이다.
참고

이 규칙에 대한 대안 정의는 B.3.1에 제공되어 있다.

14.13.2 정적 의미론: IsLabelledFunction ( stmt )

추상 연산 IsLabelledFunction은 인수 stmt (Statement 파스 노드(Parse Node))를 받고, Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. stmtLabelledStatement가 아니면 false를 반환한다.
  2. itemstmtLabelledItem로 한다.
  3. item LabelledItem : FunctionDeclaration 이면 true를 반환한다.
  4. subStmtitemStatement로 한다.
  5. IsLabelledFunction(subStmt)의 결과를 반환한다.

14.13.3 런타임 의미론: 평가

LabelledStatement : LabelIdentifier : LabelledItem
  1. LabelledEvaluation of 이 LabelledStatement 에 인수 « »를 넘겨서 그 결과를 반환한다.

14.13.4 런타임 의미론: LabelledEvaluation

구문 지시 연산 LabelledEvaluation은 인수 labelSet (문자열의 리스트(List))를 받고, 정상 완료(ECMAScript 언어 값 또는 empty) 또는 비정상 완료를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

BreakableStatement : IterationStatement
  1. stmtResultCompletion(LoopEvaluation of IterationStatementlabelSet 인수를 넘겨서 수행한 결과)로 한다.
  2. stmtResultbreak 완료(break completion)이면,
    1. stmtResult.[[Target]]empty이면,
      1. stmtResult.[[Value]]empty이면, stmtResultNormalCompletion(undefined)로 설정한다.
      2. 그 외에는, stmtResultNormalCompletion(stmtResult.[[Value]])로 설정한다.
  3. stmtResult를 반환한다.
BreakableStatement : SwitchStatement
  1. stmtResultCompletion(Evaluation of SwitchStatement)의 결과로 한다.
  2. stmtResultbreak 완료(break completion)이면,
    1. stmtResult.[[Target]]empty이면,
      1. stmtResult.[[Value]]empty이면, stmtResultNormalCompletion(undefined)로 설정한다.
      2. 그 외에는, stmtResultNormalCompletion(stmtResult.[[Value]])로 설정한다.
  3. stmtResult를 반환한다.
참고 1

BreakableStatement는 레이블이 없는 BreakStatement로 탈출할 수 있는 문이다.

LabelledStatement : LabelIdentifier : LabelledItem
  1. labelLabelIdentifierStringValue로 한다.
  2. newLabelSetlabelSet과 « label »의 리스트 연결(list-concatenation)로 한다.
  3. stmtResultCompletion(LabelledEvaluation of LabelledItemnewLabelSet 인수를 넘겨서 수행한 결과)로 한다.
  4. stmtResultbreak 완료(break completion)이고 stmtResult.[[Target]]label이면,
    1. stmtResultNormalCompletion(stmtResult.[[Value]])로 설정한다.
  5. stmtResult를 반환한다.
LabelledItem : FunctionDeclaration
  1. Evaluation of FunctionDeclaration의 결과를 반환한다.
Statement : BlockStatement VariableStatement EmptyStatement ExpressionStatement IfStatement ContinueStatement BreakStatement ReturnStatement WithStatement ThrowStatement TryStatement DebuggerStatement
  1. Evaluation of Statement의 결과를 반환한다.
참고 2

Statement의 두 가지 생성식만이 LabelledEvaluation에서 특별한 의미를 가진다: BreakableStatementLabelledStatement.

14.14 throw

구문

ThrowStatement[Yield, Await] : throw [여기에 LineTerminator가 없음] Expression[+In, ?Yield, ?Await] ;

14.14.1 런타임 의미론: 평가

ThrowStatement : throw Expression ;
  1. exprRef를 ? Evaluation of Expression의 결과로 한다.
  2. exprValue를 ? GetValue(exprRef)의 결과로 한다.
  3. ThrowCompletion(exprValue)를 반환한다.

14.15 try

구문

TryStatement[Yield, Await, Return] : try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] Catch[Yield, Await, Return] : catch ( CatchParameter[?Yield, ?Await] ) Block[?Yield, ?Await, ?Return] catch Block[?Yield, ?Await, ?Return] Finally[Yield, Await, Return] : finally Block[?Yield, ?Await, ?Return] CatchParameter[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] 참고

try 문은 런타임 오류나 throw 문과 같은 예외 상황이 발생할 수 있는 코드 블록을 감싼다. catch 절은 예외 처리 코드를 제공한다. catch 절이 예외를 포착하면, 그 CatchParameter가 해당 예외에 바인딩된다.

14.15.1 정적 의미론: 초기 에러

Catch : catch ( CatchParameter ) Block 참고

이 생성식에 대한 대안 정적 의미론B.3.4에 제시되어 있다.

14.15.2 런타임 의미론: CatchClauseEvaluation

구문 지시 연산 CatchClauseEvaluation은 인수 thrownValue (ECMAScript 언어 값)을 받고, 정상 완료(ECMAScript 언어 값 또는 empty) 또는 비정상 완료를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

Catch : catch ( CatchParameter ) Block
  1. oldEnv실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  2. catchEnvNewDeclarativeEnvironment(oldEnv)로 한다.
  3. CatchParameterBoundNames의 각 요소 argName에 대해,
    1. catchEnv.CreateMutableBinding(argName, false)을 수행한다.
  4. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 catchEnv로 설정한다.
  5. statusCompletion(BindingInitialization of CatchParameterthrownValuecatchEnv 인수를 넘겨서 수행한 결과)로 한다.
  6. status비정상 완료이면,
    1. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정한다.
    2. status를 반환한다.
  7. BCompletion(Evaluation of Block)의 결과로 한다.
  8. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정한다.
  9. B를 반환한다.
Catch : catch Block
  1. Evaluation of Block의 결과를 반환한다.
참고

Block에서 제어가 어떻게 빠져나가든, LexicalEnvironment는 항상 원래 상태로 복원된다.

14.15.3 런타임 의미론: 평가

TryStatement : try Block Catch
  1. BCompletion(Evaluation of Block)의 결과로 한다.
  2. Bthrow 완료(throw completion)이면, CCompletion(CatchClauseEvaluation of CatchB.[[Value]] 인수를 넘겨서 수행한 결과)로 한다.
  3. 그 외에는, CB로 한다.
  4. UpdateEmpty(C, undefined)를 반환한다.
TryStatement : try Block Finally
  1. BCompletion(Evaluation of Block)의 결과로 한다.
  2. FCompletion(Evaluation of Finally)의 결과로 한다.
  3. F정상 완료(normal completion)이면, FB로 설정한다.
  4. UpdateEmpty(F, undefined)를 반환한다.
TryStatement : try Block Catch Finally
  1. BCompletion(Evaluation of Block)의 결과로 한다.
  2. Bthrow 완료(throw completion)이면, CCompletion(CatchClauseEvaluation of CatchB.[[Value]] 인수를 넘겨서 수행한 결과)로 한다.
  3. 그 외에는, CB로 한다.
  4. FCompletion(Evaluation of Finally)의 결과로 한다.
  5. F정상 완료(normal completion)이면, FC로 설정한다.
  6. UpdateEmpty(F, undefined)를 반환한다.

14.16 debugger

구문

DebuggerStatement : debugger ;

14.16.1 런타임 의미론: 평가

참고

DebuggerStatement를 평가하면 구현체가 디버거에서 실행되는 경우 중단점(breakpoint)을 발생시킬 수 있다. 디버거가 없거나 활성화되어 있지 않으면 이 문은 관찰 가능한 효과가 없다.

DebuggerStatement : debugger ;
  1. 구현 정의 디버깅 기능이 사용 가능하고 활성화된 경우,
    1. 구현 정의 디버깅 동작을 수행한다.
    2. 새로운 구현 정의 Completion Record를 반환한다.
  2. 그 외에는,
    1. empty를 반환한다.

15 ECMAScript 언어: 함수와 클래스

참고

여러 ECMAScript 언어 요소들은 ECMAScript 함수 객체 (10.2)의 생성을 야기한다. 이러한 함수의 Evaluation[[Call]] 내부 메서드의 실행(10.2.1)으로 시작한다.

15.1 매개변수 목록

구문

UniqueFormalParameters[Yield, Await] : FormalParameters[?Yield, ?Await] FormalParameters[Yield, Await] : [비어 있음] FunctionRestParameter[?Yield, ?Await] FormalParameterList[?Yield, ?Await] FormalParameterList[?Yield, ?Await] , FormalParameterList[?Yield, ?Await] , FunctionRestParameter[?Yield, ?Await] FormalParameterList[Yield, Await] : FormalParameter[?Yield, ?Await] FormalParameterList[?Yield, ?Await] , FormalParameter[?Yield, ?Await] FunctionRestParameter[Yield, Await] : BindingRestElement[?Yield, ?Await] FormalParameter[Yield, Await] : BindingElement[?Yield, ?Await]

15.1.1 정적 의미론: 초기 에러

UniqueFormalParameters : FormalParameters FormalParameters : FormalParameterList 참고

같은 BindingIdentifierFormalParameterList에 여러 번 등장하는 것은, 함수가 단순 매개변수 목록을 가지고 있고 엄격 모드 코드에서 정의되지 않은 경우에만 허용된다.

15.1.2 정적 의미론: ContainsExpression

구문 지시 연산 ContainsExpression은 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:

ObjectBindingPattern : { } { BindingRestProperty }
  1. false를 반환한다.
ObjectBindingPattern : { BindingPropertyList , BindingRestProperty }
  1. ContainsExpression of BindingPropertyList를 반환한다.
ArrayBindingPattern : [ Elisionopt ]
  1. false를 반환한다.
ArrayBindingPattern : [ Elisionopt BindingRestElement ]
  1. ContainsExpression of BindingRestElement를 반환한다.
ArrayBindingPattern : [ BindingElementList , Elisionopt ]
  1. ContainsExpression of BindingElementList를 반환한다.
ArrayBindingPattern : [ BindingElementList , Elisionopt BindingRestElement ]
  1. hasContainsExpression of BindingElementList로 한다.
  2. hastrue이면 true를 반환한다.
  3. ContainsExpression of BindingRestElement를 반환한다.
BindingPropertyList : BindingPropertyList , BindingProperty
  1. hasContainsExpression of BindingPropertyList로 한다.
  2. hastrue이면 true를 반환한다.
  3. ContainsExpression of BindingProperty를 반환한다.
BindingElementList : BindingElementList , BindingElisionElement
  1. hasContainsExpression of BindingElementList로 한다.
  2. hastrue이면 true를 반환한다.
  3. ContainsExpression of BindingElisionElement를 반환한다.
BindingElisionElement : Elisionopt BindingElement
  1. ContainsExpression of BindingElement를 반환한다.
BindingProperty : PropertyName : BindingElement
  1. hasIsComputedPropertyKey of PropertyName로 한다.
  2. hastrue이면 true를 반환한다.
  3. ContainsExpression of BindingElement를 반환한다.
BindingElement : BindingPattern Initializer
  1. true를 반환한다.
SingleNameBinding : BindingIdentifier
  1. false를 반환한다.
SingleNameBinding : BindingIdentifier Initializer
  1. true를 반환한다.
BindingRestElement : ... BindingIdentifier
  1. false를 반환한다.
BindingRestElement : ... BindingPattern
  1. ContainsExpression of BindingPattern를 반환한다.
FormalParameters : [비어 있음]
  1. false를 반환한다.
FormalParameters : FormalParameterList , FunctionRestParameter
  1. ContainsExpression of FormalParameterListtrue이면 true를 반환한다.
  2. ContainsExpression of FunctionRestParameter를 반환한다.
FormalParameterList : FormalParameterList , FormalParameter
  1. ContainsExpression of FormalParameterListtrue이면 true를 반환한다.
  2. ContainsExpression of FormalParameter를 반환한다.
ArrowParameters : BindingIdentifier
  1. false를 반환한다.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsArrowFormalParameters로 한다. 이는 coverCoverParenthesizedExpressionAndArrowParameterList에 의해 얻어진다.
  2. ContainsExpression of formals를 반환한다.
AsyncArrowBindingIdentifier : BindingIdentifier
  1. false를 반환한다.

15.1.3 정적 의미론: IsSimpleParameterList

구문 지시 연산 IsSimpleParameterList는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:

BindingElement : BindingPattern
  1. false를 반환한다.
BindingElement : BindingPattern Initializer
  1. false를 반환한다.
SingleNameBinding : BindingIdentifier
  1. true를 반환한다.
SingleNameBinding : BindingIdentifier Initializer
  1. false를 반환한다.
FormalParameters : [empty]
  1. true를 반환한다.
FormalParameters : FunctionRestParameter
  1. false를 반환한다.
FormalParameters : FormalParameterList , FunctionRestParameter
  1. false를 반환한다.
FormalParameterList : FormalParameterList , FormalParameter
  1. IsSimpleParameterList of FormalParameterListfalse이면 false를 반환한다.
  2. IsSimpleParameterList of FormalParameter를 반환한다.
FormalParameter : BindingElement
  1. IsSimpleParameterList of BindingElement를 반환한다.
ArrowParameters : BindingIdentifier
  1. true를 반환한다.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsArrowFormalParameters로 한다. 이는 coverCoverParenthesizedExpressionAndArrowParameterList에 의해 얻어진다.
  2. IsSimpleParameterList of formals를 반환한다.
AsyncArrowBindingIdentifier : BindingIdentifier
  1. true를 반환한다.
CoverCallExpressionAndAsyncArrowHead : MemberExpression Arguments
  1. headAsyncArrowHead로 한다. 이는 coverCoverCallExpressionAndAsyncArrowHead에 의해 얻어진다.
  2. IsSimpleParameterList of head를 반환한다.

15.1.4 정적 의미론: HasInitializer

구문 지시 연산 HasInitializer는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:

BindingElement : BindingPattern
  1. false를 반환한다.
BindingElement : BindingPattern Initializer
  1. true를 반환한다.
SingleNameBinding : BindingIdentifier
  1. false를 반환한다.
SingleNameBinding : BindingIdentifier Initializer
  1. true를 반환한다.
FormalParameterList : FormalParameterList , FormalParameter
  1. HasInitializer of FormalParameterListtrue이면 true를 반환한다.
  2. HasInitializer of FormalParameter를 반환한다.

15.1.5 정적 의미론: ExpectedArgumentCount

구문 지시 연산 ExpectedArgumentCount는 인수를 받지 않고 음이 아닌 정수를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

FormalParameters : [비어 있음] FunctionRestParameter
  1. 0을 반환한다.
FormalParameters : FormalParameterList , FunctionRestParameter
  1. FormalParameterListExpectedArgumentCount를 반환한다.
참고

FormalParameterList의 ExpectedArgumentCount는 나머지 매개변수 또는 첫 번째 FormalParameter가 Initializer를 가진 경우 그 왼쪽에 있는 FormalParameters의 개수이다. 초기화자가 없는 FormalParameter가 초기화자를 가진 매개변수 뒤에 오는 것은 허용되지만, 이러한 매개변수는 undefined를 기본값으로 하는 선택적 매개변수로 간주된다.

FormalParameterList : FormalParameter
  1. FormalParameterHasInitializertrue이면 0을 반환한다.
  2. 1을 반환한다.
FormalParameterList : FormalParameterList , FormalParameter
  1. countFormalParameterListExpectedArgumentCount로 한다.
  2. FormalParameterListHasInitializertrue이거나 FormalParameterHasInitializertrue이면 count를 반환한다.
  3. count + 1을 반환한다.
ArrowParameters : BindingIdentifier
  1. 1을 반환한다.
ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList
  1. formalsArrowFormalParameters로 한다. 이는 coverCoverParenthesizedExpressionAndArrowParameterList에 의해 얻어진다.
  2. formalsExpectedArgumentCount를 반환한다.
PropertySetParameterList : FormalParameter
  1. FormalParameterHasInitializertrue이면 0을 반환한다.
  2. 1을 반환한다.
AsyncArrowBindingIdentifier : BindingIdentifier
  1. 1을 반환한다.

15.2 함수 정의

구문

FunctionDeclaration[Yield, Await, Default] : function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } [+Default] function ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } FunctionExpression : function BindingIdentifier[~Yield, ~Await]opt ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } FunctionBody[Yield, Await] : FunctionStatementList[?Yield, ?Await] FunctionStatementList[Yield, Await] : StatementList[?Yield, ?Await, +Return]opt

15.2.1 정적 의미론: 초기 에러

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody } FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody } 참고

FunctionBodyLexicallyDeclaredNames에는 var 또는 function 선언을 통해 바인딩된 식별자가 포함되지 않는다.

FunctionBody : FunctionStatementList

15.2.2 정적 의미론: FunctionBodyContainsUseStrict

구문 지시 연산 FunctionBodyContainsUseStrict는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:

FunctionBody : FunctionStatementList
  1. FunctionBodyDirective PrologueUse Strict Directive가 포함되어 있으면 true를 반환하고, 그렇지 않으면 false를 반환한다.

15.2.3 런타임 의미론: EvaluateFunctionBody

구문 지시 연산 EvaluateFunctionBody는 인수 functionObject(ECMAScript 함수 객체)와 argumentsList(List of ECMAScript 언어 값)를 받고, return 완료(return completion) 또는 throw 완료(throw completion)를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

FunctionBody : FunctionStatementList
  1. ? FunctionDeclarationInstantiation(functionObject, argumentsList)를 수행한다.
  2. ? Evaluation of FunctionStatementList를 수행한다.
  3. 참고: 이전 단계가 정상 완료(normal completion)를 반환했다면, FunctionStatementList의 끝까지 평가가 진행된 것이다.
  4. ReturnCompletion(undefined)를 반환한다.

15.2.4 런타임 의미론: InstantiateOrdinaryFunctionObject

구문 지시 연산 InstantiateOrdinaryFunctionObject는 인수 env(Environment Record)와 privateEnv(PrivateEnvironment Record 또는 null)를 받고, ECMAScript 함수 객체를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. nameBindingIdentifierStringValue로 한다.
  2. sourceText매치된 소스 텍스트(source text matched by) FunctionDeclaration로 한다.
  3. FOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, env, privateEnv)로 한다.
  4. SetFunctionName(F, name)를 수행한다.
  5. MakeConstructor(F)를 수행한다.
  6. F를 반환한다.
FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
  1. sourceText매치된 소스 텍스트(source text matched by) FunctionDeclaration로 한다.
  2. FOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, env, privateEnv)로 한다.
  3. SetFunctionName(F, "default")를 수행한다.
  4. MakeConstructor(F)를 수행한다.
  5. F를 반환한다.
참고

익명 FunctionDeclarationexport default 선언의 일부로만 등장할 수 있으며, 그 함수 코드는 항상 엄격 모드 코드(strict mode code)이다.

15.2.5 런타임 의미론: InstantiateOrdinaryFunctionExpression

구문 지시 연산 InstantiateOrdinaryFunctionExpression은 선택적 인수 name(property key 또는 Private Name)를 받고, ECMAScript 함수 객체를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

FunctionExpression : function ( FormalParameters ) { FunctionBody }
  1. name이 존재하지 않으면 name""로 설정한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceText매치된 소스 텍스트(source text matched by) FunctionExpression로 한다.
  5. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, env, privateEnv)로 한다.
  6. SetFunctionName(closure, name)를 수행한다.
  7. MakeConstructor(closure)를 수행한다.
  8. closure를 반환한다.
FunctionExpression : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. Assert: name이 존재하지 않는다.
  2. nameBindingIdentifierStringValue로 한다.
  3. outerEnv실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  4. funcEnvNewDeclarativeEnvironment(outerEnv)로 한다.
  5. ! funcEnv.CreateImmutableBinding(name, false)를 수행한다.
  6. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  7. sourceText매치된 소스 텍스트(source text matched by) FunctionExpression로 한다.
  8. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, FormalParameters, FunctionBody, non-lexical-this, funcEnv, privateEnv)로 한다.
  9. SetFunctionName(closure, name)를 수행한다.
  10. MakeConstructor(closure)를 수행한다.
  11. ! funcEnv.InitializeBinding(name, closure)를 수행한다.
  12. closure를 반환한다.
참고

BindingIdentifierFunctionExpression 내부에서 FunctionExpressionFunctionBody에서 참조될 수 있으므로 함수가 자기 자신을 재귀적으로 호출할 수 있다. 하지만 FunctionDeclaration과는 달리, BindingIdentifierFunctionExpression 바깥의 스코프에서 참조할 수 없으며, 해당 스코프에 영향을 미치지 않는다.

15.2.6 런타임 의미론: 평가

FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody }
  1. empty를 반환한다.
참고 1

대안 의미론은 B.3.2에 제공되어 있다.

FunctionDeclaration : function ( FormalParameters ) { FunctionBody }
  1. empty를 반환한다.
FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody }
  1. InstantiateOrdinaryFunctionExpression of FunctionExpression의 결과를 반환한다.
참고 2

FunctionDeclaration 또는 FunctionExpression을 사용하여 정의된 모든 함수에는 "prototype" 프로퍼티가 자동으로 생성되어, 해당 함수가 생성자(constructor)로 사용될 가능성을 허용한다.

FunctionStatementList : [비어 있음]
  1. undefined를 반환한다.

15.3 화살표 함수 정의

구문

ArrowFunction[In, Yield, Await] : ArrowParameters[?Yield, ?Await] [여기에 LineTerminator가 없음] => ConciseBody[?In] ArrowParameters[Yield, Await] : BindingIdentifier[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] ConciseBody[In] : [선행 기호 ≠ {] ExpressionBody[?In, ~Await] { FunctionBody[~Yield, ~Await] } ExpressionBody[In, Await] : AssignmentExpression[?In, ~Yield, ?Await]

보충 구문

다음 생성식의 인스턴스를 처리할 때
ArrowParameters[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
CoverParenthesizedExpressionAndArrowParameterList의 해석은 아래의 문법을 사용하여 정제된다:

ArrowFormalParameters[Yield, Await] : ( UniqueFormalParameters[?Yield, ?Await] )

15.3.1 정적 의미론: 초기 에러

ArrowFunction : ArrowParameters => ConciseBody ArrowParameters : CoverParenthesizedExpressionAndArrowParameterList

15.3.2 정적 의미론: ConciseBodyContainsUseStrict

구문 지시 연산 ConciseBodyContainsUseStrict는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:

ConciseBody : ExpressionBody
  1. false를 반환한다.
ConciseBody : { FunctionBody }
  1. FunctionBodyContainsUseStrict of FunctionBody를 반환한다.

15.3.3 런타임 의미론: EvaluateConciseBody

구문 지시 연산 EvaluateConciseBody는 인수 functionObject(ECMAScript 함수 객체)와 argumentsList(List of ECMAScript 언어 값)를 받고, return 완료(return completion) 또는 throw 완료(throw completion)를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

ConciseBody : ExpressionBody
  1. ? FunctionDeclarationInstantiation(functionObject, argumentsList)를 수행한다.
  2. ? Evaluation of ExpressionBody를 반환한다.

15.3.4 런타임 의미론: InstantiateArrowFunctionExpression

구문 지시 연산 InstantiateArrowFunctionExpression은 선택적 인수 name(property key 또는 Private Name)를 받고, ECMAScript 함수 객체를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

ArrowFunction : ArrowParameters => ConciseBody
  1. name이 존재하지 않으면 name""로 설정한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceText매치된 소스 텍스트(source text matched by) ArrowFunction로 한다.
  5. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, ArrowParameters, ConciseBody, lexical-this, env, privateEnv)로 한다.
  6. SetFunctionName(closure, name)를 수행한다.
  7. closure를 반환한다.
참고

ArrowFunctionarguments, super, this, new.target에 대한 지역 바인딩을 정의하지 않는다. ArrowFunction 내에서 arguments, super, this, new.target에 대한 참조는 반드시 렉시컬 상위 환경의 바인딩을 참조해야 한다. 일반적으로 이는 바로 상위 함수의 Function Environment가 된다. ArrowFunctionsuper를 포함하더라도, 함수 객체5단계에서 MakeMethod를 통해 메서드로 만들어지지 않는다. ArrowFunctionsuper를 참조하는 경우, 반드시 비-ArrowFunction 내에 포함되어 있고, 함수 객체가 캡처한 env를 통해 super를 구현하는 데 필요한 상태를 접근할 수 있다.

15.3.5 런타임 의미론: 평가

ArrowFunction : ArrowParameters => ConciseBody
  1. InstantiateArrowFunctionExpression of ArrowFunction의 결과를 반환한다.
ExpressionBody : AssignmentExpression
  1. exprRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
  2. exprValue를 ? GetValue(exprRef)의 결과로 한다.
  3. ReturnCompletion(exprValue)를 반환한다.

15.4 메서드 정의

구문

MethodDefinition[Yield, Await] : ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } GeneratorMethod[?Yield, ?Await] AsyncMethod[?Yield, ?Await] AsyncGeneratorMethod[?Yield, ?Await] get ClassElementName[?Yield, ?Await] ( ) { FunctionBody[~Yield, ~Await] } set ClassElementName[?Yield, ?Await] ( PropertySetParameterList ) { FunctionBody[~Yield, ~Await] } PropertySetParameterList : FormalParameter[~Yield, ~Await]

15.4.1 정적 의미론: 초기 에러

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }

15.4.2 정적 의미론: HasDirectSuper

구문 지시 연산 HasDirectSuper는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. UniqueFormalParameters Contains SuperCalltrue이면 true를 반환한다.
  2. FunctionBody Contains SuperCall의 결과를 반환한다.
MethodDefinition : get ClassElementName ( ) { FunctionBody }
  1. FunctionBody Contains SuperCall의 결과를 반환한다.
MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. PropertySetParameterList Contains SuperCalltrue이면 true를 반환한다.
  2. FunctionBody Contains SuperCall의 결과를 반환한다.
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. UniqueFormalParameters Contains SuperCalltrue이면 true를 반환한다.
  2. GeneratorBody Contains SuperCall의 결과를 반환한다.
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. UniqueFormalParameters Contains SuperCalltrue이면 true를 반환한다.
  2. AsyncGeneratorBody Contains SuperCall의 결과를 반환한다.
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. UniqueFormalParameters Contains SuperCalltrue이면 true를 반환한다.
  2. AsyncFunctionBody Contains SuperCall의 결과를 반환한다.

15.4.3 정적 의미론: SpecialMethod

구문 지시 연산 SpecialMethod는 인수를 받지 않고 Boolean을 반환한다. 다음 생성식에 대해 조각별로 정의된다:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. false를 반환한다.
MethodDefinition : GeneratorMethod AsyncMethod AsyncGeneratorMethod get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. true를 반환한다.

15.4.4 런타임 의미론: DefineMethod

구문 지시 연산 DefineMethod는 인수 object(Object)와 선택적 인수 functionPrototype(Object)를 받고, 정상 완료(normal completion)(Record, 필드 [[Key]](property key)와 [[Closure]](ECMAScript 함수 객체)) 또는 비정상 완료(abrupt completion)를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. propKey를 ? Evaluation of ClassElementName의 결과로 한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. functionPrototype이 존재하면,
    1. prototypefunctionPrototype으로 한다.
  5. 그 외에는,
    1. prototype%Function.prototype%로 한다.
  6. sourceText매치된 소스 텍스트(source text matched by) MethodDefinition로 한다.
  7. closureOrdinaryFunctionCreate(prototype, sourceText, UniqueFormalParameters, FunctionBody, non-lexical-this, env, privateEnv)로 한다.
  8. MakeMethod(closure, object)를 수행한다.
  9. Record { [[Key]]: propKey, [[Closure]]: closure }를 반환한다.

15.4.5 런타임 의미론: MethodDefinitionEvaluation

구문 지시 연산 MethodDefinitionEvaluation은 인수 object(Object)와 enumerable(Boolean)을 받고, 정상 완료(PrivateElement 또는 unused), 또는 비정상 완료를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
  1. methodDef를 ? DefineMethod of MethodDefinitionobject 인수를 넘겨서 수행한 결과로 한다.
  2. SetFunctionName(methodDef.[[Closure]], methodDef.[[Key]])를 수행한다.
  3. ? DefineMethodProperty(object, methodDef.[[Key]], methodDef.[[Closure]], enumerable)를 반환한다.
MethodDefinition : get ClassElementName ( ) { FunctionBody }
  1. propKey를 ? Evaluation of ClassElementName의 결과로 한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceText매치된 소스 텍스트(source text matched by) MethodDefinition로 한다.
  5. formalParameterList를 아래 생성식의 인스턴스로 한다: FormalParameters : [비어 있음] .
  6. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, formalParameterList, FunctionBody, non-lexical-this, env, privateEnv)로 한다.
  7. MakeMethod(closure, object)를 수행한다.
  8. SetFunctionName(closure, propKey, "get")를 수행한다.
  9. propKeyPrivate Name이면,
    1. PrivateElement { [[Key]]: propKey, [[Kind]]: accessor, [[Get]]: closure, [[Set]]: undefined }를 반환한다.
  10. 그 외에는,
    1. desc를 PropertyDescriptor { [[Get]]: closure, [[Enumerable]]: enumerable, [[Configurable]]: true }로 한다.
    2. ? DefinePropertyOrThrow(object, propKey, desc)를 수행한다.
    3. unused를 반환한다.
MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }
  1. propKey를 ? Evaluation of ClassElementName의 결과로 한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceText매치된 소스 텍스트(source text matched by) MethodDefinition로 한다.
  5. closureOrdinaryFunctionCreate(%Function.prototype%, sourceText, PropertySetParameterList, FunctionBody, non-lexical-this, env, privateEnv)로 한다.
  6. MakeMethod(closure, object)를 수행한다.
  7. SetFunctionName(closure, propKey, "set")를 수행한다.
  8. propKeyPrivate Name이면,
    1. PrivateElement { [[Key]]: propKey, [[Kind]]: accessor, [[Get]]: undefined, [[Set]]: closure }를 반환한다.
  9. 그 외에는,
    1. desc를 PropertyDescriptor { [[Set]]: closure, [[Enumerable]]: enumerable, [[Configurable]]: true }로 한다.
    2. ? DefinePropertyOrThrow(object, propKey, desc)를 수행한다.
    3. unused를 반환한다.
GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }
  1. propKey를 ? Evaluation of ClassElementName의 결과로 한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceText매치된 소스 텍스트(source text matched by) GeneratorMethod로 한다.
  5. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, UniqueFormalParameters, GeneratorBody, non-lexical-this, env, privateEnv)로 한다.
  6. MakeMethod(closure, object)를 수행한다.
  7. SetFunctionName(closure, propKey)를 수행한다.
  8. prototypeOrdinaryObjectCreate(%GeneratorPrototype%)로 한다.
  9. ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  10. ? DefineMethodProperty(object, propKey, closure, enumerable)를 반환한다.
AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. propKey를 ? Evaluation of ClassElementName의 결과로 한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceText매치된 소스 텍스트(source text matched by) AsyncGeneratorMethod로 한다.
  5. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, UniqueFormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv)로 한다.
  6. MakeMethod(closure, object)를 수행한다.
  7. SetFunctionName(closure, propKey)를 수행한다.
  8. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%)로 한다.
  9. ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  10. ? DefineMethodProperty(object, propKey, closure, enumerable)를 반환한다.
AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. propKey를 ? Evaluation of ClassElementName의 결과로 한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceText매치된 소스 텍스트(source text matched by) AsyncMethod로 한다.
  5. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, UniqueFormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv)로 한다.
  6. MakeMethod(closure, object)를 수행한다.
  7. SetFunctionName(closure, propKey)를 수행한다.
  8. DefineMethodProperty(object, propKey, closure, enumerable)를 반환한다.

15.5 제너레이터 함수 정의

구문

GeneratorDeclaration[Yield, Await, Default] : function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } [+Default] function * ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorExpression : function * BindingIdentifier[+Yield, ~Await]opt ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorMethod[Yield, Await] : * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorBody : FunctionBody[+Yield, ~Await] YieldExpression[In, Await] : yield yield [여기에 LineTerminator가 없음] AssignmentExpression[?In, +Yield, ?Await] yield [여기에 LineTerminator가 없음] * AssignmentExpression[?In, +Yield, ?Await] 참고 1

yield 바로 뒤의 구문 맥락에서는 InputElementRegExpOrTemplateTail 렉시컬 목표(lexical goal)를 사용해야 한다.

참고 2

YieldExpression은 제너레이터 함수의 FormalParameters 내에서는 사용할 수 없다. 왜냐하면 FormalParameters에 포함된 모든 표현식은 Generator가 재개(resumable) 상태가 되기 전에 평가되기 때문이다.

참고 3

제너레이터와 관련된 추상 연산(abstract operations)27.5.3에 정의되어 있다.

15.5.1 정적 의미론: 초기 에러

GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody } GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody } GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody }

15.5.2 런타임 의미론: EvaluateGeneratorBody

구문 지시 연산 EvaluateGeneratorBody는 인수 functionObject(ECMAScript 함수 객체)와 argumentsList(List of ECMAScript 언어 값)를 받고, throw 완료(throw completion) 또는 return 완료(return completion)를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

GeneratorBody : FunctionBody
  1. ? FunctionDeclarationInstantiation(functionObject, argumentsList)를 수행한다.
  2. G를 ? OrdinaryCreateFromConstructor(functionObject, "%GeneratorPrototype%", « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] »)의 결과로 한다.
  3. G.[[GeneratorBrand]]empty로 설정한다.
  4. G.[[GeneratorState]]suspended-start로 설정한다.
  5. GeneratorStart(G, FunctionBody)를 수행한다.
  6. ReturnCompletion(G)를 반환한다.

15.5.3 런타임 의미론: InstantiateGeneratorFunctionObject

구문 지시 연산 InstantiateGeneratorFunctionObject는 인수 env(Environment Record)와 privateEnv(PrivateEnvironment Record 또는 null)를 받고, ECMAScript 함수 객체를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
  1. nameBindingIdentifierStringValue로 한다.
  2. sourceText매치된 소스 텍스트(source text matched by) GeneratorDeclaration로 한다.
  3. FOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, env, privateEnv)로 한다.
  4. SetFunctionName(F, name)를 수행한다.
  5. prototypeOrdinaryObjectCreate(%GeneratorPrototype%)로 한다.
  6. ! DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  7. F를 반환한다.
GeneratorDeclaration : function * ( FormalParameters ) { GeneratorBody }
  1. sourceTextGeneratorDeclaration에 의해 매치된 소스 텍스트(source text matched by)로 한다.
  2. FOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, env, privateEnv)로 한다.
  3. SetFunctionName(F, "default")를 수행한다.
  4. prototypeOrdinaryObjectCreate(%GeneratorPrototype%)로 한다.
  5. ! DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  6. F를 반환한다.
참고

익명 GeneratorDeclarationexport default 선언의 일부로만 등장할 수 있으며, 해당 함수 코드는 항상 엄격 모드 코드(strict mode code)이다.

15.5.4 런타임 의미론: InstantiateGeneratorFunctionExpression

구문 지시 연산 InstantiateGeneratorFunctionExpression은 선택적 인수 name(property key 또는 Private Name)를 받고 ECMAScript 함수 객체를 반환한다. 다음 생성식에 대해 조각별로 정의된다:

GeneratorExpression : function * ( FormalParameters ) { GeneratorBody }
  1. name이 존재하지 않으면 name""로 설정한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceText매치된 소스 텍스트(source text matched by) GeneratorExpression로 한다.
  5. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, env, privateEnv)로 한다.
  6. SetFunctionName(closure, name)를 수행한다.
  7. prototypeOrdinaryObjectCreate(%GeneratorPrototype%)로 한다.
  8. ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  9. closure를 반환한다.
GeneratorExpression : function * BindingIdentifier ( FormalParameters ) { GeneratorBody }
  1. Assert: name이 존재하지 않는다.
  2. nameBindingIdentifierStringValue로 한다.
  3. outerEnv실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  4. funcEnvNewDeclarativeEnvironment(outerEnv)로 한다.
  5. ! funcEnv.CreateImmutableBinding(name, false)를 수행한다.
  6. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  7. sourceText매치된 소스 텍스트(source text matched by) GeneratorExpression로 한다.
  8. closureOrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, FormalParameters, GeneratorBody, non-lexical-this, funcEnv, privateEnv)로 한다.
  9. SetFunctionName(closure, name)를 수행한다.
  10. prototypeOrdinaryObjectCreate(%GeneratorPrototype%)로 한다.
  11. ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  12. ! funcEnv.InitializeBinding(name, closure)를 수행한다.
  13. closure를 반환한다.
참고

BindingIdentifierGeneratorExpression 내부에서 GeneratorExpressionFunctionBody에서 참조될 수 있으므로, 제너레이터 코드가 자기 자신을 재귀적으로 호출할 수 있다. 하지만 GeneratorDeclaration과는 달리, BindingIdentifierGeneratorExpression 바깥의 스코프에서 참조할 수 없으며, 해당 스코프에 영향을 미치지 않는다.

15.5.5 런타임 의미론: 평가

GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody }
  1. InstantiateGeneratorFunctionExpression of GeneratorExpression의 결과를 반환한다.
YieldExpression : yield
  1. ? Yield(undefined)를 반환한다.
YieldExpression : yield AssignmentExpression
  1. exprRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
  2. value를 ? GetValue(exprRef)의 결과로 한다.
  3. ? Yield(value)를 반환한다.
YieldExpression : yield * AssignmentExpression
  1. generatorKindGetGeneratorKind()의 결과로 한다.
  2. Assert: generatorKindsync 또는 async이다.
  3. exprRef를 ? Evaluation of AssignmentExpression의 결과로 한다.
  4. value를 ? GetValue(exprRef)의 결과로 한다.
  5. iteratorRecord를 ? GetIterator(value, generatorKind)의 결과로 한다.
  6. iteratoriteratorRecord.[[Iterator]]로 한다.
  7. receivedNormalCompletion(undefined)로 한다.
  8. 반복한다,
    1. received정상 완료(normal completion)이면,
      1. innerResult를 ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]], « received.[[Value]] »)의 결과로 한다.
      2. generatorKindasync이면, innerResult를 ? Await(innerResult)의 결과로 설정한다.
      3. innerResult객체가 아니면, TypeError 예외를 던진다.
      4. done를 ? IteratorComplete(innerResult)의 결과로 한다.
      5. donetrue이면,
        1. ? IteratorValue(innerResult)를 반환한다.
      6. generatorKindasync이면, receivedCompletion(AsyncGeneratorYield(? IteratorValue(innerResult)))로 설정한다.
      7. 그 외에는, receivedCompletion(GeneratorYield(innerResult))로 설정한다.
    2. 그 외에 receivedthrow 완료(throw completion)이면,
      1. throw를 ? GetMethod(iterator, "throw")의 결과로 한다.
      2. throwundefined가 아니면,
        1. innerResult를 ? Call(throw, iterator, « received.[[Value]] »)의 결과로 한다.
        2. generatorKindasync이면, innerResult를 ? Await(innerResult)의 결과로 설정한다.
        3. 참고: 내부 iterator throw 메서드의 예외는 전파된다. 내부 throw 메서드의 정상 완료(normal completion)는 내부 next와 유사하게 처리된다.
        4. innerResult객체가 아니면, TypeError 예외를 던진다.
        5. done를 ? IteratorComplete(innerResult)의 결과로 한다.
        6. donetrue이면,
          1. ? IteratorValue(innerResult)를 반환한다.
        7. generatorKindasync이면, receivedCompletion(AsyncGeneratorYield(? IteratorValue(innerResult)))로 설정한다.
        8. 그 외에는, receivedCompletion(GeneratorYield(innerResult))로 설정한다.
      3. 그 외에는,
        1. 참고: iteratorthrow 메서드가 없으면, 이 throw는 yield* 루프를 종료한다. 단, 먼저 iterator에 정리(clean up) 기회를 준다.
        2. closeCompletionNormalCompletion(empty)로 한다.
        3. generatorKindasync이면, ? AsyncIteratorClose(iteratorRecord, closeCompletion)를 수행한다.
        4. 그 외에는, ? IteratorClose(iteratorRecord, closeCompletion)를 수행한다.
        5. 참고: 다음 단계는 yield* 프로토콜 위반을 나타내기 위해 TypeError를 던진다: iteratorthrow 메서드가 없다.
        6. TypeError 예외를 던진다.
    3. 그 외에는,
      1. Assert: receivedreturn 완료(return completion)이다.
      2. return을 ? GetMethod(iterator, "return")의 결과로 한다.
      3. returnundefined이면,
        1. valuereceived.[[Value]]로 설정한다.
        2. generatorKindasync이면,
          1. value를 ? Await(value)의 결과로 설정한다.
        3. ReturnCompletion(value)를 반환한다.
      4. innerReturnResult를 ? Call(return, iterator, « received.[[Value]] »)의 결과로 한다.
      5. generatorKindasync이면, innerReturnResult를 ? Await(innerReturnResult)의 결과로 설정한다.
      6. innerReturnResult객체가 아니면, TypeError 예외를 던진다.
      7. done를 ? IteratorComplete(innerReturnResult)의 결과로 한다.
      8. donetrue이면,
        1. value를 ? IteratorValue(innerReturnResult)의 결과로 설정한다.
        2. ReturnCompletion(value)를 반환한다.
      9. generatorKindasync이면, receivedCompletion(AsyncGeneratorYield(? IteratorValue(innerReturnResult)))로 설정한다.
      10. 그 외에는, receivedCompletion(GeneratorYield(innerReturnResult))로 설정한다.

15.6 비동기 제너레이터 함수 정의

구문

AsyncGeneratorDeclaration[Yield, Await, Default] : async [여기에는 LineTerminator 없음] function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } [+Default] async [여기에는 LineTerminator 없음] function * ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorExpression : async [여기에는 LineTerminator 없음] function * BindingIdentifier[+Yield, +Await]opt ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorMethod[Yield, Await] : async [여기에는 LineTerminator 없음] * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorBody : FunctionBody[+Yield, +Await] 참고 1

YieldExpressionAwaitExpression은 비동기 제너레이터 함수의 FormalParameters 내에서 사용할 수 없습니다. 왜냐하면 FormalParameters의 일부인 모든 식은 생성된 AsyncGenerator가 재개 가능한 상태가 되기 전에 평가되기 때문입니다.

참고 2

AsyncGenerator와 관련된 추상 연산들은 27.6.3에 정의되어 있습니다.

15.6.1 정적 의미론: 초기 에러

AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody } AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody }

15.6.2 실행 시 의미론: EvaluateAsyncGeneratorBody

구문 지향 연산 EvaluateAsyncGeneratorBody는 functionObject(ECMAScript 함수 객체)와 argumentsList(List 타입의 ECMAScript 언어 값 목록) 인자를 받고, throw completion 또는 return completion을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

AsyncGeneratorBody : FunctionBody
  1. FunctionDeclarationInstantiation(functionObject, argumentsList)를 수행한다.
  2. generator를 ? OrdinaryCreateFromConstructor(functionObject, "%AsyncGeneratorPrototype%", « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] »)로 한다.
  3. generator.[[GeneratorBrand]]empty로 설정한다.
  4. generator.[[AsyncGeneratorState]]suspended-start로 설정한다.
  5. AsyncGeneratorStart(generator, FunctionBody)를 수행한다.
  6. ReturnCompletion(generator)를 반환한다.

15.6.3 실행 시 의미론: InstantiateAsyncGeneratorFunctionObject

구문 지향 연산 InstantiateAsyncGeneratorFunctionObject는 env(Environment Record 타입)와 privateEnv(PrivateEnvironment Record 또는 null) 인자를 받고, ECMAScript 함수 객체를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
  1. nameStringValue of BindingIdentifier로 한다.
  2. sourceTextAsyncGeneratorDeclaration에 매치된 소스 텍스트로 한다.
  3. FOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv)로 한다.
  4. SetFunctionName(F, name)을 수행한다.
  5. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%)로 한다.
  6. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  7. F를 반환한다.
AsyncGeneratorDeclaration : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. sourceTextAsyncGeneratorDeclaration에 매치된 소스 텍스트로 한다.
  2. FOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv)로 한다.
  3. SetFunctionName(F, "default")를 수행한다.
  4. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%)로 한다.
  5. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  6. F를 반환한다.
참고

익명 AsyncGeneratorDeclarationexport default 선언의 일부로만 나타날 수 있습니다.

15.6.4 실행 시 의미론: InstantiateAsyncGeneratorFunctionExpression

구문 지향 연산 InstantiateAsyncGeneratorFunctionExpression은 선택적 인자 name(프로퍼티 키 또는 Private Name)를 받고, ECMAScript 함수 객체를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

AsyncGeneratorExpression : async function * ( FormalParameters ) { AsyncGeneratorBody }
  1. name이 존재하지 않으면 name""로 설정한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceTextAsyncGeneratorExpression에 매치된 소스 텍스트로 한다.
  5. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, env, privateEnv)로 한다.
  6. SetFunctionName(closure, name)을 수행한다.
  7. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%)로 한다.
  8. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  9. closure를 반환한다.
AsyncGeneratorExpression : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody }
  1. Assert: name이 존재하지 않는다.
  2. nameStringValue of BindingIdentifier로 설정한다.
  3. outerEnv실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  4. funcEnvNewDeclarativeEnvironment(outerEnv)로 한다.
  5. funcEnv.CreateImmutableBinding(name, false)을 수행한다.
  6. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  7. sourceTextAsyncGeneratorExpression에 매치된 소스 텍스트로 한다.
  8. closureOrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, FormalParameters, AsyncGeneratorBody, non-lexical-this, funcEnv, privateEnv)로 한다.
  9. SetFunctionName(closure, name)을 수행한다.
  10. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%)로 한다.
  11. DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  12. funcEnv.InitializeBinding(name, closure)을 수행한다.
  13. closure를 반환한다.
참고

BindingIdentifierAsyncGeneratorExpression에 포함되어 있을 경우, AsyncGeneratorExpressionAsyncGeneratorBody 내부에서 참조할 수 있으므로 제너레이터 코드가 자기 자신을 재귀적으로 호출할 수 있습니다. 그러나 AsyncGeneratorDeclaration의 경우와는 달리, BindingIdentifierAsyncGeneratorExpression에 포함되어 있을 경우, AsyncGeneratorExpression을 둘러싼 스코프에서 참조할 수 없으며, 그 스코프에 영향을 주지 않습니다.

15.6.5 실행 시 의미론: Evaluation

AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody }
  1. InstantiateAsyncGeneratorFunctionExpression of AsyncGeneratorExpression을 반환한다.

15.7 클래스 정의

구문

ClassDeclaration[Yield, Await, Default] : class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await] [+Default] class ClassTail[?Yield, ?Await] ClassExpression[Yield, Await] : class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await] ClassTail[Yield, Await] : ClassHeritage[?Yield, ?Await]opt { ClassBody[?Yield, ?Await]opt } ClassHeritage[Yield, Await] : extends LeftHandSideExpression[?Yield, ?Await] ClassBody[Yield, Await] : ClassElementList[?Yield, ?Await] ClassElementList[Yield, Await] : ClassElement[?Yield, ?Await] ClassElementList[?Yield, ?Await] ClassElement[?Yield, ?Await] ClassElement[Yield, Await] : MethodDefinition[?Yield, ?Await] static MethodDefinition[?Yield, ?Await] FieldDefinition[?Yield, ?Await] ; static FieldDefinition[?Yield, ?Await] ; ClassStaticBlock ; FieldDefinition[Yield, Await] : ClassElementName[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt ClassElementName[Yield, Await] : PropertyName[?Yield, ?Await] PrivateIdentifier ClassStaticBlock : static { ClassStaticBlockBody } ClassStaticBlockBody : ClassStaticBlockStatementList ClassStaticBlockStatementList : StatementList[~Yield, +Await, ~Return]opt 참고

클래스 정의는 항상 strict mode code입니다.

15.7.1 정적 의미론: 초기 에러

ClassTail : ClassHeritageopt { ClassBody }
  • 다음 알고리즘이 true를 반환하고 ClassHeritage가 존재하지 않는 경우, 문법 오류입니다:

    1. constructorConstructorMethod of ClassBody로 한다.
    2. constructorempty라면, false를 반환한다.
    3. constructorHasDirectSuper를 반환한다.
ClassBody : ClassElementList
  • PrototypePropertyNameList of ClassElementList"constructor"가 둘 이상 포함된 경우 문법 오류입니다.
  • PrivateBoundIdentifiers of ClassElementList에 중복된 항목이 존재하는 경우(단, 이름이 게터와 세터에 각각 한 번씩만 사용되고, 그 외에는 사용되지 않으며, 게터와 세터가 모두 static이거나 모두 static이 아니면 예외), 문법 오류입니다.
ClassElement : MethodDefinition ClassElement : static MethodDefinition ClassElement : FieldDefinition ; ClassElement : static FieldDefinition ; FieldDefinition : ClassElementName Initializeropt ClassElementName : PrivateIdentifier ClassStaticBlockBody : ClassStaticBlockStatementList

15.7.2 정적 의미론: ClassElementKind

구문 지향 연산 ClassElementKind는 인자를 받지 않으며, constructor-method, non-constructor-method, 또는 empty를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

ClassElement : MethodDefinition
  1. MethodDefinitionPropName"constructor"이면, constructor-method를 반환한다.
  2. non-constructor-method를 반환한다.
ClassElement : static MethodDefinition FieldDefinition ; static FieldDefinition ;
  1. non-constructor-method를 반환한다.
ClassElement : ClassStaticBlock
  1. non-constructor-method를 반환한다.
ClassElement : ;
  1. empty를 반환한다.

15.7.3 정적 의미론: ConstructorMethod

구문 지향 연산 ConstructorMethod는 인자를 받지 않으며, ClassElement 파싱 노드 또는 empty를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

ClassElementList : ClassElement
  1. ClassElementClassElementKindconstructor-method이면, ClassElement를 반환한다.
  2. empty를 반환한다.
ClassElementList : ClassElementList ClassElement
  1. headConstructorMethod of ClassElementList로 한다.
  2. headempty가 아니면 head를 반환한다.
  3. ClassElementClassElementKindconstructor-method이면, ClassElement를 반환한다.
  4. empty를 반환한다.
참고

초기 에러 규칙은 "constructor"라는 이름의 메서드 정의가 하나만 존재하며, 접근자 프로퍼티 또는 제너레이터 정의가 아님을 보장합니다.

15.7.4 정적 의미론: IsStatic

구문 지향 연산 IsStatic은 인자를 받지 않으며, Boolean을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

ClassElement : MethodDefinition
  1. false를 반환한다.
ClassElement : static MethodDefinition
  1. true를 반환한다.
ClassElement : FieldDefinition ;
  1. false를 반환한다.
ClassElement : static FieldDefinition ;
  1. true를 반환한다.
ClassElement : ClassStaticBlock
  1. true를 반환한다.
ClassElement : ;
  1. false를 반환한다.

15.7.5 정적 의미론: NonConstructorElements

구문 지향 연산 NonConstructorElements는 인자를 받지 않으며, List 타입의 ClassElement 파싱 노드 목록을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

ClassElementList : ClassElement
  1. ClassElementClassElementKindnon-constructor-method이면,
    1. « ClassElement »를 반환한다.
  2. 새로운 빈 List를 반환한다.
ClassElementList : ClassElementList ClassElement
  1. listNonConstructorElements of ClassElementList로 한다.
  2. ClassElementClassElementKindnon-constructor-method이면,
    1. ClassElementlist의 끝에 추가한다.
  3. list를 반환한다.

15.7.6 정적 의미론: PrototypePropertyNameList

구문 지향 연산 PrototypePropertyNameList는 인자를 받지 않으며, List 타입의 프로퍼티 키 목록을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

ClassElementList : ClassElement
  1. propNameClassElementPropName로 한다.
  2. propNameempty이면, 새로운 빈 List를 반환한다.
  3. ClassElementIsStatictrue이면, 새로운 빈 List를 반환한다.
  4. « propName »를 반환한다.
ClassElementList : ClassElementList ClassElement
  1. listPrototypePropertyNameList of ClassElementList로 한다.
  2. propNameClassElementPropName로 한다.
  3. propNameempty이면 list를 반환한다.
  4. ClassElementIsStatictrue이면 list를 반환한다.
  5. list와 « propName »의 리스트 연결을 반환한다.

15.7.7 정적 의미론: AllPrivateIdentifiersValid

구문 지향 연산 AllPrivateIdentifiersValid는 names(문자열의 List) 인자를 받고, Boolean을 반환합니다.

아래에 나열되지 않은 이 명세의 모든 문법 생성식 대안은 암묵적으로 다음의 AllPrivateIdentifiersValid의 기본 정의를 갖습니다:

  1. 파싱 노드의 각 자식 노드 child에 대해,
    1. child가 비터미널의 인스턴스이면,
      1. childAllPrivateIdentifiersValidnames 인자를 넘겨 호출 결과가 false이면, false를 반환한다.
  2. true를 반환한다.
MemberExpression : MemberExpression . PrivateIdentifier
  1. namesPrivateIdentifierStringValue를 포함하면,
    1. MemberExpressionAllPrivateIdentifiersValidnames 인자를 넘겨 호출한 결과를 반환한다.
  2. false를 반환한다.
CallExpression : CallExpression . PrivateIdentifier
  1. namesPrivateIdentifierStringValue를 포함하면,
    1. CallExpressionAllPrivateIdentifiersValidnames 인자를 넘겨 호출한 결과를 반환한다.
  2. false를 반환한다.
OptionalChain : ?. PrivateIdentifier
  1. namesPrivateIdentifierStringValue를 포함하면, true를 반환한다.
  2. false를 반환한다.
OptionalChain : OptionalChain . PrivateIdentifier
  1. namesPrivateIdentifierStringValue를 포함하면,
    1. OptionalChainAllPrivateIdentifiersValidnames 인자를 넘겨 호출한 결과를 반환한다.
  2. false를 반환한다.
ClassBody : ClassElementList
  1. newNamesnamesClassBodyPrivateBoundIdentifiers리스트 연결로 한다.
  2. ClassElementListAllPrivateIdentifiersValidnewNames 인자를 넘겨 호출한 결과를 반환한다.
RelationalExpression : PrivateIdentifier in ShiftExpression
  1. namesPrivateIdentifierStringValue를 포함하면,
    1. ShiftExpressionAllPrivateIdentifiersValidnames 인자를 넘겨 호출한 결과를 반환한다.
  2. false를 반환한다.

15.7.8 정적 의미론: PrivateBoundIdentifiers

구문 지향 연산 PrivateBoundIdentifiers는 인자를 받지 않으며, 문자열의 List를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

FieldDefinition : ClassElementName Initializeropt
  1. ClassElementNamePrivateBoundIdentifiers를 반환한다.
ClassElementName : PrivateIdentifier
  1. PrivateIdentifierStringValue를 유일한 요소로 갖는 List를 반환한다.
ClassElementName : PropertyName ClassElement : ClassStaticBlock ;
  1. 새로운 빈 List를 반환한다.
ClassElementList : ClassElementList ClassElement
  1. names1ClassElementListPrivateBoundIdentifiers로 한다.
  2. names2ClassElementPrivateBoundIdentifiers로 한다.
  3. names1names2리스트 연결을 반환한다.
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody } GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody } AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody } AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
  1. ClassElementNamePrivateBoundIdentifiers를 반환한다.

15.7.9 정적 의미론: ContainsArguments

구문 지향 연산 ContainsArguments는 인자를 받지 않으며, Boolean을 반환합니다.

아래에 나열되지 않은 이 명세의 모든 문법 생성식 대안은 암묵적으로 다음의 ContainsArguments의 기본 정의를 갖습니다:

  1. 파싱 노드의 각 자식 노드 child에 대해,
    1. child가 비터미널의 인스턴스이면,
      1. childContainsArgumentstrue이면, true를 반환한다.
  2. false를 반환한다.
IdentifierReference : Identifier
  1. IdentifierStringValue"arguments"이면, true를 반환한다.
  2. false를 반환한다.
FunctionDeclaration : function BindingIdentifier ( FormalParameters ) { FunctionBody } function ( FormalParameters ) { FunctionBody } FunctionExpression : function BindingIdentifieropt ( FormalParameters ) { FunctionBody } GeneratorDeclaration : function * BindingIdentifier ( FormalParameters ) { GeneratorBody } function * ( FormalParameters ) { GeneratorBody } GeneratorExpression : function * BindingIdentifieropt ( FormalParameters ) { GeneratorBody } AsyncGeneratorDeclaration : async function * BindingIdentifier ( FormalParameters ) { AsyncGeneratorBody } async function * ( FormalParameters ) { AsyncGeneratorBody } AsyncGeneratorExpression : async function * BindingIdentifieropt ( FormalParameters ) { AsyncGeneratorBody } AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody } AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }
  1. false를 반환한다.
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody } get ClassElementName ( ) { FunctionBody } set ClassElementName ( PropertySetParameterList ) { FunctionBody } GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody } AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody } AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
  1. ClassElementNameContainsArguments를 반환한다.

15.7.10 실행 시 의미론: ClassFieldDefinitionEvaluation

구문 지향 연산 ClassFieldDefinitionEvaluation은 homeObject(객체)를 인자로 받고, 내포된 normal completion에서 ClassFieldDefinition Record를 반환하거나, abrupt completion을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

FieldDefinition : ClassElementName Initializeropt
  1. name을 ? Evaluation of ClassElementName로 한다.
  2. Initializer가 존재하면,
    1. formalParameterList를 다음 생성식의 인스턴스로 한다: FormalParameters : [empty]
    2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
    3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
    4. sourceText를 유니코드 코드 포인트의 빈 시퀀스로 한다.
    5. initializerOrdinaryFunctionCreate(%Function.prototype%, sourceText, formalParameterList, Initializer, non-lexical-this, env, privateEnv)로 한다.
    6. MakeMethod(initializer, homeObject)를 수행한다.
    7. initializer.[[ClassFieldInitializerName]]name으로 설정한다.
  3. 그렇지 않으면,
    1. initializerempty로 한다.
  4. ClassFieldDefinition Record { [[Name]]: name, [[Initializer]]: initializer }를 반환한다.
참고
initializer에 대해 생성된 함수는 ECMAScript 코드에서 직접 접근할 수 없습니다.

15.7.11 실행 시 의미론: ClassStaticBlockDefinitionEvaluation

구문 지향 연산 ClassStaticBlockDefinitionEvaluation은 homeObject(객체)를 인자로 받고, ClassStaticBlockDefinition Record를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

ClassStaticBlock : static { ClassStaticBlockBody }
  1. lex실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  2. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  3. sourceText를 유니코드 코드 포인트의 빈 시퀀스로 한다.
  4. formalParameters를 다음 생성식의 인스턴스로 한다: FormalParameters : [empty]
  5. bodyFunctionOrdinaryFunctionCreate(%Function.prototype%, sourceText, formalParameters, ClassStaticBlockBody, non-lexical-this, lex, privateEnv)로 한다.
  6. MakeMethod(bodyFunction, homeObject)를 수행한다.
  7. ClassStaticBlockDefinition Record { [[BodyFunction]]: bodyFunction }을 반환한다.
참고
함수 bodyFunction은 ECMAScript 코드에서 직접 접근할 수 없습니다.

15.7.12 실행 시 의미론: EvaluateClassStaticBlockBody

구문 지향 연산 EvaluateClassStaticBlockBody는 functionObject(ECMAScript 함수 객체)를 인자로 받고, return completion 또는 throw completion을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

ClassStaticBlockBody : ClassStaticBlockStatementList
  1. Assert: functionObjectClassStaticBlockDefinitionEvaluation 단계 5에 의해 생성된 합성 함수이다.
  2. FunctionDeclarationInstantiation(functionObject, « »).를 수행한다.
  3. Evaluation of ClassStaticBlockStatementList를 수행한다.
  4. ReturnCompletion(undefined)를 반환한다.

15.7.13 실행 시 의미론: ClassElementEvaluation

구문 지향 연산 ClassElementEvaluation은 object(객체)를 인자로 받고, 내포된 normal completion에서 ClassFieldDefinition Record, ClassStaticBlockDefinition Record, PrivateElement, 또는 unused를 반환하거나, abrupt completion을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

ClassElement : FieldDefinition ; static FieldDefinition ;
  1. ClassFieldDefinitionEvaluation of FieldDefinitionobject 인자를 넘겨 반환한다.
ClassElement : MethodDefinition static MethodDefinition
  1. MethodDefinitionEvaluation of MethodDefinitionobjectfalse 인자를 넘겨 반환한다.
ClassElement : ClassStaticBlock
  1. ClassStaticBlockDefinitionEvaluation of ClassStaticBlockobject 인자를 넘겨 반환한다.
ClassElement : ;
  1. unused를 반환한다.

15.7.14 실행 시 의미론: ClassDefinitionEvaluation

구문 지향 연산 ClassDefinitionEvaluation은 classBinding(문자열 또는 undefined)과 className(프로퍼티 키 또는 Private Name) 인자를 받고, 내포된 normal completion에서 함수 객체를 반환하거나 abrupt completion을 반환합니다.

참고

명세의 편의를 위해, private 메서드와 접근자는 클래스 인스턴스의 [[PrivateElements]] 슬롯에 private 필드와 함께 포함되어 있습니다. 그러나 어떤 객체든 주어진 클래스에 의해 정의된 모든 private 메서드와 접근자를 가지거나, 아무것도 가지지 않습니다. 이 기능은 구현이 각 메서드 또는 접근자를 개별적으로 추적할 필요 없이, private 메서드와 접근자를 구현할 수 있도록 설계되었습니다.

예를 들어, 구현체는 인스턴스 private 메서드를 해당 Private Name에 직접 연결하고, 각 객체에 대해 어떤 클래스 생성자가 해당 객체를 this 값으로 실행했는지 추적할 수 있습니다. 객체에서 인스턴스 private 메서드를 조회하는 것은, 해당 메서드를 정의한 클래스 생성자가 객체를 초기화했는지 확인하고, Private Name에 연결된 메서드를 반환하는 것으로 구성됩니다.

이는 private 필드와는 다릅니다: 필드 이니셜라이저가 클래스 인스턴스화 중에 throw될 수 있기 때문에, 개별 객체는 주어진 클래스의 private 필드의 일부만 가질 수 있으므로, private 필드는 일반적으로 개별적으로 추적되어야 합니다.

다음 생성식에 대해 개별적으로 정의됩니다:

ClassTail : ClassHeritageopt { ClassBodyopt }
  1. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  2. classEnvNewDeclarativeEnvironment(env)로 한다.
  3. classBindingundefined가 아니면,
    1. classEnv.CreateImmutableBinding(classBinding, true)를 수행한다.
  4. outerPrivateEnvironment실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  5. classPrivateEnvironmentNewPrivateEnvironment(outerPrivateEnvironment)로 한다.
  6. ClassBody가 존재하면,
    1. ClassBodyPrivateBoundIdentifiers의 각 문자열 dn에 대해,
      1. classPrivateEnvironment.[[Names]]pn이라는 Private Name이 포함되어 있고, pn.[[Description]]dn인 경우,
        1. Assert: 이는 getter/setter 쌍에만 해당합니다.
      2. 그렇지 않으면,
        1. namedn[[Description]]으로 하는 새로운 Private Name로 한다.
        2. nameclassPrivateEnvironment.[[Names]]에 추가한다.
  7. ClassHeritage가 존재하지 않으면,
    1. protoParent%Object.prototype%로 한다.
    2. constructorParent%Function.prototype%로 한다.
  8. 그렇지 않으면,
    1. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 classEnv로 설정한다.
    2. 참고: 실행 중인 실행 컨텍스트의 PrivateEnvironment는 ClassHeritage 평가 시 outerPrivateEnvironment이다.
    3. superclassRefCompletion(Evaluation of ClassHeritage)로 한다.
    4. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 env로 설정한다.
    5. superclass를 ? GetValue(? superclassRef)로 한다.
    6. superclassnull이면,
      1. protoParentnull로 한다.
      2. constructorParent%Function.prototype%로 한다.
    7. 그렇지 않고 IsConstructor(superclass) 가 false이면,
      1. TypeError 예외를 throw한다.
    8. 그 밖의 경우,
      1. protoParent를 ? Get(superclass, "prototype")로 한다.
      2. protoParent객체가 아니거나 null이 아니라면, TypeError 예외를 throw한다.
      3. constructorParentsuperclass로 한다.
  9. protoOrdinaryObjectCreate(protoParent)로 한다.
  10. ClassBody가 존재하지 않으면 constructorempty로 한다.
  11. 그 밖에는, constructorClassBodyConstructorMethod로 한다.
  12. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 classEnv로 설정한다.
  13. 실행 중인 실행 컨텍스트의 PrivateEnvironment를 classPrivateEnvironment로 설정한다.
  14. constructorempty이면,
    1. defaultConstructor를 아무 인자도 받지 않고, 캡처하지 않으며, 호출 시 다음 단계를 수행하는 새로운 Abstract Closure로 한다:
      1. args를 이 함수에 [[Call]] 또는 [[Construct]]로 전달된 인자의 List로 한다.
      2. NewTarget이 undefined이면, TypeError 예외를 throw한다.
      3. F활성 함수 객체로 한다.
      4. F.[[ConstructorKind]]derived이면,
        1. 참고: 이 분기는 constructor(...args) { super(...args); }와 비슷하게 동작합니다. 가장 눈에 띄는 차이점은 위 ECMAScript 소스 텍스트가 %Symbol.iterator%%Array.prototype%에서 호출하는 반면, 이 함수는 호출하지 않는다는 점입니다.
        2. func를 ! F.[[GetPrototypeOf]]()로 한다.
        3. IsConstructor(func)가 false이면, TypeError 예외를 throw한다.
        4. result를 ? Construct(func, args, NewTarget)로 한다.
      5. 그 밖의 경우,
        1. 참고: 이 분기는 constructor() {}와 비슷하게 동작합니다.
        2. result를 ? OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%")로 한다.
      6. InitializeInstanceElements(result, F)를 수행한다.
      7. NormalCompletion(result)를 반환한다.
    2. FCreateBuiltinFunction(defaultConstructor, 0, className, « [[ConstructorKind]], [[SourceText]] », 현재 Realm Record, constructorParent)로 한다.
  15. 그 밖의 경우,
    1. constructorInfo를 ! DefineMethod of constructorprotoconstructorParent 인자를 넘겨 호출한 결과로 한다.
    2. FconstructorInfo.[[Closure]]로 한다.
    3. MakeClassConstructor(F)를 수행한다.
    4. SetFunctionName(F, className)을 수행한다.
  16. MakeConstructor(F, false, proto)를 수행한다.
  17. ClassHeritage가 존재하면 F.[[ConstructorKind]]derived로 설정한다.
  18. DefineMethodProperty(proto, "constructor", F, false)를 수행한다.
  19. ClassBody가 존재하지 않으면 elements를 새로운 빈 List로 한다.
  20. 그 밖에는, elementsClassBodyNonConstructorElements로 한다.
  21. instancePrivateMethods를 새로운 빈 List로 한다.
  22. staticPrivateMethods를 새로운 빈 List로 한다.
  23. instanceFields를 새로운 빈 List로 한다.
  24. staticElements를 새로운 빈 List로 한다.
  25. elements의 각 ClassElement e에 대해,
    1. IsStatic of efalse이면,
      1. elementCompletion(ClassElementEvaluation of eproto 인자를 넘겨 호출한 결과)로 한다.
    2. 그 밖에는,
      1. elementCompletion(ClassElementEvaluation of eF 인자를 넘겨 호출한 결과)로 한다.
    3. elementabrupt completion이면,
      1. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 env로 설정한다.
      2. 실행 중인 실행 컨텍스트의 PrivateEnvironment를 outerPrivateEnvironment로 설정한다.
      3. element를 반환한다.
    4. element를 ! element로 설정한다.
    5. elementPrivateElement이면,
      1. Assert: element.[[Kind]]method 또는 accessor이다.
      2. IsStatic of efalse이면, containerinstancePrivateMethods로 한다.
      3. 그 밖에는 containerstaticPrivateMethods로 한다.
      4. containerelement.[[Key]]와 동일한 pe라는 PrivateElement가 포함되어 있다면,
        1. Assert: element.[[Kind]]pe.[[Kind]]는 모두 accessor이다.
        2. element.[[Get]]undefined이면,
          1. combinedPrivateElement { [[Key]]: element.[[Key]], [[Kind]]: accessor, [[Get]]: pe.[[Get]], [[Set]]: element.[[Set]] }로 한다.
        3. 그 밖에는,
          1. combinedPrivateElement { [[Key]]: element.[[Key]], [[Kind]]: accessor, [[Get]]: element.[[Get]], [[Set]]: pe.[[Set]] }로 한다.
        4. containerpecombined로 교체한다.
      5. 그 밖에는,
        1. elementcontainer에 추가한다.
    6. 그 밖에 elementClassFieldDefinition Record이면,
      1. IsStatic of efalse이면, elementinstanceFields에 추가한다.
      2. 그 밖에는 elementstaticElements에 추가한다.
    7. 그 밖에 elementClassStaticBlockDefinition Record이면,
      1. elementstaticElements에 추가한다.
  26. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 env로 설정한다.
  27. classBindingundefined가 아니면,
    1. classEnv.InitializeBinding(classBinding, F)를 수행한다.
  28. F.[[PrivateMethods]]instancePrivateMethods로 설정한다.
  29. F.[[Fields]]instanceFields로 설정한다.
  30. staticPrivateMethods의 각 PrivateElement method에 대해,
    1. PrivateMethodOrAccessorAdd(F, method)를 수행한다.
  31. staticElements의 각 elementRecord에 대해,
    1. elementRecordClassFieldDefinition Record이면,
      1. resultCompletion(DefineField(F, elementRecord))로 한다.
    2. 그 밖에는,
      1. Assert: elementRecordClassStaticBlockDefinition Record이다.
      2. resultCompletion(Call(elementRecord.[[BodyFunction]], F))로 한다.
    3. resultabrupt completion이면,
      1. 실행 중인 실행 컨텍스트의 PrivateEnvironment를 outerPrivateEnvironment로 설정한다.
      2. result를 반환한다.
  32. 실행 중인 실행 컨텍스트의 PrivateEnvironment를 outerPrivateEnvironment로 설정한다.
  33. F를 반환한다.

15.7.15 실행 시 의미론: BindingClassDeclarationEvaluation

구문 지향 연산 BindingClassDeclarationEvaluation은 인자를 받지 않으며, 내포된 normal completion에서 함수 객체를 반환하거나 abrupt completion을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

ClassDeclaration : class BindingIdentifier ClassTail
  1. classNameBindingIdentifierStringValue로 한다.
  2. value를 ? ClassDefinitionEvaluation of ClassTailclassNameclassName 인자를 넘겨 호출한 결과로 한다.
  3. value.[[SourceText]]ClassDeclaration에 매치된 소스 텍스트로 설정한다.
  4. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  5. InitializeBoundName(className, value, env)를 수행한다.
  6. value를 반환한다.
ClassDeclaration : class ClassTail
  1. value를 ? ClassDefinitionEvaluation of ClassTailundefined"default" 인자를 넘겨 호출한 결과로 한다.
  2. value.[[SourceText]]ClassDeclaration에 매치된 소스 텍스트로 설정한다.
  3. value를 반환한다.
참고

ClassDeclaration : class ClassTail ExportDeclaration의 일부로만 나타나며, 바인딩의 생성은 해당 생성식의 평가 작업의 일부로 처리됩니다. 16.2.3.7를 참조하세요.

15.7.16 실행 시 의미론: Evaluation

ClassDeclaration : class BindingIdentifier ClassTail
  1. BindingClassDeclarationEvaluation of this ClassDeclaration를 수행한다.
  2. empty를 반환한다.
참고

ClassDeclaration : class ClassTail ExportDeclaration의 일부로만 나타나며 직접적으로 평가되지 않습니다.

ClassExpression : class ClassTail
  1. value를 ? ClassDefinitionEvaluation of ClassTailundefined"" 인자를 넘겨 호출한 결과로 한다.
  2. value.[[SourceText]]ClassExpression에 매치된 소스 텍스트로 설정한다.
  3. value를 반환한다.
ClassExpression : class BindingIdentifier ClassTail
  1. classNameBindingIdentifierStringValue로 한다.
  2. value를 ? ClassDefinitionEvaluation of ClassTailclassNameclassName 인자를 넘겨 호출한 결과로 한다.
  3. value.[[SourceText]]ClassExpression에 매치된 소스 텍스트로 설정한다.
  4. value를 반환한다.
ClassElementName : PrivateIdentifier
  1. privateIdentifierPrivateIdentifierStringValue로 한다.
  2. privateEnvRec실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  3. namesprivateEnvRec.[[Names]]로 한다.
  4. Assert: names의 정확히 한 요소는 [[Description]]privateIdentifierPrivate Name이다.
  5. privateNamenames에서 [[Description]]privateIdentifierPrivate Name로 한다.
  6. privateName을 반환한다.
ClassStaticBlockStatementList : [empty]
  1. undefined를 반환한다.

15.8 비동기 함수 정의

구문

AsyncFunctionDeclaration[Yield, Await, Default] : async [여기에는 LineTerminator 없음] function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } [+Default] async [여기에는 LineTerminator 없음] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionExpression : async [여기에는 LineTerminator 없음] function BindingIdentifier[~Yield, +Await]opt ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncMethod[Yield, Await] : async [여기에는 LineTerminator 없음] ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionBody : FunctionBody[~Yield, +Await] AwaitExpression[Yield] : await UnaryExpression[?Yield, +Await] 참고 1

await[Await] 파라미터가 있을 때 AwaitExpression키워드로 파싱됩니다. [Await] 파라미터는 다음 컨텍스트의 최상위에서 존재하지만, FunctionBody 등의 일부 컨텍스트에서는 비활성일 수 있습니다:

Script가 구문적 목표 기호일 때, [Await] 파라미터가 없으면 await는 식별자로 파싱될 수 있습니다. 다음과 같은 컨텍스트를 포함합니다:

참고 2

YieldExpression과 달리, AwaitExpression의 피연산자를 생략하면 문법 오류입니다. 반드시 await할 대상이 필요합니다.

15.8.1 정적 의미론: 초기 에러

AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody } AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody } async function ( FormalParameters ) { AsyncFunctionBody } AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }

15.8.2 실행 시 의미론: InstantiateAsyncFunctionObject

구문 지향 연산 InstantiateAsyncFunctionObject는 env(Environment Record)와 privateEnv(PrivateEnvironment Record 또는 null) 인자를 받고, ECMAScript 함수 객체를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

AsyncFunctionDeclaration : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
  1. nameBindingIdentifierStringValue로 한다.
  2. sourceTextAsyncFunctionDeclaration에 매치된 소스 텍스트로 한다.
  3. FOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv)로 한다.
  4. SetFunctionName(F, name)을 수행한다.
  5. F를 반환한다.
AsyncFunctionDeclaration : async function ( FormalParameters ) { AsyncFunctionBody }
  1. sourceTextAsyncFunctionDeclaration에 매치된 소스 텍스트로 한다.
  2. FOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv)로 한다.
  3. SetFunctionName(F, "default")를 수행한다.
  4. F를 반환한다.

15.8.3 실행 시 의미론: InstantiateAsyncFunctionExpression

구문 지향 연산 InstantiateAsyncFunctionExpression은 선택적 인자 name(프로퍼티 키 또는 Private Name)를 받고, ECMAScript 함수 객체를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

AsyncFunctionExpression : async function ( FormalParameters ) { AsyncFunctionBody }
  1. name이 존재하지 않으면 name""로 설정한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceTextAsyncFunctionExpression에 매치된 소스 텍스트로 한다.
  5. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, env, privateEnv)로 한다.
  6. SetFunctionName(closure, name)을 수행한다.
  7. closure를 반환한다.
AsyncFunctionExpression : async function BindingIdentifier ( FormalParameters ) { AsyncFunctionBody }
  1. Assert: name이 존재하지 않는다.
  2. nameBindingIdentifierStringValue로 설정한다.
  3. outerEnv실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  4. funcEnvNewDeclarativeEnvironment(outerEnv)로 한다.
  5. funcEnv.CreateImmutableBinding(name, false)을 수행한다.
  6. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  7. sourceTextAsyncFunctionExpression에 매치된 소스 텍스트로 한다.
  8. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, FormalParameters, AsyncFunctionBody, non-lexical-this, funcEnv, privateEnv)로 한다.
  9. SetFunctionName(closure, name)을 수행한다.
  10. funcEnv.InitializeBinding(name, closure)을 수행한다.
  11. closure를 반환한다.
참고

BindingIdentifierAsyncFunctionExpression에 포함되어 있을 경우, AsyncFunctionExpressionAsyncFunctionBody 내부에서 참조할 수 있으므로 함수 코드가 자기 자신을 재귀적으로 호출할 수 있습니다. 그러나 FunctionDeclaration의 경우와는 달리, BindingIdentifierAsyncFunctionExpression에 포함되어 있을 경우, AsyncFunctionExpression을 둘러싼 스코프에서 참조할 수 없으며, 그 스코프에 영향을 주지 않습니다.

15.8.4 실행 시 의미론: EvaluateAsyncFunctionBody

구문 지향 연산 EvaluateAsyncFunctionBody는 functionObject(ECMAScript 함수 객체)와 argumentsList(List 타입의 ECMAScript 언어 값 목록) 인자를 받고, return completion을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

AsyncFunctionBody : FunctionBody
  1. promiseCapability를 ! NewPromiseCapability(%Promise%)로 한다.
  2. completionCompletion(FunctionDeclarationInstantiation(functionObject, argumentsList))로 한다.
  3. completionabrupt completion이면,
    1. Call(promiseCapability.[[Reject]], undefined, « completion.[[Value]] »)를 수행한다.
  4. 그 밖에는,
    1. AsyncFunctionStart(promiseCapability, FunctionBody)를 수행한다.
  5. ReturnCompletion(promiseCapability.[[Promise]])를 반환한다.

15.8.5 실행 시 의미론: Evaluation

AsyncFunctionExpression : async function BindingIdentifieropt ( FormalParameters ) { AsyncFunctionBody }
  1. InstantiateAsyncFunctionExpression of AsyncFunctionExpression를 반환한다.
AwaitExpression : await UnaryExpression
  1. exprRef를 ? Evaluation of UnaryExpression로 한다.
  2. value를 ? GetValue(exprRef)로 한다.
  3. Await(value)를 반환한다.

15.9 비동기 화살표 함수 정의

구문

AsyncArrowFunction[In, Yield, Await] : async [여기에는 LineTerminator 없음] AsyncArrowBindingIdentifier[?Yield] [여기에는 LineTerminator 없음] => AsyncConciseBody[?In] CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [여기에는 LineTerminator 없음] => AsyncConciseBody[?In] AsyncConciseBody[In] : [lookahead ≠ {] ExpressionBody[?In, +Await] { AsyncFunctionBody } AsyncArrowBindingIdentifier[Yield] : BindingIdentifier[?Yield, +Await] CoverCallExpressionAndAsyncArrowHead[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

보충 구문

다음 생성식의 인스턴스를 처리할 때
AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
CoverCallExpressionAndAsyncArrowHead의 해석은 다음 문법을 사용하여 정제됩니다:

AsyncArrowHead : async [여기에는 LineTerminator 없음] ArrowFormalParameters[~Yield, +Await]

15.9.1 정적 의미론: 초기 에러

AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody

15.9.2 정적 의미론: AsyncConciseBodyContainsUseStrict

구문 지향 연산 AsyncConciseBodyContainsUseStrict는 인자를 받지 않으며, Boolean을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

AsyncConciseBody : ExpressionBody
  1. false를 반환한다.
AsyncConciseBody : { AsyncFunctionBody }
  1. AsyncFunctionBodyFunctionBodyContainsUseStrict를 반환한다.

15.9.3 실행 시 의미론: EvaluateAsyncConciseBody

구문 지향 연산 EvaluateAsyncConciseBody는 functionObject(ECMAScript 함수 객체)와 argumentsList(List 타입의 ECMAScript 언어 값 목록) 인자를 받고, return completion을 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

AsyncConciseBody : ExpressionBody
  1. promiseCapability를 ! NewPromiseCapability(%Promise%)로 한다.
  2. completionCompletion(FunctionDeclarationInstantiation(functionObject, argumentsList))로 한다.
  3. completionabrupt completion이면,
    1. Call(promiseCapability.[[Reject]], undefined, « completion.[[Value]] »)를 수행한다.
  4. 그 밖에는,
    1. AsyncFunctionStart(promiseCapability, ExpressionBody)를 수행한다.
  5. ReturnCompletion(promiseCapability.[[Promise]])를 반환한다.

15.9.4 실행 시 의미론: InstantiateAsyncArrowFunctionExpression

구문 지향 연산 InstantiateAsyncArrowFunctionExpression은 선택적 인자 name(프로퍼티 키 또는 Private Name)를 받고, ECMAScript 함수 객체를 반환합니다. 다음 생성식에 대해 개별적으로 정의됩니다:

AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody
  1. name이 존재하지 않으면 name""로 설정한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceTextAsyncArrowFunction에 매치된 소스 텍스트로 한다.
  5. parametersAsyncArrowBindingIdentifier로 한다.
  6. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, parameters, AsyncConciseBody, lexical-this, env, privateEnv)로 한다.
  7. SetFunctionName(closure, name)을 수행한다.
  8. closure를 반환한다.
AsyncArrowFunction : CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. name이 존재하지 않으면 name""로 설정한다.
  2. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  3. privateEnv실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
  4. sourceTextAsyncArrowFunction에 매치된 소스 텍스트로 한다.
  5. headAsyncArrowHead로 한다. 이는 CoverCallExpressionAndAsyncArrowHead에 의해 덮여진 것이다.
  6. parametersheadArrowFormalParameters로 한다.
  7. closureOrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, parameters, AsyncConciseBody, lexical-this, env, privateEnv)로 한다.
  8. SetFunctionName(closure, name)을 수행한다.
  9. closure를 반환한다.

15.9.5 실행 시 의미론: 평가

AsyncArrowFunction : async AsyncArrowBindingIdentifier => AsyncConciseBody CoverCallExpressionAndAsyncArrowHead => AsyncConciseBody
  1. InstantiateAsyncArrowFunctionExpression of AsyncArrowFunction를 반환한다.

15.10 꼬리 위치 호출

15.10.1 정적 의미: IsInTailPosition ( call )

추상 연산 IsInTailPosition은 call ( CallExpression 구문 노드, MemberExpression 구문 노드, 또는 OptionalChain 구문 노드)를 인수로 받아 Boolean을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. IsStrict(call)이 false이면, false를 반환합니다.
  2. callFunctionBody, ConciseBody, 또는 AsyncConciseBody에 포함되어 있지 않으면, false를 반환합니다.
  3. bodyFunctionBody, ConciseBody, 또는 AsyncConciseBodycall을 가장 밀접하게 포함하는 것으로 설정합니다.
  4. bodyFunctionBodyGeneratorBody라면, false를 반환합니다.
  5. bodyFunctionBodyAsyncFunctionBody라면, false를 반환합니다.
  6. bodyFunctionBodyAsyncGeneratorBody라면, false를 반환합니다.
  7. bodyAsyncConciseBody라면, false를 반환합니다.
  8. body와 인수 callHasCallInTailPosition의 결과를 반환합니다.
참고

꼬리 위치 호출은 엄격 모드 코드에서만 정의됩니다. 이는 호출자 컨텍스트 체인의 관찰을 가능하게 하는 일반적인 비표준 언어 확장(10.2.4) 때문입니다.

15.10.2 정적 의미: HasCallInTailPosition

구문-지향 연산 HasCallInTailPosition은 call ( CallExpression 구문 노드, MemberExpression 구문 노드, 또는 OptionalChain 구문 노드)를 인수로 받아 Boolean을 반환합니다.

참고 1

call은 특정 소스 텍스트 범위를 나타내는 구문 노드입니다. 아래 알고리즘이 call을 다른 구문 노드와 비교할 때, 이는 동일한 소스 텍스트를 나타내는지 테스트하는 것입니다.

참고 2

반환 GetValue 결과가 즉시 뒤따르는 잠재적 꼬리 위치 호출도 꼬리 위치 호출이 될 수 있습니다. 함수 호출은 참조 레코드를 반환할 수 없으므로, 이러한 GetValue 연산은 항상 실제 함수 호출 결과와 동일한 값을 반환합니다.

다음 생성 규칙에 따라 개별적으로 정의됩니다:

StatementList : StatementList StatementListItem
  1. hasHasCallInTailPositionStatementList와 인수 call의 결과로 설정한다.
  2. hastrue이면, true를 반환한다.
  3. HasCallInTailPositionStatementListItem와 인수 call의 결과를 반환한다.
FunctionStatementList : [empty] StatementListItem : Declaration Statement : VariableStatement EmptyStatement ExpressionStatement ContinueStatement BreakStatement ThrowStatement DebuggerStatement Block : { } ReturnStatement : return ; LabelledItem : FunctionDeclaration ForInOfStatement : for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement CaseBlock : { }
  1. false를 반환한다.
IfStatement : if ( Expression ) Statement else Statement
  1. has를 첫 번째 Statement와 인수 callHasCallInTailPosition의 결과로 설정한다.
  2. hastrue이면, true를 반환한다.
  3. 두 번째 Statement와 인수 callHasCallInTailPosition의 결과를 반환한다.
IfStatement : if ( Expression ) Statement DoWhileStatement : do Statement while ( Expression ) ; WhileStatement : while ( Expression ) Statement ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement WithStatement : with ( Expression ) Statement
  1. HasCallInTailPositionStatement와 인수 call의 결과를 반환한다.
LabelledStatement : LabelIdentifier : LabelledItem
  1. HasCallInTailPositionLabelledItem와 인수 call의 결과를 반환한다.
ReturnStatement : return Expression ;
  1. HasCallInTailPositionExpression와 인수 call의 결과를 반환한다.
SwitchStatement : switch ( Expression ) CaseBlock
  1. HasCallInTailPositionCaseBlock와 인수 call의 결과를 반환한다.
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. hasfalse로 설정한다.
  2. 첫 번째 CaseClauses가 존재하면, has를 첫 번째 CaseClauses와 인수 callHasCallInTailPosition의 결과로 설정한다.
  3. hastrue이면, true를 반환한다.
  4. hasDefaultClause와 인수 callHasCallInTailPosition의 결과로 설정한다.
  5. hastrue이면, true를 반환한다.
  6. 두 번째 CaseClauses가 존재하면, has를 두 번째 CaseClauses와 인수 callHasCallInTailPosition의 결과로 설정한다.
  7. has를 반환한다.
CaseClauses : CaseClauses CaseClause
  1. hasCaseClauses와 인수 callHasCallInTailPosition의 결과로 설정한다.
  2. hastrue이면, true를 반환한다.
  3. CaseClause와 인수 callHasCallInTailPosition의 결과를 반환한다.
CaseClause : case Expression : StatementListopt DefaultClause : default : StatementListopt
  1. StatementList가 존재하면, HasCallInTailPositionStatementList와 인수 call의 결과를 반환한다.
  2. false를 반환한다.
TryStatement : try Block Catch
  1. HasCallInTailPositionCatch와 인수 call의 결과를 반환한다.
TryStatement : try Block Finally try Block Catch Finally
  1. HasCallInTailPositionFinally와 인수 call의 결과를 반환한다.
Catch : catch ( CatchParameter ) Block
  1. HasCallInTailPositionBlock와 인수 call의 결과를 반환한다.
AssignmentExpression : YieldExpression ArrowFunction AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression LeftHandSideExpression &&= AssignmentExpression LeftHandSideExpression ||= AssignmentExpression LeftHandSideExpression ??= AssignmentExpression BitwiseANDExpression : BitwiseANDExpression & EqualityExpression BitwiseXORExpression : BitwiseXORExpression ^ BitwiseANDExpression BitwiseORExpression : BitwiseORExpression | BitwiseXORExpression EqualityExpression : EqualityExpression == RelationalExpression EqualityExpression != RelationalExpression EqualityExpression === RelationalExpression EqualityExpression !== RelationalExpression RelationalExpression : RelationalExpression < ShiftExpression RelationalExpression > ShiftExpression RelationalExpression <= ShiftExpression RelationalExpression >= ShiftExpression RelationalExpression instanceof ShiftExpression RelationalExpression in ShiftExpression PrivateIdentifier in ShiftExpression ShiftExpression : ShiftExpression << AdditiveExpression ShiftExpression >> AdditiveExpression ShiftExpression >>> AdditiveExpression AdditiveExpression : AdditiveExpression + MultiplicativeExpression AdditiveExpression - MultiplicativeExpression MultiplicativeExpression : MultiplicativeExpression MultiplicativeOperator ExponentiationExpression ExponentiationExpression : UpdateExpression ** ExponentiationExpression UpdateExpression : LeftHandSideExpression ++ LeftHandSideExpression -- ++ UnaryExpression -- UnaryExpression UnaryExpression : delete UnaryExpression void UnaryExpression typeof UnaryExpression + UnaryExpression - UnaryExpression ~ UnaryExpression ! UnaryExpression AwaitExpression CallExpression : SuperCall ImportCall CallExpression [ Expression ] CallExpression . IdentifierName CallExpression . PrivateIdentifier NewExpression : new NewExpression MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier PrimaryExpression : this IdentifierReference Literal ArrayLiteral ObjectLiteral FunctionExpression ClassExpression GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral
  1. false를 반환한다.
Expression : AssignmentExpression Expression , AssignmentExpression
  1. HasCallInTailPositionAssignmentExpression와 인수 call의 결과를 반환한다.
ConditionalExpression : ShortCircuitExpression ? AssignmentExpression : AssignmentExpression
  1. has를 첫 번째 AssignmentExpression와 인수 callHasCallInTailPosition의 결과로 설정한다.
  2. hastrue이면, true를 반환한다.
  3. 두 번째 AssignmentExpression와 인수 callHasCallInTailPosition의 결과를 반환한다.
LogicalANDExpression : LogicalANDExpression && BitwiseORExpression
  1. HasCallInTailPositionBitwiseORExpression와 인수 call의 결과를 반환한다.
LogicalORExpression : LogicalORExpression || LogicalANDExpression
  1. HasCallInTailPositionLogicalANDExpression와 인수 call의 결과를 반환한다.
CoalesceExpression : CoalesceExpressionHead ?? BitwiseORExpression
  1. HasCallInTailPositionBitwiseORExpression와 인수 call의 결과를 반환한다.
CallExpression : CoverCallExpressionAndAsyncArrowHead CallExpression Arguments CallExpression TemplateLiteral
  1. CallExpressioncall이면, true를 반환한다.
  2. false를 반환한다.
OptionalExpression : MemberExpression OptionalChain CallExpression OptionalChain OptionalExpression OptionalChain
  1. HasCallInTailPositionOptionalChain와 인수 call의 결과를 반환한다.
OptionalChain : ?. [ Expression ] ?. IdentifierName ?. PrivateIdentifier OptionalChain [ Expression ] OptionalChain . IdentifierName OptionalChain . PrivateIdentifier
  1. false를 반환한다.
OptionalChain : ?. Arguments OptionalChain Arguments
  1. OptionalChaincall이면, true를 반환한다.
  2. false를 반환한다.
MemberExpression : MemberExpression TemplateLiteral
  1. MemberExpressioncall이면, true를 반환한다.
  2. false를 반환한다.
PrimaryExpression : CoverParenthesizedExpressionAndArrowParameterList
  1. exprParenthesizedExpression에서 coveredCoverParenthesizedExpressionAndArrowParameterList로 설정한다.
  2. HasCallInTailPositionexpr와 인수 call의 결과를 반환한다.
ParenthesizedExpression : ( Expression )
  1. HasCallInTailPositionExpression와 인수 call의 결과를 반환한다.

15.10.3 PrepareForTailCall ( )

추상 연산 PrepareForTailCall은 인수를 받지 않으며 unused를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: 현재 execution context는 이후 ECMAScript 코드 또는 내장 함수의 평가에 사용되지 않는다. 이 추상 연산 호출 이후의 Call 호출은 그러한 평가를 수행하기 전에 새로운 execution context를 생성하고 푸시한다.
  2. 현재 execution context와 연관된 모든 리소스를 폐기한다.
  3. unused를 반환한다.

꼬리 위치 호출은 대상 함수를 호출하기 전에 현재 실행 중인 함수의 execution context와 연관된 임시 내부 리소스를 해제하거나, 그 리소스를 대상 함수 지원에 재사용해야 한다.

참고

예를 들어, 꼬리 위치 호출은 구현의 activation record 스택을 대상 함수의 activation record 크기가 호출 함수의 activation record 크기를 초과하는 만큼만 증가시켜야 한다. 만약 대상 함수의 activation record가 더 작다면 전체 스택 크기는 줄어야 한다.

16 ECMAScript 언어: 스크립트와 모듈

16.1 스크립트

구문

Script : ScriptBodyopt ScriptBody : StatementList[~Yield, ~Await, ~Return]

16.1.1 정적 의미: 초기 에러

Script : ScriptBody ScriptBody : StatementList

16.1.2 정적 의미: ScriptIsStrict

구문-지향 연산 ScriptIsStrict는 인수를 받지 않으며 Boolean을 반환한다. 다음 생성 규칙에 따라 개별적으로 정의된다:

Script : ScriptBodyopt
  1. ScriptBody가 존재하고 Directive PrologueUse Strict Directive를 포함하면 true를 반환하고, 그렇지 않으면 false를 반환한다.

16.1.3 실행 의미: 평가

Script : [empty]
  1. undefined를 반환한다.

16.1.4 스크립트 레코드

스크립트 레코드는 평가 중인 스크립트에 대한 정보를 캡슐화한다. 각 스크립트 레코드는 표 39에 나열된 필드를 포함한다.

표 39: 스크립트 레코드 필드
필드 이름 값 타입 의미
[[Realm]] Realm 레코드 이 스크립트가 생성된 realm.
[[ECMAScriptCode]] Script 구문 노드 이 스크립트의 소스 텍스트를 파싱한 결과.
[[LoadedModules]] List of LoadedModuleRequest 레코드 이 스크립트가 import한 명세자 문자열에서 해결된 모듈 레코드에 대한 매핑. 이 리스트에는 레코드 r1r2가 모두 포함될 수 없으며 ModuleRequestsEqual(r1, r2)가 true가 되는 경우는 없다.
[[HostDefined]] 아무 값이나 (기본값은 empty) 호스트 환경이 스크립트에 추가 정보를 연결할 필요가 있을 때 사용하는 필드.

16.1.5 ParseScript ( sourceText, realm, hostDefined )

추상 연산 ParseScript는 sourceText (ECMAScript 소스 텍스트), realm (Realm 레코드), hostDefined (아무 값) 인자를 받아 스크립트 레코드 또는 List (비어있지 않은 SyntaxError 객체 목록)을 반환한다. sourceTextScript로 파싱한 결과에 기반하여 스크립트 레코드를 생성한다. 호출 시 다음 단계를 수행한다:

  1. scriptParseText(sourceText, Script)로 설정한다.
  2. script가 에러의 List라면 script를 반환한다.
  3. 스크립트 레코드 { [[Realm]]: realm, [[ECMAScriptCode]]: script, [[LoadedModules]]: « », [[HostDefined]]: hostDefined }를 반환한다.
참고

구현체는 ParseScript가 실제로 해당 소스 텍스트에 대해 수행되기 전에 스크립트 소스 텍스트를 파싱하고 초기 에러 조건을 분석할 수 있다. 하지만 에러 보고는 이 명세가 해당 소스 텍스트에 대해 실제로 ParseScript를 수행하는 시점까지 지연되어야 한다.

16.1.6 ScriptEvaluation ( scriptRecord )

추상 연산 ScriptEvaluation은 scriptRecord (스크립트 레코드)를 인자로 받아 정상 완료(normal completion) (내부에 ECMAScript 언어 값를 포함) 또는 비정상 완료(abrupt completion)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. globalEnvscriptRecord.[[Realm]].[[GlobalEnv]]로 설정한다.
  2. scriptContext를 새로운 ECMAScript 코드 실행 컨텍스트로 설정한다.
  3. scriptContext의 Function을 null로 설정한다.
  4. scriptContextRealmscriptRecord.[[Realm]]으로 설정한다.
  5. scriptContext의 ScriptOrModule을 scriptRecord로 설정한다.
  6. scriptContext의 VariableEnvironment를 globalEnv로 설정한다.
  7. scriptContext의 LexicalEnvironment를 globalEnv로 설정한다.
  8. scriptContext의 PrivateEnvironment를 null로 설정한다.
  9. 실행 중인 실행 컨텍스트를 일시 중지한다.
  10. scriptContext실행 컨텍스트 스택에 푸시한다; scriptContext가 이제 실행 중인 실행 컨텍스트가 된다.
  11. scriptscriptRecord.[[ECMAScriptCode]]로 설정한다.
  12. resultCompletion(GlobalDeclarationInstantiation(script, globalEnv))로 설정한다.
  13. result정상 완료(normal completion)이면,
    1. resultCompletion(Evaluation of script)로 설정한다.
    2. result정상 완료(normal completion)이고 result.[[Value]]empty이면,
      1. resultNormalCompletion(undefined)로 설정한다.
  14. scriptContext를 일시 중지하고 실행 컨텍스트 스택에서 제거한다.
  15. Assert: 실행 컨텍스트 스택는 비어 있지 않다.
  16. 실행 컨텍스트 스택의 최상단에 있는 컨텍스트를 실행 중인 실행 컨텍스트로 복구한다.
  17. result를 반환한다.

16.1.7 GlobalDeclarationInstantiation ( script, env )

추상 연산 GlobalDeclarationInstantiation은 script (Script 구문 노드)와 env (글로벌 환경 레코드)를 인자로 받으며, 정상 완료(normal completion) (unused 포함) 또는 throw completion를 반환한다. scriptexecution context가 설정되는 Script이며, env는 바인딩이 생성될 글로벌 환경이다.

참고 1

스크립트 평가를 위해 execution context가 설정될 때, 선언은 현재 글로벌 환경에 인스턴스화된다. 코드에 선언된 각 글로벌 바인딩이 인스턴스화된다.

호출 시 다음 단계를 수행한다:

  1. lexNamesscriptLexicallyDeclaredNames로 설정한다.
  2. varNamesscriptVarDeclaredNames로 설정한다.
  3. lexNames의 각 요소 name에 대해,
    1. HasLexicalDeclaration(env, name)가 true이면 SyntaxError 예외를 throw한다.
    2. hasRestrictedGlobal를 ? HasRestrictedGlobalProperty(env, name)로 설정한다.
    3. 참고: 글로벌 varfunction 바인딩(비엄격 직접 eval에서 도입된 것을 제외)은 non-configurable이므로 restricted global properties이다.
    4. hasRestrictedGlobaltrue이면 SyntaxError 예외를 throw한다.
  4. varNames의 각 요소 name에 대해,
    1. HasLexicalDeclaration(env, name)가 true이면 SyntaxError 예외를 throw한다.
  5. varDeclarationsscriptVarScopedDeclarations로 설정한다.
  6. functionsToInitialize를 새로운 빈 List로 설정한다.
  7. declaredFunctionNames를 새로운 빈 List로 설정한다.
  8. varDeclarations의 각 요소 d에 대해, 역순 List 순서로,
    1. dVariableDeclaration, ForBinding, BindingIdentifier 모두가 아니라면,
      1. Assert: dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration 중 하나이다.
      2. 참고: 동일 이름의 함수 선언이 여러 개면 마지막 선언이 사용된다.
      3. fndBoundNames의 단일 요소로 설정한다.
      4. declaredFunctionNamesfn을 포함하지 않으면,
        1. fnDefinable을 ? CanDeclareGlobalFunction(env, fn)로 설정한다.
        2. fnDefinablefalse이면 TypeError 예외를 throw한다.
        3. fndeclaredFunctionNames에 추가한다.
        4. dfunctionsToInitialize의 첫 번째 요소로 삽입한다.
  9. declaredVarNames를 새로운 빈 List로 설정한다.
  10. varDeclarations의 각 요소 d에 대해,
    1. dVariableDeclaration, ForBinding, BindingIdentifier 중 하나라면,
      1. dBoundNames의 각 문자열 vn에 대해,
        1. declaredFunctionNamesvn을 포함하지 않으면,
          1. vnDefinable을 ? CanDeclareGlobalVar(env, vn)로 설정한다.
          2. vnDefinablefalse이면 TypeError 예외를 throw한다.
          3. declaredVarNamesvn을 포함하지 않으면,
            1. vndeclaredVarNames에 추가한다.
  11. 참고: global objectordinary object이면 이 알고리즘 단계 이후 비정상 종료가 발생하지 않는다. 하지만 global objectProxy exotic object라면 이후 단계에서 비정상 종료를 유발할 수 있다.
  12. 참고: 부록 B.3.2.2에서 이 지점에 추가 단계를 삽입한다.
  13. lexDeclarationsscriptLexicallyScopedDeclarations로 설정한다.
  14. privateEnvnull로 설정한다.
  15. lexDeclarations의 각 요소 d에 대해,
    1. 참고: 렉시컬 선언 이름은 여기서 인스턴스화만 되고 초기화는 되지 않는다.
    2. dBoundNames의 각 요소 dn에 대해,
      1. IsConstantDeclaration(d)가 true이면,
        1. ? env.CreateImmutableBinding(dn, true)를 수행한다.
      2. 그 외에는,
        1. ? env.CreateMutableBinding(dn, false)를 수행한다.
  16. functionsToInitialize의 각 구문 노드 f에 대해,
    1. fnfBoundNames의 단일 요소로 설정한다.
    2. fof에 대해 InstantiateFunctionObjectenvprivateEnv 인자로 호출한 결과로 설정한다.
    3. ? CreateGlobalFunctionBinding(env, fn, fo, false)를 수행한다.
  17. declaredVarNames의 각 문자열 vn에 대해,
    1. ? CreateGlobalVarBinding(env, vn, false)를 수행한다.
  18. unused를 반환한다.
참고 2

초기 에러16.1.1에서 함수/var 선언과 let/const/class 선언 간의 이름 충돌 및 단일 Script 내에서의 let/const/class 바인딩 재선언을 방지한다. 그러나 여러 Script에 걸친 충돌 및 재선언은 GlobalDeclarationInstantiation 실행 중 런타임 에러로 감지된다. 이러한 에러가 감지되면 스크립트에 대해 어떤 바인딩도 인스턴스화되지 않는다. 하지만 global objectProxy exotic object로 정의된 경우, 런타임 충돌 선언 검사가 신뢰할 수 없어 비정상 완료(abrupt completion)와 일부 글로벌 선언이 인스턴스화되지 않을 수 있다. 이 경우 Script의 코드는 평가되지 않는다.

명시적인 var 또는 function 선언과 달리, global object에 직접 생성된 프로퍼티는 let/const/class 선언에 의해 그림자 처리될 수 있다.

16.2 모듈

구문

Module : ModuleBodyopt ModuleBody : ModuleItemList ModuleItemList : ModuleItem ModuleItemList ModuleItem ModuleItem : ImportDeclaration ExportDeclaration StatementListItem[~Yield, +Await, ~Return] ModuleExportName : IdentifierName StringLiteral

16.2.1 모듈 의미론

16.2.1.1 정적 의미: 초기 에러

ModuleBody : ModuleItemList 참고

중복 ExportedNames 규칙은 하나의 ModuleBody 내에 여러 export default ExportDeclaration 항목이 있으면 구문 에러임을 의미한다. 충돌 또는 중복 선언과 관련된 추가 에러 조건은 Module의 평가 이전, 모듈 연결 단계에서 검사된다. 이러한 에러가 감지되면 Module는 평가되지 않는다.

ModuleExportName : StringLiteral

16.2.1.2 정적 의미: ImportedLocalNames( importEntries )

추상 연산 ImportedLocalNames는 importEntries(List of ImportEntry Record)를 인자로 받고, 문자열 List를 반환한다. importEntries로 정의된 모든 지역 이름 바인딩의 List를 생성한다. 호출 시 다음 단계를 수행한다:

  1. localNames를 새로운 빈 List로 설정한다.
  2. importEntries의 각 ImportEntry Record i에 대해,
    1. i.[[LocalName]]localNames에 추가한다.
  3. localNames를 반환한다.

16.2.1.3 ModuleRequest 레코드

ModuleRequest Record는 주어진 import 속성으로 모듈을 import하기 위한 요청을 나타낸다. 다음 필드로 구성된다:

표 40: ModuleRequest Record 필드
필드 이름 값 타입 의미
[[Specifier]] 문자열 모듈 지정자
[[Attributes]] List of ImportAttribute Record import 속성들

LoadedModuleRequest Record는 모듈 import 요청과 결과 Module Record를 함께 나타낸다. 표 40에 정의된 필드에 [[Module]]이 추가된다:

표 41: LoadedModuleRequest Record 필드
필드 이름 값 타입 의미
[[Specifier]] 문자열 모듈 지정자
[[Attributes]] List of ImportAttribute Record import 속성들
[[Module]] Module Record 해당 모듈 요청에 대한 로드된 모듈

ImportAttribute Record는 다음 필드로 구성된다:

표 42: ImportAttribute Record 필드
필드 이름 값 타입 의미
[[Key]] 문자열 속성 key
[[Value]] 문자열 속성 value

16.2.1.3.1 ModuleRequestsEqual ( left, right )

추상 연산 ModuleRequestsEqual은 left(ModuleRequest Record 또는 LoadedModuleRequest Record) 와 right(ModuleRequest Record 또는 LoadedModuleRequest Record) 를 인자로 받고, Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. left.[[Specifier]]right.[[Specifier]]와 다르면 false를 반환한다.
  2. leftAttrsleft.[[Attributes]]로 설정한다.
  3. rightAttrsright.[[Attributes]]로 설정한다.
  4. leftAttrsCountleftAttrs의 요소 개수로 설정한다.
  5. rightAttrsCountrightAttrs의 요소 개수로 설정한다.
  6. leftAttrsCountrightAttrsCount이면 false를 반환한다.
  7. leftAttrs의 각 ImportAttribute Record l에 대해,
    1. rightAttrsl.[[Key]]l.[[Value]]가 동일한 ImportAttribute Record r가 없으면 false를 반환한다.
  8. true를 반환한다.

16.2.1.4 정적 의미: ModuleRequests

구문-지향 연산 ModuleRequests는 인수를 받지 않으며 List of ModuleRequest Record를 반환한다. 다음 생성 규칙에 따라 개별적으로 정의된다:

Module : [empty]
  1. 새로운 빈 List를 반환한다.
ModuleItemList : ModuleItem
  1. ModuleItemModuleRequests를 반환한다.
ModuleItemList : ModuleItemList ModuleItem
  1. requestsModuleItemListModuleRequests로 설정한다.
  2. additionalRequestsModuleItemModuleRequests로 설정한다.
  3. additionalRequests의 각 ModuleRequest Record mr에 대해,
    1. requestsModuleRequest Record mr2가 없고, ModuleRequestsEqual(mr, mr2)가 true가 아니면,
      1. mrrequests에 추가한다.
  4. requests를 반환한다.
ModuleItem : StatementListItem
  1. 새로운 빈 List를 반환한다.
ImportDeclaration : import ImportClause FromClause ;
  1. specifierFromClauseSV로 설정한다.
  2. 유일한 요소가 ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » }인 List를 반환한다.
ImportDeclaration : import ImportClause FromClause WithClause ;
  1. specifierFromClauseSV로 설정한다.
  2. attributesWithClauseWithClauseToAttributes로 설정한다.
  3. 유일한 요소가 ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attributes }인 List를 반환한다.
ImportDeclaration : import ModuleSpecifier ;
  1. specifierModuleSpecifierSV로 설정한다.
  2. 유일한 요소가 ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » }인 List를 반환한다.
ImportDeclaration : import ModuleSpecifier WithClause ;
  1. specifierModuleSpecifierSV로 설정한다.
  2. attributesWithClauseWithClauseToAttributes로 설정한다.
  3. 유일한 요소가 ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attributes }인 List를 반환한다.
ExportDeclaration : export ExportFromClause FromClause ;
  1. specifierFromClauseSV로 설정한다.
  2. 유일한 요소가 ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: « » }인 List를 반환한다.
ExportDeclaration : export ExportFromClause FromClause WithClause ;
  1. specifierFromClauseSV로 설정한다.
  2. attributesWithClauseWithClauseToAttributes로 설정한다.
  3. 유일한 요소가 ModuleRequest Record { [[Specifier]]: specifier, [[Attributes]]: attributes }인 List를 반환한다.
ExportDeclaration : export NamedExports ; export VariableStatement export Declaration export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. 새로운 빈 List를 반환한다.

16.2.1.5 추상 모듈 레코드

Module Record는 단일 모듈의 import와 export에 대한 구조적 정보를 캡슐화한다. 이 정보는 연결된 모듈 집합의 import와 export를 연결하는 데 사용된다. Module Record는 모듈을 평가할 때만 사용하는 네 개의 필드를 포함한다.

명세 목적상 Module Record 값은 Record 명세 타입의 값이며, Module Record가 추상 클래스이고 추상 및 구체 서브클래스를 가진 단순 객체지향 계층에 존재한다고 생각할 수 있다. 이 명세서는 Cyclic Module Record라는 추상 서브클래스와 Source Text Module Record라는 구체 서브클래스를 정의한다. 다른 명세와 구현체들은 자신들이 정의한 대안적 모듈 정의 기능에 대응하는 추가적인 Module Record 서브클래스를 정의할 수 있다.

Module Record는 표 43에 나열된 필드를 정의한다. 모든 Module Definition 서브클래스는 최소한 이 필드들을 포함한다. 또한 Module Record는 표 44에 나열된 추상 메서드 목록을 정의한다. 모든 Module Definition 서브클래스는 이 추상 메서드들의 구체 구현을 제공해야 한다.

표 43: Module Record 필드
필드 이름 값 타입 의미
[[Realm]] Realm Record 이 모듈이 생성된 Realm.
[[Environment]] Module Environment Record 또는 empty 이 모듈의 최상위 바인딩을 포함하는 Environment Record. 이 필드는 모듈이 연결될 때 설정된다.
[[Namespace]] 객체 또는 empty 이 모듈에 대해 생성된 경우의 모듈 네임스페이스 객체 (28.3).
[[HostDefined]] 아무 값 (기본값은 undefined) 호스트 환경이 모듈에 추가 정보를 연결할 필요가 있을 때 사용하는 필드.
표 44: Module Record의 추상 메서드
메서드 목적
LoadRequestedModules([hostDefined])

모듈을 연결할 수 있도록 모든 의존성을 재귀적으로 로드하며, 프라미스를 반환한다.

GetExportedNames([exportStarSet])

이 모듈에서 직접 또는 간접적으로 export되는 모든 이름의 리스트를 반환한다.

이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.

ResolveExport(exportName [, resolveSet])

이 모듈에서 export된 이름의 바인딩을 반환한다. 바인딩은 { [[Module]]: Module Record, [[BindingName]]: String | namespace } 형태의 ResolvedBinding Record로 표현된다. 만약 export가 어떤 모듈에도 직접 바인딩되지 않은 Module Namespace Object라면 [[BindingName]]namespace로 설정된다. 이름을 해결할 수 없으면 null을, 여러 바인딩이 발견되면 ambiguous를 반환한다.

이 연산이 특정 exportName, resolveSet 쌍으로 호출될 때마다 같은 결과를 반환해야 한다.

이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.

Link()

모듈의 평가를 준비하기 위해 모든 모듈 의존성을 추이적으로 해결하고 Module Environment Record를 생성한다.

이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.

Evaluate()

이 모듈과 그 의존성의 평가에 대한 프라미스를 반환한다. 평가가 성공하거나 이미 성공적으로 평가된 경우 resolve되며, 평가 에러가 발생하거나 이미 실패한 경우 reject된다. 프라미스가 reject될 경우 호스트는 프라미스 reject를 처리하고 평가 에러를 다시 throw해야 한다.

이 메서드를 호출하기 전에 Link가 성공적으로 완료되어야 한다.

16.2.1.5.1 EvaluateModuleSync ( module )

추상 연산 EvaluateModuleSync는 module(Module Record)를 인자로 받고, 정상 완료(normal completion)(unused 포함) 또는 throw completion를 반환한다. 호출자는 module의 평가가 이미 settle된 프라미스를 반환함을 보장해야 하며, module을 동기적으로 평가한다. 호출 시 다음 단계를 수행한다:

  1. Assert: moduleCyclic Module Record가 아니다.
  2. promisemodule.Evaluate()로 설정한다.
  3. Assert: promise.[[PromiseState]]fulfilled 또는 rejected이다.
  4. promise.[[PromiseState]]rejected이면,
    1. promise.[[PromiseIsHandled]]false이면, HostPromiseRejectionTracker(promise, "handle")를 수행한다.
    2. promise.[[PromiseIsHandled]]true로 설정한다.
    3. ThrowCompletion(promise.[[PromiseResult]])를 반환한다.
  5. unused를 반환한다.

16.2.1.6 순환 모듈 레코드

순환 모듈 레코드Cyclic Module Record 타입의 다른 모듈들과의 의존성 사이클에 참여할 수 있는 모듈에 대한 정보를 나타내는 데 사용됩니다. Module RecordsCyclic Module Record 타입의 하위 클래스가 아닌 경우 Source Text Module Records와의 의존성 사이클에 참여해서는 안 됩니다.

표 43에 정의된 필드들 외에도 Cyclic Module Records표 45에 나열된 추가 필드들을 가집니다.

표 45: 순환 모듈 레코드의 추가 필드
필드 이름 값 타입 의미
[[Status]] new, unlinked, linking, linked, evaluating, evaluating-async, 또는 evaluated 처음에는 new입니다. 모듈의 생애 주기 동안 unlinked, linking, linked, evaluating, 경우에 따라 evaluating-async, evaluated로(그 순서로) 전이됩니다.
evaluating-async는 이 모듈이 비동기 의존성이 완료된 후 실행 대기 중이거나 [[HasTLA]] 필드가 true인 모듈로서 실행되었고, 최상위 완료를 대기 중임을 나타냅니다.
[[EvaluationError]] throw completion 또는 empty 평가 중 발생한 예외를 나타내는 throw completion입니다. 예외가 발생하지 않았거나 [[Status]]evaluated가 아니면 undefined입니다.
[[DFSAncestorIndex]] integer 또는 empty Link 및 Evaluate 중에만 사용하는 보조 필드입니다. [[Status]]linking 또는 evaluating일 때, 이 값은 모듈의 깊이 우선 탐색 인덱스이거나 동일한 강하게 연결된 구성 요소 내의 "이전" 모듈의 인덱스입니다.
[[RequestedModules]] List of ModuleRequest Records 이 모듈의 import와 연관된 ModuleRequest RecordsList입니다. import의 소스 텍스트 발생 순서대로 리스트가 정렬됩니다.
[[LoadedModules]] List of LoadedModuleRequest Records 이 레코드가 나타내는 모듈이 상대적 import 속성을 가지고 모듈을 import 요청할 때 사용한 specifier 문자열에서 Module Record로 매핑되는 정보입니다. 리스트에는 Records r1r2가 존재하지 않습니다. ModuleRequestsEqual(r1, r2)가 true인 경우.
[[CycleRoot]] Cyclic Module Record 또는 empty 사이클 내에서 처음 방문한 모듈, 강하게 연결된 구성 요소의 루트 DFS 조상입니다. 사이클에 속하지 않은 모듈의 경우 자신이 됩니다. Evaluate가 완료된 후, 모듈의 [[DFSAncestorIndex]][[CycleRoot]]의 깊이 우선 탐색 인덱스가 됩니다.
[[HasTLA]] Boolean 이 모듈이 개별적으로 비동기적인지 여부(예: 최상위 await가 포함된 Source Text Module Record일 경우). 비동기 의존성이 있다고 해서 이 필드가 true가 되는 것은 아닙니다. 이 필드는 모듈이 파싱된 이후에 변경되면 안 됩니다.
[[AsyncEvaluationOrder]] unset, integer, 또는 done 이 필드는 처음에 unset으로 설정되며, 완전히 동기적인 모듈의 경우 계속 unset입니다. 모듈 자체가 비동기이거나 비동기 의존성을 가진 경우, integer로 설정되어 16.2.1.6.1.3.4에 의해 대기 중인 모듈 실행 순서를 결정합니다. 대기 모듈이 실행되면 done으로 설정됩니다.
[[TopLevelCapability]] PromiseCapability Record 또는 empty 이 모듈이 어떤 사이클의 [[CycleRoot]]이고, 그 사이클의 모듈 중 하나에 대해 Evaluate()가 호출된 경우, 이 필드는 전체 평가에 대한 PromiseCapability Record를 포함합니다. 이는 Evaluate() 추상 메서드에서 반환되는 Promise 객체를 해결하는 데 사용됩니다. 해당 모듈의 의존성에는 empty가 되며, 일부 의존성에 대해 최상위 Evaluate()가 시작된 경우를 제외합니다.
[[AsyncParentModules]] List of Cyclic Module Records 이 모듈 또는 의존성이 [[HasTLA]] true이고, 실행이 진행 중이라면, 이 필드는 최상위 실행 작업에 대한 이 모듈의 부모 importers를 추적합니다. 이 부모 모듈들은 이 모듈이 성공적으로 실행 완료되기 전까지는 실행을 시작하지 않습니다.
[[PendingAsyncDependencies]] integer 또는 empty 이 모듈에 비동기 의존성이 있으면, 이 필드는 해당 모듈이 실행될 때까지 남은 비동기 의존성 모듈의 수를 추적합니다. 비동기 의존성이 있는 모듈은 이 값이 0이 되고 실행 오류가 없을 때 실행됩니다.

표 44에 정의된 메서드들 외에도 순환 모듈 레코드표 46에 나열된 추가 메서드들을 가집니다.

표 46: 순환 모듈 레코드의 추가 추상 메서드
메서드 목적
InitializeEnvironment() 모듈의 Environment Record를 초기화하며, 모든 import된 바인딩을 해결하고 모듈의 실행 컨텍스트를 생성합니다.
ExecuteModule([promiseCapability]) 모듈의 코드를 해당 실행 컨텍스트 내에서 평가합니다. 이 모듈의 [[HasTLA]]true인 경우 PromiseCapability Record를 인자로 넘기며, 해당 메서드는 주어진 capability를 resolve 또는 reject 해야 합니다. 이 경우, 메서드는 예외를 throw하지 않고, 필요하다면 PromiseCapability Record를 reject 해야 합니다.

GraphLoadingState 레코드는 모듈 그래프의 로딩 과정에 대한 정보를 담고 있는 Record입니다. 이는 HostLoadImportedModule 호출 이후 로딩을 계속하기 위해 사용됩니다. 각 GraphLoadingState 레코드표 47에 정의된 필드들을 가집니다:

표 47: GraphLoadingState 레코드의 필드
필드 이름 값 타입 의미
[[PromiseCapability]] PromiseCapability Record 로딩 과정이 완료될 때 resolve할 promise입니다.
[[IsLoading]] Boolean 로딩 과정이 아직 성공적으로 또는 오류로 끝나지 않은 경우 true입니다.
[[PendingModulesCount]] 음이 아닌 integer HostLoadImportedModule 호출의 보류 중인 개수를 추적합니다.
[[Visited]] List of Cyclic Module Records 현재 로딩 과정에서 이미 로드된 순환 모듈 레코드들의 리스트로, 순환 의존성으로 인한 무한 반복을 방지합니다.
[[HostDefined]] 아무 값이나 (기본값은 empty) host-defined 데이터를 LoadRequestedModules 호출자로부터 HostLoadImportedModule로 전달하는 데 사용합니다.

16.2.1.6.1 모듈 레코드 추상 메서드의 구현

아래는 순환 모듈 레코드에 대한 구체적인 메서드로, 모듈 레코드 추상 메서드(표 44에 정의됨)를 구현합니다.

16.2.1.6.1.1 LoadRequestedModules ( [hostDefined ] )

순환 모듈 레코드 module의 LoadRequestedModules 구체적인 메서드는 선택적 인자 hostDefined(임의 값)을 받고 Promise를 반환합니다. 이 메서드는 module의 의존성 그래프에 있는 모든 모듈 레코드[[LoadedModules]]를 채웁니다(대부분의 작업은 보조 함수 InnerModuleLoading에서 수행됩니다). 선택적 hostDefined 파라미터는 HostLoadImportedModule 훅에 전달됩니다. 호출 시 다음과 같은 절차를 수행합니다:

  1. hostDefined가 없으면 hostDefinedempty로 설정한다.
  2. pc를 ! NewPromiseCapability(%Promise%)로 설정한다.
  3. stateGraphLoadingState Record { [[IsLoading]]: true, [[PendingModulesCount]]: 1, [[Visited]]: « », [[PromiseCapability]]: pc, [[HostDefined]]: hostDefined }로 설정한다.
  4. InnerModuleLoading(state, module)을 수행한다.
  5. pc.[[Promise]]를 반환한다.
참고
hostDefined 인자는 import된 모듈을 가져오는데 필요한 추가 정보를 전달하는 데 사용할 수 있습니다. 예를 들어 HTML에서는 <link rel="preload" as="..."> 태그에 대해 올바른 fetch destination을 설정하는 데 사용합니다. import() 표현식에서는 hostDefined 인자를 절대 설정하지 않습니다.

16.2.1.6.1.1.1 InnerModuleLoading ( state, module )

추상 연산 InnerModuleLoading은 state(GraphLoadingState Record)와 module(모듈 레코드)를 인자로 받고, unused를 반환합니다. LoadRequestedModules에서 module의 의존성 그래프에 대해 실제 로딩 과정을 재귀적으로 수행할 때 사용됩니다. 호출 시 다음과 같은 절차를 수행합니다:

  1. Assert: state.[[IsLoading]]true임을 확인한다.
  2. module순환 모듈 레코드이고, module.[[Status]]new이며, state.[[Visited]]module이 포함되어 있지 않으면, 다음을 수행한다:
    1. modulestate.[[Visited]]에 추가한다.
    2. requestedModulesCountmodule.[[RequestedModules]]의 요소 수로 설정한다.
    3. state.[[PendingModulesCount]]state.[[PendingModulesCount]] + requestedModulesCount로 설정한다.
    4. module.[[RequestedModules]]의 각 ModuleRequest Record request에 대해 다음을 수행한다:
      1. AllImportAttributesSupported(request.[[Attributes]])가 false이면:
        1. errorThrowCompletion(새로 생성된 SyntaxError 객체)로 설정한다.
        2. ContinueModuleLoading(state, error)를 수행한다.
      2. 그렇지 않고 module.[[LoadedModules]]LoadedModuleRequest Record record가 존재하며, ModuleRequestsEqual(record, request)가 true이면:
        1. InnerModuleLoading(state, record.[[Module]])을 수행한다.
      3. 그 밖의 경우,
        1. HostLoadImportedModule(module, request, state.[[HostDefined]], state)를 수행한다.
        2. 참고: HostLoadImportedModuleFinishLoadingImportedModule를 호출하며, 이는 ContinueModuleLoading를 통해 그래프 로딩 프로세스에 재진입합니다.
      4. state.[[IsLoading]]false이면 unused를 반환한다.
  3. Assert: state.[[PendingModulesCount]] ≥ 1임을 확인한다.
  4. state.[[PendingModulesCount]]state.[[PendingModulesCount]] - 1로 설정한다.
  5. state.[[PendingModulesCount]] = 0이면 다음을 수행한다:
    1. state.[[IsLoading]]false로 설정한다.
    2. state.[[Visited]]의 각 순환 모듈 레코드 loaded에 대해 다음을 수행한다:
      1. loaded.[[Status]]new이면 loaded.[[Status]]unlinked로 설정한다.
    3. Call(state.[[PromiseCapability]].[[Resolve]], undefined, «undefined »)를 수행한다.
  6. unused를 반환한다.

16.2.1.6.1.1.2 ContinueModuleLoading ( state, moduleCompletion )

추상 연산 ContinueModuleLoading은 state(GraphLoadingState Record)와 moduleCompletion(정상 완료(normal completion)모듈 레코드를 포함하거나, throw completion 중 하나) 두 인자를 받아 unused를 반환합니다. 이 연산은 HostLoadImportedModule 호출 이후 로딩 과정을 다시 진입할 때 사용됩니다. 호출 시 다음의 절차를 수행합니다:

  1. state.[[IsLoading]]false이면 unused를 반환한다.
  2. moduleCompletion정상 완료(normal completion)인 경우:
    1. InnerModuleLoading(state, moduleCompletion.[[Value]])를 수행한다.
  3. 그 밖의 경우:
    1. state.[[IsLoading]]false로 설정한다.
    2. Call(state.[[PromiseCapability]].[[Reject]], undefined, « moduleCompletion.[[Value]] »)를 수행한다.
  4. unused를 반환한다.

16.2.1.6.1.2 Link ( )

순환 모듈 레코드 module의 Link 구체적 메서드는 인자를 받지 않으며, 정상 완료(normal completion)unused를 포함하거나 throw completion를 반환합니다. 성공 시 Link는 이 모듈의 [[Status]]unlinked에서 linked로 전이시킵니다. 실패 시 예외가 throw되고 이 모듈의 [[Status]]unlinked 상태로 남습니다. (대부분의 작업은 보조 함수 InnerModuleLinking에서 수행됩니다.) 호출 시 다음의 절차를 수행합니다:

  1. Assert: module.[[Status]]unlinked, linked, evaluating-async, 또는 evaluated 중 하나이다.
  2. stack을 새로운 빈 List로 설정한다.
  3. resultCompletion(InnerModuleLinking(module, stack, 0))로 설정한다.
  4. result비정상 완료(abrupt completion)인 경우:
    1. stack의 각 순환 모듈 레코드 m에 대해 다음을 수행한다:
      1. Assert: m.[[Status]]linking이다.
      2. m.[[Status]]unlinked로 설정한다.
    2. Assert: module.[[Status]]unlinked이다.
    3. result를 반환한다.
  5. Assert: module.[[Status]]linked, evaluating-async, 또는 evaluated 중 하나이다.
  6. Assert: stack이 비어 있다.
  7. unused를 반환한다.

16.2.1.6.1.2.1 InnerModuleLinking ( module, stack, index )

추상 연산 InnerModuleLinking은 module(모듈 레코드), stack(List of 순환 모듈 레코드), index(음이 아닌 integer) 인자를 받아, 정상 완료(normal completion)로 음이 아닌 integer를 포함하거나 throw completion를 반환합니다. Link에서 module의 실제 linking 과정을 수행하며, 의존성 그래프의 다른 모든 모듈에 대해 재귀적으로 동작합니다. stack, index 인자와 모듈의 [[DFSAncestorIndex]] 필드는 깊이 우선 탐색(DFS) 과정을 추적하는 데 사용됩니다. 특히 [[DFSAncestorIndex]]는 강하게 연결된 구성 요소(SCC)를 찾기 위한 용도로 활용되어, SCC 내의 모든 모듈이 함께 linked로 전이됩니다. 호출 시 다음의 절차를 수행합니다:

  1. module순환 모듈 레코드가 아니면:
    1. module.Link()를 수행한다.
    2. index를 반환한다.
  2. module.[[Status]]linking, linked, evaluating-async, 또는 evaluated 중 하나이면:
    1. index를 반환한다.
  3. Assert: module.[[Status]]unlinked이다.
  4. module.[[Status]]linking로 설정한다.
  5. moduleIndexindex로 설정한다.
  6. module.[[DFSAncestorIndex]]index로 설정한다.
  7. indexindex + 1로 설정한다.
  8. modulestack에 추가한다.
  9. module.[[RequestedModules]]의 각 ModuleRequest Record request에 대해 다음을 수행한다:
    1. requiredModuleGetImportedModule(module, request)로 설정한다.
    2. index를 ? InnerModuleLinking(requiredModule, stack, index)로 설정한다.
    3. requiredModule순환 모듈 레코드이면:
      1. Assert: requiredModule.[[Status]]linking, linked, evaluating-async, 또는 evaluated 중 하나이다.
      2. Assert: requiredModule.[[Status]]linking인 경우에만 stackrequiredModule이 포함되어 있다.
      3. requiredModule.[[Status]]linking이면:
        1. module.[[DFSAncestorIndex]]min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]])로 설정한다.
  10. module.InitializeEnvironment()를 수행한다.
  11. Assert: modulestack에 정확히 한 번만 존재한다.
  12. Assert: module.[[DFSAncestorIndex]]moduleIndex이다.
  13. module.[[DFSAncestorIndex]] = moduleIndex이면:
    1. donefalse로 설정한다.
    2. donefalse인 동안 반복한다:
      1. requiredModulestack의 마지막 요소로 설정한다.
      2. stack의 마지막 요소를 제거한다.
      3. Assert: requiredModule순환 모듈 레코드이다.
      4. requiredModule.[[Status]]linked로 설정한다.
      5. requiredModulemodule이 동일한 모듈 레코드이면 donetrue로 설정한다.
  14. index를 반환한다.

16.2.1.6.1.3 Evaluate ( )

순환 모듈 레코드 module의 Evaluate 구체적 메서드는 인자를 받지 않으며 Promise를 반환합니다. Evaluate는 이 모듈의 [[Status]]linked에서 evaluating-async 또는 evaluated로 전이시킵니다. 해당 강하게 연결된 구성 요소 내의 모듈에 대해 처음 호출될 때, Evaluate는 모듈 평가가 완료될 때 resolve되는 Promise를 생성하여 반환합니다. 이 Promise는 해당 구성 요소의 [[CycleRoot]][[TopLevelCapability]] 필드에 저장됩니다. 이후 해당 구성 요소 내의 어떤 모듈에 대해 Evaluate를 호출해도 동일한 Promise를 반환합니다. (대부분의 작업은 보조 함수 InnerModuleEvaluation에서 수행됩니다.) 호출 시 다음 절차를 수행합니다:

  1. Assert: 이 Evaluate 호출은 주변 에이전트 내에서 다른 Evaluate 호출과 동시에 발생하지 않는다.
  2. Assert: module.[[Status]]linked, evaluating-async 또는 evaluated 중 하나이다.
  3. module.[[Status]]evaluating-async 또는 evaluated라면, modulemodule.[[CycleRoot]]로 설정한다.
  4. module.[[TopLevelCapability]]empty가 아니면:
    1. module.[[TopLevelCapability]].[[Promise]]를 반환한다.
  5. stack을 새로운 빈 List로 설정한다.
  6. capability를 ! NewPromiseCapability(%Promise%)로 설정한다.
  7. module.[[TopLevelCapability]]capability로 설정한다.
  8. resultCompletion(InnerModuleEvaluation(module, stack, 0))로 설정한다.
  9. result비정상 완료(abrupt completion)인 경우:
    1. stack의 각 순환 모듈 레코드 m에 대해 다음을 수행한다:
      1. Assert: m.[[Status]]evaluating이다.
      2. Assert: m.[[AsyncEvaluationOrder]]unset이다.
      3. m.[[Status]]evaluated로 설정한다.
      4. m.[[EvaluationError]]result로 설정한다.
    2. Assert: module.[[Status]]evaluated이다.
    3. Assert: module.[[EvaluationError]]result는 동일한 Completion Record이다.
    4. Call(capability.[[Reject]], undefined, « result.[[Value]] »)를 수행한다.
  10. 그 밖의 경우:
    1. Assert: module.[[Status]]evaluating-async 또는 evaluated이다.
    2. Assert: module.[[EvaluationError]]empty이다.
    3. module.[[Status]]evaluated라면:
      1. 참고: 이는 module의 평가가 동기적으로 완료됨을 의미한다.
      2. Assert: module.[[AsyncEvaluationOrder]]unset이다.
      3. Call(capability.[[Resolve]], undefined, « undefined »)를 수행한다.
    4. Assert: stack이 비어 있다.
  11. capability.[[Promise]]를 반환한다.

16.2.1.6.1.3.1 InnerModuleEvaluation ( module, stack, index )

추상 연산 InnerModuleEvaluation은 module(모듈 레코드), stack(List of 순환 모듈 레코드), index(음이 아닌 integer) 인자를 받아, 정상 완료(normal completion)로 음이 아닌 integer를 포함하거나 throw completion를 반환합니다. Evaluate에서 module의 실제 평가 과정을 수행하며, 의존성 그래프의 다른 모든 모듈에 대해 재귀적으로 동작합니다. stack, index 인자와 module[[DFSAncestorIndex]] 필드는 InnerModuleLinking에서와 동일하게 사용됩니다. 호출 시 다음 절차를 수행합니다:

  1. module순환 모듈 레코드가 아니면:
    1. EvaluateModuleSync(module)를 수행한다.
    2. index를 반환한다.
  2. module.[[Status]]evaluating-async 또는 evaluated라면:
    1. module.[[EvaluationError]]empty이면 index를 반환한다.
    2. 그 밖의 경우, ? module.[[EvaluationError]]를 반환한다.
  3. module.[[Status]]evaluating이면 index를 반환한다.
  4. Assert: module.[[Status]]linked이다.
  5. module.[[Status]]evaluating로 설정한다.
  6. moduleIndexindex로 설정한다.
  7. module.[[DFSAncestorIndex]]index로 설정한다.
  8. module.[[PendingAsyncDependencies]]를 0으로 설정한다.
  9. indexindex + 1로 설정한다.
  10. modulestack에 추가한다.
  11. module.[[RequestedModules]]의 각 ModuleRequest Record request에 대해 다음을 수행한다:
    1. requiredModuleGetImportedModule(module, request)로 설정한다.
    2. index를 ? InnerModuleEvaluation(requiredModule, stack, index)로 설정한다.
    3. requiredModule순환 모듈 레코드이면:
      1. Assert: requiredModule.[[Status]]evaluating, evaluating-async 또는 evaluated 중 하나이다.
      2. Assert: requiredModule.[[Status]]evaluating일 때만 stackrequiredModule이 포함되어 있다.
      3. requiredModule.[[Status]]evaluating이면:
        1. module.[[DFSAncestorIndex]]min(module.[[DFSAncestorIndex]], requiredModule.[[DFSAncestorIndex]])로 설정한다.
      4. 그 밖의 경우:
        1. requiredModulerequiredModule.[[CycleRoot]]로 설정한다.
        2. Assert: requiredModule.[[Status]]evaluating-async 또는 evaluated이다.
        3. requiredModule.[[EvaluationError]]empty가 아니면 ? requiredModule.[[EvaluationError]]를 반환한다.
      5. requiredModule.[[AsyncEvaluationOrder]]integer라면:
        1. module.[[PendingAsyncDependencies]]module.[[PendingAsyncDependencies]] + 1로 설정한다.
        2. modulerequiredModule.[[AsyncParentModules]]에 추가한다.
  12. module.[[PendingAsyncDependencies]] > 0이거나 module.[[HasTLA]]true이면:
    1. Assert: module.[[AsyncEvaluationOrder]]unset이다.
    2. module.[[AsyncEvaluationOrder]]IncrementModuleAsyncEvaluationCount()로 설정한다.
    3. module.[[PendingAsyncDependencies]] = 0이면 ExecuteAsyncModule(module)를 수행한다.
  13. 그 밖의 경우:
    1. module.ExecuteModule()을 수행한다.
  14. Assert: modulestack에 정확히 한 번만 존재한다.
  15. Assert: module.[[DFSAncestorIndex]]moduleIndex이다.
  16. module.[[DFSAncestorIndex]] = moduleIndex이면:
    1. donefalse로 설정한다.
    2. donefalse인 동안 반복한다:
      1. requiredModulestack의 마지막 요소로 설정한다.
      2. stack의 마지막 요소를 제거한다.
      3. Assert: requiredModule순환 모듈 레코드이다.
      4. Assert: requiredModule.[[AsyncEvaluationOrder]]integer 또는 unset이다.
      5. requiredModule.[[AsyncEvaluationOrder]]unset이면 requiredModule.[[Status]]evaluated로 설정한다.
      6. 그 밖의 경우 requiredModule.[[Status]]evaluating-async로 설정한다.
      7. requiredModulemodule이 동일한 모듈 레코드이면 donetrue로 설정한다.
      8. requiredModule.[[CycleRoot]]module로 설정한다.
  17. index를 반환한다.
Note 1

모듈은 InnerModuleEvaluation에 의해 순회되는 동안 evaluating 상태이며, 실행이 끝나면 evaluated 상태가 되고, [[HasTLA]] 필드가 true이거나 비동기 의존성이 있을 경우 실행 중 evaluating-async 상태가 됩니다.

Note 2

비동기 사이클의 모듈에 의존하는 모든 모듈은 해당 사이클이 evaluating 상태가 아닐 때, [[CycleRoot]]를 통해 사이클의 루트 실행에 의존하게 됩니다. 이를 통해 사이클의 상태를 루트 모듈 상태를 통해 하나의 강하게 연결된 구성 요소로 취급할 수 있습니다.

16.2.1.6.1.3.2 ExecuteAsyncModule ( module )

추상 연산 ExecuteAsyncModule은 module(순환 모듈 레코드) 인자를 받아 unused를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. Assert: module.[[Status]]evaluating 또는 evaluating-async 중 하나이다.
  2. Assert: module.[[HasTLA]]true이다.
  3. capability를 ! NewPromiseCapability(%Promise%)로 설정한다.
  4. fulfilledClosuremodule을 캡처하고 호출 시 다음을 수행하는, 파라미터 없는 새로운 추상 클로저(Abstract Closure)로 설정한다:
    1. AsyncModuleExecutionFulfilled(module)을 수행한다.
    2. NormalCompletion(undefined)를 반환한다.
  5. onFulfilledCreateBuiltinFunction(fulfilledClosure, 0, "", « »)로 설정한다.
  6. rejectedClosuremodule을 캡처하고 호출 시 다음을 수행하는, 파라미터(error)를 갖는 새로운 추상 클로저(Abstract Closure)로 설정한다:
    1. AsyncModuleExecutionRejected(module, error)를 수행한다.
    2. NormalCompletion(undefined)를 반환한다.
  7. onRejectedCreateBuiltinFunction(rejectedClosure, 0, "", « »)로 설정한다.
  8. PerformPromiseThen(capability.[[Promise]], onFulfilled, onRejected)를 수행한다.
  9. module.ExecuteModule(capability)을 수행한다.
  10. unused를 반환한다.

16.2.1.6.1.3.3 GatherAvailableAncestors ( module, execList )

추상 연산 GatherAvailableAncestors는 module(순환 모듈 레코드), execList(List of 순환 모듈 레코드) 인자를 받아 unused를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. module.[[AsyncParentModules]]의 각 순환 모듈 레코드 m에 대해 다음을 수행한다:
    1. execListm이 없고 m.[[CycleRoot]].[[EvaluationError]]empty라면:
      1. Assert: m.[[Status]]evaluating-async이다.
      2. Assert: m.[[EvaluationError]]empty이다.
      3. Assert: m.[[AsyncEvaluationOrder]]integer이다.
      4. Assert: m.[[PendingAsyncDependencies]] > 0이다.
      5. m.[[PendingAsyncDependencies]]m.[[PendingAsyncDependencies]] - 1로 설정한다.
      6. m.[[PendingAsyncDependencies]] = 0이면:
        1. mexecList에 추가한다.
        2. m.[[HasTLA]]false이면 GatherAvailableAncestors(m, execList)를 수행한다.
  2. unused를 반환한다.
Note

루트 module의 비동기 실행이 fulfilled(이행)될 때, 이 함수는 해당 완료와 함께 동기적으로 실행 가능한 모듈들의 리스트를 결정하여 execList에 채웁니다.

16.2.1.6.1.3.4 AsyncModuleExecutionFulfilled ( module )

추상 연산 AsyncModuleExecutionFulfilled는 module(순환 모듈 레코드) 인자를 받아 unused를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. module.[[Status]]evaluated라면:
    1. Assert: module.[[EvaluationError]]empty가 아니다.
    2. unused를 반환한다.
  2. Assert: module.[[Status]]evaluating-async이다.
  3. Assert: module.[[AsyncEvaluationOrder]]integer이다.
  4. Assert: module.[[EvaluationError]]empty이다.
  5. module.[[AsyncEvaluationOrder]]done로 설정한다.
  6. module.[[Status]]evaluated로 설정한다.
  7. module.[[TopLevelCapability]]empty가 아니면:
    1. Assert: module.[[CycleRoot]]module은 동일한 모듈 레코드이다.
    2. Call(module.[[TopLevelCapability]].[[Resolve]], undefined, « undefined »)를 수행한다.
  8. execList를 새로운 빈 List로 설정한다.
  9. GatherAvailableAncestors(module, execList)를 수행한다.
  10. Assert: execList의 모든 요소는 [[AsyncEvaluationOrder]] 필드가 integer로, [[PendingAsyncDependencies]] 필드가 0으로, [[EvaluationError]] 필드가 empty로 설정되어 있다.
  11. sortedExecListexecList의 요소들을 [[AsyncEvaluationOrder]] 필드 오름차순으로 정렬한 List로 설정한다.
  12. sortedExecList의 각 순환 모듈 레코드 m에 대해 다음을 수행한다:
    1. m.[[Status]]evaluated라면:
      1. Assert: m.[[EvaluationError]]empty가 아니다.
    2. 그 밖의 경우 m.[[HasTLA]]true이면:
      1. ExecuteAsyncModule(m)를 수행한다.
    3. 그 밖의 경우:
      1. resultm.ExecuteModule()로 설정한다.
      2. result비정상 완료(abrupt completion)라면:
        1. AsyncModuleExecutionRejected(m, result.[[Value]])를 수행한다.
      3. 그 밖의 경우:
        1. m.[[AsyncEvaluationOrder]]done로 설정한다.
        2. m.[[Status]]evaluated로 설정한다.
        3. m.[[TopLevelCapability]]empty가 아니면:
          1. Assert: m.[[CycleRoot]]m은 동일한 모듈 레코드이다.
          2. Call(m.[[TopLevelCapability]].[[Resolve]], undefined, « undefined »)를 수행한다.
  13. unused를 반환한다.

16.2.1.6.1.3.5 AsyncModuleExecutionRejected ( module, error )

추상 연산 AsyncModuleExecutionRejected는 module(순환 모듈 레코드), error(ECMAScript 언어 값) 인자를 받아 unused를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. module.[[Status]]evaluated라면:
    1. Assert: module.[[EvaluationError]]empty가 아니다.
    2. unused를 반환한다.
  2. Assert: module.[[Status]]evaluating-async이다.
  3. Assert: module.[[AsyncEvaluationOrder]]integer이다.
  4. Assert: module.[[EvaluationError]]empty이다.
  5. module.[[EvaluationError]]ThrowCompletion(error)로 설정한다.
  6. module.[[Status]]evaluated로 설정한다.
  7. module.[[AsyncEvaluationOrder]]done로 설정한다.
  8. 참고: module.[[AsyncEvaluationOrder]]AsyncModuleExecutionFulfilled와의 대칭성을 위해 done로 설정됩니다. InnerModuleEvaluation에서는 모듈의 [[EvaluationError]] 내부 슬롯이 empty가 아니면 [[AsyncEvaluationOrder]] 내부 슬롯 값은 사용되지 않습니다.
  9. module.[[AsyncParentModules]]의 각 순환 모듈 레코드 m에 대해 다음을 수행한다:
    1. AsyncModuleExecutionRejected(m, error)를 수행한다.
  10. module.[[TopLevelCapability]]empty가 아니면:
    1. Assert: module.[[CycleRoot]]module은 동일한 모듈 레코드이다.
    2. Call(module.[[TopLevelCapability]].[[Reject]], undefined, « error »)를 수행한다.
  11. unused를 반환한다.

16.2.1.6.2 순환 모듈 레코드 그래프 예시

이 비규범 섹션에서는 몇 가지 일반적인 모듈 그래프의 연결(linking) 및 평가(evaluation) 예시를 시리즈로 보여주며, 특히 오류가 어떻게 발생할 수 있는지에 중점을 둡니다.

먼저 다음과 같은 간단한 모듈 그래프를 생각해 보겠습니다:

그림 2: 간단한 모듈 그래프
A 모듈이 B 모듈에 의존하고, B 모듈이 C 모듈에 의존하는 모듈 그래프

먼저 오류 조건이 없다고 가정해 봅시다. 호스트가 처음으로 A.LoadRequestedModules()를 호출하면, 가정에 따라 성공적으로 완료되고, BC의 의존성도 재귀적으로 로드됩니다(각각 C 및 없음). 그리고 A.[[Status]] = B.[[Status]] = C.[[Status]] = unlinked로 설정됩니다. 이후 호스트A.Link()를 호출하면, 다시 가정에 따라 성공적으로 완료되어 A.[[Status]] = B.[[Status]] = C.[[Status]] = linked가 됩니다. 이러한 준비 단계는 언제든 수행할 수 있습니다. 나중에 호스트가 모듈의 부작용이 발생할 수 있는 시점에 A.Evaluate()를 호출하면, 성공적으로 완료되어 Promise가 undefined로 resolve되고, 먼저 C 다음에 B가 평가됩니다. 이 시점에서 각 모듈의 [[Status]]evaluated입니다.

그 다음 성공적으로 A.LoadRequestedModules()를 호출한 뒤 연결(linking) 오류가 발생하는 경우를 생각해 봅시다. 만일 InnerModuleLinkingC에서 성공하지만, 이후 B에서 실패한다면(예를 들어 BC가 제공하지 않는 것을 import하는 경우), 원래의 A.Link()는 실패하고, AB[[Status]]unlinked인 상태로 남습니다. C[[Status]]linked가 됩니다.

마지막으로, Link()를 성공적으로 호출한 뒤 평가 오류가 발생하는 경우를 생각해 보겠습니다. 만일 InnerModuleEvaluationC에서 성공하지만, 이후 B에서 실패한다면(예를 들어 B가 예외를 던지는 코드를 포함하는 경우), 원래의 A.Evaluate()는 실패하여 rejected Promise를 반환하게 됩니다. 결과적인 예외는 AB[[EvaluationError]] 필드에 저장되고, 두 모듈의 [[Status]]evaluated가 됩니다. Cevaluated가 되지만, AB와 달리 [[EvaluationError]] 없이 성공적으로 평가를 완료합니다. 예외를 저장하는 것은 호스트AB를 Evaluate()로 재사용하려 할 때 항상 동일한 예외를 만나도록 보장합니다. (호스트순환 모듈 레코드를 반드시 재사용할 필요는 없으며, 호스트가 해당 메서드에서 던져진 예외 객체를 반드시 노출할 필요도 없습니다. 하지만 명세상 이러한 동작이 가능하도록 되어 있습니다.)

이제 다른 종류의 오류 조건을 생각해 봅시다:

그림 3: 해결 불가능한 모듈이 있는 모듈 그래프
A 모듈이 ???로 표시된 누락(해결 불가능한) 모듈에 의존하는 모듈 그래프

이 시나리오에서 A 모듈은 다른 모듈에 대한 의존성을 선언하지만, 해당 모듈에 대한 모듈 레코드가 존재하지 않습니다. 즉, HostLoadImportedModule가 요청 시 FinishLoadingImportedModule를 예외와 함께 호출합니다. 이는 해당 리소스가 존재하지 않거나, 리소스는 존재하지만 ParseModule가 소스 텍스트 파싱 시 오류를 반환하는 등 다양한 이유로 발생할 수 있습니다. 호스트FinishLoadingImportedModule에 전달한 완료(completion)를 통해 실패 원인을 노출할 수도 있습니다. 어쨌든 이 예외는 로딩 실패를 초래하며, A[[Status]]new 상태로 남습니다.

여기서 로딩, 연결, 평가 오류의 차이는 다음과 같은 특성 때문입니다:

  • 평가(Evaluation)는 부작용이 있을 수 있으므로 반드시 한 번만 수행되어야 하며, 평가가 이미 수행됐는지(성공하지 않았더라도) 기억하는 것이 중요합니다. (오류의 경우에도 예외를 기억하는 것이 합리적인데, 그렇지 않으면 이후 Evaluate() 호출마다 새 예외를 생성해야 합니다.)
  • 반면 연결(linking)은 부작용이 없으므로 실패하더라도 나중에 재시도해도 문제가 없습니다.
  • 로딩은 호스트와 밀접하게 상호작용하며, 호스트에 따라 실패한 로딩을 재시도할 수 있도록 하는 것이 바람직할 수 있습니다.(예: 네트워크 장애 등 일시적 문제일 경우)

이제 사이클이 있는 모듈 그래프를 생각해 봅시다:

그림 4: 순환 모듈 그래프
A 모듈이 B와 C 모듈에 의존하지만, B 모듈도 다시 A에 의존하는 모듈 그래프

여기서는 진입점이 A 모듈이라고 가정합니다. 호스트A.LoadRequestedModules()를 호출하면 InnerModuleLoadingA에 대해 실행됩니다. 이것은 다시 BC에 대해 InnerModuleLoading을 호출합니다. 사이클 때문에 다시 InnerModuleLoadingA에 대해 트리거되지만, 이 시점에서는 A의 의존성 로딩이 이미 시작됐으므로 아무 작업도 하지 않습니다(no-op). 그래프의 모든 모듈이 성공적으로 로드되면 이들의 [[Status]]가 동시에 new에서 unlinked로 전이됩니다.

그 다음 호스트A.Link()를 호출하면 InnerModuleLinkingA에 대해 실행됩니다. 이것은 다시 B에 대해 InnerModuleLinking을 호출합니다. 사이클 때문에 다시 InnerModuleLinkingA에 대해 트리거되지만, 이 시점에서는 A.[[Status]]가 이미 linking이므로 아무 작업도 하지 않습니다(no-op). B.[[Status]] 자체는 linking 상태로 남아 있다가 제어가 다시 A로 돌아오면 C에 대해 InnerModuleLinking이 트리거됩니다. C.[[Status]]linked가 되고 나면 AB가 함께 linking에서 linked로 전이됩니다. 이는 두 모듈이 강하게 연결된 구성 요소이기 때문입니다. 모듈 그래프가 깊이우선탐색으로 순회되는 이 단계에서는 SCC 내의 모듈들을 동시에 상태 전이시킬 수 있습니다.

성공 케이스에서는 순환 모듈 그래프의 평가(evaluation) 단계도 위와 유사하게 동작합니다.

이제 A에 연결 오류가 있는 경우를 생각해 보겠습니다. 예를 들어 AC에 존재하지 않는 바인딩을 import하려고 하는 경우입니다. 이 경우 위의 단계는 여전히 발생하며, InnerModuleLinking의 두 번째 호출에서 조기 반환(early return)이 있습니다. 그러나 원래의 InnerModuleLinking에 다시 되돌아오면, InitializeEnvironment(특히 C.ResolveExport() 직후)에서 실패하게 됩니다. 던져진 SyntaxError 예외는 A.Link까지 전파되고, 이때 현재 스택에 있는 모든 모듈(항상 아직 linking 상태인 모듈들)을 reset합니다. 따라서 ABunlinked가 됩니다. Clinked 상태로 남습니다.

또는 A에 평가 오류가 있는 경우(예: 소스 코드가 예외를 던지는 경우)를 생각해 봅니다. 이 경우 평가 단계에서도 위와 유사한 과정이 발생하며, InnerModuleEvaluation의 두 번째 호출에서 조기 반환이 있습니다. 원래의 InnerModuleEvaluation에 되돌아오면, 가정에 따라 실패하게 됩니다. 던져진 예외는 A.Evaluate()까지 전파되고, 이때 현재 스택에 있는 모든 모듈(아직 evaluating 상태인 모듈들)과 [[AsyncParentModules]]를 통해, 의존성 그래프 전체에서 최상위 await를 포함하거나 의존하는 모듈 체인에도 오류가 기록됩니다(AsyncModuleExecutionRejected 알고리즘을 통해). 따라서 ABevaluated가 되고, 예외가 AB[[EvaluationError]] 필드에 기록되며, Cevaluated이지만 [[EvaluationError]]는 없습니다.

마지막으로, 모든 모듈이 비동기적으로 완료되는 사이클이 있는 모듈 그래프를 생각해 봅시다:

그림 5: 비동기 순환 모듈 그래프
A 모듈이 B와 C에 의존, B는 D에 의존, C는 D와 E에 의존, D는 다시 A에 의존하는 모듈 그래프

로딩 및 연결은 이전과 같이 진행되며, 모든 모듈의 [[Status]]linked가 됩니다.

A.Evaluate()를 호출하면 InnerModuleEvaluationA, B, D에 대해 호출되어 모두 evaluating 상태로 전이됩니다. 그 후 InnerModuleEvaluationA에 대해 한 번 더 호출되지만 이미 evaluating 상태이므로 아무 작업도 하지 않습니다(no-op). 이 시점에서 D.[[PendingAsyncDependencies]]가 0이므로 ExecuteAsyncModule(D)가 호출되고, D.ExecuteModule이 새로운 PromiseCapability와 함께 호출되어 D의 비동기 실행을 추적합니다. 다시 InnerModuleEvaluation로 돌아가서 B에 대해 B.[[PendingAsyncDependencies]]를 1로, B.[[AsyncEvaluationOrder]]를 1로 설정합니다. 다시 InnerModuleEvaluation의 원래 호출로 돌아가서 A[[PendingAsyncDependencies]]를 1로 설정합니다. 다음 반복에서 A의 의존성 루프가 끝나면 InnerModuleEvaluationC에 대해, 그리고 D(다시 no-op), E에 대해 호출됩니다. E는 의존성이 없고 사이클에도 포함되지 않으므로 ExecuteAsyncModule(E)가 D와 동일하게 호출되고 E는 바로 스택에서 제거됩니다. 다시 한 번 InnerModuleEvaluationC 호출로 돌아와 C.[[AsyncEvaluationOrder]]를 3으로 설정합니다. 이제 A의 의존성 루프가 끝나면 A.[[AsyncEvaluationOrder]]를 4로 설정하고, 전체 SCC를 스택에서 제거하여 모든 모듈이 동시에 evaluating-async로 전이됩니다. 이 시점에서 모듈들의 필드는 표 48에 나옵니다.

표 48: 초기 Evaluate() 호출 후 모듈 필드
필드
모듈
A B C D E
[[DFSAncestorIndex]] 0 0 0 0 4
[[Status]] evaluating-async evaluating-async evaluating-async evaluating-async evaluating-async
[[AsyncEvaluationOrder]] 4 1 3 0 2
[[AsyncParentModules]] « » « A » « A » « B, C » « C »
[[PendingAsyncDependencies]] 2 (BC) 1 (D) 2 (DE) 0 0

E가 먼저 실행을 완료했다고 가정합니다. 이때 AsyncModuleExecutionFulfilled가 호출되고 E.[[Status]]evaluated로 설정되며 C.[[PendingAsyncDependencies]]가 1로 감소합니다. 업데이트된 모듈들의 필드는 표 49에 나옵니다.

표 49: 모듈 E 실행 완료 후 모듈 필드
필드
모듈
C E
[[DFSAncestorIndex]] 0 4
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 3 done
[[AsyncParentModules]] « A » « C »
[[PendingAsyncDependencies]] 1 (D) 0

D가 다음으로 실행을 완료합니다(아직 실행 중인 유일한 모듈이었음). 이때 AsyncModuleExecutionFulfilled가 다시 호출되고 D.[[Status]]evaluated로 설정됩니다. 실행 가능한 상위 모듈은 B([[AsyncEvaluationOrder]]가 1)와 C([[AsyncEvaluationOrder]]가 3)로, B가 먼저 처리됩니다: B.[[PendingAsyncDependencies]]가 0으로 감소하고 ExecuteAsyncModuleB에 호출되어 실행을 시작합니다. C.[[PendingAsyncDependencies]] 역시 0으로 감소하고 C도 실행을 시작합니다(만약 Bawait가 있으면 C와 병렬로 실행될 수 있음). 업데이트된 모듈들의 필드는 표 50에 나옵니다.

표 50: 모듈 D 실행 완료 후 모듈 필드
필드
모듈
B C D
[[DFSAncestorIndex]] 0 0 0
[[Status]] evaluating-async evaluating-async evaluated
[[AsyncEvaluationOrder]] 1 3 done
[[AsyncParentModules]] « A » « A » « B, C »
[[PendingAsyncDependencies]] 0 0 0

C가 다음으로 실행을 완료했다고 가정합니다. 이때 AsyncModuleExecutionFulfilled가 다시 호출되어 C.[[Status]]evaluated로 설정되고 A.[[PendingAsyncDependencies]]가 1로 감소합니다. 업데이트된 모듈들의 필드는 표 51에 나옵니다.

표 51: 모듈 C 실행 완료 후 모듈 필드
필드
모듈
A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 4 done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1 (B) 0

그 다음 B가 실행을 완료합니다. 이때 AsyncModuleExecutionFulfilled가 다시 호출되고 B.[[Status]]evaluated로 설정됩니다. A.[[PendingAsyncDependencies]]가 0으로 감소하므로 ExecuteAsyncModule가 호출되어 실행을 시작합니다. 업데이트된 모듈들의 필드는 표 52에 나옵니다.

표 52: 모듈 B 실행 완료 후 모듈 필드
필드
모듈
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluating-async evaluated
[[AsyncEvaluationOrder]] 4 done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0

마지막으로 A가 실행을 완료합니다. 이때 AsyncModuleExecutionFulfilled가 다시 호출되어 A.[[Status]]evaluated로 설정됩니다. 이 시점에서 A.[[TopLevelCapability]]의 Promise(A.Evaluate()에서 반환된 Promise)가 resolve되어 이 모듈 그래프의 처리가 종료됩니다. 업데이트된 모듈의 필드는 표 53에 나옵니다.

표 53: 모듈 A 실행 완료 후 모듈 필드
필드
모듈
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0

한편 C가 실행에 실패하고 B가 완료되기 전에 오류를 반환하는 실패 케이스를 생각해 봅시다. 이때 AsyncModuleExecutionRejected가 호출되어 C.[[Status]]evaluated로, C.[[EvaluationError]]가 오류로 설정됩니다. 그런 다음 이 오류는 모든 AsyncParentModules에 전파되어 각각에 대해 AsyncModuleExecutionRejected가 호출됩니다. 업데이트된 모듈들의 필드는 표 54에 나옵니다.

표 54: 모듈 C 오류 발생 후 모듈 필드
필드
모듈
A C
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] done done
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 1 (B) 0
[[EvaluationError]] empty C의 평가 오류

AC와 동일한 오류로 rejected됩니다. 이는 CA에 대해 AsyncModuleExecutionRejectedC의 오류로 호출하기 때문입니다. A.[[Status]]evaluated로 설정됩니다. 이 시점에서 A.[[TopLevelCapability]]의 Promise(A.Evaluate()에서 반환된 Promise)는 reject됩니다. 업데이트된 모듈의 필드는 표 55에 나옵니다.

표 55: 모듈 A가 reject된 후 모듈 필드
필드
모듈
A
[[DFSAncestorIndex]] 0
[[Status]] evaluated
[[AsyncEvaluationOrder]] done
[[AsyncParentModules]] « »
[[PendingAsyncDependencies]] 0
[[EvaluationError]] C평가 오류

그 후 B는 오류 없이 실행을 마칩니다. 이 경우 AsyncModuleExecutionFulfilled가 다시 호출되고 B.[[Status]]evaluated로 설정됩니다. GatherAvailableAncestorsB에 대해 호출됩니다. 그러나 A.[[CycleRoot]]는 평가 오류가 있는 A이므로 반환된 sortedExecList에 추가되지 않으며 AsyncModuleExecutionFulfilled는 추가 처리를 하지 않고 반환됩니다. 이후 B를 import하는 모듈은 C에서 사이클 루트 A에 설정된 평가 오류를 B.[[CycleRoot]].[[EvaluationError]]의 rejection으로 처리하게 됩니다. 업데이트된 모듈의 필드는 표 56에 나와 있습니다.

표 56: 오류가 있는 그래프에서 B가 실행 완료된 후의 모듈 필드
필드
모듈
A B
[[DFSAncestorIndex]] 0 0
[[Status]] evaluated evaluated
[[AsyncEvaluationOrder]] 4 1
[[AsyncParentModules]] « » « A »
[[PendingAsyncDependencies]] 0 0
[[EvaluationError]] CEvaluation 오류 empty

16.2.1.7 소스 텍스트 모듈 레코드

소스 텍스트 모듈 레코드ECMAScript 소스 텍스트(11)로 정의된 모듈에 대한 정보를 나타내는 데 사용되며, goal symbol Module을 사용하여 파싱됩니다. 그 필드에는 모듈이 import 및 export하는 이름에 대한 정제된 정보가 담겨 있으며, 구체적 메서드는 이 정보들을 사용하여 모듈을 linking 및 평가합니다.

소스 텍스트 모듈 레코드는 추상 모듈 레코드 타입의 다른 하위 클래스들과 함께 모듈 그래프 내에 존재할 수 있고, 순환 모듈 레코드 타입의 다른 하위 클래스들과 사이클에 참여할 수 있습니다.

표 45에 정의된 필드 외에도, 소스 텍스트 모듈 레코드표 57에 나열된 추가 필드를 가집니다. 이러한 필드는 모두 ParseModule에서 최초로 설정됩니다.

표 57: 소스 텍스트 모듈 레코드의 추가 필드
필드 이름 값 타입 의미
[[ECMAScriptCode]] Parse Node 이 모듈의 소스 텍스트를 Modulegoal symbol로 사용하여 파싱한 결과.
[[Context]] ECMAScript 코드 실행 컨텍스트 또는 empty 이 모듈과 연관된 실행 컨텍스트입니다. 모듈의 환경이 초기화되기 전까지는 empty입니다.
[[ImportMeta]] 객체 또는 empty import.meta 메타 프로퍼티를 통해 노출되는 객체입니다. ECMAScript 코드에서 접근되기 전까지는 empty입니다.
[[ImportEntries]] List of ImportEntry Records 이 모듈의 코드에서 파생된 ImportEntry 레코드의 List입니다.
[[LocalExportEntries]] List of ExportEntry Records 이 모듈의 코드에서 파생된 ExportEntry 레코드의 List로, 모듈 내 선언에 해당하는 항목을 나타냅니다.
[[IndirectExportEntries]] List of ExportEntry Records 이 모듈의 코드에서 파생된 ExportEntry 레코드의 List로, 모듈 내에서 재export된 import나 export * as namespace 선언으로부터의 export에 해당하는 항목을 나타냅니다.
[[StarExportEntries]] List of ExportEntry Records 이 모듈의 코드에서 파생된 ExportEntry 레코드의 List로, export * 선언에 해당하지만 export * as namespace 선언은 제외됩니다.

ImportEntry 레코드는 단일 선언적 import에 대한 정보를 정제한 레코드입니다. 각 ImportEntry 레코드표 58에 정의된 필드를 가집니다:

표 58: ImportEntry 레코드의 필드
필드 이름 값 타입 의미
[[ModuleRequest]] ModuleRequest Record ModuleRequest Record로, ModuleSpecifierImportDeclaration의 import 속성을 나타냅니다.
[[ImportName]] 문자열 또는 namespace-object [[ModuleRequest]]로 식별되는 모듈이 export하는 바인딩의 이름. namespace-object 값은 import 요청이 대상 모듈의 네임스페이스 객체임을 나타냅니다.
[[LocalName]] 문자열 import하는 모듈 내에서 가져온 값을 로컬로 접근하는 데 사용하는 이름입니다.
참고 1

표 59는 구문 import 형태를 표현하는 데 사용되는 ImportEntry 레코드 필드 예시를 제공합니다:

표 59(참고): ImportEntry 레코드 형태로 Import 구문 매핑
import문 형식 [[ModuleRequest]] [[ImportName]] [[LocalName]]
import v from "mod"; "mod" "default" "v"
import * as ns from "mod"; "mod" namespace-object "ns"
import {x} from "mod"; "mod" "x" "x"
import {x as v} from "mod"; "mod" "x" "v"
import "mod"; ImportEntry 레코드가 생성되지 않습니다.

ExportEntry 레코드는 단일 선언적 export에 대한 정보를 정제한 레코드입니다. 각 ExportEntry 레코드표 60에 정의된 필드를 가집니다:

표 60: ExportEntry 레코드의 필드
필드 이름 값 타입 의미
[[ExportName]] 문자열 또는 null 이 모듈이 해당 바인딩을 export할 때 사용하는 이름입니다.
[[ModuleRequest]] ModuleRequest Record 또는 null ModuleRequest Record로, ModuleSpecifierExportDeclaration의 import 속성을 나타냅니다. nullExportDeclarationModuleSpecifier가 없는 경우입니다.
[[ImportName]] 문자열, null, all, 또는 all-but-default [[ModuleRequest]]로 식별되는 모듈이 export하는 바인딩의 이름. nullExportDeclarationModuleSpecifier가 없는 경우입니다. allexport * as ns from "mod" 선언에, all-but-defaultexport * from "mod" 선언에 사용됩니다.
[[LocalName]] 문자열 또는 null import하는 모듈 내에서 export된 값을 로컬로 접근하는 데 사용하는 이름입니다. 모듈 내에서 로컬로 접근할 수 없는 경우 null입니다.
참고 2

표 61는 구문 export 형태를 표현하는 데 사용되는 ExportEntry 레코드 필드 예시를 제공합니다:

표 61(참고): ExportEntry 레코드 형태로 Export 구문 매핑
export문 형식 [[ExportName]] [[ModuleRequest]] [[ImportName]] [[LocalName]]
export var v; "v" null null "v"
export default function f() {} "default" null null "f"
export default function () {} "default" null null "*default*"
export default 42; "default" null null "*default*"
export {x}; "x" null null "x"
export {v as x}; "x" null null "v"
export {x} from "mod"; "x" "mod" "x" null
export {v as x} from "mod"; "x" "mod" "v" null
export * from "mod"; null "mod" all-but-default null
export * as ns from "mod"; "ns" "mod" all null

다음 정의들은 소스 텍스트 모듈 레코드에 필요한 구체적 메서드 및 기타 추상 연산을 명시합니다.

16.2.1.7.1 ParseModule ( sourceText, realm, hostDefined )

추상 연산 ParseModule은 sourceText(ECMAScript 소스 텍스트), realm(Realm Record), 그리고 hostDefined(임의의 값)을 인자로 받으며, 소스 텍스트 모듈 레코드 또는 비어 있지 않은 ListSyntaxError 객체를 반환합니다. 이 연산은 sourceTextModule로 파싱한 결과를 기반으로 소스 텍스트 모듈 레코드를 생성합니다. 호출 시 다음 단계를 수행합니다:

  1. bodyParseText(sourceText, Module)로 설정한다.
  2. body가 오류의 List인 경우, body를 반환한다.
  3. requestedModulesModuleRequests of body로 설정한다.
  4. importEntriesImportEntries of body로 설정한다.
  5. importedBoundNamesImportedLocalNames(importEntries)로 설정한다.
  6. indirectExportEntries를 새로운 빈 List로 설정한다.
  7. localExportEntries를 새로운 빈 List로 설정한다.
  8. starExportEntries를 새로운 빈 List로 설정한다.
  9. exportEntriesExportEntries of body로 설정한다.
  10. exportEntries의 각 ExportEntry Record ee에 대해 다음을 수행한다:
    1. ee.[[ModuleRequest]]null이면:
      1. importedBoundNamesee.[[LocalName]]이 포함되어 있지 않으면:
        1. eelocalExportEntries에 추가한다.
      2. 그 밖의 경우:
        1. ieimportEntries[[LocalName]]ee.[[LocalName]]인 요소로 설정한다.
        2. ie.[[ImportName]]namespace-object이면:
          1. 참고: 이것은 import된 모듈 네임스페이스 객체의 재export이다.
          2. eelocalExportEntries에 추가한다.
        3. 그 밖의 경우:
          1. 참고: 이것은 단일 이름의 재export이다.
          2. ExportEntry Record { [[ModuleRequest]]: ie.[[ModuleRequest]], [[ImportName]]: ie.[[ImportName]], [[LocalName]]: null, [[ExportName]]: ee.[[ExportName]] }를 indirectExportEntries에 추가한다.
    2. 그 밖의 경우 ee.[[ImportName]]all-but-default이면:
      1. Assert: ee.[[ExportName]]null임을 확인한다.
      2. eestarExportEntries에 추가한다.
    3. 그 밖의 경우:
      1. eeindirectExportEntries에 추가한다.
  11. asyncbody Contains await로 설정한다.
  12. Source Text Module Record { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[CycleRoot]]: empty, [[HasTLA]]: async, [[AsyncEvaluationOrder]]: unset, [[TopLevelCapability]]: empty, [[AsyncParentModules]]: « », [[PendingAsyncDependencies]]: empty, [[Status]]: new, [[EvaluationError]]: empty, [[HostDefined]]: hostDefined, [[ECMAScriptCode]]: body, [[Context]]: empty, [[ImportMeta]]: empty, [[RequestedModules]]: requestedModules, [[LoadedModules]]: « », [[ImportEntries]]: importEntries, [[LocalExportEntries]]: localExportEntries, [[IndirectExportEntries]]: indirectExportEntries, [[StarExportEntries]]: starExportEntries, [[DFSAncestorIndex]]: empty }를 반환한다.
참고

구현체는 모듈 소스 텍스트를 미리 파싱하고 Early Error 조건을 분석할 수 있지만, 어떤 오류의 보고도 실제로 이 명세가 해당 소스 텍스트에 대해 ParseModule을 수행하는 시점까지는 지연되어야 합니다.

16.2.1.7.2 모듈 레코드 추상 메서드의 구현

아래는 소스 텍스트 모듈 레코드에 대한 구체적 메서드로, 모듈 레코드 추상 메서드(표 44에 정의됨)를 구현합니다.

16.2.1.7.2.1 GetExportedNames ( [exportStarSet] )

소스 텍스트 모듈 레코드 module의 GetExportedNames 구체적 메서드는 선택적 인자 exportStarSet(List of 소스 텍스트 모듈 레코드)를 받고, 문자열 List를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. Assert: module.[[Status]]new가 아님을 확인한다.
  2. exportStarSet가 없으면 exportStarSet를 새로운 빈 List로 설정한다.
  3. exportStarSetmodule이 포함되어 있으면:
    1. Assert: export * 순환의 시작점에 도달함을 확인한다.
    2. 새로운 빈 List를 반환한다.
  4. moduleexportStarSet에 추가한다.
  5. exportedNames를 새로운 빈 List로 설정한다.
  6. module.[[LocalExportEntries]]의 각 ExportEntry Record e에 대해:
    1. Assert: module이 이 export에 대해 직접 바인딩을 제공함을 확인한다.
    2. Assert: e.[[ExportName]]null이 아님을 확인한다.
    3. e.[[ExportName]]exportedNames에 추가한다.
  7. module.[[IndirectExportEntries]]의 각 ExportEntry Record e에 대해:
    1. Assert: module이 이 export에 대해 특정 바인딩을 import함을 확인한다.
    2. Assert: e.[[ExportName]]null이 아님을 확인한다.
    3. e.[[ExportName]]exportedNames에 추가한다.
  8. module.[[StarExportEntries]]의 각 ExportEntry Record e에 대해:
    1. Assert: e.[[ModuleRequest]]null이 아님을 확인한다.
    2. requestedModuleGetImportedModule(module, e.[[ModuleRequest]])로 설정한다.
    3. starNamesrequestedModule.GetExportedNames(exportStarSet)로 설정한다.
    4. starNames의 각 n에 대해:
      1. n"default"가 아니면:
        1. exportedNamesn이 없으면 nexportedNames에 추가한다.
  9. exportedNames를 반환한다.
참고

GetExportedNames는 별표(export *) export 바인딩의 모호한 이름을 필터링하거나 예외를 발생시키지 않습니다.

16.2.1.7.2.2 ResolveExport ( exportName [ , resolveSet ] )

소스 텍스트 모듈 레코드 module의 ResolveExport 구체적 메서드는 exportName(문자열)과 선택적 인자 resolveSet(필드 [[Module]](모듈 레코드)와 [[ExportName]](문자열)을 가진 List of Record))를 받아 ResolvedBinding Record, null, 또는 ambiguous를 반환합니다.

ResolveExport는 import된 바인딩을 실제 정의 모듈과 로컬 바인딩 이름으로 해결하려 시도합니다. 정의 모듈은 이 메서드가 호출된 모듈 레코드일 수도 있고, 그 모듈이 import하는 다른 모듈일 수도 있습니다. resolveSet 파라미터는 미해결 순환 import/export 경로를 감지하기 위해 사용합니다. 특정 모듈 레코드exportName 쌍이 resolveSet에 이미 있으면 import 순환이 발견된 것입니다. ResolveExport를 재귀적으로 호출하기 전에 moduleexportName 쌍을 resolveSet에 추가합니다.

정의 모듈이 발견되면 ResolvedBinding Record { [[Module]], [[BindingName]] }를 반환합니다. 이 레코드는 요청된 export의 해결된 바인딩을 나타내지만, 네임스페이스로 export되고 로컬 바인딩이 없는 경우에는 [[BindingName]]namespace로 설정됩니다. 정의가 없거나 요청이 순환임이 발견되면 null을 반환합니다. 요청이 모호함이 발견되면 ambiguous를 반환합니다.

호출 시 다음 절차를 수행합니다:

  1. Assert: module.[[Status]]new가 아님을 확인한다.
  2. resolveSet가 없으면 resolveSet를 새로운 빈 List로 설정한다.
  3. resolveSet의 각 Record { [[Module]], [[ExportName]] } r에 대해:
    1. moduler.[[Module]]이 동일한 모듈 레코드이고 exportNamer.[[ExportName]]이면:
      1. Assert: 순환 import 요청임을 확인한다.
      2. null을 반환한다.
  4. Record { [[Module]]: module, [[ExportName]]: exportName }를 resolveSet에 추가한다.
  5. module.[[LocalExportEntries]]의 각 ExportEntry Record e에 대해:
    1. e.[[ExportName]]exportName이면:
      1. Assert: module이 이 export에 대해 직접 바인딩을 제공함을 확인한다.
      2. ResolvedBinding Record { [[Module]]: module, [[BindingName]]: e.[[LocalName]] }를 반환한다.
  6. module.[[IndirectExportEntries]]의 각 ExportEntry Record e에 대해:
    1. e.[[ExportName]]exportName이면:
      1. Assert: e.[[ModuleRequest]]null이 아님을 확인한다.
      2. importedModuleGetImportedModule(module, e.[[ModuleRequest]])로 설정한다.
      3. e.[[ImportName]]all이면:
        1. Assert: module이 이 export에 대해 직접 바인딩을 제공하지 않음을 확인한다.
        2. ResolvedBinding Record { [[Module]]: importedModule, [[BindingName]]: namespace }를 반환한다.
      4. 그 밖의 경우:
        1. Assert: module이 이 export에 대해 특정 바인딩을 import함을 확인한다.
        2. Assert: e.[[ImportName]] 문자열임을 확인한다.
        3. importedModule.ResolveExport(e.[[ImportName]], resolveSet)을 반환한다.
  7. exportName"default"이면:
    1. Assert: 이 모듈에서 default export가 명시적으로 정의되지 않았음을 확인한다.
    2. null을 반환한다.
    3. 참고: default export는 export * from "mod" 선언으로 제공될 수 없다.
  8. starResolutionnull로 설정한다.
  9. module.[[StarExportEntries]]의 각 ExportEntry Record e에 대해:
    1. Assert: e.[[ModuleRequest]]null이 아님을 확인한다.
    2. importedModuleGetImportedModule(module, e.[[ModuleRequest]])로 설정한다.
    3. resolutionimportedModule.ResolveExport(exportName, resolveSet)로 설정한다.
    4. resolutionambiguous이면 ambiguous를 반환한다.
    5. resolutionnull이 아니면:
      1. Assert: resolutionResolvedBinding Record임을 확인한다.
      2. starResolutionnull이면 starResolutionresolution으로 설정한다.
      3. 그 밖의 경우:
        1. Assert: 요청된 이름을 포함하는 * import가 둘 이상임을 확인한다.
        2. resolution.[[Module]]starResolution.[[Module]]이 동일한 모듈 레코드가 아니면 ambiguous를 반환한다.
        3. resolution.[[BindingName]]starResolution.[[BindingName]]과 다르고, resolution.[[BindingName]] 또는 starResolution.[[BindingName]]namespace인 경우 ambiguous를 반환한다.
        4. resolution.[[BindingName]] 문자열이고, starResolution.[[BindingName]] 문자열이며, 두 값이 다르면 ambiguous를 반환한다.
  10. starResolution을 반환한다.

16.2.1.7.3 순환 모듈 레코드 추상 메서드의 구현

아래는 소스 텍스트 모듈 레코드에 대한 구체적 메서드로, 순환 모듈 레코드 추상 메서드(표 46에 정의됨)를 구현합니다.

16.2.1.7.3.1 InitializeEnvironment ( )

소스 텍스트 모듈 레코드 module의 InitializeEnvironment 구체적 메서드는 인자를 받지 않으며, 정상 완료(normal completion)unused를 포함하거나 throw completion를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. module.[[IndirectExportEntries]]의 각 ExportEntry Record e에 대해:
    1. Assert: e.[[ExportName]]null이 아님을 확인한다.
    2. resolutionmodule.ResolveExport(e.[[ExportName]])로 설정한다.
    3. resolutionnull 또는 ambiguous이면 SyntaxError 예외를 throw한다.
    4. Assert: resolutionResolvedBinding Record임을 확인한다.
  2. Assert: module의 모든 이름 있는 export가 해결 가능함을 확인한다.
  3. realmmodule.[[Realm]]로 설정한다.
  4. Assert: realmundefined가 아님을 확인한다.
  5. envNewModuleEnvironment(realm.[[GlobalEnv]])로 설정한다.
  6. module.[[Environment]]env로 설정한다.
  7. module.[[ImportEntries]]의 각 ImportEntry Record in에 대해:
    1. importedModuleGetImportedModule(module, in.[[ModuleRequest]])로 설정한다.
    2. in.[[ImportName]]namespace-object이면:
      1. namespaceGetModuleNamespace(importedModule)로 설정한다.
      2. env.CreateImmutableBinding(in.[[LocalName]], true)를 수행한다.
      3. env.InitializeBinding(in.[[LocalName]], namespace)를 수행한다.
    3. 그 밖의 경우:
      1. resolutionimportedModule.ResolveExport(in.[[ImportName]])로 설정한다.
      2. resolutionnull 또는 ambiguous이면 SyntaxError 예외를 throw한다.
      3. resolution.[[BindingName]]namespace이면:
        1. namespaceGetModuleNamespace(resolution.[[Module]])로 설정한다.
        2. env.CreateImmutableBinding(in.[[LocalName]], true)를 수행한다.
        3. env.InitializeBinding(in.[[LocalName]], namespace)를 수행한다.
      4. 그 밖의 경우:
        1. CreateImportBinding(env, in.[[LocalName]], resolution.[[Module]], resolution.[[BindingName]])를 수행한다.
  8. moduleContext를 새로운 ECMAScript 코드 실행 컨텍스트로 설정한다.
  9. moduleContext의 Function을 null로 설정한다.
  10. Assert: module.[[Realm]]undefined가 아님을 확인한다.
  11. moduleContextRealmmodule.[[Realm]]로 설정한다.
  12. moduleContext의 ScriptOrModule을 module로 설정한다.
  13. moduleContext의 VariableEnvironment를 module.[[Environment]]로 설정한다.
  14. moduleContext의 LexicalEnvironment를 module.[[Environment]]로 설정한다.
  15. moduleContext의 PrivateEnvironment를 null로 설정한다.
  16. module.[[Context]]moduleContext로 설정한다.
  17. moduleContext실행 컨텍스트 스택에 push한다; moduleContext가 이제 실행 중인 실행 컨텍스트이다.
  18. codemodule.[[ECMAScriptCode]]로 설정한다.
  19. varDeclarationsVarScopedDeclarations of code로 설정한다.
  20. declaredVarNames를 새로운 빈 List로 설정한다.
  21. varDeclarations의 각 d에 대해:
    1. BoundNames of d의 각 dn에 대해:
      1. declaredVarNamesdn이 없으면:
        1. env.CreateMutableBinding(dn, false)를 수행한다.
        2. env.InitializeBinding(dn, undefined)를 수행한다.
        3. declaredVarNamesdn을 추가한다.
  22. lexDeclarationsLexicallyScopedDeclarations of code로 설정한다.
  23. privateEnvnull로 설정한다.
  24. lexDeclarations의 각 d에 대해:
    1. BoundNames of d의 각 dn에 대해:
      1. IsConstantDeclaration of dtrue이면:
        1. env.CreateImmutableBinding(dn, true)를 수행한다.
      2. 그 밖의 경우:
        1. env.CreateMutableBinding(dn, false)를 수행한다.
      3. dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration 중 하나이면:
        1. foInstantiateFunctionObject of d with arguments env, privateEnv로 설정한다.
        2. env.InitializeBinding(dn, fo)를 수행한다.
  25. moduleContext실행 컨텍스트 스택에서 제거한다.
  26. unused를 반환한다.

16.2.1.7.3.2 ExecuteModule ( [ capability ] )

소스 텍스트 모듈 레코드 module의 ExecuteModule 구체적 메서드는 선택적 인자 capability(PromiseCapability Record)를 받고, 정상 완료(normal completion)unused를 포함하거나 throw completion를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. moduleContext를 새로운 ECMAScript 코드 실행 컨텍스트로 설정한다.
  2. moduleContext의 Function을 null로 설정한다.
  3. moduleContextRealmmodule.[[Realm]]로 설정한다.
  4. moduleContext의 ScriptOrModule을 module로 설정한다.
  5. Assert: module이 링크되고 모듈 환경 내 선언이 인스턴스화되었음을 확인한다.
  6. moduleContext의 VariableEnvironment를 module.[[Environment]]로 설정한다.
  7. moduleContext의 LexicalEnvironment를 module.[[Environment]]로 설정한다.
  8. 실행 중인 실행 컨텍스트를 일시 중지한다.
  9. module.[[HasTLA]]false이면:
    1. Assert: capability가 없음을 확인한다.
    2. moduleContext실행 컨텍스트 스택에 push한다; moduleContext가 이제 실행 중인 실행 컨텍스트이다.
    3. resultCompletion(Evaluation of module.[[ECMAScriptCode]])로 설정한다.
    4. moduleContext를 일시 중지시키고, 실행 컨텍스트 스택에서 제거한다.
    5. 실행 컨텍스트 스택의 맨 위에 있는 컨텍스트를 실행 중인 실행 컨텍스트로 재개한다.
    6. result비정상 완료(abrupt completion)이면:
      1. result를 반환한다.
  10. 그 밖의 경우:
    1. Assert: capabilityPromiseCapability Record임을 확인한다.
    2. AsyncBlockStart(capability, module.[[ECMAScriptCode]], moduleContext)를 수행한다.
  11. unused를 반환한다.

16.2.1.8 합성 모듈 레코드

합성 모듈 레코드는 명세에 의해 정의된 모듈에 대한 정보를 나타내는 데 사용됩니다. export된 이름들은 생성 시에 정적으로 정의되며, 해당 값들은 SetSyntheticModuleExport를 사용하여 시간이 지나면서 변경될 수 있습니다. import나 의존성이 없습니다.

참고
합성 모듈 레코드는 JSON 모듈이나 CSS 모듈 등 다양한 타입의 모듈을 정의하는 데 사용할 수 있습니다.

표 43에 정의된 필드 외에도, 합성 모듈 레코드는 표 62에 나열된 추가 필드를 가집니다.

표 62: 합성 모듈 레코드의 추가 필드
필드 이름 값 타입 의미
[[ExportNames]] 문자열의 List 모듈의 export 이름들. 이 리스트에는 중복이 없습니다.
[[EvaluationSteps]] 추상 클로저(Abstract Closure) 모듈 평가 시 수행할 초기화 로직으로, 합성 모듈 레코드를 단일 인자로 받습니다. [[ExportNames]]를 수정하면 안 됩니다. 비정상 완료(abrupt completion)를 반환할 수 있습니다.

16.2.1.8.1 CreateDefaultExportSyntheticModule ( defaultExport )

추상 연산 CreateDefaultExportSyntheticModule은 defaultExport(ECMAScript 언어 값)을 인자로 받아 합성 모듈 레코드를 반환합니다. 이 연산은 defaultExport를 default export로 갖는 합성 모듈 레코드를 생성합니다. 호출 시 다음 절차를 수행합니다:

  1. realm현재 Realm Record로 설정한다.
  2. setDefaultExport를 파라미터(module)를 가지며 defaultExport를 캡처하는 새로운 추상 클로저(Abstract Closure)로 설정하여, 호출 시 다음을 수행한다:
    1. SetSyntheticModuleExport(module, "default", defaultExport)를 수행한다.
    2. NormalCompletion(unused)을 반환한다.
  3. 다음과 같은 합성 모듈 레코드를 반환한다: { [[Realm]]: realm, [[Environment]]: empty, [[Namespace]]: empty, [[HostDefined]]: undefined, [[ExportNames]]: « "default" », [[EvaluationSteps]]: setDefaultExport }.

16.2.1.8.2 ParseJSONModule ( source )

추상 연산 ParseJSONModule은 source(문자열)를 인자로 받아 정상 완료(normal completion)합성 모듈 레코드를 포함하거나, throw completion를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. json을 ? ParseJSON(source)로 설정한다.
  2. CreateDefaultExportSyntheticModule(json)을 반환한다.

16.2.1.8.3 SetSyntheticModuleExport ( module, exportName, exportValue )

추상 연산 SetSyntheticModuleExport는 module(합성 모듈 레코드), exportName(문자열), exportValue(ECMAScript 언어 값)을 인자로 받아 unused를 반환합니다. 이 연산은 합성 모듈 레코드의 기존 export에 대한 값을 설정하거나 변경할 수 있습니다. 호출 시 다음 절차를 수행합니다:

  1. Assert: module.[[ExportNames]]exportName이 포함되어 있음을 확인한다.
  2. envRecmodule.[[Environment]]로 설정한다.
  3. Assert: envRecempty가 아님을 확인한다.
  4. envRec.SetMutableBinding(exportName, exportValue, true)를 수행한다.
  5. unused를 반환한다.

16.2.1.8.4 모듈 레코드 추상 메서드의 구현

아래는 합성 모듈 레코드에 대한 구체적 메서드로, 모듈 레코드 추상 메서드(표 44에 정의됨)를 구현합니다.

16.2.1.8.4.1 LoadRequestedModules ( )

합성 모듈 레코드 module의 LoadRequestedModules 구체적 메서드는 인자를 받지 않으며 Promise를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. PromiseResolve(%Promise%, undefined)를 반환한다.
참고
합성 모듈 레코드는 의존성이 없습니다.

16.2.1.8.4.2 GetExportedNames ( )

합성 모듈 레코드 module의 GetExportedNames 구체적 메서드는 인자를 받지 않으며, 문자열 List를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. module.[[ExportNames]]를 반환한다.

16.2.1.8.4.3 ResolveExport ( exportName )

합성 모듈 레코드 module의 ResolveExport 구체적 메서드는 exportName(문자열)을 인자로 받아 ResolvedBinding Record 또는 null을 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. module.[[ExportNames]]exportName이 없으면 null을 반환한다.
  2. ResolvedBinding Record { [[Module]]: module, [[BindingName]]: exportName }를 반환한다.

16.2.1.8.4.4 Link ( )

합성 모듈 레코드 module의 Link 구체적 메서드는 인자를 받지 않으며 정상 완료(normal completion)unused를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. realmmodule.[[Realm]]로 설정한다.
  2. envNewModuleEnvironment(realm.[[GlobalEnv]])로 설정한다.
  3. module.[[Environment]]env로 설정한다.
  4. module.[[ExportNames]]의 각 문자열 exportName에 대해:
    1. env.CreateMutableBinding(exportName, false)를 수행한다.
    2. env.InitializeBinding(exportName, undefined)를 수행한다.
  5. NormalCompletion(unused)을 반환한다.

16.2.1.8.4.5 Evaluate ( )

합성 모듈 레코드 module의 Evaluate 구체적 메서드는 인자를 받지 않으며 Promise를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. moduleContext를 새로운 ECMAScript 코드 실행 컨텍스트로 설정한다.
  2. moduleContext의 Function을 null로 설정한다.
  3. moduleContextRealmmodule.[[Realm]]로 설정한다.
  4. moduleContext의 ScriptOrModule을 module로 설정한다.
  5. moduleContext의 VariableEnvironment를 module.[[Environment]]로 설정한다.
  6. moduleContext의 LexicalEnvironment를 module.[[Environment]]로 설정한다.
  7. 실행 중인 실행 컨텍스트를 일시 중지한다.
  8. moduleContext실행 컨텍스트 스택에 push한다; moduleContext가 이제 실행 중인 실행 컨텍스트이다.
  9. stepsmodule.[[EvaluationSteps]]로 설정한다.
  10. resultCompletion(steps(module))로 설정한다.
  11. moduleContext를 일시 중지시키고, 실행 컨텍스트 스택에서 제거한다.
  12. 실행 컨텍스트 스택의 맨 위에 있는 컨텍스트를 실행 중인 실행 컨텍스트로 재개한다.
  13. pc를 ! NewPromiseCapability(%Promise%)로 설정한다.
  14. IfAbruptRejectPromise(result, pc)를 수행한다.
  15. Call(pc.[[Resolve]], undefined, « undefined »)를 수행한다.
  16. pc.[[Promise]]를 반환한다.

16.2.1.9 GetImportedModule ( referrer, request )

추상 연산 GetImportedModule은 referrer(순환 모듈 레코드)와 request(ModuleRequest Record)를 인자로 받고 모듈 레코드를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. recordsreferrer.[[LoadedModules]]에 있는 각 LoadedModuleRequest Record rModuleRequestsEqual(r, request)가 true인 것만 모은 List로 설정한다.
  2. Assert: records는 정확히 하나의 요소만을 가져야 하며, 이는 LoadRequestedModules가 referrer에서 성공적으로 완료된 후 이 추상 연산이 호출되기 때문이다.
  3. recordrecords의 유일한 요소로 설정한다.
  4. record.[[Module]]를 반환한다.

16.2.1.10 HostLoadImportedModule ( referrer, moduleRequest, hostDefined, payload )

호스트 정의 추상 연산 HostLoadImportedModule은 referrer(스크립트 레코드, 순환 모듈 레코드, 또는 Realm Record), moduleRequest(ModuleRequest Record), hostDefined(임의 값), payload(GraphLoadingState Record 또는 PromiseCapability Record)를 인자로 받아 unused를 반환합니다.

참고 1

referrerRealm Record가 될 수 있는 예시는 웹 브라우저 호스트에서 발생합니다. 사용자가 아래와 같은 컨트롤을 클릭할 때

<button type="button" onclick="import('./foo.mjs')">Click me</button>

해당 시점에는 활성 스크립트나 모듈이 존재하지 않습니다. 좀 더 일반적으로, 호스트실행 컨텍스트null ScriptOrModule 구성요소로 실행 컨텍스트 스택에 push하는 모든 상황에서 발생할 수 있습니다.

HostLoadImportedModule의 구현체는 아래 요구사항을 따라야 합니다:

실제 처리 과정은 호스트 정의이지만, 일반적으로 적절한 모듈 레코드를 로드하기 위한 필요한 모든 I/O 작업을 수행합니다. 여러 (referrer, moduleRequest.[[Specifier]], moduleRequest.[[Attributes]]) 삼중쌍이 동일한 모듈 레코드 인스턴스에 매핑될 수 있습니다. 실제 매핑 방식은 호스트 정의이지만, 일반적으로 매핑 과정에서 specifier에 대한 정규화 프로세스가 적용됩니다. 일반적인 정규화 과정에는 상대 경로 및 축약 경로 지정자의 확장이 포함될 수 있습니다.

참고 2

위 요구사항은 호스트type: "json"으로 import할 때 JSON 모듈을 지원해야 함을 의미하지만(그리고 HostLoadImportedModule이 정상적으로 완료될 경우), type: "json" 없이 import할 때 JSON 모듈을 지원하는 것을 금지하지는 않습니다.

16.2.1.11 FinishLoadingImportedModule ( referrer, moduleRequest, payload, result )

FinishLoadingImportedModule 추상 연산은 referrer(스크립트 레코드, 순환 모듈 레코드, 또는 Realm Record), moduleRequest(ModuleRequest Record), payload(GraphLoadingState Record 또는 PromiseCapability Record), result(정상 완료(normal completion)모듈 레코드를 포함하거나 throw completion)를 인자로 받아 unused를 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. result정상 완료(normal completion)이면:
    1. referrer.[[LoadedModules]]LoadedModuleRequest Record record가 존재하고 ModuleRequestsEqual(record, moduleRequest)가 true이면:
      1. Assert: record.[[Module]]result.[[Value]]는 동일한 모듈 레코드임을 확인한다.
    2. 그 밖의 경우:
      1. LoadedModuleRequest Record { [[Specifier]]: moduleRequest.[[Specifier]], [[Attributes]]: moduleRequest.[[Attributes]], [[Module]]: result.[[Value]] }를 referrer.[[LoadedModules]]에 추가한다.
  2. payloadGraphLoadingState Record이면:
    1. ContinueModuleLoading(payload, result)를 수행한다.
  3. 그 밖의 경우:
    1. ContinueDynamicImport(payload, result)를 수행한다.
  4. unused를 반환한다.

16.2.1.12 AllImportAttributesSupported ( attributes )

AllImportAttributesSupported 추상 연산은 attributes(List of ImportAttribute Records)를 인자로 받아 불리언 값을 반환합니다. 호출 시 다음 절차를 수행합니다:

  1. supportedHostGetSupportedImportAttributes()로 설정한다.
  2. attributes의 각 ImportAttribute Record attribute에 대해:
    1. supportedattribute.[[Key]]가 없으면 false를 반환한다.
  3. true를 반환한다.

16.2.1.12.1 HostGetSupportedImportAttributes ( )

HostGetSupportedImportAttributes 호스트 정의 추상 연산은 인자를 받지 않으며, 문자열의 List를 반환합니다. 호스트 환경이 지원하는 import attribute 키를 지정할 수 있게 합니다. 지원되는 키의 attribute만 호스트에 제공됩니다.

HostGetSupportedImportAttributes의 구현체는 아래 요구사항을 따라야 합니다:

  • 반환값은 지원되는 attribute를 나타내는 문자열의 List여야 한다.
  • 이 연산이 호출될 때마다 동일한 List와 동일한 순서의 내용을 반환해야 한다.

HostGetSupportedImportAttributes의 기본 구현은 새로운 빈 List를 반환하는 것이다.

참고
지원되지 않는 attribute를 호스트에 전달하고 호스트가 원하는 것만 처리하게 하는 대신, 호스트가 지원하는 import attribute를 명시적으로 지정하도록 요구하는 목적은 서로 다른 호스트들 사이에서 지원되지 않는 attribute가 일관되게 처리되도록 하기 위함이다.

16.2.1.13 GetModuleNamespace ( module )

GetModuleNamespace 추상 연산은 module(모듈 레코드의 구체적 하위 클래스 인스턴스)을 인자로 받아 모듈 네임스페이스 객체(Module Namespace Object)를 반환합니다. 이 객체는 module의 export를 나타내며, 처음 요청 시 지연 생성되고, 이후 요청을 위해 module.[[Namespace]]에 저장됩니다. 호출 시 다음 절차를 수행합니다:

  1. Assert: module순환 모듈 레코드인 경우 module.[[Status]]new 또는 unlinked가 아님을 확인한다.
  2. namespacemodule.[[Namespace]]로 설정한다.
  3. namespaceempty이면:
    1. exportedNamesmodule.GetExportedNames()로 설정한다.
    2. unambiguousNames를 새로운 빈 List로 설정한다.
    3. exportedNames의 각 name에 대해:
      1. resolutionmodule.ResolveExport(name)로 설정한다.
      2. resolutionResolvedBinding Record이면, nameunambiguousNames에 추가한다.
    4. namespaceModuleNamespaceCreate(module, unambiguousNames)로 설정한다.
  4. namespace를 반환한다.
참고

GetModuleNamespace는 예외를 throw하지 않습니다. 대신, 해결 불가능한 이름은 네임스페이스에서 단순히 제외됩니다. 실제 linking 오류는 나중에 발생하며, 단 ambiguous star export로만 구성되어 있고 명시적으로 요청되지 않을 경우에는 linking 오류가 나지 않을 수 있습니다.

16.2.1.14 런타임 의미론: 평가(Evaluation)

Module : [empty]
  1. undefined를 반환한다.
ModuleBody : ModuleItemList
  1. resultCompletion(Evaluation of ModuleItemList)로 설정한다.
  2. result정상 완료(normal completion)이고 result.[[Value]]empty이면:
    1. undefined를 반환한다.
  3. result를 반환한다.
ModuleItemList : ModuleItemList ModuleItem
  1. sl를 ? Evaluation of ModuleItemList로 설정한다.
  2. sCompletion(Evaluation of ModuleItem)로 설정한다.
  3. UpdateEmpty(s, sl)를 반환한다.
참고

ModuleItemList의 값은 ModuleItemList 내 마지막 값 생성 항목의 값이 된다.

ModuleItem : ImportDeclaration
  1. empty를 반환한다.

16.2.2 임포트

문법

ImportDeclaration : import ImportClause FromClause WithClauseopt ; import ModuleSpecifier WithClauseopt ; ImportClause : ImportedDefaultBinding NameSpaceImport NamedImports ImportedDefaultBinding , NameSpaceImport ImportedDefaultBinding , NamedImports ImportedDefaultBinding : ImportedBinding NameSpaceImport : * as ImportedBinding NamedImports : { } { ImportsList } { ImportsList , } FromClause : from ModuleSpecifier ImportsList : ImportSpecifier ImportsList , ImportSpecifier ImportSpecifier : ImportedBinding ModuleExportName as ImportedBinding ModuleSpecifier : StringLiteral ImportedBinding : BindingIdentifier[~Yield, +Await] WithClause : with { } with { WithEntries ,opt } WithEntries : AttributeKey : StringLiteral AttributeKey : StringLiteral , WithEntries AttributeKey : IdentifierName StringLiteral

16.2.2.1 정적 의미론: 조기 오류

ModuleItem : ImportDeclaration WithClause : with { WithEntries ,opt }

16.2.2.2 정적 의미론: ImportEntries

구문 지향 연산 ImportEntries는 인자가 없으며 List 형태의 ImportEntry Records를 반환합니다. 다음의 각 생산 규칙에 대해 조각별로 정의됩니다:

Module : [empty]
  1. 새 빈 List를 반환한다.
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ImportEntries of ModuleItemList로 한다.
  2. entries2ImportEntries of ModuleItem로 한다.
  3. entries1entries2list-concatenation을 반환한다.
ModuleItem : ExportDeclaration StatementListItem
  1. 새 빈 List를 반환한다.
ImportDeclaration : import ImportClause FromClause WithClauseopt ;
  1. moduleModuleRequests of ImportDeclaration의 유일한 요소로 한다.
  2. ImportEntriesForModule of ImportClausemodule 인자를 넘겨 반환한다.
ImportDeclaration : import ModuleSpecifier WithClauseopt ;
  1. 새 빈 List를 반환한다.

16.2.2.3 정적 의미론: ImportEntriesForModule

구문 지향 연산 ImportEntriesForModule은 module ( ModuleRequest Record ) 인자를 받고 List 형태의 ImportEntry Records를 반환합니다. 다음의 각 생산 규칙에 대해 조각별로 정의됩니다:

ImportClause : ImportedDefaultBinding , NameSpaceImport
  1. entries1ImportEntriesForModule of ImportedDefaultBindingmodule 인자를 넘겨서 얻는다.
  2. entries2ImportEntriesForModule of NameSpaceImportmodule 인자를 넘겨서 얻는다.
  3. entries1entries2list-concatenation을 반환한다.
ImportClause : ImportedDefaultBinding , NamedImports
  1. entries1ImportEntriesForModule of ImportedDefaultBindingmodule 인자를 넘겨서 얻는다.
  2. entries2ImportEntriesForModule of NamedImportsmodule 인자를 넘겨서 얻는다.
  3. entries1entries2list-concatenation을 반환한다.
ImportedDefaultBinding : ImportedBinding
  1. localNameBoundNames of ImportedBinding의 유일한 요소로 한다.
  2. defaultEntryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: "default", [[LocalName]]: localName }로 한다.
  3. « defaultEntry »를 반환한다.
NameSpaceImport : * as ImportedBinding
  1. localNameStringValue of ImportedBinding로 한다.
  2. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: namespace-object, [[LocalName]]: localName }로 한다.
  3. « entry »를 반환한다.
NamedImports : { }
  1. 새 빈 List를 반환한다.
ImportsList : ImportsList , ImportSpecifier
  1. specs1ImportEntriesForModule of ImportsListmodule 인자를 넘겨서 얻는다.
  2. specs2ImportEntriesForModule of ImportSpecifiermodule 인자를 넘겨서 얻는다.
  3. specs1specs2list-concatenation을 반환한다.
ImportSpecifier : ImportedBinding
  1. localNameBoundNames of ImportedBinding의 유일한 요소로 한다.
  2. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: localName, [[LocalName]]: localName }로 한다.
  3. « entry »를 반환한다.
ImportSpecifier : ModuleExportName as ImportedBinding
  1. importNameStringValue of ModuleExportName로 한다.
  2. localNameStringValue of ImportedBinding로 한다.
  3. entryImportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName }로 한다.
  4. « entry »를 반환한다.

16.2.2.4 정적 의미론: WithClauseToAttributes

구문 지향 연산 WithClauseToAttributes는 인자를 받지 않으며, List 형태의 ImportAttribute Records를 반환합니다. 아래의 각 생산 규칙별로 조각별로 정의됩니다:

WithClause : with { }
  1. 새 빈 List를 반환한다.
WithClause : with { WithEntries ,opt }
  1. attributesWithClauseToAttributes of WithEntries로 한다.
  2. attributes를 각 [[Key]] 필드의 값을 UTF-16 코드 유닛 시퀀스로 취급하여, 그 사전식(lexicographic) 순서대로 정렬한다. 참고: 이 정렬은 호스트가 속성 열거 순서에 따라 동작을 변경하는 것이 금지됨을 관찰할 수 있을 뿐입니다.
  3. attributes를 반환한다.
WithEntries : AttributeKey : StringLiteral
  1. keyPropName of AttributeKey로 한다.
  2. entryImportAttribute Record { [[Key]]: key, [[Value]]: SV of StringLiteral }로 한다.
  3. « entry »를 반환한다.
WithEntries : AttributeKey : StringLiteral , WithEntries
  1. keyPropName of AttributeKey로 한다.
  2. entryImportAttribute Record { [[Key]]: key, [[Value]]: SV of StringLiteral }로 한다.
  3. restWithClauseToAttributes of WithEntries로 한다.
  4. « entry »와 restlist-concatenation을 반환한다.

16.2.3 익스포트

문법

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement[~Yield, +Await] export Declaration[~Yield, +Await] export default HoistableDeclaration[~Yield, +Await, +Default] export default ClassDeclaration[~Yield, +Await, +Default] export default [lookahead ∉ { function, async [no LineTerminator here] function, class }] AssignmentExpression[+In, ~Yield, +Await] ; ExportFromClause : * * as ModuleExportName NamedExports NamedExports : { } { ExportsList } { ExportsList , } ExportsList : ExportSpecifier ExportsList , ExportSpecifier ExportSpecifier : ModuleExportName ModuleExportName as ModuleExportName

16.2.3.1 정적 의미론: 조기 오류

ExportDeclaration : export NamedExports ; 참고

위 규칙은 NamedExportsReferencedBindingsIdentifierReference로 취급된다는 의미입니다.

16.2.3.2 정적 의미론: ExportedBindings

구문 지향 연산 ExportedBindings는 인자를 받지 않으며 List 형태의 문자열을 반환합니다.

참고

ExportedBindings는 ModuleExportedNames와 명시적으로 연결된 로컬 바인딩 이름입니다.

아래의 생산 규칙별로 조각별로 정의됩니다:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ExportedBindings of ModuleItemList로 한다.
  2. names2ExportedBindings of ModuleItem로 한다.
  3. names1names2list-concatenation을 반환한다.
ModuleItem : ImportDeclaration StatementListItem
  1. 새 빈 List를 반환한다.
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. 새 빈 List를 반환한다.
ExportDeclaration : export NamedExports ;
  1. ExportedBindings of NamedExports를 반환한다.
ExportDeclaration : export VariableStatement
  1. BoundNames of VariableStatement를 반환한다.
ExportDeclaration : export Declaration
  1. BoundNames of Declaration를 반환한다.
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. BoundNames of ExportDeclaration를 반환한다.
NamedExports : { }
  1. 새 빈 List를 반환한다.
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportedBindings of ExportsList로 한다.
  2. names2ExportedBindings of ExportSpecifier로 한다.
  3. names1names2list-concatenation을 반환한다.
ExportSpecifier : ModuleExportName
  1. ModuleExportNameStringValue만을 요소로 가지는 List를 반환한다.
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 첫 번째 ModuleExportNameStringValue만을 요소로 가지는 List를 반환한다.

16.2.3.3 정적 의미론: ExportedNames

구문 지향 연산 ExportedNames는 인자를 받지 않으며 List 형태의 문자열을 반환합니다.

참고

ExportedNames는 Module가 명시적으로 자신의 로컬 바인딩 이름 중 하나에 매핑한 외부적으로 보이는 이름들입니다.

아래의 생산 규칙별로 조각별로 정의됩니다:

ModuleItemList : ModuleItemList ModuleItem
  1. names1ExportedNames of ModuleItemList로 한다.
  2. names2ExportedNames of ModuleItem로 한다.
  3. names1names2리스트 연결을 반환한다.
ModuleItem : ExportDeclaration
  1. ExportedNames of ExportDeclaration를 반환한다.
ModuleItem : ImportDeclaration StatementListItem
  1. 새 빈 List를 반환한다.
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. ExportedNames of ExportFromClause를 반환한다.
ExportFromClause : *
  1. 새 빈 List를 반환한다.
ExportFromClause : * as ModuleExportName
  1. ModuleExportNameStringValue만을 요소로 가지는 List를 반환한다.
ExportFromClause : NamedExports
  1. ExportedNames of NamedExports를 반환한다.
ExportDeclaration : export VariableStatement
  1. BoundNames of VariableStatement를 반환한다.
ExportDeclaration : export Declaration
  1. BoundNames of Declaration를 반환한다.
ExportDeclaration : export default HoistableDeclaration export default ClassDeclaration export default AssignmentExpression ;
  1. « "default" »를 반환한다.
NamedExports : { }
  1. 새 빈 List를 반환한다.
ExportsList : ExportsList , ExportSpecifier
  1. names1ExportedNames of ExportsList로 한다.
  2. names2ExportedNames of ExportSpecifier로 한다.
  3. names1names2리스트 연결을 반환한다.
ExportSpecifier : ModuleExportName
  1. ModuleExportNameStringValue만을 요소로 가지는 List를 반환한다.
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 두 번째 ModuleExportNameStringValue만을 요소로 가지는 List를 반환한다.

16.2.3.4 정적 의미론: ExportEntries

구문 지향 연산 ExportEntries는 인자를 받지 않으며 List 형태의 ExportEntry Records를 반환합니다. 아래의 각 생산 규칙별로 조각별로 정의됩니다:

Module : [empty]
  1. 새 빈 List를 반환한다.
ModuleItemList : ModuleItemList ModuleItem
  1. entries1ExportEntries of ModuleItemList로 한다.
  2. entries2ExportEntries of ModuleItem로 한다.
  3. entries1entries2리스트 연결을 반환한다.
ModuleItem : ImportDeclaration StatementListItem
  1. 새 빈 List를 반환한다.
ExportDeclaration : export ExportFromClause FromClause WithClauseopt ;
  1. moduleModuleRequests of ExportDeclaration의 유일한 요소로 한다.
  2. ExportEntriesForModule of ExportFromClausemodule 인자를 넘겨 반환한다.
ExportDeclaration : export NamedExports ;
  1. ExportEntriesForModule of NamedExportsnull 인자를 넘겨 반환한다.
ExportDeclaration : export VariableStatement
  1. entries를 새 빈 List로 한다.
  2. namesBoundNames of VariableStatement로 한다.
  3. names의 각 요소 name에 대해,
    1. ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name }를 entries에 추가한다.
  4. entries를 반환한다.
ExportDeclaration : export Declaration
  1. entries를 새 빈 List로 한다.
  2. namesBoundNames of Declaration로 한다.
  3. names의 각 요소 name에 대해,
    1. ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: name, [[ExportName]]: name }를 entries에 추가한다.
  4. entries를 반환한다.
ExportDeclaration : export default HoistableDeclaration
  1. namesBoundNames of HoistableDeclaration로 한다.
  2. localNamenames의 유일한 요소로 한다.
  3. List의 유일한 요소로 ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" }를 반환한다.
ExportDeclaration : export default ClassDeclaration
  1. namesBoundNames of ClassDeclaration로 한다.
  2. localNamenames의 유일한 요소로 한다.
  3. List의 유일한 요소로 ExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: localName, [[ExportName]]: "default" }를 반환한다.
ExportDeclaration : export default AssignmentExpression ;
  1. entryExportEntry Record { [[ModuleRequest]]: null, [[ImportName]]: null, [[LocalName]]: "*default*", [[ExportName]]: "default" }로 한다.
  2. « entry »를 반환한다.
참고

"*default*"는 익명 기본 내보내기 값에 대해 이 명세에서 합성 이름으로 사용됩니다. 자세한 내용은 이 노트를 참조하세요.

16.2.3.5 정적 의미론: ExportEntriesForModule

구문 지향 연산 ExportEntriesForModule은 module (ModuleRequest Record 또는 null) 인자를 받고 List 형태의 ExportEntry Records를 반환합니다. 아래 생산 규칙별로 조각별로 정의됩니다:

ExportFromClause : *
  1. entryExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: all-but-default, [[LocalName]]: null, [[ExportName]]: null }로 한다.
  2. « entry »를 반환한다.
ExportFromClause : * as ModuleExportName
  1. exportNameStringValue of ModuleExportName로 한다.
  2. entryExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: all, [[LocalName]]: null, [[ExportName]]: exportName }로 한다.
  3. « entry »를 반환한다.
NamedExports : { }
  1. 새 빈 List를 반환한다.
ExportsList : ExportsList , ExportSpecifier
  1. specs1ExportEntriesForModule of ExportsListmodule 인자를 넘겨서 얻는다.
  2. specs2ExportEntriesForModule of ExportSpecifiermodule 인자를 넘겨서 얻는다.
  3. specs1specs2리스트 연결을 반환한다.
ExportSpecifier : ModuleExportName
  1. sourceNameStringValue of ModuleExportName로 한다.
  2. 만약 modulenull이면,
    1. localNamesourceName으로 한다.
    2. importNamenull로 한다.
  3. 그 외에는,
    1. localNamenull로 한다.
    2. importNamesourceName으로 한다.
  4. List의 유일한 요소로 ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName }를 반환한다.
ExportSpecifier : ModuleExportName as ModuleExportName
  1. sourceName을 첫 번째 ModuleExportNameStringValue로 한다.
  2. exportName을 두 번째 ModuleExportNameStringValue로 한다.
  3. 만약 modulenull이면,
    1. localNamesourceName으로 한다.
    2. importNamenull로 한다.
  4. 그 외에는,
    1. localNamenull로 한다.
    2. importNamesourceName으로 한다.
  5. List의 유일한 요소로 ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName }를 반환한다.

16.2.3.6 정적 의미론: ReferencedBindings

구문 지향 연산 ReferencedBindings는 인자를 받지 않으며 List 형태의 파싱 노드를 반환합니다. 아래의 각 생산 규칙별로 조각별로 정의됩니다:

NamedExports : { }
  1. 새 빈 List를 반환한다.
ExportsList : ExportsList , ExportSpecifier
  1. names1ReferencedBindings of ExportsList로 한다.
  2. names2ReferencedBindings of ExportSpecifier로 한다.
  3. names1names2리스트 연결을 반환한다.
ExportSpecifier : ModuleExportName as ModuleExportName
  1. 첫 번째 ReferencedBindings of ModuleExportName를 반환한다.
ModuleExportName : IdentifierName
  1. IdentifierName만을 요소로 가지는 List를 반환한다.
ModuleExportName : StringLiteral
  1. StringLiteral만을 요소로 가지는 List를 반환한다.

16.2.3.7 실행 시 의미론: 평가

ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ;
  1. empty를 반환한다.
ExportDeclaration : export VariableStatement
  1. Evaluation of VariableStatement를 반환한다.
ExportDeclaration : export Declaration
  1. Evaluation of Declaration를 반환한다.
ExportDeclaration : export default HoistableDeclaration
  1. Evaluation of HoistableDeclaration를 반환한다.
ExportDeclaration : export default ClassDeclaration
  1. value를 ? BindingClassDeclarationEvaluation of ClassDeclaration로 한다.
  2. classNameBoundNames of ClassDeclaration의 유일한 요소로 한다.
  3. 만약 className"*default*"이라면,
    1. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
    2. InitializeBoundName("*default*", value, env)를 수행한다.
  4. empty를 반환한다.
ExportDeclaration : export default AssignmentExpression ;
  1. IsAnonymousFunctionDefinition(AssignmentExpression)이 true이면,
    1. value를 ? NamedEvaluation of AssignmentExpression"default" 인자를 넘겨서 얻는다.
  2. 그 외에는,
    1. rhs를 ? Evaluation of AssignmentExpression로 한다.
    2. value를 ? GetValue(rhs)로 한다.
  3. env실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
  4. InitializeBoundName("*default*", value, env)를 수행한다.
  5. empty를 반환한다.

17 오류 처리 및 언어 확장

구현체는 대부분의 오류를 관련 ECMAScript 언어 구성요소가 평가되는 시점에 보고해야 한다. 조기 오류란, 오류가 포함된 Script 내의 어떤 구성요소도 평가되기 전에 감지하고 보고할 수 있는 오류를 의미한다. 조기 오류가 있으면 해당 구성요소의 평가가 이루어지지 않는다. 구현체는 ScriptParseScript로 파싱하는 과정에서 조기 오류를 반드시 보고해야 한다. Module 내의 조기 오류는 해당 Module이 평가될 시점에 보고되며, Module은 절대 초기화되지 않는다. eval 코드의 조기 오류eval이 호출된 시점에 보고되며, eval 코드의 평가를 방지한다. 조기 오류가 아닌 모든 오류는 런타임 오류다.

구현체는 이 명세의 “정적 의미론: 조기 오류” 하위 절에 나열된 조건이 발생하면 반드시 조기 오류로 보고해야 한다.

구현체는 컴파일러가 어떤 구성요소가 어떤 상황에서도 오류 없이 실행될 수 없음을 증명할 수 있더라도, 다른 종류의 오류를 조기 오류로 처리해서는 안 된다. 이러한 경우에는 조기 경고를 표시할 수 있지만, 관련 구성요소가 실제로 실행되기 전까지는 오류를 보고해서는 안 된다.

구현체는 다음을 제외하고 모든 오류를 명세된 대로 보고해야 한다:

17.1 금지된 확장

구현체는 다음과 같이 이 명세를 확장해서는 안 된다:

18 ECMAScript 표준 내장 객체

특정 내장 객체들은 ECMAScript Script 또는 Module이 실행을 시작할 때마다 사용할 수 있습니다. 그 중 글로벌 객체는 실행 중인 프로그램의 글로벌 환경의 일부입니다. 다른 객체들은 글로벌 객체의 초기 프로퍼티 또는 접근 가능한 내장 객체의 프로퍼티로 간접적으로 접근할 수 있습니다.

별도의 명시가 없는 한, 함수로 호출 가능한 내장 객체는 함수 객체이며, 10.3에서 설명된 특성을 가집니다. 별도의 명시가 없는 한, 내장 객체의 [[Extensible]] 내부 슬롯의 초기 값은 true입니다. 모든 내장 함수 객체[[Realm]] 내부 슬롯을 가지며, 그 값은 해당 객체가 처음 생성된 Realm Recordrealm입니다.

많은 내장 객체들은 함수입니다: 이들은 인자를 넘겨서 호출할 수 있습니다. 그 중 일부는 생성자이기도 하며, new 연산자와 함께 사용하기 위한 함수입니다. 각 내장 함수에 대해 이 명세는 그 함수가 요구하는 인자와 해당 함수 객체의 프로퍼티를 설명합니다. 각 내장 생성자에 대해서도, 해당 생성자의 프로토타입 객체의 프로퍼티와, 해당 생성자를 호출하는 new 표현식이 반환하는 특정 객체 인스턴스의 프로퍼티를 설명합니다.

특정 함수의 설명에 별도의 명시가 없는 한, 내장 함수 또는 생성자에 필요한 인자보다 적은 인자가 주어지면, 해당 함수 또는 생성자는 부족한 인자 각각에 대해 undefined 값을 추가로 받은 것처럼 동작해야 합니다. 이러한 누락된 인자들은 “존재하지 않음”으로 간주되며, 명세 알고리즘에서 그렇게 식별될 수 있습니다. 특정 함수의 설명에서 “this 값”과 “NewTarget” 용어는 10.3에서 정의된 의미를 가집니다.

특정 함수의 설명에 별도의 명시가 없는 한, 내장 함수 또는 생성자에 정의된 허용 인자보다 더 많은 인자가 주어지면, 추가 인자들은 호출 시 평가되지만 함수에서는 무시됩니다. 하지만 구현체는 그러한 인자에 대해 구현체 고유의 동작을 정의할 수 있으며, 그 동작이 단순히 추가 인자가 존재한다는 이유로 TypeError 예외를 던지는 것이 아닌 한 허용됩니다.

참고 1

내장 함수 집합에 추가적인 기능을 더하는 구현체는 기존 함수에 새로운 파라미터를 추가하기보다는 새로운 함수를 추가하는 방식이 권장됩니다.

별도의 명시가 없는 한, 모든 내장 함수와 모든 내장 생성자Function 프로토타입 객체[[Prototype]] 내부 슬롯의 값으로 가지며, 이는 Function.prototype (20.2.3)의 초기 값입니다.

별도의 명시가 없는 한, 모든 내장 프로토타입 객체는 Object 프로토타입 객체[[Prototype]] 내부 슬롯의 값으로 가지며, 이는 Object.prototype (20.1.3)의 초기 값입니다. 단, Object 프로토타입 객체 자체는 예외입니다.

이 명세가 내장 생성자의 동작을 알고리즘 단계로 정의하는 경우, 이는 [[Call]][[Construct]] 양쪽 모두에 대한 동작입니다. 만약 그런 알고리즘이 두 경우를 구분할 필요가 있으면, NewTarget이 undefined인지 검사하며, 이는 [[Call]] 호출임을 나타냅니다.

생성자로 식별되지 않은 내장 함수 객체는 별도의 명시가 없는 한 [[Construct]] 내부 메서드를 구현하지 않습니다.

생성자가 아닌 내장 함수 객체는 별도의 명시가 없는 한 "prototype" 프로퍼티를 가지지 않습니다.

이 명세에서 정의된 각 내장 함수는 CreateBuiltinFunction 추상 연산 (10.3.4)을 호출하여 생성됩니다. lengthname 파라미터의 값은 아래에서 논의된 대로 "length""name" 프로퍼티의 초기 값입니다. prefix 파라미터의 값도 아래에서 논의됩니다.

모든 내장 함수 객체(생성자 포함)는 "length" 프로퍼티를 가지며, 그 값은 음수가 아닌 정수 Number입니다. 별도의 명시가 없는 한, 이 값은 함수 설명의 하위 절 제목에 표시된 필수 파라미터의 수입니다. 선택적 파라미터와 rest 파라미터는 파라미터 수에 포함되지 않습니다.

참고 2

예를 들어, 함수 객체로서 "map" 프로퍼티의 초기 값인 Array 프로토타입 객체는 «Array.prototype.map (callback [ , thisArg])»라는 하위 절 제목 아래에 설명되어 있습니다. 여기서 두 인자 callback과 thisArg가 있는데, 후자는 선택적입니다. 따라서 해당 함수 객체"length" 프로퍼티 값은 1𝔽입니다.

별도의 명시가 없는 한, 내장 함수 객체"length" 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 가집니다.

모든 내장 함수 객체(생성자 포함)는 "name" 프로퍼티를 가지며, 그 값은 문자열입니다. 별도의 명시가 없는 한, 이 값은 이 명세에서 함수에 부여된 이름입니다. 익명 함수로 지정된 함수는 "name" 프로퍼티의 값으로 빈 문자열을 사용합니다. 객체의 프로퍼티로 지정된 함수의 경우, name 값은 해당 함수를 접근하는 프로퍼티 이름 문자열입니다. 내장 프로퍼티의 getter 또는 setter 함수로 지정된 함수는 prefix 파라미터에 각각 "get" 또는 "set"을 전달합니다(CreateBuiltinFunction 호출 시).

프로퍼티 키심볼(Symbol) 값일 때, 각 내장 함수의 "name" 프로퍼티의 값은 명시적으로 지정됩니다. 만약 명시적으로 지정된 값이 "get " 또는 "set "로 시작하며, 해당 함수가 내장 프로퍼티의 getter 또는 setter 함수라면, prefix를 제외한 값이 name 파라미터로 전달되고, "get" 또는 "set"prefix 파라미터로 전달됩니다(CreateBuiltinFunction 호출 시).

별도의 명시가 없는 한, 내장 함수 객체"name" 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 가집니다.

19에서 28까지의 절 및 부록 B.2에서 설명된 모든 기타 데이터 프로퍼티는 별도의 명시가 없는 한 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true } 속성을 가집니다.

19에서 28까지의 절 및 부록 B.2에서 설명된 모든 접근자 프로퍼티는 별도의 명시가 없는 한 { [[Enumerable]]: false, [[Configurable]]: true } 속성을 가집니다. getter 함수만 설명된 경우 setter 함수는 기본값 undefined입니다. setter만 설명된 경우 getter는 기본값 undefined입니다.

19 글로벌 객체

글로벌 객체:

19.1 글로벌 객체의 값 속성

19.1.1 globalThis

글로벌 객체"globalThis" 속성의 초기 값은 Realm Record realm에서 realm.[[GlobalEnv]].[[GlobalThisValue]]입니다.

이 속성의 특성은 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true }입니다.

19.1.2 Infinity

Infinity의 값은 +∞𝔽입니다 (6.1.6.1 참조). 이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

19.1.3 NaN

NaN의 값은 NaN입니다 (6.1.6.1 참조). 이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

19.1.4 undefined

undefined의 값은 undefined입니다 (6.1.1 참조). 이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

19.2 글로벌 객체의 함수 속성

19.2.1 eval ( x )

이 함수는 %eval% 내장 객체입니다.

호출될 때 다음 단계를 수행합니다:

  1. PerformEval(x, false, false)을 반환합니다.

19.2.1.1 PerformEval ( x, strictCaller, direct )

추상 연산 PerformEval은 x(ECMAScript 언어 값), strictCaller(불리언), direct(불리언) 인자를 받고, 정상 완료ECMAScript 언어 값 또는 throw 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. Assert: directfalse이면 strictCallerfalse입니다.
  2. x문자열이 아니면, x를 반환합니다.
  3. evalRealm현재 Realm Record로 둡니다.
  4. 참고: 직접 eval의 경우, evalRealmrealm이며, eval 호출자와 eval 함수 자체에 해당합니다.
  5. HostEnsureCanCompileStrings(evalRealm, « », x, direct)를 수행합니다.
  6. inFunctionfalse로 둡니다.
  7. inMethodfalse로 둡니다.
  8. inDerivedConstructorfalse로 둡니다.
  9. inClassFieldInitializerfalse로 둡니다.
  10. directtrue이면
    1. thisEnvRecGetThisEnvironment()로 둡니다.
    2. thisEnvRec함수 환경 레코드라면
      1. FthisEnvRec.[[FunctionObject]]로 둡니다.
      2. inFunctiontrue로 설정합니다.
      3. inMethodthisEnvRec.HasSuperBinding()으로 설정합니다.
      4. F.[[ConstructorKind]]derived이면, inDerivedConstructortrue로 설정합니다.
      5. classFieldInitializerNameF.[[ClassFieldInitializerName]]로 둡니다.
      6. classFieldInitializerNameempty가 아니면 inClassFieldInitializertrue로 설정합니다.
  11. 다음 하위 단계를 구현 정의 순서로, 파싱과 오류 감지를 교차하면서 수행합니다:
    1. scriptParseText(x, Script)로 둡니다.
    2. script오류 리스트이면, SyntaxError 예외를 throw합니다.
    3. script Contains ScriptBodyfalse이면, undefined를 반환합니다.
    4. bodyscriptScriptBody로 둡니다.
    5. inFunctionfalse이고 body Contains NewTarget가 있으면, SyntaxError 예외를 throw합니다.
    6. inMethodfalse이고 body Contains SuperProperty가 있으면, SyntaxError 예외를 throw합니다.
    7. inDerivedConstructorfalse이고 body Contains SuperCall가 있으면, SyntaxError 예외를 throw합니다.
    8. inClassFieldInitializertrue이고 ContainsArgumentsbodytrue이면, SyntaxError 예외를 throw합니다.
  12. strictCallertrue이면, strictEvaltrue로 둡니다.
  13. 그렇지 않으면, strictEvalScriptIsStrictscript값으로 둡니다.
  14. runningContext실행 중인 실행 컨텍스트로 둡니다.
  15. 참고: directtrue이면, runningContext실행 컨텍스트이며, 직접 eval을 수행한 컨텍스트입니다. directfalse이면, runningContexteval 함수 호출을 위한 실행 컨텍스트입니다.
  16. directtrue이면
    1. lexEnvNewDeclarativeEnvironment(runningContext의 LexicalEnvironment)로 둡니다.
    2. varEnvrunningContext의 VariableEnvironment로 둡니다.
    3. privateEnvrunningContext의 PrivateEnvironment로 둡니다.
  17. 그렇지 않으면,
    1. lexEnvNewDeclarativeEnvironment(evalRealm.[[GlobalEnv]])로 둡니다.
    2. varEnvevalRealm.[[GlobalEnv]]로 둡니다.
    3. privateEnvnull로 둡니다.
  18. strictEvaltrue이면, varEnvlexEnv로 설정합니다.
  19. runningContext가 이미 suspend되지 않았다면, runningContext를 suspend합니다.
  20. evalContext를 새로운 ECMAScript 코드 실행 컨텍스트로 둡니다.
  21. evalContext의 Function을 null로 설정합니다.
  22. evalContextRealmevalRealm으로 설정합니다.
  23. evalContext의 ScriptOrModule을 runningContext의 ScriptOrModule로 설정합니다.
  24. evalContext의 VariableEnvironment를 varEnv로 설정합니다.
  25. evalContext의 LexicalEnvironment를 lexEnv로 설정합니다.
  26. evalContext의 PrivateEnvironment를 privateEnv로 설정합니다.
  27. evalContext실행 컨텍스트 스택에 push합니다; evalContext는 이제 실행 중인 실행 컨텍스트입니다.
  28. resultCompletion(EvalDeclarationInstantiation(body, varEnv, lexEnv, privateEnv, strictEval))로 둡니다.
  29. result정상 완료이면,
    1. resultCompletion(Evaluationbody)로 설정합니다.
  30. result정상 완료이고 result.[[Value]]empty이면,
    1. resultNormalCompletion(undefined)로 설정합니다.
  31. evalContext를 suspend 시키고 실행 컨텍스트 스택에서 제거합니다.
  32. 이제 실행 컨텍스트 스택 맨 위에 있는 컨텍스트를 실행 중인 실행 컨텍스트로 복구합니다.
  33. result를 반환합니다.
참고

eval 코드가 호출 컨텍스트의 변수 환경에 변수나 함수 바인딩을 생성할 수 없는 경우는, 호출 컨텍스트의 코드나 eval 코드가 엄격 모드 코드인 경우입니다. 대신 이러한 바인딩은 eval 코드에서만 접근 가능한 새로운 VariableEnvironment에서 생성됩니다. let, const, class 선언을 통해 도입된 바인딩은 항상 새로운 LexicalEnvironment에서 생성됩니다.

19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm, parameterStrings, bodyString, direct )

호스트 정의 추상 연산 HostEnsureCanCompileStrings는 calleeRealm(Realm Record), parameterStrings(문자열 리스트), bodyString(문자열), direct(불리언)을 인자로 받고, 정상 완료unused 또는 throw 완료를 반환합니다. 이 연산은 호스트 환경이 개발자가 문자열을 ECMAScript 코드로 해석·평가할 수 있게 하는 특정 ECMAScript 함수를 차단할 수 있도록 합니다.

parameterStrings생성자 중 하나를 사용할 때 매개변수 리스트를 구성하기 위해 연결되는 문자열들을 나타냅니다. bodyString은 함수 본문이나 eval 호출에 전달되는 문자열을 나타냅니다. direct는 평가가 직접 eval인지 여부를 나타냅니다.

HostEnsureCanCompileStrings의 기본 구현은 NormalCompletion(unused)을 반환하는 것입니다.

19.2.1.3 EvalDeclarationInstantiation ( body, varEnv, lexEnv, privateEnv, strict )

추상 연산 EvalDeclarationInstantiation은 body(ScriptBody 구문 노드), varEnv(Environment Record), lexEnv(Declarative Environment Record), privateEnv(PrivateEnvironment Record 또는 null), strict(불리언) 인자를 받고, 정상 완료unused 또는 throw 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. varNamesbodyVarDeclaredNames로 둡니다.
  2. varDeclarationsbodyVarScopedDeclarations로 둡니다.
  3. strictfalse이면
    1. varEnvGlobal Environment Record라면
      1. varNames의 각 name에 대해
        1. HasLexicalDeclaration(varEnv, name)가 true이면, SyntaxError 예외를 throw합니다.
        2. 참고: eval은 전역 렉시컬 선언에 의해 가려지는 전역 var 선언을 생성하지 않습니다.
    2. thisEnvlexEnv로 둡니다.
    3. Assert: 다음 루프는 종료됩니다.
    4. 다음이 참인 동안 반복합니다: thisEnvvarEnv가 같은 Environment Record가 아님
      1. thisEnv객체가 아니고 Environment Record라면
        1. 참고: with 문의 환경은 어떠한 렉시컬 선언도 포함할 수 없으므로 var/let 호이스팅 충돌을 검사할 필요가 없습니다.
        2. varNames의 각 name에 대해
          1. thisEnv.HasBinding(name)이 true라면
            1. SyntaxError 예외를 throw합니다.
            2. 참고: 부록 B.3.4는 위 단계에 대해 대체 의미론을 정의합니다.
          2. 참고: 직접 eval은 이름이 같은 렉시컬 선언 위로 var 선언을 호이스팅하지 않습니다.
      2. thisEnvthisEnv.[[OuterEnv]]로 설정합니다.
  4. privateIdentifiers를 새로운 빈 리스트로 둡니다.
  5. pointerprivateEnv로 둡니다.
  6. pointernull이 아닐 동안 반복합니다,
    1. pointer.[[Names]]의 각 Private Name binding에 대해
      1. privateIdentifiersbinding.[[Description]]이 없다면, binding.[[Description]]privateIdentifiers에 추가합니다.
    2. pointerpointer.[[OuterPrivateEnvironment]]로 설정합니다.
  7. AllPrivateIdentifiersValidbody와 인자 privateIdentifiersfalse라면, SyntaxError 예외를 throw합니다.
  8. functionsToInitialize를 새로운 빈 리스트로 둡니다.
  9. declaredFunctionNames를 새로운 빈 리스트로 둡니다.
  10. varDeclarations의 각 d에 대해, 리스트를 역순으로 처리합니다
    1. dVariableDeclaration, ForBinding, BindingIdentifier 중 어느 것도 아니면
      1. Assert: dFunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration 중 하나입니다.
      2. 참고: 동일한 이름의 함수 선언이 여러 개 있으면, 마지막 선언이 사용됩니다.
      3. fndBoundNames의 유일한 요소로 둡니다.
      4. declaredFunctionNamesfn이 없다면,
        1. varEnvGlobal Environment Record라면
          1. fnDefinable을 ? CanDeclareGlobalFunction(varEnv, fn)로 둡니다.
          2. fnDefinablefalse이면, TypeError 예외를 throw합니다.
        2. fndeclaredFunctionNames에 추가합니다.
        3. dfunctionsToInitialize의 첫 번째 요소로 삽입합니다.
  11. declaredVarNames를 새로운 빈 리스트로 둡니다.
  12. varDeclarations의 각 d에 대해
    1. dVariableDeclaration, ForBinding, BindingIdentifier 중 하나라면
      1. dBoundNames의 각 문자열 vn에 대해
        1. declaredFunctionNamesvn이 없다면,
          1. varEnvGlobal Environment Record라면
            1. vnDefinable을 ? CanDeclareGlobalVar(varEnv, vn)로 둡니다.
            2. vnDefinablefalse이면, TypeError 예외를 throw합니다.
          2. declaredVarNamesvn이 없다면,
            1. vndeclaredVarNames에 추가합니다.
  13. 참고: 부록 B.3.2.3가 이 지점에 추가 단계를 포함합니다.
  14. 참고: 이 알고리즘 단계 이후에는 varEnvGlobal Environment Record이고 글로벌 객체프록시 이국 객체인 경우가 아니면 비정상 종료가 발생하지 않습니다.
  15. lexDeclarationsbodyLexicallyScopedDeclarations로 둡니다.
  16. lexDeclarations의 각 d에 대해
    1. 참고: 렉시컬로 선언된 이름은 여기서 인스턴스화만 되고 초기화되지는 않습니다.
    2. dBoundNames의 각 dn에 대해
      1. IsConstantDeclarationdtrue이면,
        1. lexEnv.CreateImmutableBinding(dn, true)를 수행합니다.
      2. 그렇지 않으면,
        1. lexEnv.CreateMutableBinding(dn, false)를 수행합니다.
  17. functionsToInitialize의 각 구문 노드 f에 대해
    1. fnfBoundNames의 유일한 요소로 둡니다.
    2. fofInstantiateFunctionObject와 인자 lexEnv, privateEnv로 둡니다.
    3. varEnvGlobal Environment Record라면
      1. CreateGlobalFunctionBinding(varEnv, fn, fo, true)를 수행합니다.
    4. 그렇지 않으면,
      1. bindingExists를 ! varEnv.HasBinding(fn)로 둡니다.
      2. bindingExistsfalse이면,
        1. 참고: 아래 호출은 비정상 완료를 반환할 수 없습니다. 이는 14 이전의 검증 때문입니다.
        2. varEnv.CreateMutableBinding(fn, true)를 수행합니다.
        3. varEnv.InitializeBinding(fn, fo)를 수행합니다.
      3. 그렇지 않으면,
        1. varEnv.SetMutableBinding(fn, fo, false)를 수행합니다.
  18. declaredVarNames의 각 문자열 vn에 대해
    1. varEnvGlobal Environment Record라면
      1. CreateGlobalVarBinding(varEnv, vn, true)를 수행합니다.
    2. 그렇지 않으면,
      1. bindingExists를 ! varEnv.HasBinding(vn)로 둡니다.
      2. bindingExistsfalse이면,
        1. 참고: 아래 호출은 비정상 완료를 반환할 수 없습니다. 이는 14 이전의 검증 때문입니다.
        2. varEnv.CreateMutableBinding(vn, true)를 수행합니다.
        3. varEnv.InitializeBinding(vn, undefined)를 수행합니다.
  19. unused를 반환합니다.
참고

이 알고리즘의 대체 버전은 B.3.4에 설명되어 있습니다.

19.2.2 isFinite ( number )

이 함수는 %isFinite% 내장 객체입니다.

호출될 때 다음 단계들을 수행합니다:

  1. num을 ? ToNumber(number)로 둡니다.
  2. numfinite가 아니면, false를 반환합니다.
  3. 그렇지 않으면, true를 반환합니다.

19.2.3 isNaN ( number )

이 함수는 %isNaN% 내장 객체입니다.

호출될 때 다음 단계들을 수행합니다:

  1. num을 ? ToNumber(number)로 둡니다.
  2. numNaN이면, true를 반환합니다.
  3. 그렇지 않으면, false를 반환합니다.
참고

ECMAScript 코드에서 값 XNaN인지 신뢰성 있게 검사하는 방법은 X !== X 형태의 표현식을 사용하는 것입니다. XNaN일 때만 결과가 true가 됩니다.

19.2.4 parseFloat ( string )

이 함수는 string 인자의 내용을 10진수 리터럴로 해석하여 Number 값을 생성합니다.

이 함수는 %parseFloat% 내장 객체입니다.

호출될 때 다음 단계들을 수행합니다:

  1. inputString을 ? ToString(string)로 둡니다.
  2. trimmedString을 ! TrimString(inputString, start)로 둡니다.
  3. trimmedStringToCodePoints(trimmedString)로 둡니다.
  4. trimmedPrefixtrimmed의 접두사 중 StrDecimalLiteral의 문법을 만족하는 가장 긴 접두사로 둡니다. 이 값은 trimmed 자체일 수도 있습니다. 만약 그런 접두사가 없다면 NaN를 반환합니다.
  5. parsedNumberParseText(trimmedPrefix, StrDecimalLiteral)로 둡니다.
  6. Assert: parsedNumber구문 노드입니다.
  7. parsedNumberStringNumericValue를 반환합니다.
참고

이 함수는 string의 앞부분만 Number 값으로 해석할 수 있으며, 10진수 리터럴 표기법의 일부로 해석할 수 없는 코드 유닛들은 무시되고, 이러한 코드 유닛이 무시되었다는 표시가 제공되지 않습니다.

19.2.5 parseInt ( string, radix )

이 함수는 지정된 radix에 따라 string의 내용을 해석하여 정수 Number 값을 생성합니다. string의 선행 공백은 무시됩니다. radix가 0으로 변환될 경우(undefined일 때 등), 숫자 표기가 "0x" 또는 "0X"로 시작하지 않는 한 10으로 간주합니다. radix가 16이면 숫자 표기는 "0x" 또는 "0X"로 시작할 수 있습니다.

이 함수는 %parseInt% 내장 객체입니다.

호출될 때 다음 단계들을 수행합니다:

  1. inputString을 ? ToString(string)로 둡니다.
  2. S를 ! TrimString(inputString, start)로 둡니다.
  3. sign을 1로 둡니다.
  4. S가 비어 있지 않고 첫 코드 유닛이 0x002D(HYPHEN-MINUS)라면 sign을 -1로 설정합니다.
  5. S가 비어 있지 않고 첫 코드 유닛이 0x002B(PLUS SIGN) 또는 0x002D(HYPHEN-MINUS)라면, S를 인덱스 1부터의 substring로 둡니다.
  6. R(? ToInt32(radix))로 둡니다.
  7. stripPrefixtrue로 둡니다.
  8. R ≠ 0이면,
    1. R < 2 또는 R > 36이면 NaN를 반환합니다.
    2. R ≠ 16이면 stripPrefixfalse로 설정합니다.
  9. 그렇지 않으면,
    1. R을 10으로 설정합니다.
  10. stripPrefixtrue면,
    1. S의 길이가 2 이상이고 처음 두 코드 유닛이 "0x" 또는 "0X"라면,
      1. S를 인덱스 2부터의 substring로 둡니다.
      2. R을 16으로 설정합니다.
  11. S가 radix-R 숫자가 아닌 코드 유닛을 포함하면, end를 해당 코드 유닛의 인덱스로 둡니다. 그렇지 않으면 endS의 길이로 둡니다.
  12. ZS의 0부터 end까지의 substring로 둡니다.
  13. Z가 비어 있으면 NaN를 반환합니다.
  14. mathIntZ가 radix-R 표기법으로 나타내는 정수 값으로 둡니다. 이때 값 10~35에 해당하는 숫자는 A~Za~z로 표시됩니다. (R = 10이고 Z에 20개를 초과하는 유효 숫자가 있으면, 20번째 이후의 모든 유효 숫자는 구현에 따라 0으로 대체할 수 있습니다. R이 2,4,8,10,16,32 중 하나가 아니면 mathInt구현 근사 정수일 수 있습니다.)
  15. mathInt = 0이면,
    1. sign = -1이면 -0𝔽를 반환합니다.
    2. +0𝔽를 반환합니다.
  16. 𝔽(sign × mathInt)를 반환합니다.
참고

이 함수는 string의 앞부분만 정수 값으로 해석할 수 있으며, 정수 표기법 일부로 해석할 수 없는 코드 유닛은 무시되고, 무시되었다는 표시가 제공되지 않습니다.

19.2.6 URI 처리 함수

Uniform Resource Identifiers, 즉 URI는 인터넷에서 자원(예: 웹 페이지 또는 파일)과 이를 접근하는 전송 프로토콜(예: HTTP 또는 FTP)을 식별하는 문자열입니다. ECMAScript 언어 자체는 이 절에서 설명된 URI를 인코드 및 디코드하는 함수 외에는 URI를 사용하는 지원을 제공하지 않습니다. encodeURIdecodeURI는 전체 URI에 사용하도록 설계되어 있으며, 예약 문자가 특별한 의미(예: 구분자)를 가진 것으로 간주하므로 인코드하지 않습니다. encodeURIComponentdecodeURIComponent는 URI의 개별 구성요소에 사용하도록 설계되어 있으며, 예약 문자가 텍스트로 간주되어 전체 URI의 일부가 될 때 특별한 의미를 방지하기 위해 인코딩되어야 합니다.

참고 1

예약 문자 집합은 RFC 2396을 기반으로 하며, 이후의 RFC 3986에서 도입된 변경 사항을 반영하지 않습니다.

참고 2

많은 ECMAScript 구현체는 웹 페이지를 조작하는 추가 함수 및 메서드를 제공합니다. 이러한 함수들은 이 표준의 범위를 벗어납니다.

19.2.6.1 decodeURI ( encodedURI )

이 함수는 encodeURI 함수에 의해 도입될 수 있는 이스케이프 시퀀스와 UTF-8 인코딩을 각각 그에 해당하는 코드 포인트의 UTF-16 인코딩으로 대체한 새로운 URI 버전을 계산합니다. encodeURI에 의해 도입될 수 없는 이스케이프 시퀀스는 대체되지 않습니다.

이 함수는 %decodeURI% 내장 객체입니다.

호출 시 다음 단계를 수행합니다:

  1. uriString을 ? ToString(encodedURI)로 둡니다.
  2. preserveEscapeSet";/?:@&=+$,#"로 둡니다.
  3. Decode(uriString, preserveEscapeSet)를 반환합니다.

19.2.6.2 decodeURIComponent ( encodedURIComponent )

이 함수는 encodeURIComponent 함수에 의해 도입될 수 있는 이스케이프 시퀀스와 UTF-8 인코딩을 각각 그에 해당하는 코드 포인트의 UTF-16 인코딩으로 대체한 새로운 URI 버전을 계산합니다.

이 함수는 %decodeURIComponent% 내장 객체입니다.

호출 시 다음 단계를 수행합니다:

  1. componentString을 ? ToString(encodedURIComponent)로 둡니다.
  2. preserveEscapeSet을 빈 문자열로 둡니다.
  3. Decode(componentString, preserveEscapeSet)를 반환합니다.

19.2.6.3 encodeURI ( uri )

이 함수는 UTF-16으로 인코딩된 (6.1.4) URI의 각 특정 코드 포인트 인스턴스를 해당 코드 포인트의 UTF-8 인코딩을 나타내는 하나, 둘, 셋 또는 넷의 이스케이프 시퀀스로 대체한 새로운 버전을 계산합니다.

이 함수는 %encodeURI% 내장 객체입니다.

호출 시 다음 단계를 수행합니다:

  1. uriString을 ? ToString(uri)로 둡니다.
  2. extraUnescaped";/?:@&=+$,#"로 둡니다.
  3. Encode(uriString, extraUnescaped)를 반환합니다.

19.2.6.4 encodeURIComponent ( uriComponent )

이 함수는 UTF-16으로 인코딩된 (6.1.4) URI의 각 특정 코드 포인트 인스턴스를 해당 코드 포인트의 UTF-8 인코딩을 나타내는 하나, 둘, 셋 또는 넷의 이스케이프 시퀀스로 대체한 새로운 버전을 계산합니다.

이 함수는 %encodeURIComponent% 내장 객체입니다.

호출 시 다음 단계를 수행합니다:

  1. componentString을 ? ToString(uriComponent)로 둡니다.
  2. extraUnescaped를 빈 문자열로 둡니다.
  3. Encode(componentString, extraUnescaped)를 반환합니다.

19.2.6.5 Encode ( string, extraUnescaped )

추상 연산 Encode는 string(문자열)과 extraUnescaped(문자열) 인자를 받고, 정상 완료로 문자열 또는 throw 완료를 반환합니다. URI 인코딩 및 이스케이프를 수행하며, string6.1.4에서 설명된 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다. 문자가 RFC 2396에서 예약되지 않은 것으로 판별되거나 extraUnescaped에 나타나면 이스케이프되지 않습니다. 호출 시 다음 단계를 수행합니다:

  1. lenstring의 길이로 둡니다.
  2. R을 빈 문자열로 둡니다.
  3. alwaysUnescaped문자열 연결ASCII 단어 문자"-.!~*'()"의 연결로 둡니다.
  4. unescapedSet문자열 연결alwaysUnescapedextraUnescaped의 연결로 둡니다.
  5. k를 0으로 둡니다.
  6. k < len인 동안 반복합니다,
    1. Cstring의 인덱스 k에 있는 코드 유닛으로 둡니다.
    2. unescapedSetC가 포함되어 있으면,
      1. kk + 1로 설정합니다.
      2. R문자열 연결RC의 연결로 설정합니다.
    3. 그렇지 않으면,
      1. cpCodePointAt(string, k)로 둡니다.
      2. cp.[[IsUnpairedSurrogate]]true이면 URIError 예외를 throw합니다.
      3. kk + cp.[[CodeUnitCount]]로 설정합니다.
      4. Octets리스트cp.[[CodePoint]]에 UTF-8 변환을 적용하여 얻은 옥텟들로 둡니다.
      5. Octets의 각 octet에 대해,
        1. hexoctet의 문자열 표현으로, 대문자 16진수로 포맷합니다.
        2. R문자열 연결R, "%", StringPad(hex, 2, "0", start)의 연결로 설정합니다.
  7. R를 반환합니다.
참고

퍼센트 인코딩은 개별 옥텟을 나타내는 데 사용되므로, 하나의 코드 포인트가 여러 연속 이스케이프 시퀀스(각각 8비트 UTF-8 코드 유닛 하나씩)로 표현될 수 있습니다.

19.2.6.6 Decode ( string, preserveEscapeSet )

추상 연산 Decode는 string(문자열)과 preserveEscapeSet(문자열) 인자를 받고, 정상 완료로 문자열 또는 throw 완료를 반환합니다. 이는 URI 이스케이프 해제 및 디코딩을 수행하며, preserveEscapeSet에 해당하는 Basic Latin 문자의 이스케이프 시퀀스는 보존합니다. 호출 시 다음 단계를 수행합니다:

  1. lenstring의 길이로 둡니다.
  2. R을 빈 문자열로 둡니다.
  3. k를 0으로 둡니다.
  4. k < len인 동안 반복합니다,
    1. Cstring의 인덱스 k에 있는 코드 유닛으로 둡니다.
    2. SC로 둡니다.
    3. C가 코드 유닛 0x0025(PERCENT SIGN)이면,
      1. k + 3 > len이면 URIError 예외를 throw합니다.
      2. escapesubstringstringk부터 k + 3까지로 둡니다.
      3. BParseHexOctet(string, k + 1)로 둡니다.
      4. B정수가 아니면 URIError 예외를 throw합니다.
      5. kk + 2로 설정합니다.
      6. nB의 선행 1 비트 개수로 둡니다.
      7. n = 0이면,
        1. asciiChar를 값이 B인 코드 유닛으로 둡니다.
        2. preserveEscapeSetasciiChar가 포함되어 있으면 Sescape로, 아니면 SasciiChar로 설정합니다.
      8. 그렇지 않으면,
        1. n = 1 또는 n > 4이면 URIError 예외를 throw합니다.
        2. Octets를 « B »로 둡니다.
        3. j를 1로 둡니다.
        4. j < n인 동안 반복합니다,
          1. kk + 1로 설정합니다.
          2. k + 3 > len이면 URIError 예외를 throw합니다.
          3. string의 인덱스 k에 있는 코드 유닛이 0x0025(PERCENT SIGN)가 아니면 URIError 예외를 throw합니다.
          4. continuationByteParseHexOctet(string, k + 1)로 둡니다.
          5. continuationByte정수가 아니면 URIError 예외를 throw합니다.
          6. OctetscontinuationByte를 추가합니다.
          7. kk + 2로 설정합니다.
          8. jj + 1로 설정합니다.
        5. Assert: Octets의 길이는 n입니다.
        6. Octets가 유효한 UTF-8 인코딩의 유니코드 코드 포인트를 포함하지 않으면 URIError 예외를 throw합니다.
        7. VOctets에 UTF-8 변환을 적용하여 얻은 코드 포인트로 둡니다. 즉, 옥텟 리스트를 21비트 값으로 변환합니다.
        8. SUTF16EncodeCodePoint(V)로 설정합니다.
    4. R문자열 연결RS의 연결로 설정합니다.
    5. kk + 1로 설정합니다.
  5. R를 반환합니다.
참고

RFC 3629는 잘못된 UTF-8 옥텟 시퀀스의 디코딩을 금지합니다. 예를 들어, 잘못된 시퀀스 0xC0 0x80은 코드 유닛 0x0000으로 디코딩되어서는 안 됩니다. Decode 알고리즘의 구현체는 이러한 잘못된 시퀀스를 만날 때 반드시 URIError를 throw해야 합니다.

19.2.6.7 ParseHexOctet ( string, position )

추상 연산 ParseHexOctet은 string(문자열)과 position(0 이상의 정수) 인자를 받고, 0 이상의 정수 또는 비어 있지 않은 리스트SyntaxError 객체들을 반환합니다. string의 지정된 position에서 두 개의 16진수 문자를 부호 없는 8비트 정수로 파싱합니다. 호출 시 다음 단계를 수행합니다:

  1. lenstring의 길이로 둡니다.
  2. Assert: position + 2 ≤ len.
  3. hexDigitssubstringstringposition부터 position + 2까지로 둡니다.
  4. parseResultParseText(hexDigits, HexDigits[~Sep])로 둡니다.
  5. parseResult구문 노드가 아니면 parseResult를 반환합니다.
  6. nparseResult의 MV로 둡니다.
  7. Assert: n은 0에서 255까지의 포함 구간 내에 있습니다.
  8. n을 반환합니다.

19.3 글로벌 객체의 생성자 속성

19.3.1 AggregateError ( . . . )

20.5.7.1를 참조하세요.

19.3.2 Array ( . . . )

23.1.1를 참조하세요.

19.3.3 ArrayBuffer ( . . . )

25.1.4를 참조하세요.

19.3.4 BigInt ( . . . )

21.2.1를 참조하세요.

19.3.5 BigInt64Array ( . . . )

23.2.5를 참조하세요.

19.3.6 BigUint64Array ( . . . )

23.2.5를 참조하세요.

19.3.7 Boolean ( . . . )

20.3.1를 참조하세요.

19.3.8 DataView ( . . . )

25.3.2를 참조하세요.

19.3.9 Date ( . . . )

21.4.2를 참조하세요.

19.3.10 Error ( . . . )

20.5.1를 참조하세요.

19.3.11 EvalError ( . . . )

20.5.5.1를 참조하세요.

19.3.12 FinalizationRegistry ( . . . )

26.2.1를 참조하세요.

19.3.13 Float16Array ( . . . )

23.2.5를 참조하세요.

19.3.14 Float32Array ( . . . )

23.2.5를 참조하세요.

19.3.15 Float64Array ( . . . )

23.2.5를 참조하세요.

19.3.16 Function ( . . . )

20.2.1를 참조하세요.

19.3.17 Int8Array ( . . . )

23.2.5를 참조하세요.

19.3.18 Int16Array ( . . . )

23.2.5를 참조하세요.

19.3.19 Int32Array ( . . . )

23.2.5를 참조하세요.

19.3.20 Iterator ( . . . )

27.1.3.1를 참조하세요.

19.3.21 Map ( . . . )

24.1.1를 참조하세요.

19.3.22 Number ( . . . )

21.1.1를 참조하세요.

19.3.23 Object ( . . . )

20.1.1를 참조하세요.

19.3.24 Promise ( . . . )

27.2.3를 참조하세요.

19.3.25 Proxy ( . . . )

28.2.1를 참조하세요.

19.3.26 RangeError ( . . . )

20.5.5.2를 참조하세요.

19.3.27 ReferenceError ( . . . )

20.5.5.3를 참조하세요.

19.3.28 RegExp ( . . . )

22.2.4를 참조하세요.

19.3.29 Set ( . . . )

24.2.2를 참조하세요.

19.3.30 SharedArrayBuffer ( . . . )

25.2.3를 참조하세요.

19.3.31 String ( . . . )

22.1.1를 참조하세요.

19.3.32 Symbol ( . . . )

20.4.1를 참조하세요.

19.3.33 SyntaxError ( . . . )

20.5.5.4를 참조하세요.

19.3.34 TypeError ( . . . )

20.5.5.5를 참조하세요.

19.3.35 Uint8Array ( . . . )

23.2.5를 참조하세요.

19.3.36 Uint8ClampedArray ( . . . )

23.2.5를 참조하세요.

19.3.37 Uint16Array ( . . . )

23.2.5를 참조하세요.

19.3.38 Uint32Array ( . . . )

23.2.5를 참조하세요.

19.3.39 URIError ( . . . )

20.5.5.6를 참조하세요.

19.3.40 WeakMap ( . . . )

24.3.1를 참조하세요.

19.3.41 WeakRef ( . . . )

26.1.1를 참조하세요.

19.3.42 WeakSet ( . . . )

24.4를 참조하세요.

19.4 글로벌 객체의 기타 속성

19.4.1 Atomics

25.4를 참조하세요.

19.4.2 JSON

25.5를 참조하세요.

19.4.3 Math

21.3를 참조하세요.

19.4.4 Reflect

28.1를 참조하세요.

20 기본 객체

20.1 Object 객체

20.1.1 Object 생성자

Object 생성자:

  • %Object%입니다.
  • "Object" 속성의 초기값이며, 글로벌 객체의 값입니다.
  • 생성자로 호출될 때 새로운 일반 객체를 생성합니다.
  • 생성자 대신 함수로 호출될 때 타입 변환을 수행합니다.
  • 클래스 정의의 extends 절의 값으로 사용할 수 있습니다.

20.1.1.1 Object ( [ value ] )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. NewTarget이 undefined활성 함수 객체도 아니면,
    1. OrdinaryCreateFromConstructor(NewTarget, "%Object.prototype%")를 반환합니다.
  2. valueundefined 또는 null이면, OrdinaryObjectCreate(%Object.prototype%)를 반환합니다.
  3. ToObject(value)를 반환합니다.

20.1.2 Object 생성자의 속성

Object 생성자:

  • [[Prototype]] 내부 슬롯의 값은 %Function.prototype%입니다.
  • "length" 속성의 값은 1𝔽입니다.
  • 다음 추가적인 속성을 가집니다:

20.1.2.1 Object.assign ( target, ...sources )

이 함수는 하나 이상의 소스 객체에서 모든 열거 가능한 자체 속성의 값을 target 객체로 복사합니다.

호출될 때 다음 단계를 수행합니다:

  1. to를 ? ToObject(target)로 둡니다.
  2. 인자가 하나만 전달되면 to를 반환합니다.
  3. sources의 각 요소 nextSource에 대해,
    1. nextSourceundefinednull도 아니면,
      1. from을 ! ToObject(nextSource)로 둡니다.
      2. keys를 ? from.[[OwnPropertyKeys]]()로 둡니다.
      3. keys의 각 요소 nextKey에 대해,
        1. desc를 ? from.[[GetOwnProperty]](nextKey)로 둡니다.
        2. descundefined가 아니고 desc.[[Enumerable]]true이면,
          1. propValue를 ? Get(from, nextKey)로 둡니다.
          2. Set(to, nextKey, propValue, true)를 수행합니다.
  4. to를 반환합니다.

이 함수의 "length" 속성 값은 2𝔽입니다.

20.1.2.2 Object.create ( O, Properties )

이 함수는 지정된 프로토타입을 가진 새 객체를 생성합니다.

호출될 때 다음 단계를 수행합니다:

  1. O객체가 아니고 Onull이 아니면, TypeError 예외를 throw합니다.
  2. objOrdinaryObjectCreate(O)로 둡니다.
  3. Propertiesundefined가 아니면,
    1. ObjectDefineProperties(obj, Properties)를 반환합니다.
  4. obj를 반환합니다.

20.1.2.3 Object.defineProperties ( O, Properties )

이 함수는 객체의 자체 속성을 추가하고/또는 기존 자체 속성의 특성을 갱신합니다.

호출될 때 다음 단계를 수행합니다:

  1. O객체가 아니면, TypeError 예외를 throw합니다.
  2. ObjectDefineProperties(O, Properties)를 반환합니다.

20.1.2.3.1 ObjectDefineProperties ( O, Properties )

추상 연산 ObjectDefineProperties는 O(객체)와 Properties(ECMAScript 언어 값) 인자를 받고, 정상 완료로 객체 또는 throw 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. props를 ? ToObject(Properties)로 둡니다.
  2. keys를 ? props.[[OwnPropertyKeys]]()로 둡니다.
  3. descriptors를 새로운 빈 리스트로 둡니다.
  4. keys의 각 요소 nextKey에 대해,
    1. propDesc를 ? props.[[GetOwnProperty]](nextKey)로 둡니다.
    2. propDescundefined가 아니고 propDesc.[[Enumerable]]true이면,
      1. descObj를 ? Get(props, nextKey)로 둡니다.
      2. desc를 ? ToPropertyDescriptor(descObj)로 둡니다.
      3. Record { [[Key]]: nextKey, [[Descriptor]]: desc } 를 descriptors에 추가합니다.
  5. descriptors의 각 요소 property에 대해,
    1. DefinePropertyOrThrow(O, property.[[Key]], property.[[Descriptor]])를 수행합니다.
  6. O를 반환합니다.

20.1.2.4 Object.defineProperty ( O, P, Attributes )

이 함수는 객체의 자체 속성을 추가하고/또는 기존 자체 속성의 특성을 갱신합니다.

호출될 때 다음 단계를 수행합니다:

  1. O객체가 아니면, TypeError 예외를 throw합니다.
  2. key를 ? ToPropertyKey(P)로 둡니다.
  3. desc를 ? ToPropertyDescriptor(Attributes)로 둡니다.
  4. DefinePropertyOrThrow(O, key, desc)를 수행합니다.
  5. O를 반환합니다.

20.1.2.5 Object.entries ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. obj를 ? ToObject(O)로 둡니다.
  2. entryList를 ? EnumerableOwnProperties(obj, key+value)로 둡니다.
  3. CreateArrayFromList(entryList)를 반환합니다.

20.1.2.6 Object.freeze ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. O객체가 아니면, O를 반환합니다.
  2. status를 ? SetIntegrityLevel(O, frozen)로 둡니다.
  3. statusfalse이면, TypeError 예외를 throw합니다.
  4. O를 반환합니다.

20.1.2.7 Object.fromEntries ( iterable )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. RequireObjectCoercible(iterable)를 수행합니다.
  2. objOrdinaryObjectCreate(%Object.prototype%)로 둡니다.
  3. Assert: obj는 자신의 속성이 없는 확장 가능한 일반 객체입니다.
  4. closureAbstract Closure (매개변수 (key, value), obj 캡처)로 두고, 호출 시 다음 단계를 수행합니다:
    1. propertyKey를 ? ToPropertyKey(key)로 둡니다.
    2. CreateDataPropertyOrThrow(obj, propertyKey, value)를 수행합니다.
    3. NormalCompletion(undefined)를 반환합니다.
  5. adderCreateBuiltinFunction(closure, 2, "", « »)로 둡니다.
  6. AddEntriesFromIterable(obj, iterable, adder)를 반환합니다.
참고
adder를 위해 생성된 함수는 ECMAScript 코드에서는 직접 접근할 수 없습니다.

20.1.2.8 Object.getOwnPropertyDescriptor ( O, P )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. obj를 ? ToObject(O)로 둡니다.
  2. key를 ? ToPropertyKey(P)로 둡니다.
  3. desc를 ? obj.[[GetOwnProperty]](key)로 둡니다.
  4. FromPropertyDescriptor(desc)를 반환합니다.

20.1.2.9 Object.getOwnPropertyDescriptors ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. obj를 ? ToObject(O)로 둡니다.
  2. ownKeys를 ? obj.[[OwnPropertyKeys]]()로 둡니다.
  3. descriptorsOrdinaryObjectCreate(%Object.prototype%)로 둡니다.
  4. ownKeys의 각 요소 key에 대해,
    1. desc를 ? obj.[[GetOwnProperty]](key)로 둡니다.
    2. descriptorFromPropertyDescriptor(desc)로 둡니다.
    3. descriptorundefined가 아니면, ! CreateDataPropertyOrThrow(descriptors, key, descriptor)를 수행합니다.
  5. descriptors를 반환합니다.

20.1.2.10 Object.getOwnPropertyNames ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. CreateArrayFromList(? GetOwnPropertyKeys(O, string))를 반환합니다.

20.1.2.11 Object.getOwnPropertySymbols ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. CreateArrayFromList(? GetOwnPropertyKeys(O, symbol))를 반환합니다.

20.1.2.11.1 GetOwnPropertyKeys ( O, type )

추상 연산 GetOwnPropertyKeys는 O(ECMAScript 언어 값) 와 type(string 또는 symbol) 인자를 받고, 정상 완료리스트속성 키 또는 throw 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. obj를 ? ToObject(O)로 둡니다.
  2. keys를 ? obj.[[OwnPropertyKeys]]()로 둡니다.
  3. nameList를 새로운 빈 리스트로 둡니다.
  4. keys의 각 요소 nextKey에 대해,
    1. nextKeySymbol이고 typesymbol이거나, nextKey문자열이고 typestring이면,
      1. nextKeynameList에 추가합니다.
  5. nameList를 반환합니다.

20.1.2.12 Object.getPrototypeOf ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. obj를 ? ToObject(O)로 둡니다.
  2. obj.[[GetPrototypeOf]]()를 반환합니다.

20.1.2.13 Object.groupBy ( items, callback )

참고

callback은 두 개의 인자를 받아야 하는 함수여야 합니다. groupByitems의 각 요소에 대해 오름차순으로 callback을 한 번씩 호출해서 새 객체를 만듭니다. callback이 반환한 각 값은 속성 키로 강제 변환됩니다. 이렇게 변환된 각 속성 키에 대해, 결과 객체는 해당 속성 키를 가지고, 값은 callback의 반환값이 그 키로 강제 변환된 모든 요소를 담은 배열입니다.

callback은 두 인자(요소의 값, 요소의 인덱스)로 호출됩니다.

groupBy의 반환값은 %Object.prototype%를 상속받지 않는 객체입니다.

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. groups를 ? GroupBy(items, callback, property)로 둡니다.
  2. objOrdinaryObjectCreate(null)로 둡니다.
  3. groups의 각 Record { [[Key]], [[Elements]] } g에 대해,
    1. elementsCreateArrayFromList(g.[[Elements]])로 둡니다.
    2. CreateDataPropertyOrThrow(obj, g.[[Key]], elements)를 수행합니다.
  4. obj를 반환합니다.

20.1.2.14 Object.hasOwn ( O, P )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. obj를 ? ToObject(O)로 둡니다.
  2. key를 ? ToPropertyKey(P)로 둡니다.
  3. HasOwnProperty(obj, key)를 반환합니다.

20.1.2.15 Object.is ( value1, value2 )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. SameValue(value1, value2)를 반환합니다.

20.1.2.16 Object.isExtensible ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. O객체가 아니면, false를 반환합니다.
  2. IsExtensible(O)를 반환합니다.

20.1.2.17 Object.isFrozen ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. O객체가 아니면, true를 반환합니다.
  2. TestIntegrityLevel(O, frozen)를 반환합니다.

20.1.2.18 Object.isSealed ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. O객체가 아니면, true를 반환합니다.
  2. TestIntegrityLevel(O, sealed)를 반환합니다.

20.1.2.19 Object.keys ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. obj를 ? ToObject(O)로 둡니다.
  2. keyList를 ? EnumerableOwnProperties(obj, key)로 둡니다.
  3. CreateArrayFromList(keyList)를 반환합니다.

20.1.2.20 Object.preventExtensions ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. O객체가 아니면, O를 반환합니다.
  2. status를 ? O.[[PreventExtensions]]()로 둡니다.
  3. statusfalse이면, TypeError 예외를 throw합니다.
  4. O를 반환합니다.

20.1.2.21 Object.prototype

Object.prototype의 초기값은 Object 프로토타입 객체입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.1.2.22 Object.seal ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. O객체가 아니면, O를 반환합니다.
  2. status를 ? SetIntegrityLevel(O, sealed)로 둡니다.
  3. statusfalse이면, TypeError 예외를 throw합니다.
  4. O를 반환합니다.

20.1.2.23 Object.setPrototypeOf ( O, proto )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. O를 ? RequireObjectCoercible(O)로 설정합니다.
  2. proto객체가 아니고 protonull이 아니면, TypeError 예외를 throw합니다.
  3. O객체가 아니면, O를 반환합니다.
  4. status를 ? O.[[SetPrototypeOf]](proto)로 둡니다.
  5. statusfalse이면, TypeError 예외를 throw합니다.
  6. O를 반환합니다.

20.1.2.24 Object.values ( O )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. obj를 ? ToObject(O)로 둡니다.
  2. valueList를 ? EnumerableOwnProperties(obj, value)로 둡니다.
  3. CreateArrayFromList(valueList)를 반환합니다.

20.1.3 Object 프로토타입 객체의 속성

Object 프로토타입 객체:

  • %Object.prototype%입니다.
  • [[Extensible]] 내부 슬롯의 값은 true입니다.
  • 일반 객체에 대해 정의된 내부 메서드를 가집니다. 단, [[SetPrototypeOf]] 메서드는 10.4.7.1에서 정의된 대로입니다. (따라서, 불변 프로토타입 이국 객체입니다.)
  • [[Prototype]] 내부 슬롯의 값은 null입니다.

20.1.3.1 Object.prototype.constructor

Object.prototype.constructor의 초기값은 %Object%입니다.

20.1.3.2 Object.prototype.hasOwnProperty ( V )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. P를 ? ToPropertyKey(V)로 둡니다.
  2. O를 ? ToObject(this 값)로 둡니다.
  3. HasOwnProperty(O, P)를 반환합니다.
참고

단계 12의 순서는, 이전 명세에서 1에서 던져졌던 예외가 this 값이 undefined 또는 null일 때에도 계속 던져질 수 있도록 보장하기 위해 선택되었습니다.

20.1.3.3 Object.prototype.isPrototypeOf ( V )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. V객체가 아니면, false를 반환합니다.
  2. O를 ? ToObject(this 값)로 둡니다.
  3. 반복,
    1. V를 ? V.[[GetPrototypeOf]]()로 설정합니다.
    2. Vnull이면, false를 반환합니다.
    3. SameValue(O, V)가 true이면, true를 반환합니다.
참고

단계 12의 순서는, V가 객체가 아닌 경우와 this 값이 undefined 또는 null일 때 이전 명세에서 지정된 동작을 유지합니다.

20.1.3.4 Object.prototype.propertyIsEnumerable ( V )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. P를 ? ToPropertyKey(V)로 둡니다.
  2. O를 ? ToObject(this 값)로 둡니다.
  3. desc를 ? O.[[GetOwnProperty]](P)로 둡니다.
  4. descundefined면, false를 반환합니다.
  5. desc.[[Enumerable]]를 반환합니다.
참고 1

이 메서드는 프로토타입 체인의 객체는 고려하지 않습니다.

참고 2

단계 12의 순서는, 이전 명세에서 1에서 던져졌던 예외가 this 값이 undefined 또는 null일 때에도 계속 던져질 수 있도록 보장하기 위해 선택되었습니다.

20.1.3.5 Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. Invoke(O, "toString")을 반환합니다.

이 메서드의 선택적 매개변수는 사용되지 않지만 ECMA-402 toLocaleString 메서드에서 사용된 매개변수 패턴과 일치하도록 설계되었습니다. ECMA-402 지원이 없는 구현은 이 매개변수 위치를 다른 용도로 사용하면 안 됩니다.

참고 1

이 메서드는 로케일에 민감한 toString 동작이 없는 객체에 대해 일반적인 toLocaleString 구현을 제공합니다. Array, Number, Date%TypedArray%는 자체 로케일에 민감한 toLocaleString 메서드를 제공합니다.

참고 2

ECMA-402는 이 기본 구현의 대안을 의도적으로 제공하지 않습니다.

20.1.3.6 Object.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. this 값이 undefined이면, "[object Undefined]"를 반환합니다.
  2. this 값이 null이면, "[object Null]"를 반환합니다.
  3. O를 ! ToObject(this 값)로 둡니다.
  4. isArray를 ? IsArray(O)로 둡니다.
  5. isArraytrue이면, builtinTag"Array"로 둡니다.
  6. 그렇지 않고 O[[ParameterMap]] 내부 슬롯이 있으면, builtinTag"Arguments"로 둡니다.
  7. 그렇지 않고 O[[Call]] 내부 메서드가 있으면, builtinTag"Function"로 둡니다.
  8. 그렇지 않고 O[[ErrorData]] 내부 슬롯이 있으면, builtinTag"Error"로 둡니다.
  9. 그렇지 않고 O[[BooleanData]] 내부 슬롯이 있으면, builtinTag"Boolean"로 둡니다.
  10. 그렇지 않고 O[[NumberData]] 내부 슬롯이 있으면, builtinTag"Number"로 둡니다.
  11. 그렇지 않고 O[[StringData]] 내부 슬롯이 있으면, builtinTag"String"로 둡니다.
  12. 그렇지 않고 O[[DateValue]] 내부 슬롯이 있으면, builtinTag"Date"로 둡니다.
  13. 그렇지 않고 O[[RegExpMatcher]] 내부 슬롯이 있으면, builtinTag"RegExp"로 둡니다.
  14. 그 외에는, builtinTag"Object"로 둡니다.
  15. tag를 ? Get(O, %Symbol.toStringTag%)로 둡니다.
  16. tag문자열이 아니면, tagbuiltinTag로 설정합니다.
  17. 문자열 연결"[object ", tag, "]"을 반환합니다.
참고

과거에는 이 메서드를 통해 이전 명세에서 여러 내장 객체의 명목 타입 태그로 사용되던 [[Class]] 내부 슬롯의 문자열 값을 접근하기도 했습니다. 위의 toString 정의는 toString을 특정 내장 객체 종류의 테스트로 사용하는 레거시 코드의 호환성을 유지합니다. 그러나, 다른 종류의 내장 객체나 프로그램 정의 객체에 대해서는 신뢰할 수 있는 타입 판별 메커니즘을 제공하지 않습니다. 또한, 프로그램에서 %Symbol.toStringTag%를 사용하면 이러한 레거시 타입 테스트의 신뢰성을 무효화할 수 있습니다.

20.1.3.7 Object.prototype.valueOf ( )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. ToObject(this 값)을 반환합니다.

20.1.3.8 Object.prototype.__proto__

Object.prototype.__proto__접근자 속성이며, 특성은 { [[Enumerable]]: false, [[Configurable]]: true }입니다. [[Get]][[Set]] 특성은 다음과 같이 정의됩니다:

20.1.3.8.1 get Object.prototype.__proto__

[[Get]] 특성 값은 인자를 받지 않는 내장 함수입니다. 호출될 때 다음 단계를 수행합니다:

  1. O를 ? ToObject(this 값)로 둡니다.
  2. O.[[GetPrototypeOf]]()을 반환합니다.

20.1.3.8.2 set Object.prototype.__proto__

[[Set]] 특성 값은 proto 인자를 받는 내장 함수입니다. 호출될 때 다음 단계를 수행합니다:

  1. O를 ? RequireObjectCoercible(this 값)로 둡니다.
  2. proto객체가 아니고, protonull이 아니면, undefined를 반환합니다.
  3. O객체가 아니면, undefined를 반환합니다.
  4. status를 ? O.[[SetPrototypeOf]](proto)로 둡니다.
  5. statusfalse이면, TypeError 예외를 throw합니다.
  6. undefined를 반환합니다.

20.1.3.9 레거시 Object.prototype 접근자 메서드

20.1.3.9.1 Object.prototype.__defineGetter__ ( P, getter )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. O를 ? ToObject(this 값)로 둡니다.
  2. IsCallable(getter)가 false면, TypeError 예외를 throw합니다.
  3. desc를 PropertyDescriptor { [[Get]]: getter, [[Enumerable]]: true, [[Configurable]]: true }로 둡니다.
  4. key를 ? ToPropertyKey(P)로 둡니다.
  5. DefinePropertyOrThrow(O, key, desc)를 수행합니다.
  6. undefined를 반환합니다.

20.1.3.9.2 Object.prototype.__defineSetter__ ( P, setter )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. O를 ? ToObject(this 값)로 둡니다.
  2. IsCallable(setter)가 false면, TypeError 예외를 throw합니다.
  3. desc를 PropertyDescriptor { [[Set]]: setter, [[Enumerable]]: true, [[Configurable]]: true }로 둡니다.
  4. key를 ? ToPropertyKey(P)로 둡니다.
  5. DefinePropertyOrThrow(O, key, desc)를 수행합니다.
  6. undefined를 반환합니다.

20.1.3.9.3 Object.prototype.__lookupGetter__ ( P )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. O를 ? ToObject(this 값)로 둡니다.
  2. key를 ? ToPropertyKey(P)로 둡니다.
  3. 반복,
    1. desc를 ? O.[[GetOwnProperty]](key)로 둡니다.
    2. descundefined가 아니면,
      1. IsAccessorDescriptor(desc) 가 truedesc.[[Get]]를 반환합니다.
      2. undefined를 반환합니다.
    3. O를 ? O.[[GetPrototypeOf]]()로 설정합니다.
    4. Onull이면, undefined를 반환합니다.

20.1.3.9.4 Object.prototype.__lookupSetter__ ( P )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. O를 ? ToObject(this 값)로 둡니다.
  2. key를 ? ToPropertyKey(P)로 둡니다.
  3. 반복,
    1. desc를 ? O.[[GetOwnProperty]](key)로 둡니다.
    2. descundefined가 아니면,
      1. IsAccessorDescriptor(desc) 가 truedesc.[[Set]]를 반환합니다.
      2. undefined를 반환합니다.
    3. O를 ? O.[[GetPrototypeOf]]()로 설정합니다.
    4. Onull이면, undefined를 반환합니다.

20.1.4 Object 인스턴스의 속성

객체 인스턴스는 Object 프로토타입 객체로부터 상속받은 것 이외에는 특별한 속성이 없습니다.

20.2 Function 객체

20.2.1 Function 생성자

Function 생성자:

  • %Function%입니다.
  • "Function" 속성의 초기값이며, 글로벌 객체의 값입니다.
  • 생성자 대신 함수로 호출될 때 새로운 함수 객체를 생성하고 초기화합니다. 따라서 Function(…) 함수 호출은 동일한 인자를 가진 new Function(…) 객체 생성 표현식과 동일합니다.
  • 클래스 정의의 extends 절의 값으로 사용할 수 있습니다. 지정된 Function 동작을 상속하려는 서브클래스 생성자는 내장 함수 동작에 필요한 내부 슬롯을 가진 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 Function 생성자super 호출을 포함해야 합니다. 함수 객체 정의를 위한 모든 ECMAScript 구문은 Function의 인스턴스를 생성합니다. 내장 GeneratorFunction, AsyncFunction, AsyncGeneratorFunction 서브클래스를 제외하고 Function 서브클래스 인스턴스를 생성하는 구문은 없습니다.

20.2.1.1 Function ( ...parameterArgs, bodyArg )

마지막 인자(있다면)는 함수의 본문(실행 코드)을 지정합니다. 그 앞의 인자들은 형식 매개변수를 지정합니다.

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. C활성 함수 객체로 둡니다.
  2. bodyArg가 없으면 bodyArg를 빈 문자열로 설정합니다.
  3. CreateDynamicFunction(C, NewTarget, normal, parameterArgs, bodyArg)를 반환합니다.
참고

각 형식 매개변수에 대해 인자를 하나씩 가지는 것은 허용되지만 필수는 아닙니다. 예를 들어, 아래 세 표현식은 모두 동일한 결과를 생성합니다:

new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")

20.2.1.1.1 CreateDynamicFunction ( constructor, newTarget, kind, parameterArgs, bodyArg )

추상 연산 CreateDynamicFunction은 constructor(생성자), newTarget(생성자 또는 undefined), kind(normal, generator, async, async-generator), parameterArgs(리스트ECMAScript 언어 값), bodyArg(ECMAScript 언어 값)을 인자로 받고, 정상 완료로 ECMAScript 함수 객체 또는 throw 완료를 반환합니다. constructor는 이 동작을 수행하는 생성자 함수입니다. newTarget은 처음 new가 적용된 생성자입니다. parameterArgsbodyArgconstructor에 전달된 인자 값을 반영합니다. 호출 시 다음 단계를 수행합니다:

  1. newTargetundefined이면, newTargetconstructor로 설정합니다.
  2. kindnormal이면,
    1. prefix"function"로 둡니다.
    2. exprSymFunctionExpression로 둡니다.
    3. bodySymFunctionBody[~Yield, ~Await]로 둡니다.
    4. parameterSymFormalParameters[~Yield, ~Await]로 둡니다.
    5. fallbackProto"%Function.prototype%"로 둡니다.
  3. 그렇지 않고 kindgenerator이면,
    1. prefix"function*"로 둡니다.
    2. exprSymGeneratorExpression로 둡니다.
    3. bodySymGeneratorBody로 둡니다.
    4. parameterSymFormalParameters[+Yield, ~Await]로 둡니다.
    5. fallbackProto"%GeneratorFunction.prototype%"로 둡니다.
  4. 그렇지 않고 kindasync이면,
    1. prefix"async function"로 둡니다.
    2. exprSymAsyncFunctionExpression로 둡니다.
    3. bodySymAsyncFunctionBody로 둡니다.
    4. parameterSymFormalParameters[~Yield, +Await]로 둡니다.
    5. fallbackProto"%AsyncFunction.prototype%"로 둡니다.
  5. 그 외,
    1. Assert: kindasync-generator입니다.
    2. prefix"async function*"로 둡니다.
    3. exprSymAsyncGeneratorExpression로 둡니다.
    4. bodySymAsyncGeneratorBody로 둡니다.
    5. parameterSymFormalParameters[+Yield, +Await]로 둡니다.
    6. fallbackProto"%AsyncGeneratorFunction.prototype%"로 둡니다.
  6. argCountparameterArgs의 요소 개수로 둡니다.
  7. parameterStrings를 새로운 빈 리스트로 둡니다.
  8. parameterArgs의 각 요소 arg에 대해,
    1. ToString(arg)를 parameterStrings에 추가합니다.
  9. bodyString을 ? ToString(bodyArg)로 둡니다.
  10. currentRealm현재 Realm Record로 둡니다.
  11. HostEnsureCanCompileStrings(currentRealm, parameterStrings, bodyString, false)를 수행합니다.
  12. P를 빈 문자열로 둡니다.
  13. argCount > 0이면,
    1. PparameterStrings[0]로 설정합니다.
    2. k를 1로 둡니다.
    3. k < argCount인 동안 반복,
      1. nextArgStringparameterStrings[k]로 둡니다.
      2. P문자열 연결P, ","(쉼표), nextArgString의 연결로 설정합니다.
      3. kk + 1로 설정합니다.
  14. bodyParseString문자열 연결로 0x000A(LINE FEED), bodyString, 0x000A(LINE FEED)의 연결로 둡니다.
  15. sourceString문자열 연결prefix, " anonymous(", P, 0x000A(LINE FEED), ") {", bodyParseString, "}"의 연결로 둡니다.
  16. sourceTextStringToCodePoints(sourceString)로 둡니다.
  17. parametersParseText(P, parameterSym)로 둡니다.
  18. parameters리스트의 오류라면, SyntaxError 예외를 throw합니다.
  19. bodyParseText(bodyParseString, bodySym)로 둡니다.
  20. body리스트의 오류라면, SyntaxError 예외를 throw합니다.
  21. 참고: 매개변수와 본문은 각각 단독으로 유효한지 확인하기 위해 따로 파싱됩니다. 예를 들어, new Function("/*", "*/ ) {")는 함수로 평가되지 않습니다.
  22. 참고: 이 단계에 도달했다면 sourceTextexprSym의 문법을 가져야 합니다(역은 성립하지 않음). 다음 두 단계의 목적은 exprSym에 직접 적용되는 Early Error 규칙을 강제하는 것입니다.
  23. exprParseText(sourceText, exprSym)로 둡니다.
  24. expr리스트의 오류라면, SyntaxError 예외를 throw합니다.
  25. proto를 ? GetPrototypeFromConstructor(newTarget, fallbackProto)로 둡니다.
  26. envcurrentRealm.[[GlobalEnv]]로 둡니다.
  27. privateEnvnull로 둡니다.
  28. FOrdinaryFunctionCreate(proto, sourceText, parameters, body, non-lexical-this, env, privateEnv)로 둡니다.
  29. SetFunctionName(F, "anonymous")를 수행합니다.
  30. kindgenerator이면,
    1. prototypeOrdinaryObjectCreate(%GeneratorPrototype%)로 둡니다.
    2. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행합니다.
  31. 그렇지 않고 kindasync-generator이면,
    1. prototypeOrdinaryObjectCreate(%AsyncGeneratorPrototype%)로 둡니다.
    2. DefinePropertyOrThrow(F, "prototype", PropertyDescriptor { [[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행합니다.
  32. 그렇지 않고 kindnormal이면,
    1. MakeConstructor(F)를 수행합니다.
  33. 참고: kindasync인 함수는 생성 불가능하며 [[Construct]] 내부 메서드나 "prototype" 속성을 갖지 않습니다.
  34. F를 반환합니다.
참고

CreateDynamicFunction은 kindasync가 아닌 함수에 대해 "prototype" 속성을 정의하여 해당 함수가 생성자로 사용될 수 있도록 합니다.

20.2.2 Function 생성자의 속성

Function 생성자:

  • 자체적으로 내장 함수 객체입니다.
  • [[Prototype]] 내부 슬롯의 값은 %Function.prototype%입니다.
  • "length" 속성의 값은 1𝔽입니다.
  • 다음과 같은 속성을 가집니다:

20.2.2.1 Function.prototype

Function.prototype의 값은 Function 프로토타입 객체입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.2.3 Function 프로토타입 객체의 속성

Function 프로토타입 객체:

  • %Function.prototype%입니다.
  • 자체적으로 내장 함수 객체입니다.
  • 어떤 인자도 받아들이며, 호출 시 undefined를 반환합니다.
  • [[Construct]] 내부 메서드가 없으므로 new 연산자와 함께 생성자로 사용할 수 없습니다.
  • [[Prototype]] 내부 슬롯의 값은 %Object.prototype%입니다.
  • "prototype" 속성을 가지지 않습니다.
  • "length" 속성의 값은 +0𝔽입니다.
  • "name" 속성의 값은 빈 문자열입니다.
참고

Function 프로토타입 객체는 ECMAScript 2015 명세 이전에 작성된 ECMAScript 코드와의 호환성을 보장하기 위해 함수 객체로 지정되어 있습니다.

20.2.3.1 Function.prototype.apply ( thisArg, argArray )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. functhis 값으로 둡니다.
  2. IsCallable(func)가 false이면, TypeError 예외를 throw합니다.
  3. argArrayundefined 또는 null이면,
    1. PrepareForTailCall()를 수행합니다.
    2. Call(func, thisArg)를 반환합니다.
  4. argList를 ? CreateListFromArrayLike(argArray)로 둡니다.
  5. PrepareForTailCall()를 수행합니다.
  6. Call(func, thisArg, argList)를 반환합니다.
참고 1

thisArg 값은 수정 없이 this 값으로 전달됩니다. 이는 Edition 3과의 변경사항으로, Edition 3에서는 undefined 또는 null thisArg글로벌 객체로 대체되고, 다른 값에는 ToObject가 적용된 결과가 this 값으로 전달되었습니다. thisArg가 수정 없이 전달되더라도, strict하지 않은 함수는 함수 진입 시 여전히 이러한 변환을 수행합니다.

참고 2

func가 화살표 함수이거나 bound function exotic object라면, thisArg는 6단계 6[[Call]]에서 무시됩니다.

20.2.3.2 Function.prototype.bind ( thisArg, ...args )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Targetthis 값으로 둡니다.
  2. IsCallable(Target)가 false이면, TypeError 예외를 throw합니다.
  3. F를 ? BoundFunctionCreate(Target, thisArg, args)로 둡니다.
  4. L을 0으로 둡니다.
  5. targetHasLength를 ? HasOwnProperty(Target, "length")로 둡니다.
  6. targetHasLengthtrue이면,
    1. targetLen를 ? Get(Target, "length")로 둡니다.
    2. targetLenNumber이면,
      1. targetLen+∞𝔽이면,
        1. L을 +∞로 설정합니다.
      2. 그렇지 않고 targetLen-∞𝔽이면,
        1. L을 0으로 설정합니다.
      3. 그 외에는,
        1. targetLenAsInt를 ! ToIntegerOrInfinity(targetLen)로 둡니다.
        2. Assert: targetLenAsInt유한입니다.
        3. argCountargs의 요소 개수로 둡니다.
        4. Lmax(targetLenAsInt - argCount, 0)로 설정합니다.
  7. SetFunctionLength(F, L)을 수행합니다.
  8. targetName를 ? Get(Target, "name")로 둡니다.
  9. targetName문자열이 아니면, targetName을 빈 문자열로 설정합니다.
  10. SetFunctionName(F, targetName, "bound")을 수행합니다.
  11. F를 반환합니다.
참고 1

Function.prototype.bind를 사용해 생성된 함수 객체이국 객체입니다. 또한 "prototype" 속성을 가지지 않습니다.

참고 2

Target이 화살표 함수이거나 bound function exotic object이면, 이 메서드에 전달된 thisArg는 이후 F를 호출할 때 사용되지 않습니다.

20.2.3.3 Function.prototype.call ( thisArg, ...args )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. functhis 값으로 둡니다.
  2. IsCallable(func)가 false이면, TypeError 예외를 throw합니다.
  3. PrepareForTailCall()를 수행합니다.
  4. Call(func, thisArg, args)를 반환합니다.
참고 1

thisArg 값은 수정 없이 this 값으로 전달됩니다. 이는 Edition 3과의 변경사항으로, Edition 3에서는 undefined 또는 null thisArg글로벌 객체로 대체되고, 다른 값에는 ToObject가 적용된 결과가 this 값으로 전달되었습니다. thisArg가 수정 없이 전달되더라도, strict하지 않은 함수는 함수 진입 시 여전히 이러한 변환을 수행합니다.

참고 2

func가 화살표 함수이거나 bound function exotic object라면, thisArg는 4단계 4[[Call]]에서 무시됩니다.

20.2.3.4 Function.prototype.constructor

Function.prototype.constructor의 초기값은 %Function%입니다.

20.2.3.5 Function.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. functhis 값으로 둡니다.
  2. func객체이고, func[[SourceText]] 내부 슬롯이 있고, func.[[SourceText]]가 유니코드 코드 포인트 시퀀스이고, HostHasSourceTextAvailable(func) 가 true이면,
    1. CodePointsToString(func.[[SourceText]])를 반환합니다.
  3. func내장 함수 객체이면, func구현 정의 문자열 소스코드 표현을 반환합니다. 표현은 NativeFunction 문법을 가져야 합니다. 또한, func[[InitialName]] 내부 슬롯이 있고, func.[[InitialName]]문자열이면, 반환 문자열에서 NativeFunctionAccessoropt PropertyName에 해당하는 부분은 func.[[InitialName]]이어야 합니다.
  4. func객체이고, IsCallable(func)가 true이면, func구현 정의 문자열 소스코드 표현을 반환합니다. 표현은 NativeFunction 문법을 가져야 합니다.
  5. TypeError 예외를 throw합니다.
NativeFunction : function NativeFunctionAccessoropt PropertyName[~Yield, ~Await]opt ( FormalParameters[~Yield, ~Await] ) { [ native code ] } NativeFunctionAccessor : get set

20.2.3.6 Function.prototype [ %Symbol.hasInstance% ] ( V )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Fthis 값으로 둡니다.
  2. OrdinaryHasInstance(F, V)를 반환합니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

참고

이것은 대부분의 함수가 상속받는 %Symbol.hasInstance%의 기본 구현입니다. %Symbol.hasInstance%instanceof 연산자가 특정 생성자의 인스턴스인지 판별하기 위해 호출됩니다. 예를 들면

v instanceof F

는 다음과 같이 평가됩니다:

F[%Symbol.hasInstance%](v)

생성자 함수는 함수에 다른 %Symbol.hasInstance% 메서드를 노출하여 어떤 객체가 instanceof로 자신의 인스턴스로 인식되는지 제어할 수 있습니다.

이 속성은 전역적으로 bound 함수의 타겟 함수를 노출할 수 있는 변조를 방지하기 위해 쓰기 불가능 및 설정 불가능입니다.

이 메서드의 "name" 속성 값은 "[Symbol.hasInstance]"입니다.

20.2.4 Function 인스턴스

모든 Function 인스턴스는 ECMAScript 함수 객체이며, 표 30에 나열된 내부 슬롯을 가집니다. Function 객체Function.prototype.bind 메서드(20.2.3.2)를 사용해 생성된 경우 표 31에 나열된 내부 슬롯을 가집니다.

함수 인스턴스는 다음과 같은 속성을 가집니다:

20.2.4.1 length

"length" 속성의 값은 함수에서 일반적으로 기대되는 인자 수를 나타내는 정수 Number입니다. 그러나 언어는 함수가 다른 개수의 인자로 호출되는 것을 허용합니다. 함수가 "length" 속성에 지정된 개수와 다른 인자 수로 호출될 때의 동작은 함수에 따라 다릅니다. 이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

20.2.4.2 name

"name" 속성의 값은 함수의 설명을 나타내는 문자열입니다. 이름은 의미적 중요성을 가지지 않지만, 일반적으로 프로퍼티 이름 또는 함수가 ECMAScript 소스 텍스트에서 정의된 위치에서 참조되는 변수명입니다. 이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

이 명세에 의해 컨텍스트 이름이 연관되지 않은 익명 함수 객체는 "name" 속성의 값으로 빈 문자열을 사용합니다.

20.2.4.3 prototype

생성자로 사용할 수 있는 함수 인스턴스는 "prototype" 속성을 가집니다. 이러한 Function 인스턴스가 생성될 때마다, 또 다른 일반 객체가 생성되어 함수의 "prototype" 속성의 초기값이 됩니다. 별도의 지정이 없는 한, "prototype" 속성 값은 해당 함수가 생성자로 호출될 때 생성되는 객체의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용됩니다.

이 속성의 특성은 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }입니다.

참고

Function.prototype.bind로 생성된 함수 객체나, MethodDefinition(단, GeneratorMethod 또는 AsyncGeneratorMethod가 아닌 경우) 또는 ArrowFunction을 평가하여 생성된 함수 객체는 "prototype" 속성을 가지지 않습니다.

20.2.5 HostHasSourceTextAvailable ( func )

호스트 정의 추상 연산 HostHasSourceTextAvailable은 func(함수 객체) 인자를 받아 불리언 값을 반환합니다. 이는 호스트 환경func에 대해 소스 텍스트 제공을 막을 수 있도록 합니다.

HostHasSourceTextAvailable의 구현은 다음 요구 사항을 충족해야 합니다:

  • 매개변수에 대해 결정적이어야 합니다. 특정 func 인자로 호출될 때마다 항상 동일한 결과를 반환해야 합니다.

HostHasSourceTextAvailable의 기본 구현은 true를 반환합니다.

20.3 Boolean 객체

20.3.1 Boolean 생성자

Boolean 생성자:

  • %Boolean%입니다.
  • "Boolean" 속성의 초기값이며, 글로벌 객체의 값입니다.
  • 생성자로 호출될 때 새로운 Boolean 객체를 생성 및 초기화합니다.
  • 생성자 대신 함수로 호출될 때 타입 변환을 수행합니다.
  • 클래스 정의의 extends 절의 값으로 사용할 수 있습니다. 지정된 Boolean 동작을 상속하려는 서브클래스 생성자[[BooleanData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 Boolean 생성자super 호출을 포함해야 합니다.

20.3.1.1 Boolean ( value )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. bToBoolean(value)로 둡니다.
  2. NewTarget이 undefined이면, b를 반환합니다.
  3. O를 ? OrdinaryCreateFromConstructor(NewTarget, "%Boolean.prototype%", « [[BooleanData]] »)로 둡니다.
  4. O.[[BooleanData]]b를 설정합니다.
  5. O를 반환합니다.

20.3.2 Boolean 생성자의 속성

Boolean 생성자:

  • [[Prototype]] 내부 슬롯의 값은 %Function.prototype%입니다.
  • 다음과 같은 속성을 가집니다:

20.3.2.1 Boolean.prototype

Boolean.prototype의 초기값은 Boolean 프로토타입 객체입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.3.3 Boolean 프로토타입 객체의 속성

Boolean 프로토타입 객체:

  • %Boolean.prototype%입니다.
  • 일반 객체입니다.
  • 자체적으로 Boolean 객체이며, [[BooleanData]] 내부 슬롯의 값은 false입니다.
  • [[Prototype]] 내부 슬롯의 값은 %Object.prototype%입니다.

20.3.3.1 Boolean.prototype.constructor

Boolean.prototype.constructor의 초기값은 %Boolean%입니다.

20.3.3.2 Boolean.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. b를 ? ThisBooleanValue(this 값)로 둡니다.
  2. btrue"true"를 반환하고, 아니면 "false"를 반환합니다.

20.3.3.3 Boolean.prototype.valueOf ( )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. ThisBooleanValue(this 값)을 반환합니다.

20.3.3.3.1 ThisBooleanValue ( value )

추상 연산 ThisBooleanValue는 value(ECMAScript 언어 값) 인자를 받아 정상 완료로 Boolean 또는 throw 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. valueBoolean이면, value를 반환합니다.
  2. value객체이고 value[[BooleanData]] 내부 슬롯이 있으면,
    1. bvalue.[[BooleanData]]로 둡니다.
    2. Assert: bBoolean임을 보장합니다.
    3. b를 반환합니다.
  3. TypeError 예외를 throw합니다.

20.3.4 Boolean 인스턴스의 속성

Boolean 인스턴스는 일반 객체이며, Boolean 프로토타입 객체로부터 속성을 상속받습니다. Boolean 인스턴스는 [[BooleanData]] 내부 슬롯을 가집니다. [[BooleanData]] 내부 슬롯은 이 Boolean 객체가 표현하는 Boolean 값입니다.

20.4 Symbol 객체

20.4.1 Symbol 생성자

Symbol 생성자:

  • %Symbol%입니다.
  • "Symbol" 속성의 초기값이며, 글로벌 객체의 값입니다.
  • 함수로 호출될 때 새로운 Symbol 값을 반환합니다.
  • new 연산자와 함께 사용하는 것은 의도되지 않았습니다.
  • 서브클래싱을 목적으로 하지 않습니다.
  • 클래스 정의의 extends 절의 값으로 사용할 수 있지만, super 호출 시 예외가 발생합니다.

20.4.1.1 Symbol ( [ description ] )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. NewTarget이 undefined가 아니면, TypeError 예외를 throw합니다.
  2. descriptionundefined면, descStringundefined로 둡니다.
  3. 그 외에는, descString을 ? ToString(description)로 둡니다.
  4. [[Description]]descString인 새로운 Symbol을 반환합니다.

20.4.2 Symbol 생성자의 속성

Symbol 생성자:

  • [[Prototype]] 내부 슬롯의 값은 %Function.prototype%입니다.
  • 다음과 같은 속성을 가집니다:

20.4.2.1 Symbol.asyncIterator

Symbol.asyncIterator의 초기값은 well-known symbol %Symbol.asyncIterator% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.2 Symbol.for ( key )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. stringKey를 ? ToString(key)로 둡니다.
  2. GlobalSymbolRegistry List의 각 요소 e에 대해,
    1. e.[[Key]]stringKey와 같으면, e.[[Symbol]]을 반환합니다.
  3. Assert: GlobalSymbolRegistry List에 현재 stringKey에 대한 항목이 없습니다.
  4. newSymbol[[Description]]stringKey인 새로운 Symbol로 둡니다.
  5. GlobalSymbolRegistry에 Record { [[Key]]: stringKey, [[Symbol]]: newSymbol }를 추가합니다.
  6. newSymbol을 반환합니다.

GlobalSymbolRegistry List는 전역적으로 사용 가능한 append-only 리스트입니다. 모든 realm에서 공유됩니다. ECMAScript 코드가 평가되기 전에 새로운 빈 리스트로 초기화됩니다. GlobalSymbolRegistry List의 요소는 Record이며, 표 63에 정의된 구조를 가집니다.

표 63: GlobalSymbolRegistry Record 필드
필드 이름 용도
[[Key]] 문자열 Symbol을 전역적으로 식별하는 데 사용되는 문자열 키.
[[Symbol]] Symbol 어떤 realm에서도 검색할 수 있는 symbol.

20.4.2.3 Symbol.hasInstance

Symbol.hasInstance의 초기값은 well-known symbol %Symbol.hasInstance% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.4 Symbol.isConcatSpreadable

Symbol.isConcatSpreadable의 초기값은 well-known symbol %Symbol.isConcatSpreadable% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.5 Symbol.iterator

Symbol.iterator의 초기값은 well-known symbol %Symbol.iterator% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.6 Symbol.keyFor ( sym )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. symSymbol이 아니면, TypeError 예외를 throw합니다.
  2. KeyForSymbol(sym)을 반환합니다.

20.4.2.7 Symbol.match

Symbol.match의 초기값은 well-known symbol %Symbol.match% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.8 Symbol.matchAll

Symbol.matchAll의 초기값은 well-known symbol %Symbol.matchAll% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.9 Symbol.prototype

Symbol.prototype의 초기값은 Symbol 프로토타입 객체입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.10 Symbol.replace

Symbol.replace의 초기값은 well-known symbol %Symbol.replace% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.11 Symbol.search

Symbol.search의 초기값은 well-known symbol %Symbol.search% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.12 Symbol.species

Symbol.species의 초기값은 well-known symbol %Symbol.species% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.13 Symbol.split

Symbol.split의 초기값은 well-known symbol %Symbol.split% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.14 Symbol.toPrimitive

Symbol.toPrimitive의 초기값은 well-known symbol %Symbol.toPrimitive% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.15 Symbol.toStringTag

Symbol.toStringTag의 초기값은 well-known symbol %Symbol.toStringTag% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.2.16 Symbol.unscopables

Symbol.unscopables의 초기값은 well-known symbol %Symbol.unscopables% (표 1)입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.4.3 Symbol 프로토타입 객체의 속성

Symbol 프로토타입 객체:

20.4.3.1 Symbol.prototype.constructor

Symbol.prototype.constructor의 초기값은 %Symbol%입니다.

20.4.3.2 get Symbol.prototype.description

Symbol.prototype.description접근자 속성이며, set 접근자 함수는 undefined입니다. get 접근자 함수는 호출될 때 다음 단계를 수행합니다:

  1. sthis 값으로 둡니다.
  2. sym을 ? ThisSymbolValue(s)로 둡니다.
  3. sym.[[Description]]을 반환합니다.

20.4.3.3 Symbol.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. sym을 ? ThisSymbolValue(this 값)으로 둡니다.
  2. SymbolDescriptiveString(sym)을 반환합니다.

20.4.3.3.1 SymbolDescriptiveString ( sym )

추상 연산 SymbolDescriptiveString은 sym(Symbol)을 인자로 받아 문자열을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. descsym[[Description]] 값으로 둡니다.
  2. descundefined이면, desc를 빈 문자열로 설정합니다.
  3. Assert: desc문자열입니다.
  4. 문자열 연결"Symbol(", desc, ")"을 반환합니다.

20.4.3.4 Symbol.prototype.valueOf ( )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. ThisSymbolValue(this 값)을 반환합니다.

20.4.3.4.1 ThisSymbolValue ( value )

추상 연산 ThisSymbolValue는 value(ECMAScript 언어 값) 인자를 받아 정상 완료로 Symbol 또는 throw 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. valueSymbol이면, value를 반환합니다.
  2. value객체이고 value[[SymbolData]] 내부 슬롯이 있으면,
    1. svalue.[[SymbolData]]로 둡니다.
    2. Assert: sSymbol임을 보장합니다.
    3. s를 반환합니다.
  3. TypeError 예외를 throw합니다.

20.4.3.5 Symbol.prototype [ %Symbol.toPrimitive% ] ( hint )

이 메서드는 ECMAScript 언어 연산자가 Symbol 객체를 프리미티브 값으로 변환하기 위해 호출합니다.

호출될 때 다음 단계를 수행합니다:

  1. ThisSymbolValue(this 값)을 반환합니다.
참고

인자는 무시됩니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

이 메서드의 "name" 속성 값은 "[Symbol.toPrimitive]"입니다.

20.4.3.6 Symbol.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 문자열 값 "Symbol"입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

20.4.4 Symbol 인스턴스의 속성

Symbol 인스턴스는 일반 객체이며, Symbol 프로토타입 객체로부터 속성을 상속받습니다. Symbol 인스턴스는 [[SymbolData]] 내부 슬롯을 가집니다. [[SymbolData]] 내부 슬롯은 이 Symbol 객체가 표현하는 Symbol 값입니다.

20.4.5 Symbol을 위한 추상 연산

20.4.5.1 KeyForSymbol ( sym )

추상 연산 KeyForSymbol은 sym(Symbol)을 인자로 받아 문자열 또는 undefined를 반환합니다. symGlobalSymbolRegistry 리스트에 있으면, sym을 등록할 때 사용한 문자열을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. GlobalSymbolRegistry 리스트의 각 요소 e에 대해,
    1. SameValue(e.[[Symbol]], sym)이 true이면, e.[[Key]]를 반환합니다.
  2. Assert: GlobalSymbolRegistry 리스트는 현재 sym에 대한 엔트리를 포함하지 않습니다.
  3. undefined를 반환합니다.

20.5Error 객체

오류 객체의 인스턴스는 런타임 오류가 발생할 때 예외로 throw됩니다. 오류 객체는 사용자 정의 예외 클래스의 기본 객체로도 사용될 수 있습니다.

ECMAScript 구현에서 런타임 오류를 감지하면 20.5.5에서 정의된 NativeError 객체 중 하나의 새 인스턴스 또는 20.5.7에서 정의된 AggregateError 객체의 새 인스턴스를 throw합니다.

20.5.1 Error 생성자

Error 생성자:

  • %Error%입니다.
  • 전역 객체"Error" 프로퍼티의 초기 값입니다.
  • 생성자가 아닌 함수로 호출될 때 새로운 Error 객체를 생성 및 초기화합니다. 따라서 Error(…) 함수 호출은 동일한 인자로 new Error(…) 객체 생성 표현식과 동일합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 Error 동작을 상속하려는 서브클래스 생성자[[ErrorData]] 내부 슬롯이 있는 서브클래스 인스턴스를 생성 및 초기화하기 위해 Error 생성자super 호출을 포함해야 합니다.

20.5.1.1 Error ( message [ , options ] )

이 함수가 호출될 때 다음 단계를 수행합니다:

  1. NewTarget이 undefined이면 newTarget활성 함수 객체로 설정하고, 아니면 newTarget을 NewTarget으로 설정합니다.
  2. O를 ? OrdinaryCreateFromConstructor(newTarget, "%Error.prototype%", « [[ErrorData]] »)로 설정합니다.
  3. messageundefined가 아니면,
    1. msg를 ? ToString(message)로 설정합니다.
    2. CreateNonEnumerableDataPropertyOrThrow(O, "message", msg)를 수행합니다.
  4. InstallErrorCause(O, options)를 수행합니다.
  5. O를 반환합니다.

20.5.2 Error 생성자의 프로퍼티

Error 생성자:

  • [[Prototype]] 내부 슬롯의 값은 %Function.prototype%입니다.
  • 다음 프로퍼티를 가집니다:

20.5.2.1 Error.isError ( arg )

이 함수가 호출될 때 다음 단계를 수행합니다:

  1. arg객체가 아니면 false를 반환합니다.
  2. arg[[ErrorData]] 내부 슬롯이 없으면 false를 반환합니다.
  3. true를 반환합니다.

20.5.2.2 Error.prototype

Error.prototype의 초기 값은 Error 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.5.3 Error 프로토타입 객체의 프로퍼티

Error 프로토타입 객체:

  • %Error.prototype%입니다.
  • 일반 객체입니다.
  • Error 인스턴스가 아니며 [[ErrorData]] 내부 슬롯을 갖지 않습니다.
  • [[Prototype]] 내부 슬롯의 값은 %Object.prototype%입니다.

20.5.3.1 Error.prototype.constructor

Error.prototype.constructor의 초기 값은 %Error%입니다.

20.5.3.2 Error.prototype.message

Error.prototype.message의 초기 값은 빈 문자열입니다.

20.5.3.3 Error.prototype.name

Error.prototype.name의 초기 값은 "Error"입니다.

20.5.3.4 Error.prototype.toString ( )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 설정합니다.
  2. O객체가 아니면 TypeError 예외를 throw합니다.
  3. name을 ? Get(O, "name")으로 설정합니다.
  4. nameundefined이면 name"Error"로, 아니면 ? ToString(name)으로 설정합니다.
  5. msg를 ? Get(O, "message")로 설정합니다.
  6. msgundefined이면 msg를 빈 문자열로, 아니면 ? ToString(msg)로 설정합니다.
  7. name이 빈 문자열이면 msg를 반환합니다.
  8. msg가 빈 문자열이면 name을 반환합니다.
  9. name과 코드 유닛 0x003A (COLON), 코드 유닛 0x0020 (SPACE), 그리고 msg문자열 연결해서 반환합니다.

20.5.4 Error 인스턴스의 프로퍼티

오류 인스턴스는 일반 객체로, Error 프로토타입 객체로부터 프로퍼티를 상속하고, [[ErrorData]] 내부 슬롯의 값은 undefined입니다. [[ErrorData]]의 유일하게 명시된 사용은 Object.prototype.toStringError.isError에서 Error, AggregateError, 그리고 NativeError 인스턴스를 Error 객체로 식별하는 것입니다.

20.5.5 이 표준에서 사용되는 네이티브 오류 타입

런타임 오류가 감지되면 아래의 NativeError 객체 또는 AggregateError 객체의 새 인스턴스가 throw됩니다. 모든 NativeError 객체는 20.5.6에서 설명된 동일한 구조를 공유합니다.

20.5.5.1 EvalError

EvalError 생성자%EvalError%입니다.

이 예외는 현재 명세에서 사용되지 않습니다. 이 객체는 이전 버전과의 호환성을 위해 남아 있습니다.

20.5.5.2 RangeError

RangeError 생성자%RangeError%입니다.

허용되는 값의 집합 또는 범위에 속하지 않는 값을 나타냅니다.

20.5.5.3 ReferenceError

ReferenceError 생성자%ReferenceError%입니다.

잘못된 참조가 감지되었음을 나타냅니다.

20.5.5.4 SyntaxError

SyntaxError 생성자%SyntaxError%입니다.

파싱 오류가 발생했음을 나타냅니다.

20.5.5.5 TypeError

TypeError 생성자%TypeError%입니다.

다른 NativeError 객체가 실패 원인을 적절하게 나타내지 않을 때, TypeError는 실패 원인을 나타내기 위해 사용됩니다.

20.5.5.6 URIError

URIError 생성자%URIError%입니다.

전역 URI 처리 함수 중 하나가 그 정의와 호환되지 않는 방식으로 사용됐음을 나타냅니다.

20.5.6 NativeError 객체 구조

이 객체들은 아래에 설명된 구조를 가지며, 생성자 이름과 프로토타입 객체의 "name" 프로퍼티에서만 이름이 다릅니다.

각 오류 객체에 대해 정의에서 NativeError에 대한 참조는 20.5.5의 해당 오류 객체 이름으로 대체되어야 합니다.

20.5.6.1 NativeError 생성자

NativeError 생성자:

  • 생성자가 아닌 함수로 호출될 때 새로운 NativeError 객체를 생성 및 초기화합니다. 객체를 함수로 호출하는 것은 동일한 인자로 생성자로 호출하는 것과 동일합니다. 따라서 NativeError(…) 함수 호출은 동일한 인자로 new NativeError(…) 객체 생성 표현식과 동일합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 NativeError 동작을 상속하려는 서브클래스 생성자[[ErrorData]] 내부 슬롯이 있는 서브클래스 인스턴스를 생성 및 초기화하기 위해 NativeError 생성자super 호출을 포함해야 합니다.

20.5.6.1.1 NativeError ( message [ , options ] )

NativeError 함수는 호출될 때 다음 단계를 수행합니다:

  1. NewTarget이 undefined이면 newTarget활성 함수 객체로 설정하고, 아니면 newTarget을 NewTarget으로 설정합니다.
  2. O를 ? OrdinaryCreateFromConstructor(newTarget, "%NativeError.prototype%", « [[ErrorData]] »)로 설정합니다.
  3. messageundefined가 아니면,
    1. msg를 ? ToString(message)로 설정합니다.
    2. CreateNonEnumerableDataPropertyOrThrow(O, "message", msg)를 수행합니다.
  4. InstallErrorCause(O, options)를 수행합니다.
  5. O를 반환합니다.

2 단계에 전달되는 문자열의 실제 값은 "%EvalError.prototype%", "%RangeError.prototype%", "%ReferenceError.prototype%", "%SyntaxError.prototype%", "%TypeError.prototype%", 또는 "%URIError.prototype%" 중 하나로, 정의되는 NativeError 생성자에 해당합니다.

20.5.6.2 NativeError 생성자의 프로퍼티

NativeError 생성자:

  • [[Prototype]] 내부 슬롯의 값은 %Error%입니다.
  • "name" 프로퍼티 값은 문자열 값 "NativeError"입니다.
  • 다음 프로퍼티를 가집니다:

20.5.6.2.1 NativeError.prototype

NativeError.prototype의 초기 값은 NativeError 프로토타입 객체 (20.5.6.3)입니다. 각 NativeError 생성자는 고유한 프로토타입 객체를 가집니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.5.6.3 NativeError 프로토타입 객체의 프로퍼티

NativeError 프로토타입 객체:

  • 일반 객체입니다.
  • Error 인스턴스가 아니며 [[ErrorData]] 내부 슬롯을 갖지 않습니다.
  • [[Prototype]] 내부 슬롯의 값은 %Error.prototype%입니다.

20.5.6.3.1 NativeError.prototype.constructor

특정 NativeError 생성자의 프로토타입의 "constructor" 프로퍼티의 초기 값은 생성자 자체입니다.

20.5.6.3.2 NativeError.prototype.message

특정 NativeError 생성자의 프로토타입의 "message" 프로퍼티의 초기 값은 빈 문자열입니다.

20.5.6.3.3 NativeError.prototype.name

특정 NativeError 생성자의 프로토타입의 "name" 프로퍼티의 초기 값은 생성자의 이름(정의 시 NativeError 대신 사용된 이름)입니다.

20.5.6.4 NativeError 인스턴스의 프로퍼티

NativeError 인스턴스는 일반 객체로, 고유한 NativeError 프로토타입 객체로부터 프로퍼티를 상속하고 [[ErrorData]] 내부 슬롯의 값은 undefined입니다. [[ErrorData]]의 유일하게 명시된 사용은 Object.prototype.toString (20.1.3.6) 및 Error.isError (20.5.2.1)에서 Error, AggregateError 또는 NativeError 인스턴스를 식별하는 것입니다.

20.5.7 AggregateError 객체

20.5.7.1 AggregateError 생성자

AggregateError 생성자:

  • %AggregateError%입니다.
  • 전역 객체"AggregateError" 프로퍼티의 초기 값입니다.
  • 생성자가 아닌 함수로 호출될 때 새로운 AggregateError 객체를 생성 및 초기화합니다. 따라서 AggregateError(…) 함수 호출은 동일한 인자로 new AggregateError(…) 객체 생성 표현식과 동일합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 AggregateError 동작을 상속하려는 서브클래스 생성자[[ErrorData]] 내부 슬롯이 있는 서브클래스 인스턴스를 생성 및 초기화하기 위해 AggregateError 생성자super 호출을 포함해야 합니다.

20.5.7.1.1 AggregateError ( errors, message [ , options ] )

이 함수가 호출될 때 다음 단계를 수행합니다:

  1. NewTarget이 undefined이면 newTarget활성 함수 객체로 설정하고, 아니면 newTarget을 NewTarget으로 설정합니다.
  2. O를 ? OrdinaryCreateFromConstructor(newTarget, "%AggregateError.prototype%", « [[ErrorData]] »)로 설정합니다.
  3. messageundefined가 아니면,
    1. msg를 ? ToString(message)로 설정합니다.
    2. CreateNonEnumerableDataPropertyOrThrow(O, "message", msg)를 수행합니다.
  4. InstallErrorCause(O, options)를 수행합니다.
  5. errorsList를 ? IteratorToList(? GetIterator(errors, sync))로 설정합니다.
  6. DefinePropertyOrThrow(O, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errorsList) }를 수행합니다.
  7. O를 반환합니다.

20.5.7.2 AggregateError 생성자의 프로퍼티

AggregateError 생성자:

  • [[Prototype]] 내부 슬롯의 값은 %Error%입니다.
  • 다음 프로퍼티를 가집니다:

20.5.7.2.1 AggregateError.prototype

AggregateError.prototype의 초기 값은 %AggregateError.prototype%입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

20.5.7.3 AggregateError 프로토타입 객체의 프로퍼티

AggregateError 프로토타입 객체:

  • %AggregateError.prototype%입니다.
  • 일반 객체입니다.
  • Error 인스턴스나 AggregateError 인스턴스가 아니며 [[ErrorData]] 내부 슬롯을 갖지 않습니다.
  • [[Prototype]] 내부 슬롯의 값은 %Error.prototype%입니다.

20.5.7.3.1 AggregateError.prototype.constructor

AggregateError.prototype.constructor의 초기 값은 %AggregateError%입니다.

20.5.7.3.2 AggregateError.prototype.message

AggregateError.prototype.message의 초기 값은 빈 문자열입니다.

20.5.7.3.3 AggregateError.prototype.name

AggregateError.prototype.name의 초기 값은 "AggregateError"입니다.

20.5.7.4 AggregateError 인스턴스의 프로퍼티

AggregateError 인스턴스는 일반 객체로, AggregateError 프로토타입 객체로부터 프로퍼티를 상속하고 [[ErrorData]] 내부 슬롯의 값은 undefined입니다. [[ErrorData]]의 유일하게 명시된 사용은 Object.prototype.toString (20.1.3.6) 및 Error.isError (20.5.2.1)에서 Error, AggregateError 또는 NativeError 인스턴스를 식별하는 것입니다.

20.5.8 Error 객체를 위한 추상 연산

20.5.8.1 InstallErrorCause ( O, options )

추상 연산 InstallErrorCause는 O(객체)와 options(ECMAScript 언어 값)를 인자로 받아 unused를 포함하는 정상 완료 또는 throw 완료를 반환합니다. options"cause" 프로퍼티가 있을 때 O"cause" 프로퍼티를 생성하기 위해 사용됩니다. 호출 시 다음 단계를 수행합니다:

  1. options객체이고HasProperty(options, "cause")가 true이면,
    1. cause를 ? Get(options, "cause")로 설정합니다.
    2. CreateNonEnumerableDataPropertyOrThrow(O, "cause", cause)를 수행합니다.
  2. unused를 반환합니다.

21 숫자와 날짜

21.1 Number 객체

21.1.1 Number 생성자

Number 생성자:

  • %Number%임.
  • "Number" 속성의 초기값임 글로벌 객체의.
  • 생성자로 호출될 때 새로운 Number 객체를 생성하고 초기화함.
  • 함수로 호출될 때 타입 변환을 수행함, 생성자로 호출되는 것이 아니라면.
  • 클래스 정의의 extends 절 값으로 사용될 수 있음. Number 생성자에 대한 super 호출을 포함해야 하며, [[NumberData]] 내부 슬롯으로 서브클래스 인스턴스를 생성/초기화함.

21.1.1.1 Number ( value )

이 함수는 호출 시 다음 단계를 수행함:

  1. value가 존재하면,
    1. prim에 ? ToNumeric(value)를 할당한다.
    2. prim BigInt인 경우, n𝔽((prim))을 할당한다.
    3. 그렇지 않으면 nprim을 할당한다.
  2. 그렇지 않으면,
    1. n+0𝔽을 할당한다.
  3. NewTarget이 undefined라면 n을 반환한다.
  4. O에 ? OrdinaryCreateFromConstructor(NewTarget, "%Number.prototype%", « [[NumberData]] » )를 할당한다.
  5. O.[[NumberData]]n으로 설정한다.
  6. O를 반환한다.

21.1.2 Number 생성자의 속성

Number 생성자:

  • [[Prototype]] 내부 슬롯이 있으며, 값은 %Function.prototype%임.
  • 다음과 같은 속성들을 가짐:

21.1.2.1 Number.EPSILON

Number.EPSILON의 값은 Number 값 중 1과 1보다 큰 가장 작은 값의 차이의 크기이며, 이는 약 2.2204460492503130808472633361816 × 10-16임.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.1.2.2 Number.isFinite ( number )

이 함수는 호출 시 다음 단계를 수행함:

  1. numberNumber가 아니면, false를 반환한다.
  2. number유한 값이 아니면, false를 반환한다.
  3. 그렇지 않으면 true를 반환한다.

21.1.2.3 Number.isInteger ( number )

이 함수는 호출 시 다음 단계를 수행함:

  1. number정수 Number라면, true를 반환한다.
  2. false를 반환한다.

21.1.2.4 Number.isNaN ( number )

이 함수는 호출 시 다음 단계를 수행함:

  1. numberNumber가 아니면, false를 반환한다.
  2. numberNaN이면, true를 반환한다.
  3. 그렇지 않으면 false를 반환한다.
참고

이 함수는 전역 isNaN 함수 (19.2.3)와 다르게, 인수를 Number로 변환하지 않고 NaN 여부를 판단함.

21.1.2.5 Number.isSafeInteger ( number )

참고

정수 n이 " 안전한 정수 "이려면 Number 값 nNumber 값인 다른 정수와 같지 않아야 함.

이 함수는 호출 시 다음 단계를 수행함:

  1. number정수 Number이면,
    1. abs((number)) ≤ 253 - 1이면, true를 반환한다.
  2. false를 반환한다.

21.1.2.6 Number.MAX_SAFE_INTEGER

참고

IEEE 754-2019의 정밀도 제한으로 인해, Number 값정수 Number.MAX_SAFE_INTEGER보다 크면, 적어도 하나의 다른 정수와 값을 공유하게 된다. 이런 큰 정수안전하지 않음이며, Number 값으로 정확히 표현되거나 서로 구분될 것이라 보장할 수 없음. 예시로 90071992547409929007199254740993 모두 9007199254740992𝔽 값을 가짐.

Number.MAX_SAFE_INTEGER의 값은 9007199254740991𝔽 (𝔽(253 - 1))임.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.1.2.7 Number.MAX_VALUE

Number.MAX_VALUE의 값은 유한한 값 중 Number 타입의 가장 큰 양수 값이며, 이는 약 1.7976931348623157 × 10308임.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.1.2.8 Number.MIN_SAFE_INTEGER

참고

IEEE 754-2019의 정밀도 제한으로 인해, Number 값정수 Number.MIN_SAFE_INTEGER보다 작으면, 적어도 하나의 다른 정수와 값을 공유하게 된다. 이런 큰 음수 정수안전하지 않음이며, Number 값으로 정확히 표현되거나 서로 구분될 것이라 보장할 수 없음. 예시로 -9007199254740992-9007199254740993 모두 -9007199254740992𝔽 값을 가짐.

Number.MIN_SAFE_INTEGER의 값은 -9007199254740991𝔽 (𝔽(-(253 - 1)))임.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.1.2.9 Number.MIN_VALUE

Number.MIN_VALUE의 값은 Number 타입의 가장 작은 양수 값이며, 이는 약 5 × 10-324임.

IEEE 754-2019의 배정밀도 이진 표현에서 가장 작은 값은 비정규화된 숫자임. 만약 구현이 비정규화 값을 지원하지 않으면 Number.MIN_VALUE의 값은 구현이 실제로 표현할 수 있는 가장 작은 0이 아닌 양수 값이어야 함.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.1.2.10 Number.NaN

Number.NaN의 값은 NaN임.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.1.2.11 Number.NEGATIVE_INFINITY

Number.NEGATIVE_INFINITY의 값은 -∞𝔽임.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.1.2.12 Number.parseFloat ( string )

"parseFloat" 속성의 초기값은 %parseFloat%임.

21.1.2.13 Number.parseInt ( string, radix )

"parseInt" 속성의 초기값은 %parseInt%임.

21.1.2.14 Number.POSITIVE_INFINITY

Number.POSITIVE_INFINITY의 값은 +∞𝔽임.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.1.2.15 Number.prototype

Number.prototype의 초기값은 Number 프로토타입 객체임.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.1.3 Number 프로토타입 객체의 속성

Number 프로토타입 객체:

  • %Number.prototype%임.
  • 일반 객체임.
  • 스스로 Number 객체이며, [[NumberData]] 내부 슬롯 값은 +0𝔽임.
  • [[Prototype]] 내부 슬롯 값은 %Object.prototype%임.

특별히 명시하지 않으면, 아래 정의된 Number 프로토타입 객체의 메서드는 제네릭이 아니며, this 값은 반드시 Number 값 또는 [[NumberData]] 내부 슬롯이 Number 값으로 초기화된 객체여야 함.

메서드 명세 내 "this Number 값"이라는 표현은 추상 연산 ThisNumberValue를 해당 메서드 호출의 this 값으로 호출한 결과임.

21.1.3.1 Number.prototype.constructor

Number.prototype.constructor의 초기값은 %Number%입니다.

21.1.3.2 Number.prototype.toExponential ( fractionDigits )

이 메서드는 이 Number 값을 십진수 지수 표기법으로 표현한 문자열을 반환합니다. 지수 앞에는 한 자리, fractionDigits 이후로는 fractionDigits 개의 자릿수가 나타납니다. fractionDigitsundefined인 경우, 그 Number를 고유하게 지정하기 위해 필요한 만큼의 자릿수를 포함합니다 (ToString처럼, 단 이 경우 항상 지수 표기법으로 출력됨).

호출될 때 다음 단계를 수행합니다:

  1. x에 ? ThisNumberValue(this 값)을 할당한다.
  2. f에 ? ToIntegerOrInfinity(fractionDigits)를 할당한다.
  3. Assert: fractionDigitsundefined이면 f는 0이다.
  4. x유한 값이 아니면, Number::toString(x, 10)을 반환한다.
  5. f < 0 또는 f > 100이면 RangeError 예외를 던진다.
  6. x(x)로 설정한다.
  7. s를 빈 문자열로 할당한다.
  8. x < 0이면
    1. s"-"를 할당한다.
    2. x를 -x로 설정한다.
  9. x = 0이면
    1. mf + 1 개의 코드 유닛 0x0030(DIGIT ZERO)로 구성된 문자열을 할당한다.
    2. e에 0을 할당한다.
  10. 그 외에는,
    1. fractionDigitsundefined가 아니면
      1. 10fn < 10f + 1 이면서, n × 10e - f - x가 0에 가장 가까운 en정수로 할당한다. 만약 두 쌍이 있다면, n × 10e - f가 더 큰 쌍을 선택한다.
    2. 그 외에는
      1. ff ≥ 0, 10ffn < 10ff + 1, 𝔽(n × 10e - ff)가 𝔽(x)이며, ff가 가장 작은 e, n, ff정수로 할당한다. n의 십진수 표현의 자릿수는 ff+1이고, n은 10으로 나누어떨어지지 않으며, 가장 끝의 숫자가 고유하게 결정되지 않을 수 있음.
      2. fff로 설정한다.
    3. mn의 십진수 표현(앞자리 0 없이)의 문자열을 할당한다.
  11. f ≠ 0이면
    1. am의 첫 번째 코드 유닛으로 할당한다.
    2. bm의 나머지 f개의 코드 유닛으로 할당한다.
    3. mstring-concatenation을 이용해 a, ".", b를 이어붙인다.
  12. e = 0이면
    1. c"+"를 할당한다.
    2. d"0"를 할당한다.
  13. 그 외에는,
    1. e > 0이면
      1. c"+"를 할당한다.
    2. 그 외에는
      1. Assert: e < 0.
      2. c"-"를 할당한다.
      3. e를 -e로 설정한다.
    3. de의 십진수 표현(앞자리 0 없이) 문자열로 할당한다.
  14. mstring-concatenation을 이용해 m, "e", c, d를 이어붙인다.
  15. string-concatenation을 이용해 sm을 이어붙인 값을 반환한다.
참고

위 규칙보다 더 정확한 변환을 제공하는 구현의 경우, 아래 대안 step 10.b.i를 지침으로 사용하는 것이 권장됩니다:

  1. f ≥ 0, 10fn < 10f + 1, 𝔽(n × 10e - f)가 𝔽(x)이며, f가 가장 작은 e, n, f정수로 할당한다. n 후보가 여러 개일 경우, 𝔽(n × 10e - f)가 𝔽(x)에 가장 가까운 값을 선택한다. 두 개가 있으면 짝수인 값을 고른다.

21.1.3.3 Number.prototype.toFixed ( fractionDigits )

참고 1

이 메서드는 이 Number 값을 십진수 고정 소수점 표기법으로 표현한 문자열을 반환하며, 소수점 이하 fractionDigits 개의 자릿수를 포함합니다. fractionDigitsundefined이면 0으로 간주됩니다.

호출될 때 다음 단계를 수행합니다:

  1. x에 ? ThisNumberValue(this 값)을 할당한다.
  2. f에 ? ToIntegerOrInfinity(fractionDigits)를 할당한다.
  3. Assert: fractionDigitsundefined이면 f는 0이다.
  4. f유한 값이 아니면 RangeError 예외를 던진다.
  5. f < 0 또는 f > 100이면 RangeError 예외를 던진다.
  6. x유한 값이 아니면 Number::toString(x, 10)을 반환한다.
  7. x(x)로 설정한다.
  8. s를 빈 문자열로 할당한다.
  9. x < 0이면
    1. s"-"를 할당한다.
    2. x를 -x로 설정한다.
  10. x ≥ 1021이면
    1. m에 ! ToString(𝔽(x))을 할당한다.
  11. 그 외에는,
    1. nn / 10f - x가 0에 가장 가까운 정수로 할당한다. 두 개라면 더 큰 n을 선택한다.
    2. n = 0이면 m"0"을, 아니면 n의 십진수 표현(앞자리 0 없음) 문자열을 할당한다.
    3. f ≠ 0이면
      1. km의 길이를 할당한다.
      2. kf이면
        1. zf + 1 - k 만큼 코드 유닛 0x0030(DIGIT ZERO)으로 구성된 문자열을 할당한다.
        2. mstring-concatenation을 이용해 zm을 이어붙인다.
        3. kf + 1로 설정한다.
      3. am의 처음 k - f 개의 코드 유닛을 할당한다.
      4. bm의 나머지 f 개의 코드 유닛을 할당한다.
      5. mstring-concatenation을 이용해 a, ".", b를 이어붙인다.
  12. string-concatenation을 이용해 sm을 이어붙인 값을 반환한다.
참고 2

toFixed의 출력은 일부 값에서 toString보다 더 정확할 수 있습니다. toString은 인접 Number 값들과 구별할 만큼만 유효 자릿수를 출력합니다. 예를 들어,

(1000000000000000128).toString()"1000000000000000100"을 반환하지만,
(1000000000000000128).toFixed(0)"1000000000000000128"을 반환합니다.

21.1.3.4 Number.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 국제화 API를 포함한 ECMAScript 구현은 ECMA-402 명세에 따라 이 메서드를 구현해야 합니다. ECMA-402 API가 포함되지 않은 구현에서는 아래 명세를 따릅니다:

이 메서드는 현재 호스트 환경 로캘의 규칙에 따라 이 Number 값을 포맷한 문자열을 반환합니다. 이 메서드는 구현 정의이며, toString과 동일한 값을 반환해도 허용되지만 권장하지는 않습니다.

이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 매개변수 위치를 다른 용도로 사용하면 안 됩니다.

21.1.3.5 Number.prototype.toPrecision ( precision )

이 메서드는 이 Number 값을 십진수 지수 표기법(지수 앞에 한 자리, precision - 1 개의 소수점 이하 자릿수) 또는 precision개의 유효 자릿수를 가진 고정 소수점 표기법으로 표현한 문자열을 반환합니다. precisionundefined이면 ToString을 호출합니다.

호출될 때 다음 단계를 수행합니다:

  1. x에 ? ThisNumberValue(this 값)을 할당한다.
  2. precisionundefined이면 ! ToString(x)을 반환한다.
  3. p에 ? ToIntegerOrInfinity(precision)을 할당한다.
  4. x유한 값이 아니면 Number::toString(x, 10)을 반환한다.
  5. p < 1 또는 p > 100이면 RangeError 예외를 던진다.
  6. x(x)로 설정한다.
  7. s를 빈 문자열로 할당한다.
  8. x < 0이면
    1. 코드 유닛 0x002D(HYPHEN-MINUS)를 s에 할당한다.
    2. x를 -x로 설정한다.
  9. x = 0이면
    1. mp 개의 코드 유닛 0x0030(DIGIT ZERO)로 구성된 문자열을 할당한다.
    2. e에 0을 할당한다.
  10. 그 외에는,
    1. 10p - 1n < 10p이고, n × 10e - p + 1 - x가 0에 가장 가까운 e, n정수로 할당한다. 두 쌍이 있다면, n × 10e - p + 1이 더 큰 쌍을 선택한다.
    2. mn의 십진수 표현(앞자리 0 없음) 문자열을 할당한다.
    3. e < -6 또는 ep이면
      1. Assert: e ≠ 0.
      2. p ≠ 1이면
        1. am의 첫 번째 코드 유닛을 할당한다.
        2. bm의 나머지 p - 1개 코드 유닛을 할당한다.
        3. mstring-concatenation을 이용해 a, ".", b를 이어붙인다.
      3. e > 0이면
        1. 코드 유닛 0x002B(PLUS SIGN)를 c에 할당한다.
      4. 그 외에는
        1. Assert: e < 0.
        2. 코드 유닛 0x002D(HYPHEN-MINUS)를 c에 할당한다.
        3. e를 -e로 설정한다.
      5. de의 십진수 표현(앞자리 0 없음) 문자열로 할당한다.
      6. string-concatenation을 이용해 s, m, 코드 유닛 0x0065('e'), c, d를 이어붙인 값을 반환한다.
  11. e = p - 1이면 string-concatenation을 이용해 sm을 이어붙인 값을 반환한다.
  12. e ≥ 0이면
    1. mstring-concatenation을 이용해 m의 처음 e+1개 코드 유닛, 코드 유닛 0x002E(FULL STOP), 나머지 p-(e+1)개 코드 유닛을 이어붙인다.
  13. 그 외에는,
    1. mstring-concatenation을 이용해 코드 유닛 0x0030(DIGIT ZERO), 코드 유닛 0x002E(FULL STOP), -(e + 1) 개의 코드 유닛 0x0030(DIGIT ZERO), 그리고 m 문자열을 이어붙인다.
  14. string-concatenation을 이용해 sm을 이어붙인 값을 반환한다.

21.1.3.6 Number.prototype.toString ( [ radix ] )

참고

선택적 radix정수 Number 값이어야 하며, 2에서 36까지의 구간 내에 있어야 합니다. radixundefined이면 10𝔽이 사용됩니다.

이 메서드는 호출 시 다음 단계를 수행합니다:

  1. x에 ? ThisNumberValue(this 값)을 할당한다.
  2. radixundefined이면 radixMV를 10으로 할당한다.
  3. 그 외에는 radixMV에 ? ToIntegerOrInfinity(radix)를 할당한다.
  4. radixMV가 2~36 구간에 포함되지 않으면 RangeError 예외를 던진다.
  5. Number::toString(x, radixMV)를 반환한다.

이 메서드는 제네릭이 아니며, this 값이 Number 또는 Number 객체가 아니면 TypeError 예외를 던집니다. 따라서 다른 종류의 객체에 이 메서드를 전달해 사용할 수 없습니다.

이 메서드의 "length" 속성은 1𝔽입니다.

21.1.3.7 Number.prototype.valueOf ( )

  1. ThisNumberValue(this 값)을 반환한다.

21.1.3.7.1 ThisNumberValue ( value )

ThisNumberValue 추상 연산은 value ( ECMAScript 언어 값 ) 인수를 받아, Number를 포함하는 정상 완료 또는 throw 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. valueNumber이면 value를 반환한다.
  2. value객체이고 value[[NumberData]] 내부 슬롯이 있으면,
    1. nvalue.[[NumberData]]를 할당한다.
    2. Assert: nNumber임을 보장한다.
    3. n을 반환한다.
  3. TypeError 예외를 던진다.

21.1.4 Number 인스턴스의 속성

Number 인스턴스는 일반 객체이며, Number 프로토타입 객체로부터 속성을 상속받습니다. 또한 [[NumberData]] 내부 슬롯을 가지며, 이 슬롯 값이 이 Number 객체가 나타내는 Number 값입니다.

21.2 BigInt 객체

21.2.1 BigInt 생성자

BigInt 생성자:

  • %BigInt%임.
  • "BigInt" 속성의 초기값이며, 전역 객체에 존재함.
  • 함수로 호출될 때 타입 변환을 수행하며, 생성자로 호출되는 것이 아님.
  • new 연산자와 함께 사용하거나 서브클래싱 목적으로 설계되지 않았음. 클래스 정의의 extends 값으로 사용할 수 있지만, BigInt 생성자에 대한 super 호출은 예외를 발생시킴.

21.2.1.1 BigInt ( value )

이 함수는 호출 시 다음 단계를 수행합니다:

  1. NewTarget이 undefined가 아니면 TypeError 예외를 던진다.
  2. prim에 ? ToPrimitive(value, number)를 할당한다.
  3. primNumber이면, ? NumberToBigInt(prim)을 반환한다.
  4. 그 외에는 ? ToBigInt(prim)을 반환한다.

21.2.1.1.1 NumberToBigInt ( number )

NumberToBigInt 추상 연산은 number(Number)를 인수로 받아 BigInt를 포함하는 정상 완료 또는 throw 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. number정수 Number가 아니면, RangeError 예외를 던진다.
  2. ((number))를 반환한다.

21.2.2 BigInt 생성자의 속성

BigInt 생성자:

  • [[Prototype]] 내부 슬롯이 있으며, 값은 %Function.prototype%임.
  • 다음과 같은 속성들을 가짐:

21.2.2.1 BigInt.asIntN ( bits, bigint )

이 함수는 호출 시 다음 단계를 수행합니다:

  1. bits에 ? ToIndex(bits)를 할당한다.
  2. bigint에 ? ToBigInt(bigint)를 할당한다.
  3. mod(bigint) modulo 2bits를 할당한다.
  4. mod ≥ 2bits - 1이면 (mod - 2bits)를 반환하고, 아니면 (mod)를 반환한다.

21.2.2.2 BigInt.asUintN ( bits, bigint )

이 함수는 호출 시 다음 단계를 수행합니다:

  1. bits에 ? ToIndex(bits)를 할당한다.
  2. bigint에 ? ToBigInt(bigint)를 할당한다.
  3. ((bigint) modulo 2bits)를 반환한다.

21.2.2.3 BigInt.prototype

BigInt.prototype의 초기값은 BigInt 프로토타입 객체임.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.2.3 BigInt 프로토타입 객체의 속성

BigInt 프로토타입 객체:

메서드 명세 내 "this BigInt 값"이라는 표현은 ThisBigIntValue를 해당 메서드 호출의 this 값으로 호출한 결과임.

21.2.3.1 BigInt.prototype.constructor

BigInt.prototype.constructor의 초기값은 %BigInt%임.

21.2.3.2 BigInt.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMA-402 국제화 API를 포함한 ECMAScript 구현은 ECMA-402 명세에 따라 이 메서드를 구현해야 합니다. ECMA-402 API를 포함하지 않은 구현에서는 아래 명세를 따릅니다:

이 메서드는 현재 호스트 환경의 로캘 규칙에 따라 이 BigInt 값을 포맷한 문자열을 반환합니다. 이 메서드는 구현 정의이며, toString과 동일한 값을 반환해도 허용되지만 권장하지는 않습니다.

이 메서드의 선택적 매개변수 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 매개변수 위치를 다른 용도로 사용하면 안 됩니다.

21.2.3.3 BigInt.prototype.toString ( [ radix ] )

참고

선택적 radix정수 Number 값이어야 하며, 2에서 36까지의 구간 내에 있어야 합니다. radixundefined이면 10𝔽이 사용됩니다.

이 메서드는 호출 시 다음 단계를 수행합니다:

  1. x에 ? ThisBigIntValue(this 값)을 할당한다.
  2. radixundefined이면 radixMV를 10으로 할당한다.
  3. 그 외에는 radixMV에 ? ToIntegerOrInfinity(radix)를 할당한다.
  4. radixMV가 2~36 구간에 포함되지 않으면 RangeError 예외를 던진다.
  5. BigInt::toString(x, radixMV)를 반환한다.

이 메서드는 제네릭이 아니며, this 값이 BigInt 또는 BigInt 객체가 아니면 TypeError 예외를 던집니다. 따라서 다른 종류의 객체에 이 메서드를 전달해 사용할 수 없습니다.

21.2.3.4 BigInt.prototype.valueOf ( )

  1. ThisBigIntValue(this 값)을 반환한다.

21.2.3.4.1 ThisBigIntValue ( value )

ThisBigIntValue 추상 연산은 value ( ECMAScript 언어 값 ) 인수를 받아, BigInt를 포함하는 정상 완료 또는 throw 완료를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. valueBigInt이면 value를 반환한다.
  2. value객체이고 value[[BigIntData]] 내부 슬롯이 있으면,
    1. Assert: value.[[BigIntData]]BigInt임을 보장한다.
    2. value.[[BigIntData]]를 반환한다.
  3. TypeError 예외를 던진다.

21.2.3.5 BigInt.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 문자열 "BigInt"입니다.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }임.

21.2.4 BigInt 인스턴스의 속성

BigInt 인스턴스는 일반 객체이며, BigInt 프로토타입 객체로부터 속성을 상속받습니다. 또한 [[BigIntData]] 내부 슬롯을 가지며, 이 슬롯 값이 이 BigInt 객체가 나타내는 BigInt 값입니다.

21.3 Math 객체

Math 객체:

  • %Math%임.
  • "Math" 속성의 초기값이며, 글로벌 객체에 있음.
  • 일반 객체임.
  • [[Prototype]] 내부 슬롯이 있으며, 값은 %Object.prototype%임.
  • 함수 객체가 아님.
  • [[Construct]] 내부 메서드가 없으며, new 연산자와 함께 생성자로 사용할 수 없음.
  • [[Call]] 내부 메서드가 없으며, 함수로 호출할 수 없음.
참고

이 명세에서 “x의 Number 값”라는 문구는 6.1.6.1에 정의된 기술적 의미를 가짐.

21.3.1 Math 객체의 값 속성

21.3.1.1 Math.E

e의 Number 값, 자연로그의 밑, 약 2.7182818284590452354.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.3.1.2 Math.LN10

10의 자연로그의 Number 값, 약 2.302585092994046.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.3.1.3 Math.LN2

2의 자연로그의 Number 값, 약 0.6931471805599453.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.3.1.4 Math.LOG10E

e의 상용로그의 Number 값, 자연로그의 밑의 상용로그; 약 0.4342944819032518.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

참고

Math.LOG10E의 값은 Math.LN10의 값의 역수에 가까움.

21.3.1.5 Math.LOG2E

e의 밑이 2인 로그의 Number 값, 자연로그의 밑의 밑이 2인 로그; 약 1.4426950408889634.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

참고

Math.LOG2E의 값은 Math.LN2의 값의 역수에 가까움.

21.3.1.6 Math.PI

π의 Number 값, 원의 둘레와 지름의 비율, 약 3.1415926535897932.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.3.1.7 Math.SQRT1_2

½의 제곱근의 Number 값, 약 0.7071067811865476.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

참고

Math.SQRT1_2의 값은 Math.SQRT2의 값의 역수에 가까움.

21.3.1.8 Math.SQRT2

2의 제곱근의 Number 값, 약 1.4142135623730951.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }임.

21.3.1.9 Math [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 문자열 "Math"임.

이 속성의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }임.

21.3.2 Math 객체의 함수 속성

참고

acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, cos, cosh, exp, expm1, hypot, log, log1p, log2, log10, pow, random, sin, sinh, tan, tanh 함수의 동작은 여기서 정확하게 명세되어 있지 않으며, 경계값에 대해 특정 결과만 요구됩니다. 그 외의 인자 값에 대해서는 일반적인 수학 함수의 근삿값을 계산하도록 되어 있으나, 근사 알고리즘 선택에는 여지가 있습니다. 일반적인 의도는 구현자가 해당 하드웨어 플랫폼의 C 프로그래머가 사용할 수 있는 수학 라이브러리를 ECMAScript에 사용할 수 있도록 하는 것입니다.

알고리즘 선택은 구현에 맡기지만, IEEE 754-2019 산술에 대한 근사 알고리즘으로 Sun Microsystems의 자유 배포 수학 라이브러리 fdlibm (http://www.netlib.org/fdlibm) 사용을 권장합니다(명세상 필수는 아님).

21.3.2.1 Math.abs ( x )

이 함수는 x의 절댓값을 반환합니다; 결과는 x와 크기는 같으나 부호는 양수입니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN이면 NaN을 반환한다.
  3. n-0𝔽이면 +0𝔽을 반환한다.
  4. n-∞𝔽이면 +∞𝔽을 반환한다.
  5. n < -0𝔽이면 -n을 반환한다.
  6. n을 반환한다.

21.3.2.2 Math.acos ( x )

이 함수는 x의 아크코사인(역삼각함수 cos-1)을 반환합니다. 결과는 라디안 단위이며 +0𝔽에서 𝔽(π)까지의 구간에 있습니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN이거나 n > 1𝔽이거나 n < -1𝔽이면 NaN을 반환한다.
  3. n1𝔽이면 +0𝔽을 반환한다.
  4. 구현 근삿값 Number 값을 반환하는데, (n)의 아크코사인임.

21.3.2.3 Math.acosh ( x )

이 함수는 x의 역쌍곡코사인(아크코사인 하이퍼볼릭)을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN 또는 +∞𝔽이면 n을 반환한다.
  3. n1𝔽이면 +0𝔽을 반환한다.
  4. n < 1𝔽이면 NaN을 반환한다.
  5. 구현 근삿값 Number 값을 반환하는데, (n)의 역쌍곡코사인임.

21.3.2.4 Math.asin ( x )

이 함수는 x의 아크사인(역삼각함수 sin-1)을 반환합니다. 결과는 라디안 단위이며 -π/2에서 π/2까지의 구간에 있습니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN, +0𝔽, -0𝔽 중 하나이면 n을 반환한다.
  3. n > 1𝔽 또는 n < -1𝔽이면 NaN을 반환한다.
  4. 구현 근삿값 Number 값을 반환하는데, (n)의 아크사인임.

21.3.2.5 Math.asinh ( x )

이 함수는 x의 역쌍곡사인(아크사인 하이퍼볼릭)을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. n유한 값이 아니거나 n+0𝔽 또는 -0𝔽이면 n을 반환한다.
  3. 구현 근삿값 Number 값을 반환하는데, (n)의 역쌍곡사인임.

21.3.2.6 Math.atan ( x )

이 함수는 x의 아크탄젠트(역삼각함수 tan-1)를 반환합니다. 결과는 라디안 단위이며 -π/2에서 π/2까지의 구간에 있습니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN, +0𝔽, -0𝔽 중 하나이면 n을 반환한다.
  3. n+∞𝔽이면 구현 근삿값 Number 값으로 π/2를 반환한다.
  4. n-∞𝔽이면 구현 근삿값 Number 값으로 -π/2를 반환한다.
  5. 구현 근삿값 Number 값을 반환하는데, (n)의 아크탄젠트임.

21.3.2.7 Math.atanh ( x )

이 함수는 x의 역쌍곡탄젠트(아크탄젠트 하이퍼볼릭)를 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN, +0𝔽, -0𝔽 중 하나이면 n을 반환한다.
  3. n > 1𝔽 또는 n < -1𝔽이면 NaN을 반환한다.
  4. n1𝔽이면 +∞𝔽을 반환한다.
  5. n-1𝔽이면 -∞𝔽을 반환한다.
  6. 구현 근삿값 Number 값을 반환하는데, (n)의 역쌍곡탄젠트임.

21.3.2.8 Math.atan2 ( y, x )

이 함수는 인자 yx의 몫 y / x의 아크탄젠트(역삼각함수 tan-1)를 반환합니다. yx의 부호로 결과의 사분면이 결정됩니다. 두 인자에서 y가 먼저, x가 두 번째임은 의도적이고 전통적입니다. 결과는 라디안 단위이며 -π에서 +π까지의 구간에 있습니다.

호출 시 다음 단계를 수행합니다:

  1. ny에 ? ToNumber(y)를 할당한다.
  2. nx에 ? ToNumber(x)를 할당한다.
  3. nyNaN이거나 nxNaN이면 NaN을 반환한다.
  4. ny+∞𝔽이면,
    1. nx+∞𝔽이면 구현 근삿값 Number 값으로 π/4를 반환한다.
    2. nx-∞𝔽이면 구현 근삿값 Number 값으로 3π/4를 반환한다.
    3. 그 외에는 구현 근삿값 Number 값으로 π/2를 반환한다.
  5. ny-∞𝔽이면,
    1. nx+∞𝔽이면 구현 근삿값 Number 값으로 -π/4를 반환한다.
    2. nx-∞𝔽이면 구현 근삿값 Number 값으로 -3π/4를 반환한다.
    3. 그 외에는 구현 근삿값 Number 값으로 -π/2를 반환한다.
  6. ny+0𝔽이면,
    1. nx > +0𝔽 또는 nx+0𝔽이면 +0𝔽을 반환한다.
    2. 그 외에는 구현 근삿값 Number 값으로 π를 반환한다.
  7. ny-0𝔽이면,
    1. nx > +0𝔽 또는 nx+0𝔽이면 -0𝔽을 반환한다.
    2. 그 외에는 구현 근삿값 Number 값으로 -π를 반환한다.
  8. Assert: ny유한 값이며 +0𝔽 또는 -0𝔽이 아님.
  9. ny > +0𝔽이면,
    1. nx+∞𝔽이면 +0𝔽을 반환한다.
    2. nx-∞𝔽이면 구현 근삿값 Number 값으로 π를 반환한다.
    3. nx+0𝔽 또는 -0𝔽이면 구현 근삿값 Number 값으로 π/2를 반환한다.
  10. ny < -0𝔽이면,
    1. nx+∞𝔽이면 -0𝔽을 반환한다.
    2. nx-∞𝔽이면 구현 근삿값 Number 값으로 -π를 반환한다.
    3. nx+0𝔽 또는 -0𝔽이면 구현 근삿값 Number 값으로 -π/2를 반환한다.
  11. Assert: nx유한 값이며 +0𝔽 또는 -0𝔽이 아님.
  12. rabs((ny) / (nx))의 아크탄젠트를 할당한다.
  13. nx < -0𝔽이면,
    1. ny > +0𝔽이면 r을 π - r로 설정한다.
    2. 그 외에는 r을 -π + r로 설정한다.
  14. 그 외에는,
    1. ny < -0𝔽이면 r을 -r로 설정한다.
  15. 구현 근삿값 Number 값으로 r을 반환한다.

21.3.2.9 Math.cbrt ( x )

이 함수는 x의 세제곱근을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. n유한 값이 아니거나 n+0𝔽 또는 -0𝔽이면, n을 반환한다.
  3. 구현 근삿값 Number 값을 반환하는데, (n)의 세제곱근임.

21.3.2.10 Math.ceil ( x )

이 함수는 x보다 작지 않은 가장 작은(음의 무한대에 가장 가까운) 정수 Number 값을 반환합니다. x가 이미 정수 Number이면, 결과는 x입니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. n유한 값이 아니거나 n+0𝔽 또는 -0𝔽이면, n을 반환한다.
  3. n < -0𝔽이고 n > -1𝔽이면, -0𝔽을 반환한다.
  4. n정수 Number이면, n을 반환한다.
  5. n보다 작지 않은 가장 작은(음의 무한대에 가장 가까운) 정수 Number 값을 반환한다.
참고

Math.ceil(x)의 값은 -Math.floor(-x)의 값과 같습니다.

21.3.2.11 Math.clz32 ( x )

이 함수는 호출 시 다음 단계를 수행합니다:

  1. n에 ? ToUint32(x)를 할당한다.
  2. pn의 부호 없는 32비트 이진 표현에서 앞에 오는 0 비트 개수를 할당한다.
  3. 𝔽(p)를 반환한다.
참고

n+0𝔽 또는 -0𝔽이면, 이 메서드는 32𝔽를 반환합니다. n의 32비트 이진 인코딩의 최상위 비트가 1이면, 이 메서드는 +0𝔽을 반환합니다.

21.3.2.12 Math.cos ( x )

이 함수는 x의 코사인 값을 반환합니다. 인자는 라디안 단위입니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. n유한 값이 아니면, NaN을 반환한다.
  3. n+0𝔽 또는 -0𝔽이면, 1𝔽을 반환한다.
  4. 구현 근삿값 Number 값을 반환하는데, (n)의 코사인임.

21.3.2.13 Math.cosh ( x )

이 함수는 x의 쌍곡코사인 값을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN이면, NaN을 반환한다.
  3. n+∞𝔽 또는 -∞𝔽이면, +∞𝔽을 반환한다.
  4. n+0𝔽 또는 -0𝔽이면, 1𝔽을 반환한다.
  5. 구현 근삿값 Number 값을 반환하는데, (n)의 쌍곡코사인임.
참고

Math.cosh(x)의 값은 (Math.exp(x) + Math.exp(-x)) / 2의 값과 같습니다.

21.3.2.14 Math.exp ( x )

이 함수는 x의 지수 함수 값을 반환합니다 (ex 제곱한 값, e는 자연로그의 밑).

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN 또는 +∞𝔽이면, n을 반환한다.
  3. n+0𝔽 또는 -0𝔽이면, 1𝔽을 반환한다.
  4. n-∞𝔽이면, +0𝔽을 반환한다.
  5. 구현 근삿값 Number 값을 반환하는데, (n)의 지수 함수임.

21.3.2.15 Math.expm1 ( x )

이 함수는 x의 지수 함숫값에서 1을 뺀 값을 반환합니다 (ex 제곱한 값에서 1을 뺌, e는 자연로그의 밑). x가 0에 가까울 때도 정확하게 계산되도록 설계되어 있습니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN, +0𝔽, -0𝔽, +∞𝔽 중 하나이면, n을 반환한다.
  3. n-∞𝔽이면, -1𝔽을 반환한다.
  4. exp(n)의 지수 함수 값을 할당한다.
  5. 구현 근삿값 Number 값을 반환하는데, exp - 1임.

21.3.2.16 Math.floor ( x )

이 함수는 x보다 크지 않은 가장 큰(양의 무한대에 가장 가까운) 정수 Number 값을 반환합니다. x가 이미 정수 Number이면, 결과는 x입니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. n유한 값이 아니거나 n+0𝔽 또는 -0𝔽이면, n을 반환한다.
  3. n < 1𝔽이고 n > +0𝔽이면, +0𝔽을 반환한다.
  4. n정수 Number이면, n을 반환한다.
  5. n보다 크지 않은 가장 큰(양의 무한대에 가장 가까운) 정수 Number 값을 반환한다.
참고

Math.floor(x)의 값은 -Math.ceil(-x)의 값과 같습니다.

21.3.2.17 Math.fround ( x )

이 함수는 호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN이면, NaN을 반환한다.
  3. n+0𝔽, -0𝔽, +∞𝔽, -∞𝔽 중 하나이면, n을 반환한다.
  4. n32nIEEE 754-2019 binary32 형식으로 roundTiesToEven 모드로 변환한 결과를 할당한다.
  5. n64n32IEEE 754-2019 binary64 형식으로 변환한 결과를 할당한다.
  6. n64에 해당하는 ECMAScript Number 값을 반환한다.

21.3.2.18 Math.f16round ( x )

이 함수는 호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN이면, NaN을 반환한다.
  3. n+0𝔽, -0𝔽, +∞𝔽, -∞𝔽 중 하나이면, n을 반환한다.
  4. n16nIEEE 754-2019 binary16 형식으로 roundTiesToEven 모드로 변환한 결과를 할당한다.
  5. n64n16IEEE 754-2019 binary64 형식으로 변환한 결과를 할당한다.
  6. n64에 해당하는 ECMAScript Number 값을 반환한다.
참고

이 연산은 binary32로 캐스팅한 뒤 binary16으로 캐스팅하는 것과 동일하지 않습니다. 이중 반올림(double-rounding)이 발생할 수 있기 때문입니다: 예를 들어 k = 1.00048828125000022204𝔽의 경우, Math.f16round(k)는 1.0009765625𝔽이지만 Math.f16round(Math.fround(k))는 1𝔽입니다.

모든 플랫폼이 binary64에서 binary16으로의 캐스팅을 기본 지원하지는 않습니다. 이를 위한 다양한 라이브러리가 있으며, MIT 라이선스의 half 라이브러리 등이 있습니다. 또는 binary64를 roundTiesToEven으로 binary32로 먼저 캐스팅한 다음, 그 결과가 잘못된 이중 반올림을 유발할 수 있는지 확인하는 방법도 있습니다. 문제가 될 수 있는 경우는 mantissa를 조정하여 roundTiesToOdd로 캐스팅한 결과와 같도록 만든 뒤, 다시 roundTiesToEven으로 binary16으로 캐스팅하면 올바른 값을 얻을 수 있습니다.

21.3.2.19 Math.hypot ( ...args )

0개 이상의 인자를 받아, 인자들의 제곱의 합의 제곱근을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. coerced에 새로운 빈 List를 할당한다.
  2. args의 각 요소 arg에 대해,
    1. n에 ? ToNumber(arg)를 할당한다.
    2. ncoerced에 추가한다.
  3. coerced의 각 요소 number에 대해,
    1. number+∞𝔽 또는 -∞𝔽이면, +∞𝔽을 반환한다.
  4. onlyZerotrue를 할당한다.
  5. coerced의 각 요소 number에 대해,
    1. numberNaN이면, NaN을 반환한다.
    2. number+0𝔽 또는 -0𝔽이 아니면, onlyZerofalse로 설정한다.
  6. onlyZerotrue이면, +0𝔽을 반환한다.
  7. 구현 근삿값 Number 값을 반환하는데, coerced의 각 요소의 수학적 값의 제곱의 합의 제곱근임.

이 함수의 "length" 속성은 2𝔽입니다.

참고

구현체는 2개 이상의 인자로 호출될 때 오버플로우와 언더플로우로 인한 정밀도 손실을 주의해야 합니다.

21.3.2.20 Math.imul ( x, y )

이 함수는 호출 시 다음 단계를 수행합니다:

  1. a(? ToUint32(x))를 할당한다.
  2. b(? ToUint32(y))를 할당한다.
  3. product에 (a × b) modulo 232를 할당한다.
  4. product ≥ 231이면, 𝔽(product - 232)를 반환하고, 아니면 𝔽(product)를 반환한다.

21.3.2.21 Math.log ( x )

이 함수는 x의 자연로그 값을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN 또는 +∞𝔽이면, n을 반환한다.
  3. n1𝔽이면, +0𝔽을 반환한다.
  4. n+0𝔽 또는 -0𝔽이면, -∞𝔽을 반환한다.
  5. n < -0𝔽이면, NaN을 반환한다.
  6. 구현 근삿값 Number 값을 반환하는데, (n)의 자연로그임.

21.3.2.22 Math.log1p ( x )

이 함수는 1 + x의 자연로그 값을 반환합니다. x가 0에 가까울 때도 정확하게 계산되도록 설계되어 있습니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN, +0𝔽, -0𝔽, +∞𝔽 중 하나이면, n을 반환한다.
  3. n-1𝔽이면, -∞𝔽을 반환한다.
  4. n < -1𝔽이면, NaN을 반환한다.
  5. 구현 근삿값 Number 값을 반환하는데, 1 + (n)의 자연로그임.

21.3.2.23 Math.log10 ( x )

이 함수는 x의 밑이 10인 로그 값을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN 또는 +∞𝔽이면, n을 반환한다.
  3. n1𝔽이면, +0𝔽을 반환한다.
  4. n+0𝔽 또는 -0𝔽이면, -∞𝔽을 반환한다.
  5. n < -0𝔽이면, NaN을 반환한다.
  6. 구현 근삿값 Number 값을 반환하는데, (n)의 밑이 10인 로그임.

21.3.2.24 Math.log2 ( x )

이 함수는 x의 밑이 2인 로그 값을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN 또는 +∞𝔽이면, n을 반환한다.
  3. n1𝔽이면, +0𝔽을 반환한다.
  4. n+0𝔽 또는 -0𝔽이면, -∞𝔽을 반환한다.
  5. n < -0𝔽이면, NaN을 반환한다.
  6. 구현 근삿값 Number 값을 반환하는데, (n)의 밑이 2인 로그임.

21.3.2.25 Math.max ( ...args )

0개 이상의 인자를 받아, 각 인자에 ToNumber를 호출하고 그 결과 값 중 가장 큰 값을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. coerced에 새로운 빈 List를 할당한다.
  2. args의 각 요소 arg에 대해,
    1. n에 ? ToNumber(arg)를 할당한다.
    2. ncoerced에 추가한다.
  3. highest-∞𝔽를 할당한다.
  4. coerced의 각 요소 number에 대해,
    1. numberNaN이면, NaN을 반환한다.
    2. number+0𝔽이고 highest-0𝔽이면, highest+0𝔽로 설정한다.
    3. number > highest이면, highestnumber로 설정한다.
  5. highest를 반환한다.
참고

가장 큰 값을 결정하는 값의 비교는 IsLessThan 알고리즘을 사용하지만 +0𝔽-0𝔽보다 더 큰 것으로 간주합니다.

이 함수의 "length" 속성은 2𝔽입니다.

21.3.2.26 Math.min ( ...args )

0개 이상의 인자를 받아, 각 인자에 ToNumber를 호출하고 그 결과 값 중 가장 작은 값을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. coerced에 새로운 빈 List를 할당한다.
  2. args의 각 요소 arg에 대해,
    1. n에 ? ToNumber(arg)를 할당한다.
    2. ncoerced에 추가한다.
  3. lowest+∞𝔽를 할당한다.
  4. coerced의 각 요소 number에 대해,
    1. numberNaN이면, NaN을 반환한다.
    2. number-0𝔽이고 lowest+0𝔽이면, lowest-0𝔽로 설정한다.
    3. number < lowest이면, lowestnumber로 설정한다.
  5. lowest를 반환한다.
참고

가장 큰 값을 결정하는 비교는 IsLessThan 알고리즘을 사용하지만, +0𝔽-0𝔽보다 더 큰 것으로 간주합니다.

이 함수의 "length" 속성은 2𝔽입니다.

21.3.2.27 Math.pow ( base, exponent )

이 함수는 호출 시 다음 단계를 수행합니다:

  1. base에 ? ToNumber(base)를 할당한다.
  2. exponent에 ? ToNumber(exponent)를 할당한다.
  3. Number::exponentiate(base, exponent)를 반환한다.

21.3.2.28 Math.random ( )

이 함수는 양수 부호를 가지며, +0𝔽 이상 1𝔽 미만인 Number 값을 반환합니다. 이 값은 해당 구간에서 임의로 또는 의사 임의적으로 대략적으로 균일한 분포로 선택되며, 구현 정의 알고리즘이나 전략을 사용합니다.

서로 다른 realm에 대해 생성된 각 Math.random 함수는 연속 호출 시 서로 다른 값의 시퀀스를 생성해야 합니다.

21.3.2.29 Math.round ( x )

이 함수는 x에 가장 가까운 정수 Number 값을 반환합니다. 두 정수 Numberx에 동일하게 가까우면, 결과는 +∞에 더 가까운 Number 값입니다. x가 이미 정수라면 결과는 x입니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. n유한 값이 아니거나 n정수 Number이면, n을 반환한다.
  3. n < 0.5𝔽이고 n > +0𝔽이면, +0𝔽을 반환한다.
  4. n < -0𝔽이고 n-0.5𝔽이면, -0𝔽을 반환한다.
  5. n에 가장 가까운 정수 Number를 반환하는데, 동점일 경우 +∞에 더 가까운 값을 반환한다.
참고 1

Math.round(3.5)는 4를 반환하지만 Math.round(-3.5)는 -3을 반환합니다.

참고 2

Math.round(x)의 값은 항상 Math.floor(x + 0.5)의 값과 같지 않습니다. x-0𝔽이거나 x-0𝔽보다 작고 -0.5𝔽 이상이면, Math.round(x)-0𝔽을 반환하지만 Math.floor(x + 0.5)+0𝔽을 반환합니다. Math.round(x)Math.floor(x + 0.5)와 내부적으로 x + 0.5를 계산할 때의 반올림 차이로 인해 값이 다를 수도 있습니다.

21.3.2.30 Math.sign ( x )

이 함수는 x의 부호를 반환하며, x가 양수, 음수 또는 0인지 나타냅니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN, +0𝔽, -0𝔽 중 하나이면, n을 반환한다.
  3. n < -0𝔽이면, -1𝔽을 반환한다.
  4. 1𝔽을 반환한다.

21.3.2.31 Math.sin ( x )

이 함수는 x의 사인 값을 반환합니다. 인자는 라디안 단위입니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN, +0𝔽, -0𝔽 중 하나이면, n을 반환한다.
  3. n+∞𝔽 또는 -∞𝔽이면, NaN을 반환한다.
  4. 구현 근삿값 Number 값을 반환하는데, (n)의 사인임.

21.3.2.32 Math.sinh ( x )

이 함수는 x의 쌍곡사인 값을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. n유한 값이 아니거나 n+0𝔽 또는 -0𝔽이면, n을 반환한다.
  3. 구현 근삿값 Number 값을 반환하는데, (n)의 쌍곡사인임.
참고

Math.sinh(x)의 값은 (Math.exp(x) - Math.exp(-x)) / 2의 값과 같습니다.

21.3.2.33 Math.sqrt ( x )

이 함수는 x의 제곱근 값을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN, +0𝔽, -0𝔽, +∞𝔽 중 하나이면, n을 반환한다.
  3. n < -0𝔽이면, NaN을 반환한다.
  4. 𝔽(n의 제곱근, (n))를 반환한다.

21.3.2.34 Math.tan ( x )

이 함수는 x의 탄젠트 값을 반환합니다. 인자는 라디안 단위입니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN, +0𝔽, -0𝔽 중 하나이면, n을 반환한다.
  3. n+∞𝔽 또는 -∞𝔽이면, NaN을 반환한다.
  4. 구현 근삿값 Number 값을 반환하는데, (n)의 탄젠트임.

21.3.2.35 Math.tanh ( x )

이 함수는 x의 쌍곡탄젠트 값을 반환합니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. nNaN, +0𝔽, -0𝔽 중 하나이면, n을 반환한다.
  3. n+∞𝔽이면, 1𝔽을 반환한다.
  4. n-∞𝔽이면, -1𝔽을 반환한다.
  5. 구현 근삿값 Number 값을 반환하는데, (n)의 쌍곡탄젠트임.
참고

Math.tanh(x)의 값은 (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))의 값과 같습니다.

21.3.2.36 Math.trunc ( x )

이 함수는 숫자 x의 소수 부분을 제거하고 정수 부분만 반환합니다. x가 이미 정수라면 결과는 x입니다.

호출 시 다음 단계를 수행합니다:

  1. n에 ? ToNumber(x)를 할당한다.
  2. n유한 값이 아니거나 n+0𝔽 또는 -0𝔽이면, n을 반환한다.
  3. n < 1𝔽이고 n > +0𝔽이면, +0𝔽을 반환한다.
  4. n < -0𝔽이고 n > -1𝔽이면, -0𝔽을 반환한다.
  5. n에 가장 가까운 정수 Number를 +0𝔽 방향으로 반환한다.

21.4 Date 객체

21.4.1 Date 객체 개요와 추상 연산 정의

다음 추상 연산들은 시간 값에 대해 동작합니다(21.4.1.1에서 정의됨). 이 함수들에 전달되는 인수 중 하나라도 NaN이면, 결과도 NaN이 됨을 유의하세요.

21.4.1.1 시간 값과 시간 범위

ECMAScript의 시간 측정은 POSIX의 시간 측정과 유사하며, 역 그레고리력(proleptic Gregorian calendar), 1970년 1월 1일 자정(UTC)이라는 기점(epoch), 그리고 모든 날이 정확히 86,400초(각각 1000밀리초)로 구성된다는 정의를 공유합니다.

ECMAScript 시간 값Number 타입이며, 밀리초 단위로 시간을 나타내는 유한 정수 Number이거나, 특정 순간을 나타내지 않음은 NaN으로 나타냄. 24 × 60 × 60 × 1000 = 86,400,000의 배수(즉, 86,400,000 × d 형태, 정수 d에 대해)는 기점 이후 d일째 UTC의 시작 순간을 나타냅니다(음수 d는 기점 이전). 그 외의 유한 시간 값 t는 가장 가까운 앞선 배수 s를 기준으로, 그 날의 시작 순간에서 (t - s) 밀리초 후를 나타냅니다.

시간 값은 UTC 윤초(leap second)를 고려하지 않습니다—양의 윤초 구간의 순간을 나타내는 시간 값은 없고, 음의 윤초로 인해 제거된 순간을 나타내는 값은 존재합니다. 하지만 시간 값의 정의는 윤초 경계에서만 불연속이 있으며, 그 외에는 UTC와 일치합니다.

Number 타입은 -9,007,199,254,740,992에서 9,007,199,254,740,992(21.1.2.8, 21.1.2.6)까지의 모든 정수를 정확히 나타낼 수 있습니다. 하지만 시간 값의 범위는 -8,640,000,000,000,000에서 8,640,000,000,000,000 밀리초까지로, 1970년 1월 1일 자정 기준으로 정확히 -100,000,000일부터 +100,000,000일까지의 범위를 지원합니다.

1970년 1월 1일 자정(UTC) 순간은 +0𝔽 시간 값으로 나타냅니다.

참고

역 그레고리력에서 윤년은 4로 나누어지고, 400으로 나누어지거나 100으로 나누어지지 않는 해입니다.

400년 주기에는 윤년이 97번 있습니다. 평균적으로 1년에 365.2425일, 즉 31,556,952,000밀리초가 됩니다. Number 타입이 밀리초 단위로 정확히 나타낼 수 있는 최대 범위는 1970년 기준 대략 -285,426년에서 +285,426년입니다. 이 섹션에서 규정한 시간 값의 범위는 약 -273,790년에서 +273,790년입니다.

21.4.1.2 시간 관련 상수

이 상수들은 이후 섹션의 알고리즘에서 참조됩니다.

HoursPerDay = 24
MinutesPerHour = 60
SecondsPerMinute = 60
msPerSecond = 1000𝔽
msPerMinute = 60000𝔽 = msPerSecond × 𝔽(SecondsPerMinute)
msPerHour = 3600000𝔽 = msPerMinute × 𝔽(MinutesPerHour)
msPerDay = 86400000𝔽 = msPerHour × 𝔽(HoursPerDay)

21.4.1.3 Day ( t )

Day 추상 연산은 t(유한 시간 값)을 인수로 받아 정수 Number를 반환합니다. t가 속한 날의 day number를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. 𝔽(floor((t / msPerDay)))를 반환한다.

21.4.1.4 TimeWithinDay ( t )

TimeWithinDay 추상 연산은 t(유한 시간 값)을 인수로 받아 정수 Number를 반환하며, +0𝔽(포함)에서 msPerDay(제외)까지의 구간 내에 있습니다. t가 속한 날의 시작 순간부터 경과한 밀리초를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. 𝔽((t) modulo (msPerDay)))를 반환한다.

21.4.1.5 DaysInYear ( y )

DaysInYear 추상 연산은 y(정수 Number)를 인수로 받아 365𝔽 또는 366𝔽을 반환합니다. y년의 날 수를 반환하며, 윤년은 366일, 그 외는 365일입니다. 호출 시 다음 단계를 수행합니다:

  1. ry(y)를 할당한다.
  2. (ry modulo 400) = 0이면, 366𝔽을 반환한다.
  3. (ry modulo 100) = 0이면, 365𝔽을 반환한다.
  4. (ry modulo 4) = 0이면, 366𝔽을 반환한다.
  5. 365𝔽을 반환한다.

21.4.1.6 DayFromYear ( y )

DayFromYear 추상 연산은 y(정수 Number)를 인수로 받아 정수 Number를 반환합니다. y년의 첫날의 day number를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. ry(y)를 할당한다.
  2. NOTE: 아래 단계에서 numYears1, numYears4, numYears100, numYears400기점부터 y년 시작까지 1, 4, 100, 400으로 나누어 떨어지는 해의 수를 나타냅니다. y가 기점 이전이라면 음수입니다.
  3. numYears1에 (ry - 1970)를 할당한다.
  4. numYears4floor((ry - 1969) / 4)를 할당한다.
  5. numYears100floor((ry - 1901) / 100)를 할당한다.
  6. numYears400floor((ry - 1601) / 400)를 할당한다.
  7. 𝔽(365 × numYears1 + numYears4 - numYears100 + numYears400)를 반환한다.

21.4.1.7 TimeFromYear ( y )

TimeFromYear 추상 연산은 y(정수 Number)를 인수로 받아 시간 값을 반환합니다. y년 시작 순간의 시간 값을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. msPerDay × DayFromYear(y)를 반환한다.

21.4.1.8 YearFromTime ( t )

YearFromTime 추상 연산은 t(유한 시간 값)을 인수로 받아 정수 Number를 반환합니다. t가 속한 해를 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. +∞에 가장 가까운 정수 Number yTimeFromYear(y) ≤ t인 값 중 가장 큰 값을 반환한다.

21.4.1.9 DayWithinYear ( t )

DayWithinYear 추상 연산은 t(유한 시간 값)을 인수로 받아 정수 Number를 반환하며, +0𝔽에서 365𝔽까지의 구간 내에 있습니다. 호출 시 다음 단계를 수행합니다:

  1. Day(t) - DayFromYear(YearFromTime(t))를 반환한다.

21.4.1.10 InLeapYear ( t )

InLeapYear 추상 연산은 t(유한 시간 값)을 인수로 받아 +0𝔽 또는 1𝔽을 반환합니다. t가 윤년 내에 있으면 1𝔽, 아니면 +0𝔽을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. DaysInYear(YearFromTime(t))이 366𝔽이면, 1𝔽을 반환하고, 아니면 +0𝔽을 반환한다.

21.4.1.11 MonthFromTime ( t )

MonthFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고, 정수 Number를 반환하는데, 포함 구간 +0𝔽부터 11𝔽까지이다. t가 속한 월을 나타내는 Number를 반환한다. +0𝔽은 1월, 1𝔽은 2월, 2𝔽은 3월, 3𝔽은 4월, 4𝔽은 5월, 5𝔽은 6월, 6𝔽은 7월, 7𝔽은 8월, 8𝔽은 9월, 9𝔽은 10월, 10𝔽은 11월, 11𝔽은 12월을 의미한다. MonthFromTime(+0𝔽) = +0𝔽이며, 이는 1970년 1월 1일 목요일을 의미한다. 다음 단계로 동작한다:

  1. inLeapYearInLeapYear(t)를 할당한다.
  2. dayWithinYearDayWithinYear(t)를 할당한다.
  3. dayWithinYear < 31𝔽이면 +0𝔽을 반환한다.
  4. dayWithinYear < 59𝔽 + inLeapYear이면 1𝔽을 반환한다.
  5. dayWithinYear < 90𝔽 + inLeapYear이면 2𝔽을 반환한다.
  6. dayWithinYear < 120𝔽 + inLeapYear이면 3𝔽을 반환한다.
  7. dayWithinYear < 151𝔽 + inLeapYear이면 4𝔽을 반환한다.
  8. dayWithinYear < 181𝔽 + inLeapYear이면 5𝔽을 반환한다.
  9. dayWithinYear < 212𝔽 + inLeapYear이면 6𝔽을 반환한다.
  10. dayWithinYear < 243𝔽 + inLeapYear이면 7𝔽을 반환한다.
  11. dayWithinYear < 273𝔽 + inLeapYear이면 8𝔽을 반환한다.
  12. dayWithinYear < 304𝔽 + inLeapYear이면 9𝔽을 반환한다.
  13. dayWithinYear < 334𝔽 + inLeapYear이면 10𝔽을 반환한다.
  14. Assert: dayWithinYear < 365𝔽 + inLeapYear이다.
  15. 11𝔽을 반환한다.

21.4.1.12 DateFromTime ( t )

DateFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고, 정수 Number를 반환하는데, 포함 구간 1𝔽부터 31𝔽까지이다. t가 속한 월의 날짜(일)을 반환한다. 다음 단계로 동작한다:

  1. inLeapYearInLeapYear(t)를 할당한다.
  2. dayWithinYearDayWithinYear(t)를 할당한다.
  3. monthMonthFromTime(t)를 할당한다.
  4. month+0𝔽이면 dayWithinYear + 1𝔽을 반환한다.
  5. month1𝔽이면 dayWithinYear - 30𝔽을 반환한다.
  6. month2𝔽이면 dayWithinYear - 58𝔽 - inLeapYear을 반환한다.
  7. month3𝔽이면 dayWithinYear - 89𝔽 - inLeapYear을 반환한다.
  8. month4𝔽이면 dayWithinYear - 119𝔽 - inLeapYear을 반환한다.
  9. month5𝔽이면 dayWithinYear - 150𝔽 - inLeapYear을 반환한다.
  10. month6𝔽이면 dayWithinYear - 180𝔽 - inLeapYear을 반환한다.
  11. month7𝔽이면 dayWithinYear - 211𝔽 - inLeapYear을 반환한다.
  12. month8𝔽이면 dayWithinYear - 242𝔽 - inLeapYear을 반환한다.
  13. month9𝔽이면 dayWithinYear - 272𝔽 - inLeapYear을 반환한다.
  14. month10𝔽이면 dayWithinYear - 303𝔽 - inLeapYear을 반환한다.
  15. Assert: month11𝔽임.
  16. dayWithinYear - 333𝔽 - inLeapYear을 반환한다.

21.4.1.13 WeekDay ( t )

WeekDay 추상 연산은 t ( 유한 시간 값 )을 인수로 받고, 정수 Number를 반환하는데, 포함 구간 +0𝔽부터 6𝔽까지이다. t가 속한 요일을 나타내는 Number를 반환한다. +0𝔽은 일요일, 1𝔽은 월요일, 2𝔽은 화요일, 3𝔽은 수요일, 4𝔽은 목요일, 5𝔽은 금요일, 6𝔽은 토요일을 의미한다. WeekDay(+0𝔽) = 4𝔽이며, 이는 1970년 1월 1일 목요일을 의미한다. 다음 단계로 동작한다:

  1. 𝔽((Day(t) + 4𝔽) modulo 7 )을 반환한다.

21.4.1.14 HourFromTime ( t )

HourFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고, 정수 Number를 반환하는데, 포함 구간 +0𝔽부터 23𝔽까지이다. t가 속한 날의 시(hour)를 반환한다. 다음 단계로 동작한다:

  1. 𝔽( floor( ( t / msPerHour ) ) modulo HoursPerDay )를 반환한다.

21.4.1.15 MinFromTime ( t )

MinFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고, 정수 Number를 반환하는데, 포함 구간 +0𝔽부터 59𝔽까지이다. t가 속한 시(hour)의 분(minute)을 반환한다. 다음 단계로 동작한다:

  1. 𝔽( floor( ( t / msPerMinute ) ) modulo MinutesPerHour )를 반환한다.

21.4.1.16 SecFromTime ( t )

SecFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고, 정수 Number를 반환하는데, 포함 구간 +0𝔽부터 59𝔽까지이다. t가 속한 분(minute)의 초(second)를 반환한다. 다음 단계로 동작한다:

  1. 𝔽( floor( ( t / msPerSecond ) ) modulo SecondsPerMinute )를 반환한다.

21.4.1.17 msFromTime ( t )

msFromTime 추상 연산은 t ( 유한 시간 값 )을 인수로 받고, 정수 Number를 반환하는데, 포함 구간 +0𝔽부터 999𝔽까지이다. t가 속한 초(second)의 밀리초(millisecond)를 반환한다. 다음 단계로 동작한다:

  1. 𝔽( (t) modulo ( msPerSecond ) )를 반환한다.

21.4.1.18 GetUTCEpochNanoseconds ( year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

GetUTCEpochNanoseconds 추상 연산은 year ( 정수 ), month ( 정수, 포함 구간 1~12 ), day ( 정수, 포함 구간 1~31 ), hour ( 정수, 포함 구간 0~23 ), minute ( 정수, 포함 구간 0~59 ), second ( 정수, 포함 구간 0~59 ), millisecond ( 정수, 포함 구간 0~999 ), microsecond ( 정수, 포함 구간 0~999 ), nanosecond ( 정수, 포함 구간 0~999 )를 인수로 받고, BigInt를 반환한다. 반환된 값은 기점 이후의 나노초 수로, 주어진 ISO 8601 달력 날짜 및 UTC 벽시각에 해당한다. 다음 단계로 동작한다:

  1. dateMakeDay( 𝔽(year), 𝔽(month - 1), 𝔽(day) )를 할당한다.
  2. timeMakeTime( 𝔽(hour), 𝔽(minute), 𝔽(second), 𝔽(millisecond) )를 할당한다.
  3. msMakeDate( date, time )를 할당한다.
  4. Assert: ms정수 Number임을 보장한다.
  5. ( (ms) × 106 + microsecond × 103 + nanosecond )를 반환한다.

21.4.1.19 타임존 식별자

ECMAScript에서 타임존은 타임존 식별자로 표현되며, 이는 0x0000 ~ 0x007F의 포함 구간 내 코드 유닛으로만 이루어진 문자열입니다. ECMAScript 구현에서 지원하는 타임존은 사용 가능한 이름이 있는 타임존일 수 있으며, 이는 타임존 식별자 레코드[[Identifier]] 필드를 통해 표현되며, AvailableNamedTimeZoneIdentifiers에서 반환됩니다. 또는 오프셋 타임존일 수 있으며, 이는 IsTimeZoneOffsetStringtrue를 반환하는 문자열입니다.

기본 타임존 식별자는 사용 가능한 이름이 있는 타임존의 대표 식별자입니다. 비기본 타임존 식별자는 기본 타임존 식별자가 아닌 사용 가능한 이름이 있는 타임존의 식별자입니다. 사용 가능한 이름이 있는 타임존 식별자는 기본 또는 비기본 타임존 식별자 중 하나입니다. 각각의 사용 가능한 이름이 있는 타임존 식별자는 정확히 하나의 사용 가능한 이름이 있는 타임존에 연결됩니다. 각각의 사용 가능한 이름이 있는 타임존은 정확히 하나의 기본 타임존 식별자와 0개 이상의 비기본 타임존 식별자에 연결됩니다.

ECMAScript 구현은 "UTC" 식별자를 가진 사용 가능한 이름이 있는 타임존을 반드시 지원해야 하며, 이는 UTC 타임존의 기본 타임존 식별자여야 합니다. 그 외에도 임의의 수의 사용 가능한 이름이 있는 타임존을 지원할 수 있습니다.

ECMA-402 국제화 API 명세의 타임존 요구사항을 따르는 구현은 타임존 인식 구현이라 하며, 타임존 인식 구현은 IANA Time Zone Database의 Zone과 Link 이름에 해당하는 사용 가능한 이름이 있는 타임존을 반드시 지원해야 하며, 오직 그 이름만 사용할 수 있습니다. 이러한 구현에서 기본 타임존 식별자는 Zone 이름이고, 비기본 식별자는 Link 이름입니다. 단, ECMA-402 명세의 AvailableNamedTimeZoneIdentifiers에 의해 명시적으로 오버라이드된 경우는 예외입니다. 전체 IANA Time Zone Database를 지원하지 않는 구현도 타임존 식별자로 IANA Time Zone Database 이름을 사용하는 것이 권장됩니다.

21.4.1.20 GetNamedTimeZoneEpochNanoseconds ( timeZoneIdentifier, year, month, day, hour, minute, second, millisecond, microsecond, nanosecond )

구현 정의 추상 연산 GetNamedTimeZoneEpochNanoseconds는 timeZoneIdentifier(문자열), year(정수), month(정수, 포함 구간 1~12), day(정수, 포함 구간 1~31), hour(정수, 포함 구간 0~23), minute(정수, 포함 구간 0~59), second(정수, 포함 구간 0~59), millisecond(정수, 포함 구간 0~999), microsecond(정수, 포함 구간 0~999), nanosecond(정수, 포함 구간 0~999)를 인수로 받아 BigInt 리스트를 반환합니다. 반환된 리스트의 각 값은 timeZoneIdentifier로 지정된 이름이 있는 타임존에서 지정된 ISO 8601 달력 날짜 및 벽시각에 해당하는 기점 이후의 나노초 수를 나타냅니다.

입력이 음수 시간대 전환(예: 서머타임 해제 또는 시간대 규칙 변경으로 오프셋 감소)으로 인해 지역 시간이 두 번 발생하는 경우, 반환되는 리스트는 2개 이상의 요소를 가지며 오름차순으로 정렬됩니다. 입력이 양수 시간대 전환(예: 서머타임 시작 또는 시간대 규칙 변경으로 오프셋 증가)으로 인해 지역 시간이 건너뛰어진 경우, 반환되는 리스트는 비어 있습니다. 그 외에는 반환되는 리스트는 하나의 요소만을 가집니다.

로컬 정치적 규칙이 없는 ECMAScript 구현에서 사용하는 GetNamedTimeZoneEpochNanoseconds의 기본 구현은 다음 단계를 따릅니다:

  1. Assert: timeZoneIdentifier"UTC"임을 보장합니다.
  2. epochNanosecondsGetUTCEpochNanoseconds(year, month, day, hour, minute, second, millisecond, microsecond, nanosecond)를 할당합니다.
  3. « epochNanoseconds »를 반환합니다.
참고

타임존 인식 구현에서는 반드시(그 외에도 권장됨) IANA Time Zone Database (https://www.iana.org/time-zones/)의 타임존 정보를 사용해야 합니다.

2017년 11월 5일 America/New_York에서 1:30 AM은 두 번 반복되므로, GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 11, 5, 1, 30, 0, 0, 0, 0)는 길이가 2인 리스트를 반환하며, 첫 번째 요소는 05:30 UTC(UTC 오프셋 -04:00인 미국 동부 서머타임 01:30에 해당)이고, 두 번째 요소는 06:30 UTC(UTC 오프셋 -05:00인 미국 동부 표준시 01:30에 해당)입니다.

2017년 3월 12일 America/New_York에서 2:30 AM은 존재하지 않으므로, GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 3, 12, 2, 30, 0, 0, 0, 0)는 빈 리스트를 반환합니다.

21.4.1.21 GetNamedTimeZoneOffsetNanoseconds ( timeZoneIdentifier, epochNanoseconds )

구현 정의 추상 연산 GetNamedTimeZoneOffsetNanoseconds는 timeZoneIdentifier(문자열)와 epochNanoseconds(BigInt)를 인수로 받아 정수를 반환합니다.

반환된 정수timeZoneIdentifier로 지정된 이름이 있는 타임존의 epochNanoseconds(기점 기준)에서의 UTC로부터의 오프셋(나노초 단위)을 나타냅니다.

로컬 정치적 규칙이 없는 ECMAScript 구현에서 사용하는 GetNamedTimeZoneOffsetNanoseconds의 기본 구현은 다음 단계를 따릅니다:

  1. Assert: timeZoneIdentifier"UTC"임을 보장합니다.
  2. 0을 반환합니다.
참고

타임존 오프셋 값은 양수 또는 음수일 수 있습니다.

21.4.1.22 타임존 식별자 레코드

타임존 식별자 레코드레코드로, 사용 가능한 이름이 있는 타임존 식별자와 해당 기본 타임존 식별자를 설명하는 데 사용됩니다.

타임존 식별자 레코드는 표 64에 나열된 필드를 가집니다.

표 64: 타임존 식별자 레코드 필드
필드 이름 의미
[[Identifier]] 문자열 구현에서 지원하는 사용 가능한 이름이 있는 타임존 식별자.
[[PrimaryIdentifier]] 문자열 [[Identifier]]가 해석되는 기본 타임존 식별자.
참고

[[Identifier]]기본 타임존 식별자인 경우, [[Identifier]][[PrimaryIdentifier]]와 동일합니다.

21.4.1.23 AvailableNamedTimeZoneIdentifiers ( )

구현 정의 추상 연산 AvailableNamedTimeZoneIdentifiers는 인수 없이 호출되며 타임존 식별자 레코드 리스트를 반환합니다. 결과는 해당 구현에서 모든 사용 가능한 이름이 있는 타임존 식별자와, 각 기본 타임존 식별자의 정보를 설명합니다. 리스트는 각 타임존 식별자 레코드[[Identifier]] 필드 기준으로 정렬됩니다.

타임존 인식 구현 (ECMA-402 국제화 API 구현 포함)는 ECMA-402 명세에서 규정한 대로 AvailableNamedTimeZoneIdentifiers 추상 연산을 반드시 구현해야 합니다. 타임존 인식 구현가 아닌 경우 AvailableNamedTimeZoneIdentifiers는 다음 단계를 수행합니다:

  1. 구현이 어떤 타임존에 대해서도 로컬 정치적 규칙을 포함하지 않는 경우,
    1. « 타임존 식별자 레코드 { [[Identifier]]: "UTC", [[PrimaryIdentifier]]: "UTC" } »를 반환한다.
  2. identifiers리스트로, 고유한 사용 가능한 이름이 있는 타임존 식별자사전식 코드 유닛 순서대로 정렬하여 할당한다.
  3. result에 새로운 빈 리스트를 할당한다.
  4. identifiers의 각 identifier에 대해,
    1. primaryidentifier를 할당한다.
    2. identifier가 해당 구현에서 비기본 타임존 식별자이고 "UTC"가 아니라면,
      1. primaryidentifier와 연결된 기본 타임존 식별자를 할당한다.
      2. NOTE: 구현에 따라 primary를 얻을 때 identifier를 반복적으로 해석해야 할 수도 있음.
    3. record타임존 식별자 레코드 { [[Identifier]]: identifier, [[PrimaryIdentifier]]: primary }를 할당한다.
    4. recordresult에 추가한다.
  5. Assert: result타임존 식별자 레코드 r를 포함하며, r.[[Identifier]]"UTC"이고 r.[[PrimaryIdentifier]]"UTC"임.
  6. result를 반환한다.

21.4.1.24 SystemTimeZoneIdentifier ( )

구현 정의 추상 연산 SystemTimeZoneIdentifier는 인수 없이 호출되며 문자열을 반환합니다. 반환값은 호스트 환경의 현재 타임존을 나타내는 문자열로, IsTimeZoneOffsetStringtrue를 반환하는 UTC 오프셋 문자열이거나, 기본 타임존 식별자일 수 있습니다. 다음 단계를 수행합니다:

  1. 구현이 UTC 타임존만 지원한다면 "UTC"를 반환한다.
  2. systemTimeZoneString호스트 환경의 현재 타임존을 나타내는 문자열을 할당하는데, 기본 타임존 식별자 또는 오프셋 타임존 식별자임.
  3. systemTimeZoneString을 반환한다.
참고

Date 객체의 일반적인 기능 수준을 보장하기 위해, SystemTimeZoneIdentifier는 호스트 환경의 타임존 설정에 해당하는 IANA 타임존 이름을 반환하는 것이 권장됩니다(존재한다면). GetNamedTimeZoneEpochNanosecondsGetNamedTimeZoneOffsetNanoseconds 는 해당 타임존의 표준시 및 서머타임에 관한 로컬 정치적 규칙을 반영해야 합니다(규칙이 존재한다면).

예를 들어, 호스트 환경이 미국 동부 시간이 선택된 시스템의 브라우저라면, SystemTimeZoneIdentifier는 "America/New_York"을 반환합니다.

21.4.1.25 LocalTime ( t )

LocalTime 추상 연산은 t(유한 시간 값)을 인수로 받아 정수 Number를 반환합니다. t를 UTC에서 로컬 시간으로 변환합니다. t 시점에 적용되는 표준시 및 서머타임에 관한 로컬 정치적 규칙을 이 섹션에서 규정한 방식으로 적용해 결과를 산출합니다. 다음 단계를 수행합니다:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier()를 할당한다.
  2. IsTimeZoneOffsetString(systemTimeZoneIdentifier)가 true라면,
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)를 할당한다.
  3. 그 외,
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ((t) × 106))를 할당한다.
  4. offsetMstruncate(offsetNs / 106)를 할당한다.
  5. t + 𝔽(offsetMs)를 반환한다.
참고 1

구현 내에 t의 로컬 시간에 대한 정치적 규칙 정보가 없으면, 결과는 t입니다. 이는 SystemTimeZoneIdentifier"UTC"를 반환하고 GetNamedTimeZoneOffsetNanoseconds가 0을 반환하기 때문입니다.

참고 2

타임존 인식 구현에서는 반드시(그 외에도 권장됨) IANA Time Zone Database (https://www.iana.org/time-zones/)의 타임존 정보를 사용해야 합니다.

참고 3

음수 시간대 전환(예: 서머타임 해제 또는 오프셋 감소)으로 반복된 시간이 존재할 때, 두 개의 서로 다른 시간 값 tUTC는 같은 로컬 시간 tlocal으로 변환됩니다.

LocalTime(UTC(tlocal))는 항상 tlocal과 같지는 않을 수 있습니다. 마찬가지로 UTC(LocalTime(tUTC))도 항상 tUTC과 같지는 않을 수 있습니다.

21.4.1.26 UTC ( t )

UTC 추상 연산은 t(Number)를 인수로 받아 시간 값을 반환합니다. t를 로컬 시간에서 UTC 시간 값으로 변환합니다. t 시점에 적용되는 표준시 및 서머타임에 관한 로컬 정치적 규칙을 이 섹션에서 규정된 방식으로 적용해 결과를 산출해야 합니다. 다음 단계를 수행합니다:

  1. t유한이 아니면 NaN을 반환한다.
  2. systemTimeZoneIdentifierSystemTimeZoneIdentifier()를 할당한다.
  3. IsTimeZoneOffsetString(systemTimeZoneIdentifier)가 true면,
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)를 할당한다.
  4. 그 외,
    1. possibleInstantsGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, (YearFromTime(t)), (MonthFromTime(t)) + 1, (DateFromTime(t)), (HourFromTime(t)), (MinFromTime(t)), (SecFromTime(t)), (msFromTime(t)), 0, 0).
    2. NOTE: 다음 단계들은 t가 음수 시간대 전환(예: 서머타임 해제 또는 오프셋 감소)에서 반복되는 로컬 시간을 나타내거나, 양수 시간대 전환(예: 서머타임 시작 또는 오프셋 증가)에서 건너뛴 로컬 시간일 때 t가 전환 전 오프셋으로 해석되도록 보장합니다.
    3. possibleInstants가 비어 있지 않으면,
      1. disambiguatedInstantpossibleInstants[0]을 할당한다.
    4. 그 외,
      1. NOTE: t는 양수 시간대 전환(예: 서머타임 시작 또는 오프셋 증가)에서 건너뛴 로컬 시간을 나타냅니다.
      2. possibleInstantsBeforeGetNamedTimeZoneEpochNanoseconds(systemTimeZoneIdentifier, (YearFromTime(tBefore)), (MonthFromTime(tBefore)) + 1, (DateFromTime(tBefore)), (HourFromTime(tBefore)), (MinFromTime(tBefore)), (SecFromTime(tBefore)), (msFromTime(tBefore)), 0, 0), 여기서 tBeforet보다 작은 가장 큰 정수 Number로, possibleInstantsBefore가 비어있지 않은 값(즉, tBefore는 전환 이전 마지막 로컬 시간을 나타냄).
      3. disambiguatedInstantpossibleInstantsBefore의 마지막 요소를 할당한다.
    5. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, disambiguatedInstant)를 할당한다.
  5. offsetMstruncate(offsetNs / 106)를 할당한다.
  6. t - 𝔽(offsetMs)를 반환한다.

입력 t는 명목상 시간 값이지만, 임의의 Number 값일 수 있습니다. 알고리즘은 t시간 값의 범위로 제한해서는 안 됩니다. 예를 들어, 최대 시간 값은 8.64 × 1015로, "+275760-09-13T00:00:00Z"에 해당합니다. 만약 로컬 타임존 오프셋이 그 시점에 UTC보다 1시간 빠르다면, 8.64 × 1015 + 3.6 × 106 입력은 "+275760-09-13T01:00:00+01:00"에 해당합니다.

구현 내에 t의 로컬 시간에 대한 정치적 규칙 정보가 없으면, 결과는 t입니다. 이는 SystemTimeZoneIdentifier"UTC"를 반환하고 GetNamedTimeZoneOffsetNanoseconds가 0을 반환하기 때문입니다.

참고 1

타임존 인식 구현에서는 반드시(그 외에도 권장됨) IANA Time Zone Database (https://www.iana.org/time-zones/)의 타임존 정보를 사용해야 합니다.

2017년 11월 5일 America/New_York에서 1:30 AM은 두 번 반복(가을 뒤로 이동)이지만, 반드시 1:30 AM UTC-04로 해석되어야 하며 1:30 AM UTC-05가 아님. UTC(TimeClip(MakeDate(MakeDay(2017, 10, 5), MakeTime(1, 30, 0, 0))))에서 offsetMs 값은 -4 × msPerHour입니다.

2017년 3월 12일 America/New_York에서 2:30 AM은 존재하지 않지만, 반드시 2:30 AM UTC-05(= 3:30 AM UTC-04)로 해석되어야 합니다. UTC(TimeClip(MakeDate(MakeDay(2017, 2, 12), MakeTime(2, 30, 0, 0))))에서 offsetMs 값은 -5 × msPerHour입니다.

참고 2

UTC(LocalTime(tUTC))는 항상 tUTC과 같지는 않습니다. 마찬가지로 LocalTime(UTC(tlocal))도 항상 tlocal과 같지는 않습니다.

21.4.1.27 MakeTime ( hour, min, sec, ms )

MakeTime 추상 연산은 hour(Number), min(Number), sec(Number), ms(Number)를 인수로 받아 Number를 반환합니다. 밀리초 수를 계산합니다. 다음 단계를 수행합니다:

  1. hour유한이 아니거나, min유한이 아니거나, sec유한이 아니거나, ms유한이 아니면 NaN을 반환한다.
  2. h𝔽(! ToIntegerOrInfinity(hour))를 할당한다.
  3. m𝔽(! ToIntegerOrInfinity(min))를 할당한다.
  4. s𝔽(! ToIntegerOrInfinity(sec))를 할당한다.
  5. milli𝔽(! ToIntegerOrInfinity(ms))를 할당한다.
  6. ((h × msPerHour + m × msPerMinute) + s × msPerSecond) + milli를 반환한다.
참고

MakeTime의 산술 연산은 부동소수점 연산이므로 결합법칙이 성립하지 않으며, 연산은 지정된 순서대로 수행해야 합니다.

21.4.1.28 MakeDay ( year, month, date )

MakeDay 추상 연산은 year(Number), month(Number), date(Number)를 인수로 받아 Number를 반환합니다. 일(day) 수를 계산합니다. 호출 시 다음 단계를 수행합니다:

  1. year유한이 아니거나, month유한이 아니거나, date유한이 아니면 NaN을 반환한다.
  2. y𝔽(! ToIntegerOrInfinity(year))를 할당한다.
  3. m𝔽(! ToIntegerOrInfinity(month))를 할당한다.
  4. dt𝔽(! ToIntegerOrInfinity(date))를 할당한다.
  5. ymy + 𝔽(floor((m) / 12))를 할당한다.
  6. ym유한이 아니면 NaN을 반환한다.
  7. mn𝔽((m) modulo 12)를 할당한다.
  8. 유한 시간 값 t를 찾는데, YearFromTime(t)가 ym이고, MonthFromTime(t)가 mn이고, DateFromTime(t)가 1𝔽일 것. 만약 불가능하다면(인수값이 범위를 벗어나는 경우 등), NaN을 반환한다.
  9. Day(t) + dt - 1𝔽를 반환한다.

21.4.1.29 MakeDate ( day, time )

MakeDate 추상 연산은 day(Number)와 time(Number)를 인수로 받고 Number를 반환합니다. 밀리초 값을 계산합니다. 호출 시 다음 단계를 수행합니다:

  1. day유한이 아니거나 time유한이 아니면 NaN을 반환한다.
  2. tvday × msPerDay + time을 할당한다.
  3. tv유한이 아니면 NaN을 반환한다.
  4. tv를 반환한다.

21.4.1.30 MakeFullYear ( year )

MakeFullYear 추상 연산은 year(Number)를 인수로 받아 정수 Number 또는 NaN을 반환합니다. year정수 부분을 해석하여 해당하는 "full year"를 반환하며, 0~99 구간 값을 1900년 이후의 연도로 해석합니다. 역 그레고리력과의 정렬을 위해 "full year"는 0년(1 B.C.) 이후의 전체 연수(부호 포함)로 정의됩니다. 호출 시 다음 단계를 수행합니다:

  1. yearNaN이면 NaN을 반환한다.
  2. truncated에 ! ToIntegerOrInfinity(year)를 할당한다.
  3. truncated가 0~99의 포함 구간에 있으면 1900𝔽 + 𝔽(truncated)를 반환한다.
  4. 𝔽(truncated)를 반환한다.

21.4.1.31 TimeClip ( time )

TimeClip 추상 연산은 time(Number)를 인수로 받아 Number를 반환합니다. 밀리초 값을 계산합니다. 호출 시 다음 단계를 수행합니다:

  1. time유한이 아니면 NaN을 반환한다.
  2. abs((time)) > 8.64 × 1015이면 NaN을 반환한다.
  3. 𝔽(! ToIntegerOrInfinity(time))를 반환한다.

21.4.1.32 날짜-시간 문자열 형식

ECMAScript는 ISO 8601 달력 날짜 확장 형식을 단순화한 문자열 교환 형식을 정의합니다. 형식은 다음과 같습니다: YYYY-MM-DDTHH:mm:ss.sssZ

각 요소의 의미는 다음과 같습니다:

YYYY 역 그레고리력에서 0000~9999 사이의 4자리 연도이거나, 확장 연도"+" 또는 "-" 다음에 6자리 십진수가 옵니다.
- "-"(하이픈)이 문자열에 두 번 등장합니다.
MM 01(1월)부터 12(12월)까지의 두 자리 십진수 월입니다.
DD 01~31 사이의 두 자리 십진수 날짜(일)입니다.
T "T"가 문자열에 그대로 등장하여 시간 요소의 시작을 표시합니다.
HH 자정 이후 경과한 정시(hour)의 수로서, 00~24 사이의 두 자리 십진수입니다.
: ":"(콜론)이 문자열에 두 번 등장합니다.
mm 시(hour) 시작 이후 경과한 분(minute) 수로서, 00~59 사이의 두 자리 십진수입니다.
ss 분(minute) 시작 이후 경과한 초(second) 수로서, 00~59 사이의 두 자리 십진수입니다.
. "."(점)이 문자열에 그대로 등장합니다.
sss 초(second) 시작 이후 경과한 밀리초(millisecond) 수로서, 3자리 십진수입니다.
Z UTC 오프셋 표현으로 "Z"(오프셋 없는 UTC) 또는 "+" 또는 "-" 다음에 HH:mm 시간 표현이 옵니다(UTC보다 앞서거나 뒤처진 현지 시간을 나타내는 타임존 오프셋 문자열 형식의 부분 집합).

이 형식에는 날짜만 나타내는 형태도 포함됩니다:

YYYY
YYYY-MM
YYYY-MM-DD
        

또한 위의 날짜 형식 바로 뒤에 아래의 시간 형식 중 하나와 선택적 UTC 오프셋 표현이 붙는 “날짜-시간” 형식도 포함됩니다:

THH:mm
THH:mm:ss
THH:mm:ss.sss
        

범위를 벗어나거나 규격에 맞지 않는 요소가 포함된 문자열은 이 형식의 유효한 인스턴스가 아닙니다.

참고 1

모든 날은 자정에 시작하고 자정에 끝나므로, 날짜 하나에 대해 00:0024:00 두 표기를 통해 두 자정을 구분할 수 있습니다. 즉, 1995-02-04T24:001995-02-05T00:00 표기는 정확히 동일한 시점을 나타냅니다. 후자(종료 자정)의 해석은 ISO 8601과 일치하지만, ISO 8601에서는 시간 구간을 설명할 때만 허용하며 단일 시점을 표현할 때는 허용하지 않습니다.

참고 2

CET, EST 등과 같은 시민 시간대 약어에 대한 국제 표준은 존재하지 않으며 같은 약어가 상이한 시간대를 나타내기도 합니다. 이런 이유로 ISO 8601과 이 형식 모두 시간대 오프셋의 숫자 표현만을 명시합니다.

21.4.1.32.1 확장 연도

1월 1일 1970년을 기준으로 약 273,790년 전후의 시간 값 전체 범위를 표현하려면 0년 이전 또는 9999년 이후 연도를 나타낼 수 있어야 합니다(21.4.1.1 참조). ISO 8601은 연도 표기의 확장을 허용하지만, 정보 교환 당사자 간의 합의가 있어야 합니다. ECMAScript 단순화 형식에서는 확장 연도 표기가 6자리이며 항상 + 또는 - 부호가 앞에 옵니다. 0년은 양수로 간주되어 반드시 + 부호가 붙어야 하며, -000000 표기는 유효하지 않습니다. 확장 연도가 날짜-시간 문자열 형식과 일치하나 시간 값 범위를 벗어나는 시간을 나타내는 경우 Date.parse에서 인식할 수 없어 해당 함수는 NaN을 반환하며 구현별 동작이나 휴리스틱으로 대체하지 않습니다.

참고

확장 연도가 포함된 날짜-시간 값 예시:

-271821-04-20T00:00:00Z 271822 B.C.
-000001-01-01T00:00:00Z 2 B.C.
+000000-01-01T00:00:00Z 1 B.C.
+000001-01-01T00:00:00Z 1 A.D.
+001970-01-01T00:00:00Z 1970 A.D.
+002009-12-15T00:00:00Z 2009 A.D.
+275760-09-13T00:00:00Z 275760 A.D.

21.4.1.33 타임존 오프셋 문자열 형식

ECMAScript는 ISO 8601에서 파생된 UTC 오프셋의 문자열 교환 형식을 정의합니다. 형식은 아래의 문법으로 설명합니다.

구문

UTCOffset ::: ASCIISign Hour ASCIISign Hour HourSubcomponents[+Extended] ASCIISign Hour HourSubcomponents[~Extended] ASCIISign ::: one of + - Hour ::: 0 DecimalDigit 1 DecimalDigit 20 21 22 23 HourSubcomponents[Extended] ::: TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TemporalDecimalFractionopt TimeSeparator[Extended] ::: [+Extended] : [~Extended] [empty] MinuteSecond ::: 0 DecimalDigit 1 DecimalDigit 2 DecimalDigit 3 DecimalDigit 4 DecimalDigit 5 DecimalDigit TemporalDecimalFraction ::: TemporalDecimalSeparator DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator ::: one of . ,

21.4.1.33.1 IsTimeZoneOffsetString ( offsetString )

IsTimeZoneOffsetString 추상 연산은 offsetString(문자열)을 인수로 받아 Boolean을 반환합니다. 반환값은 offsetStringUTCOffset 문법에 적합한지 여부를 나타냅니다. 호출 시 다음 단계를 수행합니다:

  1. parseResultParseText(offsetString, UTCOffset)를 할당한다.
  2. parseResult오류 리스트이면 false를 반환한다.
  3. true를 반환한다.

21.4.1.33.2 ParseTimeZoneOffsetString ( offsetString )

ParseTimeZoneOffsetString 추상 연산은 offsetString(문자열)을 인수로 받아 정수를 반환합니다. 반환값은 offsetString에 해당하는 UTC 오프셋(나노초 단위)입니다. 호출 시 다음 단계를 수행합니다:

  1. parseResultParseText(offsetString, UTCOffset)를 할당한다.
  2. Assert: parseResult오류 리스트가 아님을 보장한다.
  3. Assert: parseResultASCIISign 구문 노드가 포함되어 있다.
  4. parsedSign매칭된 소스 텍스트ASCIISign 구문 노드에 해당하는 것을 할당한다.
  5. parsedSign이 U+002D(HYPHEN-MINUS)이면,
    1. sign에 -1을 할당한다.
  6. 그 외,
    1. sign에 1을 할당한다.
  7. NOTE: 아래의 StringToNumber 적용 과정에서는, 각 파싱된 값이 충분히 짧은 십진수 문자열이므로 정밀도가 손실되지 않습니다.
  8. Assert: parseResultHour 구문 노드가 포함되어 있다.
  9. parsedHours매칭된 소스 텍스트Hour 구문 노드에 해당하는 것을 할당한다.
  10. hours(StringToNumber(CodePointsToString(parsedHours)))를 할당한다.
  11. parseResultMinuteSecond 구문 노드가 포함되어 있지 않으면,
    1. minutes에 0을 할당한다.
  12. 그 외,
    1. parsedMinutes매칭된 소스 텍스트 중 첫 번째 MinuteSecond 구문 노드에 해당하는 것을 할당한다.
    2. minutes(StringToNumber(CodePointsToString(parsedMinutes)))를 할당한다.
  13. parseResult에 두 개의 MinuteSecond 구문 노드가 포함되어 있지 않으면,
    1. seconds에 0을 할당한다.
  14. 그 외,
    1. parsedSeconds매칭된 소스 텍스트 중 두 번째 MinuteSecond 구문 노드에 해당하는 것을 할당한다.
    2. seconds(StringToNumber(CodePointsToString(parsedSeconds)))를 할당한다.
  15. parseResultTemporalDecimalFraction 구문 노드가 포함되어 있지 않으면,
    1. nanoseconds에 0을 할당한다.
  16. 그 외,
    1. parsedFraction매칭된 소스 텍스트TemporalDecimalFraction 구문 노드에 해당하는 것을 할당한다.
    2. fraction문자열 연결 결과 CodePointsToString(parsedFraction)과 "000000000"을 할당한다.
    3. nanosecondsString부분 문자열 fraction의 1~10번째를 할당한다.
    4. nanoseconds(StringToNumber(nanosecondsString))를 할당한다.
  17. sign × (((hours × 60 + minutes) × 60 + seconds) × 109 + nanoseconds)를 반환한다.

21.4.2 Date 생성자

Date 생성자:

  • %Date%이다.
  • "Date" 프로퍼티의 초기값이며, 글로벌 객체에 존재한다.
  • 생성자로 호출 시 새로운 Date를 생성 및 초기화한다.
  • 생성자가 아닌 함수로 호출 시, 현재 시간(UTC)을 나타내는 문자열을 반환한다.
  • 인수의 개수와 타입에 따라 동작이 달라지는 함수이다.
  • 클래스 정의의 extends 절 값으로 사용될 수 있다. Date의 동작을 상속하려는 서브클래스 생성자[[DateValue]] 내부 슬롯으로 하위 클래스 인스턴스를 생성 및 초기화하기 위해 반드시 Date 생성자에 대한 super 호출을 포함해야 한다.

21.4.2.1 Date ( ...values )

이 함수는 호출 시 다음 단계를 수행한다:

  1. NewTarget이 undefined이면,
    1. now에 현재 시간을 나타내는 시간 값 (UTC)를 할당한다.
    2. ToDateString(now)를 반환한다.
  2. numberOfArgsvalues의 요소 개수를 할당한다.
  3. numberOfArgs = 0이면,
    1. dv에 현재 시간을 나타내는 시간 값 (UTC)를 할당한다.
  4. numberOfArgs = 1이면,
    1. valuevalues[0]을 할당한다.
    2. value객체이고 value[[DateValue]] 내부 슬롯이 있으면,
      1. tvvalue.[[DateValue]]를 할당한다.
    3. 그 외,
      1. v에 ? ToPrimitive(value)를 할당한다.
      2. v문자열이면,
        1. Assert: 다음 단계는 v가 문자열이므로 비정상 종료를 반환하지 않는다.
        2. tvv를 날짜로 파싱한 결과를 할당하는데, parse 메서드와 정확히 동일한 방식으로 파싱한다 (21.4.3.2 참조).
      3. 그 외,
        1. tv에 ? ToNumber(v)를 할당한다.
    4. dvTimeClip(tv)를 할당한다.
  5. 그 외,
    1. Assert: numberOfArgs ≥ 2임을 보장한다.
    2. y에 ? ToNumber(values[0])를 할당한다.
    3. m에 ? ToNumber(values[1])를 할당한다.
    4. numberOfArgs > 2이면 dt에 ? ToNumber(values[2])를 할당하고, 아니면 dt1𝔽을 할당한다.
    5. numberOfArgs > 3이면 h에 ? ToNumber(values[3])를 할당하고, 아니면 h+0𝔽을 할당한다.
    6. numberOfArgs > 4이면 min에 ? ToNumber(values[4])를 할당하고, 아니면 min+0𝔽을 할당한다.
    7. numberOfArgs > 5이면 s에 ? ToNumber(values[5])를 할당하고, 아니면 s+0𝔽을 할당한다.
    8. numberOfArgs > 6이면 milli에 ? ToNumber(values[6])를 할당하고, 아니면 milli+0𝔽을 할당한다.
    9. yrMakeFullYear(y)를 할당한다.
    10. finalDateMakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli))를 할당한다.
    11. dvTimeClip(UTC(finalDate))를 할당한다.
  6. O에 ? OrdinaryCreateFromConstructor(NewTarget, "%Date.prototype%", « [[DateValue]] ») 을 할당한다.
  7. O.[[DateValue]]dv를 설정한다.
  8. O를 반환한다.

21.4.3 Date 생성자의 속성

Date 생성자:

  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function.prototype%이다.
  • "length" 프로퍼티 값은 7𝔽이다.
  • 다음 프로퍼티를 가진다:

21.4.3.1 Date.now ( )

이 함수는 호출 시점의 UTC 날짜 및 시간을 나타내는 시간 값을 반환한다.

21.4.3.2 Date.parse ( string )

이 함수는 인수에 ToString 연산자를 적용한다. ToString 결과가 비정상 종료Completion Record를 즉시 반환한다. 그렇지 않으면, 결과 문자열을 날짜와 시간으로 해석한다. 반환값은 해당 날짜 및 시간에 대응하는 UTC 시간 값인 Number이다. 문자열은 내용에 따라 현지 시간, UTC 시간, 또는 다른 타임존의 시간으로 해석될 수 있다. 함수는 먼저 Date Time String Format (21.4.1.32) 및 확장 연도에 따라 문자열을 파싱하려 시도한다. 해당 형식에 맞지 않으면 구현별 휴리스틱이나 구현별 날짜 형식으로 대체할 수 있다. 인식 불가하거나 범위 초과 형식 요소가 포함된 문자열은 NaN을 반환해야 한다.

문자열이 Date Time String Format에 적합하면, 누락된 형식 요소는 대체 값으로 채워진다. MM 또는 DD 요소가 없으면 "01"이 사용된다. HH, mm, ss 요소가 없으면 "00"이 사용된다. sss 요소가 없으면 "000"이 사용된다. UTC 오프셋 표기가 없으면 날짜만 있는 형식은 UTC 시간으로, 날짜-시간 형식은 로컬 시간으로 해석된다.

x가 해당 ECMAScript 구현에서 밀리초 값이 0인 Date라면, 아래 모든 표현식은 (모든 프로퍼티가 초기값일 때) 같은 숫자 값을 반환해야 한다:

x.valueOf()
Date.parse(x.toString())
Date.parse(x.toUTCString())
Date.parse(x.toISOString())

하지만 아래 표현식은

Date.parse(x.toLocaleString())

앞선 세 표현식과 같은 Number 값을 반환할 필요가 없으며, 일반적으로 이 함수가 Date Time String Format (21.4.1.32)에 맞지 않는 문자열 또는 해당 구현에서 toString이나 toUTCString 메서드로 생성할 수 없는 문자열을 받는 경우 반환값은 구현 정의이다.

21.4.3.3 Date.prototype

Date.prototype의 초기값은 Date 프로토타입 객체이다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }이다.

21.4.3.4 Date.UTC ( year [ , month [ , date [ , hours [ , minutes [ , seconds [ , ms ] ] ] ] ] ] )

이 함수는 호출 시 다음 단계를 수행한다:

  1. y에 ? ToNumber(year)를 할당한다.
  2. month가 있으면 m에 ? ToNumber(month)를, 없으면 m+0𝔽을 할당한다.
  3. date가 있으면 dt에 ? ToNumber(date)를, 없으면 dt1𝔽을 할당한다.
  4. hours가 있으면 h에 ? ToNumber(hours)를, 없으면 h+0𝔽을 할당한다.
  5. minutes가 있으면 min에 ? ToNumber(minutes)를, 없으면 min+0𝔽을 할당한다.
  6. seconds가 있으면 s에 ? ToNumber(seconds)를, 없으면 s+0𝔽을 할당한다.
  7. ms가 있으면 milli에 ? ToNumber(ms)를, 없으면 milli+0𝔽을 할당한다.
  8. yrMakeFullYear(y)를 할당한다.
  9. TimeClip(MakeDate(MakeDay(yr, m, dt), MakeTime(h, min, s, milli)))를 반환한다.

이 함수의 "length" 프로퍼티 값은 7𝔽이다.

참고

이 함수는 Date 생성자와 두 가지가 다르다: Date를 생성하는 대신 Number로 시간 값을 반환하며, 인수를 로컬 시간 대신 UTC 기준으로 해석한다.

21.4.4 Date 프로토타입 객체의 속성

Date 프로토타입 객체:

  • %Date.prototype%이다.
  • 일반 객체이다.
  • Date 인스턴스가 아니며 [[DateValue]] 내부 슬롯을 가지지 않는다.
  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype%이다.

별도로 명시되지 않는 한, 아래에 정의된 Date 프로토타입 객체의 메서드는 generic이 아니며, 이들에 전달되는 this 값은 초기화된 시간 값을 가진 [[DateValue]] 내부 슬롯이 있는 객체여야 한다.

21.4.4.1 Date.prototype.constructor

Date.prototype.constructor의 초기값은 %Date%이다.

21.4.4.2 Date.prototype.getDate ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. DateFromTime(LocalTime(t))을 반환한다.

21.4.4.3 Date.prototype.getDay ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. WeekDay(LocalTime(t))을 반환한다.

21.4.4.4 Date.prototype.getFullYear ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. YearFromTime(LocalTime(t))을 반환한다.

21.4.4.5 Date.prototype.getHours ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. HourFromTime(LocalTime(t))을 반환한다.

21.4.4.6 Date.prototype.getMilliseconds ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. msFromTime(LocalTime(t))을 반환한다.

21.4.4.7 Date.prototype.getMinutes ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. MinFromTime(LocalTime(t))을 반환한다.

21.4.4.8 Date.prototype.getMonth ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. MonthFromTime(LocalTime(t))을 반환한다.

21.4.4.9 Date.prototype.getSeconds ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. SecFromTime(LocalTime(t))을 반환한다.

21.4.4.10 Date.prototype.getTime ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. dateObject.[[DateValue]]를 반환한다.

21.4.4.11 Date.prototype.getTimezoneOffset ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. (t - LocalTime(t)) / msPerMinute를 반환한다.

21.4.4.12 Date.prototype.getUTCDate ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. DateFromTime(t)를 반환한다.

21.4.4.13 Date.prototype.getUTCDay ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. WeekDay(t)를 반환한다.

21.4.4.14 Date.prototype.getUTCFullYear ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. YearFromTime(t)를 반환한다.

21.4.4.15 Date.prototype.getUTCHours ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. HourFromTime(t)를 반환한다.

21.4.4.16 Date.prototype.getUTCMilliseconds ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. msFromTime(t)를 반환한다.

21.4.4.17 Date.prototype.getUTCMinutes ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. MinFromTime(t)를 반환한다.

21.4.4.18 Date.prototype.getUTCMonth ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. MonthFromTime(t)를 반환한다.

21.4.4.19 Date.prototype.getUTCSeconds ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 NaN을 반환한다.
  5. SecFromTime(t)를 반환한다.

21.4.4.20 Date.prototype.setDate ( date )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. dt에 ? ToNumber(date)를 할당한다.
  5. tNaN이면 NaN을 반환한다.
  6. tLocalTime(t)를 할당한다.
  7. newDateMakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t))를 할당한다.
  8. uTimeClip(UTC(newDate))를 할당한다.
  9. dateObject.[[DateValue]]u를 설정한다.
  10. u를 반환한다.

21.4.4.21 Date.prototype.setFullYear ( year [ , month [ , date ] ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. y에 ? ToNumber(year)를 할당한다.
  5. tNaN이면 t+0𝔽을 할당하고, 아니면 tLocalTime(t)을 할당한다.
  6. month가 없으면 mMonthFromTime(t)을, 있으면 m에 ? ToNumber(month)을 할당한다.
  7. date가 없으면 dtDateFromTime(t)을, 있으면 dt에 ? ToNumber(date)을 할당한다.
  8. newDateMakeDate(MakeDay(y, m, dt), TimeWithinDay(t))를 할당한다.
  9. uTimeClip(UTC(newDate))를 할당한다.
  10. dateObject.[[DateValue]]u를 설정한다.
  11. u를 반환한다.

이 메서드의 "length" 프로퍼티 값은 3𝔽이다.

참고

month가 없으면 이 메서드는 monthgetMonth() 값인 것처럼 동작한다. date가 없으면 dategetDate() 값인 것처럼 동작한다.

21.4.4.22 Date.prototype.setHours ( hour [ , min [ , sec [ , ms ] ] ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. h에 ? ToNumber(hour)를 할당한다.
  5. min이 있으면 m에 ? ToNumber(min)을 할당한다.
  6. sec이 있으면 s에 ? ToNumber(sec)을 할당한다.
  7. ms이 있으면 milli에 ? ToNumber(ms)을 할당한다.
  8. tNaN이면 NaN을 반환한다.
  9. tLocalTime(t)을 할당한다.
  10. min이 없으면 mMinFromTime(t)을 할당한다.
  11. sec이 없으면 sSecFromTime(t)을 할당한다.
  12. ms이 없으면 millimsFromTime(t)을 할당한다.
  13. dateMakeDate(Day(t), MakeTime(h, m, s, milli))를 할당한다.
  14. uTimeClip(UTC(date))를 할당한다.
  15. dateObject.[[DateValue]]u를 설정한다.
  16. u를 반환한다.

이 메서드의 "length" 프로퍼티 값은 4𝔽이다.

참고

min이 없으면 이 메서드는 mingetMinutes() 값인 것처럼 동작한다. sec이 없으면 secgetSeconds() 값인 것처럼, ms가 없으면 msgetMilliseconds() 값인 것처럼 동작한다.

21.4.4.23 Date.prototype.setMilliseconds ( ms )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. ms에 ? ToNumber(ms)를 할당한다.
  5. tNaN이면 NaN을 반환한다.
  6. tLocalTime(t)을 할당한다.
  7. timeMakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)를 할당한다.
  8. uTimeClip(UTC(MakeDate(Day(t), time)))를 할당한다.
  9. dateObject.[[DateValue]]u를 설정한다.
  10. u를 반환한다.

21.4.4.24 Date.prototype.setMinutes ( min [ , sec [ , ms ] ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. m에 ? ToNumber(min)를 할당한다.
  5. sec이 있으면 s에 ? ToNumber(sec)을 할당한다.
  6. ms이 있으면 milli에 ? ToNumber(ms)을 할당한다.
  7. tNaN이면 NaN을 반환한다.
  8. tLocalTime(t)을 할당한다.
  9. sec이 없으면 sSecFromTime(t)을 할당한다.
  10. ms이 없으면 millimsFromTime(t)을 할당한다.
  11. dateMakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli))를 할당한다.
  12. uTimeClip(UTC(date))를 할당한다.
  13. dateObject.[[DateValue]]u를 설정한다.
  14. u를 반환한다.

이 메서드의 "length" 프로퍼티 값은 3𝔽이다.

참고

sec이 없으면 이 메서드는 secgetSeconds() 값인 것처럼 동작한다. ms가 없으면 msgetMilliseconds() 값인 것처럼 동작한다.

21.4.4.25 Date.prototype.setMonth ( month [ , date ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. m에 ? ToNumber(month)를 할당한다.
  5. date가 있으면 dt에 ? ToNumber(date)를 할당한다.
  6. tNaN이면 NaN을 반환한다.
  7. tLocalTime(t)을 할당한다.
  8. date가 없으면 dtDateFromTime(t)을 할당한다.
  9. newDateMakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t))를 할당한다.
  10. uTimeClip(UTC(newDate))를 할당한다.
  11. dateObject.[[DateValue]]u를 설정한다.
  12. u를 반환한다.

이 메서드의 "length" 프로퍼티 값은 2𝔽이다.

참고

date가 없으면 이 메서드는 dategetDate() 값인 것처럼 동작한다.

21.4.4.26 Date.prototype.setSeconds ( sec [ , ms ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. s에 ? ToNumber(sec)를 할당한다.
  5. ms이 있으면 milli에 ? ToNumber(ms)을 할당한다.
  6. tNaN이면 NaN을 반환한다.
  7. tLocalTime(t)을 할당한다.
  8. ms이 없으면 millimsFromTime(t)을 할당한다.
  9. dateMakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli))를 할당한다.
  10. uTimeClip(UTC(date))를 할당한다.
  11. dateObject.[[DateValue]]u를 설정한다.
  12. u를 반환한다.

이 메서드의 "length" 프로퍼티 값은 2𝔽이다.

참고

ms가 없으면 이 메서드는 msgetMilliseconds() 값인 것처럼 동작한다.

21.4.4.27 Date.prototype.setTime ( time )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. t에 ? ToNumber(time)를 할당한다.
  4. vTimeClip(t)를 할당한다.
  5. dateObject.[[DateValue]]v를 설정한다.
  6. v를 반환한다.

21.4.4.28 Date.prototype.setUTCDate ( date )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. dt에 ? ToNumber(date)를 할당한다.
  5. tNaN이면 NaN을 반환한다.
  6. newDateMakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t))를 할당한다.
  7. vTimeClip(newDate)를 할당한다.
  8. dateObject.[[DateValue]]v를 설정한다.
  9. v를 반환한다.

21.4.4.29 Date.prototype.setUTCFullYear ( year [ , month [ , date ] ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. tNaN이면 t+0𝔽을 할당한다.
  5. y에 ? ToNumber(year)를 할당한다.
  6. month가 없으면 mMonthFromTime(t)을, 있으면 m에 ? ToNumber(month)을 할당한다.
  7. date가 없으면 dtDateFromTime(t)을, 있으면 dt에 ? ToNumber(date)을 할당한다.
  8. newDateMakeDate(MakeDay(y, m, dt), TimeWithinDay(t))를 할당한다.
  9. vTimeClip(newDate)를 할당한다.
  10. dateObject.[[DateValue]]v를 설정한다.
  11. v를 반환한다.

이 메서드의 "length" 프로퍼티 값은 3𝔽이다.

참고

month가 없으면 이 메서드는 monthgetUTCMonth() 값인 것처럼 동작한다. date가 없으면 dategetUTCDate() 값인 것처럼 동작한다.

21.4.4.30 Date.prototype.setUTCHours ( hour [ , min [ , sec [ , ms ] ] ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. h에 ? ToNumber(hour)를 할당한다.
  5. min이 있으면 m에 ? ToNumber(min)을 할당한다.
  6. sec이 있으면 s에 ? ToNumber(sec)을 할당한다.
  7. ms이 있으면 milli에 ? ToNumber(ms)을 할당한다.
  8. tNaN이면 NaN을 반환한다.
  9. min이 없으면 mMinFromTime(t)을 할당한다.
  10. sec이 없으면 sSecFromTime(t)을 할당한다.
  11. ms이 없으면 millimsFromTime(t)을 할당한다.
  12. dateMakeDate(Day(t), MakeTime(h, m, s, milli))를 할당한다.
  13. vTimeClip(date)를 할당한다.
  14. dateObject.[[DateValue]]v를 설정한다.
  15. v를 반환한다.

이 메서드의 "length" 프로퍼티 값은 4𝔽이다.

참고

min이 없으면 이 메서드는 mingetUTCMinutes() 값인 것처럼 동작한다. sec이 없으면 secgetUTCSeconds() 값인 것처럼, ms가 없으면 msgetUTCMilliseconds() 값인 것처럼 동작한다.

21.4.4.31 Date.prototype.setUTCMilliseconds ( ms )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. ms에 ? ToNumber(ms)를 할당한다.
  5. tNaN이면 NaN을 반환한다.
  6. timeMakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)를 할당한다.
  7. vTimeClip(MakeDate(Day(t), time))를 할당한다.
  8. dateObject.[[DateValue]]v를 설정한다.
  9. v를 반환한다.

21.4.4.32 Date.prototype.setUTCMinutes ( min [ , sec [ , ms ] ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. m에 ? ToNumber(min)를 할당한다.
  5. sec이 있으면 s에 ? ToNumber(sec)을 할당한다.
  6. ms이 있으면 milli에 ? ToNumber(ms)을 할당한다.
  7. tNaN이면 NaN을 반환한다.
  8. sec이 없으면 sSecFromTime(t)을 할당한다.
  9. ms이 없으면 millimsFromTime(t)을 할당한다.
  10. dateMakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli))를 할당한다.
  11. vTimeClip(date)를 할당한다.
  12. dateObject.[[DateValue]]v를 설정한다.
  13. v를 반환한다.

이 메서드의 "length" 프로퍼티 값은 3𝔽이다.

참고

sec이 없으면 이 메서드는 secgetUTCSeconds() 값인 것처럼 동작한다. ms가 없으면 msgetUTCMilliseconds() 값인 것처럼 동작한다.

21.4.4.33 Date.prototype.setUTCMonth ( month [ , date ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. m에 ? ToNumber(month)를 할당한다.
  5. date가 있으면 dt에 ? ToNumber(date)를 할당한다.
  6. tNaN이면 NaN을 반환한다.
  7. date가 없으면 dtDateFromTime(t)을 할당한다.
  8. newDateMakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t))를 할당한다.
  9. vTimeClip(newDate)를 할당한다.
  10. dateObject.[[DateValue]]v를 설정한다.
  11. v를 반환한다.

이 메서드의 "length" 프로퍼티 값은 2𝔽이다.

참고

date가 없으면 이 메서드는 dategetUTCDate() 값인 것처럼 동작한다.

21.4.4.34 Date.prototype.setUTCSeconds ( sec [ , ms ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]를 할당한다.
  4. s에 ? ToNumber(sec)를 할당한다.
  5. ms이 있으면 milli에 ? ToNumber(ms)을 할당한다.
  6. tNaN이면 NaN을 반환한다.
  7. ms이 없으면 millimsFromTime(t)을 할당한다.
  8. dateMakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli))를 할당한다.
  9. vTimeClip(date)를 할당한다.
  10. dateObject.[[DateValue]]v를 설정한다.
  11. v를 반환한다.

이 메서드의 "length" 프로퍼티 값은 2𝔽이다.

참고

ms가 없으면 이 메서드는 msgetUTCMilliseconds() 값인 것처럼 동작한다.

21.4.4.35 Date.prototype.toDateString ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tvdateObject.[[DateValue]]를 할당한다.
  4. tvNaN이면 "Invalid Date"를 반환한다.
  5. tLocalTime(tv)를 할당한다.
  6. DateString(t)를 반환한다.

21.4.4.36 Date.prototype.toISOString ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tvdateObject.[[DateValue]]를 할당한다.
  4. tvNaN이면 RangeError 예외를 던진다.
  5. Assert: tv정수 Number이다.
  6. tv날짜-시간 문자열 형식에서 표현할 수 없는 연도에 해당하면 RangeError 예외를 던진다.
  7. tv날짜-시간 문자열 형식의 UTC 시간대로 모든 형식 요소 및 UTC 오프셋 표기 "Z"을 포함해 문자열로 반환한다.

21.4.4.37 Date.prototype.toJSON ( key )

이 메서드는 JSON.stringify (25.5.2)에서 사용할 Date의 문자열 표현을 제공합니다.

호출 시 다음 단계를 수행합니다:

  1. O에 ? ToObject(this 값)을 할당한다.
  2. tv에 ? ToPrimitive(O, number)를 할당한다.
  3. tvNumber이고 tv유한이 아니면 null을 반환한다.
  4. Invoke(O, "toISOString")을 반환한다.
참고 1

인수는 무시됩니다.

참고 2

이 메서드는 의도적으로 generic입니다. this 값이 Date일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있습니다. 하지만 해당 객체에 toISOString 메서드가 있어야 합니다.

21.4.4.38 Date.prototype.toLocaleDateString ( [ reserved1 [ , reserved2 ] ] )

ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 합니다. ECMA-402 API를 포함하지 않는 구현의 경우 아래 명세를 따릅니다:

이 메서드는 문자열 값을 반환합니다. 문자열의 내용은 구현 정의이지만, 현재 타임존의 Date의 "날짜" 부분을 호스트 환경의 현재 로케일 관습에 맞는 편리하고 사람이 읽기 쉬운 형태로 나타내는 것이 목적입니다.

이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 사용해서는 안 됩니다.

21.4.4.39 Date.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 합니다. ECMA-402 API를 포함하지 않는 구현의 경우 아래 명세를 따릅니다:

이 메서드는 문자열 값을 반환합니다. 문자열의 내용은 구현 정의이지만, 현재 타임존의 Date를 호스트 환경의 현재 로케일 관습에 맞는 편리하고 사람이 읽기 쉬운 형태로 나타내는 것이 목적입니다.

이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 사용해서는 안 됩니다.

21.4.4.40 Date.prototype.toLocaleTimeString ( [ reserved1 [ , reserved2 ] ] )

ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 합니다. ECMA-402 API를 포함하지 않는 구현의 경우 아래 명세를 따릅니다:

이 메서드는 문자열 값을 반환합니다. 문자열의 내용은 구현 정의이지만, 현재 타임존의 Date의 "시간" 부분을 호스트 환경의 현재 로케일 관습에 맞는 편리하고 사람이 읽기 쉬운 형태로 나타내는 것이 목적입니다.

이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 사용해서는 안 됩니다.

21.4.4.41 Date.prototype.toString ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tvdateObject.[[DateValue]]를 할당한다.
  4. ToDateString(tv)를 반환한다.
참고 1

어떤 Date d에 대해 d.[[DateValue]]가 1000으로 나누어떨어지면, Date.parse(d.toString()) = d.valueOf()가 성립합니다. 21.4.3.2 참조.

참고 2

이 메서드는 generic이 아니므로 this 값이 Date가 아니면 TypeError 예외를 던집니다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 없습니다.

21.4.4.41.1 TimeString ( tv )

TimeString 추상 연산은 tv(Number, NaN 제외)를 인수로 받아 문자열을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. hourToZeroPaddedDecimalString((HourFromTime(tv)), 2)를 할당한다.
  2. minuteToZeroPaddedDecimalString((MinFromTime(tv)), 2).
  3. secondToZeroPaddedDecimalString((SecFromTime(tv)), 2).
  4. hour, ":", minute, ":", second, 코드 유닛 0x0020(SPACE), "GMT"string-concatenation으로 반환한다.

21.4.4.41.2 DateString ( tv )

DateString 추상 연산은 tv(Number, NaN 제외)를 인수로 받아 문자열을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. weekday표 65에서 WeekDay(tv)에 해당하는 Name을 할당한다.
  2. month표 66에서 MonthFromTime(tv)에 해당하는 Name을 할당한다.
  3. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2)를 할당한다.
  4. yvYearFromTime(tv)를 할당한다.
  5. yv+0𝔽이거나 yv > +0𝔽이면 yearSign을 빈 문자열로, 아니면 yearSign"-"로 설정한다.
  6. paddedYearToZeroPaddedDecimalString(abs((yv)), 4)를 할당한다.
  7. weekday, 코드 유닛 0x0020(SPACE), month, 코드 유닛 0x0020(SPACE), day, 코드 유닛 0x0020(SPACE), yearSign, paddedYearstring-concatenation으로 반환한다.
표 65: 요일 이름
숫자 이름
+0𝔽 "Sun"
1𝔽 "Mon"
2𝔽 "Tue"
3𝔽 "Wed"
4𝔽 "Thu"
5𝔽 "Fri"
6𝔽 "Sat"
표 66: 월 이름
숫자 이름
+0𝔽 "Jan"
1𝔽 "Feb"
2𝔽 "Mar"
3𝔽 "Apr"
4𝔽 "May"
5𝔽 "Jun"
6𝔽 "Jul"
7𝔽 "Aug"
8𝔽 "Sep"
9𝔽 "Oct"
10𝔽 "Nov"
11𝔽 "Dec"

21.4.4.41.3 TimeZoneString ( tv )

TimeZoneString 추상 연산은 tv(정수 Number)를 인수로 받아 문자열을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. systemTimeZoneIdentifierSystemTimeZoneIdentifier()를 할당한다.
  2. IsTimeZoneOffsetString(systemTimeZoneIdentifier) 가 true이면,
    1. offsetNsParseTimeZoneOffsetString(systemTimeZoneIdentifier)를 할당한다.
  3. 그 외,
    1. offsetNsGetNamedTimeZoneOffsetNanoseconds(systemTimeZoneIdentifier, ((tv) × 106))를 할당한다.
  4. offset𝔽(truncate(offsetNs / 106))를 할당한다.
  5. offset+0𝔽이거나 offset > +0𝔽이면,
    1. offsetSign"+"를 할당한다.
    2. absOffsetoffset을 할당한다.
  6. 그 외,
    1. offsetSign"-"를 할당한다.
    2. absOffset에 -offset을 할당한다.
  7. offsetMinToZeroPaddedDecimalString((MinFromTime(absOffset)), 2)를 할당한다.
  8. offsetHourToZeroPaddedDecimalString((HourFromTime(absOffset)), 2)를 할당한다.
  9. tzName에 빈 문자열 또는 코드 유닛 0x0020(SPACE), 코드 유닛 0x0028(LEFT PAREN), 구현 정의 타임존 이름, 코드 유닛 0x0029(RIGHT PAREN)를 string-concatenation으로 연결한 문자열 중 하나를 할당한다.
  10. offsetSign, offsetHour, offsetMin, tzNamestring-concatenation으로 반환한다.

21.4.4.41.4 ToDateString ( tv )

ToDateString 추상 연산은 tv(정수 Number 또는 NaN)를 인수로 받아 문자열을 반환합니다. 호출 시 다음 단계를 수행합니다:

  1. tvNaN이면 "Invalid Date"를 반환한다.
  2. tLocalTime(tv)를 할당한다.
  3. DateString(t), 코드 유닛 0x0020(SPACE), TimeString(t), TimeZoneString(tv)를 string-concatenation으로 반환한다.

21.4.4.42 Date.prototype.toTimeString ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tvdateObject.[[DateValue]]를 할당한다.
  4. tvNaN이면 "Invalid Date"를 반환한다.
  5. tLocalTime(tv)를 할당한다.
  6. TimeString(t)과 TimeZoneString(tv)를 string-concatenation으로 반환한다.

21.4.4.43 Date.prototype.toUTCString ( )

이 메서드는 this 값에 해당하는 시점을 나타내는 문자열 값을 반환합니다. 문자열 형식은 RFC 7231의 "HTTP-date"를 기반으로 하며, ECMAScript Date가 지원하는 전체 시간 범위를 일반화하여 지원합니다.

호출 시 다음 단계를 수행합니다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tvdateObject.[[DateValue]]를 할당한다.
  4. tvNaN이면 "Invalid Date"를 반환한다.
  5. weekday표 65에서 WeekDay(tv)에 해당하는 이름을 할당한다.
  6. month표 66에서 MonthFromTime(tv)에 해당하는 이름을 할당한다.
  7. dayToZeroPaddedDecimalString((DateFromTime(tv)), 2)를 할당한다.
  8. yvYearFromTime(tv)를 할당한다.
  9. yv+0𝔽이거나 yv > +0𝔽이면 yearSign을 빈 문자열로, 아니면 yearSign"-"로 설정한다.
  10. paddedYearToZeroPaddedDecimalString(abs((yv)), 4)를 할당한다.
  11. weekday, ",", 코드 유닛 0x0020(SPACE), day, 코드 유닛 0x0020(SPACE), month, 코드 유닛 0x0020(SPACE), yearSign, paddedYear, 코드 유닛 0x0020(SPACE), TimeString(tv)를 string-concatenation으로 반환한다.

21.4.4.44 Date.prototype.valueOf ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. dateObjectthis 값을 할당한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. dateObject.[[DateValue]]를 반환한다.

21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )

이 메서드는 ECMAScript 언어 연산자가 Date를 원시값으로 변환할 때 호출됩니다. hint의 허용 값은 "default", "number", "string"입니다. Date는 내장 ECMAScript 객체 중 유일하게 "default""string"과 동등하게 취급합니다. 다른 내장 ECMAScript 객체는 "default""number"과 동등하게 취급합니다.

호출 시 다음 단계를 수행합니다:

  1. Othis 값을 할당한다.
  2. O객체가 아니면, TypeError 예외를 던진다.
  3. hint"string" 또는 "default"이면,
    1. tryFirststring을 할당한다.
  4. 그 외 hint"number"이면,
    1. tryFirstnumber를 할당한다.
  5. 그 외,
    1. TypeError 예외를 던진다.
  6. OrdinaryToPrimitive(O, tryFirst)를 반환한다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }이다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.toPrimitive]"이다.

21.4.5 Date 인스턴스의 속성

Date 인스턴스는 일반 객체이며, Date 프로토타입 객체로부터 프로퍼티를 상속받습니다. Date 인스턴스는 또한 [[DateValue]] 내부 슬롯을 가집니다. [[DateValue]] 내부 슬롯은 이 Date가 나타내는 시간 값입니다.

22 텍스트 처리

22.1 문자열 객체

22.1.1 String 생성자

String 생성자:

  • %String%이다.
  • "String" 프로퍼티의 초기값이며, 글로벌 객체에 존재한다.
  • 생성자로 호출 시 새로운 문자열 객체를 생성 및 초기화한다.
  • 생성자가 아닌 함수로 호출 시, 타입 변환을 수행한다.
  • 클래스 정의의 extends 절 값으로 사용될 수 있다. String 동작을 상속하려는 서브클래스 생성자[[StringData]] 내부 슬롯으로 하위 클래스 인스턴스를 생성 및 초기화하기 위해 반드시 String 생성자에 대한 super 호출을 포함해야 한다.

22.1.1.1 String ( value )

이 함수는 호출 시 다음 단계를 수행한다:

  1. value가 없으면,
    1. s에 빈 문자열을 할당한다.
  2. 그 외,
    1. NewTarget이 undefined이고 valueSymbol이면, SymbolDescriptiveString(value)를 반환한다.
    2. s에 ? ToString(value)를 할당한다.
  3. NewTarget이 undefined이면 s를 반환한다.
  4. StringCreate(s, ? GetPrototypeFromConstructor(NewTarget, "%String.prototype%"))를 반환한다.

22.1.2 String 생성자의 속성

String 생성자:

  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function.prototype%이다.
  • 다음 프로퍼티를 가진다:

22.1.2.1 String.fromCharCode ( ...codeUnits )

이 함수는 임의 개수의 인수(codeUnits rest parameter)를 받아 호출될 수 있다.

호출 시 다음 단계를 수행한다:

  1. result에 빈 문자열을 할당한다.
  2. codeUnits의 각 요소 next에 대해,
    1. nextCUnext를 ? ToUint16로 변환한 후 로 변환한 코드 유닛 값을 할당한다.
    2. resultresultnextCU문자열 연결한 결과를 재할당한다.
  3. result를 반환한다.

이 함수의 "length" 프로퍼티 값은 1𝔽이다.

22.1.2.2 String.fromCodePoint ( ...codePoints )

이 함수는 임의 개수의 인수(codePoints rest parameter)를 받아 호출될 수 있다.

호출 시 다음 단계를 수행한다:

  1. result에 빈 문자열을 할당한다.
  2. codePoints의 각 요소 next에 대해,
    1. nextCP에 ? ToNumber(next)를 할당한다.
    2. nextCP정수 Number가 아니면 RangeError 예외를 던진다.
    3. (nextCP) < 0 또는 (nextCP) > 0x10FFFF이면 RangeError 예외를 던진다.
    4. resultresultUTF16EncodeCodePoint((nextCP))를 문자열 연결하여 재할당한다.
  3. Assert: codePoints가 비어 있으면 result는 빈 문자열이다.
  4. result를 반환한다.

이 함수의 "length" 프로퍼티 값은 1𝔽이다.

22.1.2.3 String.prototype

String.prototype의 초기값은 String 프로토타입 객체이다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }이다.

22.1.2.4 String.raw ( template, ...substitutions )

이 함수는 가변 개수의 인수를 받는다. 첫 번째 인수는 template, 나머지는 List substitutions이다.

호출 시 다음 단계를 수행한다:

  1. substitutionCountsubstitutions의 요소 개수를 할당한다.
  2. cooked에 ? ToObject(template)를 할당한다.
  3. literals에 ? ToObject(? Get(cooked, "raw"))를 할당한다.
  4. literalCount에 ? LengthOfArrayLike(literals)를 할당한다.
  5. literalCount ≤ 0이면 빈 문자열을 반환한다.
  6. R에 빈 문자열을 할당한다.
  7. nextIndex에 0을 할당한다.
  8. 반복,
    1. nextLiteralVal에 ? Get(literals, ! ToString(𝔽(nextIndex)))를 할당한다.
    2. nextLiteral에 ? ToString(nextLiteralVal)를 할당한다.
    3. RRnextLiteral문자열 연결한 결과를 재할당한다.
    4. nextIndex + 1 = literalCount이면 R를 반환한다.
    5. nextIndex < substitutionCount이면,
      1. nextSubValsubstitutions[nextIndex]를 할당한다.
      2. nextSub에 ? ToString(nextSubVal)를 할당한다.
      3. RRnextSub문자열 연결한 결과를 재할당한다.
    6. nextIndexnextIndex + 1을 할당한다.
참고

이 함수는 Tagged Template (13.3.11)의 태그 함수로 사용하기 위해 설계되었습니다. 그렇게 호출될 때 첫 번째 인수는 올바른 템플릿 객체이며 나머지 rest parameter는 치환값을 포함하게 됩니다.

22.1.3 String 프로토타입 객체의 속성

String 프로토타입 객체:

  • %String.prototype%이다.
  • 문자열 익조틱 객체이며 해당 객체에 대해 지정된 내부 메서드를 가진다.
  • [[StringData]] 내부 슬롯을 가지며, 그 값은 빈 문자열이다.
  • "length" 프로퍼티를 가지며 초기값은 +0𝔽이고, 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }이다.
  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype%이다.

별도로 명시되지 않는 한, 아래에 정의된 String 프로토타입 객체의 메서드는 generic이 아니며, 이들에 전달되는 this 값은 반드시 문자열 값이거나 [[StringData]] 내부 슬롯이 문자열 값으로 초기화된 객체여야 한다.

22.1.3.1 String.prototype.at ( index )

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. lenS의 길이를 할당한다.
  4. relativeIndex에 ? ToIntegerOrInfinity(index)를 할당한다.
  5. relativeIndex ≥ 0이면,
    1. krelativeIndex를 할당한다.
  6. 그 외,
    1. klen + relativeIndex를 할당한다.
  7. k < 0 또는 klen이면 undefined를 반환한다.
  8. Sk부터 k + 1까지의 부분 문자열을 반환한다.

22.1.3.2 String.prototype.charAt ( pos )

참고 1

이 메서드는 이 객체를 문자열로 변환한 값에서 pos 인덱스에 위치한 코드 유닛을 포함하는 단일 요소 문자열을 반환한다. 해당 인덱스에 요소가 없으면 결과는 빈 문자열이다. 결과는 문자열 값이며, 문자열 객체가 아니다.

pos정수 Number이면, x.charAt(pos)의 결과는 x.substring(pos, pos + 1)의 결과와 같다.

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. position에 ? ToIntegerOrInfinity(pos)를 할당한다.
  4. sizeS의 길이를 할당한다.
  5. position < 0 또는 positionsize이면 빈 문자열을 반환한다.
  6. Sposition부터 position + 1까지의 부분 문자열을 반환한다.
참고 2

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.3 String.prototype.charCodeAt ( pos )

참고 1

이 메서드는 이 객체를 문자열로 변환한 값에서 pos 인덱스에 위치한 코드 유닛의 숫자 값을 나타내는 Number(음이 아닌 정수 Number이며 216 미만)를 반환한다. 해당 인덱스에 요소가 없으면 결과는 NaN이다.

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. position에 ? ToIntegerOrInfinity(pos)를 할당한다.
  4. sizeS의 길이를 할당한다.
  5. position < 0 또는 positionsize이면 NaN을 반환한다.
  6. Sposition 인덱스 코드 유닛의 숫자 값을 Number 값으로 반환한다.
참고 2

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.4 String.prototype.codePointAt ( pos )

참고 1

이 메서드는 이 객체를 문자열로 변환한 값에서 pos 인덱스에서 시작하는 UTF-16 인코딩 코드 포인트(6.1.4)의 숫자 값을 나타내는 음이 아닌 정수 Number(0x10FFFF𝔽 이하)를 반환한다. 해당 인덱스에 요소가 없으면 결과는 undefined이다. 유효한 UTF-16 서로게이트 페어pos에서 시작하지 않으면, 결과는 pos의 코드 유닛이다.

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. position에 ? ToIntegerOrInfinity(pos)를 할당한다.
  4. sizeS의 길이를 할당한다.
  5. position < 0 또는 positionsize이면 undefined를 반환한다.
  6. cpCodePointAt(S, position)을 할당한다.
  7. cp.[[CodePoint]]𝔽로 변환하여 반환한다.
참고 2

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.5 String.prototype.concat ( ...args )

참고 1

이 메서드를 호출하면 this 값을(문자열로 변환) 시작으로 각 인수를 문자열로 변환한 코드 유닛이 뒤따르는 문자열 값을 반환한다. 결과는 문자열 값이며, 문자열 객체가 아니다.

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. RS를 할당한다.
  4. args의 각 요소 next에 대해,
    1. nextString에 ? ToString(next)를 할당한다.
    2. RRnextString문자열 연결한 결과를 재할당한다.
  5. R를 반환한다.

이 메서드의 "length" 프로퍼티 값은 1𝔽이다.

참고 2

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.6 String.prototype.constructor

String.prototype.constructor의 초기값은 %String%이다.

22.1.3.7 String.prototype.endsWith ( searchString [ , endPosition ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. isRegExp에 ? IsRegExp(searchString)를 할당한다.
  4. isRegExptrue이면 TypeError 예외를 던진다.
  5. searchStr에 ? ToString(searchString)를 할당한다.
  6. lenS의 길이를 할당한다.
  7. endPositionundefined이면 poslen을, 아니면 pos에 ? ToIntegerOrInfinity(endPosition)을 할당한다.
  8. end0과 len 사이로 clampingpos를 할당한다.
  9. searchLengthsearchStr의 길이를 할당한다.
  10. searchLength = 0이면 true를 반환한다.
  11. startend - searchLength를 할당한다.
  12. start < 0이면 false를 반환한다.
  13. substringSstart부터 end까지의 부분 문자열을 할당한다.
  14. substringsearchStr이면 true를 반환한다.
  15. false를 반환한다.
참고 1

이 메서드는 searchString을 문자열로 변환한 코드 유닛 시퀀스가, 이 객체(문자열로 변환)의 endPosition - length(this)에서 시작하는 코드 유닛과 동일하면 true를 반환한다. 그렇지 않으면 false를 반환한다.

참고 2

첫 번째 인수가 RegExp인 경우 예외를 던지는 것은, 향후 버전에서 그러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함이다.

참고 3

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.8 String.prototype.includes ( searchString [ , position ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. isRegExp에 ? IsRegExp(searchString)를 할당한다.
  4. isRegExptrue이면 TypeError 예외를 던진다.
  5. searchStr에 ? ToString(searchString)를 할당한다.
  6. pos에 ? ToIntegerOrInfinity(position)를 할당한다.
  7. Assert: positionundefined이면 pos는 0이다.
  8. lenS의 길이를 할당한다.
  9. start0과 len 사이로 clampingpos를 할당한다.
  10. indexStringIndexOf(S, searchStr, start)를 할당한다.
  11. indexnot-found이면 false를 반환한다.
  12. true를 반환한다.
참고 1

searchString이 이 객체를 문자열로 변환한 결과에서 position 이상의 인덱스에서 부분 문자열로 나타나면 true를 반환하고, 그렇지 않으면 false를 반환한다. positionundefined이면 0으로 간주되어 전체 문자열을 검색한다.

참고 2

첫 번째 인수가 RegExp인 경우 예외를 던지는 것은, 향후 버전에서 그러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함이다.

참고 3

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.9 String.prototype.indexOf ( searchString [ , position ] )

참고 1

searchString이 이 객체를 문자열로 변환한 결과에서 position 이상의 인덱스에서 부분 문자열로 나타나면, 가장 작은 해당 인덱스를 반환하고, 그렇지 않으면 -1𝔽를 반환한다. positionundefined이면 +0𝔽으로 간주되어 전체 문자열을 검색한다.

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. searchStr에 ? ToString(searchString)를 할당한다.
  4. pos에 ? ToIntegerOrInfinity(position)를 할당한다.
  5. Assert: positionundefined이면 pos는 0이다.
  6. lenS의 길이를 할당한다.
  7. start0과 len 사이로 clampingpos를 할당한다.
  8. resultStringIndexOf(S, searchStr, start)를 할당한다.
  9. resultnot-found이면 -1𝔽를 반환한다.
  10. 𝔽(result)를 반환한다.
참고 2

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.10 String.prototype.isWellFormed ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. IsStringWellFormedUnicode(S)를 반환한다.

22.1.3.11 String.prototype.lastIndexOf ( searchString [ , position ] )

참고 1

searchString이 이 객체를 문자열로 변환한 결과에서 position 이하의 인덱스에서 부분 문자열로 나타나면, 가장 큰 해당 인덱스를 반환하고, 그렇지 않으면 -1𝔽를 반환한다. positionundefined이면 문자열 값의 길이로 간주되어 전체 문자열을 검색한다.

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. searchStr에 ? ToString(searchString)를 할당한다.
  4. numPos에 ? ToNumber(position)를 할당한다.
  5. Assert: positionundefined이면 numPosNaN이다.
  6. numPosNaN이면 pos에 +∞를, 아니면 pos에 ! ToIntegerOrInfinity(numPos)를 할당한다.
  7. lenS의 길이를 할당한다.
  8. searchLensearchStr의 길이를 할당한다.
  9. start0과 len - searchLen 사이로 clampingpos를 할당한다.
  10. resultStringLastIndexOf(S, searchStr, start)를 할당한다.
  11. resultnot-found이면 -1𝔽를 반환한다.
  12. 𝔽(result)를 반환한다.
참고 2

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.12 String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] ] )

ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 한다. ECMA-402 API를 포함하지 않는 구현의 경우 아래 명세를 따릅니다:

이 메서드는 NaN이 아닌 Number를 반환하며, this 값을(문자열 S로 변환) that과(문자열 thatValue로 변환) 구현 정의 로케일 민감한 문자열 비교 결과를 나타낸다. 결과는 정렬 순서에 따라 SthatValue 앞에 있으면 음수, 뒤에 있으면 양수, 그 외의 경우(상대적 순서가 없는 경우) 0이 된다.

비교 전, 이 메서드는 문자열을 준비하기 위해 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. thatValue에 ? ToString(that)를 할당한다.

이 메서드의 두 번째, 세 번째 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 할당해서는 안 된다.

실제 반환 값은 구현 정의로, 추가 정보를 인코딩할 수 있도록 허용되지만, 이 메서드는 두 인수에 대해 일관된 비교자로서 모든 문자열 집합에 대해 전체 순서를 정의해야 한다. 또한, 이 메서드는 유니코드 표준에 따라 정규 동등성을 인식하고 존중해야 하며, 구분 가능한 문자열이 정규 동등할 경우 비교 결과는 +0𝔽이어야 한다.

참고 1

이 메서드는 Array.prototype.sort의 인수로 직접 적합하지 않다. 후자는 두 인수의 함수가 필요하기 때문이다.

참고 2

이 메서드는 ECMAScript 환경에서 호스트 환경에서 제공하는 언어나 로케일 민감 비교 기능에 의존할 수 있으며, 호스트 환경의 현재 로케일 관습에 따라 비교하도록 설계되었다. 그러나 비교 기능과 상관없이 이 메서드는 반드시 유니코드 표준의 정규 동등성을 인식하고 존중해야 한다. 예를 들어, 다음 비교는 모두 +0𝔽을 반환해야 한다:

// Å ANGSTROM SIGN vs.
// Å LATIN CAPITAL LETTER A + COMBINING RING ABOVE
"\u212B".localeCompare("A\u030A")

// Ω OHM SIGN vs.
// Ω GREEK CAPITAL LETTER OMEGA
"\u2126".localeCompare("\u03A9")

// ṩ LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE vs.
// ṩ LATIN SMALL LETTER S + COMBINING DOT ABOVE + COMBINING DOT BELOW
"\u1E69".localeCompare("s\u0307\u0323")

// ḍ̇ LATIN SMALL LETTER D WITH DOT ABOVE + COMBINING DOT BELOW vs.
// ḍ̇ LATIN SMALL LETTER D WITH DOT BELOW + COMBINING DOT ABOVE
"\u1E0B\u0323".localeCompare("\u1E0D\u0307")

// 가 HANGUL CHOSEONG KIYEOK + HANGUL JUNGSEONG A vs.
// 가 HANGUL SYLLABLE GA
"\u1100\u1161".localeCompare("\uAC00")

정규 동등성의 정의와 논의는 유니코드 표준 2, 3장, Unicode Standard Annex #15, Unicode Normalization Forms, Unicode Technical Note #5, Canonical Equivalence in Applications, Unicode Technical Standard #10, Unicode Collation Algorithm를 참조.

이 메서드는 유니코드 호환 동등성 또는 호환 분해(유니코드 표준 3장 3.7절 참조)는 존중하지 않는 것이 권장된다.

참고 3

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.13 String.prototype.match ( regexp )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. regexpundefined 또는 null이 아니면,
    1. matcher에 ? GetMethod(regexp, %Symbol.match%)를 할당한다.
    2. matcherundefined가 아니면,
      1. Call(matcher, regexp, « O »)를 반환한다.
  3. S에 ? ToString(O)를 할당한다.
  4. rx에 ? RegExpCreate(regexp, undefined)를 할당한다.
  5. Invoke(rx, %Symbol.match%, « S »)를 반환한다.
참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.14 String.prototype.matchAll ( regexp )

이 메서드는 this 값을 나타내는 문자열에 대해 regexp로 정규표현식 매칭을 수행하고, 매칭 결과를 산출하는 이터레이터를 반환한다. 각 매칭 결과는 문자열에서 매칭된 부분을 첫 번째 요소로 하고, 이후에는 캡처 그룹에 매칭된 부분이 순서대로 들어있는 배열이다. 정규표현식이 한 번도 매칭되지 않으면, 반환된 이터레이터는 아무 매칭 결과도 산출하지 않는다.

호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. regexpundefined 또는 null이 아니면,
    1. isRegExp에 ? IsRegExp(regexp)를 할당한다.
    2. isRegExptrue이면,
      1. flags에 ? Get(regexp, "flags")를 할당한다.
      2. RequireObjectCoercible(flags)를 수행한다.
      3. ToString(flags)에 "g"가 포함되어 있지 않으면 TypeError 예외를 던진다.
    3. matcher에 ? GetMethod(regexp, %Symbol.matchAll%)를 할당한다.
    4. matcherundefined가 아니면,
      1. Call(matcher, regexp, « O »)를 반환한다.
  3. S에 ? ToString(O)를 할당한다.
  4. rx에 ? RegExpCreate(regexp, "g")를 할당한다.
  5. Invoke(rx, %Symbol.matchAll%, « S »)를 반환한다.
참고 1
이 메서드는 의도적으로 generic이므로 this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.
참고 2
String.prototype.split과 유사하게 String.prototype.matchAll은 일반적으로 입력값을 변형하지 않도록 설계되었다.

22.1.3.15 String.prototype.normalize ( [ form ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. formundefined이면 f"NFC"를 할당한다.
  4. 그 외에는 f에 ? ToString(form)을 할당한다.
  5. f"NFC", "NFD", "NFKC", "NFKD" 중 하나가 아니면 RangeError 예외를 던진다.
  6. ns최신 유니코드 표준, Normalization Forms에 명시된 대로 Sf가 지정하는 정규화 형식으로 정규화한 결과 문자열 값을 할당한다.
  7. ns를 반환한다.
참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.16 String.prototype.padEnd ( maxLength [ , fillString ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. StringPaddingBuiltinsImpl(O, maxLength, fillString, end)를 반환한다.

22.1.3.17 String.prototype.padStart ( maxLength [ , fillString ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. StringPaddingBuiltinsImpl(O, maxLength, fillString, start)를 반환한다.

22.1.3.17.1 StringPaddingBuiltinsImpl ( O, maxLength, fillString, placement )

StringPaddingBuiltinsImpl 추상 연산은 O(ECMAScript 언어 값), maxLength(ECMAScript 언어 값), fillString(ECMAScript 언어 값), placement(start 또는 end)를 인수로 받고 정상 완료 (문자열 포함) 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. S에 ? ToString(O)를 할당한다.
  2. intMaxLength(? ToLength(maxLength))를 할당한다.
  3. stringLengthS의 길이를 할당한다.
  4. intMaxLengthstringLength이면 S를 반환한다.
  5. fillStringundefined이면 fillString을 코드 유닛 0x0020(SPACE)만으로 구성된 문자열 값으로 설정한다.
  6. 그 외에는 fillString을 ? ToString(fillString)으로 설정한다.
  7. StringPad(S, intMaxLength, fillString, placement)를 반환한다.

22.1.3.17.2 StringPad ( S, maxLength, fillString, placement )

StringPad 추상 연산은 S(문자열), maxLength(음이 아닌 정수), fillString(문자열), placement(start 또는 end)를 인수로 받고 문자열을 반환한다. 호출 시 다음 단계를 수행한다:

  1. stringLengthS의 길이를 할당한다.
  2. maxLengthstringLength이면 S를 반환한다.
  3. fillString이 빈 문자열이면 S를 반환한다.
  4. fillLenmaxLength - stringLength를 할당한다.
  5. truncatedStringFillerfillString을 반복 연결한 후 fillLen 길이로 잘라낸 문자열 값을 할당한다.
  6. placementstart이면 truncatedStringFillerS문자열 연결하여 반환한다.
  7. 그 외에는 StruncatedStringFiller문자열 연결하여 반환한다.
참고 1

maxLength 인수는 S의 길이보다 작아질 수 없도록 clamping된다.

참고 2

fillString 인수의 기본값은 " "(코드 유닛 0x0020 SPACE만으로 구성된 문자열)이다.

22.1.3.17.3 ToZeroPaddedDecimalString ( n, minLength )

ToZeroPaddedDecimalString 추상 연산은 n(음이 아닌 정수), minLength(음이 아닌 정수)를 인수로 받고 문자열을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Sn의 십진수 문자열 표현을 할당한다.
  2. StringPad(S, minLength, "0", start)를 반환한다.

22.1.3.18 String.prototype.repeat ( count )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. n에 ? ToIntegerOrInfinity(count)를 할당한다.
  4. n < 0 또는 n = +∞이면 RangeError 예외를 던진다.
  5. n = 0이면 빈 문자열을 반환한다.
  6. Sn번 이어붙인 문자열 값을 반환한다.
참고 1

이 메서드는 this 값을(문자열로 변환) count번 반복한 코드 유닛으로 구성된 문자열 값을 생성한다.

참고 2

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.19 String.prototype.replace ( searchValue, replaceValue )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. searchValueundefined 또는 null이 아니면,
    1. replacer에 ? GetMethod(searchValue, %Symbol.replace%)를 할당한다.
    2. replacerundefined가 아니면,
      1. Call(replacer, searchValue, « O, replaceValue »)를 반환한다.
  3. string에 ? ToString(O)를 할당한다.
  4. searchString에 ? ToString(searchValue)를 할당한다.
  5. functionalReplaceIsCallable(replaceValue)를 할당한다.
  6. functionalReplacefalse이면,
    1. replaceValue를 ? ToString(replaceValue)로 재설정한다.
  7. searchLengthsearchString의 길이를 할당한다.
  8. positionStringIndexOf(string, searchString, 0)을 할당한다.
  9. positionnot-found이면 string을 반환한다.
  10. precedingstring의 0부터 position까지의 부분 문자열을 할당한다.
  11. followingstringposition + searchLength부터 끝까지의 부분 문자열을 할당한다.
  12. functionalReplacetrue이면,
    1. replacement에 ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(position), string »))를 할당한다.
  13. 그 외에는,
    1. Assert: replaceValue 는 문자열이다.
    2. captures에 새 빈 List를 할당한다.
    3. replacement에 ! GetSubstitution(searchString, string, position, captures, undefined, replaceValue)를 할당한다.
  14. preceding, replacement, following문자열 연결하여 반환한다.
참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.19.1 GetSubstitution ( matched, str, position, captures, namedCaptures, replacementTemplate )

GetSubstitution 추상 연산은 matched(문자열), str(문자열), position(음이 아닌 정수), captures(문자열 또는 undefinedList), namedCaptures(객체 또는 undefined), replacementTemplate(문자열)을 인수로 받고 정상 완료 (문자열 포함) 또는 throw 완료를 반환한다. 이 추상 연산에서 십진수 숫자포함 구간 0x0030(DIGIT ZERO)부터 0x0039(DIGIT NINE)까지의 코드 유닛이다. 호출 시 다음 단계를 수행한다:

  1. stringLengthstr의 길이를 할당한다.
  2. Assert: positionstringLength.
  3. result에 빈 문자열을 할당한다.
  4. templateRemainderreplacementTemplate를 할당한다.
  5. templateRemainder가 빈 문자열이 아닌 동안 반복,
    1. NOTE: 아래 단계는 ref(templateRemainder의 접두사)를 추출하고, refReplacement(치환값)를 결정한 후 그 치환값을 result에 추가한다.
    2. templateRemainder"$$"로 시작하면,
      1. ref"$$"를 할당한다.
      2. refReplacement"$"를 할당한다.
    3. 그 외 templateRemainder"$`"로 시작하면,
      1. ref"$`"를 할당한다.
      2. refReplacementstr의 0부터 position까지의 부분 문자열을 할당한다.
    4. 그 외 templateRemainder"$&"로 시작하면,
      1. ref"$&"를 할당한다.
      2. refReplacementmatched를 할당한다.
    5. 그 외 templateRemainder"$'"(0x0024(DOLLAR SIGN) + 0x0027(APOSTROPHE))로 시작하면,
      1. ref"$'"를 할당한다.
      2. matchLengthmatched의 길이를 할당한다.
      3. tailPosposition + matchLength를 할당한다.
      4. refReplacementstrmin(tailPos, stringLength)부터 끝까지의 부분 문자열을 할당한다.
      5. NOTE: tailPosstringLength를 초과할 수 있는 경우는 intrinsic %Symbol.replace% 메서드가 %RegExp.prototype%의 intrinsic %RegExp.prototype.exec%가 아닌 "exec" 프로퍼티를 가진 객체에 대해 호출된 경우이다.
    6. 그 외 templateRemainder"$" + 1개 이상의 십진수 숫자로 시작하면,
      1. templateRemainder"$" + 2개 이상의 십진수 숫자로 시작하면 digitCount에 2를, 아니면 1을 할당한다.
      2. digitstemplateRemainder의 1부터 1 + digitCount까지의 부분 문자열을 할당한다.
      3. index(StringToNumber(digits))를 할당한다.
      4. Assert: 0 ≤ index ≤ 99.
      5. captureLencaptures 요소 개수를 할당한다.
      6. index > captureLen이고 digitCount = 2이면,
        1. NOTE: 두 자리 치환 패턴이 캡처 그룹 개수를 초과하는 인덱스를 지정하면, 한 자리 치환 패턴 + 리터럴 숫자로 처리한다.
        2. digitCount를 1로 재설정한다.
        3. digitsdigits의 0부터 1까지의 부분 문자열로 재설정한다.
        4. index(StringToNumber(digits))로 재설정한다.
      7. reftemplateRemainder의 0부터 1 + digitCount까지의 부분 문자열을 할당한다.
      8. 1 ≤ indexcaptureLen이면,
        1. capturecaptures[index - 1]을 할당한다.
        2. captureundefined이면,
          1. refReplacement에 빈 문자열을 할당한다.
        3. 그 외에는,
          1. refReplacementcapture를 할당한다.
      9. 그 외에는,
        1. refReplacementref를 할당한다.
    7. 그 외 templateRemainder"$<"로 시작하면,
      1. gtPosStringIndexOf(templateRemainder, ">", 0)을 할당한다.
      2. gtPosnot-found이거나 namedCapturesundefined이면,
        1. ref"$<"를 할당한다.
        2. refReplacementref를 할당한다.
      3. 그 외에는,
        1. reftemplateRemainder의 0부터 gtPos + 1까지의 부분 문자열을 할당한다.
        2. groupNametemplateRemainder의 2부터 gtPos까지의 부분 문자열을 할당한다.
        3. Assert: namedCaptures 는 객체이다.
        4. capture에 ? Get(namedCaptures, groupName)을 할당한다.
        5. captureundefined이면,
          1. refReplacement에 빈 문자열을 할당한다.
        6. 그 외에는,
          1. refReplacement에 ? ToString(capture)를 할당한다.
    8. 그 외에는,
      1. reftemplateRemainder의 0부터 1까지의 부분 문자열을 할당한다.
      2. refReplacementref를 할당한다.
    9. refLengthref의 길이를 할당한다.
    10. templateRemaindertemplateRemainderrefLength부터 끝까지의 부분 문자열로 재설정한다.
    11. resultresultrefReplacement문자열 연결한 결과를 할당한다.
  6. result를 반환한다.

22.1.3.20 String.prototype.replaceAll ( searchValue, replaceValue )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. searchValueundefined 또는 null이 아니면,
    1. isRegExp에 ? IsRegExp(searchValue)를 할당한다.
    2. isRegExptrue이면,
      1. flags에 ? Get(searchValue, "flags")를 할당한다.
      2. RequireObjectCoercible(flags)를 수행한다.
      3. ToString(flags)에 "g"가 포함되어 있지 않으면 TypeError 예외를 던진다.
    3. replacer에 ? GetMethod(searchValue, %Symbol.replace%)를 할당한다.
    4. replacerundefined가 아니면,
      1. Call(replacer, searchValue, « O, replaceValue »)를 반환한다.
  3. string에 ? ToString(O)를 할당한다.
  4. searchString에 ? ToString(searchValue)를 할당한다.
  5. functionalReplaceIsCallable(replaceValue)를 할당한다.
  6. functionalReplacefalse이면,
    1. replaceValue를 ? ToString(replaceValue)로 재설정한다.
  7. searchLengthsearchString의 길이를 할당한다.
  8. advanceBymax(1, searchLength)를 할당한다.
  9. matchPositions에 새 빈 List를 할당한다.
  10. positionStringIndexOf(string, searchString, 0)를 할당한다.
  11. positionnot-found가 아닌 동안 반복,
    1. matchPositionsposition을 추가한다.
    2. positionStringIndexOf(string, searchString, position + advanceBy)로 재설정한다.
  12. endOfLastMatch에 0을 할당한다.
  13. result에 빈 문자열을 할당한다.
  14. matchPositions의 각 요소 p에 대해,
    1. preservedstringendOfLastMatch부터 p까지의 부분 문자열을 할당한다.
    2. functionalReplacetrue이면,
      1. replacement에 ? ToString(? Call(replaceValue, undefined, « searchString, 𝔽(p), string »))를 할당한다.
    3. 그 외에는,
      1. Assert: replaceValue 는 문자열이다.
      2. captures에 새 빈 List를 할당한다.
      3. replacement에 ! GetSubstitution(searchString, string, p, captures, undefined, replaceValue)를 할당한다.
    4. resultresult, preserved, replacement문자열 연결한 결과로 재설정한다.
    5. endOfLastMatchp + searchLength로 재설정한다.
  15. endOfLastMatchstring의 길이보다 작으면,
    1. resultresultstringendOfLastMatch부터 끝까지의 부분 문자열문자열 연결하여 재설정한다.
  16. result를 반환한다.

22.1.3.21 String.prototype.search ( regexp )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. regexpundefined 또는 null이 아니면,
    1. searcher에 ? GetMethod(regexp, %Symbol.search%)를 할당한다.
    2. searcherundefined가 아니면,
      1. Call(searcher, regexp, « O »)를 반환한다.
  3. string에 ? ToString(O)를 할당한다.
  4. rx에 ? RegExpCreate(regexp, undefined)를 할당한다.
  5. Invoke(rx, %Symbol.search%, « string »)를 반환한다.
참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.22 String.prototype.slice ( start, end )

이 메서드는 이 객체를 문자열로 변환한 결과의 start 인덱스부터 end 인덱스(또는 endundefined일 경우 문자열 끝까지, end는 포함하지 않음)까지의 부분 문자열를 반환한다. start가 음수이면, sourceLength + start(sourceLength는 문자열 길이)로 처리한다. end가 음수이면, sourceLength + end로 처리한다(sourceLength는 문자열 길이). 결과는 문자열 값이며, 문자열 객체가 아니다.

호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. lenS의 길이를 할당한다.
  4. intStart에 ? ToIntegerOrInfinity(start)를 할당한다.
  5. intStart = -∞이면 from에 0을 할당한다.
  6. 그 외 intStart < 0이면 frommax(len + intStart, 0)을 할당한다.
  7. 그 외에는 frommin(intStart, len)를 할당한다.
  8. endundefined이면 intEndlen을, 아니면 intEnd에 ? ToIntegerOrInfinity(end)를 할당한다.
  9. intEnd = -∞이면 to에 0을 할당한다.
  10. 그 외 intEnd < 0이면 tomax(len + intEnd, 0)을 할당한다.
  11. 그 외에는 tomin(intEnd, len)를 할당한다.
  12. fromto이면 빈 문자열을 반환한다.
  13. Sfrom부터 to까지의 부분 문자열을 반환한다.
참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.23 String.prototype.split ( separator, limit )

이 메서드는 이 객체를 문자열로 변환한 결과의 부분 문자열을 저장한 배열(Array)을 반환한다. 부분 문자열은 왼쪽에서 오른쪽으로 separator가 나타나는 위치를 찾아 구분하여 만들어지며, separator는 반환 배열의 문자열에는 포함되지 않고, 문자열을 나누는 역할을 한다. separator는 임의의 길이의 문자열이거나 %Symbol.split% 메서드를 가진 객체(예: RegExp)일 수 있다.

호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. separatorundefined 또는 null이 아니면,
    1. splitter에 ? GetMethod(separator, %Symbol.split%)를 할당한다.
    2. splitterundefined가 아니면,
      1. Call(splitter, separator, « O, limit »)를 반환한다.
  3. S에 ? ToString(O)를 할당한다.
  4. limitundefined이면 lim에 232 - 1을, 아니면 lim(? ToUint32(limit))을 할당한다.
  5. R에 ? ToString(separator)를 할당한다.
  6. lim = 0이면,
    1. CreateArrayFromList(« »)를 반환한다.
  7. separatorundefined이면,
    1. CreateArrayFromListS »)를 반환한다.
  8. separatorLengthR의 길이를 할당한다.
  9. separatorLength = 0이면,
    1. strLenS의 길이를 할당한다.
    2. outLenclamping lim을 0과 strLen 사이로 한 값을 할당한다.
    3. headS의 0부터 outLen까지의 부분 문자열을 할당한다.
    4. codeUnitshead의 각 요소 코드 유닛 시퀀스로 구성된 List를 할당한다.
    5. CreateArrayFromList(codeUnits)를 반환한다.
  10. S가 빈 문자열이면 CreateArrayFromListS »)를 반환한다.
  11. substrings에 새 빈 List를 할당한다.
  12. i에 0을 할당한다.
  13. jStringIndexOf(S, R, 0)을 할당한다.
  14. jnot-found가 아닌 동안 반복,
    1. TSi부터 j까지의 부분 문자열을 할당한다.
    2. substringsT를 추가한다.
    3. substrings의 요소 개수가 lim이면 CreateArrayFromList(substrings)를 반환한다.
    4. ij + separatorLength로 재설정한다.
    5. jStringIndexOf(S, R, i)로 재설정한다.
  15. TSi부터 끝까지의 부분 문자열을 할당한다.
  16. substringsT를 추가한다.
  17. CreateArrayFromList(substrings)를 반환한다.
참고 1

separator 값이 빈 문자열일 수 있다. 이 경우 separator는 입력 문자열의 시작, 끝, 이전 separator 매치의 끝의 빈 부분 문자열에는 매치되지 않는다. separator가 빈 문자열이면, 문자열은 개별 코드 유닛 요소로 분할되고, 결과 배열의 길이는 문자열의 길이와 같으며 각 부분 문자열은 하나의 코드 유닛을 포함한다.

this 값이(혹은 변환된 값이) 빈 문자열이면, 결과는 separator가 빈 문자열과 매치될 수 있는지에 따라 달라진다. 가능하면 결과 배열은 요소가 없고, 불가능하면 결과 배열은 빈 문자열 하나만 가진다.

separatorundefined이면, 결과 배열은 변환된 this 값(문자열) 하나만 가진다. limitundefined가 아니면, 결과 배열은 최대 limit개 요소로 잘린다.

참고 2

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.24 String.prototype.startsWith ( searchString [ , position ] )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. isRegExp에 ? IsRegExp(searchString)를 할당한다.
  4. isRegExptrue이면 TypeError 예외를 던진다.
  5. searchStr에 ? ToString(searchString)를 할당한다.
  6. lenS의 길이를 할당한다.
  7. positionundefined이면 pos에 0을, 아니면 pos에 ? ToIntegerOrInfinity(position)을 할당한다.
  8. startclampingpos를 0과 len 사이로 할당한다.
  9. searchLengthsearchStr의 길이를 할당한다.
  10. searchLength = 0이면 true를 반환한다.
  11. endstart + searchLength를 할당한다.
  12. end > len이면 false를 반환한다.
  13. substringSstart부터 end까지의 부분 문자열을 할당한다.
  14. substringsearchStr이면 true를 반환한다.
  15. false를 반환한다.
참고 1

이 메서드는 searchString을 문자열로 변환한 코드 유닛 시퀀스가 이 객체(문자열로 변환)의 position 인덱스에서 시작하는 코드 유닛과 같으면 true를 반환한다. 그렇지 않으면 false를 반환한다.

참고 2

첫 번째 인수가 RegExp인 경우 예외를 던지는 것은, 향후 버전에서 그러한 인수 값을 허용하는 확장을 정의할 수 있도록 하기 위함이다.

참고 3

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.25 String.prototype.substring ( start, end )

이 메서드는 이 객체를 문자열로 변환한 결과의 start 인덱스부터 end 인덱스(문자열 끝까지, end는 포함하지 않음)까지의 부분 문자열를 반환한다. 결과는 문자열 값이며, 문자열 객체가 아니다.

각 인수가 NaN 또는 음수이면 0으로 대체된다. 각 인수가 문자열의 길이보다 크면 문자열의 길이로 대체된다.

startend보다 크면, 두 인수를 서로 바꾼다.

호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. lenS의 길이를 할당한다.
  4. intStart에 ? ToIntegerOrInfinity(start)를 할당한다.
  5. endundefined이면 intEndlen을, 아니면 intEnd에 ? ToIntegerOrInfinity(end)를 할당한다.
  6. finalStartclampingintStart를 0과 len 사이로 할당한다.
  7. finalEndclampingintEnd를 0과 len 사이로 할당한다.
  8. frommin(finalStart, finalEnd)를 할당한다.
  9. tomax(finalStart, finalEnd)를 할당한다.
  10. Sfrom부터 to까지의 부분 문자열을 반환한다.
참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.26 String.prototype.toLocaleLowerCase ( [ reserved1 [ , reserved2 ] ] )

ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 한다. ECMA-402 API를 포함하지 않는 구현의 경우 아래 명세를 따릅니다:

이 메서드는 6.1.4에 설명된 대로 문자열 값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.

toLowerCase와 동작은 동일하지만, 결과가 호스트 환경의 현재 로케일의 관습에 따라 로케일 의존적으로 생성된다는 점만 다릅니다. 몇몇 경우(예: 터키어)에서 해당 언어의 규칙이 일반 유니코드 대소문자 변환 규칙과 충돌할 때만 차이가 있습니다.

이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 할당해서는 안 됩니다.

참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.27 String.prototype.toLocaleUpperCase ( [ reserved1 [ , reserved2 ] ] )

ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 해당 메서드는 ECMA-402 명세대로 구현되어야 한다. ECMA-402 API를 포함하지 않는 구현의 경우 아래 명세를 따릅니다:

이 메서드는 6.1.4에 설명된 대로 문자열 값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.

toUpperCase와 동작은 동일하지만, 결과가 호스트 환경의 현재 로케일의 관습에 따라 로케일 의존적으로 생성된다는 점만 다릅니다. 몇몇 경우(예: 터키어)에서 해당 언어의 규칙이 일반 유니코드 대소문자 변환 규칙과 충돌할 때만 차이가 있습니다.

이 메서드의 선택적 인수의 의미는 ECMA-402 명세에 정의되어 있습니다. ECMA-402를 지원하지 않는 구현은 해당 인수 위치에 다른 용도를 할당해서는 안 됩니다.

참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.28 String.prototype.toLowerCase ( )

이 메서드는 6.1.4에 설명된 대로 문자열 값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.

호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값)을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. sTextStringToCodePoints(S)를 할당한다.
  4. lowerText에 유니코드 기본 대소문자 변환 알고리즘에 따라 toLowercase(sText)를 적용한 값을 할당한다.
  5. LCodePointsToString(lowerText)를 할당한다.
  6. L을 반환한다.

결과는 반드시 유니코드 문자 데이터베이스의 로케일 비의존적 대소문자 변환에 따라 도출되어야 한다(UnicodeData.txt 파일뿐만 아니라, 함께 제공되는 SpecialCasing.txt 파일에 있는 모든 로케일 비의존적 매핑도 포함).

참고 1

일부 코드 포인트의 대소문자 변환 결과는 여러 코드 포인트가 될 수 있다. 이 경우 결과 문자열의 길이는 원본 문자열과 다를 수 있다. toUpperCasetoLowerCase 모두 문맥에 따라 동작하므로, 두 메서드는 대칭적이지 않다. 즉, s.toUpperCase().toLowerCase()는 반드시 s.toLowerCase()와 같지 않다.

참고 2

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.29 String.prototype.toString ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. ThisStringValue(this 값)을 반환한다.
참고

String 객체에 대해 이 메서드는 valueOf 메서드와 동일한 값을 반환한다.

22.1.3.30 String.prototype.toUpperCase ( )

이 메서드는 6.1.4에 설명된 대로 문자열 값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다.

동작은 String.prototype.toLowerCase와 동일하지만, 문자열을 유니코드 기본 대소문자 변환 알고리즘의 toUppercase로 매핑한다는 점만 다릅니다.

참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 문자열 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 이전해 사용할 수 있다.

22.1.3.31 String.prototype.toWellFormed ( )

이 메서드는 이 객체의 모든 리딩 서로게이트트레일링 서로게이트서로게이트 페어의 일부가 아닌 것을 U+FFFD(대체 문자)로 대체한 문자열 표현을 반환한다.

호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값을 할당한다.
  2. S에 ? ToString(O)를 할당한다.
  3. strLenS의 길이를 할당한다.
  4. k에 0을 할당한다.
  5. result에 빈 문자열을 할당한다.
  6. k < strLen 동안 반복,
    1. cpCodePointAt(S, k)를 할당한다.
    2. cp.[[IsUnpairedSurrogate]]true이면,
      1. resultresult와 0xFFFD(대체 문자)를 문자열 연결하여 재할당한다.
    3. 그 외,
      1. resultresultUTF16EncodeCodePoint(cp.[[CodePoint]])를 문자열 연결하여 재할당한다.
    4. kk + cp.[[CodeUnitCount]]로 재설정한다.
  7. result를 반환한다.

22.1.3.32 String.prototype.trim ( )

이 메서드는 6.1.4에 따라 문자열 값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.

호출 시 다음 단계를 수행한다:

  1. Sthis 값을 할당한다.
  2. TrimString(S, start+end)를 반환한다.
참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의 객체에서 메서드로 사용할 수 있다.

22.1.3.32.1 TrimString ( string, where )

TrimString 추상 연산은 string(ECMAScript 언어 값)과 where(start, end, start+end)를 인수로 받고 정상 완료(문자열 포함) 또는 throw 완료를 반환한다. string6.1.4에 따라 UTF-16 인코딩 코드 포인트 시퀀스로 해석한다. 호출 시 다음 단계를 수행한다:

  1. str에 ? RequireObjectCoercible(string)를 할당한다.
  2. S에 ? ToString(str)를 할당한다.
  3. wherestart이면,
    1. TS의 앞쪽 공백이 제거된 복사본을 할당한다.
  4. 그 외 whereend이면,
    1. TS의 뒤쪽 공백이 제거된 복사본을 할당한다.
  5. 그 외,
    1. Assert: wherestart+end임을 확인한다.
    2. TS의 앞뒤 공백이 모두 제거된 복사본을 할당한다.
  6. T를 반환한다.

공백(white space)의 정의는 WhiteSpaceLineTerminator의 합집합이다. 유니코드 일반 카테고리 “Space_Separator”(“Zs”)에 해당하는지 판단할 때, 코드 유닛 시퀀스는 6.1.4에 따라 UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.

22.1.3.33 String.prototype.trimEnd ( )

이 메서드는 6.1.4에 따라 문자열 값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.

호출 시 다음 단계를 수행한다:

  1. Sthis 값을 할당한다.
  2. TrimString(S, end)를 반환한다.
참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의 객체에서 메서드로 사용할 수 있다.

22.1.3.34 String.prototype.trimStart ( )

이 메서드는 6.1.4에 따라 문자열 값을 UTF-16 인코딩 코드 포인트 시퀀스로 해석한다.

호출 시 다음 단계를 수행한다:

  1. Sthis 값을 할당한다.
  2. TrimString(S, start)를 반환한다.
참고

이 메서드는 의도적으로 generic이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의 객체에서 메서드로 사용할 수 있다.

22.1.3.35 String.prototype.valueOf ( )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. ThisStringValue(this 값을 반환한다.

22.1.3.35.1 ThisStringValue ( value )

ThisStringValue 추상 연산은 value(ECMAScript 언어 값)를 인수로 받고 정상 완료(문자열 포함) 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. value문자열이면 value를 반환한다.
  2. value객체이고 value[[StringData]] 내부 슬롯이 있으면,
    1. svalue.[[StringData]]를 할당한다.
    2. Assert: s문자열임을 확인한다.
    3. s를 반환한다.
  3. TypeError 예외를 던진다.

22.1.3.36 String.prototype [ %Symbol.iterator% ] ( )

이 메서드는 문자열 값의 코드 포인트를 반복하는 이터레이터 객체를 반환하며, 각 코드 포인트를 문자열 값으로 반환한다.

호출 시 다음 단계를 수행한다:

  1. O에 ? RequireObjectCoercible(this 값을 할당한다.
  2. s에 ? ToString(O)를 할당한다.
  3. closures를 캡처하고 다음 단계를 수행하는 파라미터 없는 새로운 Abstract Closure를 할당한다:
    1. lens의 길이를 할당한다.
    2. position에 0을 할당한다.
    3. position < len 동안 반복,
      1. cpCodePointAt(s, position)를 할당한다.
      2. nextIndexposition + cp.[[CodeUnitCount]]를 할당한다.
      3. resultStringsposition부터 nextIndex까지의 부분 문자열를 할당한다.
      4. positionnextIndex로 재설정한다.
      5. GeneratorYield(CreateIteratorResultObject(resultString, false))를 수행한다.
    4. NormalCompletion(unused)를 반환한다.
  4. CreateIteratorFromClosure(closure, "%StringIteratorPrototype%", %StringIteratorPrototype%)를 반환한다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.iterator]"이다.

22.1.4 String 인스턴스의 속성

String 인스턴스는 String 익조틱 객체이며 해당 객체에 대해 지정된 내부 메서드를 가진다. String 인스턴스는 String 프로토타입 객체로부터 프로퍼티를 상속받는다. 또한 String 인스턴스는 [[StringData]] 내부 슬롯을 가진다. [[StringData]] 내부 슬롯은 이 String 객체가 나타내는 문자열 값이다.

String 인스턴스는 "length" 프로퍼티와 정수 인덱스 이름을 가진 enumerable 프로퍼티 집합을 가진다.

22.1.4.1 length

이 String 객체가 나타내는 문자열 값의 요소 개수.

String 객체가 초기화되면, 이 프로퍼티는 변경되지 않는다. 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }이다.

22.1.5 String 이터레이터 객체

String 이터레이터는 특정 String 인스턴스 객체에 대한 특정 반복(iteration)을 나타내는 객체이다. String 이터레이터 객체에는 생성자라는 이름이 붙은 생성자는 없다. 대신, String 이터레이터 객체는 String 인스턴스 객체의 특정 메서드를 호출하여 생성된다.

22.1.5.1 %StringIteratorPrototype% 객체

%StringIteratorPrototype% 객체:

22.1.5.1.1 %StringIteratorPrototype%.next ( )

  1. GeneratorResume(this 값, empty, "%StringIteratorPrototype%")를 반환한다.

22.1.5.1.2 %StringIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기값은 문자열 값 "String Iterator"이다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }이다.

22.2 RegExp(정규 표현식) 객체

RegExp 객체는 정규 표현식과 관련 플래그를 포함한다.

참고

정규 표현식의 형식과 기능은 Perl 5 프로그래밍 언어의 정규 표현식 기능을 모델로 한다.

22.2.1 패턴

RegExp 생성자는 입력 패턴 문자열에 다음 문법을 적용한다. 문법이 문자열을 Pattern의 확장으로 해석할 수 없으면 오류가 발생한다.

문법

Pattern[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Disjunction[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] | Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: [empty] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Assertion[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Quantifier Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: ^ $ \b \B (?= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) Quantifier :: QuantifierPrefix QuantifierPrefix ? QuantifierPrefix :: * + ? { DecimalDigits[~Sep] } { DecimalDigits[~Sep] ,} { DecimalDigits[~Sep] , DecimalDigits[~Sep] } Atom[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: PatternCharacter . \ AtomEscape[?UnicodeMode, ?NamedCaptureGroups] CharacterClass[?UnicodeMode, ?UnicodeSetsMode] ( GroupSpecifier[?UnicodeMode]opt Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) RegularExpressionModifiers :: [empty] RegularExpressionModifiers RegularExpressionModifier RegularExpressionModifier :: one of i m s SyntaxCharacter :: one of ^ $ \ . * + ? ( ) [ ] { } | PatternCharacter :: SourceCharacter but not SyntaxCharacter AtomEscape[UnicodeMode, NamedCaptureGroups] :: DecimalEscape CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] [+NamedCaptureGroups] k GroupName[?UnicodeMode] CharacterEscape[UnicodeMode] :: ControlEscape c AsciiLetter 0 [lookahead ∉ DecimalDigit] HexEscapeSequence RegExpUnicodeEscapeSequence[?UnicodeMode] IdentityEscape[?UnicodeMode] ControlEscape :: one of f n r t v GroupSpecifier[UnicodeMode] :: ? GroupName[?UnicodeMode] GroupName[UnicodeMode] :: < RegExpIdentifierName[?UnicodeMode] > RegExpIdentifierName[UnicodeMode] :: RegExpIdentifierStart[?UnicodeMode] RegExpIdentifierName[?UnicodeMode] RegExpIdentifierPart[?UnicodeMode] RegExpIdentifierStart[UnicodeMode] :: IdentifierStartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart[UnicodeMode] :: IdentifierPartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpUnicodeEscapeSequence[UnicodeMode] :: [+UnicodeMode] u HexLeadSurrogate \u HexTrailSurrogate [+UnicodeMode] u HexLeadSurrogate [+UnicodeMode] u HexTrailSurrogate [+UnicodeMode] u HexNonSurrogate [~UnicodeMode] u Hex4Digits [+UnicodeMode] u{ CodePoint } UnicodeLeadSurrogate :: any Unicode code point in the inclusive interval from U+D800 to U+DBFF UnicodeTrailSurrogate :: any Unicode code point in the inclusive interval from U+DC00 to U+DFFF

선택된 \u HexTrailSurrogate에 대해 연관된 u HexLeadSurrogate의 선택이 모호한 경우, 해당 \u HexLeadSurrogate는 그 외에는 대응되는 \u HexTrailSurrogate가 없는 가장 가까운 u HexLeadSurrogate에 연관되어야 한다.

HexLeadSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xD800 to 0xDBFF HexTrailSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xDC00 to 0xDFFF HexNonSurrogate :: Hex4Digits but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to 0xDFFF IdentityEscape[UnicodeMode] :: [+UnicodeMode] SyntaxCharacter [+UnicodeMode] / [~UnicodeMode] SourceCharacter but not UnicodeIDContinue DecimalEscape :: NonZeroDigit DecimalDigits[~Sep]opt [lookahead ∉ DecimalDigit] CharacterClassEscape[UnicodeMode] :: d D s S w W [+UnicodeMode] p{ UnicodePropertyValueExpression } [+UnicodeMode] P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue LoneUnicodePropertyNameOrValue UnicodePropertyName :: UnicodePropertyNameCharacters UnicodePropertyNameCharacters :: UnicodePropertyNameCharacter UnicodePropertyNameCharactersopt UnicodePropertyValue :: UnicodePropertyValueCharacters LoneUnicodePropertyNameOrValue :: UnicodePropertyValueCharacters UnicodePropertyValueCharacters :: UnicodePropertyValueCharacter UnicodePropertyValueCharactersopt UnicodePropertyValueCharacter :: UnicodePropertyNameCharacter DecimalDigit UnicodePropertyNameCharacter :: AsciiLetter _ CharacterClass[UnicodeMode, UnicodeSetsMode] :: [ [lookahead ≠ ^] ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] [^ ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] ClassContents[UnicodeMode, UnicodeSetsMode] :: [empty] [~UnicodeSetsMode] NonemptyClassRanges[?UnicodeMode] [+UnicodeSetsMode] ClassSetExpression NonemptyClassRanges[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtom[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtom[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] NonemptyClassRangesNoDash[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] ClassAtom[UnicodeMode] :: - ClassAtomNoDash[?UnicodeMode] ClassAtomNoDash[UnicodeMode] :: SourceCharacter but not one of \ or ] or - \ ClassEscape[?UnicodeMode] ClassEscape[UnicodeMode] :: b [+UnicodeMode] - CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] ClassSetExpression :: ClassUnion ClassIntersection ClassSubtraction ClassUnion :: ClassSetRange ClassUnionopt ClassSetOperand ClassUnionopt ClassIntersection :: ClassSetOperand && [lookahead ≠ &] ClassSetOperand ClassIntersection && [lookahead ≠ &] ClassSetOperand ClassSubtraction :: ClassSetOperand -- ClassSetOperand ClassSubtraction -- ClassSetOperand ClassSetRange :: ClassSetCharacter - ClassSetCharacter ClassSetOperand :: NestedClass ClassStringDisjunction ClassSetCharacter NestedClass :: [ [lookahead ≠ ^] ClassContents[+UnicodeMode, +UnicodeSetsMode] ] [^ ClassContents[+UnicodeMode, +UnicodeSetsMode] ] \ CharacterClassEscape[+UnicodeMode] 참고 1

여기서 처음 두 줄은 CharacterClass와 동일하다.

ClassStringDisjunction :: \q{ ClassStringDisjunctionContents } ClassStringDisjunctionContents :: ClassString ClassString | ClassStringDisjunctionContents ClassString :: [empty] NonEmptyClassString NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt ClassSetCharacter :: [lookahead ∉ ClassSetReservedDoublePunctuator] SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape[+UnicodeMode] \ ClassSetReservedPunctuator \b ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~ ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ | ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~ 참고 2

이 섹션의 여러 생성식(production)은 B.1.2 섹션에서 대체 정의가 제공된다.

22.2.1.1 정적 의미론: 초기 에러

참고

이 섹션은 B.1.2.1에서 수정된다.

Pattern :: Disjunction QuantifierPrefix :: { DecimalDigits , DecimalDigits } Atom :: (? RegularExpressionModifiers : Disjunction ) Atom :: (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction ) AtomEscape :: k GroupName AtomEscape :: DecimalEscape NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierStart :: UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierPart :: UnicodeLeadSurrogate UnicodeTrailSurrogate UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  • LoneUnicodePropertyNameOrValue가 매치한 소스 텍스트가 PropertyValueAliases.txt에 나열된 General_Category(gc) 프로퍼티의 유니코드 프로퍼티 값 또는 값 별칭이 아니고, 표 70의 "Property name and aliases" 열에 나열된 바이너리 프로퍼티 또는 프로퍼티 별칭이 아니며, 표 71의 "Property name" 열에 나열된 문자열의 바이너리 프로퍼티가 아니면 문법 오류이다.
  • 포함하는 Pattern[UnicodeSetsMode] 파라미터가 없고, LoneUnicodePropertyNameOrValue표 71의 "Property name" 열에 나열된 문자열의 바이너리 프로퍼티인 경우 문법 오류이다.
CharacterClassEscape :: P{ UnicodePropertyValueExpression } CharacterClass :: [^ ClassContents ] NestedClass :: [^ ClassContents ] ClassSetRange :: ClassSetCharacter - ClassSetCharacter

22.2.1.2 정적 의미론: CountLeftCapturingParensWithin ( node )

CountLeftCapturingParensWithin 추상 연산은 node(파싱 노드)를 인수로 받고, 0 이상의 정수를 반환한다. node 내의 왼쪽 캡처 괄호 개수를 반환한다. 왼쪽 캡처 괄호란, Atom :: ( GroupSpecifieropt Disjunction ) 생성식에서 매치되는 모든 ( 패턴 문자이다.

참고

이 섹션은 B.1.2.2에서 수정된다.

호출 시 다음 단계를 수행한다:

  1. Assert: nodeRegExp 패턴 문법의 생성식 인스턴스이다.
  2. node 내에 포함된 Atom :: ( GroupSpecifieropt Disjunction ) 파싱 노드 개수를 반환한다.

22.2.1.3 정적 의미론: CountLeftCapturingParensBefore ( node )

CountLeftCapturingParensBefore 추상 연산은 node(파싱 노드)를 인수로 받고, 0 이상의 정수를 반환한다. node를 둘러싼 패턴 내에서 node의 왼쪽에 위치하는 왼쪽 캡처 괄호 개수를 반환한다.

참고

이 섹션은 B.1.2.2에서 수정된다.

호출 시 다음 단계를 수행한다:

  1. Assert: nodeRegExp 패턴 문법의 생성식 인스턴스이다.
  2. patternnode를 포함하는 Pattern을 할당한다.
  3. pattern 내에서 node의 앞에 위치하거나 node를 포함하는 Atom :: ( GroupSpecifieropt Disjunction ) 파싱 노드 개수를 반환한다.

22.2.1.4 정적 의미론: MightBothParticipate ( x, y )

MightBothParticipate 추상 연산은 x(파싱 노드)와 y(파싱 노드)를 인수로 받고, Boolean 값을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: xy는 동일한 Pattern으로 둘러싸여 있다.
  2. 둘러싸고 있는 Pattern Disjunction :: Alternative | Disjunction 파싱 노드가 존재하고, xAlternative 내에 포함되어 있고 y가 파생된 Disjunction 내에 포함되어 있거나, x가 파생된 Disjunction 내에 포함되어 있고 yAlternative 내에 포함되어 있으면 false를 반환한다.
  3. true를 반환한다.

22.2.1.5 정적 의미론: CapturingGroupNumber

구문 지향 연산 CapturingGroupNumber는 인수를 받지 않고 양의 정수를 반환한다.

참고

이 섹션은 B.1.2.1에서 수정된다.

다음 생성식에 대해 개별적으로 정의된다:

DecimalEscape :: NonZeroDigit
  1. NonZeroDigit의 MV를 반환한다.
DecimalEscape :: NonZeroDigit DecimalDigits
  1. nDecimalDigits의 코드 포인트 개수를 할당한다.
  2. (NonZeroDigit의 MV × 10n + DecimalDigits의 MV)을 반환한다.

NonZeroDigit의 MV” 및 “DecimalDigits의 MV”의 정의는 12.9.3에 있다.

22.2.1.6 정적 의미론: IsCharacterClass

구문 지향 연산 IsCharacterClass는 인수를 받지 않고 Boolean 값을 반환한다.

참고

이 섹션은 B.1.2.3에서 수정된다.

다음 생성식에 대해 개별적으로 정의된다:

ClassAtom :: - ClassAtomNoDash :: SourceCharacter but not one of \ or ] or - ClassEscape :: b - CharacterEscape
  1. false를 반환한다.
ClassEscape :: CharacterClassEscape
  1. true를 반환한다.

22.2.1.7 정적 의미론: CharacterValue

구문 지향 연산 CharacterValue는 인수를 받지 않으며, 0 이상의 정수를 반환한다.

참고 1

이 섹션은 B.1.2.4에서 수정된다.

다음 생성식에 대해 개별적으로 정의된다:

ClassAtom :: -
  1. U+002D(HYPHEN-MINUS)의 숫자 값을 반환한다.
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
  1. chSourceCharacter가 매치한 코드 포인트를 할당한다.
  2. ch의 숫자 값을 반환한다.
ClassEscape :: b
  1. U+0008(BACKSPACE)의 숫자 값을 반환한다.
ClassEscape :: -
  1. U+002D(HYPHEN-MINUS)의 숫자 값을 반환한다.
CharacterEscape :: ControlEscape
  1. 표 67에 따라 숫자 값을 반환한다.
표 67: ControlEscape 코드 포인트 값
ControlEscape 숫자 값 코드 포인트 유니코드 이름 기호
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>
CharacterEscape :: c AsciiLetter
  1. chAsciiLetter가 매치한 코드 포인트를 할당한다.
  2. ich의 숫자 값을 할당한다.
  3. i를 32로 나눈 나머지를 반환한다.
CharacterEscape :: 0 [lookahead ∉ DecimalDigit]
  1. U+0000(NULL)의 숫자 값을 반환한다.
참고 2

\0은 <NUL> 문자를 나타내며, 뒤에 십진수 숫자가 올 수 없다.

CharacterEscape :: HexEscapeSequence
  1. HexEscapeSequence의 MV를 반환한다.
RegExpUnicodeEscapeSequence :: u HexLeadSurrogate \u HexTrailSurrogate
  1. leadHexLeadSurrogateCharacterValue를 할당한다.
  2. trailHexTrailSurrogateCharacterValue를 할당한다.
  3. cpUTF16SurrogatePairToCodePoint(lead, trail)를 할당한다.
  4. cp의 숫자 값을 반환한다.
RegExpUnicodeEscapeSequence :: u Hex4Digits
  1. Hex4Digits의 MV를 반환한다.
RegExpUnicodeEscapeSequence :: u{ CodePoint }
  1. CodePoint의 MV를 반환한다.
HexLeadSurrogate :: Hex4Digits HexTrailSurrogate :: Hex4Digits HexNonSurrogate :: Hex4Digits
  1. Hex4Digits의 MV를 반환한다.
CharacterEscape :: IdentityEscape
  1. chIdentityEscape가 매치한 코드 포인트를 할당한다.
  2. ch의 숫자 값을 반환한다.
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter
  1. chSourceCharacter가 매치한 코드 포인트를 할당한다.
  2. ch의 숫자 값을 반환한다.
ClassSetCharacter :: \ ClassSetReservedPunctuator
  1. chClassSetReservedPunctuator가 매치한 코드 포인트를 할당한다.
  2. ch의 숫자 값을 반환한다.
ClassSetCharacter :: \b
  1. U+0008(BACKSPACE)의 숫자 값을 반환한다.

22.2.1.8 정적 의미론: MayContainStrings

구문 지향 연산 MayContainStrings는 인수를 받지 않으며 Boolean 값을 반환한다. 다음 생성식에 대해 개별적으로 정의된다:

CharacterClassEscape :: d D s S w W P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue NestedClass :: [^ ClassContents ] ClassContents :: [empty] NonemptyClassRanges ClassSetOperand :: ClassSetCharacter
  1. false를 반환한다.
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  1. LoneUnicodePropertyNameOrValue표 71의 "Property name" 열에 나열된 문자열의 바이너리 프로퍼티인 경우 true를 반환한다.
  2. false를 반환한다.
ClassUnion :: ClassSetRange ClassUnionopt
  1. ClassUnion가 존재하면, MayContainStringsClassUnion에 대해 반환한다.
  2. false를 반환한다.
ClassUnion :: ClassSetOperand ClassUnionopt
  1. MayContainStringsClassSetOperand에 대해 true이면 true를 반환한다.
  2. ClassUnion가 존재하면, MayContainStringsClassUnion에 대해 반환한다.
  3. false를 반환한다.
ClassIntersection :: ClassSetOperand && ClassSetOperand
  1. 첫 번째 MayContainStringsClassSetOperand에 대해 false이면 false를 반환한다.
  2. 두 번째 MayContainStringsClassSetOperand에 대해 false이면 false를 반환한다.
  3. true를 반환한다.
ClassIntersection :: ClassIntersection && ClassSetOperand
  1. MayContainStringsClassIntersection에 대해 false이면 false를 반환한다.
  2. MayContainStringsClassSetOperand에 대해 false이면 false를 반환한다.
  3. true를 반환한다.
ClassSubtraction :: ClassSetOperand -- ClassSetOperand
  1. 첫 번째 MayContainStringsClassSetOperand에 대해 반환한다.
ClassSubtraction :: ClassSubtraction -- ClassSetOperand
  1. MayContainStringsClassSubtraction에 대해 반환한다.
ClassStringDisjunctionContents :: ClassString | ClassStringDisjunctionContents
  1. MayContainStringsClassString에 대해 true이면 true를 반환한다.
  2. MayContainStringsClassStringDisjunctionContents에 대해 반환한다.
ClassString :: [empty]
  1. true를 반환한다.
ClassString :: NonEmptyClassString
  1. MayContainStringsNonEmptyClassString에 대해 반환한다.
NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt
  1. NonEmptyClassString가 존재하면 true를 반환한다.
  2. false를 반환한다.

22.2.1.9 정적 의미론: GroupSpecifiersThatMatch ( thisGroupName )

GroupSpecifiersThatMatch 추상 연산은 thisGroupName(GroupName 파싱 노드)를 인수로 받고, List 타입의 GroupSpecifier 파싱 노드 리스트를 반환한다. 호출 시 다음 단계를 수행한다:

  1. nameCapturingGroupName of thisGroupName를 할당한다.
  2. patternthisGroupName을 포함하는 Pattern을 할당한다.
  3. result에 새로운 빈 List를 할당한다.
  4. pattern이 포함하는 각 GroupSpecifier gs에 대해 반복한다:
    1. gsCapturingGroupNamename과 같으면,
      1. gsresult에 추가한다.
  5. result를 반환한다.

22.2.1.10 정적 의미론: CapturingGroupName

구문 지향 연산 CapturingGroupName은 인수를 받지 않으며 문자열을 반환한다. 다음 생성식에 대해 개별적으로 정의된다:

GroupName :: < RegExpIdentifierName >
  1. idTextUnescapedRegExpIdentifierNameRegExpIdentifierCodePoints를 할당한다.
  2. CodePointsToString(idTextUnescaped)을 반환한다.

22.2.1.11 정적 의미론: RegExpIdentifierCodePoints

구문 지향 연산 RegExpIdentifierCodePoints는 인수를 받지 않으며 코드 포인트 List를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:

RegExpIdentifierName :: RegExpIdentifierStart
  1. cpRegExpIdentifierStartRegExpIdentifierCodePoint를 할당한다.
  2. « cp »를 반환한다.
RegExpIdentifierName :: RegExpIdentifierName RegExpIdentifierPart
  1. cps에 파생된 RegExpIdentifierNameRegExpIdentifierCodePoints를 할당한다.
  2. cpRegExpIdentifierPartRegExpIdentifierCodePoint를 할당한다.
  3. cps와 « cp »의 리스트 연결을 반환한다.

22.2.1.12 정적 의미론: RegExpIdentifierCodePoint

구문 지향 연산 RegExpIdentifierCodePoint는 인수를 받지 않으며 코드 포인트를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:

RegExpIdentifierStart :: IdentifierStartChar
  1. IdentifierStartChar가 매치한 코드 포인트를 반환한다.
RegExpIdentifierPart :: IdentifierPartChar
  1. IdentifierPartChar가 매치한 코드 포인트를 반환한다.
RegExpIdentifierStart :: \ RegExpUnicodeEscapeSequence RegExpIdentifierPart :: \ RegExpUnicodeEscapeSequence
  1. RegExpUnicodeEscapeSequenceCharacterValue의 숫자 값을 가진 코드 포인트를 반환한다.
RegExpIdentifierStart :: UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart :: UnicodeLeadSurrogate UnicodeTrailSurrogate
  1. leadUnicodeLeadSurrogate가 매치한 코드 포인트의 숫자 값인 코드 유닛을 할당한다.
  2. trailUnicodeTrailSurrogate가 매치한 코드 포인트의 숫자 값인 코드 유닛을 할당한다.
  3. UTF16SurrogatePairToCodePoint(lead, trail)을 반환한다.

22.2.2 패턴 의미론

정규 표현식 패턴은 아래에 설명된 과정을 사용하여 추상 클로저로 변환된다. 구현체는 결과가 동일하다면 아래에 나열된 알고리즘보다 더 효율적인 알고리즘을 사용하는 것이 권장된다. 추상 클로저는 RegExp 객체의 [[RegExpMatcher]] 내부 슬롯의 값으로 사용된다.

Pattern은 연관된 플래그에 uv가 모두 없으면 BMP 패턴이다. 그렇지 않으면 유니코드 패턴이다. BMP 패턴은 기본 다국어 평면 범위 내의 16비트 값 시퀀스로 해석된 문자열에 대해 매칭을 수행한다. 유니코드 패턴은 UTF-16으로 인코딩된 유니코드 코드 포인트 시퀀스로 해석된 문자열에 대해 매칭을 수행한다. BMP 패턴의 동작을 설명하는 문맥에서 “문자”란 16비트 유니코드 BMP 코드 포인트 하나를 의미한다. 유니코드 패턴의 동작을 설명하는 문맥에서 “문자”란 UTF-16 인코딩된 코드 포인트(6.1.4)를 의미한다. 두 경우 모두 “문자 값”이란 해당 비인코딩 코드 포인트의 숫자 값을 뜻한다.

Pattern의 문법과 의미론은 Pattern의 소스 텍스트가 각각 List 타입의 SourceCharacter 값들로 구성된 것으로 정의된다. 각 SourceCharacter는 하나의 유니코드 코드 포인트에 대응한다. 만약 BMP 패턴에 비BMP SourceCharacter가 포함된 경우 전체 패턴은 UTF-16으로 인코딩되고, 그 인코딩의 개별 코드 유닛이 List의 요소로 사용된다.

참고

예를 들어, 소스 텍스트에서 단일 비BMP 문자 U+1D11E(MUSICAL SYMBOL G CLEF)로 표현된 패턴을 생각해보자. 유니코드 패턴으로 해석하면, 이는 단일 코드 포인트 U+1D11E로 구성된 단일 요소(문자) List가 된다. 하지만 BMP 패턴으로 해석하면, 먼저 UTF-16으로 인코딩되어 코드 유닛 0xD834와 0xDD1E로 구성된 두 요소 List가 된다.

패턴은 RegExp 생성자에 ECMAScript 문자열 값으로 전달되며, 비BMP 문자는 UTF-16으로 인코딩되어 있다. 예를 들어, 단일 문자 MUSICAL SYMBOL G CLEF 패턴은 문자열 값으로 표현하면 문자열 길이 2이고, 요소는 코드 유닛 0xD834와 0xDD1E이다. 따라서 BMP 패턴으로 두 패턴 문자로 처리하는 데 추가 변환이 필요하지 않다. 하지만 유니코드 패턴으로 처리하려면 UTF16SurrogatePairToCodePoint를 사용해 단일 패턴 문자(코드 포인트 U+1D11E)만을 요소로 가지는 List를 생성해야 한다.

구현체는 실제로 이러한 UTF-16 변환을 수행하지 않을 수도 있지만, 이 명세의 의미론은 패턴 매칭 결과가 이러한 변환이 수행된 것과 같아야 함을 요구한다.

22.2.2.1 표기법

아래 설명에서는 다음 내부 데이터 구조를 사용합니다:

  • CharSetElement는 다음 두 가지 중 하나입니다:
    • rer.[[UnicodeSets]]false인 경우, CharSetElement는 위의 패턴 의미론에서 말하는 문자입니다.
    • rer.[[UnicodeSets]]true인 경우, CharSetElement는 위의 패턴 의미론에서 말하는 문자로 이루어진 시퀀스입니다. 여기에는 빈 시퀀스, 한 글자의 시퀀스, 두 글자 이상의 시퀀스가 포함됩니다. 편의를 위해, 이러한 종류의 CharSetElement를 다룰 때, 개별 문자는 한 글자 시퀀스와 동등하게 취급됩니다.
  • CharSet은 CharSetElement의 수학적 집합입니다.
  • CaptureRangeRecord { [[StartIndex]], [[EndIndex]] }로, 캡처에 포함된 문자 범위를 나타냅니다. [[StartIndex]]Input 내 범위의 시작 인덱스(포함)를 나타내는 정수이고, [[EndIndex]]Input 내 범위의 끝 인덱스(미포함)를 나타내는 정수입니다. 어떤 CaptureRange에 대해서도, 이 인덱스들은 [[StartIndex]][[EndIndex]] 불변식을 만족해야 합니다.
  • MatchStateRecord { [[Input]], [[EndIndex]], [[Captures]] }로, [[Input]]는 매칭되는 문자열을 나타내는 문자 List, [[EndIndex]]정수, [[Captures]]는 패턴 내의 왼쪽 캡처 괄호마다 하나씩의 값을 가지는 List입니다. MatchStates는 정규 표현식 매칭 알고리즘에서 부분 매칭 상태를 나타내는 데 사용됩니다. [[EndIndex]]는 패턴이 지금까지 매치한 마지막 입력 문자 인덱스에 1을 더한 값이며, [[Captures]]는 캡처 괄호의 결과를 저장합니다. n번째 [[Captures]] 요소는 n번째 캡처 괄호에서 캡처된 문자 범위를 나타내는 CaptureRange이거나, 해당 캡처 괄호에 아직 도달하지 않은 경우 undefined입니다. 백트래킹 때문에 매칭 과정 중에는 여러 MatchStates가 동시에 사용될 수 있습니다.
  • MatcherContinuation추상 클로저로, 하나의 MatchState 인수를 받고 MatchState 또는 failure를 반환합니다. MatcherContinuation은 클로저의 캡처 값에 의해 지정된 패턴의 나머지 부분을 Input에 대해, 주어진 MatchState 중간 상태부터 매칭을 시도합니다. 매칭에 성공하면 MatcherContinuation은 도달한 최종 MatchState를 반환하고, 실패하면 MatcherContinuationfailure를 반환합니다.
  • Matcher추상 클로저로, 두 개의 인수—MatchStateMatcherContinuation—를 받아 MatchState 또는 failure를 반환합니다. Matcher는 클로저의 캡처 값에 의해 지정된 패턴의 중간 부분을 MatchState[[Input]]에 대해 주어진 MatchState 중간 상태부터 매칭을 시도합니다. MatcherContinuation 인수는 패턴의 나머지 부분을 매칭하는 클로저여야 합니다. 패턴의 중간 부분을 매칭하여 새로운 MatchState를 얻은 후, Matcher는 그 새로운 MatchState에 대해 MatcherContinuation을 호출하여 패턴의 나머지 부분도 매칭 가능한지 확인합니다. 가능하면 MatcherMatchStateMatcherContinuation에서 반환된 값을 그대로 반환합니다. 그렇지 않으면 Matcher는 선택 지점에서 다른 선택을 시도하며 MatcherContinuation를 반복적으로 호출하여 성공하거나 모든 가능성을 소진할 때까지 진행합니다.

22.2.2.1.1 RegExp 레코드

RegExp 레코드는 컴파일 중과 매칭 중에 필요할 수 있는 RegExp에 대한 정보를 저장하는 데 사용되는 Record 값입니다.

다음 필드를 가집니다:

표 68: RegExp 레코드 필드
필드 이름 의미
[[IgnoreCase]] Boolean RegExp의 플래그에 "i"가 포함되어 있는지 나타냄
[[Multiline]] Boolean RegExp의 플래그에 "m"가 포함되어 있는지 나타냄
[[DotAll]] Boolean RegExp의 플래그에 "s"가 포함되어 있는지 나타냄
[[Unicode]] Boolean RegExp의 플래그에 "u"가 포함되어 있는지 나타냄
[[UnicodeSets]] Boolean RegExp의 플래그에 "v"가 포함되어 있는지 나타냄
[[CapturingGroupsCount]] 0 이상의 정수 RegExp 패턴 내 왼쪽 캡처 괄호의 개수

22.2.2.2 실행 시 의미론: CompilePattern

구문 지향 연산 CompilePattern은 rer(RegExp 레코드)를 인수로 받고, 문자 List와 0 이상의 정수를 인수로 받아 MatchState 또는 failure를 반환하는 추상 클로저를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:

Pattern :: Disjunction
  1. mCompileSubpatternDisjunctionrerforward를 인수로 호출한 결과를 할당한다.
  2. 다음과 같이 호출될 때 아래 단계를 수행하는 (Input, index) 파라미터를 가지며 rerm을 캡처하는 새로운 추상 클로저를 반환한다:
    1. Assert: Input은 문자 List이다.
    2. Assert: 0 ≤ indexInput의 요소 개수이다.
    3. c에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y) 파라미터를 가지는 새로운 MatcherContinuation를 할당한다:
      1. Assert: yMatchState이다.
      2. y를 반환한다.
    4. caprer.[[CapturingGroupsCount]] 개의 undefined 값을 가지는 List를 인덱스 1부터 rer.[[CapturingGroupsCount]]까지 할당한다.
    5. xMatchState { [[Input]]: Input, [[EndIndex]]: index, [[Captures]]: cap }를 할당한다.
    6. m(x, c)를 반환한다.
참고

패턴은 추상 클로저 값으로 컴파일된다. RegExpBuiltinExec는 이 절차를 문자 List와 그 List 내의 오프셋에 적용해, 해당 오프셋에서 패턴이 정확히 매치되는지, 매치된다면 캡처 괄호의 값이 무엇인지 결정할 수 있다. 22.2.2의 알고리즘은 패턴 컴파일 시 SyntaxError 예외를 던질 수 있도록 설계되어 있다. 하지만 패턴이 성공적으로 컴파일된 뒤에는, 결과로 얻은 추상 클로저를 문자 List에서 매치를 찾기 위해 적용했을 때 예외가 발생할 수 없다(단, 어디서든 발생 가능한 구현 정의 예외, 예를 들어 메모리 부족 등은 제외).

22.2.2.3 실행 시 의미론: CompileSubpattern

구문 지향 연산 CompileSubpattern은 rer(RegExp 레코드)와 direction(forward 또는 backward)를 인수로 받고 Matcher를 반환한다.

참고 1

이 섹션은 B.1.2.5에서 수정된다.

다음 생성식에 대해 개별적으로 정의된다:

Disjunction :: Alternative | Disjunction
  1. m1CompileSubpatternAlternativererdirection을 인수로 호출한 결과를 할당한다.
  2. m2CompileSubpatternDisjunctionrerdirection을 인수로 호출한 결과를 할당한다.
  3. MatchTwoAlternatives(m1, m2)를 반환한다.
참고 2

| 정규 표현식 연산자는 두 가지 대안을 구분한다. 패턴은 먼저 왼쪽 Alternative(그리고 그 뒤의 정규 표현식)를 매칭 시도한다. 실패하면 오른쪽 Disjunction(그리고 그 뒤의 정규 표현식)를 시도한다. 왼쪽 Alternative, 오른쪽 Disjunction, 그리고 그 뒤의 정규 표현식 모두 선택 지점이 있으면, 그 뒤의 모든 선택을 먼저 시도한 다음 왼쪽 Alternative의 다음 선택으로 넘어간다. 왼쪽 Alternative의 선택이 모두 소진되면, 왼쪽 Alternative 대신 오른쪽 Disjunction을 시도한다. |로 건너뛴 패턴 부분의 캡처 괄호는 문자열 대신 undefined 값을 생성한다. 예를 들어,

/a|ab/.exec("abc")

의 결과는 "a"이고 "ab"가 아니다. 또,

/((a)|(ab))((c)|(bc))/.exec("abc")

의 결과 배열은

["abc", "a", "a", undefined, "bc", undefined, "bc"]

이고,

["abc", "ab", undefined, "ab", "c", "c", undefined]

는 아니다. 두 대안의 시도 순서는 direction 값과 무관하다.

Alternative :: [empty]
  1. EmptyMatcher()를 반환한다.
Alternative :: Alternative Term
  1. m1CompileSubpatternAlternativererdirection을 인수로 호출한 결과를 할당한다.
  2. m2CompileSubpatternTermrerdirection을 인수로 호출한 결과를 할당한다.
  3. MatchSequence(m1, m2, direction)를 반환한다.
참고 3

연속된 Term들은 Input의 연속된 부분을 동시에 매칭 시도한다. directionforward인 경우, 왼쪽 Alternative, 오른쪽 Term, 그리고 그 뒤의 정규 표현식 모두 선택 지점이 있으면, 그 뒤의 모든 선택을 먼저 시도한 다음 오른쪽 Term의 다음 선택으로 넘어가고, 오른쪽 Term의 모든 선택이 끝나면 왼쪽 Alternative의 다음 선택으로 넘어간다. directionbackward인 경우, AlternativeTerm의 평가 순서가 반대가 된다.

Term :: Assertion
  1. CompileAssertionAssertionrer를 인수로 호출한 결과를 반환한다.
참고 4

결과 Matcherdirection과 무관하다.

Term :: Atom
  1. CompileAtomAtomrerdirection을 인수로 호출한 결과를 반환한다.
Term :: Atom Quantifier
  1. mCompileAtomAtomrerdirection을 인수로 호출한 결과를 할당한다.
  2. qCompileQuantifierQuantifier에 대해 호출한 결과를 할당한다.
  3. Assert: q.[[Min]]q.[[Max]].
  4. parenIndexCountLeftCapturingParensBefore(Term)의 결과를 할당한다.
  5. parenCountCountLeftCapturingParensWithin(Atom)의 결과를 할당한다.
  6. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 m, q, parenIndex, parenCount를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. RepeatMatcher(m, q.[[Min]], q.[[Max]], q.[[Greedy]], x, c, parenIndex, parenCount)를 반환한다.

22.2.2.3.1 RepeatMatcher ( m, min, max, greedy, x, c, parenIndex, parenCount )

RepeatMatcher 추상 연산은 m(Matcher), min(0 이상의 정수), max(0 이상의 정수 또는 +∞), greedy(Boolean), x(MatchState), c(MatcherContinuation), parenIndex(0 이상의 정수), parenCount(0 이상의 정수)를 인수로 받고 MatchState 또는 failure를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 만약 max = 0이면, c(x)를 반환한다.
  2. d에 다음과 같이 호출될 때 아래 단계를 수행하는 (y) 파라미터를 가지며 m, min, max, greedy, x, c, parenIndex, parenCount를 캡처하는 새로운 MatcherContinuation를 할당한다:
    1. Assert: yMatchState이다.
    2. 만약 min = 0이고 y.[[EndIndex]] = x.[[EndIndex]]이면, failure를 반환한다.
    3. 만약 min = 0이면 min2는 0, 아니면 min2min - 1로 한다.
    4. 만약 max = +∞이면 max2는 +∞, 아니면 max2max - 1로 한다.
    5. RepeatMatcher(m, min2, max2, greedy, y, c, parenIndex, parenCount)를 반환한다.
  3. capx.[[Captures]]의 복사본을 할당한다.
  4. 정수 k에 대해 포함 구간 parenIndex + 1부터 parenIndex + parenCount까지 반복하며, cap[k]에 undefined를 할당한다.
  5. Inputx.[[Input]]을 할당한다.
  6. ex.[[EndIndex]]를 할당한다.
  7. xrMatchState { [[Input]]: Input, [[EndIndex]]: e, [[Captures]]: cap }를 할당한다.
  8. 만약 min ≠ 0이면, m(xr, d)를 반환한다.
  9. 만약 greedyfalse이면,
    1. zc(x)를 할당한다.
    2. zfailure가 아니면 z를 반환한다.
    3. m(xr, d)를 반환한다.
  10. zm(xr, d)를 할당한다.
  11. zfailure가 아니면 z를 반환한다.
  12. c(x)를 반환한다.
참고 1

Atom 뒤에 Quantifier가 오면, Quantifier가 지정한 횟수만큼 반복된다. Quantifier는 비탐욕적일 수 있는데 이 경우 Atom 패턴을 가능한 적게 반복하며, 아니면 탐욕적일 경우 Atom 패턴을 가능한 많이 반복한다. Atom 패턴이 반복되는 것이며, 매치되는 입력 문자 시퀀스가 반복되는 것이 아니므로, Atom의 각 반복은 서로 다른 입력 부분 문자열을 매치할 수 있다.

참고 2

Atom와 그 뒤의 정규 표현식 모두 선택 지점이 있으면, Atom을 먼저 가능한 많이(또는 비탐욕적이면 적게) 반복한다. 그 뒤의 모든 선택을 먼저 시도한 다음 마지막 Atom 반복의 다음 선택으로 넘어간다. 마지막(n번째) Atom 반복의 모든 선택이 끝나면, 그 다음은 마지막에서 두 번째(n-1)번째 Atom 반복의 다음 선택으로 넘어간다. 반복 횟수가 더 많거나 적게 가능한 경우, 위 순서대로 모두 소진한 뒤 이전 반복으로 넘어간다.

비교 예시:

/a[a-z]{2,4}/.exec("abcdefghi")

결과는 "abcde"이고

/a[a-z]{2,4}?/.exec("abcdefghi")

결과는 "abc"이다.

또한 다음을 보라:

/(aa|aabaac|ba|b|c)*/.exec("aabaac")

위의 선택 순서에 따라 결과 배열은

["aaba", "ba"]

이고, 아래는 아니다:

["aabaac", "aabaac"]
["aabaac", "c"]

위와 같은 선택 순서는 정규 표현식을 사용해 두 수의 최대공약수를 계산할 수도 있다(단항 표기 사용). 예를 들어 10과 15의 최대공약수 계산은 아래와 같다:

"aaaaaaaaaa,aaaaaaaaaaaaaaa".replace(/^(a+)\1*,\1+$/, "$1")

결과는 단항 표기로 "aaaaa"이다.

참고 3

RepeatMatcher의 4 단계는 Atom의 캡처를 반복될 때마다 초기화한다. 아래 예시에서 그 동작을 확인할 수 있다:

/(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac")

결과 배열은

["zaacbbbcac", "z", "ac", "a", undefined, "c"]

이고,

["zaacbbbcac", "z", "ac", "a", "bbb", "c"]

는 아니다. 이는 바깥 *의 각 반복에서 수량자가 포함하는 Atom의 모든 캡처 문자열(여기서는 2, 3, 4, 5번)이 초기화되기 때문이다.

참고 4

RepeatMatcher의 2.b 단계는 최솟값 반복을 만족한 뒤에는, 빈 문자열을 매치하는 반복은 더 이상 시도하지 않는다고 명시한다. 이는 아래와 같은 패턴에서 정규 표현식 엔진이 무한루프에 빠지는 것을 방지한다:

/(a*)*/.exec("b")

혹은 다음과 같이 조금 더 복잡한 경우에도:

/(a*)b\1+/.exec("baaaac")

결과 배열은

["b", ""]

22.2.2.3.2 EmptyMatcher ( )

EmptyMatcher 추상 연산은 인수를 받지 않으며 Matcher를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 아무것도 캡처하지 않는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. c(x)를 반환한다.

22.2.2.3.3 MatchTwoAlternatives ( m1, m2 )

MatchTwoAlternatives 추상 연산은 m1(Matcher)와 m2(Matcher)를 인수로 받아 Matcher를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 m1m2를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. rm1(x, c)를 할당한다.
    4. rfailure가 아니면 r를 반환한다.
    5. m2(x, c)를 반환한다.

22.2.2.3.4 MatchSequence ( m1, m2, direction )

MatchSequence 추상 연산은 m1(Matcher), m2(Matcher), direction(forward 또는 backward)를 인수로 받아 Matcher를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 만약 directionforward라면,
    1. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 m1m2를 캡처하는 새로운 Matcher를 반환한다:
      1. Assert: xMatchState이다.
      2. Assert: cMatcherContinuation이다.
      3. d에 다음과 같이 호출될 때 아래 단계를 수행하는 (y) 파라미터를 가지며 cm2를 캡처하는 새로운 MatcherContinuation를 할당한다:
        1. Assert: yMatchState이다.
        2. m2(y, c)를 반환한다.
      4. m1(x, d)를 반환한다.
  2. 그 외의 경우,
    1. Assert: directionbackward이다.
    2. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 m1m2를 캡처하는 새로운 Matcher를 반환한다:
      1. Assert: xMatchState이다.
      2. Assert: cMatcherContinuation이다.
      3. d에 다음과 같이 호출될 때 아래 단계를 수행하는 (y) 파라미터를 가지며 cm1을 캡처하는 새로운 MatcherContinuation를 할당한다:
        1. Assert: yMatchState이다.
        2. m1(y, c)를 반환한다.
      4. m2(x, d)를 반환한다.

22.2.2.4 실행 시 의미론: CompileAssertion

구문 지향 연산 CompileAssertion은 rer(RegExp 레코드)를 인수로 받아 Matcher를 반환한다.

참고 1

이 섹션은 B.1.2.6에서 수정된다.

다음 생성식에 대해 개별적으로 정의된다:

Assertion :: ^
  1. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 rer를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. Inputx.[[Input]]을 할당한다.
    4. ex.[[EndIndex]]를 할당한다.
    5. 만약 e = 0이거나, rer.[[Multiline]]true이고 Input[e - 1]이 LineTerminator에 매치되면,
      1. c(x)를 반환한다.
    6. failure를 반환한다.
참고 2

y 플래그가 사용되어도, ^는 항상 Input의 시작 또는(rer.[[Multiline]]true이면) 줄의 시작에서만 매치된다.

Assertion :: $
  1. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 rer를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. Inputx.[[Input]]을 할당한다.
    4. ex.[[EndIndex]]를 할당한다.
    5. InputLengthInput의 요소 개수를 할당한다.
    6. 만약 e = InputLength이거나, rer.[[Multiline]]true이고 Input[e]이 LineTerminator에 매치되면,
      1. c(x)를 반환한다.
    7. failure를 반환한다.
Assertion :: \b
  1. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 rer를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. Inputx.[[Input]]을 할당한다.
    4. ex.[[EndIndex]]를 할당한다.
    5. aIsWordChar(rer, Input, e - 1)을 할당한다.
    6. bIsWordChar(rer, Input, e)를 할당한다.
    7. 만약 atrue이고 bfalse이거나, afalse이고 btrue이면 c(x)를 반환한다.
    8. failure를 반환한다.
Assertion :: \B
  1. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 rer를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. Inputx.[[Input]]을 할당한다.
    4. ex.[[EndIndex]]를 할당한다.
    5. aIsWordChar(rer, Input, e - 1)을 할당한다.
    6. bIsWordChar(rer, Input, e)를 할당한다.
    7. 만약 atrue이고 btrue이거나, afalse이고 bfalse이면 c(x)를 반환한다.
    8. failure를 반환한다.
Assertion :: (?= Disjunction )
  1. mCompileSubpatternDisjunctionrerforward를 인수로 호출한 결과를 할당한다.
  2. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 m를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. d에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y) 파라미터를 가지는 새로운 MatcherContinuation를 할당한다:
      1. Assert: yMatchState이다.
      2. y를 반환한다.
    4. rm(x, d)를 할당한다.
    5. rfailure이면 failure를 반환한다.
    6. Assert: rMatchState이다.
    7. capr.[[Captures]]를 할당한다.
    8. Inputx.[[Input]]을 할당한다.
    9. xex.[[EndIndex]]를 할당한다.
    10. zMatchState { [[Input]]: Input, [[EndIndex]]: xe, [[Captures]]: cap }를 할당한다.
    11. c(z)를 반환한다.
참고 3

(?= Disjunction ) 형식은 0폭 양수 전방탐색을 지정한다. 성공하려면 Disjunction 내부의 패턴이 현재 위치에서 매치되어야 하지만, 현재 위치는 뒤 패턴을 매치하기 전에 이동하지 않는다. Disjunction이 현재 위치에서 여러 방식으로 매치 가능해도 첫 번째 방식만 시도된다. 다른 정규식 연산자와 달리 (?= 형식에는 백트래킹이 없다(이런 특이한 동작은 Perl에서 유래). 이는 Disjunction에 캡처 괄호가 있고, 패턴의 뒤에 해당 캡처를 참조하는 경우에만 영향을 미친다.

예시:

/(?=(a+))/.exec("baaabac")

은 첫 번째 b 바로 뒤에서 빈 문자열을 매치하고, 결과 배열은:

["", "aaa"]

전방탐색 내부에 백트래킹이 없음을 보여주기 위해 다음을 보라:

/(?=(a+))a*b\1/.exec("baaabac")

이 식의 결과는

["aba", "a"]

이고, 아래는 아니다:

["aaaba", "a"]
Assertion :: (?! Disjunction )
  1. mCompileSubpatternDisjunctionrerforward를 인수로 호출한 결과를 할당한다.
  2. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 m를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. d에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y) 파라미터를 가지는 새로운 MatcherContinuation를 할당한다:
      1. Assert: yMatchState이다.
      2. y를 반환한다.
    4. rm(x, d)를 할당한다.
    5. rfailure가 아니면 failure를 반환한다.
    6. c(x)를 반환한다.
참고 4

(?! Disjunction ) 형식은 0폭 음수 전방탐색을 지정한다. 성공하려면 Disjunction 내부의 패턴이 현재 위치에서 매치되지 않아야 한다. 현재 위치는 뒤 패턴을 매치하기 전에 이동하지 않는다. Disjunction에는 캡처 괄호를 포함할 수 있는데, 이 괄호에 대한 역참조는 Disjunction 내부에서만 의미가 있다. 패턴의 다른 곳에서 이 캡처 괄호를 참조하면 항상 undefined를 반환하므로, 음수 전방탐색이 실패해야 패턴이 성공한다. 예를 들어,

/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")

a 바로 뒤에 임의의 개수 n의 a, b, 그 다음 또 n개의 a(첫 번째 \2로 지정), 그리고 c가 오지 않는 a를 찾는다. 두 번째 \2는 음수 전방탐색 바깥에 있으므로 undefined와 매치되어 항상 성공한다. 전체 표현식의 결과 배열은:

["baaabaac", "ba", undefined, "abaac"]
Assertion :: (?<= Disjunction )
  1. mCompileSubpatternDisjunctionrerbackward를 인수로 호출한 결과를 할당한다.
  2. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 m를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. d에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y) 파라미터를 가지는 새로운 MatcherContinuation를 할당한다:
      1. Assert: yMatchState이다.
      2. y를 반환한다.
    4. rm(x, d)를 할당한다.
    5. rfailure이면 failure를 반환한다.
    6. Assert: rMatchState이다.
    7. capr.[[Captures]]를 할당한다.
    8. Inputx.[[Input]]을 할당한다.
    9. xex.[[EndIndex]]를 할당한다.
    10. zMatchState { [[Input]]: Input, [[EndIndex]]: xe, [[Captures]]: cap }를 할당한다.
    11. c(z)를 반환한다.
Assertion :: (?<! Disjunction )
  1. mCompileSubpatternDisjunctionrerbackward를 인수로 호출한 결과를 할당한다.
  2. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 m를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. d에 아무것도 캡처하지 않고 아래 단계를 수행하는 (y) 파라미터를 가지는 새로운 MatcherContinuation를 할당한다:
      1. Assert: yMatchState이다.
      2. y를 반환한다.
    4. rm(x, d)를 할당한다.
    5. rfailure가 아니면 failure를 반환한다.
    6. c(x)를 반환한다.

22.2.2.4.1 IsWordChar ( rer, Input, e )

IsWordChar 추상 연산은 rer(RegExp 레코드), Input(문자 List), e(정수)를 인수로 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. InputLengthInput의 요소 개수를 할당한다.
  2. 만약 e = -1 또는 e = InputLength이면 false를 반환한다.
  3. cInput[e] 문자를 할당한다.
  4. 만약 WordCharacters(rer)에 c가 포함되어 있으면 true를 반환한다.
  5. false를 반환한다.

22.2.2.5 실행 시 의미론: CompileQuantifier

구문 지향 연산 CompileQuantifier는 인수를 받지 않으며 Record 타입의 [[Min]](0 이상의 정수), [[Max]](0 이상의 정수 또는 +∞), [[Greedy]](Boolean) 필드를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:

Quantifier :: QuantifierPrefix
  1. qpCompileQuantifierPrefixQuantifierPrefix에 대해 호출한 결과를 할당한다.
  2. Record { [[Min]]: qp.[[Min]], [[Max]]: qp.[[Max]], [[Greedy]]: true }를 반환한다.
Quantifier :: QuantifierPrefix ?
  1. qpCompileQuantifierPrefixQuantifierPrefix에 대해 호출한 결과를 할당한다.
  2. Record { [[Min]]: qp.[[Min]], [[Max]]: qp.[[Max]], [[Greedy]]: false }를 반환한다.

22.2.2.6 실행 시 의미론: CompileQuantifierPrefix

구문 지향 연산 CompileQuantifierPrefix는 인수를 받지 않으며 Record 타입의 [[Min]](0 이상의 정수), [[Max]](0 이상의 정수 또는 +∞) 필드를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:

QuantifierPrefix :: *
  1. Record { [[Min]]: 0, [[Max]]: +∞ }를 반환한다.
QuantifierPrefix :: +
  1. Record { [[Min]]: 1, [[Max]]: +∞ }를 반환한다.
QuantifierPrefix :: ?
  1. Record { [[Min]]: 0, [[Max]]: 1 }를 반환한다.
QuantifierPrefix :: { DecimalDigits }
  1. iDecimalDigits의 MV를 할당한다(12.9.3 참고).
  2. Record { [[Min]]: i, [[Max]]: i }를 반환한다.
QuantifierPrefix :: { DecimalDigits ,}
  1. iDecimalDigits의 MV를 할당한다.
  2. Record { [[Min]]: i, [[Max]]: +∞ }를 반환한다.
QuantifierPrefix :: { DecimalDigits , DecimalDigits }
  1. i에 첫 번째 DecimalDigits의 MV를 할당한다.
  2. j에 두 번째 DecimalDigits의 MV를 할당한다.
  3. Record { [[Min]]: i, [[Max]]: j }를 반환한다.

22.2.2.7 실행 시 의미론: CompileAtom

구문 지향 연산 CompileAtom은 rer(RegExp 레코드)와 direction(forward 또는 backward)를 인수로 받고 Matcher를 반환한다.

참고 1

이 섹션은 B.1.2.7에서 수정된다.

다음 생성식에 대해 개별적으로 정의된다:

Atom :: PatternCharacter
  1. chPatternCharacter가 매치한 문자를 할당한다.
  2. A에 문자 ch를 포함하는 원소 하나짜리 CharSet을 할당한다.
  3. CharacterSetMatcher(rer, A, false, direction)을 반환한다.
Atom :: .
  1. AAllCharacters(rer)를 할당한다.
  2. rer.[[DotAll]]true가 아니면,
    1. A에서 LineTerminator 생성식의 오른쪽에 해당하는 모든 코드 포인트의 문자를 제거한다.
  3. CharacterSetMatcher(rer, A, false, direction)을 반환한다.
Atom :: CharacterClass
  1. ccCompileCharacterClassCharacterClassrer를 인수로 호출한 결과를 할당한다.
  2. cscc.[[CharSet]]을 할당한다.
  3. rer.[[UnicodeSets]]false이거나, cs의 모든 CharSetElement가 한 글자로만 이루어진 경우(빈 집합도 포함), CharacterSetMatcher(rer, cs, cc.[[Invert]], direction)을 반환한다.
  4. Assert: cc.[[Invert]]false이다.
  5. lmList 타입의 빈 Matchers 리스트를 할당한다.
  6. cs의 각 CharSetElement s에 대해, 두 글자 이상인 경우 길이가 긴 것부터 반복하여
    1. cs2s의 마지막 코드 포인트 하나만을 포함하는 CharSet를 할당한다.
    2. m2CharacterSetMatcher(rer, cs2, false, direction)를 할당한다.
    3. s의 두 번째부터 마지막 앞까지의 각 코드 포인트 c1에 대해 거꾸로 반복하여
      1. cs1c1을 포함하는 원소 하나짜리 CharSet를 할당한다.
      2. m1CharacterSetMatcher(rer, cs1, false, direction)를 할당한다.
      3. m2MatchSequence(m1, m2, direction)를 할당한다.
    4. m2lm에 추가한다.
  7. singlescs의 모든 한 글자짜리 CharSetElement만을 포함하는 CharSet를 할당한다.
  8. CharacterSetMatcher(rer, singles, false, direction)를 lm에 추가한다.
  9. cs가 빈 시퀀스를 포함하면, EmptyMatcher()를 lm에 추가한다.
  10. m2lm의 마지막 Matcher를 할당한다.
  11. lm의 마지막 전부터 거꾸로 각 Matcher m1에 대해 반복하여
    1. m2MatchTwoAlternatives(m1, m2)를 할당한다.
  12. m2를 반환한다.
Atom :: ( GroupSpecifieropt Disjunction )
  1. mCompileSubpatternDisjunctionrerdirection을 인수로 호출한 결과를 할당한다.
  2. parenIndexCountLeftCapturingParensBefore(Atom)의 결과를 할당한다.
  3. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 direction, m, parenIndex를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. d에 다음과 같이 호출될 때 아래 단계를 수행하는 (y) 파라미터를 가지며 x, c, direction, parenIndex를 캡처하는 새로운 MatcherContinuation를 할당한다:
      1. Assert: yMatchState이다.
      2. capy.[[Captures]]의 복사본을 할당한다.
      3. Inputx.[[Input]]을 할당한다.
      4. xex.[[EndIndex]]를 할당한다.
      5. yey.[[EndIndex]]를 할당한다.
      6. directionforward이면,
        1. Assert: xeye.
        2. rCaptureRange { [[StartIndex]]: xe, [[EndIndex]]: ye }를 할당한다.
      7. 그 외의 경우,
        1. Assert: directionbackward임을 확인한다.
        2. Assert: yexe.
        3. rCaptureRange { [[StartIndex]]: ye, [[EndIndex]]: xe }를 할당한다.
      8. cap[parenIndex + 1]에 r를 할당한다.
      9. zMatchState { [[Input]]: Input, [[EndIndex]]: ye, [[Captures]]: cap }를 할당한다.
      10. c(z)를 반환한다.
    4. m(x, d)를 반환한다.
참고 2

( Disjunction ) 형태의 괄호는 Disjunction 패턴의 구성요소를 하나로 그룹화함과 동시에 매치 결과를 저장하는 역할을 한다. 매치 결과는 역참조(\ 다음에 0이 아닌 10진수), 치환 문자열에서 참조, 또는 정규표현식 매칭 Abstract Closure의 배열로 반환될 수 있다. 괄호의 캡처 동작을 방지하려면 (?: Disjunction ) 형태를 사용한다.

Atom :: (? RegularExpressionModifiers : Disjunction )
  1. addModifierssource text matched by RegularExpressionModifiers를 할당한다.
  2. removeModifiers에 빈 문자열을 할당한다.
  3. modifiedRerUpdateModifiers(rer, CodePointsToString(addModifiers), removeModifiers)를 할당한다.
  4. CompileSubpatternDisjunctionmodifiedRerdirection을 인수로 호출한 결과를 반환한다.
Atom :: (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction )
  1. addModifierssource text matched by 첫 번째 RegularExpressionModifiers를 할당한다.
  2. removeModifierssource text matched by 두 번째 RegularExpressionModifiers를 할당한다.
  3. modifiedRerUpdateModifiers(rer, CodePointsToString(addModifiers), CodePointsToString(removeModifiers))를 할당한다.
  4. CompileSubpatternDisjunctionmodifiedRerdirection을 인수로 호출한 결과를 반환한다.
AtomEscape :: DecimalEscape
  1. nCapturingGroupNumber of DecimalEscape를 할당한다.
  2. Assert: nrer.[[CapturingGroupsCount]]임을 확인한다.
  3. BackreferenceMatcher(rer, « n », direction)을 반환한다.
참고 3

\ 뒤에 0이 아닌 10진수가 오는 이스케이프 시퀀스 nn번째 캡처 괄호의 매치 결과(22.2.2.1)와 매치된다. 정규표현식에 n개 미만의 캡처 괄호가 있으면 오류이다. 정규표현식에 n개 이상의 캡처 괄호가 있지만 n번째가 아무것도 캡처하지 않아 undefined인 경우, 역참조는 항상 성공한다.

AtomEscape :: CharacterEscape
  1. cvCharacterValue of CharacterEscape를 할당한다.
  2. ch에 문자값이 cv인 문자를 할당한다.
  3. A에 문자 ch를 포함하는 원소 하나짜리 CharSet를 할당한다.
  4. CharacterSetMatcher(rer, A, false, direction)을 반환한다.
AtomEscape :: CharacterClassEscape
  1. csCompileToCharSetCharacterClassEscaperer를 인수로 호출한 결과를 할당한다.
  2. rer.[[UnicodeSets]]false이거나, cs의 모든 CharSetElement가 한 글자만으로 이루어진 경우(빈 집합 포함), CharacterSetMatcher(rer, cs, false, direction)을 반환한다.
  3. lmList 타입의 빈 Matchers 리스트를 할당한다.
  4. cs의 각 두 글자 이상 CharSetElement s에 대해, 길이 내림차순으로 반복하여
    1. cs2s의 마지막 코드 포인트 하나만을 포함하는 CharSet를 할당한다.
    2. m2CharacterSetMatcher(rer, cs2, false, direction)를 할당한다.
    3. s의 두 번째부터 마지막 앞까지의 각 코드 포인트 c1에 대해 거꾸로 반복하여
      1. cs1c1을 포함하는 원소 하나짜리 CharSet를 할당한다.
      2. m1CharacterSetMatcher(rer, cs1, false, direction)를 할당한다.
      3. m2MatchSequence(m1, m2, direction)를 할당한다.
    4. m2lm에 추가한다.
  5. singlescs의 모든 한 글자짜리 CharSetElement만을 포함하는 CharSet를 할당한다.
  6. CharacterSetMatcher(rer, singles, false, direction)를 lm에 추가한다.
  7. cs가 빈 시퀀스를 포함하면, EmptyMatcher()를 lm에 추가한다.
  8. m2lm의 마지막 Matcher를 할당한다.
  9. lm의 마지막 전부터 거꾸로 각 Matcher m1에 대해 반복하여
    1. m2MatchTwoAlternatives(m1, m2)를 할당한다.
  10. m2를 반환한다.
AtomEscape :: k GroupName
  1. matchingGroupSpecifiersGroupSpecifiersThatMatch(GroupName)를 할당한다.
  2. parenIndicesList 타입의 빈 리스트를 할당한다.
  3. matchingGroupSpecifiers의 각 GroupSpecifier groupSpecifier에 대해 반복하여
    1. parenIndexCountLeftCapturingParensBefore(groupSpecifier)의 결과를 할당한다.
    2. parenIndexparenIndices에 추가한다.
  4. BackreferenceMatcher(rer, parenIndices, direction)를 반환한다.

22.2.2.7.1 CharacterSetMatcher ( rer, A, invert, direction )

CharacterSetMatcher 추상 연산은 rer(RegExp 레코드), A(CharSet), invert(Boolean), direction(forward 또는 backward)를 인수로 받고 Matcher를 반환한다. 호출 시 다음 단계를 수행한다:

  1. rer.[[UnicodeSets]]true이면,
    1. Assert: invertfalse임을 확인한다.
    2. Assert: A의 모든 CharSetElement는 한 글자만으로 이루어져 있어야 한다.
  2. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 rer, A, invert, direction를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. Inputx.[[Input]]을 할당한다.
    4. ex.[[EndIndex]]를 할당한다.
    5. directionforward이면 fe + 1을 할당한다.
    6. 그 외의 경우 fe - 1을 할당한다.
    7. InputLengthInput의 요소 개수를 할당한다.
    8. f < 0 또는 f > InputLength이면 failure를 반환한다.
    9. indexmin(e, f)를 할당한다.
    10. chInput[index] 문자를 할당한다.
    11. ccCanonicalize(rer, ch)를 할당한다.
    12. A에 한 글자만 가진 CharSetElement a가 존재하며, Canonicalize(rer, a) == cc이면 foundtrue로, 아니면 false로 한다.
    13. invertfalse이고 foundfalse이면 failure를 반환한다.
    14. inverttrue이고 foundtrue이면 failure를 반환한다.
    15. capx.[[Captures]]를 할당한다.
    16. yMatchState { [[Input]]: Input, [[EndIndex]]: f, [[Captures]]: cap }를 할당한다.
    17. c(y)를 반환한다.

22.2.2.7.2 BackreferenceMatcher ( rer, ns, direction )

BackreferenceMatcher 추상 연산은 rer(RegExp 레코드), ns(양의 List 타입의 정수), direction(forward 또는 backward)를 인수로 받고 Matcher를 반환한다. 호출 시 다음 단계를 수행한다:

  1. 다음과 같이 호출될 때 아래 단계를 수행하는 (x, c) 파라미터를 가지며 rer, ns, direction를 캡처하는 새로운 Matcher를 반환한다:
    1. Assert: xMatchState이다.
    2. Assert: cMatcherContinuation이다.
    3. Inputx.[[Input]]을 할당한다.
    4. capx.[[Captures]]를 할당한다.
    5. rundefined를 할당한다.
    6. ns의 각 정수 n에 대해 반복하여
      1. cap[n]이 undefined가 아니면,
        1. Assert: rundefined이어야 한다.
        2. rcap[n]을 할당한다.
    7. rundefined이면 c(x)를 반환한다.
    8. ex.[[EndIndex]]를 할당한다.
    9. rsr.[[StartIndex]]를 할당한다.
    10. rer.[[EndIndex]]를 할당한다.
    11. lenre - rs를 할당한다.
    12. directionforward이면 fe + len을 할당한다.
    13. 그 외의 경우 fe - len을 할당한다.
    14. InputLengthInput의 요소 개수를 할당한다.
    15. f < 0 또는 f > InputLength이면 failure를 반환한다.
    16. gmin(e, f)를 할당한다.
    17. 0(포함)부터 len(미포함)까지 interval에서 각 정수 i에 대해, Canonicalize(rer, Input[rs + i])와 Canonicalize(rer, Input[g + i])가 다르면 failure를 반환한다.
    18. yMatchState { [[Input]]: Input, [[EndIndex]]: f, [[Captures]]: cap }를 할당한다.
    19. c(y)를 반환한다.

22.2.2.7.3 Canonicalize ( rer, ch )

Canonicalize 추상 연산은 rer(RegExp 레코드)와 ch(문자)를 인수로 받아 문자를 반환한다. 호출 시 다음 단계를 수행한다:

  1. HasEitherUnicodeFlag(rer) 이 true이고 rer.[[IgnoreCase]]true이면,
    1. Unicode Character Database의 CaseFolding.txt 파일이 ch에 대해 simple 또는 common case folding 매핑을 제공하면, 그 매핑을 적용한 결과를 반환한다.
    2. ch를 반환한다.
  2. rer.[[IgnoreCase]]false이면 ch를 반환한다.
  3. Assert: ch는 UTF-16 코드 유닛이어야 한다.
  4. cpch의 숫자값을 가진 코드 포인트를 할당한다.
  5. u에 Unicode Default Case Conversion 알고리즘에 따라 toUppercase(« cp »)를 할당한다.
  6. uStrCodePointsToString(u)를 할당한다.
  7. uStr의 길이가 1이 아니면 ch를 반환한다.
  8. cuuStr의 단일 코드 유닛을 할당한다.
  9. ch의 숫자값이 128 이상이고 cu의 숫자값이 128 미만이면 ch를 반환한다.
  10. cu를 반환한다.
참고

HasEitherUnicodeFlag(rer) 가 true인 대소문자 구분 없는 매치에서는, 모든 문자가 비교 직전에 Unicode 표준이 제공하는 simple 매핑으로 암묵적으로 케이스 폴딩된다. simple 매핑은 항상 단일 코드 포인트로 매핑하므로, 예를 들어 ß(U+00DF)는 ss 또는 SS로 매핑되지 않는다. 그러나 Basic Latin 블록 밖의 코드 포인트를 그 안으로 매핑할 수 있다—예를 들어 ſ(U+017F)는 s(U+0073)로, (U+212A)는 k(U+006B)로 케이스 폴딩된다. 이런 코드 포인트를 포함한 문자열은 /[a-z]/ui 같은 정규표현식으로 매치된다.

HasEitherUnicodeFlag(rer) 가 false인 대소문자 구분 없는 매치에서는, 매핑이 toCasefold가 아니라 Unicode Default Case Conversion 알고리즘의 toUppercase 기반이라서 미묘한 차이가 있다. 예를 들어 (U+2126 OHM SIGN)은 toUppercase에선 자기 자신이지만 toCasefold에선 ω(U+03C9 GREEK SMALL LETTER OMEGA)와 Ω(U+03A9 GREEK CAPITAL LETTER OMEGA)와 함께 매핑되므로, "\u2126"/[ω]/ui/[\u03A9]/ui로는 매치되지만 /[ω]/i/[\u03A9]/i로는 매치되지 않는다. 또한 Basic Latin 블록 밖의 코드 포인트는 그 안으로 매핑되지 않으므로, "\u017F ſ""\u212A K" 같은 문자열은 /[a-z]/i로 매치되지 않는다.

22.2.2.7.4 UpdateModifiers ( rer, add, remove )

UpdateModifiers 추상 연산은 rer(RegExp 레코드), add(문자열), remove(문자열)를 인수로 받아 RegExp 레코드를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: addremove는 공통되는 요소가 없어야 한다.
  2. ignoreCaserer.[[IgnoreCase]]를 할당한다.
  3. multilinerer.[[Multiline]]를 할당한다.
  4. dotAllrer.[[DotAll]]를 할당한다.
  5. unicoderer.[[Unicode]]를 할당한다.
  6. unicodeSetsrer.[[UnicodeSets]]를 할당한다.
  7. capturingGroupsCountrer.[[CapturingGroupsCount]]를 할당한다.
  8. remove"i"가 포함되어 있으면 ignoreCasefalse로 설정한다.
  9. 그 외 add"i"가 포함되어 있으면 ignoreCasetrue로 설정한다.
  10. remove"m"가 포함되어 있으면 multilinefalse로 설정한다.
  11. 그 외 add"m"가 포함되어 있으면 multilinetrue로 설정한다.
  12. remove"s"가 포함되어 있으면 dotAllfalse로 설정한다.
  13. 그 외 add"s"가 포함되어 있으면 dotAlltrue로 설정한다.
  14. RegExp 레코드 { [[IgnoreCase]]: ignoreCase, [[Multiline]]: multiline, [[DotAll]]: dotAll, [[Unicode]]: unicode, [[UnicodeSets]]: unicodeSets, [[CapturingGroupsCount]]: capturingGroupsCount }를 반환한다.

22.2.2.8 실행 시 의미론: CompileCharacterClass

구문 지향 연산 CompileCharacterClass는 rer(RegExp 레코드)를 인수로 받고 Record 타입의 [[CharSet]](CharSet), [[Invert]](Boolean) 필드를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:

CharacterClass :: [ ClassContents ]
  1. ACompileToCharSetClassContentsrer를 인수로 호출한 결과를 할당한다.
  2. Record { [[CharSet]]: A, [[Invert]]: false }를 반환한다.
CharacterClass :: [^ ClassContents ]
  1. ACompileToCharSetClassContentsrer를 인수로 호출한 결과를 할당한다.
  2. rer.[[UnicodeSets]]true이면,
    1. Record { [[CharSet]]: CharacterComplement(rer, A), [[Invert]]: false }를 반환한다.
  3. Record { [[CharSet]]: A, [[Invert]]: true }를 반환한다.

22.2.2.9 실행 시 의미론: CompileToCharSet

구문 지향 연산 CompileToCharSet은 rer(RegExp 레코드)를 인수로 받고 CharSet를 반환한다.

참고 1

이 섹션은 B.1.2.8에서 수정된다.

다음 생성식에 대해 개별적으로 정의된다:

ClassContents :: [empty]
  1. CharSet을 반환한다.
NonemptyClassRanges :: ClassAtom NonemptyClassRangesNoDash
  1. ACompileToCharSetClassAtomrer를 인수로 호출한 결과를 할당한다.
  2. BCompileToCharSetNonemptyClassRangesNoDashrer를 인수로 호출한 결과를 할당한다.
  3. ABCharSet 합집합을 반환한다.
NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  1. A에 첫 번째 CompileToCharSetClassAtomrer를 인수로 호출한 결과를 할당한다.
  2. B에 두 번째 CompileToCharSetClassAtomrer를 인수로 호출한 결과를 할당한다.
  3. CCompileToCharSetClassContentsrer를 인수로 호출한 결과를 할당한다.
  4. DCharacterRange(A, B)의 결과를 할당한다.
  5. DC의 합집합을 반환한다.
NonemptyClassRangesNoDash :: ClassAtomNoDash NonemptyClassRangesNoDash
  1. ACompileToCharSetClassAtomNoDashrer를 인수로 호출한 결과를 할당한다.
  2. BCompileToCharSetNonemptyClassRangesNoDashrer를 인수로 호출한 결과를 할당한다.
  3. ABCharSet 합집합을 반환한다.
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents
  1. ACompileToCharSetClassAtomNoDashrer를 인수로 호출한 결과를 할당한다.
  2. BCompileToCharSetClassAtomrer를 인수로 호출한 결과를 할당한다.
  3. CCompileToCharSetClassContentsrer를 인수로 호출한 결과를 할당한다.
  4. DCharacterRange(A, B)의 결과를 할당한다.
  5. DC의 합집합을 반환한다.
참고 2

ClassContents는 한 개의 ClassAtom 또는 대시로 구분된 두 개의 ClassAtom의 범위로 확장될 수 있다. 후자의 경우 ClassContents는 첫 번째 ClassAtom와 두 번째 ClassAtom 사이의 모든 문자를(양끝 포함) 포함한다. 만약 ClassAtom 중 하나가 한 글자가 아니거나(예: \w) 첫 번째 ClassAtom의 문자값이 두 번째 ClassAtom의 문자값보다 크면 오류가 발생한다.

참고 3

패턴이 대소문자를 무시하더라도, 범위의 양 끝의 대소문자는 범위에 포함될 문자를 결정하는 데 중요하다. 예를 들어, /[E-F]/iE, F, e, f만 매치하고, /[E-f]/i는 유니코드 Basic Latin 블록의 모든 대문자·소문자와 [, \, ], ^, _, ` 기호까지 모두 매치한다.

참고 4

- 문자는 리터럴로 처리되거나 범위를 나타낼 수 있다. ClassContents의 첫 글자 또는 마지막 글자, 범위 명세의 시작 또는 끝, 또는 범위 명세 직후에 오면 리터럴로 처리된다.

ClassAtom :: -
  1. 문자 - U+002D(HYPHEN-MINUS)만을 포함하는 CharSet을 반환한다.
ClassAtomNoDash :: SourceCharacter but not one of \ or ] or -
  1. CharSetSourceCharacter가 매치한 문자를 포함하여 반환한다.
ClassEscape :: b - CharacterEscape
  1. cv에 이 CharacterValue of ClassEscape의 값을 할당한다.
  2. c에 문자값이 cv인 문자를 할당한다.
  3. c만을 포함하는 CharSet을 반환한다.
참고 5

ClassAtom에서는 정규표현식의 나머지 부분에서 허용되는 모든 이스케이프 시퀀스를 사용할 수 있지만 \b, \B, 역참조는 제외한다. CharacterClass 내부에서 \b는 백스페이스 문자이고 \B 및 역참조는 오류를 발생시킨다. ClassAtom 안에서 역참조를 사용하면 오류가 발생한다.

CharacterClassEscape :: d
  1. 다음 10개 문자 0, 1, 2, 3, 4, 5, 6, 7, 8, 9를 포함하는 CharSet을 반환한다.
CharacterClassEscape :: D
  1. S에 아래 CharSet을 할당한다: CharacterClassEscape :: d .
  2. CharacterComplement(rer, S)를 반환한다.
CharacterClassEscape :: s
  1. CharSetWhiteSpace 또는 LineTerminator 생성식의 오른쪽에 해당하는 모든 코드 포인트 문자를 포함하여 반환한다.
CharacterClassEscape :: S
  1. S에 아래 CharSet을 할당한다: CharacterClassEscape :: s .
  2. CharacterComplement(rer, S)를 반환한다.
CharacterClassEscape :: w
  1. MaybeSimpleCaseFolding(rer, WordCharacters(rer))를 반환한다.
CharacterClassEscape :: W
  1. S에 아래 CharSet을 할당한다: CharacterClassEscape :: w .
  2. CharacterComplement(rer, S)를 반환한다.
CharacterClassEscape :: p{ UnicodePropertyValueExpression }
  1. CompileToCharSetUnicodePropertyValueExpressionrer를 인수로 호출한 결과를 반환한다.
CharacterClassEscape :: P{ UnicodePropertyValueExpression }
  1. SCompileToCharSetUnicodePropertyValueExpressionrer를 인수로 호출한 결과를 할당한다.
  2. Assert: S는 단일 코드 포인트만을 포함해야 한다.
  3. CharacterComplement(rer, S)를 반환한다.
UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue
  1. pssource text matched by UnicodePropertyName를 할당한다.
  2. pUnicodeMatchProperty(rer, ps)를 할당한다.
  3. Assert: p는 Unicode property name 또는 Table 69의 “Property name and aliases” 컬럼에 있는 property alias이어야 한다.
  4. vssource text matched by UnicodePropertyValue를 할당한다.
  5. vUnicodeMatchPropertyValue(p, vs)를 할당한다.
  6. Ap 속성 값이 v인 모든 유니코드 코드 포인트를 포함하는 CharSet를 할당한다.
  7. MaybeSimpleCaseFolding(rer, A)를 반환한다.
UnicodePropertyValueExpression :: LoneUnicodePropertyNameOrValue
  1. ssource text matched by LoneUnicodePropertyNameOrValue를 할당한다.
  2. UnicodeMatchPropertyValue(General_Category, s)가 PropertyValueAliases.txt에 있는 General_Category(gc) 속성의 유니코드 property value 또는 property value alias이면,
    1. 속성이 “General_Category”이고 값이 s인 모든 유니코드 코드 포인트를 포함하는 CharSet를 반환한다.
  3. pUnicodeMatchProperty(rer, s)를 할당한다.
  4. Assert: pTable 70의 “Property name and aliases” 컬럼에 있는 바이너리 유니코드 속성 또는 바이너리 속성 alias이거나, Table 71의 “Property name” 컬럼에 있는 문자열 바이너리 유니코드 속성이어야 한다.
  5. A에 속성 p 값이 “True”인 CharSetElement를 모두 포함하는 CharSet를 할당한다.
  6. MaybeSimpleCaseFolding(rer, A)를 반환한다.
ClassUnion :: ClassSetRange ClassUnionopt
  1. ACompileToCharSetClassSetRangerer를 인수로 호출한 결과를 할당한다.
  2. ClassUnion가 존재하면,
    1. BCompileToCharSetClassUnionrer를 인수로 호출한 결과를 할당한다.
    2. ABCharSet 합집합을 반환한다.
  3. A를 반환한다.
ClassUnion :: ClassSetOperand ClassUnionopt
  1. ACompileToCharSetClassSetOperandrer를 인수로 호출한 결과를 할당한다.
  2. ClassUnion가 존재하면,
    1. BCompileToCharSetClassUnionrer를 인수로 호출한 결과를 할당한다.
    2. ABCharSet 합집합을 반환한다.
  3. A를 반환한다.
ClassIntersection :: ClassSetOperand && ClassSetOperand
  1. A에 첫 번째 CompileToCharSetClassSetOperandrer를 인수로 호출한 결과를 할당한다.
  2. B에 두 번째 CompileToCharSetClassSetOperandrer를 인수로 호출한 결과를 할당한다.
  3. ABCharSet 교집합을 반환한다.
ClassIntersection :: ClassIntersection && ClassSetOperand
  1. ACompileToCharSetClassIntersectionrer를 인수로 호출한 결과를 할당한다.
  2. BCompileToCharSetClassSetOperandrer를 인수로 호출한 결과를 할당한다.
  3. ABCharSet 교집합을 반환한다.
ClassSubtraction :: ClassSetOperand -- ClassSetOperand
  1. A에 첫 번째 CompileToCharSetClassSetOperandrer를 인수로 호출한 결과를 할당한다.
  2. B에 두 번째 CompileToCharSetClassSetOperandrer를 인수로 호출한 결과를 할당한다.
  3. A에서 B에도 포함되지 않는 CharSetElement만 포함하는 CharSet을 반환한다.
ClassSubtraction :: ClassSubtraction -- ClassSetOperand
  1. ACompileToCharSetClassSubtractionrer를 인수로 호출한 결과를 할당한다.
  2. BCompileToCharSetClassSetOperandrer를 인수로 호출한 결과를 할당한다.
  3. A에서 B에도 포함되지 않는 CharSetElement만 포함하는 CharSet을 반환한다.
ClassSetRange :: ClassSetCharacter - ClassSetCharacter
  1. A에 첫 번째 CompileToCharSetClassSetCharacterrer를 인수로 호출한 결과를 할당한다.
  2. B에 두 번째 CompileToCharSetClassSetCharacterrer를 인수로 호출한 결과를 할당한다.
  3. MaybeSimpleCaseFolding(rer, CharacterRange(A, B))를 반환한다.
참고 6

결과는 종종 두 개 이상의 범위로 구성된다. UnicodeSets가 true이고 IgnoreCase가 true인 경우, MaybeSimpleCaseFolding(rer, [Ā-č])는 해당 범위의 홀수 코드 포인트만 포함하게 된다.

ClassSetOperand :: ClassSetCharacter
  1. ACompileToCharSetClassSetCharacterrer를 인수로 호출한 결과를 할당한다.
  2. MaybeSimpleCaseFolding(rer, A)를 반환한다.
ClassSetOperand :: ClassStringDisjunction
  1. ACompileToCharSetClassStringDisjunctionrer를 인수로 호출한 결과를 할당한다.
  2. MaybeSimpleCaseFolding(rer, A)를 반환한다.
ClassSetOperand :: NestedClass
  1. CompileToCharSetNestedClassrer를 인수로 호출한 결과를 반환한다.
NestedClass :: [ ClassContents ]
  1. CompileToCharSetClassContentsrer를 인수로 호출한 결과를 반환한다.
NestedClass :: [^ ClassContents ]
  1. ACompileToCharSetClassContentsrer를 인수로 호출한 결과를 할당한다.
  2. CharacterComplement(rer, A)를 반환한다.
NestedClass :: \ CharacterClassEscape
  1. CompileToCharSetCharacterClassEscaperer를 인수로 호출한 결과를 반환한다.
ClassStringDisjunction :: \q{ ClassStringDisjunctionContents }
  1. CompileToCharSetClassStringDisjunctionContentsrer를 인수로 호출한 결과를 반환한다.
ClassStringDisjunctionContents :: ClassString
  1. sCompileClassSetStringClassStringrer를 인수로 호출한 결과를 할당한다.
  2. 문자열 s 하나만 포함하는 CharSet을 반환한다.
ClassStringDisjunctionContents :: ClassString | ClassStringDisjunctionContents
  1. sCompileClassSetStringClassStringrer를 인수로 호출한 결과를 할당한다.
  2. A에 문자열 s 하나만 포함하는 CharSet를 할당한다.
  3. BCompileToCharSetClassStringDisjunctionContentsrer를 인수로 호출한 결과를 할당한다.
  4. ABCharSet 합집합을 반환한다.
ClassSetCharacter :: SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape \ ClassSetReservedPunctuator
  1. cv에 이 CharacterValue of ClassSetCharacter의 값을 할당한다.
  2. c에 문자값이 cv인 문자를 할당한다.
  3. c만을 포함하는 CharSet을 반환한다.
ClassSetCharacter :: \b
  1. U+0008(BACKSPACE) 문자 하나만 포함하는 CharSet을 반환한다.

22.2.2.9.1 CharacterRange ( A, B )

CharacterRange 추상 연산은 A(CharSet), B(CharSet)를 인수로 받고 CharSet를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: AB는 각각 정확히 하나의 문자를 포함해야 한다.
  2. aCharSet A의 단일 문자를 할당한다.
  3. bCharSet B의 단일 문자를 할당한다.
  4. i에 문자 a의 문자값을 할당한다.
  5. j에 문자 b의 문자값을 할당한다.
  6. Assert: ij임을 확인한다.
  7. i부터 j까지 포함 구간에 속하는 모든 문자값의 문자를 포함하는 CharSet을 반환한다.

22.2.2.9.2 HasEitherUnicodeFlag ( rer )

HasEitherUnicodeFlag 추상 연산은 rer(RegExp 레코드)를 인수로 받아 Boolean을 반환한다. 호출 시 다음 단계를 수행한다:

  1. rer.[[Unicode]]true이거나 rer.[[UnicodeSets]]true이면,
    1. true를 반환한다.
  2. false를 반환한다.

22.2.2.9.3 WordCharacters ( rer )

WordCharacters 추상 연산은 rer(RegExp 레코드)를 인수로 받고 CharSet를 반환한다. \b, \B, \w, \W에 대해 "단어 문자"로 간주되는 문자를 포함하는 CharSet을 반환한다. 호출 시 다음 단계를 수행한다:

  1. basicWordCharsCharSet을 할당한다. ASCII 단어 문자의 모든 문자를 포함한다.
  2. extraWordCharsCharSet을 할당한다. cbasicWordChars에는 없지만 Canonicalize(rer, c)가 basicWordChars에 포함되는 모든 문자 c를 포함한다.
  3. Assert: extraWordCharsHasEitherUnicodeFlag(rer) 가 true이고 rer.[[IgnoreCase]]true일 때가 아니면 비어 있어야 한다.
  4. basicWordCharsextraWordChars의 합집합을 반환한다.

22.2.2.9.4 AllCharacters ( rer )

AllCharacters 추상 연산은 rer(RegExp 레코드)를 인수로 받고 CharSet를 반환한다. 정규표현식 플래그에 따라 “모든 문자” 집합을 반환한다. 호출 시 다음 단계를 수행한다:

  1. rer.[[UnicodeSets]]true이고 rer.[[IgnoreCase]]true이면,
    1. Simple Case Folding 매핑이 없는(scf(c)=c) 모든 유니코드 코드 포인트 c를 포함하는 CharSet을 반환한다.
  2. 그 외 HasEitherUnicodeFlag(rer) 가 true이면,
    1. 모든 코드 포인트 값을 포함하는 CharSet을 반환한다.
  3. 그 외,
    1. 모든 코드 유닛 값을 포함하는 CharSet을 반환한다.

22.2.2.9.5 MaybeSimpleCaseFolding ( rer, A )

MaybeSimpleCaseFolding 추상 연산은 rer(RegExp 레코드)와 A(CharSet)를 인수로 받아 CharSet를 반환한다. rer.[[UnicodeSets]]false이거나 rer.[[IgnoreCase]]false이면 A를 반환한다. 그렇지 않으면 Simple Case Folding (scf(cp)) 정의를 CaseFolding.txt 파일에서 가져와서(각각 단일 코드 포인트를 다른 단일 코드 포인트로 매핑) A의 각 CharSetElement를 문자 단위로 정규화 형태로 변환하여, 그 결과 CharSet를 반환한다. 호출 시 다음 단계를 수행한다:

  1. rer.[[UnicodeSets]]false이거나 rer.[[IgnoreCase]]false이면 A를 반환한다.
  2. B에 새 빈 CharSet을 할당한다.
  3. A의 각 CharSetElement s에 대해 반복하여
    1. t에 빈 문자 시퀀스를 할당한다.
    2. s의 각 단일 코드 포인트 cp에 대해 반복하여
      1. scf(cp)를 t에 추가한다.
    3. tB에 추가한다.
  4. B를 반환한다.

22.2.2.9.6 CharacterComplement ( rer, S )

CharacterComplement 추상 연산은 rer(RegExp 레코드)와 S(CharSet)를 인수로 받아 CharSet를 반환한다. 호출 시 다음 단계를 수행한다:

  1. AAllCharacters(rer)를 할당한다.
  2. A에 포함되지만 S에는 포함되지 않는 CharSetElement만 포함하는 CharSet을 반환한다.

22.2.2.9.7 UnicodeMatchProperty ( rer, p )

UnicodeMatchProperty 추상 연산은 rer(RegExp 레코드)와 p(ECMAScript 소스 텍스트) 를 인수로 받아 유니코드 속성 이름을 반환한다. 호출 시 다음 단계를 수행한다:

  1. rer.[[UnicodeSets]]true이고 p표 71의 “속성 이름” 열에 있는 유니코드 속성 이름이면,
    1. 유니코드 코드 포인트 pList를 반환한다.
  2. Assert: p표 69 또는 표 70의 “속성 이름 및 별칭” 열에 있는 유니코드 속성 이름 또는 속성 별칭이어야 한다.
  3. c에 해당 행의 “표준 속성 이름” 열에 있는 p의 표준 속성 이름을 할당한다.
  4. 유니코드 코드 포인트 cList를 반환한다.

구현체는 표 69, 표 70, 표 71에 나열된 유니코드 속성 이름과 별칭을 반드시 지원해야 한다. 상호운용성을 보장하기 위해, 구현체는 그 밖의 속성 이름이나 별칭을 지원해서는 안 된다.

참고 1

예를 들어, Script_Extensions(속성 이름) 및 scx(속성 별칭)는 유효하지만, script_extensionsScx는 유효하지 않다.

참고 2

나열된 속성은 UTS18 RL1.2가 요구하는 것보다 더 넓은 집합을 이룬다.

참고 3

이 표의 항목(대소문자 포함) 철자는 유니코드 문자 데이터베이스의 PropertyAliases.txt 파일에서 사용되는 철자와 일치한다. 해당 파일의 정확한 철자는 변경되지 않을 것이 보장된다.

표 69: 비이진 유니코드 속성 별칭과 표준 속성 이름
속성 이름 및 별칭 표준 속성 이름
General_Category General_Category
gc
Script Script
sc
Script_Extensions Script_Extensions
scx
표 70: 이진 유니코드 속성 별칭과 표준 속성 이름
속성 이름 및 별칭 표준 속성 이름
ASCII ASCII
ASCII_Hex_Digit ASCII_Hex_Digit
AHex
Alphabetic Alphabetic
Alpha
Any Any
Assigned Assigned
Bidi_Control Bidi_Control
Bidi_C
Bidi_Mirrored Bidi_Mirrored
Bidi_M
Case_Ignorable Case_Ignorable
CI
Cased Cased
Changes_When_Casefolded Changes_When_Casefolded
CWCF
Changes_When_Casemapped Changes_When_Casemapped
CWCM
Changes_When_Lowercased Changes_When_Lowercased
CWL
Changes_When_NFKC_Casefolded Changes_When_NFKC_Casefolded
CWKCF
Changes_When_Titlecased Changes_When_Titlecased
CWT
Changes_When_Uppercased Changes_When_Uppercased
CWU
Dash Dash
Default_Ignorable_Code_Point Default_Ignorable_Code_Point
DI
Deprecated Deprecated
Dep
Diacritic Diacritic
Dia
Emoji Emoji
Emoji_Component Emoji_Component
EComp
Emoji_Modifier Emoji_Modifier
EMod
Emoji_Modifier_Base Emoji_Modifier_Base
EBase
Emoji_Presentation Emoji_Presentation
EPres
Extended_Pictographic Extended_Pictographic
ExtPict
Extender Extender
Ext
Grapheme_Base Grapheme_Base
Gr_Base
Grapheme_Extend Grapheme_Extend
Gr_Ext
Hex_Digit Hex_Digit
Hex
IDS_Binary_Operator IDS_Binary_Operator
IDSB
IDS_Trinary_Operator IDS_Trinary_Operator
IDST
ID_Continue ID_Continue
IDC
ID_Start ID_Start
IDS
Ideographic Ideographic
Ideo
Join_Control Join_Control
Join_C
Logical_Order_Exception Logical_Order_Exception
LOE
Lowercase Lowercase
Lower
Math Math
Noncharacter_Code_Point Noncharacter_Code_Point
NChar
Pattern_Syntax Pattern_Syntax
Pat_Syn
Pattern_White_Space Pattern_White_Space
Pat_WS
Quotation_Mark Quotation_Mark
QMark
Radical Radical
Regional_Indicator Regional_Indicator
RI
Sentence_Terminal Sentence_Terminal
STerm
Soft_Dotted Soft_Dotted
SD
Terminal_Punctuation Terminal_Punctuation
Term
Unified_Ideograph Unified_Ideograph
UIdeo
Uppercase Uppercase
Upper
Variation_Selector Variation_Selector
VS
White_Space White_Space
space
XID_Continue XID_Continue
XIDC
XID_Start XID_Start
XIDS
표 71: 문자열의 이진 유니코드 속성
속성 이름
Basic_Emoji
Emoji_Keycap_Sequence
RGI_Emoji_Modifier_Sequence
RGI_Emoji_Flag_Sequence
RGI_Emoji_Tag_Sequence
RGI_Emoji_ZWJ_Sequence
RGI_Emoji

22.2.2.9.8 UnicodeMatchPropertyValue ( p, v )

UnicodeMatchPropertyValue 추상 연산은 p(ECMAScript 소스 텍스트)와 v(ECMAScript 소스 텍스트) 를 인수로 받아 유니코드 속성 값을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: p표 69의 “표준 속성 이름” 열에 나열된 표준, 별칭 없는 유니코드 속성 이름이어야 한다.
  2. Assert: vPropertyValueAliases.txtp 유니코드 속성에 대해 나열된 속성 값 또는 속성 값 별칭이어야 한다.
  3. value에 해당 행의 “표준 속성 값” 열에 있는 v의 표준 속성 값을 할당한다.
  4. 유니코드 코드 포인트 valueList를 반환한다.

구현체는 표 69에 나열된 속성에 대해 PropertyValueAliases.txt에 나열된 유니코드 속성 값과 속성 값 별칭을 반드시 지원해야 한다. 상호운용성을 보장하기 위해, 그 밖의 속성 값이나 속성 값 별칭을 지원해서는 안 된다.

참고 1

예를 들어, XpeoOld_PersianScript_Extensions의 유효한 값이지만 xpeoOld Persian는 유효하지 않다.

참고 2

이 알고리즘은 UAX44의 상징값 매칭 규칙과 다르다: 대소문자, 공백, U+002D(HYPHEN-MINUS), U+005F(LOW LINE)은 무시되지 않으며, Is 접두사도 지원하지 않는다.

22.2.2.10 실행 시 의미론: CompileClassSetString

구문 지향 연산 CompileClassSetString은 rer(RegExp 레코드)를 인수로 받아 문자 시퀀스를 반환한다. 다음 생성식에 대해 개별적으로 정의된다:

ClassString :: [empty]
  1. 빈 문자 시퀀스를 반환한다.
ClassString :: NonEmptyClassString
  1. CompileClassSetStringNonEmptyClassStringrer를 인수로 호출한 결과를 반환한다.
NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt
  1. csCompileToCharSetClassSetCharacterrer를 인수로 호출한 결과를 할당한다.
  2. s1cs의 단일 CharSetElement로 이루어진 문자 시퀀스를 할당한다.
  3. NonEmptyClassString가 존재하면,
    1. s2CompileClassSetStringNonEmptyClassStringrer를 인수로 호출한 결과를 할당한다.
    2. s1s2를 연결한 값을 반환한다.
  4. s1를 반환한다.

22.2.3 RegExp 생성에 대한 추상 연산

22.2.3.1 RegExpCreate ( P, F )

추상 연산 RegExpCreate는 P(ECMAScript 언어 값)와 F(문자열 또는 undefined)를 인수로 받고, 값 완료(normal completion) 객체 또는 throw 완료(throw completion)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. obj에 ! RegExpAlloc(%RegExp%)를 할당한다.
  2. RegExpInitialize(obj, P, F)를 반환한다.

22.2.3.2 RegExpAlloc ( newTarget )

추상 연산 RegExpAlloc은 newTarget(생성자)를 인수로 받고, 값 완료(normal completion) 객체 또는 throw 완료(throw completion)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. obj에 ? OrdinaryCreateFromConstructor(newTarget, "%RegExp.prototype%", « [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], [[RegExpMatcher]] »)를 할당한다.
  2. DefinePropertyOrThrow(obj, "lastIndex", PropertyDescriptor { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })를 수행한다.
  3. obj를 반환한다.

22.2.3.3 RegExpInitialize ( obj, pattern, flags )

추상 연산 RegExpInitialize는 obj(객체), pattern(ECMAScript 언어 값), flags(ECMAScript 언어 값)를 인수로 받고, 값 완료(normal completion) 객체 또는 throw 완료(throw completion)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. patternundefined이면, P에 빈 문자열을 할당한다.
  2. 그 외, P에 ? ToString(pattern)을 할당한다.
  3. flagsundefined이면, F에 빈 문자열을 할당한다.
  4. 그 외, F에 ? ToString(flags)을 할당한다.
  5. F"d", "g", "i", "m", "s", "u", "v", "y" 외의 코드 유닛을 포함하거나, F에 코드 유닛이 중복되어 있으면 SyntaxError 예외를 throw한다.
  6. F"i"가 있으면, itrue를, 아니면 false를 할당한다.
  7. F"m"가 있으면, mtrue를, 아니면 false를 할당한다.
  8. F"s"가 있으면, strue를, 아니면 false를 할당한다.
  9. F"u"가 있으면, utrue를, 아니면 false를 할당한다.
  10. F"v"가 있으면, vtrue를, 아니면 false를 할당한다.
  11. utrue이거나 vtrue이면,
    1. patternTextStringToCodePoints(P)를 할당한다.
  12. 그 외,
    1. patternTextP의 각 16비트 요소를 유니코드 BMP 코드 포인트로 해석한 결과를 할당한다. 요소에는 UTF-16 디코딩을 적용하지 않는다.
  13. parseResultParsePattern(patternText, u, v)를 할당한다.
  14. parseResultListSyntaxError 객체들을 포함하는 비어있지 않은 리스트이면, SyntaxError 예외를 throw한다.
  15. Assert: parseResultPattern Parse Node이어야 한다.
  16. obj.[[OriginalSource]]P를 할당한다.
  17. obj.[[OriginalFlags]]F를 할당한다.
  18. capturingGroupsCountCountLeftCapturingParensWithin(parseResult)를 할당한다.
  19. rerRegExp 레코드 { [[IgnoreCase]]: i, [[Multiline]]: m, [[DotAll]]: s, [[Unicode]]: u, [[UnicodeSets]]: v, [[CapturingGroupsCount]]: capturingGroupsCount }를 할당한다.
  20. obj.[[RegExpRecord]]rer를 할당한다.
  21. obj.[[RegExpMatcher]]CompilePatternparseResultrer를 인수로 호출한 결과를 할당한다.
  22. Set(obj, "lastIndex", +0𝔽, true)를 수행한다.
  23. obj를 반환한다.

22.2.3.4 정적 의미론: ParsePattern ( patternText, u, v )

추상 연산 ParsePattern은 patternText(유니코드 코드 포인트 시퀀스), u(Boolean), v(Boolean)을 인수로 받고, Parse Node 또는 비어있지 않은 ListSyntaxError 객체들을 반환한다.

참고

이 섹션은 B.1.2.9에서 보완된다.

호출 시 다음 단계를 수행한다:

  1. vtrue이고 utrue이면,
    1. parseResult에 하나 이상의 SyntaxError 객체를 포함하는 List를 할당한다.
  2. 그 외 vtrue이면,
    1. parseResultParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups])를 할당한다.
  3. 그 외 utrue이면,
    1. parseResultParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups])를 할당한다.
  4. 그 외,
    1. parseResultParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups])를 할당한다.
  5. parseResult를 반환한다.

22.2.4 RegExp 생성자

RegExp 생성자:

  • %RegExp%이다.
  • 전역 객체"RegExp" 프로퍼티의 초기값이다.
  • 생성자로 호출될 때 새로운 RegExp 객체를 생성하고 초기화한다.
  • 함수로 호출될 때에는 새로운 RegExp 객체를 반환하거나, 인자가 RegExp 객체 하나뿐이라면 그 객체 자신을 반환한다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 RegExp 동작을 상속하려는 서브클래스 생성자는 필요한 내부 슬롯으로 서브클래스 인스턴스를 생성·초기화하기 위해 RegExp 생성자에 대한 super 호출을 반드시 포함해야 한다.

22.2.4.1 RegExp ( pattern, flags )

이 함수는 호출 시 다음 단계를 수행한다:

  1. patternIsRegExp에 ? IsRegExp(pattern)을 할당한다.
  2. NewTarget이 undefined이면,
    1. newTarget활성 함수 객체를 할당한다.
    2. patternIsRegExptrue이고 flagsundefined이면,
      1. patternConstructor에 ? Get(pattern, "constructor")를 할당한다.
      2. SameValue(newTarget, patternConstructor)가 true이면 pattern을 반환한다.
  3. 그 외,
    1. newTarget에 NewTarget을 할당한다.
  4. pattern객체이고 pattern[[RegExpMatcher]] 내부 슬롯이 있으면,
    1. Ppattern.[[OriginalSource]]를 할당한다.
    2. flagsundefined이면 Fpattern.[[OriginalFlags]]를 할당한다.
    3. 그 외 Fflags를 할당한다.
  5. 그 외 patternIsRegExptrue이면,
    1. P에 ? Get(pattern, "source")를 할당한다.
    2. flagsundefined이면,
      1. F에 ? Get(pattern, "flags")를 할당한다.
    3. 그 외,
      1. Fflags를 할당한다.
  6. 그 외,
    1. Ppattern을 할당한다.
    2. Fflags를 할당한다.
  7. O에 ? RegExpAlloc(newTarget)을 할당한다.
  8. RegExpInitialize(O, P, F)를 반환한다.
참고

pattern이 StringLiteral로 제공되는 경우, 본 함수에서 문자열을 처리하기 전에 일반적인 escape 시퀀스 치환이 수행된다. 패턴이 본 함수에서 escape 시퀀스를 포함해야만 인식되는 경우, StringLiteral 내부에서 U+005C(REVERSE SOLIDUS) 코드 포인트를 escape 처리해야 StringLiteral 내용이 생성될 때 제거되지 않는다.

22.2.5 RegExp 생성자의 속성들

RegExp 생성자:

  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function.prototype%이다.
  • 다음 속성들을 가진다:

22.2.5.1 RegExp.escape ( S )

이 함수는 S의 복사본을 반환하는데, 정규표현식 Pattern에서 잠재적으로 특별한 문자가 각각 등가의 escape 시퀀스로 대체되어 있다.

호출 시 다음 단계를 수행한다:

  1. S문자열이 아니면 TypeError 예외를 throw한다.
  2. escaped에 빈 문자열을 할당한다.
  3. cpListStringToCodePoints(S)를 할당한다.
  4. cpList의 각 코드포인트 cp에 대해, 다음을 수행한다:
    1. escaped가 빈 문자열이고 cpDecimalDigit 또는 AsciiLetter에 매치되면,
      1. 참고: 선행 숫자를 escape하는 것은 출력이 \0 문자 escape 또는 DecimalEscape(예: \1) 뒤에 사용될 때 S와 일치하도록 보장하고, 앞선 escape 시퀀스의 확장으로 해석되는 것을 방지한다. 선행 ASCII 문자를 escape하는 것도 \c 뒤의 상황에 대해 동일하다.
      2. numericValuecp의 숫자값을 할당한다.
      3. hexNumber::toString(𝔽(numericValue), 16)을 할당한다.
      4. Assert: hex의 길이는 2이다.
      5. escaped에 코드 유닛 0x005C(REVERSE SOLIDUS), "x", hex문자열 연결하여 할당한다.
    2. 그 외,
      1. escapedescapedEncodeForRegExpEscape(cp)를 문자열 연결하여 할당한다.
  5. escaped를 반환한다.
참고

이름이 비슷하지만 EscapeRegExpPatternRegExp.escape는 서로 다른 동작을 한다. 전자는 패턴을 문자열로 표현하기 위해 escape하고, 이 함수는 문자열을 패턴 내부에 표현하기 위해 escape한다.

22.2.5.1.1 EncodeForRegExpEscape ( cp )

추상 연산 EncodeForRegExpEscape는 cp(코드 포인트)를 인수로 받아 문자열을 반환한다. cp에 매치하는 Pattern을 나타내는 문자열을 반환한다. cp가 공백 또는 ASCII 구두점이면 반환값은 escape 시퀀스이다. 그렇지 않으면 반환값은 문자열 cp 자체이다. 호출 시 다음 단계를 수행한다:

  1. cpSyntaxCharacter에 매치되거나 cp가 U+002F(SOLIDUS)면,
    1. 코드 유닛 0x005C(REVERSE SOLIDUS)와 UTF16EncodeCodePoint(cp)를 문자열 연결하여 반환한다.
  2. 그 외 cp표 67의 "Code Point" 열에 나열된 코드 포인트면,
    1. 코드 유닛 0x005C(REVERSE SOLIDUS)와 해당 행의 "ControlEscape" 열의 문자열을 문자열 연결하여 반환한다.
  3. otherPunctuators문자열 연결하여 ",-=<>#&!%:;@~'`"와 코드 유닛 0x0022(QUOTATION MARK)를 할당한다.
  4. toEscapeStringToCodePoints(otherPunctuators)를 할당한다.
  5. toEscapecp가 포함되거나, cpWhiteSpace 또는 LineTerminator에 매치되거나, cp선행 서러게이트 또는 후행 서러게이트와 동일한 숫자값을 가지면,
    1. cpNumcp의 숫자값을 할당한다.
    2. cpNum ≤ 0xFF이면,
      1. hexNumber::toString(𝔽(cpNum), 16)을 할당한다.
      2. 코드 유닛 0x005C(REVERSE SOLIDUS), "x", StringPad(hex, 2, "0", start)를 문자열 연결하여 반환한다.
    3. escaped에 빈 문자열을 할당한다.
    4. codeUnitsUTF16EncodeCodePoint(cp)를 할당한다.
    5. codeUnits의 각 코드 유닛 cu에 대해,
      1. escapedescapedUnicodeEscape(cu)를 문자열 연결하여 할당한다.
    6. escaped를 반환한다.
  6. UTF16EncodeCodePoint(cp)를 반환한다.

22.2.5.2 RegExp.prototype

RegExp.prototype의 초기값은 RegExp 프로토타입 객체이다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }이다.

22.2.5.3 get RegExp [ %Symbol.species% ]

RegExp[%Symbol.species%]접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. this 값을 반환한다.

이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]"이다.

참고

RegExp 프로토타입 메서드는 일반적으로 자신의 this 값의 생성자를 사용하여 파생 객체를 생성한다. 하지만 서브클래스 생성자%Symbol.species% 프로퍼티를 재정의하여 기본 동작을 오버라이드할 수 있다.

22.2.6 RegExp 프로토타입 객체의 속성들

RegExp 프로토타입 객체:

  • %RegExp.prototype%이다.
  • 일반 객체이다.
  • RegExp 인스턴스가 아니며 [[RegExpMatcher]] 내부 슬롯이나 RegExp 인스턴스 객체의 기타 내부 슬롯을 갖지 않는다.
  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype%이다.
참고

RegExp 프로토타입 객체는 자체적으로 "valueOf" 프로퍼티를 가지지 않지만, Object 프로토타입 객체로부터 "valueOf" 프로퍼티를 상속받는다.

22.2.6.1 RegExp.prototype.constructor

RegExp.prototype.constructor의 초기값은 %RegExp%이다.

22.2.6.2 RegExp.prototype.exec ( string )

이 메서드는 string에서 정규표현식 패턴이 출현하는지 검색하고, 일치 결과를 담은 배열을 반환하거나 string이 일치하지 않으면 null을 반환한다.

호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. RequireInternalSlot(R, [[RegExpMatcher]])를 수행한다.
  3. S에 ? ToString(string)을 할당한다.
  4. RegExpBuiltinExec(R, S)를 반환한다.

22.2.6.3 get RegExp.prototype.dotAll

RegExp.prototype.dotAll접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. cu에 코드 유닛 0x0073(LATIN SMALL LETTER S)를 할당한다.
  3. RegExpHasFlag(R, cu)를 반환한다.

22.2.6.4 get RegExp.prototype.flags

RegExp.prototype.flags접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. R객체가 아니면 TypeError 예외를 throw한다.
  3. codeUnits에 새 빈 List를 할당한다.
  4. hasIndicesToBoolean(? Get(R, "hasIndices"))를 할당한다.
  5. hasIndicestrue이면, 코드 유닛 0x0064(LATIN SMALL LETTER D)를 codeUnits에 추가한다.
  6. globalToBoolean(? Get(R, "global"))를 할당한다.
  7. globaltrue이면, 코드 유닛 0x0067(LATIN SMALL LETTER G)를 codeUnits에 추가한다.
  8. ignoreCaseToBoolean(? Get(R, "ignoreCase"))를 할당한다.
  9. ignoreCasetrue이면, 코드 유닛 0x0069(LATIN SMALL LETTER I)를 codeUnits에 추가한다.
  10. multilineToBoolean(? Get(R, "multiline"))를 할당한다.
  11. multilinetrue이면, 코드 유닛 0x006D(LATIN SMALL LETTER M)를 codeUnits에 추가한다.
  12. dotAllToBoolean(? Get(R, "dotAll"))를 할당한다.
  13. dotAlltrue이면, 코드 유닛 0x0073(LATIN SMALL LETTER S)를 codeUnits에 추가한다.
  14. unicodeToBoolean(? Get(R, "unicode"))를 할당한다.
  15. unicodetrue이면, 코드 유닛 0x0075(LATIN SMALL LETTER U)를 codeUnits에 추가한다.
  16. unicodeSetsToBoolean(? Get(R, "unicodeSets"))를 할당한다.
  17. unicodeSetstrue이면, 코드 유닛 0x0076(LATIN SMALL LETTER V)를 codeUnits에 추가한다.
  18. stickyToBoolean(? Get(R, "sticky"))를 할당한다.
  19. stickytrue이면, 코드 유닛 0x0079(LATIN SMALL LETTER Y)를 codeUnits에 추가한다.
  20. codeUnits의 요소로 이루어진 문자열 값을 반환한다. codeUnits에 요소가 없으면 빈 문자열을 반환한다.

22.2.6.4.1 RegExpHasFlag ( R, codeUnit )

추상 연산 RegExpHasFlag는 R(ECMAScript 언어 값), codeUnit(코드 유닛)을 인수로 받고, 값 완료(normal completion)로 Boolean 또는 undefined를, 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. R객체가 아니면 TypeError 예외를 throw한다.
  2. R[[OriginalFlags]] 내부 슬롯이 없으면,
    1. SameValue(R, %RegExp.prototype%) 가 true이면 undefined를 반환한다.
    2. 그 외에는 TypeError 예외를 throw한다.
  3. flagsR.[[OriginalFlags]]를 할당한다.
  4. flagscodeUnit이 포함되어 있으면 true를 반환한다.
  5. false를 반환한다.

22.2.6.5 get RegExp.prototype.global

RegExp.prototype.global접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. cu에 코드 유닛 0x0067(LATIN SMALL LETTER G)를 할당한다.
  3. RegExpHasFlag(R, cu)를 반환한다.

22.2.6.6 get RegExp.prototype.hasIndices

RegExp.prototype.hasIndices접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. cu에 코드 유닛 0x0064(LATIN SMALL LETTER D)를 할당한다.
  3. RegExpHasFlag(R, cu)를 반환한다.

22.2.6.7 get RegExp.prototype.ignoreCase

RegExp.prototype.ignoreCase접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. cu에 코드 유닛 0x0069(LATIN SMALL LETTER I)를 할당한다.
  3. RegExpHasFlag(R, cu)를 반환한다.

22.2.6.8 RegExp.prototype [ %Symbol.match% ] ( string )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. rxthis 값을 할당한다.
  2. rx객체가 아니면 TypeError 예외를 throw한다.
  3. S에 ? ToString(string)을 할당한다.
  4. flags에 ? ToString(? Get(rx, "flags"))를 할당한다.
  5. flags"g"이 포함되어 있지 않으면,
    1. RegExpExec(rx, S)를 반환한다.
  6. 그 외,
    1. flags"u""v"가 포함되어 있으면 fullUnicodetrue를, 아니면 false를 할당한다.
    2. Set(rx, "lastIndex", +0𝔽, true)를 수행한다.
    3. A에 ! ArrayCreate(0)을 할당한다.
    4. n에 0을 할당한다.
    5. 반복,
      1. result에 ? RegExpExec(rx, S)를 할당한다.
      2. resultnull이면,
        1. n = 0이면 null을 반환한다.
        2. A를 반환한다.
      3. 그 외,
        1. matchStr에 ? ToString(? Get(result, "0"))를 할당한다.
        2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), matchStr)를 수행한다.
        3. matchStr이 빈 문자열이면,
          1. thisIndex(? ToLength(? Get(rx, "lastIndex")))를 할당한다.
          2. nextIndexAdvanceStringIndex(S, thisIndex, fullUnicode)를 할당한다.
          3. Set(rx, "lastIndex", 𝔽(nextIndex), true)를 수행한다.
        4. nn + 1을 할당한다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.match]"이다.

참고

%Symbol.match% 프로퍼티는 IsRegExp 추상 연산에서 객체가 기본적인 정규표현식 동작을 가지는지를 식별하는 데 사용된다. %Symbol.match% 프로퍼티가 없거나 그 값이 Boolean 변환 시 true가 아니면 해당 객체는 정규표현식 객체로 사용하기 위한 것이 아니다.

22.2.6.9 RegExp.prototype [ %Symbol.matchAll% ] ( string )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. R객체가 아니면 TypeError 예외를 throw한다.
  3. S에 ? ToString(string)을 할당한다.
  4. C에 ? SpeciesConstructor(R, %RegExp%)를 할당한다.
  5. flags에 ? ToString(? Get(R, "flags"))를 할당한다.
  6. matcher에 ? Construct(C, « R, flags »)를 할당한다.
  7. lastIndex에 ? ToLength(? Get(R, "lastIndex"))를 할당한다.
  8. Set(matcher, "lastIndex", lastIndex, true)를 수행한다.
  9. flags"g"이 포함되어 있으면 globaltrue를, 아니면 false를 할당한다.
  10. flags"u""v"가 포함되어 있으면 fullUnicodetrue를 할당한다.
  11. 그 외 fullUnicodefalse를 할당한다.
  12. CreateRegExpStringIterator(matcher, S, global, fullUnicode)를 반환한다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.matchAll]"이다.

22.2.6.10 get RegExp.prototype.multiline

RegExp.prototype.multiline접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. cu에 코드 유닛 0x006D(LATIN SMALL LETTER M)를 할당한다.
  3. RegExpHasFlag(R, cu)를 반환한다.

22.2.6.11 RegExp.prototype [ %Symbol.replace% ] ( string, replaceValue )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. rxthis 값을 할당한다.
  2. rx객체가 아니면 TypeError 예외를 throw한다.
  3. S에 ? ToString(string)을 할당한다.
  4. lengthSS의 길이를 할당한다.
  5. functionalReplaceIsCallable(replaceValue)를 할당한다.
  6. functionalReplacefalse이면,
    1. replaceValue에 ? ToString(replaceValue)를 할당한다.
  7. flags에 ? ToString(? Get(rx, "flags"))를 할당한다.
  8. flags"g"이 포함되어 있으면 globaltrue를, 아니면 false를 할당한다.
  9. globaltrue이면,
    1. Set(rx, "lastIndex", +0𝔽, true)를 수행한다.
  10. results에 새 빈 List를 할당한다.
  11. donefalse를 할당한다.
  12. 반복, donefalse인 동안,
    1. result에 ? RegExpExec(rx, S)를 할당한다.
    2. resultnull이면,
      1. donetrue를 할당한다.
    3. 그 외,
      1. resultresults에 추가한다.
      2. globalfalse이면,
        1. donetrue를 할당한다.
      3. 그 외,
        1. matchStr에 ? ToString(? Get(result, "0"))를 할당한다.
        2. matchStr이 빈 문자열이면,
          1. thisIndex(? ToLength(? Get(rx, "lastIndex")))를 할당한다.
          2. flags"u""v"가 포함되어 있으면 fullUnicodetrue를, 아니면 false를 할당한다.
          3. nextIndexAdvanceStringIndex(S, thisIndex, fullUnicode)를 할당한다.
          4. Set(rx, "lastIndex", 𝔽(nextIndex), true)를 수행한다.
  13. accumulatedResult에 빈 문자열을 할당한다.
  14. nextSourcePosition에 0을 할당한다.
  15. results의 각 요소 result에 대해,
    1. resultLength에 ? LengthOfArrayLike(result)를 할당한다.
    2. nCapturesmax(resultLength - 1, 0)를 할당한다.
    3. matched에 ? ToString(? Get(result, "0"))를 할당한다.
    4. matchLengthmatched의 길이를 할당한다.
    5. position에 ? ToIntegerOrInfinity(? Get(result, "index"))를 할당한다.
    6. position을 0과 lengthS 사이로 클램핑(clamping)한다.
    7. captures에 새 빈 List를 할당한다.
    8. n에 1을 할당한다.
    9. 반복, nnCaptures인 동안,
      1. capN에 ? Get(result, ! ToString(𝔽(n))).
      2. capNundefined가 아니면,
        1. capN에 ? ToString(capN)을 할당한다.
      3. capNcaptures에 추가한다.
      4. 참고: n = 1일 때 위 단계는 captures(인덱스 0)에 첫 번째 요소를 넣는다. 보다 일반적으로 n번째 캡처(캡처 괄호 집합에 의해 캡처된 문자들)는 captures[n - 1]에 있다.
      5. nn + 1을 할당한다.
    10. namedCaptures에 ? Get(result, "groups")를 할당한다.
    11. functionalReplacetrue이면,
      1. replacerArgs에 « matched », captures, « 𝔽(position), S »의 리스트 연결(list-concatenation)을 할당한다.
      2. namedCapturesundefined가 아니면,
        1. namedCapturesreplacerArgs에 추가한다.
      3. replacementValue에 ? Call(replaceValue, undefined, replacerArgs)를 할당한다.
      4. replacementString에 ? ToString(replacementValue)를 할당한다.
    12. 그 외,
      1. namedCapturesundefined가 아니면,
        1. namedCaptures에 ? ToObject(namedCaptures)를 할당한다.
      2. replacementString에 ? GetSubstitution(matched, S, position, captures, namedCaptures, replaceValue)를 할당한다.
    13. positionnextSourcePosition이면,
      1. 참고: position이 일반적으로 뒤로 이동하면 안 된다. 만약 그렇다면 이는 잘못된 동작의 RegExp 서브클래스이거나 global 플래그 또는 rx의 기타 특성을 변경하는 접근 트리거 부작용의 사용을 나타낸다. 이런 경우 해당 치환은 무시된다.
      2. accumulatedResultaccumulatedResult, SnextSourcePosition부터 position까지의 부분 문자열(substring), replacementString문자열 연결하여 할당한다.
      3. nextSourcePositionposition + matchLength를 할당한다.
  16. nextSourcePositionlengthS이면 accumulatedResult를 반환한다.
  17. accumulatedResultSnextSourcePosition부터 마지막까지의 부분 문자열(substring)문자열 연결하여 반환한다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.replace]"이다.

22.2.6.12 RegExp.prototype [ %Symbol.search% ] ( string )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. rxthis 값을 할당한다.
  2. rx객체가 아니면 TypeError 예외를 throw한다.
  3. S에 ? ToString(string)을 할당한다.
  4. previousLastIndex에 ? Get(rx, "lastIndex")를 할당한다.
  5. previousLastIndex+0𝔽이 아니면,
    1. Set(rx, "lastIndex", +0𝔽, true)를 수행한다.
  6. result에 ? RegExpExec(rx, S)를 할당한다.
  7. currentLastIndex에 ? Get(rx, "lastIndex")를 할당한다.
  8. SameValue(currentLastIndex, previousLastIndex)가 false이면,
    1. Set(rx, "lastIndex", previousLastIndex, true)를 수행한다.
  9. resultnull이면 -1𝔽를 반환한다.
  10. Get(result, "index")를 반환한다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.search]"이다.

참고

검색을 수행할 때 이 RegExp 객체의 "lastIndex""global" 프로퍼티는 무시된다. "lastIndex" 프로퍼티는 변경되지 않는다.

22.2.6.13 get RegExp.prototype.source

RegExp.prototype.source접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. R객체가 아니면 TypeError 예외를 throw한다.
  3. R[[OriginalSource]] 내부 슬롯이 없으면,
    1. SameValue(R, %RegExp.prototype%) 가 true이면 "(?:)"를 반환한다.
    2. 그 외에는 TypeError 예외를 throw한다.
  4. Assert: R[[OriginalFlags]] 내부 슬롯이 있다.
  5. srcR.[[OriginalSource]]를 할당한다.
  6. flagsR.[[OriginalFlags]]를 할당한다.
  7. EscapeRegExpPattern(src, flags)를 반환한다.

22.2.6.13.1 EscapeRegExpPattern ( P, F )

추상 연산 EscapeRegExpPattern은 P(문자열), F(문자열)를 인수로 받아 문자열을 반환한다. 호출 시 다음 단계를 수행한다:

  1. F"v"가 포함되어 있으면,
    1. patternSymbolPattern[+UnicodeMode, +UnicodeSetsMode]을 할당한다.
  2. 그 외 F"u"가 포함되어 있으면,
    1. patternSymbolPattern[+UnicodeMode, ~UnicodeSetsMode]을 할당한다.
  3. 그 외,
    1. patternSymbolPattern[~UnicodeMode, ~UnicodeSetsMode]을 할당한다.
  4. SP를 UTF-16 인코딩된 유니코드 코드포인트(6.1.4)로 해석하여 patternSymbol 형태의 문자열을 할당한다. 다음에 설명된 대로 일부 코드포인트는 escape된다. SP와 다를 수도 있고 같을 수도 있다. 단, SpatternSymbol로 평가하여 얻는 추상 클로저(Abstract Closure)는 생성된 객체의 [[RegExpMatcher]] 내부 슬롯에 의해 정의되는 추상 클로저와 동일하게 동작해야 한다. 동일한 P, F로 여러 번 호출해도 결과는 항상 동일해야 한다.
  5. 패턴에 등장하는 / 또는 LineTerminator 코드포인트는 S에서 escape되어야 한다. 이는 문자열 연결(string-concatenation)을 통해 "/", S, "/", F를 적절한 렉시컬 컨텍스트에서 RegularExpressionLiteral로 파싱할 수 있게 하고, 생성된 정규표현식과 동일하게 동작해야 한다. 예를 들어, P"/"이면 S"\/" 또는 "\u002F" 등이 될 수 있지만 "/"는 안 된다. 왜냐하면 /// 뒤에 F가 오면 SingleLineComment로 파싱되기 때문이다. P가 빈 문자열이면 S"(?:)"로 하면 된다.
  6. S를 반환한다.
참고

이름이 비슷하지만 RegExp.escape와 EscapeRegExpPattern은 동작이 다르다. 전자는 문자열을 패턴 내부에 표현하기 위해 escape하고, 이 함수는 패턴을 문자열로 표현하기 위해 escape한다.

22.2.6.14 RegExp.prototype [ %Symbol.split% ] ( string, limit )

참고 1

이 메서드는 string을 문자열로 변환한 결과의 부분 문자열들을 배열로 반환한다. 부분 문자열들은 왼쪽에서 오른쪽으로 this 값의 정규표현식에 매치되는 구간을 기준으로 나뉘는데, 매치된 구간들은 반환 배열의 어떤 문자열에도 포함되지 않고, 문자열을 분리하는 역할만 한다.

this 값이 빈 정규표현식이거나 빈 문자열에 매치될 수 있는 정규표현식일 수도 있다. 이 경우 정규표현식은 입력 문자열의 처음이나 끝에 있는 빈 부분 문자열, 또는 이전 구분자 매치의 끝에 있는 빈 부분 문자열과는 매치되지 않는다. (예: 정규표현식이 빈 문자열에 매치된다면 문자열은 개별 코드 유닛 단위로 분리된다. 결과 배열의 길이는 문자열의 길이와 같고 각 부분 문자열에는 코드 유닛 하나만 포함된다.) 주어진 인덱스에서의 첫 번째 매치만 고려하며, 백트래킹으로 해당 인덱스에서 비어있지 않은 부분 문자열 매치를 얻을 수 있어도 무시한다. (예: /a*?/[Symbol.split]("ab")는 배열 ["a", "b"]가 되고, /a*/[Symbol.split]("ab")["","b"]가 된다.)

string이(혹은 변환 결과가) 빈 문자열이면, 결과는 정규표현식이 빈 문자열에 매치되는지 여부에 따라 달라진다. 매치된다면 결과 배열에는 아무 요소도 없다. 그렇지 않으면 결과 배열에 빈 문자열 하나가 들어간다.

정규표현식에 캡처 괄호가 있으면 separator가 매치될 때마다 캡처된 결과(캡처 실패 시 undefined 포함)들이 출력 배열에 삽입된다. 예시:

/<(\/)?([^<>]+)>/[Symbol.split]("A<B>bold</B>and<CODE>coded</CODE>")

이 표현식의 결과 배열:

["A", undefined, "B", "bold", "/", "B", "and", undefined, "CODE", "coded", "/", "CODE", ""]

limitundefined가 아니면, 출력 배열은 limit개까지만 포함한다.

이 메서드는 호출 시 다음 단계를 수행한다:

  1. rxthis 값을 할당한다.
  2. rx객체가 아니면 TypeError 예외를 throw한다.
  3. S에 ? ToString(string)을 할당한다.
  4. C에 ? SpeciesConstructor(rx, %RegExp%)를 할당한다.
  5. flags에 ? ToString(? Get(rx, "flags"))를 할당한다.
  6. flags"u" 또는 "v"가 포함되어 있으면 unicodeMatchingtrue를 할당한다.
  7. 그 외 unicodeMatchingfalse를 할당한다.
  8. flags"y"가 포함되어 있으면 newFlagsflags를 할당한다.
  9. 그 외 newFlagsflags"y"문자열 연결(string-concatenation)하여 할당한다.
  10. splitter에 ? Construct(C, « rx, newFlags »)를 할당한다.
  11. A에 ! ArrayCreate(0)을 할당한다.
  12. lengthA에 0을 할당한다.
  13. limitundefined이면 lim에 232 - 1를, 아니면 lim(? ToUint32(limit))를 할당한다.
  14. lim = 0이면 A를 반환한다.
  15. S가 빈 문자열이면,
    1. z에 ? RegExpExec(splitter, S)를 할당한다.
    2. znull이 아니면 A를 반환한다.
    3. CreateDataPropertyOrThrow(A, "0", S)를 수행한다.
    4. A를 반환한다.
  16. sizeS의 길이를 할당한다.
  17. p에 0을 할당한다.
  18. qp를 할당한다.
  19. 반복, q < size인 동안,
    1. Set(splitter, "lastIndex", 𝔽(q), true)를 수행한다.
    2. z에 ? RegExpExec(splitter, S)를 할당한다.
    3. znull이면,
      1. qAdvanceStringIndex(S, q, unicodeMatching)를 할당한다.
    4. 그 외,
      1. e(? ToLength(? Get(splitter, "lastIndex")))를 할당한다.
      2. emin(e, size)를 할당한다.
      3. e = p이면,
        1. qAdvanceStringIndex(S, q, unicodeMatching)를 할당한다.
      4. 그 외,
        1. TSp부터 q까지의 부분 문자열(substring)을 할당한다.
        2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T)를 수행한다.
        3. lengthAlengthA + 1을 할당한다.
        4. lengthA = lim이면 A를 반환한다.
        5. pe를 할당한다.
        6. numberOfCaptures에 ? LengthOfArrayLike(z)를 할당한다.
        7. numberOfCapturesmax(numberOfCaptures - 1, 0)를 할당한다.
        8. i에 1을 할당한다.
        9. 반복, inumberOfCaptures인 동안,
          1. nextCapture에 ? Get(z, ! ToString(𝔽(i))).
          2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), nextCapture)를 수행한다.
          3. ii + 1을 할당한다.
          4. lengthAlengthA + 1을 할당한다.
          5. lengthA = lim이면 A를 반환한다.
        10. qp를 할당한다.
  20. TSp부터 size까지의 부분 문자열(substring)을 할당한다.
  21. CreateDataPropertyOrThrow(A, ! ToString(𝔽(lengthA)), T)를 수행한다.
  22. A를 반환한다.

이 메서드의 "name" 프로퍼티 값은 "[Symbol.split]"이다.

참고 2

이 메서드는 이 RegExp 객체의 "global""sticky" 프로퍼티 값을 무시한다.

22.2.6.15 get RegExp.prototype.sticky

RegExp.prototype.sticky접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. cu에 코드 유닛 0x0079(LATIN SMALL LETTER Y)를 할당한다.
  3. RegExpHasFlag(R, cu)를 반환한다.

22.2.6.16 RegExp.prototype.test ( S )

이 메서드는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. R객체가 아니면 TypeError 예외를 throw한다.
  3. string에 ? ToString(S)를 할당한다.
  4. match에 ? RegExpExec(R, string)를 할당한다.
  5. matchnull이 아니면 true를, 아니면 false를 반환한다.

22.2.6.17 RegExp.prototype.toString ( )

  1. Rthis 값을 할당한다.
  2. R객체가 아니면 TypeError 예외를 throw한다.
  3. pattern에 ? ToString(? Get(R, "source"))를 할당한다.
  4. flags에 ? ToString(? Get(R, "flags"))를 할당한다.
  5. result문자열 연결(string-concatenation)을 사용해 "/", pattern, "/", flags를 이어붙여 할당한다.
  6. result를 반환한다.
참고

반환되는 문자열은 RegularExpressionLiteral 형태를 가지며, 이 객체와 동일하게 동작하는 다른 RegExp 객체로 평가된다.

22.2.6.18 get RegExp.prototype.unicode

RegExp.prototype.unicode접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. cu에 코드 유닛 0x0075(LATIN SMALL LETTER U)를 할당한다.
  3. RegExpHasFlag(R, cu)를 반환한다.

22.2.6.19 get RegExp.prototype.unicodeSets

RegExp.prototype.unicodeSets접근자 프로퍼티이며, set 접근자 함수는 undefined이다. get 접근자 함수는 호출 시 다음 단계를 수행한다:

  1. Rthis 값을 할당한다.
  2. cu에 코드 유닛 0x0076(LATIN SMALL LETTER V)를 할당한다.
  3. RegExpHasFlag(R, cu)를 반환한다.

22.2.7 정규표현식 매칭에 대한 추상 연산

22.2.7.1 RegExpExec ( R, S )

추상 연산 RegExpExec는 R(객체), S(문자열)를 인수로 받고, 값 완료(normal completion)로 객체나 null 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. exec에 ? Get(R, "exec")를 할당한다.
  2. IsCallable(exec)가 true이면,
    1. result에 ? Call(exec, R, « S »)를 할당한다.
    2. result객체가 아니고 resultnull이 아니면 TypeError 예외를 throw한다.
    3. result를 반환한다.
  3. RequireInternalSlot(R, [[RegExpMatcher]])를 수행한다.
  4. RegExpBuiltinExec(R, S)를 반환한다.
참고

호출 가능한 "exec" 프로퍼티가 없으면 이 알고리즘은 내장 정규표현식 매칭 알고리즘을 사용한다. 이는 이전 버전에서 정규표현식을 사용하는 대부분의 내장 알고리즘이 "exec"의 동적 프로퍼티 조회를 수행하지 않았던 코드와 호환되는 동작을 제공한다.

22.2.7.2 RegExpBuiltinExec ( R, S )

추상 연산 RegExpBuiltinExec는 R(초기화된 RegExp 인스턴스), S(문자열)를 인수로 받고, 값 완료(normal completion)배열 특수 객체(Array exotic object) 또는 null 또는 throw 완료를 반환한다. 호출 시 다음 단계를 수행한다:

  1. lengthS의 길이를 할당한다.
  2. lastIndex(? ToLength(? Get(R, "lastIndex")))를 할당한다.
  3. flagsR.[[OriginalFlags]]를 할당한다.
  4. flags"g"가 포함되어 있으면 globaltrue를, 아니면 false를 할당한다.
  5. flags"y"가 포함되어 있으면 stickytrue를, 아니면 false를 할당한다.
  6. flags"d"가 포함되어 있으면 hasIndicestrue를, 아니면 false를 할당한다.
  7. globalfalse이고 stickyfalse이면 lastIndex를 0으로 설정한다.
  8. matcherR.[[RegExpMatcher]]를 할당한다.
  9. flags"u""v"가 포함되어 있으면 fullUnicodetrue를, 아니면 false를 할당한다.
  10. matchSucceededfalse를 할당한다.
  11. fullUnicodetrue이면 inputStringToCodePoints(S)를, 아니면 inputS의 코드 유닛으로 이루어진 List를 할당한다.
  12. 참고: input의 각 요소는 문자로 취급된다.
  13. 반복, matchSucceededfalse인 동안,
    1. lastIndex > length이면,
      1. globaltrue이거나 stickytrue이면,
        1. Set(R, "lastIndex", +0𝔽, true)를 수행한다.
      2. null을 반환한다.
    2. inputIndexSlastIndex번째 요소로 얻은 문자의 input에서의 인덱스를 할당한다.
    3. rmatcher(input, inputIndex)를 할당한다.
    4. rfailure이면,
      1. stickytrue이면,
        1. Set(R, "lastIndex", +0𝔽, true)를 수행한다.
        2. null을 반환한다.
      2. lastIndexAdvanceStringIndex(S, lastIndex, fullUnicode)로 설정한다.
    5. 그 외,
      1. Assert: rMatchState이다.
      2. matchSucceededtrue로 설정한다.
  14. er.[[EndIndex]]를 할당한다.
  15. fullUnicodetrue이면 eGetStringIndex(S, e)로 설정한다.
  16. globaltrue이거나 stickytrue이면,
    1. Set(R, "lastIndex", 𝔽(e), true)를 수행한다.
  17. nr.[[Captures]]의 요소 개수를 할당한다.
  18. Assert: n = R.[[RegExpRecord]].[[CapturingGroupsCount]]이다.
  19. Assert: n < 232 - 1이다.
  20. A에 ! ArrayCreate(n + 1)을 할당한다.
  21. Assert: A"length" 프로퍼티의 수학적 값n + 1이다.
  22. CreateDataPropertyOrThrow(A, "index", 𝔽(lastIndex))를 수행한다.
  23. CreateDataPropertyOrThrow(A, "input", S)를 수행한다.
  24. matchMatch Record { [[StartIndex]]: lastIndex, [[EndIndex]]: e }를 할당한다.
  25. indices에 새 빈 List를 할당한다.
  26. groupNames에 새 빈 List를 할당한다.
  27. matchindices에 추가한다.
  28. matchedSubstrGetMatchString(S, match)를 할당한다.
  29. CreateDataPropertyOrThrow(A, "0", matchedSubstr)를 수행한다.
  30. RGroupName이 있으면,
    1. groupsOrdinaryObjectCreate(null)를 할당한다.
    2. hasGroupstrue를 할당한다.
  31. 그 외,
    1. groupsundefined를 할당한다.
    2. hasGroupsfalse를 할당한다.
  32. CreateDataPropertyOrThrow(A, "groups", groups)를 수행한다.
  33. matchedGroupNames에 새 빈 List를 할당한다.
  34. integer i에 대해 1 ≤ in인 경우 오름차순으로 반복,
    1. captureIr.[[Captures]]i번째 요소를 할당한다.
    2. captureIundefined이면,
      1. capturedValueundefined를 할당한다.
      2. undefinedindices에 추가한다.
    3. 그 외,
      1. captureStartcaptureI.[[StartIndex]]를 할당한다.
      2. captureEndcaptureI.[[EndIndex]]를 할당한다.
      3. fullUnicodetrue이면,
        1. captureStartGetStringIndex(S, captureStart)로 설정한다.
        2. captureEndGetStringIndex(S, captureEnd)로 설정한다.
      4. captureMatch Record { [[StartIndex]]: captureStart, [[EndIndex]]: captureEnd }를 할당한다.
      5. capturedValueGetMatchString(S, capture)를 할당한다.
      6. captureindices에 추가한다.
    4. CreateDataPropertyOrThrow(A, ! ToString(𝔽(i)), capturedValue)를 수행한다.
    5. Ri번째 캡처가 GroupName으로 정의되어 있으면,
      1. s에 해당 GroupNameCapturingGroupName을 할당한다.
      2. matchedGroupNamess를 포함하면,
        1. Assert: capturedValueundefined이다.
        2. undefinedgroupNames에 추가한다.
      3. 그 외,
        1. capturedValueundefined가 아니면 smatchedGroupNames에 추가한다.
        2. 참고: 동일한 이름 s를 가진 그룹이 둘 이상 있을 수 있다. 이 경우 groups에 이미 s 프로퍼티가 있을 수 있다. 그러나 groups일반 객체이고, 프로퍼티는 모두 데이터 프로퍼티(data properties)이므로 CreateDataPropertyOrThrow 호출은 반드시 성공한다.
        3. CreateDataPropertyOrThrow(groups, s, capturedValue)를 수행한다.
        4. sgroupNames에 추가한다.
    6. 그 외,
      1. undefinedgroupNames에 추가한다.
  35. hasIndicestrue이면,
    1. indicesArrayMakeMatchIndicesIndexPairArray(S, indices, groupNames, hasGroups)를 할당한다.
    2. CreateDataPropertyOrThrow(A, "indices", indicesArray)를 수행한다.
  36. A를 반환한다.

22.2.7.3 AdvanceStringIndex ( S, index, unicode )

추상 연산 AdvanceStringIndex는 S(문자열), index(음수가 아닌 정수(integer)), unicode(Boolean)을 인수로 받고 정수(integer)를 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: index ≤ 253 - 1.
  2. unicodefalse이면 index + 1을 반환한다.
  3. lengthS의 길이를 할당한다.
  4. index + 1 ≥ length이면 index + 1을 반환한다.
  5. cpCodePointAt(S, index)를 할당한다.
  6. index + cp.[[CodeUnitCount]]를 반환한다.

22.2.7.4 GetStringIndex ( S, codePointIndex )

추상 연산 GetStringIndex는 S(문자열), codePointIndex(음수가 아닌 정수(integer))를 인수로 받고 음수가 아닌 정수(integer)를 반환한다. S6.1.4에 따라 UTF-16 인코딩된 코드포인트 시퀀스로 해석하고, codePointIndex에 해당하는 코드유닛 인덱스를 반환한다. 그런 인덱스가 없으면 S의 길이를 반환한다. 호출 시 다음 단계를 수행한다:

  1. S가 빈 문자열이면 0을 반환한다.
  2. lenS의 길이를 할당한다.
  3. codeUnitCount에 0을 할당한다.
  4. codePointCount에 0을 할당한다.
  5. 반복, codeUnitCount < len인 동안,
    1. codePointCount = codePointIndex이면 codeUnitCount를 반환한다.
    2. cpCodePointAt(S, codeUnitCount)를 할당한다.
    3. codeUnitCountcodeUnitCount + cp.[[CodeUnitCount]]로 설정한다.
    4. codePointCountcodePointCount + 1로 설정한다.
  6. len을 반환한다.

22.2.7.5 매치 레코드(Match Records)

매치 레코드(Match Record)는 정규표현식 매치나 캡처의 시작 및 끝 인덱스를 캡슐화하는 레코드(Record) 값이다.

매치 레코드는 표 72에 나열된 필드를 가진다.

표 72: 매치 레코드(Match Record) 필드
필드 이름(Field Name) 값(Value) 의미(Meaning)
[[StartIndex]] 음수가 아닌 정수(integer) 문자열의 시작부터 매치가 시작되는 위치(포함)의 코드유닛 수.
[[EndIndex]] 정수(integer)[[StartIndex]] 문자열의 시작부터 매치가 끝나는 위치(제외)의 코드유닛 수.

22.2.7.6 GetMatchString ( S, match )

추상 연산 GetMatchString은 S(문자열), match(매치 레코드(Match Record))를 인수로 받아 문자열을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: match.[[StartIndex]]match.[[EndIndex]]S의 길이.
  2. Smatch.[[StartIndex]]부터 match.[[EndIndex]]까지의 부분 문자열(substring)을 반환한다.

22.2.7.7 GetMatchIndexPair ( S, match )

추상 연산 GetMatchIndexPair는 S(문자열), match(매치 레코드(Match Record))를 인수로 받아 배열을 반환한다. 호출 시 다음 단계를 수행한다:

  1. Assert: match.[[StartIndex]]match.[[EndIndex]]S의 길이.
  2. CreateArrayFromList𝔽(match.[[StartIndex]]), 𝔽(match.[[EndIndex]]) »)를 반환한다.

22.2.7.8 MakeMatchIndicesIndexPairArray ( S, indices, groupNames, hasGroups )

추상 연산 MakeMatchIndicesIndexPairArray는 S(문자열), indices(Match Records 또는 undefinedList), groupNames(문자열 또는 undefinedList), hasGroups(Boolean)를 인수로 받아 배열을 반환한다. 호출 시 다음 단계를 수행한다:

  1. nindices의 요소 개수를 할당한다.
  2. Assert: n < 232 - 1.
  3. Assert: groupNamesn - 1개의 요소를 가진다.
  4. 참고: groupNames List의 요소는 indices Listindices[1]부터 정렬된다.
  5. A에 ! ArrayCreate(n)를 할당한다.
  6. hasGroupstrue이면,
    1. groupsOrdinaryObjectCreate(null)를 할당한다.
  7. 그 외,
    1. groupsundefined를 할당한다.
  8. CreateDataPropertyOrThrow(A, "groups", groups)를 수행한다.
  9. integer i에 대해 0 ≤ i < n인 경우 오름차순으로 반복,
    1. matchIndicesindices[i]를 할당한다.
    2. matchIndicesundefined가 아니면,
      1. matchIndexPairGetMatchIndexPair(S, matchIndices)를 할당한다.
    3. 그 외,
      1. matchIndexPairundefined를 할당한다.
    4. CreateDataPropertyOrThrow(A, ! ToString(𝔽(i)), matchIndexPair)를 수행한다.
    5. i > 0이면,
      1. sgroupNames[i - 1]을 할당한다.
      2. sundefined가 아니면,
        1. Assert: groupsundefined가 아니다.
        2. 참고: 동일한 이름 s를 가진 그룹이 둘 이상 있을 수 있다. 이 경우 groups에 이미 s 프로퍼티가 있을 수 있다. 그러나 groups일반 객체이고, 프로퍼티는 모두 데이터 프로퍼티(data properties)이므로 CreateDataPropertyOrThrow 호출은 반드시 성공한다.
        3. CreateDataPropertyOrThrow(groups, s, matchIndexPair)를 수행한다.
  10. A를 반환한다.

22.2.8 RegExp 인스턴스의 속성

RegExp 인스턴스는 일반 객체이며, RegExp 프로토타입 객체로부터 속성을 상속받는다. RegExp 인스턴스는 내부 슬롯 [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], [[RegExpMatcher]]를 가진다. [[RegExpMatcher]] 내부 슬롯의 값은 RegExp 객체의 Pattern에 대한 추상 클로저(Abstract Closure) 표현이다.

참고

ECMAScript 2015 이전에는 RegExp 인스턴스가 자체 데이터 프로퍼티(data properties) "source", "global", "ignoreCase", "multiline"를 가진 것으로 명세되어 있었다. 이 속성들은 이제 RegExp.prototype접근자 프로퍼티(accessor properties)로 명세된다.

RegExp 인스턴스는 다음 속성도 갖는다:

22.2.8.1 lastIndex

"lastIndex" 프로퍼티의 값은 다음 매치를 시작할 문자열 인덱스를 지정한다. 사용될 때 정수(Number)로 강제 변환된다(자세한 내용은 22.2.7.2 참조). 이 프로퍼티의 속성은 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }이다.

22.2.9 RegExp 문자열 반복자 객체

RegExp 문자열 반복자(RegExp String Iterator)는 특정 문자열 인스턴스 객체에서, 특정 RegExp 인스턴스 객체와 매칭하며 반복을 수행하는 객체이다. RegExp 문자열 반복자 객체에 대한 명명된 생성자는 없다. 대신, RegExp 문자열 반복자 객체는 RegExp 인스턴스의 특정 메서드를 호출해서 생성된다.

22.2.9.1 CreateRegExpStringIterator ( R, S, global, fullUnicode )

추상 연산 CreateRegExpStringIterator는 R(객체), S(문자열), global(Boolean), fullUnicode(Boolean)을 인수로 받아 객체를 반환한다. 호출 시 다음 단계를 수행한다:

  1. iteratorOrdinaryObjectCreate(%RegExpStringIteratorPrototype%, « [[IteratingRegExp]], [[IteratedString]], [[Global]], [[Unicode]], [[Done]] »).
  2. iterator.[[IteratingRegExp]]R를 할당한다.
  3. iterator.[[IteratedString]]S를 할당한다.
  4. iterator.[[Global]]global을 할당한다.
  5. iterator.[[Unicode]]fullUnicode를 할당한다.
  6. iterator.[[Done]]false를 할당한다.
  7. iterator를 반환한다.

22.2.9.2 %RegExpStringIteratorPrototype% 객체

%RegExpStringIteratorPrototype% 객체:

22.2.9.2.1 %RegExpStringIteratorPrototype%.next ( )

  1. Othis 값을 할당한다.
  2. O객체가 아니면 TypeError 예외를 throw한다.
  3. ORegExp 문자열 반복자 객체 인스턴스의 모든 내부 슬롯이 없으면(22.2.9.3 참조), TypeError 예외를 throw한다.
  4. O.[[Done]]true이면,
    1. CreateIteratorResultObject(undefined, true)를 반환한다.
  5. RO.[[IteratingRegExp]]를 할당한다.
  6. SO.[[IteratedString]]를 할당한다.
  7. globalO.[[Global]]를 할당한다.
  8. fullUnicodeO.[[Unicode]]를 할당한다.
  9. match에 ? RegExpExec(R, S)를 할당한다.
  10. matchnull이면,
    1. O.[[Done]]true로 설정한다.
    2. CreateIteratorResultObject(undefined, true)를 반환한다.
  11. globalfalse이면,
    1. O.[[Done]]true로 설정한다.
    2. CreateIteratorResultObject(match, false)를 반환한다.
  12. matchStr에 ? ToString(? Get(match, "0"))를 할당한다.
  13. matchStr이 빈 문자열이면,
    1. thisIndex(? ToLength(? Get(R, "lastIndex")))를 할당한다.
    2. nextIndexAdvanceStringIndex(S, thisIndex, fullUnicode)를 할당한다.
    3. Set(R, "lastIndex", 𝔽(nextIndex), true)를 수행한다.
  14. CreateIteratorResultObject(match, false)를 반환한다.

22.2.9.2.2 %RegExpStringIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기값은 문자열 값 "RegExp String Iterator"이다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }이다.

22.2.9.3 RegExp 문자열 반복자 인스턴스의 속성

RegExp 문자열 반복자 인스턴스는 일반 객체이며, %RegExpStringIteratorPrototype% 내재 객체로부터 속성을 상속받는다. RegExp 문자열 반복자 인스턴스는 표 73에 나열된 내부 슬롯으로 초기화된다.

표 73: RegExp 문자열 반복자 인스턴스의 내부 슬롯
내부 슬롯(Internal Slot) 타입(Type) 설명(Description)
[[IteratingRegExp]] 객체(Object) 반복에 사용되는 정규표현식. IsRegExp([[IteratingRegExp]])는 처음에 true이다.
[[IteratedString]] 문자열(String) 반복 대상이 되는 문자열 값.
[[Global]] Boolean [[IteratingRegExp]]가 글로벌인지 여부.
[[Unicode]] Boolean [[IteratingRegExp]]가 유니코드 모드인지 여부.
[[Done]] Boolean 반복이 완료되었는지 여부.

23 인덱스된 컬렉션

23.1 배열 객체

배열은 특수 객체로, 특정 클래스의 프로퍼티 이름에 대해 특별한 처리를 합니다. 이 특별한 처리의 정의는 10.4.2에서 확인할 수 있습니다.

23.1.1 Array 생성자

Array 생성자는 다음과 같습니다:

  • %Array%입니다.
  • "Array" 프로퍼티의 초기값이며, 글로벌 객체의 프로퍼티입니다.
  • 생성자로 호출될 때 새로운 배열을 생성하고 초기화합니다.
  • 생성자가 아닌 함수로 호출될 때에도 새로운 배열을 생성하고 초기화합니다. 따라서 Array(…) 함수 호출은 같은 인수를 사용한 new Array(…) 객체 생성 표현식과 동일합니다.
  • 인수의 개수와 타입에 따라 동작이 달라지는 함수입니다.
  • 클래스 정의의 extends 절의 값으로 사용할 수 있습니다. 특수 배열 동작을 상속하려는 생성자의 하위 클래스는 Array 생성자super로 호출하여 배열 특수 객체인 하위 클래스 인스턴스를 초기화해야 합니다. 하지만 대부분의 Array.prototype 메서드는 일반 메서드이므로 this 값이 배열 특수 객체인지에 의존하지 않습니다.

23.1.1.1 Array ( ...values )

이 함수가 호출될 때 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면, newTarget현재 활성 함수 객체로 설정하고, 그렇지 않으면 newTarget을 NewTarget으로 설정합니다.
  2. proto를 ? GetPrototypeFromConstructor(newTarget, "%Array.prototype%")로 설정합니다.
  3. numberOfArgsvalues의 요소 개수로 설정합니다.
  4. numberOfArgs = 0이면,
    1. ArrayCreate(0, proto)를 반환합니다.
  5. 그렇지 않고 numberOfArgs = 1이면,
    1. lenvalues[0]으로 설정합니다.
    2. array를 ! ArrayCreate(0, proto)로 설정합니다.
    3. lenNumber 타입이 아니라면,
      1. CreateDataPropertyOrThrow(array, "0", len)을 수행합니다.
      2. intLen1𝔽로 설정합니다.
    4. 그렇지 않으면,
      1. intLen을 ! ToUint32(len)로 설정합니다.
      2. SameValueZero(intLen, len)이 false이면, RangeError 예외를 발생시킵니다.
    5. Set(array, "length", intLen, true)을 수행합니다.
    6. array를 반환합니다.
  6. 그 밖의 경우,
    1. Assert: numberOfArgs ≥ 2임을 확인합니다.
    2. array를 ? ArrayCreate(numberOfArgs, proto)로 설정합니다.
    3. k를 0으로 설정합니다.
    4. k < numberOfArgs인 동안 반복합니다,
      1. Pk를 ! ToString(𝔽(k))로 설정합니다.
      2. itemKvalues[k]로 설정합니다.
      3. CreateDataPropertyOrThrow(array, Pk, itemK)를 수행합니다.
      4. kk + 1로 설정합니다.
    5. Assert: 수학적 값 array"length" 프로퍼티는 numberOfArgs와 같습니다.
    6. array를 반환합니다.

23.1.2 Array 생성자의 속성

Array 생성자는 다음과 같습니다:

  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function.prototype%입니다.
  • "length" 프로퍼티를 가지며, 그 값은 1𝔽입니다.
  • 다음과 같은 프로퍼티들을 포함합니다:

23.1.2.1 Array.from ( items [ , mapper [ , thisArg ] ] )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Cthis 값으로 설정합니다.
  2. mapperundefined라면,
    1. mappingfalse로 설정합니다.
  3. 그렇지 않으면,
    1. IsCallable(mapper) 가 false라면, TypeError 예외를 throw합니다.
    2. mappingtrue로 설정합니다.
  4. usingIterator를 ? GetMethod(items, %Symbol.iterator%)로 설정합니다.
  5. usingIteratorundefined가 아니면,
    1. IsConstructor(C) 가 true라면,
      1. A를 ? Construct(C)로 설정합니다.
    2. 그렇지 않으면,
      1. A를 ! ArrayCreate(0)로 설정합니다.
    3. iteratorRecord를 ? GetIteratorFromMethod(items, usingIterator)로 설정합니다.
    4. k를 0으로 설정합니다.
    5. 반복합니다,
      1. k ≥ 253 - 1이면,
        1. errorThrowCompletion(새로 생성된 TypeError 객체)로 설정합니다.
        2. IteratorClose(iteratorRecord, error)를 반환합니다.
      2. Pk를 ! ToString(𝔽(k))로 설정합니다.
      3. next를 ? IteratorStepValue(iteratorRecord)로 설정합니다.
      4. nextdone이면,
        1. Set(A, "length", 𝔽(k), true)을 수행합니다.
        2. A를 반환합니다.
      5. mappingtrue이면,
        1. mappedValueCompletion(Call(mapper, thisArg, « next, 𝔽(k) »))로 설정합니다.
        2. IfAbruptCloseIterator(mappedValue, iteratorRecord)를 수행합니다.
      6. 그렇지 않으면,
        1. mappedValuenext로 설정합니다.
      7. defineStatusCompletion(CreateDataPropertyOrThrow(A, Pk, mappedValue))로 설정합니다.
      8. IfAbruptCloseIterator(defineStatus, iteratorRecord)를 수행합니다.
      9. kk + 1로 설정합니다.
  6. 참고: itemsiterable이 아니므로 array-like 객체라고 가정합니다.
  7. arrayLike를 ! ToObject(items)로 설정합니다.
  8. len을 ? LengthOfArrayLike(arrayLike)로 설정합니다.
  9. IsConstructor(C)가 true라면,
    1. A를 ? Construct(C, « 𝔽(len) »)로 설정합니다.
  10. 그렇지 않으면,
    1. A를 ? ArrayCreate(len)로 설정합니다.
  11. k를 0으로 설정합니다.
  12. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValue를 ? Get(arrayLike, Pk)로 설정합니다.
    3. mappingtrue라면,
      1. mappedValue를 ? Call(mapper, thisArg, « kValue, 𝔽(k) »)로 설정합니다.
    4. 그렇지 않으면,
      1. mappedValuekValue로 설정합니다.
    5. CreateDataPropertyOrThrow(A, Pk, mappedValue)를 수행합니다.
    6. kk + 1로 설정합니다.
  13. Set(A, "length", 𝔽(len), true)를 수행합니다.
  14. A를 반환합니다.
참고

이 메서드는 일부러 일반적인 팩토리 메서드로 설계되었습니다. this 값이 반드시 Array 생성자일 필요는 없습니다. 따라서 이 메서드는 다른 생성자로 전달되거나 상속될 수 있으며, 단일 숫자 인수로 호출될 수 있습니다.

23.1.2.2 Array.isArray ( arg )

이 함수는 호출될 때 다음 단계들을 수행합니다:

  1. IsArray(arg)를 반환합니다.

23.1.2.3 Array.of ( ...items )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. lenitems의 요소 개수로 설정합니다.
  2. lenNumber𝔽(len)으로 설정합니다.
  3. Cthis 값으로 설정합니다.
  4. IsConstructor(C)가 true라면,
    1. A를 ? Construct(C, « lenNumber »)로 설정합니다.
  5. 그렇지 않으면,
    1. A를 ? ArrayCreate(len)로 설정합니다.
  6. k를 0으로 설정합니다.
  7. k < len인 동안 반복합니다,
    1. kValueitems[k]로 설정합니다.
    2. Pk를 ! ToString(𝔽(k))로 설정합니다.
    3. CreateDataPropertyOrThrow(A, Pk, kValue)를 수행합니다.
    4. kk + 1로 설정합니다.
  8. Set(A, "length", lenNumber, true)를 수행합니다.
  9. A를 반환합니다.
참고

이 메서드는 일부러 일반적인 팩토리 메서드로 설계되었습니다. this 값이 반드시 Array 생성자일 필요는 없습니다. 따라서 이 메서드는 다른 생성자로 전달되거나 상속될 수 있으며, 단일 숫자 인수로 호출될 수 있습니다.

23.1.2.4 Array.prototype

Array.prototype의 값은 Array 프로토타입 객체입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 속성을 가집니다.

23.1.2.5 get Array [ %Symbol.species% ]

Array[%Symbol.species%]접근자 프로퍼티이며, set 접근자 함수는 undefined입니다. get 접근자 함수는 호출될 때 다음 단계들을 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]"입니다.

참고

Array 프로토타입 메서드는 일반적으로 this 값의 생성자를 사용하여 파생 객체를 생성합니다. 하지만 하위 클래스 생성자%Symbol.species% 프로퍼티를 재정의함으로써 기본 동작을 오버라이드할 수 있습니다.

23.1.3Array 프로토타입 객체의 속성

배열 프로토타입 객체:

  • %Array.prototype%입니다.
  • 배열 특수 객체이며, 해당 객체에 지정된 내부 메서드를 가집니다.
  • "length" 프로퍼티를 가지며, 초기 값은 +0𝔽이고 속성은 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }입니다.
  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype%입니다.
참고

배열 프로토타입 객체는 배열 특수 객체로 지정되어 있는데, 이는 ECMAScript 2015 명세 이전에 작성된 ECMAScript 코드와의 호환성을 보장하기 위함입니다.

23.1.3.1 Array.prototype.at ( index )

  1. O를 ? ToObject(this 값)로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. relativeIndex를 ? ToIntegerOrInfinity(index)로 설정합니다.
  4. relativeIndex ≥ 0이면,
    1. krelativeIndex로 설정합니다.
  5. 그렇지 않으면,
    1. klen + relativeIndex로 설정합니다.
  6. k < 0 또는 klen이면 undefined를 반환합니다.
  7. Get(O, ! ToString(𝔽(k)))를 반환합니다.

23.1.3.2 Array.prototype.concat ( ...items )

이 메서드는 객체의 배열 요소 뒤에 각 인자의 배열 요소를 담은 배열을 반환합니다.

호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)로 설정합니다.
  2. A를 ? ArraySpeciesCreate(O, 0)로 설정합니다.
  3. n을 0으로 설정합니다.
  4. Oitems 앞에 추가합니다.
  5. items의 각 요소 E에 대해, 다음을 수행합니다:
    1. spreadable를 ? IsConcatSpreadable(E)로 설정합니다.
    2. spreadabletrue이면,
      1. len를 ? LengthOfArrayLike(E)로 설정합니다.
      2. n + len > 253 - 1이면 TypeError 예외를 throw합니다.
      3. k를 0으로 설정합니다.
      4. k < len인 동안 반복합니다,
        1. Pk를 ! ToString(𝔽(k))로 설정합니다.
        2. exists를 ? HasProperty(E, Pk)로 설정합니다.
        3. existstrue이면,
          1. subElement를 ? Get(E, Pk)로 설정합니다.
          2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), subElement)를 수행합니다.
        4. nn + 1로 설정합니다.
        5. kk + 1로 설정합니다.
    3. 그렇지 않으면,
      1. 참고: E는 펼쳐지지 않고 단일 항목으로 추가됩니다.
      2. n ≥ 253 - 1이면 TypeError 예외를 throw합니다.
      3. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), E)를 수행합니다.
      4. nn + 1로 설정합니다.
  6. Set(A, "length", 𝔽(n), true)를 수행합니다.
  7. A를 반환합니다.

이 메서드의 "length" 프로퍼티 값은 1𝔽입니다.

참고 1

단계 6에서 "length" 프로퍼티를 명시적으로 설정하는 것은 items의 마지막 비어 있지 않은 요소에 후행 구멍이 있거나 A가 내장 배열이 아닐 때 길이가 올바르게 되도록 보장하기 위함입니다.

참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.2.1 IsConcatSpreadable ( O )

추상 연산 IsConcatSpreadable은 인수 O(ECMAScript 언어 값)를 받고, Boolean을 포함하는 정상 완료 또는 throw 완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. O객체가 아니면 false를 반환합니다.
  2. spreadable를 ? Get(O, %Symbol.isConcatSpreadable%)로 설정합니다.
  3. spreadableundefined가 아니면 ToBoolean(spreadable)를 반환합니다.
  4. IsArray(O)를 반환합니다.

23.1.3.3 Array.prototype.constructor

Array.prototype.constructor의 초기 값은 %Array%입니다.

23.1.3.4 Array.prototype.copyWithin ( target, start [ , end ] )

참고 1

end 인수는 선택 사항입니다. 제공되지 않을 경우 this 값의 길이가 사용됩니다.

참고 2

target이 음수이면 length + target으로 처리됩니다. 여기서 length는 배열의 길이입니다. start가 음수이면 length + start으로 처리됩니다. end가 음수이면 length + end으로 처리됩니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. relativeTarget를 ? ToIntegerOrInfinity(target)로 설정합니다.
  4. relativeTarget = -∞이면 to를 0으로 설정합니다.
  5. 그렇지 않고 relativeTarget < 0이면 tomax(len + relativeTarget, 0)으로 설정합니다.
  6. 그 밖의 경우 tomin(relativeTarget, len)으로 설정합니다.
  7. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  8. relativeStart = -∞이면 from을 0으로 설정합니다.
  9. 그렇지 않고 relativeStart < 0이면 frommax(len + relativeStart, 0)으로 설정합니다.
  10. 그 밖의 경우 frommin(relativeStart, len)으로 설정합니다.
  11. endundefined이면 relativeEndlen으로 설정하고, 아니면 relativeEnd를 ? ToIntegerOrInfinity(end)로 설정합니다.
  12. relativeEnd = -∞이면 final을 0으로 설정합니다.
  13. 그렇지 않고 relativeEnd < 0이면 finalmax(len + relativeEnd, 0)으로 설정합니다.
  14. 그 밖의 경우 finalmin(relativeEnd, len)으로 설정합니다.
  15. countmin(final - from, len - to)로 설정합니다.
  16. from < to이고 to < from + count이면,
    1. direction을 -1로 설정합니다.
    2. fromfrom + count - 1로 설정합니다.
    3. toto + count - 1로 설정합니다.
  17. 그렇지 않으면,
    1. direction을 1로 설정합니다.
  18. count > 0인 동안 반복합니다,
    1. fromKey를 ! ToString(𝔽(from))로 설정합니다.
    2. toKey를 ! ToString(𝔽(to))로 설정합니다.
    3. fromPresent를 ? HasProperty(O, fromKey)로 설정합니다.
    4. fromPresenttrue이면,
      1. fromValue를 ? Get(O, fromKey)로 설정합니다.
      2. Set(O, toKey, fromValue, true)를 수행합니다.
    5. 그렇지 않으면,
      1. Assert: fromPresentfalse임을 확인합니다.
      2. DeletePropertyOrThrow(O, toKey)를 수행합니다.
    6. fromfrom + direction으로 설정합니다.
    7. toto + direction으로 설정합니다.
    8. countcount - 1로 설정합니다.
  19. O를 반환합니다.
참고 3

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.5 Array.prototype.entries ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. CreateArrayIterator(O, key+value)를 반환합니다.

23.1.3.6 Array.prototype.every ( callback [ , thisArg ] )

참고 1

callback은 세 개의 인수를 받고 Boolean 값으로 변환될 수 있는 값을 반환하는 함수여야 합니다. every는 배열에 존재하는 각 요소에 대해 오름차순으로 callback을 한 번씩 호출하며, callbackfalse를 반환하는 요소를 찾으면 즉시 false를 반환합니다. 그렇지 않으면 everytrue를 반환합니다. callback은 배열에 실제로 존재하는 요소에만 호출되며, 누락된 요소에 대해 호출되지 않습니다.

thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로 사용됩니다. 제공되지 않으면 undefined가 대신 사용됩니다.

callback은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.

every는 호출된 객체를 직접 변경하지 않지만, callback의 호출로 인해 객체가 변경될 수 있습니다.

every가 처리할 요소의 범위는 callback의 첫 호출 전에 결정됩니다. every 호출이 시작된 후 배열에 추가된 요소는 callback에서 방문하지 않습니다. 기존 요소가 변경된 경우 every가 그 요소를 방문할 때의 값이 callback에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다. every는 수학의 "모든 것에 대해(for all)" 한정자와 유사하게 동작하며, 특히 빈 배열에 대해 true를 반환합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 throw합니다.
  4. k를 0으로 설정합니다.
  5. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. kValue를 ? Get(O, Pk)로 설정합니다.
      2. testResultToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))로 설정합니다.
      3. testResultfalse이면 false를 반환합니다.
    4. kk + 1로 설정합니다.
  6. true를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.7 Array.prototype.fill ( value [ , start [ , end ] ] )

참고 1

start 인수는 선택 사항입니다. 제공되지 않을 경우 +0𝔽가 사용됩니다.

end 인수는 선택 사항입니다. 제공되지 않을 경우 this 값의 길이가 사용됩니다.

참고 2

start가 음수이면 length + start으로 처리됩니다. 여기서 length는 배열의 길이입니다. end가 음수이면 length + end으로 처리됩니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  4. relativeStart = -∞이면 k를 0으로 설정합니다.
  5. 그렇지 않고 relativeStart < 0이면 kmax(len + relativeStart, 0)으로 설정합니다.
  6. 그 밖의 경우 kmin(relativeStart, len)으로 설정합니다.
  7. endundefined이면 relativeEndlen으로 설정하고, 아니면 relativeEnd를 ? ToIntegerOrInfinity(end)로 설정합니다.
  8. relativeEnd = -∞이면 final을 0으로 설정합니다.
  9. 그렇지 않고 relativeEnd < 0이면 finalmax(len + relativeEnd, 0)으로 설정합니다.
  10. 그 밖의 경우 finalmin(relativeEnd, len)으로 설정합니다.
  11. k < final인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. Set(O, Pk, value, true)를 수행합니다.
    3. kk + 1로 설정합니다.
  12. O를 반환합니다.
참고 3

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.8 Array.prototype.filter ( callback [ , thisArg ] )

참고 1

callback은 세 개의 인수를 받고 Boolean 값으로 변환될 수 있는 값을 반환하는 함수여야 합니다. filter는 배열에 존재하는 각 요소에 대해 오름차순으로 callback을 한 번씩 호출하며, callbacktrue를 반환하는 값들로 새로운 배열을 만듭니다. callback은 배열에 실제로 존재하는 요소에만 호출되며, 누락된 요소에 대해 호출되지 않습니다.

thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로 사용됩니다. 제공되지 않으면 undefined가 대신 사용됩니다.

callback은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.

filter는 호출된 객체를 직접 변경하지 않지만, callback의 호출로 인해 객체가 변경될 수 있습니다.

filter가 처리할 요소의 범위는 callback의 첫 호출 전에 결정됩니다. filter 호출이 시작된 후 배열에 추가된 요소는 callback에서 방문하지 않습니다. 기존 요소가 변경된 경우 filter가 그 요소를 방문할 때의 값이 callback에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 throw합니다.
  4. A를 ? ArraySpeciesCreate(O, 0)로 설정합니다.
  5. k를 0으로 설정합니다.
  6. to를 0으로 설정합니다.
  7. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. kValue를 ? Get(O, Pk)로 설정합니다.
      2. selectedToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))로 설정합니다.
      3. selectedtrue이면,
        1. CreateDataPropertyOrThrow(A, ! ToString(𝔽(to)), kValue)를 수행합니다.
        2. toto + 1로 설정합니다.
    4. kk + 1로 설정합니다.
  8. A를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.9 Array.prototype.find ( predicate [ , thisArg ] )

참고 1

이 메서드는 배열의 각 요소에 대해 오름차순 인덱스 순서로 predicate를 한 번씩 호출하며, predicatetrue로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소 값을 반환합니다. 그렇지 않으면 findundefined를 반환합니다.

자세한 내용은 FindViaPredicate를 참조하세요.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. findRec를 ? FindViaPredicate(O, len, ascending, predicate, thisArg)로 설정합니다.
  4. findRec.[[Value]]를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.10 Array.prototype.findIndex ( predicate [ , thisArg ] )

참고 1

이 메서드는 배열의 각 요소에 대해 오름차순 인덱스 순서로 predicate를 한 번씩 호출하며, predicatetrue로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소의 인덱스를 반환합니다. 그렇지 않으면 findIndex는 -1을 반환합니다.

자세한 내용은 FindViaPredicate를 참조하세요.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. findRec를 ? FindViaPredicate(O, len, ascending, predicate, thisArg)로 설정합니다.
  4. findRec.[[Index]]를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.11 Array.prototype.findLast ( predicate [ , thisArg ] )

참고 1

이 메서드는 배열의 각 요소에 대해 내림차순 인덱스 순서로 predicate를 한 번씩 호출하며, predicatetrue로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소 값을 반환합니다. 그렇지 않으면 findLastundefined를 반환합니다.

자세한 정보는 FindViaPredicate를 참조하세요.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. findRec를 ? FindViaPredicate(O, len, descending, predicate, thisArg)로 설정합니다.
  4. findRec.[[Value]]를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열 객체일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.12 Array.prototype.findLastIndex ( predicate [ , thisArg ] )

참고 1

이 메서드는 배열의 각 요소에 대해 내림차순 인덱스 순서로 predicate를 한 번씩 호출하며, predicatetrue로 변환되는 값을 반환하는 요소를 찾으면 즉시 그 요소의 인덱스를 반환합니다. 그렇지 않으면 findLastIndex는 -1을 반환합니다.

자세한 정보는 FindViaPredicate를 참조하세요.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. findRec를 ? FindViaPredicate(O, len, descending, predicate, thisArg)로 설정합니다.
  4. findRec.[[Index]]를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열 객체일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.12.1 FindViaPredicate ( O, len, direction, predicate, thisArg )

추상 연산 FindViaPredicate는 인수 O(객체), len(음이 아닌 정수), direction(ascending 또는 descending), predicate(ECMAScript 언어 값), thisArg(ECMAScript 언어 값)를 받고, 아래와 같은 필드를 가진 Record를 포함하는 정상 완료 또는 throw 완료 중 하나를 반환합니다.

Oarray-like 객체 또는 TypedArray여야 합니다. 이 연산은 O의 각 요소에 대해 오름차순 또는 내림차순 인덱스 순서(direction에 따라)로 predicate를 한 번씩 호출하며, predicatetrue로 변환되는 값을 반환하는 요소를 찾으면 해당 인덱스와 값을 담은 Record를 반환합니다. 그렇지 않으면 인덱스가 -1𝔽이고 값이 undefined인 Record를 반환합니다.

predicate는 함수여야 하며, 배열의 각 요소에 대해 호출될 때 요소의 값, 인덱스, 순회 중인 객체를 인수로 전달받고, 반환값은 Boolean으로 변환됩니다.

thisArgpredicate 호출 시 this 값으로 사용됩니다.

이 연산은 호출된 객체를 직접 변경하지 않지만, predicate의 호출로 인해 객체가 변경될 수 있습니다.

처리되는 요소의 범위는 predicate의 첫 호출 직전에 결정됩니다. 그 이후 배열에 추가된 요소는 predicate에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이 predicate에 전달됩니다. 순회 시작 이후 삭제된 요소는 여전히 방문되며 프로토타입에서 조회되거나 undefined가 됩니다.

호출될 때 다음 단계들을 수행합니다:

  1. IsCallable(predicate)가 false이면 TypeError 예외를 throw합니다.
  2. directionascending이면,
    1. indices를 0(포함)부터 len(제외)까지의 정수로 이루어진 구간List로, 오름차순으로 설정합니다.
  3. 그 밖의 경우,
    1. indices를 0(포함)부터 len(제외)까지의 정수로 이루어진 구간List로, 내림차순으로 설정합니다.
  4. indices의 각 정수 k에 대해, 다음을 수행합니다:
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. 참고: OTypedArray일 경우, 이후 Get 호출은 정상 완료를 반환합니다.
    3. kValue를 ? Get(O, Pk)로 설정합니다.
    4. testResult를 ? Call(predicate, thisArg, « kValue, 𝔽(k), O »)로 설정합니다.
    5. ToBoolean(testResult)가 true이면, Record { [[Index]]: 𝔽(k), [[Value]]: kValue }를 반환합니다.
  5. Record { [[Index]]: -1𝔽, [[Value]]: undefined }를 반환합니다.

23.1.3.13 Array.prototype.flat ( [ depth ] )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. sourceLen를 ? LengthOfArrayLike(O)로 설정합니다.
  3. depthNum을 1로 설정합니다.
  4. depthundefined가 아니면,
    1. depthNum을 ? ToIntegerOrInfinity(depth)로 설정합니다.
    2. depthNum < 0이면 depthNum을 0으로 설정합니다.
  5. A를 ? ArraySpeciesCreate(O, 0)로 설정합니다.
  6. FlattenIntoArray(A, O, sourceLen, 0, depthNum)를 수행합니다.
  7. A를 반환합니다.

23.1.3.13.1 FlattenIntoArray ( target, source, sourceLen, start, depth [ , mapperFunction [ , thisArg ] ] )

추상 연산 FlattenIntoArray는 인수 target(객체), source(객체), sourceLen(음이 아닌 정수), start(음이 아닌 정수), depth(음이 아닌 정수 또는 +∞)와 선택적 인수 mapperFunction(함수 객체), thisArg(ECMAScript 언어 값)를 받고, 음이 아닌 정수를 포함하는 정상 완료 또는 throw 완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: mapperFunction이 존재하면 IsCallable(mapperFunction)이 true이고, thisArg가 존재하며, depth가 1입니다.
  2. targetIndexstart로 설정합니다.
  3. sourceIndex+0𝔽로 설정합니다.
  4. (sourceIndex) < sourceLen인 동안 반복합니다,
    1. P를 ! ToString(sourceIndex)로 설정합니다.
    2. exists를 ? HasProperty(source, P)로 설정합니다.
    3. existstrue이면,
      1. element를 ? Get(source, P)로 설정합니다.
      2. mapperFunction이 존재하면,
        1. element를 ? Call(mapperFunction, thisArg, « element, sourceIndex, source »)로 설정합니다.
      3. shouldFlattenfalse로 설정합니다.
      4. depth > 0이면,
        1. shouldFlatten을 ? IsArray(element)로 설정합니다.
      5. shouldFlattentrue이면,
        1. depth = +∞이면 newDepth를 +∞로 설정합니다.
        2. 그 밖의 경우 newDepthdepth - 1로 설정합니다.
        3. elementLen를 ? LengthOfArrayLike(element)로 설정합니다.
        4. targetIndex를 ? FlattenIntoArray(target, element, elementLen, targetIndex, newDepth)로 설정합니다.
      6. 그 밖의 경우,
        1. targetIndex ≥ 253 - 1이면 TypeError 예외를 throw합니다.
        2. CreateDataPropertyOrThrow(target, ! ToString(𝔽(targetIndex)), element)를 수행합니다.
        3. targetIndextargetIndex + 1로 설정합니다.
    4. sourceIndexsourceIndex + 1𝔽로 설정합니다.
  5. targetIndex를 반환합니다.

23.1.3.14 Array.prototype.flatMap ( mapperFunction [ , thisArg ] )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. sourceLen를 ? LengthOfArrayLike(O)로 설정합니다.
  3. IsCallable(mapperFunction)이 false이면 TypeError 예외를 throw합니다.
  4. A를 ? ArraySpeciesCreate(O, 0)로 설정합니다.
  5. FlattenIntoArray(A, O, sourceLen, 0, 1, mapperFunction, thisArg)를 수행합니다.
  6. A를 반환합니다.

23.1.3.15 Array.prototype.forEach ( callback [ , thisArg ] )

참고 1

callback은 세 개의 인수를 받는 함수여야 합니다. forEach는 배열에 존재하는 각 요소에 대해 오름차순으로 callback을 한 번씩 호출합니다. callback은 배열에 실제 존재하는 요소에만 호출되며, 누락된 요소에는 호출되지 않습니다.

thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로 사용됩니다. 제공되지 않으면 undefined가 대신 사용됩니다.

callback은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.

forEach는 호출된 객체를 직접 변경하지 않지만, callback의 호출로 인해 객체가 변경될 수 있습니다.

forEach가 처리할 요소의 범위는 callback의 첫 호출 전에 결정됩니다. forEach 호출이 시작된 후 배열에 추가된 요소는 callback에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이 callback에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 throw합니다.
  4. k를 0으로 설정합니다.
  5. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. kValue를 ? Get(O, Pk)로 설정합니다.
      2. Call(callback, thisArg, « kValue, 𝔽(k), O »)를 수행합니다.
    4. kk + 1로 설정합니다.
  6. undefined를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.16 Array.prototype.includes ( searchElement [ , fromIndex ] )

참고 1

이 메서드는 SameValueZero 알고리즘을 사용하여 searchElement를 배열 요소와 오름차순으로 비교하며, 아무 위치에서라도 찾으면 true를 반환하고 그렇지 않으면 false를 반환합니다.

두 번째 인수 fromIndex는 선택 사항이며 기본값은 +0𝔽입니다(즉, 배열 전체를 검색함). 배열 길이보다 크거나 같으면 false를 반환하며, 검색하지 않습니다. -0𝔽보다 작으면 배열 끝에서의 오프셋으로 사용되어 fromIndex를 계산합니다. 계산된 인덱스가 +0𝔽 이하이면 배열 전체가 검색됩니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. len = 0이면 false를 반환합니다.
  4. n을 ? ToIntegerOrInfinity(fromIndex)로 설정합니다.
  5. Assert: fromIndexundefined이면 n은 0입니다.
  6. n = +∞이면 false를 반환합니다.
  7. 그 밖의 경우 n = -∞이면 n을 0으로 설정합니다.
  8. n ≥ 0이면,
    1. kn으로 설정합니다.
  9. 그 밖의 경우,
    1. klen + n으로 설정합니다.
    2. k < 0이면 k를 0으로 설정합니다.
  10. k < len인 동안 반복합니다,
    1. elementK를 ? Get(O, ! ToString(𝔽(k)))로 설정합니다.
    2. SameValueZero(searchElement, elementK)이 true이면 true를 반환합니다.
    3. kk + 1로 설정합니다.
  11. false를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

참고 3

이 메서드는 유사한 indexOf 메서드와 두 가지 방식에서 의도적으로 다릅니다. 첫째로 SameValueZero 알고리즘을 사용하여 IsStrictlyEqual 대신 NaN 배열 요소를 감지할 수 있습니다. 둘째로 누락된 배열 요소를 건너뛰지 않고 undefined로 처리합니다.

23.1.3.17 Array.prototype.indexOf ( searchElement [ , fromIndex ] )

이 메서드는 IsStrictlyEqual 알고리즘을 사용하여 searchElement를 배열 요소와 오름차순으로 비교하며, 한 곳 이상에서 찾으면 가장 작은 인덱스를 반환하고, 그렇지 않으면 -1𝔽를 반환합니다.

참고 1

두 번째 인수 fromIndex는 선택 사항이며 기본값은 +0𝔽입니다(즉, 배열 전체가 검색됨). 배열 길이보다 크거나 같으면 -1𝔽를 반환하며, 검색하지 않습니다. -0𝔽보다 작으면 배열 끝에서의 오프셋으로 사용되어 fromIndex를 계산합니다. 계산된 인덱스가 +0𝔽 이하이면 배열 전체가 검색됩니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. len = 0이면 -1𝔽를 반환합니다.
  4. n을 ? ToIntegerOrInfinity(fromIndex)로 설정합니다.
  5. Assert: fromIndexundefined이면 n은 0입니다.
  6. n = +∞이면 -1𝔽를 반환합니다.
  7. 그 밖의 경우 n = -∞이면 n을 0으로 설정합니다.
  8. n ≥ 0이면,
    1. kn으로 설정합니다.
  9. 그 밖의 경우,
    1. klen + n으로 설정합니다.
    2. k < 0이면 k를 0으로 설정합니다.
  10. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. elementK를 ? Get(O, Pk)로 설정합니다.
      2. IsStrictlyEqual(searchElement, elementK)이 true이면 𝔽(k)를 반환합니다.
    4. kk + 1로 설정합니다.
  11. -1𝔽를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.18 Array.prototype.join ( separator )

이 메서드는 배열의 요소들을 문자열로 변환한 후, separator가 등장하는 구분자로 문자열을 연결합니다. separator가 제공되지 않으면 쉼표 하나가 구분자로 사용됩니다.

호출 시 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. separatorundefined이면 sep","로 설정합니다.
  4. 그 밖의 경우, sep를 ? ToString(separator)로 설정합니다.
  5. R을 빈 문자열로 설정합니다.
  6. k를 0으로 설정합니다.
  7. k < len인 동안 반복합니다,
    1. k > 0이면 Rsep를 문자열 연결하여 R에 저장합니다.
    2. element를 ? Get(O, ! ToString(𝔽(k)))로 설정합니다.
    3. elementundefined도 아니고 null도 아니면,
      1. S를 ? ToString(element)로 설정합니다.
      2. RS를 문자열 연결하여 R에 저장합니다.
    4. kk + 1로 설정합니다.
  8. R를 반환합니다.
참고

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.19 Array.prototype.keys ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. CreateArrayIterator(O, key)를 반환합니다.

23.1.3.20 Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] )

참고 1

이 메서드는 IsStrictlyEqual 알고리즘을 사용하여 searchElement를 배열 요소와 내림차순으로 비교하며, 한 곳 이상에서 찾으면 가장 큰 인덱스를 반환하고, 그렇지 않으면 -1𝔽를 반환합니다.

두 번째 인수 fromIndex는 선택 사항이며 기본값은 배열 길이 - 1입니다(즉, 배열 전체가 검색됨). 배열 길이보다 크거나 같으면 전체 배열을 검색합니다. -0𝔽보다 작으면 배열 끝에서의 오프셋으로 사용되어 fromIndex를 계산합니다. 계산된 인덱스가 +0𝔽 이하이면 -1𝔽를 반환합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. len = 0이면 -1𝔽를 반환합니다.
  4. fromIndex가 존재하면 n을 ? ToIntegerOrInfinity(fromIndex)로 설정하고 그렇지 않으면 nlen - 1로 설정합니다.
  5. n = -∞이면 -1𝔽를 반환합니다.
  6. n ≥ 0이면,
    1. kmin(n, len - 1)로 설정합니다.
  7. 그 밖의 경우,
    1. klen + n으로 설정합니다.
  8. k ≥ 0인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. elementK를 ? Get(O, Pk)로 설정합니다.
      2. IsStrictlyEqual(searchElement, elementK)이 true이면 𝔽(k)를 반환합니다.
    4. kk - 1로 설정합니다.
  9. -1𝔽를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.21 Array.prototype.map ( callback [ , thisArg ] )

참고 1

callback은 세 개의 인수를 받는 함수여야 합니다. map은 배열의 각 요소에 대해 오름차순으로 callback을 한 번씩 호출하며, 결과로 새로운 배열을 만듭니다. callback은 배열에 실제 존재하는 요소에만 호출되며, 누락된 요소에는 호출되지 않습니다.

thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로 사용됩니다. 제공되지 않으면 undefined가 대신 사용됩니다.

callback은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.

map은 호출된 객체를 직접 변경하지 않지만, callback의 호출로 인해 객체가 변경될 수 있습니다.

map이 처리할 요소의 범위는 callback의 첫 호출 전에 결정됩니다. map 호출이 시작된 후 배열에 추가된 요소는 callback에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이 callback에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 throw합니다.
  4. A를 ? ArraySpeciesCreate(O, len)로 설정합니다.
  5. k를 0으로 설정합니다.
  6. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. kValue를 ? Get(O, Pk)로 설정합니다.
      2. mappedValue를 ? Call(callback, thisArg, « kValue, 𝔽(k), O »)로 설정합니다.
      3. CreateDataPropertyOrThrow(A, Pk, mappedValue)를 수행합니다.
    4. kk + 1로 설정합니다.
  7. A를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.22 Array.prototype.pop ( )

참고 1

이 메서드는 배열의 마지막 요소를 제거하고 해당 요소를 반환합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. len = 0이면,
    1. Set(O, "length", +0𝔽, true)를 수행합니다.
    2. undefined를 반환합니다.
  4. 그 밖의 경우,
    1. Assert: len > 0임을 확인합니다.
    2. newLen𝔽(len - 1)로 설정합니다.
    3. index를 ! ToString(newLen)로 설정합니다.
    4. element를 ? Get(O, index)로 설정합니다.
    5. DeletePropertyOrThrow(O, index)를 수행합니다.
    6. Set(O, "length", newLen, true)를 수행합니다.
    7. element를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.23 Array.prototype.push ( ...items )

참고 1

이 메서드는 인수들을 배열의 끝에 등장 순서대로 추가합니다. 그리고 배열의 새 길이를 반환합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. argCountitems의 요소 개수로 설정합니다.
  4. len + argCount > 253 - 1이면 TypeError 예외를 throw합니다.
  5. items의 각 요소 E에 대해 다음을 수행합니다:
    1. Set(O, ! ToString(𝔽(len)), E, true)를 수행합니다.
    2. lenlen + 1로 설정합니다.
  6. Set(O, "length", 𝔽(len), true)를 수행합니다.
  7. 𝔽(len)를 반환합니다.

이 메서드의 "length" 프로퍼티 값은 1𝔽입니다.

참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.24 Array.prototype.reduce ( callback [ , initialValue ] )

참고 1

callback은 네 개의 인수를 받는 함수여야 합니다. reduce는 배열에 존재하는 첫 번째 요소 이후의 각 요소에 대해 오름차순으로 callback을 한 번씩 함수로 호출합니다.

callback은 네 개의 인수(previousValue(이전 callback 호출 값), currentValue(현재 요소의 값), currentIndex, 순회 중인 객체)를 받아 호출됩니다. callback이 처음 호출될 때 previousValuecurrentValue는 두 가지 값 중 하나가 될 수 있습니다. reduce 호출 시 initialValue가 제공되면 previousValueinitialValue이고 currentValue는 배열의 첫 번째 값이 됩니다. initialValue가 제공되지 않으면 previousValue는 배열의 첫 번째 값, currentValue는 두 번째 값이 됩니다. 배열에 요소가 없고 initialValue가 제공되지 않으면 TypeError가 발생합니다.

reduce는 호출된 객체를 직접 변경하지 않지만, callback의 호출로 인해 객체가 변경될 수 있습니다.

reduce가 처리할 요소의 범위는 callback의 첫 호출 전에 결정됩니다. reduce 호출이 시작된 후 배열에 추가된 요소는 callback에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이 callback에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 throw합니다.
  4. len = 0이고 initialValue가 제공되지 않으면 TypeError 예외를 throw합니다.
  5. k를 0으로 설정합니다.
  6. accumulatorundefined로 설정합니다.
  7. initialValue가 제공되면,
    1. accumulatorinitialValue로 설정합니다.
  8. 그 밖의 경우,
    1. kPresentfalse로 설정합니다.
    2. kPresentfalse이고 k < len인 동안 반복합니다,
      1. Pk를 ! ToString(𝔽(k))로 설정합니다.
      2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
      3. kPresenttrue이면,
        1. accumulator를 ? Get(O, Pk)로 설정합니다.
      4. kk + 1로 설정합니다.
    3. kPresentfalse이면 TypeError 예외를 throw합니다.
  9. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. kValue를 ? Get(O, Pk)로 설정합니다.
      2. accumulator를 ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)로 설정합니다.
    4. kk + 1로 설정합니다.
  10. accumulator를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.25 Array.prototype.reduceRight ( callback [ , initialValue ] )

참고 1

callback은 네 개의 인수를 받는 함수여야 합니다. reduceRight는 배열에 존재하는 첫 번째 요소 이후의 각 요소에 대해 내림차순으로 callback을 한 번씩 함수로 호출합니다.

callback은 네 개의 인수(previousValue(이전 callback 호출 값), currentValue(현재 요소의 값), currentIndex, 순회 중인 객체)를 받아 호출됩니다. 함수가 처음 호출될 때 previousValuecurrentValue는 두 가지 값 중 하나가 될 수 있습니다. reduceRight 호출 시 initialValue가 제공되면 previousValueinitialValue이고 currentValue는 배열의 마지막 값이 됩니다. initialValue가 제공되지 않으면 previousValue는 배열의 마지막 값, currentValue는 마지막에서 두 번째 값이 됩니다. 배열에 요소가 없고 initialValue가 제공되지 않으면 TypeError가 발생합니다.

reduceRight는 호출된 객체를 직접 변경하지 않지만, callback의 호출로 인해 객체가 변경될 수 있습니다.

reduceRight가 처리할 요소의 범위는 callback의 첫 호출 전에 결정됩니다. reduceRight 호출이 시작된 후 배열에 추가된 요소는 callback에서 방문하지 않습니다. 기존 요소가 callback에 의해 변경된 경우 그 시점의 값이 callback에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 throw합니다.
  4. len = 0이고 initialValue가 제공되지 않으면 TypeError 예외를 throw합니다.
  5. klen - 1로 설정합니다.
  6. accumulatorundefined로 설정합니다.
  7. initialValue가 제공되면,
    1. accumulatorinitialValue로 설정합니다.
  8. 그 밖의 경우,
    1. kPresentfalse로 설정합니다.
    2. kPresentfalse이고 k ≥ 0인 동안 반복합니다,
      1. Pk를 ! ToString(𝔽(k))로 설정합니다.
      2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
      3. kPresenttrue이면,
        1. accumulator를 ? Get(O, Pk)로 설정합니다.
      4. kk - 1로 설정합니다.
    3. kPresentfalse이면 TypeError 예외를 throw합니다.
  9. k ≥ 0인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. kValue를 ? Get(O, Pk)로 설정합니다.
      2. accumulator를 ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)로 설정합니다.
    4. kk - 1로 설정합니다.
  10. accumulator를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.26 Array.prototype.reverse ( )

참고 1

이 메서드는 배열의 요소들을 순서를 반대로 재배열합니다. 그리고 뒤집힌 배열을 반환합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. middlefloor(len / 2)로 설정합니다.
  4. lower를 0으로 설정합니다.
  5. lowermiddle인 동안 반복합니다,
    1. upperlen - lower - 1로 설정합니다.
    2. upperP를 ! ToString(𝔽(upper))로 설정합니다.
    3. lowerP를 ! ToString(𝔽(lower))로 설정합니다.
    4. lowerExists를 ? HasProperty(O, lowerP)로 설정합니다.
    5. lowerExiststrue이면,
      1. lowerValue를 ? Get(O, lowerP)로 설정합니다.
    6. upperExists를 ? HasProperty(O, upperP)로 설정합니다.
    7. upperExiststrue이면,
      1. upperValue를 ? Get(O, upperP)로 설정합니다.
    8. lowerExiststrue이고 upperExiststrue이면,
      1. Set(O, lowerP, upperValue, true)를 수행합니다.
      2. Set(O, upperP, lowerValue, true)를 수행합니다.
    9. 그 밖의 경우 lowerExistsfalse이고 upperExiststrue이면,
      1. Set(O, lowerP, upperValue, true)를 수행합니다.
      2. DeletePropertyOrThrow(O, upperP)를 수행합니다.
    10. 그 밖의 경우 lowerExiststrue이고 upperExistsfalse이면,
      1. DeletePropertyOrThrow(O, lowerP)를 수행합니다.
      2. Set(O, upperP, lowerValue, true)를 수행합니다.
    11. 그 밖의 경우,
      1. Assert: lowerExistsupperExists가 모두 false임을 확인합니다.
      2. 참고: 아무 작업도 필요하지 않습니다.
    12. lowerlower + 1로 설정합니다.
  6. O를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.27 Array.prototype.shift ( )

이 메서드는 배열의 첫 번째 요소를 제거하고 해당 요소를 반환합니다.

호출 시 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. len = 0이면,
    1. Set(O, "length", +0𝔽, true)를 수행합니다.
    2. undefined를 반환합니다.
  4. first를 ? Get(O, "0")로 설정합니다.
  5. k를 1로 설정합니다.
  6. k < len인 동안 반복합니다,
    1. from을 ! ToString(𝔽(k))로 설정합니다.
    2. to를 ! ToString(𝔽(k - 1))로 설정합니다.
    3. fromPresent를 ? HasProperty(O, from)로 설정합니다.
    4. fromPresenttrue이면,
      1. fromValue를 ? Get(O, from)로 설정합니다.
      2. Set(O, to, fromValue, true)를 수행합니다.
    5. 그 밖의 경우,
      1. Assert: fromPresentfalse임을 확인합니다.
      2. DeletePropertyOrThrow(O, to)를 수행합니다.
    6. kk + 1로 설정합니다.
  7. DeletePropertyOrThrow(O, ! ToString(𝔽(len - 1)))를 수행합니다.
  8. Set(O, "length", 𝔽(len - 1), true)를 수행합니다.
  9. first를 반환합니다.
참고

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.28 Array.prototype.slice ( start, end )

이 메서드는 배열의 start 요소부터 end 요소 바로 앞까지(혹은 endundefined이면 배열의 끝까지)의 요소를 포함하는 배열을 반환합니다. start가 음수면 length + start로 처리되며, 여기서 length는 배열의 길이입니다. end가 음수면 length + end로 처리됩니다. 여기서 length는 배열의 길이입니다.

호출 시 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  4. relativeStart = -∞이면 k를 0으로 설정합니다.
  5. 그 밖의 경우 relativeStart < 0이면 kmax(len + relativeStart, 0)으로 설정합니다.
  6. 그 밖의 경우 kmin(relativeStart, len)으로 설정합니다.
  7. endundefined이면 relativeEndlen으로 설정하고, 아니면 relativeEnd를 ? ToIntegerOrInfinity(end)로 설정합니다.
  8. relativeEnd = -∞이면 final을 0으로 설정합니다.
  9. 그 밖의 경우 relativeEnd < 0이면 finalmax(len + relativeEnd, 0)으로 설정합니다.
  10. 그 밖의 경우 finalmin(relativeEnd, len)으로 설정합니다.
  11. countmax(final - k, 0)으로 설정합니다.
  12. A를 ? ArraySpeciesCreate(O, count)로 설정합니다.
  13. n을 0으로 설정합니다.
  14. k < final인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. kValue를 ? Get(O, Pk)로 설정합니다.
      2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), kValue)를 수행합니다.
    4. kk + 1로 설정합니다.
    5. nn + 1로 설정합니다.
  15. Set(A, "length", 𝔽(n), true)를 수행합니다.
  16. A를 반환합니다.
참고 1

단계 15에서 "length" 프로퍼티를 명시적으로 설정하는 것은 A가 내장 배열이 아닌 경우에도 길이가 올바르게 되도록 하기 위함입니다.

참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.29 Array.prototype.some ( callback [ , thisArg ] )

참고 1

callback은 세 개의 인수를 받고 Boolean 값으로 변환될 수 있는 값을 반환하는 함수여야 합니다. some은 배열에 존재하는 각 요소에 대해 오름차순으로 callback을 한 번씩 호출하며, callbacktrue를 반환하는 요소를 찾으면 즉시 true를 반환합니다. 그렇지 않으면 somefalse를 반환합니다. callback은 배열에 실제 존재하는 요소에만 호출되며, 누락된 요소에는 호출되지 않습니다.

thisArg 매개변수가 제공되면 각 callback 호출의 this 값으로 사용됩니다. 제공되지 않으면 undefined가 대신 사용됩니다.

callback은 세 개의 인수(요소의 값, 요소의 인덱스, 순회 중인 객체)로 호출됩니다.

some은 호출된 객체를 직접 변경하지 않지만, callback의 호출로 인해 객체가 변경될 수 있습니다.

some이 처리할 요소의 범위는 callback의 첫 호출 전에 결정됩니다. some 호출이 시작된 후 배열에 추가된 요소는 callback에서 방문하지 않습니다. 기존 요소가 변경된 경우 그 시점의 값이 callback에 전달됩니다. 호출이 시작된 후 삭제된 요소는 방문하지 않습니다. some은 수학의 "존재(exists)" 한정자와 유사하게 동작하며, 특히 빈 배열에 대해 false를 반환합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. IsCallable(callback)이 false이면 TypeError 예외를 throw합니다.
  4. k를 0으로 설정합니다.
  5. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ? HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. kValue를 ? Get(O, Pk)로 설정합니다.
      2. testResultToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))로 설정합니다.
      3. testResulttrue이면 true를 반환합니다.
    4. kk + 1로 설정합니다.
  6. false를 반환합니다.
참고 2

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.30 Array.prototype.sort ( comparator )

이 메서드는 배열의 요소를 정렬합니다. comparatorundefined가 아니면 두 개의 인수 x, y를 받아 x < y이면 음수 Number, x > y이면 양수 Number, 그렇지 않으면 0을 반환하는 함수여야 합니다.

호출 시 다음 단계들을 수행합니다:

  1. comparatorundefined가 아니며 IsCallable(comparator)가 false이면 TypeError 예외를 throw합니다.
  2. obj를 ? ToObject(this 값)으로 설정합니다.
  3. len를 ? LengthOfArrayLike(obj)로 설정합니다.
  4. SortCompare를 (x, y)를 매개변수로 하고 comparator를 캡처하는 새로운 Abstract Closure로 설정하며, 호출 시 다음을 수행합니다:
    1. CompareArrayElements(x, y, comparator)를 반환합니다.
  5. sortedList를 ? SortIndexedProperties(obj, len, SortCompare, skip-holes)로 설정합니다.
  6. itemCountsortedList의 요소 개수로 설정합니다.
  7. j를 0으로 설정합니다.
  8. j < itemCount인 동안 반복합니다,
    1. Set(obj, ! ToString(𝔽(j)), sortedList[j], true)를 수행합니다.
    2. jj + 1로 설정합니다.
  9. 참고: 단계 SortIndexedProperties 호출은 skip-holes를 사용합니다. 나머지 인덱스는 정렬에서 제외된 구멍의 개수를 보존하기 위해 삭제됩니다.
  10. j < len인 동안 반복합니다,
    1. DeletePropertyOrThrow(obj, ! ToString(𝔽(j)))를 수행합니다.
    2. jj + 1로 설정합니다.
  11. obj를 반환합니다.
참고 1

존재하지 않는 프로퍼티 값은 항상 undefined 프로퍼티 값보다 크고, undefined는 항상 다른 어떤 값보다 크므로(자세한 내용은 CompareArrayElements 참조), undefined 프로퍼티 값은 항상 결과의 끝으로 정렬되고 그 뒤에 존재하지 않는 프로퍼티 값이 옵니다.

참고 2

단계 ToString 추상 연산이 단계 56에서 수행될 때 SortCompare일관된 비교자로 동작하지 않을 수도 있습니다.

참고 3

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.30.1 SortIndexedProperties ( obj, len, SortCompare, holes )

추상 연산 SortIndexedProperties는 인수 obj(객체), len(음이 아닌 정수), SortCompare(두 개의 매개변수를 가진 Abstract Closure), holes(skip-holes 또는 read-through-holes)를 받고, 아래와 같은 값을 담는 정상 완료 또는 throw 완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. items를 새로 빈 List로 설정합니다.
  2. k를 0으로 설정합니다.
  3. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. holesskip-holes이면,
      1. kRead를 ? HasProperty(obj, Pk)로 설정합니다.
    3. 그 밖의 경우,
      1. Assert: holesread-through-holes임을 확인합니다.
      2. kReadtrue로 설정합니다.
    4. kReadtrue이면,
      1. kValue를 ? Get(obj, Pk)로 설정합니다.
      2. kValueitems에 추가합니다.
    5. kk + 1로 설정합니다.
  4. items구현 정의 순서의 calls to SortCompare로 정렬합니다. 만약 호출 중 abrupt completion이 반환되면 더 이상 SortCompare를 호출하지 않고 해당 Completion Record를 반환합니다.
  5. items를 반환합니다.

정렬 순서(sort order)는 위 알고리즘의 단계 4를 완료한 후 items의 순서를 의미합니다. 정렬 순서구현 정의입니다. 만약 SortCompareitems의 원소에 대해 일관된 비교자가 아닌 경우입니다. Array.prototype.sort 또는 Array.prototype.toSorted에서 SortIndexedProperties가 호출될 때, 정렬 순서구현 정의입니다. 만약 comparatorundefined이고, ToStringSortCompare에 인수로 넘긴 특정 값에 대해 항상 동일한 결과를 반환하지 않는 경우입니다.

정렬 순서구현 정의로 지정되지 않은 경우, 다음 조건을 모두 만족해야 합니다:

  • itemCount보다 작은 음이 아닌 정수에 대한 어떤 수학적 순열 π가 존재해야 하며, itemCount보다 작은 음이 아닌 정수 j에 대해 old[j]new[π(j)]와 정확히 동일해야 합니다.
  • itemCount보다 작은 모든 음이 아닌 정수 j, k에 대해, (SortCompare(old[j], old[k])) < 0이면 π(j) < π(k)가 성립해야 합니다.
  • itemCount보다 작은 j, k에 대해 j < k, (SortCompare(old[j], old[k])) = 0이면 π(j) < π(k)가 성립해야 합니다. 즉, 정렬은 안정적(stable)이어야 합니다.

여기서 old[j]는 단계 4 실행 전 items[j]을, new[j]는 단계 4 실행 후의 items[j]을 의미합니다.

추상 클로저나 함수 comparator가 집합 S에 대해 일관된 비교자(consistent comparator)라면, 모든 S의 값 a, b, c(동일할 수도 있음)에 대해 아래의 조건을 모두 만족해야 합니다. a <C b(comparator(a, b)) < 0을, a =C b(comparator(a, b)) = 0을, a >C b(comparator(a, b)) > 0을 의미합니다.

  • comparator(a, b)를 호출하면 주어진 a, b 쌍에 대해 항상 동일한 값 v가 반환되어야 하며, vNumber이며 vNaN이 아니어야 합니다. 즉, a <C b, a =C b, a >C b 중 하나만 참입니다.
  • comparator(a, b)를 호출해도 objobj의 프로토타입 체인의 어떤 객체도 수정하면 안 됩니다.
  • a =C a (반사성)
  • a =C b이면 b =C a (대칭성)
  • a =C b이고 b =C c이면 a =C c (전이성)
  • a <C b이고 b <C c이면 a <C c (전이성)
  • a >C b이고 b >C c이면 a >C c (전이성)
참고

위 조건들은 comparator가 집합 S를 동치류(equivalence class)로 나누고, 그 동치류들이 완전히 정렬됨을 보장하기 위한 필요충분조건입니다.

23.1.3.30.2 CompareArrayElements ( x, y, comparator )

추상 연산 CompareArrayElements는 인수 x(ECMAScript 언어 값), y(ECMAScript 언어 값), comparator(함수 객체 또는 undefined)를 받고, 아래와 같은 값을 담는 정상 완료 또는 abrupt 완료 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. xy가 모두 undefined이면 +0𝔽를 반환합니다.
  2. xundefined이면 1𝔽를 반환합니다.
  3. yundefined이면 -1𝔽를 반환합니다.
  4. comparatorundefined가 아니면,
    1. v를 ? ToNumber(? Call(comparator, undefined, « x, y »))로 설정합니다.
    2. vNaN이면 +0𝔽를 반환합니다.
    3. v를 반환합니다.
  5. xString를 ? ToString(x)로 설정합니다.
  6. yString를 ? ToString(y)로 설정합니다.
  7. xSmaller를 ! IsLessThan(xString, yString, true)로 설정합니다.
  8. xSmallertrue이면 -1𝔽를 반환합니다.
  9. ySmaller를 ! IsLessThan(yString, xString, true)로 설정합니다.
  10. ySmallertrue이면 1𝔽를 반환합니다.
  11. +0𝔽를 반환합니다.

23.1.3.31 Array.prototype.splice ( start, deleteCount, ...items )

참고 1

이 메서드는 배열에서 start 정수 인덱스부터 deleteCount개의 요소를 삭제하고, 그 위치에 items의 요소들을 대체합니다. 삭제된 요소들을 담은 배열(있는 경우)을 반환합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  4. relativeStart = -∞이면 actualStart를 0으로 설정합니다.
  5. 그 밖의 경우 relativeStart < 0이면 actualStartmax(len + relativeStart, 0)으로 설정합니다.
  6. 그 밖의 경우 actualStartmin(relativeStart, len)으로 설정합니다.
  7. itemCountitems의 요소 개수로 설정합니다.
  8. start가 제공되지 않으면,
    1. actualDeleteCount를 0으로 설정합니다.
  9. 그 밖의 경우 deleteCount가 제공되지 않으면,
    1. actualDeleteCountlen - actualStart로 설정합니다.
  10. 그 밖의 경우,
    1. dc를 ? ToIntegerOrInfinity(deleteCount)로 설정합니다.
    2. actualDeleteCount클램핑(clamping) 연산으로 dc를 0 과 len - actualStart 사이로 조정한 결과로 설정합니다.
  11. len + itemCount - actualDeleteCount > 253 - 1이면 TypeError 예외를 throw합니다.
  12. A를 ? ArraySpeciesCreate(O, actualDeleteCount)로 설정합니다.
  13. k를 0으로 설정합니다.
  14. k < actualDeleteCount인 동안 반복합니다,
    1. from을 ! ToString(𝔽(actualStart + k))로 설정합니다.
    2. HasProperty(O, from)이 true이면,
      1. fromValue를 ? Get(O, from)로 설정합니다.
      2. CreateDataPropertyOrThrow(A, ! ToString(𝔽(k)), fromValue)를 수행합니다.
    3. kk + 1로 설정합니다.
  15. Set(A, "length", 𝔽(actualDeleteCount), true)를 수행합니다.
  16. itemCount < actualDeleteCount이면,
    1. kactualStart로 설정합니다.
    2. k < (len - actualDeleteCount)인 동안 반복합니다,
      1. from을 ! ToString(𝔽(k + actualDeleteCount))로 설정합니다.
      2. to를 ! ToString(𝔽(k + itemCount))로 설정합니다.
      3. HasProperty(O, from)이 true이면,
        1. fromValue를 ? Get(O, from)로 설정합니다.
        2. Set(O, to, fromValue, true)를 수행합니다.
      4. 그 밖의 경우,
        1. DeletePropertyOrThrow(O, to)를 수행합니다.
      5. kk + 1로 설정합니다.
    3. klen으로 설정합니다.
    4. k > (len - actualDeleteCount + itemCount)인 동안 반복합니다,
      1. DeletePropertyOrThrow(O, ! ToString(𝔽(k - 1)))를 수행합니다.
      2. kk - 1로 설정합니다.
  17. 그 밖의 경우 itemCount > actualDeleteCount이면,
    1. k를 (len - actualDeleteCount)로 설정합니다.
    2. k > actualStart인 동안 반복합니다,
      1. from을 ! ToString(𝔽(k + actualDeleteCount - 1))로 설정합니다.
      2. to를 ! ToString(𝔽(k + itemCount - 1))로 설정합니다.
      3. HasProperty(O, from)이 true이면,
        1. fromValue를 ? Get(O, from)로 설정합니다.
        2. Set(O, to, fromValue, true)를 수행합니다.
      4. 그 밖의 경우,
        1. DeletePropertyOrThrow(O, to)를 수행합니다.
      5. kk - 1로 설정합니다.
  18. kactualStart로 설정합니다.
  19. items의 각 요소 E에 대해, 다음을 수행합니다:
    1. Set(O, ! ToString(𝔽(k)), E, true)를 수행합니다.
    2. kk + 1로 설정합니다.
  20. Set(O, "length", 𝔽(len - actualDeleteCount + itemCount), true)를 수행합니다.
  21. A를 반환합니다.
참고 2

단계 1520에서 "length" 프로퍼티를 명시적으로 설정하는 것은 객체가 내장 배열이 아닐 때에도 길이가 올바르게 되도록 보장하기 위함입니다.

참고 3

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.32 Array.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

ECMAScript 구현이 ECMA-402 국제화 API를 포함하는 경우, 이 메서드는 ECMA-402 명세에 따라 구현되어야 합니다. ECMAScript 구현이 ECMA-402 API를 포함하지 않는 경우 다음 명세가 사용됩니다.

참고 1

ECMA-402의 첫 번째 판에는 이 메서드의 대체 명세가 포함되지 않았습니다.

이 메서드의 선택적 파라미터의 의미는 ECMA-402 명세에서 정의되며, ECMA-402를 지원하지 않는 구현에서는 해당 파라미터 위치를 다른 용도로 사용해서는 안 됩니다.

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. array를 ? ToObject(this 값)으로 설정합니다.
  2. len을 ? LengthOfArrayLike(array)로 설정합니다.
  3. separator구현 정의 리스트 구분자 문자열 값(예: ", ")으로, 호스트 환경의 현재 로케일에 맞게 설정합니다.
  4. R을 빈 문자열로 설정합니다.
  5. k를 0으로 설정합니다.
  6. k < len인 동안 반복합니다,
    1. k > 0이면 RRseparator문자열 연결한 값으로 설정합니다.
    2. element를 ? Get(array, ! ToString(𝔽(k)))로 설정합니다.
    3. elementundefined도 아니고 null도 아니면,
      1. S를 ? ToString(? Invoke(element, "toLocaleString"))로 설정합니다.
      2. RRS문자열 연결한 값으로 설정합니다.
    4. kk + 1로 설정합니다.
  7. R을 반환합니다.
참고 2

이 메서드는 배열의 각 요소의 toLocaleString 메서드를 사용하여 문자열로 변환하고, 구현 정의 로케일 민감 구분자 문자열로 연결합니다. 이 메서드는 toString과 유사하지만, 호스트 환경의 현재 로케일 관습에 맞는 로케일 민감 결과를 생성하기 위함입니다.

참고 3

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.33 Array.prototype.toReversed ( )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len을 ? LengthOfArrayLike(O)로 설정합니다.
  3. A를 ? ArrayCreate(len)로 설정합니다.
  4. k를 0으로 설정합니다.
  5. k < len인 동안 반복합니다,
    1. from을 ! ToString(𝔽(len - k - 1))로 설정합니다.
    2. Pk를 ! ToString(𝔽(k))로 설정합니다.
    3. fromValue를 ? Get(O, from)로 설정합니다.
    4. CreateDataPropertyOrThrow(A, Pk, fromValue)를 수행합니다.
    5. kk + 1로 설정합니다.
  6. A를 반환합니다.

23.1.3.34 Array.prototype.toSorted ( comparator )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. comparatorundefined가 아니며 IsCallable(comparator)가 false이면 TypeError 예외를 throw합니다.
  2. O를 ? ToObject(this 값)으로 설정합니다.
  3. len을 ? LengthOfArrayLike(O)로 설정합니다.
  4. A를 ? ArrayCreate(len)로 설정합니다.
  5. SortCompare를 (x, y)를 매개변수로 하고 comparator를 캡처하는 새로운 Abstract Closure로 설정하며, 호출 시 다음을 수행합니다:
    1. CompareArrayElements(x, y, comparator)를 반환합니다.
  6. sortedList를 ? SortIndexedProperties(O, len, SortCompare, read-through-holes)로 설정합니다.
  7. j를 0으로 설정합니다.
  8. j < len인 동안 반복합니다,
    1. CreateDataPropertyOrThrow(A, ! ToString(𝔽(j)), sortedList[j])를 수행합니다.
    2. jj + 1로 설정합니다.
  9. A를 반환합니다.

23.1.3.35 Array.prototype.toSpliced ( start, skipCount, ...items )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  4. relativeStart = -∞이면 actualStart를 0으로 설정합니다.
  5. 그 밖의 경우 relativeStart < 0이면 actualStartmax(len + relativeStart, 0)으로 설정합니다.
  6. 그 밖의 경우 actualStartmin(relativeStart, len)으로 설정합니다.
  7. insertCountitems의 요소 개수로 설정합니다.
  8. start가 제공되지 않으면,
    1. actualSkipCount를 0으로 설정합니다.
  9. 그 밖의 경우 skipCount가 제공되지 않으면,
    1. actualSkipCountlen - actualStart로 설정합니다.
  10. 그 밖의 경우,
    1. sc를 ? ToIntegerOrInfinity(skipCount)로 설정합니다.
    2. actualSkipCount클램핑 연산으로 sc를 0과 len - actualStart 사이로 조정한 값으로 설정합니다.
  11. newLenlen + insertCount - actualSkipCount로 설정합니다.
  12. newLen > 253 - 1이면 TypeError 예외를 throw합니다.
  13. A를 ? ArrayCreate(newLen)로 설정합니다.
  14. i를 0으로 설정합니다.
  15. ractualStart + actualSkipCount로 설정합니다.
  16. i < actualStart인 동안 반복합니다,
    1. Pi를 ! ToString(𝔽(i))로 설정합니다.
    2. iValue를 ? Get(O, Pi)로 설정합니다.
    3. CreateDataPropertyOrThrow(A, Pi, iValue)를 수행합니다.
    4. ii + 1로 설정합니다.
  17. items의 각 요소 E에 대해, 다음을 수행합니다:
    1. Pi를 ! ToString(𝔽(i))로 설정합니다.
    2. CreateDataPropertyOrThrow(A, Pi, E)를 수행합니다.
    3. ii + 1로 설정합니다.
  18. i < newLen인 동안 반복합니다,
    1. Pi를 ! ToString(𝔽(i))로 설정합니다.
    2. from을 ! ToString(𝔽(r))로 설정합니다.
    3. fromValue를 ? Get(O, from)로 설정합니다.
    4. CreateDataPropertyOrThrow(A, Pi, fromValue)를 수행합니다.
    5. ii + 1로 설정합니다.
    6. rr + 1로 설정합니다.
  19. A를 반환합니다.

23.1.3.36 Array.prototype.toString ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. array를 ? ToObject(this 값)으로 설정합니다.
  2. func를 ? Get(array, "join")로 설정합니다.
  3. IsCallable(func)이 false이면 func를 내장 함수 %Object.prototype.toString%으로 설정합니다.
  4. Call(func, array)를 반환합니다.
참고

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.37 Array.prototype.unshift ( ...items )

이 메서드는 인수들을 배열의 시작 부분에 추가하며, 배열 내에서의 순서는 인수 목록에 나타나는 순서와 동일합니다.

호출 시 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. argCountitems의 요소 개수로 설정합니다.
  4. argCount > 0이면,
    1. len + argCount > 253 - 1이면 TypeError 예외를 throw합니다.
    2. klen으로 설정합니다.
    3. k > 0인 동안 반복합니다,
      1. from을 ! ToString(𝔽(k - 1))로 설정합니다.
      2. to를 ! ToString(𝔽(k + argCount - 1))로 설정합니다.
      3. fromPresent를 ? HasProperty(O, from)로 설정합니다.
      4. fromPresenttrue이면,
        1. fromValue를 ? Get(O, from)로 설정합니다.
        2. Set(O, to, fromValue, true)를 수행합니다.
      5. 그 밖의 경우,
        1. Assert: fromPresentfalse임을 확인합니다.
        2. DeletePropertyOrThrow(O, to)를 수행합니다.
      6. kk - 1로 설정합니다.
    4. j+0𝔽로 설정합니다.
    5. items의 각 요소 E에 대해 다음을 수행합니다:
      1. Set(O, ! ToString(j), E, true)를 수행합니다.
      2. jj + 1𝔽로 설정합니다.
  5. Set(O, "length", 𝔽(len + argCount), true)를 수행합니다.
  6. 𝔽(len + argCount)를 반환합니다.

이 메서드의 "length" 프로퍼티 값은 1𝔽입니다.

참고

이 메서드는 일부러 일반적으로 설계되었습니다. this 값이 반드시 배열일 필요는 없습니다. 따라서 다른 종류의 객체에 메서드로 전달하여 사용할 수 있습니다.

23.1.3.38 Array.prototype.values ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. CreateArrayIterator(O, value)를 반환합니다.

23.1.3.39 Array.prototype.with ( index, value )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. O를 ? ToObject(this 값)으로 설정합니다.
  2. len를 ? LengthOfArrayLike(O)로 설정합니다.
  3. relativeIndex를 ? ToIntegerOrInfinity(index)로 설정합니다.
  4. relativeIndex ≥ 0이면 actualIndexrelativeIndex로 설정합니다.
  5. 그 밖의 경우 actualIndexlen + relativeIndex로 설정합니다.
  6. actualIndexlen 또는 actualIndex < 0이면 RangeError 예외를 throw합니다.
  7. A를 ? ArrayCreate(len)로 설정합니다.
  8. k를 0으로 설정합니다.
  9. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. k = actualIndex이면 fromValuevalue로 설정합니다.
    3. 그 밖의 경우 fromValue를 ? Get(O, Pk)로 설정합니다.
    4. CreateDataPropertyOrThrow(A, Pk, fromValue)를 수행합니다.
    5. kk + 1로 설정합니다.
  10. A를 반환합니다.

23.1.3.40 Array.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% 프로퍼티의 초기 값은 23.1.3.38에서 정의된 %Array.prototype.values%입니다.

23.1.3.41 Array.prototype [ %Symbol.unscopables% ]

%Symbol.unscopables% 데이터 프로퍼티의 초기 값은 다음 단계로 생성된 객체입니다:

  1. unscopableListOrdinaryObjectCreate(null)로 설정합니다.
  2. CreateDataPropertyOrThrow(unscopableList, "at", true)를 수행합니다.
  3. CreateDataPropertyOrThrow(unscopableList, "copyWithin", true)를 수행합니다.
  4. CreateDataPropertyOrThrow(unscopableList, "entries", true)를 수행합니다.
  5. CreateDataPropertyOrThrow(unscopableList, "fill", true)를 수행합니다.
  6. CreateDataPropertyOrThrow(unscopableList, "find", true)를 수행합니다.
  7. CreateDataPropertyOrThrow(unscopableList, "findIndex", true)를 수행합니다.
  8. CreateDataPropertyOrThrow(unscopableList, "findLast", true)를 수행합니다.
  9. CreateDataPropertyOrThrow(unscopableList, "findLastIndex", true)를 수행합니다.
  10. CreateDataPropertyOrThrow(unscopableList, "flat", true)를 수행합니다.
  11. CreateDataPropertyOrThrow(unscopableList, "flatMap", true)를 수행합니다.
  12. CreateDataPropertyOrThrow(unscopableList, "includes", true)를 수행합니다.
  13. CreateDataPropertyOrThrow(unscopableList, "keys", true)를 수행합니다.
  14. CreateDataPropertyOrThrow(unscopableList, "toReversed", true)를 수행합니다.
  15. CreateDataPropertyOrThrow(unscopableList, "toSorted", true)를 수행합니다.
  16. CreateDataPropertyOrThrow(unscopableList, "toSpliced", true)를 수행합니다.
  17. CreateDataPropertyOrThrow(unscopableList, "values", true)를 수행합니다.
  18. unscopableList를 반환합니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

참고

이 객체의 자신의 프로퍼티 이름들은 ECMAScript 2015 명세 이전에 Array.prototype의 표준 프로퍼티로 포함되지 않았던 프로퍼티 이름입니다. 이러한 이름들은 with 문 바인딩에서 무시되어, 외부 스코프에서 해당 이름을 바인딩으로 사용하는 기존 코드의 동작을 보존하기 위해 with 문에서 바인딩 객체가 배열일 때 그림자(shadow) 처리됩니다.

"with"unscopableList에 포함되지 않는 이유는 이미 예약어이기 때문입니다.

23.1.4 배열 인스턴스의 속성

배열 인스턴스는 배열 이국 객체(Array exotic objects)이며, 해당 객체에 지정된 내부 메서드를 가집니다. 배열 인스턴스는 Array 프로토타입 객체로부터 프로퍼티를 상속받습니다.

배열 인스턴스는 "length" 프로퍼티와 배열 인덱스(array index) 이름을 가진 일련의 열거 가능한 프로퍼티를 가집니다.

23.1.4.1 length

배열 인스턴스의 "length" 프로퍼티는 데이터 프로퍼티로, 그 값은 항상 모든 구성 가능한 자신의 배열 인덱스(array index) 이름보다 숫자적으로 큽니다.

"length" 프로퍼티의 초기 속성은 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }입니다.

참고

"length" 프로퍼티 값을 줄이면 이전 값과 새 값 사이에 있는 자신의 배열 요소가 삭제됩니다. 단, 구성 불가능한 프로퍼티는 삭제할 수 없습니다. 배열의 "length" 프로퍼티를 기존의 구성 불가능한 배열 인덱스(array-indexed) 프로퍼티의 가장 큰 숫자 이름 이하의 값으로 설정하려고 하면, 길이는 해당 구성 불가능한 숫자 자신의 프로퍼티 이름보다 1 큰 숫자 값으로 설정됩니다. 자세한 내용은 10.4.2.1을 참조하세요.

23.1.5 배열 이터레이터 객체

배열 이터레이터(Array Iterator)는 특정 배열 인스턴스 객체에 대한 특정 반복(iteration)을 나타내는 객체입니다. 배열 이터레이터 객체에 대한 명명된 생성자(constructor)는 존재하지 않습니다. 대신, 배열 이터레이터 객체는 배열 인스턴스 객체의 특정 메서드를 호출하여 생성됩니다.

23.1.5.1 CreateArrayIterator ( array, kind )

추상 연산 CreateArrayIterator는 인수 array(객체)와 kind(key+value, key, 또는 value)를 받아 객체를 반환합니다. 이 연산은 해당 이터레이터 객체를 반환하는 배열 메서드에서 이터레이터 객체를 생성할 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:

  1. iteratorOrdinaryObjectCreate(%ArrayIteratorPrototype%, « [[IteratedArrayLike]], [[ArrayLikeNextIndex]], [[ArrayLikeIterationKind]] »)로 설정합니다.
  2. iterator.[[IteratedArrayLike]]array로 설정합니다.
  3. iterator.[[ArrayLikeNextIndex]]를 0으로 설정합니다.
  4. iterator.[[ArrayLikeIterationKind]]kind로 설정합니다.
  5. iterator를 반환합니다.

23.1.5.2 %ArrayIteratorPrototype% 객체

%ArrayIteratorPrototype% 객체:

23.1.5.2.1 %ArrayIteratorPrototype%.next ( )

  1. Othis 값으로 설정합니다.
  2. O객체가 아니면 TypeError 예외를 throw합니다.
  3. O배열 이터레이터 인스턴스의 모든 내부 슬롯을 가지고 있지 않으면 TypeError 예외를 throw합니다.
  4. arrayO.[[IteratedArrayLike]]로 설정합니다.
  5. arrayundefined이면 CreateIteratorResultObject(undefined, true)를 반환합니다.
  6. indexO.[[ArrayLikeNextIndex]]로 설정합니다.
  7. kindO.[[ArrayLikeIterationKind]]로 설정합니다.
  8. array[[TypedArrayName]] 내부 슬롯을 가지고 있다면,
    1. taRecordMakeTypedArrayWithBufferWitnessRecord(array, seq-cst)로 설정합니다.
    2. IsTypedArrayOutOfBounds(taRecord)가 true이면 TypeError 예외를 throw합니다.
    3. lenTypedArrayLength(taRecord)로 설정합니다.
  9. 그 밖의 경우,
    1. len를 ? LengthOfArrayLike(array)로 설정합니다.
  10. indexlen이면,
    1. O.[[IteratedArrayLike]]undefined로 설정합니다.
    2. CreateIteratorResultObject(undefined, true)를 반환합니다.
  11. O.[[ArrayLikeNextIndex]]index + 1로 설정합니다.
  12. indexNumber𝔽(index)로 설정합니다.
  13. kindkey이면,
    1. resultindexNumber로 설정합니다.
  14. 그 밖의 경우,
    1. elementKey를 ! ToString(indexNumber)로 설정합니다.
    2. elementValue를 ? Get(array, elementKey)로 설정합니다.
    3. kindvalue이면,
      1. resultelementValue로 설정합니다.
    4. 그 밖의 경우,
      1. Assert: kindkey+value임을 확인합니다.
      2. resultCreateArrayFromListindexNumber, elementValue »)로 설정합니다.
  15. CreateIteratorResultObject(result, false)를 반환합니다.

23.1.5.2.2 %ArrayIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "Array Iterator"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

23.1.5.3 배열 이터레이터 인스턴스의 속성

배열 이터레이터 인스턴스는 일반 객체이며, %ArrayIteratorPrototype% 내재 객체로부터 프로퍼티를 상속받습니다. 배열 이터레이터 인스턴스는 표 74에 나열된 내부 슬롯으로 초기화됩니다.

표 74: 배열 이터레이터 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[IteratedArrayLike]] 객체 또는 undefined 반복 중인 배열 유사 객체(array-like object) 입니다.
[[ArrayLikeNextIndex]] 0 이상의 정수 해당 이터레이터에서 다음으로 검사할 정수 인덱스입니다.
[[ArrayLikeIterationKind]] key+value, key, 또는 value 반복의 각 요소에 대해 반환되는 값을 식별하는 값입니다.

23.2 TypedArray 객체

TypedArray는 기본 이진 데이터 버퍼(25.1)에 대한 배열 유사 뷰를 제공합니다. TypedArray 요소 타입TypedArray 인스턴스의 모든 요소가 가지는 기본 이진 스칼라 데이터 타입입니다. 지원되는 각 요소 타입마다 생성자가 별도로 존재하며, 이는 표 75에 나열되어 있습니다. 표 75의 각 생성자마다 별도의 프로토타입 객체가 존재합니다.

표 75: TypedArray 생성자들
생성자 이름 및 내재 객체 요소 타입 요소 크기 변환 연산 설명
Int8Array
%Int8Array%
int8 1 ToInt8 8비트 2의 보수 부호 있는 정수
Uint8Array
%Uint8Array%
uint8 1 ToUint8 8비트 부호 없는 정수
Uint8ClampedArray
%Uint8ClampedArray%
uint8clamped 1 ToUint8Clamp 8비트 부호 없는 정수 (클램프 변환)
Int16Array
%Int16Array%
int16 2 ToInt16 16비트 2의 보수 부호 있는 정수
Uint16Array
%Uint16Array%
uint16 2 ToUint16 16비트 부호 없는 정수
Int32Array
%Int32Array%
int32 4 ToInt32 32비트 2의 보수 부호 있는 정수
Uint32Array
%Uint32Array%
uint32 4 ToUint32 32비트 부호 없는 정수
BigInt64Array
%BigInt64Array%
bigint64 8 ToBigInt64 64비트 2의 보수 부호 있는 정수
BigUint64Array
%BigUint64Array%
biguint64 8 ToBigUint64 64비트 부호 없는 정수
Float16Array
%Float16Array%
float16 2 16비트 IEEE 부동 소수점
Float32Array
%Float32Array%
float32 4 32비트 IEEE 부동 소수점
Float64Array
%Float64Array%
float64 8 64비트 IEEE 부동 소수점

아래 정의에서 TypedArray라는 참조는 위 표에서 해당되는 생성자 이름으로 치환되어야 합니다.

23.2.1 %TypedArray% 내재 객체

%TypedArray% 내재 객체:

  • 모든 TypedArray 생성자 객체가 상속하는 함수 객체 생성자입니다.
  • 해당 프로토타입 객체와 함께, 모든 TypedArray 생성자와 그 인스턴스가 상속하는 공통 프로퍼티를 제공합니다.
  • 전역 객체의 프로퍼티로 나타나거나 전역 이름을 가지지 않습니다.
  • 다양한 TypedArray 생성자의 추상 상위 클래스 역할을 합니다.
  • 추상 클래스 생성자이므로 호출 시 오류를 throw합니다. TypedArray 생성자들은 super 호출을 수행하지 않습니다.

23.2.1.1 %TypedArray% ( )

이 함수는 호출될 때 다음 단계들을 수행합니다:

  1. TypeError 예외를 throw합니다.

이 함수의 "length" 프로퍼티 값은 +0𝔽입니다.

23.2.2 %TypedArray% 내재 객체의 속성

%TypedArray% 내재 객체:

  • [[Prototype]] 내부 슬롯의 값은 %Function.prototype%입니다.
  • "name" 프로퍼티의 값은 "TypedArray"입니다.
  • 다음 프로퍼티를 가집니다:

23.2.2.1 %TypedArray%.from ( source [ , mapper [ , thisArg ] ] )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Cthis 값으로 설정합니다.
  2. IsConstructor(C)가 false이면 TypeError 예외를 throw합니다.
  3. mapperundefined이면,
    1. mappingfalse로 설정합니다.
  4. 그 밖의 경우,
    1. IsCallable(mapper) 가 false이면 TypeError 예외를 throw합니다.
    2. mappingtrue로 설정합니다.
  5. usingIterator를 ? GetMethod(source, %Symbol.iterator%)로 설정합니다.
  6. usingIteratorundefined가 아니면,
    1. values를 ? IteratorToList(? GetIteratorFromMethod(source, usingIterator))로 설정합니다.
    2. lenvalues의 요소 개수로 설정합니다.
    3. targetObj를 ? TypedArrayCreateFromConstructor(C, « 𝔽(len) »)로 설정합니다.
    4. k를 0으로 설정합니다.
    5. k < len인 동안 반복합니다,
      1. Pk를 ! ToString(𝔽(k))로 설정합니다.
      2. kValuevalues의 첫 번째 요소로 설정합니다.
      3. values의 첫 번째 요소를 제거합니다.
      4. mappingtrue이면,
        1. mappedValue를 ? Call(mapper, thisArg, « kValue, 𝔽(k) »)로 설정합니다.
      5. 그 밖의 경우,
        1. mappedValuekValue로 설정합니다.
      6. Set(targetObj, Pk, mappedValue, true)를 수행합니다.
      7. kk + 1로 설정합니다.
    6. Assert: values는 이제 빈 List입니다.
    7. targetObj를 반환합니다.
  7. 참고: sourceiterable 객체가 아니므로, 이미 배열 유사 객체라고 가정합니다.
  8. arrayLike를 ! ToObject(source)로 설정합니다.
  9. len를 ? LengthOfArrayLike(arrayLike)로 설정합니다.
  10. targetObj를 ? TypedArrayCreateFromConstructor(C, « 𝔽(len) »)로 설정합니다.
  11. k를 0으로 설정합니다.
  12. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValue를 ? Get(arrayLike, Pk)로 설정합니다.
    3. mappingtrue이면,
      1. mappedValue를 ? Call(mapper, thisArg, « kValue, 𝔽(k) »)로 설정합니다.
    4. 그 밖의 경우,
      1. mappedValuekValue로 설정합니다.
    5. Set(targetObj, Pk, mappedValue, true)를 수행합니다.
    6. kk + 1로 설정합니다.
  13. targetObj를 반환합니다.

23.2.2.2 %TypedArray%.of ( ...items )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. lenitems의 요소 개수로 설정합니다.
  2. Cthis 값으로 설정합니다.
  3. IsConstructor(C)가 false이면 TypeError 예외를 throw합니다.
  4. newObj를 ? TypedArrayCreateFromConstructor(C, « 𝔽(len) »)로 설정합니다.
  5. k를 0으로 설정합니다.
  6. k < len인 동안 반복합니다,
    1. kValueitems[k]로 설정합니다.
    2. Pk를 ! ToString(𝔽(k))로 설정합니다.
    3. Set(newObj, Pk, kValue, true)를 수행합니다.
    4. kk + 1로 설정합니다.
  7. newObj를 반환합니다.

23.2.2.3 %TypedArray%.prototype

%TypedArray%.prototype 의 초기 값은 %TypedArray% 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

23.2.2.4 get %TypedArray% [ %Symbol.species% ]

%TypedArray%[%Symbol.species%]접근자 프로퍼티(accessor property)로, set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]"입니다.

참고

%TypedArray.prototype% 메서드는 일반적으로 this 값의 생성자를 사용해 파생 객체를 생성합니다. 하지만 서브클래스 생성자%Symbol.species% 프로퍼티를 재정의하여 기본 동작을 오버라이드할 수 있습니다.

23.2.3 %TypedArray% 프로토타입 객체의 속성

%TypedArray% 프로토타입 객체:

  • [[Prototype]] 내부 슬롯의 값은 %Object.prototype%입니다.
  • %TypedArray.prototype%입니다.
  • 일반 객체입니다.
  • TypedArray 인스턴스 객체에만 특정한 [[ViewedArrayBuffer]]나 기타 내부 슬롯을 가지지 않습니다.

23.2.3.1 %TypedArray%.prototype.at ( index )

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. relativeIndex를 ? ToIntegerOrInfinity(index)로 설정합니다.
  5. relativeIndex ≥ 0이면,
    1. krelativeIndex로 설정합니다.
  6. 그 밖의 경우,
    1. klen + relativeIndex로 설정합니다.
  7. k < 0 또는 klen이면 undefined를 반환합니다.
  8. Get(O, ! ToString(𝔽(k)))를 반환합니다.

23.2.3.2 get %TypedArray%.prototype.buffer

%TypedArray%.prototype.buffer접근자 프로퍼티이며, set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[TypedArrayName]])를 수행합니다.
  3. Assert: O[[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
  4. bufferO.[[ViewedArrayBuffer]]로 설정합니다.
  5. buffer를 반환합니다.

23.2.3.3 get %TypedArray%.prototype.byteLength

%TypedArray%.prototype.byteLength접근자 프로퍼티이며, set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[TypedArrayName]])를 수행합니다.
  3. Assert: O[[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)로 설정합니다.
  5. sizeTypedArrayByteLength(taRecord)로 설정합니다.
  6. 𝔽(size)를 반환합니다.

23.2.3.4 get %TypedArray%.prototype.byteOffset

%TypedArray%.prototype.byteOffset접근자 프로퍼티이며, set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[TypedArrayName]])를 수행합니다.
  3. Assert: O[[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)로 설정합니다.
  5. IsTypedArrayOutOfBounds(taRecord) 가 true이면 +0𝔽를 반환합니다.
  6. offsetO.[[ByteOffset]]로 설정합니다.
  7. 𝔽(offset)을 반환합니다.

23.2.3.5 %TypedArray%.prototype.constructor

%TypedArray%.prototype.constructor 의 초기 값은 %TypedArray%입니다.

23.2.3.6 %TypedArray%.prototype.copyWithin ( target, start [ , end ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.4에 정의된 Array.prototype.copyWithin과 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. relativeTarget를 ? ToIntegerOrInfinity(target)로 설정합니다.
  5. relativeTarget = -∞이면 targetIndex를 0으로 설정합니다.
  6. 그 밖의 경우 relativeTarget < 0이면 targetIndexmax(len + relativeTarget, 0)으로 설정합니다.
  7. 그 밖의 경우 targetIndexmin(relativeTarget, len)로 설정합니다.
  8. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  9. relativeStart = -∞이면 startIndex를 0으로 설정합니다.
  10. 그 밖의 경우 relativeStart < 0이면 startIndexmax(len + relativeStart, 0)으로 설정합니다.
  11. 그 밖의 경우 startIndexmin(relativeStart, len)로 설정합니다.
  12. endundefined이면 relativeEndlen으로 설정하고, 아니면 relativeEnd를 ? ToIntegerOrInfinity(end)로 설정합니다.
  13. relativeEnd = -∞이면 endIndex를 0으로 설정합니다.
  14. 그 밖의 경우 relativeEnd < 0이면 endIndexmax(len + relativeEnd, 0)으로 설정합니다.
  15. 그 밖의 경우 endIndexmin(relativeEnd, len)로 설정합니다.
  16. countmin(endIndex - startIndex, len - targetIndex)로 설정합니다.
  17. count > 0이면,
    1. 참고: 복사는 소스 데이터의 비트 레벨 인코딩을 보존하는 방식으로 수행되어야 합니다.
    2. bufferO.[[ViewedArrayBuffer]]로 설정합니다.
    3. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)로 설정합니다.
    4. IsTypedArrayOutOfBounds(taRecord) 가 true이면 TypeError 예외를 throw합니다.
    5. lenTypedArrayLength(taRecord)로 설정합니다.
    6. elementSizeTypedArrayElementSize(O)로 설정합니다.
    7. byteOffsetO.[[ByteOffset]]로 설정합니다.
    8. bufferByteLimit을 (len × elementSize) + byteOffset로 설정합니다.
    9. toByteIndex를 (targetIndex × elementSize) + byteOffset로 설정합니다.
    10. fromByteIndex를 (startIndex × elementSize) + byteOffset로 설정합니다.
    11. countBytescount × elementSize로 설정합니다.
    12. fromByteIndex < toByteIndex이고 toByteIndex < fromByteIndex + countBytes이면,
      1. direction을 -1로 설정합니다.
      2. fromByteIndexfromByteIndex + countBytes - 1로 설정합니다.
      3. toByteIndextoByteIndex + countBytes - 1로 설정합니다.
    13. 그 밖의 경우,
      1. direction을 1로 설정합니다.
    14. countBytes > 0인 동안 반복합니다,
      1. fromByteIndex < bufferByteLimit이고 toByteIndex < bufferByteLimit이면,
        1. valueGetValueFromBuffer(buffer, fromByteIndex, uint8, true, unordered)로 설정합니다.
        2. SetValueInBuffer(buffer, toByteIndex, uint8, value, true, unordered)를 수행합니다.
        3. fromByteIndexfromByteIndex + direction로 설정합니다.
        4. toByteIndextoByteIndex + direction로 설정합니다.
        5. countBytescountBytes - 1로 설정합니다.
      2. 그 밖의 경우,
        1. countBytes를 0으로 설정합니다.
  18. O를 반환합니다.

23.2.3.7 %TypedArray%.prototype.entries ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. ValidateTypedArray(O, seq-cst)를 수행합니다.
  3. CreateArrayIterator(O, key+value)를 반환합니다.

23.2.3.8 %TypedArray%.prototype.every ( callback [ , thisArg ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.6에 정의된 Array.prototype.every와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. IsCallable(callback)가 false이면 TypeError 예외를 throw합니다.
  5. k를 0으로 설정합니다.
  6. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValue를 ! Get(O, Pk)로 설정합니다.
    3. testResultToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))로 설정합니다.
    4. testResultfalse이면 false를 반환합니다.
    5. kk + 1로 설정합니다.
  7. true를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.9 %TypedArray%.prototype.fill ( value [ , start [ , end ] ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.7에 정의된 Array.prototype.fill과 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. O.[[ContentType]]bigint이면, value를 ? ToBigInt(value)로 설정합니다.
  5. 그 밖의 경우, value를 ? ToNumber(value)로 설정합니다.
  6. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  7. relativeStart = -∞이면 startIndex를 0으로 설정합니다.
  8. 그 밖의 경우 relativeStart < 0이면 startIndexmax(len + relativeStart, 0)으로 설정합니다.
  9. 그 밖의 경우 startIndexmin(relativeStart, len)로 설정합니다.
  10. endundefined이면 relativeEndlen으로 설정하고, 아니면 relativeEnd를 ? ToIntegerOrInfinity(end)로 설정합니다.
  11. relativeEnd = -∞이면 endIndex를 0으로 설정합니다.
  12. 그 밖의 경우 relativeEnd < 0이면 endIndexmax(len + relativeEnd, 0)으로 설정합니다.
  13. 그 밖의 경우 endIndexmin(relativeEnd, len)로 설정합니다.
  14. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)로 설정합니다.
  15. IsTypedArrayOutOfBounds(taRecord) 가 true이면 TypeError 예외를 throw합니다.
  16. lenTypedArrayLength(taRecord)로 설정합니다.
  17. endIndexmin(endIndex, len)로 설정합니다.
  18. kstartIndex로 설정합니다.
  19. k < endIndex인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. Set(O, Pk, value, true)를 수행합니다.
    3. kk + 1로 설정합니다.
  20. O를 반환합니다.

23.2.3.10 %TypedArray%.prototype.filter ( callback [ , thisArg ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.8에 정의된 Array.prototype.filter과 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. IsCallable(callback)가 false이면 TypeError 예외를 throw합니다.
  5. kept를 새로운 빈 List로 설정합니다.
  6. captured를 0으로 설정합니다.
  7. k를 0으로 설정합니다.
  8. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValue를 ! Get(O, Pk)로 설정합니다.
    3. selectedToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))로 설정합니다.
    4. selectedtrue이면,
      1. kValuekept에 추가합니다.
      2. capturedcaptured + 1로 설정합니다.
    5. kk + 1로 설정합니다.
  9. A를 ? TypedArraySpeciesCreate(O, « 𝔽(captured) »)로 설정합니다.
  10. n을 0으로 설정합니다.
  11. kept의 각 요소 e에 대해 다음을 수행합니다,
    1. Set(A, ! ToString(𝔽(n)), e, true)를 수행합니다.
    2. nn + 1로 설정합니다.
  12. A를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.11 %TypedArray%.prototype.find ( predicate [ , thisArg ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.9에 정의된 Array.prototype.find와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. findRec를 ? FindViaPredicate(O, len, ascending, predicate, thisArg)로 설정합니다.
  5. findRec.[[Value]]를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.12 %TypedArray%.prototype.findIndex ( predicate [ , thisArg ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.10에 정의된 Array.prototype.findIndex와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. findRec를 ? FindViaPredicate(O, len, ascending, predicate, thisArg)로 설정합니다.
  5. findRec.[[Index]]를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.13 %TypedArray%.prototype.findLast ( predicate [ , thisArg ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.11에 정의된 Array.prototype.findLast와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. findRec를 ? FindViaPredicate(O, len, descending, predicate, thisArg)로 설정합니다.
  5. findRec.[[Value]]를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.14 %TypedArray%.prototype.findLastIndex ( predicate [ , thisArg ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.12에 정의된 Array.prototype.findLastIndex와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. findRec를 ? FindViaPredicate(O, len, descending, predicate, thisArg)로 설정합니다.
  5. findRec.[[Index]]를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.15 %TypedArray%.prototype.forEach ( callback [ , thisArg ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.15에 정의된 Array.prototype.forEach와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. IsCallable(callback)가 false이면 TypeError 예외를 throw합니다.
  5. k를 0으로 설정합니다.
  6. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValue를 ! Get(O, Pk)로 설정합니다.
    3. Call(callback, thisArg, « kValue, 𝔽(k), O »)를 수행합니다.
    4. kk + 1로 설정합니다.
  7. undefined를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.16 %TypedArray%.prototype.includes ( searchElement [ , fromIndex ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.16에 정의된 Array.prototype.includes와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. len = 0이면 false를 반환합니다.
  5. n를 ? ToIntegerOrInfinity(fromIndex)로 설정합니다.
  6. Assert: fromIndexundefined이면 n은 0입니다.
  7. n = +∞이면 false를 반환합니다.
  8. 그 밖의 경우 n = -∞이면 n를 0으로 설정합니다.
  9. n ≥ 0이면,
    1. kn으로 설정합니다.
  10. 그 밖의 경우,
    1. klen + n으로 설정합니다.
    2. k < 0이면 k를 0으로 설정합니다.
  11. k < len인 동안 반복합니다,
    1. elementK를 ! Get(O, ! ToString(𝔽(k)))로 설정합니다.
    2. SameValueZero(searchElement, elementK)가 true이면 true를 반환합니다.
    3. kk + 1로 설정합니다.
  12. false를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.17 %TypedArray%.prototype.indexOf ( searchElement [ , fromIndex ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.17에 정의된 Array.prototype.indexOf와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. len = 0이면 -1𝔽를 반환합니다.
  5. n를 ? ToIntegerOrInfinity(fromIndex)로 설정합니다.
  6. Assert: fromIndexundefined이면 n은 0입니다.
  7. n = +∞이면 -1𝔽를 반환합니다.
  8. 그 밖의 경우 n = -∞이면 n를 0으로 설정합니다.
  9. n ≥ 0이면,
    1. kn으로 설정합니다.
  10. 그 밖의 경우,
    1. klen + n으로 설정합니다.
    2. k < 0이면 k를 0으로 설정합니다.
  11. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ! HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. elementK를 ! Get(O, Pk)로 설정합니다.
      2. IsStrictlyEqual(searchElement, elementK)가 true이면 𝔽(k)를 반환합니다.
    4. kk + 1로 설정합니다.
  12. -1𝔽를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.18 %TypedArray%.prototype.join ( separator )

이 메서드의 인수 해석 및 사용법은 23.1.3.18에 정의된 Array.prototype.join과 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. separatorundefined이면 sep","로 설정합니다.
  5. 그 밖의 경우, sep를 ? ToString(separator)로 설정합니다.
  6. R을 빈 문자열로 설정합니다.
  7. k를 0으로 설정합니다.
  8. k < len인 동안 반복합니다,
    1. k > 0이면 RRsep문자열 연결한 값으로 설정합니다.
    2. element를 ! Get(O, ! ToString(𝔽(k)))로 설정합니다.
    3. elementundefined가 아니면,
      1. S를 ! ToString(element)로 설정합니다.
      2. RRS문자열 연결한 값으로 설정합니다.
    4. kk + 1로 설정합니다.
  9. R을 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.19 %TypedArray%.prototype.keys ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. ValidateTypedArray(O, seq-cst)를 수행합니다.
  3. CreateArrayIterator(O, key)를 반환합니다.

23.2.3.20 %TypedArray%.prototype.lastIndexOf ( searchElement [ , fromIndex ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.20에 정의된 Array.prototype.lastIndexOf와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. len = 0이면 -1𝔽를 반환합니다.
  5. fromIndex가 제공되면 n를 ? ToIntegerOrInfinity(fromIndex)로 설정하고, 아니라면 nlen - 1로 설정합니다.
  6. n = -∞이면 -1𝔽를 반환합니다.
  7. n ≥ 0이면,
    1. kmin(n, len - 1)로 설정합니다.
  8. 그 밖의 경우,
    1. klen + n으로 설정합니다.
  9. k ≥ 0인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kPresent를 ! HasProperty(O, Pk)로 설정합니다.
    3. kPresenttrue이면,
      1. elementK를 ! Get(O, Pk)로 설정합니다.
      2. IsStrictlyEqual(searchElement, elementK)가 true이면 𝔽(k)를 반환합니다.
    4. kk - 1로 설정합니다.
  10. -1𝔽를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.21 get %TypedArray%.prototype.length

%TypedArray%.prototype.length접근자 프로퍼티이며, set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[TypedArrayName]])를 수행합니다.
  3. Assert: O[[ViewedArrayBuffer]][[ArrayLength]] 내부 슬롯을 가집니다.
  4. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)로 설정합니다.
  5. IsTypedArrayOutOfBounds(taRecord) 가 true이면 +0𝔽를 반환합니다.
  6. lengthTypedArrayLength(taRecord)로 설정합니다.
  7. 𝔽(length)를 반환합니다.

이 함수는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.22 %TypedArray%.prototype.map ( callback [ , thisArg ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.21에 정의된 Array.prototype.map과 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. IsCallable(callback)가 false이면 TypeError 예외를 throw합니다.
  5. A를 ? TypedArraySpeciesCreate(O, « 𝔽(len) »)로 설정합니다.
  6. k를 0으로 설정합니다.
  7. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValue를 ! Get(O, Pk)로 설정합니다.
    3. mappedValue를 ? Call(callback, thisArg, « kValue, 𝔽(k), O »)로 설정합니다.
    4. Set(A, Pk, mappedValue, true)를 수행합니다.
    5. kk + 1로 설정합니다.
  8. A를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.23 %TypedArray%.prototype.reduce ( callback [ , initialValue ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.24에 정의된 Array.prototype.reduce와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. IsCallable(callback)가 false이면 TypeError 예외를 throw합니다.
  5. len = 0이고 initialValue가 제공되지 않으면 TypeError 예외를 throw합니다.
  6. k를 0으로 설정합니다.
  7. accumulatorundefined로 설정합니다.
  8. initialValue가 제공되면,
    1. accumulatorinitialValue로 설정합니다.
  9. 그 밖의 경우,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. accumulator를 ! Get(O, Pk)로 설정합니다.
    3. kk + 1로 설정합니다.
  10. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValue를 ! Get(O, Pk)로 설정합니다.
    3. accumulator를 ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)로 설정합니다.
    4. kk + 1로 설정합니다.
  11. accumulator를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.24 %TypedArray%.prototype.reduceRight ( callback [ , initialValue ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.25에 정의된 Array.prototype.reduceRight와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. IsCallable(callback)가 false이면 TypeError 예외를 throw합니다.
  5. len = 0이고 initialValue가 제공되지 않으면 TypeError 예외를 throw합니다.
  6. klen - 1로 설정합니다.
  7. accumulatorundefined로 설정합니다.
  8. initialValue가 제공되면,
    1. accumulatorinitialValue로 설정합니다.
  9. 그 밖의 경우,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. accumulator를 ! Get(O, Pk)로 설정합니다.
    3. kk - 1로 설정합니다.
  10. k ≥ 0인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValue를 ! Get(O, Pk)로 설정합니다.
    3. accumulator를 ? Call(callback, undefined, « accumulator, kValue, 𝔽(k), O »)로 설정합니다.
    4. kk - 1로 설정합니다.
  11. accumulator를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.25 %TypedArray%.prototype.reverse ( )

이 메서드의 인수 해석 및 사용법은 23.1.3.26에 정의된 Array.prototype.reverse와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. middlefloor(len / 2)로 설정합니다.
  5. lower를 0으로 설정합니다.
  6. lowermiddle인 동안 반복합니다,
    1. upperlen - lower - 1로 설정합니다.
    2. upperP를 ! ToString(𝔽(upper))로 설정합니다.
    3. lowerP를 ! ToString(𝔽(lower))로 설정합니다.
    4. lowerValue를 ! Get(O, lowerP)로 설정합니다.
    5. upperValue를 ! Get(O, upperP)로 설정합니다.
    6. Set(O, lowerP, upperValue, true)를 수행합니다.
    7. Set(O, upperP, lowerValue, true)를 수행합니다.
    8. lowerlower + 1로 설정합니다.
  7. O를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.26 %TypedArray%.prototype.set ( source [ , offset ] )

이 메서드는 이 TypedArray의 여러 값을 source에서 값을 읽어 설정합니다. 상세 동작은 source의 타입에 따라 다릅니다. 선택적 offset 값은 이 TypedArray에 값을 쓸 첫 번째 요소 인덱스를 의미합니다. 생략된 경우 0으로 간주됩니다.

호출 시 다음 단계들을 수행합니다:

  1. targetthis 값으로 설정합니다.
  2. RequireInternalSlot(target, [[TypedArrayName]])를 수행합니다.
  3. Assert: target[[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
  4. targetOffset를 ? ToIntegerOrInfinity(offset)로 설정합니다.
  5. targetOffset < 0이면 RangeError 예외를 throw합니다.
  6. source객체이고 [[TypedArrayName]] 내부 슬롯을 가지면,
    1. SetTypedArrayFromTypedArray(target, targetOffset, source)를 수행합니다.
  7. 그 밖의 경우,
    1. SetTypedArrayFromArrayLike(target, targetOffset, source)를 수행합니다.
  8. undefined를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.26.1 SetTypedArrayFromArrayLike ( target, targetOffset, source )

추상 연산 SetTypedArrayFromArrayLike는 인수 target (a TypedArray), targetOffset (0 이상의 정수 또는 +∞), source (ECMAScript 언어 값, 단 TypedArray는 아님)를 받고 내용이 unused인 일반 완료(normal completion) 또는 throw 완료를 반환합니다. targettargetOffset 인덱스부터 source에서 값을 읽어 여러 값을 설정합니다. 호출 시 다음 단계들을 수행합니다:

  1. targetRecordMakeTypedArrayWithBufferWitnessRecord(target, seq-cst)로 설정합니다.
  2. IsTypedArrayOutOfBounds(targetRecord) 가 true이면 TypeError 예외를 throw합니다.
  3. targetLengthTypedArrayLength(targetRecord)로 설정합니다.
  4. src를 ? ToObject(source)로 설정합니다.
  5. srcLength를 ? LengthOfArrayLike(src)로 설정합니다.
  6. targetOffset = +∞이면 RangeError 예외를 throw합니다.
  7. srcLength + targetOffset > targetLength이면, RangeError 예외를 throw합니다.
  8. k를 0으로 설정합니다.
  9. k < srcLength인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. value를 ? Get(src, Pk)로 설정합니다.
    3. targetIndex𝔽(targetOffset + k)로 설정합니다.
    4. TypedArraySetElement(target, targetIndex, value)를 수행합니다.
    5. kk + 1로 설정합니다.
  10. unused를 반환합니다.

23.2.3.26.2 SetTypedArrayFromTypedArray ( target, targetOffset, source )

추상 연산 SetTypedArrayFromTypedArray는 인수 target (TypedArray), targetOffset (0 이상의 정수 또는 +∞), source (TypedArray)를 받고 내용이 unused인 일반 완료(normal completion) 또는 throw 완료를 반환합니다. targettargetOffset 인덱스부터 source에서 값을 읽어 여러 값을 설정합니다. 호출 시 다음 단계들을 수행합니다:

  1. targetBuffertarget.[[ViewedArrayBuffer]]로 설정합니다.
  2. targetRecordMakeTypedArrayWithBufferWitnessRecord(target, seq-cst)로 설정합니다.
  3. IsTypedArrayOutOfBounds(targetRecord) 가 true이면 TypeError 예외를 throw합니다.
  4. targetLengthTypedArrayLength(targetRecord)로 설정합니다.
  5. srcBuffersource.[[ViewedArrayBuffer]]로 설정합니다.
  6. srcRecordMakeTypedArrayWithBufferWitnessRecord(source, seq-cst)로 설정합니다.
  7. IsTypedArrayOutOfBounds(srcRecord) 가 true이면 TypeError 예외를 throw합니다.
  8. srcLengthTypedArrayLength(srcRecord)로 설정합니다.
  9. targetTypeTypedArrayElementType(target)로 설정합니다.
  10. targetElementSizeTypedArrayElementSize(target)로 설정합니다.
  11. targetByteOffsettarget.[[ByteOffset]]로 설정합니다.
  12. srcTypeTypedArrayElementType(source)로 설정합니다.
  13. srcElementSizeTypedArrayElementSize(source)로 설정합니다.
  14. srcByteOffsetsource.[[ByteOffset]]로 설정합니다.
  15. targetOffset = +∞이면 RangeError 예외를 throw합니다.
  16. srcLength + targetOffset > targetLength이면, RangeError 예외를 throw합니다.
  17. target.[[ContentType]]source.[[ContentType]]과 다르면 TypeError 예외를 throw합니다.
  18. IsSharedArrayBuffer(srcBuffer) 가 true, IsSharedArrayBuffer(targetBuffer) 가 true이고 srcBuffer.[[ArrayBufferData]]targetBuffer.[[ArrayBufferData]]와 같으면 sameSharedArrayBuffertrue로, 그렇지 않으면 sameSharedArrayBufferfalse로 설정합니다.
  19. SameValue(srcBuffer, targetBuffer)가 true이거나 sameSharedArrayBuffertrue이면,
    1. srcByteLengthTypedArrayByteLength(srcRecord)로 설정합니다.
    2. srcBuffer를 ? CloneArrayBuffer(srcBuffer, srcByteOffset, srcByteLength)로 설정합니다.
    3. srcByteIndex를 0으로 설정합니다.
  20. 그 밖의 경우,
    1. srcByteIndexsrcByteOffset으로 설정합니다.
  21. targetByteIndex를 (targetOffset × targetElementSize) + targetByteOffset로 설정합니다.
  22. limittargetByteIndex + (targetElementSize × srcLength)로 설정합니다.
  23. srcTypetargetType이면,
    1. 참고: 전달은 소스 데이터의 비트 단위 인코딩을 보존하는 방식으로 수행되어야 합니다.
    2. targetByteIndex < limit인 동안 반복합니다,
      1. valueGetValueFromBuffer(srcBuffer, srcByteIndex, uint8, true, unordered)로 설정합니다.
      2. SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered)를 수행합니다.
      3. srcByteIndexsrcByteIndex + 1로 설정합니다.
      4. targetByteIndextargetByteIndex + 1로 설정합니다.
  24. 그 밖의 경우,
    1. targetByteIndex < limit인 동안 반복합니다,
      1. valueGetValueFromBuffer(srcBuffer, srcByteIndex, srcType, true, unordered)로 설정합니다.
      2. SetValueInBuffer(targetBuffer, targetByteIndex, targetType, value, true, unordered)를 수행합니다.
      3. srcByteIndexsrcByteIndex + srcElementSize로 설정합니다.
      4. targetByteIndextargetByteIndex + targetElementSize로 설정합니다.
  25. unused를 반환합니다.

23.2.3.27 %TypedArray%.prototype.slice ( start, end )

이 메서드의 인수 해석 및 사용법은 23.1.3.28에 정의된 Array.prototype.slice와 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. srcArrayLengthTypedArrayLength(taRecord)로 설정합니다.
  4. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  5. relativeStart = -∞이면 startIndex를 0으로 설정합니다.
  6. 그 밖의 경우 relativeStart < 0이면 startIndexmax(srcArrayLength + relativeStart, 0)으로 설정합니다.
  7. 그 밖의 경우 startIndexmin(relativeStart, srcArrayLength)로 설정합니다.
  8. endundefined이면 relativeEndsrcArrayLength로 설정하고, 아니면 relativeEnd를 ? ToIntegerOrInfinity(end)로 설정합니다.
  9. relativeEnd = -∞이면 endIndex를 0으로 설정합니다.
  10. 그 밖의 경우 relativeEnd < 0이면 endIndexmax(srcArrayLength + relativeEnd, 0)으로 설정합니다.
  11. 그 밖의 경우 endIndexmin(relativeEnd, srcArrayLength)로 설정합니다.
  12. countBytesmax(endIndex - startIndex, 0)로 설정합니다.
  13. A를 ? TypedArraySpeciesCreate(O, « 𝔽(countBytes) »)로 설정합니다.
  14. countBytes > 0이면,
    1. taRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)로 설정합니다.
    2. IsTypedArrayOutOfBounds(taRecord) 가 true이면 TypeError 예외를 throw합니다.
    3. endIndexmin(endIndex, TypedArrayLength(taRecord))로 설정합니다.
    4. countBytesmax(endIndex - startIndex, 0)로 설정합니다.
    5. srcTypeTypedArrayElementType(O)로 설정합니다.
    6. targetTypeTypedArrayElementType(A)로 설정합니다.
    7. srcTypetargetType이면,
      1. 참고: 전달은 소스 데이터의 비트 단위 인코딩을 보존하는 방식으로 수행되어야 합니다.
      2. srcBufferO.[[ViewedArrayBuffer]]로 설정합니다.
      3. targetBufferA.[[ViewedArrayBuffer]]로 설정합니다.
      4. elementSizeTypedArrayElementSize(O)로 설정합니다.
      5. srcByteOffsetO.[[ByteOffset]]로 설정합니다.
      6. srcByteIndex를 (startIndex × elementSize) + srcByteOffset로 설정합니다.
      7. targetByteIndexA.[[ByteOffset]]로 설정합니다.
      8. endByteIndextargetByteIndex + (countBytes × elementSize)로 설정합니다.
      9. targetByteIndex < endByteIndex인 동안 반복합니다,
        1. valueGetValueFromBuffer(srcBuffer, srcByteIndex, uint8, true, unordered)로 설정합니다.
        2. SetValueInBuffer(targetBuffer, targetByteIndex, uint8, value, true, unordered)를 수행합니다.
        3. srcByteIndexsrcByteIndex + 1로 설정합니다.
        4. targetByteIndextargetByteIndex + 1로 설정합니다.
    8. 그 밖의 경우,
      1. n을 0으로 설정합니다.
      2. kstartIndex로 설정합니다.
      3. k < endIndex인 동안 반복합니다,
        1. Pk를 ! ToString(𝔽(k))로 설정합니다.
        2. kValue를 ! Get(O, Pk)로 설정합니다.
        3. Set(A, ! ToString(𝔽(n)), kValue, true)를 수행합니다.
        4. kk + 1로 설정합니다.
        5. nn + 1로 설정합니다.
  15. A를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.28 %TypedArray%.prototype.some ( callback [ , thisArg ] )

이 메서드의 인수 해석 및 사용법은 23.1.3.29에 정의된 Array.prototype.some과 동일합니다.

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. IsCallable(callback)가 false이면 TypeError 예외를 throw합니다.
  5. k를 0으로 설정합니다.
  6. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValue를 ! Get(O, Pk)로 설정합니다.
    3. testResultToBoolean(? Call(callback, thisArg, « kValue, 𝔽(k), O »))로 설정합니다.
    4. testResulttrue이면 true를 반환합니다.
    5. kk + 1로 설정합니다.
  7. false를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.29 %TypedArray%.prototype.sort ( comparator )

이것은 별도의 메서드로, 아래에 설명한 부분을 제외하면 23.1.3.30에 정의된 Array.prototype.sort의 요구 사항을 구현합니다. 이 메서드의 구현은 this 값이 고정 길이이며 정수 인덱스(integer-indexed) 프로퍼티가 희소하지 않다는 사실을 활용해 최적화할 수 있습니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

호출 시 다음 단계들을 수행합니다:

  1. comparatorundefined가 아니고 IsCallable(comparator)가 false이면 TypeError 예외를 throw합니다.
  2. objthis 값으로 설정합니다.
  3. taRecord를 ? ValidateTypedArray(obj, seq-cst)로 설정합니다.
  4. lenTypedArrayLength(taRecord)로 설정합니다.
  5. 참고: 다음 클로저는 23.1.3.30에서 사용되는 문자열 비교 대신 숫자 비교를 수행합니다.
  6. SortCompare를 매개변수 (x, y)와 comparator를 캡처하여 호출 시 다음 단계들을 수행하는 새로운 추상 클로저(Abstract Closure)로 설정합니다:
    1. CompareTypedArrayElements(x, y, comparator)를 반환합니다.
  7. sortedList를 ? SortIndexedProperties(obj, len, SortCompare, read-through-holes)로 설정합니다.
  8. j를 0으로 설정합니다.
  9. j < len인 동안 반복합니다,
    1. Set(obj, ! ToString(𝔽(j)), sortedList[j], true)를 수행합니다.
    2. jj + 1로 설정합니다.
  10. obj를 반환합니다.
참고

NaN은 항상 다른 어떤 값보다 더 크게 비교되므로 (자세한 내용은 CompareTypedArrayElements 참조), comparator가 제공되지 않은 경우 NaN 프로퍼티 값은 항상 결과의 끝에 정렬됩니다.

23.2.3.30 %TypedArray%.prototype.subarray ( start, end )

이 메서드는 새로운 TypedArray를 반환합니다. 반환되는 TypedArray의 요소 타입은 이 TypedArray의 요소 타입과 같고, ArrayBuffer는 이 TypedArray의 ArrayBuffer입니다. 반환되는 객체는 start (포함)부터 end (제외)까지의 interval에 해당하는 요소를 참조합니다. start 또는 end가 음수인 경우, 배열의 끝에서부터 인덱스를 참조합니다.

호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[TypedArrayName]])를 수행합니다.
  3. Assert: O[[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
  4. bufferO.[[ViewedArrayBuffer]]로 설정합니다.
  5. srcRecordMakeTypedArrayWithBufferWitnessRecord(O, seq-cst)로 설정합니다.
  6. IsTypedArrayOutOfBounds(srcRecord) 가 true이면,
    1. srcLength를 0으로 설정합니다.
  7. 그 밖의 경우,
    1. srcLengthTypedArrayLength(srcRecord)로 설정합니다.
  8. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  9. relativeStart = -∞이면 startIndex를 0으로 설정합니다.
  10. 그 밖의 경우 relativeStart < 0이면 startIndexmax(srcLength + relativeStart, 0)으로 설정합니다.
  11. 그 밖의 경우 startIndexmin(relativeStart, srcLength)로 설정합니다.
  12. elementSizeTypedArrayElementSize(O)로 설정합니다.
  13. srcByteOffsetO.[[ByteOffset]]로 설정합니다.
  14. beginByteOffsetsrcByteOffset + (startIndex × elementSize)로 설정합니다.
  15. O.[[ArrayLength]]auto이고 endundefined이면,
    1. argumentsList를 « buffer, 𝔽(beginByteOffset) »로 설정합니다.
  16. 그 밖의 경우,
    1. endundefined이면 relativeEndsrcLength로 설정하고, 아니라면 relativeEnd를 ? ToIntegerOrInfinity(end)로 설정합니다.
    2. relativeEnd = -∞이면 endIndex를 0으로 설정합니다.
    3. 그 밖의 경우 relativeEnd < 0이면 endIndexmax(srcLength + relativeEnd, 0)으로 설정합니다.
    4. 그 밖의 경우 endIndexmin(relativeEnd, srcLength)로 설정합니다.
    5. newLengthmax(endIndex - startIndex, 0)로 설정합니다.
    6. argumentsList를 « buffer, 𝔽(beginByteOffset), 𝔽(newLength) »로 설정합니다.
  17. TypedArraySpeciesCreate(O, argumentsList)를 반환합니다.

이 메서드는 일반적이지 않습니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 합니다.

23.2.3.31 %TypedArray%.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

이 메서드는 23.1.3.32에 정의된 Array.prototype.toLocaleString과 동일한 알고리즘을 구현하는 별도의 메서드입니다. 단, TypedArrayLength를 사용하여 "length"[[Get]]을 대신합니다. 알고리즘 구현은 버퍼가 리사이즈 불가능할 때 this 값의 길이가 고정되어 있다는 점과 integer-indexed 프로퍼티가 희소하지 않다는 점을 활용해 최적화할 수 있습니다. 단, 이러한 최적화는 알고리즘의 명세된 행동에 관찰 가능한 변화를 주면 안 됩니다.

이 메서드는 일반적이지 않습니다. ValidateTypedArraythis 값과 seq-cst 인수로 호출되어 알고리즘 평가 전 예외가 발생하면, 알고리즘 평가 대신 해당 예외가 throw됩니다.

참고

ECMAScript 구현에 ECMA-402 국제화 API가 포함되어 있다면, 이 메서드는 ECMA-402 명세의 Array.prototype.toLocaleString 알고리즘을 기반으로 합니다.

23.2.3.32 %TypedArray%.prototype.toReversed ( )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lengthTypedArrayLength(taRecord)로 설정합니다.
  4. A를 ? TypedArrayCreateSameType(O, « 𝔽(length) »)로 설정합니다.
  5. k를 0으로 설정합니다.
  6. k < length인 동안 반복합니다,
    1. from을 ! ToString(𝔽(length - k - 1))로 설정합니다.
    2. Pk를 ! ToString(𝔽(k))로 설정합니다.
    3. fromValue를 ! Get(O, from)로 설정합니다.
    4. Set(A, Pk, fromValue, true)를 수행합니다.
    5. kk + 1로 설정합니다.
  7. A를 반환합니다.

23.2.3.33 %TypedArray%.prototype.toSorted ( comparator )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. comparatorundefined가 아니고 IsCallable(comparator)가 false이면 TypeError 예외를 throw합니다.
  2. Othis 값으로 설정합니다.
  3. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  4. lenTypedArrayLength(taRecord)로 설정합니다.
  5. A를 ? TypedArrayCreateSameType(O, « 𝔽(len) »)로 설정합니다.
  6. 참고: 다음 클로저는 23.1.3.34에서 사용되는 문자열 비교 대신 숫자 비교를 수행합니다.
  7. SortCompare를 매개변수 (x, y)와 comparator를 캡처하여 호출 시 다음 단계들을 수행하는 새로운 추상 클로저(Abstract Closure)로 설정합니다:
    1. CompareTypedArrayElements(x, y, comparator)를 반환합니다.
  8. sortedList를 ? SortIndexedProperties(O, len, SortCompare, read-through-holes)로 설정합니다.
  9. j를 0으로 설정합니다.
  10. j < len인 동안 반복합니다,
    1. Set(A, ! ToString(𝔽(j)), sortedList[j], true)를 수행합니다.
    2. jj + 1로 설정합니다.
  11. A를 반환합니다.

23.2.3.34 %TypedArray%.prototype.toString ( )

"toString" 프로퍼티의 초기 값은 23.1.3.36에 정의된 %Array.prototype.toString%입니다.

23.2.3.35 %TypedArray%.prototype.values ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. ValidateTypedArray(O, seq-cst)를 수행합니다.
  3. CreateArrayIterator(O, value)를 반환합니다.

23.2.3.36 %TypedArray%.prototype.with ( index, value )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(O, seq-cst)로 설정합니다.
  3. lenTypedArrayLength(taRecord)로 설정합니다.
  4. relativeIndex를 ? ToIntegerOrInfinity(index)로 설정합니다.
  5. relativeIndex ≥ 0이면 actualIndexrelativeIndex로 설정합니다.
  6. 그 밖의 경우 actualIndexlen + relativeIndex로 설정합니다.
  7. O.[[ContentType]]bigint이면 numericValue를 ? ToBigInt(value)로 설정합니다.
  8. 그 밖의 경우 numericValue를 ? ToNumber(value)로 설정합니다.
  9. IsValidIntegerIndex(O, 𝔽(actualIndex))가 false이면 RangeError 예외를 throw합니다.
  10. A를 ? TypedArrayCreateSameType(O, « 𝔽(len) »)로 설정합니다.
  11. k를 0으로 설정합니다.
  12. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. k = actualIndex이면 fromValuenumericValue로 설정합니다.
    3. 그 밖의 경우 fromValue를 ! Get(O, Pk)로 설정합니다.
    4. Set(A, Pk, fromValue, true)를 수행합니다.
    5. kk + 1로 설정합니다.
  13. A를 반환합니다.

23.2.3.37 %TypedArray%.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% 프로퍼티의 초기 값은 23.2.3.35에 정의된 %TypedArray.prototype.values%입니다.

23.2.3.38 get %TypedArray%.prototype [ %Symbol.toStringTag% ]

%TypedArray%.prototype[%Symbol.toStringTag%]접근자 프로퍼티이며, set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. O객체가 아니면 undefined를 반환합니다.
  3. O[[TypedArrayName]] 내부 슬롯이 없으면 undefined를 반환합니다.
  4. nameO.[[TypedArrayName]]로 설정합니다.
  5. Assert: name문자열입니다.
  6. name을 반환합니다.

이 프로퍼티의 속성은 { [[Enumerable]]: false, [[Configurable]]: true }입니다.

이 함수의 "name" 프로퍼티의 초기 값은 "get [Symbol.toStringTag]"입니다.

23.2.4 TypedArray 객체에 대한 추상 연산

23.2.4.1 TypedArrayCreateFromConstructor ( constructor, argumentList )

추상 연산 TypedArrayCreateFromConstructor는 인수 constructor (생성자)와 argumentList (리스트 형태의 ECMAScript 언어 값)를 받고, 정상 완료(normal completion)TypedArray 또는 throw 완료를 반환합니다. 이는 생성자 함수를 사용해 새로운 TypedArray를 생성하는 명세에 사용됩니다. 호출 시 다음 단계들을 수행합니다:

  1. newTypedArray를 ? Construct(constructor, argumentList)로 설정합니다.
  2. taRecord를 ? ValidateTypedArray(newTypedArray, seq-cst)로 설정합니다.
  3. Assert: newTypedArrayTypedArray 인스턴스의 프로퍼티에 명시된 모든 내부 슬롯을 갖습니다.
  4. argumentList의 요소 개수가 1이고 argumentList[0]이 Number이면,
    1. IsTypedArrayOutOfBounds(taRecord) 가 true이면 TypeError 예외를 throw합니다.
    2. lengthTypedArrayLength(taRecord)로 설정합니다.
    3. length < (argumentList[0])이면 TypeError 예외를 throw합니다.
  5. newTypedArray를 반환합니다.

23.2.4.2 TypedArrayCreateSameType ( exemplar, argumentList )

추상 연산 TypedArrayCreateSameType은 인수 exemplar (TypedArray)와 argumentList (리스트 형태의 ECMAScript 언어 값)를 받고, 정상 완료(normal completion)TypedArray 또는 throw 완료를 반환합니다. 이는 exemplar에서 파생된 생성자 함수를 사용해 새로운 TypedArray를 생성하는 명세에 사용됩니다. TypedArraySpeciesCreate와 달리, %Symbol.species%를 통해 커스텀 TypedArray 서브클래스를 생성할 수 있는 것과 다르게, 이 연산은 항상 내장 TypedArray 생성자 중 하나를 사용합니다. 호출 시 다음 단계들을 수행합니다:

  1. constructor생성자 이름 exemplar.[[TypedArrayName]]에 연관된 내재 객체로 표 75에서 찾습니다.
  2. result를 ? TypedArrayCreateFromConstructor(constructor, argumentList)로 설정합니다.
  3. Assert: result.[[ContentType]]exemplar.[[ContentType]]와 같습니다.
  4. result를 반환합니다.

23.2.4.3 TypedArraySpeciesCreate ( exemplar, argumentList )

추상 연산 TypedArraySpeciesCreate는 인수 exemplar (TypedArray)와 argumentList (리스트 형태의 ECMAScript 언어 값)를 받고, 정상 완료(normal completion)TypedArray 또는 throw 완료를 반환합니다. 이는 exemplar에서 파생된 생성자 함수를 사용해 새로운 TypedArray를 생성하는 명세에 사용됩니다. ArraySpeciesCreate와 달리, %Symbol.species%를 통해 Array가 아닌 객체를 생성할 수 있지만, 이 연산은 생성자 함수가 실제 TypedArray를 생성하도록 강제합니다. 호출 시 다음 단계들을 수행합니다:

  1. defaultConstructor생성자 이름 exemplar.[[TypedArrayName]]에 연관된 내재 객체로 표 75에서 찾습니다.
  2. constructor를 ? SpeciesConstructor(exemplar, defaultConstructor)로 설정합니다.
  3. result를 ? TypedArrayCreateFromConstructor(constructor, argumentList)로 설정합니다.
  4. result.[[ContentType]]exemplar.[[ContentType]]와 다르면 TypeError 예외를 throw합니다.
  5. result를 반환합니다.

23.2.4.4 ValidateTypedArray ( O, order )

추상 연산 ValidateTypedArray는 인수 O (ECMAScript 언어 값)와 order (seq-cst 또는 unordered)를 받고, 정상 완료(normal completion)TypedArray With Buffer Witness Record 또는 throw 완료를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. RequireInternalSlot(O, [[TypedArrayName]])를 수행합니다.
  2. Assert: O[[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
  3. taRecordMakeTypedArrayWithBufferWitnessRecord(O, order)로 설정합니다.
  4. IsTypedArrayOutOfBounds(taRecord) 가 true이면 TypeError 예외를 throw합니다.
  5. taRecord를 반환합니다.

23.2.4.5 TypedArrayElementSize ( O )

추상 연산 TypedArrayElementSize는 인수 O (TypedArray)를 받고, 0 이상의 정수를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. O.[[TypedArrayName]]에 대해 표 75에 지정된 요소 크기(Element Size) 값을 반환합니다.

23.2.4.6 TypedArrayElementType ( O )

추상 연산 TypedArrayElementType은 인수 O (TypedArray)를 받고, TypedArray 요소 타입를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. O.[[TypedArrayName]]에 대해 표 75에 지정된 요소 타입(Element Type) 값을 반환합니다.

23.2.4.7 CompareTypedArrayElements ( x, y, comparator )

추상 연산 CompareTypedArrayElements는 인수 x (Number 또는 BigInt), y (Number 또는 BigInt), comparator (함수 객체 또는 undefined)를 받고, 정상 완료(normal completion)로 Number 또는 abrupt completion를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: xNumber이고 yNumber이거나, xBigInt이고 yBigInt입니다.
  2. comparatorundefined가 아니면,
    1. v를 ? ToNumber(? Call(comparator, undefined, « x, y »))로 설정합니다.
    2. vNaN이면 +0𝔽를 반환합니다.
    3. v를 반환합니다.
  3. xy가 모두 NaN이면 +0𝔽를 반환합니다.
  4. xNaN이면 1𝔽를 반환합니다.
  5. yNaN이면 -1𝔽를 반환합니다.
  6. x < y이면 -1𝔽를 반환합니다.
  7. x > y이면 1𝔽를 반환합니다.
  8. x-0𝔽이고 y+0𝔽이면 -1𝔽를 반환합니다.
  9. x+0𝔽이고 y-0𝔽이면 1𝔽를 반환합니다.
  10. +0𝔽를 반환합니다.
참고
이 연산은 23.1.3.30.2에서 사용되는 문자열 비교 대신 숫자 비교를 수행합니다.

23.2.5 TypedArray 생성자

TypedArray 생성자:

  • 내재 객체이며, 아래에 설명된 구조를 가지나 표 75에서 생성자 이름 대신 TypedArray 이름만 다릅니다.
  • 인수의 개수와 타입에 따라 동작이 달라지는 함수입니다. TypedArray를 호출할 때 실제 동작은 전달되는 인수의 개수와 종류에 따라 달라집니다.
  • 함수로 호출되는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외가 발생합니다.
  • 클래스 정의의 extends 절 값으로 사용될 수 있습니다. 지정된 TypedArray 동작을 상속하려는 서브클래스 생성자TypedArray 생성자super 호출을 포함하여 서브클래스 인스턴스가 %TypedArray%.prototype 내장 메서드를 지원하는 데 필요한 내부 상태를 생성 및 초기화해야 합니다.

23.2.5.1 TypedArray ( ...args )

TypedArray 생성자는 호출될 때 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 throw합니다.
  2. constructorName표 75에서 이 TypedArray 생성자에 대해 명시된 생성자 이름의 문자열 값으로 설정합니다.
  3. proto"%TypedArray.prototype%"로 설정합니다.
  4. numberOfArgsargs의 요소 개수로 설정합니다.
  5. numberOfArgs = 0이면,
    1. AllocateTypedArray(constructorName, NewTarget, proto, 0)를 반환합니다.
  6. 그 밖의 경우,
    1. firstArgumentargs[0]으로 설정합니다.
    2. firstArgument객체이면,
      1. O를 ? AllocateTypedArray(constructorName, NewTarget, proto)로 설정합니다.
      2. firstArgument[[TypedArrayName]] 내부 슬롯을 가지면,
        1. InitializeTypedArrayFromTypedArray(O, firstArgument)를 수행합니다.
      3. 그 밖의 경우 firstArgument[[ArrayBufferData]] 내부 슬롯을 가지면,
        1. numberOfArgs > 1이면 byteOffsetargs[1]으로, 아니면 byteOffsetundefined로 설정합니다.
        2. numberOfArgs > 2이면 lengthargs[2]으로, 아니면 lengthundefined로 설정합니다.
        3. InitializeTypedArrayFromArrayBuffer(O, firstArgument, byteOffset, length)를 수행합니다.
      4. 그 밖의 경우,
        1. Assert: firstArgument객체이며 [[TypedArrayName]] 또는 [[ArrayBufferData]] 내부 슬롯을 갖지 않습니다.
        2. usingIterator를 ? GetMethod(firstArgument, %Symbol.iterator%)로 설정합니다.
        3. usingIteratorundefined가 아니면,
          1. values를 ? IteratorToList(? GetIteratorFromMethod(firstArgument, usingIterator))로 설정합니다.
          2. InitializeTypedArrayFromList(O, values)를 수행합니다.
        4. 그 밖의 경우,
          1. 참고: firstArgument이터러블 객체가 아니므로, 이미 array-like 객체라고 간주합니다.
          2. InitializeTypedArrayFromArrayLike(O, firstArgument)를 수행합니다.
      5. O를 반환합니다.
    3. 그 밖의 경우,
      1. Assert: firstArgument객체가 아님입니다.
      2. elementLength를 ? ToIndex(firstArgument)로 설정합니다.
      3. AllocateTypedArray(constructorName, NewTarget, proto, elementLength)를 반환합니다.

23.2.5.1.1 AllocateTypedArray ( constructorName, newTarget, defaultProto [ , length ] )

추상 연산 AllocateTypedArray는 인수 constructorName (TypedArray 생성자 이름의 문자열, 표 75 참조), newTarget (생성자), defaultProto (문자열) 및 선택적 length (0 이상의 정수)를 받고, 정상 완료(normal completion)TypedArray 또는 throw 완료를 반환합니다. length 인수가 전달되면 해당 길이의 ArrayBuffer도 할당되고 새 TypedArray 인스턴스에 연결됩니다. AllocateTypedArray는 TypedArray의 공통적인 의미를 제공합니다. 호출 시 다음 단계들을 수행합니다:

  1. proto를 ? GetPrototypeFromConstructor(newTarget, defaultProto)로 설정합니다.
  2. objTypedArrayCreate(proto)로 설정합니다.
  3. Assert: obj.[[ViewedArrayBuffer]]undefined입니다.
  4. obj.[[TypedArrayName]]constructorName으로 설정합니다.
  5. constructorName"BigInt64Array" 또는 "BigUint64Array"이면, obj.[[ContentType]]bigint로 설정합니다.
  6. 그 밖의 경우, obj.[[ContentType]]number로 설정합니다.
  7. length가 없으면,
    1. obj.[[ByteLength]]를 0으로 설정합니다.
    2. obj.[[ByteOffset]]를 0으로 설정합니다.
    3. obj.[[ArrayLength]]를 0으로 설정합니다.
  8. 그 밖의 경우,
    1. AllocateTypedArrayBuffer(obj, length)를 수행합니다.
  9. obj를 반환합니다.

23.2.5.1.2 InitializeTypedArrayFromTypedArray ( O, srcArray )

추상 연산 InitializeTypedArrayFromTypedArray는 인수 O (TypedArray), srcArray (TypedArray)를 받고, 정상 완료(normal completion)unused 또는 throw 완료를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. srcDatasrcArray.[[ViewedArrayBuffer]]로 설정합니다.
  2. elementTypeTypedArrayElementType(O)로 설정합니다.
  3. elementSizeTypedArrayElementSize(O)로 설정합니다.
  4. srcTypeTypedArrayElementType(srcArray)로 설정합니다.
  5. srcElementSizeTypedArrayElementSize(srcArray)로 설정합니다.
  6. srcByteOffsetsrcArray.[[ByteOffset]]로 설정합니다.
  7. srcRecordMakeTypedArrayWithBufferWitnessRecord(srcArray, seq-cst)로 설정합니다.
  8. IsTypedArrayOutOfBounds(srcRecord) 가 true이면 TypeError 예외를 throw합니다.
  9. elementLengthTypedArrayLength(srcRecord)로 설정합니다.
  10. byteLengthelementSize × elementLength로 설정합니다.
  11. elementTypesrcType이면,
    1. data를 ? CloneArrayBuffer(srcData, srcByteOffset, byteLength)로 설정합니다.
  12. 그 밖의 경우,
    1. data를 ? AllocateArrayBuffer(%ArrayBuffer%, byteLength)로 설정합니다.
    2. srcArray.[[ContentType]]O.[[ContentType]]과 다르면 TypeError 예외를 throw합니다.
    3. srcByteIndexsrcByteOffset으로 설정합니다.
    4. targetByteIndex를 0으로 설정합니다.
    5. countelementLength로 설정합니다.
    6. count > 0인 동안 반복합니다,
      1. valueGetValueFromBuffer(srcData, srcByteIndex, srcType, true, unordered)로 설정합니다.
      2. SetValueInBuffer(data, targetByteIndex, elementType, value, true, unordered)를 수행합니다.
      3. srcByteIndexsrcByteIndex + srcElementSize로 설정합니다.
      4. targetByteIndextargetByteIndex + elementSize로 설정합니다.
      5. countcount - 1로 설정합니다.
  13. O.[[ViewedArrayBuffer]]data로 설정합니다.
  14. O.[[ByteLength]]byteLength로 설정합니다.
  15. O.[[ByteOffset]]를 0으로 설정합니다.
  16. O.[[ArrayLength]]elementLength로 설정합니다.
  17. unused를 반환합니다.

23.2.5.1.3 InitializeTypedArrayFromArrayBuffer ( O, buffer, byteOffset, length )

추상 연산 InitializeTypedArrayFromArrayBuffer는 인수 O (TypedArray), buffer (ArrayBuffer 또는 SharedArrayBuffer), byteOffset (ECMAScript 언어 값), length (ECMAScript 언어 값)를 받고, 정상 완료(normal completion)unused 또는 throw 완료를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. elementSizeTypedArrayElementSize(O)로 설정합니다.
  2. offset을 ? ToIndex(byteOffset)로 설정합니다.
  3. offset modulo elementSize ≠ 0이면 RangeError 예외를 throw합니다.
  4. bufferIsFixedLengthIsFixedLengthArrayBuffer(buffer)로 설정합니다.
  5. lengthundefined가 아니면,
    1. newLength를 ? ToIndex(length)로 설정합니다.
  6. IsDetachedBuffer(buffer) 가 true이면 TypeError 예외를 throw합니다.
  7. bufferByteLengthArrayBufferByteLength(buffer, seq-cst)로 설정합니다.
  8. lengthundefined이고 bufferIsFixedLengthfalse이면,
    1. offset > bufferByteLength이면 RangeError 예외를 throw합니다.
    2. O.[[ByteLength]]auto로 설정합니다.
    3. O.[[ArrayLength]]auto로 설정합니다.
  9. 그 밖의 경우,
    1. lengthundefined이면,
      1. bufferByteLength modulo elementSize ≠ 0이면 RangeError 예외를 throw합니다.
      2. newByteLengthbufferByteLength - offset으로 설정합니다.
      3. newByteLength < 0이면 RangeError 예외를 throw합니다.
    2. 그 밖의 경우,
      1. newByteLengthnewLength × elementSize로 설정합니다.
      2. offset + newByteLength > bufferByteLength이면 RangeError 예외를 throw합니다.
    3. O.[[ByteLength]]newByteLength로 설정합니다.
    4. O.[[ArrayLength]]newByteLength / elementSize로 설정합니다.
  10. O.[[ViewedArrayBuffer]]buffer로 설정합니다.
  11. O.[[ByteOffset]]offset으로 설정합니다.
  12. unused를 반환합니다.

23.2.5.1.4 InitializeTypedArrayFromList ( O, values )

추상 연산 InitializeTypedArrayFromList는 인수 O (TypedArray), values (리스트 형태의 ECMAScript 언어 값)를 받고, 정상 완료(normal completion)unused 또는 throw 완료를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. lenvalues의 요소 개수로 설정합니다.
  2. AllocateTypedArrayBuffer(O, len)를 수행합니다.
  3. k를 0으로 설정합니다.
  4. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValuevalues의 첫 번째 요소로 설정합니다.
    3. values의 첫 번째 요소를 제거합니다.
    4. Set(O, Pk, kValue, true)를 수행합니다.
    5. kk + 1로 설정합니다.
  5. Assert: values는 이제 빈 리스트입니다.
  6. unused를 반환합니다.

23.2.5.1.5 InitializeTypedArrayFromArrayLike ( O, arrayLike )

추상 연산 InitializeTypedArrayFromArrayLike는 인수 O (TypedArray), arrayLike (객체, 단 TypedArray 또는 ArrayBuffer는 아님)를 받고, 정상 완료(normal completion)unused 또는 throw 완료를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. len을 ? LengthOfArrayLike(arrayLike)로 설정합니다.
  2. AllocateTypedArrayBuffer(O, len)를 수행합니다.
  3. k를 0으로 설정합니다.
  4. k < len인 동안 반복합니다,
    1. Pk를 ! ToString(𝔽(k))로 설정합니다.
    2. kValue를 ? Get(arrayLike, Pk)로 설정합니다.
    3. Set(O, Pk, kValue, true)를 수행합니다.
    4. kk + 1로 설정합니다.
  5. unused를 반환합니다.

23.2.5.1.6 AllocateTypedArrayBuffer ( O, length )

추상 연산 AllocateTypedArrayBuffer는 인수 O (TypedArray), length (0 이상의 정수)를 받고, 정상 완료(normal completion)unused 또는 throw 완료를 반환합니다. O에 ArrayBuffer를 할당하고 연결합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: O.[[ViewedArrayBuffer]]undefined입니다.
  2. elementSizeTypedArrayElementSize(O)로 설정합니다.
  3. byteLengthelementSize × length로 설정합니다.
  4. data를 ? AllocateArrayBuffer(%ArrayBuffer%, byteLength)로 설정합니다.
  5. O.[[ViewedArrayBuffer]]data로 설정합니다.
  6. O.[[ByteLength]]byteLength로 설정합니다.
  7. O.[[ByteOffset]]를 0으로 설정합니다.
  8. O.[[ArrayLength]]length로 설정합니다.
  9. unused를 반환합니다.

23.2.6 TypedArray 생성자의 속성

TypedArray 생성자:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %TypedArray%입니다.
  • "length" 프로퍼티를 가지며 그 값은 3𝔽입니다.
  • "name" 프로퍼티를 가지며 그 값은 표 75에서 명시된 생성자 이름의 문자열 값입니다.
  • 다음 프로퍼티들을 가집니다:

23.2.6.1 TypedArray.BYTES_PER_ELEMENT

TypedArray.BYTES_PER_ELEMENT의 값은 표 75에서 TypedArray에 대해 명시된 요소 크기(Element Size) 값입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

23.2.6.2 TypedArray.prototype

TypedArray.prototype의 초기 값은 해당 TypedArray 프로토타입 내재 객체(23.2.7)입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

23.2.7 TypedArray 프로토타입 객체의 속성

TypedArray 프로토타입 객체:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %TypedArray.prototype%입니다.
  • 일반 객체입니다.
  • [[ViewedArrayBuffer]] 또는 TypedArray 인스턴스 객체에 특화된 기타 내부 슬롯을 가지지 않습니다.

23.2.7.1 TypedArray.prototype.BYTES_PER_ELEMENT

TypedArray.prototype.BYTES_PER_ELEMENT의 값은 표 75에서 TypedArray에 대해 명시된 요소 크기(Element Size) 값입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

23.2.7.2 TypedArray.prototype.constructor

프로토타입의 "constructor" 프로퍼티의 초기 값은 해당 TypedArray 생성자 자체입니다.

23.2.8 TypedArray 인스턴스의 속성

TypedArray 인스턴스는 TypedArrays입니다. 각 TypedArray 인스턴스는 해당 TypedArray 프로토타입 객체로부터 프로퍼티를 상속받습니다. 각 TypedArray 인스턴스는 다음 내부 슬롯을 가집니다: [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]].

24 Keyed 컬렉션

24.1 Map 객체

Map은 키/값 쌍의 컬렉션으로, 키와 값 모두 임의의 ECMAScript 언어 값가 될 수 있습니다. 서로 다른 키 값은 Map의 컬렉션 내에서 하나의 키/값 쌍에만 등장할 수 있습니다. 서로 다른 키 값은 SameValueZero 비교 알고리즘의 의미론을 사용하여 구별됩니다.

Map은 해시 테이블이나 평균적으로 컬렉션의 요소 수에 대해 부분선형(sublinear) 접근 시간을 제공하는 다른 메커니즘을 사용하여 구현되어야 합니다. 이 명세에서 사용되는 자료구조는 Map의 요구되는 관찰 가능한 의미론만을 설명하기 위한 것이며, 실제 구현 모델로는 적합하지 않습니다.

24.1.1 Map 생성자

Map 생성자:

  • %Map%입니다.
  • 글로벌 객체"Map" 프로퍼티의 초기 값입니다.
  • 생성자로 호출될 때 새로운 Map을 생성하고 초기화합니다.
  • 함수로 호출되는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외를 던집니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 Map 동작을 상속하려는 서브클래스 생성자는 Map 생성자super 호출을 포함하여 서브클래스 인스턴스가 Map.prototype 내장 메서드를 지원하는 데 필요한 내부 상태를 생성 및 초기화해야 합니다.

24.1.1.1 Map ( [ iterable ] )

이 함수는 호출될 때 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 throw합니다.
  2. map을 ? OrdinaryCreateFromConstructor(NewTarget, "%Map.prototype%", « [[MapData]] »)로 설정합니다.
  3. map.[[MapData]]를 새로운 빈 List로 설정합니다.
  4. iterableundefined 또는 null이면 map을 반환합니다.
  5. adder를 ? Get(map, "set")로 설정합니다.
  6. IsCallable(adder)가 false이면 TypeError 예외를 throw합니다.
  7. AddEntriesFromIterable(map, iterable, adder)를 반환합니다.
참고

매개변수 iterable이 존재하는 경우, %Symbol.iterator% 메서드를 구현한 객체로 예상되며, 이는 이터레이터 객체를 반환해야 합니다. 해당 이터레이터는 첫 번째 요소가 Map의 키로 사용될 값이고, 두 번째 요소가 그 키에 연결할 값인 2개의 요소를 가진 배열 유사 객체를 생성해야 합니다.

24.1.1.2 AddEntriesFromIterable ( target, iterable, adder )

추상 연산 AddEntriesFromIterable는 인수 target (객체), iterable (ECMAScript 언어 값, 단 undefined 또는 null은 아님), adder (함수 객체)를 받고, 정상 완료(normal completion)ECMAScript 언어 값 또는 throw 완료를 반환합니다. addertarget을 수신자로 하여 호출됩니다. 호출 시 다음 단계들을 수행합니다:

  1. iteratorRecord를 ? GetIterator(iterable, sync)로 설정합니다.
  2. 반복,
    1. next를 ? IteratorStepValue(iteratorRecord)로 설정합니다.
    2. nextdone이면 target을 반환합니다.
    3. next객체가 아니면,
      1. errorThrowCompletion(새로 생성한 TypeError 객체)로 설정합니다.
      2. IteratorClose(iteratorRecord, error)를 반환합니다.
    4. kCompletion(Get(next, "0"))로 설정합니다.
    5. IfAbruptCloseIterator(k, iteratorRecord)를 수행합니다.
    6. vCompletion(Get(next, "1"))로 설정합니다.
    7. IfAbruptCloseIterator(v, iteratorRecord)를 수행합니다.
    8. statusCompletion(Call(adder, target, « k, v »))로 설정합니다.
    9. IfAbruptCloseIterator(status, iteratorRecord)를 수행합니다.
참고

매개변수 iterable%Symbol.iterator% 메서드를 구현한 객체로 예상되며, 이는 이터레이터 객체를 반환해야 합니다. 해당 이터레이터는 첫 번째 요소가 Map의 키로 사용될 값이고, 두 번째 요소가 그 키에 연결할 값인 2개의 요소를 가진 배열 유사 객체를 생성해야 합니다.

24.1.2 Map 생성자의 속성

Map 생성자:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%입니다.
  • 다음 프로퍼티를 가집니다:

24.1.2.1 Map.groupBy ( items, callback )

참고

callback은 두 개의 인수를 받는 함수여야 합니다. groupByitems의 각 요소에 대해 오름차순으로 callback을 한 번씩 호출하며, 새로운 Map을 구성합니다. callback이 반환하는 각 값은 Map의 키로 사용됩니다. 해당 키마다 결과 Map에 그 키를 키로 하고 callback이 해당 키를 반환한 모든 요소가 담긴 배열을 값으로 하는 엔트리가 생깁니다.

callback은 요소의 값과 요소의 인덱스를 인수로 호출됩니다.

groupBy의 반환 값은 Map입니다.

이 함수는 호출될 때 다음 단계들을 수행합니다:

  1. groups를 ? GroupBy(items, callback, collection)로 설정합니다.
  2. map을 ! Construct(%Map%)로 설정합니다.
  3. groups의 각 Record { [[Key]], [[Elements]] } g에 대해,
    1. elementsCreateArrayFromList(g.[[Elements]])로 설정합니다.
    2. entryRecord { [[Key]]: g.[[Key]], [[Value]]: elements }로 설정합니다.
    3. entrymap.[[MapData]]에 추가합니다.
  4. map을 반환합니다.

24.1.2.2 Map.prototype

Map.prototype의 초기 값은 Map 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

24.1.2.3 get Map [ %Symbol.species% ]

Map[%Symbol.species%]접근자 프로퍼티이며, set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "name" 프로퍼티의 값은 "get [Symbol.species]"입니다.

참고

파생 컬렉션 객체를 생성하는 메서드는 %Symbol.species%를 호출하여 파생 객체를 생성하는 데 사용할 생성자를 결정해야 합니다. 서브클래스 생성자는 기본 %Symbol.species% 할당을 변경하기 위해 오버라이드할 수 있습니다.

24.1.3 Map 프로토타입 객체의 속성

Map 프로토타입 객체:

  • %Map.prototype%입니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • 일반 객체입니다.
  • [[MapData]] 내부 슬롯을 가지지 않습니다.

24.1.3.1 Map.prototype.clear ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[MapData]])를 수행합니다.
  3. M.[[MapData]]의 각 Record { [[Key]], [[Value]] } p에 대해,
    1. p.[[Key]]empty로 설정합니다.
    2. p.[[Value]]empty로 설정합니다.
  4. undefined를 반환합니다.
참고

기존 [[MapData]] List는 보존됩니다. 이는 Map 이터레이터 객체가 해당 List를 순회하는 중단점에 있을 수 있기 때문입니다.

24.1.3.2 Map.prototype.constructor

Map.prototype.constructor의 초기 값은 %Map%입니다.

24.1.3.3 Map.prototype.delete ( key )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[MapData]])를 수행합니다.
  3. keyCanonicalizeKeyedCollectionKey(key)로 설정합니다.
  4. M.[[MapData]]의 각 Record { [[Key]], [[Value]] } p에 대해,
    1. p.[[Key]]empty가 아니고 SameValue(p.[[Key]], key)가 true이면,
      1. p.[[Key]]empty로 설정합니다.
      2. p.[[Value]]empty로 설정합니다.
      3. true를 반환합니다.
  5. false를 반환합니다.
참고

empty 값은 명세 장치로, 엔트리가 삭제되었음을 나타냅니다. 실제 구현은 내부 자료구조에서 엔트리를 물리적으로 제거하는 등 다른 동작을 할 수 있습니다.

24.1.3.4 Map.prototype.entries ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. CreateMapIterator(M, key+value)를 반환합니다.

24.1.3.5 Map.prototype.forEach ( callback [ , thisArg ] )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[MapData]])를 수행합니다.
  3. IsCallable(callback)가 false이면 TypeError 예외를 throw합니다.
  4. entriesM.[[MapData]]로 설정합니다.
  5. numEntriesentries의 요소 개수로 설정합니다.
  6. index를 0으로 설정합니다.
  7. index < numEntries인 동안 반복합니다,
    1. eentries[index]로 설정합니다.
    2. indexindex + 1로 설정합니다.
    3. e.[[Key]]empty가 아니면,
      1. Call(callback, thisArg, « e.[[Value]], e.[[Key]], M »)를 수행합니다.
      2. 참고: entries의 요소 개수는 callback 실행 중 증가할 수 있습니다.
      3. numEntriesentries의 요소 개수로 설정합니다.
  8. undefined를 반환합니다.
참고

callback은 세 개의 인수를 받는 함수여야 합니다. forEach는 Map에 존재하는 각 키/값 쌍에 대해 삽입 순서대로 callback을 한 번씩 호출합니다. callback은 실제로 존재하는 키에 대해서만 호출되며, Map에서 삭제된 키에 대해서는 호출되지 않습니다.

thisArg 매개변수가 제공된 경우, 각 callback 호출의 this 값으로 사용됩니다. 제공되지 않은 경우 undefined가 대신 사용됩니다.

callback은 세 개의 인수(값, 키, 순회되는 Map)를 받습니다.

forEach는 직접적으로 호출된 객체를 변경하지 않지만, callback 호출에 의해 객체가 변경될 수 있습니다. Map의 [[MapData]]의 각 엔트리는 한 번만 방문됩니다. forEach 호출 이후 추가된 새로운 키도 방문됩니다. 이미 방문한 키가 삭제되었다가 forEach가 완료되기 전에 다시 추가되면 다시 방문됩니다. forEach 호출 이후 삭제된 키는 다시 추가되지 않는 한 방문되지 않습니다.

24.1.3.6 Map.prototype.get ( key )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[MapData]])를 수행합니다.
  3. keyCanonicalizeKeyedCollectionKey(key)로 설정합니다.
  4. M.[[MapData]]의 각 Record { [[Key]], [[Value]] } p에 대해,
    1. p.[[Key]]empty가 아니고 SameValue(p.[[Key]], key)가 true이면 p.[[Value]]를 반환합니다.
  5. undefined를 반환합니다.

24.1.3.7 Map.prototype.has ( key )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[MapData]])를 수행합니다.
  3. keyCanonicalizeKeyedCollectionKey(key)로 설정합니다.
  4. M.[[MapData]]의 각 Record { [[Key]], [[Value]] } p에 대해,
    1. p.[[Key]]empty가 아니고 SameValue(p.[[Key]], key)가 true이면 true를 반환합니다.
  5. false를 반환합니다.

24.1.3.8 Map.prototype.keys ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. CreateMapIterator(M, key)를 반환합니다.

24.1.3.9 Map.prototype.set ( key, value )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[MapData]])를 수행합니다.
  3. keyCanonicalizeKeyedCollectionKey(key)로 설정합니다.
  4. M.[[MapData]]의 각 Record { [[Key]], [[Value]] } p에 대해,
    1. p.[[Key]]empty가 아니고 SameValue(p.[[Key]], key)가 true이면,
      1. p.[[Value]]value로 설정합니다.
      2. M을 반환합니다.
  5. pRecord { [[Key]]: key, [[Value]]: value }로 설정합니다.
  6. pM.[[MapData]]에 추가합니다.
  7. M을 반환합니다.

24.1.3.10 get Map.prototype.size

Map.prototype.size접근자 프로퍼티이며, set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[MapData]])를 수행합니다.
  3. count를 0으로 설정합니다.
  4. M.[[MapData]]의 각 Record { [[Key]], [[Value]] } p에 대해,
    1. p.[[Key]]empty가 아니면 countcount + 1로 설정합니다.
  5. 𝔽(count)를 반환합니다.

24.1.3.11 Map.prototype.values ( )

이 메서드는 호출될 때 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. CreateMapIterator(M, value)를 반환합니다.

24.1.3.12 Map.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% 프로퍼티의 초기 값은 24.1.3.4에 정의된 %Map.prototype.entries%입니다.

24.1.3.13 Map.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 "Map" 문자열 값입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

24.1.4 Map 인스턴스의 속성

Map 인스턴스는 일반 객체이며, Map 프로토타입 객체로부터 프로퍼티를 상속받습니다. Map 인스턴스는 [[MapData]] 내부 슬롯도 가집니다.

24.1.5 Map 이터레이터 객체

Map 이터레이터는 특정 Map 인스턴스 객체에 대한 특정 반복(iteration)을 나타내는 객체입니다. Map 이터레이터 객체에는 명명된 생성자가 없습니다. 대신, Map 이터레이터 객체는 특정 Map 인스턴스 객체의 메서드를 호출함으로써 생성됩니다.

24.1.5.1 CreateMapIterator ( map, kind )

추상 연산 CreateMapIterator는 인수 map (ECMAScript 언어 값), kind (key+value, key, value)를 받고, 정상 완료(normal completion)로 Generator 또는 throw 완료를 반환합니다. Map의 이터레이터 메서드에서 이터레이터 객체를 생성하기 위해 사용됩니다. 호출 시 다음 단계들을 수행합니다:

  1. RequireInternalSlot(map, [[MapData]])를 수행합니다.
  2. closure를 파라미터가 없고 mapkind를 캡처하여 호출 시 다음 단계들을 수행하는 새로운 추상 클로저(Abstract Closure)로 설정합니다:
    1. entriesmap.[[MapData]]로 설정합니다.
    2. index를 0으로 설정합니다.
    3. numEntriesentries의 요소 개수로 설정합니다.
    4. index < numEntries인 동안 반복합니다,
      1. eentries[index]로 설정합니다.
      2. indexindex + 1로 설정합니다.
      3. e.[[Key]]empty가 아니면,
        1. kindkey이면,
          1. resulte.[[Key]]로 설정합니다.
        2. 그 밖의 경우 kindvalue이면,
          1. resulte.[[Value]]로 설정합니다.
        3. 그 밖의 경우,
          1. Assert: kindkey+value입니다.
          2. resultCreateArrayFromListe.[[Key]], e.[[Value]] »)로 설정합니다.
        4. GeneratorYield(CreateIteratorResultObject(result, false))를 수행합니다.
        5. 참고: entries의 요소 개수는 GeneratorYield로 인해 이 추상 연산의 실행이 일시 중지되는 동안 증가할 수 있습니다.
        6. numEntriesentries의 요소 개수로 설정합니다.
    5. NormalCompletion(unused)를 반환합니다.
  3. CreateIteratorFromClosure(closure, "%MapIteratorPrototype%", %MapIteratorPrototype%)를 반환합니다.

24.1.5.2 %MapIteratorPrototype% 객체

%MapIteratorPrototype% 객체:

24.1.5.2.1 %MapIteratorPrototype%.next ( )

  1. GeneratorResume(this 값, empty, "%MapIteratorPrototype%")를 반환합니다.

24.1.5.2.2 %MapIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "Map Iterator"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

24.2 Set 객체

Set 객체는 ECMAScript 언어 값의 컬렉션입니다. 구별되는 값은 Set의 컬렉션의 요소로 한 번만 등장할 수 있습니다. 구별되는 값은 SameValueZero 비교 알고리즘의 의미론을 이용해 구분됩니다.

Set 객체는 해시 테이블 또는 평균적으로 컬렉션 내의 요소 개수에 대해 부분선형(sublinear) 접근 시간을 제공하는 기타 메커니즘으로 구현되어야 합니다. 이 명세에서 사용된 데이터 구조는 Set 객체의 요구되는 관찰 가능한 의미론만을 설명하기 위한 것이며, 실제 구현 모델로 적합한 것은 아닙니다.

24.2.1 Set 객체에 대한 추상 연산

24.2.1.1 Set 레코드

Set 레코드는 Set 또는 유사 객체의 인터페이스를 캡슐화하기 위해 사용되는 레코드 값입니다.

Set 레코드는 표 76에 나열된 필드를 가집니다.

표 76: Set 레코드 필드
필드 이름 의미
[[SetObject]] 객체 Set 또는 유사 객체.
[[Size]] 0 이상의 정수 또는 +∞ 객체가 보고하는 크기.
[[Has]] 함수 객체 객체의 has 메서드.
[[Keys]] 함수 객체 객체의 keys 메서드.

24.2.1.2 GetSetRecord ( obj )

추상 연산 GetSetRecord는 인수 obj (ECMAScript 언어 값)를 받고, 정상 완료(normal completion)Set 레코드 또는 throw 완료를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. obj객체가 아니면 TypeError 예외를 throw합니다.
  2. rawSize를 ? Get(obj, "size")로 설정합니다.
  3. numSize를 ? ToNumber(rawSize)로 설정합니다.
  4. 참고: rawSizeundefined이면 numSizeNaN입니다.
  5. numSizeNaN이면 TypeError 예외를 throw합니다.
  6. intSize를 ! ToIntegerOrInfinity(numSize)로 설정합니다.
  7. intSize < 0이면 RangeError 예외를 throw합니다.
  8. has를 ? Get(obj, "has")로 설정합니다.
  9. IsCallable(has)가 false이면 TypeError 예외를 throw합니다.
  10. keys를 ? Get(obj, "keys")로 설정합니다.
  11. IsCallable(keys)가 false이면 TypeError 예외를 throw합니다.
  12. 새로운 Set 레코드 { [[SetObject]]: obj, [[Size]]: intSize, [[Has]]: has, [[Keys]]: keys }를 반환합니다.

24.2.1.3 SetDataHas ( setData, value )

추상 연산 SetDataHas는 인수 setData (리스트, 각 요소는 ECMAScript 언어 값 또는 empty), value (ECMAScript 언어 값)를 받고, Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. SetDataIndex(setData, value)가 not-found이면 false를 반환합니다.
  2. true를 반환합니다.

24.2.1.4 SetDataIndex ( setData, value )

추상 연산 SetDataIndex는 인수 setData (리스트, 각 요소는 ECMAScript 언어 값 또는 empty), value (ECMAScript 언어 값)를 받고, 0 이상의 정수 또는 not-found를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. valueCanonicalizeKeyedCollectionKey(value)로 설정합니다.
  2. sizesetData의 요소 개수로 설정합니다.
  3. index를 0으로 설정합니다.
  4. index < size인 동안 반복합니다,
    1. esetData[index]로 설정합니다.
    2. eempty가 아니고 evalue이면,
      1. index를 반환합니다.
    3. indexindex + 1로 설정합니다.
  5. not-found를 반환합니다.

24.2.1.5 SetDataSize ( setData )

추상 연산 SetDataSize는 인수 setData (리스트, 각 요소는 ECMAScript 언어 값 또는 empty)를 받고, 0 이상의 정수를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. count를 0으로 설정합니다.
  2. setData의 각 요소 e에 대해,
    1. eempty가 아니면 countcount + 1로 설정합니다.
  3. count를 반환합니다.

24.2.2 Set 생성자

Set 생성자:

  • 내재 객체 %Set%입니다.
  • 글로벌 객체"Set" 프로퍼티의 초기 값입니다.
  • 생성자로 호출될 때 새로운 Set 객체를 생성하고 초기화합니다.
  • 함수로 호출하는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외가 발생합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 Set 동작을 상속하려는 서브클래스 생성자super 호출을 포함하여 Set 생성자에 서브클래스 인스턴스가 Set.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.

24.2.2.1 Set ( [ iterable ] )

이 함수는 호출될 때 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 throw합니다.
  2. set을 ? OrdinaryCreateFromConstructor(NewTarget, "%Set.prototype%", « [[SetData]] »)로 설정합니다.
  3. set.[[SetData]]를 새로운 빈 리스트로 설정합니다.
  4. iterableundefined 또는 null이면 set을 반환합니다.
  5. adder를 ? Get(set, "add")로 설정합니다.
  6. IsCallable(adder)가 false이면 TypeError 예외를 throw합니다.
  7. iteratorRecord를 ? GetIterator(iterable, sync)로 설정합니다.
  8. 반복합니다,
    1. next를 ? IteratorStepValue(iteratorRecord)로 설정합니다.
    2. nextdone이면 set을 반환합니다.
    3. statusCompletion(Call(adder, set, « next »))로 설정합니다.
    4. IfAbruptCloseIterator(status, iteratorRecord)를 수행합니다.

24.2.3 Set 생성자의 속성

Set 생성자:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%입니다.
  • 다음 프로퍼티들을 가집니다:

24.2.3.1 Set.prototype

Set.prototype의 초기 값은 Set 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

24.2.3.2 get Set [ %Symbol.species% ]

Set[%Symbol.species%]접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]"입니다.

참고

파생 컬렉션 객체를 생성하는 메서드는 %Symbol.species%를 호출해 파생 객체를 만드는데 사용할 생성자를 결정해야 합니다. 서브클래스 생성자%Symbol.species%를 오버라이드하여 기본 생성자 할당을 변경할 수 있습니다.

24.2.4 Set 프로토타입 객체의 속성

Set 프로토타입 객체:

  • %Set.prototype%입니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • 일반 객체입니다.
  • [[SetData]] 내부 슬롯을 가지지 않습니다.

24.2.4.1 Set.prototype.add ( value )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. RequireInternalSlot(S, [[SetData]])를 수행합니다.
  3. valueCanonicalizeKeyedCollectionKey(value)로 설정합니다.
  4. S.[[SetData]]의 각 요소 e에 대해,
    1. eempty가 아니고 SameValue(e, value)가 true이면,
      1. S를 반환합니다.
  5. valueS.[[SetData]]에 추가합니다.
  6. S를 반환합니다.

24.2.4.2 Set.prototype.clear ( )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. RequireInternalSlot(S, [[SetData]])를 수행합니다.
  3. S.[[SetData]]의 각 요소 e에 대해,
    1. S.[[SetData]]에서 값이 e인 요소를 값이 empty인 요소로 대체합니다.
  4. undefined를 반환합니다.
참고

기존 [[SetData]] 리스트는 보존됩니다. 왜냐하면 해당 리스트를 반복 중인 Set Iterator 객체가 존재할 수 있기 때문입니다.

24.2.4.3 Set.prototype.constructor

Set.prototype.constructor의 초기 값은 %Set%입니다.

24.2.4.4 Set.prototype.delete ( value )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. RequireInternalSlot(S, [[SetData]])를 수행합니다.
  3. valueCanonicalizeKeyedCollectionKey(value)로 설정합니다.
  4. S.[[SetData]]의 각 요소 e에 대해,
    1. eempty가 아니고 SameValue(e, value)가 true이면,
      1. S.[[SetData]]에서 값이 e인 요소를 값이 empty인 요소로 대체합니다.
      2. true를 반환합니다.
  5. false를 반환합니다.
참고

empty 값은 항목이 삭제됨을 나타내는 명세 장치로 사용됩니다. 실제 구현은 내부 데이터 구조에서 항목을 물리적으로 제거하는 등 다른 동작을 할 수 있습니다.

24.2.4.5 Set.prototype.difference ( other )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[SetData]])를 수행합니다.
  3. otherRec를 ? GetSetRecord(other)로 설정합니다.
  4. resultSetDataO.[[SetData]]의 복사본으로 설정합니다.
  5. SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]]이면,
    1. thisSizeO.[[SetData]]의 요소 개수로 설정합니다.
    2. index를 0으로 설정합니다.
    3. index < thisSize인 동안 반복합니다,
      1. eresultSetData[index]로 설정합니다.
      2. eempty가 아니면,
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))로 설정합니다.
        2. inOthertrue이면,
          1. resultSetData[index]를 empty로 설정합니다.
      3. indexindex + 1로 설정합니다.
  6. 그 밖의 경우,
    1. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])로 설정합니다.
    2. nextnot-started로 설정합니다.
    3. nextdone가 아닐 동안 반복합니다,
      1. next를 ? IteratorStepValue(keysIter)로 설정합니다.
      2. nextdone가 아니면,
        1. nextCanonicalizeKeyedCollectionKey(next)로 설정합니다.
        2. valueIndexSetDataIndex(resultSetData, next)로 설정합니다.
        3. valueIndexnot-found가 아니면,
          1. resultSetData[valueIndex]를 empty로 설정합니다.
  7. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)로 설정합니다.
  8. result.[[SetData]]resultSetData로 설정합니다.
  9. result를 반환합니다.

24.2.4.6 Set.prototype.entries ( )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. CreateSetIterator(S, key+value)를 반환합니다.
참고

반복 목적상, Set은 각 항목의 key와 value가 동일한 값을 갖는 Map과 유사하게 동작합니다.

24.2.4.7 Set.prototype.forEach ( callback [ , thisArg ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. RequireInternalSlot(S, [[SetData]])를 수행합니다.
  3. IsCallable(callback)가 false이면 TypeError 예외를 throw합니다.
  4. entriesS.[[SetData]]로 설정합니다.
  5. numEntriesentries의 요소 개수로 설정합니다.
  6. index를 0으로 설정합니다.
  7. index < numEntries인 동안 반복합니다,
    1. eentries[index]로 설정합니다.
    2. indexindex + 1로 설정합니다.
    3. eempty가 아니면,
      1. Call(callback, thisArg, « e, e, S »)를 수행합니다.
      2. 참고: entries의 요소 개수는 callback 실행 중에 증가할 수 있습니다.
      3. numEntriesentries의 요소 개수로 설정합니다.
  8. undefined를 반환합니다.
참고

callback은 세 개의 인수를 받는 함수여야 합니다. forEach는 Set 객체에 존재하는 각 값에 대해 값 삽입 순서대로 callback을 한 번씩 호출합니다. callback은 실제로 존재하는 값에 대해서만 호출되며, Set에서 삭제된 키에 대해서는 호출되지 않습니다.

thisArg 매개변수가 제공되면 callback을 호출할 때 this 값으로 사용됩니다. 제공되지 않으면 undefined가 대신 사용됩니다.

callback은 세 개의 인수로 호출됩니다. 처음 두 인수는 Set에 포함된 값이며, 두 인수 모두 동일한 값이 전달됩니다. 세 번째 인수는 순회 중인 Set 객체입니다.

callback이 세 개의 인수로 호출되는 이유는 Map과 Array의 forEach 메서드에서 사용되는 콜백 함수와 일관성을 유지하기 위함입니다. Set에서는 각 항목 값이 key와 value로 모두 간주됩니다.

forEach는 호출된 객체를 직접 변경하지 않지만, callback 호출로 인해 객체가 변경될 수 있습니다.

각 값은 일반적으로 한 번만 방문됩니다. 하지만, 값이 방문된 후 삭제되고 forEach 호출이 끝나기 전에 다시 추가되면 다시 방문될 수 있습니다. forEach 호출이 시작된 후 방문되기 전에 삭제된 값은 forEach가 완료되기 전에 다시 추가되지 않으면 방문되지 않습니다. forEach 호출이 시작된 후 추가된 새로운 값도 방문됩니다.

24.2.4.8 Set.prototype.has ( value )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. RequireInternalSlot(S, [[SetData]])를 수행합니다.
  3. valueCanonicalizeKeyedCollectionKey(value)로 설정합니다.
  4. S.[[SetData]]의 각 요소 e에 대해,
    1. eempty가 아니고 SameValue(e, value)가 true이면 true를 반환합니다.
  5. false를 반환합니다.

24.2.4.9 Set.prototype.intersection ( other )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[SetData]])를 수행합니다.
  3. otherRec를 ? GetSetRecord(other)로 설정합니다.
  4. resultSetData를 새로운 빈 리스트로 설정합니다.
  5. SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]]이면,
    1. thisSizeO.[[SetData]]의 요소 개수로 설정합니다.
    2. index를 0으로 설정합니다.
    3. index < thisSize인 동안 반복합니다,
      1. eO.[[SetData]][index]로 설정합니다.
      2. indexindex + 1로 설정합니다.
      3. eempty가 아니면,
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))로 설정합니다.
        2. inOthertrue이면,
          1. 참고: 이전 otherRec.[[Has]] 호출이 O.[[SetData]]의 요소를 제거하고 다시 추가할 수 있으므로, 동일한 요소가 이 반복 중에 두 번 방문될 수 있습니다.
          2. SetDataHas(resultSetData, e)가 false이면,
            1. eresultSetData에 추가합니다.
        3. 참고: O.[[SetData]]의 요소 개수는 otherRec.[[Has]] 실행 중에 증가할 수 있습니다.
        4. thisSizeO.[[SetData]]의 요소 개수로 설정합니다.
  6. 그 밖의 경우,
    1. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])로 설정합니다.
    2. nextnot-started로 설정합니다.
    3. nextdone가 아닐 동안 반복합니다,
      1. next를 ? IteratorStepValue(keysIter)로 설정합니다.
      2. nextdone가 아니면,
        1. nextCanonicalizeKeyedCollectionKey(next)로 설정합니다.
        2. inThisSetDataHas(O.[[SetData]], next)로 설정합니다.
        3. inThistrue이면,
          1. 참고: other는 임의의 객체이므로, "keys" 이터레이터가 동일한 값을 여러 번 생산할 수 있습니다.
          2. SetDataHas(resultSetData, next)가 false이면
            1. nextresultSetData에 추가합니다.
  7. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)로 설정합니다.
  8. result.[[SetData]]resultSetData로 설정합니다.
  9. result를 반환합니다.

24.2.4.10 Set.prototype.isDisjointFrom ( other )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[SetData]])를 수행합니다.
  3. otherRec를 ? GetSetRecord(other)로 설정합니다.
  4. SetDataSize(O.[[SetData]]) ≤ otherRec.[[Size]]이면,
    1. thisSizeO.[[SetData]]의 요소 개수로 설정합니다.
    2. index를 0으로 설정합니다.
    3. index < thisSize인 동안 반복합니다,
      1. eO.[[SetData]][index]로 설정합니다.
      2. indexindex + 1로 설정합니다.
      3. eempty가 아니면,
        1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))로 설정합니다.
        2. inOthertrue이면 false를 반환합니다.
        3. 참고: O.[[SetData]]의 요소 개수는 otherRec.[[Has]] 실행 중에 증가할 수 있습니다.
        4. thisSizeO.[[SetData]]의 요소 개수로 설정합니다.
  5. 그 밖의 경우,
    1. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])로 설정합니다.
    2. nextnot-started로 설정합니다.
    3. nextdone가 아닐 동안 반복합니다,
      1. next를 ? IteratorStepValue(keysIter)로 설정합니다.
      2. nextdone가 아니면,
        1. SetDataHas(O.[[SetData]], next)가 true이면,
          1. IteratorClose(keysIter, NormalCompletion(unused)).
          2. false를 반환합니다.
  6. true를 반환합니다.

24.2.4.11 Set.prototype.isSubsetOf ( other )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[SetData]])를 수행합니다.
  3. otherRec를 ? GetSetRecord(other)로 설정합니다.
  4. SetDataSize(O.[[SetData]]) > otherRec.[[Size]]이면 false를 반환합니다.
  5. thisSizeO.[[SetData]]의 요소 개수로 설정합니다.
  6. index를 0으로 설정합니다.
  7. index < thisSize인 동안 반복합니다,
    1. eO.[[SetData]][index]로 설정합니다.
    2. indexindex + 1로 설정합니다.
    3. eempty가 아니면,
      1. inOtherToBoolean(? Call(otherRec.[[Has]], otherRec.[[SetObject]], « e »))로 설정합니다.
      2. inOtherfalse이면 false를 반환합니다.
      3. 참고: O.[[SetData]]의 요소 개수는 otherRec.[[Has]] 실행 중에 증가할 수 있습니다.
      4. thisSizeO.[[SetData]]의 요소 개수로 설정합니다.
  8. true를 반환합니다.

24.2.4.12 Set.prototype.isSupersetOf ( other )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[SetData]])를 수행합니다.
  3. otherRec를 ? GetSetRecord(other)로 설정합니다.
  4. SetDataSize(O.[[SetData]]) < otherRec.[[Size]]이면 false를 반환합니다.
  5. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])로 설정합니다.
  6. nextnot-started로 설정합니다.
  7. nextdone가 아닐 동안 반복합니다,
    1. next를 ? IteratorStepValue(keysIter)로 설정합니다.
    2. nextdone가 아니면,
      1. SetDataHas(O.[[SetData]], next)가 false이면,
        1. IteratorClose(keysIter, NormalCompletion(unused)).
        2. false를 반환합니다.
  8. true를 반환합니다.

24.2.4.13 Set.prototype.keys ( )

"keys" 프로퍼티의 초기 값은 24.2.4.17에 정의된 %Set.prototype.values%입니다.

참고

반복 목적상, Set은 각 항목의 key와 value가 동일한 값을 갖는 Map과 유사하게 동작합니다.

24.2.4.14 get Set.prototype.size

Set.prototype.size접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. RequireInternalSlot(S, [[SetData]])를 수행합니다.
  3. sizeSetDataSize(S.[[SetData]])로 설정합니다.
  4. 𝔽(size)를 반환합니다.

24.2.4.15 Set.prototype.symmetricDifference ( other )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[SetData]])를 수행합니다.
  3. otherRec를 ? GetSetRecord(other)로 설정합니다.
  4. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])로 설정합니다.
  5. resultSetDataO.[[SetData]]의 복사본으로 설정합니다.
  6. nextnot-started로 설정합니다.
  7. nextdone가 아닐 동안 반복합니다,
    1. next를 ? IteratorStepValue(keysIter)로 설정합니다.
    2. nextdone가 아니면,
      1. nextCanonicalizeKeyedCollectionKey(next)로 설정합니다.
      2. resultIndexSetDataIndex(resultSetData, next)로 설정합니다.
      3. resultIndexnot-found이면 alreadyInResultfalse로, 아니면 true로 설정합니다.
      4. SetDataHas(O.[[SetData]], next)가 true이면,
        1. alreadyInResulttrue이면 resultSetData[resultIndex]를 empty로 설정합니다.
      5. 그 밖의 경우,
        1. alreadyInResultfalse이면 nextresultSetData에 추가합니다.
  8. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)로 설정합니다.
  9. result.[[SetData]]resultSetData로 설정합니다.
  10. result를 반환합니다.

24.2.4.16 Set.prototype.union ( other )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[SetData]])를 수행합니다.
  3. otherRec를 ? GetSetRecord(other)로 설정합니다.
  4. keysIter를 ? GetIteratorFromMethod(otherRec.[[SetObject]], otherRec.[[Keys]])로 설정합니다.
  5. resultSetDataO.[[SetData]]의 복사본으로 설정합니다.
  6. nextnot-started로 설정합니다.
  7. nextdone가 아닐 동안 반복합니다,
    1. next를 ? IteratorStepValue(keysIter)로 설정합니다.
    2. nextdone가 아니면,
      1. nextCanonicalizeKeyedCollectionKey(next)로 설정합니다.
      2. SetDataHas(resultSetData, next)가 false이면,
        1. nextresultSetData에 추가합니다.
  8. resultOrdinaryObjectCreate(%Set.prototype%, « [[SetData]] »)로 설정합니다.
  9. result.[[SetData]]resultSetData로 설정합니다.
  10. result를 반환합니다.

24.2.4.17 Set.prototype.values ( )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. CreateSetIterator(S, value)를 반환합니다.

24.2.4.18 Set.prototype [ %Symbol.iterator% ] ( )

%Symbol.iterator% 프로퍼티의 초기 값은 24.2.4.17에 정의된 %Set.prototype.values%입니다.

24.2.4.19 Set.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "Set"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

24.2.5 Set 인스턴스의 속성

Set 인스턴스는 일반 객체이며, Set 프로토타입 객체로부터 프로퍼티를 상속받습니다. Set 인스턴스는 [[SetData]] 내부 슬롯도 가집니다.

24.2.6 Set 이터레이터 객체

Set 이터레이터는 아래에 정의된 구조를 가지는 일반 객체이며, 특정 Set 인스턴스 객체에 대한 특정 반복을 나타냅니다. Set 이터레이터 객체에 대한 명명된 생성자는 존재하지 않습니다. 대신, Set 이터레이터 객체는 Set 인스턴스 객체의 특정 메서드를 호출하여 생성됩니다.

24.2.6.1 CreateSetIterator ( set, kind )

추상 연산 CreateSetIterator는 set (ECMAScript 언어 값)과 kind (key+value 또는 value) 인수를 받고, 정상 완료로 Generator 또는 throw 완료를 반환합니다. 이 연산은 Set 메서드가 반환하는 이터레이터 객체를 생성할 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:

  1. RequireInternalSlot(set, [[SetData]])를 수행합니다.
  2. closure를 파라미터가 없고 setkind를 캡처하는 새로운 추상 클로저로 설정합니다. 이 클로저가 호출될 때 다음 단계들을 수행합니다:
    1. index를 0으로 설정합니다.
    2. entriesset.[[SetData]]로 설정합니다.
    3. numEntriesentries의 요소 개수로 설정합니다.
    4. index < numEntries인 동안 반복합니다,
      1. eentries[index]로 설정합니다.
      2. indexindex + 1로 설정합니다.
      3. eempty가 아니면,
        1. kindkey+value이면,
          1. resultCreateArrayFromListe, e »)로 설정합니다.
          2. GeneratorYield(CreateIteratorResultObject(result, false))를 수행합니다.
        2. 그 밖의 경우,
          1. Assert: kindvalue입니다.
          2. GeneratorYield(CreateIteratorResultObject(e, false))를 수행합니다.
        3. 참고: entries의 요소 개수는 GeneratorYield에 의해 이 추상 연산의 실행이 일시 중지되는 동안 증가할 수 있습니다.
        4. numEntriesentries의 요소 개수로 설정합니다.
    5. NormalCompletion(unused)를 반환합니다.
  3. CreateIteratorFromClosure(closure, "%SetIteratorPrototype%", %SetIteratorPrototype%)를 반환합니다.

24.2.6.2 %SetIteratorPrototype% 객체

%SetIteratorPrototype% 객체:

24.2.6.2.1 %SetIteratorPrototype%.next ( )

  1. GeneratorResume(this 값, empty, "%SetIteratorPrototype%")를 반환합니다.

24.2.6.2.2 %SetIteratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "Set Iterator"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

24.3 WeakMap 객체

WeakMap은 키가 객체 및/또는 심볼이고 값이 임의의 ECMAScript 언어 값일 수 있는 키/값 쌍의 컬렉션입니다. WeakMap은 특정 키를 가진 키/값 쌍을 포함하는지 확인할 수 있지만, 키로 가지고 있는 값을 열거하는 메커니즘은 제공되지 않습니다. 특정 조건에서는 live가 아닌 값이 WeakMap 키로부터 제거됩니다. 이에 대한 자세한 내용은 9.9.3에서 설명합니다.

구현체는 WeakMap의 키/값 쌍이 접근 불가능해진 시점과 WeakMap에서 키/값 쌍이 제거되는 시점 사이에 임의로 결정한 지연(latency)을 둘 수 있습니다. 이 지연이 ECMAScript 프로그램에 관찰 가능하다면, 프로그램 실행에 영향을 미칠 수 있는 불확정성(indeterminacy)의 원인이 됩니다. 따라서 ECMAScript 구현체는 관찰자가 관찰하려는 키를 직접 제시하지 않고서는 WeakMap의 키를 관찰할 수 있는 방법을 제공해서는 안 됩니다.

WeakMap은 해시 테이블 또는 평균적으로 컬렉션의 키/값 쌍 개수에 대해 부분선형(sublinear) 접근 시간을 제공하는 다른 메커니즘으로 구현되어야 합니다. 본 명세에서 사용되는 데이터 구조는 WeakMap의 요구되는 관찰 가능 의미론만을 나타내기 위한 것이며, 실제 구현 모델로 적합한 것은 아닙니다.

참고

WeakMap과 WeakSet은 객체 또는 심볼과 동적으로 상태를 연관시키는 메커니즘을 제공하기 위해 만들어졌으며, WeakMap 또는 WeakSet 인스턴스가 없을 경우 객체 또는 심볼이 접근 불가능해져서 구현체의 가비지 컬렉션 메커니즘에 의해 자원 회수 대상이 되는 상황에서 메모리 자원이 “누수”되지 않도록 합니다. 이런 특성은 WeakMap 또는 WeakSet 인스턴스에서 키에 대해 역방향(per-object/symbol) 매핑을 사용하는 방법으로 달성할 수 있습니다. 또는 각 WeakMap/WeakSet 인스턴스가 내부적으로 키와 값 데이터를 저장할 수도 있지만, 이 방식은 WeakMap/WeakSet 구현과 가비지 컬렉터 간의 협력이 필요합니다. 다음 참조 문헌들은 WeakMap과 WeakSet 구현에 유용할 수 있는 메커니즘을 설명합니다:

Barry Hayes. 1997. Ephemerons: a new finalization mechanism. In Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications (OOPSLA '97), A. Michael Berman (Ed.). ACM, New York, NY, USA, 176-183, 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

24.3.1 WeakMap 생성자

WeakMap 생성자:

  • %WeakMap%입니다.
  • 글로벌 객체"WeakMap" 프로퍼티의 초기 값입니다.
  • 생성자로 호출될 때 새로운 WeakMap을 생성하고 초기화합니다.
  • 함수로 호출하는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외가 발생합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 WeakMap 동작을 상속하려는 서브클래스 생성자super 호출을 포함하여 WeakMap 생성자에 서브클래스 인스턴스가 WeakMap.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.

24.3.1.1 WeakMap ( [ iterable ] )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 throw합니다.
  2. map을 ? OrdinaryCreateFromConstructor(NewTarget, "%WeakMap.prototype%", « [[WeakMapData]] »)로 설정합니다.
  3. map.[[WeakMapData]]를 새로운 빈 리스트로 설정합니다.
  4. iterableundefined 또는 null이면 map을 반환합니다.
  5. adder를 ? Get(map, "set")로 설정합니다.
  6. IsCallable(adder)가 false이면 TypeError 예외를 throw합니다.
  7. AddEntriesFromIterable(map, iterable, adder)를 반환합니다.
참고

매개변수 iterable이 존재하는 경우, %Symbol.iterator% 메서드를 구현한 객체여야 하며, 이 메서드는 이터레이터 객체를 반환하고, 이터레이터 객체는 첫 번째 요소가 WeakMap 키로 사용될 값, 두 번째 요소가 그 키와 연관될 값인 두 요소의 array-like 객체를 생성합니다.

24.3.2 WeakMap 생성자의 속성

WeakMap 생성자:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%입니다.
  • 다음 프로퍼티들을 가집니다:

24.3.2.1 WeakMap.prototype

WeakMap.prototype의 초기 값은 WeakMap 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

24.3.3 WeakMap 프로토타입 객체의 속성

WeakMap 프로토타입 객체:

  • %WeakMap.prototype%입니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • 일반 객체입니다.
  • [[WeakMapData]] 내부 슬롯을 가지지 않습니다.

24.3.3.1 WeakMap.prototype.constructor

WeakMap.prototype.constructor의 초기 값은 %WeakMap%입니다.

24.3.3.2 WeakMap.prototype.delete ( key )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[WeakMapData]])를 수행합니다.
  3. CanBeHeldWeakly(key) 가 false이면, false를 반환합니다.
  4. M.[[WeakMapData]]의 각 레코드 { [[Key]], [[Value]] } p에 대해,
    1. p.[[Key]]empty가 아니고 SameValue(p.[[Key]], key)가 true이면,
      1. p.[[Key]]empty로 설정합니다.
      2. p.[[Value]]empty로 설정합니다.
      3. true를 반환합니다.
  5. false를 반환합니다.
참고

empty 값은 항목이 삭제됨을 나타내는 명세 장치로 사용됩니다. 실제 구현은 내부 데이터 구조에서 항목을 물리적으로 제거하는 등 다른 동작을 할 수 있습니다.

24.3.3.3 WeakMap.prototype.get ( key )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[WeakMapData]])를 수행합니다.
  3. CanBeHeldWeakly(key) 가 false이면, undefined를 반환합니다.
  4. M.[[WeakMapData]]의 각 레코드 { [[Key]], [[Value]] } p에 대해,
    1. p.[[Key]]empty가 아니고 SameValue(p.[[Key]], key)가 true이면 p.[[Value]]를 반환합니다.
  5. undefined를 반환합니다.

24.3.3.4 WeakMap.prototype.has ( key )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[WeakMapData]])를 수행합니다.
  3. CanBeHeldWeakly(key) 가 false이면, false를 반환합니다.
  4. M.[[WeakMapData]]의 각 레코드 { [[Key]], [[Value]] } p에 대해,
    1. p.[[Key]]empty가 아니고 SameValue(p.[[Key]], key)가 true이면 true를 반환합니다.
  5. false를 반환합니다.

24.3.3.5 WeakMap.prototype.set ( key, value )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Mthis 값으로 설정합니다.
  2. RequireInternalSlot(M, [[WeakMapData]])를 수행합니다.
  3. CanBeHeldWeakly(key) 가 false이면 TypeError 예외를 throw합니다.
  4. M.[[WeakMapData]]의 각 레코드 { [[Key]], [[Value]] } p에 대해,
    1. p.[[Key]]empty가 아니고 SameValue(p.[[Key]], key)가 true이면,
      1. p.[[Value]]value로 설정합니다.
      2. M을 반환합니다.
  5. p레코드 { [[Key]]: key, [[Value]]: value }로 설정합니다.
  6. pM.[[WeakMapData]]에 추가합니다.
  7. M을 반환합니다.

24.3.3.6 WeakMap.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "WeakMap"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

24.3.4 WeakMap 인스턴스의 속성

WeakMap 인스턴스는 일반 객체이며, WeakMap 프로토타입 객체로부터 프로퍼티를 상속받습니다. WeakMap 인스턴스는 [[WeakMapData]] 내부 슬롯도 가집니다.

24.4 WeakSet 객체

WeakSet은 객체 및/또는 심볼의 컬렉션입니다. 구별되는 객체 또는 심볼은 WeakSet 컬렉션의 요소로 한 번만 등장할 수 있습니다. WeakSet은 특정 값을 포함하는지 확인할 수 있지만, 포함된 값을 열거하는 메커니즘은 제공되지 않습니다. 특정 조건에서는 live가 아닌 값이 WeakSet 요소에서 제거됩니다. 이에 대한 자세한 내용은 9.9.3에서 설명합니다.

구현체는 WeakSet에 포함된 값이 접근 불가능해진 시점과 값이 WeakSet에서 제거되는 시점 사이에 임의로 결정한 지연(latency)을 둘 수 있습니다. 이 지연이 ECMAScript 프로그램에 관찰 가능하다면, 프로그램 실행에 영향을 미칠 수 있는 불확정성(indeterminacy)의 원인이 됩니다. 따라서 ECMAScript 구현체는 관찰자가 관찰하려는 값을 직접 제시하지 않고서는 WeakSet이 특정 값을 포함하는지 확인할 수 있는 방법을 제공해서는 안 됩니다.

WeakSet은 해시 테이블 또는 평균적으로 컬렉션의 요소 개수에 대해 부분선형(sublinear) 접근 시간을 제공하는 다른 메커니즘으로 구현되어야 합니다. 본 명세에서 사용되는 데이터 구조는 WeakSet의 요구되는 관찰 가능 의미론만을 나타내기 위한 것이며, 실제 구현 모델로 적합한 것은 아닙니다.

참고

24.3의 NOTE를 참조하세요.

24.4.1 WeakSet 생성자

WeakSet 생성자:

  • %WeakSet%입니다.
  • 글로벌 객체"WeakSet" 프로퍼티의 초기 값입니다.
  • 생성자로 호출될 때 새로운 WeakSet을 생성하고 초기화합니다.
  • 함수로 호출하는 것은 의도된 사용이 아니며, 그렇게 호출하면 예외가 발생합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 WeakSet 동작을 상속하려는 서브클래스 생성자super 호출을 포함하여 WeakSet 생성자에 서브클래스 인스턴스가 WeakSet.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.

24.4.1.1 WeakSet ( [ iterable ] )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 throw합니다.
  2. set을 ? OrdinaryCreateFromConstructor(NewTarget, "%WeakSet.prototype%", « [[WeakSetData]] »)로 설정합니다.
  3. set.[[WeakSetData]]를 새로운 빈 리스트로 설정합니다.
  4. iterableundefined 또는 null이면 set을 반환합니다.
  5. adder를 ? Get(set, "add")로 설정합니다.
  6. IsCallable(adder)가 false이면 TypeError 예외를 throw합니다.
  7. iteratorRecord를 ? GetIterator(iterable, sync)로 설정합니다.
  8. 반복합니다,
    1. next를 ? IteratorStepValue(iteratorRecord)로 설정합니다.
    2. nextdone이면 set을 반환합니다.
    3. statusCompletion(Call(adder, set, « next »))로 설정합니다.
    4. IfAbruptCloseIterator(status, iteratorRecord)를 수행합니다.

24.4.2 WeakSet 생성자의 속성

WeakSet 생성자:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%입니다.
  • 다음 프로퍼티들을 가집니다:

24.4.2.1 WeakSet.prototype

WeakSet.prototype의 초기 값은 WeakSet 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

24.4.3 WeakSet 프로토타입 객체의 속성

WeakSet 프로토타입 객체:

  • %WeakSet.prototype%입니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • 일반 객체입니다.
  • [[WeakSetData]] 내부 슬롯을 가지지 않습니다.

24.4.3.1 WeakSet.prototype.add ( value )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. RequireInternalSlot(S, [[WeakSetData]])를 수행합니다.
  3. CanBeHeldWeakly(value) 가 false이면 TypeError 예외를 throw합니다.
  4. S.[[WeakSetData]]의 각 요소 e에 대해,
    1. eempty가 아니고 SameValue(e, value)가 true이면,
      1. S를 반환합니다.
  5. valueS.[[WeakSetData]]에 추가합니다.
  6. S를 반환합니다.

24.4.3.2 WeakSet.prototype.constructor

WeakSet.prototype.constructor의 초기 값은 %WeakSet%입니다.

24.4.3.3 WeakSet.prototype.delete ( value )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. RequireInternalSlot(S, [[WeakSetData]])를 수행합니다.
  3. CanBeHeldWeakly(value) 가 false이면 false를 반환합니다.
  4. S.[[WeakSetData]]의 각 요소 e에 대해,
    1. eempty가 아니고 SameValue(e, value)가 true이면,
      1. S.[[WeakSetData]]에서 값이 e인 요소를 값이 empty인 요소로 대체합니다.
      2. true를 반환합니다.
  5. false를 반환합니다.
참고

empty 값은 항목이 삭제됨을 나타내는 명세 장치로 사용됩니다. 실제 구현은 내부 데이터 구조에서 항목을 물리적으로 제거하는 등 다른 동작을 할 수 있습니다.

24.4.3.4 WeakSet.prototype.has ( value )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Sthis 값으로 설정합니다.
  2. RequireInternalSlot(S, [[WeakSetData]])를 수행합니다.
  3. CanBeHeldWeakly(value) 가 false이면 false를 반환합니다.
  4. S.[[WeakSetData]]의 각 요소 e에 대해,
    1. eempty가 아니고 SameValue(e, value)가 true이면 true를 반환합니다.
  5. false를 반환합니다.

24.4.3.5 WeakSet.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "WeakSet"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

24.4.4 WeakSet 인스턴스의 속성

WeakSet 인스턴스는 일반 객체이며, WeakSet 프로토타입 객체로부터 프로퍼티를 상속받습니다. WeakSet 인스턴스는 [[WeakSetData]] 내부 슬롯도 가집니다.

24.5 키드 컬렉션을 위한 추상 연산

24.5.1 CanonicalizeKeyedCollectionKey ( key )

추상 연산 CanonicalizeKeyedCollectionKey는 인수 key (ECMAScript 언어 값)를 받고 ECMAScript 언어 값를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. key-0𝔽이면 +0𝔽를 반환합니다.
  2. key를 반환합니다.

25 구조화된 데이터

25.1 ArrayBuffer 객체

25.1.1 표기법

아래 기술된 설명과 25.4, 29에서는 read-modify-write 수정 함수 내부 데이터 구조를 사용합니다.

read-modify-write 수정 함수는 두 개의 리스트바이트 값를 인자로 받아 리스트를 반환하는 추상 클로저로 표현되는 수학적 함수입니다. 이 추상 클로저는 다음의 모든 특성을 만족합니다:

  • 알고리즘의 모든 단계가 원자적으로 수행됩니다.
  • 각 단계별 알고리즘은 관찰할 수 없습니다.
참고

read-modify-write 수정 함수의 알고리즘 단계가 순수한 수학적 함수임을 검증하기 위해 다음과 같은 편집 규약을 권장합니다:

  • 직접적으로 또는 호출된 추상 연산 및 추상 클로저를 통해 인자와 캡처된 값 이외의 언어값 또는 명세값에 접근하지 않습니다.
  • 직접적으로 또는 간접적으로 추상 연산Completion Record를 반환하는 추상 클로저를 호출하지 않습니다.
  • Completion Record를 반환하지 않습니다.

25.1.2 고정 길이 및 크기 조절 가능한 ArrayBuffer 객체

고정 길이 ArrayBuffer는 생성 후 바이트 길이가 변경될 수 없는 ArrayBuffer입니다.

크기 조절 가능한 ArrayBufferArrayBuffer.prototype.resize ( newLength ) 호출을 통해 생성 후 바이트 길이가 변경될 수 있는 ArrayBuffer입니다.

생성되는 ArrayBuffer 객체의 종류는 ArrayBuffer ( length [ , options ] )에 전달되는 인자에 따라 결정됩니다.

25.1.3 ArrayBuffer 객체를 위한 추상 연산

25.1.3.1 AllocateArrayBuffer ( constructor, byteLength [ , maxByteLength ] )

추상 연산 AllocateArrayBuffer는 인자 constructor (생성자), byteLength (0 이상의 정수), 선택적 인자 maxByteLength (0 이상의 정수 또는 empty)를 받고, 정상 완료로 ArrayBuffer 또는 throw 완료를 반환합니다. 이 연산은 ArrayBuffer를 생성할 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:

  1. slots를 « [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] »로 설정합니다.
  2. maxByteLength가 존재하며 maxByteLengthempty가 아니면, allocatingResizableBuffertrue로, 그렇지 않으면 false로 설정합니다.
  3. allocatingResizableBuffertrue이면,
    1. byteLength > maxByteLength이면 RangeError 예외를 throw합니다.
    2. [[ArrayBufferMaxByteLength]]slots에 추가합니다.
  4. obj를 ? OrdinaryCreateFromConstructor(constructor, "%ArrayBuffer.prototype%", slots)로 설정합니다.
  5. block을 ? CreateByteDataBlock(byteLength)로 설정합니다.
  6. obj.[[ArrayBufferData]]block을 설정합니다.
  7. obj.[[ArrayBufferByteLength]]byteLength를 설정합니다.
  8. allocatingResizableBuffertrue이면,
    1. maxByteLength 바이트로 구성된 Data Block block을 생성할 수 없다면 RangeError 예외를 throw합니다.
    2. 참고: 크기 조절 가능한 ArrayBuffer는 제자리(in-place) 확장이 가능하도록 설계되어 있습니다. 구현체는 예를 들어 가상 메모리를 미리 예약할 수 없는 경우 throw할 수 있습니다.
    3. obj.[[ArrayBufferMaxByteLength]]maxByteLength를 설정합니다.
  9. obj를 반환합니다.

25.1.3.2 ArrayBufferByteLength ( arrayBuffer, order )

추상 연산 ArrayBufferByteLength는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer)와 order (seq-cst 또는 unordered)를 받아 0 이상의 정수를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. IsSharedArrayBuffer(arrayBuffer) 가 true이고 arrayBuffer[[ArrayBufferByteLengthData]] 내부 슬롯을 가지고 있으면,
    1. bufferByteLengthBlockarrayBuffer.[[ArrayBufferByteLengthData]]로 설정합니다.
    2. rawLengthGetRawBytesFromSharedBlock(bufferByteLengthBlock, 0, biguint64, true, order)로 설정합니다.
    3. isLittleEndian주변 에이전트에이전트 레코드[[LittleEndian]] 필드 값으로 설정합니다.
    4. (RawBytesToNumeric(biguint64, rawLength, isLittleEndian))를 반환합니다.
  2. Assert: IsDetachedBuffer(arrayBuffer) 가 false임을 확인합니다.
  3. arrayBuffer.[[ArrayBufferByteLength]]를 반환합니다.

25.1.3.3 ArrayBufferCopyAndDetach ( arrayBuffer, newLength, preserveResizability )

추상 연산 ArrayBufferCopyAndDetach는 인자 arrayBuffer (ECMAScript 언어 값), newLength (ECMAScript 언어 값), preserveResizability (preserve-resizability 또는 fixed-length)를 받고, 정상 완료로 ArrayBuffer 또는 throw 완료를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. RequireInternalSlot(arrayBuffer, [[ArrayBufferData]])를 수행합니다.
  2. IsSharedArrayBuffer(arrayBuffer) 가 true이면 TypeError 예외를 throw합니다.
  3. newLengthundefined이면,
    1. newByteLengtharrayBuffer.[[ArrayBufferByteLength]]로 설정합니다.
  4. 그 밖의 경우,
    1. newByteLength를 ? ToIndex(newLength)로 설정합니다.
  5. IsDetachedBuffer(arrayBuffer) 가 true이면 TypeError 예외를 throw합니다.
  6. preserveResizabilitypreserve-resizability이고 IsFixedLengthArrayBuffer(arrayBuffer) 가 false이면,
    1. newMaxByteLengtharrayBuffer.[[ArrayBufferMaxByteLength]]로 설정합니다.
  7. 그 밖의 경우,
    1. newMaxByteLengthempty로 설정합니다.
  8. arrayBuffer.[[ArrayBufferDetachKey]]undefined가 아니면 TypeError 예외를 throw합니다.
  9. newBuffer를 ? AllocateArrayBuffer(%ArrayBuffer%, newByteLength, newMaxByteLength)로 설정합니다.
  10. copyLengthmin(newByteLength, arrayBuffer.[[ArrayBufferByteLength]])로 설정합니다.
  11. fromBlockarrayBuffer.[[ArrayBufferData]]로 설정합니다.
  12. toBlocknewBuffer.[[ArrayBufferData]]로 설정합니다.
  13. CopyDataBlockBytes(toBlock, 0, fromBlock, 0, copyLength)를 수행합니다.
  14. 참고: 새로운 Data Block 생성이나 기존 Data Block에서 복사는 관찰할 수 없습니다. 구현체는 이 메서드를 zero-copy 이동 또는 realloc으로 구현할 수 있습니다.
  15. DetachArrayBuffer(arrayBuffer)를 수행합니다.
  16. newBuffer를 반환합니다.

25.1.3.4 IsDetachedBuffer ( arrayBuffer )

추상 연산 IsDetachedBuffer는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer)를 받아 Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. arrayBuffer.[[ArrayBufferData]]null이면 true를 반환합니다.
  2. false를 반환합니다.

25.1.3.5 DetachArrayBuffer ( arrayBuffer [ , key ] )

추상 연산 DetachArrayBuffer는 인자 arrayBuffer (ArrayBuffer)와 선택적 인자 key (임의 타입)를 받아 정상 완료로 unused 또는 throw 완료를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: IsSharedArrayBuffer(arrayBuffer) 가 false임을 확인합니다.
  2. key가 존재하지 않으면 keyundefined로 설정합니다.
  3. arrayBuffer.[[ArrayBufferDetachKey]]key와 다르면 TypeError 예외를 throw합니다.
  4. arrayBuffer.[[ArrayBufferData]]null로 설정합니다.
  5. arrayBuffer.[[ArrayBufferByteLength]]를 0으로 설정합니다.
  6. unused를 반환합니다.
참고

ArrayBuffer 인스턴스를 detach하면 Data Block과 인스턴스의 연결이 해제되고 버퍼의 바이트 길이가 0으로 설정됩니다.

25.1.3.6 CloneArrayBuffer ( srcBuffer, srcByteOffset, srcLength )

추상 연산 CloneArrayBuffer는 인자 srcBuffer (ArrayBuffer 또는 SharedArrayBuffer), srcByteOffset (0 이상의 정수), srcLength (0 이상의 정수)를 받고, 정상 완료로 ArrayBuffer 또는 throw 완료를 반환합니다. srcBuffer의 데이터 중 srcByteOffset에서 시작해 srcLength 바이트만큼 복사한 데이터를 가진 새로운 ArrayBuffer를 생성합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: IsDetachedBuffer(srcBuffer) 가 false임을 확인합니다.
  2. targetBuffer를 ? AllocateArrayBuffer(%ArrayBuffer%, srcLength)로 설정합니다.
  3. srcBlocksrcBuffer.[[ArrayBufferData]]로 설정합니다.
  4. targetBlocktargetBuffer.[[ArrayBufferData]]로 설정합니다.
  5. CopyDataBlockBytes(targetBlock, 0, srcBlock, srcByteOffset, srcLength)를 수행합니다.
  6. targetBuffer를 반환합니다.

25.1.3.7 GetArrayBufferMaxByteLengthOption ( options )

추상 연산 GetArrayBufferMaxByteLengthOption은 인자 options (ECMAScript 언어 값)를 받고, 정상 완료로 0 이상의 정수 또는 empty, 또는 throw 완료를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. options객체가 아니면 empty를 반환합니다.
  2. maxByteLength를 ? Get(options, "maxByteLength")로 설정합니다.
  3. maxByteLengthundefined이면 empty를 반환합니다.
  4. ToIndex(maxByteLength)를 반환합니다.

25.1.3.8 HostResizeArrayBuffer ( buffer, newByteLength )

호스트 정의 추상 연산 HostResizeArrayBuffer는 인자 buffer (ArrayBuffer)와 newByteLength (0 이상의 정수)를 받고, 정상 완료로 handled 또는 unhandled 또는 throw 완료를 반환합니다. 이 연산은 호스트구현 정의 방식으로 buffer를 리사이즈할 기회를 제공합니다. 호스트가 리사이즈를 처리하지 않기로 선택하면, 기본 동작에 대해 unhandled를 반환할 수 있습니다.

HostResizeArrayBuffer의 구현은 다음 요구사항을 따라야 합니다:

  • 이 추상 연산은 buffer를 detach하지 않습니다.
  • 정상적으로 handled로 완료되면, buffer.[[ArrayBufferByteLength]]newByteLength입니다.

HostResizeArrayBuffer의 기본 구현은 NormalCompletion(unhandled)를 반환하는 것입니다.

25.1.3.9 IsFixedLengthArrayBuffer ( arrayBuffer )

추상 연산 IsFixedLengthArrayBuffer는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer)를 받아 Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. arrayBuffer[[ArrayBufferMaxByteLength]] 내부 슬롯을 가지고 있으면 false를 반환합니다.
  2. true를 반환합니다.

25.1.3.10 IsUnsignedElementType ( type )

추상 연산 IsUnsignedElementType은 인자 type (TypedArray 요소 타입)을 받아 Boolean을 반환합니다. type이 unsigned TypedArray 요소 타입인지 확인합니다. 호출 시 다음 단계들을 수행합니다:

  1. typeuint8, uint8clamped, uint16, uint32, biguint64 중 하나이면 true를 반환합니다.
  2. false를 반환합니다.

25.1.3.11 IsUnclampedIntegerElementType ( type )

추상 연산 IsUnclampedIntegerElementType은 인자 type (TypedArray 요소 타입)을 받아 Boolean을 반환합니다. type정수 TypedArray 요소 타입이며 uint8clamped은 제외하는지 확인합니다. 호출 시 다음 단계들을 수행합니다:

  1. typeint8, uint8, int16, uint16, int32, uint32 중 하나이면 true를 반환합니다.
  2. false를 반환합니다.

25.1.3.12 IsBigIntElementType ( type )

추상 연산 IsBigIntElementType은 인자 type (TypedArray 요소 타입)을 받아 Boolean을 반환합니다. typeBigInt TypedArray 요소 타입인지 확인합니다. 호출 시 다음 단계들을 수행합니다:

  1. typebiguint64 또는 bigint64이면 true를 반환합니다.
  2. false를 반환합니다.

25.1.3.13 IsNoTearConfiguration ( type, order )

추상 연산 IsNoTearConfiguration은 인자 type (TypedArray 요소 타입)과 order (seq-cst, unordered, init)를 받아 Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. IsUnclampedIntegerElementType(type) 이 true이면 true를 반환합니다.
  2. IsBigIntElementType(type) 이 true이고 orderinit 또는 unordered가 아니면 true를 반환합니다.
  3. false를 반환합니다.

25.1.3.14 RawBytesToNumeric ( type, rawBytes, isLittleEndian )

추상 연산 RawBytesToNumeric은 인자 type (TypedArray 요소 타입), rawBytes (리스트 of 바이트 값), isLittleEndian (Boolean)을 받고 Number 또는 BigInt를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. elementSize표 75의 Element Type type에 지정된 Element Size 값으로 설정합니다.
  2. isLittleEndianfalse이면 rawBytes의 요소 순서를 반대로 합니다.
  3. typefloat16이면,
    1. valuerawBytes의 바이트 요소를 이어붙여 little-endian 비트 문자열로 해석하여 IEEE 754-2019 binary16 값을 인코딩합니다.
    2. value가 NaN이면 NaN를 반환합니다.
    3. value에 해당하는 Number 값을 반환합니다.
  4. typefloat32이면,
    1. valuerawBytes의 바이트 요소를 이어붙여 little-endian 비트 문자열로 해석하여 IEEE 754-2019 binary32 값을 인코딩합니다.
    2. value가 NaN이면 NaN를 반환합니다.
    3. value에 해당하는 Number 값을 반환합니다.
  5. typefloat64이면,
    1. valuerawBytes의 바이트 요소를 이어붙여 little-endian 비트 문자열로 해석하여 IEEE 754-2019 binary64 값을 인코딩합니다.
    2. value가 NaN이면 NaN를 반환합니다.
    3. value에 해당하는 Number 값을 반환합니다.
  6. IsUnsignedElementType(type) 이 true이면,
    1. intValuerawBytes의 바이트 요소를 이어붙여 unsigned little-endian 이진수로 해석합니다.
  7. 그 밖의 경우,
    1. intValuerawBytes의 바이트 요소를 이어붙여 elementSize × 8 비트 길이의 이진 little-endian 2의 보수수로 해석합니다.
  8. IsBigIntElementType(type) 이 true이면 intValue에 해당하는 BigInt 값을 반환합니다.
  9. 그 밖의 경우 intValue에 해당하는 Number 값을 반환합니다.

25.1.3.15 GetRawBytesFromSharedBlock ( block, byteIndex, type, isTypedArray, order )

추상 연산 GetRawBytesFromSharedBlock은 인자 block (공유 데이터 블록), byteIndex (0 이상의 정수), type (TypedArray 요소 타입), isTypedArray (Boolean), order (seq-cst 또는 unordered)를 받고, 리스트 of 바이트 값을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. elementSize표 75의 Element Type type에 지정된 Element Size 값으로 설정합니다.
  2. execution주변 에이전트에이전트 레코드[[CandidateExecution]] 필드로 설정합니다.
  3. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record로 설정합니다.
  4. isTypedArraytrue이고 IsNoTearConfiguration(type, order)가 true이면 noTeartrue로, 아니면 false로 설정합니다.
  5. rawValueelementSize 길이의 리스트로 설정하고, 각 요소는 비결정적으로 선택된 바이트 값입니다.
  6. 참고: 구현에서는 rawValue는 하드웨어에서 비원자적 또는 원자적 읽기 명령 결과입니다. 비결정성은 메모리 모델의 약한 일관성 하드웨어의 관찰 가능한 동작을 설명하기 위한 의미론적 규정입니다.
  7. readEventReadSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize }로 설정합니다.
  8. readEventeventsRecord.[[EventList]]에 추가합니다.
  9. Chosen Value Record { [[Event]]: readEvent, [[ChosenValue]]: rawValue }를 execution.[[ChosenValues]]에 추가합니다.
  10. rawValue를 반환합니다.

25.1.3.16 GetValueFromBuffer ( arrayBuffer, byteIndex, type, isTypedArray, order [ , isLittleEndian ] )

추상 연산 GetValueFromBuffer는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer), byteIndex (0 이상의 정수), type (TypedArray 요소 타입), isTypedArray (Boolean), order (seq-cst 또는 unordered), 선택적 인자 isLittleEndian (Boolean)을 받고 Number 또는 BigInt를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: IsDetachedBuffer(arrayBuffer)가 false임을 확인합니다.
  2. Assert: arrayBufferbyteIndex부터 type 값을 표현할 충분한 바이트가 있어야 합니다.
  3. blockarrayBuffer.[[ArrayBufferData]]로 설정합니다.
  4. elementSize표 75의 Element Type type에 지정된 Element Size 값으로 설정합니다.
  5. IsSharedArrayBuffer(arrayBuffer)가 true이면,
    1. Assert: block공유 데이터 블록이어야 합니다.
    2. rawValueGetRawBytesFromSharedBlock(block, byteIndex, type, isTypedArray, order)로 설정합니다.
  6. 그 밖의 경우,
    1. rawValue리스트로 설정하고, 각 요소는 blockbyteIndex (포함)부터 byteIndex + elementSize (제외)까지의 인덱스에 있는 바이트입니다.
  7. Assert: rawValue의 요소 개수는 elementSize여야 합니다.
  8. isLittleEndian이 존재하지 않으면, isLittleEndian주변 에이전트에이전트 레코드[[LittleEndian]] 값으로 설정합니다.
  9. RawBytesToNumeric(type, rawValue, isLittleEndian)를 반환합니다.

25.1.3.17 NumericToRawBytes ( type, value, isLittleEndian )

추상 연산 NumericToRawBytes는 인자 type (TypedArray 요소 타입), value (Number 또는 BigInt), isLittleEndian (Boolean)을 받고 리스트 of 바이트 값을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. typefloat16이면,
    1. rawBytes리스트로 설정하고, 각 요소는 valueIEEE 754-2019 binary16 형식으로 roundTiesToEven 모드로 변환한 2 바이트입니다. 바이트는 리틀 엔디안 순서로 배열됩니다. valueNaN이면 rawBytes는 구현체가 선택한 IEEE 754-2019 binary16 형식 NaN 인코딩 중 하나로 설정될 수 있습니다. 구현체는 구분 가능한 NaN 값마다 항상 동일한 인코딩을 선택해야 합니다.
  2. 그 밖의 경우 typefloat32이면,
    1. rawBytes리스트로 설정하고, 각 요소는 valueIEEE 754-2019 binary32 형식으로 roundTiesToEven 모드로 변환한 4 바이트입니다. 바이트는 리틀 엔디안 순서로 배열됩니다. valueNaN이면 rawBytes는 구현체가 선택한 IEEE 754-2019 binary32 형식 NaN 인코딩 중 하나로 설정될 수 있습니다. 구현체는 구분 가능한 NaN 값마다 항상 동일한 인코딩을 선택해야 합니다.
  3. 그 밖의 경우 typefloat64이면,
    1. rawBytes리스트로 설정하고, 각 요소는 IEEE 754-2019 binary64 형식으로 value를 인코딩한 8 바이트입니다. 바이트는 리틀 엔디안 순서로 배열됩니다. valueNaN이면 rawBytes는 구현체가 선택한 IEEE 754-2019 binary64 형식 NaN 인코딩 중 하나로 설정될 수 있습니다. 구현체는 구분 가능한 NaN 값마다 항상 동일한 인코딩을 선택해야 합니다.
  4. 그 밖의 경우,
    1. n표 75의 Element Type type에 지정된 Element Size 값으로 설정합니다.
    2. conversionOperation표 75의 Element Type type의 Conversion Operation 열에 명시된 추상 연산으로 설정합니다.
    3. intValue(!conversionOperation(value))로 설정합니다.
    4. intValue ≥ 0이면,
      1. rawBytes리스트로 설정하고, 각 요소는 intValuen 바이트 이진 인코딩입니다. 바이트는 리틀 엔디안 순서로 배열됩니다.
    5. 그 밖의 경우,
      1. rawBytes리스트로 설정하고, 각 요소는 intValuen 바이트 이진 2의 보수 인코딩입니다. 바이트는 리틀 엔디안 순서로 배열됩니다.
  5. isLittleEndianfalse이면 rawBytes의 요소 순서를 반대로 합니다.
  6. rawBytes를 반환합니다.

25.1.3.18 SetValueInBuffer ( arrayBuffer, byteIndex, type, value, isTypedArray, order [ , isLittleEndian ] )

추상 연산 SetValueInBuffer는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer), byteIndex (0 이상의 정수), type (TypedArray 요소 타입), value (Number 또는 BigInt), isTypedArray (Boolean), order (seq-cst, unordered, init), 선택적 인자 isLittleEndian (Boolean)를 받고 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: IsDetachedBuffer(arrayBuffer) 가 false임을 확인합니다.
  2. Assert: arrayBufferbyteIndex부터 type 값 표현에 충분한 바이트가 있어야 합니다.
  3. Assert: IsBigIntElementType(type) 가 true이면 valueBigInt이어야 하며, 아니면 valueNumber여야 한다는 점을 확인합니다.
  4. blockarrayBuffer.[[ArrayBufferData]]로 설정합니다.
  5. elementSize표 75의 Element Type type에 지정된 Element Size 값으로 설정합니다.
  6. isLittleEndian이 존재하지 않으면, isLittleEndian주변 에이전트에이전트 레코드[[LittleEndian]] 값으로 설정합니다.
  7. rawBytesNumericToRawBytes(type, value, isLittleEndian)로 설정합니다.
  8. IsSharedArrayBuffer(arrayBuffer) 가 true이면,
    1. execution주변 에이전트에이전트 레코드[[CandidateExecution]] 필드로 설정합니다.
    2. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record로 설정합니다.
    3. isTypedArraytrue이고 IsNoTearConfiguration(type, order)가 true이면 noTeartrue로, 아니면 false로 설정합니다.
    4. WriteSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes }를 eventsRecord.[[EventList]]에 추가합니다.
  9. 그 밖의 경우,
    1. rawBytes의 각 바이트를 blockblock[byteIndex]부터 저장합니다.
  10. unused를 반환합니다.

25.1.3.19 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op )

추상 연산 GetModifySetValueInBuffer는 인자 arrayBuffer (ArrayBuffer 또는 SharedArrayBuffer), byteIndex (0 이상의 정수), type (TypedArray 요소 타입), value (Number 또는 BigInt), op (read-modify-write 수정 함수)를 받고 Number 또는 BigInt를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: IsDetachedBuffer(arrayBuffer) 가 false임을 확인합니다.
  2. Assert: arrayBufferbyteIndex부터 type 값 표현에 충분한 바이트가 있어야 합니다.
  3. Assert: IsBigIntElementType(type) 가 true이면 valueBigInt이어야 하며, 아니면 valueNumber여야 한다는 점을 확인합니다.
  4. blockarrayBuffer.[[ArrayBufferData]]로 설정합니다.
  5. elementSize표 75의 Element Type type에 지정된 Element Size 값으로 설정합니다.
  6. isLittleEndian주변 에이전트에이전트 레코드[[LittleEndian]] 값으로 설정합니다.
  7. rawBytesNumericToRawBytes(type, value, isLittleEndian)로 설정합니다.
  8. IsSharedArrayBuffer(arrayBuffer) 가 true이면,
    1. execution주변 에이전트에이전트 레코드[[CandidateExecution]] 필드로 설정합니다.
    2. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record로 설정합니다.
    3. rawBytesReadelementSize 길이의 리스트로 설정하고, 각 요소는 비결정적으로 선택된 바이트 값입니다.
    4. 참고: 구현에서는 rawBytesRead는 하드웨어에서 load-link, load-exclusive 또는 read-modify-write 명령의 피연산자 결과입니다. 비결정성은 메모리 모델의 약한 일관성 하드웨어의 관찰 가능한 동작을 설명하기 위한 의미론적 규정입니다.
    5. rmwEventReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes, [[ModifyOp]]: op }로 설정합니다.
    6. rmwEventeventsRecord.[[EventList]]에 추가합니다.
    7. Chosen Value Record { [[Event]]: rmwEvent, [[ChosenValue]]: rawBytesRead }를 execution.[[ChosenValues]]에 추가합니다.
  9. 그 밖의 경우,
    1. rawBytesReadelementSize 길이의 리스트로 설정하고, 각 요소는 block[byteIndex]부터 시작하는 elementSize 바이트입니다.
    2. rawBytesModifiedop(rawBytesRead, rawBytes)로 설정합니다.
    3. rawBytesModified의 각 바이트를 blockblock[byteIndex]부터 저장합니다.
  10. RawBytesToNumeric(type, rawBytesRead, isLittleEndian)를 반환합니다.

25.1.4 ArrayBuffer 생성자

ArrayBuffer 생성자:

  • %ArrayBuffer%입니다.
  • 글로벌 객체"ArrayBuffer" 프로퍼티의 초기 값입니다.
  • 생성자로 호출될 때 새로운 ArrayBuffer를 생성하고 초기화합니다.
  • 함수로 호출하는 것은 의도된 사용이 아니며, 이렇게 호출하면 예외가 발생합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 ArrayBuffer 동작을 상속하려는 서브클래스 생성자super 호출을 포함하여 ArrayBuffer 생성자에 서브클래스 인스턴스가 ArrayBuffer.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.

25.1.4.1 ArrayBuffer ( length [ , options ] )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 throw합니다.
  2. byteLength를 ? ToIndex(length)로 설정합니다.
  3. requestedMaxByteLength를 ? GetArrayBufferMaxByteLengthOption(options)로 설정합니다.
  4. AllocateArrayBuffer(NewTarget, byteLength, requestedMaxByteLength)를 반환합니다.

25.1.5 ArrayBuffer 생성자의 속성

ArrayBuffer 생성자:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%입니다.
  • 다음 프로퍼티들을 가집니다:

25.1.5.1 ArrayBuffer.isView ( arg )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. arg객체가 아니면 false를 반환합니다.
  2. arg[[ViewedArrayBuffer]] 내부 슬롯을 가지고 있으면 true를 반환합니다.
  3. false를 반환합니다.

25.1.5.2 ArrayBuffer.prototype

ArrayBuffer.prototype의 초기 값은 ArrayBuffer 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

25.1.5.3 get ArrayBuffer [ %Symbol.species% ]

ArrayBuffer[%Symbol.species%]접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]"입니다.

참고

ArrayBuffer.prototype.slice ( start, end )는 일반적으로 자신의 this 값의 생성자를 사용하여 파생 객체를 생성합니다. 그러나 서브클래스 생성자ArrayBuffer.prototype.slice ( start, end ) 메서드의 기본 동작을 %Symbol.species% 프로퍼티를 재정의하여 오버라이드할 수 있습니다.

25.1.6 ArrayBuffer 프로토타입 객체의 속성

ArrayBuffer 프로토타입 객체:

  • %ArrayBuffer.prototype%입니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • 일반 객체입니다.
  • [[ArrayBufferData]] 또는 [[ArrayBufferByteLength]] 내부 슬롯을 가지지 않습니다.

25.1.6.1 get ArrayBuffer.prototype.byteLength

ArrayBuffer.prototype.byteLength접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferData]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 true이면 TypeError 예외를 throw합니다.
  4. IsDetachedBuffer(O) 가 true이면 +0𝔽를 반환합니다.
  5. lengthO.[[ArrayBufferByteLength]]로 설정합니다.
  6. 𝔽(length)를 반환합니다.

25.1.6.2 ArrayBuffer.prototype.constructor

ArrayBuffer.prototype.constructor의 초기 값은 %ArrayBuffer%입니다.

25.1.6.3 get ArrayBuffer.prototype.detached

ArrayBuffer.prototype.detached접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferData]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 true이면 TypeError 예외를 throw합니다.
  4. IsDetachedBuffer(O)를 반환합니다.

25.1.6.4 get ArrayBuffer.prototype.maxByteLength

ArrayBuffer.prototype.maxByteLength접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferData]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 true이면 TypeError 예외를 throw합니다.
  4. IsDetachedBuffer(O) 가 true이면 +0𝔽를 반환합니다.
  5. IsFixedLengthArrayBuffer(O) 가 true이면,
    1. lengthO.[[ArrayBufferByteLength]]로 설정합니다.
  6. 그 밖의 경우,
    1. lengthO.[[ArrayBufferMaxByteLength]]로 설정합니다.
  7. 𝔽(length)를 반환합니다.

25.1.6.5 get ArrayBuffer.prototype.resizable

ArrayBuffer.prototype.resizable접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferData]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 true이면 TypeError 예외를 throw합니다.
  4. IsFixedLengthArrayBuffer(O) 가 false이면 true를 반환하고, 그 밖의 경우 false를 반환합니다.

25.1.6.6 ArrayBuffer.prototype.resize ( newLength )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferMaxByteLength]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 true이면 TypeError 예외를 throw합니다.
  4. newByteLength를 ? ToIndex(newLength)로 설정합니다.
  5. IsDetachedBuffer(O) 가 true이면 TypeError 예외를 throw합니다.
  6. newByteLength > O.[[ArrayBufferMaxByteLength]]이면 RangeError 예외를 throw합니다.
  7. hostHandled를 ? HostResizeArrayBuffer(O, newByteLength)로 설정합니다.
  8. hostHandledhandled이면 undefined를 반환합니다.
  9. oldBlockO.[[ArrayBufferData]]로 설정합니다.
  10. newBlock을 ? CreateByteDataBlock(newByteLength)로 설정합니다.
  11. copyLengthmin(newByteLength, O.[[ArrayBufferByteLength]])로 설정합니다.
  12. CopyDataBlockBytes(newBlock, 0, oldBlock, 0, copyLength)를 수행합니다.
  13. 참고: 새로운 Data Block 생성이나 기존 Data Block에서의 복사는 관찰할 수 없습니다. 구현체는 이 메서드를 제자리(in-place) 확장 또는 축소로 구현할 수 있습니다.
  14. O.[[ArrayBufferData]]newBlock을 설정합니다.
  15. O.[[ArrayBufferByteLength]]newByteLength를 설정합니다.
  16. undefined를 반환합니다.

25.1.6.7 ArrayBuffer.prototype.slice ( start, end )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferData]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 true이면 TypeError 예외를 throw합니다.
  4. IsDetachedBuffer(O) 가 true이면 TypeError 예외를 throw합니다.
  5. lenO.[[ArrayBufferByteLength]]로 설정합니다.
  6. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  7. relativeStart = -∞이면 first를 0으로 설정합니다.
  8. 그 밖의 경우 relativeStart < 0이면 firstmax(len + relativeStart, 0)으로 설정합니다.
  9. 그 밖의 경우 firstmin(relativeStart, len)으로 설정합니다.
  10. endundefined이면 relativeEndlen으로, 아니면 relativeEnd를 ? ToIntegerOrInfinity(end)으로 설정합니다.
  11. relativeEnd = -∞이면 final을 0으로 설정합니다.
  12. 그 밖의 경우 relativeEnd < 0이면 finalmax(len + relativeEnd, 0)으로 설정합니다.
  13. 그 밖의 경우 finalmin(relativeEnd, len)으로 설정합니다.
  14. newLenmax(final - first, 0)으로 설정합니다.
  15. ctor를 ? SpeciesConstructor(O, %ArrayBuffer%)로 설정합니다.
  16. new를 ? Construct(ctor, « 𝔽(newLen) »)로 설정합니다.
  17. RequireInternalSlot(new, [[ArrayBufferData]])를 수행합니다.
  18. IsSharedArrayBuffer(new) 가 true이면 TypeError 예외를 throw합니다.
  19. IsDetachedBuffer(new) 가 true이면 TypeError 예외를 throw합니다.
  20. SameValue(new, O) 가 true이면 TypeError 예외를 throw합니다.
  21. new.[[ArrayBufferByteLength]] < newLen이면 TypeError 예외를 throw합니다.
  22. 참고: 위 단계의 부작용으로 O가 detach 또는 resize 되었을 수 있습니다.
  23. IsDetachedBuffer(O) 가 true이면 TypeError 예외를 throw합니다.
  24. fromBufO.[[ArrayBufferData]]로 설정합니다.
  25. toBufnew.[[ArrayBufferData]]로 설정합니다.
  26. currentLenO.[[ArrayBufferByteLength]]로 설정합니다.
  27. first < currentLen이면,
    1. countmin(newLen, currentLen - first)로 설정합니다.
    2. CopyDataBlockBytes(toBuf, 0, fromBuf, first, count)를 수행합니다.
  28. new를 반환합니다.

25.1.6.8 ArrayBuffer.prototype.transfer ( [ newLength ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. ArrayBufferCopyAndDetach(O, newLength, preserve-resizability)를 반환합니다.

25.1.6.9 ArrayBuffer.prototype.transferToFixedLength ( [ newLength ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. ArrayBufferCopyAndDetach(O, newLength, fixed-length)를 반환합니다.

25.1.6.10 ArrayBuffer.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "ArrayBuffer"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

25.1.7 ArrayBuffer 인스턴스의 속성

ArrayBuffer 인스턴스는 ArrayBuffer 프로토타입 객체로부터 프로퍼티를 상속받습니다. 각 ArrayBuffer 인스턴스는 [[ArrayBufferData]] 내부 슬롯, [[ArrayBufferByteLength]] 내부 슬롯, [[ArrayBufferDetachKey]] 내부 슬롯을 가집니다. 크기 조절 가능한 ArrayBuffer 인스턴스는 [[ArrayBufferMaxByteLength]] 내부 슬롯도 가집니다.

[[ArrayBufferData]]null인 ArrayBuffer 인스턴스는 detach된 것으로 간주되며, 해당 인스턴스의 데이터를 접근하거나 수정하는 모든 연산자는 실패합니다.

[[ArrayBufferDetachKey]]undefined이 아닌 값으로 설정된 ArrayBuffer 인스턴스는 DetachArrayBuffer 호출 시 동일한 "detach key"를 인수로 전달해야 하며, 그렇지 않으면 TypeError가 발생합니다. 이 내부 슬롯은 본 명세의 알고리즘이 아닌 특정 임베딩 환경에서만 설정됩니다.

25.1.8 크기 조절 가능한 ArrayBuffer 가이드라인

참고 1

다음은 크기 조절 가능한 ArrayBuffer를 사용하는 ECMAScript 프로그래머를 위한 지침입니다.

가능하다면 프로그램을 실제 배포 환경에서 테스트할 것을 권장합니다. 사용 가능한 물리적 메모리의 양은 하드웨어 장치마다 크게 다릅니다. 가상 메모리 서브시스템 역시 하드웨어 및 운영 체제마다 매우 다릅니다. 64비트 데스크탑 웹 브라우저에서 메모리 부족 없이 실행되는 애플리케이션이 32비트 모바일 웹 브라우저에서는 메모리 부족 오류가 발생할 수 있습니다.

크기 조절 가능한 ArrayBuffer"maxByteLength" 옵션 값을 선택할 때는, 애플리케이션에 필요한 최소 크기를 선택할 것을 권장합니다. "maxByteLength"가 1,073,741,824 (230 바이트 또는 1GiB)를 초과하지 않도록 권장합니다.

특정 최대 크기로 크기 조절 가능한 ArrayBuffer 인스턴스를 성공적으로 생성했다고 해서 이후 크기 조절이 항상 성공한다는 보장은 없습니다.

참고 2

다음은 크기 조절 가능한 ArrayBuffer를 구현하는 ECMAScript 구현자(엔진 개발자)를 위한 지침입니다.

크기 조절 가능한 ArrayBuffer는 리사이즈 시 복사로 구현하거나, 가상 메모리를 미리 예약하여 제자리(in-place) 확장으로 구현하거나, 생성자"maxByteLength" 옵션 값에 따라 두 방식을 혼합하여 구현할 수 있습니다.

호스트가 다중 테넌트(여러 ECMAScript 애플리케이션을 동시에 실행) 환경(예: 웹 브라우저)이고, 가상 메모리를 미리 예약해서 제자리 확장 방식을 구현한다면, 32비트와 64비트 모두 "maxByteLength" ≥ 1GiB~1.5GiB 값에 대해 throw하도록 권장합니다. 이는 단일 애플리케이션이 가상 메모리 주소 공간을 고갈시키는 위험과 상호운용성 위험을 줄이기 위함입니다.

호스트가 가상 메모리가 없는 경우(예: MMU 없는 임베디드 디바이스), 또는 복사로만 리사이즈를 구현하는 경우, "maxByteLength" 옵션에 대해 임의의 Number 값을 허용할 수 있습니다. 하지만 요청한 크기의 메모리 블록을 절대 할당할 수 없는 경우에는 RangeError를 throw할 것을 권장합니다. 예를 들어, 요청한 크기가 디바이스의 최대 사용 가능한 메모리보다 클 때입니다.

25.2 SharedArrayBuffer 객체

25.2.1 고정 길이 및 성장 가능한 SharedArrayBuffer 객체

고정 길이 SharedArrayBuffer는 생성 후 바이트 길이가 변경될 수 없는 SharedArrayBuffer입니다.

성장 가능한 SharedArrayBufferSharedArrayBuffer.prototype.grow ( newLength ) 호출을 통해 생성 후 바이트 길이가 증가할 수 있는 SharedArrayBuffer입니다.

생성되는 SharedArrayBuffer 객체의 종류는 SharedArrayBuffer ( length [ , options ] )에 전달되는 인자에 따라 결정됩니다.

25.2.2 SharedArrayBuffer 객체를 위한 추상 연산

25.2.2.1 AllocateSharedArrayBuffer ( constructor, byteLength [ , maxByteLength ] )

추상 연산 AllocateSharedArrayBuffer는 인자 constructor (생성자), byteLength (0 이상의 정수), 선택적 인자 maxByteLength (0 이상의 정수 또는 empty)를 받고, 정상 완료로 SharedArrayBuffer 또는 throw 완료를 반환합니다. 이 연산은 SharedArrayBuffer를 생성할 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:

  1. slots를 « [[ArrayBufferData]] »로 설정합니다.
  2. maxByteLength가 존재하며 maxByteLengthempty가 아니면, allocatingGrowableBuffertrue로, 그렇지 않으면 false로 설정합니다.
  3. allocatingGrowableBuffertrue이면,
    1. byteLength > maxByteLength이면 RangeError 예외를 throw합니다.
    2. [[ArrayBufferByteLengthData]][[ArrayBufferMaxByteLength]]slots에 추가합니다.
  4. 그 밖의 경우,
    1. [[ArrayBufferByteLength]]slots에 추가합니다.
  5. obj를 ? OrdinaryCreateFromConstructor(constructor, "%SharedArrayBuffer.prototype%", slots)로 설정합니다.
  6. allocatingGrowableBuffertrue이면 allocLengthmaxByteLength로, 아니면 byteLength로 설정합니다.
  7. block을 ? CreateSharedByteDataBlock(allocLength)로 설정합니다.
  8. obj.[[ArrayBufferData]]block을 설정합니다.
  9. allocatingGrowableBuffertrue이면,
    1. Assert: byteLengthmaxByteLength임을 확인합니다.
    2. byteLengthBlock을 ? CreateSharedByteDataBlock(8)로 설정합니다.
    3. SetValueInBuffer(byteLengthBlock, 0, biguint64, (byteLength), true, seq-cst)를 수행합니다.
    4. obj.[[ArrayBufferByteLengthData]]byteLengthBlock을 설정합니다.
    5. obj.[[ArrayBufferMaxByteLength]]maxByteLength를 설정합니다.
  10. 그 밖의 경우,
    1. obj.[[ArrayBufferByteLength]]byteLength를 설정합니다.
  11. obj를 반환합니다.

25.2.2.2 IsSharedArrayBuffer ( obj )

추상 연산 IsSharedArrayBuffer는 인자 obj (ArrayBuffer 또는 SharedArrayBuffer)를 받아 Boolean을 반환합니다. 이 연산은 객체가 ArrayBuffer, SharedArrayBuffer 또는 그 서브타입인지 테스트합니다. 호출 시 다음 단계들을 수행합니다:

  1. bufferDataobj.[[ArrayBufferData]]로 설정합니다.
  2. bufferDatanull이면 false를 반환합니다.
  3. bufferDataData Block이면 false를 반환합니다.
  4. Assert: bufferDataShared Data Block임을 확인합니다.
  5. true를 반환합니다.

25.2.2.3 HostGrowSharedArrayBuffer ( buffer, newByteLength )

호스트 정의 추상 연산 HostGrowSharedArrayBuffer는 인자 buffer (SharedArrayBuffer)와 newByteLength (0 이상의 정수)를 받고, 정상 완료로 handled 또는 unhandled 또는 throw 완료를 반환합니다. 이 연산은 호스트구현 정의 방식으로 buffer를 성장시킬 기회를 제공합니다. 호스트가 성장 처리를 하지 않기로 선택하면, 기본 동작에 대해 unhandled를 반환할 수 있습니다.

HostGrowSharedArrayBuffer의 구현은 다음 요구사항을 따라야 합니다:

  • 추상 연산이 unhandled로 정상 완료하지 않고, newByteLengthbuffer의 현재 바이트 길이보다 작거나 newByteLengthbuffer.[[ArrayBufferMaxByteLength]]보다 크면 RangeError 예외를 throw합니다.
  • isLittleEndian주변 에이전트에이전트 레코드[[LittleEndian]] 값으로 설정합니다. 추상 연산이 handled로 정상 완료되면, WriteSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트가 추가되어야 하며, [[Order]]seq-cst, [[Payload]]NumericToRawBytes(biguint64, newByteLength, isLittleEndian), [[Block]]buffer.[[ArrayBufferByteLengthData]], [[ByteIndex]]는 0, 그리고 [[ElementSize]] 는 8이어야 하며, 주변 에이전트candidate execution에 추가되어야 하며, 경쟁적으로 호출된 SharedArrayBuffer.prototype.grow가 "손실"되지 않도록 해야 합니다.
참고

위 두 번째 요구사항은 buffer의 현재 바이트 길이를 언제 어떻게 읽는지에 대해 의도적으로 모호하게 작성되어 있습니다. 바이트 길이는 하드웨어에서 원자적 read-modify-write 연산을 통해 갱신되어야 하므로, load-link/store-conditional 또는 load-exclusive/store-exclusive 명령 쌍을 사용하는 아키텍처는 해당 명령을 명령 스트림 내에서 가깝게 유지할 수 있습니다. 따라서 SharedArrayBuffer.prototype.grow 자체는 newByteLength에 대해 경계 검사를 수행하지 않으며, 현재 바이트 길이를 언제 읽는지에 대한 요구사항도 없습니다.

이는 HostResizeArrayBuffer와는 대조적인데, 이 연산은 newByteLength 값이 ≥ 0이고 buffer.[[ArrayBufferMaxByteLength]] ≤ 값임을 보장합니다.

HostGrowSharedArrayBuffer의 기본 구현은 NormalCompletion(unhandled)를 반환하는 것입니다.

25.2.3 SharedArrayBuffer 생성자

SharedArrayBuffer 생성자:

  • %SharedArrayBuffer%입니다.
  • 글로벌 객체"SharedArrayBuffer" 프로퍼티의 초기 값입니다(해당 프로퍼티가 존재하는 경우, 아래 참조).
  • 생성자로 호출될 때 새로운 SharedArrayBuffer를 생성하고 초기화합니다.
  • 함수로 호출하는 것은 의도된 사용이 아니며, 이렇게 호출하면 예외가 발생합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 SharedArrayBuffer 동작을 상속하려는 서브클래스 생성자super 호출을 포함하여 SharedArrayBuffer 생성자에 서브클래스 인스턴스가 SharedArrayBuffer.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.

호스트가 SharedArrayBuffer에 대한 동시 접근을 제공하지 않는 경우, 글로벌 객체에서 "SharedArrayBuffer" 프로퍼티를 생략할 수 있습니다.

참고

ArrayBuffer와 달리 SharedArrayBuffer는 detach될 수 없으며, 내부 [[ArrayBufferData]] 슬롯이 null이 되는 일이 없습니다.

25.2.3.1 SharedArrayBuffer ( length [ , options ] )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 throw합니다.
  2. byteLength를 ? ToIndex(length)로 설정합니다.
  3. requestedMaxByteLength를 ? GetArrayBufferMaxByteLengthOption(options)로 설정합니다.
  4. AllocateSharedArrayBuffer(NewTarget, byteLength, requestedMaxByteLength)를 반환합니다.

25.2.4 SharedArrayBuffer 생성자의 속성

SharedArrayBuffer 생성자:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%입니다.
  • 다음 프로퍼티들을 가집니다:

25.2.4.1 SharedArrayBuffer.prototype

SharedArrayBuffer.prototype의 초기 값은 SharedArrayBuffer 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

25.2.4.2 get SharedArrayBuffer [ %Symbol.species% ]

SharedArrayBuffer[%Symbol.species%]접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]"입니다.

25.2.5 SharedArrayBuffer 프로토타입 객체의 속성

SharedArrayBuffer 프로토타입 객체:

  • %SharedArrayBuffer.prototype%입니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • 일반 객체입니다.
  • [[ArrayBufferData]] 또는 [[ArrayBufferByteLength]] 내부 슬롯을 가지지 않습니다.

25.2.5.1 get SharedArrayBuffer.prototype.byteLength

SharedArrayBuffer.prototype.byteLength접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferData]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 false이면 TypeError 예외를 throw합니다.
  4. lengthArrayBufferByteLength(O, seq-cst)로 설정합니다.
  5. 𝔽(length)를 반환합니다.

25.2.5.2 SharedArrayBuffer.prototype.constructor

SharedArrayBuffer.prototype.constructor의 초기 값은 %SharedArrayBuffer%입니다.

25.2.5.3 SharedArrayBuffer.prototype.grow ( newLength )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferMaxByteLength]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 false이면 TypeError 예외를 throw합니다.
  4. newByteLength를 ? ToIndex(newLength)로 설정합니다.
  5. hostHandled를 ? HostGrowSharedArrayBuffer(O, newByteLength)로 설정합니다.
  6. hostHandledhandled이면 undefined를 반환합니다.
  7. isLittleEndian주변 에이전트에이전트 레코드[[LittleEndian]] 값으로 설정합니다.
  8. byteLengthBlockO.[[ArrayBufferByteLengthData]]로 설정합니다.
  9. currentByteLengthRawBytesGetRawBytesFromSharedBlock(byteLengthBlock, 0, biguint64, true, seq-cst)로 설정합니다.
  10. newByteLengthRawBytesNumericToRawBytes(biguint64, (newByteLength), isLittleEndian)로 설정합니다.
  11. 반복합니다,
    1. 참고: 이 루프는 동일 버퍼에 대해 병렬적으로 경쟁적으로 grow하는 경우를 완전히 순서화하고, 손실되지 않으며, 조용히 아무것도 하지 않는 일이 없도록 하기 위한 compare-and-exchange 루프입니다. 경쟁이 없는 경우 grow 시도를 할 수 있으면 반복을 종료합니다.
    2. currentByteLength(RawBytesToNumeric(biguint64, currentByteLengthRawBytes, isLittleEndian))로 설정합니다.
    3. newByteLength = currentByteLength이면 undefined를 반환합니다.
    4. newByteLength < currentByteLength 또는 newByteLength > O.[[ArrayBufferMaxByteLength]]이면 RangeError 예외를 throw합니다.
    5. byteLengthDeltanewByteLength - currentByteLength로 설정합니다.
    6. byteLengthDelta 바이트로 구성된 Shared Data Block 값을 생성할 수 없으면 RangeError 예외를 throw합니다.
    7. 참고: 여기서는 새로운 Shared Data Block를 생성 및 사용하지 않습니다. growable SharedArrayBuffer의 관찰 가능한 동작은 생성 시 max 크기의 Shared Data Block를 할당하도록 명세되며, 이 단계는 구현체가 메모리 부족이면 RangeError를 throw해야 한다는 요구사항을 담고 있습니다.
    8. readByteLengthRawBytesAtomicCompareExchangeInSharedBlock(byteLengthBlock, 0, 8, currentByteLengthRawBytes, newByteLengthRawBytes)로 설정합니다.
    9. ByteListEqual(readByteLengthRawBytes, currentByteLengthRawBytes)가 true이면 undefined를 반환합니다.
    10. currentByteLengthRawBytesreadByteLengthRawBytes로 설정합니다.
참고

길이 갱신을 위한 compare-exchange의 허위 실패는 금지됩니다. 새로운 길이에 대한 경계 검사가 통과되고 구현체가 메모리 부족이 아니라면, ReadModifyWriteSharedMemory 이벤트(즉, 성공적인 compare-exchange)가 항상 candidate execution에 추가됩니다.

SharedArrayBuffer.prototype.grow의 병렬 호출은 완전히 순서화됩니다. 예를 들어, 두 개의 경쟁 호출 sab.grow(10)sab.grow(20)이 있을 때, 두 호출 중 하나는 반드시 경쟁에서 승리합니다. sab.grow(10) 호출은 sab.grow(20)이 먼저 발생한 경우에도 sab를 축소하지 않으며, 대신 RangeError를 throw합니다.

25.2.5.4 get SharedArrayBuffer.prototype.growable

SharedArrayBuffer.prototype.growable접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferData]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 false이면 TypeError 예외를 throw합니다.
  4. IsFixedLengthArrayBuffer(O) 가 false이면 true를 반환하고, 그 밖의 경우 false를 반환합니다.

25.2.5.5 get SharedArrayBuffer.prototype.maxByteLength

SharedArrayBuffer.prototype.maxByteLength접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferData]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 false이면 TypeError 예외를 throw합니다.
  4. IsFixedLengthArrayBuffer(O) 가 true이면,
    1. lengthO.[[ArrayBufferByteLength]]로 설정합니다.
  5. 그 밖의 경우,
    1. lengthO.[[ArrayBufferMaxByteLength]]로 설정합니다.
  6. 𝔽(length)를 반환합니다.

25.2.5.6 SharedArrayBuffer.prototype.slice ( start, end )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[ArrayBufferData]])를 수행합니다.
  3. IsSharedArrayBuffer(O) 가 false이면 TypeError 예외를 throw합니다.
  4. lenArrayBufferByteLength(O, seq-cst)로 설정합니다.
  5. relativeStart를 ? ToIntegerOrInfinity(start)로 설정합니다.
  6. relativeStart = -∞이면 first를 0으로 설정합니다.
  7. 그 밖의 경우 relativeStart < 0이면 firstmax(len + relativeStart, 0)으로 설정합니다.
  8. 그 밖의 경우 firstmin(relativeStart, len)으로 설정합니다.
  9. endundefined이면 relativeEndlen으로, 아니면 relativeEnd를 ? ToIntegerOrInfinity(end)으로 설정합니다.
  10. relativeEnd = -∞이면 final을 0으로 설정합니다.
  11. 그 밖의 경우 relativeEnd < 0이면 finalmax(len + relativeEnd, 0)으로 설정합니다.
  12. 그 밖의 경우 finalmin(relativeEnd, len)으로 설정합니다.
  13. newLenmax(final - first, 0)으로 설정합니다.
  14. ctor를 ? SpeciesConstructor(O, %SharedArrayBuffer%)로 설정합니다.
  15. new를 ? Construct(ctor, « 𝔽(newLen) »)로 설정합니다.
  16. RequireInternalSlot(new, [[ArrayBufferData]])를 수행합니다.
  17. IsSharedArrayBuffer(new) 가 false이면 TypeError 예외를 throw합니다.
  18. new.[[ArrayBufferData]]O.[[ArrayBufferData]]와 같으면 TypeError 예외를 throw합니다.
  19. ArrayBufferByteLength(new, seq-cst) < newLen이면 TypeError 예외를 throw합니다.
  20. fromBufO.[[ArrayBufferData]]로 설정합니다.
  21. toBufnew.[[ArrayBufferData]]로 설정합니다.
  22. CopyDataBlockBytes(toBuf, 0, fromBuf, first, newLen)를 수행합니다.
  23. new를 반환합니다.

25.2.5.7 SharedArrayBuffer.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "SharedArrayBuffer"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

25.2.6 SharedArrayBuffer 인스턴스의 속성

SharedArrayBuffer 인스턴스는 SharedArrayBuffer 프로토타입 객체로부터 프로퍼티를 상속받습니다. 각 SharedArrayBuffer 인스턴스는 [[ArrayBufferData]] 내부 슬롯을 가집니다. 성장 불가능한 SharedArrayBuffer 인스턴스는 [[ArrayBufferByteLength]] 내부 슬롯을 가집니다. 성장 가능한 인스턴스는 [[ArrayBufferByteLengthData]][[ArrayBufferMaxByteLength]] 내부 슬롯을 가집니다.

참고

SharedArrayBuffer 인스턴스는 ArrayBuffer 인스턴스와 달리 detach되지 않습니다.

25.2.7 확장 가능한 SharedArrayBuffer 가이드라인

참고 1

다음은 확장 가능한 SharedArrayBuffer를 사용하는 ECMAScript 프로그래머를 위한 지침입니다.

가능하다면 프로그램을 실제 배포 환경에서 테스트할 것을 권장합니다. 사용 가능한 물리적 메모리의 양은 하드웨어 장치마다 크게 다릅니다. 가상 메모리 서브시스템 역시 하드웨어 및 운영 체제마다 매우 다릅니다. 64비트 데스크탑 웹 브라우저에서 메모리 부족 없이 실행되는 애플리케이션이 32비트 모바일 웹 브라우저에서는 메모리 부족 오류가 발생할 수 있습니다.

확장 가능한 SharedArrayBuffer"maxByteLength" 옵션 값을 선택할 때는, 애플리케이션에 필요한 최소 크기를 선택할 것을 권장합니다. "maxByteLength"가 1073741824 (1GiB)를 초과하지 않도록 권장합니다.

특정 최대 크기로 확장 가능한 SharedArrayBuffer 인스턴스를 성공적으로 생성했다고 해서 이후 확장이 항상 성공한다는 보장은 없습니다.

확장 가능한 SharedArrayBuffer의 길이(length)를 읽는 모든 연산이 동기화 seq-cst 로드인 것은 아닙니다. 정수 인덱스 프로퍼티 접근(예: u8[idx])의 경계 검사에 사용되는 길이 읽기는 동기화되지 않습니다. 일반적으로 명시적 동기화가 없는 경우 한 번의 프로퍼티 접근이 경계 내(in-bound)라는 사실이 이후 동일 에이전트의 프로퍼티 접근도 경계 내임을 의미하지 않습니다. 반면, SharedArrayBuffer의 lengthbyteLength getter, %TypedArray%.prototype 및 DataView.prototype에서 명시적으로 길이를 읽는 연산은 동기화됩니다. 내장 메서드가 TypedArray가 완전히 경계 밖(out-of-bounds)인지 확인하는 데 수행하는 길이 읽기도 동기화됩니다.

참고 2

다음은 확장 가능한 SharedArrayBuffer를 구현하는 ECMAScript 구현자(엔진 개발자)를 위한 지침입니다.

확장 가능한 SharedArrayBuffer는 가상 메모리를 미리 예약하여 제자리(in-place) 확장 방식으로 구현할 것을 권장합니다.

확장 연산은 확장 가능한 SharedArrayBuffer에서 메모리 접근과 병렬로 발생할 수 있으므로, 메모리 모델의 제약에 따라 unordered 접근도 "tear"되지 않아야 합니다(값의 비트가 뒤섞이지 않음). 실제로 이는 확장 가능한 SharedArrayBuffer의 기반 데이터 블록을 복사로 확장할 수 없음을 의미합니다. 복사로 확장하려면 세계 정지를(stop-the-world) 해야 하며, 이는 직렬화 지점을 도입해 느려지므로 권장하지 않습니다.

확장된 메모리는 생성 순간부터 모든 경쟁적(racy) 병렬 접근에서도 0으로 채워진 상태로 보여야 합니다. 이는 필요 시 0으로 채워지는 가상 메모리 페이지를 사용하거나, 메모리를 직접 0으로 채울 경우 철저한 동기화를 통해 달성할 수 있습니다.

정수 인덱스 프로퍼티 접근 시 TypedArray 뷰를 통한 확장 가능한 SharedArrayBuffer는, TypedArray 뷰의 비확장 SharedArrayBuffer 접근과 유사하게 최적화될 수 있도록 설계되었습니다. 이는 정수 인덱스 프로퍼티 로드가 기반 버퍼의 길이에 대해 동기화되지 않기 때문입니다(위 프로그래머 지침 참조). 예를 들어, 프로퍼티 접근에 대한 경계 검사가 여전히 루프 바깥으로 이동(hoist)될 수 있습니다.

실제로 가상 메모리가 없는 호스트(예: MMU 없는 임베디드 디바이스)에서 확장 가능한 SharedArrayBuffer를 복사로 구현하는 것은 어렵습니다. 이런 호스트에서 확장 가능한 SharedArrayBuffer의 메모리 사용 동작은 가상 메모리가 있는 호스트와 크게 다를 수 있습니다. 이런 호스트는 사용자에게 메모리 사용 기대치를 명확하게 안내해야 합니다.

25.3 DataView 객체

25.3.1 DataView 객체를 위한 추상 연산

25.3.1.1 버퍼 위트니스 레코드를 가진 DataView

버퍼 위트니스 레코드를 가진 DataViewRecord 값으로, DataView와 함께 뷰잉하는 버퍼의 바이트 길이 캐시를 캡슐화합니다. 이는 뷰잉하는 버퍼가 확장 가능한 SharedArrayBuffer일 때 바이트 길이 데이터 블록에 대해 단일 공유 메모리 읽기 이벤트가 있도록 돕기 위해 사용됩니다.

버퍼 위트니스 레코드를 가진 DataView는 표 77에 나열된 필드를 가집니다.

표 77: 버퍼 위트니스 레코드를 가진 DataView의 필드
필드 이름 의미
[[Object]] DataView 바이트 길이가 로드된 DataView 객체
[[CachedBufferByteLength]] 0 이상의 정수 또는 detached Record가 생성될 때 객체의 [[ViewedArrayBuffer]]의 바이트 길이

25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj, order )

추상 연산 MakeDataViewWithBufferWitnessRecord는 인자 obj (DataView)와 order (seq-cst 또는 unordered)를 받고, 버퍼 위트니스 레코드를 가진 DataView를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. bufferobj.[[ViewedArrayBuffer]]로 설정합니다.
  2. IsDetachedBuffer(buffer) 가 true이면,
    1. byteLengthdetached로 설정합니다.
  3. 그 밖의 경우,
    1. byteLengthArrayBufferByteLength(buffer, order)로 설정합니다.
  4. 버퍼 위트니스 레코드를 가진 DataView { [[Object]]: obj, [[CachedBufferByteLength]]: byteLength }를 반환합니다.

25.3.1.3 GetViewByteLength ( viewRecord )

추상 연산 GetViewByteLength는 인자 viewRecord (버퍼 위트니스 레코드를 가진 DataView)를 받아 0 이상의 정수를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: IsViewOutOfBounds(viewRecord) 가 false임을 확인합니다.
  2. viewviewRecord.[[Object]]로 설정합니다.
  3. view.[[ByteLength]]auto가 아니면 view.[[ByteLength]]를 반환합니다.
  4. Assert: IsFixedLengthArrayBuffer(view.[[ViewedArrayBuffer]])가 false임을 확인합니다.
  5. byteOffsetview.[[ByteOffset]]로 설정합니다.
  6. byteLengthviewRecord.[[CachedBufferByteLength]]로 설정합니다.
  7. Assert: byteLengthdetached가 아님을 확인합니다.
  8. byteLength - byteOffset을 반환합니다.

25.3.1.4 IsViewOutOfBounds ( viewRecord )

추상 연산 IsViewOutOfBounds는 인자 viewRecord (버퍼 위트니스 레코드를 가진 DataView)를 받아 Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. viewviewRecord.[[Object]]로 설정합니다.
  2. bufferByteLengthviewRecord.[[CachedBufferByteLength]]로 설정합니다.
  3. Assert: IsDetachedBuffer(view.[[ViewedArrayBuffer]])가 true인 경우와 bufferByteLengthdetached인 경우가 반드시 일치함을 확인합니다.
  4. bufferByteLengthdetached이면 true를 반환합니다.
  5. byteOffsetStartview.[[ByteOffset]]로 설정합니다.
  6. view.[[ByteLength]]auto이면,
    1. byteOffsetEndbufferByteLength로 설정합니다.
  7. 그 밖의 경우,
    1. byteOffsetEndbyteOffsetStart + view.[[ByteLength]]로 설정합니다.
  8. byteOffsetStart > bufferByteLength 또는 byteOffsetEnd > bufferByteLength이면 true를 반환합니다.
  9. 참고: 길이가 0인 DataView는 out-of-bounds로 간주되지 않습니다.
  10. false를 반환합니다.

25.3.1.5 GetViewValue ( view, requestIndex, isLittleEndian, type )

추상 연산 GetViewValue는 인자 view (ECMAScript 언어 값), requestIndex (ECMAScript 언어 값), isLittleEndian (ECMAScript 언어 값), type (TypedArray 요소 타입)를 받고, 정상 완료로 Number 또는 BigInt, 또는 throw 완료를 반환합니다. DataView 인스턴스 함수가 뷰의 버퍼에서 값을 가져올 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:

  1. RequireInternalSlot(view, [[DataView]])를 수행합니다.
  2. Assert: view[[ViewedArrayBuffer]] 내부 슬롯을 가짐을 확인합니다.
  3. getIndex를 ? ToIndex(requestIndex)로 설정합니다.
  4. isLittleEndianToBoolean(isLittleEndian)로 설정합니다.
  5. viewOffsetview.[[ByteOffset]]로 설정합니다.
  6. viewRecordMakeDataViewWithBufferWitnessRecord(view, unordered)로 설정합니다.
  7. 참고: view의 backing buffer가 확장 가능한 SharedArrayBuffer일 때 경계 검사는 동기화 연산이 아닙니다.
  8. IsViewOutOfBounds(viewRecord) 가 true이면 TypeError 예외를 throw합니다.
  9. viewSizeGetViewByteLength(viewRecord)로 설정합니다.
  10. elementSize표 75의 Element Type type에 지정된 Element Size 값으로 설정합니다.
  11. getIndex + elementSize > viewSize이면 RangeError 예외를 throw합니다.
  12. bufferIndexgetIndex + viewOffset로 설정합니다.
  13. GetValueFromBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, false, unordered, isLittleEndian)를 반환합니다.

25.3.1.6 SetViewValue ( view, requestIndex, isLittleEndian, type, value )

추상 연산 SetViewValue는 인자 view (ECMAScript 언어 값), requestIndex (ECMAScript 언어 값), isLittleEndian (ECMAScript 언어 값), type (TypedArray 요소 타입), value (ECMAScript 언어 값)를 받고, 정상 완료로 undefined 또는 throw 완료를 반환합니다. DataView 인스턴스 함수가 뷰의 버퍼에 값을 저장할 때 사용됩니다. 호출 시 다음 단계들을 수행합니다:

  1. RequireInternalSlot(view, [[DataView]])를 수행합니다.
  2. Assert: view[[ViewedArrayBuffer]] 내부 슬롯을 가짐을 확인합니다.
  3. getIndex를 ? ToIndex(requestIndex)로 설정합니다.
  4. IsBigIntElementType(type) 가 true이면 numberValue를 ? ToBigInt(value)로 설정합니다.
  5. 그 밖의 경우, numberValue를 ? ToNumber(value)로 설정합니다.
  6. isLittleEndianToBoolean(isLittleEndian)로 설정합니다.
  7. viewOffsetview.[[ByteOffset]]로 설정합니다.
  8. viewRecordMakeDataViewWithBufferWitnessRecord(view, unordered)로 설정합니다.
  9. 참고: view의 backing buffer가 확장 가능한 SharedArrayBuffer일 때 경계 검사는 동기화 연산이 아닙니다.
  10. IsViewOutOfBounds(viewRecord) 가 true이면 TypeError 예외를 throw합니다.
  11. viewSizeGetViewByteLength(viewRecord)로 설정합니다.
  12. elementSize표 75의 Element Type type에 지정된 Element Size 값으로 설정합니다.
  13. getIndex + elementSize > viewSize이면 RangeError 예외를 throw합니다.
  14. bufferIndexgetIndex + viewOffset로 설정합니다.
  15. SetValueInBuffer(view.[[ViewedArrayBuffer]], bufferIndex, type, numberValue, false, unordered, isLittleEndian)를 수행합니다.
  16. undefined를 반환합니다.

25.3.2 DataView 생성자

DataView 생성자:

  • %DataView%입니다.
  • 글로벌 객체"DataView" 프로퍼티의 초기 값입니다.
  • 생성자로 호출될 때 새로운 DataView를 생성하고 초기화합니다.
  • 함수로 호출하는 것은 의도된 사용이 아니며, 이렇게 호출하면 예외가 발생합니다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있습니다. 지정된 DataView 동작을 상속하려는 서브클래스 생성자super 호출을 포함하여 DataView 생성자에 서브클래스 인스턴스가 DataView.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 생성 및 초기화해야 합니다.

25.3.2.1 DataView ( buffer [ , byteOffset [ , byteLength ] ] )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 throw합니다.
  2. RequireInternalSlot(buffer, [[ArrayBufferData]])를 수행합니다.
  3. offset을 ? ToIndex(byteOffset)로 설정합니다.
  4. IsDetachedBuffer(buffer) 가 true이면 TypeError 예외를 throw합니다.
  5. bufferByteLengthArrayBufferByteLength(buffer, seq-cst)로 설정합니다.
  6. offset > bufferByteLength이면 RangeError 예외를 throw합니다.
  7. bufferIsFixedLengthIsFixedLengthArrayBuffer(buffer)로 설정합니다.
  8. byteLengthundefined이면,
    1. bufferIsFixedLengthtrue이면,
      1. viewByteLengthbufferByteLength - offset으로 설정합니다.
    2. 그 밖의 경우,
      1. viewByteLengthauto로 설정합니다.
  9. 그 밖의 경우,
    1. viewByteLength를 ? ToIndex(byteLength)로 설정합니다.
    2. offset + viewByteLength > bufferByteLength이면 RangeError 예외를 throw합니다.
  10. O를 ? OrdinaryCreateFromConstructor(NewTarget, "%DataView.prototype%", « [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] »)로 설정합니다.
  11. IsDetachedBuffer(buffer) 가 true이면 TypeError 예외를 throw합니다.
  12. bufferByteLengthArrayBufferByteLength(buffer, seq-cst)로 다시 설정합니다.
  13. offset > bufferByteLength이면 RangeError 예외를 throw합니다.
  14. byteLengthundefined가 아니면,
    1. offset + viewByteLength > bufferByteLength이면 RangeError 예외를 throw합니다.
  15. O.[[ViewedArrayBuffer]]buffer를 설정합니다.
  16. O.[[ByteLength]]viewByteLength를 설정합니다.
  17. O.[[ByteOffset]]offset을 설정합니다.
  18. O를 반환합니다.

25.3.3 DataView 생성자의 속성

DataView 생성자:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%입니다.
  • 다음 프로퍼티들을 가집니다:

25.3.3.1 DataView.prototype

DataView.prototype의 초기 값은 DataView 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

25.3.4 DataView 프로토타입 객체의 속성

DataView 프로토타입 객체:

  • %DataView.prototype%입니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • 일반 객체입니다.
  • [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] 내부 슬롯을 가지지 않습니다.

25.3.4.1 get DataView.prototype.buffer

DataView.prototype.buffer접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[DataView]])를 수행합니다.
  3. Assert: O[[ViewedArrayBuffer]] 내부 슬롯을 가짐을 확인합니다.
  4. bufferO.[[ViewedArrayBuffer]]로 설정합니다.
  5. buffer를 반환합니다.

25.3.4.2 get DataView.prototype.byteLength

DataView.prototype.byteLength접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[DataView]])를 수행합니다.
  3. Assert: O[[ViewedArrayBuffer]] 내부 슬롯을 가짐을 확인합니다.
  4. viewRecordMakeDataViewWithBufferWitnessRecord(O, seq-cst)로 설정합니다.
  5. IsViewOutOfBounds(viewRecord) 가 true이면 TypeError 예외를 throw합니다.
  6. sizeGetViewByteLength(viewRecord)로 설정합니다.
  7. 𝔽(size)를 반환합니다.

25.3.4.3 get DataView.prototype.byteOffset

DataView.prototype.byteOffset접근자 프로퍼티이며 set 접근자 함수는 undefined입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. Othis 값으로 설정합니다.
  2. RequireInternalSlot(O, [[DataView]])를 수행합니다.
  3. Assert: O[[ViewedArrayBuffer]] 내부 슬롯을 가집니다.
  4. viewRecordMakeDataViewWithBufferWitnessRecord(O, seq-cst)로 설정합니다.
  5. IsViewOutOfBounds(viewRecord) 가 true이면 TypeError 예외를 throw합니다.
  6. offsetO.[[ByteOffset]]로 설정합니다.
  7. 𝔽(offset)을 반환합니다.

25.3.4.4 DataView.prototype.constructor

DataView.prototype.constructor의 초기 값은 %DataView%입니다.

25.3.4.5 DataView.prototype.getBigInt64 ( byteOffset [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. GetViewValue(view, byteOffset, littleEndian, bigint64)를 반환합니다.

25.3.4.6 DataView.prototype.getBigUint64 ( byteOffset [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. GetViewValue(view, byteOffset, littleEndian, biguint64)를 반환합니다.

25.3.4.7 DataView.prototype.getFloat16 ( byteOffset [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. GetViewValue(view, byteOffset, littleEndian, float16)를 반환합니다.

25.3.4.8 DataView.prototype.getFloat32 ( byteOffset [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. GetViewValue(view, byteOffset, littleEndian, float32)를 반환합니다.

25.3.4.9 DataView.prototype.getFloat64 ( byteOffset [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. GetViewValue(view, byteOffset, littleEndian, float64)를 반환합니다.

25.3.4.10 DataView.prototype.getInt8 ( byteOffset )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. GetViewValue(view, byteOffset, true, int8)를 반환합니다.

25.3.4.11 DataView.prototype.getInt16 ( byteOffset [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. GetViewValue(view, byteOffset, littleEndian, int16)를 반환합니다.

25.3.4.12 DataView.prototype.getInt32 ( byteOffset [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. GetViewValue(view, byteOffset, littleEndian, int32)를 반환합니다.

25.3.4.13 DataView.prototype.getUint8 ( byteOffset )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. GetViewValue(view, byteOffset, true, uint8)를 반환합니다.

25.3.4.14 DataView.prototype.getUint16 ( byteOffset [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. GetViewValue(view, byteOffset, littleEndian, uint16)를 반환합니다.

25.3.4.15 DataView.prototype.getUint32 ( byteOffset [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. GetViewValue(view, byteOffset, littleEndian, uint32)를 반환합니다.

25.3.4.16 DataView.prototype.setBigInt64 ( byteOffset, value [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. SetViewValue(view, byteOffset, littleEndian, bigint64, value)를 반환합니다.

25.3.4.17 DataView.prototype.setBigUint64 ( byteOffset, value [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. SetViewValue(view, byteOffset, littleEndian, biguint64, value)를 반환합니다.

25.3.4.18 DataView.prototype.setFloat16 ( byteOffset, value [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. SetViewValue(view, byteOffset, littleEndian, float16, value)를 반환합니다.

25.3.4.19 DataView.prototype.setFloat32 ( byteOffset, value [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. SetViewValue(view, byteOffset, littleEndian, float32, value)를 반환합니다.

25.3.4.20 DataView.prototype.setFloat64 ( byteOffset, value [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. SetViewValue(view, byteOffset, littleEndian, float64, value)를 반환합니다.

25.3.4.21 DataView.prototype.setInt8 ( byteOffset, value )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. SetViewValue(view, byteOffset, true, int8, value)를 반환합니다.

25.3.4.22 DataView.prototype.setInt16 ( byteOffset, value [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. SetViewValue(view, byteOffset, littleEndian, int16, value)를 반환합니다.

25.3.4.23 DataView.prototype.setInt32 ( byteOffset, value [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. SetViewValue(view, byteOffset, littleEndian, int32, value)를 반환합니다.

25.3.4.24 DataView.prototype.setUint8 ( byteOffset, value )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. SetViewValue(view, byteOffset, true, uint8, value)를 반환합니다.

25.3.4.25 DataView.prototype.setUint16 ( byteOffset, value [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. SetViewValue(view, byteOffset, littleEndian, uint16, value)를 반환합니다.

25.3.4.26 DataView.prototype.setUint32 ( byteOffset, value [ , littleEndian ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. viewthis 값으로 설정합니다.
  2. littleEndian이 존재하지 않으면 littleEndianfalse로 설정합니다.
  3. SetViewValue(view, byteOffset, littleEndian, uint32, value)를 반환합니다.

25.3.4.27 DataView.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "DataView"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

25.3.5 DataView 인스턴스의 속성

DataView 인스턴스는 일반 객체이며, DataView 프로토타입 객체로부터 프로퍼티를 상속받습니다. 각 DataView 인스턴스는 [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]] 내부 슬롯을 가집니다.

참고

[[DataView]] 내부 슬롯의 값은 이 명세 내에서는 사용되지 않습니다. 내부 슬롯의 존재 자체로 DataView 생성자로 생성된 객체임을 식별합니다.

25.4 Atomics 객체

Atomics 객체:

  • %Atomics%입니다.
  • 글로벌 객체"Atomics" 프로퍼티의 초기 값입니다.
  • 일반 객체입니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • [[Construct]] 내부 메서드를 가지지 않으므로 new 연산자로 생성자로 사용할 수 없습니다.
  • [[Call]] 내부 메서드를 가지지 않으므로 함수로 호출할 수 없습니다.

Atomics 객체는 공유 메모리 배열 셀에 대해 불가분적(원자적으로) 동작하는 함수와 에이전트가 원시 이벤트를 대기 및 전달할 수 있는 함수를 제공합니다. 규율 있게 사용하면, Atomics 함수는 공유 메모리를 통해 통신하는 다중 에이전트 프로그램이 병렬 CPU에서도 잘 이해되는 순서로 실행될 수 있게 해줍니다. 공유 메모리 통신을 지배하는 규칙은 아래에 정의된 메모리 모델에서 제공합니다.

참고

ECMAScript에서 공유 메모리 프로그래밍 및 구현에 관한 안내는 메모리 모델 섹션 끝의 참고를 참조하십시오.

25.4.1 Waiter Record

Waiter RecordRecord 값으로, Atomics.wait 또는 Atomics.waitAsync의 특정 호출을 나타내는 데 사용됩니다.

Waiter Record는 표 78에 나열된 필드를 가집니다.

표 78: Waiter Record 필드
필드 이름 의미
[[AgentSignifier]] 에이전트 식별자 Atomics.wait 또는 Atomics.waitAsync를 호출한 에이전트입니다.
[[PromiseCapability]] PromiseCapability Record 또는 blocking Atomics.waitAsync 호출을 나타낼 경우 생성된 promise, 그렇지 않으면 blocking입니다.
[[TimeoutTime]] 0 이상의 확장 수학적 값 타임아웃이 트리거될 수 있는 가장 이른 시간; 시간 값을 사용해 계산됩니다.
[[Result]] "ok" 또는 "timed-out" 호출의 반환 값입니다.

25.4.2 WaiterList Record

WaiterList Record에이전트Atomics.wait, Atomics.waitAsync, Atomics.notify를 통해 대기 및 알림을 설명하는 데 사용됩니다.

WaiterList Record는 표 79에 나열된 필드를 가집니다.

표 79: WaiterList Record 필드
필드 이름 의미
[[Waiters]] 리스트 of Waiter Record 이 WaiterList가 연결된 위치에서 대기 중인 Atomics.wait 또는 Atomics.waitAsync 호출들입니다.
[[MostRecentLeaveEvent]] Synchronize 이벤트 또는 empty critical section을 가장 최근에 떠난 이벤트, 또는 한 번도 진입한 적이 없으면 empty입니다.

WaiterList에는 동일한 에이전트 식별자를 가진 Waiter Record가 여러 개 있을 수 있습니다.

에이전트 클러스터는 WaiterList Record의 저장소를 가지며, 저장소는 (block, i)로 인덱스됩니다. 여기서 block공유 데이터 블록이고, iblock 메모리의 바이트 오프셋입니다. WaiterList Record는 에이전트에 독립적입니다: (block, i)로 저장소를 조회하면, 에이전트 클러스터 내 모든 에이전트에서 동일한 WaiterList Record를 얻게 됩니다.

각 WaiterList Record는 평가 시 해당 WaiterList Record에 대한 배타적 접근을 제어하는 critical section을 가집니다. 한 번에 하나의 에이전트만 WaiterList Record의 critical section에 진입할 수 있습니다. 진입 및 이탈은 추상 연산 EnterCriticalSectionLeaveCriticalSection으로 제어됩니다. WaiterList Record에 대한 연산—대기 중인 에이전트 추가/제거, 에이전트 리스트 순회, 리스트의 에이전트 일시중지/알림, Synchronize 이벤트 설정/조회—는 WaiterList Record의 critical section에 진입한 에이전트만 수행할 수 있습니다.

25.4.3 Atomics를 위한 추상 연산

25.4.3.1 ValidateIntegerTypedArray ( typedArray, waitable )

추상 연산 ValidateIntegerTypedArray는 인자 typedArray (ECMAScript 언어 값)와 waitable (Boolean)을 받아, 정상 완료(completion)TypedArray With Buffer Witness Record를 반환하거나, throw completion을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. taRecord를 ? ValidateTypedArray(typedArray, unordered)로 설정합니다.
  2. 참고: typedArray의 backing buffer가 확장 가능한 SharedArrayBuffer일 때, 경계 검사는 동기화(synchronizing) 연산이 아닙니다.
  3. waitabletrue이면,
    1. typedArray.[[TypedArrayName]]"Int32Array"도 아니고 "BigInt64Array"도 아니면 TypeError 예외를 throw합니다.
  4. 그 밖의 경우,
    1. typeTypedArrayElementType(typedArray)로 설정합니다.
    2. IsUnclampedIntegerElementType(type) 이 false이고, IsBigIntElementType(type) 이 false이면 TypeError 예외를 throw합니다.
  5. taRecord를 반환합니다.

25.4.3.2 ValidateAtomicAccess ( taRecord, requestIndex )

추상 연산 ValidateAtomicAccess는 인자 taRecord (TypedArray With Buffer Witness Record)와 requestIndex (ECMAScript 언어 값)를 받아, 정상 완료(completion)정수를 반환하거나, throw completion을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. lengthTypedArrayLength(taRecord)로 설정합니다.
  2. accessIndex를 ? ToIndex(requestIndex)로 설정합니다.
  3. Assert: accessIndex ≥ 0임을 확인합니다.
  4. accessIndexlength이면 RangeError 예외를 throw합니다.
  5. typedArraytaRecord.[[Object]]로 설정합니다.
  6. elementSizeTypedArrayElementSize(typedArray)로 설정합니다.
  7. offsettypedArray.[[ByteOffset]]로 설정합니다.
  8. (accessIndex × elementSize) + offset을 반환합니다.

25.4.3.3 ValidateAtomicAccessOnIntegerTypedArray ( typedArray, requestIndex )

추상 연산 ValidateAtomicAccessOnIntegerTypedArray는 인자 typedArray (ECMAScript 언어 값)와 requestIndex (ECMAScript 언어 값)를 받아, 정상 완료(completion)정수를 반환하거나, throw completion을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. taRecord를 ? ValidateIntegerTypedArray(typedArray, false)로 설정합니다.
  2. ValidateAtomicAccess(taRecord, requestIndex)를 반환합니다.

25.4.3.4 RevalidateAtomicAccess ( typedArray, byteIndexInBuffer )

추상 연산 RevalidateAtomicAccess는 인자 typedArray (TypedArray)와 byteIndexInBuffer (정수)를 받아, 정상 완료(completion)unused를 반환하거나, throw completion을 반환합니다. 이 연산은 Atomics 메서드에서 모든 인자 강제 변환(coercion)이 수행된 후, 원자적 연산을 위한 backing buffer 내 인덱스를 재검증합니다. 강제 변환은 임의의 부작용을 일으킬 수 있으므로, 버퍼가 경계 밖(out-of-bounds)이 될 수 있습니다. typedArray의 backing buffer가 SharedArrayBuffer일 때는 예외를 throw하지 않습니다. 호출 시 다음 단계들을 수행합니다:

  1. taRecordMakeTypedArrayWithBufferWitnessRecord(typedArray, unordered)로 설정합니다.
  2. 참고: typedArray의 backing buffer가 확장 가능한 SharedArrayBuffer일 때, 경계 검사는 동기화(synchronizing) 연산이 아닙니다.
  3. IsTypedArrayOutOfBounds(taRecord) 가 true이면 TypeError 예외를 throw합니다.
  4. Assert: byteIndexInBuffertypedArray.[[ByteOffset]]임을 확인합니다.
  5. byteIndexInBuffertaRecord.[[CachedBufferByteLength]]이면 RangeError 예외를 throw합니다.
  6. unused를 반환합니다.

25.4.3.5 GetWaiterList ( block, i )

추상 연산 GetWaiterList는 인자 block (공유 데이터 블록)과 i (4로 나누어떨어지는 0 이상의 정수)를 받아 WaiterList Record를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: ii + 3이 block의 메모리 내에서 유효한 바이트 오프셋임을 확인합니다.
  2. 쌍 (block, i)로 참조되는 WaiterList Record를 반환합니다.

25.4.3.6 EnterCriticalSection ( WL )

추상 연산 EnterCriticalSection는 인자 WL (WaiterList Record)를 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: 주변 에이전트가 어떤 WaiterList Recordcritical section에 있지 않음을 확인합니다.
  2. 어떤 에이전트WLcritical section에 있지 않을 때까지 기다린 후, WLcritical section에 진입합니다(다른 에이전트가 진입하지 못하도록 함).
  3. WL.[[MostRecentLeaveEvent]]empty가 아니면,
    1. 참고: WLcritical section이 한 번 이상 진입된 경우 Synchronize 이벤트LeaveCriticalSection에 의해 설정됩니다.
    2. execution주변 에이전트Agent Record[[CandidateExecution]] 필드로 설정합니다.
    3. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record로 설정합니다.
    4. enterEvent를 새 Synchronize 이벤트로 설정합니다.
    5. enterEventeventsRecord.[[EventList]]에 추가합니다.
    6. (WL.[[MostRecentLeaveEvent]], enterEvent)를 eventsRecord.[[AgentSynchronizesWith]]에 추가합니다.
  4. unused를 반환합니다.

EnterCriticalSection은 한 에이전트critical section에 진입하려 할 때 다른 에이전트가 나올 때까지 기다려야 하는 경우 경합(contention)이 발생합니다. 경합이 없으면 EnterCriticalSection 호출의 FIFO 순서가 관찰 가능합니다. 경합이 있는 경우, 구현체는 임의의 순서를 선택할 수 있지만 어떤 에이전트도 무한정 기다리게 해서는 안 됩니다.

25.4.3.7 LeaveCriticalSection ( WL )

추상 연산 LeaveCriticalSection는 인자 WL (WaiterList Record)를 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: 주변 에이전트WLcritical section에 있음을 확인합니다.
  2. execution주변 에이전트Agent Record[[CandidateExecution]] 필드로 설정합니다.
  3. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record로 설정합니다.
  4. leaveEvent를 새 Synchronize 이벤트로 설정합니다.
  5. leaveEventeventsRecord.[[EventList]]에 추가합니다.
  6. WL.[[MostRecentLeaveEvent]]leaveEvent를 설정합니다.
  7. WLcritical section에서 나갑니다.
  8. unused를 반환합니다.

25.4.3.8 AddWaiter ( WL, waiterRecord )

추상 연산 AddWaiter는 인자 WL (WaiterList Record)와 waiterRecord (Waiter Record)를 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: 주변 에이전트WLcritical section에 있음을 확인합니다.
  2. Assert: WL.[[Waiters]]waiterRecord.[[PromiseCapability]]waiterRecord.[[AgentSignifier]]가 모두 같은 Waiter Record가 없는지 확인합니다.
  3. waiterRecordWL.[[Waiters]]에 추가합니다.
  4. unused를 반환합니다.

25.4.3.9 RemoveWaiter ( WL, waiterRecord )

추상 연산 RemoveWaiter는 인자 WL (WaiterList Record)와 waiterRecord (Waiter Record)를 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: 주변 에이전트WLcritical section에 있음을 확인합니다.
  2. Assert: WL.[[Waiters]]waiterRecord가 있음을 확인합니다.
  3. WL.[[Waiters]]에서 waiterRecord를 제거합니다.
  4. unused를 반환합니다.

25.4.3.10 RemoveWaiters ( WL, c )

추상 연산 RemoveWaiters는 인자 WL (WaiterList Record)와 c (0 이상의 정수 또는 +∞)를 받아, 리스트 of Waiter Record를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: 주변 에이전트WLcritical section에 있음을 확인합니다.
  2. lenWL.[[Waiters]]의 요소 개수로 설정합니다.
  3. nmin(c, len)로 설정합니다.
  4. LWL.[[Waiters]]의 처음 n개 요소로 구성된 리스트로 설정합니다.
  5. WL.[[Waiters]]의 처음 n개 요소를 제거합니다.
  6. L을 반환합니다.

25.4.3.11 SuspendThisAgent ( WL, waiterRecord )

추상 연산 SuspendThisAgent는 인자 WL (WaiterList Record)와 waiterRecord (Waiter Record)를 받고 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: 주변 에이전트WLcritical section에 있음.
  2. Assert: WL.[[Waiters]]waiterRecord가 포함되어 있음.
  3. thisAgentAgentSignifier()로 설정.
  4. Assert: waiterRecord.[[AgentSignifier]]thisAgent임.
  5. Assert: waiterRecord.[[PromiseCapability]]blocking임.
  6. Assert: AgentCanSuspend()가 true임.
  7. LeaveCriticalSection(WL)을 수행하고, 주변 에이전트waiterRecord.[[TimeoutTime]]까지 suspend합니다. 이 두 연산을 결합하여 critical section을 나온 후 suspend되기 전에 알림(notification)이 도착하면 잃어버리지 않도록 합니다. 주변 에이전트는 timeout 또는 다른 에이전트NotifyWaiter(WL, thisAgent)를 호출(즉 Atomics.notify 호출)할 때만 suspend에서 깨어날 수 있습니다.
  8. EnterCriticalSection(WL)을 수행합니다.
  9. unused를 반환합니다.

25.4.3.12 NotifyWaiter ( WL, waiterRecord )

추상 연산 NotifyWaiter는 인자 WL (WaiterList Record)와 waiterRecord (Waiter Record)를 받고 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: 주변 에이전트WLcritical section에 있음.
  2. waiterRecord.[[PromiseCapability]]blocking이면,
    1. waiterRecord.[[AgentSignifier]]를 가진 에이전트를 suspend에서 깨웁니다.
    2. 참고: 이는 에이전트SuspendThisAgent에서 실행을 재개하게 만듭니다.
  3. 그 밖의 경우 AgentSignifier()가 waiterRecord.[[AgentSignifier]]이면,
    1. promiseCapabilitywaiterRecord.[[PromiseCapability]]로 설정합니다.
    2. Call(promiseCapability.[[Resolve]], undefined, « waiterRecord.[[Result]] »)를 수행합니다.
  4. 그 밖의 경우,
    1. EnqueueResolveInAgentJob(waiterRecord.[[AgentSignifier]], waiterRecord.[[PromiseCapability]], waiterRecord.[[Result]])를 수행합니다.
  5. unused를 반환합니다.
참고

에이전트는 다른 에이전트의 promise capability를 host에 전달하는 것 외에는 어떤 방식으로든 접근해서는 안 됩니다.

25.4.3.13 EnqueueResolveInAgentJob ( agentSignifier, promiseCapability, resolution )

추상 연산 EnqueueResolveInAgentJob는 인자 agentSignifier (에이전트 식별자), promiseCapability (PromiseCapability Record), resolution ("ok" 또는 "timed-out")를 받고 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. resolveJobagentSignifier, promiseCapability, resolution을 캡처하고 호출 시 다음 단계들을 수행하는 파라미터 없는 Job Abstract Closure로 만듭니다:
    1. Assert: AgentSignifier()가 agentSignifier임을 확인합니다.
    2. Call(promiseCapability.[[Resolve]], undefined, « resolution »)를 수행합니다.
    3. unused를 반환합니다.
  2. realmInTargetAgent를 ! GetFunctionRealm(promiseCapability.[[Resolve]])로 설정합니다.
  3. Assert: agentSignifierrealmInTargetAgent.[[AgentSignifier]]임을 확인합니다.
  4. HostEnqueueGenericJob(resolveJob, realmInTargetAgent)를 수행합니다.
  5. unused를 반환합니다.

25.4.3.14 DoWait ( mode, typedArray, index, value, timeout )

추상 연산 DoWait는 인자 mode (sync 또는 async), typedArray (ECMAScript 언어 값), index (ECMAScript 언어 값), value (ECMAScript 언어 값), timeout (ECMAScript 언어 값)를 받고 객체, "not-equal", "timed-out", "ok" 중 하나를 담은 normal completion 또는 throw completion를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. taRecord를 ? ValidateIntegerTypedArray(typedArray, true)로 설정합니다.
  2. buffertaRecord.[[Object]].[[ViewedArrayBuffer]]로 설정합니다.
  3. IsSharedArrayBuffer(buffer) 가 false이면 TypeError 예외를 throw합니다.
  4. i를 ? ValidateAtomicAccess(taRecord, index)로 설정합니다.
  5. arrayTypeNametypedArray.[[TypedArrayName]]로 설정합니다.
  6. arrayTypeName"BigInt64Array"이면, v를 ? ToBigInt64(value)로 설정합니다.
  7. 그 밖의 경우, v를 ? ToInt32(value)로 설정합니다.
  8. q를 ? ToNumber(timeout)로 설정합니다.
  9. qNaN 또는 +∞𝔽이면 t를 +∞로, q-∞𝔽이면 t를 0으로, 그 밖의 경우 tmax((q), 0)로 설정합니다.
  10. modesync이고 AgentCanSuspend()가 false이면 TypeError 예외를 throw합니다.
  11. blockbuffer.[[ArrayBufferData]]로 설정합니다.
  12. offsettypedArray.[[ByteOffset]]로 설정합니다.
  13. byteIndexInBuffer를 (i × 4) + offset으로 설정합니다.
  14. WLGetWaiterList(block, byteIndexInBuffer)로 설정합니다.
  15. modesync이면,
    1. promiseCapabilityblocking으로 설정합니다.
    2. resultObjectundefined로 설정합니다.
  16. 그 밖의 경우,
    1. promiseCapability를 ! NewPromiseCapability(%Promise%)로 설정합니다.
    2. resultObjectOrdinaryObjectCreate(%Object.prototype%)로 설정합니다.
  17. EnterCriticalSection(WL)을 수행합니다.
  18. elementTypeTypedArrayElementType(typedArray)로 설정합니다.
  19. wGetValueFromBuffer(buffer, byteIndexInBuffer, elementType, true, seq-cst)로 설정합니다.
  20. vw이면,
    1. LeaveCriticalSection(WL)을 수행합니다.
    2. modesync이면 "not-equal"을 반환합니다.
    3. CreateDataPropertyOrThrow(resultObject, "async", false)를 수행합니다.
    4. CreateDataPropertyOrThrow(resultObject, "value", "not-equal")를 수행합니다.
    5. resultObject를 반환합니다.
  21. t = 0이고 modeasync이면,
    1. 참고: 동기 즉시 타임아웃은 특별 취급하지 않습니다. 비동기 즉시 타임아웃은 빠르게 실패하고 불필요한 Promise job을 피하도록 특별 취급합니다.
    2. LeaveCriticalSection(WL)을 수행합니다.
    3. CreateDataPropertyOrThrow(resultObject, "async", false)를 수행합니다.
    4. CreateDataPropertyOrThrow(resultObject, "value", "timed-out")를 수행합니다.
    5. resultObject를 반환합니다.
  22. thisAgentAgentSignifier()로 설정합니다.
  23. now현재 시간 값 (UTC)로 설정합니다.
  24. additionalTimeout구현 정의 0 이상의 수학적 값으로 설정합니다.
  25. timeoutTime(now) + t + additionalTimeout으로 설정합니다.
  26. 참고: t가 +∞이면 timeoutTime도 +∞입니다.
  27. waiterRecord를 새로운 Waiter Record { [[AgentSignifier]]: thisAgent, [[PromiseCapability]]: promiseCapability, [[TimeoutTime]]: timeoutTime, [[Result]]: "ok" }로 설정합니다.
  28. AddWaiter(WL, waiterRecord)를 수행합니다.
  29. modesync이면,
    1. SuspendThisAgent(WL, waiterRecord)를 수행합니다.
  30. 그 밖의 경우 timeoutTime유한이면,
    1. EnqueueAtomicsWaitAsyncTimeoutJob(WL, waiterRecord)를 수행합니다.
  31. LeaveCriticalSection(WL)을 수행합니다.
  32. modesync이면 waiterRecord.[[Result]]를 반환합니다.
  33. CreateDataPropertyOrThrow(resultObject, "async", true)를 수행합니다.
  34. CreateDataPropertyOrThrow(resultObject, "value", promiseCapability.[[Promise]])를 수행합니다.
  35. resultObject를 반환합니다.
참고

additionalTimeout은 구현체가 필요에 따라 타임아웃을 보정(padding)하는 데 사용할 수 있습니다. 예를 들어, 전력 소모를 줄이거나 타이머 해상도를 조정해 타이밍 공격을 완화할 때 사용할 수 있습니다. 이 값은 DoWait의 호출마다 다를 수 있습니다.

25.4.3.15 EnqueueAtomicsWaitAsyncTimeoutJob ( WL, waiterRecord )

추상 연산 EnqueueAtomicsWaitAsyncTimeoutJob는 인자 WL (WaiterList Record), waiterRecord (Waiter Record)를 받고 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. timeoutJobWL, waiterRecord를 캡처하고 호출 시 다음 단계들을 수행하는 파라미터 없는 Job Abstract Closure로 만듭니다:
    1. EnterCriticalSection(WL)을 수행합니다.
    2. WL.[[Waiters]]waiterRecord가 들어 있다면,
      1. timeOfJobExecution현재 시간 값 (UTC)로 설정합니다.
      2. Assert: (timeOfJobExecution) ≥ waiterRecord.[[TimeoutTime]] (시간 값의 비단조성(non-monotonicity)은 무시).
      3. waiterRecord.[[Result]]"timed-out"으로 설정합니다.
      4. RemoveWaiter(WL, waiterRecord)를 수행합니다.
      5. NotifyWaiter(WL, waiterRecord)를 수행합니다.
    3. LeaveCriticalSection(WL)을 수행합니다.
    4. unused를 반환합니다.
  2. now현재 시간 값 (UTC)로 설정합니다.
  3. currentRealm현재 Realm Record로 설정합니다.
  4. HostEnqueueTimeoutJob(timeoutJob, currentRealm, 𝔽(waiterRecord.[[TimeoutTime]]) - now)를 수행합니다.
  5. unused를 반환합니다.

25.4.3.16 AtomicCompareExchangeInSharedBlock ( block, byteIndexInBuffer, elementSize, expectedBytes, replacementBytes )

추상 연산 AtomicCompareExchangeInSharedBlock은 인자 block (공유 데이터 블록), byteIndexInBuffer (정수), elementSize (0 이상의 정수), expectedBytes (바이트 리스트), replacementBytes (바이트 리스트)를 받고, 바이트 리스트를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. execution주변 에이전트Agent Record[[CandidateExecution]] 필드로 설정합니다.
  2. eventsRecordexecution.[[EventsRecords]][[AgentSignifier]]AgentSignifier()인 Agent Events Record로 설정합니다.
  3. rawBytesReadelementSize 길이의 바이트 리스트로, 각 요소는 비결정적으로 선택된 바이트 값으로 설정합니다.
  4. 참고: 실제 구현에서는 rawBytesRead는 하드웨어의 load-link, load-exclusive, 또는 read-modify-write 명령의 피연산자로 얻어진 값입니다. 비결정성은 약한 일관성을 가진 하드웨어의 관찰 가능한 동작을 설명하기 위한 메모리 모델의 의미적 규정입니다.
  5. 참고: 예상 값과 읽은 값의 비교는 read-modify-write 수정 함수 밖에서 수행되어, 예상 값이 읽은 값과 다를 때 불필요하게 강한 동기화를 방지합니다.
  6. ByteListEqual(rawBytesRead, expectedBytes)가 true이면,
    1. second를 파라미터 (oldBytes, newBytes)를 받아 원자적으로 newBytes를 반환하는 새로운 read-modify-write 수정 함수로 설정합니다.
    2. eventReadModifyWriteSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndexInBuffer, [[ElementSize]]: elementSize, [[Payload]]: replacementBytes, [[ModifyOp]]: second }로 설정합니다.
  7. 그 밖의 경우,
    1. eventReadSharedMemory { [[Order]]: seq-cst, [[NoTear]]: true, [[Block]]: block, [[ByteIndex]]: byteIndexInBuffer, [[ElementSize]]: elementSize }로 설정합니다.
  8. eventeventsRecord.[[EventList]]에 추가합니다.
  9. Chosen Value Record { [[Event]]: event, [[ChosenValue]]: rawBytesRead }를 execution.[[ChosenValues]]에 추가합니다.
  10. rawBytesRead를 반환합니다.

25.4.3.17 AtomicReadModifyWrite ( typedArray, index, value, op )

추상 연산 AtomicReadModifyWrite는 인자 typedArray (ECMAScript 언어 값), index (ECMAScript 언어 값), value (ECMAScript 언어 값), op (read-modify-write 수정 함수)를 받고, Number 또는 BigInt를 담은 normal completion 또는 throw completion를 반환합니다. op는 두 바이트 리스트 인자를 받아 바이트 리스트를 반환합니다. 이 연산은 값을 원자적으로 불러오고, 다른 값과 결합하여 저장하며, 불러온 값을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. byteIndexInBuffer를 ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index)로 설정합니다.
  2. typedArray.[[ContentType]]bigint이면, v를 ? ToBigInt(value)로 설정합니다.
  3. 그 밖의 경우, v𝔽(? ToIntegerOrInfinity(value))로 설정합니다.
  4. RevalidateAtomicAccess(typedArray, byteIndexInBuffer)를 수행합니다.
  5. buffertypedArray.[[ViewedArrayBuffer]]로 설정합니다.
  6. elementTypeTypedArrayElementType(typedArray)로 설정합니다.
  7. GetModifySetValueInBuffer(buffer, byteIndexInBuffer, elementType, v, op)를 반환합니다.

25.4.3.18 ByteListBitwiseOp ( op, xBytes, yBytes )

추상 연산 ByteListBitwiseOp는 인자 op (&, ^, |), xBytes (바이트 리스트), yBytes (바이트 리스트)를 받고, 바이트 리스트를 반환합니다. 이 연산은 인자들의 모든 바이트 값에 대해 비트 연산을 원자적으로 수행하여 바이트 리스트를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: xBytesyBytes는 동일한 개수의 요소를 가짐.
  2. result를 새로운 빈 바이트 리스트로 설정합니다.
  3. i를 0으로 설정합니다.
  4. xBytes의 각 요소 xByte에 대해 다음을 수행합니다:
    1. yByteyBytes[i]로 설정합니다.
    2. op&이면,
      1. resultBytexByteyByte에 비트 AND 연산을 적용한 결과로 설정합니다.
    3. 그 밖의 경우 op^이면,
      1. resultBytexByteyByte에 비트 XOR(배타적 OR) 연산을 적용한 결과로 설정합니다.
    4. 그 밖의 경우,
      1. Assert: op|임을 확인합니다.
      2. resultBytexByteyByte에 비트 OR(포괄적 OR) 연산을 적용한 결과로 설정합니다.
    5. ii + 1로 증가시킵니다.
    6. resultByteresult에 추가합니다.
  5. result를 반환합니다.

25.4.3.19 ByteListEqual ( xBytes, yBytes )

추상 연산 ByteListEqual은 인자 xBytes (바이트 리스트), yBytes (바이트 리스트)를 받고, Boolean을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. xBytesyBytes가 같은 개수의 요소를 가지지 않으면 false를 반환합니다.
  2. i를 0으로 설정합니다.
  3. xBytes의 각 요소 xByte에 대해 다음을 수행합니다:
    1. yByteyBytes[i]로 설정합니다.
    2. xByteyByte이면 false를 반환합니다.
    3. ii + 1로 증가시킵니다.
  4. true를 반환합니다.

25.4.4 Atomics.add ( typedArray, index, value )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. add를 파라미터 (xBytes, yBytes)를 가지며 typedArray를 캡처하는 새로운 read-modify-write 수정 함수로 설정하고, 호출 시 원자적으로 다음 단계들을 수행합니다:
    1. typeTypedArrayElementType(typedArray)로 설정합니다.
    2. isLittleEndian주변 에이전트Agent Record[[LittleEndian]] 필드 값으로 설정합니다.
    3. xRawBytesToNumeric(type, xBytes, isLittleEndian)로 설정합니다.
    4. yRawBytesToNumeric(type, yBytes, isLittleEndian)로 설정합니다.
    5. xNumber이면,
      1. sumNumber::add(x, y)로 설정합니다.
    6. 그 밖의 경우,
      1. Assert: xBigInt임을 확인합니다.
      2. sumBigInt::add(x, y)로 설정합니다.
    7. sumBytesNumericToRawBytes(type, sum, isLittleEndian)로 설정합니다.
    8. Assert: sumBytes, xBytes, yBytes가 동일한 개수의 요소를 가짐.
    9. sumBytes를 반환합니다.
  2. AtomicReadModifyWrite(typedArray, index, value, add)를 반환합니다.

25.4.5 Atomics.and ( typedArray, index, value )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. and를 파라미터 (xBytes, yBytes)를 가지며 아무 것도 캡처하지 않는 새로운 read-modify-write 수정 함수로 설정하고, 호출 시 원자적으로 다음 단계들을 수행합니다:
    1. ByteListBitwiseOp(&, xBytes, yBytes)를 반환합니다.
  2. AtomicReadModifyWrite(typedArray, index, value, and)를 반환합니다.

25.4.6 Atomics.compareExchange ( typedArray, index, expectedValue, replacementValue )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. byteIndexInBuffer를 ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index)로 설정합니다.
  2. buffertypedArray.[[ViewedArrayBuffer]]로 설정합니다.
  3. blockbuffer.[[ArrayBufferData]]로 설정합니다.
  4. typedArray.[[ContentType]]bigint이면,
    1. expected를 ? ToBigInt(expectedValue)로 설정합니다.
    2. replacement를 ? ToBigInt(replacementValue)로 설정합니다.
  5. 그 밖의 경우,
    1. expected𝔽(? ToIntegerOrInfinity(expectedValue))로 설정합니다.
    2. replacement𝔽(? ToIntegerOrInfinity(replacementValue))로 설정합니다.
  6. RevalidateAtomicAccess(typedArray, byteIndexInBuffer)를 수행합니다.
  7. elementTypeTypedArrayElementType(typedArray)로 설정합니다.
  8. elementSizeTypedArrayElementSize(typedArray)로 설정합니다.
  9. isLittleEndian주변 에이전트Agent Record[[LittleEndian]] 필드 값으로 설정합니다.
  10. expectedBytesNumericToRawBytes(elementType, expected, isLittleEndian)로 설정합니다.
  11. replacementBytesNumericToRawBytes(elementType, replacement, isLittleEndian)로 설정합니다.
  12. IsSharedArrayBuffer(buffer) 가 true이면,
    1. rawBytesReadAtomicCompareExchangeInSharedBlock(block, byteIndexInBuffer, elementSize, expectedBytes, replacementBytes)로 설정합니다.
  13. 그 밖의 경우,
    1. rawBytesReadelementSize 길이의 바이트 리스트로, 각 요소는 block[byteIndexInBuffer]에서 시작하는 elementSize 바이트 순서대로 설정합니다.
    2. ByteListEqual(rawBytesRead, expectedBytes)가 true이면,
      1. replacementBytes의 개별 바이트를 blockblock[byteIndexInBuffer]에서 시작하여 저장합니다.
  14. RawBytesToNumeric(elementType, rawBytesRead, isLittleEndian)를 반환합니다.

25.4.7 Atomics.exchange ( typedArray, index, value )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. second를 파라미터 (oldBytes, newBytes)를 가지며 아무 것도 캡처하지 않는 새로운 read-modify-write 수정 함수로 설정하고, 호출 시 원자적으로 다음 단계들을 수행합니다:
    1. newBytes를 반환합니다.
  2. AtomicReadModifyWrite(typedArray, index, value, second)를 반환합니다.

25.4.8 Atomics.isLockFree ( size )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. n을 ? ToIntegerOrInfinity(size)로 설정합니다.
  2. AR주변 에이전트Agent Record로 설정합니다.
  3. n = 1이면 AR.[[IsLockFree1]]를 반환합니다.
  4. n = 2이면 AR.[[IsLockFree2]]를 반환합니다.
  5. n = 4이면 true를 반환합니다.
  6. n = 8이면 AR.[[IsLockFree8]]를 반환합니다.
  7. false를 반환합니다.
참고

이 함수는 최적화 프리미티브입니다. 직관적으로, 원자 프리미티브(compareExchange, load, store, add, sub, and, or, xor, exchange)가 크기 n 바이트의 데이터에 대해, 주변 에이전트가 해당 데이터 바깥의 락을 취하지 않고 수행된다면 Atomics.isLockFree(n)는 true를 반환합니다. 고성능 알고리즘은 이 함수를 사용해 critical section에서 락과 원자 연산 중 어떤 것을 사용할지 결정합니다. 원자 프리미티브가 lock-free가 아니면 알고리즘에서 직접 락을 제공하는 것이 효율적일 수 있습니다.

Atomics.isLockFree(4)는 항상 true를 반환합니다. 모든 관련 하드웨어에서 지원 가능하기 때문입니다. 이를 가정하면 프로그램이 일반적으로 더 단순해집니다.

이 함수가 반환하는 값과 무관하게, 모든 원자 연산은 원자성을 보장합니다. 예를 들어, 연산 도중 눈에 띄는 작업이 중간에 발생(예: "tearing")하는 일은 없습니다.

25.4.9 Atomics.load ( typedArray, index )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. byteIndexInBuffer를 ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index)로 설정합니다.
  2. RevalidateAtomicAccess(typedArray, byteIndexInBuffer)를 수행합니다.
  3. buffertypedArray.[[ViewedArrayBuffer]]로 설정합니다.
  4. elementTypeTypedArrayElementType(typedArray)로 설정합니다.
  5. GetValueFromBuffer(buffer, byteIndexInBuffer, elementType, true, seq-cst)를 반환합니다.

25.4.10 Atomics.or ( typedArray, index, value )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. or를 파라미터 (xBytes, yBytes)를 가지며 아무 것도 캡처하지 않는 새로운 read-modify-write 수정 함수로 설정하고, 호출 시 원자적으로 다음 단계들을 수행합니다:
    1. ByteListBitwiseOp(|, xBytes, yBytes)를 반환합니다.
  2. AtomicReadModifyWrite(typedArray, index, value, or)를 반환합니다.

25.4.11 Atomics.store ( typedArray, index, value )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. byteIndexInBuffer를 ? ValidateAtomicAccessOnIntegerTypedArray(typedArray, index)로 설정합니다.
  2. typedArray.[[ContentType]]bigint이면, v를 ? ToBigInt(value)로 설정합니다.
  3. 그 밖의 경우, v𝔽(? ToIntegerOrInfinity(value))로 설정합니다.
  4. RevalidateAtomicAccess(typedArray, byteIndexInBuffer)를 수행합니다.
  5. buffertypedArray.[[ViewedArrayBuffer]]로 설정합니다.
  6. elementTypeTypedArrayElementType(typedArray)로 설정합니다.
  7. SetValueInBuffer(buffer, byteIndexInBuffer, elementType, v, true, seq-cst)를 수행합니다.
  8. v를 반환합니다.

25.4.12 Atomics.sub ( typedArray, index, value )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. subtract를 파라미터 (xBytes, yBytes)를 가지며 typedArray를 캡처하는 새로운 read-modify-write 수정 함수로 설정하고, 호출 시 원자적으로 다음 단계들을 수행합니다:
    1. typeTypedArrayElementType(typedArray)로 설정합니다.
    2. isLittleEndian주변 에이전트Agent Record[[LittleEndian]] 필드 값으로 설정합니다.
    3. xRawBytesToNumeric(type, xBytes, isLittleEndian)로 설정합니다.
    4. yRawBytesToNumeric(type, yBytes, isLittleEndian)로 설정합니다.
    5. xNumber이면,
      1. differenceNumber::subtract(x, y)로 설정합니다.
    6. 그 밖의 경우,
      1. Assert: xBigInt임을 확인합니다.
      2. differenceBigInt::subtract(x, y)로 설정합니다.
    7. differenceBytesNumericToRawBytes(type, difference, isLittleEndian)로 설정합니다.
    8. Assert: differenceBytes, xBytes, yBytes가 동일한 개수의 요소를 가짐.
    9. differenceBytes를 반환합니다.
  2. AtomicReadModifyWrite(typedArray, index, value, subtract)를 반환합니다.

25.4.13 Atomics.wait ( typedArray, index, value, timeout )

이 함수는 주변 에이전트를 대기 큐에 넣고, 알림을 받을 때까지 또는 대기 시간이 초과될 때까지 suspend시키며, 그 경우를 구분하는 문자열을 반환합니다.

호출 시 다음 단계들을 수행합니다:

  1. DoWait(sync, typedArray, index, value, timeout)를 반환합니다.

25.4.14 Atomics.waitAsync ( typedArray, index, value, timeout )

이 함수는 호출한 에이전트가 알림을 받거나 타임아웃에 도달하면 resolve되는 Promise를 반환합니다.

호출 시 다음 단계들을 수행합니다:

  1. DoWait(async, typedArray, index, value, timeout)를 반환합니다.

25.4.15 Atomics.notify ( typedArray, index, count )

이 함수는 대기 큐에서 잠들어 있는 일부 에이전트에게 알림을 보냅니다.

호출 시 다음 단계들을 수행합니다:

  1. taRecord를 ? ValidateIntegerTypedArray(typedArray, true)로 설정합니다.
  2. byteIndexInBuffer를 ? ValidateAtomicAccess(taRecord, index)로 설정합니다.
  3. countundefined이면,
    1. c를 +∞로 설정합니다.
  4. 그 밖의 경우,
    1. intCount를 ? ToIntegerOrInfinity(count)로 설정합니다.
    2. cmax(intCount, 0)로 설정합니다.
  5. buffertypedArray.[[ViewedArrayBuffer]]로 설정합니다.
  6. blockbuffer.[[ArrayBufferData]]로 설정합니다.
  7. IsSharedArrayBuffer(buffer) 가 false이면 +0𝔽를 반환합니다.
  8. WLGetWaiterList(block, byteIndexInBuffer)로 설정합니다.
  9. EnterCriticalSection(WL)을 수행합니다.
  10. SRemoveWaiters(WL, c)로 설정합니다.
  11. S의 각 요소 W에 대해 다음을 수행합니다:
    1. NotifyWaiter(WL, W)를 수행합니다.
  12. LeaveCriticalSection(WL)을 수행합니다.
  13. nS의 요소 개수로 설정합니다.
  14. 𝔽(n)를 반환합니다.

25.4.16 Atomics.xor ( typedArray, index, value )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. xor를 파라미터 (xBytes, yBytes)를 가지며 아무 것도 캡처하지 않는 새로운 read-modify-write 수정 함수로 설정하고, 호출 시 원자적으로 다음 단계들을 수행합니다:
    1. ByteListBitwiseOp(^, xBytes, yBytes)를 반환합니다.
  2. AtomicReadModifyWrite(typedArray, index, value, xor)를 반환합니다.

25.4.17 Atomics [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "Atomics"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

25.5 JSON 객체

JSON 객체:

  • %JSON%입니다.
  • 글로벌 객체"JSON" 프로퍼티의 초기 값입니다.
  • 일반 객체입니다.
  • parsestringify 두 함수를 포함하며, 이 함수들은 JSON 텍스트를 파싱하고 생성하는 데 사용됩니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • [[Construct]] 내부 메서드를 가지지 않으므로 new 연산자로 생성자로 사용할 수 없습니다.
  • [[Call]] 내부 메서드를 가지지 않으므로 함수로 호출할 수 없습니다.

JSON 데이터 교환 형식은 ECMA-404에 정의되어 있습니다. 이 명세에서 사용되는 JSON 교환 형식은 ECMA-404에서 설명된 것과 정확히 같습니다. JSON.parseJSON.stringify의 적합한 구현은 ECMA-404 명세에서 설명된 정확한 교환 형식을 삭제나 확장 없이 지원해야 합니다.

25.5.1 JSON.parse ( text [ , reviver ] )

이 함수는 JSON 텍스트(JSON 형식의 문자열)를 파싱하여 ECMAScript 언어 값를 생성합니다. JSON 형식은 ECMAScript 리터럴, 배열 이니셜라이저, 객체 이니셜라이저의 문법과 유사하게 리터럴, 배열, 객체를 표현합니다. 파싱 후, JSON 객체는 ECMAScript 객체로 실현됩니다. JSON 배열은 ECMAScript Array 인스턴스로 실현됩니다. JSON 문자열, 숫자, 불리언, 그리고 null은 ECMAScript의 문자열, 숫자, 불리언, null로 실현됩니다.

선택적 reviver 파라미터는 keyvalue 두 개의 파라미터를 받는 함수입니다. 결과를 필터하고 변환할 수 있습니다. 파싱 과정에서 생성되는 각 key/value 쌍에 대해 호출되며, 반환 값이 원래 값 대신 사용됩니다. 받은 값을 그대로 반환하면 구조는 변경되지 않습니다. undefined를 반환하면 해당 프로퍼티는 결과에서 삭제됩니다.

  1. jsonString을 ? ToString(text)로 설정합니다.
  2. unfiltered를 ? ParseJSON(jsonString)로 설정합니다.
  3. IsCallable(reviver)가 true이면,
    1. rootOrdinaryObjectCreate(%Object.prototype%)로 설정합니다.
    2. rootName을 빈 문자열로 설정합니다.
    3. CreateDataPropertyOrThrow(root, rootName, unfiltered)를 수행합니다.
    4. InternalizeJSONProperty(root, rootName, reviver)를 반환합니다.
  4. 그 밖의 경우,
    1. unfiltered를 반환합니다.

이 함수의 "length" 프로퍼티 값은 2𝔽입니다.

25.5.1.1 ParseJSON ( text )

추상 연산 ParseJSON은 인자 text (문자열)를 받고, normal completionECMAScript 언어 값 또는 throw completion을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. StringToCodePoints(text) 가 ECMA-404에서 명시된 유효한 JSON 텍스트가 아니면 SyntaxError 예외를 throw합니다.
  2. scriptString문자열 연결"(", text, ");"을 합쳐 생성합니다.
  3. scriptParseText(scriptString, Script)로 설정합니다.
  4. 참고: 조기 에러 규칙은 13.2.5.1에 정의되어 있으며, 위 ParseText 호출에 대해 특별 처리를 합니다.
  5. Assert: script파싱 노드여야 합니다.
  6. result를 ! Evaluation(script)로 설정합니다.
  7. 참고: PropertyDefinitionEvaluation 의미는 13.2.5.5에 정의되어 있으며, 위 평가에 대해 특별 처리를 합니다.
  8. Assert: result는 문자열, 숫자, 불리언, ArrayLiteral 또는 ObjectLiteral로 정의된 객체, null 중 하나여야 합니다.
  9. result를 반환합니다.

적합한 JSON.parse 구현은 JSON 문법을 확장할 수 없습니다. 구현체가 수정된 또는 확장된 JSON 교환 형식을 지원하고 싶다면 별도의 파싱 함수를 정의해야 합니다.

참고 1

유효한 JSON 텍스트는 ECMAScript PrimaryExpression 문법의 부분집합입니다. 1 단계는 jsonString이 그 부분집합에 부합하는지 검증하며, 8 단계는 평가 결과가 적합한 타입의 값임을 단언합니다.

하지만 13.2.5.5가 ParseJSON 동안 다르게 동작하므로, 동일한 소스 텍스트가 PrimaryExpression으로 평가할 때와 JSON으로 평가할 때 결과가 다를 수 있습니다. 또한 객체 리터럴에서 중복된 "__proto__" 프로퍼티에 대한 Early Error가 ParseJSON에서는 적용되지 않으므로, ParseJSON이 허용하는 모든 텍스트가 문법에는 맞더라도 PrimaryExpression으로서도 유효한 것은 아닙니다.

참고 2

객체 내에 중복된 이름 문자열이 있을 경우, 동일한 키에 대해 앞에 위치한 값들은 덮어쓰기 됩니다.

25.5.1.2 InternalizeJSONProperty ( holder, name, reviver )

추상 연산 InternalizeJSONProperty는 인자 holder (객체), name (문자열), reviver (함수 객체)를 받고, normal completionECMAScript 언어 값 또는 throw completion을 반환합니다.

참고

이 알고리즘은 [[Delete]] 또는 CreateDataPropertyfalse를 반환하더라도 일부러 예외를 throw하지 않습니다.

호출 시 다음 단계들을 수행합니다:

  1. val을 ? Get(holder, name)로 설정합니다.
  2. val객체면,
    1. isArray를 ? IsArray(val)로 설정합니다.
    2. isArraytrue면,
      1. len을 ? LengthOfArrayLike(val)로 설정합니다.
      2. I를 0으로 설정합니다.
      3. I < len 동안 반복합니다,
        1. prop을 ! ToString(𝔽(I))로 설정합니다.
        2. newElement를 ? InternalizeJSONProperty(val, prop, reviver)로 설정합니다.
        3. newElementundefined이면,
          1. val.[[Delete]](prop)를 수행합니다.
        4. 그 밖의 경우,
          1. CreateDataProperty(val, prop, newElement)를 수행합니다.
        5. II + 1로 설정합니다.
    3. 그 밖의 경우,
      1. keys를 ? EnumerableOwnProperties(val, key)로 설정합니다.
      2. keys의 각 문자열 P에 대해 다음을 수행합니다:
        1. newElement를 ? InternalizeJSONProperty(val, P, reviver)로 설정합니다.
        2. newElementundefined이면,
          1. val.[[Delete]](P)를 수행합니다.
        3. 그 밖의 경우,
          1. CreateDataProperty(val, P, newElement)를 수행합니다.
  3. Call(reviver, holder, « name, val »)를 반환합니다.

25.5.2 JSON.stringify ( value [ , replacer [ , space ] ] )

이 함수는 ECMAScript 언어 값를 나타내는 UTF-16 인코딩 JSON 형식의 문자열 또는 undefined를 반환합니다. 세 개의 매개변수를 받을 수 있습니다. value 매개변수는 ECMAScript 언어 값로, 보통 객체나 배열이지만 문자열, 불리언, 숫자 또는 null일 수도 있습니다. 선택적 replacer 매개변수는 객체와 배열의 문자열화 방식을 변경하는 함수이거나, 객체의 어떤 프로퍼티를 문자열화할지 선택하는 문자열 및 숫자 배열일 수 있습니다. 선택적 space 매개변수는 문자열 또는 숫자로, 결과에 가독성을 높이기 위해 공백을 삽입할 수 있습니다.

호출 시 다음 단계들을 수행합니다:

  1. stack을 새로운 빈 리스트로 설정합니다.
  2. indent를 빈 문자열로 설정합니다.
  3. PropertyListundefined로 설정합니다.
  4. ReplacerFunctionundefined로 설정합니다.
  5. replacer객체이면,
    1. IsCallable(replacer)가 true이면,
      1. ReplacerFunctionreplacer로 설정합니다.
    2. 그 밖의 경우,
      1. isArray를 ? IsArray(replacer)로 설정합니다.
      2. isArraytrue면,
        1. PropertyList를 새로운 빈 리스트로 설정합니다.
        2. len을 ? LengthOfArrayLike(replacer)로 설정합니다.
        3. k를 0으로 설정합니다.
        4. k < len 동안 반복합니다,
          1. prop을 ! ToString(𝔽(k))로 설정합니다.
          2. v를 ? Get(replacer, prop)로 설정합니다.
          3. itemundefined로 설정합니다.
          4. v문자열이면,
            1. itemv로 설정합니다.
          5. 그 밖의 경우 v숫자이면,
            1. item을 ! ToString(v)로 설정합니다.
          6. 그 밖의 경우 v객체이면,
            1. v[[StringData]] 또는 [[NumberData]] 내부 슬롯이 있으면 item을 ? ToString(v)로 설정합니다.
          7. itemundefined가 아니고 PropertyListitem이 없으면,
            1. itemPropertyList에 추가합니다.
          8. kk + 1로 설정합니다.
  6. space객체이면,
    1. space[[NumberData]] 내부 슬롯이 있으면,
      1. space를 ? ToNumber(space)로 설정합니다.
    2. 그 밖의 경우 space[[StringData]] 내부 슬롯이 있으면,
      1. space를 ? ToString(space)로 설정합니다.
  7. space숫자이면,
    1. spaceMV를 ! ToIntegerOrInfinity(space)로 설정합니다.
    2. spaceMVmin(10, spaceMV)로 설정합니다.
    3. spaceMV < 1이면 gap을 빈 문자열로, 그 밖의 경우 gap을 코드 유닛 0x0020(SPACE)을 spaceMV번 반복한 문자열 값으로 설정합니다.
  8. 그 밖의 경우 space문자열이면,
    1. space의 길이가 10 이하이면 gapspace로, 그 밖의 경우 gapspace의 0~10 부분 문자열로 설정합니다.
  9. 그 밖의 경우,
    1. gap을 빈 문자열로 설정합니다.
  10. wrapperOrdinaryObjectCreate(%Object.prototype%)로 설정합니다.
  11. CreateDataPropertyOrThrow(wrapper, 빈 문자열, value)를 수행합니다.
  12. stateJSON Serialization Record { [[ReplacerFunction]]: ReplacerFunction, [[Stack]]: stack, [[Indent]]: indent, [[Gap]]: gap, [[PropertyList]]: PropertyList }로 설정합니다.
  13. SerializeJSONProperty(state, 빈 문자열, wrapper)를 반환합니다.

이 함수의 "length" 프로퍼티 값은 3𝔽입니다.

참고 1

JSON 구조는 임의의 깊이로 중첩될 수 있지만, 반드시 비순환적이어야 합니다. value가 순환 구조이거나 순환 구조를 포함하는 경우 이 함수는 TypeError 예외를 throw해야 합니다. 아래는 문자열화할 수 없는 값의 예시입니다:

a = [];
a[0] = a;
my_text = JSON.stringify(a); // TypeError를 반드시 throw해야 합니다.
참고 2

기호적 원시값은 다음과 같이 렌더링됩니다:

  • null 값은 JSON 텍스트에서 "null" 문자열 값으로 렌더링됩니다.
  • undefined 값은 렌더링되지 않습니다.
  • true 값은 JSON 텍스트에서 "true" 문자열 값으로 렌더링됩니다.
  • false 값은 JSON 텍스트에서 "false" 문자열 값으로 렌더링됩니다.
참고 3

문자열 값은 QUOTATION MARK (") 코드 유닛으로 감싸집니다. "\ 코드 유닛은 \ 접두사로 이스케이프 처리됩니다. 제어 문자 코드 유닛은 \uHHHH, 또는 더 짧은 \b (백스페이스), \f (폼피드), \n (라인피드), \r (캐리지 리턴), \t (탭) 이스케이프 시퀀스로 대체됩니다.

참고 4

Finite 숫자는 ToString(number)을 호출한 것처럼 문자열화됩니다. NaNInfinity는 부호와 관계없이 "null" 문자열 값으로 표현됩니다.

참고 5

JSON 표현이 없는 값(undefined 및 함수 등)은 문자열을 생성하지 않고 undefined 값을 생성합니다. 배열에서는 이러한 값이 "null" 문자열 값으로 표현되고, 객체에서는 표현 불가 값이 프로퍼티에서 제외됩니다.

참고 6

객체는 U+007B(왼쪽 중괄호)로 시작해 0개 이상의 프로퍼티(각 프로퍼티는 U+002C(쉼표)로 구분), U+007D(오른쪽 중괄호)로 닫힙니다. 프로퍼티는 프로퍼티 이름을 나타내는 따옴표로 감싼 문자열, U+003A(콜론), 문자열화된 프로퍼티 값으로 구성됩니다. 배열은 U+005B(왼쪽 대괄호)로 시작해 0개 이상의 값(각 값은 U+002C(쉼표)로 구분), U+005D(오른쪽 대괄호)로 닫힙니다.

25.5.2.1 JSON Serialization Record

JSON Serialization Record는 JSON 형식으로 직렬화를 가능하게 하는 Record 값입니다.

JSON Serialization Record는 표 80에 나열된 필드를 가집니다.

표 80: JSON Serialization Record 필드
필드 이름 의미
[[ReplacerFunction]] 함수 객체 또는 undefined 객체 프로퍼티에 대한 대체 값을 제공하는 함수(JSON.stringify의 replacer 매개변수로부터).
[[PropertyList]] 문자열의 리스트 또는 undefined 비배열 객체 직렬화 시 포함할 프로퍼티 이름(JSON.stringify의 replacer 매개변수로부터).
[[Gap]] 문자열 들여쓰기 단위(JSON.stringify의 space 매개변수로부터).
[[Stack]] 객체 리스트 직렬화 중인 중첩 객체 집합. 순환 구조 감지에 사용됨.
[[Indent]] 문자열 현재 들여쓰기.

25.5.2.2 SerializeJSONProperty ( state, key, holder )

추상 연산 SerializeJSONProperty는 인자 state (JSON Serialization Record), key (문자열), holder (객체)를 받고, 문자열 또는 undefined를 담은 normal completion 또는 throw completion을 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. value를 ? Get(holder, key)로 설정합니다.
  2. value객체이거나 valueBigInt이면,
    1. toJSON를 ? GetV(value, "toJSON")로 설정합니다.
    2. IsCallable(toJSON)가 true면,
      1. value를 ? Call(toJSON, value, « key »)로 설정합니다.
  3. state.[[ReplacerFunction]]undefined가 아니면,
    1. value를 ? Call(state.[[ReplacerFunction]], holder, « key, value »)로 설정합니다.
  4. value객체이면,
    1. value[[NumberData]] 내부 슬롯이 있으면,
      1. value를 ? ToNumber(value)로 설정합니다.
    2. 그 밖의 경우 value[[StringData]] 내부 슬롯이 있으면,
      1. value를 ? ToString(value)로 설정합니다.
    3. 그 밖의 경우 value[[BooleanData]] 내부 슬롯이 있으면,
      1. valuevalue.[[BooleanData]]로 설정합니다.
    4. 그 밖의 경우 value[[BigIntData]] 내부 슬롯이 있으면,
      1. valuevalue.[[BigIntData]]로 설정합니다.
  5. valuenull이면 "null"를 반환합니다.
  6. valuetrue이면 "true"를 반환합니다.
  7. valuefalse이면 "false"를 반환합니다.
  8. value문자열이면 QuoteJSONString(value)를 반환합니다.
  9. value숫자이면,
    1. valuefinite이면 ! ToString(value)를 반환합니다.
    2. "null"를 반환합니다.
  10. valueBigInt이면 TypeError 예외를 throw합니다.
  11. value객체이고 IsCallable(value)가 false이면,
    1. isArray를 ? IsArray(value)로 설정합니다.
    2. isArraytrue이면 ? SerializeJSONArray(state, value)를 반환합니다.
    3. SerializeJSONObject(state, value)를 반환합니다.
  12. undefined를 반환합니다.

25.5.2.3 QuoteJSONString ( value )

추상 연산 QuoteJSONString은 인자 value (문자열)를 받고 문자열을 반환합니다. value를 코드 유닛 0x0022(따옴표)로 감싸고 특정 코드 유닛을 이스케이프 처리합니다. 이 연산은 value6.1.4에 설명된 대로 UTF-16 인코딩 코드 포인트 시퀀스로 해석합니다. 호출 시 다음 단계들을 수행합니다:

  1. product를 코드 유닛 0x0022(따옴표)만 포함하는 문자열 값으로 설정합니다.
  2. StringToCodePoints(value)의 각 코드 포인트 C에 대해 다음을 수행합니다:
    1. C표 81의 "Code Point" 열에 나열되어 있으면,
      1. product문자열 연결product와 해당 행의 "Escape Sequence" 열에 지정된 C의 이스케이프 시퀀스를 연결한 값으로 설정합니다.
    2. 그 밖의 경우 C의 숫자 값이 0x0020(SPACE)보다 작거나 C리드 서러게이트 또는 트레일링 서러게이트와 동일한 값이면,
      1. unitC의 숫자 값에 해당하는 코드 유닛으로 설정합니다.
      2. product문자열 연결productUnicodeEscape(unit)을 연결한 값으로 설정합니다.
    3. 그 밖의 경우,
      1. product문자열 연결productUTF16EncodeCodePoint(C)을 연결한 값으로 설정합니다.
  3. product문자열 연결product와 코드 유닛 0x0022(따옴표)를 연결한 값으로 설정합니다.
  4. product를 반환합니다.
표 81: JSON 단일 문자 이스케이프 시퀀스
코드 포인트 유니코드 문자 이름 이스케이프 시퀀스
U+0008 백스페이스 \b
U+0009 문자 탭 \t
U+000A 줄 바꿈 (LF) \n
U+000C 폼 피드 (FF) \f
U+000D 캐리지 리턴 (CR) \r
U+0022 큰따옴표 \"
U+005C 역슬래시 \\

25.5.2.4 UnicodeEscape ( C )

추상 연산 UnicodeEscape는 인자 C (코드 유닛)를 받아 문자열을 반환합니다. C를 유니코드 이스케이프 시퀀스로 나타냅니다. 호출 시 다음 단계들을 수행합니다:

  1. nC의 숫자 값으로 설정합니다.
  2. Assert: n ≤ 0xFFFF.
  3. hexn의 소문자 16진수 문자열 표현으로 설정합니다.
  4. 코드 유닛 0x005C(역슬래시), "u", StringPad(hex, 4, "0", start)를 문자열 연결로 합친 결과를 반환합니다.

25.5.2.5 SerializeJSONObject ( state, value )

추상 연산 SerializeJSONObject는 인자 state (JSON 직렬화 레코드), value (객체)를 받고, normal completion에 문자열 또는 throw completion을 반환합니다. 객체를 직렬화합니다. 호출 시 다음 단계들을 수행합니다:

  1. state.[[Stack]]value가 포함되어 있으면, 구조가 순환적이므로 TypeError 예외를 throw합니다.
  2. valuestate.[[Stack]]에 추가합니다.
  3. stepBackstate.[[Indent]]로 설정합니다.
  4. state.[[Indent]]state.[[Indent]]state.[[Gap]]문자열 연결한 값으로 설정합니다.
  5. state.[[PropertyList]]undefined가 아니면,
    1. Kstate.[[PropertyList]]로 설정합니다.
  6. 그 밖의 경우,
    1. K를 ? EnumerableOwnProperties(value, key)로 설정합니다.
  7. partial을 새로운 빈 리스트로 설정합니다.
  8. K의 각 요소 P에 대해 다음을 수행합니다:
    1. strP를 ? SerializeJSONProperty(state, P, value)로 설정합니다.
    2. strPundefined가 아니면,
      1. memberQuoteJSONString(P)로 설정합니다.
      2. member문자열 연결(member, ":")로 설정합니다.
      3. state.[[Gap]]이 빈 문자열이 아니면,
        1. member문자열 연결(member, 코드 유닛 0x0020 (공백))으로 설정합니다.
      4. member문자열 연결(member, strP)로 설정합니다.
      5. memberpartial에 추가합니다.
  9. partial이 비어 있으면,
    1. final"{}"로 설정합니다.
  10. 그 밖의 경우,
    1. state.[[Gap]]이 빈 문자열이면,
      1. propertiespartial의 모든 문자열 요소를 인접한 각 쌍을 코드 유닛 0x002C(콤마)로 구분하여 연결한 문자열 값으로 설정합니다. 첫번째와 마지막 문자열 앞뒤에는 콤마를 삽입하지 않습니다.
      2. final문자열 연결("{", properties, "}")로 설정합니다.
    2. 그 밖의 경우,
      1. separator를 코드 유닛 0x002C(콤마), 코드 유닛 0x000A(줄 바꿈), state.[[Indent]]문자열 연결한 값으로 설정합니다.
      2. propertiespartial의 모든 문자열 요소를 인접한 각 쌍을 separator로 구분하여 연결한 문자열 값으로 설정합니다. separator는 첫번째와 마지막 문자열 앞뒤에는 삽입하지 않습니다.
      3. final문자열 연결("{", 코드 유닛 0x000A(줄 바꿈), state.[[Indent]], properties, 코드 유닛 0x000A(줄 바꿈), stepBack, "}")로 설정합니다.
  11. state.[[Stack]]의 마지막 요소를 제거합니다.
  12. state.[[Indent]]stepBack으로 설정합니다.
  13. final을 반환합니다.

25.5.2.6 SerializeJSONArray ( state, value )

추상 연산 SerializeJSONArray는 인자 state (JSON 직렬화 레코드), value (ECMAScript 언어 값)를 받고, normal completion에 문자열 또는 throw completion을 반환합니다. 배열을 직렬화합니다. 호출 시 다음 단계들을 수행합니다:

  1. state.[[Stack]]value가 포함되어 있으면, 구조가 순환적이므로 TypeError 예외를 throw합니다.
  2. valuestate.[[Stack]]에 추가합니다.
  3. stepBackstate.[[Indent]]로 설정합니다.
  4. state.[[Indent]]문자열 연결(state.[[Indent]], state.[[Gap]])로 설정합니다.
  5. partial을 새로운 빈 리스트로 설정합니다.
  6. len을 ? LengthOfArrayLike(value)로 설정합니다.
  7. index를 0으로 설정합니다.
  8. index < len 동안 반복합니다,
    1. strP를 ? SerializeJSONProperty(state, ! ToString(𝔽(index)), value).
    2. strPundefined이면,
      1. "null"partial에 추가합니다.
    3. 그 밖의 경우,
      1. strPpartial에 추가합니다.
    4. indexindex + 1로 증가시킵니다.
  9. partial이 비어 있으면,
    1. final"[]"로 설정합니다.
  10. 그 밖의 경우,
    1. state.[[Gap]]이 빈 문자열이면,
      1. propertiespartial의 모든 문자열 요소를 인접한 각 쌍을 코드 유닛 0x002C(콤마)로 구분하여 연결한 문자열 값으로 설정합니다. 첫번째와 마지막 문자열 앞뒤에는 콤마를 삽입하지 않습니다.
      2. final문자열 연결("[", properties, "]")로 설정합니다.
    2. 그 밖의 경우,
      1. separator를 코드 유닛 0x002C(콤마), 코드 유닛 0x000A(줄 바꿈), state.[[Indent]]문자열 연결한 값으로 설정합니다.
      2. propertiespartial의 모든 문자열 요소를 인접한 각 쌍을 separator로 구분하여 연결한 문자열 값으로 설정합니다. separator는 첫번째와 마지막 문자열 앞뒤에는 삽입하지 않습니다.
      3. final문자열 연결("[", 코드 유닛 0x000A(줄 바꿈), state.[[Indent]], properties, 코드 유닛 0x000A(줄 바꿈), stepBack, "]")로 설정합니다.
  11. state.[[Stack]]의 마지막 요소를 제거합니다.
  12. state.[[Indent]]stepBack으로 설정합니다.
  13. final을 반환합니다.
참고

배열의 표현은 interval+0𝔽 (포함)에서 array.length (제외)까지의 요소만 포함합니다. 키가 array indices가 아닌 프로퍼티는 문자열화에서 제외됩니다. 배열은 왼쪽 대괄호로 시작하여, 요소가 콤마로 구분되고, 오른쪽 대괄호로 닫힌 형태로 문자열화됩니다.

25.5.3 JSON [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "JSON"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

26 메모리 관리

26.1 WeakRef 객체

WeakRef는 대상 객체나 심볼을 가비지 컬렉션으로부터 보존하지 않고 참조할 때 사용되는 객체입니다. WeakRef들은 대상 값이 가비지 컬렉션에 의해 회수되지 않았다면 해당 대상 값에 접근할 수 있도록 역참조 할 수 있습니다.

26.1.1 WeakRef 생성자

WeakRef 생성자:

  • %WeakRef%입니다.
  • 글로벌 객체"WeakRef" 프로퍼티의 초기 값입니다.
  • 생성자로 호출될 때 새로운 WeakRef를 생성하고 초기화합니다.
  • 함수로 호출되는 것은 의도되지 않았으며, 그렇게 호출하면 예외가 발생합니다.
  • 클래스 정의의 extends 절에서 값으로 사용할 수 있습니다. 지정된 WeakRef 동작을 상속하고자 하는 서브클래스 생성자super 호출을 통해 WeakRef 생성자를 호출하여, WeakRef.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성 및 초기화해야 합니다.

26.1.1.1 WeakRef ( target )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 throw합니다.
  2. CanBeHeldWeakly(target)이 false이면 TypeError 예외를 throw합니다.
  3. weakRef를 ? OrdinaryCreateFromConstructor(NewTarget, "%WeakRef.prototype%", « [[WeakRefTarget]] »)로 설정합니다.
  4. AddToKeptObjects(target)를 수행합니다.
  5. weakRef.[[WeakRefTarget]]target으로 설정합니다.
  6. weakRef를 반환합니다.

26.1.2 WeakRef 생성자의 속성

WeakRef 생성자:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%입니다.
  • 다음 프로퍼티들을 가집니다:

26.1.2.1 WeakRef.prototype

WeakRef.prototype의 초기 값은 WeakRef 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

26.1.3 WeakRef 프로토타입 객체의 속성

WeakRef 프로토타입 객체:

  • %WeakRef.prototype%입니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • 일반 객체입니다.
  • [[WeakRefTarget]] 내부 슬롯을 가지지 않습니다.

26.1.3.1 WeakRef.prototype.constructor

WeakRef.prototype.constructor의 초기 값은 %WeakRef%입니다.

26.1.3.2 WeakRef.prototype.deref ( )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. weakRefthis 값으로 설정합니다.
  2. RequireInternalSlot(weakRef, [[WeakRefTarget]])를 수행합니다.
  3. WeakRefDeref(weakRef)를 반환합니다.
참고

WeakReftarget 값을 반환하고 그 값이 undefined가 아니라면, 이 target 값은 현재 ECMAScript 코드 실행이 완료될 때까지 가비지 컬렉션되지 않아야 합니다. AddToKeptObjects 연산은 읽기 일관성이 유지되도록 보장합니다.

let target = { foo() {} };
let weakRef = new WeakRef(target);

// ... 이후 ...

if (weakRef.deref()) {
  weakRef.deref().foo();
}

위 예시에서 첫 번째 deref가 undefined로 평가되지 않는다면, 두 번째 deref도 undefined가 될 수 없습니다.

26.1.3.3 WeakRef.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "WeakRef"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

26.1.4 WeakRef 추상 연산

26.1.4.1 WeakRefDeref ( weakRef )

추상 연산 WeakRefDeref는 인자 weakRef (WeakRef)를 받아 ECMAScript 언어 값를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. targetweakRef.[[WeakRefTarget]]으로 설정합니다.
  2. targetempty가 아니라면,
    1. AddToKeptObjects(target)를 수행합니다.
    2. target을 반환합니다.
  3. undefined를 반환합니다.
참고

이 추상 연산은 WeakRef.prototype.deref와는 별개로 정의되어 있으며, liveness(생존성)을 간결하게 정의할 수 있도록 하기 위함입니다.

26.1.5 WeakRef 인스턴스의 속성

WeakRef 인스턴스는 일반 객체이며, WeakRef 프로토타입 객체의 프로퍼티를 상속합니다. 또한 WeakRef 인스턴스들은 [[WeakRefTarget]] 내부 슬롯을 가지고 있습니다.

26.2 FinalizationRegistry 객체

FinalizationRegistry는 대상 객체와 심볼이 가비지 컬렉션될 때 수행되는 정리 작업의 등록과 해제를 관리하는 객체입니다.

26.2.1 FinalizationRegistry 생성자

FinalizationRegistry 생성자:

  • %FinalizationRegistry%입니다.
  • 글로벌 객체"FinalizationRegistry" 프로퍼티의 초기 값입니다.
  • 생성자로 호출될 때 새로운 FinalizationRegistry를 생성하고 초기화합니다.
  • 함수로 호출되는 것은 의도되지 않았으며, 그렇게 호출하면 예외가 발생합니다.
  • 클래스 정의의 extends 절에서 값으로 사용할 수 있습니다. 지정된 FinalizationRegistry 동작을 상속하고자 하는 서브클래스 생성자super 호출을 통해 FinalizationRegistry 생성자를 호출하여, FinalizationRegistry.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성 및 초기화해야 합니다.

26.2.1.1 FinalizationRegistry ( cleanupCallback )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. NewTarget이 undefined이면 TypeError 예외를 throw합니다.
  2. IsCallable(cleanupCallback)이 false이면 TypeError 예외를 throw합니다.
  3. finalizationRegistry를 ? OrdinaryCreateFromConstructor(NewTarget, "%FinalizationRegistry.prototype%", « [[Realm]], [[CleanupCallback]], [[Cells]] »)로 설정합니다.
  4. fn활성 함수 객체로 설정합니다.
  5. finalizationRegistry.[[Realm]]fn.[[Realm]]로 설정합니다.
  6. finalizationRegistry.[[CleanupCallback]]HostMakeJobCallback(cleanupCallback)으로 설정합니다.
  7. finalizationRegistry.[[Cells]]를 새로운 빈 리스트로 설정합니다.
  8. finalizationRegistry를 반환합니다.

26.2.2 FinalizationRegistry 생성자의 속성

FinalizationRegistry 생성자:

  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%입니다.
  • 다음 프로퍼티들을 가집니다:

26.2.2.1 FinalizationRegistry.prototype

FinalizationRegistry.prototype의 초기 값은 FinalizationRegistry 프로토타입 객체입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

26.2.3 FinalizationRegistry 프로토타입 객체의 속성

FinalizationRegistry 프로토타입 객체:

  • %FinalizationRegistry.prototype%입니다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Object.prototype%입니다.
  • 일반 객체입니다.
  • [[Cells]][[CleanupCallback]] 내부 슬롯을 가지지 않습니다.

26.2.3.1 FinalizationRegistry.prototype.constructor

FinalizationRegistry.prototype.constructor의 초기 값은 %FinalizationRegistry%입니다.

26.2.3.2 FinalizationRegistry.prototype.register ( target, heldValue [ , unregisterToken ] )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. finalizationRegistrythis 값으로 설정합니다.
  2. RequireInternalSlot(finalizationRegistry, [[Cells]])를 수행합니다.
  3. CanBeHeldWeakly(target)이 false이면 TypeError 예외를 throw합니다.
  4. SameValue(target, heldValue)가 true이면 TypeError 예외를 throw합니다.
  5. CanBeHeldWeakly(unregisterToken)이 false이면,
    1. unregisterTokenundefined가 아니면 TypeError 예외를 throw합니다.
    2. unregisterTokenempty로 설정합니다.
  6. cell레코드 { [[WeakRefTarget]]: target, [[HeldValue]]: heldValue, [[UnregisterToken]]: unregisterToken }로 설정합니다.
  7. cellfinalizationRegistry.[[Cells]]에 추가합니다.
  8. undefined를 반환합니다.
참고

이 명세의 알고리즘과 정의에 따르면, cell.[[HeldValue]]finalizationRegistry.[[Cells]]cell이 포함되어 있을 때 live입니다. 그러나 이는 반드시 cell.[[UnregisterToken]]이나 cell.[[Target]]live임을 의미하지는 않습니다. 예를 들어, 객체를 자기 자신을 unregister token으로 등록해도 그 객체가 영원히 살아있는 것은 아닙니다.

26.2.3.3 FinalizationRegistry.prototype.unregister ( unregisterToken )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. finalizationRegistrythis 값으로 설정합니다.
  2. RequireInternalSlot(finalizationRegistry, [[Cells]])를 수행합니다.
  3. CanBeHeldWeakly(unregisterToken)이 false이면 TypeError 예외를 throw합니다.
  4. removedfalse로 설정합니다.
  5. finalizationRegistry.[[Cells]]의 각 레코드 { [[WeakRefTarget]], [[HeldValue]], [[UnregisterToken]] } cell에 대해,
    1. cell.[[UnregisterToken]]empty가 아니고 SameValue(cell.[[UnregisterToken]], unregisterToken)가 true이면,
      1. cellfinalizationRegistry.[[Cells]]에서 제거합니다.
      2. removedtrue로 설정합니다.
  6. removed를 반환합니다.

26.2.3.4 FinalizationRegistry.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 값 "FinalizationRegistry"입니다.

이 프로퍼티의 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

26.2.4 FinalizationRegistry 인스턴스의 속성

FinalizationRegistry 인스턴스는 일반 객체이며, FinalizationRegistry 프로토타입 객체의 프로퍼티를 상속합니다. 또한 FinalizationRegistry 인스턴스들은 [[Cells]][[CleanupCallback]] 내부 슬롯을 가지고 있습니다.

27 제어 추상화 객체

27.1 반복

27.1.1 공통 반복 인터페이스

인터페이스는 특정 명세와 일치하는 프로퍼티 키들의 집합입니다. 객체가 인터페이스의 명세에 따라 모든 프로퍼티를 제공하면 그 인터페이스를 준수한다고 합니다. 인터페이스는 별도의 객체로 표현되지 않습니다. 어떤 인터페이스를 준수하는 여러 개의 구현 객체가 있을 수 있습니다. 하나의 객체가 여러 인터페이스를 준수할 수도 있습니다.

27.1.1.1 이터러블 인터페이스

이터러블 인터페이스표 82에 설명된 프로퍼티를 포함합니다:

표 82: 이터러블 인터페이스 필수 프로퍼티
프로퍼티 요구사항
%Symbol.iterator% 이터레이터 객체를 반환하는 함수 반환된 객체는 이터레이터 인터페이스를 준수해야 합니다.

27.1.1.2 이터레이터 인터페이스

이터레이터 인터페이스를 구현한 객체는 표 83의 프로퍼티를 반드시 포함해야 합니다. 이러한 객체는 표 84의 프로퍼티도 구현할 수 있습니다.

표 83: 이터레이터 인터페이스 필수 프로퍼티
프로퍼티 요구사항
"next" IteratorResult 객체를 반환하는 함수 반환된 객체는 IteratorResult 인터페이스를 준수해야 합니다. 만약 이터레이터next 메서드의 이전 호출이 IteratorResult 객체"done" 프로퍼티가 true인 값을 반환했다면, 그 객체의 이후 모든 next 호출도 IteratorResult 객체"done" 프로퍼티가 true인 값을 반환해야 합니다. 하지만 이 요구사항은 강제되지 않습니다.
참고 1

next 함수에 인자를 전달할 수 있지만, 그 해석과 유효성은 대상 이터레이터에 따라 다릅니다. for-of 문 및 기타 일반적인 이터레이터 사용자들은 인자를 전달하지 않으므로, 이러한 방식으로 사용될 것으로 예상되는 이터레이터 객체는 인자 없이 호출되는 경우에도 대응할 수 있어야 합니다.

표 84: 이터레이터 인터페이스 선택적 프로퍼티
프로퍼티 요구사항
"return" IteratorResult 객체를 반환하는 함수 반환된 객체는 IteratorResult 인터페이스를 준수해야 합니다. 이 메서드를 호출하면 이터레이터 객체에게 더 이상 next 메서드를 호출할 의도가 없음을 알립니다. 반환된 IteratorResult 객체는 일반적으로 "done" 프로퍼티가 true이고, "value" 프로퍼티는 return 메서드에 인자로 전달된 값이 됩니다. 하지만 이 요구사항은 강제되지 않습니다.
"throw" IteratorResult 객체를 반환하는 함수 반환된 객체는 IteratorResult 인터페이스를 준수해야 합니다. 이 메서드를 호출하면 이터레이터 객체에게 에러 상태가 발생했음을 알립니다. 인자는 에러 상태를 식별하는 데 사용될 수 있으며, 일반적으로 예외 객체가 됩니다. 일반적인 응답은 전달된 인자를 throw하는 것입니다. 메서드가 throw하지 않는 경우, 반환된 IteratorResult 객체는 일반적으로 "done" 프로퍼티가 true인 값을 가집니다.
참고 2

일반적으로 이러한 메서드를 호출하기 전에 존재 여부를 확인하는 것이 좋습니다. ECMAScript 언어의 특정 기능(예: for-of, yield*, 배열 구조분해)은 존재 여부를 확인한 후에 이런 메서드를 호출합니다. 이터러블 객체를 인자로 받는 대부분의 ECMAScript 라이브러리 함수도 조건부로 이를 호출합니다.

27.1.1.3 비동기 반복자 인터페이스

비동기 반복자 인터페이스에는 표 85에 설명된 속성이 포함됩니다:

표 85: 비동기 반복자 인터페이스 필수 속성
속성 요구 사항
%Symbol.asyncIterator% 비동기 반복자 객체를 반환하는 함수 반환된 객체는 비동기 반복자 인터페이스를 준수해야 합니다.

27.1.1.4 비동기 반복자 인터페이스

비동기 반복자 인터페이스를 구현하는 객체는 표 86의 속성을 포함해야 합니다. 이러한 객체는 표 87의 속성도 구현할 수 있습니다.

표 86: 비동기 반복자 인터페이스 필수 속성
속성 요구 사항
"next" IteratorResult 객체에 대한 프로미스를 반환하는 함수

프로미스가 이행될 때, IteratorResult 인터페이스를 준수하는 객체로 이행되어야 합니다. 비동기 반복자next 메서드에 대한 이전 호출이 IteratorResult 객체"done" 속성이 true인 프로미스를 반환했다면, 해당 객체의 next 메서드에 대한 모든 이후 호출도 IteratorResult 객체"done" 속성이 true인 프로미스를 반환해야 합니다. 단, 이 요구 사항은 강제되지 않습니다.

또한, 이행 값으로 제공되는 IteratorResult 객체는 프로미스(또는 "thenable")가 아닌 값을 가진 "value" 속성을 가져야 합니다. 하지만 이 요구 사항도 강제되지 않습니다.

참고 1

next 함수에 인자를 전달할 수 있으나, 해당 인자의 해석 및 유효성은 대상 비동기 반복자에 따라 달라집니다. for-await-of 문 및 기타 일반적인 비동기 반복자 사용자는 인자를 전달하지 않으므로, 이러한 방식으로 사용될 것으로 예상되는 비동기 반복자 객체는 인자 없이 호출되는 경우를 처리할 준비가 되어 있어야 합니다.

표 87: 비동기 반복자 인터페이스 선택적 속성
속성 요구 사항
"return" IteratorResult 객체에 대한 프로미스를 반환하는 함수

프로미스가 이행될 때, IteratorResult 인터페이스를 준수하는 객체로 이행되어야 합니다. 이 메서드를 호출하면 비동기 반복자 객체에게 더 이상 next 메서드를 호출할 의도가 없음을 알립니다. 반환된 프로미스는 일반적으로 IteratorResult 객체"done" 속성이 true이고, "value" 속성이 return 메서드의 인자 값인 객체로 이행됩니다. 단, 이 요구 사항은 강제되지 않습니다.

또한, 이행 값으로 제공되는 IteratorResult 객체는 프로미스(또는 "thenable")가 아닌 값을 가진 "value" 속성을 가져야 합니다. 인자 값이 일반적으로 사용되는 방식이라면, 거부된 프로미스일 경우 동일한 이유로 거부된 프로미스를 반환해야 하며, 이행된 프로미스일 경우 이행 값이 반환된 프로미스의 "value" 속성 값으로 사용되어야 합니다. 하지만 이러한 요구 사항도 강제되지 않습니다.

"throw" IteratorResult 객체에 대한 프로미스를 반환하는 함수

프로미스가 이행될 때, IteratorResult 인터페이스를 준수하는 객체로 이행되어야 합니다. 이 메서드를 호출하면 비동기 반복자 객체에게 호출자가 오류 조건을 감지했음을 알립니다. 인자는 오류 조건을 식별하는 데 사용될 수 있으며 일반적으로 예외 객체입니다. 일반적인 응답은 전달된 인자 값으로 거부되는 프로미스를 반환하는 것입니다.

반환된 프로미스가 이행되는 경우, IteratorResult 객체 이행 값에는 일반적으로 "done" 속성이 true이고, "value" 속성 값은 프로미스(또는 "thenable")가 아닌 값이어야 합니다. 단, 이 요구 사항은 강제되지 않습니다.

참고 2

일반적으로 이러한 메서드를 호출하는 쪽에서는 존재 여부를 확인한 후 호출해야 합니다. for-await-ofyield*와 같은 일부 ECMAScript 언어 기능은 존재 여부 확인 후 이 메서드를 호출합니다.

27.1.1.5 반복 결과 인터페이스

IteratorResult 인터페이스에는 표 88에 나열된 속성이 포함됩니다:

표 88: IteratorResult 인터페이스 속성
속성 요구 사항
"done" 불리언 값 이것은 반복자next 메서드 호출 결과 상태입니다. 반복자의 끝에 도달하면 "done"true입니다. 끝에 도달하지 않았다면 "done"false이고 값이 제공됩니다. "done" 속성(자신 또는 상속된)이 존재하지 않으면 false 값을 갖는 것으로 간주합니다.
"value" ECMAScript 언어 값 done이 false인 경우, 현재 반복 요소 값입니다. done이 true이면 반복자의 반환 값(있다면)입니다. 반복자가 반환 값을 제공하지 않는 경우, "value"undefined입니다. 이 경우, 명시적으로 "value" 속성을 상속받지 않았다면, 해당 속성은 적합한 객체에서 생략될 수 있습니다.

27.1.2 반복자 헬퍼 객체

반복자 헬퍼 객체는 특정 소스 일반 객체의 지연 변환을 나타내는 반복자 객체입니다. 반복자 헬퍼 객체를 위한 명명된 생성자는 없습니다. 대신, 반복자 헬퍼 객체는 Iterator 인스턴스 객체의 특정 메서드를 호출하여 생성됩니다.

27.1.2.1 %IteratorHelperPrototype% 객체

%IteratorHelperPrototype% 객체:

27.1.2.1.1 %IteratorHelperPrototype%.next ( )

  1. GeneratorResume(this 값, undefined, "Iterator Helper")를 반환합니다.

27.1.2.1.2 %IteratorHelperPrototype%.return ( )

  1. Othis 값으로 둡니다.
  2. RequireInternalSlot(O, [[UnderlyingIterator]])를 수행합니다.
  3. Assert: O[[GeneratorState]] 내부 슬롯을 가집니다.
  4. 만약 O.[[GeneratorState]]suspended-start라면,
    1. O.[[GeneratorState]]completed로 설정합니다.
    2. 참고: 생성기가 완료 상태에 들어가면 다시 돌아오지 않으며, 관련된 실행 컨텍스트가 다시 재개되지 않습니다. O와 관련된 모든 실행 상태는 이 시점에서 폐기될 수 있습니다.
    3. IteratorClose(O.[[UnderlyingIterator]], NormalCompletion(unused))를 수행합니다.
    4. CreateIteratorResultObject(undefined, true)를 반환합니다.
  5. CReturnCompletion(undefined)으로 둡니다.
  6. GeneratorResumeAbrupt(O, C, "Iterator Helper")를 반환합니다.

27.1.2.1.3 %IteratorHelperPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기 값은 문자열 "Iterator Helper"입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }입니다.

27.1.3 반복자 객체

27.1.3.1 반복자 생성자

Iterator 생성자:

  • %Iterator%입니다.
  • 전역 객체"Iterator" 속성의 초기 값입니다.
  • 서브클래싱이 가능하도록 설계되었습니다. 클래스 정의의 extends 절의 값으로 사용할 수 있습니다.

27.1.3.1.1 Iterator ( )

이 함수는 호출될 때 다음 단계들을 수행합니다:

  1. NewTarget이 undefined 또는 활성 함수 객체인 경우, TypeError 예외를 발생시킵니다.
  2. OrdinaryCreateFromConstructor(NewTarget, "%Iterator.prototype%")를 반환합니다.

27.1.3.2 반복자 생성자의 속성

Iterator 생성자:

  • [[Prototype]] 내부 슬롯 값은 %Function.prototype%입니다.
  • 다음과 같은 속성을 가집니다:

27.1.3.2.1 Iterator.from ( O )

  1. iteratorRecord를 ? GetIteratorFlattenable(O, iterate-string-primitives)로 둡니다.
  2. hasInstance를 ? OrdinaryHasInstance(%Iterator%, iteratorRecord.[[Iterator]])로 둡니다.
  3. hasInstancetrue이면,
    1. iteratorRecord.[[Iterator]]를 반환합니다.
  4. wrapperOrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] »)로 둡니다.
  5. wrapper.[[Iterated]]iteratorRecord를 설정합니다.
  6. wrapper를 반환합니다.

27.1.3.2.1.1 %WrapForValidIteratorPrototype% 객체

%WrapForValidIteratorPrototype% 객체:

27.1.3.2.1.1.1 %WrapForValidIteratorPrototype%.next ( )

  1. Othis 값으로 둡니다.
  2. RequireInternalSlot(O, [[Iterated]])를 수행합니다.
  3. iteratorRecordO.[[Iterated]]로 둡니다.
  4. Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])를 반환합니다.

27.1.3.2.1.1.2 %WrapForValidIteratorPrototype%.return ( )

  1. Othis 값으로 둡니다.
  2. RequireInternalSlot(O, [[Iterated]])를 수행합니다.
  3. iteratorO.[[Iterated]].[[Iterator]]로 둡니다.
  4. Assert: iterator 객체임을 확인합니다.
  5. returnMethod를 ? GetMethod(iterator, "return")로 둡니다.
  6. returnMethodundefined이면,
    1. CreateIteratorResultObject(undefined, true)를 반환합니다.
  7. Call(returnMethod, iterator)를 반환합니다.

27.1.3.2.2 Iterator.prototype

Iterator.prototype의 초기 값은 Iterator prototype 객체입니다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }입니다.

27.1.4 반복자 프로토타입 객체의 속성

반복자 프로토타입 객체:

참고

이 명세에서 반복자 인터페이스를 구현하는 모든 객체는 %Iterator.prototype%을 상속합니다. ECMAScript 코드 역시 %Iterator.prototype%에서 상속하는 객체를 정의할 수 있습니다. %Iterator.prototype%은 모든 반복자 객체에 적용 가능한 추가 메서드를 제공할 수 있는 장소입니다.

다음 표현식은 ECMAScript 코드에서 %Iterator.prototype% 객체에 접근하는 한 가지 방법입니다:

Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))

27.1.4.1 Iterator.prototype.constructor

Iterator.prototype.constructor접근자 속성이며, 속성은 { [[Enumerable]]: false, [[Configurable]]: true }입니다. [[Get]][[Set]] 속성은 다음과 같이 정의됩니다:

27.1.4.1.1 get Iterator.prototype.constructor

[[Get]] 속성 값은 인자가 필요 없는 내장 함수입니다. 호출 시 다음 단계를 수행합니다:

  1. %Iterator%를 반환합니다.

27.1.4.1.2 set Iterator.prototype.constructor

[[Set]] 속성 값은 v 인자를 받는 내장 함수입니다. 호출 시 다음 단계를 수행합니다:

  1. SetterThatIgnoresPrototypeProperties(this 값, %Iterator.prototype%, "constructor", v)를 수행합니다.
  2. undefined를 반환합니다.
참고

대부분의 내장 프로토타입에 있는 "constructor" 속성과 달리, 웹 호환성을 위해 이 속성은 반드시 접근자여야 합니다.

27.1.4.2 Iterator.prototype.drop ( limit )

이 메서드는 호출 시 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. numLimitCompletion(ToNumber(limit))로 둡니다.
  5. IfAbruptCloseIterator(numLimit, iterated)를 수행합니다.
  6. numLimitNaN이면,
    1. errorThrowCompletion(새로 생성한 RangeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  7. integerLimit를 ! ToIntegerOrInfinity(numLimit)로 둡니다.
  8. integerLimit < 0이면,
    1. errorThrowCompletion(새로 생성한 RangeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  9. iterated를 ? GetIteratorDirect(O)로 설정합니다.
  10. closureiteratedintegerLimit를 캡처하고 호출 시 다음 단계를 수행하는 파라미터 없는 새로운 Abstract Closure로 둡니다:
    1. remainingintegerLimit로 둡니다.
    2. remaining > 0인 동안 반복,
      1. remaining ≠ +∞이면,
        1. remainingremaining - 1로 설정합니다.
      2. next를 ? IteratorStep(iterated)로 둡니다.
      3. nextdone이면, ReturnCompletion(undefined)를 반환합니다.
    3. 반복,
      1. value를 ? IteratorStepValue(iterated)로 둡니다.
      2. valuedone이면, ReturnCompletion(undefined)를 반환합니다.
      3. completionCompletion(Yield(value))로 둡니다.
      4. IfAbruptCloseIterator(completion, iterated)를 수행합니다.
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »)로 둡니다.
  12. result.[[UnderlyingIterator]]iterated로 설정합니다.
  13. result를 반환합니다.

27.1.4.3 Iterator.prototype.every ( predicate )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(predicate)가 false이면,
    1. errorThrowCompletion(새로 생성한 TypeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(O)로 설정합니다.
  6. counter를 0으로 둡니다.
  7. 반복,
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. valuedone이면, true를 반환합니다.
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))로 둡니다.
    4. IfAbruptCloseIterator(result, iterated)를 수행합니다.
    5. ToBoolean(result)가 false이면, ? IteratorClose(iterated, NormalCompletion(false))를 반환합니다.
    6. countercounter + 1로 설정합니다.

27.1.4.4 Iterator.prototype.filter ( predicate )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(predicate)가 false이면,
    1. errorThrowCompletion(새로 생성한 TypeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(O)로 설정합니다.
  6. closureiteratedpredicate를 캡처하고 호출 시 다음 단계를 수행하는 파라미터 없는 새로운 Abstract Closure로 둡니다:
    1. counter를 0으로 둡니다.
    2. 반복,
      1. value를 ? IteratorStepValue(iterated)로 둡니다.
      2. valuedone이면, ReturnCompletion(undefined)를 반환합니다.
      3. selectedCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))로 둡니다.
      4. IfAbruptCloseIterator(selected, iterated)를 수행합니다.
      5. ToBoolean(selected) 가 true이면,
        1. completionCompletion(Yield(value))로 둡니다.
        2. IfAbruptCloseIterator(completion, iterated)를 수행합니다.
      6. countercounter + 1로 설정합니다.
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »)로 둡니다.
  8. result.[[UnderlyingIterator]]iterated로 설정합니다.
  9. result를 반환합니다.

27.1.4.5 Iterator.prototype.find ( predicate )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(predicate)가 false이면,
    1. errorThrowCompletion(새로 생성한 TypeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(O)로 설정합니다.
  6. counter를 0으로 둡니다.
  7. 반복,
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. valuedone이면, undefined를 반환합니다.
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))로 둡니다.
    4. IfAbruptCloseIterator(result, iterated)를 수행합니다.
    5. ToBoolean(result)가 true이면, ? IteratorClose(iterated, NormalCompletion(value))를 반환합니다.
    6. countercounter + 1로 설정합니다.

27.1.4.6 Iterator.prototype.flatMap ( mapper )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(mapper)가 false이면,
    1. errorThrowCompletion(새로 생성한 TypeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(O)로 설정합니다.
  6. closureiteratedmapper를 캡처하고 호출 시 다음 단계를 수행하는 파라미터 없는 새로운 Abstract Closure로 둡니다:
    1. counter를 0으로 둡니다.
    2. 반복,
      1. value를 ? IteratorStepValue(iterated)로 둡니다.
      2. valuedone이면, ReturnCompletion(undefined)를 반환합니다.
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »))로 둡니다.
      4. IfAbruptCloseIterator(mapped, iterated)를 수행합니다.
      5. innerIteratorCompletion(GetIteratorFlattenable(mapped, reject-primitives))로 둡니다.
      6. IfAbruptCloseIterator(innerIterator, iterated)를 수행합니다.
      7. innerAlivetrue로 둡니다.
      8. innerAlivetrue인 동안 반복,
        1. innerValueCompletion(IteratorStepValue(innerIterator))로 둡니다.
        2. IfAbruptCloseIterator(innerValue, iterated)를 수행합니다.
        3. innerValuedone이면,
          1. innerAlivefalse로 설정합니다.
        4. 그렇지 않으면,
          1. completionCompletion(Yield(innerValue))로 둡니다.
          2. completionabrupt completion이면,
            1. backupCompletionCompletion(IteratorClose(innerIterator, completion))로 둡니다.
            2. IfAbruptCloseIterator(backupCompletion, iterated)를 수행합니다.
            3. IteratorClose(iterated, completion)를 반환합니다.
      9. countercounter + 1로 설정합니다.
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »)로 둡니다.
  8. result.[[UnderlyingIterator]]iterated로 설정합니다.
  9. result를 반환합니다.

27.1.4.7 Iterator.prototype.forEach ( procedure )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(procedure)가 false이면,
    1. errorThrowCompletion(새로 생성한 TypeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(O)로 설정합니다.
  6. counter를 0으로 둡니다.
  7. 반복,
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. valuedone이면, undefined를 반환합니다.
    3. resultCompletion(Call(procedure, undefined, « value, 𝔽(counter) »))로 둡니다.
    4. IfAbruptCloseIterator(result, iterated)를 수행합니다.
    5. countercounter + 1로 설정합니다.

27.1.4.8 Iterator.prototype.map ( mapper )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(mapper)가 false이면,
    1. errorThrowCompletion(새로 생성한 TypeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(O)로 설정합니다.
  6. closureiteratedmapper를 캡처하고 호출 시 다음 단계를 수행하는 파라미터 없는 새로운 Abstract Closure로 둡니다:
    1. counter를 0으로 둡니다.
    2. 반복,
      1. value를 ? IteratorStepValue(iterated)로 둡니다.
      2. valuedone이면, ReturnCompletion(undefined)를 반환합니다.
      3. mappedCompletion(Call(mapper, undefined, « value, 𝔽(counter) »))로 둡니다.
      4. IfAbruptCloseIterator(mapped, iterated)를 수행합니다.
      5. completionCompletion(Yield(mapped))로 둡니다.
      6. IfAbruptCloseIterator(completion, iterated)를 수행합니다.
      7. countercounter + 1로 설정합니다.
  7. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »)로 둡니다.
  8. result.[[UnderlyingIterator]]iterated로 설정합니다.
  9. result를 반환합니다.

27.1.4.9 Iterator.prototype.reduce ( reducer [ , initialValue ] )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(reducer)가 false이면,
    1. errorThrowCompletion(새로 생성한 TypeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(O)로 설정합니다.
  6. initialValue가 존재하지 않으면,
    1. accumulator를 ? IteratorStepValue(iterated)로 둡니다.
    2. accumulatordone이면, TypeError 예외를 발생시킵니다.
    3. counter를 1로 둡니다.
  7. 그렇지 않으면,
    1. accumulatorinitialValue로 둡니다.
    2. counter를 0으로 둡니다.
  8. 반복,
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. valuedone이면, accumulator를 반환합니다.
    3. resultCompletion(Call(reducer, undefined, « accumulator, value, 𝔽(counter) »))로 둡니다.
    4. IfAbruptCloseIterator(result, iterated)를 수행합니다.
    5. accumulatorresult로 설정합니다.
    6. countercounter + 1로 설정합니다.

27.1.4.10 Iterator.prototype.some ( predicate )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. IsCallable(predicate)가 false이면,
    1. errorThrowCompletion(새로 생성한 TypeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  5. iterated를 ? GetIteratorDirect(O)로 설정합니다.
  6. counter를 0으로 둡니다.
  7. 반복,
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. valuedone이면, false를 반환합니다.
    3. resultCompletion(Call(predicate, undefined, « value, 𝔽(counter) »))로 둡니다.
    4. IfAbruptCloseIterator(result, iterated)를 수행합니다.
    5. ToBoolean(result)가 true이면, ? IteratorClose(iterated, NormalCompletion(true))를 반환합니다.
    6. countercounter + 1로 설정합니다.

27.1.4.11 Iterator.prototype.take ( limit )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iteratedIterator Record { [[Iterator]]: O, [[NextMethod]]: undefined, [[Done]]: false }로 둡니다.
  4. numLimitCompletion(ToNumber(limit))로 둡니다.
  5. IfAbruptCloseIterator(numLimit, iterated)를 수행합니다.
  6. numLimitNaN이면,
    1. errorThrowCompletion(새로 생성한 RangeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  7. integerLimit를 ! ToIntegerOrInfinity(numLimit)로 둡니다.
  8. integerLimit < 0이면,
    1. errorThrowCompletion(새로 생성한 RangeError 객체)로 둡니다.
    2. IteratorClose(iterated, error)를 반환합니다.
  9. iterated를 ? GetIteratorDirect(O)로 설정합니다.
  10. closureiteratedintegerLimit를 캡처하고 호출 시 다음 단계를 수행하는 파라미터 없는 새로운 Abstract Closure로 둡니다:
    1. remainingintegerLimit로 둡니다.
    2. 반복,
      1. remaining = 0이면,
        1. IteratorClose(iterated, ReturnCompletion(undefined))를 반환합니다.
      2. remaining ≠ +∞이면,
        1. remainingremaining - 1로 설정합니다.
      3. value를 ? IteratorStepValue(iterated)로 둡니다.
      4. valuedone이면, ReturnCompletion(undefined)를 반환합니다.
      5. completionCompletion(Yield(value))로 둡니다.
      6. IfAbruptCloseIterator(completion, iterated)를 수행합니다.
  11. resultCreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »)로 둡니다.
  12. result.[[UnderlyingIterator]]iterated로 설정합니다.
  13. result를 반환합니다.

27.1.4.12 Iterator.prototype.toArray ( )

이 메서드는 호출될 때 다음 단계를 수행합니다:

  1. Othis 값으로 둡니다.
  2. O객체가 아니면, TypeError 예외를 발생시킵니다.
  3. iterated를 ? GetIteratorDirect(O)로 둡니다.
  4. items를 새로운 빈 List로 둡니다.
  5. 반복,
    1. value를 ? IteratorStepValue(iterated)로 둡니다.
    2. valuedone이면, CreateArrayFromList(items)를 반환합니다.
    3. itemsvalue를 추가합니다.

27.1.4.13 Iterator.prototype [ %Symbol.iterator% ] ( )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "name" 속성 값은 "[Symbol.iterator]"입니다.

27.1.4.14 Iterator.prototype [ %Symbol.toStringTag% ]

Iterator.prototype[%Symbol.toStringTag%]접근자 속성이며, 속성은 { [[Enumerable]]: false, [[Configurable]]: true }입니다. [[Get]][[Set]] 속성은 다음과 같이 정의됩니다:

27.1.4.14.1 get Iterator.prototype [ %Symbol.toStringTag% ]

[[Get]] 속성 값은 인자가 필요 없는 내장 함수입니다. 호출 시 다음 단계를 수행합니다:

  1. "Iterator"를 반환합니다.

27.1.4.14.2 set Iterator.prototype [ %Symbol.toStringTag% ]

[[Set]] 속성 값은 v 인자를 받는 내장 함수입니다. 호출 시 다음 단계를 수행합니다:

  1. SetterThatIgnoresPrototypeProperties(this 값, %Iterator.prototype%, %Symbol.toStringTag%, v)를 수행합니다.
  2. undefined를 반환합니다.
참고

대부분의 내장 프로토타입에 있는 %Symbol.toStringTag% 속성과 달리, 웹 호환성을 위해 이 속성은 반드시 접근자여야 합니다.

27.1.5 %AsyncIteratorPrototype% 객체

%AsyncIteratorPrototype% 객체:

참고

이 명세에서 비동기 반복자 인터페이스를 구현하는 모든 객체는 %AsyncIteratorPrototype%을 상속합니다. ECMAScript 코드 역시 %AsyncIteratorPrototype%에서 상속하는 객체를 정의할 수 있습니다. %AsyncIteratorPrototype% 객체는 모든 비동기 반복자 객체에 적용 가능한 추가 메서드를 제공할 수 있는 장소입니다.

27.1.5.1 %AsyncIteratorPrototype% [ %Symbol.asyncIterator% ] ( )

이 함수는 호출될 때 다음 단계를 수행합니다:

  1. this 값을 반환합니다.

이 함수의 "name" 속성 값은 "[Symbol.asyncIterator]"입니다.

27.1.6 동기 반복자로부터 생성된 비동기 반복자 객체

동기 반복자로부터 생성된 비동기 반복자 객체는 특정 동기 반복자를 적응하는 비동기 반복자입니다. 동기 반복자로부터 생성된 비동기 반복자 객체는 ECMAScript 코드에서 직접 접근할 수 없습니다. 동기 반복자로부터 생성된 비동기 반복자 객체를 위한 명명된 생성자는 없습니다. 대신, 동기 반복자로부터 생성된 비동기 반복자 객체는 필요에 따라 CreateAsyncFromSyncIterator 추상 연산에 의해 생성됩니다.

27.1.6.1 CreateAsyncFromSyncIterator ( syncIteratorRecord )

추상 연산 CreateAsyncFromSyncIterator는 syncIteratorRecord(Iterator Record)를 인자로 받아 Iterator Record를 반환합니다. 이는 동기 Iterator Record로부터 비동기 Iterator Record를 생성하는 데 사용됩니다. 호출될 때 다음 단계를 수행합니다:

  1. asyncIteratorOrdinaryObjectCreate(%AsyncFromSyncIteratorPrototype%, « [[SyncIteratorRecord]] »)로 둡니다.
  2. asyncIterator.[[SyncIteratorRecord]]syncIteratorRecord를 설정합니다.
  3. nextMethod를 ! Get(asyncIterator, "next")로 둡니다.
  4. iteratorRecordIterator Record { [[Iterator]]: asyncIterator, [[NextMethod]]: nextMethod, [[Done]]: false }로 둡니다.
  5. iteratorRecord를 반환합니다.

27.1.6.2 %AsyncFromSyncIteratorPrototype% 객체

%AsyncFromSyncIteratorPrototype% 객체:

27.1.6.2.1 %AsyncFromSyncIteratorPrototype%.next ( [ value ] )

  1. Othis 값으로 둡니다.
  2. Assert: O객체이며 [[SyncIteratorRecord]] 내부 슬롯을 가집니다.
  3. promiseCapability를 ! NewPromiseCapability(%Promise%)로 둡니다.
  4. syncIteratorRecordO.[[SyncIteratorRecord]]로 둡니다.
  5. value가 존재하면,
    1. resultCompletion(IteratorNext(syncIteratorRecord, value))로 둡니다.
  6. 그렇지 않으면,
    1. resultCompletion(IteratorNext(syncIteratorRecord))로 둡니다.
  7. IfAbruptRejectPromise(result, promiseCapability)를 수행합니다.
  8. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true)를 반환합니다.

27.1.6.2.2 %AsyncFromSyncIteratorPrototype%.return ( [ value ] )

  1. Othis 값으로 둡니다.
  2. Assert: O객체이며 [[SyncIteratorRecord]] 내부 슬롯을 가집니다.
  3. promiseCapability를 ! NewPromiseCapability(%Promise%)로 둡니다.
  4. syncIteratorRecordO.[[SyncIteratorRecord]]로 둡니다.
  5. syncIteratorsyncIteratorRecord.[[Iterator]]로 둡니다.
  6. returnCompletion(GetMethod(syncIterator, "return"))로 둡니다.
  7. IfAbruptRejectPromise(return, promiseCapability)를 수행합니다.
  8. returnundefined이면,
    1. iteratorResultCreateIteratorResultObject(value, true)로 둡니다.
    2. Call(promiseCapability.[[Resolve]], undefined, « iteratorResult »)를 수행합니다.
    3. promiseCapability.[[Promise]]를 반환합니다.
  9. value가 존재하면,
    1. resultCompletion(Call(return, syncIterator, « value »))로 둡니다.
  10. 그렇지 않으면,
    1. resultCompletion(Call(return, syncIterator))로 둡니다.
  11. IfAbruptRejectPromise(result, promiseCapability)를 수행합니다.
  12. result객체가 아니면,
    1. Call(promiseCapability.[[Reject]], undefined, « 새로 생성한 TypeError 객체 »)를 수행합니다.
    2. promiseCapability.[[Promise]]를 반환합니다.
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, false)를 반환합니다.

27.1.6.2.3 %AsyncFromSyncIteratorPrototype%.throw ( [ value ] )

참고
이 명세에서 value는 항상 제공되지만, %AsyncFromSyncIteratorPrototype%.return ( [ value ] )와의 일관성을 위해 선택적으로 남겨둡니다.
  1. Othis 값으로 둡니다.
  2. Assert: O객체이며 [[SyncIteratorRecord]] 내부 슬롯을 가집니다.
  3. promiseCapability를 ! NewPromiseCapability(%Promise%)로 둡니다.
  4. syncIteratorRecordO.[[SyncIteratorRecord]]로 둡니다.
  5. syncIteratorsyncIteratorRecord.[[Iterator]]로 둡니다.
  6. throwCompletion(GetMethod(syncIterator, "throw"))로 둡니다.
  7. IfAbruptRejectPromise(throw, promiseCapability)를 수행합니다.
  8. throwundefined이면,
    1. 참고: syncIteratorthrow 메서드가 없다면, 정리 기회를 주기 위해 닫아야 하며 그 후 capability를 거부합니다.
    2. closeCompletionNormalCompletion(empty)로 둡니다.
    3. resultCompletion(IteratorClose(syncIteratorRecord, closeCompletion))로 둡니다.
    4. IfAbruptRejectPromise(result, promiseCapability)를 수행합니다.
    5. 참고: 다음 단계는 프로토콜 위반을 나타내기 위해 TypeError를 발생시킵니다: syncIteratorthrow 메서드가 없습니다.
    6. 참고: syncIterator를 닫을 때 예외가 발생하지 않으면 그 결과는 무시됩니다(거부된 프로미스를 반환해도).
    7. Call(promiseCapability.[[Reject]], undefined, « 새로 생성한 TypeError 객체 »)를 수행합니다.
    8. promiseCapability.[[Promise]]를 반환합니다.
  9. value가 존재하면,
    1. resultCompletion(Call(throw, syncIterator, « value »))로 둡니다.
  10. 그렇지 않으면,
    1. resultCompletion(Call(throw, syncIterator))로 둡니다.
  11. IfAbruptRejectPromise(result, promiseCapability)를 수행합니다.
  12. result객체가 아니면,
    1. Call(promiseCapability.[[Reject]], undefined, « 새로 생성한 TypeError 객체 »)를 수행합니다.
    2. promiseCapability.[[Promise]]를 반환합니다.
  13. AsyncFromSyncIteratorContinuation(result, promiseCapability, syncIteratorRecord, true)를 반환합니다.

27.1.6.3 동기 반복자로부터 생성된 비동기 반복자 인스턴스의 속성

동기 반복자로부터 생성된 반복자 인스턴스는 일반 객체이며, %AsyncFromSyncIteratorPrototype% 내재 객체에서 속성을 상속합니다. 동기 반복자로부터 생성된 반복자 인스턴스는 표 89에 나열된 내부 슬롯을 가지고 생성됩니다.

표 89: 동기 반복자 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[SyncIteratorRecord]] Iterator Record 적응 대상이 되는 원래의 동기 반복자를 나타냅니다.

27.1.6.4 AsyncFromSyncIteratorContinuation ( result, promiseCapability, syncIteratorRecord, closeOnRejection )

추상 연산 AsyncFromSyncIteratorContinuation은 result(객체), promiseCapability(내재 %Promise%PromiseCapability Record), syncIteratorRecord(Iterator Record), closeOnRejection(불리언)를 인자로 받고 프로미스를 반환합니다. 호출될 때 다음 단계를 수행합니다:

  1. 참고: promiseCapability가 내재 %Promise%에서 파생되므로, 아래에서 promiseCapability.[[Reject]] 호출로 인해 IfAbruptRejectPromise 사용 시 예외가 발생하지 않습니다.
  2. doneCompletion(IteratorComplete(result))로 둡니다.
  3. IfAbruptRejectPromise(done, promiseCapability)를 수행합니다.
  4. valueCompletion(IteratorValue(result))로 둡니다.
  5. IfAbruptRejectPromise(value, promiseCapability)를 수행합니다.
  6. valueWrapperCompletion(PromiseResolve(%Promise%, value))로 둡니다.
  7. valueWrapperabrupt completion이고 donefalse이며 closeOnRejectiontrue이면,
    1. valueWrapperCompletion(IteratorClose(syncIteratorRecord, valueWrapper))로 둡니다.
  8. IfAbruptRejectPromise(valueWrapper, promiseCapability)를 수행합니다.
  9. unwrapdone을 캡처하고 호출 시 다음 단계를 수행하는 파라미터 (v)를 가지는 새로운 Abstract Closure로 둡니다:
    1. CreateIteratorResultObject(v, done)를 반환합니다.
  10. onFulfilledCreateBuiltinFunction(unwrap, 1, "", « »)로 둡니다.
  11. 참고: onFulfilledIteratorResult 객체"value" 속성 처리 시, 그 값이 프로미스라면 기다렸다가 새 "unwrapped" IteratorResult 객체로 재포장하기 위해 사용됩니다.
  12. donetrue이거나 closeOnRejectionfalse이면,
    1. onRejectedundefined로 둡니다.
  13. 그 밖의 경우,
    1. closeIterator를 파라미터 (error)를 가지며 syncIteratorRecord를 캡처하는 새로운 Abstract Closure로 둡니다. 호출 시 다음 단계를 수행합니다:
      1. IteratorClose(syncIteratorRecord, ThrowCompletion(error))를 반환합니다.
    2. onRejectedCreateBuiltinFunction(closeIterator, 1, "", « »)로 둡니다.
    3. 참고: onRejected반복자가 산출하는 IteratorResult 객체"value" 속성이 거부된 프로미스일 때 반복자를 닫는 데 사용됩니다.
  14. PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability)를 수행합니다.
  15. promiseCapability.[[Promise]]를 반환합니다.

27.2 프라미스 객체

프라미스(Promise)는 지연된(그리고 비동기적일 수 있는) 계산의 최종 결과를 임시로 나타내기 위해 사용되는 객체입니다.

모든 프라미스는 세 가지 상호 배타적인 상태 중 하나입니다: 이행됨(fulfilled), 거부됨(rejected), 그리고 대기중(pending):

  • 프라미스 p가 이행됨(fulfilled) 상태라면 p.then(f, r)은 즉시 Job을 큐에 등록하여 함수 f를 호출합니다.
  • 프라미스 p가 거부됨(rejected) 상태라면 p.then(f, r)은 즉시 Job을 큐에 등록하여 함수 r을 호출합니다.
  • 프라미스가 대기중(pending) 상태라면, 이행됨도 거부됨도 아닙니다.

프라미스는 대기중이 아닌 경우, 즉 이행되었거나 거부된 경우 정산됨(settled) 상태라고 합니다.

프라미스는 정산되었거나, 다른 프라미스의 상태와 “연동되어(lock in)”있는 경우 해결됨(resolved)이라고 합니다. 해결된 프라미스를 다시 해결하거나 거부하려고 해도 아무런 효과가 없습니다. 미해결(unresolved) 프라미스는 해결되지 않은 경우이며, 항상 대기중(pending) 상태입니다. 해결된 프라미스는 대기중, 이행됨, 또는 거부됨 중 하나일 수 있습니다.

27.2.1 프라미스 추상 연산

27.2.1.1 PromiseCapability 레코드

PromiseCapability 레코드는 프라미스 또는 프라미스와 유사한 객체와 해당 프라미스를 해결하거나 거부할 수 있는 함수들을 캡슐화하기 위해 사용되는 레코드 값입니다. PromiseCapability 레코드는 NewPromiseCapability 추상 연산에 의해 생성됩니다.

PromiseCapability 레코드는 표 90에 나열된 필드를 가집니다.

표 90: PromiseCapability 레코드의 필드
필드 이름 의미
[[Promise]] 객체(Object) 프라미스로 사용할 수 있는 객체입니다.
[[Resolve]] 함수 객체 해당 프라미스를 해결하는 데 사용되는 함수입니다.
[[Reject]] 함수 객체 해당 프라미스를 거부하는 데 사용되는 함수입니다.

27.2.1.1.1 IfAbruptRejectPromise ( value, capability )

IfAbruptRejectPromise는 PromiseCapability 레코드를 사용하는 알고리즘 단계의 축약 표현입니다. 다음과 같은 알고리즘 단계:

  1. IfAbruptRejectPromise(value, capability).

다음과 같은 의미와 같습니다:

  1. Assert: valueCompletion Record입니다.
  2. valueabrupt completion이면,
    1. Call(capability.[[Reject]], undefined, « value.[[Value]] »)를 수행합니다.
    2. capability.[[Promise]]를 반환합니다.
  3. 그 밖의 경우,
    1. value를 ! value로 설정합니다.

27.2.1.2 PromiseReaction 레코드

PromiseReaction 레코드는 주어진 값으로 프라미스가 해결되거나 거부될 때 어떻게 반응할지 정보를 저장하는 레코드 값입니다. PromiseReaction 레코드는 PerformPromiseThen 추상 연산에 의해 생성되며, Abstract ClosureNewPromiseReactionJob을 반환할 때 사용됩니다.

PromiseReaction 레코드는 표 91에 나열된 필드를 가집니다.

표 91: PromiseReaction 레코드의 필드
필드 이름 의미
[[Capability]] PromiseCapability 레코드 또는 undefined 이 레코드가 반응 핸들러를 제공하는 프라미스의 capability입니다.
[[Type]] fulfill 또는 reject [[Handler]]empty일 때, 정산 유형(type)에 따른 동작을 허용하기 위해 사용됩니다.
[[Handler]] JobCallback 레코드 또는 empty 들어오는 값에 적용되는 함수이며, 그 반환값에 따라 파생 프라미스의 동작이 결정됩니다. [[Handler]]empty일 경우, [[Type]] 값에 따라 동작하는 함수가 대신 사용됩니다.

27.2.1.3 CreateResolvingFunctions ( promise )

CreateResolvingFunctions 추상 연산은 promise(프라미스)를 인자로 받고, [[Resolve]](함수 객체)와 [[Reject]](함수 객체) 필드를 가진 레코드 값을 반환합니다. 호출 시 아래와 같은 단계를 수행합니다:

  1. alreadyResolved레코드 { [[Value]]: false }로 둡니다.
  2. stepsResolvePromise Resolve Functions에 정의된 알고리즘 단계로 둡니다.
  3. lengthResolvePromise Resolve Functions의 함수 정의에서 비옵션 파라미터의 개수로 둡니다.
  4. resolveCreateBuiltinFunction(stepsResolve, lengthResolve, "", « [[Promise]], [[AlreadyResolved]] »)로 둡니다.
  5. resolve.[[Promise]]promise를 설정합니다.
  6. resolve.[[AlreadyResolved]]alreadyResolved를 설정합니다.
  7. stepsRejectPromise Reject Functions에 정의된 알고리즘 단계로 둡니다.
  8. lengthRejectPromise Reject Functions의 함수 정의에서 비옵션 파라미터의 개수로 둡니다.
  9. rejectCreateBuiltinFunction(stepsReject, lengthReject, "", « [[Promise]], [[AlreadyResolved]] »)로 둡니다.
  10. reject.[[Promise]]promise를 설정합니다.
  11. reject.[[AlreadyResolved]]alreadyResolved를 설정합니다.
  12. 레코드 { [[Resolve]]: resolve, [[Reject]]: reject }를 반환합니다.

27.2.1.3.1 Promise Reject Functions

프라미스 reject 함수는 [[Promise]][[AlreadyResolved]] 내부 슬롯을 가진 익명 내장 함수입니다.

프라미스 reject 함수가 reason 인자와 함께 호출되면 다음 단계를 수행합니다:

  1. F활성 함수 객체로 둡니다.
  2. Assert: F[[Promise]] 내부 슬롯을 가지고 있으며, 그 값은 객체입니다.
  3. promiseF.[[Promise]]로 둡니다.
  4. alreadyResolvedF.[[AlreadyResolved]]로 둡니다.
  5. alreadyResolved.[[Value]]true이면 undefined를 반환합니다.
  6. alreadyResolved.[[Value]]true로 설정합니다.
  7. RejectPromise(promise, reason)를 수행합니다.
  8. undefined를 반환합니다.

프라미스 reject 함수의 "length" 속성 값은 1𝔽입니다.

27.2.1.3.2 Promise Resolve Functions

프라미스 resolve 함수는 [[Promise]][[AlreadyResolved]] 내부 슬롯을 가진 익명 내장 함수입니다.

프라미스 resolve 함수가 resolution 인자와 함께 호출되면 다음 단계를 수행합니다:

  1. F활성 함수 객체로 둡니다.
  2. Assert: F[[Promise]] 내부 슬롯을 가지고 있으며, 그 값은 객체입니다.
  3. promiseF.[[Promise]]로 둡니다.
  4. alreadyResolvedF.[[AlreadyResolved]]로 둡니다.
  5. alreadyResolved.[[Value]]true이면 undefined를 반환합니다.
  6. alreadyResolved.[[Value]]true로 설정합니다.
  7. SameValue(resolution, promise)가 true이면,
    1. selfResolutionError를 새로 생성한 TypeError 객체로 둡니다.
    2. RejectPromise(promise, selfResolutionError)를 수행합니다.
    3. undefined를 반환합니다.
  8. resolution객체가 아니면,
    1. FulfillPromise(promise, resolution)를 수행합니다.
    2. undefined를 반환합니다.
  9. thenCompletion(Get(resolution, "then"))로 둡니다.
  10. thenabrupt completion이면,
    1. RejectPromise(promise, then.[[Value]])를 수행합니다.
    2. undefined를 반환합니다.
  11. thenActionthen.[[Value]]로 둡니다.
  12. IsCallable(thenAction)가 false이면,
    1. FulfillPromise(promise, resolution)를 수행합니다.
    2. undefined를 반환합니다.
  13. thenJobCallbackHostMakeJobCallback(thenAction)로 둡니다.
  14. jobNewPromiseResolveThenableJob(promise, resolution, thenJobCallback)로 둡니다.
  15. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]])를 수행합니다.
  16. undefined를 반환합니다.

프라미스 resolve 함수의 "length" 속성 값은 1𝔽입니다.

27.2.1.4 FulfillPromise ( promise, value )

FulfillPromise 추상 연산은 promise(Promise)와 value(ECMAScript 언어 값)를 인자로 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: promise.[[PromiseState]]pending임을 확인합니다.
  2. reactionspromise.[[PromiseFulfillReactions]]로 둡니다.
  3. promise.[[PromiseResult]]value를 설정합니다.
  4. promise.[[PromiseFulfillReactions]]undefined를 설정합니다.
  5. promise.[[PromiseRejectReactions]]undefined를 설정합니다.
  6. promise.[[PromiseState]]fulfilled로 설정합니다.
  7. TriggerPromiseReactions(reactions, value)를 수행합니다.
  8. unused를 반환합니다.

27.2.1.5 NewPromiseCapability ( C )

NewPromiseCapability 추상 연산은 C(ECMAScript 언어 값)를 인자로 받아 PromiseCapability 레코드를 포함하는 정상 완료 또는 throw 완료를 반환합니다. 이 연산은 C를 내장 Promise 생성자와 같은 방식의 생성자로 사용하여 프라미스를 생성하고 그 resolve 및 reject 함수를 추출하려고 시도합니다. 이렇게 얻은 프라미스와 resolve, reject 함수는 새로운 PromiseCapability 레코드를 초기화하는 데 사용됩니다. 호출 시 다음 단계들을 수행합니다:

  1. IsConstructor(C)가 false이면, TypeError 예외를 발생시킵니다.
  2. 참고: C는 Promise 생성자와 동일한 파라미터 규약을 지원하는 생성자 함수라고 가정합니다 (27.2.3.1 참고).
  3. resolvingFunctions레코드 { [[Resolve]]: undefined, [[Reject]]: undefined }로 둡니다.
  4. executorClosure를 파라미터 (resolve, reject)를 가지고 resolvingFunctions를 캡처하는 새로운 Abstract Closure로 둡니다. 호출 시 다음 단계들을 수행합니다:
    1. resolvingFunctions.[[Resolve]]undefined가 아니면, TypeError 예외를 발생시킵니다.
    2. resolvingFunctions.[[Reject]]undefined가 아니면, TypeError 예외를 발생시킵니다.
    3. resolvingFunctions.[[Resolve]]resolve를 설정합니다.
    4. resolvingFunctions.[[Reject]]reject를 설정합니다.
    5. NormalCompletion(undefined)을 반환합니다.
  5. executorCreateBuiltinFunction(executorClosure, 2, "", « »)로 둡니다.
  6. promise를 ? Construct(C, « executor »)로 둡니다.
  7. IsCallable(resolvingFunctions.[[Resolve]])가 false이면, TypeError 예외를 발생시킵니다.
  8. IsCallable(resolvingFunctions.[[Reject]])가 false이면, TypeError 예외를 발생시킵니다.
  9. PromiseCapability 레코드 { [[Promise]]: promise, [[Resolve]]: resolvingFunctions.[[Resolve]], [[Reject]]: resolvingFunctions.[[Reject]] }를 반환합니다.
참고

이 추상 연산은 Promise 서브클래싱을 지원하며, 전달된 executor 함수 인자를 Promise 생성자와 동일한 방식으로 호출하는 모든 생성자에 대해 일반적으로 동작합니다. 이는 Promise 생성자의 정적 메서드를 모든 서브클래스에 일반화하는 데 사용됩니다.

27.2.1.6 IsPromise ( x )

IsPromise 추상 연산은 인수 x ( ECMAScript 언어 값 )를 받아 Boolean 값을 반환합니다. 이 연산은 객체의 프라미스 브랜드를 확인합니다. 호출 시 다음 단계들을 수행합니다:

  1. x객체가 아니면 false를 반환한다.
  2. x[[PromiseState]] 내부 슬롯을 가지고 있지 않으면, false를 반환한다.
  3. true를 반환한다.

27.2.1.7 RejectPromise ( promise, reason )

RejectPromise 추상 연산은 인수 promise (프라미스)와 reason ( ECMAScript 언어 값 )를 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: promise.[[PromiseState]]pending이다.
  2. reactionspromise.[[PromiseRejectReactions]]을 할당한다.
  3. promise.[[PromiseResult]]reason을 할당한다.
  4. promise.[[PromiseFulfillReactions]]undefined를 할당한다.
  5. promise.[[PromiseRejectReactions]]undefined를 할당한다.
  6. promise.[[PromiseState]]rejected를 할당한다.
  7. promise.[[PromiseIsHandled]]false이면, HostPromiseRejectionTracker(promise, "reject")를 수행한다.
  8. TriggerPromiseReactions(reactions, reason)를 수행한다.
  9. unused를 반환한다.

27.2.1.8 TriggerPromiseReactions ( reactions, argument )

TriggerPromiseReactions 추상 연산은 인수 reactions ( 리스트PromiseReaction 레코드의 리스트 )와 argument ( ECMAScript 언어 값 )를 받아 unused를 반환합니다. reactions의 각 레코드에 대해 새로운 Job을 큐에 추가합니다. 각 JobPromiseReaction 레코드[[Type]][[Handler]]를 처리하며, [[Handler]]empty가 아니면 해당 인수를 넘겨 호출합니다. [[Handler]]empty일 경우 동작은 [[Type]]에 의해 결정됩니다. 호출 시 다음 단계들을 수행합니다:

  1. reactions의 각 요소 reaction에 대해 다음을 수행한다:
    1. jobNewPromiseReactionJob(reaction, argument)을 할당한다.
    2. HostEnqueuePromiseJob(job.[[Job]], job.[[Realm]])를 수행한다.
  2. unused를 반환한다.

27.2.1.9 HostPromiseRejectionTracker ( promise, operation )

호스트 정의 추상 연산 HostPromiseRejectionTracker는 인수 promise (프라미스)와 operation ( "reject" 또는 "handle" )를 받아 unused를 반환합니다. 이 연산은 호스트 환경이 프라미스 거부를 추적할 수 있게 합니다.

HostPromiseRejectionTracker의 기본 구현은 unused를 반환하는 것입니다.

참고 1

HostPromiseRejectionTracker는 두 가지 상황에서 호출됩니다:

  • 프라미스가 핸들러 없이 거부될 때 operation 인수가 "reject"로 설정되어 호출됩니다.
  • 거부된 프라미스에 처음으로 핸들러가 추가될 때 operation 인수가 "handle"로 설정되어 호출됩니다.

HostPromiseRejectionTracker의 일반적인 구현은 처리되지 않은 거부에 대해 개발자에게 알릴 수 있으나, 이후 새 핸들러가 추가되어 이전 알림이 무효화될 경우에도 신중하게 알리도록 할 수 있습니다.

참고 2

operation"handle"인 경우, 구현체는 promise에 대한 참조를 가비지 컬렉션을 방해하지 않는 방식으로 유지해야 합니다. operation"reject"인 경우에는, 거부가 드물고 핵심 코드 경로가 아니므로 promise에 대한 참조를 유지할 수 있습니다.

27.2.2 프라미스 잡(Promise Jobs)

27.2.2.1 NewPromiseReactionJob ( reaction, argument )

NewPromiseReactionJob 추상 연산은 reaction ( PromiseReaction 레코드 )와 argument ( ECMAScript 언어 값 )을 인수로 받으며, [[Job]] ( 잡(Job) 추상 클로저(Abstract Closure) ) 및 [[Realm]] ( Realm 레코드 또는 null) 필드를 갖는 레코드 를 반환합니다. 들어오는 값에 적절한 핸들러를 적용하고, 핸들러의 반환값을 사용하여 그 핸들러와 연관된 파생 프라미스를 resolve 또는 reject하는 새로운 잡(Job) 추상 클로저를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. job에 다음 단계들을 수행하는, 파라미터 없이 reactionargument를 캡처하는 새로운 잡(Job) 추상 클로저를 할당한다:
    1. promiseCapabilityreaction.[[Capability]]를 할당한다.
    2. typereaction.[[Type]]를 할당한다.
    3. handlerreaction.[[Handler]]를 할당한다.
    4. handlerempty이면,
      1. typefulfill이면,
        1. handlerResultNormalCompletion(argument)을 할당한다.
      2. 그렇지 않으면,
        1. Assert: typereject임을 보장한다.
        2. handlerResultThrowCompletion(argument)을 할당한다.
    5. 그렇지 않으면,
      1. handlerResultCompletion(HostCallJobCallback(handler, undefined, « argument »))을 할당한다.
    6. promiseCapabilityundefined이면,
      1. Assert: handlerResult비정상 종료(abrupt completion)가 아님을 보장한다.
      2. empty를 반환한다.
    7. Assert: promiseCapabilityPromiseCapability 레코드임을 보장한다.
    8. handlerResult비정상 종료(abrupt completion)이면,
      1. 다음 값을 반환한다: ? Call(promiseCapability.[[Reject]], undefined, « handlerResult.[[Value]] »).
    9. 그렇지 않으면,
      1. 다음 값을 반환한다: ? Call(promiseCapability.[[Resolve]], undefined, « handlerResult.[[Value]] »).
  2. handlerRealmnull을 할당한다.
  3. reaction.[[Handler]]empty가 아니면,
    1. getHandlerRealmResultCompletion(GetFunctionRealm(reaction.[[Handler]].[[Callback]]))을 할당한다.
    2. getHandlerRealmResult정상 종료(normal completion)이면 handlerRealmgetHandlerRealmResult.[[Value]]를 할당한다.
    3. 그렇지 않으면 handlerRealm현재 Realm 레코드를 할당한다.
    4. NOTE: handlerRealm은 핸들러가 undefined일 때만 null이다. 핸들러가 해제된 Proxy이고 ECMAScript 코드가 실행되지 않을 때, handlerRealm은 에러 객체를 생성하는 데 사용된다.
  4. 다음 레코드를 반환한다: { [[Job]]: job, [[Realm]]: handlerRealm  }.

27.2.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )

NewPromiseResolveThenableJob 추상 연산은 promiseToResolve (프라미스), thenable (객체), then ( JobCallback 레코드 )를 인수로 받고, [[Job]] ( 잡(Job) 추상 클로저(Abstract Closure) ) 및 [[Realm]] ( Realm 레코드 ) 필드를 갖는 레코드를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. job에 다음 단계들을 수행하는, 파라미터 없이 promiseToResolve, thenable, then을 캡처하는 새로운 잡(Job) 추상 클로저를 할당한다:
    1. resolvingFunctionsCreateResolvingFunctions(promiseToResolve)를 할당한다.
    2. thenCallResultCompletion(HostCallJobCallback(then, thenable, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »))를 할당한다.
    3. thenCallResult비정상 종료(abrupt completion)이면,
      1. 다음 값을 반환한다: ? Call(resolvingFunctions.[[Reject]], undefined, « thenCallResult.[[Value]] »).
    4. 다음 값을 반환한다: ! thenCallResult.
  2. getThenRealmResultCompletion(GetFunctionRealm(then.[[Callback]]))를 할당한다.
  3. getThenRealmResult정상 종료(normal completion)이면 thenRealmgetThenRealmResult.[[Value]]를 할당한다.
  4. 그렇지 않으면 thenRealm현재 Realm 레코드를 할당한다.
  5. NOTE: thenRealmnull이 되는 경우는 없다. then.[[Callback]]이 해제된 Proxy이고 코드가 실행되지 않을 때, thenRealm은 에러 객체 생성에 사용된다.
  6. 다음 레코드를 반환한다: { [[Job]]: job, [[Realm]]: thenRealm  }.
참고

잡(Job)은 제공된 thenable과 그 then 메서드를 사용해 주어진 프라미스를 resolve합니다. 이 과정은 잡(Job)으로 진행되어야 하며, 이를 통해 then 메서드의 평가가 주변 코드의 평가가 완료된 이후에 이루어짐을 보장합니다.

27.2.3 프라미스 생성자

Promise 생성자:

  • %Promise%이다.
  • 전역 객체"Promise" 프로퍼티의 초기값이다.
  • 생성자로 호출될 때 새로운 프라미스를 생성하고 초기화한다.
  • 함수로 호출되는 것은 의도하지 않았으며, 그렇게 호출하면 예외가 발생한다.
  • 클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 Promise 동작을 상속하려는 서브클래스 생성자super를 사용하여 Promise 생성자를 호출해야 하며, 이는 PromisePromise.prototype 내장 메서드를 지원하는 내부 상태로 서브클래스 인스턴스를 생성 및 초기화한다.

27.2.3.1 Promise ( executor )

이 함수는 호출 시 다음 단계들을 수행한다:

  1. NewTarget이 undefined이면, TypeError 예외를 throw한다.
  2. IsCallable(executor)가 false이면, TypeError 예외를 throw한다.
  3. promise에 ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] ») 를 할당한다.
  4. promise.[[PromiseState]]pending으로 설정한다.
  5. promise.[[PromiseResult]]empty로 설정한다.
  6. promise.[[PromiseFulfillReactions]]를 새로운 빈 리스트로 설정한다.
  7. promise.[[PromiseRejectReactions]]를 새로운 빈 리스트로 설정한다.
  8. promise.[[PromiseIsHandled]]false로 설정한다.
  9. resolvingFunctionsCreateResolvingFunctions(promise)를 할당한다.
  10. completionCompletion(Call(executor, undefined, « resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]] »))를 할당한다.
  11. completion비정상 종료(abrupt completion)이면,
    1. ? Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] ») 를 수행한다.
  12. promise를 반환한다.
참고

executor 인수는 함수 객체여야 한다. 이 함수는 프라미스가 나타내는 지연된 작업의 시작 및 완료 보고를 위해 호출된다. executor는 resolvereject 두 개의 인수를 받아 호출된다. 이 함수들은 executor 함수가 지연된 계산의 완료 또는 실패를 알릴 때 사용할 수 있다. executor 함수가 반환된다고 해서 지연된 작업이 완료된 것은 아니며, 단지 지연된 작업을 나중에 수행하도록 요청이 수락되었다는 의미다.

executor 함수에 전달된 resolve 함수는 하나의 인수를 받는다. executor 코드는 결국 resolve 함수를 호출하여 연관된 프라미스를 resolve하고자 함을 나타낼 수 있다. resolve 함수에 전달된 인수는 지연된 작업의 최종 값이며, 실제 이행 값 또는 이행 시 값을 제공할 또 다른 프라미스가 될 수 있다.

executor 함수에 전달된 reject 함수 역시 하나의 인수를 받는다. executor 코드는 결국 reject 함수를 호출하여 연관된 프라미스가 거부되었고 이행되지 않을 것임을 나타낼 수 있다. reject 함수에 전달된 인수는 프라미스의 거부 값으로 사용되며, 일반적으로 Error 객체가 된다.

Promise 생성자executor 함수에 전달하는 resolve와 reject 함수는 실제로 연관된 프라미스를 resolve하거나 reject할 수 있다. 서브클래스는 resolve와 reject에 대해 맞춤값을 전달하는 등 다른 생성자 동작을 가질 수 있다.

27.2.4 Promise 생성자의 속성

Promise 생성자:

  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function.prototype%이다.
  • 다음 프로퍼티들을 가진다:

27.2.4.1 Promise.all ( iterable )

이 함수는 전달된 프라미스들의 이행 값 배열로 이행되는 새로운 프라미스를 반환하거나, 전달된 프라미스 중 가장 먼저 거부된 이유로 거부된다. 이 알고리즘이 실행되는 동안 전달된 iterable의 모든 요소를 프라미스로 변환한다.

  1. Cthis 값을 할당한다.
  2. promiseCapability에 ? NewPromiseCapability(C)를 할당한다.
  3. promiseResolveCompletion(GetPromiseResolve(C))를 할당한다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)를 수행한다.
  5. iteratorRecordCompletion(GetIterator(iterable, sync))를 할당한다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)를 수행한다.
  7. resultCompletion(PerformPromiseAll(iteratorRecord, C, promiseCapability, promiseResolve))를 할당한다.
  8. result비정상 종료(abrupt completion)이면,
    1. iteratorRecord.[[Done]]false이면, resultCompletion(IteratorClose(iteratorRecord, result))를 할당한다.
    2. IfAbruptRejectPromise(result, promiseCapability)를 수행한다.
  9. ! result를 반환한다.
참고

이 함수는 this 값이 Promise 생성자의 파라미터 규칙을 지원하는 생성자 함수여야 한다.

27.2.4.1.1 GetPromiseResolve ( promiseConstructor )

GetPromiseResolve 추상 연산은 promiseConstructor ( 생성자 )를 인수로 받아 함수 객체를 담은 정상 종료(normal completion) 또는 throw completion를 반환한다. 호출 시 다음 단계들을 수행한다:

  1. promiseResolve에 ? Get(promiseConstructor, "resolve")를 할당한다.
  2. IsCallable(promiseResolve)가 false이면, TypeError 예외를 throw한다.
  3. promiseResolve를 반환한다.

27.2.4.1.2 PerformPromiseAll ( iteratorRecord, constructor, resultCapability, promiseResolve )

PerformPromiseAll 추상 연산은 iteratorRecord ( Iterator Record ), constructor ( 생성자 ), resultCapability ( PromiseCapability Record ), promiseResolve ( 함수 객체 )를 인수로 받아 ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 throw completion를 반환한다. 호출 시 다음 단계들을 수행한다:

  1. values에 새로운 빈 리스트를 할당한다.
  2. remainingElementsCount레코드 { [[Value]]: 1 }를 할당한다.
  3. index에 0을 할당한다.
  4. 반복한다,
    1. next에 ? IteratorStepValue(iteratorRecord)를 할당한다.
    2. nextdone이면,
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
      2. remainingElementsCount.[[Value]]가 0이면,
        1. valuesArrayCreateArrayFromList(values)를 할당한다.
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »)를 수행한다.
      3. resultCapability.[[Promise]]를 반환한다.
    3. valuesundefined를 추가한다.
    4. nextPromise에 ? Call(promiseResolve, constructor, « next »)를 할당한다.
    5. stepsPromise.all Resolve Element Functions에 정의된 알고리즘 단계를 할당한다.
    6. lengthPromise.all Resolve Element Functions 함수 정의의 비선택적 매개변수 개수를 할당한다.
    7. onFulfilledCreateBuiltinFunction(steps, length, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] »)를 할당한다.
    8. onFulfilled.[[AlreadyCalled]]false로 설정한다.
    9. onFulfilled.[[Index]]index로 설정한다.
    10. onFulfilled.[[Values]]values로 설정한다.
    11. onFulfilled.[[Capability]]resultCapability로 설정한다.
    12. onFulfilled.[[RemainingElements]]remainingElementsCount로 설정한다.
    13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1로 설정한다.
    14. ? Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] ») 를 수행한다.
    15. indexindex + 1로 설정한다.

27.2.4.1.3 Promise.all 이행 요소 함수

Promise.all 이행 요소 함수는 특정 Promise.all 요소를 이행하기 위해 사용되는 익명 내장 함수입니다. 각 Promise.all 이행 요소 함수는 [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가집니다.

Promise.all 이행 요소 함수가 인수 x로 호출되면, 다음 단계들을 수행합니다:

  1. F활성 함수 객체를 할당한다.
  2. F.[[AlreadyCalled]]true이면 undefined를 반환한다.
  3. F.[[AlreadyCalled]]true로 설정한다.
  4. indexF.[[Index]]를 할당한다.
  5. valuesF.[[Values]]를 할당한다.
  6. promiseCapabilityF.[[Capability]]를 할당한다.
  7. remainingElementsCountF.[[RemainingElements]]를 할당한다.
  8. values[index]에 x를 설정한다.
  9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
  10. remainingElementsCount.[[Value]]가 0이면,
    1. valuesArrayCreateArrayFromList(values)를 할당한다.
    2. 다음 값을 반환한다: ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray »).
  11. undefined를 반환한다.

Promise.all 이행 요소 함수의 "length" 프로퍼티 값은 1𝔽이다.

27.2.4.2 Promise.allSettled ( iterable )

이 함수는 프라미스 상태 스냅샷 배열로 이행되는 프라미스를 반환하지만, 모든 원래 프라미스가 settle(즉, 이행 또는 거부됨)이 된 후에만 반환합니다. 이 알고리즘이 실행되는 동안 전달된 iterable의 모든 요소를 프라미스로 변환합니다.

  1. Cthis 값을 할당한다.
  2. promiseCapability에 ? NewPromiseCapability(C)를 할당한다.
  3. promiseResolveCompletion(GetPromiseResolve(C))를 할당한다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)를 수행한다.
  5. iteratorRecordCompletion(GetIterator(iterable, sync))를 할당한다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)를 수행한다.
  7. resultCompletion(PerformPromiseAllSettled(iteratorRecord, C, promiseCapability, promiseResolve))를 할당한다.
  8. result비정상 종료(abrupt completion)이면,
    1. iteratorRecord.[[Done]]false이면, resultCompletion(IteratorClose(iteratorRecord, result))를 할당한다.
    2. IfAbruptRejectPromise(result, promiseCapability)를 수행한다.
  9. ! result를 반환한다.
참고

이 함수는 this 값이 Promise 생성자의 파라미터 규칙을 지원하는 생성자 함수여야 한다.

27.2.4.2.1 PerformPromiseAllSettled ( iteratorRecord, constructor, resultCapability, promiseResolve )

PerformPromiseAllSettled 추상 연산은 iteratorRecord ( Iterator Record ), constructor ( 생성자 ), resultCapability ( PromiseCapability Record ), promiseResolve ( 함수 객체 )를 인수로 받고, ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 throw completion를 반환한다. 호출 시 다음 단계들을 수행한다:

  1. values에 새로운 빈 리스트를 할당한다.
  2. remainingElementsCount레코드 { [[Value]]: 1 }를 할당한다.
  3. index에 0을 할당한다.
  4. 반복한다,
    1. next에 ? IteratorStepValue(iteratorRecord)를 할당한다.
    2. nextdone이면,
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
      2. remainingElementsCount.[[Value]]가 0이면,
        1. valuesArrayCreateArrayFromList(values)를 할당한다.
        2. ? Call(resultCapability.[[Resolve]], undefined, « valuesArray »)를 수행한다.
      3. resultCapability.[[Promise]]를 반환한다.
    3. valuesundefined를 추가한다.
    4. nextPromise에 ? Call(promiseResolve, constructor, « next »)를 할당한다.
    5. stepsFulfilledPromise.allSettled Resolve Element Functions에 정의된 알고리즘 단계를 할당한다.
    6. lengthFulfilledPromise.allSettled Resolve Element Functions 함수 정의의 비선택적 매개변수 개수를 할당한다.
    7. onFulfilledCreateBuiltinFunction(stepsFulfilled, lengthFulfilled, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] »)를 할당한다.
    8. alreadyCalled레코드 { [[Value]]: false }를 할당한다.
    9. onFulfilled.[[AlreadyCalled]]alreadyCalled로 설정한다.
    10. onFulfilled.[[Index]]index로 설정한다.
    11. onFulfilled.[[Values]]values로 설정한다.
    12. onFulfilled.[[Capability]]resultCapability로 설정한다.
    13. onFulfilled.[[RemainingElements]]remainingElementsCount로 설정한다.
    14. stepsRejectedPromise.allSettled Reject Element Functions에 정의된 알고리즘 단계를 할당한다.
    15. lengthRejectedPromise.allSettled Reject Element Functions 함수 정의의 비선택적 매개변수 개수를 할당한다.
    16. onRejectedCreateBuiltinFunction(stepsRejected, lengthRejected, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] »)를 할당한다.
    17. onRejected.[[AlreadyCalled]]alreadyCalled로 설정한다.
    18. onRejected.[[Index]]index로 설정한다.
    19. onRejected.[[Values]]values로 설정한다.
    20. onRejected.[[Capability]]resultCapability로 설정한다.
    21. onRejected.[[RemainingElements]]remainingElementsCount로 설정한다.
    22. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1로 설정한다.
    23. ? Invoke(nextPromise, "then", « onFulfilled, onRejected ») 를 수행한다.
    24. indexindex + 1로 설정한다.

27.2.4.2.2 Promise.allSettled 이행 요소 함수

Promise.allSettled 이행 요소 함수는 특정 Promise.allSettled 요소를 이행하기 위해 사용되는 익명 내장 함수입니다. 각 Promise.allSettled 이행 요소 함수는 [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가집니다.

Promise.allSettled 이행 요소 함수가 인수 x로 호출되면, 다음 단계들을 수행합니다:

  1. F활성 함수 객체를 할당한다.
  2. alreadyCalledF.[[AlreadyCalled]]를 할당한다.
  3. alreadyCalled.[[Value]]true이면 undefined를 반환한다.
  4. alreadyCalled.[[Value]]true로 설정한다.
  5. indexF.[[Index]]를 할당한다.
  6. valuesF.[[Values]]를 할당한다.
  7. promiseCapabilityF.[[Capability]]를 할당한다.
  8. remainingElementsCountF.[[RemainingElements]]를 할당한다.
  9. objOrdinaryObjectCreate(%Object.prototype%)를 할당한다.
  10. ! CreateDataPropertyOrThrow(obj, "status", "fulfilled")를 수행한다.
  11. ! CreateDataPropertyOrThrow(obj, "value", x)를 수행한다.
  12. values[index]에 obj를 설정한다.
  13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
  14. remainingElementsCount.[[Value]]가 0이면,
    1. valuesArrayCreateArrayFromList(values)를 할당한다.
    2. 다음 값을 반환한다: ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray »).
  15. undefined를 반환한다.

Promise.allSettled 이행 요소 함수의 "length" 프로퍼티 값은 1𝔽이다.

27.2.4.2.3 Promise.allSettled 거부 요소 함수

Promise.allSettled 거부 요소 함수는 특정 Promise.allSettled 요소를 거부하기 위해 사용되는 익명 내장 함수입니다. 각 Promise.allSettled 거부 요소 함수는 [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가집니다.

Promise.allSettled 거부 요소 함수가 인수 x로 호출되면, 다음 단계들을 수행합니다:

  1. F활성 함수 객체를 할당한다.
  2. alreadyCalledF.[[AlreadyCalled]]를 할당한다.
  3. alreadyCalled.[[Value]]true이면 undefined를 반환한다.
  4. alreadyCalled.[[Value]]true로 설정한다.
  5. indexF.[[Index]]를 할당한다.
  6. valuesF.[[Values]]를 할당한다.
  7. promiseCapabilityF.[[Capability]]를 할당한다.
  8. remainingElementsCountF.[[RemainingElements]]를 할당한다.
  9. objOrdinaryObjectCreate(%Object.prototype%)를 할당한다.
  10. ! CreateDataPropertyOrThrow(obj, "status", "rejected")를 수행한다.
  11. ! CreateDataPropertyOrThrow(obj, "reason", x)를 수행한다.
  12. values[index]에 obj를 설정한다.
  13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
  14. remainingElementsCount.[[Value]]가 0이면,
    1. valuesArrayCreateArrayFromList(values)를 할당한다.
    2. 다음 값을 반환한다: ? Call(promiseCapability.[[Resolve]], undefined, « valuesArray »).
  15. undefined를 반환한다.

Promise.allSettled 거부 요소 함수의 "length" 프로퍼티 값은 1𝔽이다.

27.2.4.3 Promise.any ( iterable )

이 함수는 주어진 프라미스 중 가장 먼저 이행되는 프라미스에 의해 이행되거나, 모든 주어진 프라미스가 거부될 경우 거부 이유들을 담은 AggregateError로 거부되는 프라미스를 반환합니다. 이 알고리즘이 실행되는 동안 전달된 iterable의 모든 요소를 프라미스로 변환합니다.

  1. Cthis 값을 할당한다.
  2. promiseCapability에 ? NewPromiseCapability(C)를 할당한다.
  3. promiseResolveCompletion(GetPromiseResolve(C))를 할당한다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)를 수행한다.
  5. iteratorRecordCompletion(GetIterator(iterable, sync))를 할당한다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)를 수행한다.
  7. resultCompletion(PerformPromiseAny(iteratorRecord, C, promiseCapability, promiseResolve))를 할당한다.
  8. result비정상 종료(abrupt completion)이면,
    1. iteratorRecord.[[Done]]false이면, resultCompletion(IteratorClose(iteratorRecord, result))를 할당한다.
    2. IfAbruptRejectPromise(result, promiseCapability)를 수행한다.
  9. ! result를 반환한다.
참고

이 함수는 this 값이 Promise 생성자의 파라미터 규칙을 지원하는 생성자 함수여야 한다.

27.2.4.3.1 PerformPromiseAny ( iteratorRecord, constructor, resultCapability, promiseResolve )

PerformPromiseAny 추상 연산은 iteratorRecord ( Iterator Record ), constructor ( 생성자 ), resultCapability ( PromiseCapability Record ), promiseResolve ( 함수 객체 )를 인수로 받아 ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 throw completion를 반환한다. 호출 시 다음 단계들을 수행한다:

  1. errors에 새로운 빈 리스트를 할당한다.
  2. remainingElementsCount레코드 { [[Value]]: 1 }를 할당한다.
  3. index에 0을 할당한다.
  4. 반복한다,
    1. next에 ? IteratorStepValue(iteratorRecord)를 할당한다.
    2. nextdone이면,
      1. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
      2. remainingElementsCount.[[Value]]가 0이면,
        1. error에 새롭게 생성된 AggregateError 객체를 할당한다.
        2. ! DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) })를 수행한다.
        3. ThrowCompletion(error)를 반환한다.
      3. resultCapability.[[Promise]]를 반환한다.
    3. errorsundefined를 추가한다.
    4. nextPromise에 ? Call(promiseResolve, constructor, « next »)를 할당한다.
    5. stepsRejectedPromise.any Reject Element Functions에 정의된 알고리즘 단계를 할당한다.
    6. lengthRejectedPromise.any Reject Element Functions 함수 정의의 비선택적 매개변수 개수를 할당한다.
    7. onRejectedCreateBuiltinFunction(stepsRejected, lengthRejected, "", « [[AlreadyCalled]], [[Index]], [[Errors]], [[Capability]], [[RemainingElements]] »)를 할당한다.
    8. onRejected.[[AlreadyCalled]]false로 설정한다.
    9. onRejected.[[Index]]index로 설정한다.
    10. onRejected.[[Errors]]errors로 설정한다.
    11. onRejected.[[Capability]]resultCapability로 설정한다.
    12. onRejected.[[RemainingElements]]remainingElementsCount로 설정한다.
    13. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] + 1로 설정한다.
    14. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected ») 를 수행한다.
    15. indexindex + 1로 설정한다.

27.2.4.3.2 Promise.any 거부 요소 함수

Promise.any 거부 요소 함수는 특정 Promise.any 요소를 거부하기 위해 사용되는 익명 내장 함수입니다. 각 Promise.any 거부 요소 함수는 [[Index]], [[Errors]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가집니다.

Promise.any 거부 요소 함수가 인수 x로 호출되면, 다음 단계들을 수행합니다:

  1. F활성 함수 객체를 할당한다.
  2. F.[[AlreadyCalled]]true이면 undefined를 반환한다.
  3. F.[[AlreadyCalled]]true로 설정한다.
  4. indexF.[[Index]]를 할당한다.
  5. errorsF.[[Errors]]를 할당한다.
  6. promiseCapabilityF.[[Capability]]를 할당한다.
  7. remainingElementsCountF.[[RemainingElements]]를 할당한다.
  8. errors[index]에 x를 설정한다.
  9. remainingElementsCount.[[Value]]remainingElementsCount.[[Value]] - 1로 설정한다.
  10. remainingElementsCount.[[Value]]가 0이면,
    1. error에 새롭게 생성된 AggregateError 객체를 할당한다.
    2. ! DefinePropertyOrThrow(error, "errors", PropertyDescriptor { [[Configurable]]: true, [[Enumerable]]: false, [[Writable]]: true, [[Value]]: CreateArrayFromList(errors) })를 수행한다.
    3. ? Call(promiseCapability.[[Reject]], undefined, « error »)를 반환한다.
  11. undefined를 반환한다.

Promise.any 거부 요소 함수의 "length" 프로퍼티 값은 1𝔽이다.

27.2.4.4 Promise.prototype

Promise.prototype의 초기 값은 Promise 프로토타입 객체입니다.

이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가집니다.

27.2.4.5 Promise.race ( iterable )

이 함수는 전달받은 프라미스 중 가장 먼저 settle(이행 또는 거부)된 프라미스와 동일한 방식으로 settle되는 새로운 프라미스를 반환합니다. 이 알고리즘이 실행되는 동안 iterable의 모든 요소를 프라미스로 변환합니다.

  1. Cthis 값을 할당한다.
  2. promiseCapability에 ? NewPromiseCapability(C)를 할당한다.
  3. promiseResolveCompletion(GetPromiseResolve(C))를 할당한다.
  4. IfAbruptRejectPromise(promiseResolve, promiseCapability)를 수행한다.
  5. iteratorRecordCompletion(GetIterator(iterable, sync))를 할당한다.
  6. IfAbruptRejectPromise(iteratorRecord, promiseCapability)를 수행한다.
  7. resultCompletion(PerformPromiseRace(iteratorRecord, C, promiseCapability, promiseResolve))를 할당한다.
  8. result비정상 종료(abrupt completion)이면,
    1. iteratorRecord.[[Done]]false이면, resultCompletion(IteratorClose(iteratorRecord, result))를 할당한다.
    2. IfAbruptRejectPromise(result, promiseCapability)를 수행한다.
  9. ! result를 반환한다.
참고 1

iterable 인자가 값을 반환하지 않거나, iterable이 생성한 모든 프라미스가 settle되지 않는다면, 이 메서드가 반환하는 pending 프라미스는 결코 settle되지 않습니다.

참고 2

이 함수는 this 값이 Promise 생성자의 파라미터 규칙을 지원하는 생성자 함수여야 한다고 기대합니다. 또한 this 값이 resolve 메서드를 제공해야 합니다.

27.2.4.5.1 PerformPromiseRace ( iteratorRecord, constructor, resultCapability, promiseResolve )

PerformPromiseRace 추상 연산은 iteratorRecord ( Iterator Record ), constructor ( 생성자 ), resultCapability ( PromiseCapability Record ), promiseResolve ( 함수 객체 )를 인수로 받아 ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 throw completion를 반환한다. 호출 시 다음 단계들을 수행한다:

  1. 반복한다,
    1. next에 ? IteratorStepValue(iteratorRecord)를 할당한다.
    2. nextdone이면,
      1. resultCapability.[[Promise]]를 반환한다.
    3. nextPromise에 ? Call(promiseResolve, constructor, « next »)를 할당한다.
    4. ? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], resultCapability.[[Reject]] ») 를 수행한다.

27.2.4.6 Promise.reject ( r )

이 함수는 전달된 인수로 거부된 새로운 프라미스를 반환합니다.

  1. Cthis 값을 할당한다.
  2. promiseCapability에 ? NewPromiseCapability(C)를 할당한다.
  3. ? Call(promiseCapability.[[Reject]], undefined, « r ») 를 수행한다.
  4. promiseCapability.[[Promise]]를 반환한다.
참고

이 함수는 this 값이 Promise 생성자의 파라미터 규칙을 지원하는 생성자 함수여야 한다고 기대합니다.

27.2.4.7 Promise.resolve ( x )

이 함수는 전달된 인수로 resolve된 새로운 프라미스를 반환하거나, 인수가 이 생성자에 의해 생성된 프라미스라면 해당 인수 자체를 반환합니다.

  1. Cthis 값을 할당한다.
  2. C객체가 아니면, TypeError 예외를 throw한다.
  3. ? PromiseResolve(C, x)를 반환한다.
참고

이 함수는 this 값이 Promise 생성자의 파라미터 규칙을 지원하는 생성자 함수여야 한다고 기대합니다.

27.2.4.7.1 PromiseResolve ( C, x )

PromiseResolve 추상 연산은 C (객체)와 x ( ECMAScript 언어 값 )을 인수로 받고, ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 throw completion를 반환합니다. x로 resolve된 새로운 프라미스를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. IsPromise(x)가 true이면,
    1. xConstructor에 ? Get(x, "constructor")를 할당한다.
    2. SameValue(xConstructor, C)가 true이면 x를 반환한다.
  2. promiseCapability에 ? NewPromiseCapability(C)를 할당한다.
  3. ? Call(promiseCapability.[[Resolve]], undefined, « x ») 를 수행한다.
  4. promiseCapability.[[Promise]]를 반환한다.

27.2.4.8 Promise.try ( callback, ...args )

이 함수는 호출 시 다음 단계들을 수행합니다:

  1. Cthis 값을 할당한다.
  2. C객체가 아니면, TypeError 예외를 throw한다.
  3. promiseCapability에 ? NewPromiseCapability(C)를 할당한다.
  4. statusCompletion(Call(callback, undefined, args))를 할당한다.
  5. status비정상 종료(abrupt completion)이면,
    1. ? Call(promiseCapability.[[Reject]], undefined, « status.[[Value]] ») 를 수행한다.
  6. 그렇지 않으면,
    1. ? Call(promiseCapability.[[Resolve]], undefined, « status.[[Value]] ») 를 수행한다.
  7. promiseCapability.[[Promise]]를 반환한다.
참고

이 함수는 this 값이 Promise 생성자의 파라미터 규칙을 지원하는 생성자 함수여야 한다고 기대합니다.

27.2.4.9 Promise.withResolvers ( )

이 함수는 세 개의 프로퍼티를 가진 객체를 반환합니다: 새 프라미스와 이에 연결된 resolvereject 함수.

  1. Cthis 값을 할당한다.
  2. promiseCapability에 ? NewPromiseCapability(C)를 할당한다.
  3. objOrdinaryObjectCreate(%Object.prototype%)를 할당한다.
  4. ! CreateDataPropertyOrThrow(obj, "promise", promiseCapability.[[Promise]])를 수행한다.
  5. ! CreateDataPropertyOrThrow(obj, "resolve", promiseCapability.[[Resolve]])를 수행한다.
  6. ! CreateDataPropertyOrThrow(obj, "reject", promiseCapability.[[Reject]])를 수행한다.
  7. obj를 반환한다.

27.2.4.10 get Promise [ %Symbol.species% ]

Promise[%Symbol.species%]는 set 접근자 함수가 undefined접근자 프로퍼티입니다. get 접근자 함수는 호출 시 다음 단계들을 수행합니다:

  1. this 값을 반환한다.

이 함수의 "name" 프로퍼티 값은 "get [Symbol.species]"입니다.

참고

Promise 프로토타입 메서드는 일반적으로 this 값의 생성자를 사용해 파생 객체를 생성합니다. 하지만 서브클래스 생성자%Symbol.species% 프로퍼티를 재정의하여 기본 동작을 변경할 수 있습니다.

27.2.5 프라미스 프로토타입 객체의 속성

프라미스 프로토타입 객체:

  • %Promise.prototype%이다.
  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype%이다.
  • 일반 객체이다.
  • [[PromiseState]] 내부 슬롯이나 프라미스 인스턴스의 다른 내부 슬롯을 가지지 않는다.

27.2.5.1 Promise.prototype.catch ( onRejected )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. promisethis 값을 할당한다.
  2. ? Invoke(promise, "then", « undefined, onRejected »)를 반환한다.

27.2.5.2 Promise.prototype.constructor

Promise.prototype.constructor의 초기 값은 %Promise%입니다.

27.2.5.3 Promise.prototype.finally ( onFinally )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. promisethis 값을 할당한다.
  2. promise객체가 아니면, TypeError 예외를 throw한다.
  3. C에 ? SpeciesConstructor(promise, %Promise%)를 할당한다.
  4. Assert: IsConstructor(C)가 true임을 보장한다.
  5. IsCallable(onFinally)가 false이면,
    1. thenFinallyonFinally를 할당한다.
    2. catchFinallyonFinally를 할당한다.
  6. 그렇지 않으면,
    1. thenFinallyClosure에 파라미터 (value)를 가지며 onFinallyC를 캡처하고, 호출 시 다음을 수행하는 새로운 추상 클로저를 할당한다:
      1. result에 ? Call(onFinally, undefined)를 할당한다.
      2. p에 ? PromiseResolve(C, result)를 할당한다.
      3. returnValue에 파라미터 없이 value를 캡처하고 호출 시 NormalCompletion(value)를 반환하는 새로운 추상 클로저를 할당한다.
      4. valueThunkCreateBuiltinFunction(returnValue, 0, "", « »)를 할당한다.
      5. ? Invoke(p, "then", « valueThunk »)를 반환한다.
    2. thenFinallyCreateBuiltinFunction(thenFinallyClosure, 1, "", « »)를 할당한다.
    3. catchFinallyClosure에 파라미터 (reason)를 가지며 onFinallyC를 캡처하고, 호출 시 다음을 수행하는 새로운 추상 클로저를 할당한다:
      1. result에 ? Call(onFinally, undefined)를 할당한다.
      2. p에 ? PromiseResolve(C, result)를 할당한다.
      3. throwReason에 파라미터 없이 reason을 캡처하고 호출 시 ThrowCompletion(reason)를 반환하는 새로운 추상 클로저를 할당한다.
      4. throwerCreateBuiltinFunction(throwReason, 0, "", « »)를 할당한다.
      5. ? Invoke(p, "then", « thrower »)를 반환한다.
    4. catchFinallyCreateBuiltinFunction(catchFinallyClosure, 1, "", « »)를 할당한다.
  7. ? Invoke(promise, "then", « thenFinally, catchFinally »)를 반환한다.

27.2.5.4 Promise.prototype.then ( onFulfilled, onRejected )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. promisethis 값을 할당한다.
  2. IsPromise(promise)가 false이면, TypeError 예외를 throw한다.
  3. C에 ? SpeciesConstructor(promise, %Promise%)를 할당한다.
  4. resultCapability에 ? NewPromiseCapability(C)를 할당한다.
  5. PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability)를 반환한다.

27.2.5.4.1 PerformPromiseThen ( promise, onFulfilled, onRejected [ , resultCapability ] )

PerformPromiseThen 추상 연산은 promise (프라미스), onFulfilled ( ECMAScript 언어 값 ), onRejected ( ECMAScript 언어 값 ) 및 선택적 인수 resultCapability ( PromiseCapability Record )를 받아 ECMAScript 언어 값를 반환합니다. 이 연산은 promise에 대해 onFulfilledonRejected을 settle 액션으로 사용하여 "then" 동작을 수행합니다. resultCapability가 전달되면, 결과는 resultCapability의 promise를 업데이트하여 저장됩니다. 전달되지 않으면, PerformPromiseThen은 명세 내부 연산에 의해 호출되어 결과가 중요하지 않은 경우입니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: IsPromise(promise)가 true임을 보장한다.
  2. resultCapability가 제공되지 않았다면,
    1. resultCapabilityundefined로 설정한다.
  3. IsCallable(onFulfilled)가 false이면,
    1. onFulfilledJobCallbackempty를 할당한다.
  4. 그렇지 않으면,
    1. onFulfilledJobCallbackHostMakeJobCallback(onFulfilled)을 할당한다.
  5. IsCallable(onRejected)가 false이면,
    1. onRejectedJobCallbackempty를 할당한다.
  6. 그렇지 않으면,
    1. onRejectedJobCallbackHostMakeJobCallback(onRejected)을 할당한다.
  7. fulfillReactionPromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: fulfill, [[Handler]]: onFulfilledJobCallback }를 할당한다.
  8. rejectReactionPromiseReaction Record { [[Capability]]: resultCapability, [[Type]]: reject, [[Handler]]: onRejectedJobCallback }를 할당한다.
  9. promise.[[PromiseState]]pending이면,
    1. fulfillReactionpromise.[[PromiseFulfillReactions]]에 추가한다.
    2. rejectReactionpromise.[[PromiseRejectReactions]]에 추가한다.
  10. 그렇지 않고 promise.[[PromiseState]]fulfilled이면,
    1. valuepromise.[[PromiseResult]]를 할당한다.
    2. fulfillJobNewPromiseReactionJob(fulfillReaction, value)를 할당한다.
    3. HostEnqueuePromiseJob(fulfillJob.[[Job]], fulfillJob.[[Realm]])를 수행한다.
  11. 그 밖의 경우,
    1. Assert: promise.[[PromiseState]]rejected임을 보장한다.
    2. reasonpromise.[[PromiseResult]]를 할당한다.
    3. promise.[[PromiseIsHandled]]false이면, HostPromiseRejectionTracker(promise, "handle")를 수행한다.
    4. rejectJobNewPromiseReactionJob(rejectReaction, reason)를 할당한다.
    5. HostEnqueuePromiseJob(rejectJob.[[Job]], rejectJob.[[Realm]])를 수행한다.
  12. promise.[[PromiseIsHandled]]true로 설정한다.
  13. resultCapabilityundefined이면,
    1. undefined를 반환한다.
  14. 그렇지 않으면,
    1. resultCapability.[[Promise]]를 반환한다.

27.2.5.5 Promise.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "Promise"입니다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 입니다.

27.2.6 프라미스 인스턴스의 속성

프라미스 인스턴스는 일반 객체이며, 프라미스 프로토타입 객체(내장, %Promise.prototype%)로부터 프로퍼티를 상속받습니다. 프라미스 인스턴스는 표 92에 기술된 내부 슬롯들과 함께 처음 생성됩니다.

표 92: 프라미스 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[PromiseState]] pending, fulfilled, 또는 rejected 프라미스가 then 메서드에 대한 호출에 어떻게 반응할지 관리합니다.
[[PromiseResult]] ECMAScript 언어 값 또는 empty 프라미스가 이행 또는 거부된 값(있다면). [[PromiseState]]pending일 때만 empty입니다.
[[PromiseFulfillReactions]] 리스트 (PromiseReaction 레코드의 리스트) 프라미스가 pending 상태에서 fulfilled 상태로 전이될 때 처리될 레코드들입니다.
[[PromiseRejectReactions]] 리스트 (PromiseReaction 레코드의 리스트) 프라미스가 pending 상태에서 rejected 상태로 전이될 때 처리될 레코드들입니다.
[[PromiseIsHandled]] 불리언 값 프라미스가 fulfillment 또는 rejection 핸들러를 가진 적이 있는지 나타냅니다. 미처리 거부 추적에 사용됩니다.

27.3 GeneratorFunction 객체

GeneratorFunction은 일반적으로 GeneratorDeclaration, GeneratorExpression, GeneratorMethod를 평가함으로써 생성되는 함수입니다. 또한 %GeneratorFunction% 내장 객체를 호출하여 생성될 수 있습니다.

그림 6 (설명): Generator 객체의 관계
다양한 상자들과 화살표들.

27.3.1 GeneratorFunction 생성자

GeneratorFunction 생성자:

  • %GeneratorFunction%이다.
  • Function의 서브클래스이다.
  • 함수로 호출될 때 새로운 GeneratorFunction을 생성 및 초기화한다. 즉, GeneratorFunction (…) 함수 호출은 같은 인자를 가진 new GeneratorFunction (…) 객체 생성 표현과 동일하다.
  • 클래스 정의의 extends 절의 값으로 사용될 수 있다. 명시된 GeneratorFunction 동작을 상속하고자 하는 서브클래스 생성자는 내장 GeneratorFunction 동작에 필요한 내부 슬롯으로 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 GeneratorFunction 생성자에 대한 super 호출을 포함해야 한다. ECMAScript의 모든 generator 함수 객체 정의 구문은 GeneratorFunction의 직접 인스턴스를 생성한다. GeneratorFunction 서브클래스의 인스턴스를 생성하는 구문은 존재하지 않는다.

27.3.1.1 GeneratorFunction ( ...parameterArgs, bodyArg )

마지막 인수(있다면)는 generator 함수의 본문(실행 코드)을 지정하며, 그 앞의 인수들은 형식 매개변수를 지정한다.

이 함수는 호출 시 다음 단계들을 수행한다:

  1. C활성 함수 객체를 할당한다.
  2. bodyArg가 없으면, bodyArg를 빈 문자열로 설정한다.
  3. ? CreateDynamicFunction(C, NewTarget, generator, parameterArgs, bodyArg)를 반환한다.
참고

20.2.1.1의 NOTE를 참고.

27.3.2 GeneratorFunction 생성자의 속성

GeneratorFunction 생성자:

  • Function 생성자로부터 상속받는 표준 내장 함수 객체이다.
  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function%이다.
  • "length" 프로퍼티 값은 1𝔽이다.
  • "name" 프로퍼티 값은 "GeneratorFunction"이다.
  • 다음 프로퍼티를 가진다:

27.3.2.1 GeneratorFunction.prototype

GeneratorFunction.prototype의 초기 값은 GeneratorFunction 프로토타입 객체이다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 이다.

27.3.3 GeneratorFunction 프로토타입 객체의 속성

GeneratorFunction 프로토타입 객체:

27.3.3.1 GeneratorFunction.prototype.constructor

GeneratorFunction.prototype.constructor의 초기 값은 %GeneratorFunction%이다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 이다.

27.3.3.2 GeneratorFunction.prototype.prototype

GeneratorFunction.prototype.prototype의 초기 값은 %GeneratorPrototype%이다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 이다.

27.3.3.3 GeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "GeneratorFunction"이다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 이다.

27.3.4 GeneratorFunction 인스턴스

모든 GeneratorFunction 인스턴스는 ECMAScript 함수 객체이며, 표 30에 명시된 내부 슬롯을 갖습니다. 이러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯의 값은 false입니다.

각 GeneratorFunction 인스턴스는 다음의 자체 프로퍼티를 가집니다:

27.3.4.1 length

"length" 프로퍼티에 대한 Function 인스턴스의 명세(20.2.4.1 참조)는 GeneratorFunction 인스턴스에도 적용됩니다.

27.3.4.2 name

"name" 프로퍼티에 대한 Function 인스턴스의 명세(20.2.4.2 참조)는 GeneratorFunction 인스턴스에도 적용됩니다.

27.3.4.3 prototype

GeneratorFunction 인스턴스가 생성될 때마다 또 다른 일반 객체가 함께 생성되며, 이는 generator 함수의 "prototype" 프로퍼티의 초기 값이 됩니다. prototype 프로퍼티의 값은 generator 함수 객체[[Call]]을 사용하여 호출될 때 새롭게 생성되는 Generator의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용됩니다.

이 프로퍼티의 특성은 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 입니다.

참고

Function 인스턴스와 달리, GeneratorFunction의 "prototype" 프로퍼티의 값인 객체는 GeneratorFunction 인스턴스를 값으로 갖는 "constructor" 프로퍼티를 가지고 있지 않습니다.

27.4 AsyncGeneratorFunction 객체

AsyncGeneratorFunction은 일반적으로 AsyncGeneratorDeclaration, AsyncGeneratorExpression, AsyncGeneratorMethod 구문을 평가하여 생성되는 함수입니다. 또한 %AsyncGeneratorFunction% 내장 객체를 호출하여 생성될 수 있습니다.

27.4.1 AsyncGeneratorFunction 생성자

AsyncGeneratorFunction 생성자:

  • %AsyncGeneratorFunction%이다.
  • Function의 서브클래스이다.
  • 함수로 호출될 때 새로운 AsyncGeneratorFunction을 생성 및 초기화한다. 즉, AsyncGeneratorFunction (...) 함수 호출은 같은 인자를 가진 new AsyncGeneratorFunction (...) 객체 생성 표현과 동일하다.
  • 클래스 정의의 extends 절의 값으로 사용될 수 있다. 명시된 AsyncGeneratorFunction 동작을 상속하고자 하는 서브클래스 생성자는 내장 AsyncGeneratorFunction 동작에 필요한 내부 슬롯으로 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 AsyncGeneratorFunction 생성자에 대한 super 호출을 포함해야 한다. ECMAScript의 모든 async generator 함수 객체 정의 구문은 AsyncGeneratorFunction의 직접 인스턴스를 생성한다. AsyncGeneratorFunction 서브클래스의 인스턴스를 생성하는 구문은 존재하지 않는다.

27.4.1.1 AsyncGeneratorFunction ( ...parameterArgs, bodyArg )

마지막 인수(있다면)는 async generator 함수의 본문(실행 코드)을 지정하며, 그 앞의 인수들은 형식 매개변수를 지정한다.

이 함수는 호출 시 다음 단계들을 수행한다:

  1. C활성 함수 객체를 할당한다.
  2. bodyArg가 없으면, bodyArg를 빈 문자열로 설정한다.
  3. ? CreateDynamicFunction(C, NewTarget, async-generator, parameterArgs, bodyArg)를 반환한다.
참고

20.2.1.1의 NOTE를 참고.

27.4.2 AsyncGeneratorFunction 생성자의 속성

AsyncGeneratorFunction 생성자:

  • Function 생성자로부터 상속받는 표준 내장 함수 객체이다.
  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function%이다.
  • "length" 프로퍼티 값은 1𝔽이다.
  • "name" 프로퍼티 값은 "AsyncGeneratorFunction"이다.
  • 다음 프로퍼티를 가진다:

27.4.2.1 AsyncGeneratorFunction.prototype

AsyncGeneratorFunction.prototype의 초기 값은 AsyncGeneratorFunction 프로토타입 객체이다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 이다.

27.4.3 AsyncGeneratorFunction 프로토타입 객체의 속성

AsyncGeneratorFunction 프로토타입 객체:

  • %AsyncGeneratorFunction.prototype%이다.
  • 일반 객체이다.
  • 함수 객체가 아니며, [[ECMAScriptCode]] 내부 슬롯이나 표 30 또는 표 94에 기술된 다른 내부 슬롯을 가지지 않는다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%이다.

27.4.3.1 AsyncGeneratorFunction.prototype.constructor

AsyncGeneratorFunction.prototype.constructor의 초기 값은 %AsyncGeneratorFunction%이다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 이다.

27.4.3.2 AsyncGeneratorFunction.prototype.prototype

AsyncGeneratorFunction.prototype.prototype의 초기 값은 %AsyncGeneratorPrototype%이다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 이다.

27.4.3.3 AsyncGeneratorFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "AsyncGeneratorFunction"이다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 이다.

27.4.4 AsyncGeneratorFunction 인스턴스

모든 AsyncGeneratorFunction 인스턴스는 ECMAScript 함수 객체이며, 표 30에 명시된 내부 슬롯을 갖습니다. 이러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯의 값은 false입니다.

각 AsyncGeneratorFunction 인스턴스는 다음의 자체 프로퍼티를 가집니다:

27.4.4.1 length

"length" 프로퍼티의 값은 AsyncGeneratorFunction이 일반적으로 기대하는 인자의 개수를 나타내는 정수형 Number입니다. 하지만, 언어는 이 함수가 다른 개수의 인자로 호출될 수 있도록 허용합니다. AsyncGeneratorFunction이 "length" 프로퍼티에 지정된 개수와 다른 인자 개수로 호출될 때의 동작은 함수에 따라 다릅니다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 입니다.

27.4.4.2 name

"name" 프로퍼티에 대한 Function 인스턴스의 명세(20.2.4.2 참조)는 AsyncGeneratorFunction 인스턴스에도 적용됩니다.

27.4.4.3 prototype

AsyncGeneratorFunction 인스턴스가 생성될 때마다 또 다른 일반 객체가 함께 생성되며, 이는 async generator 함수의 "prototype" 프로퍼티의 초기 값이 됩니다. prototype 프로퍼티의 값은 async generator 함수 객체[[Call]]을 사용하여 호출될 때 새롭게 생성되는 AsyncGenerator의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용됩니다.

이 프로퍼티의 특성은 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 입니다.

참고

함수 인스턴스와 달리, AsyncGeneratorFunction의 "prototype" 프로퍼티의 값인 객체는 AsyncGeneratorFunction 인스턴스를 값으로 갖는 "constructor" 프로퍼티를 가지고 있지 않습니다.

27.5 Generator 객체

Generator는 generator 함수를 호출하여 생성되며 이터레이터 인터페이스이터러블 인터페이스 모두를 따릅니다.

Generator 인스턴스는 인스턴스를 생성한 generator 함수의 "prototype" 프로퍼티의 초기값으로부터 직접적으로 프로퍼티를 상속받습니다. Generator 인스턴스는 %GeneratorPrototype%으로부터 간접적으로 프로퍼티를 상속받습니다.

27.5.1 %GeneratorPrototype% 객체

%GeneratorPrototype% 객체:

  • %GeneratorFunction.prototype.prototype%이다.
  • 일반 객체이다.
  • Generator 인스턴스가 아니며, [[GeneratorState]] 내부 슬롯을 갖지 않는다.
  • [[Prototype]] 내부 슬롯의 값은 %Iterator.prototype%이다.
  • 모든 Generator 인스턴스가 간접적으로 상속받는 프로퍼티를 갖는다.

27.5.1.1 %GeneratorPrototype%.constructor

%GeneratorPrototype%.constructor의 초기값은 %GeneratorFunction.prototype%입니다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 입니다.

27.5.1.2 %GeneratorPrototype%.next ( value )

  1. ? GeneratorResume(this 값, value, empty)를 반환한다.

27.5.1.3 %GeneratorPrototype%.return ( value )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. gthis 값을 할당한다.
  2. CReturnCompletion(value)를 할당한다.
  3. ? GeneratorResumeAbrupt(g, C, empty)를 반환한다.

27.5.1.4 %GeneratorPrototype%.throw ( exception )

이 메서드는 호출 시 다음 단계들을 수행합니다:

  1. gthis 값을 할당한다.
  2. CThrowCompletion(exception)를 할당한다.
  3. ? GeneratorResumeAbrupt(g, C, empty)를 반환한다.

27.5.1.5 %GeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기값은 문자열 "Generator"입니다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 입니다.

27.5.2 Generator 인스턴스의 속성

Generator 인스턴스는 표 93에 기술된 내부 슬롯들과 함께 처음 생성됩니다.

표 93: Generator 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[GeneratorState]] suspended-start, suspended-yield, executing, 또는 completed 현재 generator의 실행 상태입니다.
[[GeneratorContext]] 실행 컨텍스트 이 generator의 코드를 실행할 때 사용되는 실행 컨텍스트입니다.
[[GeneratorBrand]] 문자열 또는 empty 다양한 종류의 generator를 구분하는 데 사용되는 brand입니다. ECMAScript 소스 텍스트에서 선언된 generator의 [[GeneratorBrand]]는 항상 empty입니다.

27.5.3 Generator 추상 연산

27.5.3.1 GeneratorStart ( generator, generatorBody )

GeneratorStart 추상 연산은 generator (Generator)와 generatorBody (FunctionBody 파싱 노드 또는 파라미터 없는 추상 클로저)를 인수로 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: generator.[[GeneratorState]]suspended-start임을 보장한다.
  2. genContext실행 중인 실행 컨텍스트를 할당한다.
  3. genContext의 Generator 컴포넌트를 generator로 설정한다.
  4. closure에 파라미터 없이 generatorBody를 캡처하고 호출 시 다음 단계들을 수행하는 새로운 추상 클로저를 할당한다:
    1. acGenContext실행 중인 실행 컨텍스트를 할당한다.
    2. acGeneratoracGenContext의 Generator 컴포넌트를 할당한다.
    3. generatorBody파싱 노드이면,
      1. resultCompletion(Evaluation of generatorBody)를 할당한다.
    4. 그 밖의 경우,
      1. Assert: generatorBody는 파라미터 없는 추상 클로저이어야 한다.
      2. resultCompletion(generatorBody())를 할당한다.
    5. Assert: 여기서 반환된다면 generator는 예외를 throw했거나 암시적 또는 명시적 return을 수행한 것이다.
    6. acGenContext실행 컨텍스트 스택에서 제거하고, 실행 컨텍스트 스택의 최상단에 있는 실행 컨텍스트실행 중인 실행 컨텍스트로 복원한다.
    7. acGenerator.[[GeneratorState]]completed로 설정한다.
    8. 참고: generator가 completed 상태에 들어가면 다시 그 상태를 벗어나지 않으며, 관련된 실행 컨텍스트도 다시 재개되지 않는다. 이 시점에서 acGenerator와 관련된 실행 상태는 버려질 수 있다.
    9. result정상 종료(normal completion)이면,
      1. resultValueundefined를 할당한다.
    10. resultreturn completion이면,
      1. resultValueresult.[[Value]]를 할당한다.
    11. 그 밖의 경우,
      1. Assert: resultthrow completion이어야 한다.
      2. ? result를 반환한다.
    12. NormalCompletion(CreateIteratorResultObject(resultValue, true))를 반환한다.
  5. genContext의 코드 평가 상태를 조정하여 해당 실행 컨텍스트가 재개될 때 closure가 인자 없이 호출되도록 한다.
  6. generator.[[GeneratorContext]]genContext로 설정한다.
  7. unused를 반환한다.

27.5.3.2 GeneratorValidate ( generator, generatorBrand )

GeneratorValidate 추상 연산은 generator (ECMAScript 언어 값)와 generatorBrand (문자열 또는 empty)를 인수로 받아 suspended-start, suspended-yield, completed 중 하나를 담은 정상 종료(normal completion) 또는 throw completion를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. ? RequireInternalSlot(generator, [[GeneratorState]])를 수행한다.
  2. ? RequireInternalSlot(generator, [[GeneratorBrand]])를 수행한다.
  3. generator.[[GeneratorBrand]]generatorBrand와 다르면 TypeError 예외를 throw한다.
  4. Assert: generator[[GeneratorContext]] 내부 슬롯도 가져야 한다.
  5. stategenerator.[[GeneratorState]]를 할당한다.
  6. stateexecuting이면, TypeError 예외를 throw한다.
  7. state를 반환한다.

27.5.3.3 GeneratorResume ( generator, value, generatorBrand )

GeneratorResume 추상 연산은 generator (ECMAScript 언어 값), value (ECMAScript 언어 값 또는 empty), generatorBrand (문자열 또는 empty)를 인수로 받아 ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 throw completion를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. state에 ? GeneratorValidate(generator, generatorBrand)를 할당한다.
  2. statecompleted이면, CreateIteratorResultObject(undefined, true)를 반환한다.
  3. Assert: statesuspended-start 또는 suspended-yield이어야 한다.
  4. genContextgenerator.[[GeneratorContext]]를 할당한다.
  5. methodContext실행 중인 실행 컨텍스트를 할당한다.
  6. methodContext를 중단(suspend)한다.
  7. generator.[[GeneratorState]]executing로 설정한다.
  8. genContext실행 컨텍스트 스택에 푸시(push)한다; genContext는 이제 실행 중인 실행 컨텍스트이다.
  9. genContext의 중단된 평가를 재개한다 NormalCompletion(value)를 중단의 결과로 사용한다. result에 재개된 계산의 반환값을 할당한다.
  10. Assert: 여기서 반환될 때 genContext는 이미 실행 컨텍스트 스택에서 제거되었고 methodContext가 현재 실행 중인 실행 컨텍스트이다.
  11. ? result를 반환한다.

27.5.3.4 GeneratorResumeAbrupt ( generator, abruptCompletion, generatorBrand )

GeneratorResumeAbrupt 추상 연산은 generator (ECMAScript 언어 값), abruptCompletion (return completion 또는 throw completion), generatorBrand (문자열 또는 empty)를 인수로 받아 ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 throw completion를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. state에 ? GeneratorValidate(generator, generatorBrand)를 할당한다.
  2. statesuspended-start이면,
    1. generator.[[GeneratorState]]completed로 설정한다.
    2. 참고: generator가 completed 상태에 들어가면 다시 그 상태를 벗어나지 않으며, 관련된 실행 컨텍스트도 다시 재개되지 않는다. 이 시점에서 generator와 관련된 실행 상태는 버려질 수 있다.
    3. statecompleted로 설정한다.
  3. statecompleted이면,
    1. abruptCompletionreturn completion이면,
      1. CreateIteratorResultObject(abruptCompletion.[[Value]], true)를 반환한다.
    2. ? abruptCompletion를 반환한다.
  4. Assert: statesuspended-yield이어야 한다.
  5. genContextgenerator.[[GeneratorContext]]를 할당한다.
  6. methodContext실행 중인 실행 컨텍스트를 할당한다.
  7. methodContext를 중단(suspend)한다.
  8. generator.[[GeneratorState]]executing로 설정한다.
  9. genContext실행 컨텍스트 스택에 푸시(push)한다; genContext는 이제 실행 중인 실행 컨텍스트이다.
  10. genContext의 중단된 평가를 재개한다 중단의 결과로 abruptCompletion을 사용한다. result에 재개된 계산이 반환한 Completion Record를 할당한다.
  11. Assert: 여기서 반환될 때 genContext는 이미 실행 컨텍스트 스택에서 제거되었고 methodContext가 현재 실행 중인 실행 컨텍스트이다.
  12. ? result를 반환한다.

27.5.3.5 GetGeneratorKind ( )

GetGeneratorKind 추상 연산은 인수를 받지 않으며 non-generator, sync, async 중 하나를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. genContext실행 중인 실행 컨텍스트를 할당한다.
  2. genContext에 Generator 컴포넌트가 없으면 non-generator를 반환한다.
  3. generatorgenContext의 Generator 컴포넌트를 할당한다.
  4. generator[[AsyncGeneratorState]] 내부 슬롯이 있으면 async를 반환한다.
  5. 그 밖의 경우 sync를 반환한다.

27.5.3.6 GeneratorYield ( iteratorResult )

GeneratorYield 추상 연산은 iteratorResult (IteratorResult 인터페이스를 따르는 객체)를 인수로 받아 ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 비정상 종료(abrupt completion)를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. genContext실행 중인 실행 컨텍스트를 할당한다.
  2. Assert: genContext는 generator의 실행 컨텍스트이어야 한다.
  3. generatorgenContext의 Generator 컴포넌트를 할당한다.
  4. Assert: GetGeneratorKind()가 sync임을 보장한다.
  5. generator.[[GeneratorState]]suspended-yield로 설정한다.
  6. genContext실행 컨텍스트 스택에서 제거하고, 실행 컨텍스트 스택의 최상단에 있는 실행 컨텍스트실행 중인 실행 컨텍스트로 복원한다.
  7. callerContext실행 중인 실행 컨텍스트를 할당한다.
  8. NormalCompletion(iteratorResult)를 전달하여 callerContext를 재개한다. genContext가 다시 재개된다면 resumptionValue에 재개 시 전달된 Completion Record를 할당한다.
  9. Assert: 여기까지 도달했다면 genContext는 다시 실행 중인 실행 컨텍스트가 되었다.
  10. resumptionValue를 반환한다.

27.5.3.7 Yield ( value )

Yield 추상 연산은 value (ECMAScript 언어 값)를 인수로 받아 ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 비정상 종료(abrupt completion)를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. generatorKindGetGeneratorKind()를 할당한다.
  2. generatorKindasync이면, ? AsyncGeneratorYield(? Await(value))를 반환한다.
  3. 그 밖의 경우, ? GeneratorYield(CreateIteratorResultObject(value, false))를 반환한다.

27.5.3.8 CreateIteratorFromClosure ( closure, generatorBrand, generatorPrototype [ , extraSlots ] )

CreateIteratorFromClosure 추상 연산은 closure (파라미터 없는 추상 클로저), generatorBrand (문자열 또는 empty), generatorPrototype (객체), 선택적 인수 extraSlots (내부 슬롯 이름의 리스트)를 받아 Generator를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. 참고: closureYield 연산을 사용하여 IteratorResult 객체를 yield할 수 있습니다.
  2. extraSlots가 제공되지 않았다면, extraSlots를 새로운 빈 리스트로 설정한다.
  3. internalSlotsListextraSlots와 « [[GeneratorState]], [[GeneratorContext]], [[GeneratorBrand]] »의 리스트 연결 결과를 할당한다.
  4. generatorOrdinaryObjectCreate(generatorPrototype, internalSlotsList)를 할당한다.
  5. generator.[[GeneratorBrand]]generatorBrand로 설정한다.
  6. generator.[[GeneratorState]]suspended-start로 설정한다.
  7. callerContext실행 중인 실행 컨텍스트를 할당한다.
  8. calleeContext에 새로운 실행 컨텍스트를 할당한다.
  9. calleeContext의 Function을 null로 설정한다.
  10. calleeContextRealm현재 Realm Record로 설정한다.
  11. calleeContext의 ScriptOrModule을 callerContext의 ScriptOrModule로 설정한다.
  12. callerContext가 이미 중단 상태가 아니라면 callerContext를 중단(suspend)한다.
  13. calleeContext실행 컨텍스트 스택에 푸시(push)한다; calleeContext는 이제 실행 중인 실행 컨텍스트이다.
  14. GeneratorStart(generator, closure)를 수행한다.
  15. calleeContext실행 컨텍스트 스택에서 제거하고 callerContext실행 중인 실행 컨텍스트로 복원한다.
  16. generator를 반환한다.

27.6 AsyncGenerator 객체

AsyncGenerator는 async generator 함수를 호출하여 생성되며 async 이터레이터 인터페이스async 이터러블 인터페이스 모두를 따릅니다.

AsyncGenerator 인스턴스는 인스턴스를 생성한 async generator 함수의 "prototype" 프로퍼티의 초기값으로부터 직접적으로 프로퍼티를 상속받습니다. AsyncGenerator 인스턴스는 %AsyncGeneratorPrototype%으로부터 간접적으로 프로퍼티를 상속받습니다.

27.6.1 %AsyncGeneratorPrototype% 객체

%AsyncGeneratorPrototype% 객체:

  • %AsyncGeneratorFunction.prototype.prototype%이다.
  • 일반 객체이다.
  • AsyncGenerator 인스턴스가 아니며, [[AsyncGeneratorState]] 내부 슬롯을 갖지 않는다.
  • [[Prototype]] 내부 슬롯의 값은 %AsyncIteratorPrototype%이다.
  • 모든 AsyncGenerator 인스턴스가 간접적으로 상속받는 프로퍼티를 갖는다.

27.6.1.1 %AsyncGeneratorPrototype%.constructor

%AsyncGeneratorPrototype%.constructor의 초기값은 %AsyncGeneratorFunction.prototype%입니다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 입니다.

27.6.1.2 %AsyncGeneratorPrototype%.next ( value )

  1. generatorthis 값을 할당한다.
  2. promiseCapability에 ! NewPromiseCapability(%Promise%)를 할당한다.
  3. resultCompletion(AsyncGeneratorValidate(generator, empty))를 할당한다.
  4. IfAbruptRejectPromise(result, promiseCapability)를 수행한다.
  5. stategenerator.[[AsyncGeneratorState]]를 할당한다.
  6. statecompleted이면,
    1. iteratorResultCreateIteratorResultObject(undefined, true)를 할당한다.
    2. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult »)를 수행한다.
    3. promiseCapability.[[Promise]]를 반환한다.
  7. completionNormalCompletion(value)를 할당한다.
  8. AsyncGeneratorEnqueue(generator, completion, promiseCapability)를 수행한다.
  9. statesuspended-start 또는 suspended-yield이면,
    1. AsyncGeneratorResume(generator, completion)를 수행한다.
  10. 그 밖의 경우,
    1. Assert: stateexecuting 또는 draining-queue이어야 한다.
  11. promiseCapability.[[Promise]]를 반환한다.

27.6.1.3 %AsyncGeneratorPrototype%.return ( value )

  1. generatorthis 값을 할당한다.
  2. promiseCapability에 ! NewPromiseCapability(%Promise%)를 할당한다.
  3. resultCompletion(AsyncGeneratorValidate(generator, empty))를 할당한다.
  4. IfAbruptRejectPromise(result, promiseCapability)를 수행한다.
  5. completionReturnCompletion(value)를 할당한다.
  6. AsyncGeneratorEnqueue(generator, completion, promiseCapability)를 수행한다.
  7. stategenerator.[[AsyncGeneratorState]]를 할당한다.
  8. statesuspended-start 또는 completed이면,
    1. generator.[[AsyncGeneratorState]]draining-queue로 설정한다.
    2. AsyncGeneratorAwaitReturn(generator)를 수행한다.
  9. 그 밖의 경우 statesuspended-yield이면,
    1. AsyncGeneratorResume(generator, completion)를 수행한다.
  10. 그 밖의 경우,
    1. Assert: stateexecuting 또는 draining-queue이어야 한다.
  11. promiseCapability.[[Promise]]를 반환한다.

27.6.1.4 %AsyncGeneratorPrototype%.throw ( exception )

  1. generatorthis 값을 할당한다.
  2. promiseCapability에 ! NewPromiseCapability(%Promise%)를 할당한다.
  3. resultCompletion(AsyncGeneratorValidate(generator, empty))를 할당한다.
  4. IfAbruptRejectPromise(result, promiseCapability)를 수행한다.
  5. stategenerator.[[AsyncGeneratorState]]를 할당한다.
  6. statesuspended-start이면,
    1. generator.[[AsyncGeneratorState]]completed로 설정한다.
    2. statecompleted로 설정한다.
  7. statecompleted이면,
    1. ! Call(promiseCapability.[[Reject]], undefined, « exception »)를 수행한다.
    2. promiseCapability.[[Promise]]를 반환한다.
  8. completionThrowCompletion(exception)를 할당한다.
  9. AsyncGeneratorEnqueue(generator, completion, promiseCapability)를 수행한다.
  10. statesuspended-yield이면,
    1. AsyncGeneratorResume(generator, completion)를 수행한다.
  11. 그 밖의 경우,
    1. Assert: stateexecuting 또는 draining-queue이어야 한다.
  12. promiseCapability.[[Promise]]를 반환한다.

27.6.1.5 %AsyncGeneratorPrototype% [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기값은 문자열 "AsyncGenerator"입니다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 입니다.

27.6.2 AsyncGenerator 인스턴스의 속성

AsyncGenerator 인스턴스는 아래에 기술된 내부 슬롯들과 함께 처음 생성됩니다:

표 94: AsyncGenerator 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[AsyncGeneratorState]] suspended-start, suspended-yield, executing, draining-queue, 또는 completed 현재 async generator의 실행 상태입니다.
[[AsyncGeneratorContext]] 실행 컨텍스트 이 async generator의 코드를 실행할 때 사용되는 실행 컨텍스트입니다.
[[AsyncGeneratorQueue]] 리스트 (AsyncGeneratorRequest 레코드의 리스트) 레코드로, async generator를 재개하기 위한 요청을 나타냅니다. 상태 전이 중이 아닌 경우, [[AsyncGeneratorState]]executing 또는 draining-queue일 때만 비어 있지 않습니다.
[[GeneratorBrand]] 문자열 또는 empty 다양한 종류의 async generator를 구분하는 데 사용되는 brand입니다. ECMAScript 소스 텍스트에서 선언된 async generator의 [[GeneratorBrand]]는 항상 empty입니다.

27.6.3 AsyncGenerator 추상 연산

27.6.3.1 AsyncGeneratorRequest 레코드

AsyncGeneratorRequest는 async generator가 어떻게 재개되어야 하는지에 대한 정보를 저장하기 위해 사용되는 레코드 값이며, 해당 promise를 이행하거나 거부하는 데 필요한 capability를 포함합니다.

다음 필드를 가집니다:

표 95: AsyncGeneratorRequest 레코드 필드
필드 이름 의미
[[Completion]] Completion Record async generator를 재개할 때 사용해야 하는 Completion Record
[[Capability]] PromiseCapability Record 이 요청에 연결된 promise capability입니다.

27.6.3.2 AsyncGeneratorStart ( generator, generatorBody )

AsyncGeneratorStart 추상 연산은 generator (AsyncGenerator)와 generatorBody (FunctionBody 파싱 노드 또는 파라미터 없는 추상 클로저)를 인수로 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: generator.[[AsyncGeneratorState]]suspended-start임을 보장한다.
  2. genContext실행 중인 실행 컨텍스트를 할당한다.
  3. genContext의 Generator 컴포넌트를 generator로 설정한다.
  4. closure에 파라미터 없이 generatorBody를 캡처하고 호출 시 다음 단계들을 수행하는 새로운 추상 클로저를 할당한다:
    1. acGenContext실행 중인 실행 컨텍스트를 할당한다.
    2. acGeneratoracGenContext의 Generator 컴포넌트를 할당한다.
    3. generatorBody파싱 노드이면,
      1. resultCompletion(Evaluation of generatorBody)를 할당한다.
    4. 그 밖의 경우,
      1. Assert: generatorBody는 파라미터 없는 추상 클로저이어야 한다.
      2. resultCompletion(generatorBody())를 할당한다.
    5. Assert: 여기서 반환된다면 async generator는 예외를 throw했거나 암시적 또는 명시적 return을 수행한 것이다.
    6. acGenContext실행 컨텍스트 스택에서 제거하고, 실행 컨텍스트 스택의 최상단에 있는 실행 컨텍스트실행 중인 실행 컨텍스트로 복원한다.
    7. acGenerator.[[AsyncGeneratorState]]draining-queue로 설정한다.
    8. result정상 종료(normal completion)이면, resultNormalCompletion(undefined)로 설정한다.
    9. resultreturn completion이면, resultNormalCompletion(result.[[Value]])로 설정한다.
    10. AsyncGeneratorCompleteStep(acGenerator, result, true)를 수행한다.
    11. AsyncGeneratorDrainQueue(acGenerator)를 수행한다.
    12. NormalCompletion(undefined)를 반환한다.
  5. genContext의 코드 평가 상태를 조정하여 해당 실행 컨텍스트가 재개될 때 closure가 인자 없이 호출되도록 한다.
  6. generator.[[AsyncGeneratorContext]]genContext로 설정한다.
  7. generator.[[AsyncGeneratorQueue]]를 새로운 빈 리스트로 설정한다.
  8. unused를 반환한다.

27.6.3.3 AsyncGeneratorValidate ( generator, generatorBrand )

AsyncGeneratorValidate 추상 연산은 generator (ECMAScript 언어 값)와 generatorBrand (문자열 또는 empty)를 인수로 받아 unused를 담은 정상 종료(normal completion) 또는 throw completion를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. ? RequireInternalSlot(generator, [[AsyncGeneratorContext]])를 수행한다.
  2. ? RequireInternalSlot(generator, [[AsyncGeneratorState]])를 수행한다.
  3. ? RequireInternalSlot(generator, [[AsyncGeneratorQueue]])를 수행한다.
  4. generator.[[GeneratorBrand]]generatorBrand와 다르면 TypeError 예외를 throw한다.
  5. unused를 반환한다.

27.6.3.4 AsyncGeneratorEnqueue ( generator, completion, promiseCapability )

AsyncGeneratorEnqueue 추상 연산은 generator (AsyncGenerator), completion (Completion Record), promiseCapability (PromiseCapability Record)를 인수로 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. requestAsyncGeneratorRequest { [[Completion]]: completion, [[Capability]]: promiseCapability }를 할당한다.
  2. requestgenerator.[[AsyncGeneratorQueue]]에 추가한다.
  3. unused를 반환한다.

27.6.3.5 AsyncGeneratorCompleteStep ( generator, completion, done [ , realm ] )

AsyncGeneratorCompleteStep 추상 연산은 generator (AsyncGenerator), completion (Completion Record), done (불리언), 선택적 인수 realm (Realm Record)를 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: generator.[[AsyncGeneratorQueue]]는 비어 있지 않아야 한다.
  2. nextgenerator.[[AsyncGeneratorQueue]]의 첫 번째 요소를 할당한다.
  3. generator.[[AsyncGeneratorQueue]]에서 첫 번째 요소를 제거한다.
  4. promiseCapabilitynext.[[Capability]]를 할당한다.
  5. valuecompletion.[[Value]]를 할당한다.
  6. completionthrow completion이면,
    1. ! Call(promiseCapability.[[Reject]], undefined, « value »)를 수행한다.
  7. 그 밖의 경우,
    1. Assert: completion정상 종료(normal completion)이어야 한다.
    2. realm이 존재하면,
      1. oldRealm실행 중인 실행 컨텍스트Realm를 할당한다.
      2. 실행 중인 실행 컨텍스트Realmrealm으로 설정한다.
      3. iteratorResultCreateIteratorResultObject(value, done)를 할당한다.
      4. 실행 중인 실행 컨텍스트RealmoldRealm으로 복원한다.
    3. 그 밖의 경우,
      1. iteratorResultCreateIteratorResultObject(value, done)를 할당한다.
    4. ! Call(promiseCapability.[[Resolve]], undefined, « iteratorResult »)를 수행한다.
  8. unused를 반환한다.

27.6.3.6 AsyncGeneratorResume ( generator, completion )

AsyncGeneratorResume 추상 연산은 generator (AsyncGenerator)와 completion (Completion Record)를 인수로 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: generator.[[AsyncGeneratorState]]suspended-start 또는 suspended-yield이어야 한다.
  2. genContextgenerator.[[AsyncGeneratorContext]]를 할당한다.
  3. callerContext실행 중인 실행 컨텍스트를 할당한다.
  4. callerContext를 중단(suspend)한다.
  5. generator.[[AsyncGeneratorState]]executing로 설정한다.
  6. genContext실행 컨텍스트 스택에 푸시(push)한다; genContext는 이제 실행 중인 실행 컨텍스트이다.
  7. genContext의 중단된 평가를 재개한다, 중단의 결과로 completion을 사용한다. result에 재개된 계산이 반환한 Completion Record를 할당한다.
  8. Assert: result비정상 종료(abrupt completion)가 아니어야 한다.
  9. Assert: 여기서 반환될 때 genContext는 이미 실행 컨텍스트 스택에서 제거되었고 callerContext가 현재 실행 중인 실행 컨텍스트이다.
  10. unused를 반환한다.

27.6.3.7 AsyncGeneratorUnwrapYieldResumption ( resumptionValue )

AsyncGeneratorUnwrapYieldResumption 추상 연산은 resumptionValue (Completion Record)를 인수로 받아 ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 비정상 종료(abrupt completion)를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. resumptionValuereturn completion이 아니면, ? resumptionValue를 반환한다.
  2. awaitedCompletion(Await(resumptionValue.[[Value]]))를 할당한다.
  3. awaitedthrow completion이면, ? awaited를 반환한다.
  4. Assert: awaited정상 종료(normal completion)이어야 한다.
  5. ReturnCompletion(awaited.[[Value]])를 반환한다.

27.6.3.8 AsyncGeneratorYield ( value )

AsyncGeneratorYield 추상 연산은 value (ECMAScript 언어 값)를 인수로 받아 ECMAScript 언어 값를 담은 정상 종료(normal completion) 또는 비정상 종료(abrupt completion)를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. genContext실행 중인 실행 컨텍스트를 할당한다.
  2. Assert: genContext는 generator의 실행 컨텍스트이어야 한다.
  3. generatorgenContext의 Generator 컴포넌트를 할당한다.
  4. Assert: GetGeneratorKind()가 async임을 보장한다.
  5. completionNormalCompletion(value)를 할당한다.
  6. Assert: 실행 컨텍스트 스택에는 최소 두 개의 요소가 있어야 한다.
  7. previousContext실행 컨텍스트 스택의 두 번째(top에서 두 번째) 요소를 할당한다.
  8. previousRealmpreviousContextRealm를 할당한다.
  9. AsyncGeneratorCompleteStep(generator, completion, false, previousRealm)를 수행한다.
  10. queuegenerator.[[AsyncGeneratorQueue]]를 할당한다.
  11. queue가 비어 있지 않으면,
    1. 참고: 실행은 generator를 중단하지 않고 계속된다.
    2. toYieldqueue의 첫 번째 요소를 할당한다.
    3. resumptionValueCompletion(toYield.[[Completion]])를 할당한다.
    4. ? AsyncGeneratorUnwrapYieldResumption(resumptionValue)를 반환한다.
  12. 그 밖의 경우,
    1. generator.[[AsyncGeneratorState]]suspended-yield로 설정한다.
    2. genContext실행 컨텍스트 스택에서 제거하고, 실행 컨텍스트 스택의 최상단에 있는 실행 컨텍스트실행 중인 실행 컨텍스트로 복원한다.
    3. callerContext실행 중인 실행 컨텍스트를 할당한다.
    4. callerContextundefined를 전달하여 재개한다. genContext가 다시 재개된다면 resumptionValue에 재개 시 전달된 Completion Record를 할당한다.
    5. Assert: 여기까지 도달했다면 genContext는 다시 실행 중인 실행 컨텍스트가 되었다.
    6. ? AsyncGeneratorUnwrapYieldResumption(resumptionValue)를 반환한다.

27.6.3.9 AsyncGeneratorAwaitReturn ( generator )

AsyncGeneratorAwaitReturn 추상 연산은 generator (AsyncGenerator)를 인수로 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: generator.[[AsyncGeneratorState]]draining-queue임을 보장한다.
  2. queuegenerator.[[AsyncGeneratorQueue]]를 할당한다.
  3. Assert: queue는 비어 있지 않아야 한다.
  4. nextqueue의 첫 번째 요소를 할당한다.
  5. completionCompletion(next.[[Completion]])를 할당한다.
  6. Assert: completionreturn completion이어야 한다.
  7. promiseCompletionCompletion(PromiseResolve(%Promise%, completion.[[Value]]))를 할당한다.
  8. promiseCompletion비정상 종료(abrupt completion)이면,
    1. AsyncGeneratorCompleteStep(generator, promiseCompletion, true)를 수행한다.
    2. AsyncGeneratorDrainQueue(generator)를 수행한다.
    3. unused를 반환한다.
  9. Assert: promiseCompletion정상 종료(normal completion)이어야 한다.
  10. promisepromiseCompletion.[[Value]]를 할당한다.
  11. fulfilledClosure에 파라미터 (value)를 가지며 generator를 캡처하고 호출 시 다음을 수행하는 새로운 추상 클로저를 할당한다:
    1. Assert: generator.[[AsyncGeneratorState]]draining-queue임을 보장한다.
    2. resultNormalCompletion(value)를 할당한다.
    3. AsyncGeneratorCompleteStep(generator, result, true)를 수행한다.
    4. AsyncGeneratorDrainQueue(generator)를 수행한다.
    5. NormalCompletion(undefined)를 반환한다.
  12. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « »)를 할당한다.
  13. rejectedClosure에 파라미터 (reason)를 가지며 generator를 캡처하고 호출 시 다음을 수행하는 새로운 추상 클로저를 할당한다:
    1. Assert: generator.[[AsyncGeneratorState]]draining-queue임을 보장한다.
    2. resultThrowCompletion(reason)를 할당한다.
    3. AsyncGeneratorCompleteStep(generator, result, true)를 수행한다.
    4. AsyncGeneratorDrainQueue(generator)를 수행한다.
    5. NormalCompletion(undefined)를 반환한다.
  14. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « »)를 할당한다.
  15. PerformPromiseThen(promise, onFulfilled, onRejected)를 수행한다.
  16. unused를 반환한다.

27.6.3.10 AsyncGeneratorDrainQueue ( generator )

AsyncGeneratorDrainQueue 추상 연산은 generator (AsyncGenerator)를 인수로 받아 unused를 반환합니다. 이 연산은 generator의 AsyncGeneratorQueue를 AsyncGeneratorRequestreturn completion을 갖는 경우까지 소진(draining)합니다. 호출 시 다음 단계들을 수행합니다:

  1. Assert: generator.[[AsyncGeneratorState]]draining-queue임을 보장한다.
  2. queuegenerator.[[AsyncGeneratorQueue]]를 할당한다.
  3. queue가 비어 있지 않은 동안 반복한다,
    1. nextqueue의 첫 번째 요소를 할당한다.
    2. completionCompletion(next.[[Completion]])를 할당한다.
    3. completionreturn completion이면,
      1. AsyncGeneratorAwaitReturn(generator)를 수행한다.
      2. unused를 반환한다.
    4. 그 밖의 경우,
      1. completion정상 종료(normal completion)이면,
        1. completionNormalCompletion(undefined)로 설정한다.
      2. AsyncGeneratorCompleteStep(generator, completion, true)를 수행한다.
  4. generator.[[AsyncGeneratorState]]completed로 설정한다.
  5. unused를 반환한다.

27.6.3.11 CreateAsyncIteratorFromClosure ( closure, generatorBrand, generatorPrototype )

CreateAsyncIteratorFromClosure 추상 연산은 closure (파라미터 없는 추상 클로저), generatorBrand (문자열 또는 empty), generatorPrototype (객체)를 인수로 받아 AsyncGenerator를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. 참고: closureAwait 연산과 Yield 연산을 사용하여 IteratorResult 객체를 yield할 수 있습니다.
  2. internalSlotsList에 « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] »를 할당한다.
  3. generatorOrdinaryObjectCreate(generatorPrototype, internalSlotsList)를 할당한다.
  4. generator.[[GeneratorBrand]]generatorBrand로 설정한다.
  5. generator.[[AsyncGeneratorState]]suspended-start로 설정한다.
  6. callerContext실행 중인 실행 컨텍스트를 할당한다.
  7. calleeContext에 새로운 실행 컨텍스트를 할당한다.
  8. calleeContext의 Function을 null로 설정한다.
  9. calleeContextRealm현재 Realm Record로 설정한다.
  10. calleeContext의 ScriptOrModule을 callerContext의 ScriptOrModule로 설정한다.
  11. callerContext가 이미 중단 상태가 아니라면 callerContext를 중단(suspend)한다.
  12. calleeContext실행 컨텍스트 스택에 푸시(push)한다; calleeContext는 이제 실행 중인 실행 컨텍스트이다.
  13. AsyncGeneratorStart(generator, closure)를 수행한다.
  14. calleeContext실행 컨텍스트 스택에서 제거하고 callerContext실행 중인 실행 컨텍스트로 복원한다.
  15. generator를 반환한다.

27.7 AsyncFunction 객체

AsyncFunction은 일반적으로 AsyncFunctionDeclaration, AsyncFunctionExpression, AsyncMethod, AsyncArrowFunction를 평가함으로써 생성되는 함수입니다. 또한 %AsyncFunction% 내장 객체를 호출하여 생성될 수 있습니다.

27.7.1 AsyncFunction 생성자

AsyncFunction 생성자:

  • %AsyncFunction%이다.
  • Function의 서브클래스이다.
  • 함수로 호출될 때 새로운 AsyncFunction을 생성 및 초기화한다. 즉, AsyncFunction(…) 함수 호출은 같은 인자를 가진 new AsyncFunction(…) 객체 생성 표현과 동일하다.
  • 클래스 정의의 extends 절의 값으로 사용될 수 있다. 명시된 AsyncFunction 동작을 상속하고자 하는 서브클래스 생성자는 내장 AsyncFunction 동작에 필요한 내부 슬롯으로 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 AsyncFunction 생성자에 대한 super 호출을 포함해야 한다. ECMAScript의 모든 async 함수 객체 정의 구문은 AsyncFunction의 직접 인스턴스를 생성한다. AsyncFunction 서브클래스의 인스턴스를 생성하는 구문은 존재하지 않는다.

27.7.1.1 AsyncFunction ( ...parameterArgs, bodyArg )

마지막 인수(있다면)는 async 함수의 본문(실행 코드)을 지정하며, 그 앞의 인수들은 형식 매개변수를 지정한다.

이 함수는 호출 시 다음 단계들을 수행한다:

  1. C활성 함수 객체를 할당한다.
  2. bodyArg가 없으면, bodyArg를 빈 문자열로 설정한다.
  3. ? CreateDynamicFunction(C, NewTarget, async, parameterArgs, bodyArg)를 반환한다.
참고
자세한 내용은 20.2.1.1의 NOTE를 참고.

27.7.2 AsyncFunction 생성자의 속성

AsyncFunction 생성자:

  • Function 생성자로부터 상속받는 표준 내장 함수 객체이다.
  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function%이다.
  • "length" 프로퍼티 값은 1𝔽이다.
  • "name" 프로퍼티 값은 "AsyncFunction"이다.
  • 다음 프로퍼티를 가진다:

27.7.2.1 AsyncFunction.prototype

AsyncFunction.prototype의 초기 값은 AsyncFunction 프로토타입 객체이다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 이다.

27.7.3 AsyncFunction 프로토타입 객체의 속성

AsyncFunction 프로토타입 객체:

  • %AsyncFunction.prototype%이다.
  • 일반 객체이다.
  • 함수 객체가 아니며, [[ECMAScriptCode]] 내부 슬롯이나 표 30에 기술된 다른 내부 슬롯을 가지지 않는다.
  • [[Prototype]] 내부 슬롯을 가지며 그 값은 %Function.prototype%이다.

27.7.3.1 AsyncFunction.prototype.constructor

AsyncFunction.prototype.constructor의 초기 값은 %AsyncFunction%이다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 이다.

27.7.3.2 AsyncFunction.prototype [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 프로퍼티의 초기 값은 문자열 "AsyncFunction"입니다.

이 프로퍼티의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 입니다.

27.7.4 AsyncFunction 인스턴스

모든 AsyncFunction 인스턴스는 ECMAScript 함수 객체이며, 표 30에 명시된 내부 슬롯을 갖습니다. 이러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯의 값은 false입니다. AsyncFunction 인스턴스는 생성자가 아니며 [[Construct]] 내부 메서드를 가지지 않습니다. AsyncFunction 인스턴스는 생성 불가능하므로 prototype 프로퍼티를 가지지 않습니다.

각 AsyncFunction 인스턴스는 다음의 자체 프로퍼티를 가집니다:

27.7.4.1 length

"length" 프로퍼티에 대한 Function 인스턴스의 명세(20.2.4.1 참조)는 AsyncFunction 인스턴스에도 적용됩니다.

27.7.4.2 name

"name" 프로퍼티에 대한 Function 인스턴스의 명세(20.2.4.2 참조)는 AsyncFunction 인스턴스에도 적용됩니다.

27.7.5 Async 함수의 추상 연산

27.7.5.1 AsyncFunctionStart ( promiseCapability, asyncFunctionBody )

AsyncFunctionStart 추상 연산은 promiseCapability (PromiseCapability Record)와 asyncFunctionBody (FunctionBody 파싱 노드, ExpressionBody 파싱 노드 또는 파라미터 없는 추상 클로저)를 인수로 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. runningContext실행 중인 실행 컨텍스트를 할당한다.
  2. asyncContextrunningContext의 복사본을 할당한다.
  3. 참고: 실행 상태를 복사하는 것은 AsyncBlockStart가 실행을 재개할 수 있도록 필요합니다. 현재 실행 중인 컨텍스트를 재개하는 것은 잘 정의되지 않습니다.
  4. AsyncBlockStart(promiseCapability, asyncFunctionBody, asyncContext)를 수행한다.
  5. unused를 반환한다.

27.7.5.2 AsyncBlockStart ( promiseCapability, asyncBody, asyncContext )

AsyncBlockStart 추상 연산은 promiseCapability (PromiseCapability Record), asyncBody (파싱 노드 또는 파라미터 없는 추상 클로저), asyncContext (실행 컨텍스트)를 인수로 받아 unused를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. runningContext실행 중인 실행 컨텍스트를 할당한다.
  2. closure에 파라미터 없이 promiseCapabilityasyncBody를 캡처하고 호출 시 다음 단계들을 수행하는 새로운 추상 클로저를 할당한다:
    1. acAsyncContext실행 중인 실행 컨텍스트를 할당한다.
    2. asyncBody파싱 노드이면,
      1. resultCompletion(Evaluation of asyncBody)를 할당한다.
    3. 그 밖의 경우,
      1. Assert: asyncBody는 파라미터 없는 추상 클로저이어야 한다.
      2. resultCompletion(asyncBody())를 할당한다.
    4. Assert: 여기서 반환된다면 async 함수는 예외를 throw했거나 암시적 또는 명시적 return을 수행한 것이다; 모든 await이 완료됨.
    5. acAsyncContext실행 컨텍스트 스택에서 제거하고, 실행 컨텍스트 스택의 최상단에 있는 실행 컨텍스트실행 중인 실행 컨텍스트로 복원한다.
    6. result정상 종료(normal completion)이면,
      1. ! Call(promiseCapability.[[Resolve]], undefined, « undefined »)를 수행한다.
    7. resultreturn completion이면,
      1. ! Call(promiseCapability.[[Resolve]], undefined, « result.[[Value]] »)를 수행한다.
    8. 그 밖의 경우,
      1. Assert: resultthrow completion이어야 한다.
      2. ! Call(promiseCapability.[[Reject]], undefined, « result.[[Value]] »)를 수행한다.
    9. NormalCompletion(unused)를 반환한다.
  3. asyncContext의 코드 평가 상태를 조정하여 해당 실행 컨텍스트가 재개될 때 closure가 인자 없이 호출되도록 한다.
  4. asyncContext실행 컨텍스트 스택에 푸시(push)한다; asyncContext는 이제 실행 중인 실행 컨텍스트이다.
  5. asyncContext의 중단된 평가를 재개한다. result에 재개된 계산의 반환값을 할당한다.
  6. Assert: 여기서 반환될 때 asyncContext는 이미 실행 컨텍스트 스택에서 제거되었고 runningContext가 현재 실행 중인 실행 컨텍스트이다.
  7. Assert: result정상 종료(normal completion)이며 값은 unused이다. 이 값의 가능한 소스는 Await 또는 async 함수가 아무것도 await하지 않는 경우 위 2.i 단계이다.
  8. unused를 반환한다.

27.7.5.3 Await ( value )

Await 추상 연산은 value (ECMAScript 언어 값)를 인수로 받아 ECMAScript 언어 값 또는 empty를 담은 정상 종료(normal completion) 또는 비정상 종료(abrupt completion)를 반환합니다. 호출 시 다음 단계들을 수행합니다:

  1. asyncContext실행 중인 실행 컨텍스트를 할당한다.
  2. promise에 ? PromiseResolve(%Promise%, value)를 할당한다.
  3. fulfilledClosure에 파라미터 (v)를 가지며 asyncContext를 캡처하고 호출 시 다음을 수행하는 새로운 추상 클로저를 할당한다:
    1. prevContext실행 중인 실행 컨텍스트를 할당한다.
    2. prevContext를 중단(suspend)한다.
    3. asyncContext실행 컨텍스트 스택에 푸시(push)한다; asyncContext는 이제 실행 중인 실행 컨텍스트이다.
    4. asyncContext의 중단된 평가를 재개한다, 중단의 결과로 NormalCompletion(v)를 사용한다.
    5. Assert: 이 단계에 도달하면 asyncContext는 이미 실행 컨텍스트 스택에서 제거되었고 prevContext가 현재 실행 중인 실행 컨텍스트이다.
    6. NormalCompletion(undefined)를 반환한다.
  4. onFulfilledCreateBuiltinFunction(fulfilledClosure, 1, "", « »)를 할당한다.
  5. rejectedClosure에 파라미터 (reason)를 가지며 asyncContext를 캡처하고 호출 시 다음을 수행하는 새로운 추상 클로저를 할당한다:
    1. prevContext실행 중인 실행 컨텍스트를 할당한다.
    2. prevContext를 중단(suspend)한다.
    3. asyncContext실행 컨텍스트 스택에 푸시(push)한다; asyncContext는 이제 실행 중인 실행 컨텍스트이다.
    4. asyncContext의 중단된 평가를 재개한다, 중단의 결과로 ThrowCompletion(reason)를 사용한다.
    5. Assert: 이 단계에 도달하면 asyncContext는 이미 실행 컨텍스트 스택에서 제거되었고 prevContext가 현재 실행 중인 실행 컨텍스트이다.
    6. NormalCompletion(undefined)를 반환한다.
  6. onRejectedCreateBuiltinFunction(rejectedClosure, 1, "", « »)를 할당한다.
  7. PerformPromiseThen(promise, onFulfilled, onRejected)를 수행한다.
  8. asyncContext실행 컨텍스트 스택에서 제거하고, 실행 컨텍스트 스택의 최상단에 있는 실행 컨텍스트실행 중인 실행 컨텍스트로 복원한다.
  9. callerContext실행 중인 실행 컨텍스트를 할당한다.
  10. callerContextempty를 전달하여 재개한다. asyncContext가 다시 재개된다면 completion에 재개 시 전달된 Completion Record를 할당한다.
  11. Assert: 여기까지 도달했다면 asyncContext는 다시 실행 중인 실행 컨텍스트가 되었다.
  12. completion을 반환한다.

28 리플렉션

28.1 Reflect 객체

Reflect 객체는 다음과 같다:

  • %Reflect%이다.
  • "Reflect" 속성의 초기값이며, 이는 글로벌 객체의 속성이다.
  • 일반 객체이다.
  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Object.prototype%이다.
  • 함수 객체가 아니다.
  • [[Construct]] 내부 메서드를 가지고 있지 않으므로, new 연산자와 함께 생성자로 사용할 수 없다.
  • [[Call]] 내부 메서드를 가지고 있지 않으므로, 함수로 호출될 수 없다.

28.1.1 Reflect.apply ( target, thisArgument, argumentsList )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. IsCallable(target)이 false이면, TypeError 예외를 발생시킨다.
  2. args를 ? CreateListFromArrayLike(argumentsList)로 한다.
  3. PrepareForTailCall()를 수행한다.
  4. Call(target, thisArgument, args)을 반환한다.

28.1.2 Reflect.construct ( target, argumentsList [ , newTarget ] )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. IsConstructor(target)이 false이면, TypeError 예외를 발생시킨다.
  2. newTarget이 없다면, newTargettarget으로 설정한다.
  3. 그렇지 않고 IsConstructor(newTarget)이 false이면, TypeError 예외를 발생시킨다.
  4. args를 ? CreateListFromArrayLike(argumentsList)로 한다.
  5. Construct(target, args, newTarget)을 반환한다.

28.1.3 Reflect.defineProperty ( target, propertyKey, attributes )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. key를 ? ToPropertyKey(propertyKey)로 한다.
  3. desc를 ? ToPropertyDescriptor(attributes)로 한다.
  4. target.[[DefineOwnProperty]](key, desc)를 반환한다.

28.1.4 Reflect.deleteProperty ( target, propertyKey )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. key를 ? ToPropertyKey(propertyKey)로 한다.
  3. target.[[Delete]](key)를 반환한다.

28.1.5 Reflect.get ( target, propertyKey [ , receiver ] )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. key를 ? ToPropertyKey(propertyKey)로 한다.
  3. receiver가 없다면,
    1. receivertarget으로 설정한다.
  4. target.[[Get]](key, receiver)를 반환한다.

28.1.6 Reflect.getOwnPropertyDescriptor ( target, propertyKey )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. key를 ? ToPropertyKey(propertyKey)로 한다.
  3. desc를 ? target.[[GetOwnProperty]](key)로 한다.
  4. FromPropertyDescriptor(desc)를 반환한다.

28.1.7 Reflect.getPrototypeOf ( target )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. target.[[GetPrototypeOf]]()를 반환한다.

28.1.8 Reflect.has ( target, propertyKey )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. key를 ? ToPropertyKey(propertyKey)로 한다.
  3. target.[[HasProperty]](key)를 반환한다.

28.1.9 Reflect.isExtensible ( target )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. target.[[IsExtensible]]()를 반환한다.

28.1.10 Reflect.ownKeys ( target )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. keys를 ? target.[[OwnPropertyKeys]]()로 한다.
  3. CreateArrayFromList(keys)를 반환한다.

28.1.11 Reflect.preventExtensions ( target )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. target.[[PreventExtensions]]()를 반환한다.

28.1.12 Reflect.set ( target, propertyKey, V [ , receiver ] )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. key를 ? ToPropertyKey(propertyKey)로 한다.
  3. receiver가 없다면,
    1. receivertarget으로 설정한다.
  4. target.[[Set]](key, V, receiver)를 반환한다.

28.1.13 Reflect.setPrototypeOf ( target, proto )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. target객체가 아니면, TypeError 예외를 발생시킨다.
  2. proto객체가 아니고 null도 아니라면, TypeError 예외를 발생시킨다.
  3. target.[[SetPrototypeOf]](proto)를 반환한다.

28.1.14 Reflect [ %Symbol.toStringTag% ]

%Symbol.toStringTag% 속성의 초기값은 문자열 "Reflect"이다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }이다.

28.2 프록시 객체

28.2.1 Proxy 생성자

Proxy 생성자:

  • %Proxy%이다.
  • "Proxy" 속성의 초기값이며, 이는 글로벌 객체의 속성이다.
  • 생성자로 호출될 때 새 Proxy 객체를 생성하고 초기화한다.
  • 함수로 호출되는 것은 의도되지 않았으며, 그렇게 호출하면 예외가 발생한다.

28.2.1.1 Proxy ( target, handler )

이 함수는 호출될 때 다음 절차를 수행한다:

  1. NewTarget이 undefined이면, TypeError 예외를 발생시킨다.
  2. ProxyCreate(target, handler)를 반환한다.

28.2.2 Proxy 생성자의 속성

Proxy 생성자:

  • [[Prototype]] 내부 슬롯을 가지며, 그 값은 %Function.prototype%이다.
  • "prototype" 속성을 가지지 않으며, Proxy 객체는 [[Prototype]] 내부 슬롯의 초기화가 필요하지 않기 때문이다.
  • 다음 속성들을 가진다:

28.2.2.1 Proxy.revocable ( target, handler )

이 함수는 폐기 가능한(revocable) Proxy 객체를 생성한다.

호출 시 다음 절차를 수행한다:

  1. proxy를 ? ProxyCreate(target, handler)로 한다.
  2. revokerClosure를 매개변수가 없고 캡처하지 않는 새로운 추상 클로저로 한다. 이 클로저는 호출 시 다음 절차를 수행한다:
    1. F활성 함수 객체로 한다.
    2. pF.[[RevocableProxy]]로 한다.
    3. pnull이면, NormalCompletion(undefined)을 반환한다.
    4. F.[[RevocableProxy]]null로 설정한다.
    5. Assert: pProxy 이색 객체이다.
    6. p.[[ProxyTarget]]null로 설정한다.
    7. p.[[ProxyHandler]]null로 설정한다.
    8. NormalCompletion(undefined)을 반환한다.
  3. revokerCreateBuiltinFunction(revokerClosure, 0, "", « [[RevocableProxy]] »)로 한다.
  4. revoker.[[RevocableProxy]]proxy로 설정한다.
  5. resultOrdinaryObjectCreate(%Object.prototype%)로 한다.
  6. CreateDataPropertyOrThrow(result, "proxy", proxy)를 수행한다.
  7. CreateDataPropertyOrThrow(result, "revoke", revoker)를 수행한다.
  8. result를 반환한다.

28.3 모듈 네임스페이스 객체

모듈 네임스페이스 객체는 모듈 네임스페이스 이색 객체로, 모듈의 내보낸 바인딩에 런타임 속성 기반 접근을 제공한다. 모듈 네임스페이스 객체에 대한 생성자 함수는 존재하지 않는다. 대신, 각 모듈이 ImportDeclaration에 의해 import될 때, 해당 선언이 NameSpaceImport를 포함한다면 객체가 생성된다.

10.4.6에서 명시된 속성 외에도, 각 모듈 네임스페이스 객체는 다음 고유 속성을 가진다:

28.3.1 %Symbol.toStringTag%

%Symbol.toStringTag% 속성의 초기값은 문자열 "Module"이다.

이 속성의 특성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }이다.

29 메모리 모델

메모리 일관성 모델, 즉 메모리 모델공유 데이터 블록 이벤트의 가능한 순서를 명시한다. 이는 SharedArrayBuffer를 지원하는 TypedArray 인스턴스를 통해 접근하거나 Atomics 객체의 메서드를 통해 발생한다. 프로그램에 데이터 경쟁(아래 정의됨)이 없다면, 이벤트의 순서는 순차적으로 일관성 있게 나타난다. 즉, 각 에이전트의 동작들이 교차(interleaving)되는 형태로 보인다. 프로그램에 데이터 경쟁이 존재하면, 공유 메모리 연산의 결과가 순차적으로 일관성 있게 나타나지 않을 수 있다. 예를 들어, 프로그램에서 인과관계를 위반하는 동작이나 놀라운 현상이 나타날 수 있다. 이러한 놀라움은 컴파일러 변환과 CPU 설계(예: 순서가 뒤바뀐 실행, 추측 실행)에서 비롯된다. 메모리 모델은 프로그램이 순차적으로 일관성 있는 동작을 나타내는 정확한 조건과 데이터 경쟁에서 읽힐 수 있는 값의 가능성을 정의한다. 즉, 미정의 동작(undefined behaviour)은 없다.

메모리 모델은 SharedArrayBuffer에 대한 추상 연산이나 Atomics 객체의 메서드가 평가 중에 도입한 이벤트들에 대한 관계적 제약으로 정의된다.

참고

이 절에서는 SharedArrayBuffer에 대한 추상 연산이 도입하는 이벤트에 대한 공리적(axiomatic) 모델을 제공한다. 이 모델은 본 명세의 다른 부분과 달리 알고리즘적으로 표현될 수 없음을 강조한다. 추상 연산에 의해 이벤트가 비결정적으로 도입되는 것은 ECMAScript 평가의 연산적 의미와 메모리 모델의 공리적 의미 사이의 인터페이스이다. 이러한 이벤트의 의미는 평가 중의 모든 이벤트 그래프를 고려하여 정의된다. 이것은 정적 의미론도, 실행 시 의미론도 아니다. 알고리즘적 구현이 입증된 바 없으며, 특정 이벤트 그래프가 허용되는지 아닌지를 결정하는 제약 집합만 존재한다.

29.1 메모리 모델의 기본

공유 메모리 접근(읽기 및 쓰기)은 아래와 같이 두 그룹, 원자적 접근과 데이터 접근으로 나뉜다. 원자적 접근은 순차적으로 일관성 있게 처리된다. 즉, 에이전트 클러스터의 모든 에이전트가 엄격한 전체 순서(total ordering)에 동의한다. 비원자적 접근은 모든 에이전트가 동의하는 엄격한 전체 순서를 가지지 않으며, 즉 순서가 없다.

참고 1

순차적으로 일관성 있는 순서보다 약하고, 무순서보다 강한 release-acquire와 같은 순서는 지원되지 않는다.

공유 데이터 블록 이벤트는 다음 중 하나이다: ReadSharedMemory, WriteSharedMemory, 또는 ReadModifyWriteSharedMemory 레코드.

표 96: ReadSharedMemory 이벤트 필드
필드 이름 의미
[[Order]] seq-cst 또는 unordered 이벤트에 대해 메모리 모델이 보장하는 가장 약한 순서.
[[NoTear]] 불리언 이 이벤트가 동일 범위의 여러 쓰기 이벤트로부터 읽는 것이 허용되는지 여부.
[[Block]] 공유 데이터 블록 이벤트가 동작하는 블록.
[[ByteIndex]] 음이 아닌 정수 [[Block]] 내에서 읽기의 바이트 주소.
[[ElementSize]] 음이 아닌 정수 읽기의 크기.
표 97: WriteSharedMemory 이벤트 필드
필드 이름 의미
[[Order]] seq-cst, unordered, 또는 init 이벤트에 대해 메모리 모델이 보장하는 가장 약한 순서.
[[NoTear]] 불리언 이 이벤트가 동일 범위의 여러 읽기 이벤트로부터 읽히는 것이 허용되는지 여부.
[[Block]] 공유 데이터 블록 이벤트가 동작하는 블록.
[[ByteIndex]] 음이 아닌 정수 [[Block]] 내에서 쓰기의 바이트 주소.
[[ElementSize]] 음이 아닌 정수 쓰기의 크기.
[[Payload]] 리스트 형태의 바이트 값 다른 이벤트에 의해 읽히도록 리스트 형태의 바이트 값을 제공한다.
표 98: ReadModifyWriteSharedMemory 이벤트 필드
필드 이름 의미
[[Order]] seq-cst 읽기-수정-쓰기 이벤트는 항상 순차적으로 일관성 있다.
[[NoTear]] true 읽기-수정-쓰기 이벤트는 찢김(tear)이 발생하지 않는다.
[[Block]] 공유 데이터 블록 이벤트가 동작하는 블록.
[[ByteIndex]] 음이 아닌 정수 [[Block]] 내에서 읽기-수정-쓰기의 바이트 주소.
[[ElementSize]] 음이 아닌 정수 읽기-수정-쓰기의 크기.
[[Payload]] 리스트 형태의 바이트 값 [[ModifyOp]]에 전달되는 리스트 형태의 바이트 값.
[[ModifyOp]] 읽기-수정-쓰기 수정 함수 읽은 리스트 형태의 바이트 값[[Payload]]을 받아 수정된 리스트 형태의 바이트 값을 반환하는 추상 클로저.

이러한 이벤트는 추상 연산 또는 Atomics 객체의 메서드에 의해 도입된다.

일부 연산은 Synchronize 이벤트도 도입할 수 있다. Synchronize 이벤트는 필드가 없으며, 오직 다른 이벤트의 허용되는 순서에 직접적으로 제약을 주기 위해 존재한다.

공유 데이터 블록 및 Synchronize 이벤트 외에도 호스트 특화 이벤트가 존재한다.

ReadSharedMemory, WriteSharedMemory, 또는 ReadModifyWriteSharedMemory 이벤트의 range는 [[ByteIndex]]에서 [[ByteIndex]] + [[ElementSize]] - 1까지의 연속된 정수 집합이다. 두 이벤트의 range가 동일하다는 것은 두 이벤트가 같은 [[Block]]을 가지고 있고, range가 요소별로 같음을 의미한다. 두 이벤트의 range가 겹친다는 것은 두 이벤트가 같은 [[Block]]을 가지고 있으나, range가 같지 않으며 그 교집합이 비어 있지 않음을 의미한다. 두 이벤트의 range가 분리(disjoint)된다는 것은 두 이벤트가 같은 [[Block]]을 가지지 않거나, range가 같지도 겹치지도 않는 경우이다.

참고 2

고려해야 하는 호스트 특화 동기화 이벤트 예시로는: 한 에이전트에서 다른 에이전트로 SharedArrayBuffer를 보내는 것(예: 브라우저에서 postMessage 사용), 에이전트의 시작과 종료, 에이전트 클러스터 내에서 공유 메모리 외의 채널을 통해 통신하는 것 등이 있다. 특정 실행 execution의 경우, 이러한 이벤트는 호스트host-synchronizes-with 엄격 부분 순서(strict partial order)를 통해 제공한다. 또한, 호스트execution.[[EventList]]호스트 특화 동기화 이벤트를 추가하여 is-agent-order-before 관계(Relation)에 참여할 수 있다.

이벤트들은 아래에서 정의된 관계를 통해 후보 실행 내에서 순서가 정해진다.

29.2 에이전트 이벤트 레코드

에이전트 이벤트 레코드는 다음 필드를 가진 레코드이다.

표 99: 에이전트 이벤트 레코드 필드
필드 이름 의미
[[AgentSignifier]] 에이전트 식별자 이 순서를 도출한 에이전트.
[[EventList]] 이벤트 리스트 평가 중에 리스트에 이벤트가 추가된다.
[[AgentSynchronizesWith]] Synchronize 이벤트 쌍 리스트 연산 의미론에 의해 도입된 Synchronize 관계.

29.3 선택된 값 레코드

선택된 값 레코드는 다음 필드를 가진 레코드이다.

표 100: 선택된 값 레코드 필드
필드 이름 의미
[[Event]] 공유 데이터 블록 이벤트 이 선택된 값에 대해 도입된 ReadSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트.
[[ChosenValue]] 바이트 값 리스트 평가 중에 비결정적으로 선택된 바이트 값들.

29.4 후보 실행

후보 실행에이전트 클러스터의 평가에 대한 레코드이며, 다음 필드를 가진다.

표 101: 후보 실행 레코드 필드
필드 이름 의미
[[EventsRecords]] 에이전트 이벤트 레코드 리스트 에이전트를 평가 중 추가된 이벤트의 리스트에 매핑한다.
[[ChosenValues]] 선택된 값 레코드 리스트 ReadSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트를 평가 중 선택된 바이트 값 리스트에 매핑한다.

빈 후보 실행은 모든 필드가 빈 리스트인 후보 실행 레코드이다.

29.5 메모리 모델을 위한 추상 연산

29.5.1 EventSet ( execution )

추상 연산 EventSet은 인수 execution (후보 실행)을 받아 이벤트 집합을 반환한다. 호출 시 다음 절차를 수행한다:

  1. events를 빈 집합으로 한다.
  2. execution.[[EventsRecords]]의 각 에이전트 이벤트 레코드 aer에 대해,
    1. aer.[[EventList]]의 각 이벤트 E에 대해
      1. Eevents에 추가한다.
  3. events를 반환한다.

29.5.2 SharedDataBlockEventSet ( execution )

추상 연산 SharedDataBlockEventSet은 인수 execution (후보 실행)을 받아 이벤트 집합을 반환한다. 호출 시 다음 절차를 수행한다:

  1. events를 빈 집합으로 한다.
  2. EventSet(execution)의 각 이벤트 E에 대해
    1. EReadSharedMemory, WriteSharedMemory, 또는 ReadModifyWriteSharedMemory 이벤트이면, Eevents에 추가한다.
  3. events를 반환한다.

29.5.3 HostEventSet ( execution )

추상 연산 HostEventSet은 인수 execution (후보 실행)을 받아 이벤트 집합을 반환한다. 호출 시 다음 절차를 수행한다:

  1. events를 빈 집합으로 한다.
  2. EventSet(execution)의 각 이벤트 E에 대해
    1. ESharedDataBlockEventSet(execution)에 포함되어 있지 않으면, Eevents에 추가한다.
  3. events를 반환한다.

29.5.4 ComposeWriteEventBytes ( execution, byteIndex, Ws )

추상 연산 ComposeWriteEventBytes는 인수 execution (후보 실행), byteIndex (음이 아닌 정수), Ws (WriteSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트 리스트) 를 받아 바이트 값 리스트를 반환한다. 호출 시 다음 절차를 수행한다:

  1. byteLocationbyteIndex로 한다.
  2. bytesRead를 새 빈 리스트로 한다.
  3. Ws의 각 요소 W에 대해,
    1. Assert: W가 자신의 range에 byteLocation을 포함함.
    2. payloadIndexbyteLocation - W.[[ByteIndex]]로 한다.
    3. WWriteSharedMemory 이벤트라면,
      1. byteW.[[Payload]][payloadIndex]로 한다.
    4. 그렇지 않다면,
      1. Assert: WReadModifyWriteSharedMemory 이벤트임.
      2. bytesValueOfReadEvent(execution, W)로 한다.
      3. bytesModifiedW.[[ModifyOp]](bytes, W.[[Payload]])로 한다.
      4. bytebytesModified[payloadIndex]로 한다.
    5. bytebytesRead에 추가한다.
    6. byteLocationbyteLocation + 1로 한다.
  4. bytesRead를 반환한다.
참고 1

읽기-수정-쓰기 수정 [[ModifyOp]]ReadModifyWriteSharedMemory 이벤트를 도입하는 Atomics 객체의 함수 속성에 의해 제공된다.

참고 2

이 추상 연산은 여러 쓰기 이벤트를 리스트로 조합하여 바이트 값 리스트로 만든다. 이는 ReadSharedMemoryReadModifyWriteSharedMemory 이벤트의 이벤트 의미론에서 사용된다.

29.5.5 ValueOfReadEvent ( execution, R )

추상 연산 ValueOfReadEvent는 인수 execution (후보 실행), R (ReadSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트) 를 받아 바이트 값 리스트를 반환한다. 호출 시 다음 절차를 수행한다:

  1. Wsreads-bytes-from(R) in execution로 한다.
  2. Assert: WsR.[[ElementSize]]와 길이가 같은 WriteSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트 리스트임.
  3. ComposeWriteEventBytes(execution, R.[[ByteIndex]], Ws)를 반환한다.

29.6 후보 실행의 관계

다음 관계와 수학적 함수들은 특정 후보 실행을 매개변수로 하며, 해당 이벤트들을 순서화한다.

29.6.1 is-agent-order-before

후보 실행 execution에 대해, is-agent-order-before 관계는 다음을 만족하는 이벤트들에 대한 최소 관계이다.

  • 이벤트 ED에 대해, execution에서 E is-agent-order-before D가 성립하려면, execution.[[EventsRecords]]에 어떤 에이전트 이벤트 레코드 aer가 존재하고, aer.[[EventList]]ED가 모두 포함되어 있으며 Eaer.[[EventList]]리스트 순서에서 D 앞에 있을 때 성립한다.
참고

에이전트는 평가 중에 에이전트별 에이전트 엄격 전체 순서(strict total order)로 이벤트를 도입한다. 이는 그러한 엄격 전체 순서의 합집합이다.

29.6.2 reads-bytes-from

후보 실행 execution에 대해, reads-bytes-from 함수는 SharedDataBlockEventSet(execution)의 이벤트를 리스트 형태의 SharedDataBlockEventSet(execution)의 이벤트로 매핑하는 수학적 함수이며, 다음 조건을 만족한다.

후보 실행은 항상 reads-bytes-from 함수를 허용한다.

29.6.3 reads-from

후보 실행 execution에 대해, reads-from 관계는 다음을 만족하는 이벤트들에 대한 최소 관계이다.

  • 이벤트 RW에 대해, SharedDataBlockEventSet(execution)에 RW가 모두 포함되어 있고, reads-bytes-from(R) in executionW가 포함되어 있을 때, execution에서 R reads-from W가 성립한다.

29.6.4 host-synchronizes-with

후보 실행 execution에 대해, host-synchronizes-with 관계호스트가 제공하는 엄격 부분 순서(strict partial order)이며, 호스트 특화 이벤트에 대해 최소한 다음을 만족한다.

  • execution에서 E host-synchronizes-with D라면, HostEventSet(execution)에 ED가 포함되어 있다.
  • host-synchronizes-with와 is-agent-order-before의 합집합에 순환(cycle)이 없다.
참고 1

호스트 특화 이벤트 ED후보 실행 execution에 있을 때, execution에서 E host-synchronizes-with D라면, Ehappens-before D임을 의미한다.

참고 2

관계호스트가 HTML 워커 간 postMessage와 같은 추가 동기화 메커니즘을 제공할 수 있게 한다.

29.6.5 synchronizes-with

후보 실행 execution에 대해, synchronizes-with 관계는 다음을 만족하는 이벤트들에 대한 최소 관계이다.

  • 이벤트 RW에 대해, execution에서 W synchronizes-with R가 성립하려면, Rreads-from W이며, R.[[Order]]W.[[Order]]가 모두 seq-cst이고, RW의 range가 동일해야 한다.
  • execution.[[EventsRecords]]의 각 요소 eventsRecord에 대해, 아래가 성립한다.
    • 이벤트 SSw에 대해, execution에서 S synchronizes-with Sw가 성립하려면 eventsRecord.[[AgentSynchronizesWith]]에 (S, Sw)가 포함되어 있어야 한다.
  • 이벤트 ED에 대해, execution에서 E synchronizes-with D가 성립하려면, execution.[[HostSynchronizesWith]]에 (E, D)가 포함되어 있어야 한다.
참고 1

메모리 모델 문헌의 관례에 따라, 후보 실행 execution에서 write 이벤트가 read 이벤트와 synchronizes-with 관계를 맺지, 반대로 하지 않는다.

참고 2

후보 실행 execution에서 init 이벤트는 이 관계에 참여하지 않고, 대신 happens-before에 의해 직접 제약된다.

참고 3

후보 실행 execution에서 seq-cst 이벤트가 reads-from으로 연결되어 있다고 모두 synchronizes-with로 연결되는 것은 아니다. range가 동일한 이벤트만 synchronizes-with로 연결된다.

참고 4

공유 데이터 블록 이벤트 RW후보 실행 execution에 있고, WR와 synchronizes-with 관계라면, RW 이외의 다른 write를 reads-from할 수도 있다.

29.6.6 happens-before

후보 실행 execution에 대해, happens-before 관계는 다음을 만족하는 이벤트들에 대한 최소 관계이다.

  • 이벤트 ED에 대해, execution에서 E happens-before D가 성립하려면, 아래 조건 중 어느 하나라도 참이어야 한다.

참고

happens-before는 에이전트-order의 상위 집합이므로, 후보 실행은 ECMAScript의 단일 스레드 평가 의미론과 일치한다.

29.7 유효 실행의 속성

29.7.1 유효하게 선택된 읽기

후보 실행 execution이 유효하게 선택된 읽기를 가지려면 아래 알고리즘이 true를 반환해야 한다.

  1. ReadSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트 RSharedDataBlockEventSet(execution)에 있을 때, 아래를 수행한다:
    1. chosenValueRecordexecution.[[ChosenValues]]에서 [[Event]] 필드가 R인 요소로 한다.
    2. chosenValuechosenValueRecord.[[ChosenValue]]로 한다.
    3. readValueValueOfReadEvent(execution, R)로 한다.
    4. chosenLenchosenValue의 요소 개수로 한다.
    5. readLenreadValue의 요소 개수로 한다.
    6. chosenLenreadLen이면,
      1. false를 반환한다.
    7. 0(포함)부터 chosenLen(불포함)까지의 정수 i 중 어떤 i에 대해 chosenValue[i] ≠ readValue[i]이면,
      1. false를 반환한다.
  2. true를 반환한다.

29.7.2 일관된(coherent) 읽기

후보 실행 execution이 일관된 읽기를 가지려면 아래 알고리즘이 true를 반환해야 한다.

  1. ReadSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트 RSharedDataBlockEventSet(execution)에 있을 때, 아래를 수행한다:
    1. Wsreads-bytes-from(R) in execution으로 한다.
    2. byteLocationR.[[ByteIndex]]로 한다.
    3. Ws의 각 요소 W에 대해,
      1. execution에서 R happens-before W이면,
        1. false를 반환한다.
      2. byteLocation을 자신의 range에 포함하는 WriteSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트 V가 존재하며 execution에서 W happens-before V이고 V happens-before R이면,
        1. false를 반환한다.
      3. byteLocationbyteLocation + 1로 한다.
  2. true를 반환한다.

29.7.3 찢김 없는(tear free) 읽기

후보 실행 execution이 찢김 없는 읽기를 가지려면 아래 알고리즘이 true를 반환해야 한다.

  1. ReadSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트 RSharedDataBlockEventSet(execution)에 있을 때, 아래를 수행한다:
    1. R.[[NoTear]]true라면,
      1. Assert: R.[[ByteIndex]]R.[[ElementSize]]로 나눈 나머지가 0이어야 한다.
      2. execution에서 R reads-from W이고 W.[[NoTear]]true인 모든 이벤트 W에 대해,
        1. RW의 range가 같고, 동일한 range를 가지는 Shared Data Block event V가 존재하며 V.[[NoTear]]true이고, WV가 동일 이벤트가 아니며, execution에서 R reads-from V이면,
          1. false를 반환한다.
  2. true를 반환한다.
참고

이벤트의 [[NoTear]] 필드는 해당 이벤트가 정수형 TypedArray에 접근해서 도입된 경우 true이고, 부동소수점형 TypedArray나 DataView로 도입된 경우 false이다.

직관적으로 이 요구사항은, 정수형 TypedArray를 통해 메모리 범위에 정렬된 방식으로 접근할 때, 해당 범위에 대한 단일 쓰기 이벤트가 다른 동일 범위의 쓰기 이벤트들과 데이터 경쟁 시 "승리"해야 한다는 뜻이다. 더 정확히는, 정렬된 읽기 이벤트가 동일한 범위의 여러 다른 쓰기 이벤트의 바이트를 조합하여 값을 읽을 수 없다는 뜻이다. 하지만, 정렬된 읽기 이벤트가 범위가 겹치는 여러 쓰기 이벤트로부터 읽는 것은 가능하다.

29.7.4 순차적으로 일관성 있는 아토믹 연산(Sequentially Consistent Atomics)

후보 실행 execution에 대해, is-memory-order-before엄격 전체 순서(strict total order)이며, EventSet(execution)의 모든 이벤트에 대해 다음을 만족해야 한다.

후보 실행이 순차적으로 일관성 있는 아토믹 연산을 가지려면 is-memory-order-before 관계가 존재해야 한다.

참고 3

is-memory-order-before는 EventSet(execution)의 모든 이벤트를 포함하지만, happens-beforesynchronizes-with에 의해 제약받지 않는 이벤트들은 순서 내에서 아무 위치에나 올 수 있다.

29.7.5 유효한 실행

후보 실행 execution이 유효한 실행(또는 간단히 실행)임을 만족하려면 아래 모든 조건을 만족해야 한다.

모든 프로그램은 적어도 하나의 유효한 실행을 가진다.

29.8 경쟁

실행 executionSharedDataBlockEventSet(execution)에 포함된 이벤트 ED에 대해서, 아래 알고리즘이 true를 반환하면 ED경쟁(race) 상태에 있다.

  1. ED가 동일한 Shared Data Block event가 아니라면,
    1. E happens-before D (실행 execution 기준) 및 D happens-before E (실행 execution 기준)이 모두 참이 아닌 경우,
      1. ED가 둘 다 WriteSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트이고, ED의 range가 분리되어 있지 않다면,
        1. true를 반환한다.
      2. E reads-from D (실행 execution 기준) 또는 D reads-from E (실행 execution 기준)이라면,
        1. true를 반환한다.
  2. false를 반환한다.

29.9 데이터 경쟁

실행 executionSharedDataBlockEventSet(execution)에 포함된 이벤트 ED에 대해서, 아래 알고리즘이 true를 반환하면 ED데이터 경쟁(data race) 상태에 있다.

  1. ED경쟁 상태(실행 execution 기준)라면,
    1. E.[[Order]]seq-cst가 아니거나 D.[[Order]]seq-cst가 아니라면,
      1. true를 반환한다.
    2. ED의 range가 겹친다면,
      1. true를 반환한다.
  2. false를 반환한다.

29.10 데이터 경쟁 없음

실행 execution데이터 경쟁 없음(data race free)이려면 SharedDataBlockEventSet(execution)에 포함된 두 이벤트가 데이터 경쟁 상태가 아니어야 한다.

모든 실행이 데이터 경쟁 없음이면 해당 프로그램은 데이터 경쟁 없음이다.

메모리 모델은 데이터 경쟁이 없는 프로그램의 모든 이벤트에 대해 순차적 일관성을 보장한다.

29.11 공유 메모리 가이드라인

참고 1

아래는 ECMAScript 프로그래머가 공유 메모리를 사용할 때의 가이드라인이다.

프로그램을 데이터 경쟁 없음 상태로 유지하는 것을 추천한다. 즉, 동일한 메모리 위치에서 동시적인 비원자적 연산이 불가능하도록 한다. 데이터 경쟁 없음 프로그램은 각 에이전트의 평가 의미론 단계가 서로 교차(interleaved)된다. 데이터 경쟁 없음 프로그램의 경우, 메모리 모델의 세부사항을 알 필요가 없다. 세부사항을 이해하는 것이 ECMAScript를 더 잘 작성하는 데 직관을 제공하지 않는다.

더 일반적으로, 프로그램이 데이터 경쟁 없음이 아니더라도, 원자적 연산이 데이터 경쟁에 연루되지 않고 경쟁하는 연산들이 모두 동일한 접근 크기를 갖는다면 예측 가능한 동작을 할 수 있다. 원자적 연산이 경쟁에 연루되지 않도록 하는 가장 쉬운 방법은 원자적과 비원자적 연산이 서로 다른 메모리 셀을 사용하도록 하거나, 서로 다른 크기의 원자적 접근이 동시에 같은 셀에 접근하지 않게 하는 것이다. 효과적으로 프로그램은 공유 메모리를 최대한 강타입(strongly typed)으로 취급해야 한다. 비원자적 경쟁 접근의 순서와 타이밍에 의존할 수 없지만, 메모리를 강타입으로 다루면 경쟁 접근이 "찢기지(tear)" 않는다(값의 여러 비트가 섞이지 않는다).

참고 2

아래는 공유 메모리를 사용하는 프로그램에 대해 컴파일러 변환을 작성하는 ECMAScript 구현자에 대한 가이드라인이다.

단일 에이전트 환경에서 유효한 대부분의 프로그램 변환을 다중 에이전트 환경에서도 허용하는 것이 바람직하다. 이는 다중 에이전트 프로그램에서 각 에이전트의 성능이 단일 에이전트 환경과 같도록 보장한다. 이러한 변환은 판단하기 어려운 경우가 많다. 아래에 메모리 모델에 의해 암시되거나 그보다 강한 규칙을 일부 제시하지만, 모두를 망라하지는 않는다. 이 규칙들은 is-agent-order-before 관계를 구성하는 이벤트 도입 이전의 프로그램 변환에 적용된다.

에이전트 순서 슬라이스(agent-order slice)란 단일 에이전트에 대한 is-agent-order-before 관계의 부분집합이다.

읽기 이벤트의 가능한 읽기 값(possible read values)은 해당 이벤트에 대해 모든 유효 실행에 걸친 ValueOfReadEvent의 값 집합이다.

공유 메모리가 없는 경우에 유효한 에이전트 순서 슬라이스의 변환은 공유 메모리 환경에서도 다음 예외를 제외하고 유효하다.

  • 아토믹은 변경 불가(Atomics are carved in stone): 프로그램 변환은 에이전트 순서 슬라이스의 seq-cst 이벤트가 unordered 연산과 재배열되거나, seq-cst 연산끼리 재배열되거나, seq-cst 연산이 is-agent-order-before 관계에서 제거되는 것을 초래해서는 안 된다.

    (실제로 재배열 금지는 컴파일러가 모든 seq-cst 연산을 동기화로 간주하고, 최종 is-memory-order-before 관계에 포함되도록 강제한다. 이는 인터-에이전트 프로그램 분석이 없는 경우에도 일반적으로 가정하는 사항이다. 또한, 컴파일러는 호출 대상의 memory-order 효과를 알 수 없는 모든 호출을 seq-cst 연산을 포함하는 것으로 간주해야 한다.)

  • 읽기는 안정적이어야 한다(Reads must be stable): 단일 공유 메모리 읽기는 실행 내에서 하나의 값만 관측해야 한다.

    (예를 들어, 프로그램에서 의미적으로 단일 읽기가 여러 번 실행된다면, 이후에는 읽은 값 중 하나만 관측해야 한다. rematerialization이라 불리는 변환은 이 규칙을 위반할 수 있다.)

  • 쓰기는 안정적이어야 한다(Writes must be stable): 공유 메모리에 대한 모든 관측 가능한 쓰기는 실행의 프로그램 의미론을 따라야 한다.

    (예를 들어, 변환이 관측 가능한 쓰기를 도입해서는 안 된다. 예를 들어 더 큰 위치에서 읽기-수정-쓰기 연산을 사용해 더 작은 데이터를 쓰거나, 프로그램이 쓸 수 없는 값을 메모리에 쓰거나, 읽은 값을 다시 해당 위치에 쓰는 경우 등. 만약 해당 위치가 읽기 이후 다른 에이전트에 의해 덮어쓸 수 있다면 해당 변환은 허용되지 않는다.)

  • 가능한 읽기 값은 비어 있지 않아야 한다(Possible read values must be non-empty): 프로그램 변환은 공유 메모리 읽기의 가능한 읽기 값을 비워서는 안 된다.

    (직관에 반하지만, 이 규칙은 사실 쓰기 변환을 제한한다. 쓰기는 메모리 모델 내에서 읽기 이벤트에 의해 읽힐 수 있도록 힘을 가진다. 예를 들어, 쓰기를 이동시키거나 합치거나 때로는 두 seq-cst 연산 사이에 재배열할 수 있지만, 위치를 업데이트하는 모든 쓰기를 제거해서는 안 된다. 최소한 하나의 쓰기는 남겨야 한다.)

유효한 변환 예시: 동일 위치에 대한 여러 비원자적 읽기 합치기, 비원자적 읽기 재배열, 추측적 비원자적 읽기 도입, 동일 위치에 대한 여러 비원자적 쓰기 합치기, 서로 다른 위치에 대한 비원자적 쓰기 재배열, 반복문 밖으로 비원자적 읽기 올리기(종료 조건에 영향이 있더라도). 일반적으로 aliased TypedArrays는 위치가 서로 다름을 증명하기 어렵게 만든다.

참고 3

아래는 공유 메모리 접근에 대해 머신 코드를 생성하는 ECMAScript 구현자에 대한 가이드라인이다.

ARM이나 Power보다 약하지 않은 메모리 모델을 가진 아키텍처에서는, 비원자적 저장 및 로드는 타겟 아키텍처에서 단순 저장 및 로드로 컴파일될 수 있다. 원자적 저장 및 로드는 순차적 일관성을 보장하는 명령어로 컴파일될 수 있다. 그러한 명령어가 없다면, 메모리 배리어를 사용해야 하며, 저장 또는 로드 양쪽에 배리어를 둔다. 읽기-수정-쓰기 연산은 타겟 아키텍처의 읽기-수정-쓰기 명령어로 컴파일될 수 있다. 예를 들어 x86의 LOCK 프리픽스 명령어, ARM의 load-exclusive/store-exclusive, Power의 load-link/store-conditional 등이 있다.

특히, 메모리 모델은 다음과 같은 코드 생성을 허용한다.

  • 프로그램의 모든 원자적 연산은 반드시 필요하다고 간주한다.
  • 원자적 연산은 서로 또는 비원자적 연산과 재배열되지 않는다.
  • 함수는 항상 원자적 연산을 수행한다고 가정한다.
  • 원자적 연산은 더 큰 데이터에 대한 읽기-수정-쓰기 연산으로 구현되지 않고, 적절한 크기의 원자적 연산이 없는 플랫폼에서는 lock-free가 아닌 원자적으로 구현된다. (모든 플랫폼은 모든 관련 크기의 정상적 메모리 접근 연산을 반드시 제공한다고 이미 가정함.)

단순 코드 생성 패턴은 다음과 같다:

  • 일반적인 로드와 스토어는 단일 로드, 스토어 명령어로 컴파일된다.
  • 락-프리(lock-free) 원자적 로드와 스토어는 전체(순차적으로 일관성 있는) 펜스, 일반 로드 또는 스토어, 전체 펜스로 컴파일된다.
  • 락-프리 원자적 읽기-수정-쓰기 접근은 전체 펜스, 원자적 읽기-수정-쓰기 명령어 시퀀스, 전체 펜스로 컴파일된다.
  • 락-프리 아닌 원자적 연산은 스핀락 획득, 전체 펜스, 일련의 비원자적 로드와 스토어 명령어, 전체 펜스, 스핀락 해제로 컴파일된다.

이 매핑은 주소 범위에 대한 원자적 연산이 비원자적 쓰기나 크기가 다른 원자적 연산과 경쟁하지 않는 한 올바르다. 실제로 이것만 필요하다. 메모리 모델은 경쟁에 연루된 원자적 연산을 사실상 비원자적으로 취급한다. 반면 단순 매핑은 매우 강력하다. 원자적 연산이 순차적으로 일관성 있는 펜스로 사용되는 것을 허용하는데, 메모리 모델은 실제로 이를 보장하지 않는다.

기본 패턴에 대한 로컬 개선도 메모리 모델의 제약 내에서 허용된다. 예를 들어:

  • 플랫폼 의존적인 개선으로 불필요한 펜스를 제거할 수 있다. 예를 들어 x86에서는 락-프리 원자적 로드와 스토어 주변의 펜스는 스토어 뒤 펜스 이외에는 항상 생략 가능하며, 락-프리 원자적 읽기-수정-쓰기 명령에는 펜스가 필요 없다. 이들은 모두 LOCK 프리픽스 명령을 사용하기 때문이다. 많은 플랫폼에는 여러 강도의 펜스가 있고, 순차적 일관성을 해치지 않는 한 약한 펜스를 특정 상황에서 사용할 수 있다.
  • 대부분의 현대 플랫폼은 ECMAScript 아토믹이 요구하는 모든 데이터 크기에 대해 락-프리 아토믹을 지원한다. 락-프리 아닌 아토믹이 필요하다면, 아토믹 연산 본문 주변의 펜스는 보통 락/언락 단계에 합칠 수 있다. 락-프리 아닌 아토믹의 가장 간단한 방법은 SharedArrayBuffer마다 하나의 락 워드를 두는 것이다.
  • 더 복잡한 플랫폼 의존적 개선도 있는데, 코드 분석이 필요하다. 예를 들어 두 개의 연속된 펜스는 한 번의 펜스와 같은 효과를 가지므로, 두 원자적 연산을 연이어 코드로 생성한다면 펜스를 한 번만 넣으면 된다. x86에서는 원자적 스토어 사이의 펜스도 생략 가능하다. 스토어 뒤 펜스는 이후의 로드와 분리할 때만 필요하다.

부록 A (설명용) 문법 요약

A.1 어휘 문법

SourceCharacter :: any Unicode code point InputElementDiv :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator RightBracePunctuator InputElementRegExp :: WhiteSpace LineTerminator Comment CommonToken RightBracePunctuator RegularExpressionLiteral InputElementRegExpOrTemplateTail :: WhiteSpace LineTerminator Comment CommonToken RegularExpressionLiteral TemplateSubstitutionTail InputElementTemplateTail :: WhiteSpace LineTerminator Comment CommonToken DivPunctuator TemplateSubstitutionTail InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral WhiteSpace :: <TAB> <VT> <FF> <ZWNBSP> <USP> LineTerminator :: <LF> <CR> <LS> <PS> LineTerminatorSequence :: <LF> <CR> [lookahead ≠ <LF>] <LS> <PS> <CR> <LF> Comment :: MultiLineComment SingleLineComment MultiLineComment :: /* MultiLineCommentCharsopt */ MultiLineCommentChars :: MultiLineNotAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt PostAsteriskCommentChars :: MultiLineNotForwardSlashOrAsteriskChar MultiLineCommentCharsopt * PostAsteriskCommentCharsopt MultiLineNotAsteriskChar :: SourceCharacter but not * MultiLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or * SingleLineComment :: // SingleLineCommentCharsopt SingleLineCommentChars :: SingleLineCommentChar SingleLineCommentCharsopt SingleLineCommentChar :: SourceCharacter but not LineTerminator HashbangComment :: #! SingleLineCommentCharsopt CommonToken :: IdentifierName PrivateIdentifier Punctuator NumericLiteral StringLiteral Template PrivateIdentifier :: # IdentifierName IdentifierName :: IdentifierStart IdentifierName IdentifierPart IdentifierStart :: IdentifierStartChar \ UnicodeEscapeSequence IdentifierPart :: IdentifierPartChar \ UnicodeEscapeSequence IdentifierStartChar :: UnicodeIDStart $ _ IdentifierPartChar :: UnicodeIDContinue $ AsciiLetter :: one of 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 UnicodeIDStart :: any Unicode code point with the Unicode property “ID_Start” UnicodeIDContinue :: any Unicode code point with the Unicode property “ID_Continue” ReservedWord :: one of await break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with yield Punctuator :: OptionalChainingPunctuator OtherPunctuator OptionalChainingPunctuator :: ?. [lookahead ∉ DecimalDigit] OtherPunctuator :: one of { ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ?? ? : = += -= *= %= **= <<= >>= >>>= &= |= ^= &&= ||= ??= => DivPunctuator :: / /= RightBracePunctuator :: } NullLiteral :: null BooleanLiteral :: true false NumericLiteralSeparator :: _ NumericLiteral :: DecimalLiteral DecimalBigIntegerLiteral NonDecimalIntegerLiteral[+Sep] NonDecimalIntegerLiteral[+Sep] BigIntLiteralSuffix LegacyOctalIntegerLiteral DecimalBigIntegerLiteral :: 0 BigIntLiteralSuffix NonZeroDigit DecimalDigits[+Sep]opt BigIntLiteralSuffix NonZeroDigit NumericLiteralSeparator DecimalDigits[+Sep] BigIntLiteralSuffix NonDecimalIntegerLiteral[Sep] :: BinaryIntegerLiteral[?Sep] OctalIntegerLiteral[?Sep] HexIntegerLiteral[?Sep] BigIntLiteralSuffix :: n DecimalLiteral :: DecimalIntegerLiteral . DecimalDigits[+Sep]opt ExponentPart[+Sep]opt . DecimalDigits[+Sep] ExponentPart[+Sep]opt DecimalIntegerLiteral ExponentPart[+Sep]opt DecimalIntegerLiteral :: 0 NonZeroDigit NonZeroDigit NumericLiteralSeparatoropt DecimalDigits[+Sep] NonOctalDecimalIntegerLiteral DecimalDigits[Sep] :: DecimalDigit DecimalDigits[?Sep] DecimalDigit [+Sep] DecimalDigits[+Sep] NumericLiteralSeparator DecimalDigit DecimalDigit :: one of 0 1 2 3 4 5 6 7 8 9 NonZeroDigit :: one of 1 2 3 4 5 6 7 8 9 ExponentPart[Sep] :: ExponentIndicator SignedInteger[?Sep] ExponentIndicator :: one of e E SignedInteger[Sep] :: DecimalDigits[?Sep] + DecimalDigits[?Sep] - DecimalDigits[?Sep] BinaryIntegerLiteral[Sep] :: 0b BinaryDigits[?Sep] 0B BinaryDigits[?Sep] BinaryDigits[Sep] :: BinaryDigit BinaryDigits[?Sep] BinaryDigit [+Sep] BinaryDigits[+Sep] NumericLiteralSeparator BinaryDigit BinaryDigit :: one of 0 1 OctalIntegerLiteral[Sep] :: 0o OctalDigits[?Sep] 0O OctalDigits[?Sep] OctalDigits[Sep] :: OctalDigit OctalDigits[?Sep] OctalDigit [+Sep] OctalDigits[+Sep] NumericLiteralSeparator OctalDigit LegacyOctalIntegerLiteral :: 0 OctalDigit LegacyOctalIntegerLiteral OctalDigit NonOctalDecimalIntegerLiteral :: 0 NonOctalDigit LegacyOctalLikeDecimalIntegerLiteral NonOctalDigit NonOctalDecimalIntegerLiteral DecimalDigit LegacyOctalLikeDecimalIntegerLiteral :: 0 OctalDigit LegacyOctalLikeDecimalIntegerLiteral OctalDigit OctalDigit :: one of 0 1 2 3 4 5 6 7 NonOctalDigit :: one of 8 9 HexIntegerLiteral[Sep] :: 0x HexDigits[?Sep] 0X HexDigits[?Sep] HexDigits[Sep] :: HexDigit HexDigits[?Sep] HexDigit [+Sep] HexDigits[+Sep] NumericLiteralSeparator HexDigit HexDigit :: one of 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F StringLiteral :: " DoubleStringCharactersopt " ' SingleStringCharactersopt ' DoubleStringCharacters :: DoubleStringCharacter DoubleStringCharactersopt SingleStringCharacters :: SingleStringCharacter SingleStringCharactersopt DoubleStringCharacter :: SourceCharacter but not one of " or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation SingleStringCharacter :: SourceCharacter but not one of ' or \ or LineTerminator <LS> <PS> \ EscapeSequence LineContinuation LineContinuation :: \ LineTerminatorSequence EscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] LegacyOctalEscapeSequence NonOctalDecimalEscapeSequence HexEscapeSequence UnicodeEscapeSequence CharacterEscapeSequence :: SingleEscapeCharacter NonEscapeCharacter SingleEscapeCharacter :: one of ' " \ b f n r t v NonEscapeCharacter :: SourceCharacter but not one of EscapeCharacter or LineTerminator EscapeCharacter :: SingleEscapeCharacter DecimalDigit x u LegacyOctalEscapeSequence :: 0 [lookahead ∈ { 8, 9 }] NonZeroOctalDigit [lookahead ∉ OctalDigit] ZeroToThree OctalDigit [lookahead ∉ OctalDigit] FourToSeven OctalDigit ZeroToThree OctalDigit OctalDigit NonZeroOctalDigit :: OctalDigit but not 0 ZeroToThree :: one of 0 1 2 3 FourToSeven :: one of 4 5 6 7 NonOctalDecimalEscapeSequence :: one of 8 9 HexEscapeSequence :: x HexDigit HexDigit UnicodeEscapeSequence :: u Hex4Digits u{ CodePoint } Hex4Digits :: HexDigit HexDigit HexDigit HexDigit RegularExpressionLiteral :: / RegularExpressionBody / RegularExpressionFlags RegularExpressionBody :: RegularExpressionFirstChar RegularExpressionChars RegularExpressionChars :: [empty] RegularExpressionChars RegularExpressionChar RegularExpressionFirstChar :: RegularExpressionNonTerminator but not one of * or \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionChar :: RegularExpressionNonTerminator but not one of \ or / or [ RegularExpressionBackslashSequence RegularExpressionClass RegularExpressionBackslashSequence :: \ RegularExpressionNonTerminator RegularExpressionNonTerminator :: SourceCharacter but not LineTerminator RegularExpressionClass :: [ RegularExpressionClassChars ] RegularExpressionClassChars :: [empty] RegularExpressionClassChars RegularExpressionClassChar RegularExpressionClassChar :: RegularExpressionNonTerminator but not one of ] or \ RegularExpressionBackslashSequence RegularExpressionFlags :: [empty] RegularExpressionFlags IdentifierPartChar Template :: NoSubstitutionTemplate TemplateHead NoSubstitutionTemplate :: ` TemplateCharactersopt ` TemplateHead :: ` TemplateCharactersopt ${ TemplateSubstitutionTail :: TemplateMiddle TemplateTail TemplateMiddle :: } TemplateCharactersopt ${ TemplateTail :: } TemplateCharactersopt ` TemplateCharacters :: TemplateCharacter TemplateCharactersopt TemplateCharacter :: $ [lookahead ≠ {] \ TemplateEscapeSequence \ NotEscapeSequence LineContinuation LineTerminatorSequence SourceCharacter but not one of ` or \ or $ or LineTerminator TemplateEscapeSequence :: CharacterEscapeSequence 0 [lookahead ∉ DecimalDigit] HexEscapeSequence UnicodeEscapeSequence NotEscapeSequence :: 0 DecimalDigit DecimalDigit but not 0 x [lookahead ∉ HexDigit] x HexDigit [lookahead ∉ HexDigit] u [lookahead ∉ HexDigit] [lookahead ≠ {] u HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit [lookahead ∉ HexDigit] u HexDigit HexDigit HexDigit [lookahead ∉ HexDigit] u { [lookahead ∉ HexDigit] u { NotCodePoint [lookahead ∉ HexDigit] u { CodePoint [lookahead ∉ HexDigit] [lookahead ≠ }] NotCodePoint :: HexDigits[~Sep] but only if the MV of HexDigits > 0x10FFFF CodePoint :: HexDigits[~Sep] but only if the MV of HexDigits ≤ 0x10FFFF

A.2 표현식

IdentifierReference[Yield, Await] : Identifier [~Yield] yield [~Await] await BindingIdentifier[Yield, Await] : Identifier yield await LabelIdentifier[Yield, Await] : Identifier [~Yield] yield [~Await] await Identifier : IdentifierName but not ReservedWord PrimaryExpression[Yield, Await] : this IdentifierReference[?Yield, ?Await] Literal ArrayLiteral[?Yield, ?Await] ObjectLiteral[?Yield, ?Await] FunctionExpression ClassExpression[?Yield, ?Await] GeneratorExpression AsyncFunctionExpression AsyncGeneratorExpression RegularExpressionLiteral TemplateLiteral[?Yield, ?Await, ~Tagged] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[Yield, Await] : ( Expression[+In, ?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ) ( ) ( ... BindingIdentifier[?Yield, ?Await] ) ( ... BindingPattern[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingIdentifier[?Yield, ?Await] ) ( Expression[+In, ?Yield, ?Await] , ... BindingPattern[?Yield, ?Await] )

When processing an instance of the production
PrimaryExpression[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
the interpretation of CoverParenthesizedExpressionAndArrowParameterList is refined using the following grammar:

ParenthesizedExpression[Yield, Await] : ( Expression[+In, ?Yield, ?Await] )

 

Literal : NullLiteral BooleanLiteral NumericLiteral StringLiteral ArrayLiteral[Yield, Await] : [ Elisionopt ] [ ElementList[?Yield, ?Await] ] [ ElementList[?Yield, ?Await] , Elisionopt ] ElementList[Yield, Await] : Elisionopt AssignmentExpression[+In, ?Yield, ?Await] Elisionopt SpreadElement[?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt AssignmentExpression[+In, ?Yield, ?Await] ElementList[?Yield, ?Await] , Elisionopt SpreadElement[?Yield, ?Await] Elision : , Elision , SpreadElement[Yield, Await] : ... AssignmentExpression[+In, ?Yield, ?Await] ObjectLiteral[Yield, Await] : { } { PropertyDefinitionList[?Yield, ?Await] } { PropertyDefinitionList[?Yield, ?Await] , } PropertyDefinitionList[Yield, Await] : PropertyDefinition[?Yield, ?Await] PropertyDefinitionList[?Yield, ?Await] , PropertyDefinition[?Yield, ?Await] PropertyDefinition[Yield, Await] : IdentifierReference[?Yield, ?Await] CoverInitializedName[?Yield, ?Await] PropertyName[?Yield, ?Await] : AssignmentExpression[+In, ?Yield, ?Await] MethodDefinition[?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] PropertyName[Yield, Await] : LiteralPropertyName ComputedPropertyName[?Yield, ?Await] LiteralPropertyName : IdentifierName StringLiteral NumericLiteral ComputedPropertyName[Yield, Await] : [ AssignmentExpression[+In, ?Yield, ?Await] ] CoverInitializedName[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await] Initializer[In, Yield, Await] : = AssignmentExpression[?In, ?Yield, ?Await] TemplateLiteral[Yield, Await, Tagged] : NoSubstitutionTemplate SubstitutionTemplate[?Yield, ?Await, ?Tagged] SubstitutionTemplate[Yield, Await, Tagged] : TemplateHead Expression[+In, ?Yield, ?Await] TemplateSpans[?Yield, ?Await, ?Tagged] TemplateSpans[Yield, Await, Tagged] : TemplateTail TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateTail TemplateMiddleList[Yield, Await, Tagged] : TemplateMiddle Expression[+In, ?Yield, ?Await] TemplateMiddleList[?Yield, ?Await, ?Tagged] TemplateMiddle Expression[+In, ?Yield, ?Await] MemberExpression[Yield, Await] : PrimaryExpression[?Yield, ?Await] MemberExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] MemberExpression[?Yield, ?Await] . IdentifierName MemberExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] SuperProperty[?Yield, ?Await] MetaProperty new MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await] MemberExpression[?Yield, ?Await] . PrivateIdentifier SuperProperty[Yield, Await] : super [ Expression[+In, ?Yield, ?Await] ] super . IdentifierName MetaProperty : NewTarget ImportMeta NewTarget : new . target ImportMeta : import . meta NewExpression[Yield, Await] : MemberExpression[?Yield, ?Await] new NewExpression[?Yield, ?Await] CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] SuperCall[?Yield, ?Await] ImportCall[?Yield, ?Await] CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await] CallExpression[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] CallExpression[?Yield, ?Await] . IdentifierName CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] CallExpression[?Yield, ?Await] . PrivateIdentifier

When processing an instance of the production
CallExpression[Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await]
the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:

CallMemberExpression[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

 

SuperCall[Yield, Await] : super Arguments[?Yield, ?Await] ImportCall[Yield, Await] : import ( AssignmentExpression[+In, ?Yield, ?Await] ,opt ) import ( AssignmentExpression[+In, ?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ,opt ) Arguments[Yield, Await] : ( ) ( ArgumentList[?Yield, ?Await] ) ( ArgumentList[?Yield, ?Await] , ) ArgumentList[Yield, Await] : AssignmentExpression[+In, ?Yield, ?Await] ... AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , AssignmentExpression[+In, ?Yield, ?Await] ArgumentList[?Yield, ?Await] , ... AssignmentExpression[+In, ?Yield, ?Await] OptionalExpression[Yield, Await] : MemberExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalExpression[?Yield, ?Await] OptionalChain[?Yield, ?Await] OptionalChain[Yield, Await] : ?. Arguments[?Yield, ?Await] ?. [ Expression[+In, ?Yield, ?Await] ] ?. IdentifierName ?. TemplateLiteral[?Yield, ?Await, +Tagged] ?. PrivateIdentifier OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await] OptionalChain[?Yield, ?Await] [ Expression[+In, ?Yield, ?Await] ] OptionalChain[?Yield, ?Await] . IdentifierName OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged] OptionalChain[?Yield, ?Await] . PrivateIdentifier LeftHandSideExpression[Yield, Await] : NewExpression[?Yield, ?Await] CallExpression[?Yield, ?Await] OptionalExpression[?Yield, ?Await] UpdateExpression[Yield, Await] : LeftHandSideExpression[?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] ++ LeftHandSideExpression[?Yield, ?Await] [no LineTerminator here] -- ++ UnaryExpression[?Yield, ?Await] -- UnaryExpression[?Yield, ?Await] UnaryExpression[Yield, Await] : UpdateExpression[?Yield, ?Await] delete UnaryExpression[?Yield, ?Await] void UnaryExpression[?Yield, ?Await] typeof UnaryExpression[?Yield, ?Await] + UnaryExpression[?Yield, ?Await] - UnaryExpression[?Yield, ?Await] ~ UnaryExpression[?Yield, ?Await] ! UnaryExpression[?Yield, ?Await] [+Await] AwaitExpression[?Yield] ExponentiationExpression[Yield, Await] : UnaryExpression[?Yield, ?Await] UpdateExpression[?Yield, ?Await] ** ExponentiationExpression[?Yield, ?Await] MultiplicativeExpression[Yield, Await] : ExponentiationExpression[?Yield, ?Await] MultiplicativeExpression[?Yield, ?Await] MultiplicativeOperator ExponentiationExpression[?Yield, ?Await] MultiplicativeOperator : one of * / % AdditiveExpression[Yield, Await] : MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] + MultiplicativeExpression[?Yield, ?Await] AdditiveExpression[?Yield, ?Await] - MultiplicativeExpression[?Yield, ?Await] ShiftExpression[Yield, Await] : AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] << AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >> AdditiveExpression[?Yield, ?Await] ShiftExpression[?Yield, ?Await] >>> AdditiveExpression[?Yield, ?Await] RelationalExpression[In, Yield, Await] : ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] < ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] > ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] <= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] >= ShiftExpression[?Yield, ?Await] RelationalExpression[?In, ?Yield, ?Await] instanceof ShiftExpression[?Yield, ?Await] [+In] RelationalExpression[+In, ?Yield, ?Await] in ShiftExpression[?Yield, ?Await] [+In] PrivateIdentifier in ShiftExpression[?Yield, ?Await] EqualityExpression[In, Yield, Await] : RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] == RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] != RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] === RelationalExpression[?In, ?Yield, ?Await] EqualityExpression[?In, ?Yield, ?Await] !== RelationalExpression[?In, ?Yield, ?Await] BitwiseANDExpression[In, Yield, Await] : EqualityExpression[?In, ?Yield, ?Await] BitwiseANDExpression[?In, ?Yield, ?Await] & EqualityExpression[?In, ?Yield, ?Await] BitwiseXORExpression[In, Yield, Await] : BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseXORExpression[?In, ?Yield, ?Await] ^ BitwiseANDExpression[?In, ?Yield, ?Await] BitwiseORExpression[In, Yield, Await] : BitwiseXORExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] | BitwiseXORExpression[?In, ?Yield, ?Await] LogicalANDExpression[In, Yield, Await] : BitwiseORExpression[?In, ?Yield, ?Await] LogicalANDExpression[?In, ?Yield, ?Await] && BitwiseORExpression[?In, ?Yield, ?Await] LogicalORExpression[In, Yield, Await] : LogicalANDExpression[?In, ?Yield, ?Await] LogicalORExpression[?In, ?Yield, ?Await] || LogicalANDExpression[?In, ?Yield, ?Await] CoalesceExpression[In, Yield, Await] : CoalesceExpressionHead[?In, ?Yield, ?Await] ?? BitwiseORExpression[?In, ?Yield, ?Await] CoalesceExpressionHead[In, Yield, Await] : CoalesceExpression[?In, ?Yield, ?Await] BitwiseORExpression[?In, ?Yield, ?Await] ShortCircuitExpression[In, Yield, Await] : LogicalORExpression[?In, ?Yield, ?Await] CoalesceExpression[?In, ?Yield, ?Await] ConditionalExpression[In, Yield, Await] : ShortCircuitExpression[?In, ?Yield, ?Await] ShortCircuitExpression[?In, ?Yield, ?Await] ? AssignmentExpression[+In, ?Yield, ?Await] : AssignmentExpression[?In, ?Yield, ?Await] AssignmentExpression[In, Yield, Await] : ConditionalExpression[?In, ?Yield, ?Await] [+Yield] YieldExpression[?In, ?Await] ArrowFunction[?In, ?Yield, ?Await] AsyncArrowFunction[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] AssignmentOperator AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] &&= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ||= AssignmentExpression[?In, ?Yield, ?Await] LeftHandSideExpression[?Yield, ?Await] ??= AssignmentExpression[?In, ?Yield, ?Await] AssignmentOperator : one of *= /= %= += -= <<= >>= >>>= &= ^= |= **=

In certain circumstances when processing an instance of the production
AssignmentExpression[In, Yield, Await] : LeftHandSideExpression[?Yield, ?Await] = AssignmentExpression[?In, ?Yield, ?Await]
the interpretation of LeftHandSideExpression is refined using the following grammar:

AssignmentPattern[Yield, Await] : ObjectAssignmentPattern[?Yield, ?Await] ArrayAssignmentPattern[?Yield, ?Await] ObjectAssignmentPattern[Yield, Await] : { } { AssignmentRestProperty[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] } { AssignmentPropertyList[?Yield, ?Await] , AssignmentRestProperty[?Yield, ?Await]opt } ArrayAssignmentPattern[Yield, Await] : [ Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] [ AssignmentElementList[?Yield, ?Await] ] [ AssignmentElementList[?Yield, ?Await] , Elisionopt AssignmentRestElement[?Yield, ?Await]opt ] AssignmentRestProperty[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] AssignmentPropertyList[Yield, Await] : AssignmentProperty[?Yield, ?Await] AssignmentPropertyList[?Yield, ?Await] , AssignmentProperty[?Yield, ?Await] AssignmentElementList[Yield, Await] : AssignmentElisionElement[?Yield, ?Await] AssignmentElementList[?Yield, ?Await] , AssignmentElisionElement[?Yield, ?Await] AssignmentElisionElement[Yield, Await] : Elisionopt AssignmentElement[?Yield, ?Await] AssignmentProperty[Yield, Await] : IdentifierReference[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt PropertyName[?Yield, ?Await] : AssignmentElement[?Yield, ?Await] AssignmentElement[Yield, Await] : DestructuringAssignmentTarget[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt AssignmentRestElement[Yield, Await] : ... DestructuringAssignmentTarget[?Yield, ?Await] DestructuringAssignmentTarget[Yield, Await] : LeftHandSideExpression[?Yield, ?Await]

 

Expression[In, Yield, Await] : AssignmentExpression[?In, ?Yield, ?Await] Expression[?In, ?Yield, ?Await] , AssignmentExpression[?In, ?Yield, ?Await]

A.3 문장

Statement[Yield, Await, Return] : BlockStatement[?Yield, ?Await, ?Return] VariableStatement[?Yield, ?Await] EmptyStatement ExpressionStatement[?Yield, ?Await] IfStatement[?Yield, ?Await, ?Return] BreakableStatement[?Yield, ?Await, ?Return] ContinueStatement[?Yield, ?Await] BreakStatement[?Yield, ?Await] [+Return] ReturnStatement[?Yield, ?Await] WithStatement[?Yield, ?Await, ?Return] LabelledStatement[?Yield, ?Await, ?Return] ThrowStatement[?Yield, ?Await] TryStatement[?Yield, ?Await, ?Return] DebuggerStatement Declaration[Yield, Await] : HoistableDeclaration[?Yield, ?Await, ~Default] ClassDeclaration[?Yield, ?Await, ~Default] LexicalDeclaration[+In, ?Yield, ?Await] HoistableDeclaration[Yield, Await, Default] : FunctionDeclaration[?Yield, ?Await, ?Default] GeneratorDeclaration[?Yield, ?Await, ?Default] AsyncFunctionDeclaration[?Yield, ?Await, ?Default] AsyncGeneratorDeclaration[?Yield, ?Await, ?Default] BreakableStatement[Yield, Await, Return] : IterationStatement[?Yield, ?Await, ?Return] SwitchStatement[?Yield, ?Await, ?Return] BlockStatement[Yield, Await, Return] : Block[?Yield, ?Await, ?Return] Block[Yield, Await, Return] : { StatementList[?Yield, ?Await, ?Return]opt } StatementList[Yield, Await, Return] : StatementListItem[?Yield, ?Await, ?Return] StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return] StatementListItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] Declaration[?Yield, ?Await] LexicalDeclaration[In, Yield, Await] : LetOrConst BindingList[?In, ?Yield, ?Await] ; LetOrConst : let const BindingList[In, Yield, Await] : LexicalBinding[?In, ?Yield, ?Await] BindingList[?In, ?Yield, ?Await] , LexicalBinding[?In, ?Yield, ?Await] LexicalBinding[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] VariableStatement[Yield, Await] : var VariableDeclarationList[+In, ?Yield, ?Await] ; VariableDeclarationList[In, Yield, Await] : VariableDeclaration[?In, ?Yield, ?Await] VariableDeclarationList[?In, ?Yield, ?Await] , VariableDeclaration[?In, ?Yield, ?Await] VariableDeclaration[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await] BindingPattern[Yield, Await] : ObjectBindingPattern[?Yield, ?Await] ArrayBindingPattern[?Yield, ?Await] ObjectBindingPattern[Yield, Await] : { } { BindingRestProperty[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] , BindingRestProperty[?Yield, ?Await]opt } ArrayBindingPattern[Yield, Await] : [ Elisionopt BindingRestElement[?Yield, ?Await]opt ] [ BindingElementList[?Yield, ?Await] ] [ BindingElementList[?Yield, ?Await] , Elisionopt BindingRestElement[?Yield, ?Await]opt ] BindingRestProperty[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] BindingPropertyList[Yield, Await] : BindingProperty[?Yield, ?Await] BindingPropertyList[?Yield, ?Await] , BindingProperty[?Yield, ?Await] BindingElementList[Yield, Await] : BindingElisionElement[?Yield, ?Await] BindingElementList[?Yield, ?Await] , BindingElisionElement[?Yield, ?Await] BindingElisionElement[Yield, Await] : Elisionopt BindingElement[?Yield, ?Await] BindingProperty[Yield, Await] : SingleNameBinding[?Yield, ?Await] PropertyName[?Yield, ?Await] : BindingElement[?Yield, ?Await] BindingElement[Yield, Await] : SingleNameBinding[?Yield, ?Await] BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt SingleNameBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt BindingRestElement[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] ... BindingPattern[?Yield, ?Await] EmptyStatement : ; ExpressionStatement[Yield, Await] : [lookahead ∉ { {, function, async [no LineTerminator here] function, class, let [ }] Expression[+In, ?Yield, ?Await] ; IfStatement[Yield, Await, Return] : if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] else Statement[?Yield, ?Await, ?Return] if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [lookahead ≠ else] IterationStatement[Yield, Await, Return] : DoWhileStatement[?Yield, ?Await, ?Return] WhileStatement[?Yield, ?Await, ?Return] ForStatement[?Yield, ?Await, ?Return] ForInOfStatement[?Yield, ?Await, ?Return] DoWhileStatement[Yield, Await, Return] : do Statement[?Yield, ?Await, ?Return] while ( Expression[+In, ?Yield, ?Await] ) ; WhileStatement[Yield, Await, Return] : while ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] ForStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] Expression[~In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( var VariableDeclarationList[~In, ?Yield, ?Await] ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( LexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] ForInOfStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] LeftHandSideExpression[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( [lookahead ∉ { let, async of }] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( [lookahead ≠ let] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( var ForBinding[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( ForDeclaration[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] ForDeclaration[Yield, Await] : LetOrConst ForBinding[?Yield, ?Await] ForBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ; ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; WithStatement[Yield, Await, Return] : with ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] SwitchStatement[Yield, Await, Return] : switch ( Expression[+In, ?Yield, ?Await] ) CaseBlock[?Yield, ?Await, ?Return] CaseBlock[Yield, Await, Return] : { CaseClauses[?Yield, ?Await, ?Return]opt } { CaseClauses[?Yield, ?Await, ?Return]opt DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]opt } CaseClauses[Yield, Await, Return] : CaseClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return] CaseClause[?Yield, ?Await, ?Return] CaseClause[Yield, Await, Return] : case Expression[+In, ?Yield, ?Await] : StatementList[?Yield, ?Await, ?Return]opt DefaultClause[Yield, Await, Return] : default : StatementList[?Yield, ?Await, ?Return]opt LabelledStatement[Yield, Await, Return] : LabelIdentifier[?Yield, ?Await] : LabelledItem[?Yield, ?Await, ?Return] LabelledItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] FunctionDeclaration[?Yield, ?Await, ~Default] ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; TryStatement[Yield, Await, Return] : try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] Catch[Yield, Await, Return] : catch ( CatchParameter[?Yield, ?Await] ) Block[?Yield, ?Await, ?Return] catch Block[?Yield, ?Await, ?Return] Finally[Yield, Await, Return] : finally Block[?Yield, ?Await, ?Return] CatchParameter[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] DebuggerStatement : debugger ;

A.4 함수와 클래스

UniqueFormalParameters[Yield, Await] : FormalParameters[?Yield, ?Await] FormalParameters[Yield, Await] : [empty] FunctionRestParameter[?Yield, ?Await] FormalParameterList[?Yield, ?Await] FormalParameterList[?Yield, ?Await] , FormalParameterList[?Yield, ?Await] , FunctionRestParameter[?Yield, ?Await] FormalParameterList[Yield, Await] : FormalParameter[?Yield, ?Await] FormalParameterList[?Yield, ?Await] , FormalParameter[?Yield, ?Await] FunctionRestParameter[Yield, Await] : BindingRestElement[?Yield, ?Await] FormalParameter[Yield, Await] : BindingElement[?Yield, ?Await] FunctionDeclaration[Yield, Await, Default] : function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } [+Default] function ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } FunctionExpression : function BindingIdentifier[~Yield, ~Await]opt ( FormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } FunctionBody[Yield, Await] : FunctionStatementList[?Yield, ?Await] FunctionStatementList[Yield, Await] : StatementList[?Yield, ?Await, +Return]opt ArrowFunction[In, Yield, Await] : ArrowParameters[?Yield, ?Await] [no LineTerminator here] => ConciseBody[?In] ArrowParameters[Yield, Await] : BindingIdentifier[?Yield, ?Await] CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await] ConciseBody[In] : [lookahead ≠ {] ExpressionBody[?In, ~Await] { FunctionBody[~Yield, ~Await] } ExpressionBody[In, Await] : AssignmentExpression[?In, ~Yield, ?Await]

When processing an instance of the production
ArrowParameters[Yield, Await] : CoverParenthesizedExpressionAndArrowParameterList[?Yield, ?Await]
the interpretation of CoverParenthesizedExpressionAndArrowParameterList is refined using the following grammar:

ArrowFormalParameters[Yield, Await] : ( UniqueFormalParameters[?Yield, ?Await] )

 

AsyncArrowFunction[In, Yield, Await] : async [no LineTerminator here] AsyncArrowBindingIdentifier[?Yield] [no LineTerminator here] => AsyncConciseBody[?In] CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In] AsyncConciseBody[In] : [lookahead ≠ {] ExpressionBody[?In, +Await] { AsyncFunctionBody } AsyncArrowBindingIdentifier[Yield] : BindingIdentifier[?Yield, +Await] CoverCallExpressionAndAsyncArrowHead[Yield, Await] : MemberExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

When processing an instance of the production
AsyncArrowFunction[In, Yield, Await] : CoverCallExpressionAndAsyncArrowHead[?Yield, ?Await] [no LineTerminator here] => AsyncConciseBody[?In]
the interpretation of CoverCallExpressionAndAsyncArrowHead is refined using the following grammar:

AsyncArrowHead : async [no LineTerminator here] ArrowFormalParameters[~Yield, +Await]

 

MethodDefinition[Yield, Await] : ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, ~Await] ) { FunctionBody[~Yield, ~Await] } GeneratorMethod[?Yield, ?Await] AsyncMethod[?Yield, ?Await] AsyncGeneratorMethod[?Yield, ?Await] get ClassElementName[?Yield, ?Await] ( ) { FunctionBody[~Yield, ~Await] } set ClassElementName[?Yield, ?Await] ( PropertySetParameterList ) { FunctionBody[~Yield, ~Await] } PropertySetParameterList : FormalParameter[~Yield, ~Await] GeneratorDeclaration[Yield, Await, Default] : function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } [+Default] function * ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorExpression : function * BindingIdentifier[+Yield, ~Await]opt ( FormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorMethod[Yield, Await] : * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, ~Await] ) { GeneratorBody } GeneratorBody : FunctionBody[+Yield, ~Await] YieldExpression[In, Await] : yield yield [no LineTerminator here] AssignmentExpression[?In, +Yield, ?Await] yield [no LineTerminator here] * AssignmentExpression[?In, +Yield, ?Await] AsyncGeneratorDeclaration[Yield, Await, Default] : async [no LineTerminator here] function * BindingIdentifier[?Yield, ?Await] ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } [+Default] async [no LineTerminator here] function * ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorExpression : async [no LineTerminator here] function * BindingIdentifier[+Yield, +Await]opt ( FormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorMethod[Yield, Await] : async [no LineTerminator here] * ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[+Yield, +Await] ) { AsyncGeneratorBody } AsyncGeneratorBody : FunctionBody[+Yield, +Await] AsyncFunctionDeclaration[Yield, Await, Default] : async [no LineTerminator here] function BindingIdentifier[?Yield, ?Await] ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } [+Default] async [no LineTerminator here] function ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionExpression : async [no LineTerminator here] function BindingIdentifier[~Yield, +Await]opt ( FormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncMethod[Yield, Await] : async [no LineTerminator here] ClassElementName[?Yield, ?Await] ( UniqueFormalParameters[~Yield, +Await] ) { AsyncFunctionBody } AsyncFunctionBody : FunctionBody[~Yield, +Await] AwaitExpression[Yield] : await UnaryExpression[?Yield, +Await] ClassDeclaration[Yield, Await, Default] : class BindingIdentifier[?Yield, ?Await] ClassTail[?Yield, ?Await] [+Default] class ClassTail[?Yield, ?Await] ClassExpression[Yield, Await] : class BindingIdentifier[?Yield, ?Await]opt ClassTail[?Yield, ?Await] ClassTail[Yield, Await] : ClassHeritage[?Yield, ?Await]opt { ClassBody[?Yield, ?Await]opt } ClassHeritage[Yield, Await] : extends LeftHandSideExpression[?Yield, ?Await] ClassBody[Yield, Await] : ClassElementList[?Yield, ?Await] ClassElementList[Yield, Await] : ClassElement[?Yield, ?Await] ClassElementList[?Yield, ?Await] ClassElement[?Yield, ?Await] ClassElement[Yield, Await] : MethodDefinition[?Yield, ?Await] static MethodDefinition[?Yield, ?Await] FieldDefinition[?Yield, ?Await] ; static FieldDefinition[?Yield, ?Await] ; ClassStaticBlock ; FieldDefinition[Yield, Await] : ClassElementName[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt ClassElementName[Yield, Await] : PropertyName[?Yield, ?Await] PrivateIdentifier ClassStaticBlock : static { ClassStaticBlockBody } ClassStaticBlockBody : ClassStaticBlockStatementList ClassStaticBlockStatementList : StatementList[~Yield, +Await, ~Return]opt

A.5 스크립트와 모듈

Script : ScriptBodyopt ScriptBody : StatementList[~Yield, ~Await, ~Return] Module : ModuleBodyopt ModuleBody : ModuleItemList ModuleItemList : ModuleItem ModuleItemList ModuleItem ModuleItem : ImportDeclaration ExportDeclaration StatementListItem[~Yield, +Await, ~Return] ModuleExportName : IdentifierName StringLiteral ImportDeclaration : import ImportClause FromClause WithClauseopt ; import ModuleSpecifier WithClauseopt ; ImportClause : ImportedDefaultBinding NameSpaceImport NamedImports ImportedDefaultBinding , NameSpaceImport ImportedDefaultBinding , NamedImports ImportedDefaultBinding : ImportedBinding NameSpaceImport : * as ImportedBinding NamedImports : { } { ImportsList } { ImportsList , } FromClause : from ModuleSpecifier ImportsList : ImportSpecifier ImportsList , ImportSpecifier ImportSpecifier : ImportedBinding ModuleExportName as ImportedBinding ModuleSpecifier : StringLiteral ImportedBinding : BindingIdentifier[~Yield, +Await] WithClause : with { } with { WithEntries ,opt } WithEntries : AttributeKey : StringLiteral AttributeKey : StringLiteral , WithEntries AttributeKey : IdentifierName StringLiteral ExportDeclaration : export ExportFromClause FromClause WithClauseopt ; export NamedExports ; export VariableStatement[~Yield, +Await] export Declaration[~Yield, +Await] export default HoistableDeclaration[~Yield, +Await, +Default] export default ClassDeclaration[~Yield, +Await, +Default] export default [lookahead ∉ { function, async [no LineTerminator here] function, class }] AssignmentExpression[+In, ~Yield, +Await] ; ExportFromClause : * * as ModuleExportName NamedExports NamedExports : { } { ExportsList } { ExportsList , } ExportsList : ExportSpecifier ExportsList , ExportSpecifier ExportSpecifier : ModuleExportName ModuleExportName as ModuleExportName

A.6 숫자 변환

StringNumericLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpaceopt StrWhiteSpaceChar ::: WhiteSpace LineTerminator StrNumericLiteral ::: StrDecimalLiteral NonDecimalIntegerLiteral[~Sep] StrDecimalLiteral ::: StrUnsignedDecimalLiteral + StrUnsignedDecimalLiteral - StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral ::: Infinity DecimalDigits[~Sep] . DecimalDigits[~Sep]opt ExponentPart[~Sep]opt . DecimalDigits[~Sep] ExponentPart[~Sep]opt DecimalDigits[~Sep] ExponentPart[~Sep]opt

All grammar symbols not explicitly defined by the StringNumericLiteral grammar have the definitions used in the Lexical Grammar for numeric literals.

StringIntegerLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrIntegerLiteral StrWhiteSpaceopt StrIntegerLiteral ::: SignedInteger[~Sep] NonDecimalIntegerLiteral[~Sep]

A.7 시간대 오프셋 문자열 형식

UTCOffset ::: ASCIISign Hour ASCIISign Hour HourSubcomponents[+Extended] ASCIISign Hour HourSubcomponents[~Extended] ASCIISign ::: one of + - Hour ::: 0 DecimalDigit 1 DecimalDigit 20 21 22 23 HourSubcomponents[Extended] ::: TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TimeSeparator[?Extended] MinuteSecond TemporalDecimalFractionopt TimeSeparator[Extended] ::: [+Extended] : [~Extended] [empty] MinuteSecond ::: 0 DecimalDigit 1 DecimalDigit 2 DecimalDigit 3 DecimalDigit 4 DecimalDigit 5 DecimalDigit TemporalDecimalFraction ::: TemporalDecimalSeparator DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit DecimalDigit TemporalDecimalSeparator ::: one of . ,

A.8 정규 표현식

Pattern[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Disjunction[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] | Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Alternative[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: [empty] Alternative[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: Assertion[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Atom[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Quantifier Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: ^ $ \b \B (?= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) Quantifier :: QuantifierPrefix QuantifierPrefix ? QuantifierPrefix :: * + ? { DecimalDigits[~Sep] } { DecimalDigits[~Sep] ,} { DecimalDigits[~Sep] , DecimalDigits[~Sep] } Atom[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: PatternCharacter . \ AtomEscape[?UnicodeMode, ?NamedCaptureGroups] CharacterClass[?UnicodeMode, ?UnicodeSetsMode] ( GroupSpecifier[?UnicodeMode]opt Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) RegularExpressionModifiers :: [empty] RegularExpressionModifiers RegularExpressionModifier RegularExpressionModifier :: one of i m s SyntaxCharacter :: one of ^ $ \ . * + ? ( ) [ ] { } | PatternCharacter :: SourceCharacter but not SyntaxCharacter AtomEscape[UnicodeMode, NamedCaptureGroups] :: DecimalEscape CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] [+NamedCaptureGroups] k GroupName[?UnicodeMode] CharacterEscape[UnicodeMode] :: ControlEscape c AsciiLetter 0 [lookahead ∉ DecimalDigit] HexEscapeSequence RegExpUnicodeEscapeSequence[?UnicodeMode] IdentityEscape[?UnicodeMode] ControlEscape :: one of f n r t v GroupSpecifier[UnicodeMode] :: ? GroupName[?UnicodeMode] GroupName[UnicodeMode] :: < RegExpIdentifierName[?UnicodeMode] > RegExpIdentifierName[UnicodeMode] :: RegExpIdentifierStart[?UnicodeMode] RegExpIdentifierName[?UnicodeMode] RegExpIdentifierPart[?UnicodeMode] RegExpIdentifierStart[UnicodeMode] :: IdentifierStartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpIdentifierPart[UnicodeMode] :: IdentifierPartChar \ RegExpUnicodeEscapeSequence[+UnicodeMode] [~UnicodeMode] UnicodeLeadSurrogate UnicodeTrailSurrogate RegExpUnicodeEscapeSequence[UnicodeMode] :: [+UnicodeMode] u HexLeadSurrogate \u HexTrailSurrogate [+UnicodeMode] u HexLeadSurrogate [+UnicodeMode] u HexTrailSurrogate [+UnicodeMode] u HexNonSurrogate [~UnicodeMode] u Hex4Digits [+UnicodeMode] u{ CodePoint } UnicodeLeadSurrogate :: any Unicode code point in the inclusive interval from U+D800 to U+DBFF UnicodeTrailSurrogate :: any Unicode code point in the inclusive interval from U+DC00 to U+DFFF

Each \u HexTrailSurrogate for which the choice of associated u HexLeadSurrogate is ambiguous shall be associated with the nearest possible u HexLeadSurrogate that would otherwise have no corresponding \u HexTrailSurrogate.

 

HexLeadSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xD800 to 0xDBFF HexTrailSurrogate :: Hex4Digits but only if the MV of Hex4Digits is in the inclusive interval from 0xDC00 to 0xDFFF HexNonSurrogate :: Hex4Digits but only if the MV of Hex4Digits is not in the inclusive interval from 0xD800 to 0xDFFF IdentityEscape[UnicodeMode] :: [+UnicodeMode] SyntaxCharacter [+UnicodeMode] / [~UnicodeMode] SourceCharacter but not UnicodeIDContinue DecimalEscape :: NonZeroDigit DecimalDigits[~Sep]opt [lookahead ∉ DecimalDigit] CharacterClassEscape[UnicodeMode] :: d D s S w W [+UnicodeMode] p{ UnicodePropertyValueExpression } [+UnicodeMode] P{ UnicodePropertyValueExpression } UnicodePropertyValueExpression :: UnicodePropertyName = UnicodePropertyValue LoneUnicodePropertyNameOrValue UnicodePropertyName :: UnicodePropertyNameCharacters UnicodePropertyNameCharacters :: UnicodePropertyNameCharacter UnicodePropertyNameCharactersopt UnicodePropertyValue :: UnicodePropertyValueCharacters LoneUnicodePropertyNameOrValue :: UnicodePropertyValueCharacters UnicodePropertyValueCharacters :: UnicodePropertyValueCharacter UnicodePropertyValueCharactersopt UnicodePropertyValueCharacter :: UnicodePropertyNameCharacter DecimalDigit UnicodePropertyNameCharacter :: AsciiLetter _ CharacterClass[UnicodeMode, UnicodeSetsMode] :: [ [lookahead ≠ ^] ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] [^ ClassContents[?UnicodeMode, ?UnicodeSetsMode] ] ClassContents[UnicodeMode, UnicodeSetsMode] :: [empty] [~UnicodeSetsMode] NonemptyClassRanges[?UnicodeMode] [+UnicodeSetsMode] ClassSetExpression NonemptyClassRanges[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtom[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtom[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] NonemptyClassRangesNoDash[UnicodeMode] :: ClassAtom[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] NonemptyClassRangesNoDash[?UnicodeMode] ClassAtomNoDash[?UnicodeMode] - ClassAtom[?UnicodeMode] ClassContents[?UnicodeMode, ~UnicodeSetsMode] ClassAtom[UnicodeMode] :: - ClassAtomNoDash[?UnicodeMode] ClassAtomNoDash[UnicodeMode] :: SourceCharacter but not one of \ or ] or - \ ClassEscape[?UnicodeMode] ClassEscape[UnicodeMode] :: b [+UnicodeMode] - CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode] ClassSetExpression :: ClassUnion ClassIntersection ClassSubtraction ClassUnion :: ClassSetRange ClassUnionopt ClassSetOperand ClassUnionopt ClassIntersection :: ClassSetOperand && [lookahead ≠ &] ClassSetOperand ClassIntersection && [lookahead ≠ &] ClassSetOperand ClassSubtraction :: ClassSetOperand -- ClassSetOperand ClassSubtraction -- ClassSetOperand ClassSetRange :: ClassSetCharacter - ClassSetCharacter ClassSetOperand :: NestedClass ClassStringDisjunction ClassSetCharacter NestedClass :: [ [lookahead ≠ ^] ClassContents[+UnicodeMode, +UnicodeSetsMode] ] [^ ClassContents[+UnicodeMode, +UnicodeSetsMode] ] \ CharacterClassEscape[+UnicodeMode] ClassStringDisjunction :: \q{ ClassStringDisjunctionContents } ClassStringDisjunctionContents :: ClassString ClassString | ClassStringDisjunctionContents ClassString :: [empty] NonEmptyClassString NonEmptyClassString :: ClassSetCharacter NonEmptyClassStringopt ClassSetCharacter :: [lookahead ∉ ClassSetReservedDoublePunctuator] SourceCharacter but not ClassSetSyntaxCharacter \ CharacterEscape[+UnicodeMode] \ ClassSetReservedPunctuator \b ClassSetReservedDoublePunctuator :: one of && !! ## $$ %% ** ++ ,, .. :: ;; << == >> ?? @@ ^^ `` ~~ ClassSetSyntaxCharacter :: one of ( ) [ ] { } / - \ | ClassSetReservedPunctuator :: one of & - ! # % , : ; < = > @ ` ~

부록 B (규범적) 웹 브라우저를 위한 추가 ECMAScript 기능

이 부록에서 정의된 ECMAScript 언어의 문법과 의미론은 ECMAScript 호스트가 웹 브라우저일 때 필수적이다. 이 부록의 내용은 규범적이지만 ECMAScript 호스트가 웹 브라우저가 아닌 경우 선택적이다.

참고

이 부록에서는 다양한 레거시 기능과 웹 브라우저 ECMAScript 호스트의 특성을 설명한다. 이 부록에 명시된 모든 언어 기능과 동작들은 하나 이상의 바람직하지 않은 특성을 가지며, 레거시 사용이 없다면 이 명세에서 제거될 것이다. 그러나 많은 기존 웹 페이지들이 이 기능들을 사용하기 때문에 웹 브라우저들은 계속 이를 지원해야 한다. 이 부록의 명세는 이러한 레거시 기능들의 상호운용 구현 요건을 정의한다.

이러한 기능들은 ECMAScript 언어의 핵심 부분으로 간주되지 않는다. 프로그래머는 새로운 ECMAScript 코드를 작성할 때 이러한 기능과 동작의 존재를 사용하거나 가정해서는 안 된다. ECMAScript 구현체는 웹 브라우저의 일부이거나 웹 브라우저가 접하는 동일한 레거시 ECMAScript 코드를 실행해야 하는 경우를 제외하고는 이 기능들의 구현을 지양해야 한다.

B.1 추가 문법

B.1.1 HTML 유사 주석

12.4의 문법과 의미론은 아래와 같이 확장된다. 단, 이 확장은 목표 기호 Module을 사용하여 소스 텍스트를 파싱할 때는 허용되지 않는다:

문법

InputElementHashbangOrRegExp :: WhiteSpace LineTerminator Comment CommonToken HashbangComment RegularExpressionLiteral HTMLCloseComment Comment :: MultiLineComment SingleLineComment SingleLineHTMLOpenComment SingleLineHTMLCloseComment SingleLineDelimitedComment MultiLineComment :: /* FirstCommentLineopt LineTerminator MultiLineCommentCharsopt */ HTMLCloseCommentopt FirstCommentLine :: SingleLineDelimitedCommentChars SingleLineHTMLOpenComment :: <!-- SingleLineCommentCharsopt SingleLineHTMLCloseComment :: LineTerminatorSequence HTMLCloseComment SingleLineDelimitedComment :: /* SingleLineDelimitedCommentCharsopt */ HTMLCloseComment :: WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt --> SingleLineCommentCharsopt SingleLineDelimitedCommentChars :: SingleLineNotAsteriskChar SingleLineDelimitedCommentCharsopt * SingleLinePostAsteriskCommentCharsopt SingleLineNotAsteriskChar :: SourceCharacter but not one of * or LineTerminator SingleLinePostAsteriskCommentChars :: SingleLineNotForwardSlashOrAsteriskChar SingleLineDelimitedCommentCharsopt * SingleLinePostAsteriskCommentCharsopt SingleLineNotForwardSlashOrAsteriskChar :: SourceCharacter but not one of / or * or LineTerminator WhiteSpaceSequence :: WhiteSpace WhiteSpaceSequenceopt SingleLineDelimitedCommentSequence :: SingleLineDelimitedComment WhiteSpaceSequenceopt SingleLineDelimitedCommentSequenceopt

MultiLineComment에 줄 종결자 코드 포인트가 포함된 경우와 유사하게, SingleLineHTMLCloseComment도 구문 문법에 의한 파싱에서는 LineTerminator로 간주된다.

B.1.2 정규 표현식 패턴

22.2.1의 문법은 다음과 같이 수정되고 확장된다. 이러한 변경으로 인해 모호성이 발생할 수 있으며, 이는 문법 생성 규칙의 순서와 문맥 정보에 의해 해결된다. 다음 문법을 사용하여 파싱할 때, 각 대안은 이전 생성 규칙의 대안이 일치하지 않을 경우에만 고려된다.

이 대체 패턴 문법과 의미론은 BMP 패턴의 문법과 의미론만 변경한다. 아래의 문법 확장에는 [UnicodeMode] 매개변수가 있는 생성식이 포함되어 있지만, 이러한 확장 중 어느 것도 목표 기호에 [UnicodeMode] 매개변수가 존재할 때 인식되는 유니코드 패턴의 문법을 변경하지 않는다.

문법

Term[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: [+UnicodeMode] Assertion[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] [+UnicodeMode] Atom[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] Quantifier [+UnicodeMode] Atom[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] [~UnicodeMode] QuantifiableAssertion[?NamedCaptureGroups] Quantifier [~UnicodeMode] Assertion[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] [~UnicodeMode] ExtendedAtom[?NamedCaptureGroups] Quantifier [~UnicodeMode] ExtendedAtom[?NamedCaptureGroups] Assertion[UnicodeMode, UnicodeSetsMode, NamedCaptureGroups] :: ^ $ \b \B [+UnicodeMode] (?= Disjunction[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) [+UnicodeMode] (?! Disjunction[+UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) [~UnicodeMode] QuantifiableAssertion[?NamedCaptureGroups] (?<= Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) (?<! Disjunction[?UnicodeMode, ?UnicodeSetsMode, ?NamedCaptureGroups] ) QuantifiableAssertion[NamedCaptureGroups] :: (?= Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) (?! Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) ExtendedAtom[NamedCaptureGroups] :: . \ AtomEscape[~UnicodeMode, ?NamedCaptureGroups] \ [lookahead = c] CharacterClass[~UnicodeMode, ~UnicodeSetsMode] ( GroupSpecifier[~UnicodeMode]opt Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers : Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) (? RegularExpressionModifiers - RegularExpressionModifiers : Disjunction[~UnicodeMode, ~UnicodeSetsMode, ?NamedCaptureGroups] ) InvalidBracedQuantifier ExtendedPatternCharacter InvalidBracedQuantifier :: { DecimalDigits[~Sep] } { DecimalDigits[~Sep] ,} { DecimalDigits[~Sep] , DecimalDigits[~Sep] } ExtendedPatternCharacter :: SourceCharacter but not one of ^ $ \ . * + ? ( ) [ | AtomEscape[UnicodeMode, NamedCaptureGroups] :: [+UnicodeMode] DecimalEscape [~UnicodeMode] DecimalEscape but only if the CapturingGroupNumber of DecimalEscape is ≤ CountLeftCapturingParensWithin(the Pattern containing DecimalEscape) CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode, ?NamedCaptureGroups] [+NamedCaptureGroups] k GroupName[?UnicodeMode] CharacterEscape[UnicodeMode, NamedCaptureGroups] :: ControlEscape c AsciiLetter 0 [lookahead ∉ DecimalDigit] HexEscapeSequence RegExpUnicodeEscapeSequence[?UnicodeMode] [~UnicodeMode] LegacyOctalEscapeSequence IdentityEscape[?UnicodeMode, ?NamedCaptureGroups] IdentityEscape[UnicodeMode, NamedCaptureGroups] :: [+UnicodeMode] SyntaxCharacter [+UnicodeMode] / [~UnicodeMode] SourceCharacterIdentityEscape[?NamedCaptureGroups] SourceCharacterIdentityEscape[NamedCaptureGroups] :: [~NamedCaptureGroups] SourceCharacter but not c [+NamedCaptureGroups] SourceCharacter but not one of c or k ClassAtomNoDash[UnicodeMode, NamedCaptureGroups] :: SourceCharacter but not one of \ or ] or - \ ClassEscape[?UnicodeMode, ?NamedCaptureGroups] \ [lookahead = c] ClassEscape[UnicodeMode, NamedCaptureGroups] :: b [+UnicodeMode] - [~UnicodeMode] c ClassControlLetter CharacterClassEscape[?UnicodeMode] CharacterEscape[?UnicodeMode, ?NamedCaptureGroups] ClassControlLetter :: DecimalDigit _ 참고

같은 좌변이 [+UnicodeMode]와 [~UnicodeMode] 가드를 모두 가지고 있을 때, 이는 모호성 우선순위를 제어하기 위한 것이다.

B.1.2.1 정적 의미론: 초기 에러

22.2.1.1의 의미론은 아래와 같이 확장된다:

ExtendedAtom :: InvalidBracedQuantifier
  • 이 생성식에 의해 소스 텍스트가 일치하면 구문 오류(Syntax Error)이다.

추가적으로, 아래 생성식에 대한 규칙은 강조된 텍스트가 추가되어 수정된다:

NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents

B.1.2.2 정적 의미론: CountLeftCapturingParensWithin 및 CountLeftCapturingParensBefore

CountLeftCapturingParensWithinCountLeftCapturingParensBefore의 정의에서, “ Atom :: ( GroupSpecifieropt Disjunction ) ”에 대한 참조는 “ Atom :: ( GroupSpecifieropt Disjunction ) ” 또는 “ ExtendedAtom :: ( GroupSpecifieropt Disjunction ) ”로 해석되어야 한다.

B.1.2.3 정적 의미론: IsCharacterClass

22.2.1.6의 의미론은 다음과 같이 확장된다:

ClassAtomNoDash :: \ [lookahead = c]
  1. false를 반환한다.

B.1.2.4 정적 의미론: CharacterValue

22.2.1.7의 의미론은 다음과 같이 확장된다:

ClassAtomNoDash :: \ [lookahead = c]
  1. U+005C(REVERSE SOLIDUS)의 숫자 값을 반환한다.
ClassEscape :: c ClassControlLetter
  1. chClassControlLetter에 의해 일치된 코드 포인트로 한다.
  2. ich의 숫자 값으로 한다.
  3. i를 32로 나눈 나머지를 반환한다.
CharacterEscape :: LegacyOctalEscapeSequence
  1. LegacyOctalEscapeSequence의 MV를 반환한다( 12.9.4.3 참조).

B.1.2.5 실행 의미론: CompileSubpattern

CompileSubpattern의 의미론은 다음과 같이 확장된다:

Term :: QuantifiableAssertion Quantifier 규칙은 Term :: Atom Quantifier 규칙과 동일하지만, QuantifiableAssertionAtom 대신 대입된다.

Term :: ExtendedAtom Quantifier 규칙은 Term :: Atom Quantifier 규칙과 동일하지만, ExtendedAtomAtom 대신 대입된다.

Term :: ExtendedAtom 규칙은 Term :: Atom 규칙과 동일하지만, ExtendedAtomAtom 대신 대입된다.

B.1.2.6 실행 의미론: CompileAssertion

CompileAssertion 규칙에서 Assertion :: (?= Disjunction ) Assertion :: (?! Disjunction ) 생성식이 QuantifiableAssertion 생성식에도 사용되지만, QuantifiableAssertionAssertion 대신 대입된다.

B.1.2.7 실행 의미론: CompileAtom

CompileAtom 규칙은 Atom 생성식에 적용되지만 Atom :: PatternCharacter 를 제외하고, ExtendedAtom 생성식에도 적용되며, ExtendedAtomAtom 대신 대입된다. 다음과 같은 direction 매개변수를 가진 규칙도 추가된다:

ExtendedAtom :: \ [lookahead = c]
  1. A를 문자 \ U+005C(REVERSE SOLIDUS)를 포함하는 CharSet으로 한다.
  2. CharacterSetMatcher(rer, A, false, direction)을 반환한다.
ExtendedAtom :: ExtendedPatternCharacter
  1. chExtendedPatternCharacter가 나타내는 문자로 한다.
  2. A를 문자 ch를 포함하는 1-요소 CharSet으로 한다.
  3. CharacterSetMatcher(rer, A, false, direction)을 반환한다.

B.1.2.8 실행 의미론: CompileToCharSet

22.2.2.9의 의미론은 다음과 같이 확장된다:

다음 두 규칙은 CompileToCharSet의 해당 규칙을 대체한다.

NonemptyClassRanges :: ClassAtom - ClassAtom ClassContents
  1. A를 첫 번째 ClassAtom에 대해 CompileToCharSet(rer)로 한다.
  2. B를 두 번째 ClassAtom에 대해 CompileToCharSet(rer)로 한다.
  3. CClassContents에 대해 CompileToCharSet(rer)로 한다.
  4. DCharacterRangeOrUnion(rer, A, B)로 한다.
  5. DC의 합집합을 반환한다.
NonemptyClassRangesNoDash :: ClassAtomNoDash - ClassAtom ClassContents
  1. AClassAtomNoDash에 대해 CompileToCharSet(rer)로 한다.
  2. BClassAtom에 대해 CompileToCharSet(rer)로 한다.
  3. CClassContents에 대해 CompileToCharSet(rer)로 한다.
  4. DCharacterRangeOrUnion(rer, A, B)로 한다.
  5. DC의 합집합을 반환한다.

또한, 아래 규칙들이 CompileToCharSet에 추가된다.

ClassEscape :: c ClassControlLetter
  1. cv를 이 ClassEscapeCharacterValue로 한다.
  2. c를 문자 값이 cv인 문자로 한다.
  3. c만 포함하는 CharSet을 반환한다.
ClassAtomNoDash :: \ [lookahead = c]
  1. 문자 \ U+005C(REVERSE SOLIDUS)만 포함하는 CharSet을 반환한다.
참고
이 생성식은 문자 클래스 내에서 \c 시퀀스에서 뒤에 허용되는 제어 문자가 오지 않을 때만 도달할 수 있다.

B.1.2.8.1 CharacterRangeOrUnion ( rer, A, B )

추상 연산 CharacterRangeOrUnion은 rer(RegExp Record), A(CharSet), B(CharSet) 인수를 받아 CharSet을 반환한다. 호출될 때 다음 단계를 수행한다:

  1. HasEitherUnicodeFlag(rer) 가 false이면
    1. A에 정확히 하나의 문자만 포함되어 있지 않거나 B에 정확히 하나의 문자만 포함되어 있지 않으면
      1. C를 문자 - U+002D(HYPHEN-MINUS)만 포함하는 CharSet으로 한다.
      2. A, B, CCharSets의 합집합을 반환한다.
  2. CharacterRange(A, B)를 반환한다.

B.1.2.9 정적 의미론: ParsePattern ( patternText, u, v )

22.2.3.4의 의미론은 다음과 같이 확장된다:

추상 연산 ParsePatternpatternText(유니코드 코드 포인트의 시퀀스), u(불리언), v(불리언) 인수를 받아, 호출 시 다음 단계를 수행한다:

  1. vtrue이고 utrue이면,
    1. parseResult를 하나 이상의 SyntaxError 객체를 포함하는 List로 한다.
  2. 그렇지 않고 vtrue이면,
    1. parseResultParseText(patternText, Pattern[+UnicodeMode, +UnicodeSetsMode, +NamedCaptureGroups])로 한다.
  3. 그렇지 않고 utrue이면,
    1. parseResultParseText(patternText, Pattern[+UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups])로 한다.
  4. 그 밖의 경우,
    1. parseResultParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, ~NamedCaptureGroups])로 한다.
    2. parseResultParse Node이고 parseResultGroupName을 포함하면,
      1. parseResultParseText(patternText, Pattern[~UnicodeMode, ~UnicodeSetsMode, +NamedCaptureGroups])로 설정한다.
  5. parseResult를 반환한다.

B.2 추가 내장 속성

ECMAScript 호스트가 웹 브라우저인 경우 표준 내장 객체의 다음 추가 프로퍼티가 정의된다.

B.2.1 전역 객체의 추가 속성

표 102의 항목들이 표 6에 추가된다.

표 102: 추가로 잘 알려진 내장 객체
내장 이름 전역 이름 ECMAScript 언어 연관
%escape% escape escape 함수 (B.2.1.1)
%unescape% unescape unescape 함수 (B.2.1.2)

B.2.1.1 escape ( string )

이 함수는 전역 객체의 프로퍼티이다. 이는 특정 코드 유닛이 16진수 이스케이프 시퀀스로 치환된 새로운 String 값을 계산한다.

숫자 값이 0x00FF 이하인 코드 유닛을 치환할 때는 %xx 형태의 두 자리 이스케이프 시퀀스를 사용한다. 숫자 값이 0x00FF를 초과하는 코드 유닛을 치환할 때는 %uxxxx 형태의 네 자리 이스케이프 시퀀스를 사용한다.

이것은 %escape% 내장 객체이다.

호출 시 아래 단계를 수행한다:

  1. string을 ? ToString(string)으로 설정한다.
  2. lenstring의 길이로 한다.
  3. R을 빈 문자열로 한다.
  4. unescapedSetstring-concatenation으로 ASCII 워드 문자"@*+-./"을 합친 값으로 한다.
  5. k를 0으로 한다.
  6. k < len 동안 반복한다,
    1. Cstring의 인덱스 k에 있는 코드 유닛으로 한다.
    2. unescapedSetC가 포함되어 있으면,
      1. SC로 한다.
    3. 그렇지 않으면,
      1. nC의 숫자 값으로 한다.
      2. n < 256이면,
        1. hexn의 대문자 16진수 문자열로 한다.
        2. Sstring-concatenation 으로 "%"StringPad(hex, 2, "0", start)을 합친 값으로 한다.
      3. 그 밖의 경우,
        1. hexn의 대문자 16진수 문자열로 한다.
        2. Sstring-concatenation 으로 "%u"StringPad(hex, 4, "0", start)을 합친 값으로 한다.
    4. Rstring-concatenation으로 RS를 합친 값으로 한다.
    5. kk + 1로 한다.
  7. R을 반환한다.
참고

인코딩은 부분적으로 RFC 1738에서 설명된 인코딩을 기반으로 하지만, 이 표준에서 지정된 전체 인코딩은 RFC 1738의 내용과 상관없이 위에 설명되어 있다. 이 인코딩은 RFC 3986에 의해 RFC 1738에 적용된 변경 사항을 반영하지 않는다.

B.2.1.2 unescape ( string )

이 함수는 전역 객체의 프로퍼티이다. 이는 escape 함수로 생성될 수 있는 모든 종류의 이스케이프 시퀀스가 그에 해당하는 코드 유닛으로 치환된 새로운 String 값을 계산한다.

이것은 %unescape% 내장 객체이다.

호출 시 아래 단계를 수행한다:

  1. string을 ? ToString(string)으로 설정한다.
  2. lenstring의 길이로 한다.
  3. R을 빈 문자열로 한다.
  4. k를 0으로 한다.
  5. k < len 동안 반복한다,
    1. Cstring의 인덱스 k에 있는 코드 유닛으로 한다.
    2. C가 0x0025(PERCENT SIGN) 코드 유닛이면,
      1. hexDigits를 빈 문자열로 한다.
      2. optionalAdvance를 0으로 한다.
      3. k + 5 < len이고 string의 인덱스 k + 1 코드 유닛이 0x0075 (LATIN SMALL LETTER U)이면,
        1. hexDigitssubstring으로 stringk + 2부터 k + 6까지로 한다.
        2. optionalAdvance를 5로 한다.
      4. 그 밖에 k + 3 ≤ len이면,
        1. hexDigitssubstring으로 stringk + 1부터 k + 3까지로 한다.
        2. optionalAdvance를 2로 한다.
      5. parseResultParseText(hexDigits, HexDigits[~Sep])로 한다.
      6. parseResultParse Node이면,
        1. nparseResult의 MV로 한다.
        2. C를 숫자 값이 n인 코드 유닛으로 한다.
        3. kk + optionalAdvance로 한다.
    3. Rstring-concatenation으로 RC를 합친 값으로 한다.
    4. kk + 1로 한다.
  6. R을 반환한다.

B.2.2 String.prototype 객체의 추가 속성

B.2.2.1 String.prototype.substr ( start, length )

이 메서드는 this 값을 String으로 변환한 결과의 substring을 반환한다. 시작 인덱스는 start이고, length 코드 유닛(또는 lengthundefined이면 문자열 끝까지)이다. start가 음수이면 sourceLength + start로 취급한다. sourceLength는 String의 길이이다. 결과는 String 값이며, String 객체가 아니다.

호출 시 아래 단계를 수행한다:

  1. O를 ? RequireObjectCoercible(this value)로 한다.
  2. S를 ? ToString(O)로 한다.
  3. sizeS의 길이로 한다.
  4. intStart를 ? ToIntegerOrInfinity(start)로 한다.
  5. intStart = -∞이면, intStart를 0으로 설정한다.
  6. 그 밖에 intStart < 0이면, intStartmax(size + intStart, 0)로 한다.
  7. 그 밖에는 intStartmin(intStart, size)로 한다.
  8. lengthundefined이면 intLengthsize로 하고, 그렇지 않으면 intLength를 ? ToIntegerOrInfinity(length)로 한다.
  9. intLengthclamping으로 0과 size 사이로 제한한다.
  10. intEndmin(intStart + intLength, size)로 한다.
  11. SintStart부터 intEnd까지의 substring을 반환한다.
참고

이 메서드는 의도적으로 제네릭이다. this 값이 반드시 String 객체일 필요는 없다. 따라서 다른 종류의 객체에 메서드로 전달해서 사용할 수 있다.

B.2.2.2 String.prototype.anchor ( name )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "a", "name", name)을 반환한다.

B.2.2.2.1 CreateHTML ( string, tag, attribute, value )

추상 연산 CreateHTML은 string(ECMAScript 언어 값), tag(문자열), attribute(문자열), value(ECMAScript 언어 값) 인수를 받아, 문자열을 포함하는 정상 완료 또는 throw 완료를 반환한다. 호출 시 아래 단계를 수행한다:

  1. str를 ? RequireObjectCoercible(string)로 한다.
  2. S를 ? ToString(str)로 한다.
  3. p1string-concatenation으로 "<"tag를 합친 값으로 한다.
  4. attribute가 빈 문자열이 아니면,
    1. V를 ? ToString(value)로 한다.
    2. escapedVV와 동일하되, V에서 0x0022(QUOTATION MARK) 코드 유닛이 나타날 때마다 "&quot;"로 치환된 값으로 한다.
    3. p1string-concatenation으로 다음을 합친 값으로 한다:
      • p1
      • 0x0020 (SPACE) 코드 유닛
      • attribute
      • 0x003D (EQUALS SIGN) 코드 유닛
      • 0x0022 (QUOTATION MARK) 코드 유닛
      • escapedV
      • 0x0022 (QUOTATION MARK) 코드 유닛
  5. p2string-concatenation으로 p1">"을 합친 값으로 한다.
  6. p3string-concatenation으로 p2S를 합친 값으로 한다.
  7. p4string-concatenation으로 p3, "</", tag, ">"을 합친 값으로 한다.
  8. p4를 반환한다.

B.2.2.3 String.prototype.big ( )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "big", "", "")을 반환한다.

B.2.2.4 String.prototype.blink ( )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "blink", "", "")을 반환한다.

B.2.2.5 String.prototype.bold ( )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "b", "", "")을 반환한다.

B.2.2.6 String.prototype.fixed ( )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "tt", "", "")을 반환한다.

B.2.2.7 String.prototype.fontcolor ( colour )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "font", "color", colour)을 반환한다.

B.2.2.8 String.prototype.fontsize ( size )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "font", "size", size)을 반환한다.

B.2.2.9 String.prototype.italics ( )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "i", "", "")을 반환한다.

B.2.2.10 String.prototype.link ( url )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "a", "href", url)을 반환한다.

B.2.2.11 String.prototype.small ( )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "small", "", "")을 반환한다.

B.2.2.12 String.prototype.strike ( )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "strike", "", "")을 반환한다.

B.2.2.13 String.prototype.sub ( )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "sub", "", "")을 반환한다.

B.2.2.14 String.prototype.sup ( )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Sthis 값으로 한다.
  2. CreateHTML(S, "sup", "", "")을 반환한다.

B.2.2.15 String.prototype.trimLeft ( )

참고

"trimStart" 프로퍼티가 권장된다. "trimLeft" 프로퍼티는 주로 기존 코드와의 호환을 위해 제공된다. 새로운 ECMAScript 코드는 "trimStart" 프로퍼티를 사용하는 것이 권장된다.

"trimLeft" 프로퍼티의 초기 값은 22.1.3.34에서 정의된 %String.prototype.trimStart%이다.

B.2.2.16 String.prototype.trimRight ( )

참고

"trimEnd" 프로퍼티가 권장된다. "trimRight" 프로퍼티는 주로 기존 코드와의 호환을 위해 제공된다. 새로운 ECMAScript 코드는 "trimEnd" 프로퍼티를 사용하는 것이 권장된다.

"trimRight" 프로퍼티의 초기 값은 22.1.3.33에서 정의된 %String.prototype.trimEnd%이다.

B.2.3 Date.prototype 객체의 추가 속성

B.2.3.1 Date.prototype.getYear ( )

참고

getFullYear 메서드가 거의 모든 목적에 권장된다. 이 메서드는 “2000년 문제”를 피할 수 있기 때문이다.

이 메서드는 호출 시 아래 단계를 수행한다:

  1. dateObjectthis 값으로 한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 한다.
  4. tNaN이면 NaN을 반환한다.
  5. YearFromTime(LocalTime(t)) - 1900𝔽를 반환한다.

B.2.3.2 Date.prototype.setYear ( year )

참고

setFullYear 메서드가 거의 모든 목적에 권장된다. 이 메서드는 “2000년 문제”를 피할 수 있기 때문이다.

이 메서드는 호출 시 아래 단계를 수행한다:

  1. dateObjectthis 값으로 한다.
  2. RequireInternalSlot(dateObject, [[DateValue]])를 수행한다.
  3. tdateObject.[[DateValue]]로 한다.
  4. y를 ? ToNumber(year)로 한다.
  5. tNaN이면 t+0𝔽로, 그렇지 않으면 LocalTime(t)로 한다.
  6. yyyyMakeFullYear(y)로 한다.
  7. dMakeDay(yyyy, MonthFromTime(t), DateFromTime(t))로 한다.
  8. dateMakeDate(d, TimeWithinDay(t))로 한다.
  9. uTimeClip(UTC(date))로 한다.
  10. dateObject.[[DateValue]]u로 설정한다.
  11. u를 반환한다.

B.2.3.3 Date.prototype.toGMTString ( )

참고

toUTCString 메서드가 권장된다. 이 메서드는 주로 기존 코드와의 호환을 위해 제공된다.

"toGMTString" 프로퍼티의 초기 값은 21.4.4.43에서 정의된 %Date.prototype.toUTCString%이다.

B.2.4 RegExp.prototype 객체의 추가 속성

B.2.4.1 RegExp.prototype.compile ( pattern, flags )

이 메서드는 호출 시 아래 단계를 수행한다:

  1. Othis 값으로 한다.
  2. RequireInternalSlot(O, [[RegExpMatcher]])를 수행한다.
  3. pattern객체이고 pattern[[RegExpMatcher]] 내부 슬롯이 있으면,
    1. flagsundefined가 아니면 TypeError 예외를 throw한다.
    2. Ppattern.[[OriginalSource]]로 한다.
    3. Fpattern.[[OriginalFlags]]로 한다.
  4. 그 밖에는,
    1. Ppattern으로 한다.
    2. Fflags로 한다.
  5. RegExpInitialize(O, P, F)를 반환한다.
참고

이 메서드는 this 값 RegExp를 새로운 패턴과 플래그로 완전히 재초기화한다. 구현체는 이 메서드 사용을 결과 RegExp 객체가 여러 번 사용될 것이며 추가 최적화 후보라는 단언으로 해석할 수 있다.

B.3 기타 추가 기능

B.3.1 라벨이 지정된 함수 선언

ECMAScript 2015 이전에는 LabelledStatement의 명세가 FunctionDeclaration에 문장 라벨을 연관시키는 것을 허용하지 않았다. 그러나 라벨이 지정된 FunctionDeclaration비엄격 코드에 허용되는 확장이었고, 대부분의 브라우저 기반 ECMAScript 구현체가 이를 지원했다. ECMAScript 2015 이후에는 LabelledStatement에 대한 문법 생성식이 FunctionDeclarationLabelledItem으로 사용할 수 있도록 허용하지만, 14.13.1에서는 해당 경우에 구문 오류(Syntax Error)를 발생시키는 Early Error 규칙이 있다. 그 규칙은 강조된 텍스트가 추가되어 수정된다:

LabelledItem : FunctionDeclaration
  • 이 생성식에 의해 엄격 모드 코드인 소스 텍스트가 일치하면 구문 오류(Syntax Error)이다.
참고

early error 규칙은 WithStatement, IfStatement, IterationStatement비엄격 코드에서 라벨이 지정된 FunctionDeclaration를 포함하는 것을 방지한다.

B.3.2 블록 레벨 함수 선언 웹 레거시 호환 의미론

ECMAScript 2015 이전에는 ECMAScript 명세가 FunctionDeclarationBlock 문장의 StatementList의 요소로 등장하는 경우를 정의하지 않았다. 그러나 그런 형태의 FunctionDeclaration 지원은 허용되는 확장이었고, 대부분의 브라우저 기반 ECMAScript 구현체가 이를 허용했다. 불행히도 그러한 선언의 의미론은 구현체마다 다르다. 이러한 의미론적 차이 때문에, 해당 선언을 사용하는 기존 웹 ECMAScript 소스 텍스트는 이러한 선언에 대한 모든 브라우저 구현체의 의미론적 교집합에만 의존할 경우에만 이식 가능하다. 다음은 그 교집합 의미론에 속하는 사용 사례이다:

  1. 함수가 선언되고 오직 하나의 블록 내에서만 참조되는 경우.

  2. 함수가 선언되고 하나의 Block 내에서만 사용될 수 있지만, 그 블록에 포함되지 않은 내부 함수 정의에서 참조되는 경우.

    • f라는 BindingIdentifier를 가진 하나 이상의 FunctionDeclaration이 외부 함수 g의 함수 코드 내에 등장하며, 해당 선언은 Block 내에 중첩되어 있다.
    • g의 함수 코드 내에 var 선언이 아닌 f의 다른 선언은 존재하지 않는다.
    • fIdentifierReference로 등장하는 경우는 f를 선언한 BlockStatementList 내에 있을 수 있다.
    • h라는 다른 함수 내에 fIdentifierReference로 등장하는 경우가 적어도 하나 있으며, hg 내에 중첩되어 있고, f의 참조를 내부에서 가리는 다른 선언은 없다.
    • h의 모든 호출은 f 선언이 평가된 이후에 발생한다.
  3. 함수가 선언되고 하나의 블록 내에서만 사용될 수 있지만, 이후의 블록 내에서 참조되는 경우.

    • f라는 BindingIdentifier를 가진 하나 이상의 FunctionDeclaration이 외부 함수 g의 함수 코드 내에 등장하며, 해당 선언은 Block 내에 중첩되어 있다.
    • g의 함수 코드 내에 var 선언이 아닌 f의 다른 선언은 존재하지 않는다.
    • fIdentifierReference로 등장하는 경우는 f를 선언한 BlockStatementList 내에 있을 수 있다.
    • g의 함수 코드 내에서 fIdentifierReference로 등장하는 경우가 적어도 하나 있으며, 해당 참조는 f 선언이 포함된 Block을 어휘적으로 따라온다.

첫 번째 사용 사례는 ECMAScript 2015에서 제공되는 Block 레벨 함수 선언 의미론과 상호 운용 가능하다. 해당 사용 사례를 사용하는 기존 ECMAScript 소스 텍스트10, 14, 15 절에 정의된 Block 레벨 함수 선언 의미론을 사용하여 동작한다.

두 번째 및 세 번째 사용 사례에 대한 ECMAScript 2015 상호 운용성을 위해서는 10 절, 15 절, 19.2.1 절, 16.1.7 절 의미론에 대한 다음과 같은 확장이 필요하다.

ECMAScript 구현체가 진단 경고 메시지를 보고하는 메커니즘을 제공하는 경우, 이러한 호환 의미론이 적용되어 비호환 의미론과 관찰 가능한 차이를 일으키는 FunctionDeclaration이 포함된 코드에 대해 경고가 표시되어야 한다. 예를 들어, var 바인딩의 도입이 early error를 발생시키기 때문에 도입되지 않는 경우에는 경고 메시지를 표시하지 않아야 한다.

B.3.2.1 FunctionDeclarationInstantiation의 변경 사항

FunctionDeclarationInstantiation 중에 아래 단계들이 31단계 대신 수행된다:

  1. strictfalse이면,
    1. 아래 조건을 만족하는 모든 FunctionDeclaration f에 대하여: code Contains xtrue인, StatementList가 어떤 Block, CaseClause, DefaultClause x에 직접 포함되어 있는 경우
      1. FfBindingIdentifierStringValue로 한다.
      2. FunctionDeclaration fFBindingIdentifier로 갖는 VariableStatement로 대체할 때 func에 Early Error가 발생하지 않고, parameterNamesF가 포함되어 있지 않으면,
        1. NOTE: F에 대한 var 바인딩은 여기서 VarDeclaredName, 함수의 형식 매개변수 이름, 또는 다른 FunctionDeclaration이 아닌 경우에만 인스턴스화된다.
        2. instantiatedVarNamesF가 없고 F"arguments"가 아니면,
          1. varEnv.CreateMutableBinding(F, false)를 수행한다.
          2. varEnv.InitializeBinding(F, undefined)를 수행한다.
          3. FinstantiatedVarNames에 추가한다.
        3. FunctionDeclaration f가 평가될 때, Evaluation 알고리즘(15.2.6) 대신 다음 단계를 수행한다:
          1. fEnv실행 중인 실행 컨텍스트의 VariableEnvironment로 한다.
          2. bEnv실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
          3. fObj를 ! bEnv.GetBindingValue(F, false)로 한다.
          4. fEnv.SetMutableBinding(F, fObj, false)를 수행한다.
          5. unused를 반환한다.

B.3.2.2 GlobalDeclarationInstantiation의 변경 사항

GlobalDeclarationInstantiation 중에 아래 단계들이 12단계 대신 수행된다:

  1. 아래 단계들을 수행한다:
    1. strictscriptScriptIsStrict로 한다.
    2. strictfalse이면,
      1. declaredFunctionOrVarNamesdeclaredFunctionNamesdeclaredVarNameslist-concatenation로 한다.
      2. 아래 조건을 만족하는 모든 FunctionDeclaration f에 대하여: script Contains xtrue인, StatementList가 어떤 Block, CaseClause, 또는 DefaultClause x에 직접 포함되어 있는 경우
        1. FfBindingIdentifierStringValue로 한다.
        2. FunctionDeclaration fFBindingIdentifier로 갖는 VariableStatement로 대체할 때 script에 Early Error가 발생하지 않으면,
          1. HasLexicalDeclaration(env, F)가 false이면,
            1. fnDefinable을 ? CanDeclareGlobalVar(env, F)로 한다.
            2. fnDefinabletrue이면,
              1. NOTE: F에 대한 var 바인딩은 여기서 VarDeclaredName도 아니고, 다른 FunctionDeclaration의 이름도 아닌 경우에만 인스턴스화된다.
              2. declaredFunctionOrVarNamesF가 없으면,
                1. CreateGlobalVarBinding(env, F, false)를 수행한다.
                2. FdeclaredFunctionOrVarNames에 추가한다.
              3. FunctionDeclaration f가 평가될 때, Evaluation 알고리즘(15.2.6) 대신 아래 단계를 수행한다:
                1. gEnv실행 중인 실행 컨텍스트의 VariableEnvironment로 한다.
                2. bEnv실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
                3. fObj를 ! bEnv.GetBindingValue(F, false)로 한다.
                4. gEnv.SetMutableBinding(F, fObj, false)를 수행한다.
                5. unused를 반환한다.

B.3.2.3 EvalDeclarationInstantiation의 변경 사항

EvalDeclarationInstantiation 중에 아래 단계들이 13단계 대신 수행된다:

  1. strictfalse이면,
    1. declaredFunctionOrVarNamesdeclaredFunctionNamesdeclaredVarNameslist-concatenation로 한다.
    2. 아래 조건을 만족하는 모든 FunctionDeclaration f에 대하여: body Contains xtrue인, StatementList가 어떤 Block, CaseClause, DefaultClause x에 직접 포함되어 있는 경우
      1. FfBindingIdentifierStringValue로 한다.
      2. FunctionDeclaration fFBindingIdentifier로 갖는 VariableStatement로 대체할 때 body에 Early Error가 발생하지 않으면,
        1. bindingExistsfalse로 한다.
        2. thisEnvlexEnv로 한다.
        3. Assert: 아래 반복문은 종료된다.
        4. thisEnvvarEnv가 아닐 동안 반복한다,
          1. thisEnv객체가 아닌 Environment Record이면,
            1. thisEnv.HasBinding(F)이 true이면,
              1. bindingExiststrue로 한다.
          2. thisEnvthisEnv.[[OuterEnv]]로 한다.
        5. bindingExistsfalse이고 varEnvGlobal Environment Record이면,
          1. HasLexicalDeclaration(varEnv, F)가 false이면,
            1. fnDefinable을 ? CanDeclareGlobalVar(varEnv, F)로 한다.
          2. 그 밖에는,
            1. fnDefinablefalse로 한다.
        6. 그 밖에는,
          1. fnDefinabletrue로 한다.
        7. bindingExistsfalse이고 fnDefinabletrue이면,
          1. declaredFunctionOrVarNamesF가 없으면,
            1. varEnvGlobal Environment Record이면,
              1. CreateGlobalVarBinding(varEnv, F, true)를 수행한다.
            2. 그 밖에는,
              1. bindingExists를 ! varEnv.HasBinding(F)로 한다.
              2. bindingExistsfalse이면,
                1. varEnv.CreateMutableBinding(F, true)를 수행한다.
                2. varEnv.InitializeBinding(F, undefined)를 수행한다.
            3. FdeclaredFunctionOrVarNames에 추가한다.
          2. FunctionDeclaration f가 평가될 때, Evaluation 알고리즘(15.2.6) 대신 아래 단계를 수행한다:
            1. gEnv실행 중인 실행 컨텍스트의 VariableEnvironment로 한다.
            2. bEnv실행 중인 실행 컨텍스트의 LexicalEnvironment로 한다.
            3. fObj를 ! bEnv.GetBindingValue(F, false)로 한다.
            4. gEnv.SetMutableBinding(F, fObj, false)를 수행한다.
            5. unused를 반환한다.

B.3.2.4 Block 정적 의미론: 초기 에러의 변경 사항

14.2.1의 아래 생성식에 대한 규칙은 강조된 텍스트가 추가되어 수정된다:

Block : { StatementList }

B.3.2.5 switch 문 정적 의미론: 초기 에러의 변경 사항

14.12.1의 아래 생성식에 대한 규칙은 강조된 텍스트가 추가되어 수정된다:

SwitchStatement : switch ( Expression ) CaseBlock

B.3.2.6 BlockDeclarationInstantiation의 변경 사항

BlockDeclarationInstantiation 중에 아래 단계들이 3.a.ii.1단계 대신 수행된다:

  1. env.HasBinding(dn)이 false이면
    1. env.CreateMutableBinding(dn, false)를 수행한다.

BlockDeclarationInstantiation 중에 아래 단계들이 3.b.iii단계 대신 수행된다:

  1. 다음 단계를 수행한다:
    1. env에서 fn의 바인딩이 초기화되지 않은 바인딩이면,
      1. env.InitializeBinding(fn, fo)를 수행한다.
    2. 그 밖에는,
      1. Assert: dFunctionDeclaration이다.
      2. env.SetMutableBinding(fn, fo, false)를 수행한다.

B.3.3 IfStatement 문의 구문 절에서의 FunctionDeclarations

다음은 IfStatement 생성 규칙을 14.6에 추가합니다:

IfStatement[Yield, Await, Return] : if ( Expression[+In, ?Yield, ?Await] ) FunctionDeclaration[?Yield, ?Await, ~Default] else Statement[?Yield, ?Await, ?Return] if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] else FunctionDeclaration[?Yield, ?Await, ~Default] if ( Expression[+In, ?Yield, ?Await] ) FunctionDeclaration[?Yield, ?Await, ~Default] else FunctionDeclaration[?Yield, ?Await, ~Default] if ( Expression[+In, ?Yield, ?Await] ) FunctionDeclaration[?Yield, ?Await, ~Default] [lookahead ≠ else]

이 생성 규칙은 비엄격 코드 구문을 파싱할 때만 적용됩니다. 이 생성 규칙에 의해 매칭된 소스 텍스트는 각 FunctionDeclaration[?Yield, ?Await, ~Default]의 발생을 해당 소스 텍스트의 그 위치에 있는 StatementListItem의 유일한 BlockStatement인 것처럼 처리합니다. 이러한 합성 BlockStatement의 의미론은 B.3.2에서 명시된 웹 레거시 호환 의미론을 포함합니다.

B.3.4 Catch 블록 내 VariableStatements

14.15.1 하위 절의 내용을 다음으로 대체합니다:

Catch : catch ( CatchParameter ) Block 참고

Catch 절의 Block에는 CatchParameter가 바인딩한 이름과 동일한 이름을 바인딩하는 var 선언이 포함될 수 있습니다. 런타임에는 이러한 바인딩이 VariableDeclarationEnvironment에 생성됩니다. 이들은 CatchParameter에 의해 도입된 동명의 바인딩을 가리지 않으며, 따라서 해당 var 선언의 Initializervar 바인딩이 아니라 catch 파라미터에 할당됩니다.

이 수정된 동작은 BlockCatch 절에 포함된 직접 eval 호출에 의해 도입된 varfunction 선언에도 적용됩니다. 이 변경은 19.2.1.3 알고리즘을 다음과 같이 수정하여 구현됩니다:

3.d.i.2.a.i 단계를 다음으로 대체합니다:

  1. thisEnvCatch 절의 Environment Record가 아니면 SyntaxError 예외를 throw합니다.

13.b.ii.4.a.i.i 단계를 다음으로 대체합니다:

  1. thisEnvCatch 절의 Environment Record가 아니면 bindingExiststrue로 합니다.

B.3.5 ForIn 문 헤드의 Initializer

다음은 ForInOfStatement 생성 규칙을 14.7.5에 추가합니다:

ForInOfStatement[Yield, Await, Return] : for ( var BindingIdentifier[?Yield, ?Await] Initializer[~In, ?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return]

이 생성 규칙은 비엄격 코드 구문을 파싱할 때만 적용됩니다.

정적 의미론ContainsDuplicateLabels (8.3.1) 규칙은 다음과 같이 보강됩니다:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. StatementContainsDuplicateLabelslabelSet 인자로 반환한다.

정적 의미론ContainsUndefinedBreakTarget (8.3.2) 규칙은 다음과 같이 보강됩니다:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. StatementContainsUndefinedBreakTargetlabelSet 인자로 반환한다.

정적 의미론ContainsUndefinedContinueTarget (8.3.3) 규칙은 다음과 같이 보강됩니다:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. StatementContainsUndefinedContinueTargetiterationSet과 « » 인자로 반환한다.

정적 의미론IsDestructuring (14.7.5.2) 규칙은 다음과 같이 보강됩니다:

BindingIdentifier : Identifier yield await
  1. false를 반환한다.

정적 의미론VarDeclaredNames (8.2.6) 규칙은 다음과 같이 보강됩니다:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. names1BindingIdentifierBoundNames로 둔다.
  2. names2StatementVarDeclaredNames로 둔다.
  3. names1names2리스트 연결을 반환한다.

정적 의미론VarScopedDeclarations (8.2.7) 규칙은 다음과 같이 보강됩니다:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. declarations1을 « BindingIdentifier »로 둔다.
  2. declarations2StatementVarScopedDeclarations로 둔다.
  3. declarations1declarations2리스트 연결을 반환한다.

실행 의미론ForInOfLoopEvaluation (14.7.5.5) 규칙은 다음과 같이 보강됩니다:

ForInOfStatement : for ( var BindingIdentifier Initializer in Expression ) Statement
  1. bindingIdBindingIdentifierStringValue로 둔다.
  2. lhs를 ? ResolveBinding(bindingId)로 둔다.
  3. IsAnonymousFunctionDefinition(Initializer)가 true면,
    1. value를 ? NamedEvaluation of Initializer with argument bindingId로 둔다.
  4. 그 외의 경우,
    1. rhs를 ? Evaluation of Initializer로 둔다.
    2. value를 ? GetValue(rhs)로 둔다.
  5. ? PutValue(lhs, value)를 수행한다.
  6. keyResult를 ? ForIn/OfHeadEvaluation(« », Expression, enumerate)로 둔다.
  7. ? ForIn/OfBodyEvaluation(BindingIdentifier, Statement, keyResult, enumerate, var-binding, labelSet)를 반환한다.

B.3.6 [[IsHTMLDDA]] 내부 슬롯

[[IsHTMLDDA]] 내부 슬롯호스트 정의 객체에 존재할 수 있습니다. [[IsHTMLDDA]] 내부 슬롯을 가진 객체는 ToBooleanIsLooselyEqual 추상 연산에서, 그리고 typeof 연산자의 피연산자로 사용될 때 undefined처럼 동작합니다.

참고

[[IsHTMLDDA]] 내부 슬롯을 가진 객체는 이 명세에서 생성되지 않습니다. 하지만 웹 브라우저의 document.all 객체는 웹 호환성을 위해 이 슬롯을 가진 호스트 정의 이국적 객체입니다. 이 유형의 객체는 다른 알려진 예시가 없으며, 구현체는 document.all을 제외하고는 이 슬롯을 가진 객체를 생성하지 않아야 합니다.

B.3.6.1 ToBoolean 변경사항

다음 단계는 3 단계를 ToBoolean에서 대체합니다:

  1. argument객체이고, argument[[IsHTMLDDA]] 내부 슬롯을 가지고 있다면 false를 반환한다.

B.3.6.2 IsLooselyEqual 변경사항

다음 단계는 4 단계를 IsLooselyEqual에서 대체합니다:

  1. 다음 단계를 수행한다:
    1. x객체이고, x[[IsHTMLDDA]] 내부 슬롯을 가지고 있으며, yundefined 또는 null이면 true를 반환한다.
    2. xundefined 또는 null이고, y객체이며 y[[IsHTMLDDA]] 내부 슬롯을 가지고 있다면 true를 반환한다.

B.3.6.3 typeof 연산자 변경사항

다음 단계는 12 단계를 typeof의 평가 의미론에서 대체합니다:

  1. val[[IsHTMLDDA]] 내부 슬롯을 가지고 있다면, "undefined"를 반환한다.

B.3.7 HostMakeJobCallback의 비기본 동작

HostMakeJobCallback 추상 연산은 웹 브라우저인 호스트가 비기본 동작을 지정할 수 있도록 허용합니다.

B.3.8 HostEnsureCanAddPrivateElement의 비기본 동작

HostEnsureCanAddPrivateElement 추상 연산은 웹 브라우저인 호스트가 비기본 동작을 지정할 수 있도록 허용합니다.

B.3.9 함수 호출 할당 대상의 런타임 오류

함수 호출(13.3.6)이 비엄격 코드에서 할당 대상으로 사용될 때, 조기 오류를 발생시키는 대신, 할당 평가 중에 ReferenceError 예외가 발생합니다.

참고

할당 대상이 LeftHandSideExpression이고 AssignmentExpression의 할당 연산자가 = 또는 AssignmentOperator일 때만 허용되며, 논리 할당 연산자(??=, &&=, ||=)에서는 이 허용이 적용되지 않습니다.

자세한 내용은 1 단계 및 AssignmentTargetType에서 다음의 CallExpression : CoverCallExpressionAndAsyncArrowHead CallExpression : CallExpression Arguments 를 참고하세요.

부록 C (정보용) ECMAScript의 엄격 모드

엄격 모드의 제한 및 예외

Annex D (informative) 호스트 계층화 지점

4.2에서 호스트의 정의를 확인하십시오.

D.1 호스트 후크

HostCallJobCallback(...)

HostEnqueueFinalizationRegistryCleanupJob(...)

HostEnqueueGenericJob(...)

HostEnqueuePromiseJob(...)

HostEnqueueTimeoutJob(...)

HostEnsureCanCompileStrings(...)

HostFinalizeImportMeta(...)

HostGetImportMetaProperties(...)

HostGrowSharedArrayBuffer(...)

HostHasSourceTextAvailable(...)

HostLoadImportedModule(...)

HostGetSupportedImportAttributes(...)

HostMakeJobCallback(...)

HostPromiseRejectionTracker(...)

HostResizeArrayBuffer(...)

InitializeHostDefinedRealm(...)

D.2 호스트 정의 필드

[[HostDefined]] (Realm Records에서): 표 24 참고.

[[HostDefined]] (Script Records에서): 표 39 참고.

[[HostDefined]] (Module Records에서): 표 43 참고.

[[HostDefined]] (JobCallback Records에서): 표 28 참고.

[[HostSynchronizesWith]] (Candidate Executions에서): 표 101 참고.

[[IsHTMLDDA]]: B.3.6 참고.

D.3 호스트 정의 객체

전역 객체: 절 19 참고.

D.4 실행 중인 잡(Job)

Job Abstract Closures 호출 전 준비 단계와 호출 후 정리 단계를 포함합니다. 9.5 참고.

D.5 이국적 객체의 내부 메서드

이 명세에 명시되지 않은 이국적 객체에 대해, 표 4의 필수 내부 메서드 중 아무 것이나 사용할 수 있습니다.

D.6 내장 객체 및 메서드

이 명세에 정의되지 않은 모든 내장 객체 및 메서드는 17.1에서 제한된 것을 제외하고 사용 가능합니다.

Annex E (informative) ECMAScript 2015에서의 호환성에 영향을 줄 수 있는 수정 및 명확화

9.1.1.4.14-9.1.1.4.17 5판과 5.1판에서는 새로운 전역 선언에 해당하는 전역 객체 프로퍼티가 이미 존재하는지 확인하기 위해 프로퍼티 존재 여부를 테스트했습니다. ECMAScript 2015는 자체 프로퍼티 존재 여부 테스트를 사용합니다. 이는 대부분의 웹 브라우저에서 일반적으로 구현된 방식과 일치합니다.

10.4.2.1: 5판에서는 현재 배열 길이 캡처를 정수로 변환하기 전에 수행했습니다. 하지만 변환 과정에 배열 길이를 변경하는 부작용이 발생할 수 있으므로, 캡처된 길이 값이 잘못될 수 있습니다. ECMAScript 2015는 이러한 부작용이 발생한 후에 현재 배열 길이를 캡처해야 한다고 명시합니다.

21.4.1.31: 이전 판에서는 TimeClip 추상 연산이 0 시간 값 표현으로 +0𝔽 또는 -0𝔽를 반환할 수 있었습니다. ECMAScript 2015는 반드시 +0𝔽가 반환되어야 한다고 명시합니다. 즉, ECMAScript 2015에서 Date의 시간 값-0𝔽이 되는 경우는 없으며, 시간 값을 반환하는 메서드가 -0𝔽을 반환하는 일도 없습니다.

21.4.1.32: UTC 오프셋 표현이 없으면 로컬 시간대가 사용됩니다. 5.1판에서는 시간대가 없을 경우 "z"로 해석해야 한다고 잘못 명시했습니다.

21.4.4.36: 지정된 21.4.1.32 Date Time String Format으로 연도를 표현할 수 없으면 RangeError 예외가 발생합니다. 이전 판에서는 해당 상황의 동작을 명시하지 않았습니다.

21.4.4.41: 이전 판에서는 Date.prototype.toString시간 값NaN일 때 반환값을 명시하지 않았습니다. ECMAScript 2015는 반환값을 문자열 "Invalid Date"로 명시합니다.

22.2.4.1, 22.2.6.13.1: RegExp 인스턴스의 "source" 프로퍼티 값에 LineTerminator 코드 포인트가 있으면 이스케이프 시퀀스로 표현해야 합니다. 5.1판에서는 /만 이스케이프할 것을 요구했습니다.

22.2.6.8, 22.2.6.11: 이전 판에서는 String.prototype.matchString.prototype.replace의 명세가 RegExp 값의 global 플래그가 설정된 경우에 대해 잘못되었습니다. 이전 명세는 패턴 일치 시도마다 lastIndex가 변하지 않으면 1씩 증가시켜야 한다고 했으나, 올바른 동작은 패턴이 빈 문자열과 일치할 때만 lastIndex를 1 증가시켜야 한다는 것입니다.

23.1.3.30: 이전 판에서는 comparatorNaN을 반환할 경우 Array.prototype.sort가 어떻게 동작하는지 명시하지 않았습니다. ECMAScript 2015는 이 값이 +0𝔽로 간주된다고 명시합니다. 또한 comparator의 반환값에는 ToNumber가 적용됩니다. 이전 판에서는 Number 타입이 아닌 값을 반환할 경우의 효과가 구현 정의였습니다. 실제로는 대부분의 구현에서 ToNumber를 호출합니다.

Annex F (informative) 이전 판과의 비호환성을 유발하는 추가 및 변경 사항

6.2.5: ECMAScript 2015에서는 함수 호출이 Reference Record를 반환하는 것이 허용되지 않습니다.

7.1.4.1: ECMAScript 2015에서는 ToNumber가 String 값에 적용될 때 BinaryIntegerLiteralOctalIntegerLiteral 숫자 문자열을 인식하고 변환합니다. 이전 판에서는 이러한 문자열이 NaN으로 변환되었습니다.

9.3: ECMAScript 2018에서는 템플릿 객체가 구문 노드(소스 위치) 기준으로 정규화됩니다. 이전 판에서는 Realm의 해당 템플릿 리터럴이나 태그드 템플릿의 모든 발생을 기준으로 했습니다.

12.2: ECMAScript 2016에서는 Unicode 8.0.0 이상이 필수입니다. ECMAScript 2015에서는 Unicode 5.1이 필수였습니다. 특히, U+180E 몽골 모음 구분자(Space_Separator 또는 Zs 범주, 2015판에서는 공백)였던 것이 Format(Cf) 범주로 이동했습니다(Unicode 6.3.0부터). 이로 인해 공백에 민감한 메서드의 동작이 달라집니다. 예를 들어, "\u180E".trim().length는 이전 판에서는 0이었으나, ECMAScript 2016 및 이후 판에서는 1입니다. 또한, ECMAScript 2017에서는 항상 최신 Unicode 표준을 사용하도록 요구합니다.

12.7: ECMAScript 2015에서는 IdentifierName에 대해 Unicode 속성 “ID_Start”와 “ID_Continue”로 유효한 코드 포인트를 정의합니다. 이전 판에서는 유효한 IdentifierName 또는 Identifier 코드 포인트를 다양한 Unicode 코드 포인트 범주를 열거하여 정의했습니다.

12.10.1: ECMAScript 2015에서는 자동 세미콜론 삽입이 do-while 문 끝에 세미콜론이 없을 때 이를 추가합니다. 이 변경은 대부분의 기존 구현의 실제 동작과 명세를 일치시킵니다.

13.2.5.1: ECMAScript 2015에서는 객체 이니셜라이저에서 중복 프로퍼티 이름이 있어도 조기 오류가 아닙니다.

13.15.1: ECMAScript 2015에서는 엄격 모드 코드에서 FunctionExpression의 함수 이름 같은 불변 바인딩에 할당할 때 조기 오류가 발생하지 않고, 런타임 오류가 발생합니다.

14.2: ECMAScript 2015에서는 StatementList가 let 토큰으로 시작하고 그 뒤에 LineTerminatorIdentifier 입력 요소가 오면 LexicalDeclaration의 시작으로 간주합니다. 이전 판에서는 자동 세미콜론 삽입이 항상 Identifier 입력 요소 앞에 세미콜론을 삽입했습니다.

14.5: ECMAScript 2015에서는 StatementListItemlet 토큰과 [ 토큰으로 시작하면 LexicalDeclaration의 시작으로 간주합니다. 이전 판에서는 이 시퀀스가 ExpressionStatement의 시작이었습니다.

14.6.2: ECMAScript 2015에서는 IfStatement의 정상 결과가 empty 값이 되는 일이 없습니다. 어떤 Statement 부분도 평가되지 않거나, 평가된 Statement 부분이 empty를 포함하는 정상 완료를 생성하면, IfStatement의 결과는 undefined입니다.

14.7: ECMAScript 2015에서는 for 문의 ( 토큰 바로 뒤에 let [ 토큰 시퀀스가 오면 letLexicalDeclaration의 시작으로 간주됩니다. 이전 판에서는 이 토큰 시퀀스가 Expression의 시작이었습니다.

14.7: ECMAScript 2015에서는 for-in 문의 ( 토큰 바로 뒤에 let [ 토큰 시퀀스가 오면 letForDeclaration의 시작으로 간주됩니다. 이전 판에서는 이 시퀀스가 LeftHandSideExpression의 시작이었습니다.

14.7: ECMAScript 2015 이전에는 in 키워드 앞의 VariableDeclaration에 초기화 식이 올 수 있었습니다. ECMAScript 2015에서는 동일한 위치의 ForBinding에서 이러한 초기화 식이 허용되지 않습니다. ECMAScript 2017에서는 이러한 초기화 식이 비엄격 코드에서만 허용됩니다.

14.7: ECMAScript 2015에서는 IterationStatement를 평가한 결과가 [[Value]]가 empty인 정상 완료가 되는 일이 없습니다. Statement 부분이 평가되지 않거나, IterationStatement의 마지막 Statement 부분이 [[Value]]가 empty인 정상 완료를 생성하면, IterationStatement의 결과는 [[Value]]가 undefined인 정상 완료입니다.

14.11.2: ECMAScript 2015에서는 WithStatement를 평가한 결과가 [[Value]]가 empty인 정상 완료가 되는 일이 없습니다. Statement 부분을 평가한 결과가 [[Value]]가 empty인 정상 완료라면, WithStatement의 평가 결과는 [[Value]]가 undefined인 정상 완료입니다.

14.12.4: ECMAScript 2015에서는 SwitchStatement를 평가한 결과가 [[Value]]가 empty인 정상 완료가 되는 일이 없습니다. CaseBlock 부분을 평가한 결과가 [[Value]]가 empty인 정상 완료라면, SwitchStatement의 평가 결과는 [[Value]]가 undefined인 정상 완료입니다.

14.15: ECMAScript 2015에서는 Catch 절에 해당 IdentifierCatch 절의 파라미터로 나타날 때, 동일한 var 선언이 포함되어 있으면 조기 오류입니다. 이전 판에서는 해당 변수 선언이 둘러싼 변수 환경에 생성되며, 선언의 Initializer 값이 Catch 파라미터에 할당되었습니다.

14.15, 19.2.1.3: ECMAScript 2015에서는 Catch 절이 비엄격 직접 eval을 평가하고, eval 코드에 var 또는 FunctionDeclaration 선언이 해당 Identifier를 바인딩하면 런타임 SyntaxError가 발생합니다.

14.15.3: ECMAScript 2015에서는 TryStatement의 결과가 empty 값이 되는 일이 없습니다. Block 부분이 TryStatement를 평가한 결과가 empty를 포함하는 정상 완료라면, TryStatement의 결과는 undefined입니다. Block 부분이 TryStatement를 평가한 결과가 throw 완료이고, Catch 부분이 empty를 포함하는 정상 완료라면, TryStatement의 결과는 undefined입니다(만약 Finally 절이 없거나, Finally 절의 평가 결과가 empty정상 완료인 경우).

15.4.5 ECMAScript 2015에서는 함수 객체접근자 프로퍼티[[Get]] 또는 [[Set]] 값으로 ObjectLiteral에서 생성될 때, 생성자 함수가 아니며, "prototype" 자체 프로퍼티가 없습니다. 이전 판에서는 생성자였으며 "prototype" 프로퍼티가 있었습니다.

20.1.2.6: ECMAScript 2015에서는 Object.freeze의 인자가 객체가 아니면, 자체 프로퍼티가 없는 비확장 일반 객체처럼 취급됩니다. 이전 판에서는 객체가 아닌 인자에 대해 항상 TypeError가 발생했습니다.

20.1.2.8: ECMAScript 2015에서는 Object.getOwnPropertyDescriptor의 인자가 객체가 아니면 ToObject로 변환을 시도합니다. 변환에 성공하면 결과를 원래 인자 값 대신 사용합니다. 이전 판에서는 객체가 아닌 인자에 대해 항상 TypeError가 발생했습니다.

20.1.2.10: ECMAScript 2015에서는 Object.getOwnPropertyNames의 인자가 객체가 아니면 ToObject로 변환을 시도합니다. 변환에 성공하면 결과를 원래 인자 값 대신 사용합니다. 이전 판에서는 객체가 아닌 인자에 대해 항상 TypeError가 발생했습니다.

20.1.2.12: ECMAScript 2015에서는 Object.getPrototypeOf의 인자가 객체가 아니면 ToObject로 변환을 시도합니다. 변환에 성공하면 결과를 원래 인자 값 대신 사용합니다. 이전 판에서는 객체가 아닌 인자에 대해 항상 TypeError가 발생했습니다.

20.1.2.16: ECMAScript 2015에서는 Object.isExtensible의 인자가 객체가 아니면 자체 프로퍼티가 없는 비확장 일반 객체처럼 취급됩니다. 이전 판에서는 객체가 아닌 인자에 대해 항상 TypeError가 발생했습니다.

20.1.2.17: ECMAScript 2015에서는 Object.isFrozen의 인자가 객체가 아니면 자체 프로퍼티가 없는 비확장 일반 객체처럼 취급됩니다. 이전 판에서는 객체가 아닌 인자에 대해 항상 TypeError가 발생했습니다.

20.1.2.18: ECMAScript 2015에서는 Object.isSealed의 인자가 객체가 아니면 자체 프로퍼티가 없는 비확장 일반 객체처럼 취급됩니다. 이전 판에서는 객체가 아닌 인자에 대해 항상 TypeError가 발생했습니다.

20.1.2.19: ECMAScript 2015에서는 Object.keys의 인자가 객체가 아니면 ToObject로 변환을 시도합니다. 변환에 성공하면 결과를 원래 인자 값 대신 사용합니다. 이전 판에서는 객체가 아닌 인자에 대해 항상 TypeError가 발생했습니다.

20.1.2.20: ECMAScript 2015에서는 Object.preventExtensions의 인자가 객체가 아니면 자체 프로퍼티가 없는 비확장 일반 객체처럼 취급됩니다. 이전 판에서는 객체가 아닌 인자에 대해 항상 TypeError가 발생했습니다.

20.1.2.22: ECMAScript 2015에서는 Object.seal의 인자가 객체가 아니면 자체 프로퍼티가 없는 비확장 일반 객체처럼 취급됩니다. 이전 판에서는 객체가 아닌 인자에 대해 항상 TypeError가 발생했습니다.

20.2.3.2: ECMAScript 2015에서는 바인드 함수의 [[Prototype]] 내부 슬롯이 타겟 함수의 [[GetPrototypeOf]] 값으로 설정됩니다. 이전 판에서는 [[Prototype]]이 항상 %Function.prototype%로 설정되었습니다.

20.2.4.1: ECMAScript 2015에서는 함수 인스턴스의 "length" 프로퍼티가 설정 가능(configurable)합니다. 이전 판에서는 설정 불가능(non-configurable)했습니다.

20.5.6.2: ECMAScript 2015에서는 NativeError 생성자[[Prototype]] 내부 슬롯이 Error 생성자입니다. 이전 판에서는 Function prototype object였습니다.

21.4.4 ECMAScript 2015에서는 Date prototype object가 Date 인스턴스가 아닙니다. 이전 판에서는 TimeValue가 NaN인 Date 인스턴스였습니다.

22.1.3.12 ECMAScript 2015에서는 String.prototype.localeCompare 함수가 Unicode 표준에 따라 정규적으로 동등한 문자열을 동일하게 취급해야 합니다. 이전 판에서는 구현체가 정규 동등성을 무시하고 비트 단위 비교를 사용할 수 있었습니다.

22.1.3.2822.1.3.30 ECMAScript 2015에서는 소문자/대문자 변환이 코드 포인트 단위로 처리됩니다. 이전 판에서는 개별 코드 유닛에만 변환을 적용했습니다. 실제로 영향을 받는 코드 포인트는 Unicode의 데저렛 블록에 속하는 것들입니다.

22.1.3.32 ECMAScript 2015에서는 String.prototype.trim 메서드가 Unicode BMP 밖에도 존재할 수 있는 공백 코드 포인트를 인식하도록 정의됩니다. 하지만 Unicode 7 기준으로 그런 코드 포인트는 정의되어 있지 않습니다. 이전 판에서는 그런 코드 포인트가 공백으로 인식되지 않았습니다.

22.2.4.1 ECMAScript 2015에서는 pattern 인자가 RegExp 인스턴스이고 flags 인자가 undefined가 아닌 경우, pattern과 거의 동일하지만 flags 인자로 플래그가 대체된 새로운 RegExp 인스턴스를 생성합니다. 이전 판에서는 pattern이 RegExp 인스턴스이고 flagsundefined가 아니면 TypeError 예외가 발생했습니다.

22.2.6 ECMAScript 2015에서는 RegExp prototype object가 RegExp 인스턴스가 아닙니다. 이전 판에서는 패턴이 빈 문자열인 RegExp 인스턴스였습니다.

22.2.6 ECMAScript 2015에서는 "source", "global", "ignoreCase", "multiline"접근자 프로퍼티RegExp prototype object에 정의되어 있습니다. 이전 판에서는 RegExp 인스턴스에 데이터 프로퍼티로 정의되어 있었습니다.

25.4.15: ECMAScript 2019에서는 Atomics.wakeAtomics.notify로 이름이 변경되어 Atomics.wait와 혼동을 방지합니다.

27.1.6.4, 27.6.3.6: ECMAScript 2019에서는 await에 의해 대기열에 추가되는 잡(Jobs)의 수가 줄어들어, then() 호출과 await 표현식 사이에 해결 순서의 차이가 관찰될 수 있습니다.

참고문헌

  1. IEEE 754-2019: IEEE 부동소수점 산술 표준. 전기전자기술자협회, 뉴욕 (2019) 참고

    ECMA-262 명세에 영향을 주는 IEEE 754-2008과 IEEE 754-2019 사이에는 규범적 변경사항이 없습니다.

  2. 유니코드 표준, <https://unicode.org/versions/latest>에서 확인 가능
  3. Unicode 기술노트 #5: 애플리케이션에서의 정규 동등성, <https://unicode.org/notes/tn5/>에서 확인 가능
  4. Unicode 기술 표준 #10: Unicode Collation Algorithm, <https://unicode.org/reports/tr10/>에서 확인 가능
  5. Unicode 표준 부록 #15, Unicode 정규화 형식, <https://unicode.org/reports/tr15/>에서 확인 가능
  6. Unicode 표준 부록 #18: Unicode 정규표현식, <https://unicode.org/reports/tr18/>에서 확인 가능
  7. Unicode 표준 부록 #24: Unicode Script 속성, <https://unicode.org/reports/tr24/>에서 확인 가능
  8. Unicode 표준 부록 #31, Unicode 식별자 및 패턴 문법, <https://unicode.org/reports/tr31/>에서 확인 가능
  9. Unicode 표준 부록 #44: Unicode 문자 데이터베이스, <https://unicode.org/reports/tr44/>에서 확인 가능
  10. Unicode 기술 표준 #51: Unicode 이모지, <https://unicode.org/reports/tr51/>에서 확인 가능
  11. IANA 시간대 데이터베이스, <https://www.iana.org/time-zones>에서 확인 가능
  12. ISO 8601:2004(E) 데이터 요소 및 교환 형식 — 정보 교환 — 날짜와 시간의 표현
  13. RFC 1738 “Uniform Resource Locators (URL)”, <https://tools.ietf.org/html/rfc1738>에서 확인 가능
  14. RFC 2396 “Uniform Resource Identifiers (URI): Generic Syntax”, <https://tools.ietf.org/html/rfc2396>에서 확인 가능
  15. RFC 3629 “UTF-8, a transformation format of ISO 10646”, <https://tools.ietf.org/html/rfc3629>에서 확인 가능
  16. RFC 7231 “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content”, <https://tools.ietf.org/html/rfc7231>에서 확인 가능

콜로폰

이 명세는 GitHub에서 Ecmarkup이라는 일반 텍스트 소스 형식으로 작성됩니다. Ecmarkup은 ECMAScript 명세를 일반 텍스트로 작성하고, 편집 규칙을 따르는 HTML 렌더링으로 처리할 수 있는 프레임워크 및 도구집을 제공하는 HTML과 Markdown의 변형입니다. Ecmarkup은 Grammarkdown을 이용한 구문 정의, Ecmarkdown을 이용한 알고리즘 단계 작성 등 여러 형식과 기술을 통합합니다. 이 명세의 PDF 렌더링은 CSS 페이지 미디어 명세를 활용한 인쇄용 스타일시트를 사용하여 PrinceXML로 변환해 생성됩니다.

이전 판의 명세는 Word로 작성되었습니다. 이 판의 기반이 된 Ecmarkup 소스 텍스트는 ECMAScript 2015 Word 문서를 자동 변환 도구로 Ecmarkup으로 변환하여 만들었습니다.

Copyright & Software License

Ecma International

Rue du Rhone 114

CH-1204 Geneva

Tel: +41 22 849 6000

Fax: +41 22 849 6001

Web: https://ecma-international.org/

Software License

All Software contained in this document ("Software") is protected by copyright and is being made available under the "BSD License", included below. This Software may be subject to third party rights (rights from parties other than Ecma International), including patent rights, and no licenses under such third party rights are granted under this license even if the third party concerned is a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT https://ecma-international.org/memento/codeofconduct.htm FOR INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  3. Neither the name of the authors nor Ecma International may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.