前言
本文主要匯總了一些JS從非數(shù)組對象轉(zhuǎn)數(shù)組的方法,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。
Array.prototype.slice.call(obj)
該方法可以將類數(shù)組對象轉(zhuǎn)換為數(shù)組,所謂類數(shù)組對象,就是含 length 和索引屬性的對象
返回的數(shù)組長度取決于對象 length 屬性的值,且非索引屬性的值,或索引大于 length 的值都不會被返回到數(shù)組中
實錘如下
let obj = { '0': 3, '1': 13, '2': 23, '3': 33, 'length': 3, 'name': 330}let arr = Array.prototype.slice.call(obj)// [3, 13, 23]簡潔寫法 [].slice.call(obj)
Array.from(obj)
該方法可以將類數(shù)組對象和可迭代對象轉(zhuǎn)換為數(shù)組
類數(shù)組對象上文已提及,何為可迭代對象?
Array、Set、Map 和字符串都是可迭代對象(WeakMap/WeakSet 并不是可迭代對象) 字符串變成了可迭代對象,解決了編碼的問題 這些對象都有默認(rèn)的迭代器,即具有 Symbol.iterator 屬性 可以用 for of 循環(huán) 所有通過生成器創(chuàng)建的迭代器都是可迭代對象document.getElementsByTagName("div") 返回的是可迭代對象但不是一個數(shù)組Array.isArray(document.getElementsByTagName('div')) 返回 false通過生成器創(chuàng)建可迭代對象
let obj = { '0': 3, '1': 13, '2': 23, '3': 33}function *createIterator(obj){ for(let value in obj){ yield obj[value] }}let iterator = createIterator(obj)let arr = Array.from(iterator)// [3, 13, 23, 33]改造對象本身,使其成為可迭代對象
默認(rèn)情況下,開發(fā)者定義的對象都是不可迭代對象,但如果給 Symbol.iterator 屬性添加一個生成器,則可以將其變?yōu)榭傻鷮ο?/p>
let obj = { '0': 3, '1': 13, '2': 23, '3': 33}obj[Symbol.iterator] = function* () { for(let value in this){ yield this[value] }}let arr = Array.from(obj)// [3, 13, 23, 33]判斷對象是否為可迭代對象的方法
typeof obj[Symbol.iterator] === 'function'
一點延伸 for of 與 forEach 與 for in
for of 用于循環(huán)可迭代對象,包括有 Array, Set, Map, 字符串
而 Array, Set, Map 都有 forEach 方法
另外,NodeList 不是 Array, Set, Map,但是一個可迭代對象,可以用 for of 遍歷
此外,用 for of 循環(huán)對象時可以通過 break 提前終止,而 forEach 無法提前跳出循環(huán)
for in 遍歷對象的可枚舉屬性,包括其原型鏈上的屬性,且不保證順序
若要遍歷對象自身的可枚舉屬性,使用 hasOwnProperty() 方法來確定屬性是否時對象自身屬性
Object.getOwnPropertyNames(obj) , 返回對象自身可枚舉或不可枚舉屬性
反正已經(jīng)扯遠(yuǎn)了,那就再扯遠(yuǎn)一點,
新聞熱點
疑難解答
圖片精選