为什么“;未定义的“;在JavaScript中结束循环
Why does "undefined" end a loop in JavaScript?
我很难理解这个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.forEach
或for( var item in arr ) {}
。请注意,for( var item in arr ) {}
也将返回Array.prototype
值,并且Array.prototype.forEach
并不是在每个浏览器中都实现的。
- 为什么“;未定义的“;在JavaScript中结束循环
- 循环结束/推送到数组之前在页面上呈现EJS
- 希望日期开始结束于while循环中的一个房间id的一个数组
- 使用while循环+break是一种可接受的方式;goto;手术的结束
- 用于循环的 Javascript 过早结束
- 如何在javascript中循环结束后执行语句
- 在for循环中另一个音频结束后播放一段时间的音频
- addclass循环结束时调用函数
- Sequelize等待,直到循环通过回调结束
- Node/Express - 如何等到 For 循环结束再使用 JSON 进行响应
- 如何使用事件处理程序连续循环遍历数组列表(从结束恢复到开始)
- 同时循环承诺,直到另一个承诺结束
- 破;不结束循环
- 因为循环过早结束
- jQuery函数使用包含setTimeout的每个循环调用自身,立即发生,而不是在结束时发生
- 在javascript中使用什么循环,在结束之前运行某个代码
- Javascript-在while循环结束后仅显示数组中的最后一个值
- 返回HTML结束循环过早
- 过期或超时在X秒后永不结束循环
- JS动画结束循环,希望在不使用的情况下连续循环;setInterval/setTimout