对象遍历方法
各种遍历对象的方法返回值的不同
前置代码:
function Obj() {
// 直接在this上添加属性
this.prop_this = 'prop_this';
// 在this上添加symbol属性
this[Symbol.for('prop_symbol')] = 'prop_symbol';
}
// 原型上添加属性
Obj.prototype.propProto = 'prop_proto';
const obj = new Obj();
// 设置遍历属性enumerable设置为否
Object.defineProperty(obj, 'prop_dontEnum', {
value: 'prop_dontEnum',
enumerable: false,
writable: false,
configurable: false
});
-
getOwnPropertyDescriptors 可以获取所有的自身属性描述
console.log(Object.getOwnPropertyDescriptors(obj)); // { prop_this: { value: 'prop_this', writable: true, enumerable: true, configurable: true }, prop_dontEnum: { value: 'prop_dontEnum', writable: false, enumerable: false, configurable: false }, [Symbol(prop_symbol)]: { value: 'prop_symbol', writable: true, enumerable: true, configurable: true } }
-
getOwnPropertyNames 可以获取自身除symbol之外的属性,获取自身symbol值可以使用 getOwnPropertySymbols
console.log(Object.getOwnPropertyNames(obj)); // [ 'prop_this', 'prop_dontEnum' ] console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(prop_symbol) ]
-
for...in 可以获取自身可以枚举除symbol外的属性和原型属性
for(var i in obj) { console.log(i); } // prop_this propProto
-
Object.keys 和 Object.values 都只可以获取自身除了symbol外可枚举的属性
console.log(Object.keys(obj)); // [ 'prop_this' ]
-
Reflect.ownKeys(obj)可以获取自身所有的属性
console.log(Reflect.ownKeys(obj)); // [ 'prop_this', 'prop_dontEnum', Symbol(prop_symbol) ]