js中arguments詳解
當我們在js中在呼叫一個函數的時候,我們常常會給這個函數傳遞一些參數,js把傳入到這個函數的全部參數儲存在一個叫做arguments的東西裡面,那麼這到底是什麼東西?
在js中萬物皆對象,甚至數組字串函數都是對象。所以這個叫做arguments的東西也是個對象,而且是一個特殊的對象,它的屬性名是按照傳入參數的序列來的,第1個參數的屬性名是'0',第2個參數的屬性名是'1',以此類推,而且它還有length屬性,儲存的是目前傳入函數參數的數,很多時候我們把這種物件叫做類別數組物件。類別數組物件和數組都是物件這個媽生的,但是數組是大哥比類別數組物件多了很多其他的玩具(方法),類別數組物件只是長得很像數組的弟弟而已。
慢著,剛剛不是說數組也是物件嗎,現在這個類別數組物件又是什麼? 沒辦法,js就是這麼的靈活。這個類別數組物件不僅儲存給函數傳入的參數,也具有一些其他的屬性,等下會一一道來。
因為類別陣列物件和陣列有很多的共通性,所以我們常常可以用call方法,讓類別陣列物件也使用的陣列的一些方法,就是讓這個弟弟去玩哥哥的玩具,例如… ,還是不扯遠了,這篇文章只是說什麼是arguments,想知道更多關於物件如何借調數組方法的話,請參考這篇文章。
arguments的屬性
接下來我們來看看arguments對象裡面到底有些什麼東西,是騾子是馬拉出來溜溜。
function showargs() { console.log( arguments ); } showargs(1,2,3,4,5);
下面我們用console.log的方式,將arguments物件輸出到控制台,這裡不得不說一句,chrome的console工具好用得不得了(我不是來打廣告的)。
<br/>
這裡我們可以看到arguments物件將我傳入的五個參數以數組的形式保存在裡面,還有保存了我傳入函數的實參的個數(length)。而且我們可以看到arguments對象的 ==_ proto _== 是指向object的,這也說明了他是個類別數組對象,而不是數組。
有了這個物件我們以後寫函數的時候,就不用給所有的形參指定參數名,然後透過參數名的方式取得參數了,我們可以直接使用arguments物件來取得實參,這樣是不是方便了很多。 <br/> 有些語言在我們給函數指定了參數名稱之後,當呼叫函數時,會判斷目前傳入的參數是否與函數定義的參數個數相等,不相等就會報錯,但是靈活的js(不是我說,js是真的很靈活)並不會驗證傳遞給函數的參數個數是否等於函數定義的參數個數。所以為了裝逼(程式碼的簡潔度),我們使用arguments呼叫參數可以不混淆不同函數之間的參數名稱。另外為了裝逼(程式碼的嚴整度),我們也能用arguments來判斷目前傳入參數的數量是否與我們需要的數量一致。
下面舉個栗子:
function add() { if( arguments.length == 2 ){ return arguments[0] + arguments[1]; }else{ return '传入参数不合法'; } } console.log( add(2,3) ); console.log( add(1,2,3) );
看看結果:
#最後我們還可以看到arguments還有一個叫做callee的屬性,這個屬性是表示的是當前函數的一個引用,簡單點說,這個屬性裡面存儲的我們調用的這個函數的程式碼,實在無法理解的時候,又到了console.log大顯身手的時候了。
function showcallee() { var a = '这里是代码'; var b = '这是另一段代码'; var c = a + b; console.log(arguments.callee); return c; } showcallee();
看到結果的你是不是和我一樣驚呆了呢,這不就是我寫的程式碼嗎,arguments.callee完完整整的把這個函數的這段程式碼回傳了。
arguments的一些妙用
1.利用arguments實作方法的重載
下面我們利用arguments物件來實作一個參數相加的函數,不論傳入多少參數都行,傳入的參數相加後回傳。
function add() { var len = arguments.length, sum = 0; for(;len--;) { sum += arguments[len]; } return sum; }console.log( add(1,2,3) ); //6console.log( add(1,3) ); //4console.log( add(1,2,3,5,6,2,7) ); //26
由於js是一種弱類型的語言,沒有重載機制,當我們重寫函數時,會將原來的函數直接覆蓋,這裡我們能利用arguments,來判斷傳入的實參類型與數量進行不同的操作,然後傳回不同的數值。
2.利用arguments.callee實作遞歸
先來看看之前我們是怎麼實作遞歸的,這是一個結算階乘的函數
function factorial(num) { if(num<=1) { return 1; }else { return num * factorial(num-1); } }
但是當這個函數變成了一個匿名函數時,我們就可以利用callee來遞歸這個函數。
function factorial(num) { if(num<=1) { return 1; }else { return num * arguments.callee(num-1); } }
这个方法虽然好用,但是有一点值得注意,ECMAScript4中为了限制js的灵活度,让js变得严格,新增了严格模式,在严格模式中我们被禁止不使用var来直接声明一个全局变量,当然这不是重点,重点是arguments.callee这个属性也被禁止了。不过这都不是事儿,ES6为我们新增了很多好用的变量声明方式和新的语法糖,作为一个时髦的前端,我们赶紧学习一些ES6的新语法吧。
相关推荐:
js函数的调用及有关隐式参数arguments和this的问题
以上是js中arguments詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

