arguments 物件
Baseline 廣泛可用 *
試一試
function func1(a, b, c) {
console.log(arguments[0]);
// Expected output: 1
console.log(arguments[1]);
// Expected output: 2
console.log(arguments[2]);
// Expected output: 3
}
func1(1, 2, 3);
描述
注意: 在現代程式碼中,應該優先使用剩餘引數。
arguments 物件是一個區域性變數,在所有非箭頭函式中都可用。你可以使用函式的 arguments 物件在函式內部引用該函式的引數。它包含函式呼叫時傳入的每個引數的條目,第一個條目的索引為 0。
例如,如果一個函式傳入 3 個引數,你可以這樣訪問它們
arguments[0]; // first argument
arguments[1]; // second argument
arguments[2]; // third argument
arguments 物件對於以比正式宣告接受的引數更多的方式呼叫的函式(稱為可變引數函式,例如 Math.min())很有用。此示例函式接受任意數量的字串引數並返回最長的一個
function longestString() {
let longest = "";
if (arguments.length === 0) {
throw new TypeError("At least one string is required");
}
for (const arg of arguments) {
if (arg.length > longest.length) {
longest = arg;
}
}
return longest;
}
你可以使用arguments.length 來計算函式被呼叫時傳入了多少個引數。如果你想計算函式宣告接受多少個引數,請檢查該函式的 length 屬性。
賦值給索引
每個引數索引也可以設定或重新分配
arguments[1] = "new value";
只有簡單引數(即沒有剩餘引數、預設引數或解構引數)的非嚴格模式函式將引數的新值與 arguments 物件同步,反之亦然
function func(a) {
arguments[0] = 99; // updating arguments[0] also updates a
console.log(a);
}
func(10); // 99
function func2(a) {
a = 99; // updating a also updates arguments[0]
console.log(arguments[0]);
}
func2(10); // 99
如果非嚴格模式函式傳入了剩餘引數、預設引數或解構引數,則在函式體中分配給引數的新值將不會與 arguments 物件同步。相反,具有複雜引數的非嚴格模式函式中的 arguments 物件將始終反映函式呼叫時傳遞給函式的值。
function funcWithDefault(a = 55) {
arguments[0] = 99; // updating arguments[0] does not also update a
console.log(a);
}
funcWithDefault(10); // 10
function funcWithDefault2(a = 55) {
a = 99; // updating a does not also update arguments[0]
console.log(arguments[0]);
}
funcWithDefault2(10); // 10
// An untracked default parameter
function funcWithDefault3(a = 55) {
console.log(arguments[0]);
console.log(arguments.length);
}
funcWithDefault3(); // undefined; 0
這與所有嚴格模式函式表現出的行為相同,無論它們傳入的引數型別如何。也就是說,在函式體中為引數分配新值永遠不會影響 arguments 物件,為 arguments 索引分配新值也不會影響引數的值,即使函式只有簡單引數。
注意: 你不能在接受剩餘引數、預設引數或解構引數的函式定義體內編寫 "use strict"; 指令。這樣做會丟擲語法錯誤。
arguments 是一個類陣列物件
arguments 是一個類陣列物件,這意味著 arguments 具有 length 屬性和從零開始索引的屬性,但它不具有 Array 的內建方法,例如 forEach() 或 map()。但是,它可以使用 slice()、Array.from() 或擴充套件語法轉換為真正的 Array。
const args = Array.prototype.slice.call(arguments);
// or
const args = Array.from(arguments);
// or
const args = [...arguments];
對於常見的用例,將其用作類陣列物件就足夠了,因為它既可迭代又具有 length 和數字索引。例如,Function.prototype.apply() 接受類陣列物件。
function midpoint() {
return (
(Math.min.apply(null, arguments) + Math.max.apply(null, arguments)) / 2
);
}
console.log(midpoint(3, 1, 4, 1, 5)); // 3
屬性
arguments.callee已廢棄-
引用 arguments 所屬的當前正在執行的函式。在嚴格模式下停用。
arguments.length-
傳遞給函式的引數數量。
arguments[Symbol.iterator]()-
返回一個新的陣列迭代器物件,其中包含
arguments中每個索引的值。
示例
定義一個連線多個字串的函式
此示例定義了一個連線多個字串的函式。該函式的唯一形式引數是包含分隔要連線項的字元的字串。
function myConcat(separator) {
const args = Array.prototype.slice.call(arguments, 1);
return args.join(separator);
}
你可以向此函式傳遞任意數量的引數。它使用列表中的每個引數返回一個字串列表
myConcat(", ", "red", "orange", "blue");
// "red, orange, blue"
myConcat("; ", "elephant", "giraffe", "lion", "cheetah");
// "elephant; giraffe; lion; cheetah"
myConcat(". ", "sage", "basil", "oregano", "pepper", "parsley");
// "sage. basil. oregano. pepper. parsley"
定義一個建立 HTML 列表的函式
此示例定義了一個建立包含 HTML 列表的字串的函式。該函式的唯一形式引數是一個字串,如果列表是無序(帶專案符號),則為 "u",如果列表是有序(帶編號),則為 "o"。該函式定義如下
function list(type) {
let html = `<${type}l><li>`;
const args = Array.prototype.slice.call(arguments, 1);
html += args.join("</li><li>");
html += `</li></${type}l>`; // end list
return html;
}
你可以向此函式傳遞任意數量的引數,它會將每個引數作為列表項新增到指定型別的列表中。例如
list("u", "One", "Two", "Three");
// "<ul><li>One</li><li>Two</li><li>Three</li></ul>"
將 typeof 與 arguments 一起使用
當與 arguments 一起使用時,typeof 運算子返回 'object'
console.log(typeof arguments); // 'object'
可以透過索引 arguments 來確定單個引數的型別
console.log(typeof arguments[0]); // returns the type of the first argument
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-arguments-exotic-objects |
瀏覽器相容性
載入中…