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

Дополнительные параметры в JavaScript

Вопрос

Каков хороший способ присвоить значение по умолчанию необязательному параметру?

Фон

Я играю с дополнительными параметрами в JavaScript и идею присвоить значение по умолчанию, если параметр не указан. Мой метод, о котором идет речь, принимает два параметра, последний из которых я считаю необязательным, а если неопределенный, должен иметь значение false. Мой метод выглядит примерно так:

// selects the item, appropriately updating any siblings
// item to select [, toggle on / off]
this.selectItem = function(item, toggle)
{
    toggle = toggle && typeof toggle === 'boolean';
    if (toggle)
    {
       // ...
    }
}

Тестирование

После запуска нескольких тестов на этот jsFiddle, используя следующую директиву для присвоения значения по умолчанию:

function checkParamIsBoolean(param)
{
    param = param && typeof param === 'boolean';
}

checkParamIsBoolean('me'); // boolean
checkParamIsBoolean([]); // boolean
checkParamIsBoolean(true); // boolean
checkParamIsBoolean(false); // boolean
checkParamIsBoolean(1 == 1); // boolean
checkParamIsBoolean(1); // boolean
checkParamIsBoolean(null); // object
checkParamIsBoolean(undefined); // undefined
​

Как вы можете, результаты меняются и не желательны.

Ожидаемые

null= false
undefined= false

Фактические

null= object
undefined= undefined

Резюме

Существуют ли альтернативные подходы к присвоению значения по умолчанию необязательному параметру, если он не указан; было бы лучше использовать _toggle в качестве параметра, а затем назначить значение var toggle внутри метода?

4b9b3361

Ответ 1

Лучшее решение - использовать именованные аргументы, скрещенные с объектом. Он сохраняет ваш код в чистоте и предотвращает ошибки в случае сложных функций (со многими аргументами по умолчанию и не по умолчанию). В противном случае вам нужно помнить о порядке аргументов и присваивать значения по умолчанию на основе типов присутствующих аргументов (что вы пытаетесь сделать).

Этот метод является основным способом передачи параметров jQuery и jQuery плагинов.

function test(options) { 

  // set up default options 
  var defaults = { 
    param1:      'test', 
    param2:      100
  }; 

  // combine options with default values
  var options = $.extend({}, defaults, options); // If you're not using jQuery you need different function here

  alert(options.param1)
  alert(options.param2)

}

test({'param2': 200}) // Call the function with just the second param

Ответ 2

Вы можете использовать эту конструкцию для необязательных параметров в вашем коде:

//...
optionalParam = optionalParam || 'some default value';

В вашем конкретном элементе это будет примерно так:

this.selectItem = function(item, toggle)
{
    toggle = toggle || false;
   // ...
}

Но в вашем случае вы можете использовать toogle (необязательный параметр) непосредственно в операторе if (поскольку вы хотите только проверить его существование). Или, возможно, вы можете использовать логическое значение, подобное этому toogle = !!toogle (двойное отрицание).

Ответ 3

Очень простой способ проверить, является ли toggle undefined, и если после этого установлено значение по умолчанию:

if (toggle === undefined) toggle = "<your default value>";

Обратите внимание, что это не меняет toggle, если оно указано, но другого типа, чем ожидалось.

Ответ 4

Попробуйте наоборот:

param = typeof param === 'boolean' && param;

Это приведет к тому, что все будут логическими, см. эту скрипту

Ответ 5

Почему вы проверяете значение параметра boolean, если вы ожидаете другого результата? Обычным способом будет проверка на typeof toggle != "undefined", но в вашем случае

toggle = Boolean(toggle);

должен выполнить задачу. Вы также можете использовать ярлык !!toggle или использовать его непосредственно в условии if:

if (toggle) { // will evaluate to "false" for undefined
    ...

BTW, нет необходимости в параметре _toggle; вы можете просто переназначить toggle.

Ответ 6

Вы можете заменить

param = param && typeof param === 'boolean';

с

param = !!(param && typeof param === 'boolean');

Это преобразует результат инструкции в логическое отрицание, а затем отменит его обратно.

Ответ 7

Если вы считаете null (а также не переданы аргументы), undefined и "" (пустая строка) как "не переданный аргумент моей функции", используйте этот оператор

toggle = toggle&&toggle||default_value

Теперь, если вы передадите null, undefined или "" в свою функцию как toggle arg, эта строка заполняет ее default_value.

Ответ 8

Посмотрите jQuery ext и как они обрабатывают необязательные параметры.

Ответ 9

Это можно легко сделать с помощью ArgueJS:

this.selectItem = function()
{
  arguments = __({item: undefined, toggle: [Boolean, false})
  if (arguments.toggle)
  {
     // ...
  }
}

Вы также можете проверить тип item, изменив undefined на нужный тип.