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

JS?可選鏈的三種形勢(shì)及好處詳解

 更新時(shí)間:2023年05月22日 14:18:42   作者:前端小智  
這篇文章主要為大家介紹了JS?可選鏈的三種形勢(shì)及好處詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

JS的一些特性極大地改變了咱們的編碼方式。從ES6年開始,對(duì)咱們代碼影響最大的特性的解 、箭頭函數(shù)、類和模塊系統(tǒng)。

到2019年8月,一個(gè)新的可選鏈提案已經(jīng)進(jìn)入第三階段,這是一個(gè)很好的改進(jìn)。可選鏈接改變了從深層對(duì)象結(jié)構(gòu)訪問屬性的方式。

來看看這是又是什么騷操作。

問題

由于JS的動(dòng)態(tài)特性,對(duì)象可以具有多層不同的嵌套對(duì)象結(jié)構(gòu)。

通常,當(dāng)咱們處理以下這些對(duì)象時(shí):

  • 獲取遠(yuǎn)程JSON數(shù)據(jù)
  • 使用配置對(duì)象
  • 有可選屬性

雖然JS為對(duì)象支持不同層次數(shù)據(jù)結(jié)構(gòu),但是在訪問此類對(duì)象的屬性時(shí),復(fù)雜性也隨著增加。

1.bigObject可以在運(yùn)行時(shí)擁有不同的屬性集

// 嵌套版本
const bigObject = {
  // ...
  prop1: {
    //...
    prop2: {
      // ...
      value: 'Some value'
    }
  }
};
// 簡單版本
const bigObject = {
  // ...
  prop1: {
    // Nothing here   
  }
};

因此,必須手動(dòng)檢查屬性是否存在

if (bigObject && 
    bigObject.prop1 != null && 
    bigObject.prop1.prop2 != null) {
  let result = bigObject.prop1.prop2.value;
}

這樣寫太過冗長了,最好避免寫它。

咱們來看看可選鏈如何解決這個(gè)問題,以減少冗余的代碼。

2. 易于深入訪問屬性

設(shè)計(jì)一個(gè)保存電影信息的對(duì)象。 該對(duì)象包含必填title屬性,以及可選的directoractors。

movieSmall對(duì)象僅包含title,而movieFull包含完整的屬性集:

const movieSmall = {
  title: 'Heat'
};
const movieFull = {
  title: 'Blade Runner',
  director: { name: 'Ridley Scott' },
  actors: [{ name: 'Harrison Ford' }, { name: 'Rutger Hauer' }]
};

寫一個(gè)獲取director的函數(shù)。 請(qǐng)記住,director 可能不存在。

function getDirector(movie) {
  if (movie.director != null) {
    return movie.director.name;
  }
}
getDirector(movieSmall); // => undefined
getDirector(movieFull);  // => 'Ridley Scott'

if(movie.director){...}條件用于驗(yàn)證是否定義了director屬性。 如果沒有這個(gè)預(yù)防措施,在訪問movieSmall對(duì)象的director時(shí),JS會(huì)拋出TypeError: Cannot read property 'name' of undefined。

這種場(chǎng)景最適合使用可選鏈的功能了,如下所示,代碼將簡潔很多。

function getDirector(movie) {
  return movie.director?.name;
}
getDirector(movieSmall); // => undefined
getDirector(movieFull);  // => 'Ridley Scott'

在movie.director?.name表達(dá)式中可以找到?.可選的鏈接操作符。

movieSmall中,沒有director屬性。 因此,movie.director?.name的的結(jié)果為undefined。 可選鏈運(yùn)算符可防止拋出 TypeError: Cannot read property 'name' of undefined。

簡單地說,代碼片段:

let name = movie.director?.name;

等價(jià)于

let name;
if (movie.director != null) {
  name = movie.director.name;
}

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

2.1 數(shù)組項(xiàng)

可選的鏈功能可以做得更多??梢宰杂傻卦谕粋€(gè)表達(dá)式中使用多個(gè)可選的鏈接操作符,甚至可以使用它安全地訪問數(shù)組項(xiàng)。

下一個(gè)任務(wù)是編寫一個(gè)函數(shù),返回電影的actors中的name。

movie對(duì)象中,actors數(shù)組可以是空的,甚至是缺失的,因此必須添加額外的條件來判空。

function getLeadingActor(movie) {
  if (movie.actors && movie.actors.length > 0) {
    return movie.actors[0].name;
  }
}
getLeadingActor(movieSmall); // => undefined
getLeadingActor(movieFull);  // => 'Harrison Ford'

