번역 작업 진행중입니다.

Symbol() 함수는 심볼(symbol) 형식의 값을 반환하는데, 이 심볼은 내장 객체(built-in objects)의 여러 멤버를 가리키는 정적 프로퍼티와 전역 심볼 레지스트리(global symbol registry)를 가리키는 정적 메서드를 가지며, "new Symbol()" 문법을 지원하지 않아 생성자 측면에서는 불완전한 내장 객체 클래스(built-in object class)와 유사합니다.

Symbol()로부터 반환되는 모든 심볼 값은 고유합니다. 심볼 값은 객체 프로퍼티(object properties)에 대한 식별자로 사용될 수 있습니다; 이것이 심볼 데이터 형식의 유일한 목적입니다. 목적과 용례에 대한 더 자세한 설명은 심볼에 대한 용어집(glossary entry for Symbol)에서 볼 수 있습니다.

심볼(symbol) 데이터 형은 원시 데이터 형(primitive data type)의 일종입니다.

문법

Symbol([description])

매개변수

description Optional
선택적(optional) 문자열. 디버깅에 사용할 수 있는 심볼에 대한 설명(description)으로 심볼 자체에 접근하는 용도로는 사용할 수 없음.

설명

새 원시(primitive) 심볼을 생성하려면, 설명을 위한 선택적 문자열과 함께 Symbol()을 쓰면됩니다.

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

위의 코드는 세 개의 새 심볼을 생성합니다. Symbol("foo")는 심볼에 "foo"라는 문자열을 심볼에 강제로 포함시키지 않는다는 점에 유의하시기 바랍니다. 해당 코드는 매 번 새로운 심볼을 생성합니다:

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

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

var sym = new Symbol(); // TypeError

이는 작성자가 새로운 심볼 값 대신 명시적으로 심볼 래퍼 객체(Symbol wrapper object)를 생성할 수 없게 합니다. 일반적으로 원시 데이터 형에 대한 명시적인 래퍼 객체 생성(예를 들어, new Boolean, new String 또는 new Number와 같은)이 가능하다는 점에 비춰보면 의외일 수 있습니다.

꼭 심볼 래퍼 객체를 생성하고 싶다면, Object() 함수를 이용할 수 있습니다.

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

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

Symbol() 함수를 사용한 위의 문법은 코드베이스(codebase) 전체에서 사용 가능한 전역 심볼을 생성하는 것은 아닙니다. 파일 간(across files), 또는 램(realms, 각각이 자체의 전역 범위(scope)를 가지는) 간에도 사용할 수 있는 심볼을 생성하기 위해서는, Symbol.for()Symbol.keyFor() 메서드를 이용해 전역 심볼 레지스트리에 심볼을 설정하거나 추출해야 합니다.

객체에서 심볼 속성(symbol properties) 찾기

Object.getOwnPropertySymbols() 메서드는 심볼의 배열을 반환하여 주어진 객체의 심볼 속성을 찾을 수 있게 해줍니다. 모든 객체는 스스로에 대한 심볼 속성이 없는 상태로 초기화되기 때문에 해당 객체에 심볼 속성을 설정하기 전까지는 빈 배열을 반환한다는 점에 유의하시기 바랍니다.

속성(properties)

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

잘 알려진 심볼들

여러분이 정의하는 심볼 외에, 자바스크립트는 ECMAScript 5와 그 이전 버전에서는 개발자에게 제공되지 않았던 언어 내부의 동작을 나타내는 내장(built-in) 심볼을 몇 가지 가지고 있습니다. 다음 속성을 이용해 이들 심볼에 접근할 수 있습니다:

반복(iteration) 심볼

Symbol.iterator
객체의 기본 반복자(default iterator)를 반환하는 메서드.for...of에서 사용됨.
Symbol.asyncIterator
객체의 기본 비동기 반복자(default AsyncIterator)를 반환하는 메서드. for await 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
생성자 객체(constructor object)가 어떤 객체를 자신의 인스턴스로 인식하는지를 확인하는데 사용하는 메소드. instanceof에서 사용됨.
Symbol.isConcatSpreadable
객체가 자신의 배열 요소를 직렬로(be flattened) 나타낼 수 있는지 여부를 나타내는 부울 값. Array.prototype.concat()에서 사용됨.
Symbol.unscopables
자신의 속성명 또는 상속된 속성명이 연관 객체(the associated objet)의 with 환경 바인딩(envorinment bindings)에서 제외된 객체의 값 (An object value of whose own and inherited property names are excluded from the with environment bindings of the associated object).
Symbol.species
파생(derived) 객체를 생성하는데 사용되는 생성자 함수.
Symbol.toPrimitive
객체를 원시형(primitive) 값으로 변환하는 메서드.
Symbol.toStringTag
객체에 대한 기본 설명(description)으로 사용되는 문자열 값. Object.prototype.toString()에서 사용됨.

