0

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

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

Mozilla在这里声明&&operator 具有更高的优先级 that ||,所以我期待这样的事情:

  1. item.get_property('Quantity') > 0真的吗?如果是,请继续前进
  2. item.get_property('UnitPrice') > 0真的吗?如果是,请继续前进
  3. item.get_id() === null真的吗?如果是,返回是

但显然这不是它的工作方式。如果item.get_id() === null等于 true,则返回“true”。

4

2 回答 2

2

它完全按照它所说的方式工作。

更高的优先级意味着首先评估运算符。JavaScript 会尽可能地短路。

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

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

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

于 2013-10-07T11:21:44.393 回答
1

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

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

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
于 2013-10-07T11:25:45.947 回答