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

詳解如何替換項(xiàng)目中的if-else和switch

 更新時(shí)間:2022年11月15日 09:03:38   作者:JoyZ  
這篇文章主要為大家介紹了詳解如何替換項(xiàng)目中的if-else和switch,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

在項(xiàng)目中,往往會(huì)看到很多的if-else或者switch,項(xiàng)目會(huì)變得很臃腫,而且不易閱讀,那么今天我們就來講講優(yōu)化方案

例如,假設(shè)我們有一個(gè)函數(shù),它接受一個(gè)數(shù)字參數(shù)并返回其實(shí)際含義。使用 if/else 語句,它看起來像這樣:

function getTranslation(type) {
  if (type === 4) {
    return "forbidden_area";
  } else if (type === 6) {
    return "elevator_area";
  } else if (type === 7) {
    return "dangerous_area";
  } else if (type === 10) {
    return "restricted_area";
  }
  return "other_area";
}

這不是很好。它可讀性差。

我們可以通過使用 switch 語句優(yōu)化,如下所示:

function getTranslation(type) {
  switch (type) {
    case 4:
      return "forbidden_area";
    case 6:
      return "elevator_area";
    case 7:
      return "dangerous_area";
    case 10:
      return "restricted_area";
    default:
      return "other_area";
  }
}

但這仍然沒有什么可讀性。switch 語句也容易出錯(cuò)。

在這種情況下,我們只是返回一個(gè)值,但是當(dāng)你具有更復(fù)雜的功能時(shí),很容易錯(cuò)過 break 語句并引入錯(cuò)誤。

替代方案

你可以使用對(duì)象以更簡潔的方式實(shí)現(xiàn)與上述相同的功能。讓我們看一個(gè)例子:

function getTranslation(type) {
  const types = {
    4: 'forbidden_area',
    6: 'elevator_area',
    7: 'dangerous_area',
    10: 'restricted_area'
  }
  return types[type] ?? 'other_area'
}

我們有一個(gè)對(duì)象,其中鍵是條件,值是響應(yīng)。然后我們可以使用方括號(hào)符號(hào)從傳入的參數(shù)中選擇對(duì)象的正確值。

函數(shù)中return types[type] ?? 'other_area'使用無效合并來分配默認(rèn)響應(yīng)。這意味著如果 types[type]為 null 或undefined(但不是 false 或 0 ),則返回默認(rèn)字符串“other_area”。

|| vs ??

||??都是指定默認(rèn)值

讀取對(duì)象屬性的時(shí)候,如果某個(gè)屬性的值是nullundefined,有時(shí)候需要為它們指定默認(rèn)值。常見做法是通過||運(yùn)算符指定默認(rèn)值

const headerText = response.settings.headerText || 'Hello, world!';
const animationDuration = response.settings.animationDuration || 300;
const showSplashScreen = response.settings.showSplashScreen || true;

上面的三行代碼都通過||運(yùn)算符指定默認(rèn)值,但是這樣寫是錯(cuò)的。開發(fā)者的原意是,只要屬性的值為nullundefined,默認(rèn)值就會(huì)生效,但是屬性的值如果為空字符串或false0,默認(rèn)值也會(huì)生效。

為了避免這種情況,ES2020 引入了一個(gè)新的 Null 判斷運(yùn)算符??。它的行為類似||,但是只有運(yùn)算符左側(cè)的值為nullundefined時(shí),才會(huì)返回右側(cè)的值。而||是運(yùn)算符左側(cè)的值為null、undefined、0''NaN 時(shí),都會(huì)返回右側(cè)的值!

更復(fù)雜的邏輯

有時(shí)你可能需要在你的條件中執(zhí)行一些更復(fù)雜的邏輯。為此,你可以將函數(shù)作為值傳遞給對(duì)象鍵并執(zhí)行響應(yīng):

