欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解如何替換項(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)文章

  • ES6教程之for循環(huán)和Map,Set用法分析

    ES6教程之for循環(huán)和Map,Set用法分析

    這篇文章主要介紹了ES6教程之for循環(huán)和Map,Set用法,結(jié)合實(shí)例形式分析了ECMAScript6中for循環(huán)和Map,Set基本概念、功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-04-04
  • 10個(gè)功能強(qiáng)大的JavaScript動(dòng)畫庫分享

    10個(gè)功能強(qiáng)大的JavaScript動(dòng)畫庫分享

    動(dòng)畫,從人群中脫穎而出、吸引訪客注意力的絕佳方式,本文將給大家分享10 個(gè)功能強(qiáng)大的 JavaScript 動(dòng)畫庫,有了這 10 個(gè)功能強(qiáng)大的 JavaScript 庫,創(chuàng)建動(dòng)畫再簡單不過了,感興趣的同學(xué)可以參考閱讀
    2023-09-09
  • Js 本頁面?zhèn)髦祵?shí)現(xiàn)代碼

    Js 本頁面?zhèn)髦祵?shí)現(xiàn)代碼

    記得以前在學(xué)校的時(shí)候,例如要修改信息,需要要修改的部分的值顯示出來,都是先把數(shù)據(jù)傳到后臺(tái),然后再在前臺(tái)顯示的,想想真夠笨的,這個(gè)可以在客戶端就實(shí)現(xiàn)的,何必要傳到后臺(tái)呢
    2009-05-05
  • JS實(shí)現(xiàn)圖片平面旋轉(zhuǎn)的方法

    JS實(shí)現(xiàn)圖片平面旋轉(zhuǎn)的方法

    這篇文章主要介紹了JS實(shí)現(xiàn)圖片平面旋轉(zhuǎn)的方法,涉及JavaScript操作頁面元素樣式動(dòng)態(tài)變換的相關(guān)技巧,需要的朋友可以參考下
    2016-03-03
  • 微信小程序?qū)崿F(xiàn)通過js操作wxml的wxss屬性示例

    微信小程序?qū)崿F(xiàn)通過js操作wxml的wxss屬性示例

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)通過js操作wxml的wxss屬性,結(jié)合實(shí)例形式分析了微信小程序使用js操作wxml的wxss屬性相關(guān)原理、實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • Bootstrap樹形菜單插件TreeView.js使用方法詳解

    Bootstrap樹形菜單插件TreeView.js使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Bootstrap樹形菜單插件TreeView.js使用方法,一款非??岬幕赽ootstrap的jQuery多級(jí)列表樹插件,具有一定的實(shí)用性,感興趣的小伙伴們可以參考一下
    2016-11-11
  • JS庫之Three.js 簡易入門教程(詳解之一)

    JS庫之Three.js 簡易入門教程(詳解之一)

    three.js是一款webGL框架,由于其易用性被廣泛應(yīng)用。下面腳本之家小編通過案例給大家闡述three.js的基本配置方法,具體內(nèi)容詳情大家參考下本文吧
    2017-09-09
  • 微信小程序本地存儲(chǔ)實(shí)現(xiàn)每日簽到、連續(xù)簽到功能

    微信小程序本地存儲(chǔ)實(shí)現(xiàn)每日簽到、連續(xù)簽到功能

    這篇文章主要介紹了微信小程序本地存儲(chǔ)實(shí)現(xiàn)每日簽到、連續(xù)簽到功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 微信小程序自定義組件實(shí)現(xiàn)tabs選項(xiàng)卡功能

    微信小程序自定義組件實(shí)現(xiàn)tabs選項(xiàng)卡功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序自定義組件實(shí)現(xiàn)tabs選項(xiàng)卡功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • js實(shí)現(xiàn)簡單輪播圖效果

    js實(shí)現(xiàn)簡單輪播圖效果

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡單輪播圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評(píng)論