Skip to content

对象属性的判断和遍历 ​

本节目标:理解“对象属性的判断和遍历”的核心思路,并能把它用于实际开发或面试表达。 一、in操作符:只考虑是否能访问到属性,能访问到就返回true,反之false

二、实例自身可枚举+非原型对象的: 使用ES5的Object.keys()方法。返回对象中属性的顺序与for-in循环一致。

三、实例自身所有的+非原型对象的: 如果想得到所有实例属性,无论它是否可枚举,可使用Object.getOwnPropertyNames()。

四、实例自身可枚举+原型对象可枚举: 使用for-in循环返回的是所有能够通过对象访问的、可枚举的(enumerated)属性,其中即包括存在于实例中的属性,也包括存在于原型中的属性。屏蔽了原型中不可枚举属性(即将[[Enumerable]]标记的属性)。 注意:如果实例的属性与原型对象的属性同名,而原型对象中此属性又是不可枚举的,则此属性也会在for-in循环中返回。因为根据规定,所有开发人员定义的属性都是可枚举的,除非使用Object.defineProperty()或Object.defineProperties()明确指定属性不可枚举除外。

五、实例自身所有的+原型对象所有的 单独使用in操作符会在通过对象能够访问给定属性时返回true,无论该属性存在于实例还是原型中;同时使用hasOwnProperty()方法和in操作符,就可以确定该属性到底是存在于对象中,还是存在于原型中。当然只能判断属性是否存在,不能获取属性:

function hasPrototypeProperty(object, name) {
return !object.hasOwnProperty(name) && (name in object);
}

六、

Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols

返回一个数组,包含对象自身的所有 Symbol 属性的键名。

七、

Reflect.ownKeys(obj)
Reflect.ownKeys

返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。

遍历顺序 以上的 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则。

  • 首先遍历所有数值键,按照数值升序排列。
  • 其次遍历所有字符串键,按照加入时间升序排列。
  • 最后遍历所有 Symbol 键,按照加入时间升序排列。

本站总访问 — 次