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.for("key") ãå¼ã³åºãã¨ãæå®ããã "key" ã®å¤ã«å¯¾ãã¦å¸¸ã«åã Symbol ãè¿ãã¾ããSymbol.for("key") ãå¼ã³åºãããã¨ãä¸ãããããã¼ãæã¤ Symbol ãã°ãã¼ãã«ãª Symbol ã¬ã¸ã¹ããªã¼ã§è¦ã¤ããã°ããã® Symbol ãè¿ããã¾ããããã§ãªãå ´åã¯ãæ°ãã Symbol ã使ãããä¸ãããããã¼ã®ä¸ã§ã°ãã¼ãã« Symbol ã¬ã¸ã¹ããªã¼ã«è¿½å ãããè¿ããã¾ãã
解説
æ°ããããªããã£ãã·ã³ãã«ã使ããã«ã¯ãSymbol() ã¨è¨è¿°ãããã®èª¬æã¨ãã¦ãªãã·ã§ã³ã®æååãæå®ãã¾ãã
const sym1 = Symbol();
const sym2 = Symbol("foo");
const sym3 = Symbol("foo");
ä¸è¨ã®ã³ã¼ã㯠3 ã¤ã®æ°ããã·ã³ãã«ã使ãã¾ãã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"
ã·ã³ãã«ã¯åç
§å䏿§ãæã¤å¯ä¸ã®ããªããã£ããã¼ã¿åã§ããããï¼ã¤ã¾ããåãã·ã³ãã«ã 2 åº¦ä½æãããã¨ã¯ã§ããªãï¼ãããæå³ã§ã¯ãªãã¸ã§ã¯ãã®ããã«æ¯ãèãã¾ããä¾ãã°ãã·ã³ãã«ã¯ã¬ãã¼ã¸ã³ã¬ã¯ãã§ããã®ã§ã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() ã¡ã½ãããå¼ã³åºãã¾ããããããè¨èªã«ããå¤ãã®æä½ã追å ãããã«ã¤ãã¦ãåæä½ãããã¸ãã¯ããããã£ãã«æå®ãããã¨ã¯ã徿¹äºææ§ãå£ããè¨èªã®åä½ãæ¨è«ãã«ããããå¯è½æ§ããããã¨ãåãã£ã¦ãã¾ãããã¦ã§ã«ãã¦ã³ã·ã³ãã«ã使ç¨ãããã¨ã§ãé常æååããããã£ããèªã¿åããªãé常ã®ã³ã¼ããããã«ã¹ã¿ãã¤ãºããè¦ããªããããã«ãããã¨ãã§ãã¾ãã
ã¡ã¢:
仿§æ¸ã§ã¯ãã¦ã§ã«ãã¦ã³ã·ã³ãã«ã表ãããã« @@<ã·ã³ãã«å> ã¨ãã表è¨ã使ã£ã¦ãã¾ãããä¾ãã°ãSymbol.hasInstance 㯠@@hasInstance ã¨è¡¨è¨ãããArray.prototype[Symbol.iterator]() ã¡ã½ãã㯠Array.prototype[Symbol.iterator]() ã¨å¼ã°ãã¦ãã¾ããããã®è¡¨è¨æ³ã¯ä»æ§æ¸ã§ã¯ä½¿ãããªããªãã¾ããããå¤ãææ¸ãè°è«ã§ã¯ã¾ã è¦ããããã¨ãããã¾ãã
ã¦ã§ã«ãã¦ã³ã·ã³ãã«ã¯ã¬ãã¼ã¸ã³ã¬ã¯ã·ã§ã³ã®å¯¾è±¡ã«ã¯ãªãã¾ãããåºå®ã»ããã§æä¾ãããArray.prototype ã®ãããªçµã¿è¾¼ã¿ãªãã¸ã§ã¯ãã¨åæ§ã«ãããã°ã©ã ã®å¯¿å½ãéãã¦ä¸æã§ããããã§ããã§ããããWeakMapãWeakSetãWeakRefãFinalizationRegistry ã®åãªãã¸ã§ã¯ãå
ã§ä½¿ç¨ãããã¨ãã§ãã¾ãã
ãªãã¸ã§ã¯ãã§ã®ã·ã³ãã«ããããã£ã®æ¤ç´¢
Object.getOwnPropertySymbols() ã¡ã½ããã¯ã·ã³ãã«ã®é
åãè¿ããæå®ããããªãã¸ã§ã¯ãã®ã·ã³ãã«ããããã£ãæ¢ããã¨ãã§ãã¾ãããã¹ã¦ã®ãªãã¸ã§ã¯ãã¯ã·ã³ãã«ããããã£ãæããªãç¶æ
ã§åæåãããããããªãã¸ã§ã¯ãã«ã·ã³ãã«ããããã£ãè¨å®ããªãéãããã®é
åã¯ç©ºã«ãªããã¨ã«æ³¨æãã¦ãã ããã
ã³ã³ã¹ãã©ã¯ã¿ã¼
Symbol()-
ã·ã³ãã«åã®ããªããã£ãå¤ãè¿ãã¾ãã
newãä»ãã¦å¼ã³åºãã¨ã¨ã©ã¼ãçºçãã¾ãã
éçããããã£
éçããããã£ã¯ãã¹ã¦ã¦ã§ã«ãã¦ã³ã·ã³ãã«ã§ãããããã®ã·ã³ãã«ã®èª¬æã§ã¯ããSymbol.hasInstance 㯠... ãæ±ºå®ããã¡ã½ããã§ããã¨ãããããªè¨èã使ã£ã¦ãã¾ãããããã¯ãªãã¸ã§ã¯ãã®ã¡ã½ããããã®ã·ã³ãã«ãã¡ã½ããåã¨ãã¦æã¤ã¨ããæå³ã§ããï¼ã¦ã§ã«ãã¦ã³ã·ã³ãã«ã¯ããããã³ã«ãã¨ãã¦æ©è½ããããï¼ãã·ã³ãã«ãã®ãã®ã®å¤ã説æãã¦ããããã§ã¯ãªããã¨ãè¦ãã¦ããã¦ãã ããã
Symbol.asyncDispose-
ãªãã¸ã§ã¯ããã¹ã³ã¼ãå¤ã«ãªã£ãéã«ããã®ãªãã¸ã§ã¯ãã®ãªã½ã¼ã¹ãéåæçã«ç ´æ£ããã¡ã½ããã§ãã
await using宣è¨ã§ä½¿ç¨ããã¾ãã Symbol.asyncIterator-
ãªãã¸ã§ã¯ãã®æ¢å®ã®éåæã¤ãã¬ã¼ã¿ã¼ (AsyncIterator) ãè¿ãã¡ã½ããã§ãã
for await...ofãã使ç¨ããã¾ãã Symbol.dispose-
ãªãã¸ã§ã¯ããã¹ã³ã¼ãå¤ã«åºãéã«ããã®ãªãã¸ã§ã¯ãã®ãªã½ã¼ã¹ãè§£æ¾ããã¡ã½ããã§ãã
using宣è¨ã§ä½¿ç¨ããã¾ãã 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[Symbol.toStringTag]-
[Symbol.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[Symbol.toPrimitive]()-
ã·ã³ãã«ãè¿ãã¾ãã
ä¾
>ã·ã³ãã«ã«å¯¾ãã typeof æ¼ç®åã®ä½¿ç¨
typeof æ¼ç®åã¯ãã·ã³ãã«ãèå¥ããã®ã«å½¹ç«ã¡ã¾ãã
typeof Symbol() === "symbol";
typeof Symbol("foo") === "symbol";
typeof Symbol.iterator === "symbol";
ã·ã³ãã«ã®å夿
ã·ã³ãã«ã®å夿ãè¡ãéã«æ³¨æãã¹ãç¹ãããã¤ãããã¾ãã
- ã·ã³ãã«ãæ°å¤ã«å¤æãããã¨ããã¨ã
TypeErrorãçºçãã¾ãã ï¼ä¾:+symãsym | 0ï¼ - ç·©ãç価æ§ã使ç¨ããå ´åã
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() ãåç
§ãã¦ãã ããã
Symbol ã©ããã¼ãªãã¸ã§ã¯ããããããã£ã®ãã¼ã¨ãã¦ä½¿ç¨
Symbol ã©ããã¼ãªãã¸ã§ã¯ããããããã£ãã¼ã¨ãã¦ä½¿ç¨ãããå ´åããã®ãªãã¸ã§ã¯ãã¯ã©ãããããã·ã³ãã«ã«å¼·å¶çã«å¤æããã¾ãã
const sym = Symbol("foo");
const obj = { [sym]: 1 };
obj[sym]; // 1
obj[Object(sym)]; // still 1
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-symbol-objects> |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
Symbolã®ããªãã£ã« (core-js)typeof- JavaScript ãã¼ã¿åã¨ãã¼ã¿æ§é
- ES6 In Depth: Symbols (hacks.mozilla.org, 2015)