Установка значения переменной по умолчанию в функции

Я занимаюсь большим развитием интерфейса, и я вижу, что я делаю это много:

function doSomething(arg){
    var int = arg ? arg : 400
    //some code after
}

Итак, мне было интересно, был ли это способ сделать это, но более короткий и более чистый (я не люблю видеть arg дважды в одной строке).

Я видел, как некоторые люди делали что-то вроде этого:

var int = arg || 400;

И поскольку я не знаю, в каком порядке мне нужно было установить значение, я попробовал arg || 400 и 400 || arg, но он всегда будет устанавливать значение int в значение справа, даже если arg undefined.

Я знаю, что в PHP вы можете сделать что-то вроде function doSomething(arg = 400), чтобы установить значение по умолчанию, а в плагине jQuery вы можете использовать .extend() для свойства по умолчанию, но есть ли короткий путь с одной переменной? Или я должен продолжать использовать свой путь?

Спасибо за любую помощь, и если вы можете дать мне ressources, это будет оценено.

Ответ 1

На самом деле нет более короткого чистого пути, чем

var int = arg || 400;

На самом деле правильный путь будет длиннее, если вы хотите разрешить arg передавать как 0, false или "":

var int = arg===undefined ? 400 : arg;

Небольшое и частое улучшение заключается в том, чтобы не объявлять новую переменную, а использовать исходную:

if (arg===undefined) arg=400;

Ответ 2

function func(x,y){
   if(typeof(x)==='undefined') x = 10;
   if(typeof(y)==='undefined') y = 20;

   //code goes here
}

Ответ 3

Проблема с вашими решениями заключается в том, что значение, которое оценивается как false (например, "false" или "0" ), также вызывает значение по умолчанию. Поэтому для каждого параметра, который может когда-либо иметь значение, которое оценивается как false, вы должны явно проверить "undefined".

var int = (typeof x === 'undefined') ? default : x

Если это невозможно, вы можете использовать

var int = x ? x : default
OR
var int = x || default

Другой вариант - использовать массив аргументов и проверить, были ли заданы параметры. Но это можно использовать, только если ваши дополнительные параметры являются последними.

function test(x, y) {
    var int1 = (arguments.length > 0) ? x : default;
    var int2 = (arguments.length > 1) ? y : default;
}

Ответ 4

Не связано непосредственно с вопросом, но зачем создавать новую переменную, чтобы отразить аргумент?

В этой ситуации я бы использовал:

!arg && (arg = 400);

Однако, это тесты arg для фальшивости, что означает, что значения false, 0, '', null и undefined будут приводить к arg для установки на 400. Если это не желаемый результат, возможно, значение 0 является допустимым значением arg, тогда я обычно тестирую argument.length:

function f (arg) {
  !arguments.length && (arg = 400);

Это проверяет, было ли передано любое значение и устанавливает arg только в том случае, если в вызове не указано никаких аргументов.

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

 arg || 400

который снова страдает от теста на фальсификацию

Если важно, чтобы arg был числовым, вы могли бы использовать:

 typeof arg !== 'number' && (arg = 400);

который обеспечил бы, что arg было числом и в остальной части кода.

В заключение: это зависит от того, как вы хотите использовать аргумент, какие значения действительны и насколько вы доверяете вызывающим вашим кодом.

Ответ 5

Я бы проверил arguments.length:

var f = function(arg) {
  var myArg = arguments.length > 0 ? arg : 400;
};

Ответ 6

В ES6 вы можете установить значение по умолчанию для аргументов так же, как и в PHP:

function foo( a = [], b = 'string', c = false ){}

Значение по умолчанию также может быть установлено на предыдущий аргумент или даже возвращаемое значение функции

function foo( a = true, b = a, c = bar() ){}

Это также будет работать с компиляторами ES6. Конечный результат будет выглядеть следующим образом:

function foo() {
  var a = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
  var b = arguments.length <= 1 || arguments[1] === undefined ? a : arguments[1];
  var c = arguments.length <= 2 || arguments[2] === undefined ? bar() : arguments[2];
}