我有一个传递参数options
的函数。此参数可以是 对象 , 数组 或 字符串 < / strong>即可。根据参数的不同,将确定要做什么。
更新:我忘了提及,options
必须始终作为相同结构的对象(换句话说,它必须始终设置默认值)。 < / p>
我只想定义一次默认值,因此使用过程if语句,因为你提出的一些不是我的首选解决方案,但我会在必要时使用它。
我不想这样做(如果可能的话):
function foo(options){
switch(typeof options){
case 'string':
// do something etc
break;
// etc
}
}
如果参数是一个对象,则将其扩展为设置默认值,如下所示:
function foo(options){
// Extend the options to apply default values
var options = $.extend({
bar: 'none',
baz: []
},options);
}
如果参数是字符串,则将options.bar
设置为等于字符串并扩展默认值(如下所示):
function foo(options){
// Set the bar property to equal the supplied string
var options = {
bar: options
};
// Extend the options to apply default values
options = $.extend({
baz: []
},options);
}
如果参数是一个数组,那么将options.baz
设置为等于数组,并扩展默认值(如下所示):
function foo(options){
// Set the baz property to equal the supplied array
var options = {
baz: options
};
// Extend the options to apply default values
options = $.extend({
bar: 'none'
},options);
}
如此有效,我希望能够以任何格式提供参数,并且该函数将根据提供的内容构建相同的options
对象。如果没有提供这些值,那么他们会使用默认值。
对不起,这是如此不清楚,很难解释。
我(jQuery)可以演示的另一种可能方式是查看像animate()这样的函数。请注意,您可以提供:
.animate( properties [, duration] [, easing] [, complete] )
或
.animate( properties, options )
这个额外的例子并不是我希望实现的,但它是沿着正确的方向
答案 0 :(得分:3)
您可以使用各种jQuery帮助函数来确定options
的类型:
$.isPlainObject(options)
$.isArray(options)
和
typeof options === "string"
e.g。
function foo(par) {
// default values
var options = {
bar: 'none',
baz: []
};
if ($.isPlainObject(par)) {
$.extend(options, par);
} else if ($.isArray(par)) {
options.baz = par;
} else if (typeof options === "string") {
options.bar = par;
}
...
}
如果您打算更改任何这些值,请使用.slice()
表示阵列副本,使用$.extend()
上的深层复制选项,以便更改不会影响所提供的对象。
更新的答案
对于这种特殊情况,答案是:
function foo(parameter){
var options = {
package: 'none', // Do not load any packages by default
packageURL: false, // Do not retrieve the package details from a URL by default
libraries: [] // Do not load any libraries by default
};
// Determine the type of parameter supplied and
// build the options accordingly
if($.isArray(parameter)){
// Set libraries option
parameter = {
libraries: parameter
};
}else if(typeof parameter === "string"){
// Set package option
parameter = {
package: parameter
};
}
// Extend the parameter object to include the default values
$.extend(options, parameter);
}
答案 1 :(得分:1)
您可以使用typeof
来确定所提供参数的类型
(typeof "abc" == "string"; typeof {a:1,b:2} == "object"
)
使用它来确定要执行的代码段(Switch / case或if / else)