最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript?新提案optional?chaining可選鏈屬性原理詳解

 更新時間:2023年05月22日 14:05:27   作者:DongL  
這篇文章主要為大家介紹了JavaScript?新提案optional?chaining可選鏈屬性原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Optional chaining

這是一項新的提案,老舊瀏覽器可能需要 polyfills。

Optional chaining ?.(可選鏈,以下簡稱 OC)是一種以安全的方式去訪問嵌套的對象屬性,即使某個屬性根本就不存在。

起因:

一個在 JavaScript 中很常見的問題就是:假如用戶信息中,地址是可填可不填的,那我們就無法安全地訪問地址的某一個屬性:

let user = {}; // 用戶可能沒有填地址
alert(user.address.street); // 報錯

或者下面這種情況,在 WEB 開發(fā)中,我們可能需要去獲取一個 DOM 元素,但是這個 DOM 元素可能不存在:

// 當 querySelector(...) 的結果為 null 的時候,程序會報錯
let html = document.querySelector('.my-element').innerHTML;

在 OC ?. 出現(xiàn)之前,我們一般通過邏輯與操作來解決:

let user = {}; // 沒有地址的用戶
alert( user && user.address && user.address.street ); // undefined (不會報錯)

使用邏輯與操作符可以確保表達式的所有部分都能夠正確執(zhí)行,但是寫法卻比較笨重。

Optional chaining(可選鏈)

OC ?. 能夠使代碼變得簡便,當位于其前的值為 undefined 或者是 null 時,會立即阻止代碼的執(zhí)行,并且返回 undefined。

通過 OC,我們可以安全地訪問用戶的地址:

let user = {}; // 一個沒有地址的用戶
alert( user?.address?.street ); // undefined (不會報錯)

即使 user 對象不存在,使用 OC 訪問它的地址屬性也不會報錯:

let user = null;
alert( user?.address ); // undefined
alert( user?.address.street ); // undefined

需要注意的是,OC 僅允許它前面相鄰的部分為可選項,不包括進一步的值。

在上面的代碼中,user?. 僅允許 user 這個對象為 null 或 undefined 。

另一方面,如果 user 這個對象真的存在,那么 user.address 這個屬性必須存在,否則訪問 user?.address.street 則會在第二個點這報錯。

不要過度使用 OC

我們應該僅在希望某個值可能不存在的情況下才使用 ?.例如,根據(jù)我們的代碼邏輯,user 對象必須存在,但是 address 屬性是可選的,所以 user.address?.street 才是更好的選擇。
所以,由于其他原因導致的 user 對象為 undefined 的情況才能被快速發(fā)現(xiàn)。否則,bug 將會變得比較難找

位于 ?. 前的變量必須被顯示聲明

如果 user 這個變量根本沒有被聲明,那么 user?.anything 將會觸發(fā)一個錯誤:

// ReferenceError: user is not defined
user?.address;

此處必須有變量聲明語句 let/const/var, OC 對未聲明的變量無效

短路

在上文提到,在OC ?. 的前部分的值為 null 或 undefined 的時候,會立即停止執(zhí)行。
所以,如果在其后面如果有函數(shù)的調用,或者其他操作,都不會執(zhí)行。

let user = null;
let x = 0;
user?.sayHi(x++); // 什么都不會做
alert(x);   // 0,值沒有自增

其他用法:?.(),?.[]

OC 不是一個操作符,而是一個特別的語法糖,所以可以和函數(shù)調用和中括號共用。

例如,?.()可以用于執(zhí)行一個可能不存在的函數(shù)。

下面的代碼中,一些用戶擁有 admin 方法,一些用戶沒有:

let user1 = {
    admin() {
        alert("I am admin");
    }
};
let user2 = {};
user1.admin?.(); // I am admin
user2.admin?.();

我們首先用點語法去獲取 admin 方法,因為 user 對象肯定存在,所以我們可以安全地去訪問;
然后使用 ?.() 檢查其左側,如果 admin 這個方法存在,就執(zhí)行(例如 user1),否則就停止執(zhí)行,但是不報錯(例如 user2)。

?.語法同樣可以在當我們需要通過中括號去訪問屬性時使用,使用它可以安全的訪問一個或許還不存在的對象的屬性:

let user1 = {
    firstName: "John"
};
let user2 = null; // 假如現(xiàn)在不能授權這個用戶
let key = "firstName";
alert( user1?.[key] ); // John
alert( user2?.[key] ); // undefined
alert( user1?.[key]?.something?.not?.existing ) // undefined

?. 同樣可以與 delete操作符共用

delete user?.name;  // 刪除用戶名,如果用戶存在的話

使用 ?. 可以進行刪除和讀取操作,但是不能進行賦值操作

在賦值運算符的左側,?. 無效

