在日常开发中,js对于对象的操作是比较频繁的,那么有哪些方式可以实现对象属性遍历呢?
先举一个例子
let fmt = Symbol.for("fmt");
function Person(name, age) {
this.name = name;
this.age = age;
this[fmt] = "app"
}
Person.prototype.address = "北京";
Person.prototype.eat = function () {
console.log("eatting")
}
let p = new Person("coder", 12);
- for...in 遍历 (可以遍历到对象原型上的属性和方法,但是没有遍历到symbol类型的属性)
for (const key in p) {
console.log(key);
}
输出结果 (address和eating都是原型上的方法)
- Object.keys获取所有key,遍历keys
const keys = Object.keys(p);
console.log(keys);//不可以遍历到原型上的属性和方法
输出结果,无法获取到原型上的方法和属性,同样无法获取symbol类型的属性
- Reflect.ownKeys,获取所有key,遍历keys
const ownKeys = Reflect.ownKeys(p);
console.log(ownKeys);
输出结果,同样无法获取原型上的属性和方法,但是可以获取symbol类型的属性
- Object.getOwnPropertyNames获取所有属性的名称
const properties = Object.getOwnPropertyNames(p);
console.log(properties);
输出结果,同样无法获取原型上的属性和方法,同样无法获取symbol类型的属性
- Object.getOwnPropertySymbols获取对象上的所有symbol类型的属性
console.log(Object.getOwnPropertySymbols(p))
输出结果为
- Object.entries获取对象key,value的键值数组,最终返回一个二维数组
const entries = Object.entries(p);
console.log(entries)
最终输出结果为
- Object.getOwnPropertyDescriptors获取对象上所有属性的描述符,无法获取原型上的属性,但是可以获取symbol类型的属性
console.log(Object.getOwnPropertyDescriptors(p));
输出结果为
以上就是对象的遍历方式,for...in 可以遍历对象本身以及原型上的属性,Object.keys可以获取对象的所有非symbol类型的属性,Reflect.ownKeys可以获取对象上的所有属性,Object.getOwnPropertyNames可以获取对象的所有属性名,但是无法获取symbol类型的属性,getOwnPropertySymbols只能获取symbol类型的属性
| 方法 | 是否可以遍历原型上的属性 | 是否可以遍历到symbol | 返回值 |
|---|---|---|---|
| for...in | 是 | 是 | -- |
| Object.keys | 否 | 否 | key数组 |
| Reflect.ownKeys | 否 | 是 | key数组 |
| Object.getOwnPropertyNames | 否 | 否 | key数组 |
| Object.getOwnPropertySymbols | 否 | 是 | symbol类型的key数组 |
| Object.entries | 否 | 否 | key,value组成的而为数组 |
| Object.getOwnPropertyDescriptors | 否 | 是 | 属性描述符数组 |