写一个if-else语句的短缺,在一行中有两个case

时间:2014-04-23 10:01:13

标签: javascript if-statement expression equals-operator

有一个javascript表达式将name变量分配给renamed变量。 一个例外情况总是如此:

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

但是,我想要两个例外情况:

  1. 将John重命名为Johny
  2. 将Alex重命名为Alexander
  3. 所有其他名称均未分配。
  4. 是否可以将此表达式写入一个字符串?

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

    我需要用一个字符串来完成。

    谢谢。

3 个答案:

答案 0 :(得分:5)

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

  • 如果nameAlex,则第一种情况中的类似内容会返回Alexander

  • 如果它们都不成立,则按原样返回name

Demo

此解决方案有效,因为在JavaScript中,&&运算符计算左边的表达式,如果它是假的,那么将返回该值,并且根本不会评估右侧表达式。

如果左边的表达式评估为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 Standard,对象的真实性将根据下表确定

+-----------------------------------------------------------------------+
| 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,包括对象和数组。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

你可以试试这个:

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