AKG*_*AKG 5 javascript if-statement multiple-conditions logical-operators
我正在尝试在逻辑运算符两侧的 if 语句中使用多个参数。我首先从 || 开始 运算符,按预期工作:
var a = 'apple', b = 'banana', c = 'cherry';
if (a == 'banana' || a == 'apple' || b == 'banana' || b == 'apple') {
console.log('example 1') // returns
}
if ((a || b) == 'banana' || (a || b) == 'apple') {
console.log('example 2') // returns
}
if (a == ('apple' || 'banana') || b == ('apple' || 'banana')) {
console.log('example 3') // returns
}
if ((a || b) == ('apple' || 'banana')) {
console.log('example 4') // returns
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,还没有出现意想不到的结果。然而,当遵循类似的结构替换 || 时 对于 && 运算符,事情并不完全按照我的预期工作。
if ((a == 'banana' && b == 'apple') || (a == 'apple' && b == 'banana')) {
console.log('example 5') // returns
}
if (((a || b) == 'banana') && ((a || b) == 'apple')) {
console.log('example 6') // DOESN'T RETURN
}
if ((a || b) == 'banana') {
console.log('example 6a') // DOESN'T RETURN - consistent with example 6
}
if ((a == ('apple' || 'banana')) && (b == ('apple' || 'banana'))) {
console.log('example 7') // DOESN'T RETURN
}
if (a == ('apple' || 'banana')) {
console.log('example 7a') // returns - inconsistent with example 7
}
if (b == ('apple' || 'banana')) {
console.log('example 7b') // DOESN'T RETURN - inconsistent with example 7a
}
if ((a && b) == ('apple' || 'banana')) {
console.log('example 8') // DOESN'T RETURN
}
if ('apple' == (a || b) && 'banana' == (a || b)) {
console.log('example 9') // DOESN'T RETURN
}
Run Code Online (Sandbox Code Playgroud)
现在,我想知道:我的逻辑是否有缺陷,或者不能这样做?我的目标是尽可能短地编写这些 if 语句,以提高可读性和可维护性。显然我只是在探索可能性。
有谁知道有什么方法可以解决这个问题吗?特别是示例 7/7a/7b 对我来说似乎很奇怪,因为尽管结构相似,但它产生不一致的结果[Fiddle]
该Logical OR运算符未按照您想要的方式工作。
如果可以转换为 true,则返回 expr1;否则,返回 expr2。因此,当与布尔值一起使用时,|| 如果任一操作数为 true,则返回 true;如果两者都为 false,则返回 false。
一种替代方法是使用数组的indexOf方法。请注意,它将返回index数组元素的 ,因此0也可能是有效值。为了使我们的if语句按预期工作,我们必须0 <= ...像这样使用:
if ( 0 <= ["apple","banana"].indexOf(a) ) { ... }
Run Code Online (Sandbox Code Playgroud)
您可以做的另一件事是使用in运算符。另外,由于它仅检查keys,因此您可以将其留空,values如下所示:
if ( a in { "apple": "", "banana": "" } ) { ... }
Run Code Online (Sandbox Code Playgroud)
如果您有很多选择,显然最好执行以下操作:
var options = {
"apple": "",
"banana": ""
}
if ( a in options ) { ... }
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我认为只需检查两个选项,对于人眼来说,进行两个单独的检查将更具可读性,而且我认为在您的示例中,您实际上不需要缩短语句,因为它们已经if很短了我认为可读。
if ( "apple" === a || "banana" === a ) { ... }
Run Code Online (Sandbox Code Playgroud)