Каков наиболее эффективный способ установки значений параметров по умолчанию в JavaScript? - PullRequest
3 голосов
/ 20 января 2009

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

function Foo(par1, par2)
{
    if(par2 == null)
        par2 = "my default"
}

или

function Foo(par1, par2)
{
    par2 = par2 || "my default"
}

или есть лучший способ, чем любой из них?

EDIT:

Я также хотел бы знать, как другие обрабатывают несколько необязательных параметров, таких как этот: У нас есть несколько таких функций во внутренних библиотеках (я думаю, они довольно уродливые).

function Foo(par1, par2, par3)
{
    if(par2 == null)
        par2 = "my default"
    if(par3 == null)
        par3 = "my default"
    // Do something
}

И назвать это:

Foo("Parameter one",null,true)

Ответы [ 11 ]

5 голосов
/ 20 января 2009

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

par2 !== null вернет true для этого случая.

, поскольку в случае JavaScript, если сравнивать свободно, сравнивать null, undefined, false с тем же значением, я бы предложил явно проверить неопределенное значение.

if (par2 !== undefined)
        par2 = "my default";

или

    par2 = par2 !== undefined ? par2 : "my default";

Это позволит вам передавать значения, такие как false или null.

Однако ваш второй подход удобен, но только в том случае, если вы знаете, что никогда не передадите false или null.

4 голосов
/ 20 января 2009

Лучшим и более надежным подходом будет:

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) или, если вы хотите запретить передачу нулевого значения, включите его в конструкцию:

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

Кстати: я бы рекомендовал избегать использования перегрузки функций, в действительности это вряд ли необходимо.

3 голосов
/ 20 января 2009

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

2 голосов
/ 21 января 2009

А как насчет этого:

function myFunc(arg1, arg2, arg3) {
    switch (arguments.length) {
        case 0 : arg1 = "default1";
        case 1 : arg2 = "default2";
        case 2 : arg3 = "default3";
    }
}
2 голосов
/ 20 января 2009

Лично я думаю, что вторая форма просто чище и более читабельна, конечно, больше, чем проверка аргументов Сергея - хотя это может иметь место - но я предпочитаю передавать расширяемые объекты для аргументов, чем поддерживать сигнатуры аргументов.

, например

function Foo(myArgs)
{
    myArgs.par1 = myArgs.par1 || "my default"
    myArgs.par2 = myArgs.par2 || "my default"
}
1 голос
/ 20 января 2009

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

Например, это присвоит «значение по умолчанию», если для par2 задано значение false, 0, пустая строка, ноль или неопределенное значение:

par2 = par2 || 'default value';

Такое поведение может не соответствовать ожидаемому или необходимому.

1 голос
/ 20 января 2009

Подобные и связанные вопросы были заданы ранее.

0 голосов
/ 20 января 2009

Если вы передаете много аргументов в функцию, вы можете сделать что-то вроде:

function myFunc() {
    arguments[0] = arguments[0] || "default value for first argument";
    arguments[3] = arguments[3] || "default value for fourth argument";
    alert(arguments[3]);
}
0 голосов
/ 20 января 2009

Одна вещь, о которой вы должны подумать, когда используете решение

var foo = bar || 123;

- это значения бара, которые оцениваются как ложные. Это может вызвать проблемы в будущем.

Эрик

0 голосов
/ 20 января 2009

Если вы используете jquery, вы можете сделать:

function foo(params){
 var params = $.extend({}, {bar: '2'}, params);
 alert(params.bar);
}
foo(); //Alerts 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...