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

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

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

背景

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

上去一看, 找到了原因:

原本 pickup, dropoff 兩個字段沒有數(shù)據(jù)的話, 應(yīng)該返回{}, 結(jié)果現(xiàn)在pickup字段返回了null, 而我們?nèi)≈档臅r候,也沒對這個地方做防御。

  1. list: openApiOrderInfo.pickup.address_list, 

結(jié)果就是:腳本報(bào)錯, 頁面不可用。

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

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

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

今天的主要內(nèi)容:

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

正文語種

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

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

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

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

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

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

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

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

  1. let nestedProp = obj.first?.second

這等價于以下表達(dá)式,但實(shí)際上沒有創(chuàng)建臨時變量:

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

?. 操作符的功能類似于 . 鏈?zhǔn)讲僮鞣?,不同之處在于?/p>

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

與函數(shù)調(diào)用一起使用時,如果給定的函數(shù)不存在,則返回 undefined。

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

有兩點(diǎn)需要我們留意:

如果存在一個屬性名且不是函數(shù), 使用 ?. 仍然會產(chǎn)生一個 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); 

會被轉(zhuǎn)換成:

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

 

如果層級更深, 會創(chuàng)建臨時變量用于記錄:

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

會被轉(zhuǎn)換成:

  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發(fā)布的相關(guān)些資料

Heny 目前是 babel 項(xiàng)目的負(fù)責(zé)人,之前發(fā)過一片介紹當(dāng)前 babel 困境的文章: 知名團(tuán)開源項(xiàng)目存活有多難?被數(shù)百萬人使用的 Babel 陷入財(cái)務(wù)困境

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

感興趣的可以去看看。

總結(jié)

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

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

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

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

 

責(zé)任編輯:姜華 來源: 前端皮小蛋
相關(guān)推薦

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查詢操作符

2012-02-06 09:13:23

LINQ

2009-09-16 09:09:23

Linq Contai

2010-07-14 14:18:51

Perl操作符

2009-07-21 09:31:00

Scala操作符

2010-01-28 11:16:28

C++操作符

2025-03-11 07:30:00

雙問號操作符JavaScript開發(fā)

2024-01-16 07:33:02

SwiftTypeScript可選綁定

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標(biāo)量

2009-11-30 16:48:08

PHP操作符
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美在线视频二区 | 在线视频中文字幕 | 国产高清视频在线观看 | 精品国产欧美一区二区三区成人 | 亚洲国产精品一区 | 中文字幕视频在线 | 成人av片在线观看 | 在线日韩欧美 | 亚洲午夜视频 | 中文字幕在线观看一区 | av中文字幕在线播放 | 亚洲成人精品一区 | 日韩精品福利 | 91视频在线| 一区二区三区欧美大片 | 在线婷婷 | 久久久久国产精品 | 九九亚洲| 国产高清视频在线观看 | 仙人掌旅馆在线观看 | 午夜成人免费视频 | 夜夜骑首页 | 久久久久久99 | www.亚洲免费 | 亚洲欧美日韩网站 | 97caoporn国产免费人人 | 激情五月综合 | 欧美一区二区三区在线观看 | 久久久久九九九九 | 在线视频国产一区 | 国产成人精品在线 | 国产精品久久久久久久久久久久久 | 高清亚洲| 久久久久国产精品一区二区 | 成人二区三区 | 成人不卡 | 国产精品嫩草影院精东 | 性高湖久久久久久久久 | 国产一区视频在线 | 日韩精品中文字幕一区二区三区 | 激情五月综合 |