前言
本文主要匯總了一些JS從非數組對象轉數組的方法,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
Array.prototype.slice.call(obj)
該方法可以將類數組對象轉換為數組,所謂類數組對象,就是含 length 和索引屬性的對象
返回的數組長度取決于對象 length 屬性的值,且非索引屬性的值,或索引大于 length 的值都不會被返回到數組中
實錘如下
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)
該方法可以將類數組對象和可迭代對象轉換為數組
類數組對象上文已提及,何為可迭代對象?
document.getElementsByTagName("div")
返回的是可迭代對象但不是一個數組Array.isArray(document.getElementsByTagName('div'))
返回 false通過生成器創建可迭代對象
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]
改造對象本身,使其成為可迭代對象
默認情況下,開發者定義的對象都是不可迭代對象,但如果給 Symbol.iterator
屬性添加一個生成器,則可以將其變為可迭代對象
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 用于循環可迭代對象,包括有 Array, Set, Map, 字符串
而 Array, Set, Map 都有 forEach 方法
另外,NodeList 不是 Array, Set, Map,但是一個可迭代對象,可以用 for of 遍歷
此外,用 for of 循環對象時可以通過 break 提前終止,而 forEach 無法提前跳出循環
for in 遍歷對象的可枚舉屬性,包括其原型鏈上的屬性,且不保證順序
若要遍歷對象自身的可枚舉屬性,使用 hasOwnProperty()
方法來確定屬性是否時對象自身屬性
Object.getOwnPropertyNames(obj)
, 返回對象自身可枚舉或不可枚舉屬性
反正已經扯遠了,那就再扯遠一點, Object.assign()
方法將所有可枚舉屬性的值從一個或多個源對象復制到目標對象
[…obj]
展開運算符可以將可迭代對象轉換為數組
例如, [...'obj']
返回 ["o", "b", "j"]
字符串去重
[...new Set('objobj')]
Object.values(obj)
默認情況下,開發者定義的對象都是不可迭代對象,但提供了返回迭代器的方法
通過使用這些方法,可以返回相關的數組
與類數組對象需要對象有 length 值不同,Object.values(obj)
返回對象自身可枚舉屬性值的集合
let obj = { '0': 3, '1': 13, '2': 23, '3': 33}let arr = Object.values(obj) // [3, 13, 23, 33]
字符串與數組的關系
在很大程度上,可以將字符串看成字符串數組,
都有 length 屬性
都有 concat()
/ indexOf()
/ includes()
/ slice()
方法
不過值得注意的是, string 上沒有方法可以原地修改它自身的內容,都是返回新的 string
string 還有個 repeat()
方法,創建指定數量的字符串副本
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。
新聞熱點
疑難解答