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()轉成陣列才可以。