我对javascript很陌生,我试图迭代字典键/值。 (是的,我在这里读了几篇文章,但没有找到答案。)
所以这是我的字典:
showhidedict = {
0: ["a"],
1: [],
2: ["a", "b"],
3: []
};
这是我的迭代:
for (var value in showhidedict)
$("#" + showhidedict[value]).hide();
resharper建议我将hasOwnProperty
- 检查添加到循环中:
if (showhidedict.hasOwnProperty(value))
但为什么?
hasOwnProperty
- 检查一个对象是否有属性(这里,字典是否包含密钥),对吧?
但我真的需要检查吗?因为我遍历密钥,所以我知道所有密钥都必须存在。还有其他要点我为什么要添加支票?
答案 0 :(得分:2)
通常建议始终使用hasOwnProperty,因为它指示对象是否在对象本身上具有指定的属性并避免在其原型链中进行查找。
通常,您不应该假设代码运行的环境或者您的对象是由其他库创建的,或者原型是否已经扩展,因此hasOwnProperty会使您的代码“更安全”。
有关prototype chain的更多信息。
答案 1 :(得分:1)
如果使用in
关键字进行迭代,则迭代对象属性,返回的键是字符串,而不是数字。在迭代属性的上下文中,谨慎的做法是始终检查您是否只是迭代该对象自己的属性,而不是原型链中的垃圾。
对于迭代Arraylike,推荐的迭代可能仍然使用带递增索引的常规for循环。这个索引将是一个数字,它将依赖于Arraylikes的长度属性。它不需要检查hasOwnProperty。
话虽如此,我认为您编写的代码不对,但特别是在团队环境或使用外部API时,使用上述两种方法之一可能是谨慎的。 Resharper就是要谨慎使用你的代码。