【问题标题】:Javascript - what does this line do?Javascript——这条线是做什么的?
【发布时间】:2010-02-12 15:39:40
【问题描述】:

下面的 javascript 做了什么?

var groups = countrylist.split(',');    
for( var i = -1, group;  group = groupsCounty[++i]; ){
  ...
}

【问题讨论】:

  • groupsgroupsCounty 应该是同一个变量吗?
  • 我很想知道 - 我正试图找出页面上的问题:p
  • 那肯定坏了。将var groups = countrylist.split(','); 更改为var groupsCounty = countrylist.split(',');。可能有人正在重构并重命名该变量,但没有完成他的工作。

标签: javascript loops


【解决方案1】:
With i starting at -1
increase i by 1
get the ith element from the groupsCounty array
if there is no such element: stop
otherwise: assign it to group and carry on (with whatever "…" is)

这是一个优化版本:

for (var i = 0; i < groupsCounty.length; i++; ){
    var group = groupsCounty[i];
    …
}

【讨论】:

  • 以这种方式循环是否安全? (因为它是否适用于所有浏览器?)
  • 在这个答案中,问题的 for 循环实际上是否优于 for 循环?在 CPU 中还是在使用的内存中?
  • group = groupsCounty[++i]i = i + 1; group = groupsCounty[i] 相同
  • @jpabluz — 它保存一个操作来检查每次循环时的长度。它很少会产生显着差异,因此通常不值得付出可读性的代价。
  • @digiguru 我不喜欢这种方法,因为您依赖类型强制来为每次迭代提供“等效”真或假。这意味着,如果您在 groupsCounty 数组中的值为 0 或“”,它将返回 false。对我来说,仅仅看一眼就知道它在做什么也不是很清楚。安全吗?好吧,它总是会做它应该做的事情,只是可能不是你期望它做的事情。
【解决方案2】:

它使用组中存在的值作为保护条件来迭代组的元素。即使用 JavaScript Truthiness 来控制循环迭代的次数,因为当没有可以分配给它的值时,guard 将为 false。

【讨论】:

    【解决方案3】:

    它这样做:-

    var groups = countrylist.split(',');    
    for( var i = 0;  i < groups.length; i++ )
    {
      var group = groups[i]
      ...
    }
    

    唯一真正的区别是上面的内容更常见,更容易识别。您不会发布上面的代码询问“这是在做什么?”。

    您发布的代码是一个聪明的开发示例,但不一定是良好的编码实践。

    【讨论】:

      【解决方案4】:

      for loop 遍历 groups 数组,直到 groupsCounty[++i] 返回错误值。

      使用以下术语:

      for (<initial-expression>; <condition>; <final-expression>)
      

      初始表达式var i = -1, group 声明了变量igroup。对于每次迭代,循环条件group = groupsCounty[++i] 将下一个数组值分配给group。如果该表达式是错误的(例如,groupsCounty[++i] 在超出范围时返回 undefined),则循环停止。 final-expression 是空的,因为 i 已经在 contition 表达式中增加了。

      【讨论】:

        【解决方案5】:

        相当于

        for (var group in groupsCounty) {
          ...
        }
        

        具有访问索引的附加价值 (i)。

        【讨论】:

        • group成为索引值,然后您必须使用 anotherVariable = groupdCountry[group] 取消引用数组以获取该值。
        • 不等价。 for...in 循环以未定义的顺序枚举对象的所有属性,包括从对象原型继承的属性。所以你有一个不同的循环顺序,并且可能有更多的属性被迭代。此外,在您的示例中,group 将是属性名称,而不是原始问题中的属性值。
        猜你喜欢
        • 1970-01-01
        • 2017-01-29
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多