首页 > 解决方案 > 在 JavaScript 中检查没有 hasOwnProperty 的哈希键是否存在

问题描述

鉴于此示例数据:

let foo = [1,2,2,3,5,3]
let seen = {}

以下检查密钥是否存在的方法有什么区别?我可以使用第一种方式遇到一些问题吗?

foo.filter(function(item) {
    return seen[item] ? false : (seen[item] = true);
});

对比

foo.filter(function(item) {
    return seen.hasOwnProperty(item) ? false : (seen[item] = true);
});

标签: javascript

解决方案


首先,如问题所示,两者都不正确,因为您没有使用filter(新的过滤数组)的返回值。在这种情况下使用forEachor (在现代系统上)for-of。但也许您实际上正在使用它,只是没有在您的问题中表明这一点。

解决您的主要问题:

第一种方法会错误地假设某些东西是falsy时没有看到。虚假值是0, "", NaN, null, undefined, 当然false。(所有其他值都是真实的。)您的第二种方法将正确处理这些值。

您的两个检查之间的另一个区别是第一个获取属性,而不管它在原型链中的哪个位置;第二个只查看对象本身(这可能是您想要的)。对于您的示例对象,这实际上只对Object.prototype诸如提供的属性很重要valueOf,但是......

你也可以看看Setor Map


推荐阅读