给出以下示例数据:
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);
});
答案 0 :(得分:3)
首先,如问题所示,两者都不正确,因为您没有使用{ window.location.pathname !== "/subpage1" &&<footer /> }
{ window.location.pathname !== "/subpage2" &&<footer /> }
的返回值(一个新的,经过过滤的数组)。在这种情况下,请使用filter
或(在现代系统上)使用forEach
。但是也许您实际上正在使用它,只是没有在您的问题中表明这一点。
解决您的主要问题:
第一种方法将错误地假设某些东西是 fassy 。伪造的值是for-of
,0
,""
,NaN
,null
,当然还有undefined
。 (所有其他值都是 truthy 。)第二种方法将正确处理这些值。
您的两次检查之间的另一个区别是,无论其在原型链中的哪个位置,第一个都会获取该属性。第二个仅查看对象本身(这可能是您想要的)。对于您的示例对象,这实际上仅对false
提供的属性(例如Object.prototype
)起作用,但是...
答案 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;
}