在JavaScript中检查没有hasOwnProperty的哈希键的存在

时间:2018-08-10 18:25:08

标签: javascript

给出以下示例数据:

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

以下几种检查密钥是否存在的方式有何区别?我可以用第一种方法打h吗?

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

vs。

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

3 个答案:

答案 0 :(得分:3)

首先,如问题所示,两者都不正确,因为您没有使用{ window.location.pathname !== "/subpage1" &&<footer /> } { window.location.pathname !== "/subpage2" &&<footer /> } 的返回值(一个新的,经过过滤的数组)。在这种情况下,请使用filter或(在现代系统上)使用forEach。但是也许您实际上正在使用它,只是没有在您的问题中表明这一点。

解决您的主要问题:

第一种方法将错误地假设某些东西是 fassy 。伪造的值是for-of0""NaNnull,当然还有undefined。 (所有其他值都是 truthy 。)第二种方法将正确处理这些值。

您的两次检查之间的另一个区别是,无论其在原型链中的哪个位置,第一个都会获取该属性。第二个仅查看对象本身(这可能是您想要的)。对于您的示例对象,这实际上仅对false提供的属性(例如Object.prototype)起作用,但是...

您还可以查看SetMap

答案 1 :(得分:0)

简短答案: 在这种情况下,不使用Object.hasOwnProperty() [wiki]

不会有问题

什么时候会出问题?

let seen = {}

console.log(seen["constructor"]) // function Object() { [native code] }

如您所见,这还将包含继承的属性的其他字符串,例如对象的constructor。由于您只处理数字,因此对象上没有此类属性。

答案 2 :(得分:0)

除了TJ所说的。

hasOwnProperty将不搜索对象的原型,而将使用方括号或点表示法。看到这个例子

Object.prototype.foo = 1;
var baz = {"bar": 1}

if (baz.hasOwnProperty('foo')) {
    console.log('has foo');
    return true
}

if (baz.bar) {
    console.log('has bar'); // has bar
    return true;
}