Установка значения переменной по умолчанию в функции
Я занимаюсь большим развитием интерфейса, и я вижу, что я делаю это много:
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];
}