ES6 一共有 5 種方法可以遍歷對象的屬性。
(1)for...in
for...in循環(huán)遍歷對象自身的和繼承的可枚舉屬性(不含 Symbol 屬性)款侵。
(2)Object.keys(obj)
Object.keys返回一個數(shù)組降盹,包括對象自身的(不含繼承的)所有可枚舉屬性(不含 Symbol 屬性)的鍵名演痒。
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一個數(shù)組耳标,包含對象自身的所有屬性(不含 Symbol 屬性赁严,但是包括不可枚舉屬性)的鍵名逢勾。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols返回一個數(shù)組牡整,包含對象自身的所有 Symbol 屬性的鍵名。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys返回一個數(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ù)組的屬性次序是這樣的啤它,首先是數(shù)值屬性2和10奕筐,其次是字符串屬性b和a舱痘,最后是 Symbol 屬性变骡。