Javascript object.hasOwnProperty()与Reflect.has()

Goo*_*tan 7 javascript

我经历过object.hasOwnProperty('property')用于验证Javascript对象的经历,最近发现它Reflect.has()也用于验证对象属性。但是,两者几乎都是相同的功能,但是我想了解使用的最佳实践Reflect.has()以及哪种会带来更好的性能。

我注意到,如果它不是对象,则hasOwnProperty不会Reflect.has()引发任何错误,而是会引发错误。

var object1 = {
  property1: 42
};
//expected output: true
console.log(object1.hasOwnProperty('property1'));

console.log(Reflect.has(object1, 'property1'));
// expected output: true
console.log(Reflect.has(object1, 'property2'));
// expected output: false
console.log(Reflect.has(object1, 'toString'));

//For Negative case scenario
var object2 ="";
// expected output: false
console.log(object2.hasOwnProperty('property1'))
// error
console.log(Reflect.has(object2, 'property1'));
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 5

一个主要的区别是,Reflect.has它将检查对象的内部原型是否具有密钥,而hasOwnProperty仅检查对象本身是否具有密钥:

const proto = { foo: 'foo' };
const obj = Object.create(proto);
console.log(Reflect.has(obj, 'foo'));
console.log(obj.hasOwnProperty('foo'));
Run Code Online (Sandbox Code Playgroud)

如果要检查对象本身是否具有属性,而不是继承的属性,则绝对应该使用hasOwnProperty

另一个重要的区别是,它Reflect.has需要ES6支持,而hasOwnPropertyES3以后就已经存在,因此,如果您使用Reflect.has并要求支持较旧的浏览器,请确保包括polyfill。