Что делает конструкцию x = x || y средний?

Я отлаживаю некоторый JavaScript и не могу объяснить что это || ?

function (title, msg) {
  var title = title || 'Error';
  var msg   = msg || 'Error on Request';
}

Может кто-то давать мне подсказку, почему этот парень использует var title = title || 'ERROR'? Я иногда вижу его без a var объявление также.

227
задан Michał Perłakowski 10 January 2016 в 07:31
поделиться

6 ответов

Это означает, что аргумент заголовок является необязательным. Поэтому, если вы вызываете метод без аргументов, он будет использовать значение по умолчанию «Ошибка» .

Это сокращение для записи:

if (!title) {
  title = "Error";
}

Подобный трюк с логическими выражениями также распространен в Perl. С выражением:

a OR b

он оценивается как истина , если либо a , либо b равно истина . Поэтому, если a истинно, вам вообще не нужно проверять b . Это называется логической оценкой короткого замыкания, поэтому:

var title = title || "Error";

в основном проверяет, оценивается ли title как false . Если это так, он «возвращает» «Ошибка» , в противном случае он возвращает заголовок .

198
ответ дан 23 November 2019 в 03:48
поделиться

Объясняя это немного подробнее...

Оператор || - это логический оператор-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 считает истинным или ложным в булевых контекстах.

14
ответ дан 23 November 2019 в 03:48
поделиться

Двойная труба означает логическое "ИЛИ". Это не совсем тот случай, когда "параметр не задан", поскольку строго в javascript, если у вас есть код вроде этого:

function foo(par) {
}

Тогда вызовы

foo()
foo("")
foo(null)
foo(undefined)
foo(0)

не эквивалентны.

Двойная труба (||) приведет первый аргумент к булеву значению, и если полученное булево истинно - выполнит присваивание, иначе присвоит правильную часть.

Это имеет значение, если вы проверяете наличие неустановленного параметра.

Допустим, у нас есть функция setSalary, которая имеет один необязательный параметр. Если пользователь не вводит параметр, то должно использоваться значение по умолчанию 10.

Если выполнить проверку следующим образом:

function setSalary(dollars) {
    salary = dollars || 10
}

Это даст неожиданный результат при вызове, например

setSalary(0) 

Все равно будет установлено значение 10, как описано выше.

7
ответ дан 23 November 2019 в 03:48
поделиться

В основном, он проверяет, является ли значение перед || оценкой true, если да, то принимает это значение, если нет, то принимает значение после ||.

Значения, для которых он примет значение после || (насколько я помню):

  • undefined
  • false
  • 0
  • ''' (Null или Null string)
7
ответ дан 23 November 2019 в 03:48
поделиться

Если заголовок не задан, используйте значение по умолчанию «ОШИБКА».

Более общий:

var foobar = foo || default;

Читает: Установите foobar на foo или по умолчанию . Вы можете даже связать это много раз:

var foobar = foo || bar || something || 42;
28
ответ дан 23 November 2019 в 03:48
поделиться

оператор двойной трубы

полезен ли этот пример?

var section = document.getElementById('special');
if(!section){
     section = document.getElementById('main');
}

также может быть

var section = document.getElementById('special') || document.getElementById('main');
4
ответ дан 23 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: