Chr*_*ian 6 javascript java operator-precedence short-circuiting
在JavaScript和Java中,equals运算符(==或===)的优先级高于OR运算符(||).然而,两种语言(JS,Java)都支持if语句中的短路:
当我们有if(true || anything()),anything()没有评估.
您还可以使用以下表达式:true || foo == getValue())- 例如,在输出语句中,例如console.log(...);,或在赋值中.
现在,根据运算符优先级,不应该发生短路,就优先级而言==== ==> ||.(换句话说,比较应该首先发生,getValue()应该调用,因为等式检查具有比OR比较更高的优先级.)但它确实如此.getValue()没有被调用(可以通过将输出语句放入其正文中来轻松检查).
为什么(当运算符优先说它不应该时,短路工作)?
还是我困惑的事情?
Jon*_*eet 15
还是我困惑的事情?
你是.我认为将优先权视为分组而非排序要简单得多.它会影响评价的顺序,而只是因为它改变了分组.
我不确定Javascript,但在Java操作数总是按从左到右的顺序进行评估.事实上,==优先级高于||仅仅意味着
true || foo == getValue()
Run Code Online (Sandbox Code Playgroud)
被评估为
true || (foo == getValue())
Run Code Online (Sandbox Code Playgroud)
而不是
(true || foo) == getValue()
Run Code Online (Sandbox Code Playgroud)
如果你只是考虑那种方式的优先级,然后考虑评估总是从左到右(例如,左操作数||总是在右操作数之前进行评估),那么一切都很简单 - 并且getValue()由于简短而永远不会评估-circuiting.
要从等式中消除短路,请考虑以下示例:
A + B * C
Run Code Online (Sandbox Code Playgroud)
...其中A,B并且C可能仅仅是变量,也可以是其他表达式,如方法调用.在Java中,保证将其评估为:
A(并记住以后)BCB与CA使用乘法结果添加求值结果请注意,即使*具有更高的优先级+,A仍然会在B或之前评估C.如果你想在排序方面考虑优先级,请注意在加法之前乘法仍然如何发生 - 但它仍然满足从左到右的评估顺序.