ãªãã¸ã§ã¯ããå ç® obj1 + obj2ãæ¸ç® obj1 - obj2, ã¾ã㯠alert(obj) ã使ã£ã¦åºåãããã¨ããä½ãèµ·ããã§ãããï¼
ãã®å ´åããªãã¸ã§ã¯ãã¯ããªããã£ãã¸èªå夿ããããã®å¾æ¼ç®ãè¡ããã¾ãã
ãã£ãã¿ã¼ å夿 ã§ã¯ãããªããã£ããªæ°å¤ãæååãçå½å¤å¤æã®ã«ã¼ã«ãè¦ã¦ãã¾ããããããã¾ã ãªãã¸ã§ã¯ããæ®ã£ã¦ãã¾ããããã¾ã§ã®ãã¥ã¼ããªã¢ã«ã§ã¡ã½ããã¨ã·ã³ãã«ã«ã¤ãã¦å¦ãã ã®ã§ãä»ãªãããããçè§£ãããã¨ãã§ãã¾ãã
- ãã¹ã¦ã®ãªãã¸ã§ã¯ãã¯çå½å¤ã®ã³ã³ããã¹ãã§ã¯
trueã§ããæååã¨æ°å¤å¤æã ãã§ãã - æ°å¤å¤æã¯ããªãã¸ã§ã¯ããæ¸ç®ãããæ°å¦çãªé¢æ°ãé©ç¨ããæã«çºçãã¾ããä¾ãã°
Dateãªãã¸ã§ã¯ã(ãã£ãã¿ã¼ æ¥ä» 㨠æå» ã§èª¬æããã¦ãã¾ã)ã¯æ¸ç®ãããã¨ãã§ããdate1 - date2ã®çµæã¯2ã¤ã®æ¥ä»éã®æéå·®ã«ãªãã¾ãã - æåå夿ã¯ãé常
alert(obj)ã®ããã«ãªãã¸ã§ã¯ããåºåããããä¼¼ããããªã³ã³ããã¹ãã®ã¨ãã«èµ·ããã¾ãã
ToPrimitive
ç¹å¥ãªãªãã¸ã§ã¯ãã¡ã½ããã使ã£ã¦æååãæ°å¤ãã調æ´ãããã¨ãã§ãã¾ãã
仿§ã«è¨è¼ããã¦ããå夿ã«ã¯ãâhint(ãã³ã)â ã¨å¼ã°ãããï¼ã¤ã®ããªã¨ã¼ã·ã§ã³ãããã¾ãã
"string"-
æä½ã
alertã®ããã«æååãæå¾ ããã¨ãããªãã¸ã§ã¯ãããæååã¸ã®å¤æããã¾ã:// åºå alert(obj); // ããããã£ãã¼ã¨ãã¦ãªãã¸ã§ã¯ãã使ã anotherObj[obj] = 123; "number"-
æä½ãæ°å¦ã®ããã«æ°å¤ãæå¾ ããã¨ãããªãã¸ã§ã¯ãããæ°å¤ã¸ã®å¤æããã¾ã:
// æç¤ºçãªå¤æ let num = Number(obj); // ç®è¡ (äºé æ¼ç®åãã©ã¹ãé¤ã) let n = +obj; // åé æ¼ç®åãã©ã¹ let delta = date1 - date2; // 大ãªãå°ãªãæ¯è¼ let greater = user1 > user2; "default"-
æä½ãã©ããªåãæå¾ ãã¦ããã âããããããªãâ ãããªã¬ã¢ã±ã¼ã¹ã§èµ·ããã¾ã
ä¾ãã°ãäºé æ¼ç®å
+ã¯æåå(ãããã®é£çµ)ã¨æ°å¤(ãããã®å ç®)両æ¹ã§åä½ããã®ã§ãæååã¨æ°å¤ã®ä¸¡æ¹ã®å ´åããããã¾ãããªã®ã§ãäºé æ¼ç®åã弿°ã«ãªãã¸ã§ã¯ããæ¸¡ãããå ´åã夿ã«ã¯"default"ãã³ãã使ç¨ãã¾ããã¾ãããªãã¸ã§ã¯ãã
==ã使ç¨ãã¦ãæååãæ°å¤ã¾ãã¯ã·ã³ãã«ã¨æ¯è¼ãããã¨ãã§ãããããã©ã®å¤æããã¹ãã䏿çãªã®ã§ã"default"ãã³ããå©ç¨ããã¾ãã// äºé æ¼ç®å "default" ãã³ããä½¿ç¨ let total = obj1 + obj2; // obj == æ°å¤ã¯ "default" ãã³ããä½¿ç¨ if (user == 1) { ... };<,>ã®ãããªã大ãªã/å°ãªãæ¼ç®åãã¾ãæååã¨æ°å両æ¹ãæ±ããã¨ãã§ãã¾ããããã㯠âdefaultâ ã§ã¯ãªã ânumberâ ã使ãã¾ããããã¯æ´å²çãªçç±ã«ãããã®ã§ãããã ãå®éã«ã¯ãããã®è©³ç´°ãè¦ãã¦ããå¿ è¦ã¯ããã¾ããã1ã¤ã®ã±ã¼ã¹(
Dateãªãã¸ã§ã¯ãã®å ´åã§ããå¾ã»ã©å¦ã³ã¾ã)ãé¤ããã¹ã¦ã®çµã¿è¾¼ã¿ãªãã¸ã§ã¯ãã¯"number"ã¨"default"夿ã¯åãæ¹æ³ã§å®è£ ããã¦ãã¾ããããã¦ãæããç§ãã¡ãåãããã«ããã¹ãã§ãã
"boolean" ãã³ãçæãã¦ãã ãã â ãã³ãï¼ã¤ã ãã§ãããããã¯ã·ã³ãã«ã§ãã
âçå½å¤â ãã³ãã¯ããã¾ãã(çå½å¤ã®ã³ã³ããã¹ãã«ããã¦ã¯ããã¹ã¦ã®ãªãã¸ã§ã¯ã㯠true ã§ã)ãããã¦ãã»ã¨ãã©ã®çµã¿è¾¼ã¿ã®ããã«ã"default" 㨠"number" ãåãããã«æ±ãã¨ã夿ã¯2ã¤ããããã¾ããã
夿ãããããã«ãJavaScriptã¯3ã¤ã®ãªãã¸ã§ã¯ãã®ã¡ã½ãããè¦ã¤ãå¼ã³åºããã¨ãã¾ãã
- ã¡ã½ãããåå¨ããå ´åã
obj[Symbol.toPrimitive](hint)ãå¼ã³åºãã¾ã - ãªãå ´åãhint ã
"string"ã§ããã°obj.toString()ã¨obj.valueOf()ã試ãã¾ãã
- ããã§ãªããhint ã
"number"ã§ããã°obj.valueOf()ã¨obj.toString()ã試ãã¾ãã
Symbol.toPrimitive
æåã®ã¡ã½ããããå§ãã¦ã¿ã¾ããããSymbol.toPrimitive ã¨ããååã®çµã¿è¾¼ã¿ã·ã³ãã«ãããã¾ãããã®ã·ã³ãã«ã¯ã次ã®ããã«å¤æã¡ã½ããã®ååã¨ãã¦ä½¿ç¨ãã¾ãã
obj[Symbol.toPrimitive] = function(hint) {
// ããªããã£ããªå¤ãè¿å´
// hint = "string", "number", "default" ã®ã©ãã
}
ä¾ãã°ããã㯠Symbol.toPrimitive ãå®è£
ãã user ãªãã¸ã§ã¯ãã§ã:
let user = {
name: "John",
money: 1000,
[Symbol.toPrimitive](hint) {
alert(`hint: ${hint}`);
return hint == "string" ? `{name: "${this.name}"}` : this.money;
}
};
// 夿åä½ã®ç¢ºèª:
alert(user); // hint: string -> {name: "John"}
alert(+user); // hint: number -> 1000
alert(user + 500); // hint: default -> 1500
ã³ã¼ãããåããããã«ãuser ã¯å¤æã«å¿ãã¦ãæååã¾ãã¯éé¡ã«ãªãã¾ãã1ã¤ã®ã¡ã½ãã user[Symbol.toPrimitive] ããã¹ã¦ã®å¤æã±ã¼ã¹ãæ±ã£ã¦ãã¾ãã
toString/valueOf
ã¡ã½ãã toString 㨠valueOf ã¯ãã£ã¨æããããã¾ãããããã¯ã·ã³ãã«ã§ã¯ãªã(ã·ã³ãã«ã¯ä»¥åã«ã¯åå¨ãã¾ããã§ãã)ããâé常ã®â æååã§ååä»ããããã¡ã½ããã§ãããããã¯å¤æãè¡ãããã®ä»£æ¿ã® âå¤ãããæ¹â ãæä¾ãã¾ãã
Symbol.toPrimitive ããªãå ´åãJavaScriptã¯ããããè¦ã¤ããæ¬¡ã®é ã§ãã©ã¤ãã¾ã:
toString -> valueOfâstringâ hint ã®å ´åvalueOf -> toStringããã§ãªãå ´å
ãããã®ã¡ã½ããã¯ããªããã£ããè¿å´ããå¿
è¦ãããã¾ããtoString ããã㯠valueOf ããªãã¸ã§ã¯ããè¿ãå ´åãç¡è¦ããã¾ãï¼ã¡ã½ããããªãå ´åã¨åãï¼ã
ããã©ã«ãã§ã¯ãé常ã®ãªãã¸ã§ã¯ãã¯æ¬¡ã® toString 㨠valueOf ã¡ã½ãããæã£ã¦ãã¾ãã:
- æåå
"[object Object]"ãè¿å´ããtoStringã¡ã½ãã - ãªãã¸ã§ã¯ãèªèº«ãè¿å´ãã
valueOfã¡ã½ãã
ããã¯ãã®ãã¢ã§ãã:
let user = {name: "John"};
alert(user); // [object Object]
alert(user.valueOf() === user); // true
ãã®ãããalert ãªã©ã§ãªãã¸ã§ã¯ããæååã¨ãã¦ä½¿ç¨ã試ã¿ãå ´åãããã©ã«ãã§ã¯ [object Object] ã表示ããã¾ãã
ããã¦ãããã©ã«ãã® valueOf ã¯ãæ··ä¹±ãé¿ããããã«ãå®å
¨ãæããããã«ããã§è¨åãã¦ãã¾ããã覧ã®éãããªãã¸ã§ã¯ãèªä½ãè¿ãããç¡è¦ããã¾ããããã¯æ´å²çãªçç±ã«ãããã®ã§ãããããã£ã¦ãåå¨ããªããã®ã¨æ³å®ã§ãã¾ãã
ãããã®ã¡ã½ãããå®è£ ãã¦ã¿ã¾ãããã
ä¾ãã°ãããã§ user 㯠Symbol.toPrimitive ã®ä»£ããã«ãtoString 㨠valueOf ã使ã£ã¦ä¸ã¨åããã¨ããã¦ãã¾ã:
let user = {
name: "John",
money: 1000,
// hint="string" ã®å ´å
toString() {
return `{name: "${this.name}"}`;
},
// hint="number" or "default" ã®å ´å
valueOf() {
return this.money;
}
};
alert(user); // toString -> {name: "John"}
alert(+user); // valueOf -> 1000
alert(user + 500); // valueOf -> 1500
ã覧ã®éããæ¯ãèã㯠Symbol.toPrimitive ã®ä¾ã¨åãã§ãã
å¤ãã®å ´åããã¹ã¦ã®ããªããã£ã夿ãå¦çã§ãã âããããç¶æ³ã«å¯¾å¿ã§ããå ´æâ ãå¿
è¦ã§ãã ãã®å ´åãæ¬¡ã®ããã« toString ãå®è£
ããã ãã§å®ç¾ã§ãã¾ã:
let user = {
name: "John",
toString() {
return this.name;
}
};
alert(user); // toString -> John
alert(user + 500); // toString -> John500
Symbol.toPrimitiveã¨valueOf ããªããã°ã toString ã¯ãã¹ã¦ã®ããªããã£ãå¤æãæ±ãã¾ãã
è¿å´ãããå
ãã¹ã¦ã®ããªããã£ã夿ã®ã¡ã½ããã«ã¤ãã¦ç¥ã£ã¦ããã¹ãéè¦ãªãã¨ã¯ãããããå¿ ããã âãã³ãâ ããªããã£ããè¿ãã¨ã¯éããªããã¨ã§ãã
toString ãæ£ç¢ºã«æååãè¿ããã©ããããããã¯ãSymbol.toPrimitive ã¡ã½ããã "number" ãã³ãã®æ°å¤ãè¿ããã©ãããå¶å¾¡ãããã¨ã¯ã§ãã¾ããã
å¯ä¸ã®å¿ é äºé ã¯ããããã®ã¡ã½ããã¯ãªãã¸ã§ã¯ãã§ã¯ãªãããªããã£ããè¿ãå¿ è¦ãããã¨ãããã¨ã§ãã
æ´å²çãªçç±ã§ããã toString ããã㯠valueOf ããªãã¸ã§ã¯ããè¿ããå ´åãã¨ã©ã¼ã«ã¯ãªãã¾ããããã®ãªãã¸ã§ã¯ãã¯ç¡è¦ããã¾ã(ã¡ã½ãããåå¨ããªãã£ããã®ããã«)ããã㯠JavaScript ã«ããã¦ãæã®ãããªã âã¨ã©ã¼â ã«å¯¾ããèãæ¹ã§ãã
対ç
§çã«ãSymbol.toPrimitive ã¯ããªããã£ãã è¿ããªããã°ããã¾ãããããã§ãªããã°ã¨ã©ã¼ã«ãªãã¾ãã
ãããªã夿
æ¢ã«ãåãã®éããå¤ãã®æ¼ç®åã¨é¢æ°ã¯å夿ãè¡ãã¾ããä¾ãã°ä¹ç® * ã¯ãªãã©ã³ããæ°å¤ã«å¤æãã¾ãã
弿°ã«ãªãã¸ã§ã¯ããæ¸¡ãå ´åãï¼ã¤ã®ã¹ãã¼ã¸ãããã¾ã:
- ãªãã¸ã§ã¯ãã¯ããªããã£ãã«å¤æããã¾ãï¼ä¸ã§è¨è¼ããã«ã¼ã«ã«ããï¼
- çµæã®ããªããã£ããæ£ããåã§ã¯ãªãå ´åã夿ããã¾ãã
ä¾:
let obj = {
// toString ã¯ä»ã®ã¡ã½ããããªãå ´åã«ãã¹ã¦ã®å¤æãå¦çãã¾ãã
toString() {
return "2";
}
};
alert(obj * 2); // 4, ToPrimitive 㯠"2" ãä¸ããã®ã§, 2 ã«ãªãã¾ã
- ä¹ç®
obj * 2ã¯æåã«ãªãã¸ã§ã¯ããããªããã£ãã«å¤æãã¾ãï¼æååã®"2"ï¼ "2" * 2ã¯2 * 2ã«ãªãã¾ãï¼æååãæ°å¤ã«å¤æããã¾ãï¼
äºé æ¼ç®åãã©ã¹ã¯åãç¶æ³ã§æååã飿ºãã¾ãã:
let obj = {
toString() {
return "2";
}
};
alert(obj + 2); // 22 (ToPrimitive ã¯æååãè¿ãã¾ã => é£çµ)
ãµããª
ãªãã¸ã§ã¯ãããããªããã£ãã¸ã®å¤æã¯ãå¤ã¨ãã¦ããªããã£ããæå¾ ãã¦ããå¤ãã®çµã¿è¾¼ã¿ã®é¢æ°ããæä½ã«ãã£ã¦èªåçã«å¼ã³åºããã¾ãã
3ã¤ã®ã¿ã¤ã (hint)ãããã¾ã:
"string"(alertããä»ã®æåå夿ã®ãã)"number"(ç®è¡æ¼ç®ã®ãã)"default"(ã»ã¨ãã©ããã¾ãã)
仿§ã¯ãã©ã®æä½ãã©ã® hint ã使ç¨ããããæç¤ºçã«èª¬æãã¦ãã¾ãã âæå¾
ãããã®ãããããªãâ æ¼ç®åã¯ã»ã¨ãã©ãªãããã®å ´å㯠âdefaultâ ã®ãã³ãã使ç¨ãã¾ãã é常ãçµã¿è¾¼ã¿ãªãã¸ã§ã¯ãã®å ´åã "default" ãã³ã㯠"number" ã¨åãããã«æ±ãããã®ã§ãæå¾ã®2ã¤ã¯ããä¸ç·ã«ããã¾ãã
夿ã®ã¢ã«ã´ãªãºã ã¯:
- ã¡ã½ãããåå¨ããå ´åã
obj[Symbol.toPrimitive](hint)ãå¼ã³åºãã¾ã - ãªãå ´åã¯ãhint ã
"string"ã§ããã°obj.toString()ã¨obj.valueOf()ã試ãã¾ãã
- ããã§ãªãå ´åãhint ã
"number"ã§ããã°obj.valueOf()ã¨obj.toString()ã試ãã¾ãã
å®éã«ããã®ã³ã°ããããã°ç®çã§ â人éãèªããâ ãªãã¸ã§ã¯ãã®è¡¨ç¾ãè¿ããããªã âããããç¶æ³ã«å¯¾å¿ã§ããâ ã¡ã½ããã¨ãã¦ã¯ã obj.toString() ã®ã¿ã®å®è£
ã§ååãªãã¨ãå¤ãã§ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã