JavaScript基础知识--对象属性的遍历方式

84 阅读2分钟

在日常开发中,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);
}

输出结果 (addresseating都是原型上的方法)

image.png
  • Object.keys获取所有key,遍历keys
const keys = Object.keys(p);
console.log(keys);//不可以遍历到原型上的属性和方法

输出结果,无法获取到原型上的方法和属性,同样无法获取symbol类型的属性

image.png

  • Reflect.ownKeys,获取所有key,遍历keys
const ownKeys = Reflect.ownKeys(p);
console.log(ownKeys);

输出结果,同样无法获取原型上的属性和方法,但是可以获取symbol类型的属性
image.png

  • Object.getOwnPropertyNames获取所有属性的名称
const properties = Object.getOwnPropertyNames(p);
console.log(properties);

输出结果,同样无法获取原型上的属性和方法,同样无法获取symbol类型的属性

image.png

  • Object.getOwnPropertySymbols获取对象上的所有symbol类型的属性
console.log(Object.getOwnPropertySymbols(p))

输出结果为

image.png

  • Object.entries获取对象key,value的键值数组,最终返回一个二维数组
const entries = Object.entries(p);
console.log(entries)

最终输出结果为

image.png

  • Object.getOwnPropertyDescriptors获取对象上所有属性的描述符,无法获取原型上的属性,但是可以获取symbol类型的属性
console.log(Object.getOwnPropertyDescriptors(p));

输出结果为

image.png

以上就是对象的遍历方式,for...in 可以遍历对象本身以及原型上的属性,Object.keys可以获取对象的所有非symbol类型的属性,Reflect.ownKeys可以获取对象上的所有属性,Object.getOwnPropertyNames可以获取对象的所有属性名,但是无法获取symbol类型的属性,getOwnPropertySymbols只能获取symbol类型的属性

方法是否可以遍历原型上的属性是否可以遍历到symbol返回值
for...in--
Object.keyskey数组
Reflect.ownKeyskey数组
Object.getOwnPropertyNameskey数组
Object.getOwnPropertySymbolssymbol类型的key数组
Object.entrieskey,value组成的而为数组
Object.getOwnPropertyDescriptors属性描述符数组