单行返回“如果其中任何一个是真的返回错误”

时间:2016-06-08 12:40:09

标签: javascript boolean-logic

如果你有一个功能可以检查4个条件(比方说ABCD),如果其中任何一个是{{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; falseAB中至少有一个为真,即“不是 - true“)它将停止并返回C

2 个答案:

答案 0 :(得分:4)

你错了:

  

然而,在这种情况下(如果我错了,请纠正我) - 所有的   条件将每次检查(虽然它可能足够了   示例A为true,停止并返回false

对于&&,只要一个术语为假,表达式就会被评估为false

这是excerpt of MDN

  

短路评估

     

当逻辑表达式从左到右进行评估时,它们会被测试   可能的"短路"评估使用以下规则:

     
      
  • false && false进行短路评估。
  •   
  • true ||   任何事物的短路评估都是true
  •   

修改

正如在另一个答案和评论中所提到的,你当然可以这样重写你的表达方式:

return !(A || B || C || D)

仍然应该进行短路评估,因此不应该有显着的性能改进,但表达可能看起来更清晰一些。 IMO更多的是品味问题。

答案 1 :(得分:2)

你错了它的运作方式。布尔运算符如&amp;&amp;和||带有短路;一旦整个表达式具有已知值,它们就会停止测试。因此,在提供的代码中,如果Atrue,则!Afalsefalse && <anything>无法true,所以它立即停止测试。

我所知道的每种编程语言在这种情况下使用短路,并且它不仅仅是效率黑客,它是语言标准的保证部分,因此测试右侧的表达式知道早期测试通过​​。否则,在像C这样的语言中,像if (p && p->someattr)这样的测试不安全,因为没有短路,p可能是NULL,但它仍然会被解除引用来测试{{} 1}}。

对于记录,如果您需要测试大量值以查看是否有任何值,并且将它们存储为p->someattr,则可以使用.some()来检查它们。例如:

Array

或者模拟你的情况,在那里你要测试所有这些都是假的:

 var resultarray = ...;
 if (resultarray.some(Boolean)) {

 }

这两个短路一旦找到单一的真值。类似地,Array.every可用于测试所有条目是否满足条件,而不是至少一个,并且当找到至少一个假值时它会短路。