在JavaScript中,反向while循环如何知道何时停止?

在JavaScript中,反向while循环如何知道何时停止?,javascript,arrays,loops,while-loop,Javascript,Arrays,Loops,While Loop,在JavaScript中,我最近遇到了反向循环是如何更快的问题 我在表格中看到过: var i = someArray.length; while (i--) { console.log(someArray[i]); } 我测试了这个,当它穿过整个阵列时就停止了 一旦完成数组,它如何知道何时停止?当i--达到0时,循环停止 当(…)中的表达式计算结果为false时,中的表达式停止循环。 由于i是一个正数(长度),并且随着时间的减少,它将在某个点达到零 在布尔上下文中,零转换为false,

在JavaScript中,我最近遇到了反向循环是如何更快的问题

我在表格中看到过:

var i = someArray.length;

while (i--) {
  console.log(someArray[i]);
}
我测试了这个,当它穿过整个阵列时就停止了

一旦完成数组,它如何知道何时停止?

i--
达到0时,循环停止

当(…)中的表达式计算结果为false时,
中的表达式停止循环。
由于
i
是一个正数(长度),并且随着时间的减少,它将在某个点达到零

在布尔上下文中,零转换为
false
,确保循环在某个点停止。

因为
i--
返回先前递减的值,
i
在循环停止时实际上是
-1

while循环每次通过循环时都对括号内的表达式求值。当该表达式得到错误值时,循环将停止

虚假值的示例包括:

false 
0  
undefined  
NaN
null
""
在这种情况下,
i
的值将在循环中每次递减,当它达到
0
的值时,循环将停止。因为它是后减量运算符,所以在减量之前会检查表达式的值。这意味着内部循环将看到
i
someArray.length-1
0
(包含)的值,它们是该数组的所有索引

您的代码示例:

var i = someArray.length;

while (i--) {
    console.log(someArray[i]);
}
创建与此相同的输出:

for (var i = someArray.length - 1; i >= 0; i--) {
    console.log(someArray[i]);
}

每次循环运行时,都会检查
i--
--
告诉Javascript将
i
递减1。最后,
i
将降到0,这相当于
false
。此时,循环停止

暗中试探这是因为在布尔表达式中0的计算结果为false。 0==true返回false 0==false返回true


请注意,如果从-1开始,它将无休止地循环

当while循环达到falsy值时,它将停止计算。 0是一个falsy值,它恰好是数组的第一个索引。 当“i”为0时,for循环仍然循环的原因是,当执行减量表达式时,返回值实际上是操作前变量的值

let i = 10;
let j = i--

console.log(i) // 9
console.log(j) // 10

因此,当while循环变为1,然后for循环中的条件递减“-”i变量时,返回值为1,这是真实的,但实际上,当其余循环访问i时,它的值为0。

说“0等于false”是不正确的,最好说0的计算结果为false。严格来说,零在布尔上下文中不存在。现在发生的是将
0
转换为
false
。在JS布尔上下文(“世界”)中,我们只有两个值:
true
false
(这是我对“上下文”一词的解释)。我错过什么了吗?看起来我们在谈论不同的波长。如果布尔上下文中只存在
true
false
而没有其他内容(如您所说),那么在该上下文中引入零是没有意义的,是吗?@pimvdb现在,我明白您的问题了。我的意思是:“零,在布尔上下文中使用,转换为false。”(方法(“零”)=
false
,因此我的“零等于布尔上下文中的false”语句)。万一你想知道什么是“真实性”。@OnesimusUnbound是的,那篇文章很有帮助,谢谢!这些例子都是:)