[TOC] #### 1. 可選鏈操作符 (?.) --- **可選鏈操作符** 允許讀取位于連接對(duì)象鏈深處的屬性值,而不必明確驗(yàn)證鏈中的每個(gè)引用是否有效 `?.` 可選鏈操作符的功能類(lèi)似于 `.` 鏈?zhǔn)讲僮鞣?,不同之處在于引用為空的情況下不會(huì)引起錯(cuò)誤,該表達(dá)式短路返回值 下面代碼運(yùn)行有錯(cuò)誤,原因很簡(jiǎn)單, `user.age` 的值是 `undefined`,從 `undefined` 中讀取 `num` 屬性當(dāng)然會(huì)報(bào)錯(cuò) ```javascript const user = { name: 'liang' } // liang console.log(user.name); // Uncaught TypeError: Cannot read properties of undefined (reading 'num') console.log(user.age.num); ``` 上面代碼拋出的錯(cuò)誤會(huì)導(dǎo)致后面的程序無(wú)法執(zhí)行,有種場(chǎng)景,即使 `num` 讀取不到,也要讓程序正常執(zhí)行,應(yīng)該怎么做 ? 我們可以使用 `?.` 操作符解決這個(gè)問(wèn)題: 此時(shí) `user.age.num` 有值的話會(huì)正常輸出,找不到時(shí)返回 `undefined` 而不是直接拋出錯(cuò)誤異常 ```javascript console.log(user.age?.num); ``` 當(dāng)找不到 `num` 時(shí),我們想要設(shè)置個(gè)默認(rèn)值,可以配合 `??` 使用 ```javascript console.log(user.age?.num ?? 18); ``` #### 2. 空值合并操作符 (??) --- 在實(shí)際開(kāi)發(fā)中,`??` 遇到的次數(shù)也不是太多,但還是非常有必要知道這個(gè)東西用法的 空值合并操作符(??): 只有當(dāng)左側(cè)為 `null` 或 `undefined` 時(shí),才會(huì)返回右側(cè)的數(shù) 與邏輯或操作符(`||`)不同,邏輯或操作符左側(cè)的值為假值時(shí)返回右側(cè)操作符。也就是說(shuō),如果使用 `||` 來(lái)為某些變量設(shè)置默認(rèn)值,可能會(huì)遇到意料之外的問(wèn)題,比如遇到假值 `''`、`0`、`false` 通過(guò)以下代碼可驗(yàn)證區(qū)別,當(dāng) user 對(duì)象中沒(méi)有 sex 屬性時(shí)默認(rèn)值為 2(0 女 1 男 2 未知) ```javascript const user = { name: 'maria', sex: 0 } console.log(user.sex ?? 2); // 0 console.log(user.sex || 2);// 2 ``` **空值合并操作符 (??)** 和 **可選鏈操作符 (?.)** 配合使用就非常美妙 ```javascript console.log(user.age?.num ?? 18); ```