Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 短路评估命令_Javascript_Boolean_Evaluation_Short Circuiting - Fatal编程技术网

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("

一直以来,我对短路评估的想法似乎都是错误的

在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("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这样的反向波兰符号语言。

从小学起,我一直把
看作乘法,把
看作加法;有鉴于此,分组时更容易记住哪一个优先(在数学表达式中,乘法在加法之前计算)。