4

解释

我有一个传递参数的函数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 )

这个额外的例子并不完全是我希望实现的,但它是正确的

4

2 回答 2

3

您可以使用各种 jQuery 辅助函数来确定 的类型options

$.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);
}
于 2012-11-21T12:30:47.127 回答
1

您可以使用typeof来确定所提供参数的类型。
( typeof "abc" == "string"; typeof {a:1,b:2} == "object")

使用它来确定要执行的代码段(Switch/case 或 if/else)

于 2012-11-21T12:33:48.383 回答