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