收藏
回答

关于数组的问题

数组使用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时,删除数组元素前打印含两个元素的数组,结果只有一项???

最后一次编辑于  2019-07-09
回答关注问题邀请回答
收藏

2 个回答

  • Maverick
    Maverick
    2019-07-09

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


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

    2019-07-09
    有用 1
    回复 3
    • Darren i
      Darren i
      2019-07-09

      emmm,开始表达有点问题,已经修改。你说的那部分代码问题我已经修改了,但这不是我最困惑的部分。谢谢你为我解惑。

      2019-07-09
      回复
    • 闲杂人
      闲杂人
      2019-07-09回复Maverick

      应该是这个原因,我将数组转成json字符串就打印正常了

      2019-07-09
      回复
    • Darren i
      Darren i
      2019-07-09

      好的谢谢

      2019-07-09
      回复
  • 闲杂人
    闲杂人
    2019-07-09


    2019-07-09
    有用
    回复 7
    • Darren i
      Darren i
      2019-07-09

      可是我在没有使用splice之前打印了menu,而menu里面含有两项,出来的结果只有一项???


      2019-07-09
      回复
    • 闲杂人
      闲杂人
      2019-07-09回复Darren i

      你是说先执行了for循环里面的代码,后执行了for循环上面的打印语句?

      2019-07-09
      回复
    • Darren i
      Darren i
      2019-07-09

      就是按照正常来讲:我上面的代码是先执行了打印menu,所以应该出来两项,然后长度为2,但是实际上,只出来一项,然后长度为1.所以就像先执行了for循环里面的代码,后执行了for循环上面的打印语句

      2019-07-09
      回复
    • Darren i
      Darren i
      2019-07-09回复闲杂人

      而且,我如果我把代码中含splice的那两句话删除,出来的结果就为2项,长度为2,所以就很奇怪。。。

      2019-07-09
      回复
    • 闲杂人
      闲杂人
      2019-07-09回复Darren i


      删掉之后就报错了,

      2019-07-09
      回复
    查看更多(2)
登录 后发表内容