我有这段代码,我无法弄清楚执行顺序:
var enabled = item.get_property('Quantity') > 0 && item.get_property('UnitPrice') > 0 || item.get_id() === null
Mozilla声明here &&
运算符具有||
更高的优先级,所以我希望有类似的东西:
item.get_property('Quantity') > 0
是真的吗?如果是,请继续前进item.get_property('UnitPrice') > 0
是真的吗?如果是,请继续前进item.get_id() === null
是真的吗?如果是,请返回是但显然这不是它的工作方式。如果item.get_id() === null
等于true,则返回'true'。
答案 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