目錄
1. 什麼是 arguments
2. arguments 運算
2.1 arguments length
3.4 arguments 轉數組
2.3 修改 arguments 值
2.4 將參數從一個函數傳遞到另一個函數
2.5 arguments 與重載
3. ES6 中的arguments
3.1 擴充運算子
3.2 Rest 參數
3.3 預設參數
4. 陣列與類別數組物件
首頁 web前端 js教程 JavaScript arguments 物件詳解

JavaScript arguments 物件詳解

Mar 03, 2017 pm 03:13 PM
javascript

1. 什麼是 arguments

MDN 上解釋:

arguments 是一個類別陣列物件。代表傳給一個function的參數清單。

我們先用一個範例直觀了解下 JavaScript 中的 arguments 長什麼樣子。

function printArgs() {
    console.log(arguments);
}
printArgs("A", "a", 0, { foo: "Hello, arguments" });
登入後複製

執行結果是:

["A", "a", 0, Object]
登入後複製

乍一看,結果是個數組,但並不是真正的數組,所以說arguments 是一個類別數組的物件(想了解真正數組與類別數組物件的差異可以一直翻到最後)。

再看看 arguments 所表示的內容,其表示了函數執行時傳入函數的所有參數。在上面的例子中,代表了傳入 printArgs 函數中的四個參數,可以分別用 arguments[0]、 arguments[1]… 來取得單一的參數。

2. arguments 運算

2.1 arguments length

arguments 是個類別陣列對象,包含一個 length 屬性,可用 arguments. length 來求傳入函數的參數個數。

function func() {
    console.log("The number of parameters is " + arguments.length);
}

func();
func(1, 2);
func(1, 2, 3);
登入後複製

執行結果如下:

The number of parameters is 0
The number of parameters is 2
The number of parameters is 3
登入後複製

2.2 arguments 轉數組

通常使用下面的方法將arguments 轉換成數組:

Array.prototype.slice.call(arguments);
登入後複製

還有一個更簡短的寫法:

[].slice.call(arguments);
登入後複製

在這裡,只是簡單地呼叫了空數組的slice 方法,而沒有從Array 的原型層面呼叫。

為什麼上面兩個方法可以轉換呢?

首先,slice 方法得到的結果就是一個數組,參數就是 arguments。事實上,滿足一定條件的物件都能被 slice 方法轉換成陣列。看個例子:

const obj = { 0: "A", 1: "B", length: 2 };
const result = [].slice.call(obj);
console.log(Array.isArray(result), result);
登入後複製

執行結果是:

true ["A", "B"]
登入後複製

從上面例子可以看出,條件就是: 1) 屬性為0,1,2…;2) 具有length 屬性;

另外,有一個需要注意的地方就是,不能將函數的arguments 洩漏或傳遞出去。什麼意思呢?看下面的幾個洩漏 arguments 的例子:

// Leaking arguments example1:
function getArgs() {
    return arguments;
}

// Leaking arguments example2:
function getArgs() {
    const args = [].slice.call(arguments);
    return args;
}

// Leaking arguments example3:
function getArgs() {
    const args = arguments;
    return function() {
        return args;
    };
}
登入後複製

上面的做法就直接將函數的 arguments 物件洩漏出去了,最終的結果就是 V8 引擎將會跳過優化,導致相當大的效能損失。

你可以這麼做:

function getArgs() {
    const args = new Array(arguments.length);
    for(let i = 0; i < args.length; ++i) {
        args[i] = arguments[i];
    }
    return args;
}
登入後複製

那就很好奇了,我們每次使用arguments 時通常第一步都會將其轉換為數組,同時arguments 使用不當還容易導致效能損失,那麼為什麼不將arguments 直接設計成陣列物件呢?

這需要從這門語言的一開始說起。 arguments 在語言的早期就引入了,當時的 Array 物件有 4 個方法: toString、 join、 reverse 和 sort。 arguments 繼承於 Object 的很大原因是不需要這四個方法。而現在,Array 增加了許多強大的方法,像是 forEach、map、filter 等等。那為什麼現在不在新的版本裡讓 arguments 重新繼承自 Array呢?其實 ES5 的草案中就包含這一點,但為了向前兼容,最後還是被委員會否決了。

2.3 修改 arguments 值

在嚴格模式與非嚴格模式下,修改函數參數值表現的結果不一樣。看下面的兩個例子:

function foo(a) {
    "use strict";
    console.log(a, arguments[0]);
    a = 10;
    console.log(a, arguments[0]);
    arguments[0] = 20;
    console.log(a, arguments[0]);
}
foo(1);
登入後複製

輸出:

1 1
10 1
10 20
登入後複製

另一個非嚴格模式的範例:

function foo(a) {
    console.log(a, arguments[0]);
    a = 10;
    console.log(a, arguments[0]);
    arguments[0] = 20;
    console.log(a, arguments[0]);
}
foo(1);
登入後複製

輸出結果為:

1 1
10 10
20 20
登入後複製

從上面的兩個例子可以看出,在嚴格模式下,函數中的參數與arguments 物件沒有聯繫,修改一個值不會改變另一個值。而在非嚴格模式下,兩個會互相影響。

2.4 將參數從一個函數傳遞到另一個函數

下面是將參數從一個函數傳遞到另一個函數的建議做法。

function foo() {
    bar.apply(this, arguments);
}
function bar(a, b, c) {
    // logic
}
登入後複製

2.5 arguments 與重載

很多語言中都有重載,但 JavaScript 中沒有。先看個例子:

function add(num1, num2) {
    console.log("Method one");
    return num1 + num2;
}

