遍歷對象屬性的方法及區(qū)別
1.for...in
iterate its own properties and properties on its prototype
for...in循環(huán)遍歷對象自身的和繼承的可枚舉屬性(不含Symbol屬性)
2.Object.keys(obj)
返回?cái)?shù)組,包括對象自身的(不含繼承的)所有可枚舉屬性(不含Symbol屬性)的鍵名毛俏。
Object.keys()/Object.values()/Object.entries()
3.Object.getOwnPropertyNames(obj)
返回?cái)?shù)組盈滴,包含對象自身的所有屬性(不含Symbol 屬性,但包括不可枚舉屬性)的鍵名。
4.Object.getOwnPropertySymbols(obj)
返回一個數(shù)組脊另,包含對象自身的所有Symbol屬性的鍵名戚绕。
5.Reflect.ownKeys(obj)
返回?cái)?shù)組,包含對象自身的所有鍵名归斤,不管鍵名是Symbol或字符串痊夭,也不管是否可枚舉。
以上的 5 種方法遍歷對象的鍵名脏里,都遵守同樣的屬性遍歷的次序規(guī)則她我。
首先遍歷所有數(shù)值鍵,按照數(shù)值升序排列。
其次遍歷所有字符串鍵番舆,按照加入時間升序排列酝碳。
最后遍歷所有Symbol鍵,按照加入時間升序排列恨狈。
Reflect.ownKeys({[Symbol()]:0,b:0,10:0,2:0,a:0})// ['2', '10', 'b', 'a', Symbol()]
上面代碼Reflect.ownKeys方法返回一個數(shù)組疏哗,包含了參數(shù)對象的所有屬性。屬性次序:首先是數(shù)值屬性2和10禾怠,其次是字符串屬性b和a返奉,最后是Symbol屬性。
對象遞歸遍歷
手寫遍歷嵌套對象
const iterate = (obj) => {
? ? Object.keys(obj).forEach(key => {
? ??? ??if(typeof obj[key] === 'object') iterate(obj[key])
? ? ????console.log(`key: ${key}, value: ${obj[key]}`)
? ? })
}