이 번역은 완료되지 않았습니다. 이 문서를 번역해 주세요.

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)으로 심볼 자체에 접근하는 용도로는 사용할 수 없음.

설명(Description)

새 원시(primitive) 심볼을 생성하려면, 심볼을 설명하는 선택적(optional) 문자열과 함께 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 생성자의 프로토타입을 나타냄.

잘 알려진 심볼들

여러분이 정의하는 심볼 외에, 자바스크립트는 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.description
A read-only string containing the description of the symbol.

메서드

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  

브라우저 호환성

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
Basic supportChrome Full support 38Edge Full support 12
Notes
Full support 12
Notes
Notes Edge 12 included Symbol properties in JSON.stringify() output.
Firefox Full support 36IE No support NoOpera Full support 25Safari Full support 9WebView Android Full support YesChrome Android Full support 38Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support 25Safari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
asyncIterator
Experimental
Chrome No support NoEdge No support NoFirefox No support No
Notes
No support No
Notes
Notes Available in Firefox Nightly.
IE No support NoOpera No support NoSafari No support NoWebView Android No support NoChrome Android No support NoEdge Mobile No support NoFirefox Android No support NoOpera Android No support NoSafari iOS No support NoSamsung Internet Android No support Nonodejs No support No
descriptionChrome Full support 70Edge No support NoFirefox Full support 63IE No support NoOpera Full support 57Safari No support NoWebView Android Full support 70Chrome Android Full support 70Edge Mobile No support NoFirefox Android Full support 63Opera Android Full support 57Safari iOS No support NoSamsung Internet Android No support Nonodejs No support No
forChrome Full support 40Edge Full support YesFirefox Full support 36IE No support NoOpera Full support YesSafari Full support 9WebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 36Opera Android Full support YesSafari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
hasInstanceChrome Full support 51Edge Full support 15Firefox Full support 50IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 50Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.5.0
Full support 6.5.0
Full support 6.0.0
Disabled
Disabled From version 6.0.0: this feature is behind the --harmony runtime flag.
isConcatSpreadableChrome Full support 48Edge Full support 15Firefox Full support 48IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 48Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
iteratorChrome Full support 43Edge Full support YesFirefox Full support 36IE No support NoOpera Full support 30Safari Full support 10WebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 36Opera Android Full support YesSafari iOS Full support 10Samsung Internet Android Full support Yesnodejs Full support 0.12
keyForChrome Full support 40Edge Full support YesFirefox Full support 36IE No support NoOpera Full support YesSafari Full support 9WebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 36Opera Android Full support YesSafari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
matchChrome Full support 50Edge Full support YesFirefox Full support 40IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 40Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
prototypeChrome Full support 38Edge Full support 12Firefox Full support 36IE No support NoOpera Full support 25Safari Full support 9WebView Android Full support YesChrome Android Full support 38Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support 25Safari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
replaceChrome Full support 50Edge Full support YesFirefox Full support 49IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 49Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
searchChrome Full support 50Edge Full support YesFirefox Full support 49IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 49Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
speciesChrome Full support 51Edge Full support 14Firefox Full support 41IE No support NoOpera Full support 38Safari Full support 10WebView Android Full support YesChrome Android Full support YesEdge Mobile Full support 14Firefox Android Full support 41Opera Android Full support 38Safari iOS Full support 10Samsung Internet Android Full support Yesnodejs Full support 6.5.0
Full support 6.5.0
Full support 6.0.0
Disabled
Disabled From version 6.0.0: this feature is behind the --harmony runtime flag.
splitChrome Full support 50Edge Full support YesFirefox Full support 49IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 49Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
toPrimitiveChrome Full support 48Edge Full support 15Firefox Full support 44IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 44Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
toSource
Non-standard
Chrome No support NoEdge No support NoFirefox Full support 36IE No support NoOpera No support NoSafari No support NoWebView Android No support NoChrome Android No support NoEdge Mobile No support NoFirefox Android Full support 36Opera Android No support NoSafari iOS No support NoSamsung Internet Android No support Nonodejs No support No
toStringChrome Full support 38Edge Full support 12Firefox Full support 36IE No support NoOpera Full support 25Safari Full support 9WebView Android Full support YesChrome Android Full support 38Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support 25Safari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
toStringTagChrome Full support 49Edge Full support 15Firefox Full support 51IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 51Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
Full support 6.0.0
Full support 4.0.0
Disabled
Disabled From version 4.0.0: this feature is behind the --harmony runtime flag.
unscopablesChrome Full support 38Edge Full support YesFirefox Full support 48IE No support NoOpera Full support YesSafari Full support 9WebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 48Opera Android Full support YesSafari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support 0.12
valueOfChrome Full support 38Edge Full support 12Firefox Full support 36IE No support NoOpera Full support 25Safari Full support 9WebView Android Full support YesChrome Android Full support 38Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support 25Safari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
@@toPrimitiveChrome ? Edge ? Firefox Full support 44IE No support NoOpera ? Safari ? WebView Android ? Chrome Android ? Edge Mobile ? Firefox Android Full support 44Opera Android ? Safari iOS ? Samsung Internet Android ? nodejs ?

Legend

Full support  
Full support
No support  
No support
Compatibility unknown  
Compatibility unknown
Experimental. Expect behavior to change in the future.
Experimental. Expect behavior to change in the future.
Non-standard. Expect poor cross-browser support.
Non-standard. Expect poor cross-browser support.
See implementation notes.
See implementation notes.
User must explicitly enable this feature.
User must explicitly enable this feature.

See also

문서 태그 및 공헌자

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