【问题标题】:How to understand this example of a logical and ternary operator?如何理解这个逻辑和三元运算符的例子?
【发布时间】:2016-04-17 22:24:00
【问题描述】:

我知道三元运算符本质上是if-else 语句的快捷方式,我也知道&& 是逻辑与。但是,我不明白这两者在下面的代码中是如何结合的。

我也尝试过使用输出,但没有帮助。我如何解释以下内容?

function greetUser(customerName, sex)  {
  var salutation  = sex && sex === "Man" ? "Mr." : "Ms.";
  console.log("Hello, " + salutation + " " + customerName);
}

【问题讨论】:

    标签: javascript ternary-operator logical-operators


    【解决方案1】:

    三元运算符一般是指:

    condition ? (value returned if condition is true) : (value returned if condition is false)
    

    在您的示例中,条件为sex && sex === 'Man',这意味着变量sex 中包含的值是truthystrictly equal 到字符串"Man"。 p>

    这是细分:

    var salutation;
    if(sex && sex === 'Man') {  
        salutation = 'Mr';
    } else {
        salutation = 'Ms';
    }
    

    此外,在这个特定示例中,由于您使用的是 严格相等(即===)比较,因此对sex 的真实性检查没有任何意义,这是不必要的。你的情况可以是:

    var salutation = sex === "Man" ? "Mr." : "Ms.";
    

    解释:当使用&& 时,两个操作数首先被强制转换为布尔值,因此它们的“真实性”可以进行与运算。例如,假设sex = 'Man',那么您的条件基本上是:

    if('Man' && 'Man' === 'Man')
    

    强制转换为布尔值的是:

    if(true && true)
    

    这显然是多余的。 Read more about JavaScript type coercion.

    在使用非严格比较运算符(例如 ==<> ... 而不是 === 时发生的其他情况下,这种真实检查是一种很好的安全检查。

    简单来说,使用==首先将两个项目强制为相同类型,然后再比较lead to bugs。如果类型不同,使用=== 会立即返回false,因此更安全。

    这是用于 JavaScript 比较的 another useful resource

    【讨论】:

    • 但是为什么需要第一个sex 呢?为什么不只使用三元运算符?我看不出第一个 sex 提供什么目的。
    【解决方案2】:

    && 是一个逻辑and 定义为,

    (true && true) == true
    (true && false) == false
    (false && true) == false
    (false && false) == false
    

    所以,A && B 的声明只有在 A 和 B 都为真时才为真

    在您的情况下,对于三元运算符,一些括号可能会有所帮助,以便您可以查看这些运算符的评估顺序。

    (sex && (sex === "Man")) ? "Mr." : "Ms."
    

    所以,用英语...

    如果sex 存在且sex'Man'"Mr." 否则"Ms."

    三元运算符一般是这样工作的:

    (true OR false) ? (value if true) : (value if false)
    

    【讨论】:

    • 所以第一个sex 只是为了检查参数是否为非空?那为什么不用!sex呢?
    【解决方案3】:

    是性别不是未定义的,性别是Man然后是Mr.;否则Ms.。因此,如果性别未定义;也是Ms.

    【讨论】:

      【解决方案4】:

      你可以换行

      var salutation  = sex && sex === "Man" ? "Mr." : "Ms.";
      

      var salutation  = ((sex) && (sex === "Man" ? "Mr." : "Ms."));
      

      现在sex === "Man" ? "Mr." : "Ms." 告诉你如果性变量的值为Man 并且两个变量的类型相同(在这种情况下为字符串),那么它应该返回Mr 否则Ms

      【讨论】:

        猜你喜欢
        • 2019-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-14
        • 1970-01-01
        • 2014-03-18
        • 1970-01-01
        相关资源
        最近更新 更多