【问题标题】:JS: checking object with key vs hasOwnProperty?JS:用键检查对象与 hasOwnProperty?
【发布时间】:2021-02-22 04:19:15
【问题描述】:

我正在研究以下“二和”问题的解决方案。他们首先遍历数组并将所有数字放入一个对象中。然后他们又执行了另一个for 循环来查看不同是否是数组中的一个键,但他们使用hasOwnProperty 检查了该键。这样做与仅检查密钥 ex 有什么区别:if (obj[key]) { ....}

const twoSum_On_Better = (arr, target) => {
    let numObject = {};
    for (let i = 0; i < arr.length; i++) {
        let thisNum = arr[i];
        numObject[thisNum] = i;
    }
    for (var i = 0; i < arr.length; i++) {
        let diff = target - arr[i];
        if (numObject.hasOwnProperty(diff) && numObject[diff] !== i) {
            return [i, numObject[diff]];
        }
    }
}

【问题讨论】:

标签: javascript


【解决方案1】:

使用obj[key] 有两个潜在的缺点:

  • 它会检查该属性是否真实,而不仅仅是该属性是否存在

const obj = {
  prop: 0,
};
console.log(Boolean(obj.prop));
console.log(obj.hasOwnProperty('prop'));
  • 它将对原型链中具有该属性的 first 对象执行上述检查。相比之下,hasOwnProperty 将仅检查 对象本身 是否具有该属性,而不是其任何内部原型。

const objProto = {
  prop: 'val',
};
const obj = Object.create(objProto);

console.log(Boolean(obj.prop));
console.log(obj.hasOwnProperty('prop'));

如果像在这种情况下,您不处理原型继承,并且对象上的值如果存在肯定是真实的,请随意使用obj[key]

有些人建议在现代 JS 中避免使用动态属性名称,并使用 Maps 来代替这些用途。

【讨论】:

  • 感谢简洁明了的解释 :)
  • 据我了解,如果键的值为布尔值,则使用 [key] 将导致布尔值,而不是键的存在。这清楚的事情。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 2023-01-27
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多