Object.keys()
Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。
代码举例:
let a = {a:1, b:2}
Object.keys(a)
let a = [2, 3, 4]
Object.keys(a)
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); 
var myObj = Object.create({}, {
  getFoo: {
    value: function () { return this.foo; }
  }
});
myObj.foo = 1;
console.log(Object.keys(myObj)); 
Object.keys("foo");
 
低版本浏览器可以使用polyfill兼容
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
hasOwnProperty
hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
const object1 = {};
object1.property1 = 42;
console.log(object1.hasOwnProperty('property1'));
console.log(object1.hasOwnProperty('toString'));
console.log(object1.hasOwnProperty('hasOwnProperty'));
 
即使属性的值是 null 或 undefined,只要属性存在,hasOwnProperty 依旧会返回 true。
o = new Object();
o.propOne = null;
o.hasOwnProperty('propOne'); 
o.propTwo = undefined;
o.hasOwnProperty('propTwo'); 
 
自身属性与继承属性
下面的例子演示了 hasOwnProperty 方法对待自身属性和继承属性的区别:
o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop');             
o.hasOwnProperty('toString');         
o.hasOwnProperty('hasOwnProperty');   
 
遍历一个对象的所有自身属性(for...in  循环只会遍历可枚举属性)
var buz = {
  fog: 'stack'
};
for (var name in buz) {
  if (buz.hasOwnProperty(name)) {
    console.log('this is fog (' +
      name + ') for sure. Value: ' + buz[name]);
  }
  else {
    console.log(name); 
  }
}
 
使用 hasOwnProperty 作为属性名:
JavaScript 并没有保护 hasOwnProperty 这个属性名,因此,当某个对象可能自有一个占用该属性名的属性时,就需要使用外部的 hasOwnProperty 获得正确的结果:
var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); 
({}).hasOwnProperty.call(foo, 'bar'); 
Object.prototype.hasOwnProperty.call(foo, 'bar');