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

為什么我喜歡 JavaScript 可選鏈

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

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

[[280007]]

截至2019年8月,一項新提案可選鏈(optional chaining)進入了第3階段,將是一個很好的改進。可選的鏈接更改了從深層對象結構訪問屬性的方式。

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

1. 問題

由于 JavaScript 的動態特性,一個對象可以具有非常不同的對象嵌套結構。

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

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

盡管這為對象提供了支持不同數據的靈活性,但是在訪問此類對象的屬性時,隨之而來的是增加了復雜性。

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

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

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

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

最好不要這樣寫,因為包含了太多的樣板代碼。。

讓我們看看可選鏈是如何解決此問題,從而減少樣板條件的。

2. 輕松深入訪問屬性

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

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

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

讓我們寫一個獲取導演姓名的函數。請注意 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 對象的導演的時,JavaScript 會引發錯誤 TypeError: Cannot read property 'name' of undefined。

這是用了可選鏈功能并刪除 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 表達式中,你可以找到 ?.:可選鏈運算符。

對于 movieSmall,缺少屬性 director。結果 movie.director?.name 的計算結果為 undefined。可選鏈運算符可防止引發 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

?. 通過減少兩行代碼簡化了 getDirector() 函數。這就是為什么我喜歡可選鏈的原因。

2.1 數組項

可選鏈能還可以做更多的事。你可以在同一表達式中自由使用多個可選鏈運算符。甚至可以用它安全地訪問數組項!

下一個任務編寫一個返回電影主角姓名的函數。

在電影對象內部,actor 數組可以為空甚至丟失,所以你必須添加其他條件:

  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。

使用可選鏈,這個任務就很容易解決:

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

actors?. 確保 actors 屬性存在。 [0]?. 確保列表中存在第一個參與者。這真是個好東西!

3. 默認為Nullish合并

一項名為nullish 合并運算符的新提案會處理 undefined 或 null ,將其默認設置為特定值。

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

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

當鏈評估為 undefined 時,通過將默認值設置為零,Nullish 合并可以改善可選鏈。

例如,讓我們更改 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. 可選鏈的3種形式

你可以通過以下 3 種形式使用可選鏈。

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

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

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

  1. const object = null
  2. const name = 'property'
  3. object?.[name]; // => undefined 
  1. const array = null
  2. 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 處停止

可選鏈運算符的有趣之處在于,一旦在其左側 leftHandSide?.rightHandSide 上遇到空值,就會停止對右側訪問器的評估。這稱為短路。

看一個例子:

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

nothing 保留一個空值,因此可選鏈立即求值為 undefined,并跳過右側訪問器的求值。因為 index 的值沒有增加。

6. 何時使用可選鏈

要抵制使用可選鏈運算符訪問任何類型屬性的沖動:這會導致錯誤的用法。下一節將說明何時正確使用它。

6.1 可能無效的訪問屬性

必須僅在可能為空的屬性附近使用 ?.: maybeNullish?.prop。在其他情況下,請使用老式的屬性訪問器:.property 或 [propExpression]。

調用電影對象。查看表達式 movie.director?.name,因為 director 可以是 undefined,所以在 director 屬性附近使用可選鏈運算符是正確的。

相反,使用 ?. 訪問電影標題 movie?.title 沒有任何意義。電影對象不會是空的。

  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.  
  11.   // movie doesn't need optional chaining 
  12.   console.log(movie?.title); 

6.2 通常有更好的選擇

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

嘗試用可選鏈運算符:

  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 

雖然函數可以正確地確定元素是否具有填充,但是為每個屬性使用可選鏈是毫無必要的。

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

  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. 我為什么喜歡它?

我喜歡可選鏈運算符,因為它允許輕松地從嵌套對象中訪問屬性。它可以防止編寫針對訪問者鏈中每個屬性訪問器上的空值進行驗證的樣板代碼。

當可選鏈與空值合并運算符結合使用時,可以得到更好的結果,從而更輕松地處理默認值。

責任編輯:華軒 來源: segmentfault
相關推薦

2019-08-28 10:53:35

JavaScriptOptional Ch代碼

2012-04-04 22:07:12

Android

2009-06-04 17:33:08

EJB 3.1EJB 3.0

2025-01-15 09:06:58

CSSRegEx前端

2023-09-14 08:00:00

基于主干的開發分支模型

2017-11-30 15:25:04

EclipseGo項目

