增强的 Javascript 语句使用安全

Enhanced Javascript for-statement safe to use?

本文关键字:安全 语句 Javascript 增强的      更新时间:2023-09-26
使用

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

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

其中循环中的e表示当前元素。

此语法在所有浏览器中使用是否安全?


加法

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

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

谢谢大家的回答!

这不是一个非常好的循环。请考虑以下数组:

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,并且性能很高。


根据 T.J. 的评论,上面的 args ilen的范围将存在您当前的函数。因此,请注意不要制造变量冲突。

一种常见(但笨拙(的防范方法是在 var 前面加上 _ 。喜欢这个

for (var _i=0, _len=array.length; _i<_len; _i++) { ... }

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

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

然后你的循环只会通过前两个,因为术语 e = array[i]; 会返回 false,因为数组中的第三个条目实际上是 false。这样更好:

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

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

正如 naomik 指出的那样,如果任何数组元素具有 falsey 值,这种形式的循环将中断。假值是 falsenullundefined""0NaN。因此,例如,它将适用于非空对象引用数组。对于字符串或数字数组来说并非如此。

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

  1. 在数组末尾之外访问元素(例如,在 array[array.length] (会给你一个假值(undefined(,而不是抛出异常,并且

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

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


无论如何,请注意,ie 都不仅仅局限于循环。ES6 将具有 let ,但用 var 声明的变量的作用域为它们所在的函数。