Javascript 为什么我的情况总是正确的

Javascript 为什么我的情况总是正确的,javascript,lodash,Javascript,Lodash,在这个例子中,我想知道为什么我的条件总是正确的?谢谢 function bla() { var qix = 'z' if (qix === 'a' || 'b' || 'c') { console.log('condition ok!! whats wrong???') } } 代码的问题是if表达式的计算结果总是true qix === 'a' || 'b' || 'c' 实际上会变成这样: false || 'b' || 'c' 由于qix被设置为z。由于输入松散

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

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

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

qix === 'a' || 'b' || 'c'
实际上会变成这样:

false || 'b' || 'c'
由于
qix
被设置为
z
。由于输入松散,JavaScript返回第二个表达式的
true
,因为“b”是a。要更正此问题,需要按如下方式更改表达式:

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

因此,它正确地表示您期望的内容。

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

您需要对照qix检查每个值,如下所示:

var qix='z'
如果(qix=='a'| | qix=='b'| | qix=='c'){
console.log('条件正常!!怎么了?')

}
如我们所知,
|
逻辑运算符)如果其中一个操作数为true,则返回
true
。在if条件中,第二个和第三个操作数中的
qix==='a'| |'b'| |'c'
是字符串,字符串被视为
false
当且仅当它们为空,否则为true。因此,你的情况总是正确的

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

var qix='z'
如果(qix=='a'| | qix=='b'| | qix=='c'){
console.log('条件正常!!怎么了?')
}
否则{
console.log('else')

}
expr1 | | expr2的说明来自:

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

假设qix不是
'a'
,那么这个表达式来自您的代码:

qix === 'a' || 'b' || 'c'
第一个术语
qux=='a'
false
,其计算结果当然为false。这导致它转到下一个术语,即
'b'
。非空字符串的计算结果为
true
,因此它停止在那里,变成
'b'
。现在,您的if语句可以被认为是:

if ('b')

同样,
'b'
的计算结果为
true
。因此,您的条件实际上什么也没做。

您可以使用Regex:
qix.match(/^(a | b | c)$/)

如果
qix
等于
a
b
c

var qix='z';
if(qix.match(/^(a | b | c)$/){
console.log('条件正常!!怎么了?');
}否则{
console.log('else');

}
我认为您缺少两个概念

首先是| |运算符的工作原理,然后是javascript值的强制

在代码中:

  if ('z' === 'a' || 'b' || 'c') { ----}
将始终计算为
true
。 原因是| |运算符将返回强制为true的第一个值,而不实际强制该值。关联性(运算符的执行顺序)是从左到右的。这意味着发生以下情况:

首先,将评估以下内容,因为其具有更高的可用性:

然后,我们将从左到右计算以下表达式:

false || 'b' || 'c'
设foo=false | |'b'

console.log(foo)
这是因为“如果条件”是采取3种可能的选项

首先说qix==='a',这是错误的,但您询问的是'b','c'和此选项的值是真的,因为您没有将var qix与'b'或'c'进行比较,您只询问条件,如果'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???')
  }
}

在您的情况下有两个
“c”
。您误解了
|
操作符的工作原理。可能重复@TakitIsy。始终使用
==
==
被认为是良好的做法,只有在适用时才使用@TakitIsy很少。当您实际需要处理不同类型的值时。因为这是一个明显的重复问题。适用于当前的两个答案:否决,因为“改为尝试此”或“您需要使用此”不是“为什么”问题的答案。因为这是一个明显的重复问题。@Xufox感谢您发现我的错误。我换了答案。
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???')
  }
}