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

时间:2019-11-06 10:44:38

标签: 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'));

2 个答案:

答案 0 :(得分:5)

主要区别在于Reflect.has将检查对象的内部原型中的任何一个是否具有密钥,而hasOwnProperty仅检查对象本身是否具有密钥:< / p>

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

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

另一个重要的区别是Reflect.has需要ES6支持,而hasOwnProperty从ES3开始就已经存在,因此,如果您使用Reflect.has并且需要对较旧的浏览器的支持,请确保包括一个polyfill

答案 1 :(得分:1)

Reflect api是ECMAScript 2015的一部分,无论hasAwnProperty是否在当前标准中可用。他们的行为也可能有所不同。因此,如果它们的功能相同,则仅取决于您是否要支持较旧的浏览器。

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Reflect

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

您可以使用可以在github / npmjs上找到的Seral库来对其进行填充,例如: https://www.npmjs.com/package/reflect-metadata

https://www.npmjs.com/package/harmony-reflect