В чем разница между & и && в JavaScript?
Пример кода:
var first = 123;
var second = false;
var third = 456;
var fourth = "abc";
var fifth = true;
alert(first & second); // 0
alert(first & third); // 72
alert(first & fourth); // 0
alert(first & fifth); // 1
alert(first && second); // false
alert(first && third); // 456
alert(first && fourth); // abc
alert(first && fifth); // true
Кажется, что && - это логическое «и», которое всегда дает мне второе значение, если оба верны.
Но что такое &?
(Между прочим, && похоже на "и" в Python; & похоже на & в Python.)
javascript
bitwise-operators
logical-operators
Мартин Тома
источник
источник
fruits.length & veggies.length === 0
и логическое:fruits.length && veggies.length === true
.Ответы:
&
побитовое ИЭтот оператор ожидает два числа и возвращает число. Если это не числа, они преобразуются в числа.
Как это работает? В Википедии есть ответ: https://en.wikipedia.org/wiki/Bitwise_operation#AND
Примечание. В Javascript использование этого оператора не рекомендуется, так как нет целочисленного типа данных, только с плавающей запятой. Таким образом, числа с плавающей запятой преобразуются в целые числа перед каждой операцией, что замедляет ее выполнение. Кроме того, он не имеет реального использования в типичных веб-приложениях и создает нечитаемый код.
Общее правило: Избегайте. Не используйте это. Это редко имеет место в поддерживаемом и читаемом коде JS.
&&
логическое ИОн ожидает два аргумента и возвращает:
Вот некоторые примеры:
0 && false 0 (both are false-y, but 0 is the first) true && false false (second one is false-y) true && true true (both are true-y) true && 20 20 (both are true-y)
Если вы когда-либо используете его только на Boolean, это как раз оператор AND из математической логики.
&&
цепочка операторовПричина, по которой этот оператор определен, как указано выше, - это цепочка операторов. Вы можете связать этого оператора и при этом соблюдать вышеуказанные правила.
true && 20 && 0 && 100 0 (it is the first false-y) 10 && 20 && true && 100 100 (last one, since all are true-y)
&&
короткое замыканиеКак видно из определения, как только вы обнаружите, что один термин является ложным, вам не нужно беспокоиться о следующих терминах. Javascript даже пошёл дальше, термины даже не оцениваются. Это называется коротким замыканием.
true && false && alert("I am quiet!")
Этот оператор ни о чем не предупреждает и
false
возвращается. Следовательно, вы можете использовать&&
оператор как более короткую замену оператору if. Они эквивалентны:if (user.isLoggedIn()) alert("Hello!") user.isLoggedIn() && alert("Hello!")
Почти все компрессоры JS используют этот трюк для сохранения 2 байтов.
источник
&&
возвращает первое значение, если оно ложно-y, и второе значение в противном случае.&
это побитовое «и». Это означает, что если у вас есть два числа, преобразованных в двоичное, результатом будет число, которое имеет1
цифру в позициях, где есть оба числа1
.100011 //35 & 111001 //57 --------- 100001 //35 & 57 == 33
источник
Чтобы определить, являются ли два логических значения истинными или ложными, если вы хотите проверить их оба (например, проверка на веб-странице), вы можете использовать
&
оператор.&
побитовое И.С
&&
оператором, как только он обнаруживает, что первое значение ложно, он прекращает оценку и не проверяет второе значение.источник
&
) при работе с логическими значениями. См. Другие ответы о правильном использовании этого оператора.При всем высоком, подробном понимании, они по большей части упустили истину о том, что существует условная оценка, при которой будет работать ТОЛЬКО сингл &. Практический ответ непрофессионала, который решил, что моя голова ударилась о строку оператора IF из MULTIPLE, связанного && each! == с условием, вызывал FAILURE и требовал законного использования одного &. Я благодарю Джейка Уэйна (и Расса) за их несправедливо отвергнутый ответ, в котором все было правильно, учитывая, что там, где есть более одного && that! ==, он уже прекратил свою оценку и не продолжает свою работу после того, как первая оценка найдена ==! С помощью && он думает, что его работа выполнена после того, как первая оценка показывает! == [например. ложный]. Мой код ошибки был
IF ((sessionStorage.myLable !== "LableStringA") && (sessionStorage.myLable !== "LableStringB") && (sessionStorage.myLableZ !== "LableStringA") && (sessionStorage.myLableZ !== "LableStringB")) { ...)
Здесь правильная замена и использование единственного & вместо && это было как практически в реальном мире, так и технически правильным ответом. Еще раз спасибо Джейку Уэйну (и Рассу) за понимание и понимание кода.
источник
if (!(sessionStorage.myLable === "LableStringA" || sessionStorage.myLable === "LableStringB") || !(sessionStorage.myLableZ === "LableStringA" || sessionStorage.myLableZ === "LableStringB")) { // fail validation}
которая кажется более ясной относительно того, что вы намереваетесь (я предполагаю, что вы хотите, чтобы значения myLable были одним из двух значений, или не прошли проверку) . Если у вашего состояния нет побочных эффектов, нет причин, по которым вам нужно оценивать их все. Оператор работает, как и предполагалось, но ваша логика перевернулась