2011-06-18 53 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

作爲替代方案,你可以有一個參數 - 「無限」容器,如數組(或對象),然後只是將所有數據都作爲數組傳遞,即使只有'...([one_arg])'... –

+0

請注意,要直接回答問題, [不,你不能。](http:// stackoverflow。com/questions/22747068/is-there-a-max-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中定義。它與數組唯一的相似之處在於它的length屬性比它的最高數字屬性名稱多一個。除此之外,它只是一個具有屬性的對象。 – RobG

+5

我當時很詩意:-)而「參數」變量*很奇怪 - 它也有類似「被調用者」屬性的東西。 – Pointy

1
function toArray() { 
    return arguments; 
} 

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

arguments關鍵字是在每一個js函數

+0

'arguments'不是「type」'Array ',它只是一種「可迭代的」,這在JS方面是相當蹩腳的。 –

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

作爲ECMAScript的2015的可用的(或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。

+1

謝謝,這正是我一直在尋找的。特別是MDN鏈接,我只是不記得它的名字。 :) – Noitidart

1

的ECMAScript 6,您可以使用其他參數的語法:

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 ]