我曾经使用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'));
答案 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