function add(num1, num2, num3) {
    console.log("Method two");
    return num1 + num2 + num3;
}

add(1, 2);
add(1, 2, 3);
登入後複製

執行結果為:

Method two
Method two
登入後複製

所以,JavaScript 中,函數並沒有根據參數的不同而產生不同的呼叫。

是不是 JavaScript 中就沒有重載了呢?並不是,我們可以利用 arguments 模擬重載。還是上面的例子。

function add(num1, num2, num3) {
    if (arguments.length === 2) {
        console.log("Result is " + (num1 + num2));
    }
    else if (arguments.length === 3) {
        console.log("Result is " + (num1 + num2 + num3));
    }
}

add(1, 2);
add(1, 2, 3)
登入後複製

執行結果如下:

Result is 3
Result is 6
登入後複製

3. ES6 中的arguments

3.1 擴充運算子

直接上栗子:

function func() {
    console.log(...arguments);
}

func(1, 2, 3);
登入後複製

執行結果是:

1 2 3
登入後複製

簡潔地講,擴充運算子可以將arguments 展開成獨立的參數。

3.2 Rest 參數

還是上栗子:

function func(firstArg, ...restArgs) {
    console.log(Array.isArray(restArgs));
    console.log(firstArg, restArgs);
}

func(1, 2, 3);
登入後複製

執行結果是:

true
1 [2, 3]
登入後複製

從上面的結果可以看出,Rest 參數表示除了明確指定剩下的參數集合,類型是Array。

3.3 預設參數

栗子:

function func(firstArg = 0, secondArg = 1) {
    console.log(arguments[0], arguments[1]);
    console.log(firstArg, secondArg);
}

func(99);
登入後複製

執行結果是:

99 undefined
99 1
登入後複製

可見,預設參數對arguments 沒有影響,arguments 還是僅表示呼叫函數時所傳入的所有參數。

3.4 arguments 轉數組

Array.from() 是個非常推薦的方法,其可以將所有類別數組物件轉換成陣列。

4. 陣列與類別數組物件

陣列具有一個基本特徵:索引。這是一般對象所沒有的。

const obj = { 0: "a", 1: "b" };
const arr = [ "a", "b" ];
登入後複製

我们利用 obj[0]arr[0] 都能取得自己想要的数据,但取得数据的方式确实不同的。obj[0] 是利用对象的键值对存取数据,而arr[0] 却是利用数组的索引。事实上,Object 与 Array 的唯一区别就是 Object 的属性是 string,而 Array 的索引是 number。

下面看看类数组对象。

伪数组的特性就是长得像数组,包含一组数据以及拥有一个 length 属性,但是没有任何 Array 的方法。再具体的说,length 属性是个非负整数,上限是 JavaScript 中能精确表达的最大数字;另外,类数组对象的 length 值无法自动改变。

如何自己创建一个类数组对象?

function Foo() {}
Foo.prototype = Object.create(Array.prototype);

const foo = new Foo();
foo.push(&#39;A&#39;);
console.log(foo, foo.length);
console.log("foo is an array? " + Array.isArray(foo));
登入後複製

执行结果是:

["A"] 1
foo is an array? false
登入後複製

也就是说 Foo 的示例拥有 Array 的所有方法,但类型不是 Array。

如果不需要 Array 的所有方法,只需要部分怎么办呢?

function Bar() {}
Bar.prototype.push = Array.prototype.push;

const bar = new Bar();
bar.push(&#39;A&#39;);
bar.push(&#39;B&#39;);
console.log(bar);
登入後複製

执行结果是:

Bar {0: "A", 1: "B", length: 2}
登入後複製

 以上就是JavaScript arguments 对象详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何將 MySQL 查詢結果陣列轉換為物件? 如何將 MySQL 查詢結果陣列轉換為物件? Apr 29, 2024 pm 01:09 PM

將MySQL查詢結果陣列轉換為物件的方法如下:建立一個空物件陣列。循環結果數組並為每一行建立一個新的物件。使用foreach迴圈將每一行的鍵值對賦給新物件的對應屬性。將新物件加入到物件數組中。關閉資料庫連線。

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

數組和物件在 PHP 中的差異是什麼? 數組和物件在 PHP 中的差異是什麼? Apr 29, 2024 pm 02:39 PM

PHP中,數組是有序序列,以索引存取元素;物件是具有屬性和方法的實體,透過new關鍵字建立。數組存取透過索引,物件存取通過屬性/方法。數組值傳遞,物件參考傳遞。

PHP中的Request物件是什麼? PHP中的Request物件是什麼? Feb 27, 2024 pm 09:06 PM

PHP中的Request物件是用來處理客戶端傳送到伺服器的HTTP請求的物件。透過Request對象,我們可以取得客戶端的請求訊息,例如請求方法、請求頭資訊、請求參數等,從而實現對請求的處理和回應。在PHP中,可以使用$_REQUEST、$_GET、$_POST等全域變數來取得要求的信息,但是這些變數並不是對象,而是陣列。為了更靈活和方便地處理請求訊息,可

C++ 函式回傳物件時有什麼需要注意的? C++ 函式回傳物件時有什麼需要注意的? Apr 19, 2024 pm 12:15 PM

在C++中,函數傳回物件需要注意三點:物件的生命週期由呼叫者負責管理,以防止記憶體洩漏。避免懸垂指針,透過動態分配記憶體或返回物件本身來確保物件在函數返回後仍然有效。編譯器可能會最佳化傳回物件的副本生成,以提高效能,但如果物件是值語義傳遞的,則無需副本生成。

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

See all articles