Object 遍歷的方法
for in
用於對象的可訪問屬性的遍歷,for-in 讀取鍵名,適合處理對象
遍歷數字鍵,也會遍歷非數字鍵或其他屬性
返回key在迭代中不保證返回順序
for of
用於讀取可迭代屬性的value,for-of 讀取鍵值
數據結構有Symbol.iterator
屬性,表示有 iterator 接口,可以使用 for-of 循環
for-of
內部調用數據結構的Symbol.iterator
方法
直接取值簡潔高效
和forEach不同,可以使用continue break return
可以遍歷大部分的數據結構,可以處理【類數組】
類數組
String 字符串
DOM NodeList 節點列表
arguments 函數參數
set Set
map Map
使用 for-of 處理對象 需要先進行預處理
entries() 轉為迭代器對象 用of訪問,返回值帶有index
Object.prototype.toString.call( arr.entries())
// "[object Array Iterator]" 類型名稱特殊
keys() 先獲取一個key的數組,基於數組進行對象遍歷
特殊處理,使用生成器將迭代器或者數組循環中的值,分步返回,在用循環迭代,迭代器方式返回key。
function* entries(obj) {
for (let key of Object.keys(obj)) {
yield [key, obj[key]];
}
}
對比
Object.keys(obj) 自身可枚舉屬性 (不含Symbol屬性,不包括原型鏈上的屬性)for in 自身可枚舉屬性 (包括原型鏈上的屬性)
hasOwnProperty 是否是自身屬性,不包括數組的empty,不包括原型鏈的屬性
Object.getOwnPropertyNames(obj) 自身屬性名列表
Object.getOwnPropertySymbols(obj) 自身Symbol屬性
Reflect.ownKeys(obj) 包含對象自身所有屬性,屬性名是Symbol或字符串,或者是否可枚舉.