Javascript 这个for循环意味着什么?

Javascript 这个for循环意味着什么?,javascript,for-loop,Javascript,For Loop,我在这个由谷歌缩小的网站上找到了这个片段: _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) &am

我在这个由谷歌缩小的网站上找到了这个片段:

_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
};
没有过多地专注于这个函数在做什么

  • 我想知道当conditions语句赋值而不是典型的比较运算符时,循环将如何结束

    d=\u ga.metadata.items[c]

  • 这一行中的变量
    d
    会发生什么情况

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

  • 在正常情况下,它将用逗号的最后一个语句赋值。但在某些情况下,情况可能并非如此。如果没有,前两个任务是无用的。这些线是干什么的

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

我想知道当conditions语句赋值而不是典型的比较运算符时,循环将如何结束

d = _ga.metadata.items[c]
该表达式的结果是分配给d的值,因此如果d被分配了一个错误的值(即,如果元数据项[c]返回一个错误的值,如未定义、
0
、null等),循环将结束

这一行中的变量d会发生什么情况

var b = [], c = 0, d;
这只是一些链式变量声明。它声明b、c和d,并分别使用空数组、数字0和未定义(声明变量时的默认值)初始化它们

我想知道当conditions语句为 指定值而不是典型的比较运算符

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);
基本上,首先设置值,然后检查条件

在您的示例中,这适用于条件读取为false的所有其他变量,就像未定义的变量一样

这一行中的变量d会发生什么情况

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


这是循环的声明部分。允许您在for(;;)循环的第一部分中声明任意数量。

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

for(a; b; c) d;
  • 运行指令
    a
  • 运行指令
    b
    并将结果转换为布尔值
  • 如果布尔值为true,则运行指令
    d
    c
    并再次计算指令
    b
    ,否则结束循环
由于在JavaScript集合中,当您尝试访问超出其长度的对象时,返回
undefined
,并且
undefined
转换为布尔值
false
,因此您可以通过类似数组的对象进行迭代,如下所示:

for(var i=0, item; item = myArray[i]; ++i) {
  // code here
}
由于您可能无论如何都要使用该项,因此最好将其存储在变量中,以使代码更加高效和干净。对于不完全是数组的对象,例如节点列表,它甚至更有用,因为它们的
length
属性实际上需要一些时间来计算(这在浏览器之间可能有所不同)


这是一个非常非常丑陋的代码实践。它滥用&&运算符来执行此操作:

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

它节省了1个字符,使代码的可读性大大降低。永远不要这样做。

如果d以布尔值或未定义的值(或条件读取为false的任何变量)结束,循环将结束。对于第二部分,这只是实例化,以确保我们使用的是正确的范围变量。@AxelH:这很有意义!请随意将其作为answer@AxelH-在for表达式中使用带有var的变量声明只会将范围限制在周围的执行上下文中。要求let将范围限制为for块。;-)只是做了,更详细一点;)@AxelH是的,对于那些来自其他语言的人来说,这有点令人惊讶。:-)不知道“安全”,这从来不是什么大问题。新的声明const和let更多的是关于从其他语言交叉编译来填补语言中的空白。这是一个缩小的版本。所以,我想它应该是丑陋的