1

使用 jQuery for 循环非常慢,这就是我考虑更频繁地使用常规 for 语句的原因。为了直接访问当前元素,我找到了以下语法(对于常规数组,当然不是对象):

for (var i = 0, e; e = array[i]; i++) { ... }

其中ein 循环表示当前元素。

这种语法在所有浏览器中都可以安全使用吗?


添加

好的,我想这可以工作,但对于简短的符号来说,它不再那么有用了:

for (var i = 0, e; (e = array[i]) !== void(0); i++) { ... }

谢谢大家的回答!

4

3 回答 3

7

这不是一个很好的循环。考虑这个数组:

var array = [0, 1, 2, 3];

它会在第一个元素上停止,因为0它是一个虚假值。与

var array = ["foo", "bar", false, "hello"];

它只会到达"foo"并且"bar"


考虑使用这个循环

for (var i=0, len=array.length; i<len; i++) { ... }

它适用于任何地方,只计算array.length一次,并且性能非常好。


根据 TJ 的评论,argsilen以上的范围将存在您当前的功能。所以要小心不要产生变量冲突。

防止这种情况的一种常见(但笨拙)的方法是在 vars 前加上_. 像这样

for (var _i=0, _len=array.length; _i<_len; _i++) { ... }
于 2013-10-01T14:09:30.187 回答
1

正如naomik 指出的那样,如果任何数组元素具有错误值,这种形式的循环就会中断。假值是false, null, undefined, "", 0, 和NaN. 例如,它适用于非空对象引用数组。对于字符串或数字的数组来说不是那么多。

但是,如果您的问题是关于syntax,那么是的,它是“安全的”,因为它可以在所有 JavaScript 引擎中工作(并且在错误元素上失败)。您所依赖的关键位是:

  1. 访问超出数组末尾的元素(例如 at array[array.length])会给你一个错误的值(undefined)而不是抛出异常,并且

  2. 赋值表达式 ( e = array[i]) 的结果就是被赋值的值。

是的,这两个都是可靠的。(好吧,如果数组确实是 JavaScript 数组,则 #1 是可靠的。主机提供的类似数组的对象可能会有所不同。)


在任何情况下,请注意既不是i也不e是仅限于循环。ES6 将具有let,但使用声明的变量var的作用域仅限于它们所在的函数。

于 2013-10-01T14:15:09.407 回答
1

我不建议这样做。你看,如果你的数组看起来像这样,例如:

array = ["lala", 078, false, 992, "kas"];

那么你的循环只会通过前两个,因为这个词e = array[i];会返回假,因为数组中的第三个条目实际上是假的。这个更好:

for (var i = 0, e; (e = array[i])===undefined; i++) { ... }

确保没有人覆盖未定义的变量,例如使用闭包:此 JavaScript/JQuery 语法如何工作:(function( window, undefined ) { })(window)?

于 2013-10-01T14:15:20.883 回答