【问题标题】:How does a reverse while loop know when to stop in JavaScript?JavaScript 中的反向 while 循环如何知道何时停止?
【发布时间】:2012-03-15 09:13:28
【问题描述】:

在 JavaScript 中,我最近发现了如何反向 while 循环更快。

我见过他们这样的形式:

var i = someArray.length;

while (i--) {
  console.log(someArray[i]);
}

我对此进行了测试,一旦它通过整个阵列就停止了。

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

【问题讨论】:

  • 一个article,以防你想知道什么是“真实性”。
  • @OnesimusUnbound 是的,这篇文章很有帮助,谢谢!

标签: javascript arrays loops while-loop


【解决方案1】:

while 循环每次循环都会计算括号内的表达式。当该表达式达到错误值时,循环将停止。

错误值的示例是:

false 
0  
undefined  
NaN
null
""

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

您的代码示例:

var i = someArray.length;

while (i--) {
    console.log(someArray[i]);
}

创建与此相同的输出:

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

【讨论】:

  • 这些例子都是:)
【解决方案2】:

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

一旦while ( ... ) 中的表达式计算为假,循环就会停止。
由于i 是一个正数(长度),并且在递减,它会在某个点达到零。

在布尔上下文中,零转换为false,确保循环在某个点停止。
因为i--返回的值是先减量,所以当循环停止时i实际上是-1

【讨论】:

  • 说“0 等于假”不太正确,最好说 0 的计算结果为假。
  • 严格来说,零在布尔上下文中不存在。发生的事情是abstract ToBoolean function0 转换为false
  • 在 JS 布尔上下文(“世界”)中,我们只有两个值:truefalse(这是我对“上下文”一词的解释)。我错过了什么吗?
  • 看起来我们在谈论不同的波长。如果在布尔上下文中只存在 truefalse 而没有其他内容(如您所说),那么在该上下文中引入零是没有意义的,不是吗?
  • @pimvdb 现在,我看到了您的问题。我的意思是:“零,在布尔上下文中使用,转换为假。” (方法(“零”)=false,因此我的“零等于布尔上下文中的假”语句)。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    请注意,如果您从 -1 开始,它将无限循环。

    【讨论】:

      【解决方案5】:

      while 循环在达到虚假值时停止计算。 0 是一个假值,恰好是数组的第一个索引。 之所以 for 循环在 i 为 0 时仍然循环是因为当你做一个递减表达式时,返回值实际上是操作前变量的值。

      let i = 10;
      let j = i--
      
      console.log(i) // 9
      console.log(j) // 10
      

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

      【讨论】:

        猜你喜欢
        • 2018-10-17
        • 2010-09-26
        • 2013-09-11
        • 2023-01-10
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 2017-10-29
        • 1970-01-01
        相关资源
        最近更新 更多