點燈坊

失くすものさえない今が強くなるチャンスよ

使用 Array.apply() 建立 Array

Sam Xiao's Avatar 2020-01-16

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 亦可。

apply000

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)

apply001

Array.apply(null, [2]) // ?

Array(2) // ?

Array() 只提供一個 argument,就不再是初始值,而是 length,產生 length 為 2 的 spare array,有 hole。

apply002

Array.apply(null, Array(3)) // ?

Array(3) // ?

若將 sparse array 透過 Array.apply(),則從 sparse array 轉成 undefined array。

apply003

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 不執行

apply005

Conclusion

  • Array.apply() 只提供一個 argument 時,相當於 length,而非初始值
  • Array.apply() 可將 empty array 轉成 undefined array,方便繼續使用 Array.prototype 其他 method

Reference

MDN, Array.from()
MDN, Function.prototype.apply()