天天看點

鞏固一下 JS 可選 (?.)操作符号,原來函數也可以用可選寫法,又學到了!

作者: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...