代码之家  ›  专栏  ›  技术社区  ›  Vivin Paliath

带有continue的if是防止在Javascript中迭代属性时过度嵌套的好模式吗?

  •  5
  • Vivin Paliath  · 技术社区  · 14 年前

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

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

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

    4 回复  |  直到 14 年前
        1
  •  4
  •   Cristian Sanchez    14 年前

    我个人更喜欢:

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

    没有额外的缩进级别,因为 for if ,等将接受下一个语句,如果您省略花括号。因为我们把所有的代码都放在 if hasOwnProperty 阻止它使任何支撑 对于 不需要声明。

    本质上相当于:

    for(var property in object) {
       if(object.hasOwnProperty(property)) {
         ...
       } else {
          continue;
       }
    }
    
        2
  •  2
  •   MooGoo    14 年前

    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 ,但可以将该值作为可选的第3个参数显式传递。

    另外,我想指出的是,你没有 为每个花括号缩进代码。。。

        3
  •  1
  •   stevelove    14 年前

    一个因素取决于你是否听道格拉斯·克罗克福德的话。在他的书中,JavaScript:好的部分,他结块 continue 坏的 部分。

    “我从未见过一段代码没有通过重构它来删除continue语句而得到改进。”—Douglas Crockford,JavaScript:the Good Parts

    作为 蒂姆下来了 在他的评论中提到,克罗克福德在书中没有给出任何理由来解释原因 持续 应该避免。但关于 his website

    就我个人而言,我不认为你对循环的编码有任何问题,特别是自从 持续 出现在顶部,不容易被忽略。你和一个开发团队一起工作吗?他们对什么有很好的理解吗 持续 做?您是否有一个代码约定文档来讨论如何处理语句的深层嵌套?

        4
  •  0
  •   Dustin Getz sunsations    14 年前

    麦康奈尔:

    结构思路不清 周围的代码。过度休息 提示通常表示循环 可以更清楚地表达为 消除了治疗的可能性 像黑匣子一样的循环。控制a 循环的退出条件 代码查看内部以了解 难以理解。

    迪克斯特拉:

    像break这样的功能很容易破坏 编程,并防止 程序员从了解 独立单位

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

    http://sites.google.com/site/dustingetz/dev/break-and-continue