Appearance
对象属性的判断和遍历
本节目标:理解“对象属性的判断和遍历”的核心思路,并能把它用于实际开发或面试表达。 一、
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键,按照加入时间升序排列。
