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

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

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

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

Ответ 1

Решение:

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.

Ответ 2

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

Самая безопасная ставка 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
}

Сноска

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

Ответ 3

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

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

Ответ 4

Что вы подразумеваете под пропуском? Вы можете перейти в null, и в этом случае вы можете полностью оставить конечные параметры (opt_timeoutInterval), но вам нужно убедиться, что ваш параметр Cache-Control становится пятым.

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

Если вам не нужен Cache-Control:

goog.net.XhrIo.send(url);

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