Все это время мои мысли об оценке короткого замыкания кажутся неправильными.
В 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
Почему виртуальная машина не останавливается, когда видит, что 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
как сложение; при этом легче запомнить, какой из них имеет приоритет при группировке (в математическом выражении умножение вычисляется до сложения). - person Kamafeather   schedule 09.10.2018