1. 程式人生 > >類數組及其轉換

類數組及其轉換

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]

類數組及其轉換