Я знаю два метода установки параметра по умолчанию, но я хотел бы знать, какой метод предпочтительнее.
function Foo(par1, par2)
{
if (par2 == null)
par2 = "my default"
}
или же
function Foo(par1, par2)
{
par2 = par2 || "my default"
}
или есть способ лучше, чем любой из них?
Обновлено:
Я также хотел бы знать, как другие обрабатывают несколько необязательных параметров, таких как: У нас есть несколько таких функций во внутренних библиотеках (я думаю, они довольно уродливые).
function Foo(par1, par2, par3)
{
if (par2 == null)
par2 = "my default"
if (par3 == null)
par3 = "my default"
// Do something
}
И назвать это:
Foo("Parameter one",null,true)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я обычно использую второй, потому что он добавляет меньше сигнала.
Никогда не слышал о втором упомянутом вами способе, это интересно. Я бы сделал:
function Foo(par1, par2)
{
par2 = par2 ? par2 : 'default value';
}
Но теперь, когда вы предложили моему вниманию свой второй метод, я думаю, что я бы использовал его только потому, что он меньше печатает.
не работает для par2 = false и значения по умолчанию = true. используйте undefined, как показано ниже
Если вы используете jquery, вы можете:
function foo(params){
var params = $.extend({}, {bar: '2'}, params);
alert(params.bar);
}
foo(); //Alerts 2
первый на самом деле неверен, так как они будут неопределенными, а не нулевыми.
par2 !== null вернет true в этом случае.
поскольку javascript, если сравнивать слабо, сравнивать null, undefined, false с тем же значением, я бы предложил явно проверять неопределенное значение.
if (par2 !== undefined)
par2 = "my default";
или же
par2 = par2 !== undefined ? par2 : "my default";
Это позволит вам передавать такие значения, как false или null.
Однако ваш второй подход удобен, но только в том случае, если вы знаете, что никогда не передадите false или null.
Спрашивающий использует ==, а не ===. Итак, первый пример на самом деле не ошибочен.
Это сработает, но это неправильно в том смысле, что он не знает, что на самом деле соответствует.
Вопросы Похожий и связанные с задавались раньше.
Лучшим и более надежным подходом будет:
1) проверьте количество переданных аргументов (представьте, что вы хотите разрешить передачу неопределенного значения или null, как в случае функции DOM insertBefore), и только после этого попробуйте установить их значения, если они опущены:
function Foo(par1, par2)
{
if (arguments.length < 2)
par2 = "my default"
else
if (arguments.length < 3)
par3 = "my default"
}
2) или, если вы хотите запретить передачу undefined, включите его в конструкцию:
function Foo(par1, par2)
{
if (arguments.length < 2 && par2 === undefined)
par2 = "my default"
else
if (arguments.length < 3 && par3 === undefined)
par3 = "my default"
}
3) или, если вы хотите запретить передачу null, включите его в конструкцию:
function Foo(par1, par2)
{
if (arguments.length < 2 && (par2 === undefined || par2 === null))
par2 = "my default"
else
if (arguments.length < 3 && (par3 === undefined || par3 === null))
par4 = "my default"
}
Кстати: я бы рекомендовал избегать использования перегрузки функций, на самом деле это вряд ли необходимо.
Хорошо, если ваша функция действительно принимает в качестве параметров null, undefined, 0, ''
Пим, вопрос был в общем, никаких подробностей о ценностях, верно?
Это не было критикой. Я просто сказал, что это то, что вам действительно не нужно, если ваша функция не хочет использовать эти значения в качестве аргументов. (Также я поддержал ваш ответ, потому что это действительно хороший ответ для таких случаев.)
Мой выбор зависит от типа параметра и требуемого значения по умолчанию.
Например, это присвоит «значение по умолчанию», если par2 равен false, 0, пустой строке, null или undefined:
par2 = par2 || 'default value';
Такое поведение может не соответствовать ожиданиям или требованиям.
Лично я считаю, что вторая форма намного чище и удобнее для чтения, конечно, больше, чем проверка аргументов Сергея - хотя это может иметь место - но я предпочитаю передавать расширяемые объекты для аргументов, чем поддерживать сигнатуры аргументов.
например
function Foo(myArgs)
{
myArgs.par1 = myArgs.par1 || "my default"
myArgs.par2 = myArgs.par2 || "my default"
}
А как насчет того, если ваш аргумент представляет собой ложное значение?
Хороший вопрос. Я бы использовал тернар, похожий на jishi, где это важно, но в основном я нахожу ложные находятся значениями по умолчанию или сомнительные значения, которые вообще можно передать. Немного не уверен, почему я получил одобрение на этом tbh, так как я действительно расширял другие правильные ответы с помощью метода object arg :)
Нет необходимости определять переменную myArgs. Уже существует внутренняя переменная аргументов: см. Раздел 10.1.8 в ecma-international.org/publications/files/ECMA-ST/Ecma-262.p df
@some - мне это хорошо известно, но создание вашего собственного класса дает вам централизованный многоразовый контроль над данными, дает вам дешевую проверку, значения по умолчанию, что-то приближающееся к безопасности типов, если вы хотите, и улучшает читаемость. Для сравнения, аргументы var действительно довольно запутанные и неуклюжие.
ох, и далее - arguments [n] вряд ли то же самое, что myArgs.foo
Хотя это не слишком сильно отличается от нескольких других методов, похоже, что это самое близкое соответствие тому, что мне нужно делать.
Единственное, о чем вы должны подумать при использовании раствора
var foo = bar || 123;
какие значения бара оцениваются как ложные. Это может вызвать у вас проблемы в будущем.
Эрик
Если вы передаете много аргументов функции, вы можете сделать что-то вроде:
function myFunc() {
arguments[0] = arguments[0] || "default value for first argument";
arguments[3] = arguments[3] || "default value for fourth argument";
alert(arguments[3]);
}
Что насчет этого:
function myFunc(arg1, arg2, arg3) {
switch (arguments.length) {
case 0 : arg1 = "default1";
case 1 : arg2 = "default2";
case 2 : arg3 = "default3";
}
}
Число предположений <0> или значение <пустая строка> и многие другие будут обработаны неправильно.