當我們在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物件來取得實參,這樣是不是方便了很多。
有些語言在我們給函數指定了參數名稱之後,當呼叫函數時,會判斷目前傳入的參數是否與函數定義的參數個數相等,不相等就會報錯,但是靈活的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中文網其他相關文章!

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver CS6
視覺化網頁開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。