Javascript 短路评估命令
一直以来,我对短路评估的想法似乎都是错误的 在javascript中:Javascript 短路评估命令,javascript,boolean,evaluation,short-circuiting,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为false时不停止 更明确的例子: function a(){ console.log("
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
为false时不停止
更明确的例子:
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似乎是这样的)?这些简单的规则适用:
-逻辑表达式求值中的快捷方式并不意味着表达式求值错误,即结果相同或没有快捷方式;
-和布尔运算符(&&)的优先级高于或(| |)。这就是为什么a和b被“包装”在一起的原因;
-依赖优先顺序是不安全的,请使用括号 ; 这也提高了可读性;
-如果结果已经定义,大多数语言在计算逻辑表达式时都会执行快捷方式,包括PHP;但是也有例外,最明显的是像PostScript这样的反向波兰符号语言。从小学起,我一直把
和看作乘法,把或看作加法;有鉴于此,分组时更容易记住哪一个优先(在数学表达式中,乘法在加法之前计算)。