function calculate(action, num1, num2) {
  const actions = {
    add: (a, b) => a + b,
    subtract: (a, b) => a - b,
    multiply: (a, b) => a * b,
    divide: (a, b) => a / b,
  };
  return actions[action]?.(num1, num2) ?? "Calculation is not recognised";
}

?.有不懂的話,可以先看下面,我們正在選擇我們想要做的計(jì)算并執(zhí)行響應(yīng),傳遞兩個(gè)數(shù)字。你可以使用可選鏈接(最后一行代碼中的 ?.)來僅執(zhí)行已定義的響應(yīng)。否則,將使用默認(rèn)的返回字符串。

如果函數(shù)里的邏輯足夠復(fù)雜也可以把函數(shù)提取出來

function add(num1, num2) {
  return num1 + num2
}
function subtract(num1, num2) {
  return num1 - num2
}
function multiply(num1, num2) {
  return num1 * num2
}
function divide(num1, num2) {
  return num1 / num2
}
function calculate(action, num1, num2) {
  const actions = {
    add,
    subtract,
    multiply,
    divide
  }
  return actions[action]?.(num1, num2) ?? 'Calculation is not recognised'
}

?.的說明

編程實(shí)務(wù)中,如果讀取對(duì)象內(nèi)部的某個(gè)屬性,往往需要判斷一下,屬性的上層對(duì)象是否存在。比如,讀取message.body.user.firstName這個(gè)屬性,安全的寫法是寫成下面這樣。

// 錯(cuò)誤的寫法
const  firstName = message.body.user.firstName || 'default';
// 正確的寫法
const firstName = (message
  && message.body
  && message.body.user
  && message.body.user.firstName) || 'default';

上面例子中,firstName屬性在對(duì)象的第四層,所以需要判斷四次,每一層是否有值。

這樣的層層判斷非常麻煩,因此 ES2020 引入了“鏈判斷運(yùn)算符”(optional chaining operator)?.,簡化上面的寫法。

const firstName = message?.body?.user?.firstName || 'default';

