遍歷對象
E S 6 一共有 5 種方法可以遍歷對象的屬性 。
- for ... in
for . . . in 循環遍歷對象自身的和繼承的可枚舉屬性(不含 Symbol 屬性)。
- Object.keys(obj)
Object . keys 返回 一個數組,包括對象自身的(不含繼承的 )所有可枚舉屬性(不含 Symbol 屬性)
- Object . getOwnPropertyNames(obj)
Object . getOwnPropertyNames 返回 一個數組,包含對象自身的所有屬性(不含 Symbol 屬性,但是包括不可枚舉屬性)
-
Object.getOwnPropertySymbols(obj)
Object . getOwnPropertySymbols 返回 一個數組,包含對象自身的所有 Symbo l 屬性 。
- Reflect .ownKeys(obj)
Reflect . ownKeys 返回 一個數組,包含對象自身 的所有屬性 , 不管屬性名是 Symbol 還 是字符串 , 也不管是否可枚舉 。
以上 5 種方法遍歷對象的屬性時都遵守同樣的屬性遍歷次序規則 。
- 首先遍歷所有屬性名為數值的屬性 , 按照數字排序 。
- 其次遍歷所有屬性名為字符串的屬性,按照生成時間排序。
- 最后遍歷所有屬性名為 Symbol 值的屬性 , 按照生成時間排序。
總結如下:
屬性類型 | for ... in | Object.keys(obj) | Object . getOwn-Property-Names(obj) | Object.getOwn-Property-Symbols(obj) | Reflect .ownKeys(obj) |
---|---|---|---|---|---|
原型鏈 | 是 | 否 | 否 | 否 | 否 |
Symbol | 否 | 否 | 否 | 是 | 是 |
不可枚舉 | 否 | 否 | 是 | 是 | 是 |
可枚舉 | 是 | 是 | 是 | 是 | 是 |
普通 | 是 | 是 | 是 | 否 | 是 |