Что такое оператор двойной трубы (||
)?
Оператор двойной трубы (||
) - это логический оператор OR
. В большинстве языков это работает следующим образом:
- Если первое значение
false
, оно проверяет второе значение. Если это true
, возвращается true
, а если false
, возвращается false
.
- Если первое значение
true
, оно всегда возвращает true
, независимо от того, какое второе значение.
Так что в основном это работает так:
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
Если вы все еще не понимаете, посмотрите на эту таблицу:
| true false
------+---------------
true | true true
false | true false
Другими словами, это только ложь, когда оба значения ложны.
Чем он отличается в JavaScript?
JavaScript немного отличается, потому что это свободно типизированный язык . В этом случае это означает, что вы можете использовать оператор ||
со значениями, которые не являются логическими. Хотя это не имеет смысла, вы можете использовать этот оператор, например, с функцией и объектом:
(function(){}) || {}
Что там происходит?
Если значения не булевы, JavaScript делает неявный разговор с булевыми . Это означает, что если значение равно Falsey (например, 0
, ""
, null
, undefined
(см. Также Все значения Falsey в JavaScript )), оно будет рассматриваться как false
; в противном случае он рассматривается как true
.
Таким образом, приведенный выше пример должен дать true
, потому что пустая функция верна. Ну, это не так. Возвращает пустую функцию. Это потому, что оператор JavaScript ||
не работает, как я писал в начале. Работает следующим образом:
- Если первое значение falsey , возвращается второе значение .
- Если первое значение истинно , возвращается первое значение .
Удивлены? На самом деле, он «совместим» с традиционным оператором ||
. Это можно записать в виде следующей функции:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
Если вы передаете истинное значение как x
, оно возвращает x
, то есть истинное значение. Так что если вы используете его позже в if
предложении:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
вы получите "Either x or y is truthy."
.
Если бы x
было ложным, eitherXorY
было бы y
. В этом случае вы получите "Either x or y is truthy."
, если y
будет правдой; в противном случае вы получите "Neither x nor y is truthy"
.
Актуальный вопрос
Теперь, когда вы знаете, как работает оператор ||
, вы, вероятно, сможете сами разобраться, что означает x = x || y
. Если x
является правдивым, x
присваивается x
, так что на самом деле ничего не происходит; в противном случае y
присваивается x
. Обычно используется для определения параметров по умолчанию в функциях. Тем не менее, это часто считается плохой практикой программирования , поскольку она не позволяет вам передавать значение Фолси (которое необязательно undefined
или null
) в качестве параметра. Рассмотрим следующий пример:
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Это выглядит актуально с первого взгляда. Однако что произойдет, если вы передадите false
в качестве параметра flagA
(поскольку он логический, то есть может быть true
или false
)? Это станет true
. В этом примере нет способа установить flagA
в false
.
Лучше было бы явно проверить, является ли flagA
undefined
, вот так:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Хотя оно длиннее, оно всегда работает и его легче понять.
Вы также можете использовать синтаксис ES6 для параметров функции по умолчанию , но обратите внимание, что он не работает в старых браузерах (например, IE). Если вы хотите поддерживать эти браузеры, вы должны перенести свой код с помощью Babel .
См. Также Логические операторы на MDN .