Пропуск необязательных параметров функции в JavaScript

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

например, я хочу выбросить все opt_ параметры здесь:

goog.net.XhrIo.send(url, opt_callback, opt_method, opt_content, {'Cache-Control': 'no-cache'}, opt_timeoutInterval)

3 ответов


устранение:

goog.net.XhrIo.send(url, undefined, undefined, undefined, {'Cache-Control': 'no-cache'})

вы должны использовать undefined вместо необязательного параметра вы хотите пропустить, потому что это 100% имитирует значение по умолчанию для необязательных параметров в JavaScript.

маленький пример:

myfunc(param);

//is equivalent to

myfunc(param, undefined, undefined, undefined);

сильная рекомендация: используйте JSON, если у вас много параметров, и вы можете иметь дополнительные параметры в середине списка параметров. Посмотрите, как это делается в jQuery.


короткий ответ:

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

если вы обнаружите, что склоняетесь к использованию null просто потому, что он короче, подумайте об объявлении переменной с именем _ как хорошая стенография для undefined:

(function() { // First line of every script file
    "use strict";
    var _ = undefined; // For shorthand
    // ...
    aFunction(a, _, c);
    // ...
})(); // Last line of every script

подробности

во-первых, знаю что:

  • typeof undefined оценивает в "undefined"
  • typeof null оценивает в "object"

предположим, что функция принимает аргумент, который она ожидает иметь тип "number". Если вы предоставите null в качестве значения, вы даете ему "object". Семантика отключена.1

по мере того, как разработчики продолжают писать все более надежный код javascript, возрастает вероятность того, что функции, которые вы вызываете явно проверьте значение параметра для undefined в отличие от классического if (aParam) {...}. Вы будете на шаткой земле, если продолжите использовать null взаимозаменяемо с undefined только потому, что они оба принуждают false.

имейте в виду, однако, что на самом деле функция может сказать, был ли параметр фактически опущен (по сравнению с установкой undefined):

f(undefined); // Second param omitted
function f(a, b) {
    // Both a and b will evaluate to undefined when used in an expression
    console.log(a); // undefined
    console.log(b); // undefined
    // But...
    console.log("0" in arguments); // true
    console.log("1" in arguments); // false
}

сноски

  1. пока undefined также не типа "number", это вся работа должна быть тип, не тип. Вот почему это значение принимается неинициализированными переменными и возвращаемое значение по умолчанию для функций.

просто передать null в качестве значения параметра.

Added: вы также можете пропустить все последующие необязательные параметры после последнего, который вы хотите передать реальное значение (в этом случае вы можете пропустить opt_timeoutInterval параметр на всех)