我想在这个例子中知道为什么我的病情总是如此?感谢
function bla() {
var qix = 'z'
if (qix === 'a' || 'b' || 'c') {
console.log('condition ok!! whats wrong???')
}
}
答案 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)
来自MDN的expr1 || 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
等于a
或b
或c
var qix = 'z';
if (qix.match(/^(a|b|c)$/)) {
console.log('condition ok!! whats wrong???');
} else {
console.log('else');
}