JS: функции аргументы значения по умолчанию - PullRequest
8 голосов
/ 23 января 2011

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

function Foo(arg1 = 50, arg2 = 'default') {
    //...
}

Как вы делаете это в JavaScript?

Ответы [ 4 ]

16 голосов
/ 23 января 2011

В JavaScript все, что не установлено, получает значение undefined. Это означает, что если вы хотите установить значения по умолчанию для функции, ваша первая строка должна быть проверкой, чтобы увидеть, не определены ли эти значения:

function Foo(arg1, arg2) {
    if (typeof(arg1) === "undefined") { arg1 = 50; }
    if (typeof(arg2) === "undefined") { arg2 = "default"; }
}

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

function Foo(arg1, arg2) {
    arg1 = arg1 || 50;
    arg2 = arg2 || "default";
}

Однако, если эти аргументы неверны, они будут заменены. Это означает, что если arg1 - пустая строка, null, undefined, false или 0, она будет изменена на 50, поэтому будьте осторожны, если вы решили использовать ее

5 голосов
/ 23 января 2011

Я предпочитаю проверку == null вместо typeof(arg1) === undefined (как внутренне делает библиотека jQuery: http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint). Мало того, что она более краткая, она также обрабатывает как null, так и undefined, так что клиентский код может пройтив null и получите применение по умолчанию.

Также возможно заключить функцию в другую функцию, которая предоставляет значения по умолчанию. Библиотека prototypejs имеет функцию, которая предоставляет argumentNames() (или, если вы этого не сделаетеЕсли вы хотите использовать прототип, вы можете просто позаимствовать реализацию - это просто регулярное выражение, примененное к результатам toString()) функции.

Таким образом, вы можете сделать что-то вроде этого:

var Foo = defaults(Foo, { arg1: 50, arg2: 'default' });
function Foo(arg1, arg2) {
  //...
}

И реализация defaults() будет выглядеть примерно так:

function defaults(fn, def) {
  return function() {
    var arg_names = fn.argumentNames();
    var nArgs = args.length;
    for (var nArg = 0; nArg < nArgs; ++nArg) {
      if (arguments[nArg] == null && arg_names[nArg] in def)
        arguments[nArg] = def[arg_names[nArg]];
    }
    fn.apply(this, arguments);
  }
}

Конечно, это непроверенный код и способ его написания, для него требуется библиотека Prototype. Но все, что сказано, == null подход внутри функции более естественен для Javascript, его легче отлаживать (у вас нет другого функционального слоя для перехода по нему), и мне легче читать:

function Foo(arg1, arg2) {
  if (arg1 == null) arg1 = 50;
  if (arg2 == null) arg2 = 'default';
}
1 голос
/ 17 февраля 2017

Начиная с ES2015 (ES6), параметры по умолчанию могут быть установлены следующим образом:

function multiply (a, b = 2) {
  return a * b;
}
multiply(5); // 10
1 голос
/ 23 января 2011

Вы должны сделать это в теле функции:

function Foo(arg1 ,arg2) {
    if( typeof arg1 === 'undefined' )
        arg1 = 50;

    if( typeof arg2 === 'undefined' )
        arg2 = 'default';
    //...
}

Другой способ проверить их на undefined или null выглядит так:

function Foo(arg1 ,arg2) {
    if( arg1 == undefined )
        arg1 = 50;

    if( arg2 == undefined )
        arg2 = 'default';
    //...
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...