Пропуск необязательных параметров функции в 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 принимают параметры как хеш, чтобы упростить дополнительные параметры (и многие параметры называются, следовательно, самодокументированы), но там, где ожидаются позиционные параметры, вы должны пойти с этим.