Array.prototype
並沒有 apply()
,所以 Array.apply()
是來自於 Function.prototype.apply()
,且 Array.apply()
有一些特殊性質。
Array Function
new Array(1, 2, 3) // ?
Array(1, 2, 3) // ?
若要提供 array 初始值,可在 array constructor 直接提供值,或使用 array function 亦可。
Array.apply()
Array.apply(null, [1, 2, 3]) // ?
Array(1, 2, 3) // ?
既然 Array()
是 function,就能使用 Function.prototype.apply()
,原本 argument list 改由 array 提供,第一個 argument 為 this
,因為沒使用,提供 null
即可。
其實 Array.apply(null, [1, 2, 3])
等效於 Array(1, 2, 3)
Array.apply(null, [2]) // ?
Array(2) // ?
若 Array()
只提供一個 argument,就不再是初始值,而是 length,產生 length 為 2
的 spare array,有 hole。
Array.apply(null, Array(3)) // ?
Array(3) // ?
若將 sparse array 透過 Array.apply()
,則從 sparse array 轉成 undefined array。
Array.apply(null, Array(3)).map(x => 2) // ?
Array(3).map(x => 2) // ?
Undefined array 與 sparse array 有什麼差別呢 ?
- Undefined array 可使用
Array.prototype
下的 method - Sparse array 無法使用
Array.prototype
下的 method,因為會跳過 hole 不執行
Conclusion
Array.apply()
只提供一個 argument 時,相當於 length,而非初始值Array.apply()
可將 empty array 轉成 undefined array,方便繼續使用Array.prototype
其他 method