В 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
9 ответов

Первый ответ Google, который я обнаружил:

http://www.tipstrs.com/tip/354/Using-optional-parameters-in-Javascript-functions (ссылка не работает)

Я не видел случаев, когда знак вопроса используется для предупреждения вызывающего абонента о необязательном параметре. Хотя это было сделано на других языках, я не думаю, что это необходимо в javascript.

Фактически, кажется, что вы не можете использовать знак вопроса в имени переменной. Только буквы, цифры, $и _.


В Javascript нет синтаксиса, который указывает, что параметр является необязательным (или обязательным). Все параметры являются необязательными. Если они не указаны, они undefined, поэтому вам нужно это проверить. Например, эта функция фактически создаст значение по умолчанию 10 для параметра:

function myfunc(someParam) {
 if (someParam === undefined) {
 someParam = 10;
 }
 ...
}

Также вы можете получить доступ к параметрам программно, используя свойство arguments.

Наконец, если у вас более 3-4 параметров, обычно рекомендуется использовать анонимный объект.


Собственно, все параметры являются необязательными в 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...
 }


Во-первых, каждый, кто пишет JavaScript, делает себе одолжение и проходит через "Обучение продвинутому JavaScript" из John Resig.

function myFunc(arg1, arg2 /* varargs... */) {
 var optional = Array.prototype.slice.call( arguments, 2 );

Каждый параметр функции является "необязательным", даже те, которые вы объявляете в списке параметров объявления функции.

Просто рассмотрите документирование их.


Вы можете использовать аннотацию, например {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


cletus и Damovisa сделали хорошие предложения. Я также хотел бы добавить, что некоторые (например, я) могут предпочесть такие обозначения:

function foo(/*bar*/) {
 if (arguments.length == 1) {
 var bar = arguments[0];
 ...
 }
}

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

Изменить: Это особенно полезно для необязательных аргументов, которые предназначены для внутреннего использования.


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

Подробнее об этом можно прочитать здесь: http://www.devguru.org/technologies/ecmascript/quickref/arguments.html


Просто не определяйте функцию с любыми параметрами и обращайтесь к массиву специальных аргументов из функции, где вам нужны дополнительные параметры. Пример ниже.


Правильно ли использовать? отметьте как Ruby в объявлении функции

Нет, нет языкового метода, обозначающего необязательный аргумент arg. Я определенно считаю, что это стоит указать в комментарии:

function myFunc(var1, var2 /* optional */, var3 /* optional */) {
 if (var2===undefined) ...

(Обратите внимание на тройные равенства для точного тестирования равенства. В противном случае также будет передано значение null. Обычно вы хотите === для большинства сравнений в JS, так как ******-equals нежелательно слабо типизированы.)

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

function myFunc(var1 /* , optional var2..varN */) {
 for (var i= 1; i

licensed under cc by-sa 3.0 with attribution.