函数中的javascript可选参数

时间:2010-06-30 08:40:53

标签: javascript

我有一个带有一些参数的典型javascript函数

my_function = function(content, options) { action }

如果我这样调用函数:

my_function (options)

参数“options”作为“content”传递

我如何解决这个问题,所以我既可以传递两个参数,也可以只传递一个参数? 谢谢

13 个答案:

答案 0 :(得分:87)

您必须决定要将哪个参数视为单个参数。您不能将其视为contentoptions

我看到两种可能性:

  1. 更改参数的顺序,即function(options, content)
  2. 检查是否定义了options

    function(content, options) {
        if(typeof options === "undefined") {
            options = content;
            content = null;
        }
        //action
    }
    

    但是你必须正确记录,如果你只将一个参数传递给函数会发生什么,因为通过查看签名不能立即清楚。

答案 1 :(得分:25)

my_function = function(hash) { /* use hash.options and hash.content */ };

然后致电:

my_function ({ options: options });
my_function ({ options: options, content: content });

答案 2 :(得分:16)

像这样:

my_function (null, options) // for options only
my_function (content) // for content only
my_function (content, options) // for both

答案 3 :(得分:5)

使用ES6:

function test(a, b = 3) {
   console.log(a, ' ', b);
}

test(1);      // Output: 1 3
test(1, 2);   // Output: 1 2

答案 4 :(得分:4)

或者您也可以区分您所获得的内容类型。选项曾经是一个对象,内容被用作一个字符串,所以你可以说:

if ( typeof content === "object" ) {
  options = content;
  content = null;
}

或者如果您对重命名感到困惑,可以使用arguments数组,这可以更直接:

if ( arguments.length === 1 ) {
  options = arguments[0];
  content = null;
}

答案 5 :(得分:2)

有两种方法可以做到这一点。

1)

function something(options) {
    var timeToLive = options.timeToLive || 200; // default to 200 if not set
    ...
}

2)

function something(timeToDie /*, timeToLive*/) {
    var timeToLive = arguments[1] || 200; // default to 200 if not set
    ..
}

在1)中,options是一个JS对象,具有所需的属性。这更容易维护和扩展。

在2)中,函数签名是清楚的,可以阅读并理解可以提供第二个参数。我在Mozilla代码和文档中看到过这种风格。

答案 6 :(得分:1)

您可以将对象中的所有可选参数作为第一个参数传递。第二个参数是你的回调。现在,您可以在第一个参数对象中接受任意数量的参数,并将其设置为可选,如下所示:

function my_func(op, cb) {
    var options = (typeof arguments[0] !== "function")? arguments[0] : {},
        callback = (typeof arguments[0] !== "function")? arguments[1] : arguments[0];

    console.log(options);
    console.log(callback);
}

如果在不传递options参数的情况下调用它,它将默认为空对象:

my_func(function () {});
=> options: {}
=> callback: function() {}

如果你使用options参数调用它,你可以获得所有参数:

my_func({param1: 'param1', param2: 'param2'}, function () {});
=> options: {param1: "param1", param2: "param2"}
=> callback: function() {}

这显然可以调整为使用比两个更多的参数,但它更令人困惑。如果您可以只使用一个对象作为第一个参数,那么您可以使用该对象传递无限量的参数。如果你绝对需要更多可选参数(例如my_func(arg1,arg2,arg3,...,arg10,fn)),那么我建议使用像ArgueJS这样的库。我没有亲自使用它,但看起来很有希望。

答案 7 :(得分:1)

我已经使用JavaScript函数创建了一个处理可选参数的简单库,请参阅https://github.com/ovatto/argShim。该库是在考虑Node.js的情况下开发的,但是应该很容易移植到与...一起工作。浏览器。

示例:

var argShim = require('argShim');
var defaultOptions = {
  myOption: 123
};

var my_function = argShim([
    {optional:'String'},
    {optional:'Object',default:defaultOptions}
  ], function(content, options) {
    console.log("content:", content, "options:", options);
  });

my_function();
my_function('str');
my_function({myOption:42});
my_function('str', {myOption:42});

输出:

content: undefined options: { myOption: 123 }
content: str options: { myOption: 123 }
content: undefined options: { myOption: 42 }
content: str options: { myOption: 42 }

库的主要目标是模块接口,您需要能够处理导出的模块函数的不同调用。

答案 8 :(得分:1)

只是踢了一匹长死马,因为我必须在两个或多个必需参数的中间实现一个可选参数。使用arguments数组并使用 last 作为必需的非可选参数。

my_function() {
  var options = arguments[argument.length - 1];
  var content = arguments.length > 1 ? arguments[0] : null;
}

答案 9 :(得分:1)

对ES6 on the MDN website here中的默认参数有一个很好的阅读。
在ES6中,您现在可以执行以下操作:

secondDefaultValue = 'indirectSecondDefaultValue';

function MyObject( param1 = 'firstDefaultValue', param2 = secondDefaultValue ){
    this.first = param1;
    this.second = param2;
}

您也可以按如下方式使用:

var object = new MyObject( undefined, options );

这将为第一个'firstDefaultValue'设置默认值param1,为第二个options设置param2

Here a demonstration in a fiddle

答案 10 :(得分:0)

您将获取未传递的参数值为undefined。 但在你的情况下,你必须在第一个参数中传递至少null值。

或者您必须更改方法定义,如

my_function = function(options, content) { action }

答案 11 :(得分:-1)

像这样打电话

my_function ("", options);

答案 12 :(得分:-1)

您还可以检查以下操作: options = !options ? content : options 如果没有传入第二个参数,则将选项设置为第一个参数,然后您只需将内容设置为null(或忽略它,但是您要检查它)

相关问题