Deja vu.
關於 arguments 物件
每一個 function 執行的時候都會被傳入一個 arguments
引數,它會儲存一些跟引數有關的資訊:
1 | function add(a, b) { |
輸出:
1 | [Arguments] { '0': 1, '1': 3 } |
關於 Array-like Object
不知道在剛剛你有沒有注意到 arguments
其實是一個「物件」,而不是陣列(儘管看起來很像)。
arguments
還有其他的屬性,像是:
callee
被 call 的 function 自己caller
誰(哪個物件)call 這個 function 的?length
然後你仔細想想看,如果要你用「陣列」來實作 arguments 這個東西,應該會碰到一點問題:
1 | var arguments = [ |
卡住了吧?因為聰明的你也知道陣列只能指定 value
,沒辦法像物件一樣同時指定 key
跟 value
。
即便 arguments
讓你可以用 arguments[n]
來存取引數,但為了儲存那些其他的資訊,還是只能用「物件」來實作,只是讓它感覺很像陣列罷了。
這種長的很像陣列的物件就稱作「Array-like Object」(還真是有夠人性化的取名方式)
Array-like-object 的特性
- 可以用
for...of
來取值(因為 iterable) - 不可以用 Array 的內建方法,例如
map()
。必須先用Array.from()
轉成陣列才可以。