В чем разница между & и && в JavaScript?

82

В чем разница между & и && в 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.)

Мартин Тома
источник
Если вам интересно, почему мы не используем побитовые операции вместо логических операторов, рассмотрите 4 & 1 = 0. Использование двух массивов длиной 4 и 1; побитовое: fruits.length & veggies.length === 0и логическое: fruits.length && veggies.length === true.
Том Андерсон

Ответы:

149

& побитовое И

Этот оператор ожидает два числа и возвращает число. Если это не числа, они преобразуются в числа.

Как это работает? В Википедии есть ответ: 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 байтов.

Рок Краль
источник
5
&& не возвращает логическое значение в JavaScript.
Sanghyun Lee 05
1
AFAIK &&возвращает первое значение, если оно ложно-y, и второе значение в противном случае.
duri 05
1
Ответ полностью переработан.
Rok Kralj
Если он возвращает первое значение, я не понимаю, как я могу это запустить: if ($ ('# form1'). Parsley (). Validate () == true && $ ('# form2'). Parsley () .validate () == true) {// сделать что-нибудь, если обе формы действительны}, потому что он выйдет из первой функции, если он ложный, и никогда не будет проверять вторую форму, как тогда запустить этот оператор IF?
user991
1
@ user777 Разве не имеет значения, проверяется ли вторая форма, если ваша операция должна выполняться только после проверки обеих? Если первая форма не работает, вся операция недействительна. Однако это действительно совершенно отдельный вопрос, потому что этот поток предназначен для возврата , а не для использования операторов if .
Райан Уильямс
24

&это побитовое «и». Это означает, что если у вас есть два числа, преобразованных в двоичное, результатом будет число, которое имеет 1цифру в позициях, где есть оба числа 1.

  100011  //35
& 111001  //57
---------
  100001  //35 & 57 == 33
дури
источник
-3

Чтобы определить, являются ли два логических значения истинными или ложными, если вы хотите проверить их оба (например, проверка на веб-странице), вы можете использовать &оператор. &побитовое И.

С &&оператором, как только он обнаруживает, что первое значение ложно, он прекращает оценку и не проверяет второе значение.

Джейк Уэйн
источник
1
Вы не используете побитовое И ( &) при работе с логическими значениями. См. Другие ответы о правильном использовании этого оператора.
FtDRbwLXw6,
@drrcknlsn, я читал другие ответы, но объяснение здесь работает очень хорошо, не могли бы вы предоставить дополнительную информацию о своей претензии ??
azerafati
1
@Bludream: объяснение в этом ответе неверно. Вы не используете побитовые операторы для логических (булевых) сравнений. Вы используете логические (булевы) операторы. Они делают разные (хотя и похожие) вещи, ожидают разные входные данные, производят разные выходные данные и имеют разный приоритет операторов.
FtDRbwLXw6
1
Я согласен, что это плохая практика, но использование & с логическими значениями будет работать. false оценивается как 0, а true оценивается как 1. Я не вижу ничего технически неверного в этом ответе, поскольку вы «можете» использовать &, это просто не рекомендуется.
dyoung
-3

При всем высоком, подробном понимании, они по большей части упустили истину о том, что существует условная оценка, при которой будет работать ТОЛЬКО сингл &. Практический ответ непрофессионала, который решил, что моя голова ударилась о строку оператора IF из MULTIPLE, связанного && each! == с условием, вызывал FAILURE и требовал законного использования одного &. Я благодарю Джейка Уэйна (и Расса) за их несправедливо отвергнутый ответ, в котором все было правильно, учитывая, что там, где есть более одного && that! ==, он уже прекратил свою оценку и не продолжает свою работу после того, как первая оценка найдена ==! С помощью && он думает, что его работа выполнена после того, как первая оценка показывает! == [например. ложный]. Мой код ошибки был

IF ((sessionStorage.myLable !== "LableStringA") && (sessionStorage.myLable !== "LableStringB") && (sessionStorage.myLableZ !== "LableStringA") && (sessionStorage.myLableZ !== "LableStringB")) { ...)

Здесь правильная замена и использование единственного & вместо && это было как практически в реальном мире, так и технически правильным ответом. Еще раз спасибо Джейку Уэйну (и Рассу) за понимание и понимание кода.

GladHeart
источник
1
Я не рекомендую использовать что-то «просто потому, что это работает», если вы этого не понимаете. Вы просто создаете себе проблемы позже, когда они перестают работать и вы не можете их отлаживать. Или, что еще хуже, вы пытаетесь использовать это на собеседовании, а они смотрят на вас как на _ಠ. Если ваши условные выражения не оценивают то, что вы ожидаете, у вас есть логическая ошибка. Нет причин оценивать все 4 условных
Брэндон
Спасибо, Брэндон. Я не сомневаюсь в ваших общих опасениях. Я всегда придерживаюсь и устанавливаю соглашение ===. Однако здесь ВСЕ четыре оценки были необходимы вопреки вашему последнему доброму комментарию. Все четыре оценки должны быть! == и использовались в этом формате в круглых скобках. Это было объединение &&, которое не соответствовало ожиданиям высокой логики. Использование одного & было правильно прочитано компиляторами на всех основных ОС, которые я тестировал.
GladHeart
В качестве продолжения объяснения того, почему это кажется и действительно работает элегантно, это будет ясность ложно уничиженного ответа Расса и Джейка. Необходимо оценить все четыре оценки. Использование && останавливает / прерывает выполнение, когда первая оценка ложна. Использование одиночного & позволяет продолжить оценку оставшихся трех условий. Как сказали Расс и Джейк: «С оператором« && », когда он обнаруживает, что первое значение ложно, он прекращает оценку и не проверяет второе значение». Принимая во внимание, что «если вы хотите проверить их [все] (например, проверка на веб-странице), вы можете использовать оператор« & ».« & »Является побитовым И»
GladHeart
1
Если вам нужно проверить их все, вы также можете структурировать свою логику, if (!(sessionStorage.myLable === "LableStringA" || sessionStorage.myLable === "LableStringB") || !(sessionStorage.myLableZ === "LableStringA" || sessionStorage.myLableZ === "LableStringB")) { // fail validation}которая кажется более ясной относительно того, что вы намереваетесь (я предполагаю, что вы хотите, чтобы значения myLable были одним из двух значений, или не прошли проверку) . Если у вашего состояния нет побочных эффектов, нет причин, по которым вам нужно оценивать их все. Оператор работает, как и предполагалось, но ваша логика перевернулась
Брэндон
Тай для продолжения Брэндона. В моем случае он по-прежнему упускает из виду необходимость условий, при которых поиск === может быть одной из десятков возможностей для каждой из четырех проверок. Проще говоря, если ни один из четырех не содержит определенного значения маркера страницы, я возвращаюсь к запуску сценария, чтобы компенсировать его отсутствие. Все четыре ДОЛЖНЫ отображаться как == !. Дело не в том, что «если вы хотите убедиться, что значения myLable являются одним из двух значений», это на самом деле myLable - одно из многих в стоге сена возможностей. Следовательно, неэквивалентность - это единственный вопрос, который требуется 4 раза.
GladHeart