함수의 모든 인수를 해당 함수 내에서 단일 객체로 가져올 수 있습니까?


답변:


346

사용하십시오 arguments. 배열처럼 액세스 할 수 있습니다. arguments.length인수 수에 사용하십시오 .


46
이것은 functionES2015 + 지방 화살표 =>함수가 아닌 기존 JavaScript에서만 작동 합니다. 이를 위해 ...args함수 정의에 다음과 같이 사용 하고 싶습니다 (...args) => console.log(args).
Sawtaytoes

141

인자배열과 같은 객체 (아닌 실제 배열). 기능 예 ...

function testArguments () // <-- notice no arguments specified
{
    console.log(arguments); // outputs the arguments to the console
    var htmlOutput = "";
    for (var i=0; i < arguments.length; i++) {
        htmlOutput += '<li>' + arguments[i] + '</li>';
    }
    document.write('<ul>' + htmlOutput + '</ul>');
}

사용해보십시오 ...

testArguments("This", "is", "a", "test");  // outputs ["This","is","a","test"]
testArguments(1,2,3,4,5,6,7,8,9);          // outputs [1,2,3,4,5,6,7,8,9]

전체 세부 사항 : https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments


3
결과도 여기에 게시하지 않겠습니까? :)
Jonathan Azulay

2
이것은 작동하는 코드 스 니펫을 포함하고 출력을 보여주기 때문에 허용되는 답변보다 훨씬 낫습니다. 허용 된 답변이 너무 적습니다.
Mac

좋은 대답은 ... "실제 배열이 아님"을 확장하면 큰 대답이 될 것입니다.
terpinmd

간단한 설명에 대한 링크를 추가했습니다. "배열 형 객체"는 "음이 아닌 정수의 길이 속성과 일반적으로 색인 속성이있는 객체"입니다. mozilla 링크에서 : "어레이와 비슷하지만 길이를 제외한 배열 속성은 없습니다."
Luke

31

ES6은 함수 인자가 다음과 같은 "..."표기법으로 지정된 구문을 허용합니다.

function testArgs (...args) {
 // Where you can test picking the first element
 console.log(args[0]); 
}

3
이것은 화살표 기능을 사용할 때 유일한 방법 인 것 같습니다. a = () => {console.log(arguments);}; a('foo');제공 -- Uncaught ReferenceError: arguments is not defined 하지만 a = (...args) => {console.log(args);}; a('foo');부여합니다["foo"]
데이비드 Baucum

1
@DavidBaucum 맞습니다. 화살표 기능은 새 범위를 작성하지 않으며 범위에서 "인수"가 수집됩니다. 그러나 최악의 시나리오는 ReferenceError가 아닙니다. "인수"는 외부 범위에서 수집됩니다. 그런 다음 예외는 없으며 응용 프로그램에서 이상한 버그가 발생할 수 있습니다.
pgsandstrom

1
이것을 "휴면 매개 변수"라고도합니다 ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 참조) .
Dennis

21

arguments함수의 인수가 저장되는 개체입니다.

arguments 객체는 배열처럼 작동하고 배열됩니다. 기본적으로 배열에는 수행하는 메서드가 없습니다. 예를 들면 다음과 같습니다.

Array.forEach(callback[, thisArg]);

Array.map(callback[, thisArg])

Array.filter(callback[, thisArg]);

Array.slice(begin[, end])

Array.indexOf(searchElement[, fromIndex])

arguments객체를 실제 배열 로 변환하는 가장 좋은 방법 은 다음과 같습니다.

argumentsArray = [].slice.apply(arguments);

그러면 배열이됩니다.

재사용 가능 :

function ArgumentsToArray(args) {
    return [].slice.apply(args);
}

(function() {
   args = ArgumentsToArray(arguments);

   args.forEach(function(value) {
      console.log('value ===', value);
   });

})('name', 1, {}, 'two', 3)

결과:

> value === name
> value === 1
> value === Object {}
> value === two
>value === 3


1
[].slice.apply(arguments);빈 배열 할당이 불필요하기 때문에 가장 좋은 방법은 아닙니다.
토마스 에딩

10

원하는 경우 배열로 변환 할 수도 있습니다. 배열 제네릭을 사용할 수있는 경우 :

var args = Array.slice(arguments)

그렇지 않으면:

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

