获取对象属性的不同方法之间的比较

144 阅读2分钟

hasOwnProperty()

Object.prototype.hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。

propertyIsEnumerable()

Object.prototype.propertyIsEnumerable() 方法可以确定对象中指定的属性是否可以被 for...in 循环枚举,但是通过原型链继承的属性除外。如果对象没有指定的属性,则此方法返回 false

Object.keys()

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。

for...in

for...in 以任意顺序遍历一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。

for ... in 是为遍历对象属性而构建的,不建议与数组一起使用,数组可以用 Array.prototype.forEach()for ... of

仅迭代自身的属性

如果你只要考虑对象本身的属性,而不是它的原型,那么使用 getOwnPropertyNames() 或执行 hasOwnProperty() 来确定某属性是否是对象本身的属性(也能使用 propertyIsEnumerable )。或者,如果你知道不会有任何外部代码干扰,您可以使用检查方法扩展内置原型。

getOwnPropertyNames()

Object.getOwnPropertyNames() 方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。数组中枚举属性的顺序与通过 for...in 循环(或 Object.keys)迭代该对象属性时一致。数组中不可枚举属性的顺序未定义。

如果你只要获取到可枚举属性,查看 Object.keys 或用 for...in 循环(还会获取到原型链上的可枚举属性,不过可以使用 hasOwnProperty() 方法过滤掉)。

从所有的属性名数组(使用 Object.getOwnPropertyNames() 方法获得)中去除可枚举的属性(使用 Object.keys() 方法获得),剩余的属性便是不可枚举的属性了

总结

  1. Object.keys() 属性名数组,自身可枚举(不包含原型链)
  2. for ... in key-value,所有可枚举(包含原型链)
  3. Object.getOwnPropertyNames() 属性名数组,自身所有属性(包含不可枚举) 注:不可枚举属性均不包括Symbol值作为名称的属性