4 개요

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

ECMAScript는 host environment 안에서 계산을 수행하고 computational object를 조작하기 위한 객체 지향 프로그래밍 언어입니다. 여기서 정의된 ECMAScript는 계산적으로 자급자족하도록 의도되지 않았습니다. 실제로 이 명세에는 외부 데이터 입력이나 계산 결과 출력에 대한 규정이 없습니다. 대신 ECMAScript 프로그램의 computational environment는 이 명세에 설명된 객체와 기타 기능뿐만 아니라, 이 명세의 범위를 벗어나는 설명과 동작을 갖는 특정 environment-specific object도 제공할 것으로 기대됩니다. 다만 그러한 객체가 ECMAScript 프로그램에서 접근할 수 있는 특정 속성과 호출할 수 있는 특정 함수를 제공할 수 있음을 나타내는 경우는 예외입니다.

ECMAScript는 원래 scripting language로 사용되도록 설계되었지만, 현재는 general-purpose programming language로 널리 사용됩니다. scripting language는 기존 시스템의 기능을 조작, 사용자화, 자동화하는 데 사용되는 프로그래밍 언어입니다. 그러한 시스템에서는 유용한 기능이 이미 user interface를 통해 제공되고, scripting language는 그 기능을 프로그램 제어에 노출하는 메커니즘입니다. 이런 방식으로 기존 시스템은 scripting language의 기능을 완성하는 객체와 기능의 host environment를 제공한다고 말합니다. scripting language는 전문 프로그래머와 비전문 프로그래머 모두가 사용하도록 의도됩니다.

ECMAScript는 원래 Web scripting language가 되도록 설계되어, 브라우저에서 Web page에 생동감을 부여하고 Web 기반 client-server architecture의 일부로 server computation을 수행하는 메커니즘을 제공했습니다. ECMAScript는 이제 다양한 host environment에 core scripting capability를 제공하는 데 사용됩니다. 따라서 core language는 특정 host environment와 분리되어 이 문서에 명시됩니다.

ECMAScript 사용은 단순 scripting을 넘어섰으며, 이제 많은 서로 다른 환경과 규모에서 프로그래밍 작업의 전체 범위에 사용됩니다. ECMAScript 사용이 확장됨에 따라, ECMAScript가 제공하는 기능과 시설도 확장되었습니다. ECMAScript는 이제 충분한 기능을 갖춘 general-purpose programming language입니다.

4.1 Web Scripting

웹 브라우저는 client-side computation을 위한 ECMAScript host environment를 제공합니다. 여기에는 예를 들어 windows, menus, pop-ups, dialog boxes, text areas, anchors, frames, history, cookies, 그리고 input/output을 나타내는 객체가 포함됩니다. 또한 host environment는 focus 변경, page와 image loading, unloading, error와 abort, selection, form submission, mouse action과 같은 이벤트에 scripting code를 붙이는 수단을 제공합니다. Scripting code는 HTML 안에 나타나며, 표시되는 page는 user interface element와 고정 및 계산된 text와 image의 조합입니다. Scripting code는 user interaction에 반응하며, main program은 필요하지 않습니다.

웹 서버는 requests, clients, files를 나타내는 객체와 데이터를 잠그고 공유하는 메커니즘을 포함하여 server-side computation을 위한 다른 host environment를 제공합니다. browser-side와 server-side scripting을 함께 사용하면, Web 기반 애플리케이션에 사용자화된 user interface를 제공하면서 client와 server 사이에 computation을 분산할 수 있습니다.

ECMAScript를 지원하는 각 Web browser와 server는 자신만의 host environment를 제공하여 ECMAScript execution environment를 완성합니다.

4.2 Hosts와 Implementations

ECMAScript를 host environment에 통합하는 데 도움을 주기 위해, 이 명세는 특정 기능(예: abstract operations)의 정의를 전체 또는 일부에 대해 이 명세 외부의 source로 위임합니다. 편집상, 이 명세는 다음과 같은 종류의 위임을 구분합니다.

