深入解析JavaScript中的arguments對(duì)象
arguments定義
所有的函數(shù)都有一個(gè)自己的arguments對(duì)象,用來(lái)儲(chǔ)存它實(shí)際接受到的參數(shù),而不局限于函數(shù)聲明時(shí)所定義的參數(shù)列表。它不是數(shù)組卻類似數(shù)組,具有數(shù)組一樣的訪問(wèn)性質(zhì)及方式,可以由arguments[n]來(lái)訪問(wèn)對(duì)應(yīng)的單個(gè)參數(shù)的值,并擁有數(shù)組長(zhǎng)度屬性length。但是卻不具有數(shù)組的一些方法。可以通過(guò)call把a(bǔ)rguments轉(zhuǎn)化成真正的數(shù)組,然后進(jìn)行數(shù)組的操作。
var args = Array.prototype.slice.call(arguments);
類數(shù)組
1. 判斷ARGUMENTS是不是數(shù)組
alert(arguments instanceof Array); alert(arguments instanceof Object);
2. 如何嚴(yán)格的判斷一個(gè)數(shù)據(jù)是數(shù)組(ARRAY)類的實(shí)例
function isArray(value){ if (typeof Array.isArray === "function") { return Array.isArray(value); }else{ return Object.prototype.toString.call(value) === "[object Array]"; } }
3. 把ARGUMENTS轉(zhuǎn)換成數(shù)組
方法一:內(nèi)置的類型可以通過(guò)prototype找到內(nèi)置的屬性方法,Array.prototype.slice就是訪問(wèn)Array的內(nèi)置方法slice。通過(guò)slice方法,返回一個(gè)數(shù)組。call是調(diào)用一個(gè)對(duì)象的方法,以另外一個(gè)對(duì)象替換當(dāng)前對(duì)象。
var arg = Array.prototype.slice.call(arguments,0);
方法二:比方法一性能要差一點(diǎn),因?yàn)樗窍葎?chuàng)建一個(gè)數(shù)組,然后再進(jìn)行的
var arg = [].slice.call(arguments,0);
方法三:通過(guò)循環(huán)轉(zhuǎn)變成數(shù)組
function toArray(arguments){ var a = []; for(var i=0;i<arguments.length;i++){ a.unshift(arguments.[i]); } return a; }
caller
當(dāng)一個(gè)函數(shù)被另一個(gè)函數(shù)調(diào)用的時(shí)候,被調(diào)用的函數(shù)會(huì)自動(dòng)生成一個(gè)caller屬性,指向調(diào)用它的函數(shù)對(duì)象,如果函數(shù)未被調(diào)用,則caller為null。
function testCaller() { var caller = testCaller.caller; alert(caller); } function aCaller() { testCaller(); } aCaller();
彈出的是函數(shù)aCaller的內(nèi)容。
arguments.callee
arguments.callee指向正在運(yùn)行的函數(shù)自身,返回正被執(zhí)行的 Function 對(duì)象,也就是所指定的 Function 對(duì)象的正文。
注意:arguments.length是實(shí)參長(zhǎng)度,arguments.callee.length是形參長(zhǎng)度,通常用來(lái)判斷形參與實(shí)參長(zhǎng)度是否一致
通過(guò)arguments獲得函數(shù)的實(shí)參,通過(guò)arguments.callee獲得函數(shù)的形參。
在閉包中應(yīng)用的也比較廣泛。
var i = 0; function b(num) { if (num < 10) { num++; i++; //如果有參數(shù),callee也要把參數(shù)帶上; arguments.callee(num); } else { //輸出2次 alert("調(diào)用了"+i+"次callee!"); } } b(8); Arguments.callee在閉包中的應(yīng)用,它提供了一種遞歸調(diào)調(diào)用的功能。 //用arguments.callee計(jì)算10的階乘,例如: 1×2×3×4×5×6×7.... function c(x) { return x > 1 ? x * arguments.callee(x - 1) : 1 } (10); //輸出6 alert(c(3)); //輸出3628800 alert(c(10));
例:callee求1-n的和
function fn(n){ if(n==1) return n; else return n+arguments.callee(n-1); }
它可以讓一個(gè)匿名函數(shù)自己調(diào)用自己
例:
function list(type){ var result = "<"+type+"l><li>"; var args = Array.prototype.slice.call(arguments,1); result += args.join("</li><li>"); result += "</li></"+type+"l>"; return result; } var listHtml = list("o","one","two"); console.log(listHtml);
例2:面試題:下面的console.log結(jié)果是[1,2,3,4]的是?
function foo(x){ console.log(arguments); return x; } foo(1,2,3,4); function foo(x){ console.log(arguments); return x; }(1,2,3,4)
在預(yù)解釋的時(shí)候,function fn(){}(1);會(huì)被分開(kāi)處理,分成兩個(gè)函數(shù),第一個(gè)是function fn() {},而第二個(gè)則為匿名函數(shù):(1)。如果第二個(gè)不帶參數(shù),就會(huì)報(bào)錯(cuò),但是上面的函數(shù)包含在一個(gè)()里面,則是正確的。
(function fn(){ console.log(arguments); }(1,2,3,4)); (function foo(x){ console.log( arguments); return x; })(1,2,3,4) function foo(){ bar.apply(null,arguments); } function bar(x){ console.log(arguments); } foo(1,2,3,4);
- javascript內(nèi)置對(duì)象arguments詳解
- js arguments對(duì)象應(yīng)用介紹
- Javascript中arguments對(duì)象的詳解與使用方法
- Javascript中的arguments對(duì)象
- Javascript中arguments對(duì)象詳解
- JS中使用變量保存arguments對(duì)象的方法
- 跟我學(xué)習(xí)javascript的arguments對(duì)象
- JavaScript中如何通過(guò)arguments對(duì)象實(shí)現(xiàn)對(duì)象的重載
- Javascript學(xué)習(xí)筆記之函數(shù)篇(四):arguments 對(duì)象
- js中arguments對(duì)象的深入理解
相關(guān)文章
JavaScript函數(shù)表達(dá)式詳解及實(shí)例
這篇文章主要介紹了JavaScript函數(shù)表達(dá)式詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05javascript開(kāi)發(fā)技術(shù)大全 第2章 開(kāi)始JAVAScript之旅
1st JavaScript Editor ,除了有著色處,還有html標(biāo)簽、屬性、javascript事件、函數(shù),另外還可調(diào)用外部編輯來(lái)編輯網(wǎng)頁(yè),也可將常用瀏覽器內(nèi)置在窗口中。2011-07-07JavaScript fontcolor方法入門(mén)實(shí)例(按照指定的顏色來(lái)顯示字符串)
這篇文章主要介紹了JavaScript fontcolor方法入門(mén)實(shí)例,fontcolor方法用于按照指定的顏色來(lái)顯示字符串,需要的朋友可以參考下2014-10-10Javascript實(shí)現(xiàn)異步編程的過(guò)程
這篇內(nèi)容詳細(xì)分析了Javascript實(shí)現(xiàn)異步編程的過(guò)程以及原理解釋,對(duì)此知識(shí)點(diǎn)有興趣的朋友可以學(xué)習(xí)下。2018-06-06parentElement,srcElement的使用小結(jié)
本篇文章主要是對(duì)parentElement,srcElement的使用進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01如何讓頁(yè)面在打開(kāi)時(shí)自動(dòng)刷新一次讓圖片全部顯示
我的網(wǎng)頁(yè)的圖片較多,而服務(wù)器也不是很好,所以每次打開(kāi)網(wǎng)頁(yè)后總有一、兩幅圖片無(wú)法顯示,但刷新一遍后又全部可顯示了,這種問(wèn)題相信每個(gè)人都遇到過(guò),接下來(lái)介紹詳細(xì)解決方法2012-12-1230分鐘就入門(mén)的正則表達(dá)式基礎(chǔ)教程
30分鐘內(nèi)讓你明白正則表達(dá)式是什么,并對(duì)它有一些基本的了解,讓你可以在自己的程序或網(wǎng)頁(yè)里使用它。2013-02-02Javascript基礎(chǔ)_簡(jiǎn)單比較undefined和null 值
下面小編就為大家?guī)?lái)一篇Javascript基礎(chǔ)_簡(jiǎn)單比較undefined和null 值。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06JavaScript中setUTCFullYear()方法的使用簡(jiǎn)介
這篇文章主要介紹了JavaScript中setUTCFullYear()方法的使用簡(jiǎn)介,是JS入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06