Подтвердить что ты не робот

Что означает "options = options || {}" в Javascript?

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

options = options || {};

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

Да/нет?

4b9b3361

Ответ 1

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

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

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

Логический оператор OR || вернет свой второй операнд, если первый фальшивый.

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

Ответ 2

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

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

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 = {};

примеры значений, выдаваемых логическим оператором OR:

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  -> "!!"

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


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

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

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 по сравнению со многими другими популярными языками программирования.

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

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

Ответ 3

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

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

Оператор OR (||) будет замыкаться на короткое замыкание и возвращает первое правное значение.

Ответ 4

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

Ответ 5

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

options || (options = {});

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