Symbol

현재 번역은 완벽하지 않습니다. 한국어로 문서 번역에 동참해주세요.

This is a new technology, part of the ECMAScript 2015 (ES6) standard.
This technology's specification has been finalized, but check the compatibility table for usage and implementation status in various browsers.

심볼(symbol) 은 고유하고 수정 불가능한 데이터 타입이며 주로 객체 속성(object property)들의 식별자로 사용된다. 심볼 객체(symbol object) 는 심볼 기본형 변수(primitive data type) 의 암묵적(implicit) 객체 래퍼(wrapper)이다.

문법

Symbol([description])

파라미터

description Optional
Optional, 문자열(string). 디버깅을 위해 사용할 수 있는 심볼의 description. 심볼에 접근하는 용도로는 사용할 수 없음.

설명

새 심볼을 생성하기 위해서는, 간단히 Symbol() 을 description 을 위한 optional 문자열과 함께 작성하면 된다.

var sym1 = Symbol();
var sym2 = Symbol("foo");
var sym3 = Symbol("foo");

위의 코드는 세 개의 새 심볼을 생성한다. Symbol("foo") 은 문자열 "foo"를 심볼로 강제 형변환(coerce)하지 않는다는 것을 유의하라. 이것은 매번 새 심볼을 생성한다:

Symbol("foo") === Symbol("foo"); // false

아래 new 연산자를 이용한 문법은 TypeError 를 발생시킬 것이다:

var sym = new Symbol(); // TypeError

이것은 작성자가 새 심볼 값 대신 명시적인 심볼 래퍼 객체를 생성하는 것을 방지한다. 기본형 변수에 대해 명시적 래퍼 객체를 만드는 것은 ECMAScript 6 부터 더 이상 지원되지 않는다. 하지만, new Boolean, new String 그리고 new Number 와 같이 이미 존재하고 있는 기본형 래퍼 객체는 래거시(lagacy) 요인으로 인해 아직 생성가능하다.

그래도 만약 심볼 래퍼 객체를 생성하고 싶다면, Object() 함수(function)를 이용할 수 있다.

var sym = Symbol("foo");
typeof sym;     // "symbol" 
var symObj = Object(sym);
typeof symObj;  // "object"

전역 심볼 레지스트리 내 공유된 심볼

Symbol()을 사용하는 위의 문법은 전체 코드베이스(codebase)에서 사용할 수 있는 전역(global) 심볼을 생성하지는 않는다. 모든 파일(file)들과 램(realm, 각각이 자체의 전역 스코프(scope)를 가지고 있는)에서도 사용할 수 있는 심볼들을 생성하기 위해서는, Symbol.for()Symbol.keyFor() 메소드(method)를 이용해 전역 심볼 레지스트리(registry) 에 심볼들을 설정하고 가져와야한다.

객체에서 심볼 속성 찾기

Object.getOwnPropertySymbols() 메소드는 심볼들의 배열을 반환하고 해당 객체의 심볼 속성들을 찾을 수 있게 해준다. 모든 객체들은 심볼 속성 없이 초기화되기 때문에, 심볼 속성을 객체에 설정하기 전까지 이 배열은 비어있을 것이다.

속성

Symbol.length
길이(Length) 속성이며 값은 0.
Symbol.prototype
심볼 생성자(constructor)의 프로토타입(prototype)을 나타냄.

잘 알려진 심볼들

당신이 만든 심볼들에 더해, Javascript는 내부 언어 동작을 나타내는 몇몇 내장된 심볼들을 가지고 있으며, 이는 ECMAScript 5와 그 이전의 개발자들에게는 드러나지 않았던 것이다. 이 심볼들은 아래 속성들을 통해 접근할 수 있다.

반복 심볼

Symbol.iterator
객체의 기본 반복자(iterator)를 반환하는 메소드. for...of에서 사용됨.

정규표현식 심볼

Symbol.match
문자열과 매치(match)되는 메소드, 또한 객체가 정규식으로서 사용되는지 확인하는데도 사용. String.prototype.match()에서 사용됨.
Symbol.replace
문자열 중 매치되는 일부 문자열을 대체하는 메소드. String.prototype.replace()에서 사용됨.
Symbol.search
정규식과 매치되는 문자열의 인덱스(index)를 반환하는 메소드. String.prototype.search()에서 사용됨.
Symbol.split
문자열을 정규식과 매치되는 인덱스들에서 나누는 메소드. String.prototype.split()에서 사용됨.

그 외 심볼들

