В JavaScript, как я могу создать функцию с необязательным параметром?
Вопрос: Каким образом можно определить функцию в JavaScript, которая принимает необязательные параметры?
Например:
function myFunc(optionVar1) {
if(optionVar1 == undefined) {
...
} else {
...
}
}
myFunc('10'); // valid function call
myFunc(); // also a valid function call
Правильно ли использовать знак ?
, как Ruby, в объявлении функции, чтобы обозначить необязательные параметры:
function myFunc(optionVar1?) {...} // <--- notice the ? mark
Ответы
Ответ 1
Первый ответ Google, который я обнаружил:
http://www.tipstrs.com/tip/354/Using-optional-parameters-in-Javascript-functions
Я не видел случаев, когда знак вопроса используется для предупреждения вызывающего абонента о необязательном параметре. Хотя это делается на других языках, я не считаю это необходимым в javascript.
На самом деле, кажется, что вы не можете использовать вопросительный знак в имени переменной. Только буквы, цифры, $ и _.
Ответ 2
В Javascript нет синтаксиса, который указывает, что параметр является необязательным (или обязательным). Все параметры являются необязательными. Если они не указаны, они undefined
, поэтому вам нужно это проверить. Например, эта функция фактически создаст значение по умолчанию 10 для параметра:
function myfunc(someParam) {
if (someParam === undefined) {
someParam = 10;
}
...
}
Также вы можете получить доступ к параметрам программно, используя свойство arguments
.
Наконец, если у вас более 3-4 параметров, обычно рекомендуется использовать анонимный объект.
Ответ 3
Собственно, все параметры являются необязательными в JS-функциях. Если вы не указали параметр, нет предупреждения или ошибки.
Вы можете установить значения по умолчанию, например
function throw_cat(dist){
dist = typeof dist=='undefined' ? 20 : dist;
//OR
dist = dist || 20; //this will assign it to 20 if you pass 0 or another 'falsy' value, though. May be good if you expect a string. String '0' stays, '' or null assigns the default
//etc...
}
Ответ 4
Вы можете использовать аннотацию, например {Object =} или {number =} в разделе комментариев при использовании doclet:
/**
* @param {object=}xyz
*/
Современная среда IDE знает, как распознать аннотации для JavaScript и показывает вам показания о потенциальных проблемах в вашем коде.
Пример:
/**
*
* @param query
* @param callback
* @param {number=} ttl optional time-to-leave
*/
loadByJSONP:function loadByJSONP(query, callback, ttl) {
...do some work
}
В этом примере 'ttl' не является обязательным. аннотация {number =} указывает IDE, что этот параметр является необязательным. Соответственно, когда вы вызываете эту функцию только с двумя параметрами, вы не получите предупреждения.
Аннотации могут также использоваться для обозначения ожидаемого типа. это делает ваш код лучше и менее подвержен ошибкам. Вот ссылка на аннотации:
https://developers.google.com/closure/compiler/docs/js-for-compiler
Ответ 5
Во-первых, каждый, кто пишет JavaScript, делает себе одолжение и проходит через "Обучение продвинутому JavaScript" из John Resig.
function myFunc(arg1, arg2 /* varargs... */) {
var optional = Array.prototype.slice.call( arguments, 2 );
Каждый параметр функции является "необязательным", даже те, которые вы объявляете в списке параметров объявления функции.
Просто рассмотрите документирование их.
Ответ 6
Некоторые источники расскажут вам пропустить параметры в целом и вместо этого использовать массив аргументов. Это позволяет вам принимать любые данные, предоставленные вашей функции, и вы можете решить, как реагировать на аргументы, переданные вашей функции по своему усмотрению.
Подробнее об этом можно прочитать здесь:
http://www.devguru.org/technologies/ecmascript/quickref/arguments.html
Ответ 7
cletus и Damovisa сделали хорошие предложения. Я также хотел бы добавить, что некоторые (например, я) могут предпочесть такие обозначения:
function foo(/*bar*/) {
if (arguments.length == 1) {
var bar = arguments[0];
...
}
}
Это служит для документирования разработчиками вашей базы кода, что аргумент является необязательным, а также документирует имя, но также предотвращает появление аргумента в имени функции в отладчике (пример будет отображаться как foo(), а не foo (optional_argument). В противном случае разработчики, которые потребляют API, могут предположить, что это было необходимо.
Изменить: Это особенно полезно для необязательных аргументов, которые предназначены для внутреннего использования.
Ответ 8
Просто не определяйте функцию с любыми параметрами и обращайтесь к массиву специальных аргументов из функции, где вам нужны дополнительные параметры. Пример ниже.
<HTML>
<HEAD>
<SCRIPT Language="JavaScript">
function foo() {
var argv = foo.arguments;
var argc = argv.length;
for (var i = 0; i < argc; i++) {
alert("Argument " + i + " = " + argv[i]);
}
}
</SCRIPT>
</HEAD>
<BODY onload="foo('hello', 'world');">
</BODY>
</HTML>
Ответ 9
Правильно ли использовать? отметьте как Ruby в объявлении функции
Нет, нет языкового метода, обозначающего необязательный аргумент arg. Я определенно считаю, что это стоит указать в комментарии:
function myFunc(var1, var2 /* optional */, var3 /* optional */) {
if (var2===undefined) ...
(Обратите внимание на тройные равенства для точного тестирования равенства. В противном случае также будет передано значение null
. Обычно вы хотите ===
для большинства сравнений в JS, так как double-equals нежелательно слабо типизированы.)
Если у вас есть неопределенное количество необязательных аргументов, вы обычно опускаете их из оператора функции, и снова комментарий вежлив:
function myFunc(var1 /* , optional var2..varN */) {
for (var i= 1; i<arguments.length; i++) ...
Ответ 10
Для истории: Вы можете зациклить свои аргументы с проверкой != null
. Например:
function container(param1, param2, param3, param4){
var param1, param2, param3, param4 = 0 // or other data types.
for (var i = 0; i < arguments.length; i++){
if(i != null) {
console.log(i); // or put default values to your parameters if you need to.
}
}
Теперь все аргументы становятся необязательными.
Ответ 11
function connect(hostname, port, method) {
hostname = hostname || "localhost";
port = port || 80;
method = method || "GET";
}
Важные необязательные параметры URL в Javascript