深入解析JavaScript中的arguments對(duì)象
arguments定義
所有的函數(shù)都有一個(gè)自己的arguments對(duì)象,用來儲(chǔ)存它實(shí)際接受到的參數(shù),而不局限于函數(shù)聲明時(shí)所定義的參數(shù)列表。它不是數(shù)組卻類似數(shù)組,具有數(shù)組一樣的訪問性質(zhì)及方式,可以由arguments[n]來訪問對(duì)應(yīng)的單個(gè)參數(shù)的值,并擁有數(shù)組長度屬性length。但是卻不具有數(shù)組的一些方法。可以通過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)置的類型可以通過prototype找到內(nèi)置的屬性方法,Array.prototype.slice就是訪問Array的內(nèi)置方法slice。通過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);
方法三:通過循環(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í)參長度,arguments.callee.length是形參長度,通常用來判斷形參與實(shí)參長度是否一致
通過arguments獲得函數(shù)的實(shí)參,通過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ì)被分開處理,分成兩個(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中如何通過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-05
javascript開發(fā)技術(shù)大全 第2章 開始JAVAScript之旅
1st JavaScript Editor ,除了有著色處,還有html標(biāo)簽、屬性、javascript事件、函數(shù),另外還可調(diào)用外部編輯來編輯網(wǎng)頁,也可將常用瀏覽器內(nèi)置在窗口中。2011-07-07
JavaScript fontcolor方法入門實(shí)例(按照指定的顏色來顯示字符串)
這篇文章主要介紹了JavaScript fontcolor方法入門實(shí)例,fontcolor方法用于按照指定的顏色來顯示字符串,需要的朋友可以參考下2014-10-10
Javascript實(shí)現(xiàn)異步編程的過程
這篇內(nèi)容詳細(xì)分析了Javascript實(shí)現(xiàn)異步編程的過程以及原理解釋,對(duì)此知識(shí)點(diǎn)有興趣的朋友可以學(xué)習(xí)下。2018-06-06
parentElement,srcElement的使用小結(jié)
本篇文章主要是對(duì)parentElement,srcElement的使用進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01
如何讓頁面在打開時(shí)自動(dòng)刷新一次讓圖片全部顯示
我的網(wǎng)頁的圖片較多,而服務(wù)器也不是很好,所以每次打開網(wǎng)頁后總有一、兩幅圖片無法顯示,但刷新一遍后又全部可顯示了,這種問題相信每個(gè)人都遇到過,接下來介紹詳細(xì)解決方法2012-12-12
Javascript基礎(chǔ)_簡(jiǎn)單比較undefined和null 值
下面小編就為大家?guī)硪黄狫avascript基礎(chǔ)_簡(jiǎn)單比較undefined和null 值。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06
JavaScript中setUTCFullYear()方法的使用簡(jiǎn)介
這篇文章主要介紹了JavaScript中setUTCFullYear()方法的使用簡(jiǎn)介,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06

