精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么我喜歡JavaScript的Optional Chaining

開發 前端
下面讓我們來看看 optional chaining 是如何通過在深度訪問可能缺少的屬性時刪除樣板條件和變量來簡化代碼的。

 [[275113]]

JavaScript 的特性極大地改變了你的編碼方式。從 ES2015 開始,對我代碼影響最多的功能是解構、箭頭函數、類和模塊系統。

截至 2019 年 8 月,一項新提案 optional chaining 達到了第3階段,這將是一個很好的改進。Optional Chaining 改變了從深層對象結構訪問屬性的方式。

下面讓我們來看看 optional chaining 是如何通過在深度訪問可能缺少的屬性時刪除樣板條件和變量來簡化代碼的。

1. 問題

由于 JavaScript 的動態特性,對象可以有區別很大的嵌套對象結構。

通常,你在以下情況下處理此類對象:

  •  獲取遠程 JSON 數據
  •  使用配置對象
  •  具有 optional 屬性

雖然這為對象提供了支持不同結構數據的靈活性,但是在訪問這些對象的屬性時會增加復雜性。

bigObject 在運行時可以有不同的屬性集: 

  1. // One version of bigObject  
  2. const bigObject = {  
  3.   // ...  
  4.   prop1: {  
  5.     //...  
  6.     prop2: {  
  7.       // ...  
  8.       value: 'Some value'  
  9.     }  
  10.   }  
  11. };  
  12. // Other version of bigObject  
  13. const bigObject = {  
  14.   // ...  
  15.   prop1: {  
  16.     // Nothing here     
  17.   }  
  18. }; 

