알 수없는 수의 인수를 자바 스크립트 함수에 전달


84

다음과 같은 알 수없는 수의 인수를 전달하는 방법이 있습니까?

var print_names = function(names) {
    foreach(name in names) console.log(name); // something like this
}

print_names('foo', 'bar', 'baz');

또한 전달 된 인수 수를 어떻게 얻습니까?



지금까지 공개 재정의의 대답 은 알 수없는 수의 인수를 (함수 호출에) 전달 하는 방법을 설명하는 유일한 것입니다 (사용 .apply). 다른 것들은 (함수 내에서) 알 수없는 수의 인수 를 읽는 방법을 보여줍니다 (사용 arguments).
Ben J

답변:


146

ES3 (또는 ES5 또는 구식 자바 스크립트)

arguments배열과 유사하게 작동 하는 매직 객체 를 통해 자바 스크립트 함수에 전달 된 인수에 액세스 할 수 있습니다 . arguments기능을 사용하면 다음과 같이 보일 것입니다.

var print_names = function() {
     for (var i=0; i<arguments.length; i++) console.log(arguments[i]);
}

배열 arguments아니라는 점에 유의하는 것이 중요합니다 . MDC에는 좋은 문서가 있습니다 : https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#Using_the_arguments_object

당신은 설정하려는 경우 arguments당신은 같은 것들을 할 수 있도록 배열로 .slice(), .push()등, 같은 사용 무언가를 :

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

ES6 / 타이프 스크립트

더 좋은 방법이 있습니다! 새로운 휴식 매개 변수 기능은 다음과 같은 기능을 제공합니다.

var print_names = function(...names) {
    for (let i=0; i<names.length; i++) console.log(names[i]);
}

3
이러한 상세하고 동시에 짧은 + 간단한 답변에 감사드립니다 :)
Mese

1
에 대한 ES6 참조 spread syntax는 여기에서 매우 잘못되었습니다. 그것은 rest parameter당신이 준 예입니다. 좋은 대답은하지만,이로 참조되는 혼란spread
Drenai

답변 해 주셔서 감사합니다! 나는 이것이 무슨 일이 일어나고 있는지 설명하는 유용한 기사라는 것을 발견했다 Array.prototype.slice.call(arguments): medium.com/@andrewsburke/…
AnnieP dec.

22

ES6 / ES2015

나머지 매개 변수 구문을 활용하십시오 .

function printNames(...names) {
  console.log(`number of arguments: ${names.length}`);
  for (var name of names) {
    console.log(name);
  }
}

printNames('foo', 'bar', 'baz');

나머지 매개 변수와 인수 객체 사이에는 세 가지 주요 차이점이 있습니다.

  • 나머지 매개 변수는 별도의 이름이 지정되지 않은 유일한 매개 변수이며 arguments 객체는 함수에 전달 된 모든 인수를 포함합니다.
  • arguments 객체는 실제 배열이 아닌 반면 나머지 매개 변수는 Array 인스턴스입니다. 즉, sort, map, forEach 또는 pop과 같은 메서드를 직접 적용 할 수 있습니다.
  • arguments 객체에는 자신에게 고유 한 추가 기능이 있습니다 (예 : callee 속성).

이것은 일반적으로 일반적인 PHP 구문을 사용하는 웹 개발에 적합합니다.
Dadan

13
var 
print_names = function() {
    console.log.apply( this, arguments );
};

print_names( 1, 2, 3, 4 );


6

라는 JavaScript의 모든 함수에 전달되는 숨겨진 개체가 있습니다 arguments.

arguments.length함수에 전달 된 인수의 양을 가져 오는 데 사용 합니다.

인수를 반복하려면 루프를 사용합니다.

for(var i = arguments.length; i--) {
   var arg = arguments[i];
}

arguments당신이 배열로 필요한 경우는 다음과 같이 변환 할 수 있도록 실제 배열되지 않습니다 :

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

3
그것은 "진짜"배열이 아니라고 그냥 참고, 그것이 "배열과 같은"개체 (특별한 특성을 가진)이지만,의 "어레이 방법"을 사용하여, 당신은, 예를 들어 변환해야합니다 var args = Array.prototype.slice.call(arguments);, var args = Array.apply(null, arguments);등 많은 방법이 ...있다
기독교 C. Salvadó

4

arguments.length. for 루프를 사용할 수 있습니다.

(function () {
    for (var a = [], i = arguments.length; i--;) {
        a.push(arguments[i]);
    };
    return a;
})(1, 2, 3, 4, 5, 6, 7, 8)

@meder, 나는 그런 익명의 기능을 사용하는 것을 좋아합니다. 좋은 예! 또한 거기에 세미콜론이 몇 개 빠졌습니까?
Jacob Relkin 2010

그대로 잘 실행되는 것 같습니다.
meder omuraliev 2010

@meder, 자바 스크립트 #ftf에서 세미콜론 삽입
야곱 Relkin

@meder, 실제로 for블록 뒤의 세미콜론 은 실제로 필요하지 않지만 마지막 줄 끝에 하나를 추가합니다.
Christian C. Salvadó 2010

1
@weng, 그것은 FunctionExpressionFunctionDeclaration에 관한 것 입니다. 이 기사를 확인 하십시오 .
Christian C. Salvadó 2010

2

이제 ES6에서 훨씬 나아졌습니다.

function Example() {
    return {
        arguments: (...args) =>{
            args.map(a => console.log());
        }
    }
}

var exmpl = new Example();
exmpl.arguments(1, 2, 3, 'a', 'b', 'c');

이게 도움이 되길 바란다


0

ES6의 나머지 매개 변수

const example = (...args) => {
  for (arg in args) {
    console.log(arg);
  }
}

참고 : 나머지 매개 변수 앞에 일반 매개 변수를 전달할 수 있습니다.

const example = (arg1, ...args) => {
  console.log(arg1);
  for (arg in args) {
    console.log(arg);
  }
}

0

확산 / 나머지 연산자를 사용하여 매개 변수를 배열로 수집 length하면 배열의가 전달 된 매개 변수의 수가됩니다.

function foo(...names) {
    console.log(names);
    return names;
}

console.log(foo(1, 2, 3, 4).length);

BabelJS를 사용 하여 함수를 oldschool JS로 변환했습니다.

"use strict";

function foo() {
  for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) {
    names[_key] = arguments[_key];
  }

  console.log(names);
  return names;
}

0

스프레드 / 레스트 연산자를 사용하여 함수를 생성 할 수 있으며 그 이후로 목표를 달성했습니다. 아래의 덩어리를보세요.

const print_names = (...args) => args.forEach(x => console.log(x));


-4

나는 이것을 좋아한다 :

인수의 수를 모르는 경우에는 도움이되지 않지만 순서를 기억하고 싶지 않은 경우에는 도움이됩니다.

/**
 *  @param  params.one        A test parameter
 *  @param  params.two        Another one  
 **/
function test(params) {

    var one = params.one;
    if(typeof(one) == 'undefined') {
        throw new Error('params.one is undefined');
    }

    var two = params.two;
    if(typeof(two) == 'undefined') {
        throw new Error('params.two is undefined');
    }
}

1
질문은 알 수없는 수의 인수에 관한 것이 었습니다.
디자인 : Adrian에 의해
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.