在一行中写两个案例的if-else语句的短缺

Write Shortage of if-else statement with two cases in one line

本文关键字:案例 if-else 语句 两个 一行      更新时间:2023-09-26

有一个javascript表达式将name变量分配给renamed变量。只有一个例外:

renamed =  name == 'John' ? 'Johnny' : name;

然而,我想要两个除外条款:

  1. 将John改名为Johny
  2. 将亚历克斯改名为亚历山大
  3. 所有其他名称都被分配,没有任何更改

有可能把这个表达式写成一个字符串吗?

renamed =  (name == 'John' || name == 'Alex') ? <____> : name;

我需要一气呵成。

谢谢。

(name === 'John' && 'Johny') || (name === 'Alex' && 'Alexander') || name;
  • 如果nameJohn,则转到&&表达式的下一部分并返回Johny

  • 如果nameAlex,则第一种情况下的类似情况返回Alexander

  • 如果两者都不为真,则原样返回name

演示

这个解决方案之所以有效,是因为在JavaScript中,&&运算符计算左边的表达式,如果它是false,那么将返回值,而根本不会计算右边的表达式。

如果左边的表达式计算结果为Truthy,那么右边的表达式将被计算,结果将按原样返回。例如

console.log(1 && 2);
# 2
console.log(0 && 2);
# 0

它首先评估1,它是Truthy,因此评估2并返回值。这就是它打印2的原因。

在第二种情况下,0被评估为Falsy。因此,它会立即返回。这就是它打印0的原因。

与相同

console.log("John" && "Johny");
# Johny

John将被评估为Truthy,因此Johny也将被评估并返回。这就是我们得到Johny的原因。

根据ECMA 5.1标准,将根据下表确定对象的真实性

+-----------------------------------------------------------------------+
| Argument Type | Result                                                |
|:--------------|------------------------------------------------------:|
| Undefined     | false                                                 |
|---------------|-------------------------------------------------------|
| Null          | false                                                 |
|---------------|-------------------------------------------------------|
| Boolean       | The result equals the input argument (no conversion). |
|---------------|-------------------------------------------------------|
| Number        | The result is false if the argument is +0, −0, or NaN;|
|               | otherwise the result is true.                         |
|---------------|-------------------------------------------------------|
| String        | The result is false if the argument is the empty      |
|               | String (its length is zero); otherwise the result is  |
|               | true.                                                 |
|---------------|-------------------------------------------------------|
| Object        | true                                                  |
+-----------------------------------------------------------------------+

注意:最后一行Object,包括对象和数组。

renamed = (name == 'john') ? 'johney': (name == 'alex'? 'alexander' : name);

你可以试试这个:

renamed = (name == 'John' ? 'Johnny' : (name == 'Alex' ? 'Alexander' : name));