Windows作業系統是全球最受歡迎的作業系統之一,其新版本Win11備受矚目。在Win11系統中,管理員權限的取得是一個重要的操作,管理員權限可以讓使用者對系統進行更多的操作和設定。本文將詳細介紹在Win11系統中如何取得管理員權限,以及如何有效地管理權限。在Win11系統中,管理員權限分為本機管理員和網域管理員兩種。本機管理員是指具有對本機電腦的完全管理權限

OracleSQL中的除法運算詳解在OracleSQL中,除法運算是一種常見且重要的數學運算運算,用來計算兩個數相除的結果。除法在資料庫查詢中經常用到,因此了解OracleSQL中的除法運算及其用法是資料庫開發人員必備的技能之一。本文將詳細討論OracleSQL中除法運算的相關知識,並提供具體的程式碼範例供讀者參考。一、OracleSQL中的除法運算

Linux系統呼叫system()函數詳解系統呼叫是Linux作業系統中非常重要的一部分,它提供了一種與系統核心互動的方式。其中,system()函數是常用的系統呼叫函數之一。本文將詳細介紹system()函數的使用方法,並提供對應的程式碼範例。系統呼叫的基本概念系統呼叫是使用者程式與作業系統核心互動的一種方式。使用者程式透過呼叫系統呼叫函數來請求作業系統

PHP中的模運算子(%)是用來取得兩個數值相除的餘數的。在本文中,我們將詳細討論模運算子的作用及用法,並提供具體的程式碼範例來幫助讀者更好地理解。 1.模運算子的作用在數學中,當我們將一個整數除以另一個整數時,就會得到一個商和一個餘數。例如,當我們將10除以3時,商數為3,餘數為1。模運算子就是用來取得這個餘數的。 2.模運算子的用法在PHP中,使用%符號來表示模

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

Linux的curl命令詳解摘要:curl是一種強大的命令列工具,用於與伺服器進行資料通訊。本文將介紹curl指令的基本用法,並提供實際的程式碼範例,幫助讀者更好地理解和應用該指令。一、curl是什麼? curl是命令列工具,用於發送和接收各種網路請求。它支援多種協議,如HTTP、FTP、TELNET等,並提供了豐富的功能,如檔案上傳、檔案下載、資料傳輸、代

Promise.resolve()詳解,需要具體程式碼範例Promise是JavaScript中一種用來處理非同步操作的機制。在實際開發中,常常需要處理一些需要依序執行的非同步任務,而Promise.resolve()方法就是用來傳回一個已經Fulfilled狀態的Promise物件。 Promise.resolve()是Promise類別的靜態方法,它接受一個

Numpy是一款Python科學計算庫,提供了豐富的陣列操作函數與工具。升級Numpy版本時需要查詢目前版本以確保相容性,本文將詳細介紹Numpy版本查詢的方法,並提供具體的程式碼範例。方法一:使用Python程式碼查詢Numpy版本使用Python程式碼可以輕鬆查詢Numpy的版本,以下是實作方法和範例程式碼:importnumpyasnpprint(np
