你知道 JavaScript 中的 Arguments 物件都有哪些用途嗎?

程式設計三昧發表於2021-08-29

JavaScript 中 Arguments 物件的用途總結。

前言

相信我們很多人在程式碼開發的過程中都使用到過一個特殊的物件 —— Arguments 物件。

在實際開發中,Arguments 物件非常有用。靈活使用 Arguments 物件,可以提升使用函式的靈活性,增強函式在抽象程式設計中的適應能力和糾錯能力。

那麼 Arguments 物件到底該怎麼用呢?今天我們就來總結一下。

Arguments 的基本概念

Arguments 是一個對應於傳遞給函式的引數的類陣列物件

image-20210829231115796

Arguments 是個類似陣列但不是陣列的物件,說它類似陣列是因為其具備陣列相同的訪問性質及方式,能夠由 arguments[n] 來訪問對應的單個引數的值,並擁有陣列長度屬性 length。還有就是 Arguments 物件儲存的是實際傳遞給函式的引數,而不侷限於函式宣告所定義的引數列表,而且不能顯式建立 Arguments 物件。

下面是一個簡單使用 Arguments 的示例:

function func1(a, b, c) {
    console.log(arguments[0]);
    console.log(arguments[1]);
    console.log(arguments[2]);
}

func1(1, 2, 3);
// 1
// 2
// 3

我們可以在函式內部,直接透過 arguments 來獲取所傳入的引數集合,然後以陣列的獲值形式獲取對應位置的引數值。

Arguments 的作用

作為 JavaScript 中的一個特殊物件,Arguments 具有哪些用途,或者說是該怎麼用呢?

獲取實參和形參的個數

使用 arguments.length 屬性可以獲取函式的實參個數。使用函式物件的 length 屬性可以獲取函式的形參個數,該屬性為只讀屬性,在函式體內、體外都可以使用。

下面示例設計一個 checkArg() 函式,用來檢測一個函式的形參和實參是否一致,如果不一致則丟擲異常。

function checkArg(a) {
    //檢測函式實參與形參是否一致
    if (a.length != a.callee.length)
        //如果實參與形參個數不同,則丟擲錯誤
        throw new Error("實參和形參不一致");
}

function f(a, b) {
    //求兩個數的平均值
    checkArg(arguments); //根據arguments來檢測函式實參和形參是否一致
    return ((a * 1 ? a : 0) + (b * 1 ? b : 0)) / 2; //返回平均值
}
console.log(f(6)); //丟擲異常。呼叫函式f,傳入一個引數

修改實參值

在下面示例中使用 for 迴圈遍歷 arguments 物件,然後把迴圈變數的值傳入 arguments,以便於改變實參值。

function f() {
    for (let i = 0; i < arguments.length; i++) {  //遍歷arguments物件
        arguments[i] = i;  //修改每個實參的值
        console.log(arguments[i]);  //提示修改的實參值
    }
}

f(3, 3, 6);  //返回提示0、1、2,而不是3、3、6

改變實參的個數

透過修改 length 屬性值,也可以改變函式的實參個數。當 length 屬性值增大時,則增加的實參值為 undefined;如果 length 屬性值減小,則會丟棄 length 長度值之後的實參值。

function f() {
    arguments.length = 2; //修改arguments屬性物件的length屬性值
    for (let i = 0; i < arguments.length; i++) {
        console.log(arguments[i]);
    }
}

f(3, 3, 6); //返回提示3、3

檢測引數合法性

在下面示例中,使用 arguments.callee 獲取匿名函式,然後透過函式的 length 屬性獲取函式形參個數,最後比較實參個數與形參個數,以檢測使用者傳遞的引數是否符合要求。

function f(x,y,z) {
    let a = arguments.length;  //獲取函式實參的個數
    let b = arguments.callee.length;  //獲取函式形參的個數
    if (a != b){  //如果實參和形參個數不相等,則提示錯誤資訊
        throw new Error("傳遞的引數不匹配");
    }else {  //如果實參和形參個數相同,則返回它們的和
        return x + y + z;
    }
}

console.log(f(3,4,5));  //返回值12

arguments.callee 等價於函式名,在上面示例中,arguments.callee 等於 f。

函式的引數個數不確定時,用於訪問呼叫函式的實參值

如果函式的引數個數不確定,或者函式的引數個數很多,而又不想逐一定義每一個形參,則可以省略定義引數,直接在函式體內使用 Arguments 物件來訪問呼叫函式的實參值。

下面示例定義一個求平均值的函式,該函式借助 arguments 物件來計算引數的平均值。在呼叫函式時,可以傳入任意多個引數。

function avg() {
    //求平均值
    let num = 0;
    let length = 0; //宣告並初始化臨時變數
    for (let i = 0; i < arguments.length; i++) {
        //遍歷所有實參
        if (typeof arguments[i] != "number") {
            //如果引數不是數值
            continue; //則忽略該引數值
        }
        num += arguments[i]; //計算引數的數值之和
        length++; //計算參與和運算的引數個數
    }

    return num / length; //返回平均值
}

console.log(avg(1, 2, 3, 4)); //返回2.5
console.log(avg(1, 2, "3", 4)); //返回2.3333333333333335

遍歷或訪問實參的值

arguments 物件是偽類陣列,不是陣列,可以透過 length 屬性和中括號語法來遍歷或訪問實參的值。不過,透過動態呼叫的方法,也可以使用陣列的方法,如 push、pop、slice 等。

下面示例使用動態呼叫的方法,讓 arguments 物件呼叫陣列方法 slice(),可以把函式的引數物件轉換為陣列。

function f() {
    return [].slice.apply(arguments);
    // 也可以使用如下寫法
    // return Array.from(arguments);
    // return [...arguments];
}
console.log(f(1, 2, 3, 4, 5, 6)); //返回[1,2,3,4,5,6]

總結

以上就是對 Arguments 物件實際用途的一些總結,希望我們都能夠靈活使用 Arguments,寫出詩一樣的程式碼!

如果你還知道更多的用途,歡迎在下方評論區留言交流哦 ?

~

~本文完,感謝閱讀!

~

學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!

大家好,我是〖程式設計三昧〗的作者 隱逸王,我的公眾號是『程式設計三昧』,歡迎關注,希望大家多多指教!

你來,懷揣期望,我有墨香相迎! 你歸,無論得失,唯以餘韻相贈!

知識與技能並重,內力和外功兼修,理論和實踐兩手都要抓、兩手都要硬!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章