关于数组的问题
发布于 5 年前 作者 cgao 15097 次浏览 来自 问答

数组使用splice删除其中的元素时出现了奇怪的现象问题代码:

let menu = app.globalData.menu;
   let len = menu.length;
   console.log(menu);
   console.log(len)
   for (var i = 0; i < len; i++)
   {
     if (menu[i].num == 0)
     {
       

       console.log(i);

        app.globalData.global_flag = 1;

        menu.splice(i, 1);

        in_menu.splice(i,1);

        len=menu.length;

        i-=1;

     }
   }

定义的数组menu中含有两项,打印menu及其长度len后,执行循环删除掉menu中的部分元素(其中有一个会被删除)打印结果为

  1. 0:{id"01"name"寿司"num1}

  2. length:1

  3. nv_length:(...)

  4. __proto__:Array(0)

长度:2即我在使用splice删除数组中的元素前打印含两个元素的数组,出来的结果只有一项,而其长度为2在以上代码中只去掉含splice那两句话打印结果为

  1. 0:{id"00"name"糖醋排骨"num0}

  2. 1:{id"01"name"寿司"num1}

  3. length:2

  4. nv_length:(...)

  5. __proto__:Array(0)

长度:2即再不使用splice后打印结果无误所以很疑惑,为什么在使用splice时,删除数组元素前打印含两个元素的数组,结果只有一项???

2 回复

因为控制台在另一条线程上,控制台输出数组时循环已经执行完毕,对象是引用传递,所以输出的是内存中该数组的数据;而长度是number,按值传递,输出的就是console传入的值

不过你的代码倒是有问题,splice会修改原数组,你根据menu的长度循环,循环中又用splice删除menu中的项,你每删除一项,其后其他项的下标就-1,但你的i每次+1,也就是你每删除一项就漏掉一项,最后还会出现i大于数组长度-1的情况。

回到顶部