С булевыми значениями true
и false
преобразуются в 1
и 0
соответственно при использовании битовых операторов на них, побитовое исключающее ИЛИ ^
могут сделать двойную обязанность как логическое XOR, а также bitwiseone, до тех пор, как ваши ценности являются логическими значениями («правдивые» значения Javascript не работают). Это легко осуществить с помощью оператора отрицания !
.
a XOR b
является logially эквивалентно следующему (короткий) список выражений:
!a^!b;
!a != !b;
Есть много других возможных форм - таких, как !a ? !!b : !b
- но эти две модели имеют преимущество только оценки a
и b
один раз (и не будет «короткозамкнуто», если a
является ложным и, следовательно, не оценивает b
), тогда как формы с использованием тройных ?:
, OR ||
или AND &&
операторы будут либо дважды оценивать, либо короткозамкнуто.
Отрицание !
операторов в обоих утверждениях важно включить по нескольким причинам: оно преобразует все «истинные» значения в логические значения («» -> false, 12 -> true и т. Д.), так что побитовый оператор имеет значения, с которыми он может работать, поэтому оператор неравенства !=
сравнивает только значение истинности каждого выражения (a != b
не будет работать должным образом, если a
или b
были не равными, непустыми строками и т. д.), и поэтому что каждая оценка возвращает результат логического значения вместо первого «правдивого» значения.
Вы можете продолжать расширять эти формы, добавляя двойные отрицания (или исключение, !!a^!!b
, что по-прежнему эквивалентно XOR), но будьте осторожны при отрицании только части выражения. Эти формы могут показаться на первый взгляд, «работа», если вы думаете, с точки зрения распределения в arithmatic (где 2(a + b) == 2a + 2b
и т.д.), но на самом деле производят различные таблицы истинности из XOR (these produce similar results to logical NXOR):
!(a^b)
!(!!a^!!b)
!!a == !!b
общая форма XOR, то, может быть функция (truth table fiddle):
function xor(a, b) { return !a^!b; }
И ваш конкретный пример будет затем:
if (xor(isEmptyString(firstStr), isEmptyString(secondStr))) { ... }
Или если isEmptyString
возвращает только логические значения, и вы не хотите общую xor
функции, просто:
if (isEmptyString(firstStr)^isEmptyString(secondStr)) { ... }
Я понимаю, что это очень хороший вопрос, но я категорически не согласен с тем, что первый ответ является лучшим. Есть гораздо более простые решения, если вы прокрутите вниз ... – Nico