Логические операторы, как правило, используются с булевыми значениями и возвращают булево значение.
Однако, в 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
Хорошая статья, но Вы забыли про изключающее или (xor)
В JS есть только побитовый XOR
Что приоритетнее в коде, И или ИЛИ?
Что будет выполняться сначала ,а что после:
if (a = b || a > b && a < c)
Как это будет звучать?
Если а = b или a > b, и вместе с этим a < b.
Если a = b или b < a < c?
Как?
Скобки расставь и будет тебе счастье.
О приоритетах исполнения операторов в JS можно почитать, например, на сайте Мозиллы здесь и здесь.
В данном случае сперва отработает И, затем - ИЛИ.
Но чтобы код был понятнее - лучше все-таки использовать скобки.
при сравнении указывай два равно ==
&& - считается логическим умножением
|| - логическое сложение
Приоритеты соответствующие.
Ошибка новичка - присваивать значения тогда, когда нужно их сравнивать.
a == b (a = b оператор присваивания)...
Почему плохо (если плохо) писать:
flag && some_func();
вместо
if (flag) {
some_func();
}
?
JSlint ругается. Может быть существует какая-то угроза, что в будущем логические вычисления будут делаться не по короткой схеме?
Никакой угрозы. Google Closure именно так и поступает, когда сжимает код
а одиночный амперсанд где?
Где ошибка?
Здесь:
у меня возник вполне справедливый вопрос - а почему нельзя так:
?
var 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"
фрагмент кода:
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 !! А этого очень хотелось бы!! Но как!! Вопрос вопросов!!!
Я не уверен, я только учусь, но попробуй перед if вставить
switch(x){
case(0):
x=true;
}
и так для каждой переменной x b c d e. Сработает, но в переменную запишет true.