點燈坊

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

使用 Array.of() 取代 Array.apply() 建立 Array

Sam Xiao's Avatar 2020-01-18

ECMAScript 5 原本使用 Array() 對 Array 初始化,而 ECMAScript 2015 迎來了 Array.of() 取代 Array()

Version

macOS Mojave 10.15.2
VS Code 1.41.1
Quokka 1.0.274
ECMAScript 2015

Array()

Array(1, 2, 3) // ?
Array(2) // ?

使用 ES5 的 Array() 用來建立 array 時,若是多 argument 代表 element;但若只有單一 argument 則代表 length,且建立出 sparse array,而非 undefined array。

of000

Array.apply()

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

這也導致使用 Array.apply() 時,若傳入 array 的 length 大於 1,則視為 element;但若 length 為 1,則視為 length 的尷尬。

of001

Array.of()

Array.of(1, 2, 3) // ?
Array.of(2) // ?

Array.of() 則沒此問題,所有 argument 都視為 element。

of002

Array.of.apply()

Array.of.apply(null, [1, 2, 3]); // ?
Array.of.apply(null, [2]); // ?

Array.of() 也使得 Array.of.apply() 趨於合理。

of003

Conclusion

  • 實務上若要由 element 建立 array,建議改用 ES6 的 Array.of(),可避免單一 argument 的尷尬
  • 若要由 length 建立 array,則使用 ES5 的 Array(),但別忘了所建立的是 sparse array,無法使用 Array.prototype 下的 method,建議改用 Array.from()

Reference

MDN, Array.of()