Что означает варианты = параметры || {} означает в Javascript?

На днях я наткнулся на фрагмент кода, который меня заинтересовал, но я не совсем уверен, что он на самом деле делает;

options = options || {};

Моя мысль до сих пор; устанавливает переменную options в значение options, если она существует, если нет, устанавливает пустой объект.

Да нет?


person ptrn    schedule 17.05.2010    source источник
comment
Да, это то, что он делает.   -  person ceejayoz    schedule 17.05.2010
comment
Предложение: Что означает options = options || {} означает в Javascript? - правильный вопрос, и он заставит больше людей взглянуть на вопрос.   -  person Armstrongest    schedule 17.05.2010
comment
Я попытался ответить «Да», но SO сказал, что мой ответ слишком короткий. :(   -  person friedo    schedule 17.05.2010
comment
связанные: Что означает «var FOO = FOO || {}» означает в Javascript? для использования в глобальном операторе var   -  person Bergi    schedule 04.08.2014
comment
Можно сделать сравнение с функцией??? var func = обратный вызов || функция () { ... };   -  person Rafael Gomes Francisco    schedule 27.12.2014


Ответы (5)


Это полезно для установки значений по умолчанию для аргументов функции, например:

function test (options) {
  options = options || {};
}

Если вы вызовете test без аргументов, options будет инициализирован пустым объектом.

Логический оператор ИЛИ || вернет второй операнд, если первый операнд ложный.

Ложные значения: 0, null, undefined, пустая строка (""), NaN и, конечно же, false.

ОБНОВЛЕНИЕ ES6: теперь у нас есть настоящие значения параметров по умолчанию на языке, начиная с ES6.

function test (options = {}) {
  //...
}

Если вы вызываете функцию без аргументов или если она вызывается явно со значением undefined, аргумент options примет значение по умолчанию. В отличие от примера с оператором ||, другие ложные значения не приведут к использованию значения по умолчанию.

person Christian C. Salvadó    schedule 17.05.2010

Это шаблон по умолчанию..

То, что у вас есть в вашем фрагменте, является наиболее распространенным способом реализации шаблона по умолчанию, он вернет значение первого операнда, которое дает значение true при преобразовании в логическое значение. .

var some_data   = undefined;
var some_obj_1  = undefined;
var some_obj_2  = {foo: 123};

var str = some_data || "default";
var obj = some_obj1 || some_obj2  || {};

/* str == "default", obj == {foo: 123} */

вышеупомянутое в основном эквивалентно выполнению следующей более подробной альтернативы

var str = undefined;
var obj = undefined;

if (some_data) str = some_data;
else           str = "default";

if      (some_obj1) obj = some_obj1;
else if (some_obj2) obj = some_obj2;
else                obj = {};

примеры значений, получаемых с помощью логического оператора ИЛИ:

1         || 3         -> 1
0         || 3         -> 3
undefined || 3         -> 3
NaN       || 3         -> 3
""        || "default" -> "default"
undefined || undefined -> undefined
false     || true      -> true
true      || false     -> true
null      || "test"    -> "test"
undefined || {}        -> {}
{}        || true      -> {}

<суп>

null || false     || {} -> {}
0    || "!!"      || 9  -> "!!"

Как видите, если совпадений не найдено, значением последнего операнда является yield.


Когда это полезно?

Есть несколько случаев, хотя наиболее популярным является установка значения аргументов функции по умолчанию, как показано ниже:

function do_something (some_value) {
  some_value = some_value || "hello world";

  console.log ("saying: " + some_value);
}

...

do_something ("how ya doin'?");
do_something ();

<суп>

saying: how ya doin'?
saying: hello world

Примечания

Это заметное одно из отличий javascript от многих других популярных языков программирования.

Оператор || не возвращает неявно логическое значение, но сохраняет типы операндов и возвращает первый, который будет оценен как истина в логическом выражении.

Многие программисты, работающие с языками, где это не так (C, C++, PHP, Python и т. д., и т. д.), поначалу находят это довольно запутанным, и, конечно, всегда бывает наоборот; люди, пришедшие из javascript (perl и т. д.), задаются вопросом, почему эта функция не реализована где-либо еще.

person Filip Roséen - refp    schedule 19.07.2012
comment
ах да, глупая опечатка - исправлю как можно скорее (редактировать: исправлено). Первоначально я написал этот ответ на вопрос, который был помечен как дубликат этого вопроса, после проверки ответов в этой теме я подумал, что мой ответ немного лучше, чем другие, и поэтому разместил его здесь. - person Filip Roséen - refp; 19.07.2012
comment
Хорошая вещь. Сравнительная таблица была аккуратной, так что все еще приветствуется :) - person ptrn; 19.07.2012

да. Образец эквивалентен этому:

if (options) {
    options = options;
} else {
    options = {};
}

Оператор ИЛИ (||) замкнется и вернет первое истинное значение.

person jimbo    schedule 17.05.2010

Да, это именно то, что он делает.

person Jakub Hampl    schedule 17.05.2010

Нашел еще один вариант этого:

options || (options = {});

Кажется, делает тот же трюк.

person Oleg    schedule 24.01.2013
comment
Булева оценка будет происходить в обеих версиях, но в этой версии присваивание переменной не должно происходить каждый раз, что экономит ЦП (при условии, что выигрыш ничтожен). Опять же, я не знаю, придется ли интерпретатору анализировать скобки, сводя на нет выигрыш? Вы можете убрать скобки? - person skibulk; 10.03.2014
comment
@skibulk, вероятно, не может отбросить круглые скобки, поскольку равенство имеет более низкий приоритет, чем логические операторы, но почему они должны анализировать? а если говорить об обычном разборе то наверное ничего - person yoel halb; 09.11.2014