5

我通常使用这种模式来迭代对象属性:

for(var property in object) {
   if(object.hasOwnProperty(property)) {
      ...
   }
}

我不喜欢这种过度的缩进,最近有人向我指出,我可以通过这样做来摆脱它:

for(var property in object) {
   if(!object.hasOwnProperty(property)) {
      continue;
   }

   ...
}

我喜欢这个,因为它不会引入额外的缩进级别。这种模式好吗,还是有更好的方法?

4

4 回答 4

4

我个人更喜欢:

for(var property in object) if(object.hasOwnProperty(property)) {
     ...
}

没有额外的缩进级别,因为如果省略大括号for, , 等将采用下一条语句。if由于我们将所有代码都放在if hasOwnProperty块中,因此for不需要为语句使用大括号。

本质上它相当于:

for(var property in object) {
   if(object.hasOwnProperty(property)) {
     ...
   } else {
      continue;
   }
}
于 2010-09-22T01:34:11.903 回答
2

从语法上讲,我更喜欢这样的东西

function own(obj) {
  var ownprops = {};
  for (var prop in obj) 
    if (obj.hasOwnProperty(prop)) ownprops[prop] = 1;

  return ownprops;
}

for (var property in own(object)) {
 //code
}

看起来不错,但它需要在同一个对象上进行两个循环,而不是非常明智的性能。

另一种方法是功能性

function foreach(obj, func, thisp) {
  for (var prop in obj)
    if (obj.hasOwnProperty(prop)) func.call(thisp, obj[prop], prop);
}

foreach(object, function(val, key) {
  //code
});

只有一个循环,但每次迭代都会调用一个函数,这在性能方面不是很好,但比上一个解决方案要好。请注意,它也会破坏 的值this,但您可以将该值显式传递为可选的第三个参数。

只是一些替代品。你这样做的方式,以及 Daniel 解释的方式都很好,并且没有性能妥协。

另外,我想指出,您不必每个花括号缩进代码...

于 2010-09-22T03:32:07.317 回答
1

一个因素取决于您是否听道格拉斯·克罗克福德(Douglas Crockford)的声音。在他的书《JavaScript:好的部分》中,他提到continue不好的部分。

“我从未见过没有通过重构删除 continue 语句来改进的代码。” - Douglas Crockford,JavaScript:好的部分

正如Tim Down在他的评论中提到的那样,Crockford 在书中没有给出任何理由来解释为什么continue应该避免。但在他的网站上,他说,“它往往会掩盖函数的控制流。” 我只提到克罗克福德的观点,因为许多人认为他是权威。

就我个人而言,我认为您对循环的编码方式没有任何问题,特别是因为它continue出现在顶部,不会轻易被忽视。您是否与开发人员团队合作?他们对做什么有很好的了解continue吗?您是否有讨论如何处理语句的深层嵌套的代码约定文档?

于 2010-09-22T04:24:55.373 回答
0

麦康奈尔:

有许多中断的循环可能表明对循环结构或其在周围代码中的作用的思考不清楚。过多的中断提升通常表明循环可以更清楚地表示为一系列循环。使用 break 消除了将循环视为黑盒的可能性。用一条语句控制循环的退出条件以简化循环。'break' 迫使阅读您的代码的人查看内部以了解循环的控制,从而使循环更难理解。

迪杰斯特拉:

像break这样的特性往往会破坏结构化编程的好处,并阻止程序员将程序理解为独立单元的组合

可以将带有 continue 的循环分解为这种形式,因此可以将循环视为黑盒。克劳福德错了。打破气味,但继续是好的。

进一步分析:http ://sites.google.com/site/dustingetz/dev/break-and-continue

于 2010-10-27T16:45:54.023 回答