В Javascript нет реальных логических логических операторов (хотя !
подходит довольно близко).Логический оператор принимает только true
или false
в качестве операндов и возвращает только true
или false
.
В Javascript &&
и ||
принимают все виды операндов и возвращают всевиды забавных результатов (что бы вы ни вводили в них).
Также логический оператор должен всегда учитывать значения обоих операндов.
В Javascript &&
и ||
взятьленивый ярлык и не оценивают второй операнд в некоторых случаях и тем самым игнорируют его побочные эффекты.Такое поведение невозможно воссоздать с помощью логического xor.
a() && b()
оценивает a()
и возвращает результат, если он ложный.В противном случае он оценивает b()
и возвращает результат.Следовательно, возвращаемый результат является правдивым, если оба результата являются правдивыми, и ложным в противном случае.
a() || b()
оценивает a()
и возвращает результат, если он правдив.В противном случае он оценивает b()
и возвращает результат.Следовательно, возвращаемый результат ложен, если оба результата ложны, и истинен в противном случае.
Таким образом, общая идея состоит в том, чтобы сначала вычислить левый операнд.Правильный операнд оценивается только при необходимости.И последнее значение - результат.Этот результат может быть чем угодно.Объекты, числа, строки ... что угодно!
Это позволяет писать такие вещи, как
image = image || new Image(); // default to a new Image
или
src = image && image.src; // only read out src if we have an image
Но истинное значение этого результата можеттакже используется для определения того, должен ли «реальный» логический оператор возвратить true или false.
Это позволяет писать такие вещи, как
if (typeof image.hasAttribute === 'function' && image.hasAttribute('src')) {
или
if (image.hasAttribute('alt') || image.hasAttribute('title')) {
Но «логический» оператор xor (^^
) всегда должен оценивать оба операнда.Это отличает его от других «логических» операторов, которые оценивают второй операнд только при необходимости.Я думаю, именно поэтому в Javascript нет «логического» xor, чтобы избежать путаницы.
Так что же произойдет, если оба операнда ложные?Оба могут быть возвращены.Но только один может быть возвращен.Который из?Первый?Или второй?Моя интуиция подсказывает мне вернуть первые, но обычно «логические» операторы, вычисленные слева направо, и вернуть последнее оцененное значение.Или, может быть, массив, содержащий оба значения?
И если один операнд является истинным, а другой операндом ложным, xor должен возвращать истинный.Или, может быть, массив, содержащий истинный, чтобы сделать его совместимым с предыдущим случаем?
И, наконец, что должно произойти, если оба операнда верны?Вы ожидаете чего-то ложного.Но нет никаких ложных результатов.Так что операция не должна ничего возвращать.Так может undefined
или .. пустой массив?Но пустой массив все еще правдив.
При использовании подхода с массивами вы получите условия, подобные if ((a ^^ b).length !== 1) {
.Очень запутанно.