空å¼åå¹¶è¿ç®ç¬¦ï¼nullish coalescing operatorï¼çåæ³ä¸ºä¸¤ä¸ªé®å· ??ã
ç±äºå®å¯¹å¾
null å undefined çæ¹å¼ç±»ä¼¼ï¼æä»¥å¨æ¬æä¸æä»¬å°ä½¿ç¨ä¸ä¸ªç¹æ®çæ¯è¯å¯¹å
¶è¿è¡è¡¨ç¤ºãä¸ºç®æ´èµ·è§ï¼å½ä¸ä¸ªå¼æ¢ä¸æ¯ null ä¹ä¸æ¯ undefined æ¶ï¼æä»¬å°å
¶ç§°ä¸ºâå·²å®ä¹çï¼definedï¼âã
a ?? b çç»ææ¯ï¼
- 妿
aæ¯å·²å®ä¹çï¼åç»æä¸ºaï¼ - 妿
a䏿¯å·²å®ä¹çï¼åç»æä¸ºbã
æ¢å¥è¯è¯´ï¼å¦æç¬¬ä¸ä¸ªåæ°ä¸æ¯ null/undefinedï¼å ?? è¿å第ä¸ä¸ªåæ°ãå¦åï¼è¿å第äºä¸ªåæ°ã
空å¼åå¹¶è¿ç®ç¬¦å¹¶ä¸æ¯ä»ä¹å ¨æ°çä¸è¥¿ãå®åªæ¯ä¸ç§è·å¾ä¸¤è ä¸ç第ä¸ä¸ªâå·²å®ä¹çâå¼çä¸éçè¯æ³ã
æä»¬å¯ä»¥ä½¿ç¨æä»¬å·²ç¥çè¿ç®ç¬¦éå result = a ?? bï¼åè¿æ ·ï¼
result = (a !== null && a !== undefined) ? a : b;
ç°å¨ä½ åºè¯¥æ¸
æ¥äº ?? çä½ç¨ã让æä»¬æ¥ççå®ç使ç¨åºæ¯å§ã
?? ç常è§ä½¿ç¨åºæ¯æ¯æä¾é»è®¤å¼ã
ä¾å¦ï¼å¨è¿éï¼å¦æ user çå¼ä¸ä¸º null/undefined åæ¾ç¤º userï¼å¦åæ¾ç¤º å¿åï¼
let user;
alert(user ?? "å¿å"); // å¿åï¼user æªå®ä¹ï¼
å¨ä¸é¢è¿ä¸ªä¾åä¸ï¼æä»¬å°ä¸ä¸ªååèµå¼ç»äº userï¼
let user = "John";
alert(user ?? "å¿å"); // Johnï¼user å·²å®ä¹ï¼
æä»¬è¿å¯ä»¥ä½¿ç¨ ?? åºåä»ä¸ç³»åçå¼ä¸éæ©åºç¬¬ä¸ä¸ªé null/undefined çå¼ã
å设æä»¬å¨åé firstNameãlastName æ nickName ä¸åå¨çä¸ä¸ªç¨æ·çæ°æ®ãå¦æç¨æ·å³å®ä¸å¡«åç¸åºçå¼ï¼åææè¿äºåéçå¼é½å¯è½æ¯æªå®ä¹çã
æä»¬æ³ä½¿ç¨è¿äºåéä¹ä¸æ¾ç¤ºç¨æ·åï¼å¦æè¿äºåéçå¼é½æ¯ null/undefinedï¼åæ¾ç¤º âå¿åâã
让æä»¬ä½¿ç¨ ?? è¿ç®ç¬¦æ¥å®ç°è¿ä¸éæ±ï¼
let firstName = null;
let lastName = null;
let nickName = "Supercoder";
// æ¾ç¤ºç¬¬ä¸ä¸ªå·²å®ä¹çå¼ï¼
alert(firstName ?? lastName ?? nickName ?? "å¿å"); // Supercoder
ä¸ || æ¯è¾
æè¿ç®ç¬¦ || å¯ä»¥ä»¥ä¸ ?? è¿ç®ç¬¦ç¸åçæ¹å¼ä½¿ç¨ãåæä»¬å¨ ä¸ä¸ç« æè®²ç飿 ·ã
ä¾å¦ï¼å¨ä¸é¢ç代ç ä¸ï¼æä»¬å¯ä»¥ç¨ || æ¿æ¢æ ??ï¼ä¹å¯ä»¥è·å¾ç¸åçç»æï¼
let firstName = null;
let lastName = null;
let nickName = "Supercoder";
// æ¾ç¤ºç¬¬ä¸ä¸ªçå¼ï¼
alert(firstName || lastName || nickName || "Anonymous"); // Supercoder
çºµè§ JavaScript åå±å²ï¼æ || è¿ç®ç¬¦å
äº ?? åºç°ãå®èª JavaScript è¯çå°±åå¨äºï¼å æ¤å¼åè
é¿æå°å
¶ç¨äºè¿ç§ç®çã
å¦ä¸æ¹é¢ï¼ç©ºå¼åå¹¶è¿ç®ç¬¦ ?? æ¯æè¿æè¢«æ·»å å° JavaScript ä¸çï¼å®çåºç°æ¯å 为人们对 || ä¸å¤ªæ»¡æã
å®ä»¬ä¹é´éè¦çåºå«æ¯ï¼
||è¿å第ä¸ä¸ª ç å¼ã??è¿å第ä¸ä¸ª å·²å®ä¹ç å¼ã
æ¢å¥è¯è¯´ï¼|| æ æ³åºå falseã0ã空å符串 "" å null/undefinedãå®ä»¬é½ä¸æ · ââ åå¼ï¼falsy valuesï¼ã妿å
¶ä¸ä»»ä½ä¸ä¸ªæ¯ || ç第ä¸ä¸ªåæ°ï¼é£ä¹æä»¬å°å¾å°ç¬¬äºä¸ªåæ°ä½ä¸ºç»æã
ä¸è¿å¨å®é
ä¸ï¼æä»¬å¯è½åªæ³å¨åéçå¼ä¸º null/undefined æ¶ä½¿ç¨é»è®¤å¼ãä¹å°±æ¯è¯´ï¼å½è¯¥å¼ç¡®å®æªç¥ææªè¢«è®¾ç½®æ¶ã
ä¾å¦ï¼èèä¸é¢è¿ç§æ åµï¼
let height = 0;
alert(height || 100); // 100
alert(height ?? 100); // 0
height || 100é¦å 伿£æ¥heightæ¯å¦ä¸ºä¸ä¸ªåå¼ï¼å®æ¯0ï¼ç¡®å®æ¯åå¼ã- æä»¥ï¼
||è¿ç®çç»æä¸ºç¬¬äºä¸ªåæ°ï¼100ã
- æä»¥ï¼
height ?? 100é¦å 伿£æ¥heightæ¯å¦ä¸ºnull/undefinedï¼åç°å®ä¸æ¯ã- æä»¥ï¼ç»æä¸º
heightçåå§å¼ï¼0ã
- æä»¥ï¼ç»æä¸º
å®é
ä¸ï¼é«åº¦ 0 é常æ¯ä¸ä¸ªææå¼ï¼å®ä¸åºè¯¥è¢«æ¿æ¢ä¸ºé»è®¤å¼ãæä»¥ ?? è¿ç®å¾å°çæ¯æ£ç¡®çç»æã
ä¼å 级
?? è¿ç®ç¬¦çä¼å
çº§ä¸ || ç¸åï¼å®ä»¬çä¼å
级é½ä¸º 3ï¼è¯¦è§ï¼MDNã
è¿æå³çï¼å°±å || 䏿 ·ï¼ç©ºå¼åå¹¶è¿ç®ç¬¦å¨ = å ? è¿ç®å计ç®ï¼ä½å¨å¤§å¤æ°å
¶ä»è¿ç®ï¼ä¾å¦ + å *ï¼ä¹å计ç®ã
æä»¥æä»¬å¯è½éè¦å¨è¿æ ·ç表达å¼ä¸æ·»å æ¬å·ï¼
let height = null;
let width = null;
// éè¦ï¼ä½¿ç¨æ¬å·
let area = (height ?? 100) * (width ?? 50);
alert(area); // 5000
å¦åï¼å¦ææä»¬çç¥äºæ¬å·ï¼åç±äº * çä¼å
çº§æ¯ ?? é«ï¼å®ä¼å
æ§è¡ï¼è¿è导è´é误çç»æã
// æ²¡ææ¬å·
let area = height ?? 100 * width ?? 50;
// â¦â¦å°è¿æ ·è®¡ç®ï¼ä¸ç¬¦åæä»¬çææï¼ï¼
let area = height ?? (100 * width) ?? 50;
?? ä¸ && æ || ä¸èµ·ä½¿ç¨
åºäºå®å
¨åå ï¼JavaScript ç¦æ¢å° ?? è¿ç®ç¬¦ä¸ && å || è¿ç®ç¬¦ä¸èµ·ä½¿ç¨ï¼é¤éä½¿ç¨æ¬å·æç¡®æå®äºä¼å
级ã
ä¸é¢ç代ç ä¼è§¦åä¸ä¸ªè¯æ³é误ï¼
let x = 1 && 2 ?? 3; // Syntax error
è¿ä¸ªéå¶æ çæ¯å¼å¾å榷çï¼å®è¢«æ·»å å°è¯è¨è§è䏿¯ä¸ºäºé¿å
äººä»¬ä» || åæ¢å° ?? æ¶çç¼ç¨é误ã
å¯ä»¥æç¡®å°ä½¿ç¨æ¬å·æ¥è§£å³è¿ä¸ªé®é¢ï¼
let x = (1 && 2) ?? 3; // æ£å¸¸å·¥ä½äº
alert(x); // 2
æ»ç»
-
空å¼åå¹¶è¿ç®ç¬¦
??æä¾äºä¸ç§ä»å表ä¸éæ©ç¬¬ä¸ä¸ªâå·²å®ä¹çâå¼çç®ä¾¿æ¹å¼ãå®è¢«ç¨äºä¸ºåéåé é»è®¤å¼ï¼
// å½ height çå¼ä¸º null æ undefined æ¶ï¼å° height çå¼è®¾ç½®ä¸º 100 height = height ?? 100; -
??è¿ç®ç¬¦çä¼å 级é常ä½ï¼ä» ç¥é«äº?å=ï¼å æ¤å¨è¡¨è¾¾å¼ä¸ä½¿ç¨å®æ¶è¯·èèæ·»å æ¬å·ã -
å¦ææ²¡ææç¡®æ·»å æ¬å·ï¼ä¸è½å°å ¶ä¸
||æ&&ä¸èµ·ä½¿ç¨ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