这个for循环意味着什么?

时间:2016-05-23 06:51:16

标签: javascript for-loop

我在Google缩小版JS中找到了这个代码段:

_ga.utils.getValidColumnGroups = function(a) {
    for (var b = [], c = 0, d; d = _ga.metadata.items[c]; ++c) 
      d = d.attributes.group, 
      a && (d = _ga.utils.getNormalizedName(d)), 
      -1 == b.indexOf(d) && b.push(d);

    return b
};

没有过多关注这个功能的作用,

  • 我想知道当条件语句分配值而不是典型的比较运算符时,这个循环将如何结束?

    d = _ga.metadata.items[c]

  • 特别是对于此行中的变量d会发生什么?

    var b = [], c = 0, d;

  • 在正常情况下,它将使用逗号的最后一个语句进行分配。但也许在某些情况下不是这种情况。如果没有,前两个任务是没用的。这些行做了什么?

    d = d.attributes.group, a && (d = _ga.utils.getNormalizedName(d)), -1 == b.indexOf(d) && b.push(d);

3 个答案:

答案 0 :(得分:1)

  

我想知道当条件语句分配值而不是典型的比较运算符时,这个循环将如何结束?

d = _ga.metadata.items[c]

该表达式的结果是分配给 d 的值,因此如果 d 被赋予falsey值,则循环将结束(即,如果 _ga.metadata .items [c] 返回一个假值,如 undefined 0 null 等。)

  

特别是在这一行的变量d会发生什么?

var b = [], c = 0, d;

这只是一些链式变量声明。它声明 b c d 并使用空数组初始化它们,数字为零,未定义(分别声明变量时的默认值。

答案 1 :(得分:0)

  

我想知道当条件语句是什么时这个循环会结束   分配值而不是典型的比较运算符?

     

d = _ga.metadata.items [c]

条件可以在没有任何运算符的情况下写入,就像一个简单的无限循环

while(true){}

这可以写成

var infinite = true;
while(infinite){}

但也

var infinite;
while(infinite = true){} //this is a frequente mistake witch and up with infinite loop instead of while( infinite== true);

基本上,首先设置值,然后检查条件。

在您的示例中,这适用于条件读取为假的所有其他变体,如未定义的

  

特别是在这一行的变量d会发生什么?

     

var b = [],c = 0,d;

这是循环的声明部分。您可以在for(;;)循环的第一部分中声明所需的数量。

答案 2 :(得分:0)

与大多数语言一样,for循环描述如下:

for(a; b; c) d;
  • 运行说明a
  • 运行指令b并将结果转换为布尔值。
  • 如果布尔值为true,请运行说明dc并再次评估指令b,否则结束循环。

由于在JavaScript集合中,当您尝试超出其长度访问时返回undefined,并且undefined转换为布尔值false,您可以像这样迭代类似数组的对象:

for(var i=0, item; item = myArray[i]; ++i) {
  // code here
}

由于您可能仍会使用该项目,因此最好将其存储在变量中以使代码更高效和清洁。它对于不完全是数组的对象(例如NodeList)更有用,因为它们的length属性实际上需要一些时间来计算(这可能因浏览器而异)。 The Google JavaScript Style Guide actually recommends doing this for that reason.

-1 == b.indexOf(d) && b.push(d);

这是一个非常非常难看的代码练习。它滥用了&&运营商这样做:

if(b.indexOf(d) == -1) b.push(d);

它可以节省1个字符并使代码的可读性降低很多。永远不要那样做。

相关问题