上面代碼使用了?.運(yùn)算符,直接在鏈?zhǔn)秸{(diào)用的時(shí)候判斷,左側(cè)的對(duì)象是否為nullundefined。如果是的,就不再往下運(yùn)算,而是返回undefined。

下面是判斷對(duì)象方法是否存在,如果存在就立即執(zhí)行的例子。

iterator.return?.()

上面代碼中,iterator.return如果有定義,就會(huì)調(diào)用該方法,否則iterator.return直接返回undefined,不再執(zhí)行?.后面的部分。

下面是?.運(yùn)算符常見形式,以及不使用該運(yùn)算符時(shí)的等價(jià)形式。

a?.b
// 等同于
a == null ? undefined : a.b
a?.[x]
// 等同于
a == null ? undefined : a[x]
a?.b()
// 等同于
a == null ? undefined : a.b()
a?.()
// 等同于
a == null ? undefined : a()

上面代碼中,特別注意后兩種形式,如果a?.b()a?.()。如果a?.b()里面的a.b有值,但不是函數(shù),不可調(diào)用,那么a?.b()是會(huì)報(bào)錯(cuò)的。a?.()也是如此,如果a不是nullundefined,但也不是函數(shù),那么a?.()會(huì)報(bào)錯(cuò)。

以上就是詳解如何替換項(xiàng)目中的if-else和switch的詳細(xì)內(nèi)容,更多關(guān)于替換項(xiàng)目中if else switch的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript中報(bào)錯(cuò)Cannot?set?properties?of?undefined?(setting?‘1‘)解決方案

    JavaScript中報(bào)錯(cuò)Cannot?set?properties?of?undefined?(settin

    這篇文章主要介紹了JavaScript中報(bào)錯(cuò)Cannot?set?properties?of?undefined?(setting?'1')的解決方案,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用js具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2025-03-03
  • 微信小程序自定義用戶登錄彈窗

    微信小程序自定義用戶登錄彈窗

    這篇文章主要為大家詳細(xì)介紹了微信小程序自定義用戶登錄彈窗,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • cocos2dx骨骼動(dòng)畫Armature源碼剖析(一)

    cocos2dx骨骼動(dòng)畫Armature源碼剖析(一)

    cocos2dx中的骨骼動(dòng)畫在程序中使用非常方便,從編輯器(cocostudio或flash插件dragonBones)得到xml或json數(shù)據(jù),調(diào)用代碼就可以直接展示出動(dòng)畫效果,下面通過本篇文章給大家分享cocos2dx骨骼動(dòng)畫Armature源碼剖析,需要的朋友一起來學(xué)習(xí)吧。
    2015-09-09
  • JS定時(shí)器使用,定時(shí)定點(diǎn),固定時(shí)刻,循環(huán)執(zhí)行詳解

    JS定時(shí)器使用,定時(shí)定點(diǎn),固定時(shí)刻,循環(huán)執(zhí)行詳解

    下面小編就為大家?guī)硪黄狫S定時(shí)器使用,定時(shí)定點(diǎn),固定時(shí)刻,循環(huán)執(zhí)行詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • js通過googleAIP翻譯PHP系統(tǒng)的語言配置的實(shí)現(xiàn)代碼

    js通過googleAIP翻譯PHP系統(tǒng)的語言配置的實(shí)現(xiàn)代碼

    一同事弄了個(gè)系統(tǒng)是php寫的,雖然是多語言但沒中文!他打算手動(dòng)翻譯2000多個(gè)語言配置,真是佩服,知道后想了想,應(yīng)該有好的法辦
    2011-10-10
  • js實(shí)現(xiàn)網(wǎng)頁五子棋進(jìn)階版

    js實(shí)現(xiàn)網(wǎng)頁五子棋進(jìn)階版

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)網(wǎng)頁五子棋進(jìn)階版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解JavaScript修改注冊(cè)表的方法

    詳解JavaScript修改注冊(cè)表的方法

    這篇文章主要介紹了詳解JavaScript修改注冊(cè)表的方法,本實(shí)例主要通過WshShell 對(duì)象的相關(guān)方法實(shí)現(xiàn),需要的朋友可以參考下
    2020-01-01
  • JS出現(xiàn)失效的情況總結(jié)

    JS出現(xiàn)失效的情況總結(jié)

    本篇文章主要對(duì)JS出現(xiàn)失效的情況進(jìn)行總結(jié)。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • JavaScript數(shù)組操作詳解

    JavaScript數(shù)組操作詳解

    本文主要介紹了JavaScript的數(shù)組操作,具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • 詳解如何準(zhǔn)確判斷JavaScript中的數(shù)據(jù)類型

    詳解如何準(zhǔn)確判斷JavaScript中的數(shù)據(jù)類型

    JavaScript中,我們經(jīng)常需要判斷數(shù)據(jù)類型以便于正確地處理數(shù)據(jù),本文將介紹JavaScript中的數(shù)據(jù)類型判斷技術(shù),包括typeof操作符、instanceof操作符、Object.prototype.toString方法以及ES6新增的一些數(shù)據(jù)類型判斷方法,需要的朋友可以參考下
    2023-08-08

最新評(píng)論

茂名市| 繁峙县| 来安县| 蒙城县| 久治县| 黑龙江省| 两当县| 大连市| 南溪县| 北辰区| 会宁县| 新巴尔虎左旗| 木兰县| 邢台县| 体育| 潢川县| 山东| 芦溪县| 西乌| 枝江市| 湛江市| 塔河县| 和龙市| 南乐县| 峨山| 太仓市| 哈密市| 麻江县| 玉屏| 南宫市| 福鼎市| 华宁县| 泸西县| 子洲县| 安庆市| 隆安县| 北宁市| 泗阳县| 齐齐哈尔市| 汪清县| 郴州市|