web-dev-qa-db-ja.com

JavaScript関数の無制限の引数

JavaScript関数は無制限の引数を取ることができますか?このようなもの:

testArray(1, 2, 3, 4, 5...);

やっています:

var arr = [];
function testArray(A) {
    arr.Push(A);
}

しかし、これは機能しません(出力は最初の引数のみです)。または、唯一の方法は次のとおりです。

function testArray(a, b, c, d, e...) {

}

ありがとう

42
rhavd

参照できる「引数」と呼ばれる奇妙な「マジック」変数があります。

_function manyArgs() {
  for (var i = 0; i < arguments.length; ++i)
    alert(arguments[i]);
}
_

それはlike配列ですが、配列ではありません。実際、あまりにも奇妙なので、実際にはあまり使用しないでください。一般的な方法は、その値をreal配列に入れることです。

_function foo() {
  var args = Array.prototype.slice.call(arguments, 0);
  // ...
_

その例では、「args」は通常の配列であり、奇妙な要素はありません。 「引数」にはあらゆる厄介な問題があり、ECMAScript 5ではその機能が制限されます。

edit.slice()関数を使用すると確実に便利ですが、argumentsオブジェクトを関数は最適化の問題を引き起こすため、それを実行する関数はまったく最適化されない場合があります。したがって、argumentsを配列に変換する簡単で簡単な方法は、

_function foo() {
  var args = [];
  for (var i = 0; i < arguments.length; ++i) args[i] = arguments[i];
  // ...
}
_

argumentsおよび最適化の詳細

58
Pointy

ECMAScript 2015(またはES6)以降、 restパラメーター へのアクセスが可能になり、引数を管理するためのややクリーンな方法が提供されます。

function foo(a, b, ...others) {
    console.log("a and b are ", a, b);

    for (let val of others) {
        console.log(val);
    }
}

foo(1, 2, 3, 4, 5);

この記事の執筆時点では、これはChrome 47 +、Firefox 15+、およびEdgeでサポートされています。この機能は、 Babel および TypeScript がES5に変換されます。

21

ECMAScript 6では、残りの引数構文を使用できます。

const testArray = (...args) => {
    console.log(args);
};

testArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
6
Marius Tancredi
function toArray() {
   return arguments;
}

var myargs = toArray(1, 2, 3, 4, 5, 6);

argumentsキーワードは、すべてのjs関数で使用できます

1
Zoidberg
var arr = [];
function testArray() {
    Array.prototype.Push.apply(arr, arguments);
}
1
clyfish

いくつかのレガシーな方法がありますが、私はES6以降のバージョンなので、これを実装したい場合は、以下のように記述します。

const func = ...arg => console.log(arg);

シンプルで最先端のテクノロジー。

1
AmerllicA

また、単に「キャスト」して、醜いループを回避することもできます。

var getArguments = function() {
    return arguments;
};

var foo = getArguments(1,2,3,4);

// console.log(foo.slice()); => TypeError: foo.slice is not a function

var foo = Object.values(foo); 

console.log(foo); // => [ 1, 2, 3, 4 ]

foo.Push(5);

console.log(foo); // => [ 1, 2, 3, 4, 5 ]
1
Nosaj Neirbo

JavaScript ES5

function testArray(){
    for(index = 0; index < arguments.length; i++) {
        alert(arguments[index])
    }
}

JavaScript ES6

const testArray = (...arg) => console.log(arg)
0
Dary