javascript - 根据参数类型扩展函数参数

标签 javascript jquery parameters parameter-passing sinemacula

解释

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

相关文章:

javascript - Bootstrap 4 嵌套折叠 "data-parent"不工作

javascript - 按下时应显示所有具有类的元素

jquery - 如何指定 $ ('a' ).click 事件以仅选择特定的 <a> 标签,而不是所有 <a> 标签?

scala - 是否可以在scala中获取方法的参数名称

java - 验证由另一个参数确定的构造参数

javascript - 单击时如何选择整个单词

c# - 专注于具有属性 TextMode ="MultiLine"的文本框,用于输入按键

function - 用于定义/调用多参数函数的 ANTLR 语法

c# - JavaScript : pass an array to WCF service (c#)

jquery - 元素出现在 DOM 中后运行函数