我在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);
答案 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
并将结果转换为布尔值。d
和c
并再次评估指令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个字符并使代码的可读性降低很多。永远不要那样做。