Symbol.toPrimitive
åºçº¿
广æ³å¯ç¨
èª 2017å¹´4æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
Symbol.toPrimitive æ¯å
ç½®ç symbol 屿§ï¼å
¶æå®äºä¸ç§æ¥åé¦éç±»åå¹¶è¿å对象åå§å¼çè¡¨ç¤ºçæ¹æ³ãå®è¢«ææç强类å转æ¢å¶ç®æ³ä¼å
è°ç¨ã
å°è¯ä¸ä¸
const object1 = {
[Symbol.toPrimitive](hint) {
if (hint === "number") {
return 42;
}
return null;
},
};
console.log(+object1);
// Expected output: 42
Symbol.toPrimitive ç屿§ç¹æ§ | |
|---|---|
| å¯å | å¦ |
| 坿䏾 | å¦ |
| å¯é ç½® | å¦ |
æè¿°
å¨ Symbol.toPrimitive 屿§ï¼ç¨ä½å½æ°å¼ï¼ç帮å©ä¸ï¼å¯¹è±¡å¯ä»¥è½¬æ¢ä¸ºä¸ä¸ªåå§å¼ãè¯¥å½æ°è¢«è°ç¨æ¶ï¼ä¼è¢«ä¼ éä¸ä¸ªåç¬¦ä¸²åæ° hintï¼è¡¨ç¤ºè¦è½¬æ¢å°çåå§å¼çé¢æç±»åãhint åæ°çå弿¯ "number"ã"string" å "default" ä¸çä»»æä¸ä¸ªã
"number" hint ç¨äºå¼ºå¶æ°åç±»å转æ¢ç®æ³ã"string" hint ç¨äºå¼ºå¶å符串类å转æ¢ç®æ³ã"default" hint ç¨äºå¼ºå¶åå§å¼è½¬æ¢ç®æ³ãhint ä»
æ¯ä½ä¸ºé¦é项çåå¼±çä¿¡å·æç¤ºï¼å®ç°æ¶ï¼å¯ä»¥èªç±å¿½ç¥å®ï¼å°±å Symbol.prototype[Symbol.toPrimitive]() 䏿 ·ï¼ã该è¯è¨ä¸ä¼å¨ hint åç»æç±»åä¹é´å¼ºå¶æ ¡æ£ï¼å°½ç®¡ [Symbol.toPrimitive]() å¿
é¡»è¿åä¸ä¸ªåå§å¼ï¼å¦åå°æåº TypeErrorã
没æ Symbol.toPrimitive 屿§ç对象éè¿ä»¥ä¸åç顺åºè°ç¨ valueOf() å toString() æ¹æ³å°å
¶è½¬æ¢ä¸ºåå§å¼ï¼è¿å¨å¼ºå¶ç±»å转æ¢é¨åè¿è¡äºæ´è¯¦ç»çè§£éãSymbol.toPrimitive å
许å®å
¨æ§å¶åå§è½¬æ¢è¿ç¨ãä¾å¦ï¼Date.prototype[Symbol.toPrimitive] å° "default" è§ä¸º "string" å¹¶ä¸è°ç¨ toString() è䏿¯ valueOf()ãSymbol.prototype[Symbol.toPrimitive] å¿½ç¥ hintï¼å¹¶æ»æ¯è¿åä¸ä¸ª symbolï¼è¿æå³çå³ä½¿å¨å符串ä¸ä¸æä¸ï¼ä¹ä¸ä¼è°ç¨ 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"
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-symbol.toprimitive> |