나는 자바 스크립트에서 가변 인수를 사용하지 않습니다. 코드를 구조화하는 더 좋은 방법이 많이 있습니다. 예를 들어 다음과 같이 코드를 다시 작성합니다.
[1,2,3,4,5].forEach(log); // instead of manyArgs(1,2,3,4,5);
function log(a) {
console.log(a);
}
명확하고 간결합니다.
또 다른 예를 들어, 당신은 자바 스크립트의 번호 목록의 합계를 찾으려는 경우 :
[1,2,3,4,5].reduce(add, 0); // instead of add(1,2,3,4,5);
function add(a, b) {
return a + b;
}
내가 사용의 혜택을 볼 수 없습니다 코드를 구성 할 수 있도록 많은 유용한 추상화가있다 variadic 논증.
나는 그러나 기본 값에 대한 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 년 동안 가변 인수를 사용할 필요가 없었습니다.
편집 : 내가 코드를 작성에 더 많은 기능 접근법을 사용하여 옹호한다. 우리는 코드를보다 간결하게 태닝을 사용할 수 있습니다
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
에 대한 유사
및 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])
을
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);
};
}
는 다음과 같이 우리가 합의 예를 다시 작성할 수 있습니다 curry
을 사용하여 Array.prototype.push
, 새 배열을 만드는 대신 입력 배열을 변경하기 때문에 array.concat([element])
inste를 사용하는 것이 더 좋습니다. 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
의 합을 찾으려한다고 가정 해보십시오. add(a, b, c)
과 비교하여 sum([a,b,c])
만 있으면됩니다. 대괄호 ([]
)를 추가해야합니다. 그러나 이렇게하면 코드를 더 이해하기 쉬워집니다. zen of python에 따르면 “ 명시 적 암시 적보다 낫다 ”.
따라서 내 프로그램에서 가변 인수를 절대로 사용하지 않는 이유 중 일부입니다.
'arguments' 객체의 [성능 영향] (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers)에 유의하십시오. – Pointy
개인적으로 Google 스타일 가이드/클로저 컴파일러에서 권장하는대로'var_args'를 사용합니다. 이것이 사실상 처음으로 주석 처리되지 않은 함수를 보는 사람에게 유용한 힌트를 제공한다면 누가 알겠습니까. –
@Pointy 링크에 감사드립니다. 재미있는 것들. –