에서 모질라 MDN :

JavaScript 엔진 (예 : V8)에서 최적화를 방해하므로 인수를 분리해서는 안됩니다.


2
업데이트 해 주셔서 감사합니다. 대안으로 JSON.stringify 및 JSON.parse를 사용하십시오. 문자열 function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); } 화 대신 보존이 필요한 경우 내부 구조화 된 복제 알고리즘을 사용하십시오 . DOM 노드가 전달되면 관련이없는 질문 에서처럼 XMLSerializer를 사용하십시오 . with (new XMLSerializer()) {serializeToString(document.documentElement) }
Paul Sweatte

7

다른 많은 사람들이 지적했듯이 arguments함수에 전달 된 모든 인수를 포함합니다.

동일한 인수로 다른 함수를 호출하려면 apply

예:

var is_debug = true;
var debug = function() {
  if (is_debug) {
    console.log.apply(console, arguments);
  }
}

debug("message", "another argument")

4

더 완벽한 예를 들어 Gunnar와 비슷한 대답 : 모든 것을 투명하게 반환 할 수도 있습니다.

function dumpArguments(...args) {
  for (var i = 0; i < args.length; i++)
    console.log(args[i]);
  return args;
}

dumpArguments("foo", "bar", true, 42, ["yes", "no"], { 'banana': true });

산출:

foo
bar
true
42
["yes","no"]
{"banana":true}

https://codepen.io/fnocke/pen/mmoxOr?editors=0010


3

그렇습니다. 함수 선언시 얼마나 많은 인수가 가능한지 모른다면 매개 변수없이 함수를 선언하고 함수 호출시 전달되는 인수 배열로 모든 변수에 액세스 할 수 있습니다.


2

ES6에서는 다음과 같이 할 수 있습니다.

function foo(...args) 
{
   let [a,b,...c] = args;

   console.log(a,b,c);
}


foo(1, null,"x",true, undefined);


1
```function foo (a, b, ... c) {console.log (a, b, c); }```
TitouanT

-11

ES6에서는 다음을 사용하십시오 Array.from.

function foo()
  {
  foo.bar = Array.from(arguments);
  foo.baz = foo.bar.join();
  }

foo(1,2,3,4,5,6,7);
foo.bar // Array [1, 2, 3, 4, 5, 6, 7]
foo.baz // "1,2,3,4,5,6,7"

ES6 코드가 아닌 경우 JSON.stringify 및 JSON.parse를 사용하십시오.

function foo()
  {
  foo.bar = JSON.stringify(arguments); 
  foo.baz = JSON.parse(foo.bar); 
  }

/* Atomic Data */
foo(1,2,3,4,5,6,7);
foo.bar // "{"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"6":7}"
foo.baz // [object Object]

/* Structured Data */
foo({1:2},[3,4],/5,6/,Date())
foo.bar //"{"0":{"1":2},"1":[3,4],"2":{},"3":"Tue Dec 17 2013 16:25:44 GMT-0800 (Pacific Standard Time)"}"
foo.baz // [object Object]

스트링 화 대신 보존이 필요한 경우 내부 구조화 된 복제 알고리즘을 사용하십시오 .

DOM 노드가 전달되면 관련이없는 질문 에서처럼 XMLSerializer를 사용하십시오 .

with (new XMLSerializer()) {serializeToString(document.documentElement) }

북마크릿으로 실행중인 경우 JSON.stringify제대로 작동하려면 오류 생성자에서 각 구조화 된 데이터 인수를 래핑해야 할 수 있습니다 .

참고 문헌


3
첫 번째 : 전달 된 객체를 복제합니다. 두 번째 : 모든 것이 JSON으로 문자열 화 될 수는 없습니다. 즉 : 기능, DOM 객체는, 날짜 문자열로 캐릭터 라인 화했다 ...
존 드보락

@JanDvorak DOM 객체, 함수 및 날짜를 ​​처리하는 함수로 답변을 편집 할 수 있습니까?
Paul Sweatte

1
+1, 오류보고에 대한 인수를 문자열로 전달하려고하면 오브젝트가 문자열 '[object Arguments]'로 끝나고 콘솔에 로깅하면 값이 표시되지 않습니다. OP에 대답하지 않는 것처럼 보이지만 내 질문에 대답합니다. 감사합니다!
John
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.