function load(context) {
var defaults = {
parameter1: defaultValue1,
parameter2: defaultValue2,
...
};
var context = extend(defaults, context);
// do stuff
}
这样一来,如果你有很多参数,但不要使用't necessarily need to set them with each call to the function, you can simply specify the non-defaults. For the extend method, you can use jQuery'的扩展方法( $.extend() ),请自己制作或使用以下内容:
function extend() {
for (var i = 1; i < arguments.length; i++)
for (var key in arguments[i])
if (arguments[i].hasOwnProperty(key))
arguments[0][key] = arguments[i][key];
return arguments[0];
}
这将使上下文对象与默认值合并,并使用默认值填充对象中的任何未定义值 .
10
另一种选择是在上下文对象中传入您的参数 .
function load(context)
{
// do whatever with context.name, context.address, etc
}
这取决于你的功能_527663需要什么 . 例如,如果你只想在迭代过程中返回所有传递的参数的值,那么肯定会坚持使用 arguments 关键字 . 如果您需要定义参数和数据映射,那么对象方法就是您的选择 . 让's look at two examples and then we'完成!
参数用法
function sumOfAll (var_args) {
return arguments.reduce(function(a, b) {
return a + b;
}, 0);
}
sumOfAll(1,2,3); // returns 6
对象用法
function myObjArgs(args_obj) {
// MAKE SURE ARGUMENT IS AN OBJECT OR ELSE RETURN
if (typeof args_obj !== "object") {
return "Arguments passed must be in object form!";
}
return "Hello "+args_obj.name+" I see you're "+args_obj.age+" years old.";
}
myObjArgs({name: "Brian", age: 31}); // returns 'Hello Brian I see you're 31 years old
11 回答
如前所述,您可以使用
arguments
对象来检索可变数量的函数参数 .如果要使用相同的参数调用另一个函数,请使用
apply
. 您甚至可以通过将arguments
转换为数组来添加或删除参数 . 例如,此函数在登录到控制台之前插入一些文本:请注意,将具有命名属性的对象作为Ken建议传递会增加为每个调用分配和释放临时对象的成本 . 通过值或引用传递正常参数通常是最有效的 . 对于许多应用程序虽然性能并不重要但对某些应用程序而言可能是 .
在最近的浏览器中,您可以使用以下语法接受可变数量的参数:
正如Ramast指出的那样,最好使用rest参数语法 .
我只想添加... args参数的一些不错的属性
是的,就像这样:
我同意肯的答案是最有活力的,我更愿意更进一步 . 如果它是一个你用不同的参数多次调用的函数 - 我使用Ken的设计但是然后添加默认值:
这样一来,如果你有很多参数,但不要使用't necessarily need to set them with each call to the function, you can simply specify the non-defaults. For the extend method, you can use jQuery'的扩展方法(
$.extend()
),请自己制作或使用以下内容:这将使上下文对象与默认值合并,并使用默认值填充对象中的任何未定义值 .
另一种选择是在上下文对象中传入您的参数 .
并像这样使用它
这样做的好处是,您可以根据需要添加任意数量的命名参数,并且该函数可以根据需要使用它们(或不使用它们) .
当然,只需使用
arguments
对象 .虽然我普遍认为命名参数方法是有用且灵活的(除非你关心顺序,在这种情况下参数最容易),但我确实担心mbeasley方法的成本(使用默认值和扩展) . 这是拉动默认值所需的极高成本 . 首先,默认值在函数内定义,因此每次调用时都会重新填充它们 . 其次,您可以使用||轻松读出命名值并同时设置默认值 . 无需创建和合并另一个新对象即可获取此信息 .
这大致相同的代码量(可能略多),但应该是运行时成本的一小部分 .
虽然@roufamatic确实显示了使用arguments关键字,而@Ken显示了一个使用对象的一个很好的例子,但我觉得它并没有真正解决这个实例中发生的事情,可能会混淆未来的读者或灌输一个不好的做法,因为没有明确说明一个函数/ method旨在获取可变数量的参数/参数 .
当另一个开发人员查看您的代码时,很容易假设此函数不接受参数 . 特别是如果该开发人员不知道 arguments 关键字 . 因此,遵循风格指南并保持一致是个好主意 . 我将使用Google的所有示例 .
让我们明确说明同一个函数有变量参数:
对象参数VS var_args
有时可能需要一个对象,因为它是数据图中唯一经过批准和考虑的最佳实践方法 . 关联数组是不受欢迎的,也是不鼓励的 .
SIDENOTE: arguments关键字实际上使用数字作为键返回一个对象 . 原型继承也是对象家族 . 请参阅JS的正确数组使用答案的结尾
在这种情况下,我们也可以明确说明这一点 . 注意:此命名约定不是由Google提供的,而是显式声明param类型的示例 . 如果您希望在代码中创建更严格的类型模式,这一点很重要 .
选择哪一个?
这取决于你的功能_527663需要什么 . 例如,如果你只想在迭代过程中返回所有传递的参数的值,那么肯定会坚持使用 arguments 关键字 . 如果您需要定义参数和数据映射,那么对象方法就是您的选择 . 让's look at two examples and then we'完成!
参数用法
对象用法
访问数组而不是对象(“... args”其余参数)
如上所述, arguments 关键字实际上返回了一个对象 . 因为这是你的任何方法想要用于数组将不得不被调用 . 一个例子:
要避免这种情况,请使用rest参数:
在函数内部使用
arguments
对象可以访问传入的所有参数 .