Я отлаживаю некоторый JavaScript и не могу объяснить что это ||
?
function (title, msg) {
var title = title || 'Error';
var msg = msg || 'Error on Request';
}
Может кто-то давать мне подсказку, почему этот парень использует var title = title || 'ERROR'
? Я иногда вижу его без a var
объявление также.
Это означает, что аргумент заголовок
является необязательным. Поэтому, если вы вызываете метод без аргументов, он будет использовать значение по умолчанию «Ошибка»
.
Это сокращение для записи:
if (!title) {
title = "Error";
}
Подобный трюк с логическими выражениями также распространен в Perl. С выражением:
a OR b
он оценивается как истина
, если либо a
, либо b
равно истина
. Поэтому, если a
истинно, вам вообще не нужно проверять b
. Это называется логической оценкой короткого замыкания, поэтому:
var title = title || "Error";
в основном проверяет, оценивается ли title
как false
. Если это так, он «возвращает» «Ошибка»
, в противном случае он возвращает заголовок
.
Объясняя это немного подробнее...
Оператор ||
- это логический оператор-or
. Результат истинен, если истинна первая часть, истинен, если истинна вторая часть, и истинен, если истинны обе части. Для наглядности приведем таблицу:
X | Y | X || Y
---+---+--------
F | F | F
---+---+--------
F | T | T
---+---+--------
T | F | T
---+---+--------
T | T | T
---+---+--------
Теперь обратите внимание. Если X
истинно, то результат всегда истинен. Так что если мы знаем, что X
истинно, нам совсем не обязательно проверять Y
. Таким образом, во многих языках реализованы "замыкающие" оценщики для логических-или
(и логических-и
, идущих с другой стороны). Они проверяют первый элемент и, если он верен, не утруждают себя проверкой второго. Результат (в логических терминах) один и тот же, но с точки зрения выполнения потенциально существует огромная разница, если второй элемент дорого вычислять.
Так какое отношение это имеет к вашему примеру?
var title = title || 'Error';
Давайте посмотрим. Элемент title
передается в вашу функцию. В JavaScript, если вы не передаете параметр, по умолчанию он принимает значение null. Также в JavaScript, если ваша переменная имеет нулевое значение, то логические операторы считают его ложным. Таким образом, если эта функция вызывается с заданным заголовком, то это значение не является ложным и поэтому присваивается локальной переменной. Если же ей не присваивается значение, то это нулевое значение и, следовательно, ложное. Оператор logical-or
затем оценивает второе выражение и возвращает вместо него 'Error'. Таким образом, теперь локальной переменной присваивается значение 'Error'.
Это работает из-за реализации логических выражений в JavaScript. Оно не возвращает правильное булево значение (true
или false
), а вместо этого возвращает значение, которое ему было присвоено, в соответствии с некоторыми правилами относительно того, что считается эквивалентным true
и что считается эквивалентным false
. Загляните в свой справочник по JavaScript, чтобы узнать, что JavaScript считает истинным или ложным в булевых контекстах.
Двойная труба означает логическое "ИЛИ". Это не совсем тот случай, когда "параметр не задан", поскольку строго в javascript, если у вас есть код вроде этого:
function foo(par) {
}
Тогда вызовы
foo()
foo("")
foo(null)
foo(undefined)
foo(0)
не эквивалентны.
Двойная труба (||) приведет первый аргумент к булеву значению, и если полученное булево истинно - выполнит присваивание, иначе присвоит правильную часть.
Это имеет значение, если вы проверяете наличие неустановленного параметра.
Допустим, у нас есть функция setSalary, которая имеет один необязательный параметр. Если пользователь не вводит параметр, то должно использоваться значение по умолчанию 10.
Если выполнить проверку следующим образом:
function setSalary(dollars) {
salary = dollars || 10
}
Это даст неожиданный результат при вызове, например
setSalary(0)
Все равно будет установлено значение 10, как описано выше.
В основном, он проверяет, является ли значение перед || оценкой true, если да, то принимает это значение, если нет, то принимает значение после ||.
Значения, для которых он примет значение после || (насколько я помню):
Если заголовок не задан, используйте значение по умолчанию «ОШИБКА».
Более общий:
var foobar = foo || default;
Читает: Установите foobar на foo
или по умолчанию
.
Вы можете даже связать это много раз:
var foobar = foo || bar || something || 42;
оператор двойной трубы
полезен ли этот пример?
var section = document.getElementById('special');
if(!section){
section = document.getElementById('main');
}
также может быть
var section = document.getElementById('special') || document.getElementById('main');