如果你有一个功能可以检查4个条件(比方说A
,B
,C
和D
),如果其中任何一个是{{1该函数应返回true
。
如果你这样写的话就有用了:
false
然而,在这种情况下(如果我错了,请纠正我) - 所有条件都将在每次时检查(虽然它可能足够{例如 function is () {
return (
!A && !B && !C && !D
)
}
{ {1}}停止并返回A
您可以简单地反转该功能的功能并使用true
,但如果您希望它保持这样的话。
即,我正在寻找的是单行false
,相当于:
return (A || B || C ||D )
修改
正如答案和评论中所指出的那样,假设在第一个例子中每次都要检查所有条件是错误的。一旦其中一个评估为return
(这意味着if (a) return false;
if (b) return false;
if (c) return false;
if (d) return false;
return true;
,false
,A
,B
中至少有一个为真,即“不是 - true“)它将停止并返回C
。
答案 0 :(得分:4)
你错了:
然而,在这种情况下(如果我错了,请纠正我) - 所有的 条件将每次检查(虽然它可能足够了 示例A为true,停止并返回false
对于&&
,只要一个术语为假,表达式就会被评估为false
短路评估
当逻辑表达式从左到右进行评估时,它们会被测试 可能的"短路"评估使用以下规则:
false
&& 对false
进行短路评估。true
|| 任何事物的短路评估都是true
。
修改强>
正如在另一个答案和评论中所提到的,你当然可以这样重写你的表达方式:
return !(A || B || C || D)
仍然应该进行短路评估,因此不应该有显着的性能改进,但表达可能看起来更清晰一些。 IMO更多的是品味问题。
答案 1 :(得分:2)
你错了它的运作方式。布尔运算符如&&和||带有短路;一旦整个表达式具有已知值,它们就会停止测试。因此,在提供的代码中,如果A
为true
,则!A
为false
,false && <anything>
无法true
,所以它立即停止测试。
我所知道的每种编程语言在这种情况下使用短路,并且它不仅仅是效率黑客,它是语言标准的保证部分,因此测试右侧的表达式知道早期测试通过。否则,在像C这样的语言中,像if (p && p->someattr)
这样的测试不安全,因为没有短路,p
可能是NULL
,但它仍然会被解除引用来测试{{} 1}}。
对于记录,如果您需要测试大量值以查看是否有任何值,并且将它们存储为p->someattr
,则可以使用.some()
来检查它们。例如:
Array
或者模拟你的情况,在那里你要测试所有这些都是假的:
var resultarray = ...;
if (resultarray.some(Boolean)) {
}
这两个短路一旦找到单一的真值。类似地,Array.every
可用于测试所有条目是否满足条件,而不是至少一个,并且当找到至少一个假值时它会短路。