web-dev-qa-db-ja.com

関数のすべての引数をその関数内の単一のオブジェクトとして取得することは可能ですか?

PHPには func_num_argsfunc_get_args がありますが、JavaScriptに似たようなものはありますか?

205
rsk82

arguments を使用します。配列のようにアクセスできます。引数の数にarguments.lengthを使用します。

331
Thomas Eding

arguments配列のようなオブジェクト (実際の配列ではありません)です。関数の例...

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

130
Luke

ES6では、次のような「...」表記で関数の引数を指定する構成が可能です

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

argumentsオブジェクトは、関数の引数が格納される場所です。

Argumentsオブジェクトは機能し、配列のように見えますが、基本的には、配列のメソッドはありません。たとえば、

Array.forEach(callback[, thisArg]);

Array.map(callback[, thisArg])

Array.filter(callback[, thisArg]);

Array.slice(begin[, end])

Array.indexOf(searchElement[, fromIndex])

argumentsオブジェクトをreal配列に変換する最良の方法は次のようだと思います:

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

21
iConnor

必要に応じて、配列に変換することもできます。配列ジェネリックが利用可能な場合:

var args = Array.slice(arguments)

さもないと:

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

from Mozilla MDN

JavaScriptエンジン(V8など)の最適化を妨げるため、引数をスライスしないでください。

10
Iman Mohamadi

他の多くの人が指摘したように、argumentsには、関数に渡されるすべての引数が含まれています。

同じ引数を使用して別の関数を呼び出す場合は、applyを使用します

例:

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

debug("message", "another argument")

はい、関数宣言時にいくつの引数が可能なのかわからない場合は、パラメーターなしで関数を宣言し、関数呼び出し時に渡される引数配列ですべての変数にアクセスできます。

3
Rubi saini

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=001

3
Frank Nocke

ES6では、次のようなことができます。

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

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


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