短路评估订单

时间:2013-05-25 16:41:14

标签: javascript boolean evaluation short-circuiting

这段时间我对短路评估的看法似乎都是错误的。

在javascript中:

var a = false, b = true, c=true;
a && b || c; // Evaluates to true

相比
var a = false, b = true, c=true;
a && (b || c); // Evaluates to true

为什么VM在看到a为假时停止?

更明确的例子:

function a(){
  console.log("I'm A");
  return false;
}
function b(){
  console.log("I'm B");
  return true;
}
function c(){
  console.log("I'm C");
  return true;
}

a() && b() || c();

输出结果为:

I'm A
I'm C
true

显然

a && b || c === (a && b) || c

所以我很困惑,为什么它会自动包装a&& b在一起?这些表达式的操作顺序究竟是什么?

大多数语言是否遵守此顺序(PHP似乎是这样的)?

1 个答案:

答案 0 :(得分:3)

这些简单的规则适用:
- 逻辑表达式评估中的快捷方式并不意味着表达式被错误地评估,即结果与快捷方式相同或无效;
- AND 布尔运算符(&&)的优先级高于 OR(||)。这就是为什么 a&& b 被“包裹”在一起;
- 依靠优先顺序是不安全的,使用括号;这也提高了可读性;
- 如果结果已经定义,大多数语言在评估逻辑表达式时会执行快捷方式,包括。 PHP;然而,最常见的例外是反向抛光表示法语言,如PostScript。