【问题标题】:Why my condition is always true为什么我的条件总是正确的
【发布时间】:2021-11-09 14:18:51
【问题描述】:

我想知道在这个例子中为什么我的条件总是正确的?谢谢

function bla() {
  var qix = 'z'
  if (qix === 'a' || 'b' || 'c') {
     console.log('condition ok!! whats wrong???')
  }
}

【问题讨论】:

  • 您的状态中有两个"c"。
  • 您误解了|| 运算符的工作原理。
  • @TakitIsy 始终使用=== 和== 被认为是一种很好的做法,只有在适用时。
  • @TakitIsy 很少。当您实际需要处理不同类型的值时。

标签: javascript lodash


【解决方案1】:

您的代码的问题是if 表达式的计算结果总是true。

qix === 'a' || 'b' || 'c'

实际上会变成这样:

false || 'b' || 'c'

因为qix 设置为z。由于类型松散,JavaScript 为第二个表达式返回true,因为'b' 是truthy value。要更正此问题,您需要按如下方式更改表达式:

qix === 'a' || qix === 'b' || qix === 'c'

所以它正确地意味着你所期望的。

【讨论】:

    【解决方案2】:

    JavaScript 为第二个 or 表达式返回 true,因为 'b' 始终为 true。

    您需要像这样根据 qix 检查每个值:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators

      var qix = 'z'
      if (qix === 'a' || qix === 'b' ||  qix === 'c') {
         console.log('condition ok!! whats wrong???')
      }

    【讨论】:

    • 因为这是一个明显的重复问题。
    • 这里适用于目前的两个答案:被否决,因为“试试这个”或“你需要使用这个”不是对“为什么”问题的回答。跨度>
    【解决方案3】:

    正如我们所知,||(OR 逻辑运算符)在任一操作数为真时返回 true。在您的第二个和第三个操作数中的 if 条件 qix === 'a' || 'b' || 'c' 是字符串,并且当且仅当它们为空时,字符串才被视为 false,否则为真。因此,您的条件始终为真。

    需要像qix ==='b'这样检查qix

     var qix = 'z'
      if (qix === 'a' || qix === 'b' || qix ==='c') {
         console.log('condition ok!! whats wrong???')
      }
      else{
          console.log('else')
      }

    【讨论】:

    • 因为这是一个明显的重复问题。
    • @Xufox 感谢您发现我的错误。我更改了我的回答者。
    【解决方案4】:

    expr1 || expr2 的描述来自MDN:

    如果可以转换为true则返回expr1;否则,返回 expr2。因此,当与布尔值一起使用时,||如果任一操作数为真,则返回真。

    o1 = true  || true       // t || t returns true
    o2 = false || true       // f || t returns true
    o3 = true  || false      // t || f returns true
    o4 = false || (3 == 4)   // f || f returns false
    o5 = 'Cat' || 'Dog'      // t || t returns "Cat"
    o6 = false || 'Cat'      // f || t returns "Cat"
    o7 = 'Cat' || false      // t || f returns "Cat"
    o8 = ''    || false      // f || f returns false
    o9 = false || ''         // f || f returns ""
    

    所以你的代码中的这个表达式,假设 qix 不是'a':

    qix === 'a' || 'b' || 'c'
    

    第一项qux === 'a' 是false,当然它的计算结果为假。这会导致它进入下一个学期,即'b'。非空字符串的计算结果为true,因此它停在那里并变成'b'。现在你的 if 语句可以被认为是:

    if ('b')
    

    同样,'b' 的计算结果为 true。所以你的条件实际上什么都不做。

    【讨论】:

      【解决方案5】:

      您可以使用正则表达式:qix.match(/^(a|b|c)$/)
      如果qix 等于a 或b 或c,则应返回

      var qix = 'z';
      if (qix.match(/^(a|b|c)$/)) {
         console.log('condition ok!! whats wrong???');
      } else {
         console.log('else');
      }

      【讨论】:

        【解决方案6】:

        我认为您缺少两个概念。

        首先如何||运算符的作用和 javascript 值的第二次强制。

        在您的代码中:

          if ('z' === 'a' || 'b' || 'c') { ----}
        

        将始终评估为true。 原因是 ||运算符将返回第一个强制为 true 的值,而不实际强制该值。关联性(执行运算符的顺序)是从左到右的。这意味着会发生以下情况:

        首先将评估以下内容,因为它具有更高的precedence:

        'z' === 'a' // false
        

        那么我们有以下表达式,将从左到右进行计算:

        false || 'b' || 'c'
        

        let foo = false || 'b'
        
        console.log(foo)

        那么我们有以下表达式:

        let foo = 'b' || 'c'
        
        console.log(foo)

        所以整个表达式演变为字符串'b'

        之后 if 语句中的表达式被评估为值 'b' 然后 this 被强制转换为布尔值。每个字符串都被转换为true,这就是该值始终为真的原因。

        【讨论】:

          【解决方案7】:

          这是因为你的“如果条件”有 3 个可能的选项

          首先说 qix === 'a',这是错误的,但您询问 'b'、'c' 和此选项的值为 true,因为您没有将 var qix 与 'b' 或 'c' 进行比较,您只询问 IF 条件,如果 'b' 或 'c' 是值

          运算符 ||它是这样使用的

          if(First Condition || Second Condition || third condition){
           if at least one of these options is true, then enter here
          }
          

          在 ECMAScript 2016 中为数组合并了一个 include() 方法,专门解决了答案

          if (['b', 'c', 'a'].includes(qix)) {
              this is false
          }
          
          if (['z', 'c', 'a'].includes(qix)) {
              this is true
          }
          

          或者你可以这样写

          function bla() {
            var qix = 'z'
            if (qix === 'a' || qix === 'b' || qix === 'c') {
               console.log('condition ok!! whats wrong???')
            }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-02-22
            • 1970-01-01
            • 2016-08-04
            • 2014-12-02
            • 2014-01-21
            • 1970-01-01
            • 2021-12-23
            • 1970-01-01
            相关资源
            最近更新 更多