2011-06-18 15 views
31

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

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

私がしようとしています:

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

は、しかし、これは動作しません(出力は最初の引数だけです)。それとも唯一の方法は次のとおりです。

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

} 

おかげ

+0

をでき配列(またはオブジェクト)のような "無限"のコンテナを1つ持ち、 '...([one_arg]) 'しかない場合でも配列としてすべて渡します。... –

+0

質問に直接答えるには、 [いいえできません。](http:// stackoverflow。com/questions/22747068/is-there-a-max-number-of-arguments-javascript-functions-can-accept) – Kaiido

答えて

49

あなたが参照できる奇妙な「魔法」の変数は「引数」が呼ばれています:

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

それはのような配列だが、それはありません配列。実際にはそれは非常に奇妙なので、実際にはあまり使用しないでください。一般的な方法は、本当配列にその値を取得することです。その例で

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

、「argsが」すごみのいずれかなしに、通常の配列になります。 "引数"にはあらゆる種類の問題があり、ECMAScript 5ではその機能が制限されます。

編集 —必ず.slice()機能を使用すると便利ですが、それは機能のうち、argumentsオブジェクトを渡すと、それを行う機能が全く最適化されないことがありますので、多くのように、最適化のための頭痛の原因となることが判明しました。配列にargumentsを有効にするための簡単な、簡単な方法は、それゆえ

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

More about arguments and optimization.

+0

ありがとうございました。 – rhavd

+3

引数オブジェクトはECMA-262で定義されている "魔法"や奇妙なことは何もありません。配列との唯一の類似点は、長さプロパティが最高の数値プロパティ名の1つ以上であることです。それ以外は、プロパティを持つ単なるオブジェクトです。 – RobG

+5

私は詩的になっていました:-)そして、 "引数"変数*は奇妙です - それは "呼び出し先"プロパティのようなものも持っています。 – Pointy

1
function toArray() { 
    return arguments; 
} 

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

argumentsキーワードは、すべてのJS関数のECMAScript 2015のよう

+0

'arguments'は" type "ではありません' Array 'それはちょうど一種の「反復可能な」ものであり、それはJS側でかなり不自由なものです。 –

1
var arr = []; 
function testArray() { 
    Array.prototype.push.apply(arr, arguments); 
} 
10

で提供されている(またはES6)rest parametersにアクセスすると、引数を管理するためのややきれいな方法が得られます。

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でサポートされています。この機能は、BabelTypeScriptの両方を経由して、ES5に移行することもできます。 ECMAScriptの6で

+1

ありがとう、これは私が探していたものです。特にMDNのリンクは、私はそれの名前を覚えていませんでした。 :) – Noitidart

1

、あなたは引数の構文の残りの部分を使用することができます。

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

testArray(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
0

あなたはまた、単にあなたの醜いループの保存、それを「キャスト」することができます:あなたは、別の方法として

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 ]