【发布时间】:2012-06-22 16:28:12
【问题描述】:
在搜索网站的源代码时,我找到了一种以另一种方式(我认为)编写if 语句的方法。
代替:
if(a)b;
或:
a?b:'';
我读到了:
!a||b;
第三种方式和前两种方式一样吗?如果是,我们为什么要使用第三种方式?
【问题讨论】:
标签: javascript if-statement short-circuiting
在搜索网站的源代码时,我找到了一种以另一种方式(我认为)编写if 语句的方法。
代替:
if(a)b;
或:
a?b:'';
我读到了:
!a||b;
第三种方式和前两种方式一样吗?如果是,我们为什么要使用第三种方式?
【问题讨论】:
标签: javascript if-statement short-circuiting
布尔表达式的结果有时可以在不评估所有子表达式的情况下进行评估。如果我们有A||B,并且A 为真,则甚至不需要评估B,因为无论如何结果都会为真。这种行为称为“快捷布尔评估”,是大多数编程语言中的事实标准。它允许在不评估 A[i] 操作数的情况下编写 if (i < A.length && A[i] == ...) 之类的表达式,如果 i 值不正确,可能会导致异常。
在这种特殊情况下,!a||b 与 if(a)b 相同,是的,但是这种代码的可读性和可维护性是一个问题。
【讨论】:
欢迎来到short-circuit evaluation 的概念。这是在不同语言中使用的逻辑运算符的众所周知的属性。大多数情况下,这将用作正确的 if 或任何其他流控制语句中的子表达式,或者表达足够短的条件以便以这种方式保持可读性,或者通过自动转换来节省字节。
甚至还有关于这些问题的标签:short-circuiting。
【讨论】:
第三种方式与前一种方式相同。使用它的一个论点是节省字节。反对使用它的一个强有力的论据是可读性。编写代码时最好注重可读性,并使用最小化器(例如Google Closure Compiler)来节省字节数。
它可以更短:
a && b;
/* !a||b means:
(not a) OR b
which is equivalent to
a AND b
which turns out to be
a && b
*/
【讨论】:
(not false) or false 等价于false and false?真的吗? )
if(a)b;,当a 为真时,这会导致评估b。 b 的结果无关紧要。