new 연산자super 키워드? : ), )if 문do-while 문while 문for 문for-in, for-of, for-await-of 문continue 문break 문return 문with 문switch 문throw 문try 문debugger 문?um/p1-90`이 절은 ECMAScript 언어에 대한 비규범적 개요를 담고 있다.
ECMAScript는
ECMAScript는 원래 스크립트 언어로 사용되도록 설계되었으나, 현재는 범용 프로그래밍 언어로 널리 사용되고 있다. 스크립트 언어는 기존 시스템의 기능을 조작, 맞춤화, 자동화하는 데 사용되는 프로그래밍 언어이다. 이러한 시스템에서는 유용한 기능이 이미 사용자 인터페이스를 통해 제공되며, 스크립트 언어는 그러한 기능을 프로그램 제어에 노출하는 메커니즘이다. 이런 방식으로 기존 시스템은 객체와 기능으로 이루어진
ECMAScript는 원래 웹 스크립트 언어로 설계되었으며, 브라우저에서 웹 페이지를 동적으로 만들고 웹 기반 클라이언트-서버 아키텍처의 일부로 서버 계산을 수행하는 메커니즘을 제공했다. 현재 ECMAScript는 다양한
ECMAScript의 사용은 단순한 스크립팅을 넘어섰으며, 이제는 매우 다양한 환경과 규모에서 프로그래밍 작업의 전 범위에 사용된다. ECMAScript의 사용이 확장됨에 따라 그것이 제공하는 기능과 설비도 함께 확장되었다. 이제 ECMAScript는 완전한 기능을 갖춘 범용 프로그래밍 언어이다.
웹 브라우저는 클라이언트 측 계산을 위한 ECMAScript
웹 서버는 요청, 클라이언트, 파일을 나타내는 객체와 데이터를 잠그고 공유하는 메커니즘을 포함하는, 서버 측 계산을 위한 다른
ECMAScript를 지원하는 각 웹 브라우저와 서버는 자체
ECMAScript를
구현은 부속서
구현 정의(implementation-defined) 기능은 추가적인 한정 없이 그 정의를 외부 출처에 위임하는 기능이다. 이 명세서는 특정 동작에 대해 어떤 권고도 하지 않으며, 적합한 구현은 이 명세서가 제시한 제약 내에서 자유롭게 어떤 동작이든 선택할 수 있다.
구현 근사(implementation-approximated) 기능은 이상적인 동작을 권고하면서도 그 정의를 외부 출처에 위임하는 기능이다. 적합한 구현은 이 명세서가 제시한 제약 내에서 자유롭게 어떤 동작이든 선택할 수 있지만, 이상적인 동작에 근사하도록 노력하는 것이 권장된다. Math.exp
호스트는 부속서
호스트 훅은 외부 출처에 의해 전부 또는 일부가 정의되는
호스트 정의(host-defined) 기능은 추가적인 한정 없이 그 정의를 외부 출처에 위임하며, 부속서
호스트 환경은 모든
이 명세서는 항상 가장 구체적인 용어를 사용하는 편집 관례를 따른다. 예를 들어 어떤 기능이
다음은 ECMAScript에 대한 비공식 개요이며, 언어의 모든 부분이 설명되는 것은 아니다. 이 개요는 표준 본문 자체의 일부가 아니다.
ECMAScript는 객체 기반이다. 기본 언어 기능과
ECMAScript는 ECMAScript 엔티티의 정의를 완성하는 내장 객체의 집합을 정의한다. 이러한 내장 객체에는 Object, Function, Boolean, Symbol, 여러 Error 객체를 포함한 언어의 Math, Number, Date를 포함한 숫자 값을 표현하고 조작하는 객체, 텍스트 처리 객체인 String과 RegExp, Array와 각 요소가 특정 숫자 데이터 표현을 갖는 아홉 가지 서로 다른 Typed Array를 포함한 값의 인덱스 컬렉션 객체, Map과 Set 객체를 포함한 키 기반 컬렉션, JSON 객체, ArrayBuffer, SharedArrayBuffer, DataView를 포함한 구조화된 데이터를 지원하는 객체, 제너레이터 함수와 Promise 객체를 포함한 제어 추상화를 지원하는 객체, 그리고 Proxy와 Reflect를 포함한 리플렉션 객체가 포함된다.
ECMAScript는 또한 내장 연산자의 집합도 정의한다. ECMAScript 연산자에는 다양한 단항 연산, 곱셈 연산자, 덧셈 연산자, 비트 시프트 연산자, 관계 연산자, 동등 연산자, 이항 비트 연산자, 이항 논리 연산자, 할당 연산자, 그리고 쉼표 연산자가 포함된다.
대규모 ECMAScript 프로그램은 프로그램을 여러 개의 문장 및 선언 시퀀스로 분할할 수 있게 하는 모듈에 의해 지원된다. 각 모듈은 다른 모듈이 제공해야 하는 자신이 사용하는 선언과, 다른 모듈이 사용할 수 있도록 제공되는 자신의 선언을 명시적으로 식별한다.
ECMAScript 문법은 의도적으로 Java 문법과 유사하다. ECMAScript 문법은 사용하기 쉬운 스크립트 언어 역할을 할 수 있도록 완화되어 있다. 예를 들어 변수는 그 타입을 선언할 필요가 없고, 타입은 프로퍼티와 연관되지 않으며, 정의된 함수는 그 선언이 해당 함수 호출보다 텍스트상 앞에 나타날 필요가 없다.
ECMAScript는 클래스 정의를 위한 문법을 포함하지만, ECMAScript 객체는 C++, Smalltalk, Java와 같은 언어들처럼 본질적으로 클래스 기반이 아니다. 대신 객체는 리터럴 표기법이나, 객체를 생성한 다음 그 프로퍼티에 초기값을 할당하여 객체의 전체 또는 일부를 초기화하는 코드를 실행하는 생성자를 포함한 다양한 방식으로 생성될 수 있다. 각 생성자는 new Date(2009, 11)은 새로운 Date 객체를 생성한다. new를 사용하지 않고 생성자를 호출하면, 그 결과는 생성자에 따라 달라진다. 예를 들어 Date()는 객체가 아니라 현재 날짜와 시간을 나타내는 문자열 표현을 생성한다.
생성자에 의해 생성된 모든 객체는 그 생성자의
클래스 기반 객체지향 언어에서는 일반적으로 상태는 인스턴스가 가지며, 메서드는 클래스가 가지며, 상속은 구조와 동작에 대해서만 이루어진다. ECMAScript에서는 상태와 메서드를 객체가 가지며, 구조, 동작, 상태가 모두 상속된다.
자신의 프로토타입이 가진 특정 프로퍼티를 직접 포함하지 않는 모든 객체는 그 프로퍼티와 그 값을 공
CF는 생성자(이자 객체)이 다. new 표현식을 사용하여 다섯 개의 객체가 생성되었다: cf1, cf2, cf3, cf4, 그리고 cf5. 이들 각각의 객체는
대부분의 클래스 기반 객체 언어와 달리, 프로퍼티는 값 할당을 통해 객체에 동적으로 추가될 수 있다. 즉, 생성자는 생성된 객체의 프로퍼티 전부 또는 일부에 이름을 붙이거나 값을 할당할 필요가 없다. 위 그림에서는 CFp의 프로퍼티에 새 값을 할당함으로써 cf1, cf2, cf3, cf4, 그리고 cf5를 위한 새로운 공유 프로퍼티를 추가할 수 있다.
ECMAScript 객체는 본질적으로 클래스 기반이 아니지만, 생성자 함수, 프로토타입 객체, 메서드의 공통 패턴에 기초한 클래스 유사 추상을 정의하는 것이 종종 편리하다. ECMAScript 내장 객체 자체도 그러한 클래스 유사 패턴을 따른다. ECMAScript 2015부터 ECMAScript 언어는 프로그래머가 내장 객체에서 사용되는 것과 동일한 클래스 유사 추상 패턴을 따르는 객체를 간결하게 정의할 수 있도록 하는 구문적 클래스 정의를 포함한다.
ECMAScript 언어는 일부 사용자가 언어에서 사용 가능한 몇몇 기능의 사용을 제한하고 싶어 할 수 있다는 가능성을 인정한다. 그들은 보안상의 이유, 오류를 유발하기 쉽다고 여기는 기능을 피하기 위해, 더 강화된 오류 검사를 얻기 위해, 또는 그 밖에 스스로 선택한 다른 이유로 그렇게 할 수 있다. 이러한 가능성을 지원하기 위해 ECMAScript는 언어의 엄격 변형을 정의한다. 언어의 엄격 변형은 일반 ECMAScript 언어의 특정 구문 및 의미 기능 일부를 제외하고, 일부 기능의 상세 의미론을 수정한다. 또한 엄격 변형은 비엄격 형태의 언어에서는 오류로 명세되지 않은 상황에서 오류 예외를 던짐으로써 반드시 보고되어야 하는 추가 오류 조건을 명세한다.
ECMAScript의 엄격 변형은 일반적으로 언어의 엄격 모드라고 불린다. ECMAScript의 엄격 모드 선택과 엄격 모드 구문 및 의미론의 사용은
이 명세서에 부합하려면, ECMAScript 구현은 이 명세서가 정의한 완전한 비제한 ECMAScript 언어와 ECMAScript 언어의 엄격 변형을 모두 구현해야 한다. 또한 구현은 비제한 및 엄격 모드 소스 텍스트 단위를 하나의 복합 프로그램으로 결합하는 것을 지원해야 한다.
이 문서의 목적상, 다음 용어와 정의를 적용한다.
implementation-defined와 동일
편집상으로는 절
절
절
원시 값은 언어 구현의 최하위 수준에서 직접 표현되는 데이터이다.
객체는 프로퍼티들의 집합이며 단 하나의 프로토타입 객체를 가진다. 프로토타입은
객체를 생성하고 초기화하는 함수 객체
생성자의
다른 객체에 공유 프로퍼티를 제공하는 객체
생성자가 객체를 생성할 때, 그 객체는 프로퍼티 참조를 해석하기 위해 생성자의 constructor.prototype으로 참조할 수 있으며, 객체의 프로토타입에 추가된 프로퍼티는 상속을 통해 그 프로토타입을 공유하는 모든 객체에 공유된다. 또는 Object.create 내장 함수를 사용하여 명시적으로 지정된 프로토타입을 가진 새 객체를 생성할 수도 있다.
모든 객체가 지원해야 하는 필수 내부 메서드에 대해 기본 동작을 가지는 객체
하나 이상의 필수 내부 메서드에 대해 기본 동작을 가지지 않는 객체
보통 객체가 아닌 모든 객체는 이색 객체이다.
그 의미론이 이 명세서에 의해 정의되는 객체
ECMAScript 구현에 의해 명세되고 제공되는 객체
표준 내장 객체는 이 명세서에서 정의된다. ECMAScript 구현은 추가적인 종류의 내장 객체를 명세하고 제공할 수 있다.
변수에 값이 할당되지 않았을 때 사용되는 원시 값
유일한 값이
어떠한 객체 값도 의도적으로 없음을 나타내는 원시 값
유일한 값이
Boolean 값은
원시 값
표준 내장 Boolean 생성자의 인스턴스인
Boolean 객체는 new 표현식에서 Boolean 생성자를 사용하고, 인수로 Boolean 값을 제공하여 생성된다. 생성된 객체는 그 값이 Boolean 값인 내부 슬롯을 가진다. Boolean 객체는 Boolean 값으로 강제 변환될 수 있다.
0개 이상의 16비트 부호 없는
가능한 모든 String 값의 집합
표준 내장 String 생성자의 인스턴스인
String 객체는 new 표현식에서 String 생성자를 사용하고, 인수로 String 값을 제공하여 생성된다. 생성된 객체는 그 값이 String 값인 내부 슬롯을 가진다. String 객체는 String 생성자를 함수로 호출하여(
Number 값은
표준 내장 Number 생성자의 인스턴스인
Number 객체는 new 표현식에서 Number 생성자를 사용하고, 인수로 Number 값을 제공하여 생성된다. 생성된 객체는 그 값이 Number 값인 내부 슬롯을 가진다. Number 객체는 Number 생성자를 함수로 호출하여(
양의 무한 Number 값인 Number 값
임의 정밀도
가능한 모든 BigInt 값의 집합
표준 내장 BigInt 생성자의 인스턴스인
고
가능한 모든 Symbol 값의 집합
표준 내장 Symbol 생성자의 인스턴스인
서브루틴으로 호출될 수 있는
함수는 자신의 프로퍼티 외에도, 호출될 때 어떻게 동작하는지를 결정하는 실행 가능한 코드와 상태를 포함한다. 함수의 코드는 ECMAScript로 작성될 수도 있고 아닐 수도 있다.
함수인 내장 객체
내장 함수의 예로는 parseInt와 Math.exp가 있다.
생성자인 내장 함수
내장 생성자의 예로는 Object와 Function이 있다.
키(String 값 또는 Symbol 값)와 값을 연관시키는 객체의 일부
프로퍼티의 형태에 따라 그 값은 데이터 값(원시 값, 객체, 또는 함수 객체)으로 직접 표현될 수도 있고, 접근자 함수 쌍을 통해 간접적으로 표현될 수도 있다.
프로퍼티의 값인 함수
함수가 객체의 메서드로 호출될 때, 그 객체는 함수의
내장 함수인 메서드
표준 내장 메서드는 이 명세서에서 정의된다.
프로퍼티의 어떤 특성을 정의하는 내부 값
자신의 객체에 직접 포함된 프로퍼티
자기 자신의 프로퍼티는 아니지만, 객체의 프로토타입의 프로퍼티(자기 자신의 것이든 상속된 것이든)인 객체의 프로퍼티
이 명세서의 나머지 부분은 다음과 같이 구성된다.
절
절
절
절
절