Symbol.hasInstance
생성자 객체가 어떤 객체를 자신의 인스턴스(instance)로 인식하는지 확인하는데 사용하는 메소드. instanceof에서 사용됨.
Symbol.isConcatSpreadable
어떤 객체가 자신의 배열 원소들로 단순화(flatten)되어야 하는지 나타내는 불리언(Boolean) 값(불명확). Array.prototype.concat()에서 사용됨.
Symbol.unscopables
속성 값들을 나타내는 문자열 배열 값. These are excluded from the with environment bindings of the associated objects.
Symbol.species
파생(derived) 객체를 생성하는데 사용되는 생성자 함수.
Symbol.toPrimitive
객체를 기본형 값으로 변환하는 메소드.
Symbol.toStringTag
객체의 기본 설명(description)에 사용되는 문자열 값. Object.prototype.toString()에서 사용됨.

메소드

Symbol.for(key)
입력받은 키를 통해 현재 존재하는 심볼을 검색하고 찾으면 반환한다. 만약 존재하지 않으면 전역 심볼 레지스트리에 입력받은 키로 새 심볼을 생성한다.
Symbol.keyFor(sym)
입력받은 심볼을 통해 전역 심볼 레지스트리에서 공유된 심볼키(symbol key)를 가져온다.

심볼 프로토타입

모든 심볼은 Symbol.prototype로부터 상속받는다.

속성

Symbol.prototype.constructor
Returns the function that created an instance's prototype. This is the Symbol function by default.

메소드

Symbol.prototype.toSource()
Returns a string containing the source of the Symbol object. Overrides the Object.prototype.toSource() method.
Symbol.prototype.toString()
Returns a string of containing the description of the Symbol. Overrides the Object.prototype.toString() method.
Symbol.prototype.valueOf()
Returns the primitive value of the Symbol object. Overrides the Object.prototype.valueOf() method.
Symbol.prototype[@@toPrimitive]
Returns the primitive value of the Symbol object.

예제

심볼에 typeof 연산자 사용

심볼임을 확인하는데 typeof 연산자가 사용될 수 있다.

typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'

심볼 형식 변환

심볼을 타입 변환할 때 유의해야 할 사항들.

  • 심볼을 숫자(number)로 변환할 때, TypeError가 발생한다.
    (e.g. +sym or sym | 0).
  • 느슨한 동등(loose equality)을 사용할 때, Object(sym) == sym 는 true 를 반환한다.
  • Symbol("foo") + "bar" 는 TypeError (can't convert symbol to string)를 발생시킨다. 이것은 예를 들어 아무 말없이 심볼로부터 새 문자열 속성 이름을 생성하는 것을 방지한다.
  • "safer" String(sym) conversionSymbol.prototype.toString()을 심볼에서 호출하는 것과 같이 동작한다. 하지만 new String(sym) 는 오류(error)를 발생시키는 것을 유의하라.

심볼과 for...in 반복

심볼은 for...in 반복에서 나타나지 않는다. 추가적으로,  Object.getOwnPropertyNames()는 심볼 객체 속성들을 반환하지 않지만, Object.getOwnPropertySymbols()를 이용해 이것들을 가져올 수 있다.

var obj = {};

obj[Symbol("a")] = "a";
obj[Symbol.for("b")] = "b";
obj["c"] = "c";
obj.d = "d";

for (var i in obj) {
   console.log(i); // logs "c" and "d"
}

심볼과 JSON.stringify()

키로 심볼을 사용한 속성들은 JSON.stringify() 을 사용할 때 완전히 무시된다:

JSON.stringify({[Symbol("foo")]: "foo"});                 
// '{}'

더 자세한 것은 JSON.stringify()를 참조하라.

속성 키로서의 심볼 래퍼 객체

심볼 래퍼 객체가 속성 키로 사용되면, 래핑된 심볼로 강제 형변환 된다:

var sym = Symbol("foo");
var obj = {[sym]: 1};
obj[sym];            // 1
obj[Object(sym)];    // still 1

명세서

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Symbol' in that specification.
Standard Initial definition

브라우저 호환성

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 38 36.0 (36.0) No support 25 9
Symbol.iterator (@@iterator) 38 36.0 (36.0) No support 25 9
Symbol.unscopables (@@unscopables) 38 No support No support 25 9
Symbol.match (@@match) No support 40.0 (40.0) No support No support No support
Symbol.species (@@species) No support 41.0 (41.0) No support No support No support
Symbol.toPrimitive (@@toPrimitive) No support 44.0 (44.0) No support No support No support
Other well-known symbols No support No support No support No support No support
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support No support 38 36.0 (36.0) No support 25 9
Symbol.iterator (@@iterator) No support 38 36.0 (36.0) No support 25 9
Symbol.unscopables (@@unscopables) No support 38 No support No support 25 9
Symbol.match (@@match) No support No support 40.0 (40.0) No support No support No support
Symbol.species (@@species) No support No support 41.0 (41.0) No support No support No support
Symbol.toPrimitive (@@toPrimitive) No support No support 44.0 (44.0) No support No support No support
Other well-known symbols No support No support No support No support No support No support

참조

문서 태그 및 공헌자

 이 페이지의 공헌자: HyunSeob, maytree
 최종 변경: HyunSeob,