implementation은 Annex D에 열거된 기능 또는 implementation-definedimplementation-approximated로 표시된 기능을 추가로 정의하는 외부 source입니다. 비공식 사용에서 implementation은 특정 웹 브라우저와 같은 concrete artefact를 가리킵니다.

implementation-defined facility는 추가 한정 없이 그 정의를 외부 source로 위임하는 것입니다. 이 명세는 특정 동작에 대해 어떤 권고도 하지 않으며, conforming implementation은 이 명세가 제시한 제약 내에서 어떤 동작이든 자유롭게 선택할 수 있습니다.

implementation-approximated facility는 그 정의를 외부 source로 위임하면서 이상적인 동작을 권고하는 것입니다. conforming implementation은 이 명세가 제시한 제약 내에서 어떤 동작이든 자유롭게 선택할 수 있지만, 그 이상에 가깝게 근사하려고 노력하도록 권장됩니다. Math.exp와 같은 일부 mathematical operation은 implementation-approximated입니다.

host는 Annex D에 나열된 기능을 추가로 정의하지만, 다른 implementation-defined 또는 implementation-approximated facility는 추가로 정의하지 않는 외부 source입니다. 비공식 사용에서 host는 Annex D를 통해 같은 방식으로 이 명세와 interface하는 모든 implementation의 집합, 예를 들어 모든 웹 브라우저의 집합을 가리킵니다. host는 WHATWG HTML(https://html.spec.whatwg.org/)과 같은 외부 명세인 경우가 많습니다. 달리 말하면, host-defined인 facility는 종종 외부 명세에서 추가로 정의됩니다.

host hook은 전체 또는 일부가 외부 source에 의해 정의되는 abstract operation입니다. 모든 host hook은 Annex D에 나열되어야 합니다. host hook은 적어도 다음 요구사항을 준수해야 합니다:

host-defined facility는 추가 한정 없이 그 정의를 외부 source로 위임하며 Annex D에 나열되는 것입니다. host가 아닌 implementation도 host-defined facility에 대한 정의를 제공할 수 있습니다.

host environment는 모든 host-defined facility에 대한 특정 정의 선택입니다. host environment는 보통 global objecthost-defined property로서 input을 얻고 output을 제공할 수 있게 하는 객체나 함수를 포함합니다.

이 명세는 항상 가장 구체적인 용어를 사용하는 편집 관례를 따릅니다. 예를 들어 어떤 facility가 host-defined이면, implementation-defined라고 지칭해서는 안 됩니다.

hosts와 implementations는 모두 여기에 정의된 language type, specification type, abstract operation, grammar production, intrinsic object, intrinsic symbol을 통해 이 명세와 interface할 수 있습니다.

4.3 ECMAScript 개요

다음은 ECMAScript에 대한 비공식 개요입니다. 언어의 모든 부분이 설명되는 것은 아닙니다. 이 개요는 표준 본문 자체의 일부가 아닙니다.

ECMAScript는 object-based입니다. 기본 언어와 host facility는 object에 의해 제공되며, ECMAScript 프로그램은 서로 통신하는 object의 cluster입니다. ECMAScript에서 object는 각각의 property가 어떻게 사용될 수 있는지를 결정하는 attributes를 가진, 0개 이상의 properties의 collection입니다. 예를 들어 property의 Writable attribute가 false로 설정되면, 실행되는 ECMAScript code가 그 property에 다른 값을 할당하려는 모든 시도는 실패합니다. Properties는 다른 object, primitive values, 또는 functions를 담는 container입니다. primitive value는 다음 built-in type 중 하나의 member입니다: Undefined, Null, Boolean, Number, BigInt, String, 그리고 Symbol; object는 built-in type Object의 member입니다; 그리고 function은 callable object입니다. property를 통해 object와 연결된 function을 method라고 합니다.

ECMAScript는 ECMAScript entity의 정의를 완성하는 built-in objects의 collection을 정의합니다. 이러한 built-in object에는 global object; Object, Function, Boolean, Symbol, 그리고 다양한 Error object를 포함하여 언어의 runtime semantics에 근본적인 object; Math, Number, Date를 포함하여 numeric value를 나타내고 조작하는 object; text processing object인 StringRegExp; Array와, element가 모두 특정 numeric data representation을 갖는 아홉 가지 다른 종류의 Typed Array를 포함하여 value의 indexed collection인 object; MapSet object를 포함하는 keyed collection; JSON object, ArrayBuffer, SharedArrayBuffer, DataView를 포함하여 structured data를 지원하는 object; generator function과 Promise object를 포함하여 control abstraction을 지원하는 object; 그리고 ProxyReflect를 포함하는 reflection object가 포함됩니다.

ECMAScript는 또한 built-in operators의 집합을 정의합니다. ECMAScript operator에는 다양한 unary operation, multiplicative operator, additive operator, bitwise shift operator, relational operator, equality operator, binary bitwise operator, binary logical operator, assignment operator, 그리고 comma operator가 포함됩니다.

대규모 ECMAScript 프로그램은 modules에 의해 지원되며, module은 프로그램을 statements와 declarations의 여러 sequence로 나눌 수 있게 합니다. 각 module은 자신이 사용하며 다른 module이 제공해야 하는 declaration과, 다른 module이 사용할 수 있는 자신의 declaration을 명시적으로 식별합니다.

ECMAScript 구문은 의도적으로 Java 구문과 유사합니다. ECMAScript 구문은 사용하기 쉬운 scripting language로 기능할 수 있도록 완화되어 있습니다. 예를 들어 variable은 type을 선언할 필요가 없고, type은 property와 연결되어 있지 않으며, 정의된 function은 호출보다 텍스트상 앞에 declaration이 나타날 필요가 없습니다.

4.3.1 Objects

ECMAScript에는 class definition을 위한 구문이 포함되어 있지만, ECMAScript object는 C++, Smalltalk, Java의 object처럼 근본적으로 class-based가 아닙니다. 대신 object는 literal notation을 통해서나, object를 만들고 그 property에 initial value를 할당하여 그 전부 또는 일부를 초기화하는 code를 실행하는 constructors를 통해서 등 다양한 방식으로 생성될 수 있습니다. 각 constructor"prototype"이라는 이름의 property를 가진 function이며, 이 property는 prototype-based inheritanceshared properties를 구현하는 데 사용됩니다. Object는 new expression에서 constructor를 사용하여 생성됩니다. 예를 들어 new Date(2009, 11)은 새 Date object를 생성합니다. new를 사용하지 않고 constructor를 호출하는 것은 constructor에 따라 다른 결과를 가집니다. 예를 들어 Date()는 object가 아니라 현재 date와 time의 string representation을 생성합니다.

constructor에 의해 생성된 모든 object는 자신의 constructor"prototype" property 값에 대한 암시적 reference(object의 prototype이라고 함)를 가집니다. 또한 prototype은 자신의 prototype에 대한 non-null 암시적 reference를 가질 수 있으며, 이런 식으로 이어질 수 있습니다. 이를 prototype chain이라고 합니다. object의 property를 참조할 때, 그 reference는 해당 이름의 property를 포함하는 prototype chain의 첫 번째 object 안의 그 이름 property를 가리킵니다. 달리 말하면, 먼저 직접 언급된 object가 그러한 property를 갖는지 검사됩니다. 그 object가 named property를 포함하면, 그것이 reference가 가리키는 property입니다. 그 object가 named property를 포함하지 않으면, 그 object의 prototype이 다음으로 검사됩니다. 그리고 이런 식으로 계속됩니다.

Figure 1: Object/Prototype Relationships
An image of lots of boxes and arrows.

class-based object-oriented language에서는 일반적으로 state는 instance가 보유하고, method는 class가 보유하며, inheritance는 structure와 behaviour에 대해서만 이루어집니다. ECMAScript에서는 state와 method가 object에 의해 보유되는 반면, structure, behaviour, state가 모두 inherited됩니다.

prototype이 포함하는 특정 property를 직접 포함하지 않는 모든 object는 그 property와 그 값을 공유합니다. Figure 1은 이를 보여줍니다:

CFconstructor이며 object이기도 합니다. new expression을 사용하여 다섯 개의 object가 생성되었습니다: cf1, cf2, cf3, cf4, 그리고 cf5. 이 object들은 각각 "q1""q2"라는 이름의 property를 포함합니다. 점선은 암시적 prototype 관계를 나타냅니다. 따라서 예를 들어 cf3의 prototype은 CFp입니다. constructorCF는 그 자체로 "P1""P2"라는 두 property를 가지며, 이들은 CFp, cf1, cf2, cf3, cf4, 또는 cf5에는 보이지 않습니다. CFp"CFP1"이라는 이름의 property는 cf1, cf2, cf3, cf4, 그리고 cf5가 공유합니다(CF와는 공유하지 않음). CFp의 암시적 prototype chain에서 발견되는 property 중 "q1", "q2", 또는 "CFP1"이라는 이름이 아닌 모든 property도 마찬가지입니다. CFCFp 사이에는 암시적 prototype link가 없다는 점에 유의하십시오.

대부분의 class-based object language와 달리, property는 값 할당을 통해 object에 동적으로 추가될 수 있습니다. 즉 constructor는 constructed object의 property 전부 또는 일부의 이름을 정하거나 값을 할당할 필요가 없습니다. 위 그림에서 CFp의 property에 새 값을 할당함으로써 cf1, cf2, cf3, cf4, 그리고 cf5를 위한 새로운 shared property를 추가할 수 있습니다.

ECMAScript object가 본질적으로 class-based는 아니지만, constructor function, prototype object, method의 공통 pattern에 기반하여 class-like abstraction을 정의하는 것이 편리한 경우가 많습니다. ECMAScript built-in object 자체도 그러한 class-like pattern을 따릅니다. ECMAScript 2015부터 ECMAScript language에는 built-in object가 사용하는 동일한 class-like abstraction pattern을 따르는 object를 프로그래머가 간결하게 정의할 수 있게 하는 syntactic class definition이 포함됩니다.

4.3.2 ECMAScript의 Strict Variant

ECMAScript 언어는 언어에서 사용할 수 있는 일부 기능의 사용을 제한하고자 하는 사용자가 있을 수 있음을 인정합니다. 그들은 security를 위해, 오류가 발생하기 쉽다고 여기는 기능을 피하기 위해, 향상된 error checking을 얻기 위해, 또는 자신이 선택한 다른 이유로 그렇게 할 수 있습니다. 이 가능성을 지원하기 위해 ECMAScript는 언어의 strict variant를 정의합니다. 언어의 strict variant는 일반 ECMAScript 언어의 특정 syntactic 및 semantic feature를 제외하고, 일부 기능의 자세한 semantics를 수정합니다. strict variant는 또한 언어의 non-strict form에서 오류로 명시되지 않은 상황에서 error exception을 throw하여 보고해야 하는 추가 error condition을 명시합니다.

ECMAScript의 strict variant는 일반적으로 언어의 strict mode라고 불립니다. strict mode 선택과 ECMAScript의 strict mode syntax 및 semantics 사용은 11.2.2에 설명된 대로 개별 ECMAScript source text unit 수준에서 명시적으로 이루어집니다. strict mode는 syntactic source text unit 수준에서 선택되므로, strict mode는 그러한 source text unit 안에서 local effect를 갖는 제한만 부과합니다. strict mode는 여러 source text unit에 걸쳐 일관되게 동작해야 하는 ECMAScript semantics의 어떤 측면도 제한하거나 수정하지 않습니다. 완전한 ECMAScript 프로그램은 strict mode와 non-strict mode ECMAScript source text unit 둘 다로 구성될 수 있습니다. 이 경우 strict mode는 strict mode source text unit 안에 정의된 code를 실제로 실행할 때만 적용됩니다.

이 명세에 부합하기 위해, ECMAScript implementation은 이 명세에서 정의한 full unrestricted ECMAScript language와 ECMAScript language의 strict variant를 모두 구현해야 합니다. 또한 implementation은 unrestricted와 strict mode source text unit을 하나의 composite program으로 결합하는 것을 지원해야 합니다.

4.4 용어와 정의

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

4.4.1 implementation-approximated

implementation-approximated facility는 전체 또는 일부가 외부 source에 의해 정의되지만, 이 명세에서 권장되는 이상적인 behaviour를 가집니다

4.4.2 implementation-defined

implementation-defined facility는 전체 또는 일부가 이 명세 외부의 source에 의해 정의됩니다

4.4.3 host-defined

implementation-defined와 동일합니다

Note

편집상, 절 4.2를 참조하십시오.

4.4.4 type

6에 정의된 data value의 집합

4.4.5 primitive value

6에 정의된 Undefined, Null, Boolean, Number, BigInt, Symbol, 또는 String type 중 하나의 member

Note

primitive value는 language implementation의 가장 낮은 수준에서 직접 표현되는 datum입니다.

4.4.6 object

Object type의 member

Note

object는 property의 collection이며 하나의 prototype object를 가집니다. prototype은 null일 수 있습니다.

4.4.7 constructor

object를 생성하고 초기화하는 function object

Note

constructor"prototype" property 값은 inheritance와 shared property를 구현하는 데 사용되는 prototype object입니다.

4.4.8 prototype

다른 object에 shared property를 제공하는 object

Note

constructor가 object를 생성할 때, 그 object는 property reference를 resolve하기 위해 constructor"prototype" property를 암시적으로 참조합니다. constructor"prototype" property는 프로그램 expression constructor.prototype으로 참조될 수 있으며, object의 prototype에 추가된 property는 inheritance를 통해 그 prototype을 공유하는 모든 object가 공유합니다. 또는 Object.create built-in function을 사용하여 명시적으로 지정된 prototype을 가진 새 object를 생성할 수 있습니다.

4.4.9 ordinary object

모든 object가 지원해야 하는 essential internal method에 대한 default behaviour를 가진 object

4.4.10 exotic object

하나 이상의 essential internal method에 대해 default behaviour를 갖지 않는 object

Note

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

4.4.11 standard object

semantics가 이 명세에 의해 정의되는 object

4.4.12 built-in object

ECMAScript implementation에 의해 명시되고 제공되는 object

Note

standard built-in object는 이 명세에서 정의됩니다. ECMAScript implementation은 추가 종류의 built-in object를 명시하고 제공할 수 있습니다.

4.4.13 undefined value

variable에 값이 할당되지 않았을 때 사용되는 primitive value

4.4.14 Undefined type

sole value가 undefined value인 type

4.4.15 null value

어떤 object value의 의도적인 부재를 나타내는 primitive value

4.4.16 Null type

sole value가 null value인 type

4.4.17 Boolean value

Boolean type의 member

Note

Boolean value는 truefalse 두 개뿐입니다.

4.4.18 Boolean type

primitive value truefalse로 구성된 type

4.4.19 Boolean object

standard built-in Boolean constructor의 instance인 Object type의 member

Note

Boolean object는 Boolean constructornew expression에서 사용하고 Boolean value를 argument로 제공하여 생성됩니다. 결과 object는 그 값이 Boolean value인 internal slot을 가집니다. Boolean object는 Boolean value로 coerced될 수 있습니다.

4.4.20 String value

0개 이상의 16-bit unsigned integer value의 finite ordered sequence인 primitive value

Note

String value는 String type의 member입니다. sequence 안의 각 integer value는 보통 UTF-16 text의 단일 16-bit unit을 나타냅니다. 그러나 ECMAScript는 값이 16-bit unsigned integer여야 한다는 것 외에는 그 값에 어떤 제한이나 요구사항도 두지 않습니다.

4.4.21 String type

가능한 모든 String value의 집합

4.4.22 String object

standard built-in String constructor의 instance인 Object type의 member

Note

String object는 String constructornew expression에서 사용하고 String value를 argument로 제공하여 생성됩니다. 결과 object는 그 값이 String value인 internal slot을 가집니다. String object는 String constructor를 function으로 호출함으로써 String value로 coerced될 수 있습니다(22.1.1.1).

4.4.23 Number value

double-precision 64-bit binary format IEEE 754-2019 value에 대응하는 primitive value

Note

Number value는 Number type의 member이며 number의 direct representation입니다.

4.4.24 Number type

NaN(“not a number”), +∞𝔽(positive infinity), 그리고 -∞𝔽(negative infinity)를 포함하는 가능한 모든 Number value의 집합

4.4.25 Number object

standard built-in Number constructor의 instance인 Object type의 member

Note

Number object는 Number constructornew expression에서 사용하고 Number value를 argument로 제공하여 생성됩니다. 결과 object는 그 값이 Number value인 internal slot을 가집니다. Number object는 Number constructor를 function으로 호출함으로써 Number value로 coerced될 수 있습니다(21.1.1.1).

4.4.26 Infinity

positive infinite Number value인 Number value

4.4.27 NaN

IEEE 754-2019 NaN(“not a number”) value인 Number value

4.4.28 BigInt value

arbitrary-precision integer value에 대응하는 primitive value

4.4.29 BigInt type

가능한 모든 BigInt value의 집합

4.4.30 BigInt object

standard built-in BigInt constructor의 instance인 Object type의 member

4.4.31 Symbol value

unique하고 non-String인 Object property key를 나타내는 primitive value

4.4.32 Symbol type

가능한 모든 Symbol value의 집합

4.4.33 Symbol object

standard built-in Symbol constructor의 instance인 Object type의 member

4.4.34 function

subroutine으로 invoked될 수 있는 Object type의 member

Note

function은 자신의 property 외에도 invoked될 때 어떻게 동작하는지를 결정하는 executable code와 state를 포함합니다. function의 code는 ECMAScript로 작성될 수도 있고 아닐 수도 있습니다.

4.4.35 built-in function

function인 built-in object

Note

built-in function의 예에는 parseIntMath.exp가 포함됩니다. host 또는 implementation은 이 명세에 설명되지 않은 추가 built-in function을 제공할 수 있습니다.

4.4.36 built-in constructor

constructor인 built-in function

Note

built-in constructor의 예에는 ObjectFunction이 포함됩니다. host 또는 implementation은 이 명세에 설명되지 않은 추가 built-in constructor를 제공할 수 있습니다.

4.4.37 property

key(String value 또는 Symbol value)와 value를 연결하는 object의 일부

Note

property의 형식에 따라 value는 data value(primitive value, object, 또는 function object)로 직접 표현되거나 accessor function의 pair로 간접적으로 표현될 수 있습니다.

4.4.38 method

property의 value인 function

Note

function이 object의 method로 호출될 때, object는 그 function에 this value로 전달됩니다.

4.4.39 built-in method

built-in function인 method

Note

standard built-in method는 이 명세에서 정의됩니다. host 또는 implementation은 이 명세에 설명되지 않은 추가 built-in method를 제공할 수 있습니다.

4.4.40 attribute

property의 어떤 characteristic을 정의하는 internal value

4.4.41 own property

그 object에 직접 포함된 property

4.4.42 inherited property

own property는 아니지만 object의 prototype의 property(own 또는 inherited)인 object의 property

4.5 이 명세의 구성

이 명세의 나머지는 다음과 같이 구성됩니다:

Clause 5는 명세 전체에서 사용되는 notational convention을 정의합니다.

Clauses 6 through 10는 ECMAScript 프로그램이 동작하는 execution environment를 정의합니다.

Clauses 11 through 17는 syntactic encoding과 모든 language feature의 execution semantics를 포함하여 실제 ECMAScript programming language를 정의합니다.

Clauses 18 through 28는 ECMAScript standard library를 정의합니다. 여기에는 ECMAScript 프로그램이 실행될 때 사용할 수 있는 모든 standard object의 정의가 포함됩니다.

Clause 29는 SharedArrayBuffer-backed memory에 대한 access와 Atomics object의 method의 memory consistency model을 설명합니다.