我从不在 JavaScript 中使用可变参数。有许多更好的方法来构建代码。例如,我将重写您的代码如下:
[1,2,3,4,5].forEach(log); // instead of manyArgs(1,2,3,4,5);
function log(a) {
console.log(a);
}
它清晰简洁。
另一个例子,如果你想在 JavaScript 中查找数字列表的总和:
[1,2,3,4,5].reduce(add, 0); // instead of add(1,2,3,4,5);
function add(a, b) {
return a + b;
}
有太多有用的抽象可用于构建代码,我根本看不到使用可变参数的好处。
不过我确实使用arguments
默认值对象:
function foo(a,b,c) {
switch (arguments.length) {
case 0: a = "default argument for a";
case 1: b = "default argument for b";
case 2: c = "default argument for c";
}
// do something with a, b & c
}
因此,我对您的建议是根本不要使用可变参数。为您的代码找到更好的抽象。在我使用 JavaScript 编程的 8 年里,我从未遇到过使用可变参数的需要。
Edit:我主张使用更实用的方法来编写代码。我们可以使用柯里化来使代码更加简洁:
function curry(func, length, args) {
switch (arguments.length) {
case 1: length = func.length;
case 2: args = [];
}
var slice = args.slice;
return function () {
var len = arguments.length;
var a = args.concat(slice.call(arguments));
if (len >= length) return func.apply(this, a);
return curry(func, length - len, a);
};
}
Using curry
我们可以将求和示例重写如下:
var reduce = curry(function (func, acc, a) {
var index = 0, length = a.length;
while (index < length) acc = func(acc, a[index++]);
return acc;
});
var sum = reduce(add, 0);
sum([1,2,3,4,5]); // instead of add(1,2,3,4,5);
function add(a, b) {
return a + b;
}
同样对于Math.max
and Array.prototype.concat
:
var reduce1 = curry(function (func, a) {
if (a.length === 0)
throw new Error("Reducing empty array.");
return reduce(func, a[0], a.slice(1));
});
var maximum = reduce1(max);
maximum([1,2,3,4,5]); // instead of Math.max(1,2,3,4,5);
function max(a, b) {
return a > b ? a : b;
}
var concat = reduce(function (a, b) {
return a.concat(b);
}, []);
concat([[1,2],[3,4],[5,6]]) // instead of [1,2].concat([3,4],[5,6])
As for Array.prototype.push
,因为它会改变输入数组而不是创建一个新数组,所以我更喜欢使用array.concat([element])
代替array.push(element)
:
var push = reduce(function (a, e) {
return a.concat([e]);
});
push([1,2,3], [4,5]); // instead of [1,2,3].push(4, 5)
那么这样写代码有什么好处:
- 柯里化太棒了。它允许您从旧函数创建新函数。
- 您不是使用可变参数,而是将数组传递给函数。所以你不需要任何特殊的方式来表明该函数使用
arguments
.
- 假设您必须找到名为的数组的总和
array
。使用这个方法你只需做sum(array)
。如果您使用可变参数,那么您需要这样做add.apply(null, array)
.
- 假设你想求总和
a
, b
& c
。您需要做的就是sum([a,b,c])
, 相比于add(a, b, c)
。你需要投入额外的[]
括号。然而这样做会让你的代码更容易理解。根据蟒蛇之禅 http://legacy.python.org/dev/peps/pep-0020/ “明确的比隐含的更好”.
这些是我从不在程序中使用可变参数的一些原因。