2017-09-11 19:58:06

PostgreSQLMySQL數據庫

2020-07-28 10:45:51

數據庫三范式MySQL

2015-10-26 09:58:53

程序員主流

2018-01-15 05:54:45

數據庫讀寫分離互聯網

2018-01-09 18:46:44

數據庫架構讀寫分離

2024-01-16 07:33:02

SwiftTypeScript可選綁定

2025-07-28 08:26:48

CSStext-wrap屬性

2021-04-18 12:37:46

bspwmLinux窗口管理器

2019-04-22 14:20:08

區塊鏈數字貨幣比特幣

2019-11-18 09:56:48

谷歌Go語言開發者

2025-08-20 08:21:16

2012-05-14 08:55:23

Android

2025-06-11 03:22:00

JavaScript開發前端
點贊
收藏

51CTO技術棧公眾號

午夜老司机精品| 国产99久久久欧美黑人| 成人情视频高清免费观看电影| 中文字幕五月天| 精品视频高潮| 欧美三级视频在线观看| 欧美黄色免费网址| 日韩av地址| 国产一区二区三区蝌蚪| 欧美中文字幕视频在线观看| 久久午夜精品视频| 开心激情综合| 3d动漫精品啪啪| 国产1区2区在线| 色在线视频网| 欧美国产精品一区二区三区| 91丨九色丨国产| 国产精品sm调教免费专区| 国产综合亚洲精品一区二| 国产亚洲精品一区二555| 免费看毛片的网址| h视频网站在线观看| 成人高清视频免费观看| 精品中文字幕在线2019| 在线观看日本中文字幕| 第一区第二区在线| 午夜久久电影网| 超碰97在线人人| 中文字幕一区二区在线视频| 亚洲女同在线| 欧美精品video| 裸体武打性艳史| 欧美高清视频手机在在线| 欧美图片一区二区三区| 久久久久久久中文| 污污影院在线观看| 亚洲人成在线播放网站岛国| 手机看片福利永久国产日韩| 日韩精品系列| 99麻豆久久久国产精品免费| 91精品久久久久久蜜桃| 国产精品久久久久久免费免熟| 天堂午夜影视日韩欧美一区二区| 久久人人爽人人爽人人片av高请| 欧美爱爱小视频| 中文不卡在线| 操日韩av在线电影| 私库av在线播放| 影音先锋成人在线电影| 久久在线视频在线| 久草视频手机在线| 香蕉国产精品| 欧美大尺度在线观看| 中国毛片直接看| 一区二区三区毛片免费| 久久国产色av| 久久久国产精品黄毛片| 狠狠爱综合网| 国内免费久久久久久久久久久| 中文字幕第28页| 中文久久精品| 日本高清视频一区| 日韩精选在线观看| 美女国产一区二区三区| 欧美高清性猛交| 欧美日韩激情在线观看| 影音先锋久久| 全亚洲最色的网站在线观看| 免费在线不卡av| 九色porny丨国产精品| 亚洲va欧美va国产综合久久| 精品国产18久久久久久| 国产69精品久久久久毛片| 国产欧美综合精品一区二区| 性xxxx视频| 国产日韩亚洲欧美综合| 一区二区三区四区五区精品 | 亚洲欧美一级| 91精品国产乱| 99视频精品免费| 欧美一级做a| 天天做天天摸天天爽国产一区 | 亚洲综合久久av一区二区三区| 五月激情综合| 久久久人成影片一区二区三区| 久久国产黄色片| 91av精品| 午夜精品久久久久久久久久久久久 | 免费av网站在线| 欧美aaaaaa午夜精品| 久久久在线视频| 特级做a爱片免费69| 免费看精品久久片| 国产精品青青草| 番号集在线观看| 亚洲自拍偷拍图区| 国产免费视频传媒| www.爱久久| 宅男66日本亚洲欧美视频| 免费麻豆国产一区二区三区四区| 久久久久久久波多野高潮日日| 成人在线中文字幕| av女名字大全列表| 亚洲男人的天堂在线aⅴ视频| 日韩av片在线看| www.久久久.com| 亚洲欧洲一区二区三区在线观看 | 久久av高潮av| 亚洲精品国产嫩草在线观看| 精品久久一区二区| 中文字幕一二三区| 精品视频在线播放一区二区三区| 日韩精品一区二区三区第95| 亚洲欧美小视频| 日韩成人免费电影| 国产无套精品一区二区| 免费网站看v片在线a| 国产精品人人做人人爽人人添| 国产成人永久免费视频| 欧美亚洲人成在线| 亚洲人精品午夜在线观看| 久久亚洲国产成人精品性色| 久久成人免费网| 热re99久久精品国产99热| wwwwxxxx在线观看| 欧美一卡二卡三卡四卡| 黑人と日本人の交わりビデオ| 国产日韩欧美高清免费| 国产精品成人观看视频免费| 99视频免费在线观看| 欧美日韩国产美| 一区二区伦理片| 午夜影院日韩| 免费国产一区二区| 老色鬼在线视频| 亚洲精品福利在线| 国产无遮挡又黄又爽在线观看| 国产高清无密码一区二区三区| 一区二区免费在线视频| 成人国产一区| 一区二区三区视频在线| 天天干天天操天天操| 国产婷婷色一区二区三区四区| www.四虎成人| 精品高清久久| 国产精品天天狠天天看| eeuss影院在线播放| 欧美色中文字幕| 日日操免费视频| 激情综合色综合久久| 中文字幕一区二区三区5566| 欧洲亚洲精品久久久久| www.日韩av.com| 国产强被迫伦姧在线观看无码| 亚洲欧美自拍偷拍色图| 肉色超薄丝袜脚交| 欧美午夜一区二区福利视频| 欧美一区二区三区图| 天堂在线观看av| 色综合久久66| 免费视频91蜜桃| 久久精品国产免费| 成年人三级视频| www.成人网| 全球成人中文在线| 午夜在线播放| 日韩一区二区三区电影在线观看 | 插我舔内射18免费视频| 国产精品亚洲欧美| 日韩亚洲视频| 日韩成人精品| 77777少妇光屁股久久一区| 中文字幕永久在线视频| 亚洲色图第一区| 一级黄色电影片| 亚洲一区二区伦理| 亚洲欧洲另类精品久久综合| 成人污污视频| 51视频国产精品一区二区| www.91在线| 日韩欧美亚洲国产精品字幕久久久 | 久久av免费看| 成人黄色大片在线免费观看| 性欧美video高清bbw| 亚洲国产一区二区三区在线观看| 特级毛片www| 亚洲视频免费看| 青青草成人免费视频| 另类调教123区| 性欧美大战久久久久久久| 欧美日韩激情| 国产精品久久久久av福利动漫| 手机看片久久| 日韩精品在线观看一区| 亚洲自拍第二页| 精品久久久久久国产91| 91香蕉视频污在线观看| av网站免费线看精品| 中文字幕中文在线| 国产亚洲精品v| 中文字幕第50页| 女人丝袜激情亚洲| 成人一区二区在线| 欧美成人xxxx| 日本亚洲欧美三级| 女子免费在线观看视频www| 最好看的2019年中文视频| 少妇喷水在线观看| 欧美一区二区高清| 在线视频 91| 日韩欧美一区二区在线| 久久人人爽人人爽人人| 国产精品伦一区| 91精品人妻一区二区| 风间由美性色一区二区三区| 色噜噜狠狠一区二区| 视频在线观看一区二区三区| 蜜臀av色欲a片无码精品一区| 我不卡影院28| 亚洲一区二区免费视频软件合集| 亚洲a级精品| 国产亚洲欧美一区二区三区| 日本免费一区二区视频| 国产日韩在线视频| 久久91导航| 欧美最猛性xxxxx亚洲精品| 91在线三级| 欧美激情在线观看| 日韩伦理电影网站| 欧美床上激情在线观看| 老司机av在线免费看| 日韩欧美二区三区| 国产精品乱码久久久| 在线观看网站黄不卡| 污污视频网站在线免费观看| 91热门视频在线观看| 星空大象在线观看免费播放| 国产.欧美.日韩| 麻豆tv在线观看| 国产黑丝在线一区二区三区| 四虎国产精品免费| 国产激情一区二区三区桃花岛亚洲| 在线一区二区不卡| 国产精品一区三区| 97精品人人妻人人| 成人av在线一区二区三区| 亚洲精品无码一区二区| 成人在线视频一区| 三级视频网站在线观看| 久久在线免费观看| 69精品无码成人久久久久久| 国产精品五月天| 中日韩一级黄色片| 一区二区三区中文在线观看| 久久精品一区二区三| 午夜久久福利影院| 国产三级精品三级在线观看| 欧美在线色视频| 一级黄色大片免费观看| 欧美一级片免费看| 日本韩国在线观看| 亚洲男人天堂2019| 91精品专区| 欧美久久精品一级黑人c片| 女同视频在线观看| 茄子视频成人在线| 色999韩欧美国产综合俺来也| 成人日韩在线电影| 成人午夜大片| 日本一区视频在线观看| 国产精品麻豆久久| 欧美精品卡一卡二| 日韩av中文字幕一区二区三区| 亚洲综合av在线播放| 国产69精品久久久久毛片| 最新中文字幕视频| 国产精品对白交换视频| 精品在线视频免费观看| 色婷婷久久久久swag精品| 一级黄色小视频| 亚洲精品www| 日韩免费啪啪| 91av视频在线播放| 婷婷激情成人| 久久国产精品久久| 91av精品| 日韩免费毛片视频| 国产精品一区二区x88av| 美女又爽又黄视频毛茸茸| 中文字幕一区二区三| 西西44rtwww国产精品| 亚洲精品国产高清久久伦理二区| 国产精品16p| 欧美日本不卡视频| 涩爱av在线播放一区二区| 久热99视频在线观看| 成人欧美大片| 成人av免费电影| 久久中文字幕av| 每日在线更新av| 国产毛片精品国产一区二区三区| 无码人妻精品一区二区三区温州| 亚洲私人影院在线观看| 欧美日韩综合一区二区三区| 欧美大片在线观看一区二区| av在线首页| 人人做人人澡人人爽欧美| 亚洲不卡视频| 在线免费一区| 日本va欧美va精品发布| 黄色污在线观看| 一区二区三区久久| 国产精品久久久久久久久久久久久久久久 | 久久男人av资源网站| 亚洲精品777| 日韩区国产区| 久久久精品五月天| 自拍视频一区二区| 亚洲一区日韩精品中文字幕| 亚洲一卡二卡在线观看| 亚洲三级黄色在线观看| 黄色污网站在线观看| 岛国视频一区| 欧美精品一区二区三区久久久竹菊| 麻豆一区二区三区视频| 久久久久综合网| 久久久精品免费看| 亚洲第一国产精品| 成人免费高清观看| 成人自拍爱视频| 亚洲欧美一区在线| 9色porny| 国产成人免费av在线| 国产一二三四区| 欧美一区二区日韩| 成视频免费观看在线看| 国内偷自视频区视频综合| 日韩激情综合| 欧美另类videosbestsex日本| 国产在线精品国自产拍免费| 日本一级片免费| 制服丝袜亚洲色图| 成人在线播放| 99视频网站| 在线看片成人| 97香蕉碰碰人妻国产欧美| 亚洲成a人片在线不卡一二三区| 亚洲奶汁xxxx哺乳期| 久久久久久国产精品| 噜噜噜天天躁狠狠躁夜夜精品| 日韩小视频在线播放| www欧美成人18+| 亚洲av无码乱码国产精品fc2| 在线观看欧美日韩| 国产一区高清| 加勒比海盗1在线观看免费国语版| 国产婷婷精品| 性猛交娇小69hd| 欧美日韩不卡一区| 2021国产在线| 久久99国产精品| 日韩精品三区四区| 久久精品日韩无码| 欧美大片一区二区| 色是在线视频| 午夜精品区一区二区三 | 亚洲av成人片无码| 精品福利免费观看| 国产黄在线观看| 92国产精品视频| 亚洲茄子视频| 中文字幕人妻一区二区三区在线视频| 欧美日韩一区二区三区免费看| av免费在线免费| 精品久久中出| 麻豆久久一区二区| 久久精品这里只有精品| 亚洲欧美在线第一页| 伊人久久大香| 国产特级淫片高清视频| 国产欧美一二三区| 国产99久一区二区三区a片| 97在线观看视频| 欧美国产一级| 欧美成人三级伦在线观看| 欧美午夜寂寞影院| 欧美xxxx视频| 视频一区在线免费观看| 国产sm精品调教视频网站| 手机看片久久久| 欧美大片欧美激情性色a∨久久| 久草成人在线| 欧洲成人午夜精品无码区久久| 日本高清视频一区二区| 麻豆蜜桃在线| 这里只有精品66| 久久综合色鬼综合色| 99久久精品日本一区二区免费| 欧美专区在线播放| 欧美成熟视频|