【问题标题】:Looping backwards through javascript array with array.length using a for-loop使用for循环通过带有array.length的javascript数组向后循环
【发布时间】:2019-04-04 15:44:21
【问题描述】:

如果我有一个要循环的数组 = [8,7,6,5,4], 为什么下面的 for 循环仍然有效,但数组的长度为 5,并且数组的索引 5 处没有元素?

for(let i=array.length;i>=0;i++){
  //do something 
}

我知道长度减1会更准确,但是为什么上面的代码仍然有效

【问题讨论】:

  • 你必须在每个循环中从i 中减去 1。喜欢i-- 而不是i++
  • array.forEach(item => /* ...做点什么...*/)
  • 这取决于你所说的“工作”。你没有在循环中做任何事情,所以我们不知道什么有效或无效。访问array[i] 仅在您将未定义的值视为有效时才有效。
  • 你能给我们看一个带有“工作”代码示例的 sn-p 吗?
  • 我知道它会更准确...不,它会正确(相对于不正确)。这不是关于或多或少的“准确”。 i 将继续递增并最终返回到负 2 的补码值并终止循环,因为整数具有有限的最大值。您的循环将无缘无故地进行 a lot 花费比需要更长的时间。 “做某事”究竟是做什么的?

标签: javascript arrays for-loop control-flow


【解决方案1】:

几乎。你必须:

  • 减少i 而不是增加它,并且
  • array.length-1开始,因为数组索引从0开始,而不是1。

所以改用:

for (let i = array.length-1; i >=0 ; i--) {

【讨论】:

    【解决方案2】:

    它发生的原因是 Javascirpt 中的数组不限于它们被声明的大小。因此,这意味着如果您尝试访问一个空头寸,您将收到未定义的信息。例如,在这种情况下,如果您执行 array[5],您将收到 undefined 而不是 ArrayIndexOutOfBoundsException,因为它会在 Java 中发生。

    此外,您应该查看您的代码。由于您正在向后迭代数组,因此您应该使用 i-- 递减 i 而不是递增它。

    【讨论】:

    • 谢谢,这最好地回答了我的问题,我的减量是一个错字。
    【解决方案3】:

    因为它是这样的:

    const array = [1,2,3,4];
    for(let i=10;i>=0;i--){
      console.log(array[i]);
    }

    你可以随心所欲地循环。在 javascript 中,一切都是对象,包括数组。使用[] 访问对象中不存在的内容会返回未定义。

    【讨论】:

      【解决方案4】:
      for(let i=array.length-1;i>=0;i--){
        //do something 
      }
      

      您需要将i 设置为数组的长度-1(因为数组索引从0 开始)。然后每次循环时都需要从i 中减去一个(i--

      您的代码可以工作,但会在循环中运行很多次,直到数字溢出为负数。尝试将 console.log(i) 添加到您的循环中以了解我的意思。 (如果您在检查器中执行此操作,它可能会冻结 chrome)

      【讨论】:

        【解决方案5】:

        数组的长度等于条目的数量,假设它们都已满。稀疏数组没有元素个数的长度,而是基于其中的最大索引

        例如:

        let a = [];
        a[10] = 1;
        console.log(a.length);
        console.log(a);

        长度为11(0到10),可以看到索引0到9有undefined的值。

        即使将最后一个值设置为 undefined 也不会影响长度,因为在该位置仍然有一个值 undefined

        let a = [];
        a[9] = 1;
        a[10] = 1;
        console.log(a.length);
        
        a[10] = undefined
        console.log(a.length);

        使用delete依然不影响长度。

        let a = [];
        a[9] = 1;
        a[10] = 1;
        console.log(a.length);
        
        delete a[10];
        console.log(a.length);

        更改长度的唯一方法是创建一个新数组作为原始数组的子集:

        let a = [];
        a[9] = 1;
        a[10] = 1;
        console.log(a.length);
        console.log(a);
        
        a = a.slice(0,9);
        console.log(a.length);
        console.log(a);

        【讨论】:

          猜你喜欢
          • 2015-05-21
          • 1970-01-01
          • 2022-01-04
          • 1970-01-01
          • 2014-02-12
          • 1970-01-01
          • 2021-12-10
          • 1970-01-01
          • 2021-09-21
          相关资源
          最近更新 更多