繁体   English   中英

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

[英]Checking existence of hash key without hasOwnProperty in JavaScript

给定此示例数据:

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);
});

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

解决您的主要问题:

第一种方法会错误地假设某些东西是虚假的,则不会被看到。 伪造的值为0""NaNnullundefined ,当然还有false (所有其他值都是正确的 。)第二种方法将正确处理这些值。

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

您可能还会查看SetMap

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

什么时候会出问题?

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

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

除了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; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM