Ответ 1
if( isValid && statement() )
работает только в том случае, если statement()
возвращает a boolean
, иначе условие не будет компилироваться. Выполнение этого может не считаться хорошим дизайном (в зависимости от того, что действительно делает statement
) и может уменьшить читаемость или вашу способность использовать возвращаемое значение statement()
.
Кроме того, только isValid && statement();
не поддерживается языком - и не делайте ошибку для сравнения языка, такого как Java, с языком, подобным JavaScript, они следуют различным парадигмам.
Вы можете сделать что-то вроде boolean b = isValid && statement();
, но обычно вы это делаете, если хотите каким-то образом использовать значение b
.
Изменить: В соответствии с запросом KRyan Я также добавлю абзац о значении a && b
и о том, что он используется для Java, а также для JavaScript (хотя я не эксперт здесь).
Java
В общем случае вы можете комбинировать два булевых выражения с помощью &
(и) или |
(или). Таким образом, true & true
приведет к true
, как и к true | false
, но true & false
приведет к false
и т.д.
Проблема с одиночными символьными операторами заключается в том, что каждый аргумент оценивается, даже если вы уже знаете результат. В качестве примера, когда вы видите false & ...
, вы уже знаете, что результат false
при просмотре первого аргумента и любых других аргументов не будет иметь значения.
Теперь, если у вас есть выражение, которое вызывает некоторые методы, которые возвращают логическое значение, вы можете не захотеть выполнять эти методы, если они не нужны, например. когда сами методы довольно дороги. В качестве примера рассмотрим needsCheckWebsite & isValueOnWebsite( "test" )
. isValueOnWebsite( "test" )
может занять некоторое время, и если needsCheckWebsite
был ложным, вы не захотите выполнить этот метод.
Чтобы исправить это, вы можете использовать двухсимвольные операторы &&
и ||
, а также операторы короткого замыкания. Это означает, что если вы пишете needsCheckWebsite && isValueOnWebsite( "test" )
и если needsCheckWebsite
является ложным, дорогостоящее выполнение isValueOnWebsite( "test" )
не произойдет, поскольку мы уже знаем, что результат ничего не меняет.
Следовательно, isValid && statement()
означает, что statement()
должен выполняться только, если isValid
.
JavaScript
AFAIK в JavaScript операторы короткого замыкания работают аналогичным образом, поскольку он вычисляет первый аргумент, и если результат все еще неизвестен, второй аргумент оценивается и возвращается. Однако, поскольку JavaScript является динамически типизированным языком (в отличие от Java, который статически типизирован), вы можете смешивать разные типы, например. var value = null || "hello"
, что приведет к value = "hello"
.
Это позволяет разработчику использовать &&
и ||
для вещей, отличных от логической логики, таких как предоставление значения по умолчанию, которое невозможно в Java из-за статического ввода (в Java вы можете использовать трехмерный оператор ?
для этого, например String s = input != null ? input : defaultValue
, но, как вы можете видеть, это выглядит не так элегантно, как JavaScript var s = input || defaultValue
).