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);
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更多的是关于从其他语言交叉编译来填补语言中的空白。这是一个缩小的版本。所以,我想它应该是丑陋的