類數組及其轉換
阿新 • • 發佈:2018-06-23
html div sym 創建 AS dem 接受 它的 console
什麽是類數組
? 寬泛點講,一個具有length屬性的對象就是類數組,但類數組顧名思義它只是像數組但又不是數組,所以它往往不具備數組自帶的方法,如forEach()
, push()
, shift()
等等
? 在JavaScript的世界裏有許許多多的類數組,如NodeList
, HTMLCollection
, NameNodeMap
, DOMTokenList
,還有函數中的arguments
...它們都是具有length的對象
類數組轉化成數組
? 上面說了類數組只是長得像數組但不具備好些數組所具有的方法,因此操作起來並不方便因此我們可以將他們轉化為數組
// ES3,5
Array.prototype .slice.call(arrlike) //or apply
Array.apply(null, arrlike) // apply的第二個參數接受一個數組或者類數組
// ES6
Array.from(arrlike)
[...arrlike] // 前提是這個arrlike得具備叠代器接口[Symbol.iterator]。而以上三種有length即可
? 之前說了類數組是具有length屬性的對象,其實這樣定義並不確切。因為還有裏面有要需要註意的地方,數組是以數值作為下標的,但是按照之前的定義類數組只是有length屬性的話其實看起來不像是數組,它的屬性有可能不是數值形式的字符串。當然數組也是可以定義非數值類型的字符串作為屬性的,畢竟數組本身也是對象,但是它的主要還是以數值下標的形式來存儲數據,且那些屬性並不被計入length中
? 因此類數組在轉化為數組的時候,如果對象中的屬性並不是數值形式的字符串,或者數值要大於等於length,對應的數據都是不會被存儲到創建的數組中的
空缺的是以undefined填充而不是empty空單元
const arrlike1 = { 0: ‘a‘, 1: ‘b‘, ‘2‘: ‘c‘, length: 3 }
console.log(Array.from(arrlike1)) // [‘a‘, ‘b‘, ‘c‘]
const arrlike2 = { 0: ‘a‘, ‘a‘: ‘b‘, ‘2‘: ‘c‘, length: 3 }
console.log(Array.from(arrlike2)) // [‘a‘, undefined , ‘c‘]
const arrlike3 = { 1: ‘a‘, length: 1 }
console.log(Array.from(arrlike3)) // [undefined]
類數組及其轉換