arguments 物件

Baseline 廣泛可用 *

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

* 此特性的某些部分可能存在不同級別的支援。

arguments 是一個函式內部可訪問的類陣列物件,它包含傳遞給該函式的引數值。

試一試

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 個引數,你可以這樣訪問它們

js
arguments[0]; // first argument
arguments[1]; // second argument
arguments[2]; // third argument

arguments 物件對於以比正式宣告接受的引數更多的方式呼叫的函式(稱為可變引數函式,例如 Math.min())很有用。此示例函式接受任意數量的字串引數並返回最長的一個

js
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 屬性。

賦值給索引

每個引數索引也可以設定或重新分配

js
arguments[1] = "new value";

只有簡單引數(即沒有剩餘引數、預設引數或解構引數)的非嚴格模式函式將引數的新值與 arguments 物件同步,反之亦然

js
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 物件將始終反映函式呼叫時傳遞給函式的值。

js
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

js
const args = Array.prototype.slice.call(arguments);
// or
const args = Array.from(arguments);
// or
const args = [...arguments];

對於常見的用例,將其用作類陣列物件就足夠了,因為它既可迭代又具有 length 和數字索引。例如,Function.prototype.apply() 接受類陣列物件。

js
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 中每個索引的值。

示例

定義一個連線多個字串的函式

此示例定義了一個連線多個字串的函式。該函式的唯一形式引數是包含分隔要連線項的字元的字串。

js
function myConcat(separator) {
  const args = Array.prototype.slice.call(arguments, 1);
  return args.join(separator);
}

你可以向此函式傳遞任意數量的引數。它使用列表中的每個引數返回一個字串列表

js
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"。該函式定義如下

js
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;
}

你可以向此函式傳遞任意數量的引數,它會將每個引數作為列表項新增到指定型別的列表中。例如

js
list("u", "One", "Two", "Three");
// "<ul><li>One</li><li>Two</li><li>Three</li></ul>"

將 typeof 與 arguments 一起使用

當與 arguments 一起使用時,typeof 運算子返回 'object'

js
console.log(typeof arguments); // 'object'

可以透過索引 arguments 來確定單個引數的型別

js
console.log(typeof arguments[0]); // returns the type of the first argument

規範

規範
ECMAScript® 2026 語言規範
# sec-arguments-exotic-objects

瀏覽器相容性

另見