Symbol.toPrimitive
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2017å¹´4æ.
Symbol.toPrimitive ã¯éçãã¼ã¿ããããã£ã§ãã¦ã§ã«ãã¦ã³ã·ã³ãã«ã® Symbol.toPrimitive ã表ãã¾ãããã¹ã¦ã®å夿ã¢ã«ã´ãªãºã ã«ããã¦ããªãã¸ã§ã¯ãä¸ã§ãã®ã·ã³ãã«ã使ã£ã¦ããã® valueOf() ã toString() ã¡ã½ããã使ç¨ããåã«ãæã¾ããåãåãå
¥ãããªãã¸ã§ã¯ãã®ããªããã£ã表ç¾ãè¿ãã¡ã½ããã調ã¹ã¾ãã
試ãã¦ã¿ã¾ããã
const object = {
[Symbol.toPrimitive](hint) {
if (hint === "number") {
return 42;
}
return null;
},
};
console.log(+object);
// äºæ³ãããçµæ: 42
å¤
ã¦ã§ã«ãã¦ã³ã·ã³ãã« Symbol.toPrimitive ã§ãã
Symbol.toPrimitive ã®ããããã£å±æ§ | |
|---|---|
| æ¸è¾¼å¯è½ | ä¸å¯ |
| åæå¯è½ | ä¸å¯ |
| è¨å®å¯è½ | ä¸å¯ |
解説
Symbol.toPrimitive ããããã£ã«ããï¼é¢æ°å¤ã¨ãã¦ä½¿ç¨ãããã¨ã§ï¼ããªãã¸ã§ã¯ããããªããã£ãå¤ã«å¤æãããã¨ãã§ããããã«ãªãã¾ãã颿°ã¯ãããªããã£ãå¤ã®çµæã¨ãã¦å¥½ã¾ããåãæå®ããæåå弿°ã® hint ã¨ä¸ç·ã«å¼ã³åºããã¾ããhint 弿°ã¯ã "number", "string", "default" ã®ããããã«ãªãã¾ãã
"number" ãã³ãã¯ãæ°å¤å¤æã¢ã«ã´ãªãºã ã§ä½¿ç¨ããã¾ãã"string" ãã³ãã¯ãæåå夿ã¢ã«ã´ãªãºã ã§ä½¿ç¨ããã¾ãã"default" ãã³ãã¯ãããªããã£ã夿ã¢ã«ã´ãªãºã ã§ä½¿ç¨ããã¾ãããã³ãã¯ãåªå
é ä½ã®å¼±ãã·ã°ãã«ã¨ãã¦ã®ã¿æ©è½ããå®è£
ã§ãããç¡è¦ããã®ã¯èªç±ã§ãï¼Symbol.prototype[Symbol.toPrimitive]() ãããã§ããããã«ï¼ã[Symbol.toPrimitive]() ã¯ããªããã£ããè¿ããªããã°ãªãã¾ãããããã§ãªãå ´å㯠TypeError ãçºçãã¾ãã
[Symbol.toPrimitive] ããããã£ãæããªããªãã¸ã§ã¯ãã¯ãvalueOf() ã¡ã½ãã㨠toString() ã¡ã½ãããç°ãªãé åºã§å¼ã³åºããã¨ã§ããªããã£ãã«å¤æããã¾ãããããã«ã¤ãã¦ã¯å夿ã®ç¯ã§è©³ãã説æãã¾ãã[Symbol.toPrimitive]() ã§ã¯ãããªããã£ã夿å¦çãå®å
¨ã«å¶å¾¡ã§ãã¾ããä¾ãã°ãDate.prototype[Symbol.toPrimitive]() ã¯ã"default" ã "string" ã§ãããã®ããã«æ±ãã valueOf() ã®ä»£ããã« toString() ãå¼ã³åºãã¾ããSymbol.prototype[Symbol.toPrimitive]() ã¯ãã³ããç¡è¦ãã常ã«ã·ã³ãã«ãè¿ãã¾ããã¤ã¾ããæååã³ã³ããã¹ãã§ã Symbol.prototype.toString() ã¯å¼ã³åºããããSymbol ãªãã¸ã§ã¯ãã¯å¸¸ã« String() ãä»ãã¦æç¤ºçã«æååã«å¤æããå¿
è¦ãããã¾ãã
ä¾
>ãªãã¸ã§ã¯ããã夿ãããããªããã£ãå¤ã®ä¿®æ£
次ã®ä¾ã¯ Symbol.toPrimitive ããããã£ããªãã¸ã§ã¯ããã夿ãããããªããã£ãå¤ãä¿®æ£ããæ¹æ³ã説æãã¾ãã
// Symbol.toPrimitive ããããã£ãæããªããªãã¸ã§ã¯ãã
const obj1 = {};
console.log(+obj1); // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"
// Symbol.toPrimitive ããããã£ãæã¤ãªãã¸ã§ã¯ãã
const obj2 = {
[Symbol.toPrimitive](hint) {
if (hint === "number") {
return 10;
}
if (hint === "string") {
return "hello";
}
return true;
},
};
console.log(+obj2); // 10 â hint 㯠"number"
console.log(`${obj2}`); // "hello" â hint 㯠"string"
console.log(obj2 + ""); // "true" â hint 㯠"default"
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-symbol.toprimitive> |