成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

頁面白屏了?看看可選鏈操作符(?.)

開發 前端
可選鏈操作符(?.)允許讀取位于連接對象鏈深處的屬性的值,而不必明確驗證鏈中的每個引用是否有效。

背景

今天又被 QA 找: 這個頁面昨天還好好的, 今天就白屏了, 是不是你代碼有問題啊, 趕緊看看。

上去一看, 找到了原因:

原本 pickup, dropoff 兩個字段沒有數據的話, 應該返回{}, 結果現在pickup字段返回了null, 而我們取值的時候,也沒對這個地方做防御。

  1. list: openApiOrderInfo.pickup.address_list, 

結果就是:腳本報錯, 頁面不可用。

解決起來也很簡單, 要么給個默認值, 要么使用 ?. 做一層防御。

改完再試一下, 就 OK 了, 頁面恢復正常。

下面我們就說一下這個 ?.

今天的主要內容:

  • 什么是可選鏈操作符(?.)
  • 如何啟用這個功能
  • 可選鏈操作符(?.) 是如何工作的
  • Heny發布的相關些資料
  • 總結

正文語種

可選鏈操作符(?.), 大家都很熟悉了,這里再簡單回顧一下。

什么是可選鏈操作符(?.)

可選鏈操作符(?.)允許讀取位于連接對象鏈深處的屬性的值,而不必明確驗證鏈中的每個引用是否有效。

比如,思考一個存在嵌套結構的對象 obj。不使用可選鏈的話,查找一個深度嵌套的子屬性時,需要驗證之間的引用,例如:

  1. let nestedProp = obj.first && obj.first.second

為了避免報錯,在訪問obj.first.second之前,要保證 obj.first 的值既不是 null,也不是 undefined。

如果只是直接訪問 obj.first.second,而不對 obj.first 進行校驗,則有可能拋出錯誤。

有了可選鏈操作符(?.),在訪問 obj.first.second 之前,不再需要明確地校驗 obj.first 的狀態,再并用短路計算獲取最終結果:

  1. let nestedProp = obj.first?.second

這等價于以下表達式,但實際上沒有創建臨時變量:

  1. let temp = obj.first
  2. let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second); 

?. 操作符的功能類似于 . 鏈式操作符,不同之處在于:

在引用為空(nullish) (null 或者 undefined) 的情況下不會引起錯誤,該表達式短路返回值是: undefined。

與函數調用一起使用時,如果給定的函數不存在,則返回 undefined。

當嘗試訪問可能不存在的對象屬性時,使用可選鏈操作符將會使表達式更短、更簡明。

有兩點需要我們留意:

如果存在一個屬性名且不是函數, 使用 ?. 仍然會產生一個 TypeError 異常 (x.y is not a function).

  1. let result = someInterface.customMethod?.(); 

如果 someInterface 自身是 null 或者 undefined ,異常 TypeError 仍會被拋出。

如果你希望允許 someInterface 也為 null 或者 undefined,那么你需要像這樣寫 someInterface?.customMethod?.()

可選鏈不能用于賦值

  1. let object = {}; 
  2. object?.property = 1; // Uncaught SyntaxError: Invalid left-hand side in assignment 

如何啟用這個功能

  1. // install 
  2. npm install --save-dev @babel/plugin-proposal-optional-chaining 
  3.  
  4. // babel config 
  5.  "plugins": [ 
  6.     "@babel/plugin-proposal-optional-chaining" //可選鏈 
  7.     "@babel/plugin-proposal-nullish-coalescing-operator", //雙問號 
  8.   ] 

可選鏈操作符(?.) 是如何工作的

  1. const a = { 
  2.   b: 1 
  3. }; 
  4.  
  5. console.log(a?.b); 

會被轉換成:

  1. const a = { 
  2.   b: 1 
  3. }; 
  4.  
  5. console.log(a === null ? void 0 : a.b); 

 

如果層級更深, 會創建臨時變量用于記錄:

  1. const a = { 
  2.   b: { 
  3.     c: 1, 
  4.     d: 2, 
  5.   } 
  6. }; 
  7.  
  8. console.log(a?.b?.c) 

會被轉換成:

  1. var _a$b; 
  2.  
  3. const a = { 
  4.   b: { 
  5.     c: 1, 
  6.     d: 2 
  7.   } 
  8. }; 
  9. console.log( 
  10.   a === null || a === void 0 
  11.     ? void 0  
  12.     : (_a$b = a.b) === null || _a$b === void 0 
  13.       ? void 0 
  14.       : _a$b.c 
  15. ); 

 

Heny發布的相關些資料

Heny 目前是 babel 項目的負責人,之前發過一片介紹當前 babel 困境的文章: 知名團開源項目存活有多難?被數百萬人使用的 Babel 陷入財務困境

上圖推文鏈接:https://twitter.com/left_pad/status/1136282005170262016

感興趣的可以去看看。

總結

?. 使用起來是非常方便的, 但如果用的不好, 也會隱藏本應該暴露出來的問題。

所以, 使用的時候一定要清楚自己在做什么。

?. 還有個小兄弟叫 空值合并運算符(??), 這里就不說了, 去 MDN 看文檔吧。

今天就這么多, 希望對大家有所啟發。

 

責任編輯:姜華 來源: 前端皮小蛋
相關推薦

2021-10-31 18:59:55

Python操作符用法

2010-07-14 14:55:07

Perl操作符

2009-08-19 17:26:28

C# 操作符

2011-02-25 09:36:06

java操作符

2011-04-08 16:26:14

JavaScript

2010-07-14 14:30:31

Perl操作符

2010-07-19 11:00:24

Perl操作符

2009-09-15 17:16:58

LINQ查詢操作符

2010-07-14 14:18:51

Perl操作符

2012-02-06 09:13:23

LINQ

2009-09-16 09:09:23

Linq Contai

2009-07-21 09:31:00

Scala操作符

2010-01-28 11:16:28

C++操作符

2025-03-11 07:30:00

雙問號操作符JavaScript開發

2016-12-28 09:54:50

AndroidRxJava操作符

2017-01-03 16:12:13

RxJava操作符Android

2009-07-14 18:34:22

Jython操作符重載

2010-07-13 11:11:39

Perl標量

2009-11-30 16:48:08

PHP操作符

2024-01-16 07:33:02

SwiftTypeScript可選綁定
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www亚洲精品| 岛国一区 | 波多野结衣中文字幕一区二区三区 | www视频在线观看 | 亚洲一区欧美一区 | 天天看天天操 | 国外成人在线视频 | 久久久久久成人 | 韩日av片 | 国产视频久久 | av黄色免费在线观看 | 亚洲国产精品久久人人爱 | av片毛片 | 91精品国产乱码久久蜜臀 | 久久一久久 | 欧美精品一区二区免费视频 | 久久久久久久av麻豆果冻 | 欧美日韩电影一区二区 | 午夜在线小视频 | 综合五月 | 国产精品成人在线 | 欧洲一区二区在线 | 成人精品一区二区 | 日韩成人影院 | 成年人在线视频 | 在线欧美日韩 | 81精品国产乱码久久久久久 | 亚洲国产成人av好男人在线观看 | 精品欧美二区 | 亚洲视频精品 | 国产色视频网站 | 欧美一区二区三区在线观看视频 | 一区二区三区久久久 | 久久亚洲天堂 | 日韩精品久久久久久 | 国产伦精品 | 综合网在线| 一区二区三区国产 | 精产国产伦理一二三区 | 中文字幕一区二区三区在线视频 | 久草综合在线视频 |