"array.length -1"在JavaScript中意味着什么?

Adr*_*nea 5 javascript loops for-loop

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

在数组上使用for循环时,我们有这样的东西:

for (i = 0; i < array.length; i++) {...}
Run Code Online (Sandbox Code Playgroud)

但我也看到过类似的东西,有时:

for (i = 0; i < array.length - 1; i++) {...}
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,为什么array.length中有"-1",它有什么作用?还有为什么有时会出现,有时却没有出现?

Mar*_*c B 7

这是为了防止fencepost错误,又名"off-by-one".

普通考试题:

您需要建造100米的围栏,每米都有一个围栏.你需要多少个栅栏?

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

    100 meters
  --------------- = 100 posts
     1 post
     ------
     meter
Run Code Online (Sandbox Code Playgroud)

因为对于100米的围栏,你需要101个帖子:

Distance:    1 2  ....  99 100
            |-|-|.....| - | - |
Post:       1 2 3 ....99  100 101
Run Code Online (Sandbox Code Playgroud)

现在使用数组,会发生同样的事情.让我们说它是一个包含5个项目的数组:

for (i = 0 ; i <= 5; i++)
                  ^--length of array
Run Code Online (Sandbox Code Playgroud)

你最终做到了

        i:    0, 1, 2, 3, 4, 5
iteration:    1  2  3  4  5  6
Run Code Online (Sandbox Code Playgroud)

哎呀.5个项目数组,但你已经执行了6次循环 - 一次太多了.

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

for (i = 0; i < length; i++)
              ^---change from "<=" to "<"
Run Code Online (Sandbox Code Playgroud)

要么

for (i = 0; i <= length - 1; i++)
                        ^---change the upper limit value.
Run Code Online (Sandbox Code Playgroud)

  • 记住`for`一直持续到检查条件变为假,所以......`i <= 5`对于i = 5(数组元素#6)将为TRUE.如果切换到`i <5`,那么当`i`变为5时,`i <5`变为`false`并且循环中止.对于整数,`i <5`和`i <= 4`(又名`i <= 5-1`)实际上是相同的 (2认同)

小智 1

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

编辑:如果他们减去一,测试应该是“<=”。