4

As javascript developers we all have to write a lot of for loops. Before a couple of months I saw an alternative syntax, which I really liked. However, I'm now interested, is there any other nice way.

Let's say that I have an array of data representing users in a system. What I did before is:

var users = [
    { name: "A"},
    { name: "B"},
    { name: "C"},
    { name: "D"},
    { name: "E"}
];

var numOfUsers = users.length;
for(var i=0; i<numOfUsers; i++) {
    var user = users[i];
    // ...
}

There is one additional row var user = users[i];. Normally I feel more comfortable if I have user instead of users[i]. So, the new way:

for(var i=0; user=users[i]; i++) {
    // ...
}

I'm also wondering if the second approach produces problems in some of the browsers. One of my colleagues reported that this syntax is a little bit buggy under IE.

Edit: Thankfully, the answers below pointed me out to the right direction. If some of the elements of the array is falsy then the loop will stop. There is some kind of solution:

for(var i=0; typeof (user=users[i]) !== "undefined"; i++) {
   // ...
}

But that's too much for me. So, I guess that I'll use this syntax only when I'm 100% sure that all the elements are truly (which means never :)).

4

4 回答 4

5

在你的“新”方法中,你不再需要numOfUsers了。

至于潜在问题:这种方法依赖于所有users[i]具有评估值true的循环继续(并user成为undefined,等于false并因此在处理最后一个用户后结束循环) - 但有时您可能拥有并非每条记录都评估的数据to true,但数据中也可能出现“false-y”值——在这种情况下,这种方法当然会失败。

于 2013-11-08T07:55:44.067 回答
2

这种方法的问题:

for(var i=0; user=users[i]; i++) {
    // ...
}

...是它假设在您超过数组末尾之前user不会是“错误的”(0, "", null, undefined, NaN, 或者当然)。false所以它可以很好地处理一组非空对象引用,但是如果你养成使用它的习惯,当你有一个数字数组或字符串等时它会咬你。

不在for构造中声明变量的另一个原因是它具有误导性:这些变量的范围不限for循环,它们是函数范围的。(JavaScriptvar没有块作用域,只有函数或全局作用域;ES6 将得到let哪个具有块作用域。)

在现代 JavaScript 引擎(或使用“ES5 shim”)上,您当然可以这样做:

users.forEach(function(user) {
    // ...
});

...它具有简洁的优点,并且不必声明iornumUsers甚至user(因为它是迭代回调的参数,并且很好地限定于此)。如果您担心为每个条目执行函数调用的运行时成本,请不要. 它会被你在函数中所做的任何实际工作洗掉。

于 2013-11-08T07:59:26.417 回答
0

如果第二个语法在您的所有中间操作中都有效,我很惊讶对于您想要完成的每个循环都应该评估为 true,而一旦您想要完成循环,则评估为 false。至于您的第一个 for 循环的任何问题,JavaScript 是函数范围的,因此内部 var 语句仍会泄漏到包含函数(以及 that i)。这与大多数其他具有块作用域的语言不同。这不是什么大问题,但如果您正在调试,请记住一些事情。

于 2013-11-08T07:51:00.670 回答
0

如果您已经在使用 jQuery,则可以使用该jQuery.each函数循环遍历您的数组。

在任何情况下,您都可以查看该函数的源代码并为您自己的foreach函数复制相关部分:http: //james.padolsey.com/jquery/#v=1.10.2&fn=jQuery.each

于 2013-11-08T08:01:31.190 回答