【问题标题】:Javascript object.hasOwnProperty() vs Reflect.has()Javascript object.hasOwnProperty() 与 Reflect.has()
【发布时间】:2019-11-06 10:44:38
【问题描述】:

我体验过使用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'));

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    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。

    【讨论】:

    【解决方案2】:

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

    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 上找到的系列库来填充它,例如: https://www.npmjs.com/package/reflect-metadata

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

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多