2016-05-23 38 views
1

我发现这个片段在这个由谷歌精缩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);

+2

如果d结束了一个布尔或未定义的值(或一个条件读取为假的任何变型),循环将结束。第二部分,这只是实例,确保我们正在使用正确的范围变量。 – AxelH

+0

@AxelH:这很有道理!随意将其作为答案 – geckob

+0

@ AxelH - 在* for *表达式中使用带* var *的变量声明仅将范围限制到周围的执行上下文。 *让*需要将范围限制为* for *块。 ;-) – RobG

回答

1

我不知道这个循环当条件语句分配值,而不是典型的比较操作将结束?

d = _ga.metadata.items[c] 

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

这条线会发生什么特别是变量d?

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

那简直是一些链接变量声明。它声明bÇd,并用一个空数组,数字零和未定义分别(变量声明时缺省值)初始化它们。

0

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

d = _ga.metadata。项[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在此行特别是发生什么情况?

变种B = [],C = 0,d;

这是循环的声明部分。您可以在for(;;)循环的第一部分中声明尽可能多的声明。

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 
} 

既然你无论如何,它可能会使用该项目,因此将其存储在变量中以使代码更高效和更清洁是个不错的主意。这是更加有用与不完全数组的对象,如节点列表,因为他们的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个字符,并使得代码少了很多的可读性。永远不要这样做。

+0

这是缩小版本。所以,我想这是丑陋的 – geckob