Так как же все таки работают || && в связке с друг другом?
по приоритету или по короткому циклу вычислений?
true || 2 && (x = 3) || 4 //true и присвоение (x = 3) не выполнилось, хотя по приоритетам должно было. Сработал короткий цикл, где ИЛИ запнулось на правде, 1 true
но
true && false && false || (x=3) // 3, по короткому циклу вычислений должно было И запнутся на лжи и вывести false и до ИЛИ не должно было дойти
Мне кажется в этом примере просматривается “ленивое вычисление”, в независимости от приоритетов выполнить требуется только (слева-направо) true || и все остальное уже отсекается и не требует обработки.
Так же и в таком примере отсекается
true && true && true || (x=3)
Ваш пример даже здесь описан: https://learn.javascript.ru/logical-ops лучше сказанного, не скажешь: “…при использовании логических операторов выражения в первую очередь тестируются на “короткие замыкания” (в статье - “короткий цикл вычислений”). т.е. если порядок выполнения операторов в выражении 1 + 2 * 3 четко определен приоритетом, то в выражении true || ++x, несмотря на то, что префиксный инкремент имеет более высокий приоритет, он не будет выполнен, т.к. результат этого подвыражения(++x) никак не повлияет на итоговый результат всего логического выражения. т.е. сработало короткое замыкание.”.
Можно считать это поведение больше особенностью (оптимизацией) интерпретатора.
Спасибо большое, что откликнулись
Вот тут http://disq.us/p/1dmw1s8 объяснили, что:
В случае выражения: true && false && false || (x=3) не забывайте, что у И приоритет выше, чем у ИЛИ, поэтому данное выражение можно представить так: (true && false && false) || (x=3). В первых скобках запнется на первом false (и результат первых скобок будет false), но надо будет вычислить и вторые скобки на случай, если там истина (что так и есть).
в таком примере:
(a = 1) && (b = 2) && (c = 3) || (x = 1)
a, b, c будут вычислены, а x нет