"인수"에서 조각을 얻는 방법


80

arguments함수에 전달 된 모든 인수를 보유하는 특수 객체 라는 것을 알고 있습니다.

그리고 그것이 배열이 아닌 한-당신은 같은 것을 사용할 수 없습니다 arguments.slice(1).

그래서 질문-첫 번째 요소를 제외한 모든 것을 슬라이스하는 방법은 arguments무엇입니까?

UPD :

배열로 변환하지 않고는 방법이없는 것 같습니다.

var args = Array.prototype.slice.call(arguments);

누군가 다른 솔루션을 게시하면 좋을 것입니다.


+ zerkms 실제로 arguments그것을 가져다가 배열로 변환하는 것보다 더 좋은 방법이 있습니다. 아래 내 대답을 참조하십시오.
Umur Karagöz

답변:


20

배열 함수와의 간섭은 실제로 필요하지 않습니다.

나머지 매개 변수 구문을 사용하면 ...rest더 깨끗하고 편리합니다.

function argumentTest(first, ...rest) {
  console.log("First arg:" + first);

  // loop through the rest of the parameters
  for (let arg of rest) {
    console.log("- " + arg);
  }
}

// call your function with any number of arguments
argumentTest("first arg", "#2", "more arguments", "this is not an argument but a contradiction");

...쉬다


네, 요즘 더 편리하다는 데 동의합니다. 찬성했지만 확인 된 5 년 된 답변을 소급하여 변경하지 않겠습니다.
zerkms 2017

2
이제 1 년이 지나면 새로운 ES 표준으로 전환 할 때라고 생각합니다. :-)
zerkms

1 년 된 답변에 대해 +15 점을받을 때 그 느낌 :-D
zerkms

133

Q. 첫 번째 요소를 제외한 모든 것을 슬라이스하는 방법은 arguments무엇입니까?

다음은 첫 번째 인수를 제외한 모든 인수를 포함하는 배열을 반환합니다.

var slicedArgs = Array.prototype.slice.call(arguments, 1);

arguments먼저 배열 로 변환 할 필요가 없습니다 . 한 번에 모두 수행하십시오.


나는 이것에 단점이 있다고 믿는다. 첫 번째 인수 외에 추가 인수가 하나만 있으면 아무 것도 반환되지 않습니다.
Trevor 2014 년

@Trevor-아니요, 두 번째 인수 인 하나의 요소가있는 배열을 반환합니다. (왜 아무것도 반환하지 않습니까?)
nnnnnn

4
여기서 권장 사항 은 JavaScript 엔진 최적화를 방지하기 때문에 인수에 슬라이스를 사용하지 말아야한다고 명시합니다.
Jonathan Lin

1
보다 상세한 설명에서 찾을 수 있습니다 여기에
데이비드 체이스

4
@David- "상세한"링크는 여전히 .slice()on 을 사용하지 말라고 말하지만 arguments주어진 유일한 이유는 함수의 JS 엔진 최적화를 방지하기 때문입니다. 따라서 실패한 것이 아니라 속도가 느려질 있습니다. 나는 내일의 엔진이 최적화 문제를 해결했을 때가 아니라 오늘의 JS 엔진에서 최적화를위한 코드를 작성하지 않을 것이며, 어떤 경우에도 그 차이는 대부분의 사용자가인지 할 수 없을 것입니다. 케이스. 명확하고 유지하기 쉬운 코드를 먼저 작성한 다음 다시 돌아와서 측정 가능한 성능 문제가 발생하는 경우에만 최적화하는 것이 좋습니다.
nnnnnn

11

인수 객체를 절차 적으로 걸어 가면서 "슬라이스없이 슬라이스"할 수 있습니다.

function fun() {
  var args = [];

  for (var i = 1; i < arguments.length; i++) {
    args.push(arguments[i]);
  }

  return args;
}

fun(1, 2, 3, 4, 5); //=> [2, 3, 4, 5]

2
그래,이 작업을 수행하지만, 우리는이 경우에 이해되지 않는다 .slice();-)
zerkms

물론 사용하기가 더 쉽지만 Array.prototype.slice다른 방법이 있는지 질문했습니다.
Paul Rosania

그래, 감사합니다 ;-) (분명히 알고 있습니다 for
:-P

하하, 진부하게 들리지 않았 으면 좋겠다. 때로는 SO에 대한 유용한 정보입니다!
Paul Rosania 2012 년

3
+1 이것은 V8에 대한 유일한 올바른 솔루션 인 것 같습니다. 여기에서 최적화 벤치마킹을 살펴보십시오. jsperf.com/leaky-args
Tom Auger

11

에서 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments :

JavaScript 엔진 (예 : V8)에서 최적화를 방지하기 때문에 인수를 분할해서는 안됩니다. 대신 arguments 객체를 반복하여 새 배열을 생성 해보십시오.

따라서 위의 Paul Rosiana의 대답은 정확합니다.


4
그럴 수도 있습니다. 그러나 최적화 엔진이 허용 된 답변의 한 줄을 처리하고 원하는 방식으로 최적화 할 수없는 방법을 알 수 없습니다. 우리가 (오늘의) 최적화 프로그램을위한 코딩을 시작한다면 장기적으로는 항상 성가신 일입니다. 개인적으로 저는 코드의 명확성을 선호합니다.
akauppi

2
'슬라이스'는 변경되지 않습니다. 원래 배열에서 요소의 얕은 복사본을 반환합니다. 원래 배열의 요소는 반환 된 배열에 복사됩니다. 그래서 나는 새로운 배열과 슬라이스로의 수동 복사의 차이점을 이해할 수 없습니다.
Maxim

2018 년부터 더 이상 경고가 없습니다. 우리는 안전해야합니다.
GBF_Gabriel

9

이것은 방법이 될 수 있습니다.

var args = Array.from(arguments).slice(1);

요즘에는 전혀 필요하지 않습니다.function foo(...args)
zerkms 2017-08-23

@zerkms 성능상의 이유로 귀하의 제안을 무시하려고했지만 내 테스트는 가장 빠른 솔루션으로 나머지 매개 변수를 보여줍니다! gist.github.com/18d590d12aef1e90d2ed262f4fab0c96
코디 앨런 테일러

@CodyAllanTaylor 구현이 개선되었습니다. 그렇게하지 않을 정말 정말 중요한 이유가 없다면, 저는 더 읽기 쉬운 구문을 고수 할 것입니다
zerkms

0

방법을 사용할 수 있습니다 [].slice.call(arguments, 1)

[] .slice 당신에게 슬라이스 함수 객체를 반환하고 당신이 그것을 호출 할 수 arguments1매개 변수는


게시하기 전에 게시 된 답변을 통해 확인한 변경 사항이 있습니까? 동일한 (그리고 조금 더 나은) 답변은 이미 게시되고 확인됩니다.
zerkms

0

함수 내에서 ... rest를 사용하여 첫 번째 인수와 나머지 인수를 구분할 수 있습니다.

function foo(arr) {
  const [first, ...rest] = arguments;
  console.log(`first = ${first}`);
  console.log(`rest = ${rest}`);
}
//Then calling the function with 3 arguments:
foo(1,2,3)


예, 미래가 여기에 있습니다. 드디어 :-D
zerkms
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.