国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - 頁面白屏了?看看可選鏈操作符(?.)

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

2021-05-20 23:39前端皮小蛋南山皮小蛋 編程技術

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

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

背景

 

今天又被 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 看文檔吧。

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

原文鏈接:https://mp.weixin.qq.com/s/QKF1K-GQfNl_ha20xAcejg

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日比毛片| 欧美一级淫片丝袜脚交 | 国产精品成人国产乱一区 | 中文字幕一区二区三区乱码图片 | 奇米在线777| 免费看国产一级片 | 成人免费观看视频大全 | 亚洲国产精品成人女人久久久 | 黄色大片aaaa | 高清久久久 | 一级毛片免费版 | 999国产在线 | av网站有哪些 | 欧美另类专区 | 色婷婷国产精品综合在线观看 | 亚洲国产成人av | 亚洲第一免费播放区 | 久久精品国产99 | www.欧美日韩 | 亚洲免费视频一区二区 | 国产精品一二三在线观看 | 福利视频一区二区三区 | 四虎中文字幕 | 久久久www成人免费精品 | 国产视频亚洲 | 免费一级在线视频 | 国产91精品一区二区绿帽 | 97超碰免费| 四季久久免费一区二区三区四区 | 日本一区二区三区精品视频 | 国产精品三级视频 | 国产精品视频在线观看 | 99在线视频精品 | 成人免费毛片高清视频 | 国产成人网| 国产成人精品电影 | 国产在线视频一区 | 成人高清视频在线观看 | 欧美性网| 97超碰在线播放 | 亚洲 自拍 另类 欧美 丝袜 |