Каков наиболее эффективный метод установки значений параметров по умолчанию в javascript?

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

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)
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
891
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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

Никогда не слышал о втором упомянутом вами способе, это интересно. Я бы сделал:

function Foo(par1, par2)
{
    par2 = par2 ? par2 : 'default value';
}

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

Число предположений <0> или значение <пустая строка> и многие другие будут обработаны неправильно.

Sergey Ilinsky 20.01.2009 17:22

не работает для par2 = false и значения по умолчанию = true. используйте undefined, как показано ниже

Simon_Weaver 13.08.2009 03:09

Если вы используете 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.

Спрашивающий использует ==, а не ===. Итак, первый пример на самом деле не ошибочен.

Crescent Fresh 20.01.2009 17:43

Это сработает, но это неправильно в том смысле, что он не знает, что на самом деле соответствует.

jishi 20.01.2009 19:51

Вопросы Похожий и связанные с задавались раньше.

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

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, ''

Pim Jager 20.01.2009 17:19

Пим, вопрос был в общем, никаких подробностей о ценностях, верно?

Sergey Ilinsky 20.01.2009 17:20

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

Pim Jager 20.01.2009 17:23

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

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

par2 = par2 || 'default value';

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

Ответ принят как подходящий

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

например

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

А как насчет того, если ваш аргумент представляет собой ложное значение?

Pablo Cabrera 21.01.2009 14:00

Хороший вопрос. Я бы использовал тернар, похожий на jishi, где это важно, но в основном я нахожу ложные находятся значениями по умолчанию или сомнительные значения, которые вообще можно передать. Немного не уверен, почему я получил одобрение на этом tbh, так как я действительно расширял другие правильные ответы с помощью метода object arg :)

annakata 21.01.2009 14:29

Нет необходимости определять переменную myArgs. Уже существует внутренняя переменная аргументов: см. Раздел 10.1.8 в ecma-international.org/publications/files/ECMA-ST/Ecma-262.p‌ df

some 21.01.2009 20:47

@some - мне это хорошо известно, но создание вашего собственного класса дает вам централизованный многоразовый контроль над данными, дает вам дешевую проверку, значения по умолчанию, что-то приближающееся к безопасности типов, если вы хотите, и улучшает читаемость. Для сравнения, аргументы var действительно довольно запутанные и неуклюжие.

annakata 21.01.2009 23:08

ох, и далее - arguments [n] вряд ли то же самое, что myArgs.foo

annakata 21.01.2009 23:12

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

chills42 22.01.2009 17:29

Единственное, о чем вы должны подумать при использовании раствора

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

Другие вопросы по теме