因此,你必須手動檢查屬性是否存在: 

  1. // Later  
  2. if (bigObject &&   
  3.     bigObject.prop1 != null &&   
  4.     bigObject.prop1.prop2 != null) {  
  5.   let result = bigObject.prop1.prop2.value;  

這會產生很多樣板代碼。如果不需要寫這些代碼那就太好了。

讓我們看看 optional chaining 如何解決這個問題,并減少樣板條件。

2. 輕松的深入訪問屬性

讓我們設計一個保存電影信息的對象。該對象包含一個 title 屬性,以及可選的 director 和 actors。

movieSmall 對象只包含 title,而 movieFull 包含完整的屬性集: 

  1. const movieSmall = {  
  2.   title: 'Heat'  
  3. };  
  4. const movieFull = {  
  5.   title: 'Blade Runner',  
  6.   director: { name: 'Ridley Scott' },  
  7.   actors: [{ name: 'Harrison Ford' }, { name: 'Rutger Hauer' }]  
  8. }; 

讓我們寫一個獲取導演名字的函數。請記住,director 屬性可能會不存在: 

  1. function getDirector(movie) {  
  2.   if (movie.director != null) {  
  3.     return movie.director.name;  
  4.   }  
  5. }  
  6. getDirector(movieSmall); // => undefined  
  7. getDirector(movieFull);  // => 'Ridley Scott' 

if (movie.director) {...} 條件用于驗證 director 屬性是否已定義。如果沒有這個預防措施,在訪問movieSmall 對象 director 的時候,JavaScript 會拋出錯誤 TypeError: Cannot read property 'name' of undefined。

這是使用新的 optional chaining 功能的正確位置,并刪除 movie.director 的存在驗證。新版本的getDirector()看起來要短得多: 

  1. function getDirector(movie) {  
  2.   return movie.director?.name;  
  3. }  
  4. getDirector(movieSmall); // => undefined  
  5. getDirector(movieFull);  // => 'Ridley Scott' 

在表達式 movie.director?.name 中你可以找到 ?.: optional chaining 運算符。

在 movieSmall 的情況下,如果屬性 director 丟失了。那么 movie.director?.name 的計算結果為 undefined。 optional chaining 運算符可防止拋出 TypeError:Cannot read property 'name' of undefined。

相反,在 movieFull 的情況下,屬性 director 可用。 movie.director?.name 的值為 'Ridley Scott'.。

簡單來說,代碼片段: 

  1. let name = movie.director?.name; 

相當于: 

  1. let name;  
  2. if (movie.director != null) {  
  3.   name = movie.director.name;  

?. 通過減少 2 行代碼簡化了 getDirector() 函數。這就是我喜歡 optional chaining 的原因。

2.1 數組項

但是 optional chaining 功能可以做更多的事情。你可以在同一表達式中使用多個optional chaining 運算符。甚至可以使用它來安全地訪問數組項目!

接下來的任務是編寫一個返回電影主角名字的函數。

在 movie 對象中,actors 數組可以為空甚至丟失,因此你必須添加其他條件: 

  1. function getLeadingActor(movie) {  
  2.   if (movie.actors && movie.actors.length > 0) {  
  3.     return movie.actors[0].name;  
  4.   }  
  5. }  
  6. getLeadingActor(movieSmall); // => undefined  
  7. getLeadingActor(movieFull);  // => 'Harrison Ford' 

if (movie.actors && movies.actors.length > 0) {...} 條件需要確保 movie 中包含 actors 屬性,并且此屬性至少有一個 actor。

通過使用 optional chaining,此任務很容易解決: 

  1. function getLeadingActor(movie) {  
  2.   return movie.actors?.[0]?.name;  
  3. }  
  4. getLeadingActor(movieSmall); // => undefined  
  5. getLeadingActor(movieFull);  // => 'Harrison Ford' 

actors?. 確保 actors 屬性存在。 [0]?. 確保第一個 actor 存在于列表中。很好!

3. nullish 合并

名為 nullish coalescing operator 的新提案建議用 ?? 處理 undefined或null,將它們默認為特定的值。

如果 variable 是undefined或null,則表達式 variable ?? defaultValue 的結果為defaultValue, 否則表達式的值為variable 的值。 

  1. const noValue = undefined;  
  2. const value = 'Hello';  
  3. noValue ?? 'Nothing'; // => 'Nothing'  
  4. value   ?? 'Nothing'; // => 'Hello' 

當評估為 undefined 時,Nullish 合并可以通過默認值來改進 optional chaining。

例如,當 movie 對象中沒有 actor時,讓我們改變 getLeading() 函數返回 "Unknown actor": 

  1. function getLeadingActor(movie) {  
  2.   return movie.actors?.[0]?.name ?? 'Unknown actor';  
  3. }  
  4. getLeadingActor(movieSmall); // => 'Unknown actor'  
  5. getLeadingActor(movieFull);  // => 'Harrison Ford' 

4. optional chaining 的 3 種形式

可以用以下 3 種形式使用 optional chaining 。

第一種形式 object?.property 用于訪問靜態屬性: 

  1. const object = null;  
  2. object?.property; // => undefined 

第二種形式 object?.[expression] 用于訪問動態屬性或數組項: 

  1. const object = null;  
  2. const name = 'property';  
  3. object?.[name]; // => undefined  
  4. const array = null;  
  5. array?.[0]; // => undefined 

最后,第三種形式 object?.([arg1,[arg2,...]]) 執行一個對象方法: 

  1. const object = null;  
  2. object?.method('Some value'); // => undefined 

如果需要,可以通過組合這些表單來創建長的可選鏈: 

  1. const value = object.maybeUndefinedProp?.maybeNull()?.[propName]; 

5. 短路:停止于 null/undefined

有關 optional chaining 運算符的有趣之處在于,只要在其左側 leftHandSide?.rightHandSide 中遇到無效值,右側訪問器的評估就會停止。這稱為短路。

我們來看一個例子: 

  1. const nothing = null;  
  2. let index = 0;  
  3. nothing?.[index++]; // => undefined  
  4. index;              // => 0 

nothing 保持一個 nullish 值,因此 optional chaining 評估為 undefined ,并跳過右側訪問器的評估。因為 index 編號不會增加。

6. 何時使用 optional chaining

一定要克制使用 optional chaining 操作符訪問任何類型屬性的沖動:這將會導致誤導使用。下一節將介紹何時正確使用它。

6.1 訪問可能無效的屬性

?. 必須只在可能無效的屬性附近使用:maybeNullish?.prop。在其他情況下,使用舊的屬性訪問器:.property 或 [propExpression]。

回想一下 movie 對象。查看表達式 movie.director?.name,因 為director 可以是 undefined,在director屬性附近使用 optional chaining 運算符是正確的。

相反,使用 ?. 來訪問電影標題是沒有意義的:movie?.title。movie 對象不會是無效的。 

  1. // Good  
  2. function logMovie(movie) {  
  3.   console.log(movie.director?.name);  
  4.   console.log(movie.title);  
  5. }   
  6. // Bad  
  7. function logMovie(movie) {  
  8.   // director needs optional chaining  
  9.   console.log(movie.director.name);  
  10.   // movie doesn't need optional chaining  
  11.   console.log(movie?.title);  

6.2 通常有更好的選擇

以下函數 hasPadding() 接受帶有可選 padding 屬性的樣式對象。 padding 具有可選屬性left、top、right、bottom。

下面嘗試使用 optional chaining 運算符: 

  1. function hasPadding({ padding }) {  
  2.   const top = padding?.top ?? 0;  
  3.   const right = padding?.right ?? 0;  
  4.   const bottom = padding?.bottom ?? 0;  
  5.   const left = padding?.left ?? 0;  
  6.   return left + top + right + bottom !== 0;  
  7. }  
  8. hasPadding({ color: 'black' });        // => false  
  9. hasPadding({ padding: { left: 0 } });  // => false  
  10. hasPadding({ padding: { right: 10 }}); // => true 

雖然函數正確地確定元素是否具有填充,但是對于每個屬性都使用 optional chaining 是非常困難的。

更好的方法是使用對象擴展運算符將填充對象默認為零值: 

  1. function hasPadding({ padding }) {  
  2.   const p = {  
  3.     top: 0,  
  4.     right: 0,  
  5.     bottom: 0,  
  6.     left: 0,  
  7.     ...padding  
  8.   };  
  9.   return p.top + p.left + p.right + p.bottom !== 0;  
  10. }  
  11. hasPadding({ color: 'black' });        // => false  
  12. hasPadding({ padding: { left: 0 } });  // => false  
  13. hasPadding({ padding: { right: 10 }}); // => true 

在我看來,這個版本的 hasPadding() 更容易閱讀。

7. 為什么我喜歡它?

我喜歡 optional chaining 運算符,因為它允許從嵌套對象輕松訪問屬性。它可以減少通過編寫樣板文件來驗證來自訪問器鏈的每個屬性訪問器上無效值的工作。

當 optional chaining 與無效合并運算符組合時,你可以獲得更好的結果,能夠更輕松地處理默認值。

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2019-10-23 15:53:16

JavaScript可選鏈對象

2012-04-04 22:07:12

Android

2023-09-14 08:00:00

基于主干的開發分支模型

2009-06-04 17:33:08

EJB 3.1EJB 3.0

2025-01-15 09:06:58

CSSRegEx前端

2015-10-26 09:58:53

程序員主流

2017-09-11 19:58:06

PostgreSQLMySQL數據庫

2017-11-30 15:25:04

EclipseGo項目

2020-07-28 10:45:51

數據庫三范式MySQL

2025-07-28 08:26:48

CSStext-wrap屬性

2021-04-18 12:37:46

bspwmLinux窗口管理器

2018-01-09 18:46:44

數據庫架構讀寫分離

2018-01-15 05:54:45

數據庫讀寫分離互聯網

2025-08-20 08:21:16

2023-01-10 08:17:41

WebAPI框架

2019-11-18 09:56:48

谷歌Go語言開發者

2012-05-14 08:55:23

Android

2020-12-20 17:34:50

Linux命令行終端

2023-07-04 16:28:23

點贊
收藏

51CTO技術棧公眾號

日韩欧美国产三级电影视频| 国产日本精品视频| 亚洲av成人精品一区二区三区在线播放 | 久草免费福利在线| 日韩欧美国产另类| 都市激情久久| 国产成人在线看| 色悠悠国产精品| 欧美精品第三页| 天堂v在线观看| 尤物精品在线| 精品久久人人做人人爰| 日韩成人午夜影院| 亚洲熟妇无码久久精品| 精品视频免费| 欧美色视频一区| 亚洲激情图片| 国产精品成人无码| 国产成人久久| 91高清视频在线| 欧美日韩一区二| 在线精品免费视| 国产精品免费大片| 精品少妇一区二区三区在线视频| 日日碰狠狠丁香久燥| 日韩激情美女| 欧美日韩中文| 欧美tickling网站挠脚心| 无码人妻精品一区二区三区66| 偷拍自拍在线视频| 美女日韩在线中文字幕| 亚洲欧洲免费视频| 污污的网站18| 成人无遮挡免费网站视频在线观看| 久久国产夜色精品鲁鲁99| www.亚洲一区| 波多野结衣三级视频| 日本大片在线播放| www一区二区| 国产精品日韩在线一区| 一区二区三区影视| 999精品视频在这里| 精品国产老师黑色丝袜高跟鞋| 免费在线成人av| 中文字幕视频在线播放| 欧美在线网址| 亚洲国产另类 国产精品国产免费| 国产黄页在线观看| 黄色大片在线看| 韩国三级中文字幕hd久久精品| 欧美成人久久久| 国产女人18毛片水真多18| 亚洲日本天堂| 中文字幕亚洲欧美在线不卡| 国产成人精品一区二区| 天天做夜夜爱爱爱| 精品精品国产三级a∨在线| 色婷婷久久久久swag精品| 在线免费观看成人| 人妻少妇精品无码专区久久| 日本视频在线一区| 欧美激情精品久久久久久免费印度| 熟女人妻在线视频| 亚洲香蕉久久| 欧美午夜精品久久久久久人妖| 在线观看亚洲视频啊啊啊啊| 在线a人片免费观看视频| 成人中文字幕在线| 国产精品吴梦梦| 西西44rtwww国产精品| 日韩精品第一区| 亚洲精品电影久久久| 波多野结衣影院| 伊人久久综合影院| 日韩精品一区二区三区视频| 日本一级大毛片a一 | 国产精品欧美久久久| 中文字幕二区三区| 精品写真视频在线观看| av噜噜色噜噜久久| 午夜精品免费观看| 亚洲国产专区| 久久久av一区| 精品国产成人亚洲午夜福利| 91蝌蚪精品视频| 亚洲精品av在线| 最近中文字幕免费| 91av精品| 久久久精品2019中文字幕神马| 亚洲熟女www一区二区三区| 久久99久久人婷婷精品综合 | www.51色.com| 亚洲欧美小说色综合小说一区| 日本黄色一区二区| 日韩av加勒比| 亚洲第一二三区| 精品国产一区二区三区久久久 | 欧美日韩综合| 日韩免费在线免费观看| 日本熟妇毛耸耸xxxxxx| 亚洲国产一成人久久精品| 欧美激情免费看| 超碰在线观看91| 高清不卡在线观看av| 91欧美精品成人综合在线观看| 无码人妻熟妇av又粗又大| 久久er99热精品一区二区| 国产成人综合久久| 国产黄a三级三级三级| 精品一区二区三区在线观看国产| 国产欧美日本在线| 免费观看国产精品| 中文字幕精品—区二区四季| 青青草成人网| 国产鲁鲁视频在线观看免费| 国产亚洲短视频| 日本一区二区三区精品视频| 天堂av在线电影| 欧美视频中文一区二区三区在线观看 | 成人福利在线视频| 在线观看国产精品入口男同| www..com久久爱| 国产精品一区二区免费看| 亚洲AV无码精品自拍| 国产成人无遮挡在线视频| 日韩高清av| 午夜视频在线看| 欧美性xxxxx极品娇小| 好吊操视频这里只有精品| 人人狠狠综合久久亚洲婷| 久久精品电影网站| 伊人成年综合网| 久久先锋影音av| 日本免费高清不卡| 蜜桃麻豆影像在线观看| 色噜噜狠狠色综合欧洲selulu | 91亚洲精品久久久蜜桃网站| 精品久久中出| 国产精品一级伦理| 欧美日韩国产色| 538在线视频观看| 午夜精品久久久久久毛片| 日韩精品综合一本久道在线视频| 免费观看特级毛片| 黑丝一区二区| 国产99久久精品一区二区永久免费| 黄色成人一级片| 国产视频视频一区| 欧美成人黑人猛交| 蜜桃成人av| 国产精品国产三级国产aⅴ9色| 亚洲手机在线观看| 国产精品超碰97尤物18| 超碰在线公开97| 大胆日韩av| 成人春色激情网| 菠萝蜜视频国产在线播放| 欧美一区二区黄| 中文字幕高清视频| 综合精品久久| 国产91色在线免费| 国产黄在线观看| 欧美日韩另类国产亚洲欧美一级| 性一交一黄一片| 国产精品探花在线观看| 国产成人久久久精品一区| av电影在线观看一区二区三区| 尤物在线观看一区| 污色网站在线观看| 欧美亚洲国产日韩| 另类少妇人与禽zozz0性伦| 精品国产一区二区三区四| 国产午夜精品久久久久久久| 欧美伦理片在线观看| 国产精品久久久久9999赢消| 欧美一级片一区| 精品人妻午夜一区二区三区四区 | yellow在线观看网址| 欧美私模裸体表演在线观看| sm捆绑调教视频| 国产ts人妖一区二区| 116极品美女午夜一级| 日韩最新av| 日韩在线观看免费全集电视剧网站| 在线观看免费观看在线| 亚洲一区日韩精品中文字幕| 亚洲欧美国产中文| 综合一区在线| 久久精品一二三区| 91www在线| 日韩精品一区二| 51国产偷自视频区视频| 懂色av一区二区三区免费观看| av天堂永久资源网| 美女网站色精品尤物极品姐弟| 国产成人啪精品视频免费网| 超碰人人在线| 国产一区二区三区丝袜| 波多野结衣 久久| 综合久久综合久久| av无码av天天av天天爽| 亚洲国产高清一区| 欧美一级二级三级| 日韩区一区二| 国产精品看片资源| 黑人玩欧美人三根一起进| 欧美一区二区在线观看| 欧美黑人一区二区| 亚洲一区二区三区三| 少妇精品无码一区二区免费视频| 亚洲欧美日韩国产| 欧美极品一区二区| 欧美国产中文高清| 久久97精品久久久久久久不卡 | 9999精品成人免费毛片在线看| 中文字幕精品一区久久久久| 午夜精品久久久久久久蜜桃| 亚洲精品国产a| 国产在线综合视频| 99国产麻豆精品| 动漫av在线免费观看| 精品一区二区三区视频在线观看 | 国产av无码专区亚洲av毛网站| 理论片日本一区| av网站在线观看不卡| 欧美精品三区| 欧美 另类 交| 日韩一区二区三区精品视频第3页| 日韩av免费在线| 色黄视频在线观看| 久久久伊人欧美| 男人天堂综合| 欧美日韩国产另类一区| 亚洲欧美一区二区三区在线观看 | 日本中文字幕久久| 精品国产精品自拍| 天天操天天摸天天干| 亚洲成a人v欧美综合天堂下载| 一区二区三区四区影院| 黄色日韩网站视频| 欧美特黄aaa| 一区在线免费观看| 欧美精品久久96人妻无码| 国产一级成人av| 99久久精品免费看国产四区| 99久久久国产| 91中文精品字幕在线视频| а√在线中文在线新版 | 少妇视频在线观看| 91精品国产自产91精品| xxxxx日韩| 精品三级在线看| 亚洲高清精品视频| 精品久久久久久久人人人人传媒 | 成人一区二区在线观看| 性一交一黄一片| 不卡的电视剧免费网站有什么| 天美星空大象mv在线观看视频| 久久亚洲不卡| 欧美在线观看视频免费| 国产一区日韩| 天堂资源在线亚洲资源| aaa国产精品视频| 国产精品露出视频| 美女亚洲一区| 亚洲午夜精品福利| 亚洲系列另类av| 日韩精品第一页| 国产精品久久久久久久久久10秀 | 欧美精品v国产精品v日韩精品| 九九视频在线免费观看| 国产日韩精品一区二区三区| 久久亚洲AV无码专区成人国产| 中文字幕乱码亚洲精品一区| 精品无码一区二区三区蜜臀| 依依成人精品视频| 可以免费看的av毛片| 欧美色综合网站| 亚洲国产精彩视频| 亚洲欧美成人网| 日韩一卡二卡在线| 亚洲小视频在线| av免费在线免费观看| 色综久久综合桃花网| 在线中文免费视频| 日韩女优在线播放| 国产精品成人**免费视频| 国产精品久久久久久久久免费| 97精品资源在线观看| 精品国产一区二区三区麻豆小说 | 视频一区在线观看| 中文字幕中文字幕在线中一区高清| 欧美激情视频一区二区三区免费| 成人av一级片| 国产在线视频不卡二| 浓精h攵女乱爱av| 成人综合婷婷国产精品久久免费| 加勒比一区二区| 久久伊人中文字幕| 三级黄色在线观看| 欧美日韩亚洲精品内裤| 亚洲一卡二卡在线| 亚洲精品福利视频| 粗大黑人巨茎大战欧美成人| 日韩av黄色在线观看| 亚洲精品一区二区三区中文字幕| 成人激情视频在线播放| 女同另类激情重口| 樱空桃在线播放| 日韩在线一二三区| 色婷婷狠狠18| 北条麻妃一区二区三区| 国产白丝一区二区三区| 欧美性猛交xxxx富婆弯腰| 精品人妻aV中文字幕乱码色欲| 伊人伊成久久人综合网小说| av资源网站在线观看| 国内精品久久久久久| 99精品美女视频在线观看热舞| 欧美日韩亚洲一区二区三区在线观看| 欧美96在线丨欧| 亚洲xxx在线观看| 欧美经典一区二区| 波多野结衣久久久久| 一本色道久久加勒比精品| 老牛影视av牛牛影视av| 久久在线免费视频| 国产第一精品| 69174成人网| 美女av一区| 国产美女永久无遮挡| 国产视频一区欧美| 国产 porn| 久久久久久日产精品| 亚洲黄色免费视频| 欧美日韩一区二区三区在线免费观看 | 欧美一级一区二区| 99riav在线| 国产精品香蕉国产| 三区四区不卡| 中文字幕网av| 国产精品欧美久久久久无广告| 国产麻豆视频在线观看| 欧美色视频在线| 在线播放麻豆| 成人字幕网zmw| 91精品国产调教在线观看| 国产精品久久久久久久99| 亚洲日本一区二区| 国产精品第5页| 国产视频欧美视频| 黄色精品在线观看| 欧美与欧洲交xxxx免费观看 | 国产乱人伦偷精品视频免下载| 色哟哟无码精品一区二区三区| 亚洲精品高清视频在线观看| 国产黄色美女视频| 欧美激情在线播放| 久久久久黄色| 精品在线一区| 久久不射网站| 手机看片国产日韩| 精品福利在线看| 飘雪影视在线观看免费观看| 欧美成人剧情片在线观看| 51亚洲精品| 欧美丰满熟妇bbbbbb百度| 久久品道一品道久久精品| а中文在线天堂| 久久综合久中文字幕青草| 99精品国产高清一区二区麻豆| 欧美成人三级在线视频| 国产精品自拍网站| 国产一级中文字幕| 91精品国产日韩91久久久久久| 亚洲第一图区| 精品一区二区三区国产| 爽好久久久欧美精品| 好吊日在线视频| 亚洲精品久久视频| 免费黄网站在线| 国产精品精品久久久| 91亚洲国产| 三级视频中文字幕| 亚洲综合丁香婷婷六月香| 国产精品国产三级国产普通话对白| 日韩国产欧美区| 久久电影天堂| 老太脱裤让老头玩ⅹxxxx| 中文无字幕一区二区三区| www.亚洲天堂.com| 国产91在线播放九色快色| 自产国语精品视频| 日本xxxxxxxxx18| 日韩欧美一区二区视频| 免费观看一级欧美片| av一区观看| 日本午夜一区二区| 国产无套粉嫩白浆内谢| 日韩中文在线不卡|