问题:在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
答案 0 :(得分:59)
Javascript中没有语法指定参数是可选的(或必需的)。所有参数都是可选的。如果未指定它们,则为undefined
,因此您需要检查它。例如,此函数实际上会为参数创建默认值10:
function myfunc(someParam) {
if (someParam === undefined) {
someParam = 10;
}
...
}
您还可以使用arguments
属性以编程方式访问参数。
最后,如果你有超过3-4个参数,通常建议使用匿名对象。
答案 1 :(得分:7)
实际上,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...
}
答案 2 :(得分:4)
使用doclet时,您可以在评论部分使用{Object =}或{number =}等注释:
/** * @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
答案 3 :(得分:3)
首先,每个编写JavaScript的人都会帮自己一个忙,并从Learning Advanced JavaScript开始John Resig。
function myFunc(arg1, arg2 /* varargs... */) {
var optional = Array.prototype.slice.call( arguments, 2 );
函数的每个参数都是“可选的”,即使是在函数声明的参数列表中声明的参数。
请仔细考虑documenting。
答案 4 :(得分:2)
某些来源会告诉您完全跳过参数,而是使用arguments数组。这使您可以获取提供给函数的任何输入,并且可以根据需要决定如何响应传递给函数的参数。
您可以在此处详细了解: http://www.devguru.org/technologies/ecmascript/quickref/arguments.html
答案 5 :(得分:2)
function foo(/*bar*/) {
if (arguments.length == 1) {
var bar = arguments[0];
...
}
}
这用于向代码库的开发人员记录该参数是可选的并且还记录了名称,但它也阻止了参数在调试器中显示在函数名中(该示例将显示为 foo()而不是 foo(optional_argument)。否则,使用API的开发人员可能会认为它是必需的。
编辑:这对于打算在内部使用的可选参数特别有用。
答案 6 :(得分:1)
我发现的第一个谷歌回复:
http://www.tipstrs.com/tip/354/Using-optional-parameters-in-Javascript-functions
我没有看到任何使用问号向呼叫者提醒可选参数的情况。虽然它是用其他语言完成的,但我不认为它在javascript中是必要的。
事实上,it seems that you can't use a question mark in the variable name。只有字母,数字,$和_。
答案 7 :(得分:1)
只是不要使用任何参数定义函数,并从您希望可选参数的函数中访问特殊参数数组。示例如下。
<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>
答案 8 :(得分:1)
使用是否合适?在函数声明中标记为Ruby
不,没有基于语言的方式表示可选的arg。我绝对认为值得在评论中指出:
function myFunc(var1, var2 /* optional */, var3 /* optional */) {
if (var2===undefined) ...
(注意精确相等测试的三重等于。否则传递的null
值也将匹配。对于JS中的大多数比较,您通常需要===
,因为双等于不合需要的弱 - 键入。)
当你有一个不确定数量的可选参数时,你通常会从函数语句中省略它们,并且评论是礼貌的:
function myFunc(var1 /* , optional var2..varN */) {
for (var i= 1; i<arguments.length; i++) ...
答案 9 :(得分:0)
出于历史考虑:您可以使用!= 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.
}
}
现在,所有参数都变为可选。
答案 10 :(得分:0)
function connect(hostname, port, method) {
hostname = hostname || "localhost";
port = port || 80;
method = method || "GET";
}