if (movie.actors && movies.actors.length > 0) {...}條件主要判斷movie包含actors屬性,并且此屬性至少有一個(gè)actor。

使用可選鏈接,同樣代碼也簡潔了很了,如下:

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

actors?. 確保actors屬性存在, [0]?.確保列表中存在第一個(gè)actor。

3.雙問號(hào)操作符

一個(gè)名為nullish coalescing operator的新提議? 處理undefinednull,將它們默認(rèn)為特定值。

表達(dá)式變量?? 如果變量undefined或?yàn)?code>null,則默認(rèn)值為指定的值。

const noValue = undefined;
const value = 'Hello';
noValue ?? 'Nothing'; // => 'Nothing'
value   ?? 'Nothing'; // => 'Hello'

接著使用??來優(yōu)化一下 getLeading()函數(shù),當(dāng)movie對(duì)象中沒有actor時(shí)返回“Unknown actor

function getLeadingActor(movie) {
  return movie.actors?.[0]?.name ?? 'Unknown actor';
}
getLeadingActor(movieSmall); // => 'Unknown actor'
getLeadingActor(movieFull);  // => 'Harrison Ford'

4. 可選鏈的三種形式

咱們可以使用以下3種形式的可選鏈。

第一種: object?.property 用于訪問靜態(tài)屬性:

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

第二種:object?.[expression] 用于訪問動(dòng)態(tài)屬性或數(shù)組項(xiàng):

// 其一
const object = null;
const name = 'property';
object?.[name]; // => undefined
// 其二
const array = null;
array?.[0]; // => undefined

第三種:object?.([arg1, [arg2, ...]]) 執(zhí)行一個(gè)對(duì)象方法

const object = null;
object?.method('Some value'); // => undefined

將這三種組合起來創(chuàng)建一個(gè)可選鏈:

const value = object.maybeUndefinedProp?.maybeNull()?.[propName];

5.短路:遇到 null/undefined 停止

可選鏈接運(yùn)算符的有趣之處在于,只要在左側(cè)leftHandSide?.rightHandSide遇到無效值,右側(cè)訪問就會(huì)停止,這稱為短路。

看看例子:

const nothing = null;
let index = 0;
nothing?.[index++]; // => undefined
index;              // => 0

6. 何時(shí)使用可選鏈

不要急于使用可選的鏈操作符來訪問任何類型的屬性:這會(huì)導(dǎo)致錯(cuò)誤的使用。

6.1訪問潛在無效的屬性

?.一般使用在可能為空的屬性:maybeNullish?.prop。在確定屬性不為空的情況下,使用屬性訪問器:.property或[propExpression]。

// 好
function logMovie(movie) {
  console.log(movie.director?.name);
  console.log(movie.title);
}
// 不好
function logMovie(movie) {
  // director needs optional chaining
  console.log(movie.director.name);
  // movie doesn't need optional chaining
  console.log(movie?.title);
}

6.2 通常有更好的選擇

以下函數(shù)hasPadding()接收可選padding屬性的樣式對(duì)象。 padding具有left,topright,bottom可選屬性。

嘗試使用可選的鏈操作符:

function hasPadding({ padding }) {
  const top = padding?.top ?? 0;
  const right = padding?.right ?? 0;
  const bottom = padding?.bottom ?? 0;
  const left = padding?.left ?? 0;
  return left + top + right + bottom !== 0;
}
hasPadding({ color: 'black' });        // => false
hasPadding({ padding: { left: 0 } });  // => false
hasPadding({ padding: { right: 10 }}); // => true

雖然函數(shù)正確地確定了元素是否有padding,但是對(duì)于每個(gè)屬性使用可選的鏈有點(diǎn)過于麻煩了。

更好的方法是使用對(duì)象擴(kuò)展操作符將padding對(duì)象默認(rèn)為零值

function hasPadding({ padding }) {
  const p = {
    top: 0,
    right: 0,
    bottom: 0,
    left: 0,
    ...padding
  };
  return p.top + p.left + p.right + p.bottom !== 0;
}
hasPadding({ color: 'black' });        // => false
hasPadding({ padding: { left: 0 } });  // => false
hasPadding({ padding: { right: 10 }}); // => true

這個(gè)就比可選鏈來的更簡潔。

代碼部署后可能存在的BUG沒法實(shí)時(shí)知道,事后為了解決這些BUG,花了大量的時(shí)間進(jìn)行l(wèi)og 調(diào)試,這邊順便給大家推薦一個(gè)好用的BUG監(jiān)控工具 Fundebug。

原文:https://dmitripavlutin.com/ja...

