精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

japanese国产在线观看| 成人性生交免费看| 精品三级久久久久久久电影聊斋| 久久aⅴ国产紧身牛仔裤| 伊人伊成久久人综合网站| 香蕉视频禁止18| 日本小视频在线免费观看| 97久久精品人人澡人人爽| 国产精品jizz在线观看麻豆| 91人妻一区二区三区蜜臀| 91蝌蚪精品视频| 一本色道久久综合亚洲精品按摩| 中文字幕一区二区三区四区五区六区| 亚洲黄色片视频| 久久综合九色综合欧美狠狠| 欧美成人一二三| 美女100%无挡| 91精品国产乱码久久久竹菊| 欧美综合久久久| 国产美女主播在线播放 | 日韩欧美在线网站| 日本成年人网址| 性xxxfreexxxx性欧美| 国产三级精品在线| 狠狠色综合一区二区| 亚洲视频一区二区三区四区| 在线亚洲精品| 欧美精品做受xxx性少妇| 免费成人深夜天涯网站| 日韩美女国产精品| 欧美zozozo| 国产精品自拍视频在线| 欧美片第一页| 午夜视频在线观看一区| 欧美三级午夜理伦三级老人| 粉嫩一区二区三区国产精品| 99这里只有久久精品视频| 亚洲free性xxxx护士白浆| 天天干天天插天天射| 亚洲永久免费| 91精品国产网站| 久久精品国产亚洲av无码娇色| 婷婷精品进入| 日韩中文字幕视频| 刘亦菲国产毛片bd| 成人久久一区| 一二美女精品欧洲| 久久只有这里有精品| 欧美深夜视频| 日韩av网址在线| a天堂视频在线观看| 五月亚洲婷婷| 精品国产凹凸成av人网站| 黄页网站在线看| 日韩免费高清视频网站| 日韩视频在线一区二区| 欧美日韩一区二区区别是什么 | 欧美日韩一区二区三区在线| 国产综合免费视频| 粉嫩一区二区三区| 在线亚洲一区二区| 亚洲天堂网一区| 黄色欧美视频| 欧美一区二区视频观看视频| 国产精品久久久久野外| 一区中文字幕电影| 亚洲精品suv精品一区二区| www.88av| 久久av网址| 日韩亚洲欧美成人| 中文字幕电影av| 亚洲黄色成人| 国产成人综合久久| 97人妻精品一区二区三区动漫| 国精产品一区一区三区mba视频 | 欧美整片在线观看| 国产又粗又猛又黄视频| 蜜桃av噜噜一区二区三区小说| 成人激情视频小说免费下载| www.天堂在线| 2024国产精品| 亚洲国产日韩欧美| av片在线观看免费| 午夜视频一区二区三区| 波多野结衣作品集| 懂色av色香蕉一区二区蜜桃| 日韩欧美国产系列| 色婷婷av777| 久久精品99久久无色码中文字幕| 另类视频在线观看| 在线观看 中文字幕| 日本aⅴ亚洲精品中文乱码| 成人久久一区二区三区| 蜜桃在线一区二区| 欧美激情一区二区| 日韩精品久久一区二区| 人人鲁人人莫人人爱精品| 日韩一级高清毛片| 麻豆精品免费视频| 欧美大片专区| 国产成人精品在线视频| 精品人妻久久久久一区二区三区| 91视频观看免费| 中文字幕人成一区| 成人性教育av免费网址| 欧美一区二区高清| 午夜精产品一区二区在线观看的| 中文字幕一区二区精品区| 欧美一级大片在线免费观看| 国产精品国产一区二区三区四区| 97se狠狠狠综合亚洲狠狠| 熟妇熟女乱妇乱女网站| 精品3atv在线视频| 亚洲精品一区二区三区蜜桃下载 | 无码h黄肉3d动漫在线观看| 国产精品伦一区二区三级视频| 久久国产精品网| 95精品视频| 国产一区二区精品丝袜| 日韩免费不卡视频| 国产乱人伦偷精品视频免下载 | 欧美日韩一区二区精品| 樱花草www在线| 成人影院在线| 日韩美女av在线免费观看| 亚洲第一天堂影院| 日韩美女视频一区| 三级a三级三级三级a十八发禁止| 欧美绝顶高潮抽搐喷水合集| 欧美大片在线看免费观看| 一本一道精品欧美中文字幕| 久久久久久久久岛国免费| 性一交一乱一伧国产女士spa| 日韩深夜福利网站| 中文字幕国产日韩| 午夜一区二区三区四区| 久久综合中文字幕| 黄色av网址在线播放| av动漫精品一区二区| 美日韩精品免费视频| 国产精品国产三级国产aⅴ| 中文av一区二区| 人人爽人人av| 成人午夜国产| 国产精品亚洲综合天堂夜夜| www.视频在线.com| 欧美性大战久久| 欧美亚洲色综久久精品国产| 久久只有精品| 欧美一区二区三区四区夜夜大片 | 日韩欧美在线视频播放| 日本午夜一本久久久综合| 日本一区二区三区视频在线观看 | 成人性生交大片免费看视频直播 | 亚洲国产日韩a在线播放| 亚洲AV成人精品| 欧美天堂亚洲电影院在线观看 | 99久久这里只有精品| 国产美女久久久| www免费在线观看| 日韩欧美色电影| 日韩精品一区二区在线播放| av亚洲精华国产精华| 色欲av无码一区二区人妻| 亚洲宅男一区| 国产精品自在线| 成人午夜在线影视| 欧美精品一区二区三区久久久| 国产精品6666| 久久色在线观看| 天天色综合社区| 亚洲五月综合| 韩国精品一区二区三区六区色诱| 日韩激情电影免费看| 国产一区二区动漫| 99热这里精品| 欧美日韩精品在线| 亚洲天堂av中文字幕| 国产精品综合一区二区三区| 丰满少妇大力进入| 精品国产中文字幕第一页| 国产在线999| 99thz桃花论族在线播放| 亚洲欧美中文日韩v在线观看| 亚洲在线精品视频| 亚洲成人av资源| 精品无码人妻一区二区免费蜜桃| 国内精品伊人久久久久av一坑| 国产高清www| 成人中文在线| 国产精品久久久久久久久久久久午夜片 | 国产精品密蕾丝视频下载| 国产日韩欧美成人| 国产黄大片在线观看| 怡红院精品视频| 丰满肥臀噗嗤啊x99av| 色婷婷久久一区二区三区麻豆| 免费高清在线观看电视| 久久色视频免费观看| 国产精品熟女一区二区不卡| 美女精品网站| 久久久久久久香蕉| 四虎成人精品永久免费av九九| 国模一区二区三区私拍视频| 欧美激情啪啪| 欧美一级大胆视频| 欧美精品videossex少妇| 在线播放日韩专区| 天天射天天色天天干| 欧美久久久久久久久中文字幕| 天堂网av手机版| 亚洲精选视频在线| 人成免费在线视频| 久久网站热最新地址| 国产原创剧情av| 韩国av一区二区三区四区| 婷婷丁香激情网| 国产一级久久| 91精品国产91久久久久麻豆 主演| 久久国产精品成人免费观看的软件| 久久精品国产美女| 91精品啪在线观看国产爱臀| 国产日韩欧美91| а√天堂资源国产精品| 欧美一区亚洲一区| а√天堂资源官网在线资源 | 日韩伦理在线一区| 久久久久久亚洲精品| 成人黄色网址| www.午夜精品| 午夜免费视频在线国产| 亚洲最大中文字幕| 国产高清在线看| 亚洲色图日韩av| 免费在线国产| 亚洲精品网站在线播放gif| 国模私拍视频在线| 欧美videossexotv100| a级片在线免费看| 91精品国产91久久久久久一区二区 | 大地资源二中文在线影视观看 | 后进极品白嫩翘臀在线播放| 久久精品国产69国产精品亚洲| a中文在线播放| 中文字幕日韩av| 9色在线视频网站| 中文字幕欧美日韩精品| 高清中文字幕一区二区三区| 国产亚洲精品久久久优势| 久久99久久| 国产亚洲成精品久久| 高清av电影在线观看| 在线视频国产日韩| 在线看免费av| 久久色精品视频| 手机在线免费av| 久久久久久久久亚洲| 国产传媒在线| 国产成人jvid在线播放| 欧美自拍电影| 国产精品永久免费视频| 亚洲欧洲二区| 成人动漫在线观看视频| 风间由美一区二区av101| 精品国产区在线| 国产免费久久| 香蕉视频在线网址| 精品动漫av| 麻豆av免费在线| 久久99精品久久久久久久久久久久| www.污网站| 成人av中文字幕| 免费一级做a爰片久久毛片潮| 日本一区二区三区国色天香| 国产午夜精品福利视频| 亚洲欧洲精品一区二区三区| 中文字幕av免费在线观看| 亚洲第一福利视频在线| 日本熟女毛茸茸| 欧美挠脚心视频网站| 亚洲av无码乱码国产麻豆| 精品无人区乱码1区2区3区在线| 成人高清网站| 国产69精品久久久| 亚洲精品粉嫩美女一区| 亚洲伊人成综合成人网| 欧美一性一交| 在线不卡日本| 亚洲色诱最新| 国产免费中文字幕| av不卡在线播放| 极品美妇后花庭翘臀娇吟小说| 亚洲一二三区不卡| 中国一级片黄色一级片黄| 日韩女优av电影在线观看| 邻居大乳一区二区三区| 欧美成人精品不卡视频在线观看| 自拍视频在线看| 亚洲free嫩bbb| 日韩成人精品一区| 欧美成人三级在线视频| 另类人妖一区二区av| 男人网站在线观看| 亚洲欧洲日产国产综合网| 国产精品第5页| 日韩欧美色综合网站| seseavlu视频在线| 8050国产精品久久久久久| 精品国产一区二| 色一情一乱一伦一区二区三欧美 | 欧美一级片在线播放| 国产精品日韩精品在线播放| 欧美一区1区三区3区公司 | 欧美黄色片免费观看| 123成人网| 精品伦精品一区二区三区视频| 小小影院久久| www.日本xxxx| 久久久99精品免费观看| 日本三级免费看| 欧美一区二区三区播放老司机| 超碰免费在线观看| 欧美在线观看网站| 久久精品国产亚洲blacked| 黄色录像特级片| 狠狠色狠狠色综合| www.xx日本| 欧美日韩在线综合| 国产二区在线播放| 热久久这里只有精品| 精品少妇3p| 日本a视频在线观看| 丁香婷婷综合色啪| 欧美黄色免费观看| 日韩欧美国产午夜精品| 羞羞网站在线免费观看| 亚洲精品日韩激情在线电影| 手机在线一区二区三区| 在线观看免费视频高清游戏推荐| 国产午夜亚洲精品午夜鲁丝片| 久久亚洲精品石原莉奈| 亚洲美女www午夜| 另类激情视频| 日本一区高清不卡| 日韩高清在线不卡| 久久久久久成人网| 欧美日韩黄视频| 黄色成年人视频在线观看| 91精品在线观看视频| 我不卡神马影院| 国产91在线免费观看| 一区二区三区欧美日| 亚洲精品久久久狠狠狠爱 | 日韩精品久久久久久免费| 亚洲视频综合网| 成人深夜福利| 国产麻豆电影在线观看| 大白屁股一区二区视频| 国产成人自拍视频在线| 精品视频久久久久久| 黑人巨大精品欧美一区二区桃花岛| 欧美日韩一区二区三| 日本午夜一区二区| 日韩va亚洲va欧美va清高| 欧美一区二区久久| av成人 com a| 欧美一区二区福利| 国产美女在线观看一区| 国产亚洲成人精品| 亚洲色图18p| 国产视频网站一区二区三区| 狠狠精品干练久久久无码中文字幕| 高清av一区二区| 狠狠人妻久久久久久| 最新国产精品亚洲| 8848成人影院| 欧美激情国产精品日韩| 国产精品伦理在线| 肥臀熟女一区二区三区| 国产成人久久久精品一区| 天天射天天综合网| 亚洲欧美高清在线| 欧美午夜精品一区二区蜜桃| 国产不卡在线| 久久超碰亚洲| 国产在线精品一区二区| 日产精品久久久久久久| 在线看日韩欧美| 9国产精品午夜| 小泽玛利亚视频在线观看| 一个色在线综合| 成人av电影观看| 国产伦精品一区二区三| 日韩成人精品在线观看| 欧美黄色免费观看| 色婷婷**av毛片一区| 欧美美女啪啪| 午夜免费视频网站| 色婷婷av一区| 爱情岛论坛亚洲品质自拍视频网站 |