å¯éé¾ ?. æ¯ä¸ç§è®¿é®åµå¥å¯¹è±¡å±æ§çå®å
¨çæ¹å¼ãå³ä½¿ä¸é´ç屿§ä¸åå¨ï¼ä¹ä¸ä¼åºç°é误ã
âä¸åå¨ç屿§âçé®é¢
å¦æä½ æåå¼å§è¯»æ¤æç¨å¹¶å¦ä¹ JavaScriptï¼é£å¯è½è¿æ²¡æ¥è§¦å°è¿ä¸ªé®é¢ï¼ä½å®å´ç¸å½å¸¸è§ã
举个ä¾åï¼å设æä»¬æå¾å¤ä¸ª user 对象ï¼å
¶ä¸åå¨äºæä»¬çç¨æ·æ°æ®ã
æä»¬å¤§å¤æ°ç¨æ·çå°åé½åå¨å¨ user.address ä¸ï¼è¡éå°ååå¨å¨ user.address.street ä¸ï¼ä½æäºç¨æ·æ²¡ææä¾è¿äºä¿¡æ¯ã
å¨è¿ç§æ
åµä¸ï¼å½æä»¬å°è¯è·å user.address.streetï¼èè¯¥ç¨æ·æ°å¥½æ²¡æä¾å°åä¿¡æ¯ï¼æä»¬å伿¶å°ä¸ä¸ªé误ï¼
let user = {}; // ä¸ä¸ªæ²¡æ "address" 屿§ç user 对象
alert(user.address.street); // Error!
è¿æ¯é¢æçç»æãJavaScript çå·¥ä½åçå°±æ¯è¿æ ·çãå 为 user.address 为 undefinedï¼å°è¯è¯»å user.address.street ä¼å¤±è´¥ï¼å¹¶æ¶å°ä¸ä¸ªé误ã
使¯å¨å¾å¤å®é
åºæ¯ä¸ï¼æä»¬æ´å¸æå¾å°çæ¯ undefinedï¼è¡¨ç¤ºæ²¡æ street 屿§ï¼è䏿¯ä¸ä¸ªé误ã
â¦â¦è¿æå¦ä¸ä¸ªä¾åãå¨ Web å¼åä¸ï¼æä»¬å¯ä»¥ä½¿ç¨ç¹æ®çæ¹æ³è°ç¨ï¼ä¾å¦ document.querySelector('.elem')ï¼ä»¥å¯¹è±¡çå½¢å¼è·åä¸ä¸ªç½é¡µå
ç´ ï¼å¦ææ²¡æè¿ç§å¯¹è±¡ï¼åè¿å nullã
// 妿 document.querySelector('.elem') çç»æä¸º nullï¼åè¿éä¸åå¨è¿ä¸ªå
ç´
let html = document.querySelector('.elem').innerHTML; // 妿 document.querySelector('.elem') çç»æä¸º nullï¼åä¼åºç°é误
åæ ·ï¼å¦æè¯¥å
ç´ ä¸åå¨ï¼åè®¿é® null ç .innerHTML 屿§æ¶ä¼æ¥éãå¨æäºæ
åµä¸ï¼å½å
ç´ çç¼ºå¤±æ¯æ²¡é®é¢çæ¶åï¼æä»¬å¸æé¿å
åºç°è¿ç§é误ï¼èæ¯æ¥å html = null ä½ä¸ºç»æã
æä»¬å¦ä½å®ç°è¿ä¸ç¹å¢ï¼
å¯è½æå
æ³å°çæ¹æ¡æ¯å¨è®¿é®è¯¥å¼ç屿§ä¹åï¼ä½¿ç¨ if ææ¡ä»¶è¿ç®ç¬¦ ? 对该å¼è¿è¡æ£æ¥ï¼åè¿æ ·ï¼
let user = {};
alert(user.address ? user.address.street : undefined);
è¿æ ·å¯ä»¥ï¼è¿éå°±ä¸ä¼åºç°é误äºâ¦â¦ä½æ¯ä¸å¤ä¼é
ãå°±åä½ æçå°çï¼"user.address" å¨ä»£ç ä¸åºç°äºä¸¤æ¬¡ã
æä»¬çä¸ä¸ªä»¥ç¸åæ¹å¼è·å document.querySelector çä¾åï¼
let html = document.querySelector('.elem') ? document.querySelector('.elem').innerHTML : null;
æä»¬å¯ä»¥çå°ç¨äºè¿è¡å
ç´ æç´¢ç document.querySelector('.elem') å¨è¿éå®é
ä¸è¢«è°ç¨äºä¸¤æ¬¡ãè¿æ ·ä¸ä¼é
ã
对äºåµå¥å±æ¬¡æ´æ·±ç屿§ï¼ä»£ç ä¼å徿´ä¸ï¼å 为éè¦æ´å¤çéå¤ã
ä¾å¦ï¼è®©æä»¬ä»¥ç¸åçæ¹å¼å°è¯è·å user.address.street.nameã
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ï¼ä¸æ¥éï¼
便¬¡å¯¹æ´æ¡è·¯å¾ä¸ç屿§ä½¿ç¨ä¸è¿ç®è¿è¡å¤æï¼ä»¥ç¡®ä¿ææèç¹æ¯åå¨çï¼å¦æä¸åå¨ï¼ååæ¢è®¡ç®ï¼ï¼ä½ä»ç¶ä¸å¤ä¼é ã
å°±åä½ æçå°çï¼å¨ä»£ç 䏿们ä»ç¶éå¤åäºå¥½å éå¯¹è±¡å±æ§åãä¾å¦å¨ä¸é¢ç代ç ä¸ï¼user.address 被éå¤åäºä¸éã
è¿å°±æ¯ä¸ºä»ä¹å¯éé¾ ?. 被å å
¥å°äº JavaScript è¿é¨ç¼ç¨è¯è¨ä¸ãé£å°±æ¯å½»åºå°è§£å³ä»¥ä¸ææé®é¢ï¼
å¯éé¾
妿å¯éé¾ ?. åé¢çå¼ä¸º undefined æè
nullï¼å®ä¼åæ¢è¿ç®å¹¶è¿å undefinedã
为äºç®æèµ·è§ï¼å¨æ¬ææ¥ä¸æ¥çå
容ä¸ï¼æä»¬ä¼è¯´å¦æä¸ä¸ªå±æ§æ¢ä¸æ¯ null ä¹ä¸æ¯ undefinedï¼é£ä¹å®å°±âåå¨âã
æ¢å¥è¯è¯´ï¼ä¾å¦ value?.propï¼
- 妿
valueåå¨ï¼åç»æä¸value.propç¸åï¼ - å¦åï¼å½
value为undefined/nullæ¶ï¼åè¿åundefinedã
ä¸é¢è¿æ¯ä¸ç§ä½¿ç¨ ?. å®å
¨å°è®¿é® user.address.street çæ¹å¼ï¼
let user = {}; // user 没æ address 屿§
alert( user?.address?.street ); // undefinedï¼ä¸æ¥éï¼
代ç ç®æ´æäºï¼ä¹ä¸ç¨éå¤å好å é屿§åã
è¿éæ¯ä¸ä¸ªç»å document.querySelector 使ç¨ç示ä¾ï¼
let html = document.querySelector('.elem')?.innerHTML; // å¦ææ²¡æç¬¦åçå
ç´ ï¼å为 undefined
å³ä½¿ 对象 user ä¸åå¨ï¼ä½¿ç¨ user?.address æ¥è¯»åå°å乿²¡é®é¢ï¼
let user = null;
alert( user?.address ); // undefined
alert( user?.address.street ); // undefined
请注æï¼?. è¯æ³ä½¿å
¶åé¢çå¼æä¸ºå¯éå¼ï¼ä½ä¸ä¼å¯¹å
¶åé¢çèµ·ä½ç¨ã
ä¾å¦ï¼å¨ user?.address.street.name ä¸ï¼?. å
许 user 为 null/undefinedï¼å¨è¿ç§æ
åµä¸ä¼è¿å undefinedï¼ä¹ä¸ä¼æ¥éï¼ä½è¿ä»
å¯¹äº userãæ´æ·±å±æ¬¡ç屿§æ¯éè¿å¸¸è§æ¹å¼è®¿é®çã妿æä»¬å¸æå®ä»¬ä¸çä¸äºä¹æ¯å¯éçï¼é£ä¹æä»¬éè¦ä½¿ç¨æ´å¤ç ?. æ¥æ¿æ¢ .ã
æä»¬åºè¯¥åªå° ?. 使ç¨å¨ä¸äºä¸è¥¿å¯ä»¥ä¸åå¨çå°æ¹ã
ä¾å¦ï¼å¦ææ ¹æ®æä»¬ç代ç é»è¾ï¼user 对象å¿
é¡»åå¨ï¼ä½ address æ¯å¯éçï¼é£ä¹æä»¬åºè¯¥è¿æ ·å user.address?.streetï¼è䏿¯è¿æ · user?.address?.streetã
é£ä¹ï¼å¦æ user æ°å·§ä¸º undefinedï¼æä»¬ä¼çå°ä¸ä¸ªç¼ç¨é误并修å¤å®ãå¦åï¼å¦ææä»¬æ»¥ç¨ ?.ï¼ä¼å¯¼è´ä»£ç ä¸çé误å¨ä¸åºè¯¥è¢«æ¶é¤çå°æ¹æ¶é¤äºï¼è¿ä¼å¯¼è´è°è¯æ´å å°é¾ã
?. åçåéå¿
须已声æå¦ææªå£°æåé userï¼é£ä¹ user?.anything ä¼è§¦åä¸ä¸ªé误ï¼
// ReferenceError: user is not defined
user?.address;
?. åçåéå¿
须已声æï¼ä¾å¦ let/const/var user æä½ä¸ºä¸ä¸ªå½æ°åæ°ï¼ãå¯éé¾ä»
éç¨äºå·²å£°æçåéã
çè·¯æåº
æ£å¦åé¢æè¯´çï¼å¦æ ?. 左边é¨åä¸åå¨ï¼å°±ä¼ç«å³åæ¢è¿ç®ï¼âçè·¯æåºâï¼ã
å æ¤ï¼å¦æå¨ ?. çå³ä¾§æä»»ä½è¿ä¸æ¥ç彿°è°ç¨ææä½ï¼å®ä»¬åä¸ä¼æ§è¡ã
ä¾å¦ï¼
let user = null;
let x = 0;
user?.sayHi(x++); // 没æ "user"ï¼å æ¤ä»£ç æ§è¡æ²¡æå°è¾¾ sayHi è°ç¨å x++
alert(x); // 0ï¼å¼æ²¡æå¢å
å ¶å®åä½ï¼?.()ï¼?.[]
å¯éé¾ ?. 䏿¯ä¸ä¸ªè¿ç®ç¬¦ï¼èæ¯ä¸ä¸ªç¹æ®çè¯æ³ç»æãå®è¿å¯ä»¥ä¸å½æ°åæ¹æ¬å·ä¸èµ·ä½¿ç¨ã
ä¾å¦ï¼å° ?.() ç¨äºè°ç¨ä¸ä¸ªå¯è½ä¸åå¨ç彿°ã
å¨ä¸é¢è¿æ®µä»£ç ä¸ï¼æäºç¨æ·å
·æ admin æ¹æ³ï¼èæäºæ²¡æï¼
let userAdmin = {
admin() {
alert("I am admin");
}
};
let userGuest = {};
userAdmin.admin?.(); // I am admin
userGuest.admin?.(); // å¥é½æ²¡åçï¼æ²¡æè¿æ ·çæ¹æ³ï¼
å¨è¿ä¸¤è¡ä»£ç ä¸ï¼æä»¬é¦å
使ç¨ç¹ç¬¦å·ï¼userAdmin.adminï¼æ¥è·å admin 屿§ï¼å 为æä»¬åå®å¯¹è±¡ userAdmin åå¨ï¼å æ¤å¯ä»¥å®å
¨å°è¯»åå®ã
ç¶å ?.() 伿£æ¥å®å·¦è¾¹çé¨åï¼å¦æ admin 彿°åå¨ï¼é£ä¹å°±è°ç¨è¿è¡å®ï¼å¯¹äº userAdminï¼ãå¦åï¼å¯¹äº userGuestï¼è¿ç®åæ¢ï¼æ²¡ææ¥éã
妿æä»¬æ³ä½¿ç¨æ¹æ¬å· [] è䏿¯ç¹ç¬¦å· . æ¥è®¿é®å±æ§ï¼è¯æ³ ?.[] ä¹å¯ä»¥ä½¿ç¨ãè·åé¢çä¾å类似ï¼å®å
许ä»ä¸ä¸ªå¯è½ä¸åå¨ç对象ä¸å®å
¨å°è¯»å屿§ã
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
?. æ¥å®å
¨å°è¯»åæå é¤ï¼ä½ä¸è½åå
¥å¯éé¾ ?. ä¸è½ç¨å¨èµå¼è¯å¥ç左侧ã
ä¾å¦ï¼
let user = null;
user?.name = "John"; // Errorï¼ä¸èµ·ä½ç¨
// å 为å®å¨è®¡ç®çæ¯ï¼undefined = "John"
æ»ç»
å¯éé¾ ?. è¯æ³æä¸ç§å½¢å¼ï¼
obj?.propââ 妿objåå¨åè¿åobj.propï¼å¦åè¿åundefinedãobj?.[prop]ââ 妿objåå¨åè¿åobj[prop]ï¼å¦åè¿åundefinedãobj.method?.()ââ 妿obj.methodåå¨åè°ç¨obj.method()ï¼å¦åè¿åundefinedã
æ£å¦æä»¬æçå°çï¼è¿äºè¯æ³å½¢å¼ç¨èµ·æ¥é½å¾ç®åç´æ¥ã?. æ£æ¥å·¦è¾¹é¨åæ¯å¦ä¸º null/undefinedï¼å¦æä¸æ¯åç»§ç»è¿ç®ã
?. é¾ä½¿æä»¬è½å¤å®å
¨å°è®¿é®åµå¥å±æ§ã
使¯ï¼æä»¬åºè¯¥è°¨æ
å°ä½¿ç¨ ?.ï¼æ ¹æ®æä»¬ç代ç é»è¾ï¼ä»
å¨å½å·¦ä¾§é¨åä¸åå¨ä¹å¯æ¥åçæ
åµä¸ä½¿ç¨ä¸ºå®ã以ä¿è¯å¨ä»£ç 䏿ç¼ç¨ä¸çé误åºç°æ¶ï¼ä¹ä¸ä¼å¯¹æä»¬éèã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