深入解析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ì)被分開處理,分成兩個(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 入門·JavaScript 具有全范圍的運(yùn)算符
JavaScript 入門·JavaScript 具有全范圍的運(yùn)算符...2007-10-10
Javascript實(shí)例教程(19) 使用HoTMetal(5)
Javascript實(shí)例教程(19) 使用HoTMetal(5)...2006-12-12
JavaScript展開操作符(Spread operator)詳解
在本篇文章里小編給大家整理的是關(guān)于JavaScript展開操作符(Spread operator)的詳細(xì)介紹以及用法,需要的讀者們參考下。2019-07-07
JavaScript全局函數(shù)使用簡(jiǎn)單說(shuō)明
JavaScript下比較常用的一些字符處理等函數(shù),學(xué)習(xí)js的朋友經(jīng)常用得到。2011-03-03
javascript 數(shù)組的正態(tài)分布排序的問(wèn)題
這篇文章主要介紹了javascript 數(shù)組的正態(tài)分布排序的問(wèn)題的相關(guān)資料,需要的朋友可以參考下2016-07-07
淺談javascript中onbeforeunload與onunload事件
javascript中onbeforeunload與onunload事件就是頁(yè)面加載前與頁(yè)面關(guān)閉時(shí)的兩個(gè)功能的函數(shù),可以防止頁(yè)面刷新時(shí)給提示再刷新或頁(yè)面關(guān)閉時(shí)給出提示,下面我來(lái)介紹onbeforeunload與onunload事件用法。2015-12-12
javascript真的不難-回顧一下基礎(chǔ)知識(shí)
先來(lái)學(xué)習(xí)一下Javascript語(yǔ)言中的基礎(chǔ)知識(shí)問(wèn)題其時(shí)對(duì)于每種編程語(yǔ)言來(lái)說(shuō)基礎(chǔ)知識(shí)都是大同小異的,對(duì)變量,函數(shù),條件語(yǔ)句塊,循環(huán)語(yǔ)句塊等等,本文簡(jiǎn)要介紹一下,感興趣的朋友可以了解下2013-01-01

