Object对象遍历的几种方法
Object对象遍历的几种方法
本文以下面对象为例:
1 | const person = { |
1. Object.keys
forEach
原本只是用来遍历数组对象,所以需要先获取对象的所有key
,再行遍历。需要注意的是
Object.keys
获取参数对象自身的(不含继承的)所有可枚举属性(不含Symbol
属性)的key
值:
1 | Object.keys(person).forEach((key) => { |
2. Object.values
Object.values
返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历属性的键值:
1 | Object.values(person).forEach(value => { |
3. Object.entries
Object.entries
返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历属性的键值对数组。
1 | Object.entries(person).forEach((arr) => { |
4. getOwnPropertyNames
getOwnPropertyNames
返回包含对象自身的所有属性(不含Symbol
属性,但是包含不可枚举属性)
1 | Object.getOwnPropertyNames(person).forEach(key => { |
5. Reflect.ownKeys
Reflect.ownKeys
返回对象自身的所有属性,包括symbol
属性,不可枚举属性等:
1 | Reflect.ownKeys(person).forEach(key => { |
6. for...in
for...in
获取对象自身的和继承的可枚举属性(不含Symbol
属性):
1 | for (let key in person) { |
如果要遍历对象自身的属性,可以使用hasOwnProperty
方法进行二次判断:
1 | for(let key in person) { |
7. for...of
for...of
支持数组和类数组的对象遍历,但是不能支持所有的对象遍历。这是因为ES6
引入了Iterator
接口,包含此接口的数据结构皆能够被for...of
遍历,所以我们可以稍加改造,让for...of
可以遍历所有的对象。
1 | person[Symbol.iterator] = function() { |
仔细观察上面代码,你会发现其实[Symbol.iterator]
函数是一个Generator
函数,那么就可以简化一下:
1 | person[Symbol.iterator] = function* () { |
对于上面只返回了key
的代码还可以进一步优化:
1 | person[Symbol.iterator] = function* () { |