我有一个带有几个输入的函数,我想在调用函数时是可选的。每个输入都是不同的类型,例如字符串,数组或数字。使用这样的代码:
function doStuff(str, arr, num){
if typeof(str) != 'undefined' { $('#stringDiv').text(str)}
if typeof(arr) != 'undefined' {
for(var i=0; i < arr.length; i++){
$('<li>').text(arr[i]).appendTo('#arrayUl')
}
}
if typeof(num) != 'undefined' { $('#numberDiv').text(num)}
}
jQuery(document).ready(function() {
doStuff("i'm a string", [1,2,3,4,5], 7)
})
我可以说明我的论点可能是可选的,但不是因为如果我缺少arr
,那么我的数字参数(num
)将成为第二,而不是第三
为了解决这个问题,我还可以将输入转储到数组中,然后对数组进行排序并查找每种类型的数据,就像我在this fiddle.中所做的那样。这看起来很草率,而且基于我见过在他们的函数中执行此操作的库的数量,似乎可能有更好的方法。有一个更好的方法吗?或者循环参数和寻找类型我最好的选择?
答案 0 :(得分:0)
使用对象
function doStuff(args) {
// Do something with args.num
if (typeof args.num !== "undefined") { ... }
// Same for arr and str
}
答案 1 :(得分:0)
您可以取消所有参数并使用arguments
列表查看传递的内容。
但是,更好的方法是创建一个这样的对象:
{
str: "i'm a string",
arr: [1, 2, 3, 4],
num: 3.14
}
然后检查对象是否有这些键:
function doStuff(args):
if ('str' in args) {
$('#stringDiv').text(args.str);
}
答案 2 :(得分:0)
或者循环参数和寻找类型我最好的选择?
是的,这完全没问题。无需对它们进行排序。此外,您可以使用类似于数组的arguments
object,因此您无需从固定数量的参数手动构建args
数组。
function doStuff() {
for (var i=0; i<arguments.length; i++) {
var a = arguments[i];
if (typeof a == 'string')
$('#stringDiv').text(str);
else if (Array.isArray(a)) // or check typeof a == 'object'
for(var j=0; j < a.length; j++)
$('<li>').text(a[j]).appendTo('#arrayUl');
else if (typeof a == 'number')
$('#numberDiv').text(num);
}
}