js的arguments是什麼?

2021-08-30 11:12:54 字數 2768 閱讀 2829

類陣列物件:arguments

總所周知,js是一門相當靈活的語言。當我們在js中在呼叫乙個函式的時候,我們經常會給這個函式傳遞一些引數,js把傳入到這個函式的全部引數儲存在乙個叫做arguments的東西裡面,那麼這到底是什麼東西?

在js中萬物皆物件,甚至陣列字串函式都是物件。所以這個叫做arguments的東西也是個物件,而且是乙個特殊的物件,它的屬性名是按照傳入引數的序列來的,第1個引數的屬性名是』0』,第2個引數的屬性名是』1』,以此類推,並且它還有length屬性,儲存的是當前傳入函式引數的個數,很多時候我們把這種物件叫做類陣列物件。類陣列物件和陣列都是物件這個媽生的,但是陣列是大哥比類陣列物件多了很多其他的玩具(方法),類陣列物件只是長得很像陣列的弟弟而已。

慢著,剛剛不是說陣列也是物件嗎,現在這個類陣列物件又是什麼? 沒辦法,js就是這麼的靈活。這個類陣列物件不僅儲存給函式傳入的引數,也具有一些其他的屬性,等下會一一道來。

因為類陣列物件和陣列有很多的共性,所以我們經常可以用call方法,讓類陣列物件也使用的陣列的一些方法,就是讓這個弟弟去玩哥哥的玩具,比如……,還是不扯遠了,這篇文章只是說什麼是arguments,想知道更多關於物件如何借調陣列方法的話,請參考這篇文章。

arguments的屬性

接下來我們來看看arguments物件裡面到底有些什麼東西,是騾子是馬拉出來溜溜。

function showargs() 

showargs(1,2,3,4,5);

下面我們用console.log的方式,將arguments物件輸出到控制台,這裡不得不說一句,chrome的console工具好用得不得了(我不是來打廣告的)。

這裡我們可以看到arguments物件將我傳入的五個引數以陣列的形式儲存在裡面,還有儲存了我傳入函式的實參的個數(length)。而且我們可以看到arguments物件的 _ proto _ 是指向object的,這也說明了他是個類陣列物件,而不是乙個陣列。

有了這個物件我們以後寫函式的時候,就不用給所有的形參指定引數名,然後通過引數名的方式獲取引數了,我們可以直接使用arguments物件來獲取實參,這樣是不是方便了很多呢。

有些語言在我們給函式指定了引數名之後,當呼叫函式時,會判斷當前傳入的引數是否與函式定義的引數個數相等,不相等就會報錯,但是靈活的js(不是我說,js是真的靈活)並不會驗證傳遞給函式的引數個數是否等於函式定義的引數個數。所以為了裝逼(**的簡潔度),我們使用arguments呼叫引數可以不混淆不同函式之間的引數名。另外為了裝逼(**的嚴整度),我們也能用arguments來判斷當前傳入引數的個數是否與我們需要的數量一致。

下面舉個栗子:

最後我們還可以看到arguments還有乙個叫做callee的屬性,這個屬性是表示的是當前函式的乙個引用,簡單點說,這個屬性裡面儲存的我們呼叫的這個函式的**,實在無法理解的時候,又到了console.log大顯身手的時候了。

看到結果的你是不是和我一樣驚呆了呢,這不就是我寫的**嗎,arguments.callee完完整整的把這個函式的這段**返回了。

arguments的一些妙用

1.利用arguments實現方法的過載

下面我們利用arguments物件來實現乙個引數相加的函式,不論傳入多少引數都行,將傳入的引數相加後返回。

function add() 

return sum;

}console.log( add(1,2,3) ); //6

console.log( add(1,3) ); //4

console.log( add(1,2,3,5,6,2,7) ); //26

由於js是一種弱型別的語言,沒有過載機制,當我們重寫函式時,會將原來的函式直接覆蓋,這裡我們能利用arguments,來判斷傳入的實參型別與數量進行不同的操作,然後返回不同的數值。

2.利用arguments.callee實現遞迴

先來看看之前我們是怎麼實現遞迴的,這是乙個結算階乘的函式

function factorial(num) else  

}

但是當這個函式變成了乙個匿名函式時,我們就可以利用callee來遞迴這個函式。

function factorial(num) else  

}

這個方法雖然好用,但是有一點值得注意,ecmascript4中為了限制js的靈活度,讓js變得嚴格,新增了嚴格模式,在嚴格模式中我們被禁止不使用var來直接宣告乙個全域性變數,當然這不是重點,重點是arguments.callee這個屬性也被禁止了。不過這都不是事兒,es6為我們新增了很多好用的變數宣告方式和新的語法糖,作為乙個時髦的前端,我們趕緊學習一些es6的新語法吧。

js的arguments到底是什麼

類陣列物件 arguments 總所周知,js是一門相當靈活的語言。當我們在js中在呼叫乙個函式的時候,我們經常會給這個函式傳遞一些引數,js把傳入到這個函式的全部引數儲存在乙個叫做arguments的東西裡面,那麼這到底是什麼東西?在js中萬物皆物件,甚至陣列字串函式都是物件。所以這個叫做argu...

js的arguments到底是什麼?

總所周知,js是一門相當靈活的語言。當我們在js中在呼叫乙個函式的時候,我們經常會給這個函式傳遞一些引數,js把傳入到這個函式的全部引數儲存在乙個叫做arguments的東西裡面,那麼這到底是什麼東西?在js中萬物皆物件,甚至陣列字串函式都是物件。所以這個叫做arguments的東西也是個物件,而且...

js中arguments到底是什麼?

總所周知,js是一門相當靈活的語言。當我們在js中在呼叫乙個函式的時候,我們經常會給這個函式傳遞一些引數,js把傳入到這個函式的全部引數儲存在乙個叫做arguments的東西裡面,那麼這到底是什麼東西?在js中萬物皆物件,甚至陣列字串函式都是物件。所以這個叫做arguments的東西也是個物件,而且...