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


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

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

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

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

為什么叫類數(shù)組

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

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

array[0] = "Jona";   //Jona age sex
arrayLike[0] = "Jonason";  // 0 : Jonason
  • 獲取長度
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ù)組的方法會報(bào)錯。
可以通過Function.call來間接調(diào)用。

Array.prototype.slice.call(arguments);

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

  • call + 多個數(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)建一個數(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()方法可以接受一個可迭代對象或類數(shù)組對象作為第一個參數(shù),返回一個數(shù)組。如果想對類數(shù)組對象有進(jìn)一步的操作,可以在from()方法中傳入一個映射函數(shù)作為第二個參數(shù)。

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

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

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

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

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

  • arguments
  • nodeList

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

  • HTMLCollection

參考

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

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

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

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

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