虽然@roufamatic 确实展示了 arguments 关键字的使用,而@Ken 展示了一个很好的使用对象示例,但我觉得既没有真正解决这种情况下发生的事情,也可能会混淆未来的读者,或者灌输一种不好的做法,因为没有明确说明声明一个函数/方法旨在采用可变数量的参数/参数。
function varyArg () {
return arguments[0] + arguments[1];
}
当其他开发人员查看您的代码时,很容易假设此函数不带参数。特别是如果该开发人员不知道 arguments 关键字。因此,遵循风格指南并保持一致是一个好主意。我将使用 Google 的所有示例。
让我们明确声明同一个函数具有可变参数:
function varyArg (var_args) {
return arguments[0] + arguments[1];
}
对象参数VS var_args
有时可能需要一个对象,因为它是唯一被批准和考虑的数据映射最佳实践方法。关联数组不受欢迎,不鼓励使用。
旁注: arguments 关键字实际上返回一个使用数字作为键的对象。原型继承也是对象族。在 JS 中正确使用数组,请参阅答案结尾
在这种情况下,我们也可以明确说明这一点。注意:此命名约定不是由 Google 提供的,而是显式声明参数类型的示例。如果您希望在代码中创建更严格的类型化模式,这一点很重要。
function varyArg (args_obj) {
return args_obj.name+" "+args_obj.weight;
}
varyArg({name: "Brian", weight: 150});
选择哪一个?
这取决于您的功能和程序的需要。例如,如果您只是希望基于所有传递的参数的迭代过程返回一个值,那么肯定会坚持使用 arguments 关键字。如果您需要定义参数和数据映射,那么对象方法就是要走的路。让我们看两个例子,然后我们就完成了!
参数用法
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
访问数组而不是对象(“...args”其余参数)
如答案顶部所述,arguments 关键字实际上返回一个对象。因此,必须调用任何您想用于数组的方法。一个例子:
Array.prototype.map.call(arguments, function (val, idx, arr) {});
为避免这种情况,请使用 rest 参数:
function varyArgArr (...var_args) {
return var_args.sort();
}
varyArgArr(5,1,3); // returns 1, 3, 5