函式中的 arguments 物件與 Array-like Object

Deja vu.

關於 arguments 物件

每一個 function 執行的時候都會被傳入一個 arguments 引數,它會儲存一些跟引數有關的資訊:

1
2
3
4
5
function add(a, b) {
console.log(arguments)
console.log(arguments[0] + arguments[1])
}
add(1, 10)

輸出:

1
2
[Arguments] { '0': 1, '1': 3 }
11

關於 Array-like Object

不知道在剛剛你有沒有注意到 arguments 其實是一個「物件」,而不是陣列(儘管看起來很像)。

arguments 還有其他的屬性,像是:

  1. callee 被 call 的 function 自己
  2. caller 誰(哪個物件)call 這個 function 的?
  3. length

然後你仔細想想看,如果要你用「陣列」來實作 arguments 這個東西,應該會碰到一點問題:

1
2
3
4
5
6
7
8
9
10
var arguments = [
'0': argument1
'1': argument2

....

'length',
'caller',
'callee'
]

卡住了吧?因為聰明的你也知道陣列只能指定 value,沒辦法像物件一樣同時指定 keyvalue

即便 arguments 讓你可以用 arguments[n] 來存取引數,但為了儲存那些其他的資訊,還是只能用「物件」來實作,只是讓它感覺很像陣列罷了。

這種長的很像陣列的物件就稱作「Array-like Object」(還真是有夠人性化的取名方式)

Array-like-object 的特性

  1. 可以用 for...of 來取值(因為 iterable)
  2. 不可以用 Array 的內建方法,例如 map()。必須先用 Array.from() 轉成陣列才可以。
mentor-program-day08 函式填空法
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×