千万不要在JavaScript中使用If-Else和Switch。 建议用Object Literals

本文探讨了如何使用JavaScript中的ObjectLiterals结构改进条件语句的可读性和维护性,通过实例展示了如何使用对象映射、函数作为值和对象字面量来处理复杂逻辑,以提高代码清晰度和减少潜在错误。
摘要由CSDN通过智能技术生成

用Object Literals意义在JavaScript中写出更好的条件语句

在JavaScript中编写复杂的条件语句,总是有可能产生一些相当混乱的代码。长长的if/else语句或switch case列表会很快变得臃肿。

当有多个条件时,我发现Object Literals是最易读的代码结构方式。让我们来看看它们是如何工作的。

作为一个例子,假设我们有一个函数,它接收一个押韵的俚语并返回其含义。使用if/else语句,它看起来会是这样。

function getTranslation(rhyme) {
  if (rhyme.toLowerCase() === "苹果和梨") {
    return "📢";
  } else if (rhyme.toLowerCase() === "清泉山庄") {
    return "🦷";
  } else if (rhyme.toLowerCase() === "面包") {
    return "🍊";
  } else if (rhyme.toLowerCase() === "猪肉馅饼") {
    return "❎";
  } else if (rhyme.toLowerCase() === "哨子和笛子") {
    return "🦵🏻";
  }

  return "未找到以上内容";
}

这并不是很好。它不仅可读性不强,而且我们还在为每个语句重复toLowerCase()

我们可以通过在函数开始时将小写的韵律分配给一个变量来避免这种重复,或者使用开关语句,这样就可以了。

function getTranslation(rhyme) {
  switch (rhyme.toLowerCase()) {
    case "苹果和梨":
      return "📢";
    case "清泉山庄":
      return "🦷";
    case "面包":
      return "🍊";
    case "猪肉馅饼":
      return "❎";
    case "哨子和笛子":
      return "🦵";
    default:
      return "未找到以上内容";
  }
}

我们现在只调用了一次toLowerCase(),但这仍然感觉不那么可读。 switch语句也容易出错。在这种情况下,我们只是返回一个值,但当你有更复杂的功能时,很容易错过break语句而引入错误。

另一种选择

你可以使用一个对象,以更整齐的方式实现与上述相同的功能。让我们来看看一个例子。

function getTranslationMap(rhyme) {
  const rhymes = {
    "苹果和梨": "📢";
    "清泉山庄": "🦷";
    "面包": "🍊";
    "猪肉馅饼": "❎";
    "哨子和笛子": "🦵";
  };
  
  return rhymes[rhyme.toLowerCase()] ?? "未找到以上内容";

我们有一个对象,其中的键是条件,值是反应。然后我们可以使用方括号符号,从传入的韵律中选择对象的正确值。

第10行的最后部分(?? "Rhyme not found")使用nullish coalescing来指定一个默认响应。这意味着如果韵律[hyme.toLowercase()]是空的或未定义的(但不是false或0),那么将返回默认的字符串 "Rhyme not found"。这一点很重要,因为我们可能合法地想从我们的条件中返回false或0。比如说。

function stringToBool(str) {
  const boolStrings = {
    "true": true,
    "false": false,
  };

  return boolStrings[str] ?? "字符串不是一个布尔值";
}

这是一个非常矫揉造作的例子,但希望它能说明偏空凝聚是如何帮助避免引入bug的。

更复杂的逻辑

有些时候,你可能需要在你的条件中做一些更复杂的逻辑。为了实现这一点,你可以将一个函数作为值传递给你的对象键,并执行响应。

function calculate(num1, num2, action) {
  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) ?? "计算方式不被认可";
}

我们正在选择我们想做的计算并执行响应,传递两个数字。你可以使用可选的链(最后一行代码中的?.),只在响应被定义的情况下执行它。否则,落到默认的返回字符串。

结论

编写条件语句永远是一个品味问题,某些情况需要不同的方法。然而,我发现当我有几个条件要检查时,对象字面是最可读和可维护的方式。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
object literals cannot be used as type declarations (arkts-no-obj-literals-a) 是指在 TypeScript ,不能将对象字面量用作类型声明。 在 TypeScript ,我们可以使用类型声明来定义变量、参数和函数的类型。类型声明允许我们指定变量的类型,以便在编译时进行类型检查,并提供更好的代码提示和静态分析。 然而,当我们尝试使用对象字面量作为类型声明时,TypeScript 会出现错误消息 "object literals cannot be used as type declarations (arkts-no-obj-literals-a)"。这是因为对象字面量通常用于创建对象而不是定义类型。 例如,下面的代码尝试使用对象字面量作为类型声明: ```typescript const user: { name: string, age: number } = { name: "Alice", age: 25 }; ``` 上述代码会导致错误,因为对象字面量不能被用作类型声明。为了解决这个问题,我们可以使用 interface 或 type 关键字来定义类型: ```typescript interface User { name: string, age: number } const user: User = { name: "Alice", age: 25 }; ``` 在上述代码,我们使用 interface 关键字定义了一个名为 User 的接口,它包含了 name 和 age 两个属性。接着,我们使用 User 接口作为类型声明,来定义 user 变量的类型。 总结来说,"object literals cannot be used as type declarations (arkts-no-obj-literals-a)" 是 TypeScript 的错误消息,意味着不能直接使用对象字面量作为类型声明,而应该使用接口或类型声明来定义对象的类型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端仙人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值