为什么“;未定义的“;在JavaScript中结束循环

Why does "undefined" end a loop in JavaScript?

本文关键字:结束 循环 JavaScript 未定义 为什么      更新时间:2023-09-26

我很难理解这个for循环是如何在JavaScript:中终止的

var files = ["A", "B"];
for (var i = 0, f; f = files[i]; i++) {
   console.log(f);
}

运行时,它会在屏幕上显示A和B,但为什么f=files[2]会结束循环?如果我在控制台中运行f=files[2],我会得到"未定义"的答案,那么这应该结束循环这一事实背后的理由是什么?

额外问题:为什么不将循环写为以下内容?

for (var i=0; i < files.length; i++) {
    f = files[i];
    console.log(f);
}

对我来说,这似乎更清晰、更易于维护,那么第一段代码会被用来代替第二段代码有什么原因吗?

循环结束,因为undefined是一个伪值。

使用其中一个而不是另一个的原因是用户偏好。你有一个偏好,而其他人则倾向于另一种方式。其他人可能想要使用while循环。没有正确的方法。

当您在控制台中运行代码时,您得到了"未定义"。因为当在控制台中运行任何代码时,如果不返回任何东西,它将返回"未定义"。

数组从零开始编号,因此array[]=[0,1,2]。您的代码试图将值初始化为数组中的第三位files[2],但您的数组仅定义为具有2个空格。因此,一旦它看到它已经到达数组的末尾,它就退出循环。

至于其中一个循环比其他循环更受欢迎,我认为你的第二个循环会更好,因为第一个循环本质上是试图在数组中分配一个越界的值,但失败了,所以它退出了。我想说第二个更安全。

for(表达式NoInopt;表达式;表达式>sub>报表

for语句中的第一个表达式(如果存在)将检查是否为false以退出循环。undefined是一个falsy,因此这终止了循环。

至于奖金问题,有很多方法可以写出这个循环。对我来说,你提出的代码可读性更强。话虽如此,您可以在较新的浏览器中使用Array.forEach来迭代数组。

首选for (var i=0; i < files.length; i++) {}

考虑arr = [0,1,2]

for (var i = 0; i < arr.length; i++) {}将正确地在数组中的所有元素上循环,但for (var i = 0, item; item = arr[i]; i++) {}不会(并且将无法完全执行)。

请注意,这两种构造都不适合处理稀疏数组(但话说回来,您可能只需要将其作为一个对象来使用和处理)。

当必须处理稀疏阵列时,请考虑使用Array.prototype.forEachfor( var item in arr ) {}。请注意,for( var item in arr ) {}也将返回Array.prototype值,并且Array.prototype.forEach并不是在每个浏览器中都实现的。