// 下面的代碼是假設現(xiàn)在需要在用戶存在的情況下,重新賦值 name 屬性
user?.name = "John"; // 報錯
// 等同于 undefined = "John"

總結

OC ?. 有三種形式:

  • obj?.prop - 如果 obj 存在的話,返回 obj.prop 的值,否則返回 undefined;
  • obj?.[prop] - 如果 obj 存在的話返回 obj[prop] 的值,否則返回 undefined;
  • obj?.method() - 如果 obj 存在的話則調用 obj.method() 方法,否則返回 undefined。

這幾種形式都非常的直觀并且易于使用。?. 檢查左側的值是否為 null 或 undefine,如果不是的話則繼續(xù)執(zhí)行。

通過鏈式的 ?. 可以安全地訪問嵌套的對象。

我們應該僅在當左側的值可能不存在的情況下才使用 ?.,這樣在發(fā)生錯誤的時候才能更加容易找到問題。

參考鏈接:

https://javascript.info/optio...

https://developer.mozilla.org...

https://tc39.es/ecma262/#prod...

以上就是JavaScript 新提案optional chaining可選鏈的詳細內容,更多關于JavaScript可選鏈的資料請關注腳本之家其它相關文章!

相關文章

  • javascript實現(xiàn)異形滾動輪播

    javascript實現(xiàn)異形滾動輪播

    這篇文章主要為大家詳細介紹了javascript實現(xiàn)異形滾動輪播,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • js防阻塞加載的實現(xiàn)方法

    js防阻塞加載的實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨s防阻塞加載的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • Bootstrap彈出框(modal)垂直居中的問題及解決方案詳解

    Bootstrap彈出框(modal)垂直居中的問題及解決方案詳解

    這篇文章主要介紹了Bootstrap彈出框(modal)垂直居中的問題及解決方案詳解的相關資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • JavaScript獲取服務器端時間的方法

    JavaScript獲取服務器端時間的方法

    這篇文章主要介紹了JavaScript獲取服務器端時間的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • javascript實現(xiàn)的一個帶下拉框功能的文本框

    javascript實現(xiàn)的一個帶下拉框功能的文本框

    這篇文章主要介紹了javascript實現(xiàn)的一個帶下拉框功能的文本框,需要的朋友可以參考下
    2014-05-05
  • 前端開發(fā)基礎javaScript的六大作用

    前端開發(fā)基礎javaScript的六大作用

    這篇文章主要介紹了前端開發(fā)基礎javaScript的六大作用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • JavaScript之Getters和Setters 平臺支持等詳細介紹

    JavaScript之Getters和Setters 平臺支持等詳細介紹

    現(xiàn)在,JavaScript的Getters和Setters使用非常廣泛,它和每個JavaScript開發(fā)者的切身利益息息相關,我們先來快速了解什么是Getters和Setters,以及它們?yōu)槭裁春苡杏?然后,我們來看看現(xiàn)在都有哪些平臺支持Gettets和Setters
    2012-12-12
  • 微信小程序使用wx.navigateTo路由跳轉層級限制問題小結

    微信小程序使用wx.navigateTo路由跳轉層級限制問題小結

    在微信小程序開發(fā)中,wx.navigateTo和wx.redirectTo是兩種頁面跳轉方式,wx.navigateTo允許跳轉到新頁面并保留當前頁面,適合需要返回的場景,但受頁面棧10層限制,wx.redirectTo則關閉當前頁面后跳轉,本文介紹微信小程序使用wx.navigateTo路由跳轉層級限制問題
    2024-10-10
  • 詳解js中構造流程圖的核心技術JsPlumb(2)

    詳解js中構造流程圖的核心技術JsPlumb(2)

    這篇文章主要介紹了js中構造流程圖的核心技術JsPlumb,jsPlumb是一個強大的JavaScript連線庫,它可以將html中的元素用箭頭、曲線、直線等連接起來,適用于開發(fā)Web上的圖表、建模工具等,需要的朋友可以參考下
    2015-12-12
  • 簡單實現(xiàn)js鼠標跟隨效果

    簡單實現(xiàn)js鼠標跟隨效果

    這篇文章主要教大家如何簡單實現(xiàn)js鼠標跟隨效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評論

鄂州市| 南召县| 桦川县| 乳源| 龙岩市| 中江县| 建水县| 泊头市| 上虞市| 德兴市| 城口县| 蒙山县| 明溪县| 阳曲县| 乌兰察布市| 额济纳旗| 盘山县| 淳化县| 崇义县| 娄烦县| 南木林县| 米脂县| 梅州市| 牙克石市| 宜兰县| 东乡族自治县| 湖州市| 余庆县| 滨海县| 南川市| 乌兰浩特市| 肇州县| 宁城县| 从江县| 临安市| 镇原县| 东辽县| 宁远县| 冀州市| 舒城县| 东兰县|