for in ,Object.keys,Object.getOwnPropertyNames,Object.getOwnPropertySymbols区别

class A {
  name = 'A';
  [Symbol.toStringTag] = "A";
  get getter() {
    return 'aaaa';
  }
  constructor() {
    Object.defineProperty(this, 'enumerable', {
      enumerable: false
    })
  }
  prototype() { }
}

let a = new A();
a.q = q => 132;
let arr = [];
for (let x in a) {
  arr.push(x);
}
console.log('for in', arr);
console.log('Object.keys', Object.keys(a))
console.log('Object.getOwnPropertyNames', Object.getOwnPropertyNames(a))
console.log('Object.getOwnPropertySymbols', Object.getOwnPropertySymbols(a))

结论

for in:所有可枚举的,还有getter,包括原型链上面的

Object.keys:所有可枚举的,不包括原型链

Object.getOwnPropertyNames:所有的(包括不能枚举的),不包括原型链

Object.getOwnPropertySymbols:所有的Symbol属性,不包括原型链(以上都不能列出Symbol属性)