Symbol
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since â¨2015ë 9ìâ©.
* Some parts of this feature may have varying levels of support.
Symbol ì ìì±ìê° symbol ìì ê°ì ë°ííë ë´ì¥ ê°ì²´ì
ëë¤. symbol ìì ê°ì ì¬ë³¼ ê°, í¹ì ì§§ê² ì¬ë³¼ì´ë¼ê³ ë§ ë¶ë¥´ë©° ê³ ì í¨ì´ ë³´ì¥ë©ëë¤. ì¬ë³¼ì ê°ì²´ì ìì±ì ì¶ê°í ë ê³ ì í í¤ë¥¼ ë¶ì¬íì¬ ë¤ë¥¸ ì½ëì ì¶©ëíì§ ìëë¡ í ë ë§ì´ ì°ì´ë©°, ì´ë ê² ì¶ê°í ìì±ì ì¼ë°ì ì¸ ë°©ë²ì¼ë¡ë ì ê·¼í ì ìì¼ë¯ë¡ ì½í ííì 캡ìí, í¹ì ì ë³´ ìëì ì ê³µí©ëë¤.
모ë Symbol() í¸ì¶ì ê°ê° ê³ ì í ì¬ë³¼ì ë°ííë ê²ì´ ë³´ì¥ë©ëë¤. 모ë Symbol.for("key") í¸ì¶ì 주ì´ì§ ê° "key"ì ëí´ ê°ì ì¬ë³¼ì ë°íí©ëë¤. Symbol.for("key")를 í¸ì¶íì ë, 주ì´ì§ í¤ë¥¼ ê°ì§ ì¬ë³¼ì´ ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬ì ì¡´ì¬íë©´ ê·¸ ì¬ë³¼ì ë°íí©ëë¤. ê·¸ë° ì¬ë³¼ì´ ìì¼ë©´ ìë¡ ìì±íê³ , ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬ì ë±ë¡í í, ë°íí©ëë¤.
ì¤ëª
ìë¡ì´ ìì ì¬ë³¼ì ìì±íë ¤ë©´ Symbol()ì í¸ì¶í©ëë¤. ì íì ì¼ë¡ ì¤ëª
문ìì´ì ì ê³µí ì ììµëë¤.
const sym1 = Symbol();
const sym2 = Symbol("foo");
const sym3 = Symbol("foo");
ì ì½ëë ì¸ ê°ì ìë¡ì´ ì¬ë³¼ì ìì±í©ëë¤. Symbol("foo")ë 문ìì´ "foo"를 ì¬ë³¼ë¡ ë³ííë ê²ì´ ìëë¼ë ì ì 주ìíì¸ì. ë§¤ë² í¸ì¶ë§ë¤ ìë¡ì´ ì¬ë³¼ì´ ìì±ë©ëë¤.
Symbol("foo") === Symbol("foo"); // false
new ì°ì°ì를 ì¬ì©íë©´ TypeErrorê° ë°ìí©ëë¤.
const sym = new Symbol(); // TypeError
ë°ë¼ì ê°ë°ìê° ìë¡ì´ ì¬ë³¼ ê°ì ë§ëë ëì ëª
ìì ì¼ë¡ Symbol ëí¼ ê°ì²´ë¥¼ ìì±íë 걸 ë°©ì§íëë°, ì¼ë°ì ì¼ë¡ ë¤ë¥¸ ìì ë°ì´í° íì
ë¤ì ëí¼ ê°ì²´(new Boolean, new String, new Number)ë ìì±í ì ìë¤ë ì ì ìê°íë©´ ììíì§ ëª»í ëìì¼ ìë ììµëë¤.
ì ë§ë¡ Symbol ëí¼ ê°ì²´ë¥¼ ìì±í´ì¼ íë©´ Object() í¨ì를 ì¬ì©í ì ììµëë¤.
const sym = Symbol("foo");
typeof sym; // "symbol"
const symObj = Object(sym);
typeof symObj; // "object"
ì¬ë³¼ì ì ì¼íê² ì°¸ì¡° ëì¼ì±(ê°ì ì¬ë³¼ì ë ë² ë§ë¤ ì ìì)ì ê°ì§ë ìì ë°ì´í° íì
ì´ë¯ë¡ ê°ì²´ì ë¹ì·íê² ëìíë ë©´ì´ ììµëë¤. ì를 ë¤ì´, ì¬ë³¼ì ê°ë¹ì§ 컬ë ì
ëìì´ë©° ë°ë¼ì WeakMap, WeakSet, WeakRef, FinalizationRegistry ê°ì²´ì ì ì¥í ì ììµëë¤.
ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬ì ê³µì ì¬ë³¼
ììì ì´í´ë´¤ë Symbol() í¨ì 구문ì íë¡ê·¸ë¨ì´ ì¢
ë£ë ëê¹ì§ ê³ ì í ì± ë¨ë ì¬ë³¼ì ìì±í©ëë¤. ì¬ë¬ íì¼ì 걸ì³, í¹ì ê°ì ë³ëì ì ì ì¤ì½í를 ê°ë ë ë¦ê¹ì§ë 걸ì³ì ì¬ì© ê°ë¥í ì¬ë³¼ì ìì±íë ¤ë©´ Symbol.for() ë©ìëì Symbol.keyFor() ë©ìë를 ì¬ì©íì¬ ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬ì ì¬ë³¼ì ì¤ì íê³ ê°ì ¸ì¬ ì ììµëë¤.
ì°¸ê³ ë¡, "ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬"ë ì¤ëª
ì ìí ììì ê°ë
ì´ë©° JavaScript ìì§ ë´ì ì¤ì ë°ì´í° 구조ìë ì¼ì¹íì§ ìì ì ììµëë¤. ì´ë° ë ì§ì¤í¸ë¦¬ê° ìì§ì ì¡´ì¬íë¤ê³ í´ë, ê·¸ ë´ì©ì for()ì keyFor() ë©ìë를 ì ì¸í ë¤ë¥¸ JavaScript ì½ëìì ì ê·¼í ì ììµëë¤.
Symbol.for(tokenString) ë©ìëë 문ìì´ í¤ë¥¼ ë°ì ë ì§ì¤í¸ë¦¬ìì ì¬ë³¼ ê°ì ë°íí©ëë¤. ë°ëë¡ Symbol.keyFor(symbolValue) ë©ìëë ì¬ë³¼ ê°ì ë°ì ëìíë 문ìì´ í¤ë¥¼ ë°íí©ëë¤. ìë¡ ë°ëëë ë©ìëì´ë¯ë¡ ìë ì½ëë trueì
ëë¤.
Symbol.keyFor(Symbol.for("tokenString")) === "tokenString"; // true
ë±ë¡ë ì¬ë³¼ì ì무ë°ìë ììë¡ ìì±ë ì ìì¼ë¯ë¡, ëìëë 문ìì´ í¤ì ê±°ì ëì¼íê² ëìí©ëë¤. ë°ë¼ì ê°ë¹ì§ 컬ë ì
ëìì´ ìëë©°, WeakMap, WeakSet, WeakRef, FinalizationRegistry ê°ì²´ìë ì¬ì©í ì ììµëë¤.
ì ìë ¤ì§ ì¬ë³¼
Symbol ìì±ìì ì ì ìì±ì 모ë ì¤ì¤ë¡ê° ì¬ë³¼ì´ë©°, ê·¸ ê°ì ë ë¦ì ê±¸ì³ ëì¼í©ëë¤. ì´ ì¬ë³¼ë¤ì 'ì ìë ¤ì§ ì¬ë³¼'ì´ë¼ê³ ë¶ë¥´ë©°, JavaScript ë´ì¥ ìì
ìì ì¼ì¢
ì "íë¡í ì½"ë¡ì ëìí©ëë¤. ì¬ì©ìë ì´ ì¬ë³¼ë¤ë¡ ì¸ì´ ëìì ë°ê¿ ì ììµëë¤. ì를 ë¤ì´, ìì±ì í¨ìì Symbol.hasInstanceê° ì´ë¦ì¸ ë©ìëê° ìì¼ë©´, instanceof ì°ì°ìë ëì ì ì´ ë©ìë를 ì¬ì©í©ëë¤.
ì ìë ¤ì§ ì¬ë³¼ ì ì JavaScriptë ì¼ë¶ ë´ì¥ ìì
ì ì¼ë°ì ì¸ ìì±ì ì¬ì©íìµëë¤. ì컨ë JSON.stringify í¨ìë ê°ì²´ì toJSON() ë©ìë를 ì¬ì©íê³ , String í¨ìë ê°ì²´ì toString()ê³¼ valueOf() ë©ìë를 ì¬ì©í©ëë¤. íì§ë§, ì¸ì´ê° í¬í¨íë ìì
ì ìê° ì ì ëì´ê°ì ë°ë¼, ê°ê°ì ìì
ì "ë§ë² ìì±"ì¼ë¡ ì§ì íë©´ íì í¸íì±ì 깨ë¨ë¦¬ê³ ì¸ì´ì ëìì ì¶ë¡ í기 ì´ë µê² ë§ë¤ ì ììµëë¤. ì ìë ¤ì§ ì¬ë³¼ ëë¶ì, ë³´íµ ë¬¸ìì´ ìì±ë§ ì ê·¼íë ì¼ë°ì ì¸ ì½ë ì
ì¥ìì ì¸ì´ ëì ì¬ì©ì ì§ì ì "ë³´ì´ì§ ìê²" ëìµëë¤.
ì ìë ¤ì§ ì¬ë³¼ì MDNì í¬í¨í ì¬ë¬ ì¶ì²ìì ì´ë¦ ìì @@를 ë¶ì¬ 구ë¶í©ëë¤. ì를 ë¤ì´ Symbol.hasInstanceë @@hasInstanceì²ë¼ ìëë¤. ì¬ë³¼ìë 리í°ë´ ííê° ì¡´ì¬íì§ ì기ë íê³ , ê·¸ë ë¤ê³ Symbol.hasInstance를 ì°ë©´ ë¤ë¥¸ ë³ì¹ì¼ë¡ ê°ì ì¬ë³¼ì ê°ë¦¬í¬ ì ìë¤ë ì ì´ ëë¬ëì§ ì기 ë문ì
ëë¤. Function.nameê³¼ "Function"ì ì°¨ì´ì ë¹ì·í©ëë¤.
ì ìë ¤ì§ ì¬ë³¼ìë ê°ë¹ì§ 컬ë ì
ê°ë¥ ì¬ë¶ë¼ë ê°ë
ë¶í°ê° ì¡´ì¬íì§ ììµëë¤. ì´ ì¬ë³¼ë¤ì Array.prototype ë±ì ë´ì¬ë ê°ì²´ì²ë¼ ê³ ì ë ìê° íë¡ê·¸ë¨ì ìëª
ë´ë´ ê³ ì íê² ì ì§ë기 ë문ì
ëë¤. ë°ë¼ì ì ìë ¤ì§ ì¬ë³¼ë¤ì WeakMap, WeakSet, WeakRef, and FinalizationRegistry ê°ì²´ì ì¬ì©í ì ììµëë¤.
ê°ì²´ì ì¬ë³¼ ìì± ì°¾ê¸°
Object.getOwnPropertySymbols() ë©ìëë ì¬ë³¼ ë°°ì´ì ë°ííë©°, 주ì´ì§ ê°ì²´ì ì¬ë³¼ ìì±ì ì°¾ì ë ì¬ì©í ì ììµëë¤. ì°¸ê³ ë¡ ëª¨ë ê°ì²´ë ì´ê¸°í ì ìì²´ ì¬ë³¼ ìì±ì ê°ì§ ìì¼ë¯ë¡, ëì¤ì ì¬ë³¼ ìì±ì ì¶ê°íì§ ìë ì´ì ì´ ë©ìëê° ë°ííë ë°°ì´ì ë¹ì´ììµëë¤.
ìì±ì
Symbol()-
ìë¡ì´
Symbolê°ì²´ë¥¼ ìì±í©ëë¤.new Symbol()ì²ë¼ ì¸ ì ìê³ í¨ìë¡ë§ ì¬ì©í´ì¼ íë¯ë¡ ì¼ë°ì ì¸ ìì±ììë ë¤ë¦ ëë¤.
ì ì ìì±
ì ì ìì±ë¤ì ì ìë ¤ì§ ì¬ë³¼ì
ëë¤. ê°ê°ì ì¤ëª
ììë "Symbol.hasInstanceë ... íë ë©ìëì
ëë¤"ì ê°ì ë§ì ì¬ì©íê² ì§ë§, ì´ê±´ ì´ë¤ ê°ì²´ê° í´ë¹ ì¬ë³¼ì ì´ë¦ì¼ë¡ íë ë©ìë를 ìì íê³ ìì ë를 ì미íë ê²ì´ì§, ì¬ë³¼ ìì²´ì ê°ì ì¤ëª
íë ê²ì´ ìëì 주ìí´ ì£¼ì¸ì.
Symbol.asyncIterator-
ê°ì²´ì 기본 AsyncIterator를 ë°ííë ë©ìëì ëë¤.
for await...ofìì ì¬ì©í©ëë¤. Symbol.hasInstance-
ìì±ì ê°ì²´ê° ì´ë¤ ê°ì²´ë¥¼ ìì ì ì¸ì¤í´ì¤ë¡ ì¸ì§íëì§ íë³íë ë©ìëì ëë¤.
instanceofìì ì¬ì©í©ëë¤. Symbol.isConcatSpreadable-
ê°ì²´ë¥¼ ë°°ì´ ììë¡ íííí ì ìëì§ ëíë´ë ë¶ë¦¬ì¸ ê°ì ëë¤.
Array.prototype.concat()ìì ì¬ì©í©ëë¤. Symbol.iterator-
ê°ì²´ì 기본 ìí기를 ë°ííë ë©ìëì ëë¤.
for...ofìì ì¬ì©í©ëë¤. Symbol.match-
문ìì´ì ì¼ì¹ íë³ì ìííë ë©ìëì ëë¤. ê°ì²´ë¥¼ ì ê·ííìì¼ë¡ì¨ ì¬ì©í ì ìëì§ íë³í ëë ì°ì ëë¤.
String.prototype.match()ìì ì¬ì©í©ëë¤. Symbol.matchAll-
문ìì´ì ëí ì ê·ííì ì¼ì¹ 결과를 ìííë ìí기를 ë°ííë ë©ìëì ëë¤.
String.prototype.matchAll()ìì ì¬ì©í©ëë¤. Symbol.replace-
문ìì´ìì ì¼ì¹í íì 문ìì´ì ëì¹íë ë©ìëì ëë¤.
String.prototype.replace()ìì ì¬ì©í©ëë¤. Symbol.search-
문ìì´ìì ì ê·ííìê³¼ ì¼ì¹í ì¸ë±ì¤ë¥¼ ë°ííë ë©ìëì ëë¤.
String.prototype.search()를 ë°íí©ëë¤. Symbol.species-
íì ê°ì²´ë¥¼ ìì±í ë ì°ì´ë ìì±ì í¨ìì ëë¤.
Symbol.split-
ì ê·ííìì´ ì¼ì¹í ì¸ë±ì¤ìì 문ìì´ì ë¶í íë ë©ìëì ëë¤.
String.prototype.split()ìì ì¬ì©í©ëë¤. Symbol.toPrimitive-
ê°ì²´ë¥¼ ìì ê°ì¼ë¡ ë³ííë ë©ìëì ëë¤.
Symbol.toStringTag-
ê°ì²´ì 기본 ì¤ëª ì¼ë¡ ì¬ì©ëë 문ìì´ ê°ì ëë¤.
Object.prototype.toString()ìì ì¬ì©í©ëë¤. Symbol.unscopables-
ì°ê´ë ê°ì²´ì
withíê²½ ë°ì¸ë©ìì ì ì¸í ìì±ì ì´ë¦ë¤ì ìì²´ ìì±ê³¼ ìì ìì±ì¼ë¡ ê°ì§ë ê°ì²´ ê°ì ëë¤.
ì ì ë©ìë
Symbol.for()-
주ì´ì§
key를 ê°ì§ 기존 ì¬ë³¼ì ì°¾ì ë°íí©ëë¤. ê·¸ë° ì¬ë³¼ì´ ìì¼ë©´ ìë¡ì´ ì¬ë³¼ì ìì±íê³ ,key를 ì¬ì©í´ ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬ì ë±ë¡í©ëë¤. Symbol.keyFor()-
ì ì ì¬ë³¼ ë ì§ì¤í¸ë¦¬ìì 주ì´ì§ ì¬ë³¼ì í¤ë¥¼ ë°íí©ëë¤.
ì¸ì¤í´ì¤ ìì±
ì´ ìì±ë¤ì Symbol.prototypeì ì ìëë©° 모ë Symbol ì¸ì¤í´ì¤ê° ê³µì í©ëë¤.
Symbol.prototype.constructor-
ì¸ì¤í´ì¤ ê°ì²´ë¥¼ ìì±íë ìì±ì í¨ìì ëë¤.
Symbolì¸ì¤í´ì¤ììì ì´ê¸° ê°ìSymbolìì±ìì ëë¤. Symbol.prototype.description-
ì¬ë³¼ ì¤ëª ì ë´ì ì½ê¸° ì ì© ë¬¸ìì´ì ëë¤.
Symbol.prototype[@@toStringTag]-
@@toStringTagìì±ì ì´ê¸° ê°ì 문ìì´"Symbol". ì´ ìì±ìObject.prototype.toString()ìì ì¬ì©í©ëë¤. íì§ë§Symbolì ìì²´ì ì¼ë¡toString()ë©ìëë ìì íë¯ë¡, ì¬ë³¼ìthisArgë¡ ì§ì í´ìObject.prototype.toString.call()ì í¸ì¶íì§ ìë ì´ì ì´ ìì±ì ì¬ì©ëì§ ììµëë¤.
ì¸ì¤í´ì¤ ë©ìë
Symbol.prototype.toString()-
ì¬ë³¼ ì¤ëª ì ë´ì 문ìì´ì ë°íí©ëë¤.
Object.prototype.toString()ë©ìë를 ì¬ì ìí©ëë¤. Symbol.prototype.valueOf()-
ì¬ë³¼ì ë°íí©ëë¤.
Object.prototype.valueOf()ë©ìë를 ì¬ì ìí©ëë¤. Symbol.prototype[@@toPrimitive]()-
ì¬ë³¼ì ë°íí©ëë¤.
ìì
>ì¬ë³¼ì typeof ì°ì°ì ì¬ì©í기
typeof ì°ì°ìë ì¬ë³¼ì ìë³íëë° ëìì´ ë ì ììµëë¤.
typeof Symbol() === "symbol";
typeof Symbol("foo") === "symbol";
typeof Symbol.iterator === "symbol";
ì¬ë³¼ íì ë³í
ì¬ë³¼ ë³íì´ íìí ë 주ìí´ì¼ í ì ë¤ì ëë¤.
- ì¬ë³¼ì ì«ìë¡ ë³í(
+sym,sym | 0, ...)íë ¤ê³ íë©´TypeErrorê° ë°ìí©ëë¤. - ì격íì§ ìì ëë± ì°ì° ì,
Object(sym) == symìtrueì ëë¤. Symbol("foo") + "bar"ëTypeErrorì ëë¤(ì¬ë³¼ì 문ìì´ë¡ ë³íí ì ìì). ëë¶ì ì¬ë³¼ìì ìë¡ì´ 문ìì´ ìì±ì ë§ëë ê²½ì°ë¥¼ ëì¹ì§ ìì ì ììµëë¤.- "ë ìì í"
String(sym)ë³íìSymbol.prototype.toString()í¸ì¶ê³¼ ê°ìµëë¤. íì§ë§new String(sym)ì ì¤ë¥ë¥¼ ëì§ë¯ë¡ 주ìíì¸ì.
ì¬ë³¼ê³¼ for...in ìí
ì¬ë³¼ì for...in ìíì ì´ê±°ëì§ ììµëë¤. ì´ì ëí´ Object.getOwnPropertyNames()ë ì¬ë³¼ ê°ì²´ ìì±ì ë°ííì§ ììµëë¤. íì§ë§ Object.getOwnPropertySymbols()를 ì¬ì©íë©´ ì¬ë³¼ ìì±ë¤ì ì°¾ì ì ììµëë¤.
const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol.for("b")] = "b";
obj["c"] = "c";
obj.d = "d";
for (const i in obj) {
console.log(i);
}
// "c" "d"
ì¬ë³¼ê³¼ JSON.stringify()
JSON.stringify()ë ì¬ë³¼ í¤ ìì±ì ìì í 무ìí©ëë¤.
JSON.stringify({ [Symbol("foo")]: "foo" });
// '{}'
ë ìì¸í ë´ì©ì JSON.stringify()를 ì°¸ê³ íì¸ì.
ìì± í¤ë¡ìì ì¬ë³¼ ëí¼ ê°ì²´
ì¬ë³¼ ëí¼ ê°ì²´ë¥¼ ìì± í¤ë¡ ì¬ì©íë©´, ëí¼ ê°ì²´ë ë´ë¶ ì¬ë³¼ë¡ ë³íë©ëë¤.
const sym = Symbol("foo");
const obj = { [sym]: 1 };
obj[sym]; // 1
obj[Object(sym)]; // still 1
ëª ì¸ì
| Specification |
|---|
| ECMAScript® 2026 Language Specification > # sec-symbol-objects > |