【发布时间】:2013-05-21 01:00:37
【问题描述】:
一直以来,我对短路评估的想法似乎都是错误的。
在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 好像是这样的)?
【问题讨论】:
-
从小学开始,我一直将
AND视为乘法,将OR视为加法;鉴于此,在分组时更容易记住哪个优先(在数学表达式中,multiplication 在 addition 之前计算)。
标签: javascript boolean evaluation short-circuiting