[英]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
, ""
, NaN
, null
, undefined
,当然还有false
。 (所有其他值都是正确的 。)第二种方法将正确处理这些值。
两次检查之间的另一个区别是,无论对象在原型链中的哪个位置,第一个都会获取该属性; 第二个仅查看对象本身(这可能是您想要的)。 对于您的示例对象,这实际上仅对Object.prototype
提供的属性(例如valueOf
Object.prototype
,但是...
简短的答案 :在这种情况下,不使用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.