Логические операторы, как правило, используются с булевыми значениями и возвращают булево значение.
Однако, в javascript операторы && и || возвращают не булево значение, а один из операндов, определивший значение выражения. Конечно, результат в таком случае может быть и не булевым.
Логические операторы описаны следующей таблицей:
| Оператор |
Использование |
Описание |
Логическое И (&&) |
expr1 && expr2 |
Возвращает expr1, если оно может быть преобразовано к false; в ином случае возвращает expr2. Так что, при вызове с булевыми значениями, && вернет true только если оба операнда истинны, иначе false. |
Логическое ИЛИ (||) |
expr1 || expr2 |
Возвращает expr1, если оно может быть преобразовано к true; в ином случае возвращает expr2. Так что, при вызове с булевыми значениями, || вернет true только в том случае, когда хотя бы один операнд истинен, иначе вернет false. |
Логическое НЕ (!) |
!expr |
Возвращает false, если операнд может быть преобразован к true, в ином случае возвращает true. |
К false преобразуются, например: null, 0, пустая строка ("") и undefined.
Хотя операторы && и || и могут быть использованы для возвращения небулевых значений, они все же логические, так как возвращаемые значения могут быть приведены к булевому типу.
Оператор ! также используется для быстрого преобразования выражения к булевому значению:
!!"string" = true
!!null = false
Сокращенные вычисления
Так как логические выражения вычисляются слева направо, они проверяются на возможность "сокращенных вычислений" по следующим правилам:
false && что угодно становится false.
true || что угодно становится true.
Эти правила логики гарантируют, что результат всегда правильный, но лишних вычислений при этом не проводится. Как следствие, невычисленные выражения не дадут побочных эффектов:
a =1
check = 5 || (a=3)
alert(a) // 1
Автор: DooMer, дата: 26 октября, 2010 - 09:47
#permalinkХорошая статья, но Вы забыли про изключающее или (xor)
Автор: Гость (не зарегистрирован), дата: 11 июня, 2011 - 17:42
#permalinkЧто приоритетнее в коде, И или ИЛИ?
Что будет выполняться сначала ,а что после:
if (a = b || a > b && a < c)
Как это будет звучать?
Если а = b или a > b, и вместе с этим a < b.
Если a = b или b < a < c?
Как?
Автор: Гость (не зарегистрирован), дата: 12 декабря, 2011 - 12:25
#permalinkПочему плохо (если плохо) писать:
flag && some_func();вместо
if (flag) {some_func();
}
?
JSlint ругается. Может быть существует какая-то угроза, что в будущем логические вычисления будут делаться не по короткой схеме?
Автор: BRIGSS, дата: 10 февраля, 2015 - 21:19
#permalinkа одиночный амперсанд где?
Автор: Ghostgineer (не зарегистрирован), дата: 30 ноября, 2015 - 11:04
#permalinkГде ошибка?
Автор: msangel (не зарегистрирован), дата: 9 января, 2016 - 23:29
#permalinkу меня возник вполне справедливый вопрос - а почему нельзя так:
var UpdatableResource = function (config) { this.remoteUrl = config.remoteUrl || throw new Error('remoteUrl option is required'); }; var res1 = new UpdatableResource({remoteUrl : 'valid'}); var res2 = new UpdatableResource(); // invalid?
Автор: x6a0x (не зарегистрирован), дата: 2 февраля, 2016 - 18:29
#permalinkvar w = 0;
do{
w = prompt("Туз: 1 или 11")
alert(w)
}while(w != "11" || w != "1");
parseInt - не помогает
значение w меняеться но вот while все ровно читает как false даже если w = 11, w = 1, w = "1", w = "11"
Автор: Гость (не зарегистрирован), дата: 3 января, 2017 - 10:34
#permalinkфрагмент кода:
x=parseInt(prompt("Сколько кранов надо собрать?",""))
b=parseInt(prompt("Введите количество корпусов(У.ДК.050.02)",""));
c=parseInt(prompt("Введите количество патрубков(ДК.050.01-32п)",""));
d=parseInt(prompt("Введите количество шайб(У.ДК.050.03) ",""))
e=parseInt(prompt("Введите количество сёдел(У.Д.ПИ.050.04-33п)",""))
if (!b||b<0||!c||c<0||!d||d<0||!e||e<0||!x||x<0){document.write("Введите число правильно")}
При этом нельзя вводить с клавиатуры буквы,отрицательные числа,но и также нельзя ввести 0 !! А этого очень хотелось бы!! Но как!! Вопрос вопросов!!!