【问题标题】:What does "array.length -1" mean in JavaScript?JavaScript 中的“array.length -1”是什么意思?
【发布时间】:2016-05-03 15:37:12
【问题描述】:

例如,我知道如何使用 JavaScript for 循环来循环遍历数组,但我仍然不明白 array.length -1 的含义,特别是 -1 部分。

当在数组上使用 for 循环时,我们会得到这样的结果:

for (i = 0; i < array.length; i++) {...}

但我有时也看到过类似的情况:

for (i = 0; i < array.length - 1; i++) {...}

在第二种情况下,为什么array.length中有“-1”,它有什么作用?还有为什么有时有有时不显示?

【问题讨论】:

  • 由于 javascript 是零索引的,为了遍历整个数组,您可以将最大界限设置为 i
  • 好吧,在第二种情况下,您添加了一个非一个错误 =D

标签: javascript loops for-loop


【解决方案1】:

这是为了防止栅栏错误,也就是“off-by-one”。

常见考试题:

您需要建造 100 米的栅栏,每米有一个栅栏柱。你需要多少栅栏?

明显的快速(和错误)答案:

    100 meters
  --------------- = 100 posts
     1 post
     ------
     meter

因为100米的栅栏,你需要101个帖子:

Distance:    1 2  ....  99 100
            |-|-|.....| - | - |
Post:       1 2 3 ....99  100 101

现在有了数组,同样的事情也会发生。假设它是一个包含 5 个项目的数组:

for (i = 0 ; i <= 5; i++)
                  ^--length of array

你最终做了

        i:    0, 1, 2, 3, 4, 5
iteration:    1  2  3  4  5  6

哎呀。 5 项数组,但您已经执行了 6 次循环 - 一次太多了。

您可以通过两种方式修复错误:

for (i = 0; i < length; i++)
              ^---change from "<=" to "<"

for (i = 0; i <= length - 1; i++)
                        ^---change the upper limit value.

【讨论】:

  • 首先,感谢 Marc 快速而完整的回答。只是一件事:在你的 for 循环中,你输入了第二个条件 i
  • i &lt; lengthi &lt;= length - 1 是等价的
  • 请记住,for 会一直运行,直到检查条件变为 false,所以...i&lt;=5 对于 i=5(数组元素 #6)将为 TRUE。如果切换到i&lt;5,那么当i 变为5 时,i&lt;5 变为false 并且循环中止。对于整数,i&lt;5i&lt;=4(又名 i&lt;=5-1)实际上是相同的
  • 选择使用哪个完全取决于程序员。就我个人而言,我将使用&lt;= count minus 1 变体,因为它清楚地表明您将停止在计数以下。 &lt; count 很容易被误解。但这纯粹是一种风格选择,因此是观点,因此是题外话。
【解决方案2】:

如果你的数组有 4 个元素,例如

var elementOfArray = [7, 9, 0, 2]

并且您想接触这些元素。在这种情况下,您需要知道 elementOfArray[i] 代表数组的元素,i 是索引

因此,如果在数组长度上添加“-1”;您可以看到数组中的整个元素,例如elementOfArray[0]---7elementOfArray[1]---9elementOfArray[2]---0elementOfArray[3]---2。看!你取了元素中的整数。

如果不将数组长度减去 1,则会出错。因为没有elementOfArray[4] 可以代表数组的任何元素。

【讨论】:

    【解决方案3】:

    Javascript 数组是从 0 开始的,这意味着如果您有一个包含 5 个项目的数组,您将使用索引 0 到 4 来访问它们。他们减去一个('-' 和 '1' 之间应该有一个空格以使其更清楚)以找到最后一个索引。

    已编辑:如果他们减一,则测试应该是 '

    【讨论】:

      【解决方案4】:

      如果您一次访问多个索引,您通常希望通过确保每个访问的索引都是&lt; array.length来避免溢出

      所以如果你做这样的事情

      array[x+2] = array[x] + array[x+1];
      

      您通常希望确保 [] 中出现的最高值低于 array.length

      那么上例中的 for 可能看起来像

      for(int x = 0; x+2 < array.length; x++) {
         array[x+2] = array[x] + array[x+1];
      } 
      

      数学上等价于

      for(int x = 0; x < array.length - 2; x++) {
         array[x+2] = array[x] + array[x+1];
      }
      

      【讨论】:

        猜你喜欢
        • 2023-02-11
        • 2020-11-26
        • 2010-12-28
        • 2017-06-11
        • 2022-11-15
        • 2013-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多