https://tc39.es/ecma262/에 있는 문서는 가장 정확하고 최신의 ECMAScript 명세서입니다. 이 문서에는 가장 최근 연간 스냅샷의 내용과, 그 스냅샷 이후의 완료된 제안(제안 절차에서 Stage 4에 도달하여 여러 구현에 적용되었고 다음 실질적인 개정에 포함될 제안)이 함께 담겨 있습니다.
이 Ecma 표준은 ECMAScript 2026 언어를 정의합니다. 이는 ECMAScript 언어 명세서의 열일곱 번째 판입니다. 1997년 첫 판이 발표된 이후 ECMAScript는 세계에서 가장 널리 사용되는 범용 프로그래밍 언어 중 하나로 성장했습니다. 웹 브라우저에 내장된 언어로 가장 잘 알려져 있지만, 서버 및 임베디드 애플리케이션에서도 널리 채택되었습니다.
ECMAScript는 여러 기술에서 유래했으며, 그 중 가장 잘 알려진 것은 JavaScript(Netscape)와 JScript(Microsoft)입니다. 이 언어는 Netscape의 Brendan Eich가 발명하였으며, 최초로 해당 회사의 Navigator 2.0 브라우저에 등장했습니다. 이후 Netscape의 모든 브라우저와 Microsoft의 Internet Explorer 3.0부터 모든 브라우저에 포함되었습니다.
ECMAScript 언어 명세서의 개발은 1996년 11월에 시작되었습니다. 이 Ecma 표준의 첫 번째 판은 1997년 6월 Ecma 총회에서 채택되었습니다.
그 Ecma 표준은 ISO/IEC JTC 1에 신속 채택 절차(fast-track procedure)를 통해 제출되었고, 1998년 4월 국제 표준 ISO/IEC 16262로 승인되었습니다. 1998년 6월 Ecma 총회에서 ECMA-262 두 번째 판이 승인되어 ISO/IEC 16262와 완전히 일치하게 되었습니다. 첫 번째 판과 두 번째 판의 변경 사항은 편집상의 변화입니다.
표준의 세 번째 판에서는 강력한 정규 표현식, 향상된 문자열 처리, 새로운 제어문, try/catch 예외 처리, 오류 정의 강화, 숫자 출력 형식 지정, 그리고 향후 언어 성장을 대비한 소규모 변경 사항이 도입되었습니다. ECMAScript 표준의 세 번째 판은 1999년 12월 Ecma 총회에서 채택되었고, 2002년 6월 ISO/IEC 16262:2002로 출판되었습니다.
세 번째 판이 출판된 이후 ECMAScript는 월드 와이드 웹과 결합되어 거의 모든 웹 브라우저에서 지원되는 프로그래밍 언어로 대규모로 채택되기에 이르렀습니다. 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를 다른 언어의 컴파일 대상로 사용하는 데의 지원 강화가 포함되었습니다. 주요 개선 사항으로는 모듈, 클래스 선언, 렉시컬 블록 스코핑, 이터레이터와 제너레이터, 비동기 프로그래밍을 위한 프로미스, 구조 분해 패턴, proper tail call 등이 있습니다. ECMAScript 내장 라이브러리는 맵, 셋, 바이너리 숫자값 배열과 같은 추가 데이터 추상화를 지원하도록 확장되었고, 문자열과 정규 표현식에서 유니코드 보조 문자 지원이 강화되었습니다. 내장 객체는 서브클래싱을 통해 확장 가능해졌습니다. 여섯 번째 판은 정기적이고 점진적인 언어 및 라이브러리 개선의 기반을 제공합니다. 여섯 번째 판은 2015년 6월 총회에서 채택되었습니다.
ECMAScript 2016은 Ecma TC39의 새로운 연간 릴리스 주기 및 공개 개발 프로세스 하에 발표된 최초의 ECMAScript 판입니다. 평문 소스 문서가 ECMAScript 2015 소스 문서에서 구축되어 GitHub에서의 추가 개발의 기반이 되었습니다. 이 표준의 개발 기간 동안 수백 건의 풀 리퀘스트와 이슈가 제출되었으며, 이는 수천 건의 버그 수정, 편집적 수정, 기타 개선사항을 대표합니다. 또한 Ecmarkup, Ecmarkdown, Grammarkdown 등 개발을 지원하는 다양한 소프트웨어 도구가 개발되었습니다. ES2016에는 새로운 거듭제곱 연산자와 Array.prototype에 includes라는 새로운 메소드가 추가되었습니다.
ECMAScript 2017에서는 Async 함수, Shared Memory, Atomics가 도입되었고, 소규모 언어 및 라이브러리 개선, 버그 수정, 편집적 업데이트가 이루어졌습니다. Async 함수는 프로미스를 반환하는 함수에 대한 문법을 제공하여 비동기 프로그래밍 경험을 향상합니다. Shared Memory와 Atomics는 멀티 에이전트 프로그램이 병렬 CPU 환경에서도 잘 정의된 실행 순서를 보장하는 원자적 연산을 사용하여 통신할 수 있는 새로운 메모리 모델을 도입합니다. 또한 Object에 새로운 정적 메소드인 Object.values, Object.entries, Object.getOwnPropertyDescriptors가 추가되었습니다.
ECMAScript 2018에서는 async 이터레이터 프로토콜과 async 제너레이터를 통한 비동기 이터레이션 지원이 도입되었습니다. 또한 네 가지 새로운 정규 표현식 기능(dotAll 플래그, 명명된 캡처 그룹, 유니코드 속성 이스케이프, 후행 어설션)을 추가하였고, 객체의 rest 및 spread 속성도 포함되었습니다.
ECMAScript 2019에서는 몇 가지 새로운 내장 함수가 도입되었습니다: 배열 평탄화를 위한 Array.prototype의 flat 및 flatMap, Object.entries의 반환값을 바로 새 객체로 변환하는 Object.fromEntries, 더 적절한 이름의 String.prototype.trimStart와 trimEnd(비표준 내장인 String.prototype.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 결합자인 Promise.allSettled, 전역 this 값을 보편적으로 접근하는 방법인 globalThis, 모듈 내에서 사용할 수 있는 export * as ns from 'module' 구문, for-in 열거 순서의 표준화 강화, 모듈 내에서 컨텍스트 정보를 담을 수 있는 호스트가 채워주는 객체인 import.meta, 그리고 nullish 값(undefined 또는 null)을 다루기 위한 두 가지 구문(nullish 병합 연산자와 옵셔널 체이닝)이 추가되었습니다.
ECMAScript 2021, 12판에서는 문자열의 replaceAll 메소드, 입력 값이 이행될 때 단락 회로가 발생하는 Promise 결합자인 Promise.any, 여러 오류를 한 번에 표현하는 새로운 오류 타입인 AggregateError, 논리 할당 연산자(??=, &&=, ||=), 객체를 가비지 컬렉션에서 보호하지 않고 참조할 수 있는 WeakRef와 가비지 컬렉션 시 정리 작업 등록 및 해제를 관리하는 FinalizationRegistry, 숫자 리터럴 구분자(1_000), 그리고 Array.prototype.sort의 동작을 더 정확하게 하여 구현 정의정렬 순서 발생을 줄였습니다.
ECMAScript 2022, 13판에서는 모듈 최상위에서 await 키워드를 사용할 수 있게 되었고, 클래스 내에 새로운 요소(공개 및 비공개 인스턴스 필드, 공개 및 비공개 정적 필드, 비공개 인스턴스 메소드 및 접근자, 비공개 정적 메소드 및 접근자), 클래스 내부에서 평가 초기화를 위한 정적 블록, 객체의 비공개 필드 존재를 테스트하는 #x in obj 구문, 정규 표현식의 매치 인덱스를 제공하는 /d 플래그, 오류의 인과 관계를 기록하는 Error 객체의 cause 속성, 상대 인덱싱을 가능하게 하는 문자열/배열/TypedArray의 at 메소드, 그리고 Object.hasOwn(기존 Object.prototype.hasOwnProperty의 간편 대안)이 도입되었습니다.
ECMAScript 2023, 14판에서는 Array.prototype 및 TypedArray.prototype의 toSorted, toReversed, with, findLast, findLastIndex 메소드, 그리고 Array.prototype의 toSpliced 메소드가 도입되었습니다. 파일 시작 부분에 #! 주석을 허용하여 실행 가능한 ECMAScript 파일 지원이 강화되었고, 대부분의 Symbol을 weak collection의 키로 사용할 수 있게 되었습니다.
ECMAScript 2024, 15판에서는 ArrayBuffer와 SharedArrayBuffer의 크기 조정 및 전송 기능, 문자열 집합 작업을 위한 고급 기능을 가진 RegExp /v 플래그, Promise를 쉽게 생성하기 위한 Promise.withResolvers 메소드, 데이터 집계용 Object.groupBy 및 Map.groupBy 메소드, 공유 메모리 변경을 비동기적으로 기다리는 Atomics.waitAsync 메소드, 문자열이 올바른 유니코드만 포함하는지 확인/보장하는 String.prototype.isWellFormed 및 String.prototype.toWellFormed 메소드가 도입되었습니다.
ECMAScript 2025, 16판에서는 이터레이터 작업을 위한 새로운 전역 Iterator와 관련 정적 및 프로토타입 메소드, Set.prototype의 셋 작업용 메소드, JSON 모듈 import 및 import된 모듈의 속성 선언 구문, 정규 표현식 안전 문자열 이스케이프를 위한 RegExp.escape 메소드, 정규 표현식 내에서 인라인 플래그 활성/비활성화 구문, 함수가 Promise를 반환하든 아니든 항상 Promise를 반환하게 하는 Promise.try 메소드, 새로운 TypedArray 종류인 Float16Array와 관련된 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 하위절에 언급된 “future reserved words”를 사용하는 프로그램 문법을 지원할 수 있습니다.
ECMAScript의 적합한 구현은 17.1 하위절에 금지 확장(Forbidden Extension)으로 명시된 어떤 확장도 구현해서는 안 됩니다.
ECMAScript의 적합한 구현은 구현 정의(implementation-defined), 구현 근사(implementation-approximated), 또는 호스트 정의(host-defined)가 아닌 어떠한 기능도 재정의해서는 안 됩니다.
ECMAScript의 적합한 구현은, 별도의 지시가 없는 한 정규적 선택 사항(Normative Optional) 하위절을 구현하거나 구현하지 않을 수 있습니다. 웹 브라우저는 일반적으로 모든 정규적 선택 사항 하위절을 구현해야 합니다. (부록 B 참조.) 만약 어떤 정규적 선택 사항 동작이 구현된다면, 해당 정규적 선택 사항 절에 포함된 모든 동작이 구현되어야 합니다. 정규적 선택 사항 절은 본 명세서에서 아래와 같이 색상 상자에 "Normative Optional"이라는 문구로 표시됩니다.
Normative Optional
2.1 정규적 선택 사항 예시 절 제목
예시 절 내용.
ECMAScript의 적합한 구현은 정규적 선택 사항으로도 표시되지 않는 한 레거시(Legacy) 하위절을 구현해야 합니다. 레거시 하위절에 명시된 모든 언어 기능과 동작은 하나 이상의 바람직하지 않은 특성을 가지고 있습니다. 하지만 기존 애플리케이션에서 계속 사용되고 있기 때문에 이 명세서에서 제거할 수 없습니다. 이러한 기능은 ECMAScript 핵심 언어의 일부로 간주되지 않습니다. 프로그래머는 새로운 ECMAScript 코드를 작성할 때 이러한 기능과 동작을 사용하거나 존재를 가정해서는 안 됩니다.
Legacy
2.2 레거시 예시 절 제목
예시 절 내용.
Normative Optional, Legacy
2.3 레거시 정규적 선택 사항 예시 절 제목
예시 절 내용.
3 정규 참조
아래에 참조된 문서는 이 문서의 적용에 필수적입니다. 날짜가 명시된 참조는 해당 판만을 적용합니다. 날짜가 명시되지 않은 참조는 해당 문서의 최신 판(수정 포함)을 적용합니다.
ECMAScript는 객체 지향 프로그래밍 언어로, 호스트 환경 내에서 계산을 수행하고 계산 객체를 조작합니다. 여기 정의된 ECMAScript는 계산적으로 자급자족하도록 설계된 것이 아니며, 외부 데이터 입력이나 계산 결과 출력에 대한 규정이 없습니다. 대신 ECMAScript 프로그램의 계산 환경은 이 명세서에 기술된 객체와 기타 기능뿐만 아니라 환경 특화 객체도 제공하는 것이 기대되며, 이들의 설명 및 동작은 이 명세서 범위를 벗어나지만 ECMAScript 프로그램에서 접근 가능한 프로퍼티와 호출 가능한 함수가 있을 수 있음을 나타냅니다.
ECMAScript는 원래 스크립트 언어로 설계되었지만, 현재는 범용 프로그래밍 언어로 널리 사용됩니다. 스크립트 언어란 기존 시스템의 기능을 조작, 맞춤화, 자동화하는 데 사용하는 프로그래밍 언어입니다. 이러한 시스템에서는 이미 사용자 인터페이스를 통해 유용한 기능이 제공되며, 스크립트 언어는 해당 기능을 프로그램 제어로 노출하는 역할을 합니다. 이처럼 기존 시스템은 객체와 기능을 제공하는 호스트 환경을 구성하며, 이는 스크립트 언어의 기능을 완성합니다. 스크립트 언어는 전문 프로그래머와 비전문 프로그래머 모두 사용할 수 있도록 설계되었습니다.
ECMAScript는 원래 웹 스크립트 언어로 설계되어, 브라우저에서 웹 페이지에 생동감을 더하고 웹 기반 클라이언트-서버 아키텍처의 일부로 서버 계산을 수행하는 메커니즘을 제공했습니다. ECMAScript는 현재 다양한 호스트 환경에서 핵심 스크립트 기능을 제공합니다. 따라서 핵심 언어는 특정 호스트 환경과 분리되어 이 문서에서 정의됩니다.
ECMAScript 사용은 단순한 스크립팅을 넘어 다양한 환경과 규모에서 전체 프로그래밍 작업 영역으로 확장되었습니다. 사용이 늘어남에 따라 ECMAScript가 제공하는 기능과 시설도 확대되었습니다. ECMAScript는 이제 완전한 기능의 범용 프로그래밍 언어입니다.
4.1 웹 스크립팅
웹 브라우저는 클라이언트 측 계산을 위한 ECMAScript 호스트 환경을 제공합니다. 예를 들어, 창, 메뉴, 팝업, 대화 상자, 텍스트 영역, 앵커, 프레임, 히스토리, 쿠키, 입출력 등을 나타내는 객체를 포함합니다. 또한 호스트 환경은 포커스 변경, 페이지/이미지 로딩 및 언로드, 오류 및 중단, 선택, 폼 제출, 마우스 동작과 같은 이벤트에 스크립트 코드를 연결할 수 있는 수단을 제공합니다. 스크립트 코드는 HTML 내에 나타나며, 표시되는 페이지는 UI 요소와 고정 및 계산된 텍스트/이미지의 조합입니다. 스크립트 코드는 사용자 상호작용에 반응하며, 메인 프로그램이 필요하지 않습니다.
웹 서버는 서버 측 계산을 위한 다른 호스트 환경을 제공하며, 요청, 클라이언트, 파일을 나타내는 객체와 데이터 잠금/공유 메커니즘을 포함합니다. 브라우저 측과 서버 측 스크립팅을 함께 사용하면, 클라이언트와 서버 간에 계산을 분산시키면서 웹 기반 애플리케이션에 맞춤화된 사용자 인터페이스를 제공할 수 있습니다.
ECMAScript를 지원하는 각 웹 브라우저와 서버는 자체 호스트 환경을 제공하며, 이것이 ECMAScript 실행 환경을 완성합니다.
4.2 호스트와 구현체
ECMAScript를 호스트 환경에 통합하기 위해, 이 명세서는 일부 기능(예: 추상 연산)의 정의를 전적으로 또는 부분적으로 명세서 외부 소스에 위임합니다. 편집상, 이 명세서는 다음과 같은 위임 종류를 구분합니다.
구현체란 부록 D에 나열된 시설이나 구현 정의 또는 구현 근사로 표시된 시설을 추가적으로 정의하는 외부 소스를 의미합니다. 비공식적으로 구현체는 특정 웹 브라우저와 같은 구체적인 산출물을 가리킵니다.
구현 정의 시설은 외부 소스에 정의를 위임하며 추가적인 자격을 두지 않습니다. 이 명세서는 특정 동작에 대해 권고하지 않으며, 적합한 구현은 명세서가 제시한 제한 내에서 자유롭게 동작을 선택할 수 있습니다.
구현 근사 시설은 외부 소스에 정의를 위임하면서 이상적인 동작을 권장합니다. 적합한 구현은 명세서의 제한 내에서 자유롭게 동작을 선택할 수 있지만, 이상적인 동작을 최대한 근사하도록 권장됩니다. 예를 들어 Math.exp와 같은 수학 연산이 구현 근사입니다.
호스트는 부록 D에 나열된 시설을 추가적으로 정의하지만, 기타 구현 정의 또는 구현 근사 시설은 추가적으로 정의하지 않는 외부 소스입니다. 비공식적으로 호스트는 이 명세서와 부록 D를 통해 동일하게 인터페이스하는 모든 웹 브라우저 집합 등, 모든 구현체 집합을 의미합니다. 호스트는 종종 WHATWG HTML(https://html.spec.whatwg.org/)과 같은 외부 명세서입니다. 즉, 호스트 정의 시설은 종종 외부 명세서에서 추가적으로 정의됩니다.
호스트 후크는 전적으로 또는 부분적으로 외부 소스에 의해 정의되는 추상 연산입니다. 모든 호스트 후크는 부록 D에 나열되어야 합니다. 호스트 후크는 최소한 다음 요구 사항을 충족해야 합니다:
정상 완료 또는 throw 완료 중 하나를 반환해야 합니다.
호스트 정의 시설은 추가적인 자격 없이 외부 소스에 정의를 위임하며, 부록 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 프로그램은 모듈을 통해 여러 문/선언 시퀀스로 분할될 수 있습니다. 각 모듈은 다른 모듈에서 제공해야 하는 선언과 다른 모듈에서 사용할 수 있는 자신의 선언을 명확히 식별합니다.
ECMAScript 문법은 의도적으로 Java 문법과 유사하게 설계되었습니다. ECMAScript 문법은 스크립트 언어로 쉽게 사용할 수 있도록 완화되어 있습니다. 예를 들어, 변수에 타입 선언이 필요하지 않으며, 프로퍼티에 타입이 연결되지 않고, 함수 선언이 호출보다 먼저 나타나야 할 필요도 없습니다.
4.3.1 객체
ECMAScript는 클래스 정의 문법을 포함하지만, ECMAScript 객체는 C++, Smalltalk, Java와 같은 클래스 기반 언어처럼 근본적으로 클래스 기반이 아닙니다. 객체는 리터럴 표기 또는 객체를 생성하고 프로퍼티의 초기값을 할당하는 생성자를 통해 여러 방식으로 생성될 수 있습니다. 각 생성자는 "prototype"이라는 프로퍼티를 가진 함수로, 프로토타입 기반 상속과 공유 프로퍼티를 구현하는 데 사용됩니다. new 표현식으로 생성자를 사용하면 객체가 생성됩니다. 예를 들어, new Date(2009, 11)은 새로운 Date 객체를 만듭니다. 생성자를 new 없이 호출하면 생성자마다 다른 결과가 발생합니다. 예를 들어, Date()는 객체가 아닌 현재 날짜와 시간의 문자열 표현을 반환합니다.
생성자로 생성된 모든 객체는 암시적으로 자신이 속한 생성자의 "prototype" 프로퍼티 값에 대한 참조(객체의 프로토타입이라 부름)를 갖습니다. 또한 프로토타입은 자신만의 non-null 암시적 참조를 가질 수 있으며, 이를 프로토타입 체인이라 부릅니다. 객체에서 프로퍼티에 대한 참조가 발생하면, 해당 이름의 프로퍼티를 가진 프로토타입 체인에서 첫 번째 객체의 프로퍼티가 참조됩니다. 즉, 먼저 직접 지정된 객체에서 해당 프로퍼티가 있는지 확인하고, 있으면 그 프로퍼티가 참조 대상이 됩니다. 없으면 해당 객체의 프로토타입을 다음으로 검사하고, 계속 반복합니다.
Figure 1: 객체/프로토타입 관계
클래스 기반 객체 지향 언어에서는 일반적으로 상태는 인스턴스가, 메서드는 클래스가 담당하며, 상속은 구조와 동작에만 적용됩니다. ECMAScript에서는 상태와 메서드가 객체에 담기며, 구조, 동작, 상태 모두가 상속됩니다.
프로토타입에 특정 프로퍼티가 있고, 객체에 직접 해당 프로퍼티가 포함되지 않은 모든 객체는 그 프로퍼티와 값을 공유합니다. 그림 1은 이를 보여줍니다:
CF는 생성자(동시에 객체)입니다. cf1, cf2, cf3, cf4, cf5 등 5개의 객체가 new 표현식으로 생성되었습니다. 각 객체에는 "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"이 아닌 경우 공유됩니다. CF와 CFp 사이에는 암시적 프로토타입 링크가 없습니다.
대부분의 클래스 기반 객체 언어와 달리, 객체에는 값을 할당함으로써 동적으로 프로퍼티를 추가할 수 있습니다. 즉, 생성자는 생성된 객체의 모든 프로퍼티를 반드시 명명하거나 값을 할당할 필요가 없습니다. 위 그림에서 cf1, cf2, cf3, cf4, cf5에 대해 CFp에 새 값을 할당함으로써 새로운 공유 프로퍼티를 추가할 수 있습니다.
ECMAScript 객체는 본질적으로 클래스 기반이 아니지만, 생성자 함수, 프로토타입 객체, 메서드의 공통 패턴에 기반하여 클래스 유사 추상을 정의하는 것이 편리할 때가 많습니다. ECMAScript 내장 객체도 이런 클래스 유사 패턴을 따릅니다. ECMAScript 2015부터는 내장 객체가 사용하는 동일한 클래스 유사 추상 패턴에 맞는 객체를 간결하게 정의할 수 있는 문법적 클래스 정의가 도입되었습니다.
4.3.2 ECMAScript의 엄격 변종
ECMAScript 언어는 일부 사용자가 언어에서 제공되는 특정 기능 사용을 제한하고자 할 수 있음을 인식합니다. 이는 보안, 오류 발생 가능성이 높은 기능 회피, 오류 검사 강화 또는 기타 사용자의 목적을 위해서일 수 있습니다. 이런 가능성을 지원하기 위해 ECMAScript는 언어의 엄격 변종을 정의합니다. 엄격 변종은 일반 ECMAScript 언어의 일부 구문 및 의미론적 기능을 제외하고, 일부 기능의 상세 의미론을 수정합니다. 엄격 변종은 비엄격 언어 형식에서는 오류로 지정되지 않은 상황에서도 오류 예외를 반드시 던져야 하는 추가 오류 조건을 명시합니다.
ECMAScript의 엄격 변종은 언어의 엄격 모드로 일반적으로 불립니다. 엄격 모드의 선택과 엄격 모드 구문 및 의미론 사용은 개별 ECMAScript 소스 텍스트 단위 수준에서 명시적으로 결정됩니다(11.2.2 참조). 엄격 모드는 구문적 소스 텍스트 단위 수준에서 선택되므로, 제한은 해당 소스 텍스트 단위 내에서만 국지적으로 적용됩니다. 엄격 모드는 여러 소스 텍스트 단위에 걸쳐 일관되게 동작해야 하는 ECMAScript 의미론의 어떤 측면도 제한하거나 수정하지 않습니다. 전체 ECMAScript 프로그램은 엄격 모드와 비엄격 모드 소스 텍스트 단위로 구성될 수 있으며, 이 경우 엄격 모드는 실제로 엄격 모드 소스 텍스트 단위 내에서 정의된 코드를 실행할 때만 적용됩니다.
이 명세서에 적합하려면 ECMAScript 구현은 이 명세서에서 정의한 완전한 비제한 ECMAScript 언어와 엄격 변종을 모두 구현해야 합니다. 또한, 구현체는 비제한 모드와 엄격 모드 소스 텍스트 단위를 단일 복합 프로그램으로 조합하는 기능을 지원해야 합니다.
4.4 용어와 정의
이 문서의 목적상, 아래 용어와 정의가 적용됩니다.
4.4.1 구현 근사
구현 근사 시설은 전체 또는 일부가 외부 소스에 의해 정의되지만, 이 명세서에서 권장되는 이상적 동작을 갖습니다.
생성자의 "prototype" 프로퍼티 값은 상속 및 공유 프로퍼티 구현에 사용되는 프로토타입 객체입니다.
4.4.8 프로토타입
다른 객체를 위한 공유 프로퍼티를 제공하는 객체
Note
생성자가 객체를 생성할 때, 해당 객체는 프로퍼티 참조 해결을 위해 생성자의 "prototype" 프로퍼티를 암시적으로 참조합니다. 생성자의 "prototype" 프로퍼티는 constructor.prototype 표현식으로 참조할 수 있으며, 프로토타입에 추가된 프로퍼티는 프로토타입을 공유하는 모든 객체에 상속을 통해 공유됩니다. 또는 Object.create 내장 함수를 사용하여 명시적으로 지정된 프로토타입으로 새 객체를 만들 수 있습니다.
String 객체는 String 생성자를 new 표현식으로 사용할 때 생성되며, String 값을 인자로 제공합니다. 결과 객체는 내부 슬롯에 String 값이 저장됩니다. String 객체는 String 생성자를 함수처럼 호출하면 String 값으로 강제 변환될 수 있습니다(22.1.1.1).
Number 객체는 Number 생성자를 new 표현식으로 사용할 때 생성되며, Number 값을 인자로 제공합니다. 결과 객체는 내부 슬롯에 Number 값이 저장됩니다. Number 객체는 Number 생성자를 함수처럼 호출하면 Number 값으로 강제 변환될 수 있습니다(21.1.1.1).
공백과 주석을 제외한 입력 요소는 ECMAScript의 구문 문법의 단말기 기호를 구성하며, ECMAScript 토큰이라고 합니다. 이 토큰은 ECMAScript 언어의 예약어, 식별자, 리터럴, 구두점입니다. 또한 줄 종결자는 토큰으로 간주되지 않지만 입력 요소 스트림의 일부가 되어 자동 세미콜론 삽입 과정(12.10)을 안내합니다. 단순 공백과 한 줄 주석은 버려져서 구문 문법의 입력 요소 스트림에 나타나지 않습니다. MultiLineComment(/*…*/ 형태의 주석, 줄을 넘나들든 아니든 관계 없음)도 줄 종결자가 포함되지 않았다면 단순히 버려집니다. 하지만 줄 종결자가 하나 이상 포함된 경우, 단일 줄 종결자로 대체되어 구문 문법의 입력 요소 스트림에 포함됩니다.
ECMAScript의 정규식 문법은 22.2.1에 있습니다. 이 문법 역시 단말기 기호로 SourceCharacter에서 정의된 코드 포인트를 사용합니다. 목표 기호 Pattern에서 시작하여, 코드 포인트 시퀀스를 정규 표현식 패턴으로 변환하는 생산식 집합을 정의합니다.
렉시컬 및 정규식 문법의 생산식은 구분 기호로 두 개의 콜론 “::”을 사용해 구분됩니다. 렉시컬 문법과 정규식 문법은 일부 생산식을 공유합니다.
숫자 문자열 문법의 생산식은 세 개의 콜론 “:::”을 구분 기호로 가지며, 소스 텍스트 파싱에는 사용되지 않습니다.
5.1.4 구문 문법
ECMAScript의 구문 문법은 13 절부터 16 절까지 제시되어 있습니다. 이 문법의 단말기 기호는 렉시컬 문법에서 정의된 ECMAScript 토큰입니다(5.1.2). 목표 기호 Script와 Module 두 가지에서 시작하여, 토큰 시퀀스가 ECMAScript 프로그램의 구문적으로 올바른 독립된 구성 요소를 형성하는 방법을 설명하는 생산식 집합을 정의합니다.
코드 포인트 스트림을 ECMAScript Script 또는 Module로 파싱하려면, 먼저 렉시컬 문법을 반복적으로 적용하여 입력 요소 스트림으로 변환합니다. 그 후 입력 요소 스트림을 구문 문법을 단일 적용으로 파싱합니다. 입력 스트림의 토큰이 목표 비단말기(Script 또는 Module)의 단일 인스턴스로 파싱될 수 없거나 토큰이 남는다면 구문 오류입니다.
파싱이 성공하면 파스 트리가 구성되며, 트리의 각 노드는 파스 노드입니다. 각 파스 노드는 문법 기호의 인스턴스이며, 해당 기호에서 유도할 수 있는 소스 텍스트의 범위를 나타냅니다. 파스 트리의 루트 노드는 전체 소스 텍스트를 나타내며, 파싱의 목표 기호의 인스턴스입니다. 파스 노드가 비단말기의 인스턴스라면, 해당 비단말기를 좌변으로 하는 생산식 인스턴스이기도 합니다. 그리고 우변의 각 기호마다 자식을 하나씩 가집니다. 각 자식은 해당 기호의 인스턴스인 파스 노드입니다.
새로운 파스 노드는 파서가 호출될 때마다 인스턴스화되며, 동일한 소스 텍스트를 파싱하더라도 파싱 간에 재사용되지 않습니다. 파스 노드는 동일한 소스 텍스트 범위를 나타내고, 동일한 문법 기호의 인스턴스이며, 동일한 파서 호출에서 생성된 경우에만 동일한 파스 노드로 간주됩니다.
Note 1
같은 문자열을 여러 번 파싱하면 서로 다른 파스 노드가 생성됩니다. 예를 들어:
let str = "1 + 1;";
eval(str);
eval(str);
eval을 호출할 때마다 str의 값을 ECMAScript 소스 텍스트로 변환하고, 각각 독립적으로 자신만의 파스 노드 트리를 생성합니다. 이 트리들은 각각의 파싱이 동일한 문자열 값에서 유도된 소스 텍스트를 대상으로 하더라도 서로 다릅니다.
Note 2
파스 노드는 명세상의 산출물이며, 실제 구현에서는 유사한 데이터 구조를 사용할 필요가 없습니다.
구문 문법의 생산식은 구분 기호로 한 개의 콜론 “:”만을 사용합니다.
13부터 16까지 제시된 구문 문법은 ECMAScript Script 또는 Module로서 올바르게 받아들여지는 토큰 시퀀스를 완전히 설명한 것은 아닙니다. 추가적인 토큰 시퀀스도 허용되며, 예를 들어 일부 위치(줄 종결자 앞 등)에 세미콜론만 추가하면 문법에서 기술될 토큰 시퀀스가 허용됩니다. 또한, 일부 위치에 줄 종결자가 나타나면 문법에서 기술된 토큰 시퀀스라 해도 허용되지 않을 수 있습니다.
일부 경우, 모호성을 피하기 위해 구문 문법은 유효한 ECMAScript Script 또는 Module을 형성하지 않는 토큰 시퀀스를 허용하는 일반화된 생산식을 사용합니다. 예를 들어, 객체 리터럴 및 객체 구조 분해 패턴에 이 기법이 사용됩니다. 이런 경우, 더 제한적인 보조 문법이 제공되어 허용되는 토큰 시퀀스를 추가로 제한합니다. 일반적으로, 초기 오류 규칙은 특정 문맥에서 "P 는 반드시 N을 커버해야 한다"고 명시합니다. 여기서 P는 파스 노드(일반화된 생산식의 인스턴스), N은 보조 문법의 비단말기입니다. 이는 다음을 의미합니다:
P가 원래 일치시킨 토큰 시퀀스를 N을 목표 기호로 하여 다시 파싱합니다. N에 문법적 매개변수가 있다면, P가 처음 파싱될 때 사용된 값으로 설정합니다.
토큰 시퀀스를 토큰 남김 없이 N의 단일 인스턴스로 파싱할 수 있다면:
해당 N 인스턴스(특정 P에 대해 유일한 파스 노드)를 "P가 커버하는 N"이라고 합니다.
N 및 그 파생 생산식에 대한 모든 Early Error 규칙은 P가 커버하는 N에도 적용됩니다.
그렇지 않으면(파싱이 실패하면), 이는 초기 구문 오류입니다.
5.1.5 문법 표기법
5.1.5.1 단말기 기호
ECMAScript 문법에서 일부 단말기 기호는 고정폭 글꼴로 표시됩니다. 이는 소스 텍스트에 정확히 표시된 대로 나타나야 함을 의미합니다. 이렇게 지정된 모든 단말기 기호 코드 포인트는 다른 유사한 유니코드 범위가 아니라 기본 라틴 블록의 적절한 유니코드 코드 포인트로 이해해야 합니다. 단말기 기호의 코드 포인트는 \UnicodeEscapeSequence로 표현할 수 없습니다.
단말기 기호가 개별 유니코드 코드 포인트인 문법(즉, 렉시컬, 정규식, 숫자 문자열 문법)에서는 생산식에 여러 개의 고정폭 코드 포인트가 연속해서 나타날 때, 이는 동일한 시퀀스를 독립된 단말기 기호로 쓴 것과 같습니다.
비단말기 기호는 이탤릭체로 표시됩니다. 비단말기 정의(생산식이라고도 함)는 정의되는 비단말기 이름 다음에 하나 이상의 콜론이 옵니다. (콜론의 개수는 생산식이 속한 문법을 나타냅니다.) 이어서 비단말기의 하나 이상의 대체 우변이 각각의 줄에 나옵니다. 예를 들어, 다음과 같은 구문 정의가 있습니다:
따라서 이 예시에서 비단말기 ForStatement는 실제로 네 가지 대체 우변을 갖습니다.
5.1.5.4 문법적 매개변수
생산식은 첨자 형태의 “[parameters]” 주석으로 매개변수화될 수 있으며, 이는 생산식이 정의하는 비단말기 기호 뒤에 접미사로 나타납니다. “parameters”는 단일 이름 또는 컴마로 구분된 이름 목록일 수 있습니다. 매개변수화된 생산식은 매개변수 이름 조합마다 해당 비단말기 기호에 언더스코어를 붙여서 정의하는 생산식 집합의 약어입니다. 즉,
생산식의 우변에 “[empty]”가 나타나면, 해당 생산식의 우변이 단말기나 비단말기 기호를 전혀 포함하지 않음을 의미합니다.
5.1.5.7 앞보기 제한
생산식의 우변에 “[lookahead = seq]”가 나타나면, 해당 생산식은 토큰 시퀀스 seq가 바로 뒤따르는 입력 토큰 시퀀스의 접두사일 때만 사용될 수 있음을 의미합니다. 마찬가지로 “[lookahead ∈ set]”에서 set은 유한하고 비어 있지 않은 토큰 시퀀스 집합일 때, 집합의 어떤 요소가 바로 뒤따르는 토큰 시퀀스의 접두사일 때만 사용될 수 있음을 의미합니다. 편의상 집합을 비단말기로 쓸 수도 있는데, 이 경우 해당 비단말기가 확장할 수 있는 모든 토큰 시퀀스 집합을 나타냅니다. 비단말기가 무한히 많은 서로 다른 토큰 시퀀스로 확장될 수 있다면 이는 편집 오류로 간주합니다.
이 조건들은 부정될 수도 있습니다. “[lookahead ≠ seq]”는 해당 생산식이 seq가 바로 뒤따르는 입력 토큰 시퀀스의 접두사가 아니어야만 사용할 수 있음을 의미하고, “[lookahead ∉ set]”는 집합의 어떤 요소도 바로 뒤따르는 토큰 시퀀스의 접두사가 되어서는 안 될 때만 사용될 수 있음을 의미합니다.
이는 문자 n 다음에 첫 번째가 짝수인 하나 이상의 십진수 숫자가 오거나, 십진수 숫자 다음에 또 다른 십진수 숫자가 오지 않는 경우를 일치시킵니다.
이러한 문구가 구문 문법에서 사용될 때, 바로 뒤따르는 토큰 시퀀스를 명확히 식별하는 것이 불가능할 수 있습니다. 이는 이후 토큰을 결정하려면 이후 위치에서 사용할 렉시컬 목표 기호를 알아야 하기 때문입니다. 그러므로 구문 문법에서 이러한 제한이 사용될 때, 토큰 시퀀스 seq가 접두사 제한에 나타나면(집합의 일부로 포함된 경우도 포함), 이후 사용할 렉시컬 목표 기호 선택에 따라 seq가 실제로 접두사가 되는지 여부가 바뀔 수 있다면, 이는 편집 오류로 간주합니다.
이 명세서는 알고리즘 단계 지정을 위해 주로 번호가 매겨진 목록을 사용합니다. 이러한 알고리즘은 ECMAScript 언어 구성 요소의 요구 의미론을 정확하게 명시하는 데 사용됩니다. 알고리즘이 특정 구현 기법의 사용을 암시하는 것은 아닙니다. 실제로, 주어진 기능을 더 효율적으로 구현할 수 있는 알고리즘이 있을 수 있습니다.
알고리즘은 명시적으로 순서가 있는 쉼표로 구분된 별칭 이름 시퀀스로 매개변수화될 수 있으며, 알고리즘 단계 내에서 해당 위치에 전달된 인자를 참조하는 데 사용할 수 있습니다. 선택적 매개변수는 대괄호([ , name ])로 나타내며, 알고리즘 단계 내에서는 필수 매개변수와 차이가 없습니다. 나머지 매개변수(rest parameter)는 매개변수 리스트 끝에 ...name 형태로 나타내며, 필수 및 선택적 매개변수 뒤에 전달된 모든 인자를 List로 수집합니다. 추가 인자가 없는 경우 해당 List는 비어 있습니다.
알고리즘 단계는 순차적 하위 단계로 세분화될 수 있습니다. 하위 단계는 들여쓰기되며, 그 자체로 더 들여쓰기된 하위 단계로 나뉠 수 있습니다. 개요 번호 매기기 규칙은 첫 번째 하위 단계는 소문자 알파벳, 두 번째 하위 단계는 소문자 로마 숫자를 사용합니다. 세 단계보다 더 깊은 단계가 필요할 경우, 네 번째 단계부터는 숫자를 사용합니다. 예시:
최상위 단계
하위 단계.
하위 단계.
하위 하위 단계.
하위 하위 하위 단계
하위 하위 하위 하위 단계
하위 하위 하위 하위 하위 단계
단계나 하위 단계는 "if" 조건문으로 작성될 수 있으며, 이 경우 조건이 true일 때만 하위 단계를 적용합니다. 단계나 하위 단계가 "else"로 시작하면, 해당 단계는 같은 수준의 직전 “if” 조건문의 부정이 됩니다.
단계는 하위 단계의 반복적 적용을 지정할 수 있습니다.
"Assert:"로 시작하는 단계는 알고리즘의 불변 조건을 단언합니다. 이러한 단언은 암묵적일 수 있는 알고리즘 불변 조건을 명시적으로 만듭니다. 이러한 단언은 추가적인 의미 요구사항을 더하지 않으므로 구현에서는 검사할 필요가 없습니다. 단순히 알고리즘을 명확히 하기 위해 사용됩니다.
알고리즘 단계에서는 "Let x be someValue" 형식으로 어떤 값에 대한 별칭을 선언할 수 있습니다. 이 별칭은 참조와 유사하여 x와 someValue가 동일한 데이터에 연결되며, 둘 중 하나를 수정하면 모두에 반영됩니다. 참조와 유사한 동작을 피하고 싶으면, 오른쪽 값을 명시적으로 복사하도록 "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 단계를 참고하세요:
Let status be SyntaxDirectedOperation of SomeNonTerminal.
Let someParseNode be the parse of some source text.
Perform SyntaxDirectedOperation of someParseNode.
Perform SyntaxDirectedOperation of someParseNode with argument "value".
별도로 명시되지 않는 한, 모든 체인 생산식은 해당 좌변 비단말기에 적용될 수 있는 모든 연산에 대해 암시적 정의를 가집니다. 암시적 정의는 동일한 연산을 동일한 매개변수로 체인 생산식의 유일한 우변 비단말기에 다시 적용한 다음 그 결과를 반환합니다. 예를 들어, 어떤 알고리즘에 “Return Evaluation of Block”이라는 단계가 있고, 다음과 같은 생산식이 있다고 가정합니다:
런타임에 호출되어야 하는 의미론을 명시하는 알고리즘을 런타임 의미론이라고 합니다. 런타임 의미론은 추상 연산 또는 구문 지향 연산으로 정의됩니다.
5.2.3.1 Completion ( completionRecord )
The abstract operation Completion takes argument completionRecord (a Completion Record) and returns a Completion Record. It performs the following steps when called:
문맥 자유 문법만으로는 입력 요소 스트림이 평가 가능한 ECMAScript Script 또는 Module로서 유효한지를 정의하는 모든 규칙을 표현할 수 없습니다. 일부 상황에서는 ECMAScript 알고리즘 관례나 산문 요구사항을 활용해서 추가 규칙을 명시해야 하며, 이러한 규칙은 항상 문법의 생산식과 연결되어 해당 생산식의 정적 의미론이라 불립니다.
정적 의미론 규칙에는 이름이 있으며, 일반적으로 알고리즘으로 정의됩니다. 이름이 붙은 정적 의미론 규칙은 문법 생산식과 연결되며, 여러 대안 정의가 있는 생산식은 각 대안마다 해당 규칙에 대해 별도의 알고리즘을 가집니다.
정적 의미론 규칙의 특별한 종류가 초기 오류 규칙(Early Error Rule)입니다. 초기 오류 규칙은 특정 문법 생산식과 연결된 초기 오류 조건을 정의하며(17 참조), 대부분의 초기 오류 규칙은 이 명세서 알고리즘에서 명시적으로 호출되지 않습니다. 적합한 구현체는 Script 또는 Module을 최초로 평가하기 전에, 해당 Script 또는 Module을 파싱하는 데 사용된 모든 생산식의 초기 오류 규칙을 반드시 검증해야 합니다. 초기 오류 규칙이 하나라도 위반되면 Script 또는 Module은 유효하지 않으며 평가될 수 없습니다.
이 명세서에서 숫자값은 첨자 표기로 종류를 구분합니다. 첨자 𝔽는 Numbers를, ℤ는 BigInts를 나타냅니다. 첨자 없는 숫자값은 수학적 값을 의미합니다. 대부분의 숫자값은 10진수로 표기되며, 0x로 시작하고 0-9 또는 A-F로 이어지는 값은 16진수로 사용됩니다.
명세서에서 "the length of y"나 "the integer represented by the four hexadecimal digits ..."와 같이 명시적 숫자 종류 없이 숫자값을 언급하면, 이는 수학적 값을 의미합니다. Number나 BigInt 값을 명시할 경우, "the Number value for ..." 또는 "the BigInt value for ..."와 같이 명시적으로 구분합니다.
integer라는 용어는 별도 명시가 없는 한, 정수 집합에 속하는 수학적 값을 의미합니다. integral Number라는 용어는 수학적으로 정수 집합에 속하는 유한한 Number 값을 의미합니다.
+, ×, =, ≥ 등 숫자 연산자는 피연산자의 타입에 따라 연산이 결정됩니다. 수학적 값에 적용하면 일반 수학 연산을, 확장 수학적 값에 적용하면 확장 실수에 대한 연산을 의미합니다. 정의되지 않은 형태는 사용해서는 안 되며, 명세서에 사용되면 편집 오류입니다. Numbers에 적용하면 IEEE 754-2019에 따른 연산을, BigInts에 적용하면 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)로 표기합니다. +0𝔽와 -0𝔽의 수학적 값은 0입니다. 비유한 값의 수학적 값은 정의되지 않습니다. extended 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) and x - k = q × y를 만족하는 정수 q가 존재합니다.
"the result of clamping x between lower and upper"(x는 확장 수학적 값, lower, upper는 lower ≤ upper인 수학적 값)란, x < lower면 lower, x > upper면 upper, 아니면 x를 반환합니다.
수학 함수 floor(x)는 x보다 크지 않은 가장 큰 정수(가장 +∞에 가까운)를 반환합니다.
예를 들어 1(포함) ~ 2(제외) 구간은 1 이상 2 미만의 모든 수학적 값을 포함하며, 1은 포함, 2는 포함하지 않습니다. 구간 정의에서 -0𝔽 < +0𝔽이므로, 하한이 +0𝔽인 포함 구간은 +0𝔽는 포함하나 -0𝔽는 포함하지 않습니다. NaN은 절대 구간에 포함되지 않습니다.
5.2.6 값 표기법
이 명세서에서 ECMAScript 언어값은 굵게 표시됩니다. 예시로 null, true, "hello" 등이 있으며, Function.prototype.apply나 let n = 42;처럼 ECMAScript 소스 텍스트와 구분됩니다.
5.2.7 동일성
이 명세서에서는 명세 값과 ECMAScript 언어값 모두 동등성 비교를 합니다. 동등성 비교 시 값은 두 가지 범주로 나뉩니다. 동일성 없는 값은 모든 고유 특성이 동일하면 서로 동등합니다(예: 정수 크기나 시퀀스 길이). 이러한 값은 특성만으로 참조 없이 나타낼 수 있습니다. 반면 동일성 있는 값은 유일하며 자기 자신과만 동등합니다. 동일성 있는 값은 동일성 없는 값과 같으나, 동일성이라는 추정 불가, 변경 불가, 전역적으로 유일한 특성을 추가로 가집니다. 기존 동일성 있는 값 참조는 특성 설명만으로 나타낼 수 없으며, 반드시 값을 명시적으로 전달해야 합니다. 일부 동일성 있는 값은 변경 가능하여, 동일성 외 특성이 변하면 모든 참조자가 변경을 관찰합니다. 동일성 없는 값은 동일성 있는 값과 결코 동등하지 않습니다.
명세 관점에서 “is”는 두 값을 동등 비교하는 데 사용되며(예: “If bool is true, then ...”), “contains”는 리스트 내 값을 동등 비교로 찾는 데 사용됩니다(예: "If list contains a Recordr such that r.[[Foo]] is true, then ..."). 값의 명세 동일성이 비교 결과를 결정하며, 이는 명세적으로 자명합니다.
ECMAScript 언어 관점에서는 언어값을 SameValue 추상 연산 및 그 하위 추상 연산으로 비교합니다. 이 비교 추상 연산 알고리즘이 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 타입은 true와 false라는 두 값을 가지는 논리적 개체를 나타냅니다.
6.1.4 String 타입
String 타입은 0개 이상의 16비트 부호 없는 정수값(“요소”)으로 이루어진 모든 순서 있는 시퀀스의 집합이며, 최대 길이는 253 - 1 요소까지입니다. String 타입은 일반적으로 ECMAScript 프로그램에서 텍스트 데이터를 표현하는 데 사용되며, 이 경우 String의 각 요소는 UTF-16 코드 유닛 값으로 간주됩니다. 각 요소는 시퀀스 내에서 위치를 가지며, 이 위치는 0 이상의 정수 인덱스로 지정됩니다. 첫 번째 요소(존재한다면)는 인덱스 0, 그 다음 요소는 인덱스 1 등입니다. String의 길이는 그 안에 포함된 요소(즉, 16비트 값)의 개수입니다. 빈 문자열은 길이가 0이며, 요소가 존재하지 않습니다.
String 내용을 해석하지 않는 ECMAScript 연산은 추가 의미를 적용하지 않습니다. String 값을 해석하는 연산은 각 요소를 단일 UTF-16 코드 유닛으로 취급합니다. 그러나 ECMAScript는 이 코드 유닛의 값이나 관계를 제한하지 않으므로, 추가적으로 String 내용을 UTF-16로 인코딩된 유니코드 코드 포인트 시퀀스로 해석하는 연산은 잘못된 하위 시퀀스를 고려해야 합니다. 이러한 연산은 다음 규칙에 따라 0xD800~0xDBFF(유니코드 표준에서 선행 서러게이트, 또는 high-surrogate 코드 유닛)와 0xDC00~0xDFFF(후행 서러게이트, 또는 low-surrogate 코드 유닛) 값을 특별 처리합니다:
첫 번째 코드 유닛 c1이 선행 서러게이트이고 두 번째 코드 유닛 c2가 후행 서러게이트인 두 개의 코드 유닛 시퀀스는 서러게이트 페어이며, (c1 - 0xD800) × 0x400 + (c2 - 0xDC00) + 0x10000 값의 코드 포인트로 해석됩니다. (11.1.3 참고)
String.prototype.normalize 함수(22.1.3.15)는 String 값을 명시적으로 정규화하는 데 사용할 수 있습니다. String.prototype.localeCompare(22.1.3.12)는 내부적으로 String 값을 정규화하지만, 다른 연산은 암묵적으로 문자열을 정규화하지 않습니다. 연산 결과가 언어 또는 로케일에 민감하지 않음이 별도로 명시되지 않는 한 적용됩니다.
Note
이 설계의 취지는 문자열 구현을 최대한 단순하고 고성능으로 유지하는 것이었습니다. ECMAScript 소스 텍스트가 Normalized Form C인 경우, 문자열 리터럴은 유니코드 이스케이프 시퀀스를 포함하지 않는 한 정규화가 보장됩니다.
이 명세서에서 "the string-concatenation of A, B, ..."라는 구문(각 인자가 String 값, 코드 유닛, 또는 코드 유닛 시퀀스임)은 인자 각각의 코드 유닛을 차례로 이어붙인 시퀀스로 구성된 String 값을 의미합니다.
"the substring of S from inclusiveStart to exclusiveEnd"(여기서 S는 String 값 또는 코드 유닛 시퀀스, inclusiveStart와 exclusiveEnd는 정수)라는 구문은 inclusiveStart 인덱스에서 시작하여 exclusiveEnd 바로 앞까지 연속된 코드 유닛으로 구성된 String 값을 의미합니다(inclusiveStart = exclusiveEnd이면 빈 문자열). "to" 접미사가 생략된 경우, S의 길이가 exclusiveEnd로 사용됩니다.
"ASCII word characters"라는 구문은 다음 String 값을 의미하며, 이는 유니코드 Basic Latin 블록 내 모든 문자와 숫자, U+005F(LOW LINE)만으로 구성됩니다: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_".
역사적 이유로 여러 알고리즘에서 의미를 가집니다.
The abstract operation StringIndexOf takes arguments string (a String), searchValue (a String), and fromIndex (a non-negative integer) and returns a non-negative integer 또는 not-found. It performs the following steps when called:
string의 길이를 len으로 한다.
searchValue가 빈 문자열이고 fromIndex ≤ len이면 fromIndex를 반환한다.
searchValue의 길이를 searchLen으로 한다.
fromIndex ≤ i ≤ len - searchLen인 각 정수 i에 대해 오름차순으로,
string의 i에서 i + searchLen까지의 substring을 candidate로 한다.
candidate가 searchValue와 같다면 i를 반환한다.
not-found를 반환한다.
Note 1
searchValue가 빈 문자열이고 fromIndex ≤ string의 길이면 이 알고리즘은 fromIndex를 반환합니다. 빈 문자열은 문자열 내 모든 위치(마지막 코드 유닛 뒤 포함)에서 발견된 것으로 간주됩니다.
Note 2
fromIndex + searchValue의 길이 > string의 길이이면 이 알고리즘은 항상 not-found를 반환합니다.
The abstract operation StringLastIndexOf takes arguments string (a String), searchValue (a String), and fromIndex (a non-negative integer) and returns a non-negative integer 또는 not-found. It performs the following steps when called:
이전 명세 판에서는 @@name 형식의 표기를 사용하였으며, 현재 판에서는 %Symbol.name%을 사용합니다. 특히 다음 이름들이 사용되었습니다: @@asyncIterator, @@hasInstance, @@isConcatSpreadable, @@iterator, @@match, @@matchAll, @@replace, @@search, @@species, @@split, @@toPrimitive, @@toStringTag, @@unscopables.
Table 1: 잘 알려진 심볼
명세 이름
[[Description]]
값 및 용도
%Symbol.asyncIterator%
"Symbol.asyncIterator"
객체의 기본 비동기 이터레이터를 반환하는 메서드. for-await-of 구문의 의미론에 의해 호출됨.
%Symbol.hasInstance%
"Symbol.hasInstance"
생성자 객체가 특정 객체를 자신의 인스턴스로 인식하는지 결정하는 메서드. instanceof 연산자 의미론에 의해 호출됨.
자신의 프로퍼티명과 상속된 프로퍼티명이 해당 객체의 with 환경 바인딩에서 제외되는 객체 값 프로퍼티.
6.1.6 숫자 타입
ECMAScript에는 두 가지 내장 숫자 타입(Number와 BigInt)이 있습니다. 아래 추상 연산들은 이 숫자 타입에 대해 정의되어 있습니다. "결과(Result)" 열은 반환 타입과, 일부 연산 호출이 abrupt completion을 반환할 수 있는지 여부를 나타냅니다.
숫자 타입들은 일반적으로 정밀도 손실이나 절단 없이 변환될 수 없으므로, ECMAScript 언어는 이러한 타입들 간의 암시적 변환을 제공하지 않습니다. 프로그래머는 다른 타입이 필요한 함수를 호출할 때 타입 간 변환을 위해 반드시 Number와 BigInt 함수를 명시적으로 호출해야 합니다.
Note
ECMAScript의 최초 및 이후 판들은 일부 연산자에 대해 정밀도 손실이나 절단이 발생할 수 있는 암시적 숫자 변환을 제공해왔습니다. 이러한 기존 암시적 변환은 하위 호환성을 위해 유지되지만, BigInt에는 제공되지 않아 프로그래머의 오류 가능성을 최소화하고, 미래 판에서 일반화된 값 타입 옵션을 열어두기 위함입니다.
6.1.6.1 Number 타입
Number 타입은 정확히 18,437,736,874,454,810,627개(즉, 264 - 253 + 3)의 값을 가지며, 이는 IEEE 이진 부동소수점 산술 표준(IEEE 754-2019)의 binary64의 배정밀도 부동소수점 값을 나타냅니다. 단, IEEE 표준의 9,007,199,254,740,990개(즉, 253 - 2)의 NaN 값들은 ECMAScript에서 하나의 특별한 NaN 값으로 표현됩니다. (NaN 값은 프로그램 표현식 NaN에 의해 생성됩니다.) 일부 구현에서는 외부 코드가 다양한 NaN 값을 구분할 수 있지만, 그러한 동작은 구현 정의입니다. ECMAScript 코드에서는 모든 NaN 값이 서로 구분되지 않습니다.
Note
Number 값이 ArrayBuffer(25.1) 또는 SharedArrayBuffer(25.2)에 저장된 후 관찰될 수 있는 비트 패턴은 ECMAScript 구현이 내부적으로 사용하는 Number 값의 표현과 반드시 같지는 않습니다.
또 다른 두 개의 특별한 값, 양의 무한대와 음의 무한대가 있습니다. 간결하게 하기 위해, 이 값들은 설명상 각각 +∞𝔽 및 -∞𝔽 기호로도 불립니다. (이 두 무한대 Number 값은 프로그램 표현식 +Infinity(또는 단순히 Infinity) 및 -Infinity에 의해 생성됩니다.)
나머지 18,437,736,874,454,810,624개(즉, 264 - 253)의 값들은 유한 숫자라고 불립니다. 이 중 절반은 양수이고, 절반은 음수입니다. 모든 유한 양의 Number 값에는 같은 크기를 가진 음수 값이 대응됩니다.
양의 0과 음의 0이 모두 존재함을 유의하세요. 설명상 이 값들은 각각 +0𝔽 및 -0𝔽 기호로도 불립니다. (이 두 다른 0 Number 값은 프로그램 표현식 +0(또는 단순히 0) 및 -0에 의해 생성됩니다.)
18,437,736,874,454,810,622개(즉, 264 - 253 - 2)의 유한 0이 아닌 값들은 두 종류로 나뉩니다:
18,428,729,675,200,069,632개(즉, 264 - 254)는 정규화된 형태로, 다음과 같습니다
s × m × 2e
여기서 s는 1 또는 -1, m은 252(포함)에서 253(제외) 사이의 정수, e는 -1074에서 971(포함) 사이의 정수입니다.
나머지 9,007,199,254,740,990개(즉, 253 - 2) 값은 비정규화된 형태로, 다음과 같습니다
s × m × 2e
여기서 s는 1 또는 -1, m은 0(제외)에서 252(제외) 사이의 정수, e는 -1074입니다.
크기가 253 이하인 모든 양의 및 음의 정수가 Number 타입으로 표현 가능합니다. 정수 0은 Number 타입에서 +0𝔽와 -0𝔽 두 가지 표현을 가집니다.
유한 숫자는 0이 아니며 위에 나타난 두 가지 방식 중 한 가지로 표현될 때 정수 m이 홀수이면 홀수 시그니피컨드를 가집니다. 그렇지 않으면 짝수 시그니피컨드 입니다.
본 명세에서 “x의 Number 값”이라는 구절은 x가 정확한 실수 수량(π와 같은 무리수일 수도 있음)을 나타내는 경우, 다음 방식으로 선택된 Number 값을 의미합니다. Number 타입의 모든 유한 값 집합을 고려하고, -0𝔽를 제거하며, Number 타입으로 표현할 수 없는 두 값을 추가합니다: 21024(즉, +1 × 253 × 2971) 및 -21024(즉, -1 × 253 × 2971). 이 집합에서 x와 가장 가까운 값을 선택합니다. 두 값이 동일하게 가까우면 짝수 시그니피컨드를 가진 값을 선택합니다; 이때 두 추가 값 21024 및 -21024은 짝수 시그니피컨드를 가진 것으로 간주합니다. 마지막으로, 선택된 값이 21024이면 +∞𝔽로, -21024이면 -∞𝔽로, +0𝔽이면 x < 0일 때만 -0𝔽로 바꿉니다; 그 밖의 값은 그대로 사용합니다. 결과가 x의 Number 값입니다. (이 절차는 IEEE 754-2019의 roundTiesToEven 모드와 정확히 일치합니다.)
+∞의 Number 값은 +∞𝔽, -∞의 Number 값은 -∞𝔽입니다.
일부 ECMAScript 연산자는 -231에서 231 - 1까지와 같이 특정 범위의 정수만 처리합니다. 이러한 연산자는 Number 타입의 임의 값을 받아들이지만, 먼저 해당 값을 예상 범위의 정수 값으로 변환합니다. 숫자 변환 연산에 대한 설명은 7.1에서 확인하세요.
6.1.6.1.1 Number::unaryMinus ( x )
The abstract operation Number::unaryMinus takes argument x (a Number) and returns a Number. It performs the following steps when called:
x가 NaN이면, NaN을 반환한다.
x의 부호를 반전시킨 Number를 반환한다. 즉, 같은 크기이지만 부호가 반대인 Number를 계산한다.
6.1.6.1.2 Number::bitwiseNOT ( x )
The abstract operation Number::bitwiseNOT takes argument x (a Number) and returns an integral Number. It performs the following steps when called:
oldValue의 비트 보수를 반환한다. 결과의 수학적 값은 32비트 2의 보수 비트 문자열로 정확히 표현된다.
6.1.6.1.3 Number::exponentiate ( base, exponent )
The abstract operation Number::exponentiate takes arguments base (a Number) and exponent (a Number) and returns a Number. base에 exponent 제곱을 한 결과를 구현에 따라 근사한 값을 반환한다. It performs the following steps when called:
ℝ(base)의 ℝ(exponent) 제곱을 구현에 따라 근사한 Number 값으로 반환.
Note
base가 1𝔽 또는 -1𝔽이고 exponent가 +∞𝔽 또는 -∞𝔽일 때, 혹은 base가 1𝔽이고 exponent가 NaN일 때, base**exponent의 결과는 IEEE 754-2019와 다릅니다. ECMAScript 1판은 이 연산에 대해 NaN 결과를 명시했으나, 이후 IEEE 754 개정판은 1𝔽을 명시했습니다. 호환성을 위해 기존 ECMAScript 동작을 유지합니다.
6.1.6.1.4 Number::multiply ( x, y )
The abstract operation Number::multiply takes arguments x (a Number) and y (a Number) and returns a Number. IEEE 754-2019 배정밀도 이진 산술 규칙에 따라 곱셈을 수행하며, x와 y의 곱을 생성합니다. It performs the following steps when called:
The abstract operation Number::divide takes arguments x (a Number) and y (a Number) and returns a Number. IEEE 754-2019 배정밀도 이진 산술 규칙에 따라 나눗셈을 수행하며, x는 피제수, y는 제수로써 몫을 생성합니다. It performs the following steps when called:
The abstract operation Number::remainder takes arguments n (a Number) and d (a Number) and returns a Number. 피제수 n과 제수 d의 암시적 나눗셈에서 나머지를 반환합니다. It performs the following steps when called:
C 및 C++에서 나머지 연산자는 정수 피연산자만 허용하지만, ECMAScript에서는 부동소수점 피연산자도 허용합니다.
Note 2
부동소수점 나머지 연산의 결과는 IEEE 754-2019의 “remainder” 연산과 다릅니다. IEEE 754-2019 “remainder” 연산은 반올림 나눗셈에서 나머지를 계산하며, 일반적인 정수 나머지 연산자와는 유사하지 않습니다. ECMAScript는 부동소수점 연산에서 %가 Java의 정수 나머지 연산자와 유사하게 동작하도록 정의합니다; 이는 C 라이브러리 함수 fmod와 비교할 수 있습니다.
6.1.6.1.7 Number::add ( x, y )
The abstract operation Number::add takes arguments x (a Number) and y (a Number) and returns a Number. IEEE 754-2019 배정밀도 이진 산술 규칙에 따라 덧셈을 수행하며, 두 인자의 합을 생성합니다. It performs the following steps when called:
The abstract operation Number::subtract takes arguments x (a Number) and y (a Number) and returns a Number. 뺄셈을 수행하며, x는 피감수, y는 감수로써 차를 생성합니다. It performs the following steps when called:
The abstract operation Number::leftShift takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:
lNum을 shiftCount 비트만큼 왼쪽으로 시프트한 결과를 반환한다. 결과의 수학적 값은 32비트 2의 보수 비트 문자열로 정확히 표현된다.
6.1.6.1.10 Number::signedRightShift ( x, y )
The abstract operation Number::signedRightShift takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:
lNum을 shiftCount 비트만큼 부호 확장 우측 시프트한 결과를 반환한다. 최상위 비트가 전파된다. 결과의 수학적 값은 32비트 2의 보수 비트 문자열로 정확히 표현된다.
6.1.6.1.11 Number::unsignedRightShift ( x, y )
The abstract operation Number::unsignedRightShift takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:
lNum을 shiftCount 비트만큼 0으로 채우며 우측 시프트한 결과를 반환한다. 비워진 비트는 0으로 채워진다. 결과의 수학적 값은 32비트 부호 없는 비트 문자열로 정확히 표현된다.
6.1.6.1.12 Number::lessThan ( x, y )
The abstract operation Number::lessThan takes arguments x (a Number) and y (a Number) and returns a Boolean or undefined. It performs the following steps when called:
The abstract operation Number::equal takes arguments x (a Number) and y (a Number) and returns a Boolean. It performs the following steps when called:
x가 NaN이면 false 반환.
y가 NaN이면 false 반환.
x가 y와 같으면 true 반환.
x가 +0𝔽이고 y가 -0𝔽이면 true 반환.
x가 -0𝔽이고 y가 +0𝔽이면 true 반환.
false 반환.
6.1.6.1.14 Number::sameValue ( x, y )
The abstract operation Number::sameValue takes arguments x (a Number) and y (a Number) and returns a Boolean. It performs the following steps when called:
x와 y가 모두 NaN이면 true 반환.
x가 +0𝔽이고 y가 -0𝔽이면 false 반환.
x가 -0𝔽이고 y가 +0𝔽이면 false 반환.
x가 y와 같으면 true 반환.
false 반환.
6.1.6.1.15 Number::sameValueZero ( x, y )
The abstract operation Number::sameValueZero takes arguments x (a Number) and y (a Number) and returns a Boolean. It performs the following steps when called:
x와 y가 모두 NaN이면 true 반환.
x가 +0𝔽이고 y가 -0𝔽이면 true 반환.
x가 -0𝔽이고 y가 +0𝔽이면 true 반환.
x가 y와 같으면 true 반환.
false 반환.
6.1.6.1.16 NumberBitwiseOp ( op, x, y )
The abstract operation NumberBitwiseOp takes arguments op (&, ^, 또는 |), x (a Number), and y (a Number) and returns an integral Number. It performs the following steps when called:
result가 표현하는 32비트 2의 보수 비트 문자열의 정수에 대한 Number 값을 반환한다.
6.1.6.1.17 Number::bitwiseAND ( x, y )
The abstract operation Number::bitwiseAND takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:
The abstract operation Number::bitwiseXOR takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:
The abstract operation Number::bitwiseOR takes arguments x (a Number) and y (a Number) and returns an integral Number. It performs the following steps when called:
The abstract operation Number::toString takes arguments x (a Number) and radix (an integer in the inclusive interval from 2 to 36) and returns a String. x를 진법 radix를 사용한 위치 기수 체계로 문자열로 표현합니다. 진법 r을 사용할 때 사용되는 숫자들은 "0123456789abcdefghijklmnopqrstuvwxyz"의 앞에서 r개 코드 유닛을 차례로 사용합니다. 크기가 1𝔽 이상인 숫자의 표현에는 결코 앞에 0이 포함되지 않습니다. It performs the following steps when called:
n, k, s를 다음 조건을 만족하는 정수로 한다: k ≥ 1, radixk - 1 ≤ s < radixk, 𝔽(s × radixn - k)가 x이고, k가 가능한 한 작다. k는 s의 radix 표현에서 자릿수이고, s는 radix로 나누어떨어지지 않으며, 최소 자리수가 반드시 결정되는 것은 아니다.
s의 최소 자리수는 항상 명시된 요구 조건에 따라 고유하게 결정되는 것은 아니다(위 5 참조).
Note 2
더 정확한 변환을 제공하는 구현의 경우, 아래 대안 버전의 5 단계를 구현 지침으로 사용하는 것을 권장합니다:
n, k, s를 다음 조건을 만족하는 정수로 한다: k ≥ 1, radixk - 1 ≤ s < radixk, 𝔽(s × radixn - k)가 x이고, k가 가능한 한 작다. 여러 가능성이 있으면, ℝ(x)에 근접한 값을 가지는 s를 선택한다. 두 가지 가능성이 있으면 짝수 값을 선택한다. k는 s의 radix 표현에서 자릿수이며, s는 radix로 나누어떨어지지 않는다.
Note 3
ECMAScript 구현자는 David M. Gay가 작성한 부동소수점 숫자의 이진-10진 변환 관련 논문과 코드를 참고할 수 있습니다:
BigInt 타입은 정수 값을 나타냅니다. 값의 크기는 제한이 없으며 특정 비트 폭에 제한되지 않습니다. 별도 언급이 없는 한, 연산들은 일반적으로 정확한 수학적 결과를 반환하도록 설계되었습니다. 이항 연산에서 BigInt는 2의 보수 이진 문자열처럼 동작하며, 음수는 비트가 왼쪽으로 무한히 설정된 것으로 취급됩니다.
6.1.6.2.1 BigInt::unaryMinus ( x )
The abstract operation BigInt::unaryMinus takes argument x (a BigInt) and returns a BigInt. It performs the following steps when called:
x = 0ℤ이면, 0ℤ를 반환한다.
-x를 반환한다.
6.1.6.2.2 BigInt::bitwiseNOT ( x )
The abstract operation BigInt::bitwiseNOT takes argument x (a BigInt) and returns a BigInt. x의 1의 보수를 반환합니다. It performs the following steps when called:
-x - 1ℤ를 반환한다.
6.1.6.2.3 BigInt::exponentiate ( base, exponent )
The abstract operation BigInt::exponentiate takes arguments base (a BigInt) and exponent (a BigInt) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:
exponent < 0ℤ이면, RangeError 예외를 throw한다.
base = 0ℤ이고 exponent = 0ℤ이면, 1ℤ를 반환한다.
base의 exponent 제곱을 반환한다.
6.1.6.2.4 BigInt::multiply ( x, y )
The abstract operation BigInt::multiply takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:
x × y를 반환한다.
Note
결과가 입력보다 훨씬 큰 비트 폭을 갖더라도, 정확한 수학적 결과가 반환됩니다.
6.1.6.2.5 BigInt::divide ( x, y )
The abstract operation BigInt::divide takes arguments x (a BigInt) and y (a BigInt) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:
The abstract operation BigInt::remainder takes arguments n (a BigInt) and d (a BigInt) and returns either a normal completion containing a BigInt or a throw completion. It performs the following steps when called:
The abstract operation BigInt::add takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:
x + y를 반환한다.
6.1.6.2.8 BigInt::subtract ( x, y )
The abstract operation BigInt::subtract takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:
x - y를 반환한다.
6.1.6.2.9 BigInt::leftShift ( x, y )
The abstract operation BigInt::leftShift takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:
이 의미는 BigInt를 무한 길이 2의 보수 이진 숫자열로 취급하여 비트 시프트와 동등해야 합니다.
6.1.6.2.10 BigInt::signedRightShift ( x, y )
The abstract operation BigInt::signedRightShift takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:
The abstract operation BigInt::unsignedRightShift takes arguments x (a BigInt) and y (a BigInt) and returns a throw completion. It performs the following steps when called:
TypeError 예외를 throw한다.
6.1.6.2.12 BigInt::lessThan ( x, y )
The abstract operation BigInt::lessThan takes arguments x (a BigInt) and y (a BigInt) and returns a Boolean. It performs the following steps when called:
The abstract operation BinaryAnd takes arguments x (0 or 1) and y (0 or 1) and returns 0 or 1. It performs the following steps when called:
x = 1이고 y = 1이면 1을 반환한다.
아니면 0을 반환한다.
6.1.6.2.15 BinaryOr ( x, y )
The abstract operation BinaryOr takes arguments x (0 or 1) and y (0 or 1) and returns 0 or 1. It performs the following steps when called:
x = 1이거나 y = 1이면 1을 반환한다.
아니면 0을 반환한다.
6.1.6.2.16 BinaryXor ( x, y )
The abstract operation BinaryXor takes arguments x (0 or 1) and y (0 or 1) and returns 0 or 1. It performs the following steps when called:
x = 1이고 y = 0이면 1을 반환한다.
아니면 x = 0이고 y = 1이면 1을 반환한다.
아니면 0을 반환한다.
6.1.6.2.17 BigIntBitwiseOp ( op, x, y )
The abstract operation BigIntBitwiseOp takes arguments op (&, ^, or |), x (a BigInt), and y (a BigInt) and returns a BigInt. It performs the following steps when called:
The abstract operation BigInt::bitwiseAND takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:
The abstract operation BigInt::bitwiseXOR takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:
The abstract operation BigInt::bitwiseOR takes arguments x (a BigInt) and y (a BigInt) and returns a BigInt. It performs the following steps when called:
The abstract operation BigInt::toString takes arguments x (a BigInt) and radix (an integer in the inclusive interval from 2 to 36) and returns a String. x를 진법 radix를 사용한 위치 기수 체계로 문자열로 표현합니다. 진법 r을 사용할 때 사용되는 숫자들은 "0123456789abcdefghijklmnopqrstuvwxyz"의 앞에서 r개 코드 유닛을 차례로 사용합니다. 0ℤ을 제외한 BigInt의 표현에는 결코 앞에 0이 포함되지 않습니다. It performs the following steps when called:
모든 음수가 아닌 안전한 정수는 해당하는 정수 인덱스를 가집니다. 32비트 부호 없는 정수 중 232 - 1을 제외한 모든 값은 해당하는 배열 인덱스를 가집니다. "-0"은 정수 인덱스도 배열 인덱스도 아닙니다.
프로퍼티 키는 프로퍼티와 그 값을 접근하는 데 사용됩니다. 프로퍼티 접근 방식에는 값을 가져오는 get과 값을 할당하는 set 두 가지가 있습니다. get과 set 접근으로 접근 가능한 프로퍼티에는 객체의 직접적인 일부인 자체 프로퍼티와 프로퍼티 상속 관계를 통해 다른 연관 객체로부터 제공받는 상속 프로퍼티가 포함됩니다. 상속 프로퍼티는 연관 객체의 자체 프로퍼티 또는 상속 프로퍼티일 수 있습니다. 각 객체의 자체 프로퍼티는 해당 객체의 다른 자체 프로퍼티의 키 값과 구별되는 키 값을 가져야 합니다.
모든 객체는 논리적으로 프로퍼티의 집합이지만, 프로퍼티 접근과 조작의 의미론이 다른 여러 형태의 객체가 존재합니다. 여러 형태의 객체 정의는 6.1.7.2를 참고하세요.
또한 일부 객체는 호출 가능하며, 이러한 객체를 함수 또는 함수 객체라고 하며 아래에서 추가로 설명합니다. ECMAScript의 모든 함수는 Object 타입의 멤버입니다.
6.1.7.1 프로퍼티 속성
속성은 Table 3에 설명된 Object 프로퍼티의 상태를 정의하고 설명하는 데 사용됩니다. 명시적으로 지정되지 않는 한, 각 속성의 초기값은 기본값입니다.
값이 Object인 경우, 반드시 함수 객체여야 합니다. set 접근 시마다 해당 함수의 [[Call]] 내부 메소드(Table 5)가 할당 값을 유일한 인자로 포함하는 인자 리스트로 호출됩니다. 프로퍼티의 [[Set]] 내부 메소드 효과는, 반드시 그런 것은 아니지만, 이후 [[Get]] 내부 메소드 호출에서 반환되는 값에 영향을 줄 수 있습니다.
false인 경우, 프로퍼티 삭제, 데이터 프로퍼티에서 접근자 프로퍼티로의 변경 또는 그 반대, 속성 변경(기존 [[Value]] 교체 또는 [[Writable]]을 false로 설정하는 경우 제외)은 모두 실패합니다.
6.1.7.2 Object 내부 메소드와 내부 슬롯
ECMAScript에서 객체의 실제 의미론은 내부 메소드라 불리는 알고리즘을 통해 지정됩니다. ECMAScript 엔진의 각 객체는 런타임 행동을 정의하는 내부 메소드 집합과 연결되어 있습니다. 이러한 내부 메소드는 ECMAScript 언어의 일부가 아닙니다. 이 명세에서는 순전히 설명 목적으로 정의됩니다. 하지만 ECMAScript 구현 내의 각 객체는 해당 객체에 연결된 내부 메소드로 지정된 대로 동작해야 합니다. 이를 구현하는 정확한 방법은 구현에 따라 결정됩니다.
내부 메소드 이름은 다형적입니다. 즉, 서로 다른 객체 값이 동일한 내부 메소드 이름이 호출될 때 서로 다른 알고리즘을 실행할 수 있습니다. 내부 메소드가 호출되는 실제 객체는 호출의 “대상”입니다. 런타임에 알고리즘 구현이 객체가 지원하지 않는 내부 메소드를 사용하려 하면 TypeError 예외가 발생합니다.
내부 슬롯은 객체, 심볼, 또는 Private Name에 연결된 내부 상태로, 여러 ECMAScript 명세 알고리즘에서 사용됩니다. 내부 슬롯은 객체 프로퍼티가 아니며 상속되지 않습니다. 내부 슬롯 명세에 따라 해당 상태는 ECMAScript 언어의 모든 타입 값이나 특정 ECMAScript 명세 타입 값일 수 있습니다. 명시적으로 달리 지정되지 않는 한, 내부 슬롯은 객체, 심볼, 또는 Private Name 생성 과정에서 할당되며 동적으로 추가할 수 없습니다. 별도 지정이 없는 한, 내부 슬롯의 초기값은 undefined입니다. 이 명세의 여러 알고리즘은 내부 슬롯을 가진 값을 생성합니다. 하지만 ECMAScript 언어는 내부 슬롯을 직접 조작할 방법을 제공하지 않습니다.
모든 객체는 [[PrivateElements]]라는 내부 슬롯을 가지며, 이는 PrivateElements의 리스트입니다. 이 리스트는 객체의 private 필드, 메소드, 접근자의 값을 나타냅니다. 초기에는 빈 리스트입니다.
내부 메소드와 내부 슬롯은 이 명세에서 [[ ]]로 둘러싼 이름으로 식별됩니다.
Table 4는 ECMAScript 코드로 생성하거나 조작하는 모든 객체에 적용되는 필수 내부 메소드를 요약합니다. 모든 객체는 모든 필수 내부 메소드에 대한 알고리즘을 가져야 합니다. 하지만 모든 객체가 반드시 동일한 알고리즘을 사용하는 것은 아닙니다.
이 명세는 내부 메소드에 따라 여러 종류의 이국 객체를 인식합니다. 특정 종류의 이국 객체(Array 이국 객체, 바운드 함수 이국 객체 등)와 행동적으로 동등하지만 해당 종류에 대해 명세된 내부 메소드 집합이 동일하지 않은 객체는 해당 종류의 이국 객체로 인식되지 않습니다.
Table 4 및 유사한 표의 “서명(Signature)” 열은 각 내부 메소드의 호출 패턴을 설명합니다. 호출 패턴에는 항상 괄호로 둘러싼 설명적 매개변수 이름 목록이 포함됩니다. 매개변수 이름이 ECMAScript 타입 이름과 같다면 해당 타입의 값이어야 함을 의미합니다. 내부 메소드가 명시적으로 값을 반환하면, 매개변수 목록 뒤에 “→”와 반환 타입 이름이 따라옵니다. 서명에서 사용된 타입 이름은 6에서 정의된 타입에, 아래 추가 이름이 보강된 것입니다. “any”는 값이 ECMAScript 언어 타입 중 아무거나 될 수 있음을 의미합니다.
내부 메소드는 매개변수 외에도 항상 해당 메소드 호출의 대상 객체에 접근할 수 있습니다.
내부 메소드는 암시적으로 Completion Record를 반환하며, 반환 타입에 표시된 값을 감싼 정상 완료 또는 throw 완료입니다.
Table 4: 필수 내부 메소드
내부 메소드
서명(Signature)
설명
[[GetPrototypeOf]]
( ) → Object | Null
이 객체의 상속 프로퍼티를 제공하는 객체를 결정합니다. null 값이면 상속 프로퍼티가 없음을 의미합니다.
[[SetPrototypeOf]]
(Object | Null) → Boolean
이 객체를 상속 프로퍼티를 제공하는 다른 객체와 연결합니다. null을 전달하면 상속 프로퍼티가 없음을 의미합니다. 연산이 성공적으로 완료되면 true, 실패하면 false를 반환합니다.
[[IsExtensible]]
( ) → Boolean
이 객체에 추가 프로퍼티를 추가할 수 있는지 결정합니다.
[[PreventExtensions]]
( ) → Boolean
객체에 새 프로퍼티를 추가할 수 있는지 제어합니다. 연산이 성공하면 true, 실패하면 false를 반환합니다.
Table 5는 함수로 호출 가능한 객체가 지원하는 추가 필수 내부 메소드를 요약합니다. 함수 객체란 [[Call]] 내부 메소드를 지원하는 객체입니다. 생성자란 [[Construct]] 내부 메소드를 지원하는 객체입니다. [[Construct]]를 지원하는 모든 객체는 [[Call]]도 지원해야 하며, 즉 생성자는 항상 함수 객체입니다. 따라서 생성자는 생성자 함수 또는 생성자함수 객체라고도 부를 수 있습니다.
이 객체와 연관된 코드를 실행합니다. 함수 호출 표현식으로 호출됩니다. 내부 메소드의 인자는 this 값과 함수 호출 표현식에서 전달된 인자를 요소로 하는 리스트입니다. 이 내부 메소드를 구현한 객체는 호출 가능합니다.
[[Construct]]
(any의 리스트, Object) → Object
객체를 생성합니다. new 연산자나 super 호출로 호출됩니다. 내부 메소드의 첫 번째 인자는 생성자 호출 또는 super 호출의 인자 리스트이고, 두 번째 인자는 new 연산자가 최초로 적용된 객체입니다. 이 내부 메소드를 구현한 객체는 생성자입니다. 함수 객체가 반드시 생성자인 것은 아니며, 생성자가 아닌 함수 객체는 [[Construct]] 내부 메소드가 없습니다.
일반 객체 및 표준 이국 객체의 필수 내부 메소드 의미론은 10에서 지정됩니다. 구현에서 이국 객체의 내부 메소드 사용이 지원되지 않는 경우, 해당 사용 시 TypeError 예외를 throw해야 합니다.
6.1.7.3 필수 내부 메소드의 불변성
ECMAScript 엔진의 객체 내부 메소드는 아래에 명시된 불변성 목록을 준수해야 합니다. 일반 ECMAScript 객체와 이 명세의 모든 표준 이국 객체는 이 불변성을 유지합니다. ECMAScript Proxy 객체는 [[ProxyHandler]] 객체의 트랩 결과에 대한 런타임 검사를 통해 이 불변성을 유지합니다.
구현에서 제공하는 이국 객체도 해당 객체에 대해 이 불변성을 유지해야 합니다. 이 불변성을 위반하면 ECMAScript 코드의 예측 불가능한 동작이나 보안 문제를 일으킬 수 있습니다. 그러나 이 불변성 위반으로 구현의 메모리 안전성이 훼손되어서는 안 됩니다.
이 불변성을 필수 내부 메소드의 기능을 대체하는 대체 인터페이스를 제공하는 등 어떤 방식으로든 우회하도록 허용해서는 안 됩니다.
정의:
내부 메소드의 대상(target)은 내부 메소드가 호출되는 객체입니다.
대상이 [[IsExtensible]] 내부 메소드에서 false를 반환하거나 [[PreventExtensions]] 내부 메소드에서 true를 반환한 것으로 관찰되면, 비확장 대상입니다.
존재하지 않는(non-existent) 프로퍼티는 비확장 대상에 자체 프로퍼티로 존재하지 않는 프로퍼티입니다.
[[Type]] = normal, [[Target]] = empty, 그리고 [[Value]]가 해당 내부 메소드의 “정상 반환 타입”에 표시된 값
[[Type]] = throw, [[Target]] = empty, 그리고 [[Value]]가 ECMAScript 언어 값
Note 1
내부 메소드는 continue, break, return 완료를 반환하면 안 됩니다.
[[GetPrototypeOf]] ( )
정상 반환 타입은 Object 또는 Null입니다.
대상이 비확장 상태이고 [[GetPrototypeOf]]가 값 V를 반환하면, 이후 [[GetPrototypeOf]] 호출은 항상 V와 SameValue여야 합니다.
Note 2
객체의 프로토타입 체인은 유한 길이를 가져야 합니다(즉, 어떤 객체에서 시작해서 [[GetPrototypeOf]] 내부 메소드를 재귀적으로 적용하면 결국 null에 도달해야 함). 하지만 프로토타입 체인에 일반 객체 정의를 사용하지 않는 이국 객체가 포함되면, 이 요구사항은 객체 수준 불변성으로 강제할 수 없습니다. 이런 순환 프로토타입 체인은 객체 프로퍼티 접근 시 무한 루프를 유발할 수 있습니다.
[[SetPrototypeOf]] ( V )
정상 반환 타입은 Boolean입니다.
대상이 비확장 상태면, [[SetPrototypeOf]]는 V가 대상의 [[GetPrototypeOf]]로 관찰된 값과 SameValue가 아니면 반드시 false를 반환해야 합니다.
[[IsExtensible]] ( )
정상 반환 타입은 Boolean입니다.
[[IsExtensible]]가 false를 반환하면, 이후 해당 대상에서 [[IsExtensible]]은 반드시 false를 반환해야 합니다.
[[PreventExtensions]] ( )
정상 반환 타입은 Boolean입니다.
[[PreventExtensions]]가 true를 반환하면, 이후 해당 대상에서 [[IsExtensible]]은 반드시 false를 반환해야 하며, 이제 대상은 비확장 상태로 간주됩니다.
반환된 리스트에는 이전에 관찰된 모든 비구성 자체 프로퍼티의 키가 반드시 포함되어야 합니다.
대상이 비확장 상태면, 반환된 리스트에는 [[GetOwnProperty]]로 관찰 가능한 대상의 모든 자체 프로퍼티 키만 포함되어야 합니다.
[[Call]] ( )
정상 반환 타입은 ECMAScript 언어의 어떤 타입이든 가능합니다.
[[Construct]] ( )
정상 반환 타입은 Object입니다.
대상은 반드시 [[Call]] 내부 메소드도 가져야 합니다.
6.1.7.4 잘 알려진 내장 객체
잘 알려진 내장 객체는 이 명세의 알고리즘에서 명시적으로 참조되는 내장 객체이며, 일반적으로 realm별로 별도의 정체성을 가집니다. 별도 지정이 없는 한, 각 내장 객체는 실제로 realm별로 하나씩 유사한 객체 집합에 해당합니다.
이 명세 내에서 %name%과 같은 참조는 현재 realm과 연결된 해당 이름의 내장 객체를 의미합니다. %name.a.b%와 같은 참조는, 어떤 ECMAScript 코드가 평가되기 전에 내장 객체 %name%의 "a" 프로퍼티 값의 "b" 프로퍼티 값에 접근한 것과 같습니다. 현재 realm 및 그 내장 객체 결정 방법은 9.4에 설명되어 있습니다. 잘 알려진 내장 객체 목록은 Table 6에 나와 있습니다.
Enum은 명세 내부에서만 사용되며 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의 3번째 요소를 의미합니다.
알고리즘이 List의 요소를 반복할 때 순서를 지정하지 않으면 List 요소의 순서대로 사용됩니다.
이 명세에서는 리터럴 문법을 사용해 새로운 List 값을 표현할 수 있습니다. 예를 들어, « 1, 2 »는 두 개의 요소를 특정 값으로 초기화한 List 값을 정의합니다. 새로운 빈 List는 « »로 표현할 수 있습니다.
이 명세에서 “the list-concatenation of A, B, ...”(각 인자가 비어 있을 수도 있는 List)라는 표현은 각 인자(순서대로)의 요소를 이어붙인(순서대로) 새로운 List 값을 의미합니다.
List가 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 컬렉션 타입 Set과는 다릅니다. 혼동을 피하기 위해, 명세에서는 ECMAScript 컬렉션 인스턴스를 “Set 객체”라고 일관되게 부릅니다. Set 타입 값은 중복 없는 간단한 요소 집합입니다. 요소는 추가·제거할 수 있으며, Set끼리 합집합·교집합·차집합 연산이 가능합니다.
Relation 타입은 Set에 대한 제약을 설명하는 데 사용됩니다. Relation 타입 값은 값 도메인에서 가져온 순서쌍의 Set입니다. 예를 들어, 이벤트에 대한 Relation은 이벤트들의 순서쌍 집합입니다. Relation R과 값 도메인 내 두 값 a, b에 대해 aRb는 (a, b)가 R의 원소임을 뜻합니다. Relation이 어떤 조건에 대해 최소 Relation임은 그 조건을 만족하는 가장 작은 Relation임을 의미합니다.
엄격 부분 순서(strict partial order)는 다음을 만족하는 Relation 값 R입니다.
모든 R의 도메인 내 a, b, c에 대해:
aRa는 성립하지 않으며,
aRb 및 bRc이면, aRc이다.
Note 1
위 두 속성은 각각 반사 불가성(irreflexivity)과 추이성(transitivity)이라 부릅니다.
엄격 전순서(strict total order)는 다음을 만족하는 Relation 값 R입니다.
모든 R의 도메인 내 a, b, c에 대해:
a는 b이거나, aRb이거나, bRa이다.
aRa는 성립하지 않는다.
aRb 그리고 bRc이면, aRc이다.
Note 2
위 세 속성은 각각 전체성(totality), 반사 불가성(irreflexivity), 추이성(transitivity)이라 부릅니다.
6.2.4 Completion Record 명세 타입
Completion Record 명세 타입은 실행 중 값의 전달과 제어 흐름(비지역적 제어 이동을 수행하는 문장인 break, continue, return, throw의 동작 등)을 설명하는 데 사용됩니다.
normal completion은 [[Type]] 값이 normal인 Completion Record를 의미합니다.
break completion은 [[Type]] 값이 break인 Completion Record를 의미합니다.
continue completion은 [[Type]] 값이 continue인 Completion Record를 의미합니다.
return completion은 [[Type]] 값이 return인 Completion Record를 의미합니다.
throw completion은 [[Type]] 값이 throw인 Completion Record를 의미합니다.
abrupt completion은 [[Type]] 값이 normal이 아닌 Completion Record를 의미합니다.
normal completion containing은 [[Value]] 필드에 해당 타입의 값이 포함된 normal completion을 의미합니다.
이 명세에서 정의된 호출 가능한 객체는 항상 normal completion이나 throw completion만 반환합니다. 그 외 Completion Record를 반환하는 것은 편집 오류로 간주합니다.
구현 정의 호출 가능 객체도 normal completion 또는 throw completion만 반환해야 합니다.
6.2.4.1 NormalCompletion ( value )
The abstract operation NormalCompletion takes argument value (Completion Record가 아닌 임의 값) and returns normal completion. It performs the following steps when called:
The abstract operation ThrowCompletion takes argument value (ECMAScript 언어 값) and returns throw completion. It performs the following steps when called:
The abstract operation ReturnCompletion takes argument value (ECMAScript 언어 값) and returns return completion. It performs the following steps when called:
The abstract operation MakePrivateReference takes arguments baseValue (ECMAScript 언어 값) and privateIdentifier (문자열) and returns Reference Record. It performs the following steps when called:
privateEnv를 실행 중인 실행 컨텍스트의 PrivateEnvironment로 한다.
Property Descriptor 타입은 Object 프로퍼티 속성의 조작과 구체화를 설명하는 데 사용됩니다. Property Descriptor는 0개 이상의 필드를 갖는 Record이며, 각 필드 이름은 속성 이름이고 값은 6.1.7.1에 지정된 속성 값입니다. 명세에서 Property Descriptor 레코드의 리터럴 설명을 태그하는 스키마 이름은 “PropertyDescriptor”입니다.
Property Descriptor 값은 특정 필드의 존재나 사용에 따라 데이터 Property Descriptor와 접근자 Property Descriptor로 더 분류할 수 있습니다. [[Value]] 또는 [[Writable]] 필드가 있으면 데이터 Property Descriptor, [[Get]] 또는 [[Set]] 필드가 있으면 접근자 Property Descriptor입니다. 모든 Property Descriptor에는 [[Enumerable]]과 [[Configurable]] 필드가 있을 수 있습니다. 한 Property Descriptor 값은 데이터 Property Descriptor와 접근자 Property Descriptor를 동시에 가질 수 없지만, 둘 다 아닐 수도 있습니다(이 경우 generic Property Descriptor). 완전한 Property Descriptor는 접근자 또는 데이터 Property Descriptor이면서 Table 3의 해당 필드를 모두 가지고 있는 것입니다.
이 명세에서 Property Descriptor 값을 다루기 위해 다음 추상 연산을 사용합니다:
6.2.6.1 IsAccessorDescriptor ( Desc )
The abstract operation IsAccessorDescriptor takes argument Desc (Property Descriptor) and returns Boolean. It performs the following steps when called:
Desc에 [[Get]] 필드가 있으면 true 반환.
Desc에 [[Set]] 필드가 있으면 true 반환.
false 반환.
6.2.6.2 IsDataDescriptor ( Desc )
The abstract operation IsDataDescriptor takes argument Desc (Property Descriptor) and returns Boolean. It performs the following steps when called:
Desc에 [[Value]] 필드가 있으면 true 반환.
Desc에 [[Writable]] 필드가 있으면 true 반환.
false 반환.
6.2.6.3 IsGenericDescriptor ( Desc )
The abstract operation IsGenericDescriptor takes argument Desc (Property Descriptor) and returns Boolean. It performs the following steps when called:
The abstract operation FromPropertyDescriptor takes argument Desc (Property Descriptor 또는 undefined) and returns Object 또는 undefined. It performs the following steps when called:
IsCallable(setter)가 false이고 setter가 undefined가 아니면 TypeError 예외를 throw한다.
desc.[[Set]]에 setter를 할당한다.
desc에 [[Get]] 또는 [[Set]] 필드가 있으면,
desc에 [[Value]] 또는 [[Writable]] 필드가 있으면 TypeError 예외를 throw한다.
desc를 반환한다.
6.2.6.6 CompletePropertyDescriptor ( Desc )
The abstract operation CompletePropertyDescriptor takes argument Desc (Property Descriptor) and returns unused. It performs the following steps when called:
like를 Record { [[Value]]: undefined, [[Writable]]: false, [[Get]]: undefined, [[Set]]: undefined, [[Enumerable]]: false, [[Configurable]]: false }로 한다.
Desc에 [[Value]] 필드가 없으면 Desc.[[Value]]에 like.[[Value]]를 할당한다.
Desc에 [[Writable]] 필드가 없으면 Desc.[[Writable]]에 like.[[Writable]]를 할당한다.
아니면,
Desc에 [[Get]] 필드가 없으면 Desc.[[Get]]에 like.[[Get]]를 할당한다.
Desc에 [[Set]] 필드가 없으면 Desc.[[Set]]에 like.[[Set]]를 할당한다.
Desc에 [[Enumerable]] 필드가 없으면 Desc.[[Enumerable]]에 like.[[Enumerable]]를 할당한다.
Desc에 [[Configurable]] 필드가 없으면 Desc.[[Configurable]]에 like.[[Configurable]]를 할당한다.
unused를 반환한다.
6.2.7 Environment Record 명세 타입
Environment Record 타입은 중첩 함수와 블록에서 이름 해석 동작을 설명하는 데 사용됩니다. 이 타입과 관련 연산은 9.1에 정의되어 있습니다.
6.2.8 Abstract Closure 명세 타입
Abstract Closure 명세 타입은 알고리즘 단계와 값 집합을 함께 참조하는 데 사용됩니다. Abstract Closure는 메타 값이며 함수 호출 방식(closure(arg1, arg2))으로 호출됩니다. 추상 연산과 마찬가지로, 호출 시 Abstract Closure에 기술된 알고리즘 단계를 수행합니다.
Abstract Closure를 생성하는 알고리즘 단계에서는 "capture" 뒤에 별칭 목록으로 값을 캡처합니다. Abstract Closure가 생성될 때 각 별칭에 연관된 값을 캡처합니다. Abstract Closure가 호출될 때 수행할 알고리즘 단계에서는 캡처된 값을 캡처 당시 사용된 별칭으로 참조합니다.
Abstract Closure는 다른 알고리즘의 일부로 인라인 생성됩니다. 예시는 다음과 같습니다.
addend를 41로 한다.
closure를 매개변수(x)를 가지며, addend를 캡처하고 호출 시 다음 단계를 수행하는 새로운 Abstract Closure로 한다:
x + addend를 반환한다.
val을 closure(1)로 한다.
단언: val은 42이다.
6.2.9 Data Block
Data Block 명세 타입은 개별적이고 변경 가능한 바이트 크기(8비트)의 숫자값 시퀀스를 설명하는 데 사용됩니다. byte value는 0부터 255(포함) 사이의 정수입니다. Data Block 값은 고정된 바이트 수로 생성되며 각 바이트의 초기값은 0입니다.
이 명세에서는 배열과 유사한 문법으로 Data Block 값의 개별 바이트에 접근할 수 있습니다. 이 표기법은 Data Block 값을 0 기반 integer-indexed 바이트 시퀀스로 표현합니다. 예를 들어, db가 5바이트 Data Block 값이면 db[2]는 3번째 바이트에 접근할 수 있습니다.
메모리 내에서 여러 agent가 동시에 참조할 수 있는 data block은 Shared Data Block이라 부릅니다. Shared Data Block은 주소 자유(address-free)의 정체성을 갖습니다(Shared Data Block 값의 동등성 검사 목적). 이는 해당 블록이 어떤 프로세스의 가상 주소에 매핑되어 있든 상관없이, 그 블록이 나타내는 메모리 위치 집합에 따라 정체성이 결정됨을 뜻합니다. 두 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 )
The abstract operation CreateByteDataBlock takes argument size (0 이상 정수) and returns Data Block을 담는 normal completion 또는 throw completion. It performs the following steps when called:
size > 253 - 1이면 RangeError 예외를 throw한다.
db를 size 바이트로 구성된 새로운 Data Block 값으로 한다. 생성이 불가능하면 RangeError 예외를 throw한다.
The abstract operation CopyDataBlockBytes takes arguments toBlock (Data Block 또는 Shared Data Block), toIndex (0 이상 정수), fromBlock (Data Block 또는 Shared Data Block), fromIndex (0 이상 정수), and count (0 이상 정수) and returns unused. It performs the following steps when called:
PrivateElement 타입은 private 클래스 필드, 메소드, 접근자 명세에 사용되는 Record입니다. Property Descriptor는 private element에 사용되지 않지만, private 필드는 비구성·비열거·쓰기 가능한 데이터 프로퍼티와, private 메소드는 비구성·비열거·쓰기 불가능한 데이터 프로퍼티와, private 접근자는 비구성·비열거 접근자 프로퍼티와 유사하게 동작합니다.
PrivateElement 타입의 값은 Table 9에 정의된 필드를 갖는 Record 값입니다. 이러한 값을 PrivateElement라 합니다.
Private Name 명세 타입은 전역적으로 고유한 값(다른 Private Name과 구별됨, 설령 구별 불가해 보여도)을 설명하는 데 사용됩니다. 이 값은 private 클래스 요소(필드, 메소드, 접근자)의 키를 나타냅니다. 각 Private Name은 불변의 [[Description]] 내부 슬롯을 가지며, 이는 문자열입니다. Private Name은 ECMAScript 객체에 PrivateFieldAdd 또는 PrivateMethodOrAccessorAdd로 설치할 수 있으며, PrivateGet과 PrivateSet을 통해 읽거나 쓸 수 있습니다.
6.2.13 ClassStaticBlockDefinition Record 명세 타입
ClassStaticBlockDefinition Record는 클래스 static 초기화 블록의 실행 코드를 캡슐화하는 데 사용되는 Record 값입니다.
이 연산들은 ECMAScript 언어의 일부가 아니며; ECMAScript 언어의 의미론을 명세하기 쉽게 하기 위해 여기에서만 정의됩니다. 이 명세 전반에 걸쳐 보다 특수화된 다른 추상 연산들이 정의됩니다.
7.1 타입 변환(Type Conversion)
ECMAScript 언어는 필요에 따라 자동으로 암시적 타입 변환을 수행합니다. 특정 구성의 의미론을 명확히 하기 위해 일련의 변환 추상 연산을 정의하는 것이 유용합니다. 변환 추상 연산은 다형적이며; 어떤 ECMAScript 언어 타입의 값이든 받을 수 있습니다. 그러나 다른 명세 타입은 이러한 연산과 함께 사용되지 않습니다.
BigInt 타입은 ECMAScript 언어에서 암시적 변환이 없습니다; 프로그래머는 다른 타입에서 값을 변환하기 위해 반드시 BigInt를 명시적으로 호출해야 합니다.
7.1.1 ToPrimitive ( input [ , preferredType ] )
The abstract operation ToPrimitive takes argument input (ECMAScript 언어 값) and optional argument preferredType (string 또는 number) and returns ECMAScript 언어 값을 담는 normal completion 또는 throw completion. input 인수를 비-Object 타입으로 변환합니다. 객체가 둘 이상의 원시 타입으로 변환 가능하다면 선택적 힌트 preferredType을 사용하여 그 타입을 우선할 수 있습니다. It performs the following steps when called:
ToPrimitive가 힌트 없이 호출되면 일반적으로 힌트가 number인 것처럼 동작합니다. 그러나 객체는 %Symbol.toPrimitive% 메서드를 정의하여 이 동작을 재정의할 수 있습니다. 이 명세에 정의된 객체 중 Date( 21.4.4.45 참조 )와 Symbol 객체( 20.4.3.5 참조 )만이 기본 ToPrimitive 동작을 재정의합니다. Date는 힌스가 없는 경우 힌트가 string인 것처럼 취급합니다.
7.1.1.1 OrdinaryToPrimitive ( O, hint )
The abstract operation OrdinaryToPrimitive takes arguments O (Object) and hint (string 또는 number) and returns ECMAScript 언어 값을 담는 normal completion 또는 throw completion. It performs the following steps when called:
The abstract operation ToBoolean takes argument argument (ECMAScript 언어 값) and returns Boolean. argument를 Boolean 타입 값으로 변환합니다. It performs the following steps when called:
argument가 Boolean이면 argument를 반환한다.
argument가 undefined, null, +0𝔽, -0𝔽, NaN, 0ℤ, 또는 빈 String 중 하나이면 false를 반환한다.
argument가 Object이고 [[IsHTMLDDA]] 내부 슬롯을 갖고 있으면 false를 반환한다.
true를 반환한다.
7.1.3 ToNumeric ( value )
The abstract operation ToNumeric takes argument value (ECMAScript 언어 값) and returns Number 또는 BigInt를 담는 normal completion 또는 throw completion. value를 Number 또는 BigInt로 변환하여 반환합니다. It performs the following steps when called:
The abstract operation RoundMVResult takes argument n (수학적 값) and returns Number. 구현 정의 방식으로 n을 Number로 변환합니다. 이 추상 연산의 목적상, 어떤 자릿수가 0이 아니거나 그 왼쪽에 0이 아닌 자릿수가 있고 오른쪽에 0이 아닌 자릿수가 있는 경우 유효 자릿수입니다. 또한 “수학적 값을 나타내는 표현”의 수학적 값은 “수학적 값의 10진 표현”의 역입니다. It performs the following steps when called:
The abstract operation ToIntegerOrInfinity takes argument argument (ECMAScript 언어 값) and returns 정수, +∞ 또는 -∞ 중 하나를 담는 normal completion 또는 throw completion. argument를 그 Number 값에서 소수 부분을 절단한 정수로, 혹은 그 Number 값이 무한대일 경우 +∞ 또는 -∞로 변환합니다. It performs the following steps when called:
𝔽(ToIntegerOrInfinity(x))는 어떤 x에 대해서도 -0𝔽을 반환하지 않습니다. 소수 부분 절단은 x를 수학적 값으로 변환한 후 수행됩니다.
7.1.6 ToInt32 ( argument )
The abstract operation ToInt32 takes argument argument (ECMAScript 언어 값) and returns 적분 Number를 담는 normal completion 또는 throw completion. argument를 𝔽(-231)부터 𝔽(231 - 1)까지(포함) 232개의 적분 Number 값 중 하나로 변환합니다. It performs the following steps when called:
int32bit ≥ 231이면 𝔽(int32bit - 232)을, 아니면 𝔽(int32bit)을 반환한다.
Note
위 정의에 따른 ToInt32의 성질:
ToInt32 추상 연산은 멱등성: 자신의 결과에 다시 적용해도 값은 변하지 않습니다.
모든 x에 대해 ToInt32(ToUint32(x))는 ToInt32(x)와 동일한 값입니다. (이 후속 성질을 보존하기 위해 +∞𝔽와 -∞𝔽이 +0𝔽으로 매핑됩니다.)
ToInt32는 -0𝔽을 +0𝔽으로 매핑합니다.
7.1.7 ToUint32 ( argument )
The abstract operation ToUint32 takes argument argument (ECMAScript 언어 값) and returns 적분 Number를 담는 normal completion 또는 throw completion. argument를 +0𝔽에서 𝔽(232 - 1)까지(포함) 232개의 적분 Number 값 중 하나로 변환합니다. It performs the following steps when called:
모든 x에 대해 ToUint32(ToInt32(x))는 ToUint32(x)와 동일합니다. (+∞𝔽, -∞𝔽이 +0𝔽으로 매핑되는 이유.)
ToUint32는 -0𝔽을 +0𝔽으로 매핑합니다.
7.1.8 ToInt16 ( argument )
The abstract operation ToInt16 takes argument argument (ECMAScript 언어 값) and returns 적분 Number를 담는 normal completion 또는 throw completion. argument를 𝔽(-215)부터 𝔽(215 - 1)까지(포함) 216개의 적분 Number 값 중 하나로 변환합니다. It performs the following steps when called:
int16bit ≥ 215이면 𝔽(int16bit - 216)을, 아니면 𝔽(int16bit)을 반환한다.
7.1.9 ToUint16 ( argument )
The abstract operation ToUint16 takes argument argument (ECMAScript 언어 값) and returns 적분 Number를 담는 normal completion 또는 throw completion. argument를 +0𝔽에서 𝔽(216 - 1)까지(포함) 216개의 적분 Number 값 중 하나로 변환합니다. It performs the following steps when called:
4 단계에서 216을 232 대신 사용하는 점이 ToUint32와 ToUint16의 유일한 차이입니다.
ToUint16은 -0𝔽을 +0𝔽으로 매핑합니다.
7.1.10 ToInt8 ( argument )
The abstract operation ToInt8 takes argument argument (ECMAScript 언어 값) and returns 적분 Number를 담는 normal completion 또는 throw completion. argument를 -128𝔽에서 127𝔽까지(포함) 28개의 적분 Number 값 중 하나로 변환합니다. It performs the following steps when called:
int8bit ≥ 27이면 𝔽(int8bit - 28)을, 아니면 𝔽(int8bit)을 반환한다.
7.1.11 ToUint8 ( argument )
The abstract operation ToUint8 takes argument argument (ECMAScript 언어 값) and returns 적분 Number를 담는 normal completion 또는 throw completion. argument를 +0𝔽에서 255𝔽까지(포함) 28개의 적분 Number 값 중 하나로 변환합니다. It performs the following steps when called:
The abstract operation ToUint8Clamp takes argument argument (ECMAScript 언어 값) and returns 적분 Number를 담는 normal completion 또는 throw completion. argument를 +0𝔽에서 255𝔽까지(포함) 28개의 적분 Number 값 중 하나로 클램프(clamp)하고 반올림합니다. It performs the following steps when called:
대부분 다른 ECMAScript 정수 변환 연산과 달리 ToUint8Clamp는 비정수 값을 절단(truncate)하지 않고 반올림합니다. 또한 “round half up”을 사용하는 Math.round와 달리 “round half to even” 절충 규칙을 사용합니다.
7.1.13 ToBigInt ( argument )
The abstract operation ToBigInt takes argument argument (ECMAScript 언어 값) and returns BigInt를 담는 normal completion 또는 throw completion. argument를 BigInt 값으로 변환하며, Number에서의 암시적 변환이 필요하다면 예외를 던집니다. It performs the following steps when called:
The abstract operation ToBigInt64 takes argument argument (ECMAScript 언어 값) and returns BigInt를 담는 normal completion 또는 throw completion. argument를 ℤ(-263)부터 ℤ(263 - 1)까지(포함) 264개의 BigInt 값 중 하나로 변환합니다. It performs the following steps when called:
int64bit ≥ 263이면 ℤ(int64bit - 264)을, 아니면 ℤ(int64bit)을 반환한다.
7.1.16 ToBigUint64 ( argument )
The abstract operation ToBigUint64 takes argument argument (ECMAScript 언어 값) and returns BigInt를 담는 normal completion 또는 throw completion. argument를 0ℤ에서 ℤ(264 - 1)까지(포함) 264개의 BigInt 값 중 하나로 변환합니다. It performs the following steps when called:
The abstract operation ToLength takes argument argument (ECMAScript 언어 값) and returns 음이 아닌 적분 Number를 담는 normal completion 또는 throw completion. argument를 배열 유사 객체의 length로 사용 가능하도록 음이 아닌 적분 Number로 클램프(clamp) 및 절단(truncate)합니다. It performs the following steps when called:
The abstract operation CanonicalNumericIndexString takes argument argument (String) and returns Number 또는 undefined. argument가 "-0"이거나 어떤 Number 값 n에 대해 ToString(n)과 정확히 일치하면 해당 Number 값을 반환합니다. 그렇지 않으면 undefined를 반환합니다. It performs the following steps when called:
canonical numeric string은 CanonicalNumericIndexString 추상 연산이 undefined를 반환하지 않는 모든 String입니다.
7.1.22 ToIndex ( value )
The abstract operation ToIndex takes argument value (ECMAScript 언어 값) and returns 음이 아닌 정수를 담는 normal completion 또는 throw completion. value를 정수로 변환하고, 그 정수가 음이 아니며 정수 인덱스에 대응되면 그 정수를 반환합니다. 그렇지 않으면 예외를 던집니다. It performs the following steps when called:
integer가 0에서 253 - 1 (포함) 사이에 없으면 RangeError 예외를 던진다.
integer를 반환한다.
7.2 테스트 및 비교 연산(Testing and Comparison Operations)
7.2.1 RequireObjectCoercible ( argument )
The abstract operation RequireObjectCoercible takes argument argument (ECMAScript 언어 값) and returns unused을 담는 normal completion 또는 throw completion. argument가 ToObject로 Object로 변환될 수 없는 값이면 에러를 던집니다. It performs the following steps when called:
The abstract operation IsCallable takes argument argument (ECMAScript 언어 값) and returns Boolean. argument가 [[Call]] 내부 메소드를 가진 호출 가능 함수인지 결정합니다. It performs the following steps when called:
argument가 Object가 아니면 false를 반환한다.
argument가 [[Call]] 내부 메소드를 가지면 true를 반환한다.
false를 반환한다.
7.2.4 IsConstructor ( argument )
The abstract operation IsConstructor takes argument argument (ECMAScript 언어 값) and returns Boolean. argument가 [[Construct]] 내부 메소드를 가진 함수 객체인지 결정합니다. It performs the following steps when called:
argument가 Object가 아니면 false를 반환한다.
argument가 [[Construct]] 내부 메소드를 가지면 true를 반환한다.
false를 반환한다.
7.2.5 IsExtensible ( O )
The abstract operation IsExtensible takes argument O (Object) and returns Boolean을 담는 normal completion 또는 throw completion. O에 추가 프로퍼티를 더할 수 있는지 결정하는 데 사용됩니다. It performs the following steps when called:
The abstract operation IsStringWellFormedUnicode takes argument string (String) and returns Boolean. 6.1.4에 설명된 대로 string을 UTF-16 인코딩된 코드 포인트 시퀀스로 해석하고 이것이 well formed UTF-16 시퀀스인지 판정합니다. It performs the following steps when called:
len을 string의 길이로 둔다.
k를 0으로 둔다.
k < len 동안 반복,
cp를 CodePointAt(string, k)로 둔다.
cp.[[IsUnpairedSurrogate]]가 true이면 false를 반환한다.
k를 k + cp.[[CodeUnitCount]]로 둔다.
true를 반환한다.
7.2.8 SameType ( x, y )
The abstract operation SameType takes arguments x (ECMAScript 언어 값) and y (ECMAScript 언어 값) and returns Boolean. 두 인수가 같은 타입인지 판정합니다. It performs the following steps when called:
x가 undefined이고 y가 undefined이면 true를 반환한다.
x가 null이고 y가 null이면 true를 반환한다.
x가 Boolean이고 y가 Boolean이면 true를 반환한다.
x가 Number이고 y가 Number이면 true를 반환한다.
x가 BigInt이고 y가 BigInt이면 true를 반환한다.
x가 Symbol이고 y가 Symbol이면 true를 반환한다.
x가 String이고 y가 String이면 true를 반환한다.
x가 Object이고 y가 Object이면 true를 반환한다.
false를 반환한다.
7.2.9 SameValue ( x, y )
The abstract operation SameValue takes arguments x (ECMAScript 언어 값) and y (ECMAScript 언어 값) and returns Boolean. 두 인수가 같은 값인지 판정합니다. It performs the following steps when called:
이 알고리즘은 모든 NaN 값을 동등하게 취급하고 +0𝔽와 -0𝔽을 구분한다는 점에서 IsStrictlyEqual 알고리즘과 다릅니다.
7.2.10 SameValueZero ( x, y )
The abstract operation SameValueZero takes arguments x (ECMAScript 언어 값) and y (ECMAScript 언어 값) and returns Boolean. 두 인수가 같은 값인지 ( +0𝔽와 -0𝔽의 차이를 무시하고 ) 판정합니다. It performs the following steps when called:
SameValueZero는 +0𝔽와 -0𝔽을 동일하게 취급한다는 점만 SameValue와 다릅니다.
7.2.11 SameValueNonNumber ( x, y )
The abstract operation SameValueNonNumber takes arguments x (Number가 아닌 ECMAScript 언어 값) and y (Number가 아닌 ECMAScript 언어 값) and returns Boolean. It performs the following steps when called:
The abstract operation IsLessThan takes arguments x (ECMAScript 언어 값), y (ECMAScript 언어 값), and LeftFirst (Boolean) and returns Boolean 또는 undefined를 담는 normal completion 또는 throw completion. x < y 비교의 의미론을 제공하며, true, false, 또는 (적어도 한 피연산자가 NaN임을 나타내는) undefined를 반환합니다. LeftFirst 플래그는 x, y에 잠재적으로 부작용 있는 연산의 순서를 제어합니다. 이는 ECMAScript가 표현식을 좌→우로 평가하도록 규정하기 때문에 필요합니다. LeftFirst가 true이면 x 매개변수는 y 매개변수 표현식의 왼쪽에 오는 표현식에 해당합니다. false이면 반대이며 연산은 x 이전에 y에 수행되어야 합니다. It performs the following steps when called:
3 단계는 덧셈 연산자 +를 처리하는 알고리즘(13.15.3)의 1.c 단계와 논리 OR 대신 논리 AND를 사용하는 점에서 다릅니다.
Note 2
String 비교는 UTF-16 코드 유닛 값 시퀀스에 대한 단순한 사전식(lexicographic) 순서를 사용합니다. Unicode 명세에서 정의한 더 복잡하고 의미론 지향적인 문자/문자열 동등성이나 정렬 순서를 사용하려 하지 않습니다. 따라서 Unicode 표준에 따라 정규적으로 동등하지만 정규화 형태가 다른 String 값은 불일치로 판정될 수 있습니다. 또한 surrogate pair를 포함한 String의 경우 코드 유닛 기반 사전식 순서는 코드 포인트 기반 순서와 다를 수 있습니다.
The abstract operation IsStrictlyEqual takes arguments x (ECMAScript 언어 값) and y (ECMAScript 언어 값) and returns Boolean. === 연산자의 의미론을 제공합니다. It performs the following steps when called:
The abstract operation MakeBasicObject takes argument internalSlotsList (내부 슬롯 이름들의 List) and returns Object. 알고리즘적으로 생성되는 모든 ECMAScript 객체(ordinary 및 exotic 포함)의 근원입니다. 모든 객체 생성에서 사용되는 공통 단계를 분리하고 객체 생성을 중앙화합니다. It performs the following steps when called:
obj의 essential 내부 메소드를 10.1에 지정된 기본 ordinary object 정의로 설정한다.
단언: 호출자가 obj의 [[GetPrototypeOf]]와 [[SetPrototypeOf]] essential 내부 메소드를 모두 재정의하지 않을 경우 internalSlotsList는 [[Prototype]]을 포함한다.
단언: 호출자가 obj의 [[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]] essential 내부 메소드를 모두 재정의하지 않을 경우 internalSlotsList는 [[Extensible]]을 포함한다.
internalSlotsList가 [[Extensible]]을 포함하면 obj.[[Extensible]]를 true로 둔다.
obj를 반환한다.
Note
이 명세 내에서 exotic 객체는 ArrayCreate, BoundFunctionCreate 같은 추상 연산에서 먼저 MakeBasicObject를 호출하여 기본 객체를 얻고 그 후 그 객체의 일부 또는 모든 내부 메소드를 재정의하여 생성됩니다. exotic 객체 생성을 캡슐화하기 위해 객체의 essential 내부 메소드는 그러한 연산 외부에서는 수정되지 않습니다.
The abstract operation Set takes arguments O (Object), P (프로퍼티 키), V (ECMAScript 언어 값), and Throw (Boolean) and returns unused을 담는 normal completion 또는 throw completion. 객체의 특정 프로퍼티 값을 설정하는 데 사용됩니다. V는 프로퍼티의 새 값입니다. It performs the following steps when called:
success를 ? O.[[Set]](P, V, O)로 둔다.
success가 false이고 Throw가 true이면 TypeError 예외를 던진다.
unused를 반환한다.
7.3.5 CreateDataProperty ( O, P, V )
The abstract operation CreateDataProperty takes arguments O (Object), P (프로퍼티 키), and V (ECMAScript 언어 값) and returns Boolean을 담는 normal completion 또는 throw completion. 객체의 새로운 own 프로퍼티를 생성하는 데 사용됩니다. It performs the following steps when called:
이 추상 연산은 ECMAScript 대입 연산자가 생성하는 프로퍼티와 동일 기본 속성 값을 가진 프로퍼티를 생성합니다. 일반적으로 프로퍼티는 미존재 상태입니다. 존재하고 비구성이거나 O가 비확장 가능이면 [[DefineOwnProperty]]는 false를 반환합니다.
7.3.6 CreateDataPropertyOrThrow ( O, P, V )
The abstract operation CreateDataPropertyOrThrow takes arguments O (Object), P (프로퍼티 키), and V (ECMAScript 언어 값) and returns unused을 담는 normal completion 또는 throw completion. 객체의 새로운 own 프로퍼티를 생성하는 데 사용되며, 요청된 프로퍼티 갱신이 수행될 수 없으면 TypeError 예외를 던집니다. It performs the following steps when called:
이 추상 연산은 ECMAScript 대입 연산자가 생성하는 프로퍼티와 동일 기본 속성을 가지는 프로퍼티를 생성합니다. 일반적으로 프로퍼티는 미존재 상태입니다. 존재하고 비구성이거나 O가 비확장 가능이면 [[DefineOwnProperty]]는 false를 반환하여 이 연산이 TypeError를 던지게 됩니다.
7.3.7 CreateNonEnumerableDataPropertyOrThrow ( O, P, V )
The abstract operation CreateNonEnumerableDataPropertyOrThrow takes arguments O (Object), P (프로퍼티 키), and V (ECMAScript 언어 값) and returns unused. ordinary 객체의 새 비열거 own 프로퍼티를 생성하는 데 사용됩니다. It performs the following steps when called:
이 추상 연산은 ECMAScript 대입 연산자가 생성하는 프로퍼티와 동일 기본 속성을 가지되 열거 가능하지 않은 프로퍼티를 생성합니다. 일반적으로 프로퍼티는 미존재 상태입니다. 존재하는 경우 DefinePropertyOrThrow는 정상적으로 완료됨이 보장됩니다.
7.3.8 DefinePropertyOrThrow ( O, P, desc )
The abstract operation DefinePropertyOrThrow takes arguments O (Object), P (프로퍼티 키), and desc (Property Descriptor) and returns unused을 담는 normal completion 또는 throw completion. 객체의 [[DefineOwnProperty]] 내부 메소드를 호출하되, 요청된 프로퍼티 갱신이 수행될 수 없으면 TypeError 예외를 던집니다. It performs the following steps when called:
success를 ? O.[[DefineOwnProperty]](P, desc)로 둔다.
success가 false이면 TypeError 예외를 던진다.
unused를 반환한다.
7.3.9 DeletePropertyOrThrow ( O, P )
The abstract operation DeletePropertyOrThrow takes arguments O (Object) and P (프로퍼티 키) and returns unused을 담는 normal completion 또는 throw completion. 객체의 특정 own 프로퍼티를 제거하는 데 사용됩니다. 프로퍼티가 비구성이면 예외를 던집니다. It performs the following steps when called:
The abstract operation HasProperty takes arguments O (Object) and P (프로퍼티 키) and returns Boolean을 담는 normal completion 또는 throw completion. 객체가 지정된 프로퍼티 키를 가진 프로퍼티(own 또는 상속)를 갖는지 판정합니다. It performs the following steps when called:
? O.[[HasProperty]](P)를 반환한다.
7.3.12 HasOwnProperty ( O, P )
The abstract operation HasOwnProperty takes arguments O (Object) and P (프로퍼티 키) and returns Boolean을 담는 normal completion 또는 throw completion. 객체가 지정된 프로퍼티 키를 가진 own 프로퍼티를 갖는지 판정합니다. It performs the following steps when called:
The abstract operation Construct takes argument F (생성자) and optional arguments argumentsList (ECMAScript 언어 값들의 List) and newTarget (생성자) and returns Object를 담는 normal completion 또는 throw completion. 함수 객체의 [[Construct]] 내부 메소드를 호출하는 데 사용됩니다. argumentsList, newTarget은 내부 메소드에 전달될 해당 인자 값입니다. argumentsList가 없으면 새 빈 List가, newTarget이 없으면 F가 사용됩니다. It performs the following steps when called:
newTarget이 없으면 이 연산은 new F(...argumentsList)와 동일합니다.
7.3.15 SetIntegrityLevel ( O, level )
The abstract operation SetIntegrityLevel takes arguments O (Object) and level (sealed 또는 frozen) and returns Boolean을 담는 normal completion 또는 throw completion. 객체의 own 프로퍼티 집합을 고정(fix)하는 데 사용됩니다. It performs the following steps when called:
status를 ? O.[[PreventExtensions]]()로 둔다.
status가 false이면 false를 반환한다.
keys를 ? O.[[OwnPropertyKeys]]()로 둔다.
level이 sealed이면,
keys의 각 요소 k에 대해
? DefinePropertyOrThrow(O, k, PropertyDescriptor { [[Configurable]]: false })를 수행한다.
The abstract operation TestIntegrityLevel takes arguments O (Object) and level (sealed 또는 frozen) and returns Boolean을 담는 normal completion 또는 throw completion. 객체의 own 프로퍼티 집합이 고정되어 있는지 판정하는 데 사용됩니다. It performs the following steps when called:
The abstract operation CreateArrayFromList takes argument elements (ECMAScript 언어 값들의 List) and returns Array. 요소가 elements로 제공되는 Array를 생성하는 데 사용됩니다. It performs the following steps when called:
The abstract operation LengthOfArrayLike takes argument obj (Object) and returns 음이 아닌 정수를 담는 normal completion 또는 throw completion. 배열 유사 객체의 "length" 프로퍼티 값을 반환합니다. It performs the following steps when called:
The abstract operation CreateListFromArrayLike takes argument obj (ECMAScript 언어 값) and optional argument validElementTypes (all 또는 property-key) and returns ECMAScript 언어 값들의 List를 담는 normal completion 또는 throw completion. obj의 인덱스된 프로퍼티가 제공하는 요소로 이루어진 List 값을 생성하는 데 사용됩니다. validElementTypes는 요소로 허용되는 값 타입을 지정합니다. It performs the following steps when called:
The abstract operation OrdinaryHasInstance takes arguments C (ECMAScript 언어 값) and O (ECMAScript 언어 값) and returns Boolean을 담는 normal completion 또는 throw completion. O가 C가 제공한 인스턴스 객체 상속 경로를 상속하는지 여부를 결정하는 기본 알고리즘을 구현합니다. It performs the following steps when called:
7.3.22 SpeciesConstructor ( O, defaultConstructor )
The abstract operation SpeciesConstructor takes arguments O (Object) and defaultConstructor (생성자) and returns 생성자를 담는 normal completion 또는 throw completion. O로부터 파생된 새 객체를 생성할 때 사용해야 하는 생성자를 가져오는 데 사용됩니다. defaultConstructor는 O부터 시작하여 %Symbol.species% 프로퍼티 생성자를 찾을 수 없을 때 사용할 생성자입니다. It performs the following steps when called:
The abstract operation EnumerableOwnProperties takes arguments O (Object) and kind (key, value, 또는 key+value) and returns ECMAScript 언어 값들의 List를 담는 normal completion 또는 throw completion. It performs the following steps when called:
The abstract operation CopyDataProperties takes arguments target (Object), source (ECMAScript 언어 값), and excludedItems (프로퍼티 키들의 List) and returns unused을 담는 normal completion 또는 throw completion. It performs the following steps when called:
여기에 전달되는 target은 항상 새로 생성된 객체이며, 오류 발생 시 직접 접근할 수 없습니다.
7.3.26 PrivateElementFind ( O, P )
The abstract operation PrivateElementFind takes arguments O (Object) and P (Private Name) and returns PrivateElement 또는 empty. It performs the following steps when called:
The abstract operation PrivateMethodOrAccessorAdd takes arguments O (Object) and method (PrivateElement) and returns unused을 담는 normal completion 또는 throw completion. It performs the following steps when called:
private 메서드와 접근자의 값은 인스턴스 간에 공유됩니다. 이 연산은 메서드나 접근자의 새 복사본을 만들지 않습니다.
7.3.29 HostEnsureCanAddPrivateElement ( O )
The host-defined abstract operation HostEnsureCanAddPrivateElement takes argument O (Object) and returns unused을 담는 normal completion 또는 throw completion. 호스트 환경이 특정 호스트 정의 exotic 객체에 private element 추가를 방지할 수 있도록 합니다.
HostEnsureCanAddPrivateElement 구현은 다음 요구사항을 따라야 합니다:
7.3.33 InitializeInstanceElements ( O, constructor )
The abstract operation InitializeInstanceElements takes arguments O (Object) and constructor (ECMAScript 함수 객체) and returns unused을 담는 normal completion 또는 throw completion. It performs the following steps when called:
The abstract operation GetIteratorFlattenable takes arguments obj (ECMAScript 언어 값) and primitiveHandling (iterate-string-primitives 또는 reject-primitives) and returns Iterator Record를 담는 normal completion 또는 throw completion. It performs the following steps when called:
The abstract operation IteratorComplete takes argument iteratorResult (Object) and returns Boolean을 담는 normal completion 또는 throw completion. It performs the following steps when called:
The abstract operation IteratorStep takes argument iteratorRecord (Iterator Record) and returns Object 또는 done을 담는 normal completion 또는 throw completion. iteratorRecord.[[Iterator]]에서 iteratorRecord.[[NextMethod]]를 호출해 다음 값을 요청하고, 이터레이터가 끝에 도달했음을 나타내는 done 또는 다음 값을 사용할 수 있다면 IteratorResult 객체를 반환합니다. It performs the following steps when called:
The abstract operation IteratorStepValue takes argument iteratorRecord (Iterator Record) and returns ECMAScript 언어 값 또는 done을 담는 normal completion 또는 throw completion. iteratorRecord.[[Iterator]]에서 iteratorRecord.[[NextMethod]]를 호출해 다음 값을 요청하고, 끝에 도달했으면 done을, 다음 값이 있으면 IteratorResult 객체의 값을 반환합니다. It performs the following steps when called:
The abstract operation IteratorClose takes arguments iteratorRecord (Iterator Record) and completion (Completion Record) and returns Completion Record. 이터레이터가 완료 상태에 도달했을 때 일반적으로 수행할 동작을 실행하도록 알리는 데 사용됩니다. It performs the following steps when called:
The abstract operation AsyncIteratorClose takes arguments iteratorRecord (Iterator Record) and completion (Completion Record) and returns Completion Record. async 이터레이터가 완료 상태에 도달했을 때 일반적으로 수행할 동작을 실행하도록 알리는 데 사용됩니다. It performs the following steps when called:
innerResult.[[Value]]가 Object가 아니면 TypeError 예외를 던진다.
? completion을 반환한다.
7.4.14 CreateIteratorResultObject ( value, done )
The abstract operation CreateIteratorResultObject takes arguments value (ECMAScript 언어 값) and done (Boolean) and returns IteratorResult 인터페이스를 준수하는 Object. IteratorResult 인터페이스를 준수하는 객체를 생성합니다. It performs the following steps when called:
The abstract operation CreateListIteratorRecord takes argument list (ECMAScript 언어 값들의 List) and returns Iterator Record. [[NextMethod]]가 list의 연속 요소를 반환하는 Iterator Record를 생성합니다. It performs the following steps when called:
closure를 매개변수 없고 list를 캡처하며 호출 시 다음 단계를 수행하는 새 Abstract Closure로 둔다:
"*default*" 문자열은 모듈의 기본(default) export가 다른 이름을 가지지 않을 때 그 모듈의 기본 export를 위한 합성된 이름으로 이 명세 내부에서 사용된다. 모듈의 [[Environment]] 내에 그 이름으로 항목이 생성되어 해당 값을 보유하고, 모듈에 대해 ResolveExport ( exportName [ , resolveSet ] )를 호출하여 "default"라는 export를 해석하면 [[BindingName]]이 "*default*"인 ResolvedBinding Record를 반환하며, 이는 모듈 [[Environment]]에서 상술한 값으로 다시 해석된다. 이는 명세 편의를 위한 것이며, 익명 기본 export도 다른 export와 동일하게 해석될 수 있도록 한다. 이 "*default*" 문자열은 ECMAScript 코드나 모듈 링크 알고리즘에서 접근될 수 없다.
It is defined piecewise over the following productions:
8.6.2 런타임 의미론: BindingInitialization : unused를 담는 normal completion 또는 abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
environment에 undefined가 전달되면 초기화 값을 할당하는 데 PutValue 연산을 사용해야 함을 나타낸다. 이는 var 문 및 일부 non-strict 함수의 매개변수 목록( 10.2.11 참조)에 해당한다. 이 경우 렉시컬 바인딩은 초기화자 평가 전에 호이스팅되어 사전 초기화된다.
It is defined piecewise over the following productions:
9 실행 가능한 코드와 실행 컨텍스트(Executable Code and Execution Contexts)
9.1 Environment Record
Environment Record는 ECMAScript 코드의 렉시컬 중첩 구조를 기반으로 Identifier들을 특정 변수와 함수에 연계(association)하기 위해 사용되는 명세 타입이다. 보통 Environment Record는 FunctionDeclaration, BlockStatement, TryStatement의 Catch 절과 같은 ECMAScript 코드의 특정 구문 구조와 연관된다. 그러한 코드가 실행될 때마다 그 코드가 생성하는 식별자 바인딩을 기록하기 위해 새로운 Environment Record가 생성된다.
모든 Environment Record는 [[OuterEnv]] 필드를 가지며, 이는 null이거나 바깥(Environment Record) 환경 레코드에 대한 참조이다. 이는 Environment Record 값들의 논리적 중첩을 모델링하는 데 사용된다. (내부) Environment Record의 바깥 참조는 논리적으로 그 내부 Environment Record를 둘러싸는 Environment Record에 대한 참조이다. 바깥 Environment Record 역시 자체의 바깥 Environment Record를 가질 수 있다. 하나의 Environment Record는 여러 내부 Environment Record의 바깥 환경으로 사용될 수 있다. 예를 들어, 어떤 FunctionDeclaration이 두 개의 중첩된 FunctionDeclaration을 포함한다면 각각의 중첩 함수 Environment Record의 바깥 Environment Record는 둘러싼 함수의 현재 평가에 대한 Environment Record가 된다.
Environment Record는 순수히 명세 메커니즘이며 ECMAScript 구현의 특정한 실체(artefact)에 대응할 필요는 없다. ECMAScript 프로그램이 그러한 값을 직접 접근하거나 조작하는 것은 불가능하다.
9.1.1 Environment Record 타입 계층(The Environment Record Type Hierarchy)
Global Environment Record는 Script 전역 선언에 사용된다. 바깥 환경을 가지지 않으며 [[OuterEnv]]는 null이다. 사전 채워진 식별자 바인딩을 가질 수 있고 관련된 전역 객체를 포함하며 그 전역 객체의 프로퍼티는 일부 전역 환경 식별자 바인딩을 제공한다. ECMAScript 코드가 실행되면서 전역 객체에 프로퍼티가 추가될 수 있고 초기 프로퍼티가 수정될 수 있다.
Environment Record가 문자열 값 N에 대한 바인딩을 가지는지 결정한다. 있다면 true, 없으면 false를 반환.
CreateMutableBinding(N, D)
Environment Record에 새이지만 아직 초기화되지 않은 변경 가능(mutable) 바인딩을 생성한다. 문자열 값 N은 바운드 이름 텍스트다. Boolean 인자 D가 true이면 해당 바인딩은 이후 삭제될 수 있다.
CreateImmutableBinding(N, S)
Environment Record에 새이지만 아직 초기화되지 않은 변경 불가능(immutable) 바인딩을 생성한다. 문자열 값 N은 바운드 이름 텍스트다. S가 true이면 초기화 후 설정하려는 모든 시도는 (참조하는 연산의 strict 모드 설정과 무관하게) 항상 예외를 던진다.
이미 존재하는 mutable 바인딩의 값을 설정한다. 문자열 값 N은 바운드 이름 텍스트, V는 값, S는 Boolean 플래그. S가 true이고 바인딩을 설정할 수 없다면 TypeError 예외를 던진다.
GetBindingValue(N, S)
이미 존재하는 바인딩의 값을 반환한다. 문자열 값 N은 바운드 이름 텍스트. S는 strict 모드 코드에서 기원했거나 strict 모드 참조语 의미를 요구하는지 식별하는 데 사용된다. S가 true이고 바인딩이 존재하지 않으면 ReferenceError를 던진다. 바인딩이 존재하지만 초기화되지 않았다면 S 값과 무관하게 ReferenceError를 던진다.
DeleteBinding(N)
바인딩을 삭제한다. 문자열 값 N은 바운드 이름 텍스트. N에 대한 바인딩이 존재하면 제거하고 true 반환. 존재하지만 제거 불가하면 false 반환. 존재하지 않으면 true 반환.
각 Declarative Environment Record는 변수, constant, let, class, module, import 그리고/또는 function 선언을 포함하는 ECMAScript 프로그램 스코프와 연관된다. Declarative Environment Record는 그 스코프에 포함된 선언들이 정의한 식별자 집합을 바인딩한다.
9.1.1.1.1 HasBinding ( N )
The HasBinding concrete method of Declarative Environment RecordenvRec takes argument N (String) and returns Boolean을 담는 normal completion. 인수 식별자가 이 레코드에 의해 바인딩된 식별자 중 하나인지 판정한다. It performs the following steps when called:
envRec이 N에 대한 바인딩을 가지고 있으면 true 반환.
false 반환.
9.1.1.1.2 CreateMutableBinding ( N, D )
The CreateMutableBinding concrete method of Declarative Environment RecordenvRec takes arguments N (String) and D (Boolean) and returns unused를 담는 normal completion. 초기화되지 않은 이름 N에 대한 새로운 mutable 바인딩을 생성한다. 이미 존재해서는 안 된다. D가 true이면 삭제 대상 표시. It performs the following steps when called:
단언: envRec은 이미 N 바인딩을 갖지 않는다.
envRec 안에 N에 대한 초기화되지 않은 mutable 바인딩을 생성하고 D가 true이면 이후 DeleteBinding 호출로 삭제 가능함을 기록.
unused 반환.
9.1.1.1.3 CreateImmutableBinding ( N, S )
The CreateImmutableBinding concrete method of Declarative Environment RecordenvRec takes arguments N (String) and S (Boolean) and returns unused를 담는 normal completion. 초기화되지 않은 이름 N에 대한 immutable 바인딩을 생성. 이미 존재해서는 안 된다. S가 true이면 strict 바인딩으로 표시. It performs the following steps when called:
단언: envRec은 이미 N 바인딩을 갖지 않는다.
envRec에 N immutable 바인딩을 생성하고 초기화되지 않았음을 기록. S가 true이면 strict 바인딩임을 기록.
unused 반환.
9.1.1.1.4 InitializeBinding ( N, V )
The InitializeBinding concrete method of Declarative Environment RecordenvRec takes arguments N (String) and V (ECMAScript 언어 값) and returns unused를 담는 normal completion. 이미 존재하는 식별자 N의 현재 바인딩 값(bound value)을 V로 설정한다. N에 대한 초기화되지 않은 바인딩이 이미 있어야 한다. It performs the following steps when called:
단언: envRec은 N에 대한 초기화되지 않은 바인딩을 가져야 한다.
envRec에서 N의 바운드 값을 V로 설정.
RecordenvRec의 N 바인딩이 초기화되었음을 기록.
unused 반환.
9.1.1.1.5 SetMutableBinding ( N, V, S )
The SetMutableBinding concrete method of Declarative Environment RecordenvRec takes arguments N (String), V (ECMAScript 언어 값), and S (Boolean) and returns unused 또는 throw completion. 식별자 N의 현재 바인딩 값을 V로 변경 시도. 보통 바인딩은 이미 존재하지만 드물게 없을 수도 있다. 바인딩이 immutable이고 S가 true이면 TypeError. It performs the following steps when called:
functionf() { eval("var x; x = (delete x, 0);"); }
9.1.1.1.6 GetBindingValue ( N, S )
The GetBindingValue concrete method of Declarative Environment RecordenvRec takes arguments N (String) and S (Boolean) and returns ECMAScript 언어 값 또는 throw completion. 이름이 N인 바인딩된 식별자의 값을 반환. 바인딩이 존재하지만 초기화되지 않았으면 S와 무관하게 ReferenceError. It performs the following steps when called:
단언: envRec은 N 바인딩을 가진다.
envRec의 N 바인딩이 초기화되지 않았다면 ReferenceError 예외.
현재 envRec에 N으로 바인딩된 값을 반환.
9.1.1.1.7 DeleteBinding ( N )
The DeleteBinding concrete method of Declarative Environment RecordenvRec takes argument N (String) and returns Boolean을 담는 normal completion. 삭제 대상으로 명시적으로 지정된 바인딩만 삭제할 수 있다. It performs the following steps when called:
단언: envRec은 N 바인딩을 가진다.
envRec의 N 바인딩이 삭제 불가라면 false 반환.
envRec에서 N 바인딩 제거.
true 반환.
9.1.1.1.8 HasThisBinding ( )
The HasThisBinding concrete method of Declarative Environment RecordenvRec takes no arguments and returns false. It performs the following steps when called:
The HasSuperBinding concrete method of Declarative Environment RecordenvRec takes no arguments and returns false. It performs the following steps when called:
The WithBaseObject concrete method of Declarative Environment RecordenvRec takes no arguments and returns undefined. It performs the following steps when called:
undefined 반환.
9.1.1.2 Object Environment Record
각 Object Environment Record는 binding object라 불리는 객체와 연관된다. Object Environment Record는 그 binding object의 프로퍼티 이름과 직접 대응하는 문자열 식별자 이름 집합을 바인딩한다. IdentifierName 형태가 아닌 프로퍼티 키는 포함되지 않는다. own 및 상속 프로퍼티 모두 [[Enumerable]] 속성과 무관하게 포함된다. 객체에 프로퍼티가 동적으로 추가/삭제될 수 있으므로 Object Environment Record가 바인딩하는 식별자 집합은 프로퍼티를 추가/삭제하는 어떤 연산의 부수 효과로 잠재적으로 변화할 수 있다. 그러한 부수 효과로 생성된 바인딩은 대응 프로퍼티의 Writable 속성이 false일지라도 mutable 바인딩으로 간주된다. Object Environment Record에는 immutable 바인딩이 존재하지 않는다.
with 문(14.11)에 대해 생성된 Object Environment Record는 함수 호출에서 사용할 암묵적 this 값을 그 binding object로 제공할 수 있다. 이 기능은 Boolean [[IsWithEnvironment]] 필드로 제어된다.
Object Environment Record는 Table 15에 나열된 추가 상태 필드를 가진다.
The HasBinding concrete method of Object Environment RecordenvRec takes argument N (String) and returns Boolean 또는 throw completion. 연관된 binding object가 이름 N인 프로퍼티를 가지는지 판정한다. It performs the following steps when called:
bindingObject를 envRec.[[BindingObject]]로 둔다.
foundBinding을 ? HasProperty(bindingObject, N)로 둔다.
The CreateMutableBinding concrete method of Object Environment RecordenvRec takes arguments N (String) and D (Boolean) and returns unused 또는 throw completion. Environment Record의 binding object에 이름 N 프로퍼티를 생성하고 값을 undefined로 초기화. D가 true이면 새 프로퍼티 [[Configurable]]을 true, 아니면 false. It performs the following steps when called:
bindingObject를 envRec.[[BindingObject]]로 둔다.
? DefinePropertyOrThrow(bindingObject, N, PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: D }) 수행.
The InitializeBinding concrete method of Object Environment RecordenvRec takes arguments N (String) and V (ECMAScript 언어 값) and returns unused 또는 throw completion. 이름 N인 바인딩 객체 프로퍼티의 값을 V로 설정. It performs the following steps when called:
? envRec.SetMutableBinding(N, V, false) 수행.
unused 반환.
Note
이 명세에서 Object Environment Record에 대한 모든 CreateMutableBinding 사용은 같은 이름에 대한 InitializeBinding 호출로 즉시 이어지므로, 초기화 상태를 명시적으로 추적하지 않는다.
9.1.1.2.5 SetMutableBinding ( N, V, S )
The SetMutableBinding concrete method of Object Environment RecordenvRec takes arguments N (String), V (ECMAScript 언어 값), and S (Boolean) and returns unused 또는 throw completion. 연관된 binding object의 프로퍼티 N 값을 V로 설정 시도. 보통 존재하지만 없거나 쓰기 불가능이면 S에 따라 오류 처리. It performs the following steps when called:
The GetBindingValue concrete method of Object Environment RecordenvRec takes arguments N (String) and S (Boolean) and returns ECMAScript 언어 값 또는 throw completion. binding object의 이름 N 프로퍼티 값을 반환. 존재하지 않을 경우 S에 따라 결과 결정. It performs the following steps when called:
The DeleteBinding concrete method of Object Environment RecordenvRec takes argument N (String) and returns Boolean 또는 throw completion. [[Configurable]]이 true인 환경 객체 프로퍼티에 대응되는 바인딩만 삭제 가능. It performs the following steps when called:
bindingObject를 envRec.[[BindingObject]]로 둔다.
? bindingObject.[[Delete]](N) 반환.
9.1.1.2.8 HasThisBinding ( )
The HasThisBinding concrete method of Object Environment RecordenvRec takes no arguments and returns false. It performs the following steps when called:
The HasSuperBinding concrete method of Object Environment RecordenvRec takes no arguments and returns false. It performs the following steps when called:
The WithBaseObject concrete method of Object Environment RecordenvRec takes no arguments and returns Object 또는 undefined. It performs the following steps when called:
Function Environment Record는 함수의 최상위 스코프를 나타내는 Declarative Environment Record이며 함수가 ArrowFunction이 아니면 this 바인딩을 제공한다. 함수가 ArrowFunction이 아니고 super를 참조하는 경우 그 Function Environment Record는 함수 내에서 super 메서드 호출을 수행하는 데 사용되는 상태도 포함한다.
Function Environment Record는 Table 16에 나열된 추가 상태 필드를 가진다.
The abstract operation BindThisValue takes arguments envRec (Function Environment Record) and V (ECMAScript 언어 값) and returns unused 또는 throw completion. envRec.[[ThisValue]]를 설정하고 초기화되었음을 기록한다. It performs the following steps when called:
The HasThisBinding concrete method of Function Environment RecordenvRec takes no arguments and returns Boolean. It performs the following steps when called:
envRec.[[ThisBindingStatus]]가 lexical이면 false, 아니면 true 반환.
9.1.1.3.3 HasSuperBinding ( )
The HasSuperBinding concrete method of Function Environment RecordenvRec takes no arguments and returns Boolean. It performs the following steps when called:
envRec.[[ThisBindingStatus]]가 lexical이면 false 반환.
envRec.[[FunctionObject]].[[HomeObject]]가 undefined이면 false, 아니면 true 반환.
The abstract operation GetSuperBase takes argument envRec (Function Environment Record) and returns Object, null, 또는 undefined. envRec에 바인딩된 super 프로퍼티 접근의 기반 객체를 반환한다. undefined 값은 그러한 접근이 런타임 오류를 낼 것임을 나타낸다. It performs the following steps when called:
home을 envRec.[[FunctionObject]].[[HomeObject]]로 둔다.
home이 undefined이면 undefined 반환.
단언: home은 ordinary object.
! home.[[GetPrototypeOf]]() 반환.
9.1.1.4 Global Environment Record
Global Environment Record는 공통 realm에서 처리되는 모든 ECMAScript Script 요소가 공유하는 가장 바깥 스코프를 나타낸다. Global Environment Record는 내장(global) 전역(19 절), 전역 객체의 프로퍼티 및 Script 내 모든 최상위 선언(8.2.9, 8.2.11)의 바인딩을 제공한다.
The HasBinding concrete method of Global Environment RecordenvRec takes argument N (String) and returns Boolean 또는 throw completion. 인수 식별자가 레코드에 의해 바인딩된 식별자 중 하나인지 판정. It performs the following steps when called:
DclRec을 envRec.[[DeclarativeRecord]]로 둔다.
! DclRec.HasBinding(N)이 true이면 true 반환.
ObjRec을 envRec.[[ObjectRecord]]로 둔다.
? ObjRec.HasBinding(N) 반환.
9.1.1.4.2 CreateMutableBinding ( N, D )
The CreateMutableBinding concrete method of Global Environment RecordenvRec takes arguments N (String) and D (Boolean) and returns unused 또는 throw completion. 초기화되지 않은 N mutable 바인딩을 새로 생성. 관련 DeclarativeRecord에 생성. 이미 존재하면 안 됨. D가 true면 삭제 가능 표시. It performs the following steps when called:
DclRec을 envRec.[[DeclarativeRecord]]로 둔다.
! DclRec.HasBinding(N)이 true이면 TypeError 예외.
! DclRec.CreateMutableBinding(N, D) 반환.
9.1.1.4.3 CreateImmutableBinding ( N, S )
The CreateImmutableBinding concrete method of Global Environment RecordenvRec takes arguments N (String) and S (Boolean) and returns unused 또는 throw completion. 초기화되지 않은 N immutable 바인딩 생성. 이미 존재하면 안 됨. S가 true이면 strict 바인딩. It performs the following steps when called:
DclRec을 envRec.[[DeclarativeRecord]]로 둔다.
! DclRec.HasBinding(N)이 true이면 TypeError 예외.
! DclRec.CreateImmutableBinding(N, S) 반환.
9.1.1.4.4 InitializeBinding ( N, V )
The InitializeBinding concrete method of Global Environment RecordenvRec takes arguments N (String) and V (ECMAScript 언어 값) and returns unused 또는 throw completion. 식별자 N의 현재 바인딩 값을 V로 설정. N에 대한 초기화되지 않은 바인딩이 이미 존재해야 한다. It performs the following steps when called:
The SetMutableBinding concrete method of Global Environment RecordenvRec takes arguments N (String), V (ECMAScript 언어 값), and S (Boolean) and returns unused 또는 throw completion. 식별자 N의 현재 바인딩 값을 V로 변경 시도. immutable 바인딩이고 S가 true이면 TypeError. 프로퍼티 N은 보통 존재하지만 없거나 현재 writable이 아닐 수도 있으며 이는 S에 따라 처리. It performs the following steps when called:
DclRec을 envRec.[[DeclarativeRecord]]로 둔다.
! DclRec.HasBinding(N)이 true이면
? DclRec.SetMutableBinding(N, V, S) 반환.
ObjRec을 envRec.[[ObjectRecord]]로 둔다.
? ObjRec.SetMutableBinding(N, V, S) 반환.
9.1.1.4.6 GetBindingValue ( N, S )
The GetBindingValue concrete method of Global Environment RecordenvRec takes arguments N (String) and S (Boolean) and returns ECMAScript 언어 값 또는 throw completion. 식별자 N의 값을 반환. 바인딩이 초기화되지 않았으면 ReferenceError. 프로퍼티 N은 보통 존재하지만 없거나 writable이 아닐 수도 있는데 이는 S에 따라 처리. It performs the following steps when called:
DclRec을 envRec.[[DeclarativeRecord]]로 둔다.
! DclRec.HasBinding(N)이 true이면
? DclRec.GetBindingValue(N, S) 반환.
ObjRec을 envRec.[[ObjectRecord]]로 둔다.
? ObjRec.GetBindingValue(N, S) 반환.
9.1.1.4.7 DeleteBinding ( N )
The DeleteBinding concrete method of Global Environment RecordenvRec takes argument N (String) and returns Boolean 또는 throw completion. 삭제 대상으로 명시된 바인딩만 삭제 가능. It performs the following steps when called:
The HasThisBinding concrete method of Global Environment RecordenvRec takes no arguments and returns true. It performs the following steps when called:
The HasSuperBinding concrete method of Global Environment RecordenvRec takes no arguments and returns false. It performs the following steps when called:
The WithBaseObject concrete method of Global Environment RecordenvRec takes no arguments and returns undefined. It performs the following steps when called:
undefined 반환.
9.1.1.4.11 GetThisBinding ( )
The GetThisBinding concrete method of Global Environment RecordenvRec takes no arguments and returns Object를 담는 normal completion. It performs the following steps when called:
envRec.[[GlobalThisValue]] 반환.
9.1.1.4.12 HasLexicalDeclaration ( envRec, N )
The abstract operation HasLexicalDeclaration takes arguments envRec (Global Environment Record) and N (String) and returns Boolean. 인수 식별자가 envRec에서 LexicalDeclaration 또는 ClassDeclaration 같은 렉시컬 선언을 사용해 생성된 바인딩을 가지는지 판정. It performs the following steps when called:
DclRec을 envRec.[[DeclarativeRecord]]로 둔다.
! DclRec.HasBinding(N) 반환.
9.1.1.4.13 HasRestrictedGlobalProperty ( envRec, N )
The abstract operation HasRestrictedGlobalProperty takes arguments envRec (Global Environment Record) and N (String) and returns Boolean 또는 throw completion. 인수 식별자가 전역 객체의, 전역 렉시컬 바인딩으로 섀도우 되어서는 안 되는 프로퍼티 이름인지 판정. It performs the following steps when called:
ObjRec을 envRec.[[ObjectRecord]]로 둔다.
globalObject를 ObjRec.[[BindingObject]]로 둔다.
existingProp을 ? globalObject.[[GetOwnProperty]](N)로 둔다.
existingProp이 undefined이면 false 반환.
existingProp.[[Configurable]]이 true이면 false 반환.
true 반환.
Note
프로퍼티는 var나 function 선언 대신 직접 전역 객체에 존재할 수도 있다. 글로벌 렉시컬 바인딩은 전역 객체의 non-configurable 프로퍼티와 같은 이름으로 생성될 수 없다. "undefined" 전역 프로퍼티가 예.
9.1.1.4.14 CanDeclareGlobalVar ( envRec, N )
The abstract operation CanDeclareGlobalVar takes arguments envRec (Global Environment Record) and N (String) and returns Boolean 또는 throw completion. 같은 N으로 CreateGlobalVarBinding 호출이 성공할지 여부 결정. 중복 var 선언 및 기존 전역 객체 프로퍼티에 대한 var 선언 허용. It performs the following steps when called:
9.1.1.4.16 CreateGlobalVarBinding ( envRec, N, D )
The abstract operation CreateGlobalVarBinding takes arguments envRec (Global Environment Record), N (String), and D (Boolean) and returns unused 또는 throw completion. 연관된 Object Environment Record에 mutable 바인딩을 생성·초기화. 이미 존재하면 재사용되고 초기화된 것으로 간주. It performs the following steps when called:
전역 함수 선언은 항상 전역 객체의 own 프로퍼티로 표현된다. 가능하면 기존 own 프로퍼티가 표준 속성 집합으로 재구성된다. 단계 7은 InitializeBinding 구체 메서드 호출과 동등하며 globalObject가 Proxy이면 동일한 Proxy 트랩 호출 순서를 만든다.
The GetBindingValue concrete method of Module Environment RecordenvRec takes arguments N (String) and S (Boolean) and returns ECMAScript 언어 값 또는 throw completion. 이름 N인 바인딩된 식별자 값을 반환. 간접 바인딩이면 대상 바인딩 값을 반환. 바인딩이 존재하지만 초기화되지 않았으면 ReferenceError. It performs the following steps when called:
The HasThisBinding concrete method of Module Environment RecordenvRec takes no arguments and returns true. It performs the following steps when called:
The GetThisBinding concrete method of Module Environment RecordenvRec takes no arguments and returns undefined를 담는 normal completion. It performs the following steps when called:
undefined 반환.
9.1.1.5.5 CreateImportBinding ( envRec, N, M, N2 )
The abstract operation CreateImportBinding takes arguments envRec (Module Environment Record), N (String), M (Module Record), and N2 (String) and returns unused. 이름 N에 대한 새로 초기화된 immutable 간접 바인딩을 생성. envRec에 N 바인딩이 이미 존재해서는 안 됨. N2는 M의 Module Environment Record에 존재하는 바인딩 이름. 새 바인딩의 값 접근은 대상 바인딩 값을 간접적으로 접근. It performs the following steps when called:
단언: envRec은 이미 N 바인딩을 갖지 않는다.
단언: M.[[Environment]]가 인스턴스화될 때 N2에 대한 direct 바인딩을 가진다.
envRec에 N immutable 간접 바인딩을 생성하여 M, N2를 대상 바인딩으로 참조하고 초기화되었음을 기록.
unused 반환.
9.1.2 Environment Record 연산(Environment Record Operations)
The abstract operation GetIdentifierReference takes arguments env (Environment Record 또는 null), name (String), and strict (Boolean) and returns Reference Record 또는 throw completion. It performs the following steps when called:
The abstract operation NewObjectEnvironment takes arguments O (Object), W (Boolean), and E (Environment Record 또는 null) and returns Object Environment Record. It performs the following steps when called:
The abstract operation NewFunctionEnvironment takes arguments F (ECMAScript 함수 객체) and newTarget (Object 또는 undefined) and returns Function Environment Record. It performs the following steps when called:
The abstract operation NewGlobalEnvironment takes arguments G (Object) and thisValue (Object) and returns Global Environment Record. It performs the following steps when called:
The abstract operation ResolvePrivateIdentifier takes arguments privateEnv (PrivateEnvironment Record) and identifier (String) and returns Private Name. It performs the following steps when called:
평가되기 전에 모든 ECMAScript 코드는 하나의 realm과 연계되어야 한다. 개념적으로 realm은 일련의 intrinsic 객체, ECMAScript 전역 환경, 그 전역 환경의 범위 내에서 로드된 모든 ECMAScript 코드, 그리고 기타 관련 상태 및 자원으로 구성된다.
realm은 이 명세에서 Table 22에 지정된 필드를 가진 Realm Record로 표현된다:
템플릿 객체들은 각 realm별로 그 Realm Record의 [[TemplateMap]]을 사용하여 정규화(canonicalize)된다. 각 [[Site]] 값은 TemplateLiteral 인 Parse Node이다. 연계된 [[Array]] 값은 태그 함수에 전달되는 해당 템플릿 객체이다.
Note 1
어떤 Parse Node가 도달 불가능(unreachable)이 되면, 대응하는 [[Array]] 또한 도달 불가능해지며, 구현이 그 쌍을 [[TemplateMap]] 리스트에서 제거하더라도 관측 불가능하다.
The abstract operation InitializeHostDefinedRealm takes no arguments and returns unused를 담는 normal completion 또는 throw completion. It performs the following steps when called:
realmRec.[[Intrinsics]]의 필드들을 Table 6에 나열된 값으로 설정한다. 필드 이름은 테이블 첫 번째 열의 이름들이다. 각 필드 값은 19부터 28까지의 각 객체 명세에 따라 그 프로퍼티 값으로 완전하고 재귀적으로 채워진 새 객체 값이다. 모든 객체 프로퍼티 값은 새로 생성된 객체 값이다. 내장 함수 객체인 모든 값은 CreateBuiltinFunction(steps, length, name, slots, realmRec, prototype)을 수행하여 생성되는데, 여기서 steps는 이 명세가 제공하는 그 함수의 정의, name은 함수의 초기 "name" 프로퍼티 값, length는 함수의 초기 "length" 프로퍼티 값, slots는 (있다면) 함수의 지정된 내부 슬롯 이름들의 리스트, prototype은 함수 [[Prototype]] 내부 슬롯의 지정된 값이다. intrinsic과 그 프로퍼티 생성은 아직 생성되지 않은 객체에 대한 의존성이 없도록 순서가 정해져야 한다.
The abstract operation SetDefaultGlobalBindings takes argument realmRec (Realm Record) and returns unused를 담는 normal completion 또는 throw completion. It performs the following steps when called:
execution context는 ECMAScript 구현이 코드의 런타임 평가를 추적하기 위해 사용하는 명세 장치이다. 어느 시점에도 코드 실행 중인 에이전트당 실제로 코드를 실행하는 실행 컨텍스트는 최대 하나이다. 이는 그 에이전트의 running execution context로 알려져 있다. 이 명세에서 running execution context에 대한 모든 언급은 둘러싼 에이전트의 running execution context를 가리킨다.
실행 컨텍스트는 순수한 명세 메커니즘이며 ECMAScript 구현의 특정한 실체에 대응할 필요가 없다. ECMAScript 코드는 실행 컨텍스트를 직접 접근하거나 관찰할 수 없다.
9.4.1 GetActiveScriptOrModule ( )
The abstract operation GetActiveScriptOrModule takes no arguments and returns Script Record, Module Record, 또는 null. running execution context를 기반으로 실행 중인 스크립트 또는 모듈을 결정하는 데 사용된다. It performs the following steps when called:
실행 컨텍스트 스택이 비어 있으면 null을 반환한다.
ec를 실행 컨텍스트 스택의 최상단에서 ScriptOrModule 구성 요소가 null이 아닌 실행 컨텍스트로 둔다.
그러한 실행 컨텍스트가 없으면 null을 반환하고; 그렇지 않으면 ec의 ScriptOrModule을 반환한다.
ResolveBinding의 결과는 항상 [[ReferencedName]] 필드가 name인 Reference Record이다.
9.4.3 GetThisEnvironment ( )
The abstract operation GetThisEnvironment takes no arguments and returns Environment Record. 현재 this 키워드의 바인딩을 제공하는 Environment Record를 찾는다. It performs the following steps when called:
The abstract operation GetNewTarget takes no arguments and returns Object 또는 undefined. running execution context의 LexicalEnvironment를 사용하여 NewTarget 값을 결정한다. It performs the following steps when called:
The abstract operation GetGlobalObject takes no arguments and returns Object. 현재 running execution context가 사용하는 전역 객체를 반환한다. It performs the following steps when called:
scriptOrModule이 Script Record 또는 Module Record라면, ec를 실행 컨텍스트 스택의 최상단에서 ScriptOrModule 구성 요소가 scriptOrModule인 실행 컨텍스트로 둔다. ec의 Realm 구성 요소는 scriptOrModule.[[Realm]]이다.
어떤 특정 시점에, 다음 모든 조건이 참이면 실행은 ECMAScript 코드를 평가할 준비가 되었다(prepared to evaluate ECMAScript code)고 한다:
JobCallback Record { [[Callback]]: callback, [[HostDefined]]: empty }를 반환한다.
웹 브라우저가 아닌 ECMAScript 호스트는 HostMakeJobCallback의 기본 구현을 사용해야 한다.
Note
이는 콜백이 궁극적으로 스케줄되고 실행되도록 책임지는 함수에 콜백이 전달되는 시점에 호출된다. 예를 들어, promise.then(thenAction)은 반응 Job이 스케줄되는 시점이 아니라 Promise.prototype.then을 호출하는 시점에 thenAction에 대해 MakeJobCallback을 호출한다.
웹 브라우저가 아닌 ECMAScript 호스트는 HostCallJobCallback의 기본 구현을 사용해야 한다.
9.5.4 HostEnqueueGenericJob ( job, realm )
The host-defined abstract operation HostEnqueueGenericJob takes arguments job (Job 추상 클로저) and realm (Realm Record) and returns unused. realm.[[AgentSignifier]]로 표시된 에이전트에서 realm 내에 job을 미래의 어느 시점에 수행하도록 스케줄한다. 이 알고리즘과 함께 사용되는 추상 클로저는 우선순위나 순서 같은 추가 제약 없이 스케줄되는 것을 의도한다.
The host-defined abstract operation HostEnqueuePromiseJob takes arguments job (Job 추상 클로저) and realm (Realm Record 또는 null) and returns unused. job을 미래의 어느 시점에 수행하도록 스케줄한다. 이 알고리즘과 함께 사용되는 추상 클로저는 Promise 처리와 관련이 있거나 그렇지 않더라도 Promise 처리 연산과 동일한 우선순위로 스케줄되는 것을 의도한다.
HostEnqueuePromiseJob 구현은 9.5의 요구 사항과 아래 사항을 따라야 한다:
realm이 null이 아니면, job이 호출될 때마다 구현은 job 호출 시점에 실행이 ECMAScript 코드를 평가할 준비가 되도록 구현 정의 단계를 수행해야 한다.
HostEnqueuePromiseJob이 호출되는 시점에 scriptOrModule을 GetActiveScriptOrModule()으로 둔다. realm이 null이 아니면, job이 호출될 때마다 구현은 scriptOrModule이 job 호출 시점에 활성 스크립트 또는 모듈이 되도록 구현 정의 단계를 수행해야 한다.
잡은 그들을 스케줄한 HostEnqueuePromiseJob 호출과 동일한 순서로 실행되어야 한다.
The host-defined abstract operation HostEnqueueTimeoutJob takes arguments timeoutJob (Job 추상 클로저), realm (Realm Record), and milliseconds (음이 아닌 유한 Number) and returns unused. realm.[[AgentSignifier]]로 표시된 에이전트에서 realm 내에 timeoutJob을 최소 milliseconds 밀리초 후에 수행되도록 스케줄한다.
agent는 ECMAScript 실행 컨텍스트 집합, 실행 컨텍스트 스택, 실행 중 실행 컨텍스트(running execution context), Agent Record, 그리고 executing thread로 구성된다. executing thread를 제외한 구성 요소들은 오직 그 에이전트에만 속한다.
에이전트의 executing thread는 다른 에이전트와 독립적으로 그 에이전트의 실행 컨텍스트들에 대해 알고리즘 단계를 실행한다. 단, 여러 에이전트가 하나의 executing thread를 공유할 수 있는데, 그 공유하는 에이전트 중 어느 것도 Agent Record의 [[CanBlock]] 필드가 true이면 안 된다.
에이전트의 executing thread가 알고리즘 단계를 실행하는 동안, 그 에이전트는 그 단계들의 surrounding agent(둘러싼 에이전트)이다. 그 단계들은 둘러싼 에이전트를 사용하여 에이전트가 보유한 명세 수준 실행 객체—실행 중 실행 컨텍스트, 실행 컨텍스트 스택, Agent Record의 필드—에 접근한다.
agent signifier(에이전트 식별자)는 에이전트를 식별하기 위해 사용되는 전역적으로 고유한 불투명 값이다.
초기에는 새 빈 List로, 현재 Job 끝까지 유지(kept alive)되어야 하는 객체 및/또는 심볼들의 목록.
[[ModuleAsyncEvaluationCount]]
정수
초기값 0. 비동기 또는 비동기 의존성을 가진 모듈들의 [[AsyncEvaluationOrder]] 필드에 고유 증가값을 할당하는 데 사용.
[[Signifier]], [[IsLockFree1]], [[IsLockFree2]]의 값은 에이전트 클러스터의 어떤 에이전트에 의해 관측된 후에는 변경될 수 없다.
Note 2
[[IsLockFree1]]과 [[IsLockFree2]]의 값은 반드시 하드웨어에 의해 결정되는 것은 아니며, 시간에 따라 또는 ECMAScript 구현 간에 달라질 수 있는 구현 선택을 반영할 수도 있다.
[[IsLockFree4]] 필드는 없다: 4-byte 원자 연산은 항상 lock-free이다.
실제로 어떤 종류의 락을 사용해 원자 연산이 구현된다면 그 연산은 lock-free가 아니다. Lock-free는 wait-free를 의미하지 않는다: lock-free 원자 연산을 완료하는 데 필요한 기계 단계 수에 상한은 없다.
크기 n의 원자 접근이 lock-free라고 해서 크기 n의 비원자(non-atomic) 접근의 (인지된) 원자성에 대해 아무것도 의미하지 않는다. 특히 비원자 접근은 여전히 여러 개의 별도 메모리 접근 시퀀스로 수행될 수 있다. 세부 사항은 ReadSharedMemory와 WriteSharedMemory 참조.
Note 3
에이전트는 명세 메커니즘이며 ECMAScript 구현의 특정 실체에 대응할 필요가 없다.
9.6.1 AgentSignifier ( )
The abstract operation AgentSignifier takes no arguments and returns agent signifier. It performs the following steps when called:
AR.[[ModuleAsyncEvaluationCount]]를 count + 1로 설정한다.
count를 반환한다.
Note
이 값은 보류 중(pending) 모듈 사이의 상대적 평가 순서를 추적하기 위해서만 사용된다. 보류 중인 모듈이 없다면 구현은 관측 불가능하게 [[ModuleAsyncEvaluationCount]]를 0으로 재설정할 수 있다.
9.7 에이전트 클러스터(Agent Clusters)
agent cluster는 공유 메모리를 조작함으로써 통신할 수 있는 에이전트들의 최대 집합이다.
Note 1
서로 다른 에이전트 내의 프로그램들은 명시되지 않은 수단으로 메모리를 공유할 수 있다. 최소한 SharedArrayBuffers의 백업 메모리는 클러스터의 에이전트들 간에 공유될 수 있다.
메시지 전달로 통신할 수 있지만 메모리를 공유할 수 없는 에이전트들도 있을 수 있으며, 그들은 절대 같은 에이전트 클러스터에 속하지 않는다.
모든 에이전트는 정확히 하나의 에이전트 클러스터에 속한다.
Note 2
클러스터의 에이전트들이 어떤 특정 시점에 모두 살아 있을 필요는 없다. 에이전트 A가 다른 에이전트 B를 생성하고, 그 후 A가 종료되고 B가 에이전트 C를 생성한다면, A가 B와 일부 메모리를 공유할 수 있었고 B가 C와 일부 메모리를 공유할 수 있었다면 세 에이전트는 같은 클러스터에 속한다.
클러스터 내 모든 에이전트는 각각의 Agent Record에서 [[LittleEndian]] 필드에 대해 동일한 값을 가져야 한다.
Note 3
에이전트 클러스터 내의 에이전트들이 [[LittleEndian]] 값이 서로 다르다면, 다중 바이트 데이터에 대해 공유 메모리를 사용하는 것이 어려워진다.
클러스터 내 모든 에이전트는 [[IsLockFree1]] 필드에 대해 동일한 값을 가져야 하며 [[IsLockFree2]] 필드도 마찬가지이다.
클러스터 내 모든 에이전트는 각각의 Agent Record에서 [[Signifier]] 필드에 대해 서로 다른 값을 가져야 한다.
임베딩은 에이전트의 지식이나 협력 없이 에이전트를 비활성화(진행 중단)하거나 활성화(진행 재개)할 수 있다. 임베딩이 그렇게 한다면, 클러스터 내 일부 에이전트만 활성 상태로 남기고 다른 에이전트들을 무기한 비활성화된 상태로 두어서는 안 된다.
Note 4
위 제한의 목적은 어떤 에이전트가 다른 에이전트가 비활성화되었기 때문에 데드락 또는 기아(starvation)에 빠지는 상황을 피하기 위함이다. 예를 들어, 창 윈도우의 어떤 문서에도 독립적인 수명(lifetime)을 가진 HTML 공유 워커가 그런 독립 문서의 전용(dedicated) 워커와 메모리를 공유할 수 있고, 그 후 문서와 전용 워커가 (예: 문서가 히스토리에 들어가면서) 비활성화되었으며 전용 워커가 락을 보유한 상태이고, 공유 워커가 락을 획득하려 하면 공유 워커는 전용 워커가 다시 활성화될 때까지(혹은 영원히) 블록된다. 그동안 다른 윈도우에서 공유 워커에 접근하려는 다른 워커들은 기아 상태에 빠진다.
이 제한의 함의는 임베딩 내에서 동일한 suspend/wake 집합에 속하지 않는 에이전트들 사이에서는 메모리를 공유할 수 없다는 것이다.
임베딩은 에이전트 클러스터의 다른 에이전트의 사전 지식이나 협력 없이 에이전트를 종료할 수 있다. 에이전트가 자체 또는 클러스터 내 다른 에이전트의 프로그래밍 동작이 아니라 클러스터 외부의 힘에 의해 종료된다면, 임베딩은 두 전략 중 하나를 선택해야 한다: 클러스터의 모든 에이전트를 종료하거나, 클러스터의 에이전트들이 협력하여 종료를 감지할 수 있도록 신뢰 가능한 API를 제공하되, 종료 데이터는 종료된 에이전트를 식별하기에 충분한 정보를 포함해야 한다.
Note 5
그러한 종료 유형의 예로는: 별도 프로세스에서 실행 중인 에이전트를 운영체제나 사용자가 종료하는 경우; per-agent 자원 계정이 에이전트가 runaway임을 나타낼 때 같은 프로세스에서 다른 에이전트와 함께 실행 중인 에이전트를 임베딩 자체가 종료하는 경우 등이 있다.
다음 명세 값 각각과 그들로부터 추이적으로 도달 가능한 값들은 정확히 하나의 에이전트 클러스터에 속한다.
에이전트 클러스터는 명세 메커니즘이며 ECMAScript 구현의 특정 실체에 대응할 필요가 없다.
9.8 Forward Progress
에이전트가 forward progress를 만든다(make forward progress)는 것은 이 명세에 따라 평가 단계(evaluation step)를 수행하는 것이다.
에이전트의 실행 중 실행 컨텍스트가 외부 이벤트를 동기적으로 무기한 기다릴 때, 그 에이전트는 blocked가 된다. Agent Record의 [[CanBlock]] 필드가 true인 에이전트만 이런 의미에서 blocked 상태가 될 수 있다. unblocked 에이전트는 blocked가 아닌 에이전트이다.
구현은 다음을 보장해야 한다:
전용 executing thread를 가진 모든 unblocked 에이전트는 결국 forward progress를 만든다.
executing thread를 공유하는 에이전트 집합에서는 하나의 에이전트가 결국 forward progress를 만든다.
에이전트는 차단(blocking)을 제공하는 명시적 API를 통한 경우를 제외하고 다른 에이전트를 blocked 상태로 만들지 않는다.
Note
이는 메모리 모델의 liveness 보장과 함께 모든 seq-cst 쓰기가 결국 모든 에이전트에 관측 가능해짐을 보장한다.
9.9 WeakRef 및 FinalizationRegistry 대상 처리 모델(Processing Model of WeakRef and FinalizationRegistry Targets)
9.9.1 목표(Objectives)
이 명세는 어떤 객체나 심볼이 가비지 컬렉션될 것이라는 보장을 제공하지 않는다. live가 아닌 객체나 심볼은 긴 시간이 지난 후 해제되거나 전혀 해제되지 않을 수 있다. 이런 이유로 본 명세는 가비지 컬렉션에 의해 트리거되는 동작을 설명할 때 "may"라는 용어를 사용한다.
WeakRef.prototype.deref가 호출될 때, ( undefined 가 반환되지 않는 경우) 참조 대상(referent)은 이후의 동기적 접근에서 동일한 값을 반환할 수 있도록 살아 있게 유지된다. 이 목록(list)은 ClearKeptObjects 추상 연산을 사용해 동기 작업이 완료될 때 리셋된다.
일부 ECMAScript 구현에는 ECMAScript가 유휴(idle) 상태일 때를 포함해 백그라운드로 실행되는 가비지 컬렉터 구현이 포함되어 있다. 호스트 환경이 CleanupFinalizationRegistry를 스케줄하도록 하면, 구현이 파이널라이저 작업을 실행하기 위해 ECMAScript 실행을 재개하여 유지 중인 값을 해제함으로써 전체 메모리 사용량을 줄일 수 있다.
9.9.2 Liveness
객체 및/또는 심볼의 집합 S에 대해 hypothetical WeakRef-oblivious(가설적 WeakRef-무관) 실행이란, S의 요소인 참조 대상을 가진 WeakRef의 WeakRefDeref 추상 연산이 항상 undefined를 반환하는 실행을 말한다.
Note 1
WeakRef-obliviousness와 liveness는 두 개념을 함께 포착한다. 첫째, WeakRef 자체는 그 참조 대상을 살아 있게 유지하지 않는다. 둘째, liveness에서의 사이클이 값이 live임을 의미하지는 않는다. 구체적으로, v의 liveness 결정이 WeakRef referent r의 liveness 결정에 의존한다면, r의 liveness는 v의 liveness를 가정할 수 없는데, 이는 순환 논리이기 때문이다.
Note 2
WeakRef-obliviousness는 사이클을 고려하기 위해 개별 값이 아닌 객체 또는 심볼 집합에 대해 정의된다. 개별 값에 대해 정의된다면, 사이클 내 WeakRef referent는 사이클 내 다른 WeakRef referent를 통해서만 그 정체성이 관측되더라도 live로 간주될 것이다.
Note 3
구어적으로는, 어떤 개별 객체나 심볼이 속한 모든 집합이 live이면 그 객체나 심볼을 live라고 말한다.
평가 도중 어느 시점에서든, 객체 및/또는 심볼 집합 S가 아래 조건 중 하나를 만족하면 live로 간주한다:
S에 대한 어떤 유효한 미래의 가설적 WeakRef-oblivious 실행이 S 내 값의 정체성을 관측한다.
Note 4
두 번째 조건은 값의 정체성이 WeakRef 이외의 수단으로 관측 가능하다면 그 값이 live라는 직관을 포착하려는 것이다. 값의 정체성은 엄격 동등성 비교를 관측하거나 Map의 키로 사용되는 값을 관측함으로써 관측될 수 있다.
Note 5
필드, 내부 슬롯, 프로퍼티 내 객체 또는 심볼의 존재는 그 값이 live임을 의미하지 않는다. 예를 들어 해당 값이 프로그램에 다시 전달되지 않는다면 관측될 수 없다.
이는 WeakMap의 키, WeakSet의 멤버, 그리고 FinalizationRegistry Cell record의 [[WeakRefTarget]] 및 [[UnregisterToken]] 필드에 해당한다.
위 정의는 WeakMap에서 어떤 키가 live가 아니면 그에 대응하는 값도 반드시 live일 필요는 없음을 의미한다.
Note 6
Liveness는 엔진이 비워서는 안 되는 WeakRef에 대해 보장해야 하는 하한(lower bound)이다. 여기 정의된 Liveness는 결정 불가능(undecidable)하다. 실제로 엔진은 도달 가능성 같은 보수적 근사(approximation)를 사용한다. 구현 재량의 폭이 크다.
9.9.3 Execution
어느 시점에서든 객체 및/또는 심볼 집합 S가 live가 아니라면, ECMAScript 구현은 다음 단계를 원자적으로 수행할 수 있다:
map.[[WeakMapData]]가 [[Key]]가 value인 Recordr을 포함하는 각 WeakMap map에 대해
r.[[Key]]를 empty로 설정한다.
r.[[Value]]를 empty로 설정한다.
set.[[WeakSetData]]가 value를 포함하는 각 WeakSet set에 대해
값이 value인 set.[[WeakSetData]]의 요소를 값이 empty인 요소로 교체한다.
Note 1
Liveness 정의와 함께, 본 절은 구현이 WeakRef에 관해 적용할 수 있는 최적화들을 규정한다.
객체의 정체성을 관측하지 않고 객체에 접근하는 것이 가능하다. 정체성이 관측되지 않는, escape하지 않는 객체의 프로퍼티에 대해 dead variable elimination, scalar replacement 같은 최적화는 허용된다. 그러한 최적화는 해당 객체를 가리키는 WeakRef들을 관측 가능하게 비울 수 있다.
반면 객체의 정체성이 관측 가능하고 그 객체가 WeakRef의 [[WeakRefTarget]] 내부 슬롯에 있다면, WeakRef를 관측 가능하게 비워 버리는 rematerialization 같은 최적화는 금지된다.
구현은 live가 아닌 객체나 심볼의 최대 집합에 대해 WeakRef를 반드시 비울 필요는 없다.
구현이 WeakRef를 비울 live가 아닌 집합 S를 선택한다면, 이 정의는 S 내 모든 값에 대한 WeakRef를 동시에 비우도록 요구한다. 즉, 값 v를 가리키는 WeakRef 하나를 비우면서, 비워지지 않았다면 v의 값을 관측할 수도 있는 다른 WeakRef를 비우지 않은 채 두는 것은 적합(conformant)하지 않다.
HostEnqueueFinalizationRegistryCleanupJob 구현은 가능하다면 미래의 어느 시점에 cleanupJob이 수행되도록 스케줄한다. 또한 9.5의 요구 사항을 따라야 한다.
9.10 ClearKeptObjects ( )
The abstract operation ClearKeptObjects takes no arguments and returns unused. ECMAScript 구현은 동기적인 ECMAScript 실행 시퀀스가 완료될 때 ClearKeptObjects를 호출하는 것이 기대된다. It performs the following steps when called:
The abstract operation CanBeHeldWeakly takes argument v (an ECMAScript language value) and returns a Boolean. v가 약한 참조(weak reference)에 사용하기에 적합한 경우에만 true를 반환한다. 약한 참조에 사용하기에 적합한 값만이 WeakMap의 키, WeakSet의 요소, WeakRef의 target, 또는 FinalizationRegistry의 target들 중 하나가 될 수 있다. It performs the following steps when called:
언어 정체성(language identity)이 없는 언어 값은 사전 참조 없이도 나타날 수 있으며 약한 참조로 사용하기에 부적합하다. Symbol.for로 생성된 Symbol 값은 다른 Symbol 값과 달리 언어 정체성이 없으므로 약한 참조로 사용하기에 부적합하다. Well-known symbols는 수집되지 않을 가능성이 높지만, 그 수가 제한되어 있고 다양한 구현 방식으로 관리 가능하므로 약한 참조로 사용하기에 적합한 것으로 간주된다. 그러나 live한 WeakMap 안의 well-known symbol에 연관된 어떤 값도 수집되지 않아 메모리 자원이 “누수”될 가능성이 있다.
10 일반(Ordinary) 및 이그조틱(Exotic) 객체 동작
10.1 일반 객체의 내부 메서드와 내부 슬롯(Ordinary Object Internal Methods and Internal Slots)
모든 일반 객체는 [[Prototype]]이라 불리는 내부 슬롯을 가진다. 이 내부 슬롯의 값은 null 혹은 객체이며 상속을 구현하는 데 사용된다. 일반 객체O 에 속성 P 가 없지만 그 객체의 [[Prototype]] 객체에는 존재한다고 가정하자. P 가 [[Prototype]] 객체의 데이터 프로퍼티를 가리키면 O 는 get 접근에 대해 그것을 상속하여 P 가 마치 O 의 자체 프로퍼티인 것처럼 동작한다. P 가 [[Prototype]] 객체의 쓰기 가능한(writable) 데이터 프로퍼티를 가리키면 O 에서 P 에 대한 set 접근은 O 에 이름이 P 인 새로운 데이터 프로퍼티를 생성한다. P 가 [[Prototype]] 객체의 쓰기 불가능한(non-writable) 데이터 프로퍼티를 가리키면 O 에서 P 에 대한 set 접근은 실패한다. P 가 [[Prototype]] 객체의 접근자(accessor) 프로퍼티를 가리키면 그 접근자는 get 과 set 둘 다에 대해 O 에 상속된다.
모든 일반 객체는 Boolean 값을 갖는 [[Extensible]] 내부 슬롯을 가지며 이는 6.1.7.3 에 명시된 확장성 관련 내부 메서드 불변식을 충족하는 데 사용된다. 즉, 객체의 [[Extensible]] 내부 슬롯 값이 false 로 설정되면 더 이상 그 객체에 새로운 프로퍼티를 추가하거나 객체의 [[Prototype]] 내부 슬롯 값을 수정하거나 이후 [[Extensible]] 값을 true 로 되돌릴 수 없다.
각 일반 객체 내부 메서드는 동일하거나 유사한 이름의 추상 연산에 위임한다. 그러한 추상 연산이 또 다른 내부 메서드에 의존하는 경우, 동일 이름의 추상 연산을 직접 호출하지 않고 O 에 그 내부 메서드를 호출한다. 이러한 의미론은 일반 객체 내부 메서드가 이그조틱 객체에 적용될 때 해당 이그조틱 객체가 재정의한 내부 메서드가 호출되도록 보장한다.
10.1.1[[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of 일반 객체O takes no arguments and returns 객체 또는 null 을 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinaryGetPrototypeOf takes argument O (an Object) and returns an Object or null. It performs the following steps when called:
O.[[Prototype]] 을 반환한다.
10.1.2[[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of 일반 객체O takes argument V (an Object or null) and returns Boolean 을 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinarySetPrototypeOf takes arguments O (an Object) and V (an Object or null) and returns a Boolean. It performs the following steps when called:
p.[[GetPrototypeOf]] 가 10.1.1 에 정의된 일반 객체 내부 메서드가 아니면 done 을 true 로 설정한다.
아니면 p 를 p.[[Prototype]] 로 설정한다.
O.[[Prototype]] 을 V 로 설정한다.
true 를 반환한다.
Note
7 단계의 루프는 [[GetPrototypeOf]] 와 [[SetPrototypeOf]] 에 대한 일반 객체 정의만 사용하는 객체들로 이루어진 어떤 프로토타입 체인에도 순환이 생기지 않도록 보장한다.
10.1.3[[IsExtensible]] ( )
The [[IsExtensible]] internal method of 일반 객체O takes no arguments and returns Boolean 을 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinaryIsExtensible takes argument O (an Object) and returns a Boolean. It performs the following steps when called:
O.[[Extensible]] 를 반환한다.
10.1.4[[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of 일반 객체O takes no arguments and returns true 를 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinaryPreventExtensions takes argument O (an Object) and returns true. It performs the following steps when called:
O.[[Extensible]] 를 false 로 설정한다.
true 를 반환한다.
10.1.5[[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of 일반 객체O takes argument P (a property key) and returns Property Descriptor 또는 undefined 를 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinaryGetOwnProperty takes arguments O (an Object) and P (a property key) and returns a Property Descriptor or undefined. It performs the following steps when called:
D.[[Enumerable]] 을 X 의 [[Enumerable]] 속성 값으로 설정한다.
D.[[Configurable]] 을 X 의 [[Configurable]] 속성 값으로 설정한다.
D 를 반환한다.
10.1.6[[DefineOwnProperty]] ( P, Desc )
The [[DefineOwnProperty]] internal method of 일반 객체O takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinaryDefineOwnProperty takes arguments O (an Object), P (a property key), and Desc (a Property Descriptor) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
10.1.6.2 IsCompatiblePropertyDescriptor ( Extensible, Desc, Current )
The abstract operation IsCompatiblePropertyDescriptor takes arguments Extensible (a Boolean), Desc (a Property Descriptor), and Current (a Property Descriptor or undefined) and returns a Boolean. It performs the following steps when called:
10.1.6.3 ValidateAndApplyPropertyDescriptor ( O, P, extensible, Desc, current )
The abstract operation ValidateAndApplyPropertyDescriptor takes arguments O (an Object or undefined), P (a property key), extensible (a Boolean), Desc (a Property Descriptor), and current (a Property Descriptor or undefined) and returns a Boolean. Desc 가 지정된 extensibility 와 현재 프로퍼티 current 를 가진 객체의 프로퍼티로 ( 불변식 을 유지하면서) 적용될 수 있을 때에만 true 를 반환한다. 적용 가능하고 O 가 undefined 가 아니면 이름이 P 인 프로퍼티(필요 시 생성됨)에 대해 실제로 적용한다. It performs the following steps when called:
Desc 에 [[Configurable]] 필드가 있으면 configurable 을 그 값으로, 아니면 current.[[Configurable]] 로 둔다.
Desc 에 [[Enumerable]] 필드가 있으면 enumerable 을 그 값으로, 아니면 current.[[Enumerable]] 로 둔다.
객체 O 의 이름 P 인 프로퍼티를 접근자 프로퍼티로 교체하되 [[Configurable]] 과 [[Enumerable]] 은 각각 configurable, enumerable 로, [[Get]], [[Set]] 은 Desc 에 해당 필드가 있으면 그 값, 아니면 기본값 로 설정.
Desc 에 [[Configurable]] 필드가 있으면 configurable 을 그 값으로, 아니면 current.[[Configurable]] 로 둔다.
Desc 에 [[Enumerable]] 필드가 있으면 enumerable 을 그 값으로, 아니면 current.[[Enumerable]] 로 둔다.
객체 O 의 이름 P 인 프로퍼티를 데이터 프로퍼티로 교체하되 [[Configurable]] 과 [[Enumerable]] 은 각각 configurable, enumerable 로, [[Value]], [[Writable]] 은 Desc 에 해당 필드가 있으면 그 값, 아니면 기본값 로 설정.
Else
Desc 의 각 필드에 대해 객체 O 의 이름 P 인 프로퍼티의 대응 속성을 그 필드 값으로 설정.
true 반환.
10.1.7[[HasProperty]] ( P )
The [[HasProperty]] internal method of 일반 객체O takes argument P (a property key) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinaryHasProperty takes arguments O (an Object) and P (a property key) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
hasOwn 을 ? O.[[GetOwnProperty]](P) 로 둔다.
hasOwn 이 undefined 가 아니면 true 반환.
parent 를 ? O.[[GetPrototypeOf]]() 로 둔다.
parent 가 null 이 아니면
? parent.[[HasProperty]](P) 를 반환한다.
false 반환.
10.1.8[[Get]] ( P, Receiver )
The [[Get]] internal method of 일반 객체O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 언어 값 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinaryGet takes arguments O (an Object), P (a property key), and Receiver (an ECMAScript language value) and returns ECMAScript 언어 값 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The [[Set]] internal method of 일반 객체O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinarySet takes arguments O (an Object), P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
10.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )
The abstract operation OrdinarySetWithOwnDescriptor takes arguments O (an Object), P (a property key), V (an ECMAScript language value), Receiver (an ECMAScript language value), and ownDesc (a Property Descriptor or undefined) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
ownDesc 가 undefined 이면
parent 를 ? O.[[GetPrototypeOf]]() 로 둔다.
parent 가 null 이 아니면
? parent.[[Set]](P, V, Receiver) 를 반환한다.
그렇지 않으면
ownDesc 를 PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } 로 설정한다.
The [[Delete]] internal method of 일반 객체O takes argument P (a property key) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinaryDelete takes arguments O (an Object) and P (a property key) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
desc 를 ? O.[[GetOwnProperty]](P) 로 둔다.
desc 가 undefined 이면 true 반환.
desc.[[Configurable]] 이 true 이면
이름 P 인 자체 프로퍼티를 O 에서 제거한다.
true 반환.
false 반환.
10.1.11[[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of 일반 객체O takes no arguments and returns 프로퍼티 키List 를 담는 normal completion. It performs the following steps when called:
The abstract operation OrdinaryOwnPropertyKeys takes argument O (an Object) and returns a List of property keys. It performs the following steps when called:
O 의 각 자체 프로퍼티 키P 중 P 가 배열 인덱스인 것들을 숫자 인덱스 오름차순으로 순회하며
keys 에 P 를 추가한다.
O 의 각 자체 프로퍼티 키P 중 P 가 String 이고 배열 인덱스가 아닌 것들을 생성 시점의 시간 순(chronological order) 오름차순으로 순회하며
keys 에 P 를 추가한다.
O 의 각 자체 프로퍼티 키P 중 P 가 Symbol 인 것들을 생성 시점의 시간 순 오름차순으로 순회하며
keys 에 P 를 추가한다.
keys 를 반환한다.
10.1.12 OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] )
The abstract operation OrdinaryObjectCreate takes argument proto (an Object or null) and optional argument additionalInternalSlotsList (a List of names of internal slots) and returns an Object. 새 일반 객체를 런타임에 생성하는 과정을 명세하는 데 사용된다. additionalInternalSlotsList 는 [[Prototype]] 과 [[Extensible]] 외에 객체 일부로 정의되어야 하는 추가 내부 슬롯 이름을 담는다. additionalInternalSlotsList 가 제공되지 않으면 새 빈 List 를 사용한다. It performs the following steps when called:
internalSlotsList 를 « [[Prototype]], [[Extensible]] » 로 둔다.
additionalInternalSlotsList 가 주어지면 internalSlotsList 를 그 뒤에 additionalInternalSlotsList 를 이어붙인(list-concatenation) 리스트로 갱신한다.
OrdinaryObjectCreate 는 MakeBasicObject 호출 외에 많은 일을 하지 않지만, 이를 사용함으로써 이그조틱이 아닌 “일반 객체” 를 만들고자 함을 전달한다. 따라서 이 명세에서 결과 객체의 내부 메서드를 비일반적으로 만들 방식으로 이후 수정하는 어떤 알고리즘도 이를 호출하지 않는다. 이그조틱 객체를 생성하는 연산은 MakeBasicObject 를 직접 호출한다.
The abstract operation OrdinaryCreateFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and optional argument internalSlotsList (a List of names of internal slots) and returns 객체 또는 throw completion 을 담는 normal completion. 생성자의 "prototype" 프로퍼티가 존재하면 거기서 가져온 값을 [[Prototype]] 으로 하는 일반 객체를 생성한다. 그렇지 않으면 intrinsicDefaultProto 로 명명된 intrinsic 이 [[Prototype]] 으로 사용된다. internalSlotsList 는 객체 일부로 정의되어야 하는 추가 내부 슬롯 이름을 담으며 제공되지 않으면 새 빈 List 를 사용한다. It performs the following steps when called:
단언: intrinsicDefaultProto 는 이 명세에서 정의한 intrinsic 객체의 이름이다. 해당 객체는 다른 객체의 [[Prototype]] 값으로 사용되도록 의도된 intrinsic 이어야 한다.
The abstract operation GetPrototypeFromConstructor takes arguments constructor (a function object) and intrinsicDefaultProto (a String) and returns 객체 또는 throw completion 을 담는 normal completion. 특정 생성자에 대응하는 객체를 만들 때 사용할 [[Prototype]] 값을 결정한다. 생성자의 "prototype" 프로퍼티가 존재하면 그 값이 사용되고, 그렇지 않으면 intrinsicDefaultProto 로 명명된 intrinsic 이 [[Prototype]] 으로 사용된다. It performs the following steps when called:
단언: intrinsicDefaultProto 는 이 명세에서 정의한 intrinsic 객체의 이름이다. 해당 객체는 객체의 [[Prototype]] 값으로 사용되도록 의도된 intrinsic 이어야 한다.
proto 를 realm 의 intrinsicDefaultProto 라는 이름의 intrinsic 객체로 설정한다.
proto 를 반환한다.
Note
constructor 가 [[Prototype]] 값을 제공하지 않으면 사용되는 기본값은 실행 중인 실행 컨텍스트가 아니라 constructor 함수의 realm 에서 얻는다.
10.1.15 RequireInternalSlot ( O, internalSlot )
The abstract operation RequireInternalSlot takes arguments O (an ECMAScript language value) and internalSlot (an internal slot name) and returns unused 또는 throw completion 을 담는 normal completion. O 가 객체가 아니거나 지정된 내부 슬롯을 가지지 않으면 예외를 던진다. It performs the following steps when called:
O 가 객체가 아니면 TypeError 예외를 던진다.
O 에 internalSlot 내부 슬롯이 없으면 TypeError 예외를 던진다.
unused 를 반환한다.
10.2 ECMAScript 함수 객체(ECMAScript Function Objects)
ECMAScript 함수 객체는 렉시컬 환경을 클로즈(over)한 매개변수화된 ECMAScript 코드를 캡슐화하며 그 코드를 동적으로 평가할 수 있게 해준다. ECMAScript 함수 객체는 일반 객체(ordinary object)이며 다른 일반 객체와 동일한 내부 슬롯과 내부 메서드를 가진다. ECMAScript 함수 객체의 코드는 strict 모드 코드(11.2.2) 또는 비 strict 코드일 수 있다. 코드가 strict 모드 코드인 ECMAScript 함수 객체를 strict 함수라 한다. 코드가 strict 모드 코드가 아닌 것을 non‑strict 함수라 한다.
[[Extensible]] 및 [[Prototype]] 외에도, ECMAScript 함수 객체는 Table 28에 나열된 내부 슬롯을 추가로 가진다.
Table 28: ECMAScript 함수 객체의 내부 슬롯(Internal Slots of ECMAScript Function Objects)
this 참조가 형식 매개변수 및 함수 본문 내에서 어떻게 해석되는지 정의. lexical 은 this 가 렉시컬로 둘러싼 함수의 this 값을 가리킴. strict 은 this 값이 호출 시 제공된 그대로 사용됨. global 은 undefined 또는 null 인 this 값을 전역 객체 참조로 해석하고, 다른 this 값은 먼저 ToObject 적용.
단계 7 에서 calleeContext 가 스택에서 제거될 때 접근 가능한 Generator 에 의해 나중 재개를 위해 suspend 및 보존된 경우 파괴되면 안 된다.
10.2.1.1 PrepareForOrdinaryCall ( F, newTarget )
The abstract operation PrepareForOrdinaryCall takes arguments F (an ECMAScript function object) and newTarget (an Object or undefined) and returns an execution context. It performs the following steps when called:
The abstract operation OrdinaryCallBindThis takes arguments F (an ECMAScript function object), calleeContext (an execution context), and thisArgument (an ECMAScript language value) and returns unused. It performs the following steps when called:
thisMode 를 F.[[ThisMode]] 로 둔다.
thisMode 가 lexical 이면 unused 반환.
calleeRealm 을 F.[[Realm]] 로 둔다.
localEnv 를 calleeContext 의 LexicalEnvironment 로 둔다.
The syntax-directed operation EvaluateBody takes arguments functionObject (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns a return completion or a throw completion. It is defined piecewise over the following productions:
The abstract operation OrdinaryCallEvaluateBody takes arguments F (an ECMAScript function object) and argumentsList (a List of ECMAScript language values) and returns a return completion or a throw completion. It performs the following steps when called:
F.[[ECMAScriptCode]] 의 EvaluateBody (인수 F, argumentsList) ? 를 반환.
The abstract operation OrdinaryFunctionCreate takes arguments functionPrototype (an Object), sourceText (a sequence of Unicode code points), ParameterList (a Parse Node), Body (a Parse Node), thisMode (lexical-this or non-lexical-this), env (an Environment Record), and privateEnv (a PrivateEnvironment Record or null) and returns an ECMAScript function object. 기본 [[Call]] 내부 메서드만 있고 [[Construct]] 내부 메서드는 없는(단, 이후 MakeConstructor 같은 연산으로 추가될 수 있음) 새 함수를 런타임에 생성하는 과정을 명세한다. sourceText 는 생성할 함수 문법 정의의 소스 텍스트. It performs the following steps when called:
The abstract operation AddRestrictedFunctionProperties takes arguments F (a function object) and realm (a Realm Record) and returns unused. It performs the following steps when called:
The abstract operation MakeConstructor takes argument F (an ECMAScript function object or a built-in function object) and optional arguments writablePrototype (a Boolean) and prototype (an Object) and returns unused. F 를 생성자로 변환한다. It performs the following steps when called:
The abstract operation MakeClassConstructor takes argument F (an ECMAScript function object) and returns unused. It performs the following steps when called:
단언: F.[[IsClassConstructor]] 는 false.
F.[[IsClassConstructor]] 를 true 로 설정.
unused 반환.
10.2.7 MakeMethod ( F, homeObject )
The abstract operation MakeMethod takes arguments F (an ECMAScript function object) and homeObject (an Object) and returns unused. F 를 메서드로 구성한다. It performs the following steps when called:
The abstract operation DefineMethodProperty takes arguments homeObject (an Object), key (a property key or Private Name), closure (a function object), and enumerable (a Boolean) and returns PrivateElement 또는 unused 를 담는 normal completion 또는 abrupt completion. It performs the following steps when called:
NOTE: key 가 "prototype" 인 class static method 정의 시에만 abrupt completion 반환 가능.
unused 반환.
10.2.9 SetFunctionName ( F, name [ , prefix ] )
The abstract operation SetFunctionName takes arguments F (a function object) and name (a property key or Private Name) and optional argument prefix (a String) and returns unused. F 에 "name" 프로퍼티를 추가한다. It performs the following steps when called:
단언: F 는 "name" 자체 프로퍼티가 없는 extensible 객체.
name 이 Symbol 이면
description 을 name.[[Description]] 로 둔다.
description 이 undefined 이면 name 을 빈 문자열로 설정.
그렇지 않으면 name 을 "[", description, "]" 의 문자열 연결로 설정.
The abstract operation SetFunctionLength takes arguments F (a function object) and length (a non-negative integer or +∞) and returns unused. F 에 "length" 프로퍼티를 추가한다. It performs the following steps when called:
ECMAScript 함수를 평가하기 위한 실행 컨텍스트가 설정될 때 새로운 Function Environment Record 가 생성되고 각 형식 매개변수에 대한 바인딩이 그 Environment Record 에서 인스턴스화된다. 함수 본문 내 모든 선언도 인스턴스화된다. 함수의 형식 매개변수에 기본값 초기화자가 없으면 본문 선언들은 매개변수와 동일한 Environment Record 에서 인스턴스화된다. 기본값 매개변수 초기화자가 있으면 본문 선언을 위한 두 번째 Environment Record 가 생성된다. 형식 매개변수와 함수들은 FunctionDeclarationInstantiation 의 일부로 초기화된다. 다른 모든 바인딩은 함수 본문 평가 중 초기화된다.
호출 시 다음 단계를 수행한다:
calleeContext 를 실행 중 실행 컨텍스트로 둔다.
code 를 func.[[ECMAScriptCode]] 로 둔다.
strict 를 func.[[Strict]] 로 둔다.
formals 를 func.[[FormalParameters]] 로 둔다.
parameterNames 를 formals 의 BoundNames 로 둔다.
parameterNames 가 중복 항목을 가지면 hasDuplicates 를 true, 아니면 false 로 둔다.
simpleParameterList 를 IsSimpleParameterList of formals 로 둔다.
hasParameterExpressions 를 ContainsExpression of formals 로 둔다.
varNames 를 code 의 VarDeclaredNames 로 둔다.
varDeclarations 를 code 의 VarScopedDeclarations 로 둔다.
lexicalNames 를 code 의 LexicallyDeclaredNames 로 둔다.
내장 함수 객체는 10.3.1의 정의에 부합하는 [[Call]] 내부 메서드를 가져야 한다.
내장 함수 객체는 “constructor”로 기술되었거나 이 명세의 어떤 알고리즘이 그 [[Construct]] 내부 메서드를 명시적으로 설정한 경우에만 [[Construct]] 내부 메서드를 가진다. 그러한 [[Construct]] 내부 메서드는 10.3.2의 정의를 준수해야 한다.
The abstract operation BuiltinCallOrConstruct takes arguments F (a built-in function object), thisArgument (an ECMAScript language value or uninitialized), argumentsList (a List of ECMAScript language values), and newTarget (a constructor or undefined) and returns ECMAScript 언어 값 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
calleeContext 를 실행 컨텍스트 스택에 push; 이제 calleeContext 가 실행 중 실행 컨텍스트이다.
result 를 F 의 명세에 부합하는 방식으로 F 를 평가하여 얻은 Completion Record 로 둔다. thisArgument 가 uninitialized 이면 this 값은 초기화되지 않은 상태이며; 그렇지 않으면 thisArgument 가 this 값을 제공한다. argumentsList 는 명명된 매개변수들을 제공한다. newTarget 은 NewTarget 값을 제공한다.
NOTE: F 가 이 문서에서 정의된 경우 “the specification of F” 는 알고리즘 단계 등으로 기술된 그 동작을 의미한다.
실행 컨텍스트 스택에서 calleeContext 를 제거하고 callerContext 를 실행 중 실행 컨텍스트로 복원한다.
? result 를 반환한다.
Note
calleeContext 가 실행 컨텍스트 스택에서 제거될 때 접근 가능한 Generator 에 의해 suspend 및 보존되어 후속 재개가 예정된 경우 파괴되어서는 안 된다.
The abstract operation CreateBuiltinFunction takes arguments behaviour (an Abstract Closure, a set of algorithm steps, or some other definition of a function's behaviour provided in this specification), length (a non-negative integer or +∞), name (a property key or a Private Name), and additionalInternalSlotsList (a List of names of internal slots) and optional arguments realm (a Realm Record), prototype (an Object or null), and prefix (a String) and returns a built-in function object. additionalInternalSlotsList 는 객체 일부로 정의되어야 하는 추가 내부 슬롯 이름을 담는다. 이 연산은 내장 함수 객체를 생성한다. It performs the following steps when called:
prototype 이 제공되지 않았다면 prototype 을 realm.[[Intrinsics]].[[%Function.prototype%]] 로 설정한다.
internalSlotsList 를 곧 생성할 내장 함수 객체에 대해 10.3가 요구하는 모든 내부 슬롯 이름을 담는 List 로 둔다.
additionalInternalSlotsList 의 요소들을 internalSlotsList 에 추가(Append)한다.
func 를 새 내장 함수 객체로 두되, 호출 시 behaviour 가 지정한 매개변수에 제공 인수를 값으로 하여 behaviour 에 기술된 동작을 수행한다. 새 함수 객체는 internalSlotsList 요소 이름의 내부 슬롯과 [[InitialName]] 내부 슬롯을 가진다.
이 명세에 정의된 각 내장 함수는 CreateBuiltinFunction 추상 연산을 호출하여 생성된다.
10.4 내장 이그조틱 객체의 내부 메서드와 슬롯(Built-in Exotic Object Internal Methods and Slots)
이 명세는 여러 종류의 내장 이그조틱 객체를 정의한다. 이 객체들은 특정한 몇몇 상황을 제외하면 일반 객체와 유사하게 동작한다. 다음 이그조틱 객체들은 아래에서 명시적으로 달리 지정된 경우를 제외하고 일반 객체 내부 메서드를 사용한다:
10.4.1 바운드 함수 이그조틱 객체(Bound Function Exotic Objects)
바운드 함수 이그조틱 객체는 다른 함수 객체를 감싸는 이그조틱 객체이다. 바운드 함수 이그조틱 객체는 호출 가능(callable)하며([[Call]] 내부 메서드를 가지며 필요 시 [[Construct]] 내부 메서드도 가질 수 있음), 호출하면 보통 감싼 함수가 호출된다.
객체의 [[Call]] 및 (해당하는 경우) [[Construct]] 내부 메서드가 아래 구현을 사용하고, 그 외 핵심 내부 메서드가 10.1의 정의를 사용한다면 그 객체는 바운드 함수 이그조틱 객체이다. 이러한 메서드는 BoundFunctionCreate 에서 설치된다.
The abstract operation BoundFunctionCreate takes arguments targetFunction (a function object), boundThis (an ECMAScript language value), and boundArgs (a List of ECMAScript language values) and returns 함수 객체 또는 throw completion 을 담는 normal completion. 새 바운드 함수 이그조틱 객체 생성을 명세하는 데 사용된다. It performs the following steps when called:
proto 를 ? targetFunction.[[GetPrototypeOf]]() 로 둔다.
internalSlotsList 를 « [[Prototype]], [[Extensible]] » 와 Table 29에 나열된 내부 슬롯의 리스트 연결로 둔다.
obj.[[BoundTargetFunction]] 을 targetFunction 으로 설정한다.
obj.[[BoundThis]] 를 boundThis 로 설정한다.
obj.[[BoundArguments]] 를 boundArgs 로 설정한다.
obj 를 반환한다.
10.4.2 배열(Array) 이그조틱 객체(Array Exotic Objects)
Array 는 배열 인덱스프로퍼티 키(6.1.7 참조)에 특별 취급을 제공하는 이그조틱 객체이다. 프로퍼티 이름이 배열 인덱스인 프로퍼티를 element 라고도 부른다. 모든 Array 는 재정의 불가(non-configurable) "length" 프로퍼티를 가지며 그 값은 232 보다 작은 0 이상 정수 Number 이다. "length" 프로퍼티 값은 이름이 배열 인덱스인 모든 자체 프로퍼티 이름보다 수치적으로 크다; Array 의 자체 프로퍼티가 생성되거나 변경될 때마다 이 불변식을 유지하도록 다른 프로퍼티들이 필요 시 조정된다. 구체적으로 배열 인덱스 이름의 자체 프로퍼티가 추가되면 "length" 값은 필요 시 그 인덱스의 수치 값보다 1 큰 값으로 변경되고; "length" 값이 변경되면 새 length 보다 크거나 같았던 배열 인덱스 이름의 모든 자체 프로퍼티는 삭제된다. 이 제약은 Array 의 자체 프로퍼티에만 적용되며 프로토타입에서 상속될 수 있는 "length" 또는 배열 인덱스 프로퍼티에는 영향받지 않는다.
객체의 [[DefineOwnProperty]] 내부 메서드가 아래 구현을 사용하고 그 외 핵심 내부 메서드가 10.1의 정의를 사용하면 그 객체는 Array 이그조틱 객체(간단히 Array)이다. 이러한 메서드는 ArrayCreate 에서 설치된다.
The abstract operation ArrayCreate takes argument length (a non-negative integer) and optional argument proto (an Object) and returns Array 이그조틱 객체 또는 throw completion 을 담는 normal completion. 새 Array 생성 명세에 사용된다. It performs the following steps when called:
The abstract operation ArraySpeciesCreate takes arguments originalArray (an Object) and length (a non-negative integer) and returns 객체 또는 throw completion 을 담는 normal completion. originalArray 에서 파생된 constructor 함수를 사용하여 새 Array 또는 유사 객체를 생성하는 과정을 명세한다. constructor 가 반드시 Array 를 반환하도록 강제하지 않는다. It performs the following steps when called:
originalArray 가 실행 중 실행 컨텍스트의 realm 이 아닌 realm 의 표준 내장 Array 생성자로 생성되었다면, 실행 중 실행 컨텍스트 realm 을 사용하여 새 Array 가 생성된다. 이는 ArraySpeciesCreate 로 정의된 Array.prototype 메서드들에 대해 역사적으로 그러한 동작을 가진 웹 브라우저와의 호환성을 유지한다.
10.4.2.4 ArraySetLength ( A, Desc )
The abstract operation ArraySetLength takes arguments A (an Array) and Desc (a Property Descriptor) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
succeeded 를 ! OrdinaryDefineOwnProperty(A, "length", PropertyDescriptor { [[Writable]]: false }) 로 설정.
단언: succeeded 는 true.
true 반환.
Note
3 및 4 단계에서 Desc.[[Value]] 가 객체이면 그 valueOf 메서드는 두 번 호출된다. 이는 명세 2판부터 이런 효과로 규정된 레거시 동작이다.
10.4.3 문자열(String) 이그조틱 객체(String Exotic Objects)
String 객체는 String 값을 캡슐화하고 그 String 값의 개별 코드 유닛 요소에 해당하는 가상 정수 인덱스데이터 프로퍼티를 노출하는 이그조틱 객체이다. String 이그조틱 객체는 캡슐화된 String 값 길이를 값으로 갖는 "length"데이터 프로퍼티를 항상 가진다. 코드 유닛 데이터 프로퍼티와 "length" 프로퍼티 모두 쓰기 불가능 및 재정의 불가이다.
객체의 [[GetOwnProperty]], [[DefineOwnProperty]], [[OwnPropertyKeys]] 내부 메서드가 아래 구현을 사용하고 그 외 핵심 내부 메서드가 10.1 정의를 사용하면 그 객체는 String 이그조틱 객체(간단히 String 객체)이다. 이러한 메서드는 StringCreate 에서 설치된다.
The [[GetOwnProperty]] internal method of String 이그조틱 객체S takes argument P (a property key) and returns Property Descriptor 또는 undefined 를 담는 normal completion. It performs the following steps when called:
The [[DefineOwnProperty]] internal method of String 이그조틱 객체S takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean 을 담는 normal completion. It performs the following steps when called:
The [[OwnPropertyKeys]] internal method of String 이그조틱 객체O takes no arguments and returns 프로퍼티 키List 를 담는 normal completion. It performs the following steps when called:
The abstract operation StringCreate takes arguments value (a String) and prototype (an Object) and returns String 이그조틱 객체. 새 String 이그조틱 객체 생성 명세에 사용된다. It performs the following steps when called:
S 를 MakeBasicObject(« [[Prototype]], [[Extensible]], [[StringData]] ») 로 둔다.
The abstract operation StringGetOwnProperty takes arguments S (an Object that has a [[StringData]] internal slot) and P (a property key) and returns a Property Descriptor or undefined. It performs the following steps when called:
대부분의 ECMAScript 함수는 코드에서 사용할 수 있는 arguments 객체를 제공한다. 함수 정의 특성에 따라 그 arguments 객체는 일반 객체이거나 arguments 이그조틱 객체가 된다. arguments 이그조틱 객체는 배열 인덱스 프로퍼티들이 관련 ECMAScript 함수 호출의 형식 매개변수 바인딩에 매핑되는 이그조틱 객체이다.
객체의 내부 메서드가 아래 구현을 사용하고 여기 명시되지 않은 메서드는 10.1의 정의를 사용하면 그 객체는 arguments 이그조틱 객체이다. 이러한 메서드는 CreateMappedArgumentsObject 에서 설치된다.
Arguments 이그조틱 객체는 일반 객체와 동일한 내부 슬롯을 가지며 추가로 [[ParameterMap]] 내부 슬롯을 가진다. 일반 arguments 객체 또한 값이 항상 undefined 인 [[ParameterMap]] 내부 슬롯을 갖는다. 일반 arguments 객체의 [[ParameterMap]] 내부 슬롯은 Object.prototype.toString (20.1.3.6)이 그것을 식별하는 데만 사용된다.
Note 2
arguments 이그조틱 객체 중 숫자 이름 값이 대응 함수 객체의 형식 매개변수 수보다 작은 정수 인덱스데이터 프로퍼티는 초기에는 함수 실행 컨텍스트의 해당 인자 바인딩과 값을 공유한다. 즉 프로퍼티를 바꾸면 매개변수 바인딩 값도 바뀌며 그 반대도 같다. 이 대응 관계는 그러한 프로퍼티가 삭제 후 재정의되거나 접근자 프로퍼티로 바뀌면 끊어진다. arguments 객체가 일반 객체인 경우 그 프로퍼티 값은 단지 전달된 인자의 복사이며 동적 연결은 없다.
Note 3
ParameterMap 객체와 그 프로퍼티 값들은 arguments 객체와 인자 바인딩 간의 대응 관계를 명세하기 위한 장치이다. ParameterMap 객체와 그 프로퍼티 값 객체들은 ECMAScript 코드에서 직접 관측될 수 없다. 구현은 명세된 의미론을 위해 실제로 이러한 객체를 생성하거나 사용할 필요가 없다.
Note 4
일반 arguments 객체는 접근 시 TypeError 예외를 throw 하는 재정의 불가 accessor 프로퍼티 "callee" 를 정의한다. "callee" 프로퍼티는 non‑strict 함수 일부에 대해서만 생성되는 arguments 이그조틱 객체에서 더 구체적 의미를 가진다. 일반 변형에서의 정의는 적합한 구현이 다른 방식으로 정의하지 못하도록 하기 위함이다.
Note 5
역사적으로 arguments 이그조틱 객체 구현은 "caller" 라는 accessor 프로퍼티를 포함했다. ECMAScript 2017 이전 명세는 일반 arguments 객체에 throwing "caller" 프로퍼티 정의를 포함했다. 구현이 더 이상 이 확장을 포함하지 않으므로 ECMAScript 2017 은 throwing "caller" accessor 요구를 제거했다.
The [[DefineOwnProperty]] internal method of arguments 이그조틱 객체args takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean 을 담는 normal completion. It performs the following steps when called:
The [[Set]] internal method of arguments 이그조틱 객체args takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The abstract operation CreateUnmappedArgumentsObject takes argument argumentsList (a List of ECMAScript language values) and returns an ordinary object. It performs the following steps when called:
The abstract operation CreateMappedArgumentsObject takes arguments func (an Object), formals (a Parse Node), argumentsList (a List of ECMAScript language values), and env (an Environment Record) and returns an arguments exotic object. It performs the following steps when called:
단언: formals 는 rest 매개변수, 바인딩 패턴, 초기화자를 포함하지 않는다. 중복 식별자는 있을 수 있다.
len 을 argumentsList 요소 개수로 둔다.
obj 를 MakeBasicObject(« [[Prototype]], [[Extensible]], [[ParameterMap]] ») 로 둔다.
The abstract operation MakeArgGetter takes arguments name (a String) and env (an Environment Record) and returns a function object. 실행 시 env 에서 name 에 바인딩된 값을 반환하는 내장 함수 객체를 생성한다. It performs the following steps when called:
getterClosure 를 매개변수 없고 name, env 를 캡처하며 호출 시 다음 단계를 수행하는 새 Abstract Closure 로 둔다:
The abstract operation MakeArgSetter takes arguments name (a String) and env (an Environment Record) and returns a function object. 실행 시 env 에서 name 에 바인딩된 값을 설정하는 내장 함수 객체를 생성한다. It performs the following steps when called:
setterClosure 를 매개변수 (value) 를 가지며 name, env 를 캡처하고 호출 시 다음을 수행하는 새 Abstract Closure 로 둔다:
임의의 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]] ( )
The [[PreventExtensions]] internal method of TypedArrayO takes no arguments and returns Boolean 을 담는 normal completion. It performs the following steps when called:
NOTE: 6.1.7.3에 규정된 확장성 관련 불변식은 O 가 프로퍼티를 얻거나(또는 잃고 다시 얻을) 수 있는 경우 true 를 반환하지 못하게 한다; 이는 underlying buffer 가 resize 될 때 정수 인덱스 이름 프로퍼티에서 발생할 수 있다.
The [[GetOwnProperty]] internal method of TypedArrayO takes argument P (a property key) and returns Property Descriptor 또는 undefined 를 담는 normal completion. It performs the following steps when called:
The [[HasProperty]] internal method of TypedArrayO takes argument P (a property key) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The [[Get]] internal method of TypedArrayO takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 언어 값 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The [[Set]] internal method of TypedArrayO takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The [[Delete]] internal method of TypedArrayO takes argument P (a property key) and returns Boolean 을 담는 normal completion. It performs the following steps when called:
The [[OwnPropertyKeys]] internal method of TypedArrayO takes no arguments and returns 프로퍼티 키List 를 담는 normal completion. It performs the following steps when called:
10.4.5.9 버퍼 증인 레코드가 있는 TypedArray (TypedArray With Buffer Witness Records)
TypedArray With Buffer Witness Record 는 TypedArray 와, 보기 버퍼(viewed buffer)의 캐시된 byte length 를 함께 캡슐화하는 Record 값이다. growable SharedArrayBuffer 를 보는 경우 byte length 데이터 블록에 대한 단일 공유 메모리 읽기 이벤트를 보장하는 데 사용된다.
TypedArray With Buffer Witness Record 는 Table 30에 나온 필드를 가진다.
Record 생성 시 객체의 [[ViewedArrayBuffer]] byte length.
10.4.5.10 MakeTypedArrayWithBufferWitnessRecord ( obj, order )
The abstract operation MakeTypedArrayWithBufferWitnessRecord takes arguments obj (a TypedArray) and order (seq-cst or unordered) and returns a TypedArray With Buffer Witness Record. It performs the following steps when called:
The abstract operation TypedArrayCreate takes argument prototype (an Object) and returns a TypedArray. 새 TypedArray 생성 명세에 사용된다. It performs the following steps when called:
internalSlotsList 를 « [[Prototype]], [[Extensible]], [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] » 로 둔다.
The abstract operation TypedArrayByteLength takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:
The abstract operation TypedArrayLength takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a non-negative integer. It performs the following steps when called:
The abstract operation IsTypedArrayOutOfBounds takes argument taRecord (a TypedArray With Buffer Witness Record) and returns a Boolean. 객체의 어떤 수치 프로퍼티라도 underlying buffer 범위를 벗어난 인덱스 값을 참조하는지 검사한다. It performs the following steps when called:
O 를 taRecord.[[Object]] 로 둔다.
bufferByteLength 를 taRecord.[[CachedBufferByteLength]] 로 둔다.
단언: IsDetachedBuffer(O.[[ViewedArrayBuffer]]) 는 bufferByteLength 가 detached 일 때 그리고 그럴 때에만 true.
The abstract operation IsValidIntegerIndex takes arguments O (a TypedArray) and index (a Number) and returns a Boolean. It performs the following steps when called:
The abstract operation TypedArrayGetElement takes arguments O (a TypedArray) and index (a Number) and returns a Number, a BigInt, or undefined. It performs the following steps when called:
10.4.5.18 TypedArraySetElement ( O, index, value )
The abstract operation TypedArraySetElement takes arguments O (a TypedArray), index (a Number), and value (an ECMAScript language value) and returns unused 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
O.[[ContentType]] 가 bigint 이면 numValue 를 ? ToBigInt(value) 로 둔다.
이 연산은 항상 성공하는 것처럼 보이나, TypedArray 끝을 넘어 쓰거나 분리(detached)된 ArrayBuffer 기반 TypedArray 에 쓰려 할 때는 효과가 없다.
10.4.5.19 IsArrayBufferViewOutOfBounds ( O )
The abstract operation IsArrayBufferViewOutOfBounds takes argument O (a TypedArray or a DataView) and returns a Boolean. TypedArray 의 수치 프로퍼티 또는 DataView 메서드가 underlying data block 범위를 벗어난 인덱스 값을 참조할 수 있는지 검사한다. 상위(spec) 명세 편의를 위해 존재. It performs the following steps when called:
모듈 네임스페이스 이그조틱 객체는 ECMAScript Module에서 export 된 바인딩을 노출하는 이그조틱 객체이다(16.2.3 참조). 모듈 네임스페이스 이그조틱 객체의 String-keyed 자체 프로퍼티와 Module 이 export 한 바인딩 이름 사이엔 1:1 대응이 있다. export 된 바인딩에는 export * 로 간접 export 된 바인딩도 포함된다. 각 String 값인 자체 프로퍼티 키는 해당 export 바인딩 이름의 StringValue 이다. 이들이 모듈 네임스페이스 이그조틱 객체의 유일한 String-keyed 프로퍼티이다. 각 프로퍼티는 { [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false } 속성을 가진다. 모듈 네임스페이스 이그조틱 객체는 비확장(extensible 아님)이다.
객체의 [[GetPrototypeOf]], [[SetPrototypeOf]], [[IsExtensible]], [[PreventExtensions]], [[GetOwnProperty]], [[DefineOwnProperty]], [[HasProperty]], [[Get]], [[Set]], [[Delete]], [[OwnPropertyKeys]] 내부 메서드가 이 절의 정의를 사용하고 그 외 핵심 내부 메서드가 10.1 정의를 사용하면 그 객체는 모듈 네임스페이스 이그조틱 객체이다. 이러한 메서드는 ModuleNamespaceCreate 에 의해 설치된다.
이 객체의 자체 프로퍼티로 노출되는 export 이름들의 String 값 요소를 가진 List. 코드 유닛 사전식 순서로 정렬됨.
10.4.6.1[[GetPrototypeOf]] ( )
The [[GetPrototypeOf]] internal method of 모듈 네임스페이스 이그조틱 객체 takes no arguments and returns null 을 담는 normal completion. It performs the following steps when called:
null 반환.
10.4.6.2[[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of 모듈 네임스페이스 이그조틱 객체O takes argument V (an Object or null) and returns Boolean 을 담는 normal completion. It performs the following steps when called:
The [[IsExtensible]] internal method of 모듈 네임스페이스 이그조틱 객체 takes no arguments and returns false 를 담는 normal completion. It performs the following steps when called:
false 반환.
10.4.6.4[[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of 모듈 네임스페이스 이그조틱 객체 takes no arguments and returns true 를 담는 normal completion. It performs the following steps when called:
Desc 에 [[Writable]] 필드가 있고 그 값이 false 이면 false 반환.
Desc 에 [[Value]] 필드가 있으면 SameValue(Desc.[[Value]], current.[[Value]]) 반환.
true 반환.
10.4.6.7[[HasProperty]] ( P )
The [[HasProperty]] internal method of 모듈 네임스페이스 이그조틱 객체O takes argument P (a property key) and returns Boolean 을 담는 normal completion. It performs the following steps when called:
ResolveExport 는 부작용이 없다. 특정 exportName, resolveSet 인수 쌍으로 이 연산을 호출할 때마다 동일 결과를 반환해야 한다. 구현은 각 모듈 네임스페이스 이그조틱 객체의 [[Exports]] 에 대한 ResolveExport 결과를 미리 계산하거나 캐시할 수 있다.
10.4.6.9[[Set]] ( P, V, Receiver )
The [[Set]] internal method of 모듈 네임스페이스 이그조틱 객체 takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns false 를 담는 normal completion. It performs the following steps when called:
false 반환.
10.4.6.10[[Delete]] ( P )
The [[Delete]] internal method of 모듈 네임스페이스 이그조틱 객체O takes argument P (a property key) and returns Boolean 을 담는 normal completion. It performs the following steps when called:
The abstract operation ModuleNamespaceCreate takes arguments module (a Module Record) and exports (a List of Strings) and returns a module namespace exotic object. 새 모듈 네임스페이스 이그조틱 객체 생성 명세에 사용된다. It performs the following steps when called:
The [[SetPrototypeOf]] internal method of 불변 프로토타입 이그조틱 객체O takes argument V (an Object or null) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
The abstract operation SetImmutablePrototype takes arguments O (an Object) and V (an Object or null) and returns Boolean 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
10.5 Proxy 객체의 내부 메서드와 내부 슬롯(Proxy Object Internal Methods and Internal Slots)
Proxy 객체는 필수 내부 메서드가 ECMAScript 코드로 일부 구현된 이그조틱 객체이다. 모든 Proxy 객체는 [[ProxyHandler]] 라는 내부 슬롯을 가진다. [[ProxyHandler]] 의 값은 프록시의 handler object 라 불리는 객체이거나 null 이다. 핸들러 객체의 메서드들(Table 32 참조)은 하나 이상 Proxy 객체 내부 메서드 구현을 확장(augment)하는 데 사용될 수 있다. 모든 Proxy 객체는 또한 [[ProxyTarget]] 이라 불리는 내부 슬롯을 가지며 그 값은 객체 또는 null 이다. 이 객체를 프록시의 target object 라고 한다.
객체의 (해당한다면 [[Call]] 및 [[Construct]] 포함) 필수 내부 메서드가 이 절의 정의를 사용한다면 그 객체는 Proxy 이그조틱 객체이다. 이러한 내부 메서드는 ProxyCreate 에서 설치된다.
Table 32: Proxy Handler Methods
Internal Method
Handler Method
[[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
프록시 객체 내부 메서드 구현을 제공하기 위해 핸들러 메서드가 호출될 때 핸들러 메서드에는 프록시의 target 객체가 매개변수로 전달된다. 프록시의 핸들러 객체가 모든 필수 내부 메서드에 대응하는 메서드를 반드시 가질 필요는 없다. 프록시에서 내부 메서드를 호출했을 때 핸들러 객체가 해당 내부 트랩에 대응하는 메서드를 가지지 않으면 프록시 target 객체의 대응 내부 메서드가 호출된다.
Proxy 객체의 [[ProxyHandler]] 와 [[ProxyTarget]] 내부 슬롯은 객체 생성 시 항상 초기화되며 일반적으로 수정될 수 없다. 일부 Proxy 객체는 이후 revoked 될 수 있는 방식으로 생성된다. 프록시가 철회(revoke)되면 그 [[ProxyHandler]] 및 [[ProxyTarget]] 내부 슬롯이 null 로 설정되어 이후 그 Proxy 객체의 내부 메서드 호출은 TypeError 예외를 던진다.
Proxy 객체는 내부 메서드 구현을 임의의 ECMAScript 코드로 제공할 수 있게 하므로, 6.1.7.3 에 정의된 불변식을 위반하는 핸들러 메서드를 가진 Proxy 객체를 정의할 가능성이 있다. 6.1.7.3 에 정의된 내부 메서드 불변식 중 일부는 필수 무결성 불변식이며, 이들은 이 절에 명시된 Proxy 객체 내부 메서드에 의해 명시적으로 강제된다. ECMAScript 구현은 모든 가능한 불변식 위반 존재 시에도 견고해야 한다.
The [[GetPrototypeOf]] internal method of a Proxy exotic object O takes no arguments and returns Object 또는 null 을 담는 normal completion 또는 throw completion. It performs the following steps when called:
SameValue(handlerProto, targetProto) 가 false 이면 TypeError 예외 throw.
handlerProto 반환.
Note
Proxy 객체의 [[GetPrototypeOf]] 는 다음 불변식을 강제한다:
[[GetPrototypeOf]] 결과는 Object 또는 null 이어야 한다.
target 객체가 비확장(non-extensible) 이면 Proxy 객체에 적용한 [[GetPrototypeOf]] 는 target 객체에 적용한 [[GetPrototypeOf]] 와 동일 값을 반환해야 한다.
10.5.2[[SetPrototypeOf]] ( V )
The [[SetPrototypeOf]] internal method of a Proxy exotic object O takes argument V (an Object or null) and returns Boolean 을 담는 normal completion 또는 throw completion. It performs the following steps when called:
SameValue(V, targetProto) 가 false 이면 TypeError 예외 throw.
true 반환.
Note
Proxy 객체의 [[SetPrototypeOf]] 는 다음 불변식을 강제한다:
[[SetPrototypeOf]] 의 결과는 Boolean 값이다.
target 객체가 비확장이라면 인수 값은 target 객체에 적용한 [[GetPrototypeOf]] 결과와 동일해야 한다.
10.5.3[[IsExtensible]] ( )
The [[IsExtensible]] internal method of a Proxy exotic object O takes no arguments and returns Boolean 을 담는 normal completion 또는 throw completion. It performs the following steps when called:
booleanTrapResult 가 targetResult 와 다르면 TypeError 예외 throw.
booleanTrapResult 반환.
Note
Proxy 객체의 [[IsExtensible]] 는 다음 불변식을 강제한다:
[[IsExtensible]] 결과는 Boolean 값이다.
Proxy 객체에 적용한 [[IsExtensible]] 결과는 동일 인수로 target 객체에 적용한 [[IsExtensible]] 결과와 동일해야 한다.
10.5.4[[PreventExtensions]] ( )
The [[PreventExtensions]] internal method of a Proxy exotic object O takes no arguments and returns Boolean 을 담는 normal completion 또는 throw completion. It performs the following steps when called:
Proxy 객체에 적용한 [[PreventExtensions]] 가 true 를 반환하는 경우는 target 객체에 적용한 [[IsExtensible]] 가 false 일 때뿐이다.
10.5.5[[GetOwnProperty]] ( P )
The [[GetOwnProperty]] internal method of a Proxy exotic object O takes argument P (a property key) and returns Property Descriptor 또는 undefined 를 담는 normal completion 또는 throw completion. It performs the following steps when called:
targetDesc 가 undefined 이거나 targetDesc.[[Configurable]] 이 true 이면
TypeError 예외 throw.
resultDesc 에 [[Writable]] 필드가 있고 resultDesc.[[Writable]] 이 false 이면
단언: targetDesc 는 [[Writable]] 필드를 가진다.
targetDesc.[[Writable]] 이 true 이면 TypeError 예외 throw.
resultDesc 반환.
Note
Proxy 객체의 [[GetOwnProperty]] 는 다음 불변식을 강제한다:
[[GetOwnProperty]] 결과는 Object 또는 undefined 여야 한다.
target 객체에 비구성 가능(non-configurable) 자체 프로퍼티로 존재하면 그 프로퍼티를 비존재로 보고할 수 없다.
target 객체가 비확장이고 해당 프로퍼티가 자체 프로퍼티로 존재하면 비존재로 보고할 수 없다.
target 객체가 비확장이고 해당 프로퍼티가 target 에 자체 프로퍼티로 존재하지 않으면 존재한다고 보고할 수 없다.
target 객체에 대응 비구성 가능 자체 프로퍼티가 없으면 프로퍼티를 비구성 가능으로 보고할 수 없다.
target 객체에 대응 비구성 가능·비쓰기(non-writable) 자체 프로퍼티가 없으면 프로퍼티를 동시에 비구성 가능 & 비쓰기라고 보고할 수 없다.
10.5.6[[DefineOwnProperty]] ( P, Desc )
The [[DefineOwnProperty]] internal method of a Proxy exotic object O takes arguments P (a property key) and Desc (a Property Descriptor) and returns Boolean 을 담는 normal completion 또는 throw completion. It performs the following steps when called:
settingConfigFalse 가 true 이고 targetDesc.[[Configurable]] 이 true 이면 TypeError 예외 throw.
IsDataDescriptor(targetDesc) 가 true 이고 targetDesc.[[Configurable]] 이 false 이며 targetDesc.[[Writable]] 이 true 이면
Desc 에 [[Writable]] 필드가 있고 Desc.[[Writable]] 이 false 이면 TypeError 예외 throw.
true 반환.
Note
Proxy 객체의 [[DefineOwnProperty]] 는 다음 불변식을 강제한다:
[[DefineOwnProperty]] 결과는 Boolean 값이다.
target 객체가 비확장이라면 프로퍼티를 추가할 수 없다.
target 객체에 대응 비구성 가능 자체 프로퍼티가 없으면 프로퍼티를 비구성 가능으로 만들 수 없다.
대응 비구성 가능·비쓰기 자체 프로퍼티가 없으면 비구성 가능 프로퍼티를 비쓰기 상태로 만들 수 없다.
프로퍼티에 대응하는 target 프로퍼티가 존재한다면 그 프로퍼티의 Descriptor 를 target 에 [[DefineOwnProperty]] 로 적용해도 예외가 발생하지 않아야 한다.
10.5.7[[HasProperty]] ( P )
The [[HasProperty]] internal method of a Proxy exotic object O takes argument P (a property key) and returns Boolean 을 담는 normal completion 또는 throw completion. It performs the following steps when called:
target 객체가 비확장이고 해당 프로퍼티가 자체 프로퍼티로 존재하면 비존재로 보고할 수 없다.
10.5.8[[Get]] ( P, Receiver )
The [[Get]] internal method of a Proxy exotic object O takes arguments P (a property key) and Receiver (an ECMAScript language value) and returns ECMAScript 언어 값 또는 throw completion 을 담는 normal completion. It performs the following steps when called:
target 객체 프로퍼티가 비쓰기·비구성 가능 자체 데이터 프로퍼티라면 보고되는 값은 target 프로퍼티 값과 동일해야 한다.
target 객체 프로퍼티가 [[Get]] 이 undefined 인 비구성 가능 자체 접근자 프로퍼티라면 보고되는 값은 undefined 이어야 한다.
10.5.9[[Set]] ( P, V, Receiver )
The [[Set]] internal method of a Proxy exotic object O takes arguments P (a property key), V (an ECMAScript language value), and Receiver (an ECMAScript language value) and returns Boolean 을 담는 normal completion 또는 throw completion. It performs the following steps when called:
targetDesc.[[Set]] 이 undefined 이면 TypeError 예외 throw.
true 반환.
Note
Proxy 객체의 [[Set]] 는 다음 불변식을 강제한다:
[[Set]] 결과는 Boolean 값이다.
대응 target 프로퍼티가 비쓰기·비구성 가능 자체 데이터 프로퍼티라면 그 값을 다른 값으로 바꿀 수 없다.
대응 target 프로퍼티가 [[Set]] 이 undefined 인 비구성 가능 자체 접근자 프로퍼티라면 값을 설정할 수 없다.
10.5.10[[Delete]] ( P )
The [[Delete]] internal method of a Proxy exotic object O takes argument P (a property key) and returns Boolean 을 담는 normal completion 또는 throw completion. It performs the following steps when called:
target 객체가 비확장이고 해당 프로퍼티가 자체 프로퍼티로 존재하면 삭제되었다고 보고할 수 없다.
10.5.11[[OwnPropertyKeys]] ( )
The [[OwnPropertyKeys]] internal method of a Proxy exotic object O takes no arguments and returns 프로퍼티 키List 를 담는 normal completion 또는 throw completion. It performs the following steps when called:
Proxy 이그조틱 객체는 [[ProxyTarget]] 내부 슬롯 초기 값이 [[Call]] 내부 메서드를 가진 객체인 경우에만 [[Call]] 내부 메서드를 가진다.
10.5.13[[Construct]] ( argumentsList, newTarget )
The [[Construct]] internal method of a Proxy exotic object O takes arguments argumentsList (a List of ECMAScript language values) and newTarget (a constructor) and returns Object 를 담는 normal completion 또는 throw completion. It performs the following steps when called:
newObj 를 ? Call(trap, handler, « target, argArray, newTarget ») 로 둔다.
newObj 가 Object 가 아니면 TypeError 예외 throw.
newObj 반환.
Note 1
Proxy 이그조틱 객체는 [[ProxyTarget]] 내부 슬롯 초기 값이 [[Construct]] 내부 메서드를 가진 객체인 경우에만 [[Construct]] 내부 메서드를 가진다.
Note 2
Proxy 객체의 [[Construct]] 는 다음 불변식을 강제한다:
[[Construct]] 결과는 Object 이어야 한다.
10.5.14 ValidateNonRevokedProxy ( proxy )
The abstract operation ValidateNonRevokedProxy takes argument proxy (a Proxy exotic object) and returns unused 를 담는 normal completion 또는 throw completion. proxy 가 revoke 되었다면 TypeError 예외를 던진다. It performs the following steps when called:
proxy.[[ProxyTarget]] 이 null 이면 TypeError 예외 throw.
단언: proxy.[[ProxyHandler]] 는 null 이 아님.
unused 반환.
10.5.15 ProxyCreate ( target, handler )
The abstract operation ProxyCreate takes arguments target (an ECMAScript language value) and handler (an ECMAScript language value) and returns Proxy 이그조틱 객체를 담는 normal completion 또는 throw completion. 새 Proxy 객체 생성 과정을 명세하는 데 사용된다. It performs the following steps when called:
target 이 Object 가 아니면 TypeError 예외 throw.
handler 가 Object 가 아니면 TypeError 예외 throw.
P 를 MakeBasicObject(« [[ProxyHandler]], [[ProxyTarget]] ») 로 둔다.
P 의 핵심 내부 메서드( [[Call]], [[Construct]] 제외)를 10.5 에 지정된 정의로 설정.
ECMAScript source text는 유니코드 코드 포인트들의 시퀀스이다. ECMAScript 문법이 허용하는 위치에서는 U+0000 부터 U+10FFFF 까지의 모든 유니코드 코드 포인트 값(서러게이트 코드 포인트 포함)이 ECMAScript 소스 텍스트에 나타날 수 있다. ECMAScript 소스 텍스트를 저장·교환하는 실제 인코딩은 이 명세와 무관하다. 외부 소스 텍스트 인코딩이 무엇이든, 적합한 ECMAScript 구현은 소스 텍스트를 동등한 SourceCharacter 값들의 시퀀스로 처리하며, 각 SourceCharacter 는 하나의 유니코드 코드 포인트이다. 적합한 ECMAScript 구현은 소스 텍스트에 대해 어떤 정규화(normalization)를 수행할 필요도 없으며 정규화를 수행하는 것처럼 동작할 필요도 없다.
결합 문자 시퀀스(combining character sequence)의 구성 요소들은 사용자가 전체를 단일 문자로 생각할지라도 개별 유니코드 코드 포인트로 취급된다.
Note
문자열 리터럴, 정규 표현식 리터럴, 템플릿 리터럴 및 식별자에서 모든 유니코드 코드 포인트는 해당 코드 포인트의 수치 값을 명시적으로 표현하는 유니코드 이스케이프 시퀀스로도 표현할 수 있다. 주석 안에서는 그러한 이스케이프 시퀀스는 주석 일부로서 사실상 무시된다.
ECMAScript 는 유니코드 이스케이프 시퀀스 동작에서 Java 프로그래밍 언어와 다르다. 예를 들어 Java 프로그램에서 유니코드 이스케이프 시퀀스 \u000A 가 단일 행 주석 내에 나타나면 그것은 행 종결자(유니코드 코드 포인트 U+000A 는 LINE FEED (LF))로 해석되어 다음 코드 포인트는 더 이상 주석의 일부가 아니다. 마찬가지로 Java 프로그램의 문자열 리터럴에 \u000A 가 나타나면 그것 역시 행 종결자로 해석되며 문자열 리터럴 내부에는 허용되지 않는다—문자열 값에 LINE FEED (LF)를 포함하려면 \u000A 대신 \n 을 써야 한다. ECMAScript 프로그램에서는 주석 내부에 나타나는 유니코드 이스케이프 시퀀스가 절대 해석되지 않으며 따라서 주석 종료에 기여할 수 없다. 유사하게 ECMAScript 프로그램의 문자열 리터럴 내부에 나타나는 유니코드 이스케이프 시퀀스는 항상 리터럴의 일부로 기여하고 결코 행 종결자나 문자열 리터럴을 종료시킬 수 있는 코드 포인트로 해석되지 않는다.
11.1.1
정적 의미론(Static Semantics): UTF16EncodeCodePoint (
cp: a Unicode code point,
): a String
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
단언: 0 ≤ cp ≤ 0x10FFFF.
cp ≤ 0xFFFF 이면, 수치 값이 cp 인 코드 유닛으로 구성된 String 값을 반환한다.
cu1 를 수치 값이 floor((cp - 0x10000) / 0x400) + 0xD800 인 코드 유닛으로 둔다.
cu2 를 수치 값이 ((cp - 0x10000) modulo 0x400) + 0xDC00 인 코드 유닛으로 둔다.
11.1.2
정적 의미론(Static Semantics): CodePointsToString (
text: a sequence of Unicode code points,
): a String
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 이는 6.1.4 에 설명된 대로 text 를 String 값으로 변환한다. It performs the following steps when called:
result 를 빈 문자열로 둔다.
text 의 각 코드 포인트 cp 에 대해
result 를 result 와 UTF16EncodeCodePoint(cp) 의 문자열 연결로 설정한다.
result 를 반환한다.
11.1.3
정적 의미론(Static Semantics): UTF16SurrogatePairToCodePoint (
lead: a code unit,
trail: a code unit,
): a code point
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. UTF-16 서로게이트 쌍을 이루는 두 코드 유닛을 코드 포인트로 변환한다. It performs the following steps when called:
단언: lead 는 선행 서로게이트이고 trail 은 후행 서로게이트이다.
cp 를 (lead - 0xD800) × 0x400 + (trail - 0xDC00) + 0x10000 으로 둔다.
코드 포인트 cp 를 반환한다.
11.1.4
정적 의미론(Static Semantics): CodePointAt (
string: a String,
position: a non-negative integer,
): a Record with fields [[CodePoint]] (a code point), [[CodeUnitCount]] (a positive integer), and [[IsUnpairedSurrogate]] (a Boolean)
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 6.1.4 에 설명된 대로 string 을 UTF-16 인코딩된 코드 포인트 시퀀스로 해석하고, 인덱스 position 에 있는 코드 유닛에서 시작하는 단일 코드 포인트를 읽는다. It performs the following steps when called:
size 를 string 길이로 둔다.
단언: position ≥ 0 그리고 position < size.
first 를 string 내 인덱스 position 의 코드 유닛으로 둔다.
cp 를 수치 값이 first 의 수치 값인 코드 포인트로 둔다.
first 가 선행 서로게이트도 후행 서로게이트도 아니면
Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: false } 를 반환한다.
first 가 후행 서로게이트이거나 position + 1 = size 이면
Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true } 를 반환한다.
second 를 string 내 인덱스 position + 1 의 코드 유닛으로 둔다.
second 가 후행 서로게이트가 아니면
Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 1, [[IsUnpairedSurrogate]]: true } 를 반환한다.
cp 를 UTF16SurrogatePairToCodePoint(first, second) 로 설정한다.
Record { [[CodePoint]]: cp, [[CodeUnitCount]]: 2, [[IsUnpairedSurrogate]]: false } 를 반환한다.
11.1.5
정적 의미론(Static Semantics): StringToCodePoints (
string: a String,
): a List of code points
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 6.1.4 에 설명된 대로 string 을 UTF-16 인코딩된 유니코드 텍스트로 해석하여 얻어지는 유니코드 코드 포인트 시퀀스를 반환한다. It performs the following steps when called:
position 을 position + cp.[[CodeUnitCount]] 로 설정한다.
codePoints 를 반환한다.
11.1.6
정적 의미론(Static Semantics): ParseText (
sourceText: a String or a sequence of Unicode code points,
goalSymbol: a nonterminal in one of the ECMAScript grammars,
): a Parse Node or a non-empty List of SyntaxError objects
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
sourceText 가 String 이면 sourceText 를 StringToCodePoints(sourceText) 로 설정한다.
goalSymbol 을 목표 심볼(goal symbol)로 사용하여 sourceText 를 파싱하고, 파싱 결과를 조기 오류(early error) 조건이 있는지 분석한다. 파싱과 조기 오류 검출은 구현 정의 방식으로 상호 교차(interleaved)될 수 있다.
파싱이 성공했고 조기 오류가 발견되지 않았다면, 파싱에서 생성된 파스 트리의 루트에 있는 Parse Node ( goalSymbol 의 인스턴스) 를 반환한다.
그렇지 않으면, 파싱 오류 및/또는 조기 오류를 나타내는 하나 이상의 SyntaxError 객체들의 List 를 반환한다. 둘 이상의 파싱 오류 또는 조기 오류가 있을 경우, 리스트 내 오류 객체의 수와 순서는 구현 정의이지만 최소 하나는 있어야 한다.
Note 1
특정 지점에 조기 오류가 있고 이후 지점에 구문 오류가 있는 텍스트를 생각해보자. 파싱 후 조기 오류 패스를 수행하는 구현은 구문 오류를 보고하고 조기 오류 패스로 진행하지 않을 수 있다. 두 활동을 교차 수행하는 구현은 조기 오류를 보고하고 구문 오류 탐지를 진행하지 않을 수 있다. 세 번째 구현은 두 오류를 모두 보고할 수 있다. 이 모든 동작은 적합하다.
Eval code 는 내장 eval 함수에 제공되는 소스 텍스트이다. 더 정확히 말해 내장 eval 함수의 매개변수가 String 이면 ECMAScript Script 로 취급된다. 특정 eval 호출에 대한 eval code 는 그 Script 의 global code 부분이다.
Function code 는 일반적으로 Function Definitions (15.2), Arrow Function Definitions (15.3), Method Definitions (15.4), Generator Function Definitions (15.5), Async Function Definitions (15.8), Async Generator Function Definitions (15.6), Async Arrow Functions (15.9) 의 본문으로 제공된다. Function code 는 또한 Function 생성자 (20.2.1.1), GeneratorFunction 생성자 (27.3.1.1), AsyncFunction 생성자 (27.7.1.1), AsyncGeneratorFunction 생성자 (27.4.1.1) 의 인자에서 파생된다.
Note 2
function code 에 BindingIdentifier 를 포함하는 실질적 효과는 주변 코드가 strict 모드 코드가 아니더라도 함수 본문에 "use strict" 지시문을 포함하는 함수 이름인 BindingIdentifier 에 strict 모드 코드의 Early Errors 가 적용되게 한다.
11.2.1 지시문 프로로그와 Use Strict 지시문(Directive Prologues and the Use Strict Directive)
strict mode code 가 아닌 ECMAScript 코드는 non-strict code 라고 한다.
11.2.2.1
정적 의미론(Static Semantics): IsStrict (
node: a Parse Node,
): a Boolean
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It performs the following steps when called:
node 가 매치한 소스 텍스트가 strict mode code 이면 true 반환; 그렇지 않으면 false 반환.
11.2.3 비 ECMAScript 함수(Non-ECMAScript Functions)
ECMAScript 구현은 평가 동작이 ECMAScript 소스 텍스트가 아닌 호스트 정의 실행 가능 코드 형태로 표현된 함수 이그조틱 객체의 평가를 지원할 수 있다. 함수 객체가 ECMAScript 코드 내에서 정의되었는지 또는 내장 함수인지 여부는 그러한 함수 객체를 호출하거나 그에 의해 호출되는 ECMAScript 코드의 관점에서는 관측할 수 없다.
12 ECMAScript 언어: 어휘 문법( Lexical Grammar )
ECMAScript Script 또는 Module 의 소스 텍스트는 먼저 입력 요소들의 시퀀스로 변환되는데, 이는 토큰(token), 줄 종결자(line terminator), 주석(comment), 또는 공백(white space)이다. 소스 텍스트는 왼쪽에서 오른쪽으로 스캔되며, 매번 가능한 한 가장 긴 코드 포인트 시퀀스를 다음 입력 요소로 선택한다.
여러 어휘 목표를 사용하는 것은 자동 세미콜론 삽입에 영향을 주는 어휘적 모호성이 없도록 보장한다. 예를 들어 선행 division 또는 division-assignment 와 선행 RegularExpressionLiteral 이 동시에 허용되는 구문 문맥은 존재하지 않는다. 이는 세미콜론 삽입 (12.10) 에 의해 영향을 받지 않는다. 다음 예와 같이:
a = b
/hi/g.exec(c).map(d);
LineTerminator 뒤의 첫 공백·주석이 아닌 코드 포인트가 U+002F (SOLIDUS) 이고, 구문 문맥이 division 또는 division-assignment 를 허용한다면, 해당 LineTerminator 위치에는 세미콜론이 삽입되지 않는다. 즉, 위 예는 다음과 동일하게 해석된다:
12.1 유니코드 서식 제어 문자(Unicode Format-Control Characters)
유니코드 서식 제어 문자(즉, 유니코드 문자 데이터베이스 범주 “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 내부에 나타날 수 있으며 그 경우 리터럴 값의 일부를 구성하는 의미 있는(code point)로 간주된다. Comment 내부에도 나타날 수 있지만 그 밖의 다른 종류의 토큰 내부에는 나타날 수 없다.
공백 코드 포인트와 마찬가지로 줄 종결자 코드 포인트는 소스 텍스트 가독성을 높이고 토큰을 서로 분리한다. 그러나 공백 코드 포인트와 달리 줄 종결자는 구문 문법 동작에 일부 영향을 준다. 일반적으로 줄 종결자는 임의의 두 토큰 사이에 나타날 수 있지만, 구문 문법이 금지하는 몇몇 위치에는 나타날 수 없다. 줄 종결자는 자동 세미콜론 삽입 과정(12.10)에도 영향을 준다. 줄 종결자는 StringLiteral, Template, TemplateSubstitutionTail 을 제외한 어떤 토큰 내부에도 나타날 수 없다. <LF> 및 <CR> 줄 종결자는 LineContinuation 의 일부가 아닌 한 StringLiteral 토큰 내부에 나타날 수 없다.
Table 34 의 유니코드 코드 포인트만 줄 종결자로 취급된다. 다른 개행(new line) 또는 줄 분리(line breaking) 유니코드 코드 포인트는 줄 종결자로 취급되지 않지만 Table 33 에 명시된 요구를 만족하면 공백으로 취급된다. 시퀀스 <CR><LF> 는 일반적으로 하나의 줄 종결자로 사용된다. 행 번호 보고 목적으로는 단일 SourceCharacter 로 간주해야 한다.
단일 행 주석은 LineTerminator 코드 포인트를 제외한 임의의 유니코드 코드 포인트를 포함할 수 있고, 토큰은 항상 가능한 한 가장 길게 인식된다는 일반 규칙 때문에, 단일 행 주석은 // 마커로부터 그 줄 끝까지의 모든 코드 포인트로 구성된다. 단, 줄 끝의 LineTerminator 는 단일 행 주석의 일부로 간주되지 않으며 어휘 문법에 의해 별도로 인식되어 구문 문법을 위한 입력 요소 스트림의 일부가 된다. 이 점은 단일 행 주석의 존재 여부가 자동 세미콜론 삽입 과정 (12.10) 에 영향을 주지 않음을 의미하므로 매우 중요하다.
IdentifierName 과 ReservedWord 는 Unicode Standard Annex #31 (Identifier and Pattern Syntax)에 규정된 기본 식별자 문법(Default Identifier Syntax)을 (소규모 수정과 함께) 따른 토큰이다. ReservedWord 는 IdentifierName 의 열거된 부분집합이다. 구문 문법은 Identifier 를 IdentifierName 이면서 ReservedWord 가 아닌 것으로 정의한다. 유니코드 식별자 문법은 유니코드 표준이 규정한 문자 속성에 기반한다. 최신 유니코드 표준 버전에 지정된 범주의 유니코드 코드 포인트는 모든 적합 ECMAScript 구현에서 그 범주에 속한 것으로 취급되어야 한다. ECMAScript 구현은 추후판 유니코드 표준에서 정의된 식별자 코드 포인트를 추가로 인식할 수 있다.
Note 1
본 표준은 특정 코드 포인트 추가를 지정한다: U+0024 (DOLLAR SIGN) 과 U+005F (LOW LINE)는 IdentifierName 내 어디서든 허용된다.
키워드(keyword) 는 IdentifierName 에 매칭되면서 구문적 용도를 가지는 토큰, 즉 어떤 구문 생성물에 고정폭(fixed width) 글꼴로 문자 그대로 등장하는 토큰이다. ECMAScript 키워드에는 if, while, async, await 등 다수가 포함된다.
예약어(reserved word) 는 식별자로 사용할 수 없는 IdentifierName 이다. 다수 키워드는 예약어이지만 아닌 것도 있으며 어떤 것은 특정 문맥에서만 예약된다. if, while 은 항상 예약어이다. await 는 async 함수 및 모듈 내부에서만 예약된다. async 는 예약되지 않으며 제한 없이 변수 이름이나 레이블로 사용할 수 있다.
이 명세는 문법 생성물과 조기 오류 규칙을 조합하여 어떤 이름이 유효한 식별자이고 어떤 것이 예약어인지 지정한다. 아래 ReservedWord 목록의 모든 토큰( await, yield 제외)은 무조건 예약된다. await, yield 예외는 매개변수화된 구문 생성물을 사용하는 13.1 에서 지정된다. 마지막으로 여러 조기 오류 규칙이 유효한 식별자 집합을 제한한다. 13.1.1, 14.3.1.1, 14.7.5.1, 15.7.1 참조. 요약하면 식별자 이름은 다섯 범주로 나뉜다:
Math, window, toString, _ 처럼 항상 식별자로 허용되고 키워드가 아닌 것;
await, yield 를 제외한 아래 ReservedWord 들처럼 결코 식별자로 허용되지 않는 것;
await, yield 처럼 문맥적으로 식별자로 허용되는 것;
strict 모드 코드에서 문맥적으로 식별자로 허용되지 않는 것: let, static, implements, interface, package, private, protected, public;
as, async, from, get, meta, of, set, target 처럼 항상 식별자로 허용되지만 특정 구문 생성물 안에서 Identifier 가 허용되지 않는 위치에 키워드로 나타나기도 하는 것.
조건부 키워드 또는 문맥적 키워드(contextual keyword) 라는 용어는 마지막 세 범주에 속해 어떤 문맥에서는 식별자, 다른 문맥에서는 키워드로 쓰일 수 있는 키워드를 가리킬 때 사용되기도 한다.
문자열 리터럴은 작은따옴표 또는 큰따옴표로 둘러싸인 0개 이상의 유니코드 코드 포인트이다. 유니코드 코드 포인트는 이스케이프 시퀀스로도 표현할 수 있다. 닫는 따옴표 코드 포인트, U+005C (REVERSE SOLIDUS), U+000D (CR), U+000A (LF)를 제외한 모든 코드 포인트는 문자열 리터럴 안에 그대로 나타날 수 있다. 어떤 코드 포인트든 이스케이프 시퀀스 형태로 나타날 수 있다. 문자열 리터럴은 ECMAScript String 값을 평가 결과로 가진다. 이러한 String 값을 생성할 때 유니코드 코드 포인트는 11.1.1 에 정의된 대로 UTF-16 으로 인코딩된다. 기본 다국어 평면(BMP)의 코드 포인트는 하나의 코드 유닛으로, 그 밖의 코드 포인트는 두 코드 유닛으로 인코딩된다.
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 템플릿 리터럴 구성 요소는 TV 에 의해 String 타입 값으로 해석된다(TV 는 템플릿 객체의 인덱스된 값 목록—template values—구성에 사용). TV 에서는 이스케이프 시퀀스가 해당 유니코드 코드 포인트의 UTF-16 코드 유닛(들)로 치환된다.
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. 템플릿 리터럴 구성 요소는 TRV 에 의해 String 값으로 해석(템플릿 raw 값 구성). TRV 는 TV 와 유사하지만 이스케이프 시퀀스를 그대로(문자열 상 표기 그대로) 반영한다.
The TRV of SingleEscapeCharacter::one of'"\bfnrtv is the result of performing UTF16EncodeCodePoint on the single code point matched by this production.
The TRV of HexDigit::one of0123456789abcdefABCDEF is the result of performing UTF16EncodeCodePoint on the single code point matched by this production.
The TRV of LineTerminatorSequence::<LF> is the String value consisting of the code unit 0x000A (LINE FEED).
The TRV of LineTerminatorSequence::<CR> is the String value consisting of the code unit 0x000A (LINE FEED).
The TRV of LineTerminatorSequence::<LS> is the String value consisting of the code unit 0x2028 (LINE SEPARATOR).
The TRV of LineTerminatorSequence::<PS> is the String value consisting of the code unit 0x2029 (PARAGRAPH SEPARATOR).
The TRV of LineTerminatorSequence::<CR><LF> is the String value consisting of the code unit 0x000A (LINE FEED).
Note
TV 는 LineContinuation 의 코드 유닛을 제외하지만 TRV 는 포함한다. <CR><LF>, <CR> 줄 종결 시퀀스는 TV 와 TRV 모두에서 <LF> 로 정규화된다. <CR> 또는 <CR><LF> 를 원형(raw) 그대로 포함하려면 명시적 TemplateEscapeSequence 가 필요하다.
12.10 자동 세미콜론 삽입(Automatic Semicolon Insertion)
대부분의 ECMAScript 문과 선언은 세미콜론으로 종료되어야 하며, 그 세미콜론은 항상 소스에 명시적으로 쓸 수 있다. 편의를 위해 특정 상황에서는 세미콜론을 생략할 수 있으며, 이 상황에서는 세미콜론이 소스 코드 토큰 스트림에 자동 삽입된다고 기술한다.
12.10.1 자동 세미콜론 삽입 규칙(Rules of Automatic Semicolon Insertion)
다음 규칙에서 “토큰(token)” 은 12 에 설명된 현재 어휘 목표 심볼을 사용해 실제로 인식된 어휘 토큰을 뜻한다.
세 가지 기본 규칙은 다음과 같다:
왼쪽에서 오른쪽으로 파싱 중 문법의 어떤 생성물에도 허용되지 않는 토큰(“오류 토큰(offending token)”)을 만났을 때, 아래 조건 중 하나 이상이 참이면 그 토큰 앞에 세미콜론을 자동 삽입한다:
이전 토큰이 ) 이고 삽입된 세미콜론이 do-while 문(14.7.2) 종료 세미콜론으로 파싱될 수 있음.
입력 토큰 스트림 끝에 도달했고 파서가 목표 비단말의 단일 인스턴스로 파싱할 수 없다면 입력 스트림 끝에 세미콜론을 자동 삽입.
문법 생성물 중 제한 생성물(restricted production) 에 허용되는 토큰이지만 생성물 내 “[no LineTerminator here]” 주석 바로 뒤 등장할 수 있는 첫 토큰(제한 토큰)이며 그 제한 토큰이 이전 토큰과 하나 이상의 LineTerminator 로 분리되어 있다면 제한 토큰 앞에 세미콜론 자동 삽입.
그러나 추가 최우선 조건이 있다: 세미콜론이 빈 문(empty statement)으로 파싱되거나 for 문의 두 세미콜론 중 하나가 되게 하는 경우에는 자동 삽입되지 않는다 (14.7.4 참조).
ArrayLiteral 은 0 개 이상 표현식(각각 배열 요소를 나타냄) 리스트를 대괄호로 둘러 배열 초기화를 기술하는 표현식이다. 요소는 리터럴일 필요가 없으며 배열 이니셜라이저가 평가될 때마다 평가된다.
배열 요소는 목록의 시작·중간·끝에서 생략(elide)될 수 있다. 요소 목록에서 쉼표 앞에 AssignmentExpression 이 없을 때(즉, 시작의 쉼표나 또 다른 쉼표 뒤) 빠진 요소는 배열 length 에 기여하며 이후 요소의 인덱스를 증가시킨다. 생략된 요소는 정의되지 않는다. 배열 끝에서 생략된 요소는 length 에 기여하지 않는다.
한 realm 의 프로그램 코드 내 각 TemplateLiteral 은 태그드 템플릿 (13.2.8.6) 평가에 사용되는 고유한 템플릿 객체와 연관된다. 템플릿 객체는 freeze 되고 동일 템플릿이 평가될 때마다 같은 객체가 재사용된다. 지연 생성 또는 사전 생성 여부는 구현 선택이며 관측 불가.
Note 3
향후 판에서 템플릿 객체의 비열거(non-enumerable) 프로퍼티가 추가로 정의될 수 있다.
13.2.8.5 런타임 의미론: SubstitutionEvaluation : ECMAScript 값 List 를 담는 정상 완료 또는 abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS. It is defined piecewise over the following productions:
The abstract operation EvaluatePropertyAccessWithExpressionKey takes arguments baseValue (an ECMAScript language value), expression (an Expression Parse Node), and strict (a Boolean) and returns 정상 완료 시 Reference Record 또는 abrupt completion. It performs the following steps when called:
propertyNameReference 를 expression 의 Evaluation 결과 (?) 로 둔다.
propertyNameValue 를 ? GetValue(propertyNameReference) 로 둔다.
NOTE: 대부분 경우 이 단계 직후 propertyNameValue 에 대해 ToPropertyKey 가 수행된다. 그러나 a[b] = c 의 경우 c 평가 이후에 수행된다.
Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyNameValue, [[Strict]]: strict, [[ThisValue]]: empty } 를 반환한다.
The abstract operation EvaluatePropertyAccessWithIdentifierKey takes arguments baseValue (an ECMAScript language value), identifierName (an IdentifierName Parse Node), and strict (a Boolean) and returns Reference Record. It performs the following steps when called:
propertyNameString 을 identifierName 의 StringValue 로 둔다.
Reference Record { [[Base]]: baseValue, [[ReferencedName]]: propertyNameString, [[Strict]]: strict, [[ThisValue]]: empty } 를 반환한다.
The abstract operation EvaluateCall takes arguments func (an ECMAScript language value), ref (an ECMAScript language value or a Reference Record), arguments (a Parse Node), and tailPosition (a Boolean) and returns 정상 완료 시 ECMAScript 언어 값 또는 abrupt completion. It performs the following steps when called:
The abstract operation MakeSuperPropertyReference takes arguments actualThis (an ECMAScript language value), propertyKey (an ECMAScript language value), and strict (a Boolean) and returns Super Reference Record. It performs the following steps when called:
The abstract operation EvaluateImportCall takes argument specifierExpression (a Parse Node) and optional argument optionsExpression (a Parse Node) and returns 정상 완료 시 Promise 또는 abrupt completion. It performs the following steps when called:
The abstract operation ContinueDynamicImport takes arguments promiseCapability (a PromiseCapability Record) and moduleCompletion (Module Record 를 담는 정상 completion 또는 throw completion) and returns unused. import() 호출로 시작된 동적 import 과정을 마무리하여, 해당 호출이 반환한 promise 를 적절히 이행(resolve) 또는 거부(reject)한다. It performs the following steps when called:
The host-defined abstract operation HostGetImportMetaProperties takes argument moduleRecord (a Module Record) and returns [[Key]] (property key), [[Value]] (ECMAScript 언어 값) 필드를 가진 Record 들의 List. 호스트가 import.meta 로부터 반환되는 객체에 대한 프로퍼티 키와 값을 제공할 수 있게 한다.
HostGetImportMetaProperties 의 기본 구현은 새 빈 List 를 반환한다.
The host-defined abstract operation HostFinalizeImportMeta takes arguments importMeta (an Object) and moduleRecord (a Module Record) and returns unused. 호스트가 import.meta 로부터 반환되는 객체를 ECMAScript 코드에 노출하기 전에 추가 작업을 수행할 수 있게 한다.
대부분 호스트는 HostGetImportMetaProperties 를 정의하고 HostFinalizeImportMeta 는 기본 동작을 그대로 둘 수 있다. 그러나 HostFinalizeImportMeta 는 노출 전에 객체를 직접 조작해야 하는 호스트를 위한 “escape hatch” 를 제공한다.
delete 연산자가 strict 모드 코드 안에 나타나고 그 UnaryExpression 이 변수, 함수 인자, 함수 이름에 대한 직접 참조이면 SyntaxError 예외가 발생한다. 또한 strict 모드 코드에서 delete 가 발생하고 삭제하려는 프로퍼티가 { [[Configurable]]: false } 속성을 가지거나(또는 삭제 불가) 하면 TypeError 예외가 발생한다.
Note 2
4.c 단계에서 생성될 수 있는 객체는 위 추상 연산 및 보통 객체 [[Delete]] 내부 메서드 외부에서는 접근할 수 없다. 구현은 실제 객체 생성을 회피할 수도 있다.
The abstract operation InstanceofOperator takes arguments V (an ECMAScript language value) and target (an ECMAScript language value) and returns Boolean 을 담는 정상 완료 또는 throw completion. target 의 %Symbol.hasInstance% 메서드를 조회하거나, 없다면 target 의 "prototype" 프로퍼티 값이 V 의 프로토타입 체인에 존재하는지 확인하여 V 가 target 의 인스턴스인지 결정하는 일반 알고리즘을 구현한다. It performs the following steps when called:
동등 연산자는 항상 추이적(transitive)이지는 않다. 예를 들어 동일한 String 값을 나타내는 서로 다른 두 String 객체가 있을 수 있고, 각 객체는 == 연산자에 의해 그 String 값과는 같지만 서로는 같지 않을 수 있다. 예:
new String("a") == "a" 및 "a" == new String("a") 는 둘 다 true.
new String("a") == new String("a") 는 false.
Note 4
문자열 비교는 코드 유닛 값 시퀀스의 단순 동등성 검사만을 사용한다. 유니코드 명세에 정의된 더 복잡하고 의미 지향적인 문자/문자열 동등성 또는 정렬 순서를 사용하지 않는다. 따라서 유니코드 표준에 따라 정규적으로 동등한 String 값이라도 서로 다르다고 나올 수 있다. 사실상 이 알고리즘은 두 String 이 이미 정규화(normalized)되어 있다고 가정한다.
ECMAScript 의 ConditionalExpression 문법은 C 및 Java 와 약간 다르다. C 와 Java 는 두 번째 부분식을 Expression 으로 허용하지만 세 번째 부분식을 ConditionalExpression 으로 제한한다. ECMAScript 에서 이러한 차이를 둔 동기는 (1) 조건부의 어느 한 쪽 (arm) 에서도 할당 표현식을 다룰 수 있게 하고 (2) 가운데 표현식이 쉼표 표현식인 혼란스럽고 거의 쓸모없는 경우를 제거하기 위함이다.
이 표현식이 strict 모드 코드 내에 나타날 때 단계 1.e, 3, 2, 2, 2 의 lRef 가 해석 불가능한(unresolvable) reference 이면 런타임 오류이며 ReferenceError 예외가 발생한다. 또한 단계 9, 6, 6, 6 의 lRef 가 { [[Writable]]: false } 특성을 가진 데이터 프로퍼티, { [[Set]]: undefined } 특성을 가진 접근자 프로퍼티, 또는 IsExtensible 가 false 를 반환하는 객체의 존재하지 않는 프로퍼티라면 TypeError 예외가 발생한다.
The abstract operation ApplyStringOrNumericBinaryOperator takes arguments lVal (an ECMAScript language value), opText (**, *, /, %, +, -, <<, >>, >>>, &, ^, or |), and rVal (an ECMAScript language value) and returns 정상 완료 시 String, BigInt 또는 Number 중 하나 또는 throw completion. It performs the following steps when called:
단계 1.a, 1.b 의 ToPrimitive 호출에는 hint 가 제공되지 않는다. 표준 객체 중 Date 를 제외한 모든 객체는 hint 부재를 number 가 주어진 것처럼 처리하고 Date 는 string 처럼 처리한다. 특수(exotic) 객체는 다른 방식으로 처리할 수 있다.
Note 2
단계 1.c 는 IsLessThan 알고리즘의 단계 3 와 달리 논리 AND 대신 논리 OR 를 사용한다.
The abstract operation EvaluateStringOrNumericBinaryExpression takes arguments leftOperand (a Parse Node), opText (a sequence of Unicode code points), and rightOperand (a Parse Node) and returns 정상 완료 시 String, BigInt 또는 Number 중 하나 또는 abrupt completion. It performs the following steps when called:
The abstract operation BlockDeclarationInstantiation takes arguments code (a Parse Node) and env (a Declarative Environment Record) and returns unused. code 는 블록 본문에 대응하는 Parse Node 이며, env 는 바인딩이 생성될 Environment Record 이다.
The abstract operation LoopContinues takes arguments completion (a Completion Record) and labelSet (a List of Strings) and returns a Boolean. It performs the following steps when called:
The abstract operation ForBodyEvaluation takes arguments test (an Expression Parse Node or empty), increment (an Expression Parse Node or empty), stmt (a Statement Parse Node), perIterationBindings (a List of Strings), and labelSet (a List of Strings) and returns 정상 완료 시 ECMAScript 값 또는 abrupt completion. It performs the following steps when called:
The abstract operation CreatePerIterationEnvironment takes argument perIterationBindings (a List of Strings) and returns 정상 완료 시 unused 또는 throw completion. It performs the following steps when called:
14.7.5.3 런타임 의미론: ForDeclarationBindingInitialization : 정상 완료 시 unused 또는 abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
environment 로 undefined 가 전달되면 PutValue 로 초기화해야 함을 의미한다. 이는 var 문 및 일부 비엄격 함수의 매개변수 리스트 경우 ( 10.2.11 참조 )에 해당한다. 그 경우 렉시컬 바인딩이 초기화자 평가 전 호이스팅·사전 초기화된다.
It is defined piecewise over the following productions:
The abstract operation ForIn/OfHeadEvaluation takes arguments uninitializedBoundNames (a List of Strings), expr (an Expression Parse Node or an AssignmentExpression Parse Node), and iterationKind (enumerate, iterate, or async-iterate) and returns 정상 완료 시 Iterator Record 또는 abrupt completion. It performs the following steps when called:
The abstract operation ForIn/OfBodyEvaluation takes arguments lhs (a Parse Node), stmt (a Statement Parse Node), iteratorRecord (an Iterator Record), iterationKind (enumerate or iterate), lhsKind (assignment, var-binding, or lexical-binding), and labelSet (a List of Strings) and optional argument iteratorKind (sync or async) and returns 정상 완료 시 ECMAScript 값 또는 abrupt completion. It performs the following steps when called:
The abstract operation EnumerateObjectProperties takes argument O (an Object) and returns iterator 객체. It performs the following steps when called:
O 의 열거 가능한 프로퍼티 중 String 키를 순회하는 next 메서드를 가진 iterator 객체를 반환한다. 이 객체는 ECMAScript 코드에서 직접 접근 불가하다. 순서 및 메커니즘은 아래 규칙을 준수해야 한다.
이 iterator 의 throw, return 메서드는 null 이며 호출되지 않는다. next 메서드는 프로퍼티 키 반환 여부를 결정한다. 반환 키에는 Symbol 키 미포함. 대상 객체의 프로퍼티는 열거 중 삭제될 수 있으며 삭제된 프로퍼티는 무시된다. 열거 중 추가된 프로퍼티는 반드시 처리된다고 보장되지 않는다. 한 프로퍼티 이름은 하나의 열거에서 최대 한 번만 반환된다.
대상 객체 프로퍼티 열거에는 프로토타입 사슬의 프로퍼티도 재귀적으로 포함되지만, 이미 반환된 이름과 동일한 프로토타입 프로퍼티는 무시된다. [[Enumerable]] 값 비교는 중복 판단에 사용되지 않는다. 프로토타입 객체의 열거 가능한 이름은 그 프로토타입을 인수로 EnumerateObjectProperties 를 호출하여 얻어야 한다. 대상 객체의 own keys 는 [[OwnPropertyKeys]] 내부 메서드, 속성 서술자는 [[GetOwnProperty]] 내부 메서드를 통해 얻는다.
구현은 14.7.5.10.2.1 알고리즘을 직접 구현할 필요는 없다. 위 제약 위반 전까지 동등 동작을 유지하는 임의 구현 가능.
다음은 이러한 규칙을 만족하는 ECMAScript generator 함수의 예시(정보적):
function* EnumerateObjectProperties(obj) {
const visited = newSet();
for (const key ofReflect.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 ofEnumerateObjectProperties(proto)) {
if (!visited.has(protoKey)) yield protoKey;
}
}
Note 2
구현이 CreateForInIterator 와 일치할 필요가 없는 exotic 객체 목록은 역사적으로 구현별 차이가 있었던 경우이며 그 외에는 합의된 경우이다.
14.7.5.10 For-In Iterator 객체
For-In Iterator 는 특정 객체에 대한 특정 반복을 나타내는 객체이다. ECMAScript 코드에서 직접 접근할 수 없으며 EnumerateObjectProperties 동작 설명용이다.
14.7.5.10.1 CreateForInIterator ( object )
The abstract operation CreateForInIterator takes argument object (an Object) and returns For-In Iterator. object 의 own 및 상속된 열거 가능한 문자열 프로퍼티를 특정 순서로 순회하는 For-In Iterator 를 생성한다. It performs the following steps when called:
return 문은 함수를 종료하고(대부분 경우) 호출자에게 값을 반환한다. Expression 이 없으면 반환 값은 undefined. 있으면 그 표현식의 값. return 문이 주변 컨텍스트에 따라 실제로 호출자에게 값을 반환하지 않을 수도 있다. 예: try 블록 내 return 의 Completion Record 는 finally 블록 평가 중 다른 Completion Record 로 대체될 수 있다.
The abstract operation CaseClauseIsSelected takes arguments C (a CaseClause Parse Node) and input (an ECMAScript language value) and returns 정상 완료 시 Boolean 또는 abrupt completion. C 가 input 과 일치하는지 결정한다. It performs the following steps when called:
Statement 는 레이블로 접두될 수 있다. 레이블 문은 레이블된 break/continue 와 함께 사용된다. ECMAScript 에는 goto 가 없다. Statement 는 LabelledStatement 의 일부가 될 수 있고 이것이 또 다른 LabelledStatement 의 일부가 되는 식으로 중첩될 수 있다. 이렇게 도입된 레이블 집합을 개별 문 의미론에서 “current label set” 이라 부른다.
FormalParameterList 의 ExpectedArgumentCount 는 나머지(rest) 매개변수 또는 Initializer 를 가진 첫 번째 FormalParameter 의 왼쪽에 있는 FormalParameters 의 개수이다. 초기화자가 있는 첫 매개변수 뒤에 초기화자 없는 매개변수가 올 수 있지만 그러한 매개변수들은 undefined 를 기본값으로 갖는 선택(optional) 매개변수로 간주된다.
ArrowFunction 은 arguments, super, this, new.target 에 대한 지역 바인딩을 정의하지 않는다. ArrowFunction 내부의 이러한 식별자 참조는 렉시컬 외부 환경의 바인딩으로 해석되어야 한다. 일반적으로 이는 바로 둘러싼 함수의 Function Environment 가 된다. 비록 ArrowFunction 이 super 를 포함할 수 있지만 단계 5 에서 생성된 함수 객체는 MakeMethod 를 수행하여 메서드로 만들지 않는다. super 를 참조하는 ArrowFunction 은 항상 비-ArrowFunction 안에 포함되며, super 구현에 필요한 상태는 캡처된 env 를 통해 접근 가능하다.
generator 를 ? OrdinaryCreateFromConstructor(functionObject, "%AsyncGeneratorPrototype%", « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] ») 로 둔다.
generator.[[GeneratorBrand]] 를 empty 로 설정한다.
generator.[[AsyncGeneratorState]] 를 suspended-start 로 설정한다.
15.7.14 런타임 의미론: ClassDefinitionEvaluation: 함수 객체를 포함하는 정상 완료 또는 abrupt completion
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
Note
명세를 쉽게 하기 위해 private 메서드와 접근자는 클래스 인스턴스의 [[PrivateElements]] 슬롯에 private 필드와 함께 포함된다. 그러나 어떤 객체든 특정 클래스가 정의한 private 메서드와 접근자를 모두 가지거나 전혀 가지지 않는다. 이 기능은 구현에서 각 메서드나 접근자를 개별적으로 추적하지 않는 전략을 선택할 수 있도록 설계되었다.
예를 들어, 구현은 인스턴스 private 메서드를 해당 Private Name과 직접 연결하고, 각 객체에 대해 어떤 클래스 생성자가 그 객체를 this 값으로 실행했는지 추적할 수 있다. 객체에서 인스턴스 private 메서드를 조회하는 것은 해당 클래스 생성자가 객체 초기화에 사용되었는지 확인한 다음, Private Name에 연결된 메서드를 반환하는 것으로 구성된다.
이는 private 필드와는 다르다. 필드 초기화자가 클래스 인스턴스화 중에 throw될 수 있으므로, 개별 객체는 해당 클래스의 일부 private 필드만을 가질 수 있으며, private 필드는 일반적으로 개별적으로 추적되어야 한다.
It is defined piecewise over the following productions:
참고: 이 분기는 constructor(...args) { super(...args); }와 유사하게 동작한다. 가장 주목할 만한 차이점은 앞서 언급한 ECMAScript 소스 텍스트가 %Array.prototype%의 %Symbol.iterator% 메서드를 관찰 가능하게 호출하는 반면, 이 함수는 그렇지 않는다는 것이다.
The abstract operation ParseScript takes arguments sourceText (ECMAScript 소스 텍스트), realm (Realm Record), and hostDefined (anything) and returns Script Record 또는 SyntaxError 객체의 비어있지 않은 리스트. It performs the following steps when called:
구현은 해당 스크립트 소스 텍스트에 대해 ParseScript를 평가하기 전에 스크립트 소스 텍스트를 파싱하고 조기 오류 조건을 분석할 수 있다. 그러나 오류 보고는 이 명세가 실제로 해당 소스 텍스트에 대해 ParseScript를 수행하는 시점까지 연기되어야 한다.
16.1.6 ScriptEvaluation ( scriptRecord )
The abstract operation ScriptEvaluation takes argument scriptRecord (Script Record) and returns ECMAScript 언어 값을 포함하는 정상 완료 또는 abrupt completion. It performs the following steps when called:
globalEnv를 scriptRecord.[[Realm]].[[GlobalEnv]]로 둔다.
16.1.1에 명시된 조기 오류는 function/var 선언과 let/const/class 선언 간의 이름 충돌뿐만 아니라 단일 Script 내에 포함된 선언에 대한 let/const/class 바인딩의 재선언을 방지한다. 그러나 둘 이상의 Script에 걸친 이러한 충돌과 재선언은 GlobalDeclarationInstantiation 중에 런타임 오류로 감지된다. 이러한 오류가 감지되면 스크립트에 대해 바인딩이 인스턴스화되지 않는다. 그러나 전역 객체가 Proxy exotic 객체를 사용하여 정의된 경우 충돌하는 선언에 대한 런타임 테스트가 신뢰할 수 없어 abrupt completion과 일부 전역 선언이 인스턴스화되지 않을 수 있다. 이런 경우 Script의 코드는 평가되지 않는다.
명시적인 var 또는 function 선언과 달리, 전역 객체에서 직접 생성된 속성은 let/const/class 선언에 의해 가려질 수 있는 전역 바인딩을 만든다.
인수 « »를 사용한 ModuleItemList의 ContainsDuplicateLabels가 true이면 구문 오류이다.
인수 « »를 사용한 ModuleItemList의 ContainsUndefinedBreakTarget이 true이면 구문 오류이다.
인수 « »와 « »를 사용한 ModuleItemList의 ContainsUndefinedContinueTarget이 true이면 구문 오류이다.
인수 « »를 사용한 ModuleItemList의 AllPrivateIdentifiersValid가 false이면 구문 오류이다.
Note
중복된 ExportedNames 규칙은 ModuleBody 내에서 여러 export defaultExportDeclaration 항목이 구문 오류임을 의미한다. 충돌하거나 중복된 선언과 관련된 추가 오류 조건은 Module 평가 전에 모듈 링킹 중에 확인된다. 이러한 오류가 감지되면 Module은 평가되지 않는다.
The abstract operation ModuleRequestsEqual takes arguments left (ModuleRequest Record 또는 LoadedModuleRequest Record) and right (ModuleRequest Record 또는 LoadedModuleRequest Record) and returns Boolean. It performs the following steps when called:
left.[[Specifier]]가 right.[[Specifier]]와 같지 않으면 false를 반환한다.
모듈 레코드는 단일 모듈의 가져오기와 내보내기에 대한 구조적 정보를 캡슐화한다. 이 정보는 연결된 모듈 집합의 가져오기와 내보내기를 링크하는 데 사용된다. 모듈 레코드는 모듈을 평가할 때만 사용되는 네 개의 필드를 포함한다.
명세 목적상 Module Record 값은 Record 명세 타입의 값이며, Module Record가 추상 클래스이고 추상 및 구체적 하위 클래스를 모두 가진 간단한 객체 지향 계층 구조에 존재하는 것으로 생각할 수 있다. 이 명세는 Cyclic Module Record라는 추상 하위 클래스와 그 구체적 하위 클래스인 Source Text Module Record를 정의한다. 다른 명세와 구현은 그들이 정의한 대안적인 모듈 정의 기능에 해당하는 추가적인 Module Record 하위 클래스를 정의할 수 있다.
Module Record는 Table 41에 나열된 필드들을 정의한다. 모든 Module Definition 하위 클래스는 적어도 이러한 필드들을 포함한다. Module Record는 또한 Table 42의 추상 메서드 리스트를 정의한다. 모든 Module definition 하위 클래스는 이러한 추상 메서드들의 구체적인 구현을 제공해야 한다.
이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.
ResolveExport(exportName [, resolveSet])
이 모듈에서 내보낸 이름의 바인딩을 반환한다. 바인딩은 { [[Module]]: Module Record, [[BindingName]]: String | namespace } 형태의 ResolvedBinding Record로 표현된다. 내보내기가 어떤 모듈에서도 직접 바인딩이 없는 Module Namespace Object인 경우 [[BindingName]]은 namespace로 설정된다. 이름을 해결할 수 없으면 null을, 여러 바인딩이 발견되면 ambiguous를 반환한다.
특정 exportName, resolveSet 쌍을 인수로 이 연산을 호출할 때마다 동일한 결과를 반환해야 한다.
이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.
이 메서드를 호출하기 전에 LoadRequestedModules가 성공적으로 완료되어야 한다.
Evaluate()
이 모듈과 그 의존성의 평가에 대한 프로미스를 반환하며, 성공적인 평가 시 또는 이미 성공적으로 평가된 경우 해결되고, 평가 오류 시 또는 이미 성공적이지 않게 평가된 경우 거부된다. 프로미스가 거부되면 호스트는 프로미스 거부를 처리하고 평가 오류를 다시 던질 것으로 예상된다.
이 메서드를 호출하기 전에 Link가 성공적으로 완료되어야 한다.
16.2.1.5.1 EvaluateModuleSync ( module )
The abstract operation EvaluateModuleSync takes argument module (Module Record) and returns unused를 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
new, unlinked, linking, linked, evaluating, evaluating-async, 또는 evaluated
초기 값은 new. 모듈 생명주기 진행에 따라 순서대로 unlinked, linking, linked, evaluating, 필요 시 evaluating-async, evaluated 로 전이한다. evaluating-async 는 이 모듈이 비동기 의존성 완료 후 실행 대기열에 들어 있거나, [[HasTLA]] 필드가 true 이어서 실행되었고 최상위 완료를 대기 중임을 나타낸다.
이 Record가 표현하는 모듈이 사용한 지정자 문자열을 (상대 import 속성 집합과 함께) 해석된 Module Record 로 매핑하는 맵. ModuleRequestsEqual(r1, r2)가 true 인 서로 다른 Recordr1, r2 를 두 개 포함하지 않는다.
이 모듈이 어떤 순환의 [[CycleRoot]] 이고 그 순환 내 어떤 모듈에 Evaluate() 가 호출되었다면, 그 전체 평가에 대한 PromiseCapability Record. Evaluate() 추상 메서드가 반환한 Promise 객체 해결에 사용된다. 해당 순환의 의존 모듈들은 최상위 Evaluate() 가 그들에 대해 개시되지 않았다면 empty.
모듈의 실행 컨텍스트 내에서 코드 평가. 이 모듈이 [[HasTLA]] 가 true 이면 PromiseCapability Record 가 인수로 전달되며 메서드는 해당 capability 를 resolve 또는 reject 해야 한다. 이 경우 예외를 throw 하지 말고 필요 시 PromiseCapability Record 를 reject 해야 한다.
The LoadRequestedModules concrete method of Cyclic Module Recordmodule takes optional argument hostDefined (anything) and returns Promise. module 의 의존성 그래프 내 모든 Module Record 의 [[LoadedModules]] 를 채운다(주요 작업은 보조 함수 InnerModuleLoading 이 수행). 선택적 hostDefined 는 HostLoadImportedModule 훅에 전달된다. It performs the following steps when called:
state 를 GraphLoadingState Record { [[IsLoading]]: true, [[PendingModulesCount]]: 1, [[Visited]]: « », [[PromiseCapability]]: pc, [[HostDefined]]: hostDefined } 로 둔다.
hostDefined 매개변수는 import 된 모듈을 가져오는 데 필요한 추가 정보를 전달하는 데 사용할 수 있다. 예를 들어 HTML 은 <link rel="preload" as="..."> 태그에 대한 올바른 fetch destination 설정에 사용한다.
import() 표현식은 hostDefined 를 설정하지 않는다.
The abstract operation InnerModuleLoading takes arguments state (GraphLoadingState Record) and module (Module Record) and returns unused. LoadRequestedModules 가 module 의 의존성 그래프에 대해 실제 로딩을 재귀적으로 수행할 때 사용된다. It performs the following steps when called:
단언: state.[[IsLoading]] 은 true.
module 이 Cyclic Module Record 이고, module.[[Status]] 가 new, 그리고 state.[[Visited]] 가 module 을 포함하지 않으면
module 을 state.[[Visited]] 에 추가한다.
requestedModulesCount 를 module.[[RequestedModules]] 요소 수로 둔다.
state.[[PendingModulesCount]] 를 state.[[PendingModulesCount]] + requestedModulesCount 로 설정.
module.[[RequestedModules]] 의 각 ModuleRequest Recordrequest 에 대해
The abstract operation ContinueModuleLoading takes arguments state (GraphLoadingState Record) and moduleCompletion (Module Record 를 담은 정상 completion 또는 throw completion) and returns unused. HostLoadImportedModule 호출 후 로딩 과정에 재진입할 때 사용된다. It performs the following steps when called:
The Link concrete method of Cyclic Module Recordmodule takes no arguments and returns unused 를 담은 정상 completion 또는 throw completion. 성공 시 이 모듈의 [[Status]] 를 unlinked 에서 linked 로 전이. 실패 시 예외를 던지고 [[Status]] 는 unlinked 유지. (주요 작업은 보조 함수 InnerModuleLinking 수행) It performs the following steps when called:
단언: module.[[Status]] 는 unlinked, linked, evaluating-async, evaluated 중 하나.
단언: module.[[Status]] 는 linked, evaluating-async, 또는 evaluated 중 하나.
단언: stack 은 비어 있음.
unused 반환.
16.2.1.6.1.2.1 InnerModuleLinking ( module, stack, index )
The abstract operation InnerModuleLinking takes arguments module (Module Record), stack (Cyclic Module Record 리스트), and index (음이 아닌 정수) and returns 음이 아닌 정수를 담은 정상 completion 또는 throw completion. Link 가 module 및 의존성 그래프의 다른 모듈들에 대해 실제 링크 과정을 수행. stack 과 index, 그리고 모듈의 [[DFSAncestorIndex]] 는 DFS 탐색 추적에 사용. 특히 [[DFSAncestorIndex]] 로 SCC 를 발견하여 SCC 내 모든 모듈이 함께 linked 로 전이되도록 한다. It performs the following steps when called:
requiredModule 와 module 이 동일 Module Record 이면 done = true.
index 반환.
16.2.1.6.1.3 Evaluate ( )
The Evaluate concrete method of Cyclic Module Recordmodule takes no arguments and returns Promise. Evaluate 는 이 모듈의 [[Status]] 를 linked 에서 evaluating-async 또는 evaluated 로 전이. 동일 SCC 내에서 처음 호출될 때 Promise 를 생성해 모듈 평가 완료 시 resolve. 이 Promise 는 구성 요소 [[CycleRoot]] 의 [[TopLevelCapability]] 에 저장. 이후 SCC 내 어떤 모듈에 대한 Evaluate 호출도 동일 Promise 반환. (주요 작업은 보조 함수 InnerModuleEvaluation 수행) It performs the following steps when called:
단언: 이 Evaluate 호출은 동일 agent 내 다른 Evaluate 호출과 동시에 일어나지 않음.
단언: module.[[Status]] 는 linked, evaluating-async, evaluated 중 하나.
module.[[Status]] 가 evaluating-async 또는 evaluated 이면 module = module.[[CycleRoot]].
16.2.1.6.1.3.1 InnerModuleEvaluation ( module, stack, index )
The abstract operation InnerModuleEvaluation takes arguments module (Module Record), stack (Cyclic Module Record 리스트), and index (음이 아닌 정수) and returns 음이 아닌 정수를 담은 정상 completion 또는 throw completion. Evaluate 가 module 및 의존성 그래프의 다른 모듈에 대해 실제 평가 과정을 수행. stack, index, 그리고 module 의 [[DFSAncestorIndex]] 사용 방식은 InnerModuleLinking 과 동일. It performs the following steps when called:
단언: requiredModule.[[AsyncEvaluationOrder]] 는 정수 또는 unset.
requiredModule.[[AsyncEvaluationOrder]] 가 unset 이면 requiredModule.[[Status]] = evaluated.
아니면 requiredModule.[[Status]] = evaluating-async.
requiredModule 와 module 이 같으면 done = true.
requiredModule.[[CycleRoot]] = module.
index 반환.
Note 1
모듈은 InnerModuleEvaluation 이 순회 중이면 evaluating 상태. [[HasTLA]] 가 true 이거나 비동기 의존성이 있으면 실행 중 evaluating-async, 완료 시 evaluated.
Note 2
비동기 순환의 모듈에 의존하는 모듈은 순환이 evaluating 이 아닐 때 [[CycleRoot]] 를 통해 루트 실행에 의존하도록 하여 순환 상태를 단일 SCC 로 취급 가능하게 한다.
16.2.1.6.1.3.2 ExecuteAsyncModule ( module )
The abstract operation ExecuteAsyncModule takes argument module (Cyclic Module Record) and returns unused. It performs the following steps when called:
단언: module.[[Status]] 는 evaluating 또는 evaluating-async.
The abstract operation GatherAvailableAncestors takes arguments module (Cyclic Module Record) and execList (Cyclic Module Record 리스트) and returns unused. It performs the following steps when called:
The abstract operation AsyncModuleExecutionFulfilled takes argument module (Cyclic Module Record) and returns unused. It performs the following steps when called:
The abstract operation AsyncModuleExecutionRejected takes arguments module (Cyclic Module Record) and error (ECMAScript 언어 값) and returns unused. It performs the following steps when called:
비규범 섹션: 몇 가지 공통 모듈 그래프의 링크 및 평가 예시와 오류 발생 양상에 초점을 둔다.
먼저 다음 단순 모듈 그래프를 보자:
Figure 2: 단순 모듈 그래프
우선 오류 조건이 없다고 가정. 호스트가 처음 A.LoadRequestedModules() 를 호출하면 (가정에 따라) 성공적으로 완료하면서 B, C 의 의존성도 재귀적으로 로드(각각 C 와 없음)하고 A.[[Status]] = B.[[Status]] = C.[[Status]] = unlinked 로 설정. 이후 A.Link() 호출도 성공(가정)하여 세 모듈 모두 linked. 이러한 준비 단계는 언제든 수행 가능. 나중에 호스트가 모듈의 부작용 실행 시점이 되면 A.Evaluate() 호출 → 성공적으로 완료, undefined 로 resolve 되는 Promise 반환(가정), 먼저 C 그다음 B 를 평가. 이 시점에 각 모듈 [[Status]] 는 evaluated.
다음으로 링크 오류 사례: A.LoadRequestedModules() 성공 후 InnerModuleLinking(C) 는 성공하지만 그 뒤 B 에서 실패(예: C 가 제공하지 않는 것을 import). 그러면 원래 A.Link() 가 실패하고 A 와 B 의 [[Status]] 는 unlinked 유지. C 는 linked 로 전이되어 있음.
마지막으로 링크 성공 후 평가 오류: InnerModuleEvaluation(C) 는 성공하지만 그 뒤 B 가 실패(예: B 코드에서 예외). 원래 A.Evaluate() 는 reject 된 Promise 반환으로 실패. 예외는 A, B 의 [[EvaluationError]] 에 기록되고 두 모듈 [[Status]] 는 evaluated. C 도 evaluated 되지만 예외 없이 성공 평가. 예외 저장을 통해 이후 Evaluate() 재호출 시 동일 예외 일관 제공. (호스트는 Cyclic Module Record 재사용 의무 없음; 예외 객체 노출 의무도 없음. 명세는 가능성만 제공.)
평가는 부작용이 있을 수 있어 한 번만 수행해야 하므로(비성공 포함) 이미 수행 여부 기억 필요. (오류 시에도 이후 Evaluate() 마다 새로운 예외 합성 대신 기존 예외 기억이 합리적)
링크는 부작용이 없으므로 실패해도 나중에 재시도 가능
로딩은 호스트와 긴밀히 상호작용하므로 일부 호스트는 실패한 로드 재시도 허용이 바람직(예: 일시적 네트워크 문제)
이제 순환이 있는 그래프:
Figure 4: 순환 모듈 그래프
엔트리 포인트가 A 라 가정하고 호스트가 A.LoadRequestedModules() 호출 → A 에 대해 InnerModuleLoading 수행. 이는 B, C 에 대해 InnerModuleLoading 호출. 순환 때문에 다시 A 에 대해 InnerModuleLoading 트리거되지만 이미 로딩 트리거 되었으므로 no-op. 그래프 모든 모듈 로딩 성공 시 [[Status]] 는 동시에 new → unlinked.
그 후 A.Link() → A 에 대해 InnerModuleLinking → B → 순환으로 다시 A (이미 linking 이므로 no-op). B 는 여전히 linking 상태에서 제어가 A 로 돌아와 C 에 대해 InnerModuleLinking. C 가 linked 후 A, B 가 함께 linking → linked 전이; 이는 SCC 단위 동시 전이를 설계한 것. DFS 로 그래프 순회하므로 가능.
성공 사례에서 평가 단계도 유사.
A 에 링크 오류(예: C 에 존재하지 않는 바인딩 import) 인 경우 위 단계 진행 중 두 번째 InnerModuleLinking(A) 조기 반환 포함. 하지만 원래 InnerModuleLinking(A) 로 되돌아왔을 때 InitializeEnvironment 중 (C.ResolveExport() 직후) 실패, SyntaxError 전파 → A.Link 에서 현재 stack 에 있는(linking) 모듈 상태를 재설정. 따라서 A, B 는 unlinked, C 는 linked 유지.
유사하게 A 평가 오류(예: 코드 예외) 인 경우에도 평가 시퀀스는 비슷. 두 번째 InnerModuleEvaluation(A) 조기 반환 후 원래 InnerModuleEvaluation(A) 로 돌아와 실패. 예외가 A.Evaluate() 로 전파되어 현재 stack (여전히 evaluating) 및 [[AsyncParentModules]] 체인을 따라(상위 top-level await 를 가진 모듈 경유) AsyncModuleExecutionRejected 알고리즘으로 전파. 결과로 A, B 는 evaluated & 예외 기록, C 는 예외 없이 evaluated.
마지막으로 모든 모듈이 비동기 완료하는 순환 그래프:
Figure 5: 비동기 순환 모듈 그래프
로딩과 링크는 이전과 같고 모두 [[Status]] = linked.
A.Evaluate() 는 A, B, D 에 대해 InnerModuleEvaluation 수행 → 모두 evaluating. 다시 A 호출은 no-op. 이때 D.[[PendingAsyncDependencies]] = 0 → ExecuteAsyncModule(D) 호출 → D.ExecuteModule 새 PromiseCapability. B 로 unwind: B.[[PendingAsyncDependencies]] = 1, [[AsyncEvaluationOrder]] = 1. 다시 A 로: A.[[PendingAsyncDependencies]] = 1. 다음 A 의 의존 반복에서 C 평가 → D(no-op), E. E 는 의존 없고 순환 아님 → ExecuteAsyncModule(E) 즉시 호출 & stack 에서 제거. 다시 C 로 unwind: C.[[AsyncEvaluationOrder]] = 3. A 의 의존 루프 종료 후 A.[[AsyncEvaluationOrder]] = 4, SCC 전체 stack 제거하며 모두 evaluating-async. 이 시점 필드는 Table 46 참조.
다음으로 D 완료. AsyncModuleExecutionFulfilled 호출 → D.[[Status]] = evaluated. 실행 가능한 조상은 [[AsyncEvaluationOrder]] 1 의 B, 3 의 C → 순서상 B 먼저 처리: B.[[PendingAsyncDependencies]] = 0 → ExecuteAsyncModule(B) → 실행 시작. C.[[PendingAsyncDependencies]] 도 0 → C 실행 시작( B 에 await 있다면 병렬 가능). 업데이트 필드는 Table 48.
대안: C 가 B 완료 전 오류로 실패. AsyncModuleExecutionRejected 호출 → C.[[Status]] = evaluated, C.[[EvaluationError]] = 오류. 그런 다음 AsyncParentModules 전파. 필드는 Table 52.
Table 52: C 오류 완료 후 필드
필드
모듈
A
C
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
done
done
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
1 (B)
0
[[EvaluationError]]
empty
C 의 평가 오류
C 가 A 에 대해 AsyncModuleExecutionRejected 호출하므로 A 는 동일 오류로 reject. A.[[Status]] = evaluated. A.[[TopLevelCapability]] Promise 는 reject. 필드는 Table 53.
Table 53: A 가 reject 된 후 필드
필드
모듈
A
[[DFSAncestorIndex]]
0
[[Status]]
evaluated
[[AsyncEvaluationOrder]]
done
[[AsyncParentModules]]
« »
[[PendingAsyncDependencies]]
0
[[EvaluationError]]
C 의 Evaluation Error
이후 B 가 오류 없이 완료. AsyncModuleExecutionFulfilled → B.[[Status]] = evaluated. GatherAvailableAncestors(B) 호출. 그러나 A.[[CycleRoot]] = A, 그리고 평가 오류 존재 → sortedExecList 에 추가되지 않고 추가 처리 없이 반환. 이후 B 의 importer 는 cycle root A 의 [[EvaluationError]] 를 통해 reject 를 해석. 필드는 Table 54.
Table 54: 오류 그래프에서 B 완료 후 필드
필드
모듈
A
B
[[DFSAncestorIndex]]
0
0
[[Status]]
evaluated
evaluated
[[AsyncEvaluationOrder]]
4
1
[[AsyncParentModules]]
« »
« A »
[[PendingAsyncDependencies]]
0
0
[[EvaluationError]]
C 의 Evaluation Error
empty
16.2.1.7 소스 텍스트 모듈 레코드
Source Text Module Record 는 Module 목표 기호로 파싱된 ECMAScript 소스 텍스트 (11) 로 정의된 모듈 정보를 나타내는 데 사용된다. 필드는 모듈이 import/export 하는 이름에 대한 요약 정보를 포함하고, 구체 메서드는 이 요약을 사용해 링크 및 평가를 수행한다.
The abstract operation ParseModule takes arguments sourceText (ECMAScript 소스 텍스트), realm (Realm Record), and hostDefined (anything) and returns Source Text Module Record 또는 SyntaxError 객체 비어있지 않은 리스트. sourceText 를 Module 로 파싱한 결과에 기반하여 Source Text Module Record 생성. It performs the following steps when called:
The GetExportedNames concrete method of Source Text Module Recordmodule takes optional argument exportStarSet (Source Text Module Record 리스트) and returns 문자열 리스트. It performs the following steps when called:
The ResolveExport concrete method of Source Text Module Recordmodule takes argument exportName (String) and optional argument resolveSet (Record 리스트 (필드 [[Module]]: Module Record, [[ExportName]]: String)) and returns ResolvedBinding Record, null, 또는 ambiguous.
ResolveExport 는 import 된 바인딩을 실제 정의 모듈과 로컬 바인딩 이름으로 해석. 정의 모듈은 자신 또는 import 된 다른 모듈일 수 있음. resolveSet 은 순환 import/export 경로 탐지를 위해 사용. 동일 Module Record 와 exportName 쌍이 이미 resolveSet 에 있으면 순환. 재귀 호출 전 { module, exportName } 쌍을 추가.
정의 모듈 발견 시 ResolvedBinding Record { [[Module]], [[BindingName]] } 반환(네임스페이스 export 만 있는 경우 [[BindingName]] = namespace). 정의 없거나 순환이면 null, 모호하면 ambiguous.
It performs the following steps when called:
단언: module.[[Status]] 는 new 아님.
resolveSet 없으면 새 빈 리스트.
resolveSet 의 각 Record { [[Module]], [[ExportName]] } r 에 대해
module 과 r.[[Module]] 동일이고 exportName = r.[[ExportName]] 이면
단언: 순환 import 요청.
null 반환.
Record { [[Module]]: module, [[ExportName]]: exportName } 를 resolveSet 에 추가.
The InitializeEnvironment concrete method of Source Text Module Recordmodule takes no arguments and returns unused 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:
The abstract operation CreateDefaultExportSyntheticModule takes argument defaultExport (ECMAScript 언어 값) and returns Synthetic Module Record. defaultExport 를 기본 export 로 하는 Synthetic Module Record 생성. It performs the following steps when called:
The abstract operation ParseJSONModule takes argument source (String) and returns Synthetic Module Record 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:
The abstract operation SetSyntheticModuleExport takes arguments module (Synthetic Module Record), exportName (String), and exportValue (ECMAScript 언어 값) and returns unused. Synthetic Module Record 의 기존 export 값 설정/변경. It performs the following steps when called:
The LoadRequestedModules concrete method of Synthetic Module Recordmodule takes no arguments and returns Promise. It performs the following steps when called:
The GetExportedNames concrete method of Synthetic Module Recordmodule takes no arguments and returns 문자열 리스트. It performs the following steps when called:
module.[[ExportNames]] 반환.
16.2.1.8.4.3 ResolveExport ( exportName )
The ResolveExport concrete method of Synthetic Module Recordmodule takes argument exportName (String) and returns ResolvedBinding Record 또는 null. It performs the following steps when called:
module.[[ExportNames]] 가 exportName 포함하지 않으면 null 반환.
The Link concrete method of Synthetic Module Recordmodule takes no arguments and returns unused 를 담은 정상 completion. It performs the following steps when called:
The abstract operation GetImportedModule takes arguments referrer (Cyclic Module Record) and request (ModuleRequest Record) and returns Module Record. It performs the following steps when called:
records 를 referrer.[[LoadedModules]] 의 각 LoadedModuleRequest Recordr 중 ModuleRequestsEqual(r, request) 이 true 인 것들의 리스트로 둔다.
단언: LoadRequestedModules 가 사전에 성공했으므로 records 는 정확히 한 요소.
실제 과정은 호스트 정의이며 보통 적절한 Module Record 로드에 필요한 I/O 수행. 서로 다른 여러 (referrer, moduleRequest.[[Specifier]], moduleRequest.[[Attributes]]) 삼중 조합이 동일 Module Record 인스턴스에 매핑될 수 있음. 매핑 의미론은 호스트 정의이나 일반적으로 specifier 정규화 포함 (상대/축약 경로 확장 등).
Note 2
위 텍스트는 type: "json" 으로 import 하면 (그리고 HostLoadImportedModule 이 정상 완료) 호스트가 JSON 모듈 지원을 요구하지만 type: "json" 없이 import 할 때 JSON 모듈 지원을 금지하지 않는다.
16.2.1.11 FinishLoadingImportedModule ( referrer, moduleRequest, payload, result )
The abstract operation AllImportAttributesSupported takes argument attributes (ImportAttribute Records 리스트) and returns Boolean. It performs the following steps when called:
supported가 attribute.[[Key]]를 포함하지 않으면 false를 반환한다.
true를 반환한다.
16.2.1.12.1 HostGetSupportedImportAttributes ( )
The host-defined abstract operation HostGetSupportedImportAttributes takes no arguments and returns 문자열 리스트. 호스트 환경이 지원하는 import attribute를 지정할 수 있게 한다. 지원되는 키를 가진 attribute만 호스트에 제공된다.
HostGetSupportedImportAttributes의 구현은 다음 요구사항을 따라야 한다:
지원되는 각 attribute를 나타내는 문자열의 리스트를 반환해야 한다.
이 연산이 호출될 때마다 동일한 순서와 내용의 동일한 리스트를 반환해야 한다.
HostGetSupportedImportAttributes의 기본 구현은 새 빈 리스트를 반환하는 것이다.
Note
호스트가 처리할 attribute를 선택하도록 모든 attribute를 전달하는 대신 지원되는 attribute만 명시하게 하는 목적은 지원되지 않는 attribute가 서로 다른 호스트 간에도 일관되게 처리되도록 하기 위함이다.
16.2.1.13 GetModuleNamespace ( module )
The abstract operation GetModuleNamespace takes argument module (Module Record의 구체 하위 클래스 인스턴스) and returns Module Namespace Object. module의 export를 나타내는 Module Namespace Object를 가져온다. 처음 요청될 때 지연 생성하여 module.[[Namespace]]에 저장하고 이후 재사용한다. It performs the following steps when called:
NamedExports 의 ReferencedBindings 에 있는 각 IdentifierNamen 에 대해: n 의 StringValue 가 ReservedWord 이거나 "implements", "interface", "let", "package", "private", "protected", "public", "static" 중 하나이면 문법 오류이다.
유일 요소가 새 ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: sourceName } 인 리스트를 반환한다.
유일 요소가 새 ExportEntry Record { [[ModuleRequest]]: module, [[ImportName]]: importName, [[LocalName]]: localName, [[ExportName]]: exportName } 인 리스트를 반환한다.
구현은 관련 ECMAScript 언어 구성요소가 평가될 때 대부분의 오류를 보고해야 한다. early error(조기 오류) 는 그 오류를 포함하는 Script 안의 어떤 구성요소도 평가되기 전에 검출·보고될 수 있는 오류이다. 조기 오류가 존재하면 그 구성요소의 평가가 차단된다. 구현은 ParseScript 과정에서 해당 Script 를 파싱하는 일부로 Script 의 조기 오류를 보고해야 한다. Module 의 조기 오류는 그 Module 이 평가될 지점에서 보고되며 그 Module 은 결코 초기화되지 않는다. eval 코드의 조기 오류는 eval 이 호출되는 시점에 보고되며 해당 eval 코드의 평가를 막는다. 조기 오류가 아닌 모든 오류는 런타임 오류이다.
구현은 이 명세의 “Static Semantics: Early Errors” 하위 절에 열거된 조건이 발생하면 반드시 그것을 조기 오류로 보고해야 한다.
구현은 (컴파일러가 어떤 구성요소가 어떤 상황에서도 오류 없이 실행될 수 없음을 입증할 수 있더라도) 다른 종류의 오류를 조기 오류로 취급해서는 안 된다. 그런 경우 구현이 조기 경고를 낼 수는 있지만, 관련 구성요소가 실제로 실행될 때까지 오류를 보고해서는 안 된다.
구현은 다음과 같은 경우를 제외하고 명세된 대로 모든 오류를 보고해야 한다:
17.1 에서 제한된 경우를 제외하고 호스트 또는 구현은 Script 구문, Module 구문, 그리고 정규 표현식 패턴 또는 플래그 구문을 확장할 수 있다. 이를 허용하기 위해 SyntaxError 를 던질 수 있는(예: eval 호출, 정규 표현식 리터럴 사용, Function 또는 RegExp 생성자 사용) 모든 연산은 스크립트 구문이나 정규 표현식 패턴/플래그 구문에 대한 호스트 정의 확장을 만나면 SyntaxError 를 던지는 대신 호스트 정의 동작을 보일 수 있다.
17.1 에서 제한된 경우를 제외하고 호스트 또는 구현은 이 명세에 기술된 것 이외의 추가적인 타입, 값, 객체, 프로퍼티, 함수를 제공할 수 있다. 이는 (예: 전역 스코프에서 변수 조회 같은) 구성요소가 오류(예: ReferenceError) 를 던지는 대신 호스트 정의 동작을 갖도록 만들 수 있다.
구현이 어떤 함수 객체를 "caller" 라는 own 프로퍼티로 확장하는 경우 [[Get]] 또는 [[GetOwnProperty]] 로 관찰되는 그 프로퍼티의 값은 strict 함수 객체가 되어서는 안 된다. 그것이 접근자 프로퍼티라면 [[Get]] 특성의 값인 함수는 호출 시 strict 함수를 반환해서는 안 된다.
매핑되었거나 매핑되지 않은 arguments 객체 모두 "caller" 라는 own 프로퍼티로 생성되어서는 안 된다.
ECMA-402 에 명세된(예: toLocaleString 라는 이름을 가진) 내장 메서드의 동작은 ECMA-402 에서 명시된 것 이외로 확장되어서는 안 된다.
22.2.1 및 B.1.2 의 RegExp 패턴 문법은 [UnicodeMode] 문법 매개변수가 존재할 때 A-Z 또는 a-z 소스 문자를 IdentityEscape[+UnicodeMode] 로 인식하도록 확장되어서는 안 된다.
어휘 비단말 기호 BindingIdentifier 로 매치되는 소스 텍스트 바로 뒤에 토큰 : 이 올 수 있게 하는 방식으로 구문 문법을 확장해서는 안 된다.
strict 모드 코드를 처리할 때 구현은 12.9.3.1 의 조기 오류 규칙을 완화해서는 안 된다.
ECMAScript Script 또는 Module 이 실행을 시작할 때 항상 이용 가능한 특정 내장 객체들이 있다. 그중 전역 객체는 실행 중인 프로그램의 전역 환경 일부이다. 다른 것들은 전역 객체의 초기 프로퍼티로서 또는 접근 가능한 내장 객체의 프로퍼티를 통해 간접적으로 접근할 수 있다.
별도로 명시되지 않는 한 함수로 호출 가능한 내장 객체는 10.3 에 기술된 특성을 가진 내장 함수 객체이다. 별도로 명시되지 않는 한 내장 객체의 [[Extensible]] 내부 슬롯의 초기 값은 true 이다. 모든 내장 함수 객체는 자신이 처음 생성된 Realm 의 Realm Record 값을 가지는 [[Realm]] 내부 슬롯을 가진다.
많은 내장 객체는 함수이며, 인수를 전달받아 호출될 수 있다. 그중 일부는 생성자이기도 하여 new 연산자와 함께 사용하도록 의도된 함수이다. 각 내장 함수에 대해 이 명세는 그 함수가 요구하는 인수와 함수 객체의 프로퍼티를 기술한다. 각 내장 생성자에 대해서는 추가로 그 생성자의 프로토타입 객체 프로퍼티 및 그 생성자를 호출하는 new 표현식이 반환하는 특정 객체 인스턴스의 프로퍼티를 기술한다.
특정 함수의 설명에서 달리 명시되지 않는 한, 내장 함수나 생성자가 지정된 것보다 적은 인수를 받으면, 부족한 인수들을 undefined 값으로 채워 받은 것과 정확히 동일하게 동작해야 한다. 이러한 누락된 인수들은 “존재하지 않음” 으로 간주되며 명세 알고리즘에서 그렇게 식별될 수 있다. 특정 함수 설명에서 “this value” 와 “NewTarget” 용어는 10.3 에서 부여된 의미를 가진다.
특정 함수 설명에서 달리 명시되지 않는 한, 내장 함수나 생성자가 허용된 것보다 많은 인수를 받으면 추가 인수는 평가되지만 함수는 이를 무시한다. 단, 구현은 그러한 인수에 대해 TypeError 예외를 단지 “추가 인수가 존재한다” 는 이유만으로 던지지 않는 한 구현 정의 동작을 규정할 수 있다.
Note 1
내장 함수 집합에 추가 기능을 덧붙이는 구현은 기존 함수에 새 매개변수를 추가하기보다 새 함수를 추가하는 방식으로 하는 것이 권장된다.
별도로 명시되지 않는 한 모든 내장 함수 및 내장 생성자는 자신의 [[Prototype]] 내부 슬롯 값으로 Function 프로토타입 객체(표현식 Function.prototype 의 초기 값, 20.2.3) 를 가진다.
별도로 명시되지 않는 한 모든 내장 프로토타입 객체는 (자기 자신인 Object 프로토타입 객체를 제외하고) 자신의 [[Prototype]] 내부 슬롯 값으로 Object 프로토타입 객체(표현식 Object.prototype 의 초기 값, 20.1.3) 를 가진다.
이 명세가 내장 생성자의 동작을 알고리즘 단계로 정의했다면, 그것이 [[Call]] 과 [[Construct]] 양쪽 목적의 동작이다. 해당 알고리즘이 두 경우를 구분할 필요가 있으면 NewTarget 이 undefined 인지 검사하는데, 이는 [[Call]] 호출을 의미한다.
생성자로 식별되지 않은 내장 함수 객체는 특정 함수 설명에서 별도로 명시되지 않는 한 [[Construct]] 내부 메서드를 구현하지 않는다.
생성자가 아닌 내장 함수 객체는 특정 함수 설명에서 별도로 명시되지 않는 한 "prototype" 프로퍼티를 갖지 않는다.
이 명세에 정의된 각 내장 함수는 CreateBuiltinFunction 추상 연산(10.3.4) 호출로 생성된다. length 및 name 매개변수의 값은 아래에서 논의되는 "length" 및 "name" 프로퍼티의 초기 값이다. prefix 매개변수의 값도 유사하게 아래에서 논의된다.
생성자를 포함한 모든 내장 함수 객체는 "length" 프로퍼티를 가지며 그 값은 0 이상의 정수 Number 이다. 별도로 명시되지 않는 한 이 값은 함수 설명 하위 절 제목에 나타난 필수 매개변수의 수이다. 선택적 매개변수와 rest 매개변수는 개수에 포함되지 않는다.
Note 2
예: Array 프로토타입 객체의 "map" 프로퍼티 초기 값인 함수 객체는 «Array.prototype.map (callback [ , thisArg])» 라는 제목 아래에 기술되며, 이름 있는 두 인수 callback 과 선택적인 thisArg 를 보여준다. 따라서 그 함수 객체의 "length" 프로퍼티 값은 1𝔽 이다.
별도로 명시되지 않는 한 내장 함수 객체의 "length" 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.
생성자를 포함한 모든 내장 함수 객체는 "name" 프로퍼티를 가지며 그 값은 String 이다. 별도로 명시되지 않는 한 이 값은 명세에서 그 함수에 부여된 이름이다. 익명 함수로 식별된 함수들은 빈 문자열을 "name" 프로퍼티 값으로 사용한다. 객체의 프로퍼티로 명세된 함수의 경우 이름 값은 그 함수를 접근하는 데 쓰이는 프로퍼티 이름 문자열이다. 내장 프로퍼티의 get 또는 set 접근자 함수로 명세된 함수는 CreateBuiltinFunction 을 호출할 때 prefix 매개변수로 각각 "get" 또는 "set" 을 전달한다.
프로퍼티 키가 Symbol 값인 각 내장 함수에 대해 "name" 프로퍼티 값은 명시적으로 지정된다. 그러한 명시적 값이 접두사 "get " 또는 "set " 로 시작하고 그 함수가 내장 프로퍼티의 get 또는 set 접근자 함수라면, 접두사를 제거한 값이 name 매개변수로 전달되고 "get" 또는 "set" 값이 prefix 매개변수로 전달된다.
별도로 명시되지 않는 한 내장 함수 객체의 "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 } 특성을 갖는다. get 접근자 함수만 기술된 경우 set 접근자 함수의 기본값은 undefined 이다. set 접근자만 기술된 경우 get 접근자의 기본값은 undefined 이다.
19 전역 객체(The Global Object)
전역 객체:
어떤 실행 컨텍스트에 제어가 진입하기 전에 생성된다.
[[Construct]] 내부 메서드를 가지지 않는다; new 연산자로 생성자로 사용할 수 없다.
The abstract operation PerformEval takes arguments x (ECMAScript 언어 값), strictCaller (Boolean), and direct (Boolean) and returns ECMAScript 언어 값을 담은 정상 completion 또는 throw completion. It performs the following steps when called:
eval 코드는 호출 컨텍스트나 eval 코드 둘 중 하나라도 strict 모드이면 호출자 변수 환경에 var/function 바인딩을 인스턴스화할 수 없다. 대신 새 VariableEnvironment 에 인스턴스화된다. let, const, class 선언이 도입하는 바인딩은 항상 새 LexicalEnvironment 에 인스턴스화된다.
19.2.1.2 HostEnsureCanCompileStrings ( calleeRealm, parameterStrings, bodyString, direct )
The host-defined abstract operation HostEnsureCanCompileStrings takes arguments calleeRealm (Realm Record), parameterStrings (문자열 리스트), bodyString (String), and direct (Boolean) and returns unused 를 담은 정상 completion 또는 throw completion. 문자열을 ECMAScript 코드로 해석·평가할 수 있게 하는 특정 ECMAScript 함수를 호스트 환경이 차단할 수 있도록 한다.
parameterStrings 는 함수 생성자 중 하나를 사용할 때 파라미터 목록을 구성하기 위해 연결될 문자열들을 나타낸다. bodyString 은 함수 본문 또는 eval 에 전달된 문자열을 나타낸다.
direct 는 평가가 direct eval 인지 여부를 나타낸다.
이 함수는 string 의 선두 일부만 Number 로 해석할 수 있고, 10진 표기 일부가 될 수 없는 코드 유닛은 무시하며 무시되었다는 표시를 제공하지 않는다.
19.2.5 parseInt ( string, radix )
이 함수는 radix 에 따라 string 내용을 해석하여 정수 Number 값을 생성한다. string 의 선행 공백은 무시된다. radix 가 0 으로 강제될 경우(예: undefined) 표현이 "0x" 또는 "0X" 로 시작하지 않으면 10, 그렇다면 16 으로 간주한다. radix 가 16 이면 표현은 "0x" / "0X" 로 시작할 수도 있다.
이 함수는 string 의 선두 일부만 정수로 해석할 수 있으며 나머지는 무시되고 무시 사실은 표시되지 않는다.
19.2.6 URI 처리 함수
Uniform Resource Identifier(URI)는 자원(웹 페이지, 파일 등)과 Internet 상에서 그것에 접근할 전송 프로토콜(HTTP, FTP 등)을 식별하는 String 이다. ECMAScript 자체는 이 절에 기술된 URI 인코딩·디코딩 함수 외에는 URI 사용 지원을 제공하지 않는다. encodeURI, decodeURI 는 전체 URI 에 사용하도록 의도되며 예약 문자는 특별한 의미(구분자 등)를 가정하므로 인코딩하지 않는다. encodeURIComponent, decodeURIComponent 는 URI 개별 구성 요소에 사용하도록 의도되며, 예약 문자가 텍스트를 나타낸다고 가정하고 전체 URI 의 일부가 될 때 특별한 의미를 피하기 위해 인코딩해야 한다.
Note 1
예약 문자 집합은 RFC 2396 에 기반하며 최신 RFC 3986 의 변경을 반영하지 않는다.
Note 2
많은 ECMAScript 구현은 웹 페이지를 조작하는 추가 함수·메서드를 제공하는데, 이는 표준 범위를 벗어난다.
19.2.6.1 decodeURI ( encodedURI )
이 함수는 encodeURI 가 도입할 수 있는 종류의 각 escape 시퀀스 및 UTF-8 인코딩을 해당 코드 포인트의 UTF-16 인코딩으로 치환한 URI 새 버전을 계산한다. encodeURI 가 도입할 수 없었던 escape 시퀀스는 치환하지 않는다.
The abstract operation Encode takes arguments string (String) and extraUnescaped (String) and returns String 을 담은 정상 completion 또는 throw completion. string 을 6.1.4 에 기술된 대로 UTF-16 인코딩된 코드 포인트 시퀀스로 해석하여 URI 인코딩·escape 를 수행한다. RFC 2396 에서 unreserved 로 식별되었거나 extraUnescaped 에 등장하는 문자는 escape 하지 않는다. It performs the following steps when called:
len = string 길이.
R = 빈 문자열.
alwaysUnescaped = ASCII 단어 문자들과 "-.!~*'()" 의 문자열 연결.
unescapedSet = alwaysUnescaped + extraUnescaped.
k = 0.
반복 (k < len)
C = string[k] 코드 유닛.
unescapedSet 이 C 포함하면
k = k + 1.
R = R + C.
Else
cp = CodePointAt(string, k).
cp.[[IsUnpairedSurrogate]]true 이면 URIError throw.
k = k + cp.[[CodeUnitCount]].
Octets = cp.[[CodePoint]] 에 UTF-8 변환 적용한 octet 리스트.
퍼센트 인코딩은 개별 octet 을 표현하므로 하나의 코드 포인트가 여러 연속 escape 시퀀스(각각 하나의 8비트 UTF-8 코드 유닛)에 의해 표현될 수 있다.
19.2.6.6 Decode ( string, preserveEscapeSet )
The abstract operation Decode takes arguments string (String) and preserveEscapeSet (String) and returns String 을 담은 정상 completion 또는 throw completion. preserveEscapeSet 에 포함된 Basic Latin 문자에 대응하는 escape 시퀀스를 보존하면서 URI unescape 및 디코딩을 수행한다. It performs the following steps when called:
Octets 가 유효한 UTF-8 코드 포인트 인코딩이 아니면 URIError throw.
V = UTF-8 변환을 적용해 얻은 코드 포인트.
S = UTF16EncodeCodePoint(V).
R = R + S.
k = k + 1.
R 반환.
Note
RFC 3629 는 잘못된 UTF-8 옥텟 시퀀스 디코딩을 금지한다. 예: 잘못된 시퀀스 0xC0 0x80 은 0x0000 으로 디코딩되어서는 안 된다. 구현은 그러한 시퀀스를 만나면 URIError 를 던져야 한다.
19.2.6.7 ParseHexOctet ( string, position )
The abstract operation ParseHexOctet takes arguments string (String) and position (음이 아닌 정수) and returns 음이 아닌 정수 또는 비어있지 않은 SyntaxError 객체 리스트. string 의 position 위치에 있는 두 개 16진 문자를 부호 없는 8비트 정수로 파싱한다. It performs the following steps when called:
20.1.2.3.1 ObjectDefineProperties ( O, Properties )
The abstract operation ObjectDefineProperties takes arguments O (Object) and Properties (ECMAScript 언어 값) and returns Object 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:
The abstract operation GetOwnPropertyKeys takes arguments O (ECMAScript 언어 값) and type (string 또는 symbol) and returns 프로퍼티 키 리스트를 담은 정상 completion 또는 throw completion. It performs the following steps when called:
callback 은 두 개의 인수를 받는 함수여야 한다. groupBy 는 items 의 각 요소에 대해 (오름차순으로) callback 을 한 번 호출하고 새 객체를 구성한다. callback 이 반환한 각 값은 프로퍼티 키로 강제 변환된다. 그러한 각 프로퍼티 키에 대해 결과 객체는 그 키를 프로퍼티 키로 가지며 값은 해당 키로 강제 변환된 callback 반환 값을 가진 모든 요소를 담은 배열이다.
과거 이 메서드는 이전 판에서 다양한 내장 객체의 공칭 타입 태그로 사용된 [[Class]] 내부 슬롯의 String 값을 얻기 위해 사용되기도 했다. 위 정의는 그러한 특정 종류의 내장 객체를 테스트하기 위해 toString 을 사용하는 레거시 코드와의 호환성을 유지한다. 이는 다른 종류의 내장 혹은 프로그램 정의 객체에 대해 신뢰할 수 있는 타입 테스트 메커니즘을 제공하지 않는다. 또한 프로그램은 %Symbol.toStringTag% 를 이용하여 이러한 레거시 타입 테스트의 신뢰성을 깨뜨릴 수 있다.
생성자가 아니라 함수로 호출될 때 새 함수 객체를 생성·초기화한다. 따라서 Function(…) 호출은 동일 인수를 가진 new Function(…) 표현식과 동등하다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 특정 Function 동작을 상속하려는 서브클래스 생성자는 내장 함수 동작에 필요한 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 Function 생성자에 super 호출을 포함해야 한다. 함수 객체를 정의하는 모든 ECMAScript 구문 형태는 Function 인스턴스를 생성한다. built-in GeneratorFunction, AsyncFunction, AsyncGeneratorFunction 서브클래스를 제외하고 Function 서브클래스 인스턴스를 만들 문법적 수단은 없다.
20.2.1.1 Function ( ...parameterArgs, bodyArg )
마지막 인수(있다면)는 함수 본문(실행 코드)을 지정하며 그 앞의 인수들은 형식 매개변수를 지정한다.
The abstract operation CreateDynamicFunction takes arguments constructor (생성자), newTarget (생성자 또는 undefined), kind (normal, generator, async, 또는 async-generator), parameterArgs (ECMAScript 언어 값 리스트), and bodyArg (ECMAScript 언어 값) and returns ECMAScript 함수 객체를 담은 정상 completion 또는 throw completion. constructor 는 이 동작을 수행 중인 생성자 함수. newTarget 은 처음에 new 가 적용된 생성자. parameterArgs 와 bodyArg 는 constructor 에 전달된 인수 값. It performs the following steps when called:
이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.
Note
이것은 대부분의 함수가 상속하는 기본 %Symbol.hasInstance% 구현이다. %Symbol.hasInstance% 는 instanceof 연산자가 값이 특정 생성자의 인스턴스인지 판정하기 위해 호출한다. 다음 표현식은
v instanceof F
다음과 같이 평가된다
F[%Symbol.hasInstance%](v)
생성자 함수는 함수에 다른 %Symbol.hasInstance% 메서드를 노출하여 어떤 객체를 자신의 인스턴스로 인식할지 제어할 수 있다.
이 프로퍼티는 bound 함수의 대상 함수를 전역적으로 노출할 수 있는 변조를 막기 위해 writable / configurable 이 아니다.
이 메서드의 "name" 프로퍼티 값은 "[Symbol.hasInstance]" 이다.
20.2.4 Function 인스턴스
모든 Function 인스턴스는 ECMAScript 함수 객체이며 Table 28 에 나열된 내부 슬롯을 가진다. Function.prototype.bind (20.2.3.2) 로 생성된 함수 객체는 Table 29 에 있는 내부 슬롯을 가진다.
Function 인스턴스는 다음 프로퍼티를 가진다:
20.2.4.1 length
"length" 프로퍼티 값은 함수가 일반적으로 기대하는 인수 수를 나타내는 정수 Number 이다. 언어는 다른 수의 인수로 호출하는 것을 허용한다. 지정된 "length" 와 다른 인수 수로 호출될 때의 동작은 함수에 따라 다르다. 이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.
20.2.4.2 name
"name" 프로퍼티 값은 함수를 서술하는 String 이다. 이름은 의미론적 중요성을 갖지 않고 보통 ECMAScript 소스에서 정의 지점에서 그 함수를 참조하는 변수 또는 프로퍼티 이름이다. 이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.
명세에 의해 문맥적 이름이 연관되지 않은 익명 함수 객체는 빈 문자열을 "name" 값으로 사용한다.
20.2.4.3 prototype
생성자로 사용할 수 있는 Function 인스턴스는 "prototype" 프로퍼티를 가진다. 그러한 Function 인스턴스가 생성될 때마다 또 다른 ordinary 객체가 생성되어 함수의 "prototype" 프로퍼티 초기 값이 된다. 달리 명시되지 않는 한 생성자로 그 함수가 호출될 때 생성되는 객체의 [[Prototype]] 내부 슬롯을 초기화하는 데 이 값이 사용된다.
이 프로퍼티는 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.
The host-defined abstract operation HostHasSourceTextAvailable takes argument func (함수 객체) and returns Boolean. 호스트 환경이 func 의 소스 텍스트 제공을 차단할 수 있도록 한다.
HostHasSourceTextAvailable 구현은 다음 요구사항을 따른다:
매개변수에 대해 결정적이어야 한다. 특정 func 로 호출될 때마다 동일 결과를 반환해야 한다.
The abstract operation ThisBooleanValue takes argument value (ECMAScript 언어 값) and returns Boolean 을 담은 정상 completion 또는 throw completion. It performs the following steps when called:
value 가 Boolean 이면 value 반환.
value 가 Object 이고 [[BooleanData]] 내부 슬롯을 가지면
b 를 value.[[BooleanData]] 로 둔다.
단언: b 는 Boolean.
b 반환.
TypeError 예외 throw.
20.3.4 Boolean 인스턴스의 프로퍼티
Boolean 인스턴스는 Boolean 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이다. Boolean 인스턴스는 [[BooleanData]] 내부 슬롯을 가진다. [[BooleanData]] 내부 슬롯은 이 Boolean 객체가 나타내는 Boolean 값이다.
GlobalSymbolRegistry List 는 전역적으로 이용 가능한 append-only 리스트이다. 모든 realm 이 공유한다. 어떤 ECMAScript 코드도 평가되기 전에 새 빈 리스트로 초기화된다. 요소는 Table 61 에 정의된 구조의 Record 이다.
The abstract operation ThisSymbolValue takes argument value (ECMAScript 언어 값) and returns Symbol 을 담은 정상 completion 또는 throw completion. It performs the following steps when called:
value 가 Symbol 이면 value 반환.
value 가 Object 이고 [[SymbolData]] 내부 슬롯을 가지면
s 를 value.[[SymbolData]] 로 둔다.
단언: s 는 Symbol.
s 반환.
TypeError 예외 throw.
20.4.3.5 Symbol.prototype [ %Symbol.toPrimitive% ] ( hint )
이 메서드는 ECMAScript 언어 연산자가 Symbol 객체를 원시 값으로 변환할 때 호출된다.
이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.
20.4.4 Symbol 인스턴스의 프로퍼티
Symbol 인스턴스는 Symbol 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이다. Symbol 인스턴스는 [[SymbolData]] 내부 슬롯을 가진다. [[SymbolData]] 내부 슬롯은 이 Symbol 객체가 나타내는 Symbol 값이다.
20.4.5 Symbol 을 위한 추상 연산
20.4.5.1 KeyForSymbol ( sym )
The abstract operation KeyForSymbol takes argument sym (Symbol) and returns String 또는 undefined. sym 이 GlobalSymbolRegistry List 에 있으면 sym 을 등록하는 데 사용된 String 이 반환된다. It performs the following steps when called:
msg 가 undefined 이면 msg = 빈 문자열; 아니면 msg = ? ToString(msg).
name 이 빈 문자열이면 msg 반환.
msg 가 빈 문자열이면 name 반환.
name, 0x003A, 0x0020, msg 의 문자열 연결을 반환.
20.5.4 Error 인스턴스의 프로퍼티
Error 인스턴스는 Error 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이며 값이 undefined 인 [[ErrorData]] 내부 슬롯을 가진다. [[ErrorData]] 의 유일한 지정 용도는 Object.prototype.toString 과 Error.isError 에서 Error, AggregateError, NativeError 인스턴스를 식별하는 것이다.
20.5.5 이 표준에서 사용되는 Native Error 타입
런타임 오류가 감지되면 아래 NativeError 객체 중 하나 또는 AggregateError 객체의 새 인스턴스가 throw 된다. 모든 NativeError 객체는 20.5.6 에 설명된 동일 구조를 공유한다.
생성자가 아니라 함수로 호출될 때 새 NativeError 객체를 생성·초기화한다. 함수 호출 NativeError(…) 는 동일 인수를 가진 new NativeError(…) 와 동등하다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 NativeError 동작을 상속하려는 서브클래스 생성자는 [[ErrorData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 NativeError생성자에 super 호출을 포함해야 한다.
20.5.6.1.1NativeError ( message [ , options ] )
각 NativeError 함수는 호출될 때 다음 단계를 수행한다:
NewTarget 이 undefined 이면 newTarget = 활성 함수 객체; 아니면 newTarget = NewTarget.
step 2 에 전달되는 문자열의 실제 값은 정의 중인 NativeError생성자에 따라 "%EvalError.prototype%", "%RangeError.prototype%", "%ReferenceError.prototype%", "%SyntaxError.prototype%", "%TypeError.prototype%", "%URIError.prototype%" 중 하나이다.
특정 NativeError생성자에 대한 프로토타입의 "constructor" 프로퍼티 초기 값은 그 생성자 자체이다.
20.5.6.3.2NativeError.prototype.message
특정 NativeError생성자 프로토타입의 "message" 프로퍼티 초기 값은 빈 문자열이다.
20.5.6.3.3NativeError.prototype.name
특정 NativeError생성자 프로토타입의 "name" 프로퍼티 초기 값은 ( NativeError 대신 사용되는 ) 생성자의 이름으로 이루어진 String 값이다.
20.5.6.4NativeError 인스턴스의 프로퍼티
NativeError 인스턴스는 해당 NativeError 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이며 값이 undefined 인 [[ErrorData]] 내부 슬롯을 가진다. [[ErrorData]] 의 유일한 지정 용도는 Object.prototype.toString (20.1.3.6) 과 Error.isError (20.5.2.1) 에서 Error, AggregateError 또는 NativeError 인스턴스를 식별하는 것이다.
생성자가 아니라 함수로 호출될 때 새 AggregateError 객체를 생성·초기화한다. 따라서 AggregateError(…) 호출은 동일 인수를 가진 new AggregateError(…) 와 동등하다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 AggregateError 동작을 상속하려는 서브클래스 생성자는 [[ErrorData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 AggregateError 생성자에 super 호출을 포함해야 한다.
AggregateError.prototype.name 의 초기 값은 "AggregateError".
20.5.7.4 AggregateError 인스턴스의 프로퍼티
AggregateError 인스턴스는 해당 AggregateError 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이며 값이 undefined 인 [[ErrorData]] 내부 슬롯을 가진다. [[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 )
The abstract operation InstallErrorCause takes arguments O (Object) and options (ECMAScript 언어 값) and returns unused 를 담은 정상 completion 또는 throw completion. options 에 "cause" 프로퍼티가 존재할 때 O 에 "cause" 프로퍼티를 생성하는 데 사용된다. It performs the following steps when called:
options 가 Object 이고 ? HasProperty(options, "cause") 가 true 이면
IEEE 754-2019의 정밀도 한계로 인한 반올림 동작 때문에 Number.MAX_SAFE_INTEGER 보다 큰 모든 정수의 Number 값은 최소 하나 이상의 다른 정수와 공유된다. 그러한 큰 크기의 정수들은 안전하지 않으며 Number 값으로 정확히 표현되거나 서로 구별될 수 있음을 보장하지 않는다. 예를 들어 9007199254740992 와 9007199254740993 은 모두 Number 값 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
Note
IEEE 754-2019의 정밀도 한계로 인한 반올림 동작 때문에 Number.MIN_SAFE_INTEGER 보다 작은 모든 정수의 Number 값은 최소 하나 이상의 다른 정수와 공유된다. 그러한 큰 크기의(절대값이 큰) 정수들은 안전하지 않으며 Number 값으로 정확히 표현되거나 서로 구별될 수 있음을 보장하지 않는다. 예를 들어 -9007199254740992 와 -9007199254740993 은 모두 Number 값 -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 배정밀도 이진 표현에서 가장 작은 가능한 값은 비정규(denormalized) 수이다. 구현이 비정규 값을 지원하지 않는다면 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 } 특성을 가진다.
이 메서드는 이 Number 값을 십진 지수 표기(유효숫자 부분의 소수점 앞에 한 자리, 소수점 뒤에 fractionDigits 자리)로 표현한 String 을 반환한다. fractionDigits 가 undefined 이면, (항상 지수 표기로 출력된다는 점을 제외하면 ToString 과 같이) Number 를 유일하게 지정하는 데 필요한 만큼의 유효숫자 자릿수를 포함한다.
m 을 f + 1 번의 코드 유닛 0x0030 (DIGIT ZERO) 로 구성된 String 값으로 둔다.
e = 0.
그렇지 않으면,
fractionDigits 가 undefined 가 아니면
10f ≤ n < 10f + 1 이고 n × 10e - f - x 가 0 에 가장 가깝도록 하는 정수 e, n 을 둔다. 그러한 ( e, n ) 이 두 개 있으면 n × 10e - f 가 더 큰 것을 고른다.
그렇지 않으면,
ff ≥ 0, 10ff ≤ n < 10ff + 1, 𝔽(n × 10e - ff) 가 𝔽(x), 그리고 ff 가 가능한 한 작은 정수인 e, n, ff 를 둔다. 이때 n 의 십진 표현은 ff + 1 자리이며, n 은 10 으로 나누어떨어지지 않고, n 의 최하위 자리는 유일하게 결정되지 않을 수 있다.
f = ff.
m 을 n 의 십진 표현의 자릿수들(선행 0 없이 순서대로)로 구성된 String 값으로 둔다.
f ≠ 0 이면
a = m 의 첫 코드 유닛.
b = 나머지 f 개의 코드 유닛.
m = a, ".", b 의 문자열 연결.
e = 0 이면
c = "+".
d = "0".
그렇지 않으면,
e > 0 이면
c = "+".
그렇지 않으면
단언: e < 0.
c = "-".
e = -e.
d = e 의 십진 표현 자릿수들(선행 0 없이)로 구성된 String 값.
m = m, "e", c, d 의 문자열 연결.
s 와 m 의 문자열 연결을 반환한다.
Note
위 규칙이 요구하는 것보다 더 정확한 변환을 제공하는 구현은 step 10.b.i 의 다음 대안 버전을 지침으로 사용하는 것이 권장된다:
f ≥ 0, 10f ≤ n < 10f + 1, 𝔽(n × 10e - f) 가 𝔽(x), 그리고 f 가 가능한 한 작은 정수인 e, n, f 를 둔다. n 의 후보가 여러 개면 𝔽(n × 10e - f) 가 𝔽(x) 에 가장 가까운 값을 선택한다. 그런 후보가 두 개면 짝수인 것을 선택한다.
이 메서드는 이 Number 값을 (유효숫자 부분 소수점 앞에 한 자리, 소수점 뒤에 precision - 1 자리)인 십진 지수 표기 또는 precision 개의 유효숫자를 갖는 십진 고정 표기 중 하나로 표현한 String 을 반환한다. precision 이 undefined 이면 대신 ToString 을 호출한다.
The abstract operation ThisNumberValue takes argument value (ECMAScript 언어 값) and returns Number 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:
value 가 Number 이면 value 반환.
value 가 Object 이고 [[NumberData]] 내부 슬롯을 가지면
n = value.[[NumberData]].
단언: n 은 Number.
n 반환.
TypeError 예외 throw.
21.1.4 Number 인스턴스의 프로퍼티 (Properties of Number Instances)
Number 인스턴스는 Number 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이다. Number 인스턴스는 또한 [[NumberData]] 내부 슬롯을 가진다. [[NumberData]] 내부 슬롯은 이 Number 객체가 나타내는 Number 값이다.
The abstract operation NumberToBigInt takes argument number (a Number) and returns BigInt 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:
The abstract operation ThisBigIntValue takes argument value (an ECMAScript language value) and returns BigInt 를 담은 정상 completion 또는 throw completion. It performs the following steps when called:
이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.
21.2.4 BigInt 인스턴스의 프로퍼티 (Properties of BigInt Instances)
BigInt 인스턴스는 BigInt 프로토타입 객체로부터 프로퍼티를 상속하는 ordinary 객체이다. BigInt 인스턴스는 또한 [[BigIntData]] 내부 슬롯을 가진다. [[BigIntData]] 내부 슬롯은 해당 BigInt 객체가 나타내는 BigInt 값이다.
이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.
21.3.2 Math 객체의 함수 프로퍼티 (Function Properties of the Math Object)
Note
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 에도 사용할 수 있도록 하는 것이다.
이 연산은 먼저 binary32 로 변환 후 binary16 으로 변환하는 것과 다르다(이중 반올림 가능성). 예: k = 1.00048828125000022204𝔽 에 대해 Math.f16round(k) 는 1.0009765625𝔽 이지만 Math.f16round(Math.fround(k)) 는 1𝔽 이다.
모든 플랫폼이 binary64→binary16 캐스팅을 네이티브 지원하지는 않는다. MIT 라이선스 half 라이브러리 등 사용 가능. 또는 binary64→binary32 (roundTiesToEven) 후 잘못된 이중 반올림 가능성 검사, 해당 경우 mantissa 조정(odd 라운드에 해당) 후 최종 binary16 캐스팅 등으로 구현 가능.
Math.round(x) 는 항상 Math.floor(x + 0.5) 와 같지 않다. 예를 들어 x 가 -0𝔽 이거나 -0𝔽 보다 작고 -0.5𝔽 이상이면 Math.round(x) 는 -0𝔽 반환하지만 Math.floor(x + 0.5) 는 +0𝔽 를 반환. 또한 내부 반올림으로 인해 차이날 수 있다.
다음의 추상 연산들은 시간 값(21.4.1.1에서 정의됨)에 대해 동작합니다. 모든 경우에 이 함수들에 인수로 NaN이 들어오면 결과도 NaN이 됨을 유의하세요.
21.4.1.1 시간 값과 시간 범위
ECMAScript의 시간 측정은 POSIX의 시간 측정과 유사하며, 특히 전환 그레고리력(proleptic Gregorian calendar), 1970년 1월 1일 0시 UTC의 기점(epoch), 그리고 하루가 정확히 86,400초(각 초는 1000밀리초)로 구성된다는 정의를 공유합니다.
ECMAScript의 시간 값은 Number로, 밀리초 단위의 한 순간을 나타내는 유한 정수 Number이거나 특정 순간을 나타내지 않는 NaN일 수 있습니다. 24 × 60 × 60 × 1000 = 86,400,000의 배수(즉, 정수 d에 대해 86,400,000 × d)인 시간 값은 기점 이후 d일이 지난 UTC 일의 시작 순간(음수 d라면 기점 이전)을 나타냅니다. 그 외의 유한 시간 값 t는 그와 가장 가까운 이전 배수 시간 값 s를 기준으로 정의되며, s와 동일한 UTC 일 내에서 (t - s) 밀리초가 지난 순간을 나타냅니다.
시간 값은 UTC 윤초(leap seconds)를 고려하지 않습니다—양의 윤초 내의 순간을 나타내는 시간 값은 없으며, 음의 윤초로 인해 UTC 타임라인에서 제거된 순간을 나타내는 시간 값은 있습니다. 그럼에도 불구하고 시간 값의 정의는 윤초 경계에서만 불연속이 있고 그 외에는 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일 0시 UTC 기준으로 -100,000,000일부터 100,000,000일까지의 시간 값 범위를 제공합니다.
1970년 1월 1일 0시 UTC의 정확한 순간은 시간 값 +0𝔽으로 표현됩니다.
Note
전환 그레고리력에서는 윤년이 4로 나누어떨어지고, 400으로 나누어떨어지거나 100으로 나누어떨어지지 않는 해입니다.
전환 그레고리력의 400년 주기에는 97번의 윤년이 있습니다. 평균적으로 연간 365.2425일, 즉 31,556,952,000 밀리초가 됩니다. 따라서 Number가 밀리초 단위로 정확하게 표현할 수 있는 최대 범위는 1970년 기준으로 약 -285,426년에서 285,426년입니다. 이 절에서 명시된 시간 값의 더 작은 범위는 약 -273,790년에서 273,790년(1970년 기준)입니다.
The abstract operation Day takes argument t (유한한 시간 값) and returns 정수 Number. t가 속한 날짜의 일 번호(day number)를 반환합니다. It performs the following steps when called:
The abstract operation TimeWithinDay takes argument t (유한한 시간 값) and returns +0𝔽 (포함)부터 msPerDay (제외)까지의 정수 Number. t가 속한 날짜의 시작부터 지난 밀리초 수를 반환합니다. It performs the following steps when called:
The abstract operation DaysInYear takes argument y (정수 Number) and returns 365𝔽 또는 366𝔽. y년의 일(day) 수를 반환합니다. 윤년은 366일, 그 외는 365일입니다. It performs the following steps when called:
The abstract operation DayFromYear takes argument y (정수 Number) and returns 정수 Number. y년의 첫날의 일 번호(day number)를 반환합니다. It performs the following steps when called:
The abstract operation TimeFromYear takes argument y (정수 Number) and returns 시간 값. y년의 시작 순간의 시간 값을 반환합니다. It performs the following steps when called:
The abstract operation YearFromTime takes argument t (유한한 시간 값) and returns 정수 Number. t가 속한 연도를 반환합니다. It performs the following steps when called:
TimeFromYear(y) ≤ t를 만족하는 가장 큰 정수 y를 반환합니다 (+∞에 가장 가까움).
21.4.1.9 DayWithinYear ( t )
The abstract operation DayWithinYear takes argument t (유한한 시간 값) and returns +0𝔽부터 365𝔽까지 포함하는 구간의 정수 Number. It performs the following steps when called:
The abstract operation InLeapYear takes argument t (유한한 시간 값) and returns +0𝔽 또는 1𝔽. t가 윤년 내에 있으면 1𝔽, 아니면 +0𝔽을 반환합니다. It performs the following steps when called:
The abstract operation MonthFromTime takes argument t (유한한 시간 값) and returns +0𝔽부터 11𝔽까지 포함하는 구간의 정수 Number. t가 속한 월(month)을 식별하는 Number를 반환합니다. +0𝔽은 1월, 1𝔽은 2월, … 11𝔽은 12월을 의미합니다. MonthFromTime(+0𝔽) = +0𝔽은 1970년 1월 1일 목요일에 해당합니다. It performs the following steps when called:
The abstract operation DateFromTime takes argument t (유한한 시간 값) and returns 1𝔽부터 31𝔽까지 포함하는 구간의 정수 Number. t가 속한 월의 날짜(day of month)를 반환합니다. It performs the following steps when called:
The abstract operation WeekDay takes argument t (유한한 시간 값) and returns +0𝔽부터 6𝔽까지 포함하는 구간의 정수 Number. t가 속한 요일(week day)을 식별하는 Number를 반환합니다. +0𝔽은 일요일, 1𝔽은 월요일, … 6𝔽은 토요일을 의미합니다. WeekDay(+0𝔽) = 4𝔽은 1970년 1월 1일 목요일에 해당합니다. It performs the following steps when called:
The abstract operation HourFromTime takes argument t (유한한 시간 값) and returns +0𝔽부터 23𝔽까지 포함하는 구간의 정수 Number. t가 속한 시(hour)를 반환합니다. It performs the following steps when called:
The abstract operation MinFromTime takes argument t (유한한 시간 값) and returns +0𝔽부터 59𝔽까지 포함하는 구간의 정수 Number. t가 속한 분(minute)을 반환합니다. It performs the following steps when called:
The abstract operation SecFromTime takes argument t (유한한 시간 값) and returns +0𝔽부터 59𝔽까지 포함하는 구간의 정수 Number. It performs the following steps when called:
The abstract operation msFromTime takes argument t (유한한 시간 값) and returns +0𝔽부터 999𝔽까지 포함하는 구간의 정수 Number. It performs the following steps when called:
The abstract operation GetUTCEpochNanoseconds takes arguments year (정수), month (1~12의 정수), day (1~31의 정수), hour (0~23의 정수), minute (0~59의 정수), second (0~59의 정수), millisecond (0~999의 정수), microsecond (0~999의 정수), and nanosecond (0~999의 정수) and returns BigInt. It performs the following steps when called:
ECMAScript에서 시간대는 시간대 식별자로 표현되며, 이는 0x0000~0x007F의 코드 유닛으로만 구성된 문자열입니다.
ECMAScript 구현이 지원하는 시간대는 사용 가능한 명명된 시간대일 수 있고, 이는 AvailableNamedTimeZoneIdentifiers가 반환하는 시간대 식별자 레코드의 [[Identifier]] 필드로 표현됩니다. 또는 오프셋 시간대일 수 있고, 이는 IsTimeZoneOffsetString이 true를 반환하는 문자열로 표현됩니다.
기본 시간대 식별자는 사용 가능한 명명된 시간대의 대표 식별자입니다.
비기본 시간대 식별자는 명명된 시간대를 나타내지만 기본 식별자가 아닌 식별자입니다.
사용 가능한 명명된 시간대 식별자는 기본 또는 비기본 식별자입니다.
각 사용 가능한 명명된 시간대 식별자는 정확히 하나의 명명된 시간대와 연결됩니다.
각 명명된 시간대는 정확히 하나의 기본 시간대 식별자와 0개 이상의 비기본 식별자와 연결됩니다.
ECMAScript 구현은 "UTC" 식별자를 가진 명명된 시간대를 지원해야 하며, 이는 UTC 시간대의 기본 식별자여야 합니다.
추가로, 구현은 다른 명명된 시간대를 임의로 지원할 수 있습니다.
ECMA-402 국제화 API 명세의 시간대 요구 사항을 따르는 구현은 시간대 지원 구현(time zone aware)이라고 합니다.
시간대 지원 구현은 IANA Time Zone Database의 Zone 및 Link 이름에 해당하는 명명된 시간대를 지원해야 하며, 오직 그러한 이름만 지원해야 합니다.
시간대 지원 구현에서는 기본 식별자가 Zone 이름, 비기본 식별자가 Link 이름에 해당합니다(ECMA-402에서 특별히 재정의한 경우 제외).
전체 IANA Time Zone Database를 지원하지 않더라도 IANA 이름을 식별자로 사용하는 것이 권장됩니다.
The implementation-defined abstract operation GetNamedTimeZoneEpochNanoseconds takes arguments timeZoneIdentifier (문자열), year (정수), month (1~12의 정수), day (1~31의 정수), hour (0~23의 정수), minute (0~59의 정수), second (0~59의 정수), millisecond (0~999의 정수), microsecond (0~999의 정수), and nanosecond (0~999의 정수) and returns BigInt 리스트.
입력값이 음의 시간대 전환(예: 서머타임 종료나 시간대 오프셋 감소) 때문에 지역 시간이 두 번 발생하면, 반환 리스트에 두 개 이상의 요소가 들어가고 오름차순으로 정렬됩니다.
입력값이 양의 시간대 전환(예: 서머타임 시작이나 시간대 오프셋 증가) 때문에 지역 시간이 건너뛰어진 경우, 반환 리스트는 비어 있습니다.
그 외에는 반환 리스트에 하나의 요소가 들어갑니다.
지역 정치적 규칙이 없는 ECMAScript 구현에서 사용하는 GetNamedTimeZoneEpochNanoseconds 기본 구현은 다음과 같은 단계로 동작합니다:
2017년 11월 5일 America/New_York의 오전 1:30은 두 번 반복되므로, 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은 존재하지 않으므로, GetNamedTimeZoneEpochNanoseconds("America/New_York", 2017, 3, 12, 2, 30, 0, 0, 0, 0)은 빈 리스트를 반환합니다.
The implementation-defined abstract operation GetNamedTimeZoneOffsetNanoseconds takes arguments timeZoneIdentifier (문자열) and epochNanoseconds (BigInt) and returns 정수.
반환되는 정수는 timeZoneIdentifier로 지정된 명명된 시간대에서, epochNanoseconds에 해당하는 순간의 UTC로부터의 오프셋(나노초 단위)을 나타냅니다.
지역 정치적 규칙이 없는 ECMAScript 구현에서 사용하는 기본 구현은 다음과 같이 동작합니다:
NOTE: 기본 식별자를 얻기 위해 identifier를 반복적으로 resolve해야 할 수도 있다.
record를 시간대 식별자 레코드 { [[Identifier]]: identifier, [[PrimaryIdentifier]]: primary }로 한다.
result에 record를 추가한다.
Assert: result에 [[Identifier]]가 "UTC"이고 [[PrimaryIdentifier]]도 "UTC"인 레코드 r가 포함됨을 보장한다.
result를 반환한다.
21.4.1.24 SystemTimeZoneIdentifier ( )
The implementation-defined abstract operation SystemTimeZoneIdentifier takes no arguments and returns 문자열. It performs the following steps when called:
NOTE: 다음 단계는 t가 음의 시간대 전환(예: 서머타임 종료나 시간대 오프셋 감소)에서 지역 시간이 여러 번 반복되거나, 양의 시간대 전환(예: 서머타임 시작이나 시간대 오프셋 증가)에서 지역 시간이 건너뛰어진 경우에, 전환 직전의 시간대 오프셋을 사용해 t를 해석할 수 있도록 한다.
possibleInstants가 비어 있지 않으면
disambiguatedInstant를 possibleInstants[0]로 한다.
그렇지 않으면,
NOTE: t가 양의 시간대 전환에서 건너뛰어진 지역 시간을 나타낸다(예: 서머타임 시작이나 시간대 오프셋 증가).
입력 t는 명목상 시간 값이지만, 어떤 Number 값도 될 수 있습니다.
알고리즘은 t를 시간 값 범위로 제한해서는 안 되며, 지역 UTC 오프셋에 관계없이 경계값에 해당하는 입력도 지원할 수 있어야 합니다.
예를 들어, 최대 시간 값은 8.64 × 1015으로 "+275760-09-13T00:00:00Z"에 대응합니다.
해당 순간의 지역 시간대 오프셋이 UTC보다 1시간 빠른 환경에서는, 입력값이 8.64 × 1015 + 3.6 × 106이 되고 이는 "+275760-09-13T01:00:00+01:00"에 해당합니다.
2017년 11월 5일 America/New_York의 오전 1:30은 두 번 반복되지만, 반드시 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은 존재하지 않지만, 반드시 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입니다.
Note 2
UTC(LocalTime(tUTC))이 항상 tUTC과 같지 않을 수 있습니다. 이에 대응하여 LocalTime(UTC(tlocal)) 또한 항상 tlocal과 같지 않을 수 있습니다.
21.4.1.27 MakeTime ( hour, min, sec, ms )
The abstract operation MakeTime takes arguments hour (Number), min (Number), sec (Number), and ms (Number) and returns Number. It performs the following steps when called:
MakeTime의 연산은 부동소수점 연산(floating-point arithmetic)으로, 결합법칙이 성립하지 않으므로 반드시 올바른 순서로 연산해야 합니다.
21.4.1.28 MakeDay ( year, month, date )
The abstract operation MakeDay takes arguments year (Number), month (Number), and date (Number) and returns Number. It performs the following steps when called:
ECMAScript는 ISO 8601 달력 날짜 확장 형식을 단순화한 날짜-시간 문자열 교환 형식을 정의합니다. 형식은 다음과 같습니다: YYYY-MM-DDTHH:mm:ss.sssZ
각 요소의 의미는 다음과 같습니다:
YYYY
전환 그레고리력의 연도. 0000~9999의 4자리 십진수, 또는 확장 연도(expanded year)로서 "+" 또는 "-" 뒤에 6자리 십진수.
-
"-" (하이픈)은 문자열에 두 번 그대로 나타납니다.
MM
연도의 월(month). 01(1월)~12(12월)까지 두 자리 십진수.
DD
월의 날짜(day). 01~31의 두 자리 십진수.
T
"T"는 문자열에 그대로 나타나며, 시간 요소의 시작임을 나타냅니다.
HH
자정 이후 지난 전체 시간(hour) 수. 00~24의 두 자리 십진수.
:
":" (콜론)은 문자열에 두 번 그대로 나타납니다.
mm
시간(hour) 시작 이후 지난 전체 분(minute) 수. 00~59의 두 자리 십진수.
ss
분(minute) 시작 이후 지난 전체 초(second) 수. 00~59의 두 자리 십진수.
.
"." (점)은 문자열에 그대로 나타납니다.
sss
초(second) 시작 이후 지난 전체 밀리초(millisecond) 수. 세 자리 십진수.
Z
UTC 오프셋 표현. "Z" (오프셋 없는 UTC), 혹은 "+" 또는 "-" 뒤에 시간 표현 HH:mm (UTC 앞 또는 뒤의 지역 시간을 나타내는 시간대 오프셋 문자열 형식의 부분집합)
이 형식은 날짜만을 포함하는 형태도 지원합니다:
YYYY
YYYY-MM
YYYY-MM-DD
또한 위의 날짜만 형식 뒤에 다음 시간 형식이 바로 붙고 선택적 UTC 오프셋 표현이 뒤따르는 “날짜-시간” 형식도 지원합니다:
THH:mm
THH:mm:ss
THH:mm:ss.sss
형식에 맞지 않거나 범위를 벗어난 요소를 포함한 문자열은 이 형식의 유효한 인스턴스가 아닙니다.
Note 1
모든 날짜는 자정으로 시작하고 자정으로 끝나므로, 00:00과 24:00 표기법 모두 한 날짜에 연관된 두 자정을 구분할 수 있습니다. 즉, 1995-02-04T24:00과 1995-02-05T00:00은 정확히 같은 시점을 의미합니다. 후자의 형식을 “달력 날짜의 끝”으로 해석하는 것은 ISO 8601과 일치합니다(이 명세는 시간 구간을 설명할 때만 이 표기를 허용하며 단일 시점 표현에는 허용하지 않음).
Note 2
CET, EST 등과 같은 민간 시간대 약어에 대한 국제 표준은 없으며, 약어가 서로 다른 두 시간대를 동시에 나타낼 수도 있습니다. 이런 이유로 ISO 8601과 이 형식 모두 시간대 오프셋을 숫자 표현으로 지정합니다.
21.4.1.32.1 확장 연도
1970년 1월 1일 기준 약 273,790년 전후의 전체 시간 값 범위를 나타내려면 0년 이전 또는 9999년 이후의 연도 표현이 필요합니다(21.4.1.1). ISO 8601은 연도 표현의 확장을 허용하지만, 정보 교환 당사자 간의 합의가 있을 때만 허용합니다. ECMAScript 단순화 형식에서는 확장 연도 표현이 6자리 숫자로 되어야 하며 항상 + 또는 - 기호가 붙습니다. 0년은 양수로 간주하고 반드시 + 기호를 붙여야 합니다. -000000 형식의 0년 표현은 유효하지 않습니다. 확장 연도가 시간 값 범위를 벗어나는 경우, 날짜-시간 문자열 형식과 일치하는 문자열이라도 Date.parse에서 인식되지 않으며, 해당 함수는 구현별 동작이나 휴리스틱 없이 NaN을 반환합니다.
Note
확장 연도가 포함된 날짜-시간 값 예시:
-271821-04-20T00:00:00Z
기원전 271822년
-000001-01-01T00:00:00Z
기원전 2년
+000000-01-01T00:00:00Z
기원전 1년
+000001-01-01T00:00:00Z
서기 1년
+001970-01-01T00:00:00Z
서기 1970년
+002009-12-15T00:00:00Z
서기 2009년
+275760-09-13T00:00:00Z
서기 275760년
21.4.1.33 시간대 오프셋 문자열 형식
ECMAScript는 ISO 8601에서 파생된 UTC 오프셋의 문자열 교환 형식을 정의합니다.
이 형식은 다음 문법으로 설명됩니다.
이 함수는 인수에 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로, 날짜-시간 형식은 지역 시간으로 해석된다.
어떤 ECMAScript 구현에서 밀리초가 0인 Date x에 대해 다음 모든 표현식은 모든 관련 프로퍼티가 초기값일 때 동일한 숫자 값을 반환해야 한다:
앞의 세 표현식과 동일한 Number 값을 반환할 필요는 없으며, 일반적으로 이 함수가 Date Time String Format (21.4.1.32)에 맞지 않고 해당 구현에서 toString 또는 toUTCString 메서드로 생성할 수 없는 문자열 값을 받으면 반환 값은 구현에 따라 달라진다.
weekday, ",", 코드 유닛 0x0020(공백), day, 코드 유닛 0x0020(공백), month, 코드 유닛 0x0020(공백), yearSign, paddedYear, 코드 유닛 0x0020(공백), TimeString(tv)를 차례로 연결한 문자열을 반환한다.
21.4.4.45 Date.prototype [ %Symbol.toPrimitive% ] ( hint )
이 메서드는 ECMAScript 언어 연산자가 Date를 원시 값으로 변환할 때 호출된다. hint에 허용되는 값은 "default", "number", "string"이다. Date는 내장 ECMAScript 객체 중 유일하게 "default"를 "string"과 동등하게 취급한다. 다른 내장 객체는 "default"를 "number"와 동등하게 취급한다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 String 동작을 상속하려는 서브클래스 생성자는 [[StringData]] 내부 슬롯을 가진 서브클래스 인스턴스를 생성 및 초기화하기 위해 반드시 String 생성자에 대한 super 호출을 포함해야 한다.
이 메서드는 의도적으로 제네릭이다; this 값이 String 객체일 필요가 없다. 따라서 다른 종류의 객체에 이전하여 메서드로 사용할 수 있다.
22.1.3.4 String.prototype.codePointAt ( pos )
Note 1
이 메서드는 이 객체를 String으로 변환한 결과에서 인덱스 pos 위치의 문자열 요소에서 시작하는 UTF-16 인코딩 코드 포인트(6.1.4)의 숫자 값을 나타내는 0x10FFFF𝔽 이하의 음이 아닌 정수 Number를 반환한다. 그 위치에 요소가 없으면 undefined를 반환한다. pos에서 유효한 UTF-16 서로게이트 쌍이 시작하지 않으면 결과는 pos의 코드 유닛이다.
searchString이 이 객체를 String으로 변환한 결과의 position 이상 인덱스들에서 하나 이상 substring으로 나타나면 true를 반환하고, 아니면 false를 반환한다. position이 undefined이면 0을 가정하여 전체 문자열을 검색한다.
Note 2
첫 번째 인수가 RegExp이면 예외를 던지는 것은 향후 버전 확장을 위해서이다.
Note 3
이 메서드는 의도적으로 제네릭이다; this 값이 String 객체일 필요가 없다.
22.1.3.9 String.prototype.indexOf ( searchString [ , position ] )
Note 1
searchString이 이 객체를 String으로 변환한 결과의 position 이상 인덱스 중 하나 이상에서 substring으로 나타나면 그중 가장 작은 인덱스를 반환하고, 아니면 -1𝔽을 반환한다. position이 undefined이면 +0𝔽을 가정하여 전체 문자열을 검색한다.
22.1.3.11 String.prototype.lastIndexOf ( searchString [ , position ] )
Note 1
searchString이 이 객체를 String으로 변환한 결과에서 position 이하 인덱스 하나 이상에서 substring으로 나타나면 그중 가장 큰 인덱스를 반환하고 아니면 -1𝔽을 반환한다. position이 undefined이면 문자열 길이를 가정하여 전체를 검색한다.
ECMA-402 국제화 API를 포함하는 구현은 ECMA-402 명세에 따라 이 메서드를 구현해야 한다. 포함하지 않는 구현은 다음 명세를 사용한다:
이 메서드는 this 값(문자열로 변환된 S)과 that(문자열로 변환된 thatValue)의 구현 정의 로케일 민감 문자열 비교 결과를 나타내는 NaN이 아닌 Number를 반환한다. 결과는 호스트 환경 현재 로케일 관례에 따른 정렬 순서를 반영하며, S가 thatValue 앞이면 음수, 뒤면 양수, 그 외 경우(상대적 순서 없음) 0을 반환한다.
두 번째와 세 번째 선택적 매개변수 의미는 ECMA-402 명세에 정의된다; 이를 포함하지 않는 구현은 다른 해석을 부여해서는 안 된다.
실제 반환 값은 추가 정보를 인코딩할 수 있도록 구현 정의이지만, 두 인수 메서드로 간주될 때 모든 문자열에 대해 총순서를 정의하는 일관된 비교자여야 한다. 또한 이 메서드는 Unicode 표준에 따른 정규( canonical ) 등가성을 인지하고 존중하여 구분 가능하지만 정규 등가인 문자열 비교 시 +0𝔽을 반환해야 한다.
Note 1
이 메서드 자체는 Array.prototype.sort에 직접 넘기기 적합하지 않다. 후자는 두 인수 함수를 요구한다.
Note 2
이 메서드는 호스트 환경이 제공하는 언어/로케일 민감 비교 기능을 사용할 수 있으며, 현재 로케일 규칙에 따라 비교하도록 의도되었다. 그러나 어떤 비교 능력이든 Unicode 표준의 정규 등가성은 반드시 존중해야 한다 — 예: 아래 모든 비교는 +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")
이 메서드는 this 값이 나타내는 문자열에 대해 정규 표현식 매칭을 수행하고 매치 결과를 내는 이터레이터를 반환한다. 각 매치 결과는 첫 요소가 매치된 부분 문자열이고 이후 캡처 그룹에 매치된 부분을 담는 배열이다. 정규 표현식이 전혀 매치되지 않으면 이터레이터는 아무것도 산출하지 않는다.
22.1.3.17.1 StringPaddingBuiltinsImpl ( O, maxLength, fillString, placement )
The abstract operation StringPaddingBuiltinsImpl takes arguments O (ECMAScript 언어 값), maxLength (ECMAScript 언어 값), fillString (ECMAScript 언어 값), and placement (start 또는 end) and returns 정상 완료(문자열) 또는 throw 완료. It performs the following steps when called:
The abstract operation StringPad takes arguments S (문자열), maxLength (음이 아닌 정수), fillString (문자열), and placement (start 또는 end) and returns 문자열. It performs the following steps when called:
stringLength를 S의 길이로 둔다.
maxLength ≤ stringLength이면 S를 반환한다.
fillString이 빈 문자열이면 S를 반환한다.
fillLen을 maxLength - stringLength로 둔다.
truncatedStringFiller를 fillString을 반복 결합한 뒤 길이 fillLen으로 자른 문자열 값으로 둔다.
placement가 start이면 truncatedStringFiller와 S의 문자열 결합을 반환한다.
그렇지 않으면 S와 truncatedStringFiller의 문자열 결합을 반환한다.
Note 1
인수 maxLength는 S의 길이보다 작아질 수 없도록 클램프된다.
Note 2
인수 fillString의 기본값은 " " (코드 유닛 0x0020 SPACE 하나)이다.
22.1.3.17.3 ToZeroPaddedDecimalString ( n, minLength )
The abstract operation ToZeroPaddedDecimalString takes arguments n (음이 아닌 정수) and minLength (음이 아닌 정수) and returns 문자열. It performs the following steps when called:
The abstract operation GetSubstitution takes arguments matched (문자열), str (문자열), position (음이 아닌 정수), captures (문자열 또는 undefined 요소를 갖는 리스트), namedCaptures (객체 또는 undefined), and replacementTemplate (문자열) and returns 정상 완료(문자열) 또는 throw 완료. 이 추상 연산에서 10진 숫자(digital digit)는 0x0030 (DIGIT ZERO)부터 0x0039 (DIGIT NINE)까지 포함 구간의 코드 유닛이다. It performs the following steps when called:
stringLength를 str의 길이로 둔다.
단언: position ≤ stringLength.
result를 빈 문자열로 둔다.
templateRemainder를 replacementTemplate로 둔다.
templateRemainder가 빈 문자열이 아닐 동안 반복,
주: 다음 단계들은 ref ( templateRemainder의 접두사 )를 분리하고 refReplacement (그 치환)를 결정한 뒤 result에 추가한다.
templateRemainder가 "$$"로 시작하면
ref를 "$$"로.
refReplacement를 "$"로.
아니고 "$`"로 시작하면
ref를 "$`"로.
refReplacement를 str의 0부터 position 전까지 부분 문자열로.
아니고 "$&"로 시작하면
ref를 "$&"로.
refReplacement를 matched로.
아니고 "$'" (0x0024 DOLLAR SIGN + 0x0027 APOSTROPHE)로 시작하면
ref를 "$'"로.
matchLength를 matched의 길이로.
tailPos를 position + matchLength로.
refReplacement를 str의 min(tailPos, stringLength)부터 끝까지 부분 문자열로.
참고: tailPos가 stringLength를 넘을 수 있는 경우는 이 추상 연산이 본래 내장 %RegExp.prototype.exec%가 아닌 "exec" 프로퍼티를 가진 객체에서 %RegExp.prototype%의 본래 %Symbol.replace% 호출로 유래했을 때뿐이다.
아니고 "$" 뒤에 1개 이상의 10진 숫자로 시작하면
"$" 뒤에 두 자리 이상 숫자로 시작하면 digitCount를 2로, 아니면 1로 둔다.
digits를 templateRemainder의 1부터 1 + digitCount 전까지 부분 문자열로.
이 메서드는 이 객체를 문자열로 변환한 결과를 분할해 그 부분 문자열들을 담은 배열을 반환한다. 왼쪽에서 오른쪽으로 separator 발생 지점을 찾으며, 이 지점들은 결과 배열 문자열 일부가 아니고 경계를 나눈다. separator 값은 임의 길이의 문자열이거나 %Symbol.split% 메서드를 가진 객체(예: RegExp)일 수 있다.
separator 값은 빈 문자열일 수 있다. 이 경우 separator는 시작/끝의 빈 substring이나 직전 매치 후의 빈 substring와 매치하지 않는다. separator가 빈 문자열이면 문자열은 개별 코드 유닛 요소로 분리되며 결과 배열 길이는 문자열 길이와 같고 각 substring은 한 코드 유닛을 포함한다.
this 값이(또는 변환 결과가) 빈 문자열이면 separator가 빈 문자열과 매치 가능한지 여부에 따라 결과가 달라진다. 매치 가능하면 결과 배열은 비어 있다. 아니면 빈 문자열 하나를 요소로 가진다.
separator가 undefined이면 결과 배열은 this 값(문자열로 변환) 하나만 가진다. limit이 undefined가 아니면 결과 배열은 limit 요소를 넘지 않도록 잘린다.
Note 2
이 메서드는 의도적으로 제네릭이다.
22.1.3.24 String.prototype.startsWith ( searchString [ , position ] )
The abstract operation TrimString takes arguments string (ECMAScript 언어 값) and where (start, end, 또는 start+end) and returns 정상 완료(문자열) 또는 throw 완료. string을 UTF-16 인코딩 코드 포인트 시퀀스로 해석한다. It performs the following steps when called:
The abstract operation ThisStringValue takes argument value (ECMAScript 언어 값) and returns 정상 완료(문자열) 또는 throw 완료. It performs the following steps when called:
String 인스턴스는 String 특수(exotic) 객체이며 해당 객체에 지정된 내부 메서드를 가진다. String 인스턴스는 String 프로토타입 객체로부터 프로퍼티를 상속한다. 또한 [[StringData]] 내부 슬롯을 가지며, 이는 이 String 객체가 표현하는 문자열 값이다.
String 인스턴스는 "length" 프로퍼티와 정수 인덱스 이름을 가진 열거 가능한 프로퍼티 집합을 가진다.
22.1.4.1 length
이 String 객체가 표현하는 문자열 값의 요소 개수.
String 객체가 초기화된 후 이 프로퍼티는 변하지 않는다. 속성은 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }이다.
22.1.5 String 이터레이터 객체
String Iterator는 특정 String 인스턴스 객체에 대한 특정 순회를 나타내는 객체이다. String Iterator 객체에 대한 명명된 생성자는 없다. 대신 특정 String 인스턴스의 메서드를 호출하여 생성된다.
첫 번째 ClassAtom 의 IsCharacterClass 가 true 이거나 두 번째 ClassAtom 의 IsCharacterClass 가 true 이면 구문 오류이다.
첫 번째 ClassAtom 의 IsCharacterClass 가 false, 두 번째 ClassAtom 의 IsCharacterClass 가 false 이고 첫 번째 ClassAtom 의 CharacterValue 가 두 번째 ClassAtom 의 CharacterValue 보다 엄격히 크면 구문 오류이다.
22.2.1.2
정적 의미론: CountLeftCapturingParensWithin (
node: 구문 노드,
): 음이 아닌 정수
The abstract operation UNKNOWN takes UNPARSEABLE ARGUMENTS. node 에 있는 좌측 캡처 괄호(left-capturing parentheses)의 개수를 반환한다. 좌측 캡처 괄호 는 Atom::(GroupSpecifieroptDisjunction) 생성 규칙의 ( 단말 기호에 의해 매치되는 모든 ( 패턴 문자이다.
UTF16SurrogatePairToCodePoint(lead, trail) 을 반환한다.
22.2.2 패턴 의미론 (Pattern Semantics)
정규 표현식 패턴은 아래에 서술된 과정을 통해 추상 클로저(Abstract Closure)로 변환된다. 구현체는 결과가 동일한 한, 아래에 열거된 것보다 더 효율적인 알고리즘을 사용하는 것이 권장된다. 이렇게 생성된 추상 클로저는 RegExp 객체의 [[RegExpMatcher]] 내부 슬롯 값으로 사용된다.
Pattern 은 관련 플래그에 u 와 v 둘 다 포함되지 않으면 BMP 패턴이고, 그렇지 않으면 유니코드 패턴이다. BMP 패턴은 입력 문자열을 BMP(기본 다국어 평면) 범위의 유니코드 코드 포인트들로 구성된 16비트 값 시퀀스로 해석하여 매칭한다. 유니코드 패턴은 입력 문자열을 UTF-16 으로 인코딩된 유니코드 코드 포인트 시퀀스로 해석하여 매칭한다. BMP 패턴의 동작을 설명하는 문맥에서 “문자(character)”는 단일 16비트 유니코드 BMP 코드 포인트를 의미한다. 유니코드 패턴의 동작을 설명하는 문맥에서 “문자”는 UTF-16 으로 인코딩된 하나의 코드 포인트를 의미한다 (6.1.4). 두 문맥 모두에서 “문자 값(character value)”은 해당 (인코딩되지 않은) 코드 포인트의 수치 값을 의미한다.
예를 들어, 소스 텍스트에서 하나의 비-BMP 문자 U+1D11E (MUSICAL SYMBOL G CLEF) 로 표현된 패턴을 생각하자. 유니코드 패턴으로 해석하면 단일 코드 포인트 U+1D11E 를 포함하는 (문자 1개짜리) 단일 요소 리스트가 된다. 그러나 BMP 패턴으로 해석하면 먼저 UTF-16 으로 인코딩되어 코드 유닛 0xD834 와 0xDD1E 두 요소로 이루어진 리스트가 된다.
패턴은 RegExp 생성자에 비-BMP 문자가 UTF-16 으로 인코딩된 ECMAScript 문자열 값으로 전달된다. 예를 들어, 단일 문자 MUSICAL SYMBOL G CLEF 패턴은 길이 2의 문자열로서 그 요소가 코드 유닛 0xD834 와 0xDD1E 이다. 따라서 이를 두 개의 패턴 문자로 이루어진 BMP 패턴으로 처리하기 위해 추가 변환이 필요하지 않다. 그러나 이를 유니코드 패턴으로 처리하려면 UTF16SurrogatePairToCodePoint 를 사용하여 하나의 패턴 문자(코드 포인트 U+1D11E)만을 요소로 갖는 리스트를 생성해야 한다.
구현체는 실제로 UTF-16 으로의 변환이나 역변환을 수행하지 않을 수 있으나, 이 명세의 의미론은 패턴 매칭 결과가 마치 그러한 변환이 수행된 것과 동일해야 한다고 요구한다.
22.2.2.1 표기법 (Notation)
아래 설명에서는 다음의 내부 데이터 구조를 사용한다:
CharSetElement 는 다음 두 가지 중 하나이다:
rer.[[UnicodeSets]] 가 false 이면 CharSetElement 는 위 패턴 의미론의 문맥에서 “문자” 하나이다.
rer.[[UnicodeSets]] 가 true 이면 CharSetElement 는 위 패턴 의미론의 문맥에서 “문자”들로 이루어진 시퀀스이다. 여기에는 빈 시퀀스, 한 문자 시퀀스, 두 문자 이상 시퀀스가 모두 포함된다. 편의를 위해 이런 종류의 CharSetElement 를 다룰 때 개별 문자는 한 문자로 이루어진 시퀀스와 상호 교환적으로 취급된다.
CharSet 은 CharSetElement 들의 수학적 집합이다.
CaptureRange 는 { [[StartIndex]], [[EndIndex]] } 형태의 레코드로, 캡처에 포함된 문자 범위를 나타낸다. [[StartIndex]] 는 Input 내에서 범위 시작(포함)의 정수 인덱스, [[EndIndex]] 는 범위 끝(배타)의 정수 인덱스이다. 모든 CaptureRange 에 대해 [[StartIndex]] ≤ [[EndIndex]] 조건(불변식)을 만족해야 한다.
MatchState 는 { [[Input]], [[EndIndex]], [[Captures]] } 형태의 레코드이며, [[Input]] 은 매칭 중인 문자열을 나타내는 문자들의 리스트, [[EndIndex]] 는 정수, [[Captures]] 는 패턴 안의 각 좌측 캡처 괄호에 대응하는 값들의 리스트이다. MatchState 는 정규 표현식 매칭 알고리즘에서 부분 매칭 상태를 표현한다. [[EndIndex]] 는 지금까지 패턴이 매치한 마지막 입력 문자의 인덱스보다 1 큰 값이며, [[Captures]] 는 캡처 괄호의 결과를 담는다. [[Captures]] 의 n번째 요소는 n번째 캡처 괄호가 캡처한 문자 범위를 나타내는 CaptureRange 이거나, 해당 캡처 괄호에 아직 도달하지 않았다면 undefined 이다. 백트래킹 때문에 매칭 과정 중 언제든 다수의 MatchState 가 사용될 수 있다.
MatcherContinuation 은 하나의 MatchState 인수를 받아 MatchState 또는 failure 를 반환하는 추상 클로저이다. MatcherContinuation 은 (클로저의 캡처된 값들에 의해 지정되는) 패턴의 남은 부분을 Input 에 대해, 인수로 전달된 MatchState 가 나타내는 중간 상태부터 매칭하려 시도한다. 매칭이 성공하면 도달한 최종 MatchState 를 반환하고, 실패하면 failure 를 반환한다.
cap 을 rer.[[CapturingGroupsCount]] 개의 undefined 값(인덱스 1..rer.[[CapturingGroupsCount]])을 가진 리스트로 둔다.
x 를 MatchState { [[Input]]: Input, [[EndIndex]]: index, [[Captures]]: cap } 로 둔다.
m(x, c) 를 반환한다.
Note
Pattern 은 추상 클로저 값으로 컴파일된다. RegExpBuiltinExec 는 그런 절차를 문자 리스트와 그 안의 오프셋에 적용하여, 패턴이 정확히 그 오프셋에서 매칭되는지, 그리고 매칭된다면 캡처 괄호 값이 무엇인지 결정할 수 있다. 22.2.2 의 알고리즘들은 패턴 컴파일이 SyntaxError 예외를 던질 수 있도록 설계되어 있다; 반면 패턴이 성공적으로 컴파일된 후에는 (메모리 부족 등 구현 정의 예외를 제외하고) 결과 추상 클로저를 적용하여 문자 리스트에서 매칭을 찾는 동작이 예외를 던지지 않는다.
22.2.2.3 런타임 의미론: CompileSubpattern : Matcher
The syntax-directed operation UNKNOWN takes UNPARSEABLE ARGUMENTS.
| 연산자는 두 개의 대안을 구분한다. 패턴은 먼저 왼쪽 Alternative (및 뒤따르는 정규 표현식 나머지)를 매칭 시도하고, 실패하면 오른쪽 Disjunction (및 나머지)를 매칭 시도한다. 왼쪽 Alternative, 오른쪽 Disjunction, 그리고 나머지가 모두 선택 지점(choice point)을 가진다면, 왼쪽 Alternative 의 다음 선택으로 진행하기 전에 나머지의 모든 선택을 시도한다. 왼쪽 Alternative 의 선택이 다 소진되면 왼쪽 대신 오른쪽 Disjunction 을 시도한다. | 로 건너뛰어진 패턴 부분 내의 캡처 괄호는 문자열이 아니라 undefined 값을 생성한다. 예:
연속된 Term 들은 Input 의 연속된 부분들을 동시에 매칭하려 시도한다. direction 이 forward 일 때, 왼쪽 Alternative, 오른쪽 Term, 그리고 나머지에 모두 선택 지점이 있다면 오른쪽 Term 의 다음 선택으로 가기 전에 나머지의 모든 선택을 시도하고, 왼쪽 Alternative 의 다음 선택으로 가기 전에 오른쪽 Term 의 모든 선택을 시도한다. direction 이 backward 이면 Alternative 와 Term 의 평가 순서가 반전된다.
The abstract operation RepeatMatcher takes arguments m (Matcher), min (음이 아닌 정수), max (음이 아닌 정수 또는 +∞), greedy (Boolean), x (MatchState), c (MatcherContinuation), parenIndex (음이 아닌 정수), and parenCount (음이 아닌 정수) and returns MatchState 또는 failure. It performs the following steps when called:
max = 0 이면 c(x) 를 반환한다.
d 를 매개변수 (y) 를 가지며 m, min, max, greedy, x, c, parenIndex, parenCount 를 캡처하고 호출 시 다음을 수행하는 새 MatcherContinuation 으로 둔다:
min = 0 이고 y.[[EndIndex]] = x.[[EndIndex]] 이면 failure 를 반환한다.
min = 0 이면 min2 = 0, 그렇지 않으면 min2 = min - 1 로 둔다.
max = +∞ 이면 max2 = +∞, 아니면 max2 = max - 1 로 둔다.
RepeatMatcher(m, min2, max2, greedy, y, c, parenIndex, parenCount) 를 반환한다.
cap 을 x.[[Captures]] 의 복사본으로 둔다.
parenIndex + 1 부터 parenIndex + parenCount 까지 (포함) 정수 k 각각에 대해 cap[k] = undefined 로 설정한다.
Input 을 x.[[Input]] 으로 둔다.
e 를 x.[[EndIndex]] 로 둔다.
xr 을 MatchState { [[Input]]: Input, [[EndIndex]]: e, [[Captures]]: cap } 로 둔다.
min ≠ 0 이면 m(xr, d) 를 반환한다.
greedy 가 false 이면
z 를 c(x) 로 둔다.
z 가 failure 가 아니면 z 반환.
m(xr, d) 를 반환한다.
z 를 m(xr, d) 로 둔다.
z 가 failure 가 아니면 z 반환.
c(x) 를 반환한다.
Note 1
Atom 뒤에 Quantifier 가 오면 Quantifier 가 지정한 횟수만큼 Atom 이 반복된다. Quantifier 는 비탐욕적(non-greedy)일 수 있으며, 이 경우 Atom 패턴은 나머지를 매칭 가능하게 유지하는 최소 횟수만 반복된다. 탐욕적(greedy)이면 가능한 한 많이 반복된다. 반복되는 것은 입력 문자 시퀀스가 아니라 Atom 패턴이므로 각 반복은 서로 다른 입력 부분 문자열을 매칭할 수 있다.
Note 2
Atom 과 정규 표현식의 나머지가 모두 선택 지점을 가진다면, Atom 은 먼저 가능한 많이(또는 비탐욕적이면 가능한 적게) 매칭된다. 나머지 부분의 모든 선택이 소진되기 전까지 Atom 의 마지막 반복의 다음 선택으로 이동하지 않는다. 마지막 (n번째) 반복의 모든 선택이 소진되기 전까지 (n - 1)번째 반복의 다음 선택으로 이동하지 않는다. 그 시점에서 Atom 을 더 많이 또는 더 적게 반복할 수 있게 될 수도 있으며, (다시 최소 또는 최대부터 시작하여) 이것들을 소진한 뒤 (n - 1)번째 반복의 다음 선택으로 이동한다.
비교:
/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 의 gcd 를 계산한다:
The abstract operation MatchTwoAlternatives takes arguments m1 (Matcher) and m2 (Matcher) and returns Matcher. It performs the following steps when called:
m1, m2 를 캡처하고 매개변수 (x, c) 를 가지며 호출 시 다음을 수행하는 새 Matcher 를 반환한다:
The abstract operation MatchSequence takes arguments m1 (Matcher), m2 (Matcher), and direction (forward 또는 backward) and returns Matcher. It performs the following steps when called:
direction 이 forward 이면
m1, m2 를 캡처하고 매개변수 (x, c) 를 가지며 호출 시 다음을 수행하는 새 Matcher 를 반환한다:
z 를 MatchState { [[Input]]: Input, [[EndIndex]]: xe, [[Captures]]: cap } 로 둔다.
c(z) 반환.
Note 3
(?=Disjunction) 형식은 폭 0 양수 전방 탐색(positive lookahead)을 지정한다. 성공하려면 Disjunction 내부 패턴이 현재 위치에서 매치되어야 하지만, 나머지를 매칭하기 전에 현재 위치는 전진하지 않는다. Disjunction 이 현재 위치에서 여러 방식으로 매치 가능하면 첫 번째 방식만 시도된다. 다른 정규 표현식 연산자와 달리 (?= 형식 안으로의 백트래킹은 없다(이 비정상적 동작은 Perl 에서 유래). 이는 Disjunction 이 캡처 괄호를 포함하고 패턴의 나머지 부분이 그 캡처에 대한 역참조를 포함할 때에만 중요하다.
(?!Disjunction) 형식은 폭 0 음수 전방 탐색(negative lookahead)을 지정한다. 성공하려면 Disjunction 내부 패턴이 현재 위치에서 매치에 실패해야 한다. 현재 위치는 나머지를 매칭하기 전에 전진하지 않는다. Disjunction 은 캡처 괄호를 포함할 수 있지만, 그 캡처에 대한 역참조는 Disjunction 내부에서만 의미가 있다. 패턴의 다른 부분에서 이 캡처에 대한 역참조는 항상 undefined 를 반환하는데, 음수 전방 탐색은 실패해야 전체 패턴이 성공하기 때문이다. 예:
/(.*?)a(?!(a+)b\2c)\2(.*)/.exec("baaabaac")
이 표현식은 a 뒤에 즉시 n 개의 a, 하나의 b, 다시 n 개의 a(첫 번째 \2 로 지정), 그리고 c 가 오는 패턴이 아닌 경우를 찾는다. 두 번째 \2 는 음수 전방 탐색 밖에 있으므로 undefined 와 매치되어 항상 성공한다. 전체 표현식은 배열:
The abstract operation IsWordChar takes arguments rer (RegExp Record), Input (문자 리스트), and e (정수) and returns Boolean. It performs the following steps when called:
r 를 CaptureRange { [[StartIndex]]: ye, [[EndIndex]]: xe } 로 둔다.
cap[parenIndex + 1] = r 로 설정.
z 를 MatchState { [[Input]]: Input, [[EndIndex]]: ye, [[Captures]]: cap } 로 둔다.
c(z) 반환.
m(x, d) 반환.
Note 2
(Disjunction) 형태의 괄호는 Disjunction 패턴 구성요소를 그룹화하고 매치 결과를 저장한다. 결과는 역참조(\ + 0이 아닌 10진수), 치환 문자열(replace String)에서 참조, 또는 정규 표현식 매칭 추상 클로저가 반환하는 배열의 일부로 사용될 수 있다. 괄호의 캡처 동작을 억제하려면 (?:Disjunction) 형태를 사용한다.
\ + 0이 아닌 10진수 n 형태의 이스케이프는 n번째 캡처 괄호의 결과(22.2.2.1)와 매치된다. 정규 표현식이 n 개보다 적은 캡처 괄호를 가지면 오류이다. 정규 표현식이 n 개 이상 캡처 괄호를 가지지만 n번째 괄호가 아무 것도 캡처하지 않아 undefined 이면 해당 역참조는 항상 성공한다.
22.2.2.7.1 CharacterSetMatcher ( rer, A, invert, direction )
The abstract operation CharacterSetMatcher takes arguments rer (RegExp Record), A (CharSet), invert (Boolean), and direction (forward 또는 backward) and returns Matcher. It performs the following steps when called:
y 를 MatchState { [[Input]]: Input, [[EndIndex]]: f, [[Captures]]: cap } 로 둔다.
c(y) 반환.
22.2.2.7.2 BackreferenceMatcher ( rer, ns, direction )
The abstract operation BackreferenceMatcher takes arguments rer (RegExp Record), ns (양의 정수 리스트), and direction (forward 또는 backward) and returns Matcher. It performs the following steps when called:
rer, ns, direction 을 캡처하고 매개변수 (x, c) 를 가지며 호출 시 다음을 수행하는 새 Matcher 반환:
u 를 Unicode Default Case Conversion 알고리즘에 따라 toUppercase(« cp ») 로 둔다.
uStr 를 CodePointsToString(u) 로 둔다.
uStr 길이 ≠ 1 이면 ch 반환.
cu 를 uStr 의 단일 코드 유닛 요소로 둔다.
ch 의 수치 값 ≥ 128 이고 cu 의 수치 값 < 128 이면 ch 반환.
cu 반환.
Note
HasEitherUnicodeFlag(rer) 가 true 이고 대소문자 구분이 무시될 때, 모든 문자는 비교 직전에 Unicode Standard 가 제공하는 simple case folding 으로 암묵적으로 폴딩된다. simple 매핑은 항상 단일 코드 포인트로 매핑하므로 ß (U+00DF) 를 ss 나 SS 로 매핑하지 않는다. 그러나 Basic Latin 블록 밖의 코드 포인트를 그 안으로 매핑할 수 있다 (예: ſ → s, K → k). 이런 코드 포인트를 포함하는 문자열은 /[a-z]/ui 같은 정규 표현식에 매치된다.
HasEitherUnicodeFlag(rer) 가 false 인 대소문자 비구분 매칭에서는 toCasefold 대신 Unicode 기본 대문자 변환 toUppercase 기반 매핑을 사용하므로 약간 차이가 난다. 예를 들어 Ω (U+2126) 는 toUppercase 로 자기 자신을 반환하지만 toCasefold 로는 ω (U+03C9) 와 Ω (U+03A9) 와 함께 ω 로 매핑된다. 따라서 "\u2126" 는 /[ω]/ui, /[\u03A9]/ui 에 매치되지만 /[ω]/i, /[\u03A9]/i 에는 매치되지 않는다. 또한 Basic Latin 블록 밖 코드 포인트가 그 안으로 매핑되지 않으므로 "\u017F ſ", "\u212A K" 는 /[a-z]/i 에 매치되지 않는다.
22.2.2.7.4 UpdateModifiers ( rer, add, remove )
The abstract operation UpdateModifiers takes arguments rer (RegExp Record), add (String), and remove (String) and returns RegExp Record. It performs the following steps when called:
패턴이 대소문자를 무시하더라도 범위의 두 끝 문자 대소문자는 범위에 속하는 문자를 결정하는 데 여전히 중요하다. 예를 들어 /[E-F]/i 는 E, F, e, f 만 매치하지만 /[E-f]/i 는 Unicode Basic Latin 블록의 모든 대소문자와 [, \, ], ^, _, ` 기호를 매치한다.
Note 4
- 문자는 리터럴로 취급되거나 범위를 나타낼 수 있다. ClassContents 의 첫/마지막 문자, 범위의 시작/끝 경계, 또는 범위 지정 직후에 나타나면 리터럴로 취급된다.
ClassAtom 은 정규 표현식 다른 부분에서 허용되는 이스케이프 대부분을 사용할 수 있으나 \b, \B, 역참조는 제외된다. CharacterClass 내부에서 \b 는 백스페이스 문자를 의미하며, \B 와 역참조는 오류이다. ClassAtom 내에서 역참조를 사용하면 오류가 발생한다.
The abstract operation HasEitherUnicodeFlag takes argument rer (RegExp Record) and returns Boolean. It performs the following steps when called:
rer.[[Unicode]] 가 true 이거나 rer.[[UnicodeSets]] 가 true 이면
true 반환.
false 반환.
22.2.2.9.3 WordCharacters ( rer )
The abstract operation WordCharacters takes argument rer (RegExp Record) and returns CharSet. \b, \B, \w, \W 판단에 사용되는 “단어 문자”들을 포함하는 CharSet 반환 It performs the following steps when called:
basicWordChars 를 ASCII 단어 문자를 모두 포함하는 CharSet 으로 둔다.
extraWordChars 를 basicWordChars 에 없지만 Canonicalize(rer, c) 가 basicWordChars 에 있는 문자 c 전부를 포함하는 CharSet 으로 둔다.
Assert: extraWordChars 는 HasEitherUnicodeFlag(rer) 가 true 이고 rer.[[IgnoreCase]] 가 true 인 경우를 제외하면 비어 있음.
basicWordChars 와 extraWordChars 합집합 반환.
22.2.2.9.4 AllCharacters ( rer )
The abstract operation AllCharacters takes argument rer (RegExp Record) and returns CharSet. 정규 표현식 플래그에 따른 “모든 문자” 집합을 반환한다. It performs the following steps when called:
The abstract operation MaybeSimpleCaseFolding takes arguments rer (RegExp Record) and A (CharSet) and returns CharSet. rer.[[UnicodeSets]] 가 false 이거나 rer.[[IgnoreCase]] 가 false 이면 A 를 반환한다. 그렇지 않으면 Unicode Character Database 의 Simple Case Folding (scf(cp)) 정의(각각 단일 코드 포인트를 다른 단일 코드 포인트로 매핑)를 사용하여 A 의 각 CharSetElement 를 문자 단위로 정규 형태로 매핑한 결과 CharSet 을 반환한다. It performs the following steps when called:
rer.[[UnicodeSets]]false 또는 rer.[[IgnoreCase]]false 이면 A 반환.
The abstract operation CharacterComplement takes arguments rer (RegExp Record) and S (CharSet) and returns CharSet. It performs the following steps when called:
The abstract operation UnicodeMatchProperty takes arguments rer (RegExp Record) and p (ECMAScript 소스 텍스트) and returns 유니코드 속성 이름. It performs the following steps when called:
rer.[[UnicodeSets]] 가 true 이고 p 가 Table 69 의 “Property name” 열에 열거된 유니코드 property name 이면
유니코드 코드 포인트 p 의 리스트 반환.
Assert: p 는 Table 67 또는 Table 68 의 “Property name and aliases” 열에 열거된 유니코드 property name 또는 별칭.
c 를 해당 행의 “Canonical property name” 열에 주어진 p 의 canonical property name 리스트로 둔다.
유니코드 코드 포인트 c 리스트 반환.
구현체는 Table 67, Table 68, Table 69 에 열거된 유니코드 속성 이름 및 별칭을 지원해야 한다. 상호 운용성을 위해 다른 이름이나 별칭은 지원하면 안 된다.
Note 1
예: Script_Extensions (속성 이름) 과 scx (별칭)는 유효하지만 script_extensions, Scx 는 유효하지 않다.
The abstract operation UnicodeMatchPropertyValue takes arguments p (ECMAScript 소스 텍스트) and v (ECMAScript 소스 텍스트) and returns 유니코드 속성 값. It performs the following steps when called:
Assert: p 는 Table 67 의 “Canonical property name” 열에 열거된 canonical, 비별칭 유니코드 속성 이름.
22.2.3 RegExp 생성용 추상 연산 (Abstract Operations for RegExp Creation)
22.2.3.1 RegExpCreate ( P, F )
The abstract operation RegExpCreate takes arguments P (ECMAScript 언어 값) and F (String 또는 undefined) and returns Object 를 포함하는 정상 완료(normal completion) 또는 throw completion. It performs the following steps when called:
The abstract operation RegExpAlloc takes argument newTarget (생성자(constructor)) and returns Object 를 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
obj 를 ? OrdinaryCreateFromConstructor(newTarget, "%RegExp.prototype%", « [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], [[RegExpMatcher]] ») 로 둔다.
! DefinePropertyOrThrow(obj, "lastIndex", PropertyDescriptor { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }) 를 수행한다.
obj 를 반환한다.
22.2.3.3 RegExpInitialize ( obj, pattern, flags )
The abstract operation RegExpInitialize takes arguments obj (Object), pattern (ECMAScript 언어 값), and flags (ECMAScript 언어 값) and returns Object 를 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
capturingGroupsCount 를 CountLeftCapturingParensWithin(parseResult) 로 둔다.
rer 를 RegExp Record { [[IgnoreCase]]: i, [[Multiline]]: m, [[DotAll]]: s, [[Unicode]]: u, [[UnicodeSets]]: v, [[CapturingGroupsCount]]: capturingGroupsCount } 로 둔다.
obj.[[RegExpRecord]] = rer.
obj.[[RegExpMatcher]] = CompilePattern of parseResult with argument rer.
패턴이 StringLiteral 로 제공되면, 본 함수가 처리하기 전에 일반적인 이스케이프 시퀀스 치환이 수행된다. 패턴이 이스케이프 시퀀스를 포함해야 인식되는 경우, StringLiteral 구성 시 제거되지 않도록 U+005C (REVERSE SOLIDUS) 코드 포인트는 이중 이스케이프되어야 한다.
22.2.5 RegExp 생성자의 프로퍼티 (Properties of the RegExp Constructor)
이름이 비슷하지만 EscapeRegExpPattern 과 RegExp.escape 는 다른 일을 한다. 전자는 패턴을 문자열로 표현하기 위해 이스케이프하고, 후자는 문자열을 패턴 안에 표현하기 위해 이스케이프한다.
22.2.5.1.1 EncodeForRegExpEscape ( cp )
The abstract operation EncodeForRegExpEscape takes argument cp (코드 포인트) and returns String. cp 를 매칭하는 Pattern 을 나타내는 String 을 반환한다. cp 가 공백 또는 ASCII 구두점이면 이스케이프 시퀀스를 반환하고, 그렇지 않으면 cp 자체의 String 표현을 반환한다. It performs the following steps when called:
codeUnits 요소들로 이루어진 String 반환. codeUnits 비어 있으면 빈 String 반환.
22.2.6.4.1 RegExpHasFlag ( R, codeUnit )
The abstract operation RegExpHasFlag takes arguments R (ECMAScript 언어 값) and codeUnit (코드 유닛) and returns Boolean 또는 undefined 를 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
S 를: P 를 UTF-16 인코딩된 코드 포인트로 해석(6.1.4)한 것과 동등한 patternSymbol 형태의 String 으로 하고, 아래에서 기술한 특정 코드 포인트를 이스케이프한 값으로 둔다. S 는 P 와 다를 수도 동일할 수도 있다. S 를 patternSymbol 로 평가해 얻는 추상 클로저는 객체의 [[RegExpMatcher]] 가 주는 추상 클로저와 동일하게 동작해야 한다. 동일한 P, F 로 여러 번 호출 시 결과는 동일해야 한다.
패턴에 나타나는 / 또는 LineTerminator 는 "/", S, "/", F 의 연결이 동등한 동작의 RegularExpressionLiteral 로 파싱 가능하도록 필요 시 이스케이프해야 한다. 예: P = "/" 이면 S 는 "\/" 또는 "\u002F" 등 가능하나 "/" 는 불가 ( ///+F 는 SingleLineComment 로 파싱 ). P 가 빈 String 이면 S = "(?:)" 로 충족할 수 있다.
S 반환.
Note
RegExp.escape 와 EscapeRegExpPattern 은 목적이 다르다. 전자는 문자열을 패턴 내부 표현용으로, 후자는 패턴을 문자열 표현용으로 이스케이프한다.
이 메서드는 string 을 String 으로 변환한 결과를 왼쪽에서 오른쪽으로 정규 표현식 매치 경계를 찾아 나눈 부분 문자열들을 Array 에 저장해 반환한다. 매치된 부분들은 반환 배열에 포함되지 않고 구분자로만 사용된다.
this 값이 빈 정규식이거나 빈 String 과 매치 가능한 정규식일 수 있다. 이 경우 입력 String 시작·끝 혹은 이전 구분자 매치 끝의 빈 substring 과는 매치하지 않는다. (예: 패턴이 빈 String 과 매치하면 문자열은 개별 코드 유닛 요소로 분해되어 결과 배열 길이는 문자열 길이와 같고 각 substring 은 한 코드 유닛을 가진다.) 특정 인덱스에서 백트래킹으로 비어 있지 않은 매치가 가능하더라도 첫 번째 매치만 고려한다. (예: /a*?/[Symbol.split]("ab") → ["a", "b"], /a*/[Symbol.split]("ab") → ["","b"])
string 이 빈 String (또는 변환 결과가 빈 String)이면 정규식이 빈 String 과 매치 가능한지 여부에 따라 결과가 달라진다. 가능하면 결과 배열은 비어 있고, 불가능하면 결과 배열은 빈 String 하나를 가진다.
정규식이 캡처 괄호를 포함하면 separator 매치 때마다 ( undefined 포함 ) 각 캡처 결과가 출력 배열에 삽입된다. 예:
22.2.7 RegExp 매칭용 추상 연산 (Abstract Operations for RegExp Matching)
22.2.7.1 RegExpExec ( R, S )
The abstract operation RegExpExec takes arguments R (Object) and S (String) and returns Object 또는 null 을 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
호출 가능한 "exec" 프로퍼티가 없으면 내장 매칭 알고리즘을 사용한다. 이는 이전 버전과의 호환을 위해, 당시 대부분의 내장 알고리즘이 "exec" 의 동적 조회를 수행하지 않았던 동작을 유지한다.
22.2.7.2 RegExpBuiltinExec ( R, S )
The abstract operation RegExpBuiltinExec takes arguments R (초기화된 RegExp 인스턴스) and S (String) and returns Array exotic object 또는 null 을 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
The abstract operation AdvanceStringIndex takes arguments S (String), index (음이 아닌 정수), and unicode (Boolean) and returns 정수. It performs the following steps when called:
The abstract operation GetStringIndex takes arguments S (String) and codePointIndex (음이 아닌 정수) and returns 음이 아닌 정수. S 를 UTF-16 인코딩된 코드 포인트 시퀀스로 해석하고 codePointIndex 번째 코드 포인트에 대응하는 코드 유닛 인덱스를 반환한다. 존재하지 않으면 S 길이를 반환한다. It performs the following steps when called:
The abstract operation GetMatchString takes arguments S (String) and match (Match Record) and returns String. It performs the following steps when called:
Assert: match.[[StartIndex]] ≤ match.[[EndIndex]] ≤ S 길이.
S 의 [match.[[StartIndex]], match.[[EndIndex]]) 부분 문자열 반환.
22.2.7.7 GetMatchIndexPair ( S, match )
The abstract operation GetMatchIndexPair takes arguments S (String) and match (Match Record) and returns Array. It performs the following steps when called:
Assert: match.[[StartIndex]] ≤ match.[[EndIndex]] ≤ S 길이.
The abstract operation MakeMatchIndicesIndexPairArray takes arguments S (String), indices (Match Record 또는 undefined 의 List), groupNames (String 또는 undefined 의 List), and hasGroups (Boolean) and returns Array. It performs the following steps when called:
22.2.8 RegExp 인스턴스의 프로퍼티 (Properties of RegExp Instances)
RegExp 인스턴스는 RegExp 프로토타입으로부터 프로퍼티를 상속하는 일반 객체다. [[OriginalSource]], [[OriginalFlags]], [[RegExpRecord]], [[RegExpMatcher]] 내부 슬롯을 가지며 [[RegExpMatcher]] 값은 해당 RegExp 객체 Pattern 의 추상 클로저 표현이다.
Note
ECMAScript 2015 이전에는 RegExp 인스턴스가 자체 데이터 프로퍼티"source", "global", "ignoreCase", "multiline" 를 가진다고 명세되었으나, 이제 RegExp.prototype 의 접근자 프로퍼티로 정의된다.
RegExp 인스턴스는 다음 프로퍼티도 가진다:
22.2.8.1 lastIndex
"lastIndex" 프로퍼티 값은 다음 매치를 시작할 String 인덱스를 지정한다. 사용 시 정수 Number 로 강제된다( 22.2.7.2 참조 ). 이 프로퍼티 특성은 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 이다.
RegExp String Iterator 는 특정 RegExp 인스턴스 객체를 사용하여 특정 String 인스턴스 객체 위를 순회(iteration)하는 과정을 표현하는 객체이다. RegExp String Iterator 객체에 대한 이름 있는 생성자는 없으며, 대신 RegExp 인스턴스 객체의 특정 메서드를 호출할 때 생성된다.
The abstract operation CreateRegExpStringIterator takes arguments R (Object), S (String), global (Boolean), and fullUnicode (Boolean) and returns Object. It performs the following steps when called:
생성자가 아니라 함수로 호출될 때도 새 Array 를 생성하고 초기화한다. 따라서 함수 호출 Array(…) 는 동일한 인자를 갖는 객체 생성 식 new Array(…) 와 동등하다.
인자 개수와 타입에 따라 동작이 달라지는 함수이다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 이그조틱 Array 동작을 상속하려는 서브클래스 생성자는 Array 이그조틱 객체인 서브클래스 인스턴스를 초기화하기 위해 Array 생성자에 대한 super 호출을 포함해야 한다. 그러나 대부분의 Array.prototype 메서드는 this 값이 Array 이그조틱 객체일 필요가 없는 제네릭 메서드이다.
23.1.1.1 Array ( ...values )
이 함수는 호출될 때 다음 단계를 수행한다:
NewTarget 이 undefined 이면 newTarget 을 활성 함수 객체로; 아니면 newTarget = NewTarget.
단계 6 에서 "length" 프로퍼티를 명시적으로 설정하는 것은 items 의 마지막 비어 있지 않은 요소에 후행 홀(holes)이 있거나 A 가 내장 Array 가 아닌 경우 길이가 정확하도록 하기 위함이다.
Note 2
이 메서드는 의도적으로 제네릭하며 this 값이 Array 일 필요가 없다. 따라서 다른 종류의 객체에 메서드로 이전 가능하다.
23.1.3.2.1 IsConcatSpreadable ( O )
The abstract operation IsConcatSpreadable takes argument O (ECMAScript 언어 값) and returns Boolean 을 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
callback 은 세 인자를 받고 Boolean 으로 강제 가능한 값을 반환하는 함수여야 한다. every 는 배열에 존재하는 각 요소에 대해(누락 요소 제외) 오름차순으로 callback 을 호출하며 callback 이 false 를 반환하는 요소를 찾으면 즉시 false 를 반환한다. 찾지 못하면 true 반환. 배열의 누락된 요소에 대해서는 호출되지 않는다.
thisArg 가 제공되면 각 호출의 this 값으로 사용되고, 아니면 undefined 사용.
callback 은 (요소 값, 요소 인덱스, 탐색 중인 객체) 3개 인자로 호출.
every 자체는 객체를 직접 변경하지 않지만 callback 호출로 인해 변경될 수 있다.
every 가 처리할 요소 범위는 첫 호출 전에 고정된다. 이후 추가된 요소는 방문되지 않고, 값이 변경된 기존 요소는 방문 시점의 값이 전달되며, 방문 전에 삭제된 요소는 방문하지 않는다. 공집합(빈 배열)에 대해 true 를 반환한다.
23.1.3.12.1 FindViaPredicate ( O, len, direction, predicate, thisArg )
The abstract operation FindViaPredicate takes arguments O (Object), len (음이 아닌 정수), direction (ascending 또는 descending), predicate (ECMAScript 언어 값), and thisArg (ECMAScript 언어 값) and returns [[Index]] (정수 Number), [[Value]] (ECMAScript 언어 값) 필드를 가진 Record 를 포함하는 정상 완료 또는 throw completion.
O 는 배열 유사 객체 또는 TypedArray 여야 한다. 이 연산은 direction 에 따라 오름차순 또는 내림차순 인덱스 순서로 각 요소에 대해 predicate 를 호출하고, true 로 강제 가능한 값을 반환하면 그 요소의 인덱스와 값을 담은 Record 를 반환한다. 없다면 인덱스 -1𝔽, 값 undefined 인 Record 반환.
predicate 는 함수여야 하며 (요소 값, 요소 인덱스, 순회 객체)의 인자를 받는다. 반환값은 Boolean 으로 강제된다.
thisArg 는 각 호출의 this 값.
이 연산 자체는 객체를 직접 변이하지 않지만 predicate 호출로 변이될 수 있다.
처리 범위는 순회 직전 고정. 이후 추가 요소는 방문되지 않고, 변경된 요소 값은 방문 시 값, 순회 시작 후 방문 전 삭제된 요소는 여전히 방문되며 프로토타입에서 조회되거나 undefined 가 된다.
The abstract operation FlattenIntoArray takes arguments target (Object), source (Object), sourceLen (음이 아닌 정수), start (음이 아닌 정수), and depth (음이 아닌 정수 또는 +∞) and optional arguments mapperFunction (함수 객체) and thisArg (ECMAScript 언어 값) and returns 음이 아닌 정수를 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
Assert: mapperFunction 이 존재하면 IsCallable(mapperFunction) = true, thisArg 존재, 그리고 depth = 1.
callback 은 네 인자를 받는 함수. reduce 는 첫 요소 이후 각 존재 요소에 대해 오름차순 호출.
인자: previousValue, currentValue, currentIndex, 순회 객체. 첫 호출 시 initialValue 가 제공되면 previousValue = initialValue, currentValue = 첫 값; 없으면 previousValue = 첫 값, currentValue = 두 번째 값. 요소 없고 initialValue 미제공 시 TypeError.
직접 변이하지 않지만 호출로 변이될 수 있음.
처리 범위는 시작 전 고정. 이후 추가 요소 방문 안 함; 변경 요소 값은 방문 시 값; 삭제된 요소 방문 안 함.
callback 은 네 인자를 받는 함수. reduceRight 는 마지막 요소 이전 각 존재 요소를 내림차순 호출.
첫 호출 시 initialValue 있으면 previousValue = initialValue, currentValue = 마지막 값; 없으면 previousValue = 마지막 값, currentValue = 끝에서 두 번째. 요소 없고 initialValue 없으면 TypeError.
The abstract operation SortIndexedProperties takes arguments obj (Object), len (음이 아닌 정수), SortCompare (두 매개변수 추상 클로저), and holes (skip-holes 또는 read-through-holes) and returns ECMAScript 언어 값List 를 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
정렬 순서 는 위 알고리즘 단계 4 완료 후 items 의 순서. SortCompare 가 일관 비교자가 아니면 구현 정의. Array.prototype.sort 또는 Array.prototype.toSorted 가 호출할 때 comparator 가 undefined 이고 특정 값에 대한 모든 ToString 적용 결과가 동일하지 않으면 정렬 순서 역시 구현 정의.
old[j] 표기는 단계 4 실행 전 items[j] 를, new[j] 표기는 실행 후 items[j] 를 의미.
추상 클로저 또는 함수 comparator 가 집합 S 에 대한 일관 비교자 이려면 S 내 값 a, b, c (동일 가능)에 대해 다음 조건 만족: a <Cb 는 ℝ(comparator(a, b)) < 0, a =Cb 는 0, a >Cb 는 > 0 뜻.
특정 (a, b) 쌍에 대해 comparator(a, b) 는 항상 동일 v (Number, NaN 아님) 반환. 따라서 정확히 하나만 성립.
comparator(a, b) 호출은 obj 또는 그 프로토타입 체인 객체를 수정하지 않는다.
a =Ca (반사성)
a =Cb ⇒ b =Ca (대칭성)
a =Cb, b =Cc ⇒ a =Cc (이행성)
a <Cb, b <Cc ⇒ a <Cc
a >Cb, b >Cc ⇒ a >Cc
Note
위 조건은 comparator 가 S 를 등가류로 나누고 그 등가류가 전순서를 갖도록 하는 데 필요충분.
23.1.3.30.2 CompareArrayElements ( x, y, comparator )
The abstract operation CompareArrayElements takes arguments x (ECMAScript 언어 값), y (ECMAScript 언어 값), and comparator (함수 객체 또는 undefined) and returns Number 를 포함하는 정상 완료 또는 abrupt completion. It performs the following steps when called:
x, y 둘 다 undefined 이면 +0𝔽 반환.
x 가 undefined 이면 1𝔽 반환.
y 가 undefined 이면 -1𝔽 반환.
comparator ≠ undefined 이면
v = ? ToNumber(? Call(comparator, undefined, « x, y »)).
이 객체의 자체 프로퍼티 이름들은 ECMAScript 2015 이전 Array.prototype 표준 프로퍼티가 아니던 이름들이다. 이 이름들은 with 문 바인딩 목적에서 무시되어, Array 를 바인딩 객체로 사용하는 with 문에 의해 외부 스코프 바인딩이 가려지는 기존 코드 동작을 보존한다.
"with" 이 unscopableList 에 포함되지 않는 이유는 이미 예약어 이기 때문이다.
23.1.4 Array 인스턴스의 프로퍼티 (Properties of Array Instances)
Array 인스턴스는 "length" 프로퍼티와 배열 인덱스 이름을 가진 열거 가능한 프로퍼티 집합을 가진다.
23.1.4.1 length
Array 인스턴스의 "length" 프로퍼티는 그 값이 배열 인덱스 이름을 가진 모든 설정 가능( configurable ) 자체 프로퍼티 이름보다 항상 수치적으로 큰 데이터 프로퍼티이다.
"length" 프로퍼티는 초기 특성 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 를 가진다.
Note
"length" 값을 줄이면 이전 길이와 새 길이 사이의 인덱스를 가진 자체 배열 요소가 삭제된다. 단, non-configurable 프로퍼티는 삭제되지 않는다. 배열의 "length" 를 기존 non-configurable array-indexed 프로퍼티의 가장 큰 수치적 이름보다 작거나 같은 값으로 설정하려 하면 길이는 그 프로퍼티 이름보다 1 큰 값으로 설정된다. 10.4.2.1 참조.
23.1.5 Array 이터레이터 객체 (Array Iterator Objects)
Array Iterator 는 특정 Array 인스턴스 객체 위의 특정 순회를 표현하는 객체이다. 이름 있는 생성자는 없으며 Array 인스턴스 객체의 특정 메서드를 호출하여 생성된다.
23.1.5.1 CreateArrayIterator ( array, kind )
The abstract operation CreateArrayIterator takes arguments array (Object) and kind (key+value, key, 또는 value) and returns Object. 이터레이터를 반환하는 Array 메서드들이 사용할 이터레이터 객체를 생성하는 데 사용된다. It performs the following steps when called:
TypedArray 는 기본 이진 데이터 버퍼(25.1)에 대한 배열 유사 뷰를 제공한다. TypedArray 요소 타입은 특정 TypedArray 인스턴스의 모든 요소가 갖는 기본 이진 스칼라 데이터 타입이다. 지원되는 각 요소 타입마다 Table 73에 열거된 고유한TypedArray생성자가 있다. Table 73의 각 생성자는 그에 상응하는 별도의 프로토타입 객체를 가진다.
The abstract operation SetTypedArrayFromArrayLike takes arguments target (a TypedArray), targetOffset (a non-negative integer or +∞), and source (an ECMAScript language value, but not a TypedArray) and returns unused 또는 throw completion. targetOffset 인덱스부터 시작하여 source 로부터 읽은 여러 값을 target 에 설정한다. It performs the following steps when called:
The abstract operation SetTypedArrayFromTypedArray takes arguments target (a TypedArray), targetOffset (a non-negative integer or +∞), and source (a TypedArray) and returns unused 또는 throw completion. targetOffset 인덱스부터 시작하여 source 로부터 읽은 여러 값을 target 에 설정한다. It performs the following steps when called:
IsSharedArrayBuffer(srcBuffer) = true, IsSharedArrayBuffer(targetBuffer) = true, 그리고 srcBuffer.[[ArrayBufferData]] 가 targetBuffer.[[ArrayBufferData]] 와 동일하면 sameSharedArrayBuffer = true; 아니면 false.
SameValue(srcBuffer, targetBuffer) = true 또는 sameSharedArrayBuffer = true 이면
이는 별도의 메서드로서 아래 설명된 부분을 제외하면 23.1.3.30에 정의된 Array.prototype.sort 와 동일한 요구사항을 구현한다. 이 메서드 구현은 this 값이 길이가 고정된 객체이며 정수 인덱스 프로퍼티가 희소하지 않다는 사실을 활용해 최적화될 수 있다.
이 메서드는 제네릭이 아니다. this 값은 [[TypedArrayName]] 내부 슬롯을 가진 객체여야 한다.
NaN 은 (CompareTypedArrayElements 참조) 다른 어떤 값보다 항상 크게 비교되므로 comparator 가 제공되지 않을 때 NaN 값은 결과 끝에 정렬된다.
23.2.3.30 %TypedArray%.prototype.subarray ( start, end )
이 메서드는 새로운 TypedArray 를 반환하며 그 요소 타입은 이 TypedArray 의 요소 타입과 같고, ArrayBuffer 는 동일한 ArrayBuffer 를 사용하며 start (포함) 부터 end (배타) 전까지의 요소를 참조한다. start 또는 end 가 음수이면 배열의 끝을 기준으로 하는 인덱스를 의미한다.
이 별도 메서드는 23.1.3.32에 정의된 Array.prototype.toLocaleString 과 동일한 알고리즘을 구현하되 "length" 에 대한 [[Get]] 대신 TypedArrayLength 를 호출한다. 기본 버퍼가 리사이즈 가능하지 않고 정수 인덱스 프로퍼티가 희소하지 않음을 이용해 최적화할 수 있으나, 그러한 최적화는 알고리즘의 지정된 동작에 관측 가능한 변화를 초래해서는 안 된다.
The abstract operation TypedArrayCreateFromConstructor takes arguments constructor (a constructor) and argumentList (a List of ECMAScript language values) and returns TypedArray 또는 throw completion. 생성자 함수를 사용하여 새로운 TypedArray 를 생성하는 과정을 지정한다. It performs the following steps when called:
The abstract operation ValidateTypedArray takes arguments O (an ECMAScript language value) and order (seq-cst or unordered) and returns TypedArray With Buffer Witness Record 또는 throw completion. It performs the following steps when called:
The abstract operation TypedArrayElementSize takes argument O (a TypedArray) and returns 음이 아닌 정수. It performs the following steps when called:
Table 73 에서 O.[[TypedArrayName]] 에 대해 지정된 요소 크기(Element Size) 값을 반환.
23.2.4.6 TypedArrayElementType ( O )
The abstract operation TypedArrayElementType takes argument O (a TypedArray) and returns TypedArray element type. It performs the following steps when called:
Table 73 에서 O.[[TypedArrayName]] 에 대해 지정된 요소 타입(Element Type) 값을 반환.
23.2.4.7 CompareTypedArrayElements ( x, y, comparator )
The abstract operation CompareTypedArrayElements takes arguments x (a Number or a BigInt), y (a Number or a BigInt), and comparator (a function object or undefined) and returns Number 또는 abrupt completion. It performs the following steps when called:
Table 73에서 TypedArray 대신 생성자 이름만 다른, 아래에서 설명된 구조를 갖는 내재 객체이다.
인자의 개수와 타입에 따라 동작이 달라지는 함수이다. TypedArray 호출의 실제 동작은 전달된 인자의 개수와 종류에 의존한다.
함수로 호출하도록 의도되지 않았으며 그러한 방식으로 호출되면 예외를 던진다.
클래스 정의의 extends 절 값으로 사용될 수 있다. 지정된 TypedArray 동작을 상속하려는 서브클래스 생성자는 %TypedArray%.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성·초기화하기 위해 TypedArray생성자에 대한 super 호출을 포함해야 한다.
The abstract operation AllocateTypedArray takes arguments constructorName (Table 73에 있는 TypedArray생성자 이름인 String), newTarget (a constructor), and defaultProto (a String) and optional argument length (a non-negative integer) and returns TypedArray 또는 throw completion. TypedArray생성자의 인스턴스를 검증하고 생성하는 데 사용된다. length 인자가 전달되면 해당 길이의 ArrayBuffer 를 할당해 새 TypedArray 인스턴스와 연관시킨다. AllocateTypedArray 는 TypedArray 가 사용하는 공통 의미를 제공한다. It performs the following steps when called:
23.2.5.1.2 InitializeTypedArrayFromTypedArray ( O, srcArray )
The abstract operation InitializeTypedArrayFromTypedArray takes arguments O (a TypedArray) and srcArray (a TypedArray) and returns unused 또는 throw completion. It performs the following steps when called:
23.2.5.1.3 InitializeTypedArrayFromArrayBuffer ( O, buffer, byteOffset, length )
The abstract operation InitializeTypedArrayFromArrayBuffer takes arguments O (a TypedArray), buffer (an ArrayBuffer or a SharedArrayBuffer), byteOffset (an ECMAScript language value), and length (an ECMAScript language value) and returns unused 또는 throw completion. It performs the following steps when called:
23.2.5.1.5 InitializeTypedArrayFromArrayLike ( O, arrayLike )
The abstract operation InitializeTypedArrayFromArrayLike takes arguments O (a TypedArray) and arrayLike (an Object, but not a TypedArray or an ArrayBuffer) and returns unused 또는 throw completion. It performs the following steps when called:
The abstract operation AllocateTypedArrayBuffer takes arguments O (a TypedArray) and length (a non-negative integer) and returns unused 또는 throw completion. O 에 ArrayBuffer 를 할당하고 연관시킨다. It performs the following steps when called:
[[ViewedArrayBuffer]] 및 TypedArray 인스턴스 전용의 다른 내부 슬롯이 없다.
23.2.7.1TypedArray.prototype.BYTES_PER_ELEMENT
TypedArray.prototype.BYTES_PER_ELEMENT 의 값은 Table 73에서 TypedArray 에 대해 지정된 요소 크기(Element Size) 값이다.
이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.
23.2.7.2TypedArray.prototype.constructor
주어진 TypedArray생성자에 대한 프로토타입의 "constructor" 프로퍼티 초기 값은 그 생성자 자신이다.
23.2.8TypedArray 인스턴스의 프로퍼티
TypedArray 인스턴스는 TypedArray 이다. 각 TypedArray 인스턴스는 해당 TypedArray 프로토타입 객체로부터 프로퍼티를 상속한다. 각 TypedArray 인스턴스는 내부 슬롯 [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] 를 가진다.
24 키드 컬렉션(Keyed Collections)
24.1 Map 객체
Map 은 키/값 쌍의 컬렉션이며 키와 값 모두 임의의 ECMAScript 언어 값을 사용할 수 있다. 하나의 고유 키 값은 그 Map 컬렉션 안에서 하나의 키/값 쌍에만 등장할 수 있다. 고유 키 값의 구분은 SameValueZero 비교 알고리즘의 의미론을 사용한다.
Map 은 평균적으로 컬렉션의 요소 수에 대해 준선형(sublinear) 접근 시간을 제공하는 해시 테이블 또는 다른 메커니즘을 사용하여 구현되어야 한다. 이 명세에서 사용하는 자료 구조는 Map 의 요구되는 관측 가능 의미를 설명하기 위한 것이며 실제 구현 모델이 되려는 목적은 아니다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 Map 동작을 상속하려는 서브클래스 생성자는 Map.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성·초기화하기 위해 Map 생성자에 대한 super 호출을 포함해야 한다.
The abstract operation AddEntriesFromIterable takes arguments target (an Object), iterable (an ECMAScript language value, but not undefined or null), and adder (a function object) and returns 정상 완료(ECMAScript 언어 값 포함) 또는 throw completion. adder 는 target 을 receiver 로 하여 호출된다. It performs the following steps when called:
callback 은 두 인자를 받는 함수여야 한다. groupBy 는 items 의 각 요소에 대해 오름차순으로 한 번씩 callback 을 호출하고 새 Map 을 구성한다. callback 이 반환한 각 값은 Map 의 키로 사용된다. 그러한 키마다 결과 Map 은 그 키를 키로 하고 callback 이 그 키를 반환한 모든 요소가 담긴 배열을 값으로 갖는 엔트리를 가진다.
? Call(callback, thisArg, « e.[[Value]], e.[[Key]], M ») 수행.
NOTE: callback 실행 중 entries 요소 수가 증가할 수 있다.
numEntries = entries 요소 수로 재설정.
undefined 반환.
Note
callback 은 세 인자를 받는 함수여야 한다. forEach 는 Map 에 존재하는 각 키/값 쌍을 키 삽입 순서대로 한 번씩 callback 에 전달한다. callback 은 실제 존재하는 키에 대해서만 호출되며 Map 에서 삭제된 키에 대해서는 호출되지 않는다.
thisArg 가 제공되면 각 호출의 this 값으로 사용되며, 제공되지 않으면 undefined 사용.
callback 은 (값, 키, 순회 중인 Map) 세 인자로 호출된다.
forEach 자체는 호출된 객체를 직접 변이하지 않지만 callback 호출에 의해 변이될 수 있다. Map 의 [[MapData]] 각 엔트리는 한 번만 방문된다. 호출 시작 후 추가된 새 키는 방문된다. 이미 방문된 키가 삭제되고 다시 추가되면 다시 방문된다. 시작 후 방문되기 전에 삭제된 키는 재추가되지 않는 한 방문되지 않는다.
Map 인스턴스는 일반 객체이며 Map 프로토타입 객체로부터 프로퍼티를 상속한다. 또한 [[MapData]] 내부 슬롯을 가진다.
24.1.5 Map 이터레이터 객체
Map Iterator 는 특정 Map 인스턴스 객체에 대한 특정 순회를 나타내는 객체이다. Map Iterator 객체에 대한 이름 있는 생성자는 없다. 대신 Map 인스턴스 객체의 특정 메서드를 호출하여 생성된다.
24.1.5.1 CreateMapIterator ( map, kind )
The abstract operation CreateMapIterator takes arguments map (an ECMAScript language value) and kind (key+value, key, or value) and returns Generator 또는 throw completion. Map 메서드 중 그러한 이터레이터를 반환하는 것들이 사용할 이터레이터 객체를 생성한다. It performs the following steps when called:
The abstract operation GetSetRecord takes argument obj (an ECMAScript language value) and returns Set Record 또는 throw completion. It performs the following steps when called:
새 Set Record { [[SetObject]]: obj, [[Size]]: intSize, [[Has]]: has, [[Keys]]: keys } 반환.
24.2.1.3 SetDataHas ( setData, value )
The abstract operation SetDataHas takes arguments setData (a List of either ECMAScript language values or empty) and value (an ECMAScript language value) and returns Boolean. It performs the following steps when called:
SetDataIndex(setData, value) 가 not-found 이면 false 반환.
true 반환.
24.2.1.4 SetDataIndex ( setData, value )
The abstract operation SetDataIndex takes arguments setData (a List of either ECMAScript language values or empty) and value (an ECMAScript language value) and returns 음이 아닌 정수 또는 not-found. It performs the following steps when called:
The abstract operation SetDataSize takes argument setData (a List of either ECMAScript language values or empty) and returns 음이 아닌 정수. It performs the following steps when called:
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 Set 동작을 상속하려는 서브클래스 생성자는 Set.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성·초기화하기 위해 Set 생성자에 대한 super 호출을 포함해야 한다.
Set 인스턴스는 일반 객체이며 Set 프로토타입 객체로부터 프로퍼티를 상속한다. 또한 [[SetData]] 내부 슬롯을 가진다.
24.2.6 Set 이터레이터 객체
Set Iterator 는 아래 정의된 구조를 가지며 특정 Set 인스턴스 객체에 대한 특정 순회를 나타내는 일반 객체이다. Set Iterator 객체에 대한 이름 있는 생성자는 없다. 대신 Set 인스턴스 객체의 특정 메서드를 호출하여 생성된다.
24.2.6.1 CreateSetIterator ( set, kind )
The abstract operation CreateSetIterator takes arguments set (an ECMAScript language value) and kind (key+value or value) and returns Generator 또는 throw completion. Set 메서드 중 그러한 이터레이터를 반환하는 것들이 사용할 이터레이터 객체를 생성한다. It performs the following steps when called:
WeakMap 은 키가 객체 및/또는 심볼이고 값이 임의의 ECMAScript 언어 값일 수 있는 키/값 쌍의 컬렉션이다. WeakMap 은 특정 키를 가진 키/값 쌍이 포함되는지 질의할 수 있지만, 보유한 키/값 쌍을 열거하는 메커니즘은 제공되지 않는다. 특정 조건에서, live 가 아닌 값들은 9.9.3 에 설명된 바와 같이 WeakMap 키로서 제거된다.
구현은 WeakMap 의 키/값 쌍이 더 이상 접근 불가능(inaccessible) 해진 시점과 그 키/값 쌍이 WeakMap 에서 제거되는 시점 사이에 임의로 결정된 지연(latency)을 부과할 수 있다. 이 지연이 ECMAScript 프로그램에 관측 가능하다면 프로그램 실행에 영향을 줄 수 있는 불확정성의 원천이 될 것이다. 이러한 이유로 ECMAScript 구현은 관찰자가 관찰하려는 키를 제시하지 않고 WeakMap 의 키를 관찰할 수 있는 어떤 수단도 제공해서는 안 된다.
WeakMap 은 평균적으로 컬렉션의 키/값 쌍 수에 대해 준선형 접근 시간을 제공하는 해시 테이블 또는 다른 메커니즘으로 구현되어야 한다. 명세에서 사용하는 자료 구조는 WeakMap 의 요구되는 관측 가능 의미를 설명하기 위한 것이며 실제 구현 모델을 의도하지 않는다.
Note
WeakMap 과 WeakSet 은 WeakMap 또는 WeakSet 인스턴스가 없었다면 해당 객체 혹은 심볼이 접근 불가능해져서 구현의 가비지 컬렉션 메커니즘에 의해 자원 회수 대상이 되었을 경우 메모리 자원을 “누출”하지 않는 방식으로 객체나 심볼에 상태를 동적으로 연관시키기 위한 메커니즘을 제공하기 위해 설계되었다. 이 특성은 WeakMap 또는 WeakSet 인스턴스에서 키로 객체/심볼을 역으로 매핑(inverted per-object/symbol mapping)하는 방식으로 달성할 수 있다. 또는 각 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.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 WeakMap 동작을 상속하려는 서브클래스 생성자는 WeakMap.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성·초기화하기 위해 WeakMap 생성자에 대한 super 호출을 포함해야 한다.
WeakMap 인스턴스는 일반 객체이며 WeakMap 프로토타입 객체로부터 프로퍼티를 상속한다. 또한 [[WeakMapData]] 내부 슬롯을 가진다.
24.4 WeakSet 객체
WeakSet 은 객체 및/또는 심볼의 컬렉션이다. 하나의 고유 객체나 심볼은 WeakSet 컬렉션에서 한 번만 요소로 등장할 수 있다. WeakSet 은 특정 값을 포함하는지 질의할 수 있지만, 보유한 값을 열거하는 메커니즘은 제공되지 않는다. 특정 조건에서 live 가 아닌 값들은 9.9.3 에 설명된 바와 같이 WeakSet 요소로서 제거된다.
구현은 WeakSet 이 포함한 값이 접근 불가능하게 된 시점과 그 값이 WeakSet 에서 제거되는 시점 사이에 임의로 결정된 지연을 부과할 수 있다. 이 지연이 ECMAScript 프로그램에 관측 가능하다면 프로그램 실행에 영향을 줄 수 있는 불확정성의 원인이 된다. 이러한 이유로 ECMAScript 구현은 관찰자가 관찰된 값을 제시하지 않고 WeakSet 이 특정 값을 포함하는지 결정할 수 있는 수단을 제공해서는 안 된다.
WeakSet 은 평균적으로 컬렉션 요소 수에 대해 준선형 접근 시간을 제공하는 해시 테이블 또는 다른 메커니즘으로 구현되어야 한다. 명세에서 사용하는 자료 구조는 WeakSet 의 요구되는 관측 가능 의미를 설명하기 위한 것이며 실제 구현 모델을 의도하지 않는다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 WeakSet 동작을 상속하려는 서브클래스 생성자는 WeakSet.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성·초기화하기 위해 WeakSet 생성자에 대한 super 호출을 포함해야 한다.
WeakSet 인스턴스는 일반 객체이며 WeakSet 프로토타입 객체로부터 프로퍼티를 상속한다. 또한 [[WeakSetData]] 내부 슬롯을 가진다.
24.5 키드 컬렉션을 위한 추상 연산
24.5.1 CanonicalizeKeyedCollectionKey ( key )
The abstract operation CanonicalizeKeyedCollectionKey takes argument key (an ECMAScript language value) and returns an ECMAScript language value. It performs the following steps when called:
key 가 -0𝔽 이면 +0𝔽 반환.
key 반환.
25 구조화된 데이터 (Structured Data)
25.1 ArrayBuffer 객체
25.1.1 표기 (Notation)
본 절, 25.4, 그리고 29 에서의 아래 설명들은 read-modify-write 수정 함수 내부 데이터 구조를 사용한다.
read-modify-write 수정 함수란 두 개의 바이트 값 List 를 인수로 받고 바이트 값 List 를 반환하는 추상 클로저로 표현되는 수학적 함수이다. 이러한 추상 클로저는 다음 모든 성질을 만족한다:
알고리즘 단계 전부를 원자적으로 수행한다.
개별 알고리즘 단계는 관측 불가능하다.
Note
read-modify-write 수정 함수의 알고리즘 단계가 순수한 수학적 함수임을 검증하는 데 도움을 주기 위해 다음 편집 지침을 권장한다:
직접 또는 호출된 추상 연산과 추상 클로저를 통한 간접 접근을 포함하여, 매개변수와 캡처된 값 외의 어떤 언어/명세 값에도 접근하지 않는다.
The abstract operation AllocateArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative integer) and optional argument maxByteLength (a non-negative integer or empty) and returns ArrayBuffer 를 포함하는 정상 완료 또는 throw completion. ArrayBuffer 를 생성하는 데 사용된다. It performs the following steps when called:
길이가 maxByteLength 바이트인 Data Blockblock 을 생성할 수 없다면 RangeError 예외.
NOTE: Resizable ArrayBuffer 는 제자리(in-place) 증가로 구현 가능하도록 설계되었다. 예를 들어 가상 메모리를 미리 예약할 수 없는 경우 구현은 예외를 던질 수 있다.
obj.[[ArrayBufferMaxByteLength]] = maxByteLength.
obj 반환.
25.1.3.2 ArrayBufferByteLength ( arrayBuffer, order )
The abstract operation ArrayBufferByteLength takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer) and order (seq-cst or unordered) and returns 음이 아닌 정수. It performs the following steps when called:
IsSharedArrayBuffer(arrayBuffer) = true 그리고 arrayBuffer 가 [[ArrayBufferByteLengthData]] 내부 슬롯을 가지면
The abstract operation ArrayBufferCopyAndDetach takes arguments arrayBuffer (an ECMAScript language value), newLength (an ECMAScript language value), and preserveResizability (preserve-resizability or fixed-length) and returns ArrayBuffer 를 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
The abstract operation IsDetachedBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns Boolean. It performs the following steps when called:
arrayBuffer.[[ArrayBufferData]] 가 null 이면 true 반환.
The abstract operation DetachArrayBuffer takes argument arrayBuffer (an ArrayBuffer) and optional argument key (anything) and returns unused 를 포함하는 정상 완료 또는 throw completion. It performs the following steps when called:
The abstract operation CloneArrayBuffer takes arguments srcBuffer (an ArrayBuffer or a SharedArrayBuffer), srcByteOffset (a non-negative integer), and srcLength (a non-negative integer) and returns ArrayBuffer 를 포함하는 정상 완료 또는 throw completion. srcByteOffset 부터 srcLength 바이트 범위의 srcBuffer 데이터를 복사한 새 ArrayBuffer 를 생성한다. It performs the following steps when called:
The abstract operation GetArrayBufferMaxByteLengthOption takes argument options (an ECMAScript language value) and returns 음이 아닌 정수 또는 empty 를 포함하는 정상 완료, 또는 throw completion. It performs the following steps when called:
The host-defined abstract operation HostResizeArrayBuffer takes arguments buffer (an ArrayBuffer) and newByteLength (a non-negative integer) and returns handled 또는 unhandled 를 포함하는 정상 완료, 또는 throw completion. 호스트가 buffer 에 대한 구현 정의 크기 조정을 수행할 기회를 제공한다. 크기 조정을 처리하지 않으려면 기본 동작을 위해 unhandled 를 반환할 수 있다.
HostResizeArrayBuffer 구현은 다음 요구사항을 준수해야 한다:
buffer 를 분리(detach)하지 않는다.
정상 완료로 handled 를 반환하면 buffer.[[ArrayBufferByteLength]] = newByteLength 이다.
The abstract operation IsFixedLengthArrayBuffer takes argument arrayBuffer (an ArrayBuffer or a SharedArrayBuffer) and returns Boolean. It performs the following steps when called:
arrayBuffer 가 [[ArrayBufferMaxByteLength]] 내부 슬롯을 가지면 false 반환.
true 반환.
25.1.3.10 IsUnsignedElementType ( type )
The abstract operation IsUnsignedElementType takes argument type (a TypedArray element type) and returns Boolean. 인수 type 이 부호 없는 TypedArray 요소 타입인지 검증한다. It performs the following steps when called:
type 이 uint8, uint8clamped, uint16, uint32, biguint64 중 하나이면 true 반환.
false 반환.
25.1.3.11 IsUnclampedIntegerElementType ( type )
The abstract operation IsUnclampedIntegerElementType takes argument type (a TypedArray element type) and returns Boolean. 인수 type 이 uint8clamped 를 제외한 정수 TypedArray 요소 타입인지 검증한다. It performs the following steps when called:
type 이 int8, uint8, int16, uint16, int32, uint32 중 하나이면 true 반환.
false 반환.
25.1.3.12 IsBigIntElementType ( type )
The abstract operation IsBigIntElementType takes argument type (a TypedArray element type) and returns Boolean. 인수 type 이 BigInt TypedArray 요소 타입인지 검증한다. It performs the following steps when called:
type 이 biguint64 또는 bigint64 이면 true 반환.
false 반환.
25.1.3.13 IsNoTearConfiguration ( type, order )
The abstract operation IsNoTearConfiguration takes arguments type (a TypedArray element type) and order (seq-cst, unordered, or init) and returns Boolean. It performs the following steps when called:
The abstract operation RawBytesToNumeric takes arguments type (a TypedArray element type), rawBytes (a List of byte values), and isLittleEndian (a Boolean) and returns Number 또는 BigInt. It performs the following steps when called:
elementSize = Table 73 에서 요소 타입 type 에 대해 지정된 Element Size 값.
isLittleEndian = false 이면 rawBytes 요소 순서를 반전.
type = float16 이면
value = rawBytes 바이트들을 이어 붙인 후 little-endian 비트열로 해석한 IEEE 754-2019 binary16 값.
25.1.3.15 GetRawBytesFromSharedBlock ( block, byteIndex, type, isTypedArray, order )
The abstract operation GetRawBytesFromSharedBlock takes arguments block (a Shared Data Block), byteIndex (a non-negative integer), type (a TypedArray element type), isTypedArray (a Boolean), and order (seq-cst or unordered) and returns 바이트 값 List. It performs the following steps when called:
elementSize = Table 73 에서 요소 타입 type 의 Element Size 값.
execution = 주변 에이전트의 Agent Record 의 [[CandidateExecution]] 필드.
The abstract operation GetValueFromBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), isTypedArray (a Boolean), and order (seq-cst or unordered) and optional argument isLittleEndian (a Boolean) and returns Number 또는 BigInt. It performs the following steps when called:
The abstract operation NumericToRawBytes takes arguments type (a TypedArray element type), value (a Number or a BigInt), and isLittleEndian (a Boolean) and returns 바이트 값 List. It performs the following steps when called:
type = float16 이면
rawBytes = value 를 roundTiesToEven 방식으로 IEEE 754-2019 binary16 형식으로 변환한 2바이트 List (little endian). value 가 NaN 이면 구현이 선택한 binary16 NaN 인코딩(구현 구분 가능한 동일 NaN 에 대해 항상 동일 인코딩)을 사용.
The abstract operation SetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), value (a Number or a BigInt), isTypedArray (a Boolean), and order (seq-cst, unordered, or init) and optional argument isLittleEndian (a Boolean) and returns unused. It performs the following steps when called:
execution = 주변 에이전트 Agent Record 의 [[CandidateExecution]].
eventsRecord = execution.[[EventsRecords]] 중 현재 AgentSignifier() 와 일치하는 것.
isTypedArray = true 그리고 IsNoTearConfiguration(type, order) = true 이면 noTear = true; 아니면 false.
WriteSharedMemory { [[Order]]: order, [[NoTear]]: noTear, [[Block]]: block, [[ByteIndex]]: byteIndex, [[ElementSize]]: elementSize, [[Payload]]: rawBytes } 를 eventsRecord.[[EventList]] 에 추가.
Else
rawBytes 개별 바이트를 block[byteIndex] 부터 순서대로 저장.
unused 반환.
25.1.3.19 GetModifySetValueInBuffer ( arrayBuffer, byteIndex, type, value, op )
The abstract operation GetModifySetValueInBuffer takes arguments arrayBuffer (an ArrayBuffer or a SharedArrayBuffer), byteIndex (a non-negative integer), type (a TypedArray element type), value (a Number or a BigInt), and op (a read-modify-write modification function) and returns Number 또는 BigInt. It performs the following steps when called:
클래스 정의 extends 절의 값으로 사용할 수 있다. 지정된 ArrayBuffer 동작을 상속하려면 서브클래스 생성자가 ArrayBuffer.prototype 내장 메서드 지원에 필요한 내부 상태로 서브클래스 인스턴스를 생성·초기화하기 위해 ArrayBuffer 생성자에 대한 super 호출을 포함해야 한다.
ArrayBuffer 인스턴스는 ArrayBuffer 프로토타입 객체로부터 프로퍼티를 상속한다. 각 ArrayBuffer 인스턴스는 [[ArrayBufferData]], [[ArrayBufferByteLength]], [[ArrayBufferDetachKey]] 내부 슬롯을 갖는다. 크기 변경 가능한 인스턴스는 [[ArrayBufferMaxByteLength]] 내부 슬롯도 갖는다.
[[ArrayBufferData]] 가 null 인 ArrayBuffer 인스턴스는 분리(detached)된 것으로 간주되며 해당 ArrayBuffer 내 데이터에 접근·수정하는 모든 연산은 실패한다.
[[ArrayBufferDetachKey]] 가 undefined 가 아닌 값으로 설정된 ArrayBuffer 인스턴스는 DetachArrayBuffer 호출 시 동일 "detach key" 를 인수로 전달해야 하며, 그렇지 않으면 TypeError 가 발생한다. 이 내부 슬롯은 명세 알고리즘이 아닌 특정 임베딩 환경에서만 설정된다.
25.1.8 크기 변경 가능 ArrayBuffer 가이드라인
Note 1
다음은 크기 변경 가능 ArrayBuffer 를 사용하는 ECMAScript 프로그래머를 위한 지침이다.
가능하다면 배포 환경에서 프로그램을 테스트하는 것을 권장한다. 사용 가능한 물리 메모리 양은 하드웨어 장치마다 크게 다르다. 유사하게 가상 메모리 서브시스템 역시 하드웨어 및 운영체제에 따라 크게 다르다. 64비트 데스크톱 웹 브라우저에서 메모리 부족 없이 동작하는 애플리케이션이 32비트 모바일 웹 브라우저에서는 메모리를 소진할 수 있다.
크기 변경 가능 ArrayBuffer 의 "maxByteLength" 옵션 값을 선택할 때는 애플리케이션에 필요한 최소 가능한 값을 선택할 것을 권장한다. "maxByteLength" 가 1,073,741,824 (230 바이트, 1GiB) 를 초과하지 않도록 권장한다.
특정 최대 크기에 대해 크기 변경 가능 ArrayBuffer 를 성공적으로 생성했다 해서 이후 모든 크기 변경이 성공함을 보장하지 않는다.
Note 2
다음은 크기 변경 가능 ArrayBuffer 를 구현하는 ECMAScript 구현자들을 위한 지침이다.
Resizable ArrayBuffer 는 크기 변경 시 복사를 수행하거나, 가상 메모리를 미리 예약하는 제자리 증가(in-place growth), 또는 생성자"maxByteLength" 값에 따라 양자의 혼합으로 구현될 수 있다.
호스트가 다중 테넌트(예: 동시에 여러 ECMAScript 애플리케이션 실행) 환경(웹 브라우저 등)이고 구현이 가상 메모리 예약을 통한 제자리 증가를 선택한다면, 32비트와 64비트 구현 모두에서 "maxByteLength" ≥ 1GiB~1.5GiB 값에 대해 예외를 던질 것을 권장한다. 이는 단일 애플리케이션이 가상 주소 공간을 고갈시킬 가능성과 상호 운용성 위험을 줄이기 위함이다.
호스트에 가상 메모리가 없거나(예: MMU 없는 임베디드 장치), 혹은 호스트가 복사 기반 크기 조정만 구현한다면 "maxByteLength" 옵션에 대해 임의의 Number value for 를 받을 수 있다. 하지만 요청된 크기의 메모리 블록을 절대 할당할 수 없다면 RangeError 를 던질 것을 권장한다(예: 요청 크기가 장치에서 사용 가능한 최대 메모리보다 큰 경우).
25.2 SharedArrayBuffer 객체
25.2.1 고정 길이 및 증가 가능(Growable) SharedArrayBuffer 객체
fixed-length SharedArrayBuffer 는 생성 후 바이트 길이가 변경될 수 없는 SharedArrayBuffer 이다.
The abstract operation AllocateSharedArrayBuffer takes arguments constructor (a constructor) and byteLength (a non-negative integer) and optional argument maxByteLength (a non-negative integer or empty) and returns SharedArrayBuffer 를 포함하는 정상 완료 또는 throw completion. SharedArrayBuffer 를 생성하는 데 사용된다. It performs the following steps when called:
slots = « [[ArrayBufferData]] ».
maxByteLength 가 존재하고 empty 가 아니면 allocatingGrowableBuffer = true; 아니면 false.
allocatingGrowableBuffer = true 이면
byteLength > maxByteLength 이면 RangeError 예외.
slots 에 [[ArrayBufferByteLengthData]] 및 [[ArrayBufferMaxByteLength]] 추가.
The abstract operation IsSharedArrayBuffer takes argument obj (an ArrayBuffer or a SharedArrayBuffer) and returns Boolean. 객체가 ArrayBuffer, SharedArrayBuffer, 또는 그 서브타입인지 검사한다. It performs the following steps when called:
The host-defined abstract operation HostGrowSharedArrayBuffer takes arguments buffer (a SharedArrayBuffer) and newByteLength (a non-negative integer) and returns handled 또는 unhandled 를 포함하는 정상 완료 또는 throw completion. 호스트가 buffer 에 대해 구현 정의 증가(grow)를 수행할 기회를 제공한다. 처리하지 않으려면 기본 동작을 위해 unhandled 를 반환할 수 있다.
HostGrowSharedArrayBuffer 구현은 다음 요구사항을 따른다:
추상 연산이 unhandled 로 정상 완료하지 않고, newByteLength < buffer 의 현재 바이트 길이이거나 newByteLength > buffer.[[ArrayBufferMaxByteLength]] 이면 RangeError 예외.
isLittleEndian = 주변 에이전트 Agent Record 의 [[LittleEndian]] 필드 값. 연산이 handled 로 정상 완료하면, [[Order]] = seq-cst, [[Payload]] = NumericToRawBytes(biguint64, newByteLength, isLittleEndian), [[Block]] = buffer.[[ArrayBufferByteLengthData]], [[ByteIndex]] = 0, [[ElementSize]] = 8 인 WriteSharedMemory 또는 ReadModifyWriteSharedMemory 이벤트가 후보 실행에 추가되어, SharedArrayBuffer.prototype.grow 에 대한 경합 호출이 “소실”(조용히 아무 것도 하지 않음)되지 않도록 한다.
Note
두 번째 요구사항은 buffer 의 현재 바이트 길이를 언제/어떻게 읽는지에 대해 의도적으로 모호하다. 길이 갱신은 하드웨어의 원자적 read-modify-write 명령을 통해 이루어져야 하므로 load-link/store-conditional 또는 load-exclusive/store-exclusive 쌍을 사용하는 구조에서는 명령을 가깝게 유지하고 싶을 수 있다. 따라서 SharedArrayBuffer.prototype.grow 자체는 HostGrowSharedArrayBuffer 호출 전 newByteLength 에 대한 경계 검사를 수행하지 않으며, 현재 바이트 길이를 언제 읽어야 한다는 요구도 없다.
이는 newByteLength 가 0 이상이며 buffer.[[ArrayBufferMaxByteLength]] 이하임이 보장되는 HostResizeArrayBuffer 와 대조적이다.
클래스 정의 extends 절의 값으로 사용할 수 있다. 지정된 SharedArrayBuffer 동작을 상속하려는 서브클래스 생성자는 SharedArrayBuffer.prototype 내장 메서드 동작을 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성·초기화하기 위해 SharedArrayBuffer 생성자에 대한 super 호출을 포함해야 한다.
호스트가 SharedArrayBuffer 에 대한 동시 접근을 제공하지 않는 경우 전역 객체의 "SharedArrayBuffer" 프로퍼티를 생략할 수 있다.
Note
ArrayBuffer 와 달리 SharedArrayBuffer 는 분리(detach)되지 않으며 그 내부 [[ArrayBufferData]] 슬롯은 null 이 되지 않는다.
byteLengthDelta 바이트로 구성된 새 Shared Data Block 값을 생성할 수 없으면 RangeError 예외.
NOTE: 새 Shared Data Block 은 여기서 구성/사용되지 않는다. 증가 가능한 SharedArrayBuffer 의 관측 가능 동작은 생성 시 최대 크기 Shared Data Block 할당으로 지정되며, 구현이 메모리를 소진하면 RangeError 를 던져야 함을 이 단계가 반영.
길이 갱신 compare-exchange 의 허위 실패는 금지된다. 새 길이에 대한 경계 검사 통과 및 메모리 부족이 아니면 항상 ReadModifyWriteSharedMemory 이벤트(성공한 compare-exchange)가 후보 실행에 추가된다.
SharedArrayBuffer.prototype.grow 에 대한 병렬 호출은 완전 순서화된다. 예를 들어 sab.grow(10) 과 sab.grow(20) 이 경합할 때 둘 중 하나가 승리하며, sab.grow(20) 이 먼저 일어났다면 sab.grow(10) 호출은 버퍼를 축소하지 않고 대신 RangeError 를 던진다.
25.2.5.4 get SharedArrayBuffer.prototype.growable
SharedArrayBuffer.prototype.growable 는 set 접근자 함수가 undefined 인 접근자 프로퍼티이다. 그 get 접근자 함수는 호출 시 다음을 수행한다:
SharedArrayBuffer 인스턴스는 SharedArrayBuffer 프로토타입 객체로부터 프로퍼티를 상속한다. 각 SharedArrayBuffer 인스턴스는 [[ArrayBufferData]] 내부 슬롯을 가진다. 증가 불가능 인스턴스는 [[ArrayBufferByteLength]] 내부 슬롯을 가진다. 증가 가능 인스턴스는 [[ArrayBufferByteLengthData]] 및 [[ArrayBufferMaxByteLength]] 내부 슬롯을 가진다.
Note
SharedArrayBuffer 인스턴스는 ArrayBuffer 인스턴스와 달리 분리(detach)되지 않는다.
25.2.7 증가 가능 SharedArrayBuffer 가이드라인
Note 1
다음은 증가 가능 SharedArrayBuffer 를 사용하는 ECMAScript 프로그래머를 위한 지침이다.
가능하다면 배포 환경에서 프로그램을 테스트할 것을 권장한다. 사용 가능한 물리 메모리 양은 하드웨어 장치마다 크게 다르다. 가상 메모리 서브시스템 또한 하드웨어와 운영체제에 따라 매우 다르다. 64비트 데스크톱 웹 브라우저에서 메모리 부족 없이 실행되는 애플리케이션이 32비트 모바일 웹 브라우저에서는 메모리를 소진할 수 있다.
증가 가능 SharedArrayBuffer 의 "maxByteLength" 옵션 값은 애플리케이션에 필요한 최소 크기를 선택할 것을 권장한다. "maxByteLength" 가 1073741824 (1GiB) 를 넘지 않도록 권장한다.
특정 최대 크기로 증가 가능 SharedArrayBuffer 를 성공적으로 생성했더라도 향후 grow 가 항상 성공함을 보장하지 않는다.
증가 가능 SharedArrayBuffer 의 길이(load) 중 모두가 동기화 seq-cst load 는 아니다. 예를 들어 정수 인덱스 프로퍼티 접근의 경계 검사 목적(u8[idx])으로 수행되는 길이 load 는 동기화되지 않는다. 일반적으로 명시적 동기화가 없으면 한 프로퍼티 접근이 경계 내라는 사실이 같은 에이전트의 이후 접근도 경계 내임을 의미하지 않는다. 반면 SharedArrayBuffer 의 length, byteLength 게터, %TypedArray%.prototype, DataView.prototype 을 통한 명시적 길이 load 는 동기화된다. TypedArray 가 완전히 out-of-bounds 인지 검사하기 위해 내장 메서드가 수행하는 길이 load 역시 동기화된다.
Note 2
다음은 증가 가능 SharedArrayBuffer 를 구현하는 ECMAScript 구현자를 위한 지침이다.
증가 가능 SharedArrayBuffer 는 가상 메모리를 미리 예약한 제자리 증가 방식으로 구현할 것을 권장한다.
grow 연산은 증가 가능 SharedArrayBuffer 에 대한 메모리 접근과 병렬로 일어날 수 있으므로, 메모리 모델 제약은 unordered 접근조차 ‘찢어짐(tearing)’이 없어야 함을 요구한다. 실제로 이는 기반 데이터 블록을 ‘세계 정지’ 없이 복사로 증가시킬 수 없음을 의미한다. 직렬화 지점을 만들고 느리기 때문에 ‘세계 정지’ 전략은 권장되지 않는다.
증가된 메모리는 생성 순간부터(경합 접근 포함) 0 으로 보이는 형태여야 한다. 이는 온디맨드 zero-filled 가상 메모리 페이지나 수동 초기화 시 주의 깊은 동기화로 달성할 수 있다.
증가 가능 SharedArrayBuffer 의 TypedArray 뷰에 대한 정수 인덱스 프로퍼티 접근은 (위 프로그래머 지침에서 언급했듯) 기반 버퍼 길이에 대한 동기화 load 가 아니므로 비증가 SharedArrayBuffer 의 TypedArray 접근과 유사하게 최적화될 수 있도록 의도되었다. 예: 경계 검사를 루프 밖으로 끌어올릴 수 있다.
가상 메모리가 없는(예: MMU 없는 임베디드 장치) 호스트에서는 복사 방식으로 증가 가능 SharedArrayBuffer 를 구현하기 어렵다. 이런 호스트에서 메모리 사용 행태는 가상 메모리가 있는 호스트와 크게 다를 수 있으므로 사용자에게 명확히 알릴 필요가 있다.
25.3 DataView 객체
25.3.1 DataView 객체를 위한 추상 연산
25.3.1.1 버퍼 증명(버퍼 위트니스) Record 를 가진 DataView
DataView With Buffer Witness Record 는 DataView 와, 뷰 대상 버퍼의 캐시된 바이트 길이를 함께 캡슐화하기 위해 사용되는 Record 값이다. 이는 뷰 대상 버퍼가 증가 가능 SharedArrayBuffer 인 경우 바이트 길이 데이터 블록에 대해 단일 공유 메모리 읽기 이벤트가 되도록 돕는 용도로 사용된다.
DataView With Buffer Witness Record 는 Table 75 에 나열된 필드를 갖는다.
25.3.1.2 MakeDataViewWithBufferWitnessRecord ( obj, order )
The abstract operation MakeDataViewWithBufferWitnessRecord takes arguments obj (a DataView) and order (seq-cst or unordered) and returns DataView With Buffer Witness Record. It performs the following steps when called:
The abstract operation GetViewByteLength takes argument viewRecord (a DataView With Buffer Witness Record) and returns 음이 아닌 정수. It performs the following steps when called:
The abstract operation IsViewOutOfBounds takes argument viewRecord (a DataView With Buffer Witness Record) and returns Boolean. It performs the following steps when called:
byteOffsetStart > bufferByteLength 또는 byteOffsetEnd > bufferByteLength 이면 true 반환.
NOTE: 길이 0 DataView 는 out-of-bounds 로 간주되지 않는다.
false 반환.
25.3.1.5 GetViewValue ( view, requestIndex, isLittleEndian, type )
The abstract operation GetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), and type (a TypedArray element type) and returns Number 또는 BigInt 를 포함하는 정상 완료 또는 throw completion. DataView 인스턴스 함수들이 뷰의 버퍼에서 값을 읽어올 때 사용된다. It performs the following steps when called:
25.3.1.6 SetViewValue ( view, requestIndex, isLittleEndian, type, value )
The abstract operation SetViewValue takes arguments view (an ECMAScript language value), requestIndex (an ECMAScript language value), isLittleEndian (an ECMAScript language value), type (a TypedArray element type), and value (an ECMAScript language value) and returns undefined 를 포함하는 정상 완료 또는 throw completion. DataView 인스턴스 함수들이 뷰의 버퍼에 값을 저장할 때 사용된다. It performs the following steps when called:
클래스 정의 extends 절 값으로 사용할 수 있다. 지정된 DataView 동작을 상속하려는 서브클래스 생성자는 DataView.prototype 내장 메서드 지원에 필요한 내부 상태로 서브클래스 인스턴스를 생성·초기화하기 위해 DataView 생성자에 대한 super 호출을 포함해야 한다.
Atomics 객체는 공유 메모리 배열 셀에 대해 분리 불가능(원자적)하게 동작하는 함수들과 에이전트가 원시적 이벤트를 대기/디스패치할 수 있게 하는 함수들을 제공한다. 규범적으로 사용하면 Atomics 함수는 공유 메모리를 통해 통신하는 다중 에이전트 프로그램이 병렬 CPU 상에서도 잘 이해된 순서로 실행되도록 한다. 공유 메모리 통신을 지배하는 규칙은 아래에 정의된 메모리 모델이 제공한다.
Note
ECMAScript 에서 공유 메모리를 프로그래밍/구현하기 위한 비규범적 가이드라인은 메모리 모델 절 끝부분의 주석을 참고하라.
25.4.1 Waiter Record
Waiter Record 는 특정 Atomics.wait 또는 Atomics.waitAsync 호출을 나타내기 위해 사용되는 Record 값이다.
에이전트 클러스터는 WaiterList Record 의 저장소를 가진다; 저장소는 (block, i) 로 인덱싱되고 block 은 Shared Data Block, i 는 block 메모리의 바이트 오프셋이다. WaiterList Record 는 에이전트 독립적이다: (block, i) 로 조회하면 클러스터 내 어떤 에이전트에서도 동일한 WaiterList Record 가 결과로 나온다.
각 WaiterList Record 는 평가 중 그 WaiterList Record 에 대한 배타적 접근을 제어하는 critical section 을 가진다. 한 번에 하나의 에이전트만 critical section 에 진입할 수 있다. 진입/이탈은 추상 연산 EnterCriticalSection 과 LeaveCriticalSection 이 제어한다. WaiterList Record 에 대한 연산—대기 에이전트 추가/제거, 목록 순회, 목록의 에이전트 일시중단/알림, Synchronize 이벤트 설정/조회—는 critical section 에 진입한 에이전트만 수행할 수 있다.
The abstract operation ValidateIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and waitable (a Boolean) and returns 정상 완료(TypedArray With Buffer Witness Record 포함) 또는 throw completion. It performs the following steps when called:
The abstract operation ValidateAtomicAccess takes arguments taRecord (a TypedArray With Buffer Witness Record) and requestIndex (an ECMAScript language value) and returns 정상 완료(정수) 또는 throw completion. It performs the following steps when called:
The abstract operation ValidateAtomicAccessOnIntegerTypedArray takes arguments typedArray (an ECMAScript language value) and requestIndex (an ECMAScript language value) and returns 정상 완료(정수) 또는 throw completion. It performs the following steps when called:
The abstract operation RevalidateAtomicAccess takes arguments typedArray (a TypedArray) and byteIndexInBuffer (an integer) and returns 정상 완료(unused) 또는 throw completion. 이 연산은 Atomics 메서드에서 모든 인수 강제가 수행된 후 버퍼가 경계 밖이 되었을 수 있으므로 원자 연산용 인덱스를 다시 검증한다. typedArray 의 백업 버퍼가 SharedArrayBuffer 인 경우 이 연산은 throw 하지 않는다. It performs the following steps when called:
The abstract operation GetWaiterList takes arguments block (a Shared Data Block) and i (a non-negative integer that is evenly divisible by 4) and returns WaiterList Record. It performs the following steps when called:
eventsRecord.[[AgentSynchronizesWith]] 에 (WL.[[MostRecentLeaveEvent]], enterEvent) 추가.
Return unused.
EnterCriticalSection 은 에이전트가 다른 에이전트가 떠나기를 기다려야 할 때 경합(contention) 이 있다. 경합이 없을 때 EnterCriticalSection 호출의 FIFO 순서가 관측 가능하다. 경합이 있을 때 구현은 임의 순서를 선택할 수 있으나 무기한 대기는 유발할 수 없다.
25.4.3.7 LeaveCriticalSection ( WL )
The abstract operation LeaveCriticalSection takes argument WL (a WaiterList Record) and returns unused. It performs the following steps when called:
The abstract operation AddWaiter takes arguments WL (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:
Assert: WL.[[Waiters]] 에 [[PromiseCapability]] 와 [[AgentSignifier]] 가 각각 waiterRecord 와 동일한 Waiter Record 가 없다.
WL.[[Waiters]] 에 waiterRecord 추가.
Return unused.
25.4.3.9 RemoveWaiter ( WL, waiterRecord )
The abstract operation RemoveWaiter takes arguments WL (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:
The abstract operation RemoveWaiters takes arguments WL (a WaiterList Record) and c (a non-negative integer or +∞) and returns Waiter Record 들의 List. It performs the following steps when called:
The abstract operation SuspendThisAgent takes arguments WL (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:
LeaveCriticalSection(WL) 수행 후 주변 에이전트를 waiterRecord.[[TimeoutTime]] 시각까지 일시중단하되, critical section 을 벗어난 직후부터 suspend 적용 전 사이 도착한 알림이 손실되지 않도록 결합된 연산으로 수행. 주변 에이전트는 타임아웃 또는 다른 에이전트가 NotifyWaiter(WL, thisAgent) (즉 Atomics.notify) 를 호출하여 깨어날 수 있다.
The abstract operation NotifyWaiter takes arguments WL (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:
The abstract operation EnqueueResolveInAgentJob takes arguments agentSignifier (an agent signifier), promiseCapability (a PromiseCapability Record), and resolution ("ok" or "timed-out") and returns unused. It performs the following steps when called:
resolveJob = 매개변수 없고 agentSignifier, promiseCapability, resolution 을 캡처하며 호출 시:
The abstract operation DoWait takes arguments mode (sync or async), typedArray (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and timeout (an ECMAScript language value) and returns 정상 완료(Object, "not-equal", "timed-out", "ok" 중 하나) 또는 throw completion. It performs the following steps when called:
The abstract operation EnqueueAtomicsWaitAsyncTimeoutJob takes arguments WL (a WaiterList Record) and waiterRecord (a Waiter Record) and returns unused. It performs the following steps when called:
The abstract operation AtomicCompareExchangeInSharedBlock takes arguments block (a Shared Data Block), byteIndexInBuffer (an integer), elementSize (a non-negative integer), expectedBytes (a List of byte values), and replacementBytes (a List of byte values) and returns 바이트 값 List. It performs the following steps when called:
execution = 주변 에이전트 Agent Record.[[CandidateExecution]].
eventsRecord = execution.[[EventsRecords]] 중 [[AgentSignifier]] = AgentSignifier() 인 것.
rawBytesRead = 길이 elementSize 이고 요소가 비결정적으로 선택된 바이트 값 List.
NOTE: 구현에서 rawBytesRead 는 load-link, load-exclusive, 또는 read-modify-write 명령의 피연산자 결과. 비결정성은 약한 일관성 하드웨어 관측 가능 동작을 기술.
execution.[[ChosenValues]] 에 Chosen Value Record { [[Event]]: event, [[ChosenValue]]: rawBytesRead } 추가.
Return rawBytesRead.
25.4.3.17 AtomicReadModifyWrite ( typedArray, index, value, op )
The abstract operation AtomicReadModifyWrite takes arguments typedArray (an ECMAScript language value), index (an ECMAScript language value), value (an ECMAScript language value), and op (a read-modify-write modification function) and returns 정상 완료(Number 또는 BigInt) 또는 throw completion. op 는 두 List (바이트 값) 인수를 받아 바이트 값 List 를 반환한다. 이 연산은 원자적으로 값을 로드하고 다른 값과 결합 후 저장하며 로드한 값을 반환한다. It performs the following steps when called:
The abstract operation ByteListBitwiseOp takes arguments op (&, ^, or |), xBytes (a List of byte values), and yBytes (a List of byte values) and returns 바이트 값 List. 모든 바이트에 대한 비트 연산을 수행하고 바이트 값 List 를 원자적으로 반환한다. It performs the following steps when called:
The abstract operation ByteListEqual takes arguments xBytes (a List of byte values) and yBytes (a List of byte values) and returns Boolean. It performs the following steps when called:
xBytes, yBytes 길이 다르면 false 반환.
i = 0.
각 xBytes 요소 xByte 에 대해
yByte = yBytes[i].
xByte ≠ yByte 이면 false 반환.
i = i + 1.
Return true.
25.4.4 Atomics.add ( typedArray, index, value )
이 함수는 호출 시 다음 단계를 수행한다:
add = 매개변수 (xBytes, yBytes) 를 가지고 typedArray 를 캡처하며 호출 시 원자적으로:
이 함수는 최적화용 프리미티브이다. 크기 n 바이트 데이터에 대한 atomic primitive (compareExchange, load, store, add, sub, and, or, xor, exchange) 의 원자 단계가 주변 에이전트가 데이터 범위를 넘어서는 lock 을 획득하지 않고 수행된다면 Atomics.isLockFree(n) 은 true 를 반환한다는 직관을 제공한다. 고성능 알고리즘은 이 함수를 사용해 임계 영역에서 락 vs 원자 연산 사용을 결정한다. 원자 프리미티브가 lock-free 가 아니면 자체 락을 제공하는 편이 종종 더 효율적이다.
Atomics.isLockFree(4) 는 관련 하드웨어 모두에서 지원 가능하므로 항상 true 를 반환한다. 이는 프로그램 단순화에 도움된다.
이 함수 반환값과 무관하게 모든 원자 연산은 원자성이 보장된다. 즉 중간 연산(예: “tearing”)이 관측되지 않는다.
JSON 데이터 교환 형식은 ECMA-404 에 정의된다. 본 명세에서 사용하는 JSON 교환 형식은 ECMA-404 에 기술된 것과 정확히 동일하다. JSON.parse 및 JSON.stringify 의 적합 구현은 ECMA-404 명세에 기술된 교환 형식을 삭제나 확장 없이 정확히 지원해야 한다.
25.5.1 JSON.parse ( text [ , reviver ] )
이 함수는 JSON 텍스트(JSON 형식 문자열)를 파싱하여 ECMAScript 언어 값을 생성한다. JSON 형식은 ECMAScript 리터럴, 배열 초기자, 객체 초기자와 유사한 구문으로 리터럴, 배열, 객체를 표현한다. 파싱 후 JSON 객체는 ECMAScript 객체로, JSON 배열은 ECMAScript Array 인스턴스로 실현된다. JSON 문자열, 숫자, 불리언, null 은 ECMAScript String, Number, Boolean 및 null 로 실현된다.
선택적 reviver 매개변수는 key, value 두 매개변수를 받는 함수로 결과를 필터/변환할 수 있다. 파싱에서 생성된 각 key/value 쌍에 대해 호출되며 반환값이 원래 값 대신 사용된다. 받은 값을 그대로 반환하면 구조는 수정되지 않는다. undefined 를 반환하면 그 프로퍼티는 결과에서 삭제된다.
The abstract operation ParseJSON takes argument text (a String) and returns 정상 완료(ECMAScript 언어 값) 또는 throw completion. It performs the following steps when called:
StringToCodePoints(text) 가 ECMA-404 에 지정된 유효한 JSON 텍스트가 아니면 SyntaxError 예외.
적합한 JSON.parse 구현은 JSON 문법을 확장할 수 없다. 수정/확장된 JSON 교환 형식을 지원하려면 다른 parse 함수를 정의해야 한다.
Note 1
유효 JSON 텍스트는 ECMAScript PrimaryExpression 구문의 부분집합이다. 단계 1 는 jsonString 이 그 부분집합에 부합하는지 검증하고, 8 는 평가 결과가 적절한 타입임을 단언한다.
그러나 13.2.5.5 가 ParseJSON 중 다르게 동작하므로, 동일 소스 텍스트가 PrimaryExpression 으로 평가될 때와 JSON 으로 평가될 때 다른 결과를 낼 수 있다. 또한 객체 리터럴에서 중복 "__proto__" 프로퍼티에 대한 Early Error 가 ParseJSON 중에는 적용되지 않으므로 문법과 일치해도 ParseJSON 이 허용하는 텍스트 일부는 PrimaryExpression 으로 유효하지 않다.
The abstract operation InternalizeJSONProperty takes arguments holder (an Object), name (a String), and reviver (a function object) and returns 정상 완료(ECMAScript 언어 값) 또는 throw completion.
Note
이 알고리즘은 [[Delete]] 또는 CreateDataProperty 가 false 를 반환해도 예외를 던지지 않도록 의도되었다.
25.5.2 JSON.stringify ( value [ , replacer [ , space ] ] )
이 함수는 ECMAScript 언어 값을 UTF-16 인코딩된 JSON 형식 String 또는 undefined 로 반환한다. 세 매개변수를 받을 수 있다. value 는 일반적으로 객체나 배열이지만 String, Boolean, Number, null 일 수도 있다. 선택적 replacer 는 객체/배열을 문자열화하는 방식을 바꾸는 함수이거나 문자열/숫자 배열(포함 리스트)이다. 선택적 space 는 결과에 공백을 삽입해 가독성을 높이기 위한 String 또는 Number 이다.
The abstract operation SerializeJSONProperty takes arguments state (a JSON Serialization Record), key (a String), and holder (an Object) and returns 정상 완료(String 또는 undefined) 또는 throw completion. It performs the following steps when called:
The abstract operation QuoteJSONString takes argument value (a String) and returns String. value 를 0x0022 (QUOTATION MARK) 코드 유닛으로 감싸고 특정 코드 유닛을 이스케이프한다. 이 연산은 6.1.4 에 기술된 대로 value 를 UTF-16 인코딩 코드 포인트 시퀀스로 해석한다. It performs the following steps when called:
The abstract operation UnicodeEscape takes argument C (a code unit) and returns String. C 를 유니코드 이스케이프 시퀀스로 표현한다. It performs the following steps when called:
The abstract operation SerializeJSONObject takes arguments state (a JSON Serialization Record) and value (an Object) and returns 정상 완료(String) 또는 throw completion. 객체를 직렬화한다. It performs the following steps when called:
state.[[Stack]] 이 value 를 포함하면 순환 구조이므로 TypeError 예외.
The abstract operation SerializeJSONArray takes arguments state (a JSON Serialization Record) and value (an ECMAScript language value) and returns 정상 완료(String) 또는 throw completion. 배열을 직렬화한다. It performs the following steps when called:
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 WeakRef 동작을 상속하려는 서브클래스 생성자는 WeakRef.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성·초기화하기 위해 WeakRef생성자에 대한 super 호출을 포함해야 한다.
이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 속성을 가진다.
26.1.4 WeakRef 추상 연산
26.1.4.1 WeakRefDeref ( weakRef )
The abstract operation WeakRefDeref takes argument weakRef (a WeakRef) and returns an ECMAScript language value. It performs the following steps when called:
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 FinalizationRegistry 동작을 상속하려는 서브클래스 생성자는 FinalizationRegistry.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성·초기화하기 위해 FinalizationRegistry생성자에 대한 super 호출을 포함해야 한다.
26.2.1.1 FinalizationRegistry ( cleanupCallback )
이 함수는 호출 시 다음 단계를 수행한다:
NewTarget 이 undefined 이면 TypeError 예외를 던진다.
IsCallable(cleanupCallback) 이 false 이면 TypeError 예외를 던진다.
명세의 알고리즘과 정의에 따르면 finalizationRegistry.[[Cells]] 가 cell 을 포함하는 동안 cell.[[HeldValue]] 는 live 이다; 그러나 이것이 반드시 cell.[[UnregisterToken]] 또는 cell.[[Target]] 이 live 임을 의미하지는 않는다. 예를 들어 객체를 자기 자신을 unregister token 으로 하여 등록해도 그 객체를 영원히 살려 두지 않는다.
인터페이스는 특정 명세를 만족하는 값들을 갖는 프로퍼티 키들의 집합이다. 어떤 객체가 한 인터페이스 명세에 기술된 모든 프로퍼티를 제공하면 그 객체는 그 인터페이스를 준수(conform)한다고 한다. 인터페이스 자체가 별도의 객체로 표현되지는 않는다. 하나의 인터페이스를 준수하는 개별적으로 구현된 객체는 여럿 있을 수 있다. 하나의 객체가 여러 인터페이스를 동시에 준수할 수도 있다.
반환된 객체는 IteratorResult 인터페이스를 준수해야 한다. 어떤 이터레이터의 next 메서드에 대한 이전 호출이 "done" 프로퍼티가 true인 IteratorResult 객체를 반환했다면, 그 객체에 대한 이후의 모든 next 호출도 "done" 프로퍼티가 true인 IteratorResult 객체를 반환해야 한다. 그러나 이 요구사항은 강제되지 않는다.
Note 1
next 함수에 인수를 전달할 수 있지만, 그것들의 해석 및 유효성은 대상 이터레이터에 의존한다. for-of 문 및 기타 일반적인 이터레이터 소비자는 어떤 인수도 전달하지 않으므로, 그러한 방식으로 사용될 것을 기대하는 이터레이터 객체는 인수 없이 호출되는 상황을 처리할 준비가 되어 있어야 한다.
반환된 객체는 IteratorResult 인터페이스를 준수해야 한다. 이 메서드를 호출하면 호출자가 더 이상 이터레이터의 next 메서드를 호출할 의도가 없음을 이터레이터 객체에 알린다. 반환된 IteratorResult 객체는 대개 "done" 프로퍼티 값이 true이고, return 메서드의 인수로 전달된 값을 가진 "value" 프로퍼티를 가진다. 그러나 이 요구사항은 강제되지 않는다.
"throw"
IteratorResult 객체를 반환하는 함수
반환된 객체는 IteratorResult 인터페이스를 준수해야 한다. 이 메서드를 호출하면 호출자가 에러 상태를 감지했음을 이터레이터 객체에 알린다. 인수는 에러 상태를 식별하는 데 사용될 수 있고 일반적으로 예외 객체일 것이다. 일반적인 반응은 인수로 전달된 값을 throw하는 것이다. 메서드가 throw하지 않는 경우, 반환된 IteratorResult 객체는 대개 "done" 프로퍼티 값이 true이다.
Note 2
보통 이러한 메서드의 호출자는 호출 전에 그 존재를 확인해야 한다. for-of, yield*, 배열 구조 분해 등을 포함한 특정 ECMAScript 언어 기능은 존재 여부를 확인한 후 이들 메서드를 호출한다. 이터러블 객체를 인수로 받는 대부분의 ECMAScript 라이브러리 함수도 조건부로 이들을 호출한다.
27.1.1.3 Async Iterable 인터페이스 (The Async Iterable Interface)
반환된 promise가 이행(fulfill)될 때, IteratorResult 인터페이스를 준수하는 객체로 이행해야 한다. 어떤 async iterator의 next 메서드에 대한 이전 호출이 "done" 프로퍼티가 true인 IteratorResult 객체에 대한 promise를 반환했다면, 그 객체의 이후 모든 next 호출 역시 "done" 프로퍼티가 true인 IteratorResult 객체에 대한 promise를 반환해야 한다. 그러나 이 요구사항은 강제되지 않는다.
추가로, 이행 값으로 사용되는 IteratorResult 객체는 promise(또는 "thenable")가 아닌 값을 가진 "value" 프로퍼티를 가져야 한다. 하지만 이 요구사항 또한 강제되지 않는다.
Note 1
next 함수에 인수를 전달할 수 있지만, 그것들의 해석 및 유효성은 대상 async iterator에 의존한다. for-await-of 문 및 기타 일반적인 async iterator 소비자는 인수를 전달하지 않으므로, 그러한 방식으로 사용될 것을 기대하는 async iterator 객체는 인수 없이 호출되는 상황을 처리할 준비가 되어 있어야 한다.
반환된 promise가 이행될 때, IteratorResult 인터페이스를 준수하는 객체로 이행해야 한다. 이 메서드를 호출하면 호출자가 async iterator의 next 메서드를 더 이상 호출할 의도가 없음을 async iterator 객체에 알린다. 반환되는 promise는 대개 "done" 프로퍼티 값이 true이고, return 메서드의 인수로 전달된 값을 가진 "value" 프로퍼티가 있는 IteratorResult 객체로 이행된다. 그러나 이 요구사항은 강제되지 않는다.
추가로, 이행 값으로 사용되는 IteratorResult 객체는 promise(또는 "thenable")가 아닌 값을 가진 "value" 프로퍼티를 가져야 한다. 인수 값이 일반적인 방식으로 사용되는 경우, 만약 그것이 거부된(rejected) promise라면 동일한 reason으로 거부된 promise가 반환되어야 하고, 이행된(fulfilled) promise라면 그 이행 값을 반환 promise의 IteratorResult 객체 이행 값의 "value" 프로퍼티로 사용해야 한다. 그러나 이러한 요구사항들도 강제되지 않는다.
"throw"
IteratorResult 객체에 대한 promise 를 반환하는 함수
반환된 promise가 이행될 때, IteratorResult 인터페이스를 준수하는 객체로 이행해야 한다. 이 메서드를 호출하면 호출자가 에러 상태를 감지했음을 async iterator 객체에 알린다. 인수는 에러 상태를 식별하는 데 사용될 수 있으며 일반적으로 예외 객체일 것이다. 전형적인 반응은 인수로 전달된 값으로 거부되는(rejected) promise를 반환하는 것이다.
반환된 promise가 이행되는 경우, IteratorResult 객체 이행 값은 보통 "done" 프로퍼티 값이 true이다. 또한 "value" 프로퍼티는 promise(또는 "thenable")가 아닌 값을 가져야 하지만, 이 요구사항은 강제되지 않는다.
Note 2
일반적으로 이러한 메서드의 호출자는 호출 전에 그 존재를 확인해야 한다. for-await-of 및 yield* 등을 포함한 특정 ECMAScript 언어 기능은 존재 여부를 확인한 뒤 이들 메서드를 호출한다.
27.1.1.5 IteratorResult 인터페이스 (The IteratorResult Interface)
이는 이터레이터 next 메서드 호출의 결과 상태이다. 이터레이터의 끝에 도달했다면 "done" 은 true이다. 끝에 도달하지 않았다면 "done" 은 false이며 값이 존재한다. "done" 프로퍼티(소유 또는 상속)가 존재하지 않는다면 그 값은 false로 간주한다.
done 이 false이면, 이는 현재 반복 요소 값이다. done 이 true이면, 이는 이터레이터가 제공했다면 그 반환 값이다. 이터레이터에 반환 값이 없다면 "value" 는 undefined이다. 그 경우, 객체가 명시적 "value" 프로퍼티를 상속하지 않는다면 "value" 프로퍼티는 준수 객체에서 생략될 수 있다.
Iterator Helper 객체는 특정 소스 이터레이터 객체의 지연(lazy) 변환을 표현하는 일반 객체이다. Iterator Helper 객체에 대한 명명된 생성자는 없다. 대신, Iterator Helper 객체는 Iterator 인스턴스 객체의 특정 메서드를 호출하여 생성된다.
27.1.2.1 %IteratorHelperPrototype% 객체 (The %IteratorHelperPrototype% Object)
이 명세에서 iterator 인터페이스를 구현하는 모든 객체는 %Iterator.prototype%을 상속한다. ECMAScript 코드는 또한 %Iterator.prototype%을 상속하는 객체를 정의할 수 있다. %Iterator.prototype%은 모든 iterator 객체에 적용 가능한 추가 메서드를 추가할 수 있는 장소를 제공한다.
다음 식은 ECMAScript 코드가 %Iterator.prototype% 객체에 접근할 수 있는 한 가지 방법이다:
이 명세에서 async iterator 인터페이스를 구현하는 모든 객체는 %AsyncIteratorPrototype%을 상속한다. ECMAScript 코드는 또한 %AsyncIteratorPrototype%을 상속하는 객체를 정의할 수 있다. %AsyncIteratorPrototype% 객체는 모든 async iterator 객체에 적용 가능한 추가 메서드를 추가할 수 있는 장소를 제공한다.
27.1.6 Sync 이터레이터 기반 Async 이터레이터 객체 (Async-from-Sync Iterator Objects)
Async-from-Sync Iterator 객체는 특정 동기(synchronous) 이터레이터를 적응(adapt)한 async 이터레이터이다. Async-from-Sync Iterator 객체는 ECMAScript 코드에서 직접 접근할 수 없다. Async-from-Sync Iterator 객체에 대한 명명된 생성자는 없다. 대신, 필요할 때 CreateAsyncFromSyncIterator 추상 연산에 의해 생성된다.
The abstract operation CreateAsyncFromSyncIterator takes argument syncIteratorRecord (an Iterator Record) and returns an Iterator Record. 동기 Iterator Record 로부터 async Iterator Record 를 생성하는 데 사용된다. It performs the following steps when called:
The abstract operation AsyncFromSyncIteratorContinuation takes arguments result (an Object), promiseCapability (a PromiseCapability Record for an intrinsic %Promise%), syncIteratorRecord (an Iterator Record), and closeOnRejection (a Boolean) and returns a Promise. It performs the following steps when called:
주: promiseCapability 가 내재 %Promise% 로부터 유도되었으므로, 이후 IfAbruptRejectPromise 사용이 수반하는 promiseCapability.[[Reject]] 호출은 throw 하지 않는 것이 보장된다.
주: onRejected 는 IteratorResult 객체가 내놓는 "value" 프로퍼티가 거부된 promise 인 경우 이터레이터를 닫는 데 사용된다.
PerformPromiseThen(valueWrapper, onFulfilled, onRejected, promiseCapability)를 수행한다.
promiseCapability.[[Promise]] 를 반환한다.
27.2 Promise Objects
Promise 는 지연(그리고 비동기일 수도 있는) 계산의 최종 결과에 대한 자리표시자로 사용되는 객체이다.
모든 Promise 는 상호 배타적인 세 가지 상태 중 하나이다: fulfilled, rejected, pending:
Promise p 는 p.then(f, r) 이 즉시 함수 f 를 호출하는 Job 을 큐잉(enqueue)하면 fulfilled 상태이다.
Promise p 는 p.then(f, r) 이 즉시 함수 r 를 호출하는 Job 을 큐잉하면 rejected 상태이다.
Promise 가 fulfilled 도 rejected 도 아니면 pending 상태이다.
Promise 가 pending 이 아니면, 즉 fulfilled 이거나 rejected 이면 settled 되었다고 말한다.
Promise 가 settled 이거나 다른 promise 의 상태에 “고정(lock in)” 되었으면 resolved 되었다고 한다. 이미 resolved 된 promise 를 resolve 또는 reject 하려는 시도는 아무 효과가 없다. Promise 가 resolved 가 아니면 unresolved 이다. Unresolved promise 는 항상 pending 상태이다. Resolved promise 는 pending, fulfilled 또는 rejected 일 수 있다.
PromiseCapability Record 는 특정 Promise 또는 Promise 유사 객체와 그것을 resolve 또는 reject 할 수 있는 함수들을 함께 캡슐화하기 위해 사용되는 Record 값이다. PromiseCapability Record 는 NewPromiseCapability 추상 연산에 의해 생성된다.
들어오는 값에 적용되어 그 반환 값이 파생된 promise 에서 일어날 일을 결정하는 함수. [[Handler]] 가 empty 이면 [[Type]] 값에 따라 결정되는 함수가 대신 사용된다.
27.2.1.3 CreateResolvingFunctions ( promise )
The abstract operation CreateResolvingFunctions takes argument promise (a Promise) and returns a Record with fields [[Resolve]] (a function object) and [[Reject]] (a function object). It performs the following steps when called:
alreadyResolved 를 Record { [[Value]]: false } 로 둔다.
The abstract operation FulfillPromise takes arguments promise (a Promise) and value (an ECMAScript language value) and returns unused. It performs the following steps when called:
IsCallable(resolvingFunctions.[[Resolve]]) 가 false 이면 TypeError 예외를 던진다.
IsCallable(resolvingFunctions.[[Reject]]) 가 false 이면 TypeError 예외를 던진다.
PromiseCapability Record { [[Promise]]: promise, [[Resolve]]: resolvingFunctions.[[Resolve]], [[Reject]]: resolvingFunctions.[[Reject]] } 를 반환한다.
Note
이 추상 연산은 전달된 executor 함수 인수를 Promise 생성자와 동일한 방식으로 호출하는 어떤 생성자에도 일반화되어 Promise 서브클래싱을 지원한다. 이는 Promise 생성자의 정적 메서드들을 임의의 서브클래스로 일반화하는 데 사용된다.
27.2.1.6 IsPromise ( x )
The abstract operation IsPromise takes argument x (an ECMAScript language value) and returns a Boolean. 객체에 promise 브랜드가 있는지 검사한다. It performs the following steps when called:
x 가 Object 가 아니면 false 를 반환한다.
x 에 [[PromiseState]] 내부 슬롯이 없으면 false 를 반환한다.
true 를 반환한다.
27.2.1.7 RejectPromise ( promise, reason )
The abstract operation RejectPromise takes arguments promise (a Promise) and reason (an ECMAScript language value) and returns unused. It performs the following steps when called:
The abstract operation TriggerPromiseReactions takes arguments reactions (a List of PromiseReaction Records) and argument (an ECMAScript language value) and returns unused. reactions 의 각 레코드에 대해 새로운 Job 을 큐잉한다. 각 Job 은 PromiseReaction Record 의 [[Type]] 과 [[Handler]] 를 처리하며, [[Handler]] 가 empty 가 아니면 주어진 인수를 전달하여 호출한다. [[Handler]] 가 empty 이면 동작은 [[Type]] 에 의해 결정된다. It performs the following steps when called:
The host-defined abstract operation HostPromiseRejectionTracker takes arguments promise (a Promise) and operation ("reject" or "handle") and returns unused. 호스트 환경이 promise rejection 을 추적할 수 있도록 한다.
HostPromiseRejectionTracker 의 기본 구현은 unused 를 반환하는 것이다.
Note 1
HostPromiseRejectionTracker 는 두 시나리오에서 호출된다:
Promise 가 핸들러 없이 reject 될 때 operation 인수가 "reject" 로 호출된다.
처음으로 핸들러가 reject 된 promise 에 추가될 때 operation 인수가 "handle" 로 호출된다.
전형적인 구현은 처리되지 않은 rejection 을 개발자에게 알리려고 시도하며, 이후 새로운 핸들러가 부착되어 이전 알림이 무효화되는 경우도 알리도록 주의할 수 있다.
Note 2
operation 이 "handle" 이면 구현은 가비지 컬렉션을 방해하는 방식으로 promise 에 대한 참조를 보유하지 않아야 한다. operation 이 "reject" 이면, rejection 은 드물고 핫 코드 경로가 아닐 것으로 예상되므로 promise 에 대한 참조를 보유할 수 있다.
The abstract operation NewPromiseReactionJob takes arguments reaction (a PromiseReaction Record) and argument (an ECMAScript language value) and returns a Record with fields [[Job]] (a JobAbstract Closure) and [[Realm]] (a Realm Record or null). 들어오는 값에 적절한 핸들러를 적용하고, 그 핸들러의 반환 값을 사용하여 그 핸들러와 연관된 파생 promise 를 resolve 또는 reject 하는 새로운 Job 추상 클로저를 반환한다. It performs the following steps when called:
job 을 매개변수 없고 reaction 및 argument 를 포획(capture)하며 호출 시 다음 단계를 수행하는 새로운 Job 추상 클로저로 둔다:
주: handlerRealm 은 핸들러가 undefined 인 경우를 제외하고 null 이 아니다. 핸들러가 취소된 Proxy 이고 어떤 ECMAScript 코드도 실행되지 않을 때 handlerRealm 은 에러 객체를 생성하는 데 사용된다.
Record { [[Job]]: job, [[Realm]]: handlerRealm } 를 반환한다.
27.2.2.2 NewPromiseResolveThenableJob ( promiseToResolve, thenable, then )
The abstract operation NewPromiseResolveThenableJob takes arguments promiseToResolve (a Promise), thenable (an Object), and then (a JobCallback Record) and returns a Record with fields [[Job]] (a JobAbstract Closure) and [[Realm]] (a Realm Record). It performs the following steps when called:
job 을 매개변수 없고 promiseToResolve, thenable, then 을 포획하며 호출 시 다음 단계를 수행하는 새로운 Job 추상 클로저로 둔다:
클래스 정의의 extends 절 값으로 사용될 수 있다. 지정된 Promise 동작을 상속하려는 서브클래스 생성자는 Promise 및 Promise.prototype 내장 메서드를 지원하는 데 필요한 내부 상태로 서브클래스 인스턴스를 생성 및 초기화하기 위해 Promise 생성자에 대한 super 호출을 포함해야 한다.
27.2.3.1 Promise ( executor )
이 함수는 호출될 때 다음 단계를 수행한다:
NewTarget 이 undefined 이면 TypeError 예외를 던진다.
IsCallable(executor) 가 false 이면 TypeError 예외를 던진다.
promise 를 ? OrdinaryCreateFromConstructor(NewTarget, "%Promise.prototype%", « [[PromiseState]], [[PromiseResult]], [[PromiseFulfillReactions]], [[PromiseRejectReactions]], [[PromiseIsHandled]] ») 로 둔다.
promise.[[PromiseState]] 를 pending 으로 설정한다.
promise.[[PromiseResult]] 를 empty 로 설정한다.
promise.[[PromiseFulfillReactions]] 를 새로운 빈 List 로 설정한다.
promise.[[PromiseRejectReactions]] 를 새로운 빈 List 로 설정한다.
? Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] ») 를 수행한다.
promise 를 반환한다.
Note
executor 인수는 함수 객체여야 한다. 이는 이 Promise 가 표현하는 (지연될 수 있는) 동작을 시작하고 완료를 보고하기 위해 호출된다. Executor 는 두 인수: resolve 와 reject 로 호출된다. 이들은 지연 계산의 최종 완료 또는 실패를 보고하기 위해 executor 함수에서 사용할 수 있는 함수이다. Executor 함수에서 반환하는 것은 지연 동작이 완료되었음을 의미하지 않고 단지 나중에 그 지연 동작을 수행하라는 요청이 수락되었음을 의미한다.
executor 에 전달되는 resolve 함수는 단일 인수를 받는다. executor 코드는 결국 resolve 함수를 호출해 관련 Promise 를 resolve 하려 함을 나타낼 수 있다. resolve 함수에 전달되는 인수는 지연 동작의 최종 값을 나타내며 실제 이행 값이거나 그것이 이행될 경우 값을 제공할 다른 promise 일 수 있다.
executor 에 전달되는 reject 함수는 단일 인수를 받는다. executor 코드는 결국 reject 함수를 호출해 관련 Promise 가 rejected 되었고 결코 fulfilled 되지 않을 것임을 나타낼 수 있다. reject 함수에 전달되는 인수는 promise 의 rejection 값으로 사용되며 일반적으로 Error 객체이다.
Promise 생성자가 executor 함수에 전달하는 resolve 및 reject 함수는 실제로 해당 promise 를 resolve 및 reject 할 수 있는 능력을 가진다. 서브클래스는 resolve 와 reject 에 대해 사용자 정의 값을 전달하는 다른 생성자 동작을 가질 수 있다.
27.2.4 Promise 생성자의 프로퍼티 (Properties of the Promise Constructor)
이 함수는 전달된 promise 들의 이행 값 배열로 이행되는 새로운 promise 를 반환하거나, 가장 먼저 reject 된 promise 의 reason 으로 reject 된다. 이 알고리즘을 수행하면서 전달된 iterable 의 모든 요소를 promise 로 resolve 한다.
The abstract operation GetPromiseResolve takes argument promiseConstructor (a constructor) and returns either a normal completion containing a function object or a throw completion. It performs the following steps when called:
promiseResolve 를 ? Get(promiseConstructor, "resolve") 로 둔다.
IsCallable(promiseResolve) 가 false 이면 TypeError 예외를 던진다.
The abstract operation PerformPromiseAll takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
onFulfilled 를 CreateBuiltinFunction(steps, length, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») 로 둔다.
onFulfilled.[[AlreadyCalled]] 를 false 로 설정한다.
onFulfilled.[[Index]] 를 index 로 설정한다.
onFulfilled.[[Values]] 를 values 로 설정한다.
onFulfilled.[[Capability]] 를 resultCapability 로 설정한다.
onFulfilled.[[RemainingElements]] 를 remainingElementsCount 로 설정한다.
remainingElementsCount.[[Value]] 를 remainingElementsCount.[[Value]] + 1 로 설정한다.
? Invoke(nextPromise, "then", « onFulfilled, resultCapability.[[Reject]] ») 를 수행한다.
index 를 index + 1 로 설정한다.
27.2.4.1.3Promise.all Resolve Element Functions
Promise.all resolve 요소 함수는 특정 Promise.all 요소를 resolve 하는 데 사용되는 익명 내장 함수이다. 각 Promise.all resolve 요소 함수는 [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가진다.
Promise.all resolve 요소 함수가 인수 x 와 함께 호출되면 다음 단계를 수행한다:
? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») 를 반환한다.
undefined 를 반환한다.
Promise.all resolve 요소 함수의 "length" 프로퍼티는 1𝔽 이다.
27.2.4.2 Promise.allSettled ( iterable )
이 함수는 모든 원래 promise 가 settled(즉 fulfilled 또는 rejected) 된 후에, promise 상태 스냅샷 객체들의 배열로 이행되는 promise 를 반환한다. 이 알고리즘을 수행하면서 전달된 iterable 의 모든 요소를 promise 로 resolve 한다.
The abstract operation PerformPromiseAllSettled takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
onFulfilled 를 CreateBuiltinFunction(stepsFulfilled, lengthFulfilled, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») 로 둔다.
onRejected 를 CreateBuiltinFunction(stepsRejected, lengthRejected, "", « [[AlreadyCalled]], [[Index]], [[Values]], [[Capability]], [[RemainingElements]] ») 로 둔다.
onRejected.[[AlreadyCalled]] 를 alreadyCalled 로 설정한다.
onRejected.[[Index]] 를 index 로 설정한다.
onRejected.[[Values]] 를 values 로 설정한다.
onRejected.[[Capability]] 를 resultCapability 로 설정한다.
onRejected.[[RemainingElements]] 를 remainingElementsCount 로 설정한다.
remainingElementsCount.[[Value]] 를 remainingElementsCount.[[Value]] + 1 로 설정한다.
? Invoke(nextPromise, "then", « onFulfilled, onRejected ») 를 수행한다.
index 를 index + 1 로 설정한다.
27.2.4.2.2Promise.allSettled Resolve Element Functions
Promise.allSettled resolve 요소 함수는 특정 Promise.allSettled 요소를 resolve 하는 데 사용되는 익명 내장 함수이다. 각 함수는 [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가진다.
Promise.allSettled resolve 요소 함수가 인수 x 로 호출되면 다음 단계를 수행한다:
? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») 를 반환한다.
undefined 를 반환한다.
Promise.allSettled resolve 요소 함수의 "length" 프로퍼티는 1𝔽 이다.
27.2.4.2.3Promise.allSettled Reject Element Functions
Promise.allSettled reject 요소 함수는 특정 Promise.allSettled 요소를 reject 하는 데 사용되는 익명 내장 함수이다. 각 함수는 [[Index]], [[Values]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가진다.
Promise.allSettled reject 요소 함수가 인수 x 로 호출되면 다음 단계를 수행한다:
? Call(promiseCapability.[[Resolve]], undefined, « valuesArray ») 를 반환한다.
undefined 를 반환한다.
Promise.allSettled reject 요소 함수의 "length" 프로퍼티는 1𝔽 이다.
27.2.4.3 Promise.any ( iterable )
이 함수는 전달된 promise 중 처음 fulfilled 되는 promise 로 fulfilled 되거나, 모두 rejected 되면 rejection reason 들을 담은 AggregateError 로 reject 되는 promise 를 반환한다. 이 알고리즘을 수행하면서 전달된 iterable 의 모든 요소를 promise 로 resolve 한다.
The abstract operation PerformPromiseAny takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
onRejected 를 CreateBuiltinFunction(stepsRejected, lengthRejected, "", « [[AlreadyCalled]], [[Index]], [[Errors]], [[Capability]], [[RemainingElements]] ») 로 둔다.
onRejected.[[AlreadyCalled]] 를 false 로 설정한다.
onRejected.[[Index]] 를 index 로 설정한다.
onRejected.[[Errors]] 를 errors 로 설정한다.
onRejected.[[Capability]] 를 resultCapability 로 설정한다.
onRejected.[[RemainingElements]] 를 remainingElementsCount 로 설정한다.
remainingElementsCount.[[Value]] 를 remainingElementsCount.[[Value]] + 1 로 설정한다.
? Invoke(nextPromise, "then", « resultCapability.[[Resolve]], onRejected ») 를 수행한다.
index 를 index + 1 로 설정한다.
27.2.4.3.2Promise.any Reject Element Functions
Promise.any reject 요소 함수는 특정 Promise.any 요소를 reject 하는 데 사용되는 익명 내장 함수이다. 각 함수는 [[Index]], [[Errors]], [[Capability]], [[RemainingElements]], [[AlreadyCalled]] 내부 슬롯을 가진다.
Promise.any reject 요소 함수가 인수 x 로 호출되면 다음 단계를 수행한다:
The abstract operation PerformPromiseRace takes arguments iteratorRecord (an Iterator Record), constructor (a constructor), resultCapability (a PromiseCapability Record), and promiseResolve (a function object) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
이 함수는 this 값이 Promise 생성자의 매개변수 규약을 지원하는 생성자 함수이기를 기대한다.
27.2.4.7.1 PromiseResolve ( C, x )
The abstract operation PromiseResolve takes arguments C (an Object) and x (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or a throw completion. x 로 resolve 된 새로운 promise 를 반환한다. It performs the following steps when called:
The abstract operation PerformPromiseThen takes arguments promise (a Promise), onFulfilled (an ECMAScript language value), and onRejected (an ECMAScript language value) and optional argument resultCapability (a PromiseCapability Record) and returns an ECMAScript language value. promise 에 대해 onFulfilled 및 onRejected 를 정착(settlement) 동작으로 사용하여 “then” 연산을 수행한다. resultCapability 가 전달되면 그 promise 를 갱신하여 결과를 저장한다. 전달되지 않은 경우, 결과가 중요하지 않은 명세 내부 연산에 의해 호출된 것이다. It performs the following steps when called:
생성자가 아니라 함수로 호출될 때 새 GeneratorFunction 을 생성하고 초기화한다. 따라서 함수 호출 GeneratorFunction (…) 은 동일한 인수로 new GeneratorFunction (…) 객체 생성 표현식과 동등하다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 GeneratorFunction 동작을 상속하려는 서브클래스 생성자는 내장 GeneratorFunction 동작에 필요한 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 GeneratorFunction 생성자에 대한 super 호출을 포함해야 한다. 제너레이터 함수 객체를 정의하는 모든 ECMAScript 문법 형태는 GeneratorFunction 의 직접 인스턴스를 생성한다. GeneratorFunction 서브클래스 인스턴스를 만들 수 있는 문법적 수단은 없다.
모든 GeneratorFunction 인스턴스는 ECMAScript 함수 객체이며 Table 28 에 열거된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false 이다.
각 GeneratorFunction 인스턴스는 다음 자체 프로퍼티들을 가진다:
27.3.4.1 length
20.2.4.1 에 기술된 Function 인스턴스의 "length" 프로퍼티 명세는 GeneratorFunction 인스턴스에도 적용된다.
27.3.4.2 name
20.2.4.2 에 기술된 Function 인스턴스의 "name" 프로퍼티 명세는 GeneratorFunction 인스턴스에도 적용된다.
27.3.4.3 prototype
GeneratorFunction 인스턴스가 생성될 때마다 또 다른 일반 객체가 생성되어 해당 제너레이터 함수의 "prototype" 프로퍼티 초기 값이 된다. 이 prototype 프로퍼티의 값은 제너레이터 함수 객체가 [[Call]] 로 호출될 때 새로 생성되는 Generator 의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용된다.
이 프로퍼티는 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.
Note
Function 인스턴스와 달리, GeneratorFunction 의 "prototype" 프로퍼티 값인 객체는 그 값이 해당 GeneratorFunction 인스턴스인 "constructor" 프로퍼티를 가지지 않는다.
생성자가 아니라 함수로 호출될 때 새 AsyncGeneratorFunction 을 생성하고 초기화한다. 따라서 AsyncGeneratorFunction (...) 호출은 동일한 인수의 new AsyncGeneratorFunction (...) 과 동등하다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 AsyncGeneratorFunction 동작을 상속하려는 서브클래스 생성자는 내장 AsyncGeneratorFunction 동작에 필요한 내부 슬롯을 가진 서브클래스 인스턴스를 생성·초기화하기 위해 AsyncGeneratorFunction 생성자에 대한 super 호출을 포함해야 한다. async generator 함수 객체를 정의하는 모든 ECMAScript 문법 형태는 AsyncGeneratorFunction 의 직접 인스턴스를 생성한다. AsyncGeneratorFunction 서브클래스 인스턴스를 만들 수 있는 문법적 수단은 없다.
모든 AsyncGeneratorFunction 인스턴스는 ECMAScript 함수 객체이며 Table 28 에 열거된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false 이다.
각 AsyncGeneratorFunction 인스턴스는 다음 자체 프로퍼티들을 가진다:
27.4.4.1 length
"length" 프로퍼티의 값은 AsyncGeneratorFunction 이 일반적으로 기대하는 인수 개수를 나타내는 정수 Number 이다. 그러나 언어는 다른 개수의 인수로 호출하는 것을 허용한다. "length" 프로퍼티에 지정된 것과 다른 인수 개수로 호출될 때의 AsyncGeneratorFunction 동작은 함수에 따라 다르다.
이 프로퍼티는 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true } 특성을 가진다.
27.4.4.2 name
20.2.4.2 에 기술된 Function 인스턴스의 "name" 프로퍼티 명세는 AsyncGeneratorFunction 인스턴스에도 적용된다.
27.4.4.3 prototype
AsyncGeneratorFunction 인스턴스가 생성될 때마다 또 다른 일반 객체가 생성되어 해당 async generator 함수의 "prototype" 프로퍼티 초기 값이 된다. 이 prototype 프로퍼티 값은 generator 함수 객체가 [[Call]] 로 호출될 때 새로 생성되는 AsyncGenerator 의 [[Prototype]] 내부 슬롯을 초기화하는 데 사용된다.
이 프로퍼티는 { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false } 특성을 가진다.
Note
function 인스턴스와 달리, AsyncGeneratorFunction 의 "prototype" 프로퍼티 값인 객체는 그 값이 해당 AsyncGeneratorFunction 인스턴스인 "constructor" 프로퍼티를 가지지 않는다.
27.5 Generator 객체 (Generator Objects)
Generator 는 제너레이터 함수를 호출하여 생성되며 이터레이터 인터페이스와 iterable 인터페이스를 모두 준수한다.
Generator 인스턴스는 그것을 생성한 제너레이터 함수의 "prototype" 프로퍼티 초기 값으로부터 직접 프로퍼티를 상속한다. Generator 인스턴스는 %GeneratorPrototype% 으로부터 간접적으로 프로퍼티를 상속한다.
27.5.1 %GeneratorPrototype% 객체 (The %GeneratorPrototype% Object)
The abstract operation GeneratorStart takes arguments generator (a Generator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:
Assert: generator.[[GeneratorState]] 는 suspended-start.
genContext 를 실행 중인 실행 컨텍스트로 둔다.
genContext 의 Generator 컴포넌트를 generator 로 설정한다.
closure 를 매개변수 없고 generatorBody 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
acGenContext 를 실행 중인 실행 컨텍스트로 둔다.
acGenerator 를 acGenContext 의 Generator 컴포넌트로 둔다.
generatorBody 가 Parse Node 이면
result 를 Completion(Evaluation of generatorBody) 로 둔다.
The abstract operation GeneratorValidate takes arguments generator (an ECMAScript language value) and generatorBrand (a String or empty) and returns either a normal completion containing one of suspended-start, suspended-yield, or completed, or a throw completion. It performs the following steps when called:
The abstract operation GeneratorResume takes arguments generator (an ECMAScript language value), value (an ECMAScript language value or empty), and generatorBrand (a String or empty) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
The abstract operation GeneratorResumeAbrupt takes arguments generator (an ECMAScript language value), abruptCompletion (a return completion or a throw completion), and generatorBrand (a String or empty) and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:
genContext 를 실행 컨텍스트 스택에 push; 이제 genContext 가 실행 중인 실행 컨텍스트.
genContext 의 중단된 평가를 재개 하되 그것을 중단시킨 연산의 결과로 abruptCompletion 을 사용한다. result 를 재개된 계산이 반환한 Completion Record 로 둔다.
Assert: 여기로 돌아올 때 genContext 는 이미 실행 컨텍스트 스택에서 제거되었고 methodContext 가 현재 실행 중인 실행 컨텍스트.
? result 를 반환한다.
27.5.3.5 GetGeneratorKind ( )
The abstract operation GetGeneratorKind takes no arguments and returns non-generator, sync, or async. It performs the following steps when called:
genContext 를 실행 중인 실행 컨텍스트로 둔다.
genContext 가 Generator 컴포넌트를 가지지 않으면 non-generator 를 반환한다.
generator 를 genContext 의 Generator 컴포넌트 값으로 둔다.
generator 에 [[AsyncGeneratorState]] 내부 슬롯이 있으면 async 를 반환한다.
아니면 sync 를 반환한다.
27.5.3.6 GeneratorYield ( iteratorResult )
The abstract operation GeneratorYield takes argument iteratorResult (an Object that conforms to the IteratorResult interface) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:
The abstract operation Yield takes argument value (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:
The abstract operation CreateIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), generatorBrand (a String or empty), and generatorPrototype (an Object) and optional argument extraSlots (a List of names of internal slots) and returns a Generator. It performs the following steps when called:
주: closure 는 IteratorResult 객체를 산출하기 위해 Yield 연산을 사용할 수 있다.
calleeContext 를 실행 컨텍스트 스택에서 제거하고 callerContext 를 실행 중인 실행 컨텍스트로 복원한다.
generator 를 반환한다.
27.6 AsyncGenerator 객체 (AsyncGenerator Objects)
AsyncGenerator 는 async 제너레이터 함수를 호출하여 생성되며 async 이터레이터 인터페이스와 async iterable 인터페이스를 모두 준수한다.
AsyncGenerator 인스턴스는 그것을 생성한 async 제너레이터 함수의 "prototype" 프로퍼티 초기 값으로부터 직접 프로퍼티를 상속한다. AsyncGenerator 인스턴스는 %AsyncGeneratorPrototype% 으로부터 간접적으로 프로퍼티를 상속한다.
27.6.1 %AsyncGeneratorPrototype% 객체 (The %AsyncGeneratorPrototype% Object)
The abstract operation AsyncGeneratorStart takes arguments generator (an AsyncGenerator) and generatorBody (a FunctionBody Parse Node or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:
Assert: generator.[[AsyncGeneratorState]] 는 suspended-start.
genContext 를 실행 중인 실행 컨텍스트로 둔다.
genContext 의 Generator 컴포넌트를 generator 로 설정한다.
closure 를 매개변수 없고 generatorBody 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
acGenContext 를 실행 중인 실행 컨텍스트로 둔다.
acGenerator 를 acGenContext 의 Generator 컴포넌트로 둔다.
generatorBody 가 Parse Node 이면
result 를 Completion(Evaluation of generatorBody) 로 둔다.
The abstract operation AsyncGeneratorValidate takes arguments generator (an ECMAScript language value) and generatorBrand (a String or empty) and returns either a normal completion containingunused or a throw completion. It performs the following steps when called:
The abstract operation AsyncGeneratorEnqueue takes arguments generator (an AsyncGenerator), completion (a Completion Record), and promiseCapability (a PromiseCapability Record) and returns unused. It performs the following steps when called:
request 를 AsyncGeneratorRequest { [[Completion]]: completion, [[Capability]]: promiseCapability } 로 둔다.
request 를 generator.[[AsyncGeneratorQueue]] 에 추가한다.
The abstract operation AsyncGeneratorCompleteStep takes arguments generator (an AsyncGenerator), completion (a Completion Record), and done (a Boolean) and optional argument realm (a Realm Record) and returns unused. It performs the following steps when called:
Assert: generator.[[AsyncGeneratorQueue]] 는 비어 있지 않다.
next 를 generator.[[AsyncGeneratorQueue]] 의 첫 번째 요소로 둔다.
첫 번째 요소를 generator.[[AsyncGeneratorQueue]] 에서 제거한다.
The abstract operation AsyncGeneratorResume takes arguments generator (an AsyncGenerator) and completion (a Completion Record) and returns unused. It performs the following steps when called:
Assert: generator.[[AsyncGeneratorState]] 는 suspended-start 또는 suspended-yield.
genContext 를 generator.[[AsyncGeneratorContext]] 로 둔다.
callerContext 를 실행 중인 실행 컨텍스트로 둔다.
callerContext 를 suspend 한다.
generator.[[AsyncGeneratorState]] 를 executing 으로 설정한다.
genContext 를 실행 컨텍스트 스택에 push; 이제 genContext 가 실행 중인 실행 컨텍스트.
genContext 의 중단된 평가를 재개 하되 그것을 중단시킨 연산의 결과로 completion 을 사용한다. result 를 재개된 계산이 반환한 Completion Record 로 둔다.
The abstract operation AsyncGeneratorUnwrapYieldResumption takes argument resumptionValue (a Completion Record) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:
The abstract operation AsyncGeneratorYield takes argument value (an ECMAScript language value) and returns either a normal completion containing an ECMAScript language value or an abrupt completion. It performs the following steps when called:
The abstract operation AsyncGeneratorAwaitReturn takes argument generator (an AsyncGenerator) and returns unused. It performs the following steps when called:
Assert: generator.[[AsyncGeneratorState]] 는 draining-queue.
The abstract operation AsyncGeneratorDrainQueue takes argument generator (an AsyncGenerator) and returns unused. return completion 을 보유한AsyncGeneratorRequest 를 만날 때까지 제너레이터의 AsyncGeneratorQueue 를 비운다. It performs the following steps when called:
Assert: generator.[[AsyncGeneratorState]] 는 draining-queue.
queue 를 generator.[[AsyncGeneratorQueue]] 로 둔다.
반복, queue 가 비어 있지 않은 동안,
next 를 queue 의 첫 요소로 둔다.
completion 을 Completion(next.[[Completion]]) 로 둔다.
The abstract operation CreateAsyncIteratorFromClosure takes arguments closure (an Abstract Closure with no parameters), generatorBrand (a String or empty), and generatorPrototype (an Object) and returns an AsyncGenerator. It performs the following steps when called:
NOTE: closure 는 Await 연산과 IteratorResult 객체를 산출하기 위한 Yield 연산을 포함할 수 있다.
internalSlotsList 를 « [[AsyncGeneratorState]], [[AsyncGeneratorContext]], [[AsyncGeneratorQueue]], [[GeneratorBrand]] » 로 둔다.
생성자가 아니라 함수로 호출될 때 새 AsyncFunction 을 생성하고 초기화한다. 따라서 함수 호출 AsyncFunction(…) 은 동일한 인수의 new AsyncFunction(…) 객체 생성 표현식과 동등하다.
클래스 정의의 extends 절 값으로 사용할 수 있다. 지정된 AsyncFunction 동작을 상속하려는 서브클래스 생성자는 내장 async 함수 동작에 필요한 내부 슬롯을 갖춘 서브클래스 인스턴스를 생성·초기화하기 위해 AsyncFunction 생성자에 대한 super 호출을 포함해야 한다. async 함수 객체를 정의하는 모든 ECMAScript 문법 형태는 AsyncFunction 의 직접 인스턴스를 생성한다. AsyncFunction 서브클래스 인스턴스를 만들 수 있는 문법적 수단은 없다.
모든 AsyncFunction 인스턴스는 ECMAScript 함수 객체이며 Table 28 에 열거된 내부 슬롯을 가진다. 그러한 모든 인스턴스의 [[IsClassConstructor]] 내부 슬롯 값은 false 이다. AsyncFunction 인스턴스는 생성자가 아니며 [[Construct]] 내부 메서드를 갖지 않는다. AsyncFunction 인스턴스는 생성 불가능하므로 prototype 프로퍼티를 갖지 않는다.
각 AsyncFunction 인스턴스는 다음 자체 프로퍼티를 가진다:
27.7.4.1 length
20.2.4.1 에 기술된 Function 인스턴스 "length" 프로퍼티 명세는 AsyncFunction 인스턴스에도 적용된다.
27.7.4.2 name
20.2.4.2 에 기술된 Function 인스턴스 "name" 프로퍼티 명세는 AsyncFunction 인스턴스에도 적용된다.
27.7.5 Async 함수 추상 연산 (Async Functions Abstract Operations)
The abstract operation AsyncFunctionStart takes arguments promiseCapability (a PromiseCapability Record) and asyncFunctionBody (a FunctionBody Parse Node, an ExpressionBody Parse Node, or an Abstract Closure with no parameters) and returns unused. It performs the following steps when called:
runningContext 를 실행 중인 실행 컨텍스트로 둔다.
asyncContext 를 runningContext 의 복사본으로 둔다.
NOTE: 실행 상태 복사는 AsyncBlockStart 가 그 실행을 재개하기 위해 필요하다. 현재 실행 중인 컨텍스트를 재개하는 것은 잘 정의되지 않는다.
AsyncBlockStart(promiseCapability, asyncFunctionBody, asyncContext) 를 수행한다.
The abstract operation AsyncBlockStart takes arguments promiseCapability (a PromiseCapability Record), asyncBody (a Parse Node or an Abstract Closure with no parameters), and asyncContext (an execution context) and returns unused. It performs the following steps when called:
runningContext 를 실행 중인 실행 컨텍스트로 둔다.
closure 를 매개변수 없고 promiseCapability, asyncBody 를 포획하며 호출 시 다음 단계를 수행하는 새로운 Abstract Closure 로 둔다:
acAsyncContext 를 실행 중인 실행 컨텍스트로 둔다.
asyncBody 가 Parse Node 이면
result 를 Completion(Evaluation of asyncBody) 로 둔다.
The abstract operation Await takes argument value (an ECMAScript language value) and returns either a normal completion containing either an ECMAScript language value or empty, or a throw completion. It performs the following steps when called:
모듈 네임스페이스 객체는 모듈의 내보낸 바인딩에 속성 기반 런타임 접근을 제공하는 모듈 네임스페이스 특이 객체이다. 이를 위한 생성자 함수는 없다. 대신 NameSpaceImport 를 포함하는 ImportDeclaration 으로 가져온 각 모듈마다 이러한 객체가 생성된다.
10.4.6 에 명시된 프로퍼티 외에 각 모듈 네임스페이스 객체는 다음 자체 프로퍼티를 가진다:
메모리 일관성 모델 또는 memory model 은 SharedArrayBuffer 로 백업된 TypedArray 인스턴스 접근과 Atomics 객체의 메서드를 통해 발생하는 Shared Data Block 이벤트의 가능한 순서를 지정한다. 프로그램에 (아래 정의된) 데이터 레이스가 없을 때 이벤트들의 순서는 각 에이전트의 동작을 인터리빙한 것과 같이 순차적 일관성(sequentially consistent)으로 보인다. 프로그램에 데이터 레이스가 있을 때 공유 메모리 연산은 순차적 비일관성처럼 보일 수 있다. 예를 들어, 프로그램은 인과성 위반 동작 및 그 밖의 놀라운 현상을 보일 수 있다. 이러한 놀라움은 컴파일러 변환과 CPU 설계(예: 순서 재배치 실행 및 추측 실행)에서 비롯된다. 메모리 모델은 프로그램이 순차적 일관성 동작을 보이는 정확한 조건과 데이터 레이스에서 읽힐 수 있는 가능한 값들을 모두 정의한다. 즉, 정의되지 않은 동작은 없다.
메모리 모델은 SharedArrayBuffer 의 추상 연산 또는 평가 중 Atomics 객체 메서드에 의해 도입된 이벤트에 대한 관계 제약으로 정의된다.
Note
이 절은 SharedArrayBuffer 추상 연산이 도입하는 이벤트에 대한 공리적(axiomatic) 모델을 제공한다. 모델은 명세의 나머지와 달리 알고리즘적으로 표현될 수 없음을 강조해야 한다. 추상 연산에 의한 비결정적 이벤트 도입은 ECMAScript 평가의 실행 의미와 메모리 모델의 공리적 의미 사이의 인터페이스이다. 이러한 이벤트의 의미는 평가 내 모든 이벤트의 그래프를 고려하여 정의된다. 이것들은 정적 의미(Static Semantics)나 런타임 의미(Runtime Semantics)가 아니다. 입증된 알고리즘 구현이 아니라 특정 이벤트 그래프가 허용되는지 금지되는지를 결정하는 제약 집합이다.
29.1 메모리 모델 기초 (Memory Model Fundamentals)
공유 메모리 접근(읽기/쓰기)은 아래에서 정의되는 두 그룹, atomic 접근과 data 접근으로 나뉜다. Atomic 접근은 순차적 일관성을 가지며, 즉 에이전트 클러스터의 모든 에이전트가 동의하는 엄격한 전체 순서가 있다. 비-atomic 접근은 모든 에이전트가 동의하는 엄격한 전체 순서가 없으므로 정렬되지(unordered) 않는다.
Note 1
순차적 일관성과 unordered 보다 약하거나 강한(예: release-acquire) 순서는 지원되지 않는다.
Shared Data Block event 는 ReadSharedMemory, WriteSharedMemory 또는 ReadModifyWriteSharedMemory Record 이다.
ReadSharedMemory, WriteSharedMemory, ReadModifyWriteSharedMemory 이벤트의 범위(range)는 [[ByteIndex]] 부터 [[ByteIndex]] + [[ElementSize]] - 1 까지의 연속 정수 집합이다. 두 이벤트의 [[Block]] 이 같고 범위가 원소별 동일하면 범위가 같다. [[Block]] 이 같고 범위가 동일하지 않으며 교집합이 비어 있지 않으면 범위가 겹친다(overlapping). [[Block]] 이 다르거나 범위가 같지도 겹치지도 않으면 범위는 분리(disjoint)되었다.
Note 2
계정해야 할 호스트 특화 동기화 이벤트 예: 한 에이전트에서 다른 에이전트로 SharedArrayBuffer 를 보내기(브라우저의 postMessage), 에이전트 시작/종료, 공유 메모리 외 채널을 통한 에이전트 클러스터 내 통신. 특정 실행 execution 에 대해 이러한 이벤트는 host-synchronizes-with 엄격 부분 순서로 호스트에 의해 제공된다. 추가로, 호스트는 execution.[[EventList]] 에 호스트 특화 동기화 이벤트를 추가하여 is-agent-order-before 관계에 참여할 수 있다.
empty candidate execution 은 필드가 빈 List 인 candidate execution Record 이다.
29.5 메모리 모델을 위한 추상 연산 (Abstract Operations for the Memory Model)
29.5.1 EventSet ( execution )
The abstract operation EventSet takes argument execution (a candidate execution) and returns a Set of events. It performs the following steps when called:
The abstract operation SharedDataBlockEventSet takes argument execution (a candidate execution) and returns a Set of events. It performs the following steps when called:
The abstract operation HostEventSet takes argument execution (a candidate execution) and returns a Set of events. It performs the following steps when called:
29.6 후보 실행의 관계 (Relations of Candidate Executions)
다음 관계와 수학적 함수는 특정 후보 실행 위에서 매개변수화되며 그 이벤트들을 순서화한다.
29.6.1 is-agent-order-before
후보 실행 execution 에 대해, 그 is-agent-order-before 관계는 다음을 만족하는 최소 관계이다.
이벤트 E, D 에 대해 execution.[[EventsRecords]] 의 어떤 Agent Events Recordaer 가 있어 aer.[[EventList]] 에 E 와 D 둘 다 포함되고 E 가 List 순서에서 D 앞에 있으면 E is-agent-order-before D 이다.
Note
각 에이전트는 평가 중 per-agent 엄격 전체 순서로 이벤트를 도입한다. 이것은 그 엄격 전체 순서들의 합집합이다.
Rreads-fromW 이고 W.[[NoTear]] 가 true 인 각 이벤트 W 에 대해
R, W 범위가 같고 이벤트 V 가 존재하여 V, W 범위가 같고 V.[[NoTear]]true 이며 W ≠ V, 그리고 Rreads-fromV 이면 false 반환.
true 반환.
Note
이벤트의 [[NoTear]] 가 true 는 해당 이벤트가 정수 TypedArray 접근으로 도입되었을 때이고, 부동소수 TypedArray 또는 DataView 접근이면 false 이다.
직관적으로 이는 정렬된(integerTypedArray) 방식으로 메모리 범위를 접근할 때 동일 범위를 가진 여러 write 이벤트와 경쟁 중 한 write 이벤트가 “승리”해야 함을 의미한다. 보다 정확히, 정렬된 read 이벤트는 같은 범위를 가진 서로 다른 여러 write 이벤트들의 바이트를 혼합해 읽을 수 없다. 다만 겹치는 범위를 가진 여러 write 이벤트로부터 읽는 것은 가능하다.
메모리 모델은 data race free 프로그램에 대해 모든 이벤트의 순차적 일관성을 보장한다.
29.11 공유 메모리 가이드라인 (Shared Memory Guidelines)
Note 1
다음은 공유 메모리를 사용하는 ECMAScript 프로그래머를 위한 지침이다.
프로그램을 data race free 로 유지(즉 동일 메모리 위치에서 동시 비-atomic 연산이 불가능하도록)할 것을 권장한다. Data race free 프로그램은 각 에이전트 평가 의미 단계가 서로 인터리빙되는 의미를 갖는다. 이런 경우 메모리 모델 세부사항을 이해할 필요가 없다.
더 일반적으로, 프로그램이 data race free 가 아니어도 atomic 연산이 어떤 data race 에도 관여하지 않고 경쟁하는 연산이 모두 동일 접근 크기라면 예측 가능한 동작을 가질 수 있다. 가장 단순한 방법은 atomic 과 비-atomic 연산이 다른 메모리 셀을 사용하고 서로 다른 크기의 atomic 접근이 동시에 같은 셀을 접근하지 않게 하는 것이다. 즉 가능한 한 공유 메모리를 강한 타입처럼 다루어야 한다. 경쟁 중 비-atomic 접근의 순서와 타이밍에 의존할 수는 없지만 강한 타입처럼 다루면 값이 “찢어지는(tear)” 일은 없다.
Note 2
다음은 공유 메모리를 사용하는 프로그램에 대한 컴파일러 변환을 작성하는 ECMAScript 구현자를 위한 지침이다.
단일 에이전트 환경에서 유효한 대부분의 프로그램 변환이 다중 에이전트 환경에서도 유효하도록 허용하는 것이 바람직하다. 종종 이러한 변환은 판단이 어렵다. 우리는 메모리 모델이 함축하거나 그보다 강한 규칙 몇 가지를 개략적으로 제시한다.
read 이벤트의 possible read values 는 모든 유효 실행에서 그 이벤트에 대한 ValueOfReadEvent 값들의 집합이다.
공유 메모리가 없을 때 유효한 agent-order slice 변환은 아래 예외를 제외하고 공유 메모리 존재 시에도 유효하다.
Atomics 는 고정: 변환은 agent-order slice 의 seq-cst 이벤트를 그 unordered 연산과 재배열하거나 서로 재배열하거나 제거해서는 안 된다.
(실제로 재배열 금지는 seq-cst 연산이 동기화임을 가정하게 강제한다.)
읽기는 안정적: 주어진 shared memory read 는 한 실행에서 단일 값만 관찰해야 한다.
쓰기는 안정적: 관찰 가능한 모든 shared memory write 는 실행의 프로그램 의미에서 비롯해야 한다.
가능한 읽기 값은 공집합이 아님: 변환은 가능한 읽기 값 집합을 비게 할 수 없다.
여전히 유효한 변환 예: 동일 위치 다수 비-atomic 읽기 병합, 비-atomic 읽기 재배열, 추측 비-atomic 읽기 도입, 동일 위치 다수 비-atomic 쓰기 병합, 서로 다른 위치 비-atomic 쓰기 재배열, 루프 밖으로 비-atomic 읽기 hoist (종료 영향 있어도). 일반적으로 alias 된 TypedArray 는 위치 구분을 어렵게 한다.
Note 3
다음은 공유 메모리 접근에 대한 기계어 코드를 생성하는 ECMAScript 구현자를 위한 지침이다.
ARM 또는 Power 보다 약하지 않은 메모리 모델을 가진 아키텍처에서 비-atomic store/load 는 일반 store/load 로 컴파일할 수 있다. Atomic store/load 는 순차적 일관성을 보장하는 명령으로 컴파일한다. 없으면 메모리 배리어 사용. Read-modify-write 는 아키텍처의 read-modify-write 명령(예: x86 LOCK prefix, ARM load-exclusive/store-exclusive, Power load-link/store-conditional)으로 컴파일.
구체적으로 메모리 모델은 다음과 같은 코드 생성을 허용한다.
프로그램의 모든 atomic 연산은 필요하다고 가정.
Atomic 연산은 서로 또는 비-atomic 과 재배열되지 않는다.
함수는 항상 atomic 연산 수행 가능하다고 가정.
Atomic 연산은 더 큰 데이터의 read-modify-write 로 구현되지 않는다(플랫폼에 그 크기 atomic 없으면 lock-free 아니게 구현).
단순 코드 생성 패턴:
일반 load/store → 단일 load/store 명령.
Lock-free atomic load/store → 전체 펜스, load/store, 전체 펜스.
Lock-free atomic RMW → 전체 펜스, atomic RMW 시퀀스, 전체 펜스.
Non-lock-free atomic → 스핀락 획득, 전체 펜스, 비-atomic load/store 시리즈, 전체 펜스, 스핀락 해제.
이 매핑은 주소 범위에 대한 atomic 연산이 비-atomic 쓰기나 다른 크기 atomic 과 race 하지 않는 한 올바르다. 메모리 모델은 race 에 관여한 atomic 을 비-atomic 수준으로 강등하여 충분하다. 다만 이 단순 매핑은 atomic 연산을 순차적 일관성 펜스로 사용할 수 있게 하는 등 꽤 강하다.
허용되는 로컬 개선 예:
플랫폼 의존 중복 펜스 제거 (예: x86 에서 load/store 전후 펜스 일부 생략 등).
대부분 플랫폼은 필요한 모든 크기 lock-free atomic 지원.
두 back-to-back 펜스 → 하나로 대체; x86 에서 store 뒤 펜스만 유지 등.
이 부록에 정의된 ECMAScript 언어 구문과 의미는 ECMAScript 호스트가 웹 브라우저인 경우 필수이다. 이 부록의 내용은 규범적이지만 ECMAScript 호스트가 웹 브라우저가 아닌 경우 선택 사항이다.
이 부록에 정의된 일부 기능은 이 부록에서, 또 일부는 본문에서 정의된다.
기능이 본문에서 정의되는 경우, 문서에 영향을 미치는 각 지점은 색상 박스 안의 "Normative Optional" 문구로 표시된다. 또한 어떤 기능이 알고리즘이나 초기 에러 규칙의 특정 문구를 수반할 때는 그것이 관련 기능에 대해 “the host supports”하는 조건으로 보호된다. 웹 브라우저는 그러한 모든 기능을 지원해야 한다.
Note
이 부록은 다양한 레거시 기능과 웹 브라우저 ECMAScript 호스트의 기타 특성을 설명한다. 이 부록에 명시된 모든 언어 기능과 동작은 하나 이상의 바람직하지 않은 특성을 가지며 레거시 사용이 없다면 이 명세에서 제거되었을 것이다. 그러나 다수의 기존 웹 페이지가 이러한 기능을 사용하기 때문에 웹 브라우저는 계속해서 이를 지원해야 한다. 이 부록의 명세는 이러한 레거시 기능의 상호 운용 구현 요구 사항을 정의한다.
이 기능들은 핵심 ECMAScript 언어의 일부로 간주되지 않는다. 프로그래머는 새로운 ECMAScript 코드를 작성할 때 이러한 기능과 동작의 존재를 사용하거나 가정해서는 안 된다. ECMAScript 구현은 구현이 웹 브라우저의 일부이거나 웹 브라우저가 마주치는 동일한 레거시 ECMAScript 코드를 실행해야 하는 경우가 아니면 이러한 기능을 구현하지 않는 것이 권장된다.
B.1 추가 구문
B.1.1 HTML 유사 주석
12.4의 구문과 의미는 다음과 같이 확장되지만, 이 확장은 목표 심볼 Module 로 소스 텍스트를 파싱할 때는 허용되지 않는다:
22.2.1의 구문은 다음과 같이 수정·확장된다. 이러한 변경은 문법 생성식의 순서 및 문맥 정보를 통해 해소되는 모호성을 도입한다. 아래 문법을 사용하여 파싱할 때 각 대안은 이전 생성식 대안이 일치하지 않을 경우에만 고려된다.
이 대안 패턴 문법과 의미는 BMP 패턴의 구문과 의미만 변경한다. 다음 문법 확장은 [UnicodeMode] 매개변수를 가진 생성식을 포함한다. 그러나 이러한 확장 중 어느 것도 목표 심볼에 [UnicodeMode] 매개변수가 존재할 때 인식되는 유니코드 패턴의 구문을 변경하지 않는다.
첫 번째 ClassAtom 의 IsCharacterClass 가 true 이거나 두 번째 ClassAtom 의 IsCharacterClass 가 true 이고 이 생성식이 [UnicodeMode] 매개변수를 가진 경우 Syntax Error 이다.
첫 번째 ClassAtom 의 IsCharacterClass 가 false, 두 번째 ClassAtom 의 IsCharacterClass 가 false 이고 첫 번째 ClassAtom 의 CharacterValue 가 두 번째 ClassAtom 의 CharacterValue 보다 엄격하게 크면 Syntax Error 이다.
단일 문자 \ U+005C (REVERSE SOLIDUS)를 포함하는 CharSet 을 반환한다.
Note
이 생성식은 허용 가능한 제어 문자가 뒤따르지 않는 문자 클래스 내부의 \c 시퀀스로부터만 도달될 수 있다.
B.1.2.8.1 CharacterRangeOrUnion ( rer, A, B )
The abstract operation CharacterRangeOrUnion takes arguments rer (a RegExp Record), A (a CharSet), and B (a CharSet) and returns a CharSet. It performs the following steps when called:
k + 5 < len 이고 string 내 인덱스 k + 1 의 코드 유닛이 0x0075 (LATIN SMALL LETTER U)이면
hexDigits 를 string 의 k + 2 부터 k + 6 까지의 부분 문자열로 설정한다.
optionalAdvance 를 5로 설정한다.
Else if k + 3 ≤ len 이면
hexDigits 를 string 의 k + 1 부터 k + 3 까지의 부분 문자열로 설정한다.
optionalAdvance 를 2로 설정한다.
parseResult 를 ParseText(hexDigits, HexDigits[~Sep]) 로 둔다.
parseResult 가 Parse Node 이면
n 을 parseResult 의 MV 로 둔다.
C 를 숫자 값이 n 인 코드 유닛으로 설정한다.
k 를 k + optionalAdvance 로 설정한다.
R 을 R 과 C 의 문자열 연결로 설정한다.
k 를 k + 1 로 설정한다.
R 을 반환한다.
B.2.2 String.prototype 객체의 추가 프로퍼티
B.2.2.1 String.prototype.substr ( start, length )
이 메서드는 this 값을 String 으로 변환한 결과에서 인덱스 start 에서 시작하여 length 코드 유닛(또는 length 가 undefined 이면 문자열 끝까지) 길이의 substring 을 반환한다. start 가 음수이면 sourceLength 를 문자열 길이로 하여 sourceLength + start 로 처리한다. 결과는 String 객체가 아닌 String 값이다.
B.2.2.2.1 CreateHTML ( string, tag, attribute, value )
The abstract operation CreateHTML takes arguments string (an ECMAScript language value), tag (a String), attribute (a String), and value (an ECMAScript language value) and returns either a normal completion containing a String or a throw completion. It performs the following steps when called:
ECMAScript 2015 이전에는 Block 문장의 StatementList 요소로 FunctionDeclaration 이 등장하는 것이 ECMAScript 명세에 정의되지 않았다. 그러나 해당 형태의 FunctionDeclaration 지원은 허용 확장이었고 대부분의 브라우저 호스트 ECMAScript 구현이 이를 허용했다. 불행히도 그러한 선언의 의미는 구현마다 다르다. 이러한 의미 차이 때문에 Block 수준 함수 선언을 사용하는 기존 웹 ECMAScript 소스 텍스트는 그러한 선언에 대해 모든 브라우저 구현의 의미 교집합에만 의존하는 경우에만 브라우저 구현 간 이식 가능하다. 다음이 그 교집합 의미에 속하는 사용 사례이다:
첫 번째 사용 사례는 ECMAScript 2015 가 제공하는 Block 수준 함수 선언 의미와 상호 운용된다. 그 사용 사례를 사용하는 모든 기존 ECMAScript 소스 텍스트는 10, 14, 15 절에 의해 정의된 블록 수준 함수 선언 의미를 사용하여 동작한다.
두 번째 및 세 번째 사용 사례에 대한 ECMAScript 2015 상호 운용성은 10 절, 15 절, 19.2.1 절 및 16.1.7 절 의미에 대한 다음 확장을 필요로 한다.
ECMAScript 구현에 진단 경고 메시지를 보고하는 메커니즘이 있는 경우, 이러한 호환 의미가 적용되어 비호환 의미와 관찰 가능한 차이를 만드는 FunctionDeclaration 이 있는 코드를 포함하면 경고가 생성되어야 한다. 예를 들어, var 바인딩 도입이 초기 에러를 만들기 때문에 도입되지 않는 경우 경고 메시지는 생성되지 않아야 한다.
런타임에는 이러한 바인딩이 VariableDeclarationEnvironment 에서 인스턴스화된다. 이들은 CatchParameter 가 도입한 동일 이름 바인딩을 가리지 않으므로 해당 var 선언의 Initializer 는 var 바인딩이 아니라 대응 catch 매개변수에 할당한다.
[[IsHTMLDDA]] 내부 슬롯을 가진 객체는 이 명세에서 생성되지 않는다. 그러나 웹 브라우저의 document.all 객체 는 웹 호환성 목적을 위해 이 슬롯을 가진 호스트 정의 특이 객체이다. 이 종류 객체의 다른 알려진 예는 없으며 구현에서는 document.all 을 제외하고 새로 만들지 않아야 한다.
선언되지 않은 식별자나 그렇지 않고서는 해소 불가능한 참조에 대한 대입은 전역 객체에 프로퍼티를 생성하지 않는다. 단순 대입이 엄격 모드 코드 내에서 발생하면 그 LeftHandSideExpression 은 해소 불가능한 Reference 로 평가되어서는 안 된다. 그렇게 되면 ReferenceError 예외가 발생한다 (6.2.5.6). 또한 LeftHandSideExpression 은 속성 값이 { [[Writable]]: false } 인 데이터 프로퍼티, 속성 값이 { [[Set]]: undefined } 인 접근자 프로퍼티, 또는 [[Extensible]] 내부 슬롯이 false 인 객체의 존재하지 않는 프로퍼티에 대한 참조여서도 안 된다. 이러한 경우 TypeError 예외가 발생한다 (13.15).
엄격 함수의 arguments 객체는 접근 시 TypeError 예외를 던지는 설정 불가(accessor, 비구성) 접근자 프로퍼티"callee" 를 정의한다 (10.4.4.6).
엄격 함수의 arguments 객체는 해당 함수의 대응 형식 매개변수 바인딩과 array-indexed 프로퍼티 값을 동적으로 공유하지 않는다 (10.4.4).
엄격 함수에서 arguments 객체가 생성되는 경우 지역 식별자 arguments 의 그 객체에 대한 바인딩은 불변이며 따라서 대입 식의 대상이 될 수 없다 (10.2.11).
엄격 모드 코드 내에서 BindingIdentifier 의 StringValue 가 "eval" 또는 "arguments" 이면 SyntaxError 이다 (13.1.1).
엄격 모드 eval 코드는 호출자 변수 환경 내에 변수를 또는 함수를 인스턴스화할 수 없다. 대신 새로운 변수 환경이 생성되고 그 환경이 eval 코드의 선언 바인딩 인스턴스화를 위해 사용된다 (19.2.1).
엄격 모드 코드 내에서 this 가 평가되면 this 값은 객체로 강제(coerce)되지 않는다. undefined 또는 null 인 this 값은 전역 객체로 변환되지 않으며 원시 값도 래퍼 객체로 변환되지 않는다. 함수 호출( Function.prototype.apply, Function.prototype.call 사용 호출 포함)을 통해 전달된 this 값은 전달된 this 값을 객체로 강제하지 않는다 (10.2.1.2, 20.2.3.1, 20.2.3.3).
delete 연산자가 엄격 모드 코드 내에서 발생할 때 그 UnaryExpression 이 변수, 함수 인자, 함수 이름에 대한 직접 참조면 SyntaxError 가 던져진다 (13.5.1.1).
delete 연산자가 엄격 모드 코드 내에서 발생할 때 삭제할 프로퍼티가 속성 { [[Configurable]]: false } 를 갖거나 삭제할 수 없는 경우 TypeError 가 던져진다 (13.5.1.2).
Annex E (informative) ECMAScript 2015의 정정 및 명확화 (호환성 영향 가능)
9.1.1.4.14-9.1.1.4.17: 5 및 5.1판은 새로운 전역 선언에 해당하는 전역 객체 프로퍼티가 이미 존재하는지 판단하기 위해 프로퍼티 존재 테스트를 사용했다. ECMAScript 2015는 own 프로퍼티 존재 테스트를 사용한다. 이는 웹 브라우저에서 가장 일반적으로 구현된 방식과 일치한다.
10.4.2.1: 5판은 배열 인덱스 또는 새로운 길이 값의 정수 변환 이전에 현재 배열 길이 캡처로 이동했다. 그러나 변환 과정이 배열 길이를 변경하는 부작용을 가지면 캡처된 길이 값은 무효화될 수 있었다. ECMAScript 2015는 그러한 부작용 발생 가능성 이후에 현재 배열 길이를 캡처해야 함을 명시한다.
21.4.1.31: 이전 판은 0 시간 값 표현으로 +0𝔽 또는 -0𝔽 를 TimeClip 추상 연산이 반환하도록 허용했다. ECMAScript 2015는 항상 +0𝔽 를 반환하도록 명시한다. 이는 2015판에서는 Date 의 시간 값이 관찰 가능하게 -0𝔽 가 아니며 시간 값을 반환하는 메서드는 -0𝔽 를 반환하지 않음을 의미한다.
21.4.1.32: UTC 오프셋 표현이 없으면 로컬 시간대를 사용한다. 5.1판은 빠진 시간대를 "z" 로 해석해야 한다고 잘못 기술했다.
21.4.4.36: 연도가 Date Time String Format (21.4.1.32) 으로 표현될 수 없으면 RangeError 예외가 던져진다. 이전 판은 이 경우의 동작을 명시하지 않았다.
21.4.4.41: 이전 판은 시간 값이 NaN 일 때 Date.prototype.toString 이 반환하는 값을 명시하지 않았다. 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.match 및 String.prototype.replace 의 명세는 global 플래그가 설정된 RegExp 값 패턴 인수에 대해 잘못되었다. 이전 명세는 각 매칭 시도에서 lastIndex 가 변하지 않으면 1 증가해야 한다고 했다. 올바른 동작은 패턴이 빈 문자열과 일치한 경우에만 lastIndex 를 1 증가시키는 것이다.
23.1.3.30: 이전 판은 comparator 가 반환한 NaN 값이 Array.prototype.sort 에 의해 어떻게 해석되는지 명시하지 않았다. ECMAScript 2015는 그 값이 comparator 가 +0𝔽 를 반환한 것처럼 취급된다고 명시한다. 또한 2015판은 comparator 가 반환한 결과에 ToNumber 가 적용된다고 명시한다. 이전 판에서는 Number 값이 아닌 comparator 결과의 영향이 구현 정의였다. 실제로 구현은 ToNumber 를 호출한다.
9.3: ECMAScript 2018에서 템플릿 객체는 이전 판의 Realm 내 템플릿 리터럴 또는 태그된 템플릿 모든 출현 간이 아니라 Parse Node (소스 위치) 기반으로 정규화된다.
12.2: ECMAScript 2016에서 Unicode 8.0.0 이상이 요구된다(2015판은 Unicode 5.1 요구). 특히 U+180E MONGOLIAN VOWEL SEPARATOR 가 Space_Separator (Zs) 범주에서 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에서 Object Initializer 내 중복 프로퍼티 이름은 더 이상 초기 에러가 아니다.
13.15.1: ECMAScript 2015에서 FunctionExpression 의 함수 이름과 같은 불변 바인딩에 대한 대입을 포함한 엄격 모드 코드는 초기 에러를 발생시키지 않고 런타임 에러를 발생시킨다.
14.7: ECMAScript 2015 이전에는 초기화 식이 in 키워드 앞 VariableDeclaration 일부로 나타날 수 있었다. ECMAScript 2015에서 동일 위치의 ForBinding 은 그러한 초기화자의 출현을 허용하지 않는다. ECMAScript 2017에서 그러한 초기화자는 비엄격 코드에서만 허용.
14.7: ECMAScript 2015에서 IterationStatement 평가 결과는 결코 [[Value]] 가 empty 인 정상 완료가 아니다. Statement 부분이 평가되지 않았거나 최종 평가가 [[Value]]empty 인 정상 완료를 생성하면 결과 [[Value]] 는 undefined 인 정상 완료.
14.11.2: ECMAScript 2015에서 WithStatement 평가 결과는 결코 [[Value]] 가 empty 인 정상 완료가 아니다. Statement 부분 평가가 [[Value]]empty 인 정상 완료를 생성하면 결과 [[Value]] 는 undefined.
14.12.4: ECMAScript 2015에서 SwitchStatement 평가 결과는 결코 [[Value]] 가 empty 인 정상 완료가 아니다. CaseBlock 부분 평가가 [[Value]]empty 인 정상 완료를 생성하면 결과 [[Value]] 는 undefined.
14.15: ECMAScript 2015에서 Catch 절이 매개변수와 동일한 Identifier 에 대해 var 선언을 포함하면 초기 에러이다. 이전 판에서는 그러한 변수 선언이 둘러싼 변수 환경에서 인스턴스화되지만 선언의 Initializer 값이 Catch 매개변수에 할당되었다.
14.15, 19.2.1.3: ECMAScript 2015에서 Catch 절이 동일한 Identifier 를 바인딩하는 var 또는 FunctionDeclaration 을 포함하는 비엄격 direct eval 을 평가하면 런타임 SyntaxError 가 던져진다.
14.15.3: ECMAScript 2015에서 TryStatement 결과는 결코 empty 값이 아니다. Block 부분이 empty 를 포함하는 정상 완료로 평가되면 결과는 undefined. Block 부분이 throw 완료로 평가되고 Catch 부분이 empty 정상 완료를 평가하면 Finally 가 없거나 Finally 가 empty 정상 완료로 평가되는 경우 결과는 undefined.
15.4.5: ECMAScript 2015에서 ObjectLiteral 의 접근자 프로퍼티[[Get]] 또는 [[Set]] 속성 값으로 생성된 함수 객체는 생성자 함수가 아니며 "prototype" own 프로퍼티를 갖지 않는다. 이전 판에서는 생성자이며 "prototype" 프로퍼티가 있었다.
20.1.2.6: ECMAScript 2015에서 Object.freeze 인수가 객체가 아니면 자체 프로퍼티가 없는 비확장 ordinary 객체처럼 취급된다. 이전 판에서는 비객체 인수는 항상 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 인수가 객체가 아니면 자체 프로퍼티 없는 비확장 ordinary 객체처럼 취급. 이전 판에서는 TypeError.
20.1.2.17: ECMAScript 2015에서 Object.isFrozen 인수가 객체가 아니면 자체 프로퍼티 없는 비확장 ordinary 객체처럼 취급. 이전 판에서는 TypeError.
20.1.2.18: ECMAScript 2015에서 Object.isSealed 인수가 객체가 아니면 자체 프로퍼티 없는 비확장 ordinary 객체처럼 취급. 이전 판에서는 TypeError.
20.1.2.19: ECMAScript 2015에서 Object.keys 인수가 객체가 아니면 ToObject 강제를 시도. 성공 시 결과 사용. 이전 판에서는 TypeError.
20.1.2.20: ECMAScript 2015에서 Object.preventExtensions 인수가 객체가 아니면 자체 프로퍼티 없는 비확장 ordinary 객체처럼 취급. 이전 판에서는 TypeError.
20.1.2.22: ECMAScript 2015에서 Object.seal 인수가 객체가 아니면 자체 프로퍼티 없는 비확장 ordinary 객체처럼 취급. 이전 판에서는 TypeError.
20.2.3.2: ECMAScript 2015에서 바운드 함수의 [[Prototype]] 내부 슬롯은 대상 함수의 [[GetPrototypeOf]] 값으로 설정된다. 이전 판에서는 항상 %Function.prototype%.
20.2.4.1: ECMAScript 2015에서 함수 인스턴스의 "length" 프로퍼티는 설정 가능(configurable)하다. 이전 판에서는 불가능.
20.5.6.2: ECMAScript 2015에서 NativeError생성자의 [[Prototype]] 내부 슬롯은 Error 생성자이다. 이전 판에서는 Function prototype 객체.
21.4.4: ECMAScript 2015에서 Date 프로토타입 객체는 Date 인스턴스가 아니다. 이전 판에서는 TimeValue 가 NaN 인 Date 인스턴스였다.
22.1.3.12: ECMAScript 2015에서 String.prototype.localeCompare 는 Unicode 표준에 따라 정규 동등(canonical equivalence)한 문자열을 동일하게 취급해야 한다. 이전 판에서는 구현이 이를 무시하고 비트 단위 비교 사용 가능.
22.1.3.28 및 22.1.3.30: ECMAScript 2015에서 소문자/대문자 변환 처리는 코드 포인트에 작동한다. 이전 판에서는 개별 코드 유닛에만 적용. 영향받는 코드는 Deseret 블록.
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 인스턴스이고 flags 가 undefined 가 아니면 TypeError.
22.2.6: ECMAScript 2015에서 RegExp 프로토타입 객체는 RegExp 인스턴스가 아니다. 이전 판에서는 패턴이 빈 문자열인 RegExp 인스턴스였다.
이 명세는 GitHub 에서 Ecmarkup 라는 플레인텍스트 소스 포맷으로 작성된다. Ecmarkup 은 HTML 과 Markdown 방언으로, 플레인텍스트로 Ecma 명세를 작성하고 이를 본 문서의 편집 관례를 따르는 기능 완비 HTML 렌더링으로 처리하기 위한 프레임워크 및 도구 세트를 제공한다. Ecmarkup 은 구문 정의를 위한 Grammarkdown, 알고리즘 단계를 작성하기 위한 Ecmarkdown 등 여러 형식과 기술을 통합한다. 이 명세의 PDF 렌더링은 CSS Paged Media 명세를 활용하는 인쇄 스타일시트를 사용하여 생성되며 PrinceXML 을 사용해 변환된다.
이전 판은 Word 를 사용해 작성되었으며—이 판의 기반이 된 Ecmarkup 소스 텍스트는 ECMAScript 2015 Word 문서를 자동 변환 도구로 Ecmarkup 으로 변환하여 생성되었다.
This draft document may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this section are included on all such copies and derivative works. However, this document itself may not be modified in any way, including by removing the copyright notice or references to Ecma International, except as needed for the purpose of developing any document or deliverable produced by Ecma International.
This disclaimer is valid only prior to final version of this document. After approval all rights on the standard are reserved by Ecma International.
The limited permissions are granted through the standardization phase and will not be revoked by Ecma International or its successors or assigns during this time.
This document and the information contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Software License
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:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the authors nor Ecma International may be used to endorse or promote products derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.