解释
我有一个传递参数 options
的函数.此参数可以是对象、数组 或字符串强>。根据参数是什么,将决定要做什么。
更新:我忘了说,options
必须始终作为具有相同结构的对象结束(换句话说,它必须始终设置默认值)。
我只想定义一次默认值,因此使用你们中一些人建议的过程性 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 )
这个额外的例子并不完全是我希望实现的,但它是正确的
最佳答案
您可以使用各种 jQuery 辅助函数来确定选项
的类型:
$.isPlainObject(options)
$.isArray(options)
和
typeof options === "string"
例如
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);
}
关于javascript - 根据参数类型扩展函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13493263/