JavaScript 中的对象字面量:if / else 和 switch 的替代方案
在 JavaScript 中,复杂的条件语句总是会导致代码冗余。然而,使用对象字面量可以避免这个问题。让我们来看看它是如何工作的。
JavaScript 中的对象字面量是用花括号括起来的、以逗号分隔的键值对列表。
假设我们有一个函数,它接受一个输入值 apassword并返回其值。如果使用 if/else 结构,代码将如下所示:
function getPassword(password) {
if (password.toLowerCase() === "password1234") {
return "Facebook Password";
} else if (password.toLowerCase() === "1234Password") {
return "Instagram Password";
} else if (password.toLowerCase() === "!pass1234") {
return "Twitter Password";
} else if (password.toLowerCase() === "helloworld1234") {
return "Github Password";
}
return "password not found";
}
这段代码看起来一般。它不仅难以阅读,而且还重复调用了同一个toLowerCase()函数。
为了减少代码量,我们可以使用额外的变量或 switch 语句。
function getPassword(password) {
switch (password.toLowerCase()) {
case "password1234":
return "Facebook Password";
case "1234Password":
return "Instagram Password";
case "!pass1234":
return "Twitter Password";
case "helloworld1234":
return "Github Password";
default:
return "password not found";
}
}
这段代码看起来更简洁,但这并非极限。此外,如果使用更复杂的条件语句,可能会意外跳过 break 语句,从而导致错误。
选择
我们可以使用对象来实现同样的功能。下面这个例子看起来更简洁:
function getPassword(password) {
const passwords = {
"password1234": "Facebook Password",
"1234Password": "Instagram Password",
"!pass1234": "Twitter Password",
"helloworld1234": "Github Password",
};
return passwords[password.toLowerCase()] ?? "password not found";
}
我们使用一个对象,其键作为条件,值作为结果。然后,我们使用方括号检查目标行是否存在。由于结果字符串可能为空或未定义,我们使用空值合并运算符(??)。这样可以排除空值,但并不排除结果为零或假的情况。
/**
*
* @param string
* @returns boolean
*/
function stringToBool(string) {
const checkString = {
true: true,
false: false,
};
return checkString[string] ?? "String is not a boolean value";
}
这是一个略显牵强的例子,但它说明了如何使用 ?? 来帮助避免错误。
复杂逻辑
要组织更复杂的条件,可以使用函数作为属性值。
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) ?? "Calculation is not recognised";
}
在这段代码中,我们通过键选择所需的函数,然后使用两个参数调用它。由于我们使用了可选链式调用,因此只有当函数存在时才会调用它。否则,将返回默认值。
输出
每种常规结构都有其特定的应用领域。对于 JavaScript 中的对象字面量而言,它们通常用于表示可以使用函数实现的长列表式条件和复杂条件。
文章来源:https://dev.to/b3ns44d/alternative-to-if-else-and-switch-object-literals-in-javascript-3nde