Оператор &&
известен как "логическое AND
".Как правило, вы увидите это в выражении if
:
if (x == true && y == false) {
, но это не ограничение.Вы можете использовать его в любом допустимом выражении, чтобы «объединить» логические значения его операндов в один логический результат, в соответствии с логической операцией «И»:
var z = (x == true && y == false);
// z is now true or false, accordingly
Одна из замечательных вещей о &&
это то, что это "короткие замыкания".В false && true
, поскольку первый операнд false
, все выражение может оцениваться только до false
, поэтому второй операнд даже не оценивается.
Давайте проверим это снова:
var z = (false && foo());
// z is now false
В этом утверждении функция foo
даже никогда не вызывается!Не нужно, чтобы программа знала, что z
будет false.
Это больше, чем оптимизация - вы можете положиться на нее.
Некоторые глупые людииспользуйте эту технику, чтобы переписать условные операторы:
if (x == 0) {
foo();
}
в трудно читаемые одиночные выражения:
(x == 0) && foo();
Теперь рассмотрим, что присваивание может быть выражением, аналогичным вызову функции:
var a = (b = c);
Или:
var a = (b = foo());
И добавьте условное выражение с помощью описанной выше техники:
var a = ((x == 0) && (b = foo()));
Теперь все выражение b = foo()
не будетоценивается вообще, если x
не равно 0
, из-за короткого замыкания.
Нам даже не нужно ничего делать с результатом операции &&
, и если мы не хранимдля a
осталось только:
(x == 0) && (b = foo());
, что является оператором, который присваивает b
значению foo()
, только если x
равно 0
.
Избегайте этого.Трудно читать.Просто используйте оператор if
.