arguments
是一個類數組對象。代表傳給一個function的參數列表。
在JavaScript函數定義中,不會像Java或者C++這樣強制要求指定函數的形參個數和形參的類型. JavaScript是弱類型語言,一個變量可以賦值所有類型的值.
定義函數的時候,可以根據情況傳遞任意實參, 因此,JavaScript的函數式沒有重載的概念的. 爲此,可以使用arguments
這個變量獲取函數調用傳遞進來的參數.
例如
function test() {
//arguments
}
可以這樣調用test(); 或者 test(1) 或者test(1, 2 ...)
描述
arguments
對象是函數內部的本地變量;arguments 已經不再是函數的屬性了。
你可以在函數內部通過使用 arguments
對象來獲取函數的所有參數。這個對象爲傳遞給函數的每個參數建立一個條目,條目的索引號從 0 開始。例如,如果一個函數有三個參數,你可以通過以下方式獲取參數:
arguments[0]
arguments[1]
arguments[2]
參數也可以被重新賦值:
arguments[1] = 'new value';
arguments
對象並不是一個真正的數組
。它類似於數組,但沒有數組所特有的屬性和方法,除了 length。例如,它沒有 pop 方法。不過可以將其轉換成數組:
var args = Array.prototype.slice.call(arguments);
不應在 arguments 對象上使用 slice 方法,這會阻礙 JavaScript 引擎的優化 (比如 V8 引擎)。作爲替代,應通過遍歷 arguments 對象的方式來構建一個新的數組。
如果 Array generics 可用的話,下面的代碼可以作爲替代:
var args = Array.slice(arguments);
arguments
對象僅在函數內部有效,在函數外部調用 arguments 對象會出現一個錯誤。
如果你調用一個函數,當這個函數的參數數量比它顯式聲明的參數數量更多的時候,你就可以使用 arguments
對象。這個技術對於參數數量是一個可變量的函數來說比較有用。 你可以用 arguments.length
來得到參數的數量,然後可以用 arguments
object 來對每個參數進行處理。 (想要得到當一個函數定義時的該函數的參數數量, 請使用 Function.length
屬性。)
屬性
arguments.callee
- 指向當前執行的函數。
arguments.caller
- 指向調用當前函數的函數。
arguments.length
- 指向傳遞給當前函數的參數數量。
例子
例子: 定義一個連接字符串的方法
這個例子定義了一個函數來連接字符串。這個函數唯一正式聲明瞭的參數是一個字符串,該參數指定一個字符作爲銜接點來連接字符串。該函數定義如下:
function myConcat(separator) {
var args = Array.prototype.slice.call(arguments, 1);
return args.join(separator);
}
你可以傳遞任意數量的參數到該函數,然後該函數會將每個參數作爲一個條目來創建一個列表。
// returns "red, orange, blue"
myConcat(", ", "red", "orange", "blue");
// returns "elephant; giraffe; lion; cheetah"
myConcat("; ", "elephant", "giraffe", "lion", "cheetah");
// returns "sage. basil. oregano. pepper. parsley"
myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley");
例子: 定義一個創建HTML列表的方法
這個例子定義了一個函數通過一個字符串來創建HTML列表。這個函數唯一正式聲明瞭的參數是一個字符。當該參數爲 "u
" 時,創建一個無序列表 (項目列表);當該參數爲 "o
" 時,則創建一個有序列表 (編號列表)。該函數定義如下:
function list(type) {
var result = "<" + type + "l><li>";
var args = Array.prototype.slice.call(arguments, 1);
result += args.join("</li><li>");
result += "</li></" + type + "l>"; // end list
return result;
}
你可以傳遞任意數量的參數到該函數,然後該函數會將每個參數作爲一個條目添加到第一個參數指定類型的列表當中。
var listHTML = list("u", "One", "Two", "Three");
/* listHTML is:
"<ul><li>One</li><li>Two</li><li>Three</li></ul>"
*/