函数中的javascript可选参数

我有一个典型的JavaScript函数与一些参数

my_function = function(content, options) { action } 

如果我这样称呼这个function:

 my_function (options) 

参数“选项”作为“内容”传递

我怎么去绕过这个,所以我可以有两个参数通过或只有一个? 谢谢

你必须决定你想要处理一个参数的参数。 你不能把它当作两者, contentoptions

我看到两种可能性:

  1. 要么改变你的参数的顺序,即function(options, content)
  2. 检查options是否被定义:

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

    但是,那么你必须正确的文件,如果你只传递一个参数到函数会发生什么,因为通过查看签名不会立即清除。

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

然后打电话给:

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

喜欢这个:

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

或者你也可以通过你得到什么types的内容来区分。 选项曾经是一个对象的内容是用来作为一个string,所以你可以说:

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

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

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

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

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代码和文档中使用的这种风格。

您可以将所有可选参数作为第一个parameter passing给对象。 第二个参数是你的callback。 现在,您可以在第一个参数对象中接受任意数量的参数,并使其成为可选参数:

 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() {} 

如果你用选项的参数来调用它,你会得到所有的参数:

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

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

我创build了一个简单的库来处理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 } 

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

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

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

在MDN网站的 ES6中有一个很好的读取默认参数。
在ES6中,您现在可以执行以下操作:

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

您也可以使用这个如下:

 var object = new MyObject( undefined, options ); 

这将为第一个参数1和第二个参数2设置默认值'firstDefaultValue'

这里是一个小提琴演示

你会得到未定义的未传递的参数值。 但在你的情况下,你必须在第一个参数中至less传递null值。

或者你必须改变方法定义

 my_function = function(options, content) { action } 

像这样打电话

 my_function ("", options); 

你也可以把一个检查,如: options = !options ? content : options options = !options ? content : options如果没有第二个参数传入,选项会将options = !options ? content : options设置为第一个参数,然后将内容设置为null(或者忽略它,但是要检查)