// 测试数据定义
let symbolKey = Symbol('symbolKey');
function Obj(){
this.ownKey = 1;
this[symbolKey] = 2;
}
Obj.prototype.prototypeKey = 3;
let o = new Obj();
Object.defineProperty(o, 'unenumerableKey', {
enumerable: false,
value: 4
})
-
Object.keys(o)
获取所有本地可枚举属性(不含Symbol)Object.keys(o); // ownKey
-
Object.getOwnPropertyNames(o)
获取所有本地属性,包括不可枚举的本地属性(不含Symbol)Object.getOwnPropertyNames(o); // ["ownKey", "unenumerableKey"]
-
Reflect.ownKeys(o)
获取对象所有本地属性(包括不可枚举属性以及Symbol类型的属性)Reflect.ownKeys(o); // ["ownKey", "unenumerableKey", Symbol(symbolKey)]
-
for...in
获取所有可枚举的属性(本地属性或原型链上的自定义属性) 不含Symbolfor(let key in o){ console.log(key) }// ownKey prototypeKey
注:
- 能进行遍历的属性必须是本地可枚举属性
- 本地可枚举属性不一定可以遍历
Symbol
做键的本地属性,是enumerable
,但不能使用1、2、4的方法遍历