布尔运算符评估顺序

时间:2013-10-07 11:16:55

标签: javascript

我有这段代码,我无法弄清楚执行顺序:

var enabled = item.get_property('Quantity') > 0 && item.get_property('UnitPrice') > 0 || item.get_id() === null

Mozilla声明here &&运算符具有||更高的优先级,所以我希望有类似的东西:

  1. item.get_property('Quantity') > 0是真的吗?如果是,请继续前进
  2. item.get_property('UnitPrice') > 0是真的吗?如果是,请继续前进
  3. item.get_id() === null是真的吗?如果是,请返回是
  4. 但显然这不是它的工作方式。如果item.get_id() === null等于true,则返回'true'。

2 个答案:

答案 0 :(得分:2)

它的工作方式完全符合它的说法。

更高的优先级意味着首先评估运算符。只要有可能,JavaScript就会短路。

您应该阅读这样的表达式(首先将parantheses应用于具有最高优先级的运算符):

var enabled = (item.get_property('Quantity') > 0 && item.get_property('UnitPrice') > 0) 
              || item.get_id() === null

关于执行顺序,我认为你不能就item.get_id()之前是否会对item.get_property()进行评估,因为这很可能取决于javascript引擎的实现。有些实现可能首先评估item.get_id() === null,因为这需要“较少的工作”,因为方法调用较少,但无论执行顺序如何,都应该尊重运算符优先级。

答案 1 :(得分:1)

如果你有一个像x b y c这样的表达式,x和y是运算符,那么具有更高优先级的x意味着表达式等价于((a x b)y c)。正如您所看到的,如果您替换&&对于x和||对于y,intrepreter将评估&& b,意思是如果a为false,它将快捷为false,但如果为true则将检查b的布尔值。如果(a&& b)为真,则解释器将快捷方式为true,但如果不是,则检查c并仅在其计算结果为true时返回true。

下表总结了所有可能的情况:

a    b    c    Evaluates    Result
0    0    0    a,c          0
0    0    1    a,c          1
0    1    0    a,c          0
0    1    1    a,c          1
1    0    0    a,b,c        0
1    0    1    a,b,c        1
1    1    0    a,b          1
1    1    1    a,b          1