为什么我的情况总是如此

时间:2018-04-09 14:16:52

标签: javascript lodash

我想在这个例子中知道为什么我的病情总是如此?感谢

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

7 个答案:

答案 0 :(得分:11)

您的代码存在的问题是if表达式始终评估为true

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

实际上会变成这样:

false || 'b' || 'c'

qix设置为z。由于输入错误,JavaScript会为第二个表达式返回true,因为“b”是truthy value。要更正它,您需要更改表达式,如下所示:

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

这样才能正确表达您的期望。

答案 1 :(得分:3)

来自MDNexpr1 || expr2的说明:

  

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

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,当然评估为false。这导致它进入下一个'b'的术语。非空字符串的计算结果为true,因此它会停在那里,然后变为'b'。现在你的if语句可以被认为是:

if ('b')

同样,'b'评估为true。所以你的条件实际上什么都不做。

答案 2 :(得分:2)

我认为你缺少两个概念。

首先如何||运算符工作和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',然后被强制转换为布尔值。每个字符串都转换为true,这就是值始终为真的原因。

答案 3 :(得分:1)

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

需要检查qix,如qix ==='b'

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

答案 4 :(得分:1)

这是因为你'如果条件'是可能的选择

首先说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 中为特定解决答案的数组合并了一个includes()方法

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???')
  }
}

答案 5 :(得分:0)

JavaScript为第二个或表达式返回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???')
  }

答案 6 :(得分:0)

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

,则应返回

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