javascript arguments對(duì)象的用法:1、獲取實(shí)參和形參的個(gè)數(shù);2、修改實(shí)參值;3、改變實(shí)參的個(gè)數(shù);4、檢測(cè)用戶(hù)傳遞的參數(shù)是否符合要求;5、函數(shù)的參數(shù)個(gè)數(shù)不確定時(shí),用于訪(fǎng)問(wèn)調(diào)用函數(shù)的實(shí)參值;6、遍歷或訪(fǎng)問(wèn)實(shí)參的值。
本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。
arguments 對(duì)象表示函數(shù)的實(shí)參集合,僅能夠在函數(shù)體內(nèi)可見(jiàn),并可以直接訪(fǎng)問(wèn)。
arguments 對(duì)象的 length 屬性和 callee 屬性最為常用:
-
使用 length 屬性可以獲取函數(shù)的實(shí)參個(gè)數(shù)。arguments 對(duì)象只能在函數(shù)體內(nèi)可見(jiàn),因此 arguments.length 也只能在函數(shù)體內(nèi)使用。
-
使用 callee 屬性可以引用當(dāng)前 arguments 對(duì)象所在的函數(shù)。使用 callee 屬性可以在函數(shù)體內(nèi)調(diào)用函數(shù)自身。在匿名函數(shù)中,callee 屬性比較有用。例如,利用它可以設(shè)計(jì)遞歸調(diào)用。
示例1:獲取實(shí)參和形參的個(gè)數(shù)
使用 arguments.length 屬性可以獲取函數(shù)的實(shí)參個(gè)數(shù)。使用函數(shù)對(duì)象的 length 屬性可以獲取函數(shù)的形參個(gè)數(shù),該屬性為只讀屬性,在函數(shù)體內(nèi)、體外都可以使用。
下面示例設(shè)計(jì)一個(gè) checkArg() 函數(shù),用來(lái)檢測(cè)一個(gè)函數(shù)的形參和實(shí)參是否一致,如果不一致則拋出異常。
function checkArg(a) { //檢測(cè)函數(shù)實(shí)參與形參是否一致 if (a.length != a.callee.length) //如果實(shí)參與形參個(gè)數(shù)不同,則拋出錯(cuò)誤 throw new Error("實(shí)參和形參不一致"); } function f(a, b) { //求兩個(gè)數(shù)的平均值 checkArg(arguments); //根據(jù)arguments來(lái)檢測(cè)函數(shù)實(shí)參和形參是否一致 return ((a * 1 ? a : 0) + (b * 1 ? b : 0)) / 2; //返回平均值 } console.log(f(6)); //拋出異常。調(diào)用函數(shù)f,傳入一個(gè)參數(shù)
示例2:在函數(shù)內(nèi)部修改實(shí)參的值
在下面示例中使用 for 循環(huán)遍歷 arguments 對(duì)象,然后把循環(huán)變量的值傳入 arguments,以便于改變實(shí)參值。
function f() { for (var i = 0; i < arguments.length; i++) { //遍歷arguments對(duì)象 arguments[i] = i; //修改每個(gè)實(shí)參的值 console.log(arguments[i]); //提示修改的實(shí)參值 } } f(3, 3, 6); //返回提示0、1、2,而不是3、3、6
示例3:改變函數(shù)實(shí)參的個(gè)數(shù)
通過(guò)修改 length 屬性值,也可以改變函數(shù)的實(shí)參個(gè)數(shù)。當(dāng) length 屬性值增大時(shí),則增加的實(shí)參值為 undefined;如果 length 屬性值減小,則會(huì)丟棄 length 長(zhǎng)度值之后的實(shí)參值。
function f() { arguments.length = 2; //修改arguments屬性對(duì)象的length屬性值 for (var i = 0; i < arguments.length; i ++) { console.log(arguments[i]); } } f(3, 3, 6); //返回提示3、3
示例4:檢測(cè)用戶(hù)傳遞的參數(shù)是否符合要求
在下面示例中,使用 arguments.callee 獲取匿名函數(shù),然后通過(guò)函數(shù)的 length 屬性獲取函數(shù)形參個(gè)數(shù),最后比較實(shí)參個(gè)數(shù)與形參個(gè)數(shù),以檢測(cè)用戶(hù)傳遞的參數(shù)是否符合要求。
function f(x,y,z) { var a = arguments.length(); //獲取函數(shù)實(shí)參的個(gè)數(shù) var b = arguments.callee.length; //獲取函數(shù)形參的個(gè)數(shù) if (a != b_ { //如果實(shí)參和形參個(gè)數(shù)不相等,則提示錯(cuò)誤信息 throw new Error("傳遞的參數(shù)不匹配"); }else { //如果實(shí)參和形參個(gè)數(shù)相同,則返回它們的和 return x + y + z; } } console.log(f(3,4,5)); //返回值12
arguments.callee 等價(jià)于函數(shù)名,在上面示例中,arguments.callee 等于 f。
arguments 對(duì)象的應(yīng)用
在實(shí)際開(kāi)發(fā)中,arguments 對(duì)象非常有用。靈活使用 arguments 對(duì)象,可以提升使用函數(shù)的靈活性,增強(qiáng)函數(shù)在抽象編程中的適應(yīng)能力和糾錯(cuò)能力。下面結(jié)合幾個(gè)典型示例展示 arguments 的應(yīng)用。
1) 使用 arguments 對(duì)象能夠增強(qiáng)函數(shù)應(yīng)用的靈活性。例如,如果函數(shù)的參數(shù)個(gè)數(shù)不確定,或者函數(shù)的參數(shù)個(gè)數(shù)很多,而又不想逐一定義每一個(gè)形參,則可以省略定義參數(shù),直接在函數(shù)體內(nèi)使用 arguments 對(duì)象來(lái)訪(fǎng)問(wèn)調(diào)用函數(shù)的實(shí)參值。
示例1
下面示例定義一個(gè)求平均值的函數(shù),該函數(shù)借助 arguments 對(duì)象來(lái)計(jì)算參數(shù)的平均值。在調(diào)用函數(shù)時(shí),可以傳入任意多個(gè)參數(shù)。
function avg() { //求平均值 var num = 0, 1 = 0; //聲明并初始化臨時(shí)變量 for (var i = 0; i < arguments.length; i ++) { //遍歷所有實(shí)參 if (typeof arguments[i] != "number") //如果參數(shù)不是數(shù)值 continue; //則忽略該參數(shù)值 num += arguments[i]; //計(jì)算參數(shù)的數(shù)值之和 1 ++; //計(jì)算參與和運(yùn)算的參數(shù)個(gè)數(shù) } num /= 1; //求平均值 return num; //返回平均值 } console.log(avg(1,2,3,4)); //返回2.5 console.log(avg(1,2,"3",4)); //返回2.3333333333333335
示例2
在頁(yè)面設(shè)計(jì)中經(jīng)常需要驗(yàn)證表單輸入值,下面示例檢測(cè)文本框輸入的值是否為合法的郵箱地址。
function isEmail() { if (arguments.length > 1) throw new Error("只能夠傳遞一個(gè)參數(shù)"); //檢測(cè)參數(shù)個(gè)數(shù) var regexp = /^w+((-w+) | (.w+)) *@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)8.[A-Za-z0-9]+$/; //定義正則表達(dá)式 if (arguments[0].search(regexp) != -1) //匹配實(shí)參的值 return true; //如果匹配則返回true else return false; //如果不匹配則返回false } var email = "1798017447@qq.com"; //聲明并初始化郵箱地址字符串 console.log(isEmail(email)); //返回true
2) arguments 對(duì)象是偽類(lèi)數(shù)組,不是數(shù)組,可以通過(guò) length 屬性和中括號(hào)語(yǔ)法來(lái)遍歷或訪(fǎng)問(wèn)實(shí)參的值。不過(guò),通過(guò)動(dòng)態(tài)調(diào)用的方法,也可以使用數(shù)組的方法,如 push、pop、slice 等。
示例3
使用 arguments 可以模擬重載。實(shí)現(xiàn)方法:通過(guò) arguments.length 屬性值判斷實(shí)際參數(shù)的個(gè)數(shù)和類(lèi)型,決定執(zhí)行不同的代碼。
function sayHello() { switch(arguments.length) { case 0 : return "Hello"; case 1 : return "Hello, " + arguments[0]; case 2 : return (arguments[1] == "cn" ? "你好, " : "Hello, ") + arguments[0]; }; } console.log(sayHello()); //"Hello" console.log(sayHello("Alex")); //"Hello,Alex" console.log(sayHello("Alex", "vn")); //"你好,Alex"
示例4
下面示例使用動(dòng)態(tài)調(diào)用的方法,讓 arguments 對(duì)象調(diào)用數(shù)組方法 slice(),可以把函數(shù)的參數(shù)對(duì)象轉(zhuǎn)換為數(shù)組。
function f() { return [].slice.apply(arguments); } console.log(f(1,2,3,4,5,6)); //返回[1,2,3,4,5,6]
【推薦學(xué)習(xí):javascript高級(jí)教程】