ãªãã·ã§ãã«ãã§ã¤ãã³ã° ?. ã¯ä¸éã®ããããã£ãåå¨ããªãå ´åã§ãããã¹ãããããªãã¸ã§ã¯ãããããã£ã¸ã¢ã¯ã»ã¹ããããã®å®å
¨ãªæ¹æ³ã§ãã
âåå¨ããªãããããã£â åé¡
ãã¥ã¼ããªã¢ã«ãèªãã§ JavaScript ãå¦ã³å§ããã°ããã§ããã°ãã¾ã ééãã¦ããªããããã¾ãããããã®åé¡ã¯é常ã«ä¸è¬çãªãã¨ã§ãã
ä¾ãã°ãã¦ã¼ã¶ã«é¢ããæ
å ±ããã£ã¦ãã user ãªãã¸ã§ã¯ããããã¨ãã¾ãããã
ã»ã¨ãã©ã®ã¦ã¼ã¶ã¯ user.address ããããã£ã«ä½æããuser.address.street ã«éããæã£ã¦ãã¾ãããä¸ã«ã¯ä½æãæå®ãã¦ããªãã¦ã¼ã¶ããã¾ãã
ãã®ãããªã¦ã¼ã¶ã使ãæã£ã¦ããªãã±ã¼ã¹ã§ã¯ãuser.address.street ãåå¾ãããã¨ããå ´åã«ãã¨ã©ã¼ãçºçãã¾ã:
let user = {}; // ã¦ã¼ã¶ããã¾ãã¾ä½æ(address)ããã£ã¦ããªã
alert(user.address.street); // Error!
ããã¯äºæããçµæã§ããJavaScript ã¯ãã®ãããªåä½ããã¾ããuser.address 㯠undefined ãªã®ã§ãuser.address.street ã®åå¾ã¯ã¨ã©ã¼ã§å¤±æãã¾ãã
å¤ãã®å®ç¨çãªã±ã¼ã¹ã§ã¯ããã®å ´é¢ã§ã¯ã¨ã©ã¼ãçºçããã®ã§ã¯ãªãããéãããªããã¨ãããã¨ãæå³ãã undeinfed ãåå¾ããããã¨ã好ã¾ããã§ãããã
â¦ã¾ããããï¼ã¤ã®ä¾ã§ããWeb éçºã§ã¯ document.querySelector('.elem') ã®ãããªç¹å¥ãªã¡ã½ããå¼ã³åºãã«ãããWeb ãã¼ã¸ã®è¦ç´ ã«å¯¾å¿ãããªãã¸ã§ã¯ããåå¾ãããã¨ãã§ãã¾ããããã®ãããªè¦ç´ ããªãå ´åã«ã¯ null ãè¿ããã¾ãã
// querySelector(...) ã®çµæã null ãªãã¨ã©ã¼
let html = document.querySelector('.my-element').innerHTML;
ç¹°ãè¿ãã«ãªãã¾ãããè¦ç´ ãåå¨ããªãå ´åãnull ã¸ã® .innerHTML ã¢ã¯ã»ã¹ã¯ã¨ã©ã¼ã«ãªãã¾ããã¾ããè¦ç´ ããªããã¨ãæ£å¸¸ã§ããå ´åã¯ã¨ã©ã¼ãé¿ãã html = null ã¨ããçµæãåãå
¥ãããå ´åãããã¾ãã
ã©ãããã°ããã§ããããï¼
æç½ãªè§£æ±ºçã¯ã次ã®ããã«ãã®ããããã£ã«ã¢ã¯ã»ã¹ããåã«ãif ãããã¯æ¡ä»¶æ¼ç®å ? ã使ç¨ãã¦å¤ã確èªãããã¨ã§ãããã
let user = {};
alert(user.address ? user.address.street : undefined);
ããã¯ã¨ã©ã¼ãªãæ©è½ãã¾ãããã¾ã£ããã¨ã¬ã¬ã³ãã§ã¯ããã¾ãããã覧ã®éãã"user.address" ãã³ã¼ãã«2åç»å ´ãã¾ããæ·±ããã¹ããããããããã£ã§ã¯ãããå¤ãã®ç¹°ãè¿ããå¿
è¦ã«ãªãã¨ããåé¡ãå¼ãèµ·ããã¾ãã
ä¾. user.address.street.name ãåå¾ãã¦ã¿ã¾ãããã
user.address 㨠user.address.street 両æ¹ã®ãã§ãã¯ãå¿
è¦ã§ãã
let user = {}; // user 㯠address ãæã£ã¦ãã¾ããã
alert(user.address ? user.address.street ? user.address.street.name : null : null);
ããã¯ã²ã©ãã§ããããã®ãããªã³ã¼ãã¯çè§£ã«è¦ããããããã¾ããã
&& æ¼ç®åã使ç¨ãããã¨ã§ãããããæ¸ãæ¹ããããã¨ãã§ãã¾ãã
let user = {}; // user 㯠address ãæã£ã¦ãã¾ãã
alert( user.address && user.address.street && user.address.street.name ); // undefined (ã¨ã©ã¼ã¯èµ·ãã¾ãã)
ããããã£ã¸ã®ãã¹å ¨ä½ã AND ãããã¨ã§ããã¹ã¦ã®ã³ã³ãã¼ãã³ãã確å®ã«åå¨ãããã¨ãä¿è¨¼ããã¾ãã(åå¨ããªãå ´åã¯è©ä¾¡ã忢ããã¾ã)ãçæ³çã§ã¯ããã¾ããã
ã覧ã®éããããããã£åã¯ä¾ç¶ã¨ãã¦ã³ã¼ãã®ä¸ã§éè¤ãã¦ãã¾ããä¾ãã°ãä¸ã®ã³ã¼ãã§ããã° user.address ã3åç»å ´ãã¾ãã
ããããªãã·ã§ãã«ãã§ã¤ãã³ã° ?. ãè¨èªã«è¿½å ãããçç±ã§ãããã®åé¡ãå®å
¨ã«è§£æ±ºããããã«ã
ãªãã·ã§ãã«ãã§ã¤ãã³ã°
ãªãã·ã§ãã«ãã§ã¤ãã³ã° ?. ã¯ã?. ã®åã®é¨åã undefined ããã㯠null ã§ããã°æ¤æ»ãã¹ãããããundefined ãè¿ãã¾ãã
ãã®è¨äºã§ã¯ããã«ãç°¡æ½ãªè¡¨ç¾ã¨ãã¦ãnull ã§ã undefined ã§ããªãå ´åã«ã¯ããªã«ãã âåå¨â ãããã¨è¿°ã¹ã¦ãã¾ã
ã¤ã¾ããvalue?.prop ã¯:
value.propã¨ãã¦åä½ãã¾ãï¼valueãåå¨ããå ´åï¼- ããã§ãªãå ´åï¼
valueãundefined/nullï¼ã¯ãundefinedãè¿ãã¾ãã
?. ã使ç¨ã㦠user.address.street ã«å®å
¨ã«ã¢ã¯ã»ã¹ããæ¹æ³ã¯æ¬¡ã®éãã§ã:
let user = {}; // ã¦ã¼ã¶ã¯ address ãæããªã
alert( user?.address?.street ); // undefined (ã¨ã©ã¼ã¯èµ·ãã¾ãã)
ã³ã¼ãã¯çãç°¡æ½ã«ãªããéè¤ãããã¾ããã
ãã¨ã user ãªãã¸ã§ã¯ããåå¨ããªãã¦ããuser?.address ã® address ã®èªã¿åãã¯åä½ãã¾ã:
let user = null;
alert( user?.address ); // undefined
alert( user?.address.street ); // undefined
?. æ§æã¯ãã®åã®å¤ããªãã·ã§ãã«ã«ãã¾ããããã以ä¸ã®ãã¨ã¯ããªããã¨ã«æ³¨æãã¦ãã ããã
ä¾ãã°ãuser?.address.street.name ã® ?. ã«ãã user ãå®å
¨ã« null/undefined ã«ãããã¨ãã§ãã¾ãï¼ããã¦ããã®ã±ã¼ã¹ã§ã¯ undefined ãè¿ãã¾ãï¼ãããã㯠user ã«å¯¾ãã¦ã®ã¿ã§ãããã®ä»ã®ããããã£ã¯éå¸¸ã®æ¹æ³ã§ã¢ã¯ã»ã¹ããã¾ããä»ã®ããããã£ããªãã·ã§ãã«ã«ãããå ´åã¯ãããã« . ã ?. ã«ç½®ãæããå¿
è¦ãããã¾ãã
ä½ããåå¨ããªãã¦ãOKãªå ´åã«ã®ã¿ã?. ã使ç¨ãã¦ãã ããã
ä¾ãã°ãã³ã¼ãã®ãã¸ãã¯ã¨ã㦠user ãªãã¸ã§ã¯ãã¯å¿
é ã§ãããã®ã®ãaddress ããªãã·ã§ã³ã§ããå ´åãuser.address?.street ã¨æ¸ãã¹ãã§ãããã
ãããã£ã¦ãããã°ã©ã ãã¹ã«ãã user ãæªå®ç¾©ã¨ãªã£ãå ´åã¯ãããã«é¢ããããã°ã©ãã³ã°ã¨ã©ã¼ã確èªããä¿®æ£ãã¾ããããããã«ä¸ç¨æã« ?. ãå©ç¨ããã¨ãã³ã¼ãã£ã³ã°ã¨ã©ã¼ãé©åã§ãªãã¨ãã«æ²é»ãããããã°ãå°é£ã«ãªãå¯è½æ§ãããã¾ãã
?. ã®åã®å¤æ°ã¯å®ç¾©ããã¦ããªããã°ãªãã¾ããuser 夿°ãæªå®ç¾©ã®å ´åãuser?.anything ã¯ã¨ã©ã¼ã«ãªãã¾ã:
// ReferenceError: user is not defined
user?.address;
夿°ã¯å®£è¨ããã¦ããªããã°ãªãã¾ããï¼let/const/var user ã¾ãã¯é¢æ°ã®ãã©ã¡ã¼ã¿ã¨ãã¦ï¼ããªãã·ã§ãã«ãã§ã¤ãã³ã°ã¯ãå®£è¨æ¸ã¿ã®å¤æ°ã«å¯¾ãã¦ã®ã¿æ©è½ãã¾ãã
ç絡è©ä¾¡
åã«è¿°ã¹ãããã«ã?. ã¯å·¦é¨åãåå¨ããªãå ´åã«ã¯ãå³åº§ã«è©ä¾¡ã忢(âshort-circuitsâ)ãã¾ãã
ãããã£ã¦ãããã«ãªãããã®é¢æ°å¼ã³åºããå¯ä½ç¨ããã£ã¦ãçºçãã¾ããã
ä¾:
let user = null;
let x = 0;
user?.sayHi(x++); // ä½ãèµ·ãã¾ãã
alert(x); // 0, å¤ã¯ã¤ã³ã¯ãªã¡ã³ãããã¦ãã¾ããã
ä»ã®ã±ã¼ã¹: ?.(), ?.[]
ãªãã·ã§ãã«ãã§ã¤ãã³ã° ?. ã¯æ¼ç®åã§ã¯ãªããç¹å¥ãªæ§ææ§é ã§ããã颿°ãæ¬å¼§ã¨ä¸ç·ã§ãæ©è½ãã¾ãã
ä¾ãã°ã?.() ã¯åå¨ããªãå¯è½æ§ã®ãã颿°ãå¼ã³åºãã¨ãã«ä½¿ç¨ããã¾ãã
以ä¸ã®ã³ã¼ãã§ã¯ãã¦ã¼ã¶ã«ãã£ã¦ admin ã¡ã½ãããããå ´åã¨ãªãå ´åãããã¾ã:
let userAdmin = {
admin() {
alert("I am admin");
}
};
let userGuest = {};
userAdmin.admin?.(); // I am admin
userGuest.admin?.(); // ãªã«ãããªã (ãã®ãããªã¡ã½ããã¯ããã¾ãã)
ããã§ã¯ã両æ¹ã®è¡ã§æåã«ããã . ã使ç¨ã㦠admin ããããã£ãåå¾ãã¦ãã¾ããã¦ã¼ã¶ãªãã¸ã§ã¯ãã¯å¿
é ã§ãããããããã¯å®å
¨ã«èªã¿åããã¨ãã§ããããã§ãã
次ã«ã?.() ã§å·¦é¨åããã§ãã¯ãã¾ã: admin 颿°ãåå¨ããå ´åã¯å®è¡ãã¾ã(user1 ã®å ´å)ãããã§ãªããã°(user2 ã®å ´å)ãè©ä¾¡ã¯ã¨ã©ã¼ãªãã§åæ¢ãã¾ãã
ããã . ã®ä»£ããã«æ¬å¼§ [] ã使ç¨ãã¦ããããã£ã«ã¢ã¯ã»ã¹ãããå ´åã«ãã?.[] æ§æã¯æ©è½ãã¾ããåã®ã±ã¼ã¹åæ§ãåå¨ããªãå¯è½æ§ã®ãããªãã¸ã§ã¯ãããå®å
¨ã«ããããã£ãèªã¿åããã¨ãã§ãã¾ãã
let key = "firstName";
let user1 = {
firstName: "John"
};
let user2 = null;
alert( user1?.[key] ); // John
alert( user2?.[key] ); // undefined
delete ã¨ä¸ç·ã« ?. ã使ç¨ãããã¨ãã§ãã¾ã:
delete user?.name; // user ãåå¨ããå ´åã user.name ãåé¤ãã¾ã
?. ã使ç¨ãã¦ãèªã¿åãã¨åé¤ãå®å
¨ã«è¡ããã¨ãã§ãã¾ãããæ¸ãè¾¼ã¿ã¯ã§ãã¾ãããªãã·ã§ãã«ãã§ã¤ãã³ã° ?. ã¯ä»£å
¥ã®å·¦å´ã§ã¯ä½¿ç¨ã§ãã¾ããã
ä¾:
// 以ä¸ã®ã³ã¼ãã¯ãã¦ã¼ã¶ãåå¨ããå ´åã« user.name ãæ¸ãè¾¼ããã¨ãããã®ã§ã
user?.name = "John"; // ã¨ã©ã¼ãåä½ãã¾ãã
// undefined = "John" ã¨è©ä¾¡ãããããã§ã
ãµããª
?. æ§æã«ã¯3ã¤ã®å½¢å¼ãããã¾ã:
obj?.propâobjãåå¨ããå ´åãobj.propãè¿ãã¾ããããã§ãªãå ´åã¯undefinedã§ããobj?.[prop]âobjãåå¨ããå ´åãobj[prop]ãè¿ãã¾ããããã§ãªãå ´åã¯undefinedã§ããobj?.method()âobjãåå¨ããå ´åãobj.method()ãå¼ã³åºãã¾ããããã§ãªãå ´åã¯undefinedãè¿ãã¾ãã
è¦ã¦ã®éããã©ããç´ ç´ã§ä½¿ãããããã®ã°ããã§ãã?. ã¯ãå·¦å´ã®é¨åã null/undefined ãã©ããããã§ãã¯ããããã§ãªãå ´åã¯è©ä¾¡ãç¶è¡ã§ããããã«ãã¾ãã
?. ã®ãã§ã¤ã³ã«ããããã¹ããããããããã£ã«å®å
¨ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
ããã§ãã£ã¦ããå·¦å´ã®é¨åãåå¨ããªããã¨ã許容ãããå ´åã«ã®ã¿ãæ
éã« ?. ãé©ç¨ããå¿
è¦ãããã¾ããããã°ã©ãã³ã°ã¨ã©ã¼ãèµ·ãã£ãå ´åã«ããããé ãã¦ãã¾ããªãããã«ããããã§ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã