作者:Ashish Lahoti
譯者:前端小智
來源:CSS-Tricket
本文 GitHub https://github.com/qq449245884/xiaozhi 已收錄,有一線大廠面試完整考點、資料以及我的系列文章。
可選的連結
?.
操作符用于使用隐式空檢查通路嵌套對象屬性。
概述
如何使用null (
null
和
undefined
)檢查通路對象的嵌套屬性?假設我們必須從背景的接口通路使用者詳細資訊。
可以使用嵌套的三元運算符 :
const userName = response ? (response.data ? (response.data.user ? response.data.user.name : null) : null) : null;
複制
或者使用
if
進行空值檢查:
let userName = null;
if(response && response.data && response.data.user){
userName = response.data.user.name;
}
複制
或者更好的方法是使它成為一個單行連結的
&&
條件,像這樣:
const userName = response && response.data && response.data.user && response.data.user.name;
複制
上述代碼的共同之處在于,連結有時會非常冗長,并且變得更難格式化和閱讀。這就是
?.
操作符被提出來的原因,我們改下
?.
重構上面的代碼:
const userName = response?.data?.user?.name;
複制
很 nice 呀。
文法
?.
文法在ES2020 中被引入,用法如下:
obj.val?.pro // 如果`val`存在,則傳回`obj.val.prop`,否則傳回 `undefined`。
obj.func?.(args) // 如果 obj.func 存在,則傳回 `obj.func?.(args)`,否則傳回 `undefined`。
obj.arr?.[index] // 如果 obj.arr 存在,則傳回 `obj.arr?.[index]`,否則傳回 `undefined`。
複制
使用 ?.
操作符
?.
假設我們有一個
user
對象:
const user = {
name: "前端小智",
age: 21,
homeaddress: {
country: "中國"
},
hobbies: [{name: "敲代碼"}, {name: "洗碗"}],
getFirstName: function(){
return this.name;
}
}
複制
屬性
通路存在的屬性:
console.log(user.homeaddress.country);
// 中國
複制
通路不存在的屬性:
console.log(user.officeaddress.country);
// throws error "Uncaught TypeError: Cannot read property 'country' of undefined"
複制
改用
?.
通路不存在的屬性:
console.log(user.officeaddress?.country);
// undefined
複制
方法
通路存在的方法:
console.log(user.getFirstName());
// 前端小智
複制
通路不存在的方法:
console.log(user.getLastName());
// throws error "Uncaught TypeError: user.getLastName is not a function";
複制
改用
?.
通路不存在的方法:
console.log(user.getLastName?.());
// "undefined"
複制
數組
通路存在的數組:
console.log(user.hobbies[0].name);
// "敲代碼"
複制
通路不存在的方法:
console.log(user.hobbies[3].name);
// throws error "Uncaught TypeError: Cannot read property 'name' of undefined"
複制
改用
?.
通路不存在的數組:
console.log(user.dislikes?.[0]?.name);
// "undefined"
複制
?? 操作符
我們知道
?.
操作符号如果對象不存在,剛傳回
undefined
,開發中可能不傳回
undefined
而是傳回一個預設值,這時我們可以使用雙問題
??
操作符。
有點抽象,直接來一個例子:
const country = user.officeaddress?.country;
console.log(country);
// undefined
複制
需要傳回預設值:
const country = user.officeaddress?.country ?? "中國";
console.log(country);
// 中國
複制
~完,我是刷碗智,SPA走起來,下期見!
代碼部署後可能存在的BUG沒法實時知道,事後為了解決這些BUG,花了大量的時間進行log 調試,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug。
原文:https://codingncoepts.com/jav...