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


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 당신에게 슬라이스 함수 객체를 반환하고 당신이 그것을 호출 할 수 arguments및 1매개 변수는


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