以上就是JS 可選鏈的三種形勢(shì)及好處詳解的詳細(xì)內(nèi)容,更多關(guān)于JS 可選鏈三種形勢(shì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解析Javascript小括號(hào)“()”的多義性

    解析Javascript小括號(hào)“()”的多義性

    這篇文章主要介紹了Javascript小括號(hào)“()”的多義性。需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2013-12-12
  • 前端圖片添加水印的主流實(shí)現(xiàn)方案詳解

    前端圖片添加水印的主流實(shí)現(xiàn)方案詳解

    在前端對(duì)圖片添加水印,通常是為了保護(hù)版權(quán)、標(biāo)識(shí)來源或防止未經(jīng)授權(quán)的使用,這篇文章主要介紹了前端圖片添加水印的主流實(shí)現(xiàn)方案,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下
    2026-03-03
  • JS獲取當(dāng)前時(shí)間的年月日時(shí)分秒及時(shí)間的格式化的方法

    JS獲取當(dāng)前時(shí)間的年月日時(shí)分秒及時(shí)間的格式化的方法

    這篇文章主要介紹了js獲取當(dāng)前時(shí)間的年月日時(shí)分秒及時(shí)間的格式化,本文通過實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 在JS代碼中打斷點(diǎn)方式

    在JS代碼中打斷點(diǎn)方式

    在JavaScript代碼中使用`debugger`關(guān)鍵字進(jìn)行斷點(diǎn)調(diào)試,通過瀏覽器開發(fā)者工具執(zhí)行代碼直至斷點(diǎn)點(diǎn),利用工具按鈕進(jìn)行代碼調(diào)試與查看變量值
    2026-06-06
  • js精度丟失解決方案(響應(yīng)和預(yù)覽數(shù)據(jù)不一致)

    js精度丟失解決方案(響應(yīng)和預(yù)覽數(shù)據(jù)不一致)

    Java后端使用雪花算法生成的長ID在前端顯示時(shí)因JavaScript數(shù)字精度限制(最大安全整數(shù)為2^53)導(dǎo)致最后兩位丟失,這篇文章主要介紹了關(guān)于js精度丟失解決方案的相關(guān)資料,需要的朋友可以參考下
    2025-06-06
  • 面試常考:js中 Map和 Object 的區(qū)別小結(jié)

    面試???js中 Map和 Object 的區(qū)別小結(jié)

    Map和Object都是鍵值對(duì)存儲(chǔ)結(jié)構(gòu),但存在顯著差異,本文就來介紹一下js中 Map和 Object 的區(qū)別小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-09-09
  • 微信小程序?qū)崿F(xiàn)選項(xiàng)卡的簡單實(shí)例

    微信小程序?qū)崿F(xiàn)選項(xiàng)卡的簡單實(shí)例

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)選項(xiàng)卡的簡單實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • javascript 二維排序表格代碼

    javascript 二維排序表格代碼

    目前一直在學(xué)習(xí)WEB前端的知識(shí)。下面貼出最近完成的一個(gè)可排序表格.
    2010-12-12
  • JS小游戲之象棋暗棋源碼詳解

    JS小游戲之象棋暗棋源碼詳解

    這篇文章主要介紹了JS小游戲之象棋暗棋源碼詳解,對(duì)游戲源碼進(jìn)行了較為詳細(xì)的分析,并附帶完整實(shí)例代碼供大家學(xué)習(xí)參考,需要的朋友可以參考下
    2014-09-09
  • 前端發(fā)布緩存導(dǎo)致白屏幾種解決方案總結(jié)

    前端發(fā)布緩存導(dǎo)致白屏幾種解決方案總結(jié)

    這篇文章主要介紹了前端發(fā)布緩存導(dǎo)致白屏的幾種解決方案,文章還介紹了Jenkins發(fā)布流程優(yōu)化和使用版本號(hào)方案,以減少發(fā)布緩存問題,每種方案都有其優(yōu)缺點(diǎn),需要根據(jù)實(shí)際情況進(jìn)行選擇和調(diào)整,需要的朋友可以參考下
    2025-04-04

最新評(píng)論

珠海市| 丽江市| 清原| 蒲城县| 重庆市| 安多县| 兴化市| 湖南省| 广灵县| 安徽省| 上饶市| 新蔡县| 休宁县| 荆门市| 婺源县| 杭锦后旗| 全椒县| 河南省| 吴旗县| 抚宁县| 拉萨市| 松潘县| 宾阳县| 华阴市| 吉水县| 磴口县| 华坪县| 南京市| 镇原县| 荣成市| 张家港市| 宜兰县| 大英县| 偏关县| 扶绥县| 浦东新区| 札达县| 桃源县| 临海市| 大英县| 唐山市|