메서드

Symbol.for(key)
주어진 키(key)로 현재 존재하는 심볼을 검색하고 찾으면 반환합니다. 존재하지 않으면 주어진 키로 전역 심볼 레지스트리에 새로운 심볼을 생성하고 그 심볼을 반환합니다.
Symbol.keyFor(sym)
전역 심볼 레지스트리로부터 주어진 심볼에 대한 공유 심볼 키(shared symbol key)를 추출합니다.

심볼(Symbol) 프로토타입

모든 심볼은 Symbol.prototype을 상속합니다.

속성(properties)

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 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'

심볼의 형 변환(type conversions)

심볼의 형 변환(type conversion)할 때 유의해야 할 사항

  • 심볼을 숫자(number)로 변환하고자 할 때, TypeError가 발생합니다.
    (e.g. +sym or sym | 0).
  • 느슨한 동등(loose equality) 연산자를 사용할 때, Object(sym) == symtrue를 반환합니다.
  • Symbol("foo") + "bar"TypeError (심볼을 문자열로 변환할 수 없는)를 발생시킵니다. 이는 예를 들자면, 심볼에서 암묵적으로 새로운 문자열 속성명을 생성하지 못하게 합니다.
  • "보다 안전한" String(sym) 변환("safer" String(sym) conversion)은 심볼에 대해 Symbol.prototype.toString()을 호출하는 것과 같이 동작하지만, new String(sym)는 오류(error)를 발생시키는 것을 유의하시기 바랍니다.

심볼과 for...in 반복문

심볼은 for...in 반복문 내에서 하나씩 열거할 수 없습니다. 더구나, Object.getOwnPropertyNames()는 심볼 객체 속성(symbol object properties)을 반환하지 않습니다. 하지만, 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()

심볼을 키로 사용한 속성(symbol-keyed properties)은 JSON.stringify()을 사용할 때 완전히 무시됩니다:

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

더 자세한 것은 JSON.stringify()를 참조하시기 바랍니다.

속성 키로서의 심볼 래퍼 객체(symbol wrapper object)

심볼 래퍼 객체를 속성 키로 사용하면, 이 객체는 래핑된 심볼로 강제 변환됩니다(When a Symbol wrapper object is used as a property key, this object will be coerced to its wrapped symbol):

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
ECMAScript Latest Draft (ECMA-262)
The definition of 'Symbol' in that specification.
Draft  

브라우저 호환성

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic support3812136 No259
asyncIterator No No No2 No No No
for40 Yes36 No Yes9
hasInstance511550 No Yes Yes
isConcatSpreadable481548 No Yes Yes
iterator43 Yes36 No3010
keyFor40 Yes36 No Yes9
match50 Yes40 No Yes Yes
prototype381236 No259
replace50 Yes49 No Yes Yes
search50 Yes49 No Yes Yes
species511441 No3810
split50 Yes49 No Yes Yes
toPrimitive481544 No Yes Yes
toSource No No36 No No No
toString381236 No259
toStringTag491551 No Yes Yes
unscopables38 Yes48 No Yes9
valueOf381236 No259
@@toPrimitive ? ?44 No ? ?
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Basic support Yes38 Yes36259 Yes
asyncIterator No No No No No No No
for Yes Yes Yes36 Yes9 Yes
hasInstance Yes Yes Yes50 Yes Yes Yes
isConcatSpreadable Yes Yes Yes48 Yes Yes Yes
iterator Yes Yes Yes36 Yes10 Yes
keyFor Yes Yes Yes36 Yes9 Yes
match Yes Yes Yes40 Yes Yes Yes
prototype Yes38 Yes36259 Yes
replace Yes Yes Yes49 Yes Yes Yes
search Yes Yes Yes49 Yes Yes Yes
species Yes Yes14413810 Yes
split Yes Yes Yes49 Yes Yes Yes
toPrimitive Yes Yes Yes44 Yes Yes Yes
toSource No No No36 No No No
toString Yes38 Yes36259 Yes
toStringTag Yes Yes Yes51 Yes Yes Yes
unscopables Yes Yes Yes48 Yes9 Yes
valueOf Yes38 Yes36259 Yes
@@toPrimitive ? ? ?44 ? ? ?

1. Edge 12 included Symbol properties in JSON.stringify() output.

2. Available in Firefox Nightly.

See also

문서 태그 및 공헌자

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