JS之類數(shù)組對(duì)象以及轉(zhuǎn)換方法大全


什么是類數(shù)組對(duì)象

有l(wèi)ength屬性和若干索引屬性的對(duì)象。

var array = ['name', 'age', 'sex'];

var arrayLike = {
    0: 'name',
    1: 'age',
    2: 'sex',
    length: 3
}

為什么叫類數(shù)組

類數(shù)組對(duì)象可以執(zhí)行一些常見的數(shù)組操作,比如讀寫數(shù)據(jù)、獲取長(zhǎng)度(length屬性)、遍歷

  • 讀寫
array[0]   //name
arrayLike[0] //name

array[0] = "Jona";   //Jona age sex
arrayLike[0] = "Jonason";  // 0 : Jonason
  • 獲取長(zhǎng)度
array.length //3
arrayLike.length // 3
  • 遍歷
for(let i=0;i<arrayLike.length;i++)
console.log(arrayLike[i]);
// name age sex

雖稱為類數(shù)組但是他不是真正的數(shù)組,因此直接調(diào)用數(shù)組的方法會(huì)報(bào)錯(cuò)。
可以通過Function.call來間接調(diào)用。

Array.prototype.slice.call(arguments);

類數(shù)組轉(zhuǎn)換為數(shù)組

  • call + 多個(gè)數(shù)組方法實(shí)現(xiàn)
[].slice.call(arrayLike)
[].splice.call(arraayLike)
[].map.call(arrayLike,(item)=>{return item})
[].filter.call(arrayLike,(item)=>{return item})
[].forEach.call(arrayLike.(item)=>{arr.push(item)}) //創(chuàng)建一個(gè)數(shù)組
[].reduce.call(arrayLike,(pre,cur)=>{return pre.concat(cur)},[]);
//([].reduceRight.call(arrayLike,(pre,cur)=>{return pre.concat(cur)},[])).reverse();  
//本想通過這樣實(shí)現(xiàn),不過這種方法是從后往前遍歷,
//如果Length屬性放到arrayList最后面,就無法正常轉(zhuǎn)換出來
  • apply + concat
[].concat.apply([],arguments); //注意空數(shù)組的位置
  • ES6中的Array.from()方法。

Array.from()方法可以接受一個(gè)可迭代對(duì)象或類數(shù)組對(duì)象作為第一個(gè)參數(shù),返回一個(gè)數(shù)組。如果想對(duì)類數(shù)組對(duì)象有進(jìn)一步的操作,可以在from()方法中傳入一個(gè)映射函數(shù)作為第二個(gè)參數(shù)。

Array.from(arguments);
  • ES6展開運(yùn)算符...
let arr = [...arguments]

這里要特別注意: 展開運(yùn)算符只能用于可迭代對(duì)象,對(duì)于arguments,nodelist這樣的內(nèi)置iterator接口的可以用這種方式,類似arrayLike的對(duì)象,需要給Symbol.iterator屬性添加一個(gè)生成器,就可以變成一個(gè)可迭代對(duì)象。

var arrayLike = {
    0:"name",
    1:"age",
    2:"gender",
    *[Symbol.iterator]() {
        yield arrayLike[0];
        yield arrayLike[1];
        yield arrayLike[2];
    }
}

這樣通過[...arrayLike]就可以獲得一個(gè)數(shù)組了

常見的類數(shù)組對(duì)象

  • arguments
  • nodeList

NodeList中擁有默認(rèn)的迭代器,其行為與數(shù)組的默認(rèn)迭代器相同,即使用的是內(nèi)置的values()迭代器

  • HTMLCollection

參考

JavaScript深入之類數(shù)組對(duì)象與arguments

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • { "Unterminated string literal.": "未終止的字符串文本。", "Identifi...
    Elbert_Z閱讀 11,004評(píng)論 0 2
  • Iterator(遍歷器)的概念 JavaScript原有的表示“集合”的數(shù)據(jù)結(jié)構(gòu),主要是數(shù)組(Array)和對(duì)象...
    呼呼哥閱讀 4,545評(píng)論 0 2
  • ECMAScript6(ES6)基礎(chǔ)知識(shí)及核心原理 使用Babel編譯ES6 一、下載安裝Babel環(huán)境:需要電腦...
    田成力閱讀 422評(píng)論 0 0
  • 一、Iterator(遍歷器)的概念 Iterator 是一種接口,為各種不同的數(shù)據(jù)結(jié)構(gòu)提供統(tǒng)一的訪問機(jī)制。 任何...
    magic_pill閱讀 360評(píng)論 0 1
  • 第一章:塊級(jí)作用域綁定 塊級(jí)聲明 1.var聲明及變量提升機(jī)制:在函數(shù)作用域或者全局作用域中通過關(guān)鍵字var聲明的...
    BeADre_wang閱讀 1,009評(píng)論 0 0

友情鏈接更多精彩內(nèi)容