Javascript學(xué)習(xí)筆記之函數(shù)篇(四):arguments 對(duì)象
每一個(gè) Javascript 函數(shù)都能在自己作用域內(nèi)訪問(wèn)一個(gè)特殊的變量 - arguments。這個(gè)變量含有一個(gè)傳遞給函數(shù)的所有參數(shù)的列表。
arguments 對(duì)象不是一個(gè)數(shù)組。盡管在語(yǔ)法上它跟數(shù)組有相同的地方,例如它擁有 length 屬性。但它并不是從 Array.prototype 繼承而來(lái),實(shí)際上,它就是一個(gè)對(duì)象。
因此,我們不能直接對(duì) arguments 使用一些數(shù)組的方法,例如 push, pop 或 slice 等。 所以為了使用這些方法,我們就需要將其轉(zhuǎn)換為一個(gè)真正的數(shù)組。
轉(zhuǎn)化為數(shù)組
下面的代碼將會(huì)返回一個(gè)包含 arguments 對(duì)象所有元素的數(shù)組。
Array.prototype.slice.call(arguments);
由于轉(zhuǎn)化的速度很慢,所以在性能要求嚴(yán)格的程序中不建議這樣做。
傳遞參數(shù)
下面是一種比較推薦的方法,將 arguments 對(duì)象從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù)。
function foo() {
bar.apply(null, arguments);
}
function bar(a, b, c) {
// do stuff here
}
另外還有一個(gè)比較巧妙的方法,就是同時(shí)使用 call 和 apply 快速創(chuàng)建一個(gè)解綁的外層方法。
function Foo() {}
Foo.prototype.method = function(a, b, c) {
console.log(this, a, b, c);
};
// Create an unbound version of "method"
// It takes the parameters: this, arg1, arg2...argN
Foo.method = function() {
// Result: Foo.prototype.method.call(this, arg1, arg2... argN)
Function.call.apply(Foo.prototype.method, arguments);
};
函數(shù)形參和 arguments 屬性的關(guān)系
arguments 對(duì)象為它自身屬性和函數(shù)的形參都創(chuàng)建了 getter 和 setter 方法。
因此,修改函數(shù)的形參會(huì)影響對(duì)應(yīng)的 arguments 對(duì)象的屬性值,反之亦然。
function foo(a, b, c) {
arguments[0] = 2;
a; // 2
b = 4;
arguments[1]; // 4
var d = c;
d = 9;
c; // 3
}
foo(1, 2, 3);
性能問(wèn)題
arguments 只在兩種情況下不會(huì)被創(chuàng)建,一是在函數(shù)內(nèi)部被聲明為局部變量,二是當(dāng)做函數(shù)的形參。其他情況,arguments 對(duì)象總是會(huì)被創(chuàng)建。
由于 getter 和 setter 方法總是會(huì)隨著 arguments 對(duì)象的創(chuàng)建而創(chuàng)建,因此使用 arguments 對(duì)性能本身幾乎沒(méi)有影響。
然而,有一種情形會(huì)嚴(yán)重影響 Javascript 的性能,那就是使用 arguments.callee。
function foo() {
arguments.callee; // do something with this function object
arguments.callee.caller; // and the calling function object
}
function bigLoop() {
for(var i = 0; i < 100000; i++) {
foo(); // Would normally be inlined...
}
}
在上述代碼中,foo 函數(shù)不再是一個(gè)簡(jiǎn)單的內(nèi)聯(lián)擴(kuò)展,因?yàn)樗枰浪陨硪约八恼{(diào)用者(caller)。這不僅抵消了內(nèi)聯(lián)擴(kuò)展所帶來(lái)的性能提升,同時(shí)也破壞了函數(shù)的封裝性,因?yàn)楹瘮?shù)本身可能需要依賴于一個(gè)特定的調(diào)用背景。
因此,建議大家盡量不要使用 arguments.callee。
以上就是關(guān)于Javascript arguments 對(duì)象的全部?jī)?nèi)容了,小伙伴們是否了解透徹呢,簡(jiǎn)單的說(shuō)
arguments指函數(shù)的參數(shù)對(duì)象(指實(shí)際傳入的參數(shù))
arguments.length指函數(shù)的參數(shù)對(duì)象的長(zhǎng)度
arguments[i]指第i個(gè)參數(shù)的值(第一個(gè)為0)
- javascript內(nèi)置對(duì)象arguments詳解
- js arguments對(duì)象應(yīng)用介紹
- Javascript中arguments對(duì)象的詳解與使用方法
- Javascript中的arguments對(duì)象
- Javascript中arguments對(duì)象詳解
- JS中使用變量保存arguments對(duì)象的方法
- 深入解析JavaScript中的arguments對(duì)象
- 跟我學(xué)習(xí)javascript的arguments對(duì)象
- JavaScript中如何通過(guò)arguments對(duì)象實(shí)現(xiàn)對(duì)象的重載
- js中arguments對(duì)象的深入理解
相關(guān)文章
淺談javascript基礎(chǔ)之客戶端事件驅(qū)動(dòng)
下面小編就為大家?guī)?lái)一篇淺談javascript基礎(chǔ)之客戶端事件驅(qū)動(dòng)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06Javascript學(xué)習(xí)筆記1 數(shù)據(jù)類型
在Javascript中只有五種簡(jiǎn)單類型,分別為null,undefined,boolean,String和Number.一種復(fù)雜類型:object。2010-01-01javascript與java有什么關(guān)系(區(qū)別與相似)
Java和JavaScript的編程語(yǔ)言,名稱聽起來(lái)相似,但卻是兩個(gè)公司開發(fā)的不同的產(chǎn)品。Java是SUN公司推出的新一代面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,特別適合于Internet應(yīng)用程序開發(fā);而JavaScript是Netscape公司的產(chǎn)品,可以嵌入Web頁(yè)面中的基于對(duì)象和事件驅(qū)動(dòng)的解釋性語(yǔ)言。2023-02-02javascript內(nèi)置對(duì)象arguments詳解
這篇文章主要介紹了javascript內(nèi)置對(duì)象arguments,實(shí)例講解arguments是什么怎么用,需要的朋友可以參考下2014-03-03現(xiàn)如今最流行的JavaScript代碼規(guī)范
流行的雖然不一定是好的,但是從交流的角度來(lái)說(shuō),按照流行的風(fēng)格編寫代碼,可以讓你的代碼在大多數(shù)人看起來(lái)更習(xí)慣2014-03-03JS?數(shù)組sort方法的升序?yàn)槭裁词莂-b你知道嗎
這篇文章主要為大家詳細(xì)介紹了JS?數(shù)組sort方法為什么升序是a-b,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02