数组使用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中的部分元素(其中有一个会被删除)打印结果为
长度:2即我在使用splice删除数组中的元素前打印含两个元素的数组,出来的结果只有一项,而其长度为2在以上代码中只去掉含splice那两句话 打印结果为
长度:2即再不使用splice后打印结果无误所以很疑惑,为什么在使用splice时,删除数组元素前打印含两个元素的数组,结果只有一项???
因为控制台在另一条线程上,控制台输出数组时循环已经执行完毕,对象是引用传递,所以输出的是内存中该数组的数据;而长度是number,按值传递,输出的就是console传入的值
不过你的代码倒是有问题,splice会修改原数组,你根据menu的长度循环,循环中又用splice删除menu中的项,你每删除一项,其后其他项的下标就-1,但你的i每次+1,也就是你每删除一项就漏掉一项,最后还会出现i大于数组长度-1的情况。
emmm,开始表达有点问题,已经修改。你说的那部分代码问题我已经修改了,但这不是我最困惑的部分。谢谢你为我解惑。
应该是这个原因,我将数组转成json字符串就打印正常了
好的谢谢
可是我在没有使用splice之前打印了menu,而menu里面含有两项,出来的结果只有一项???
你是说先执行了for循环里面的代码,后执行了for循环上面的打印语句?
就是按照正常来讲:我上面的代码是先执行了打印menu,所以应该出来两项,然后长度为2,但是实际上,只出来一项,然后长度为1.所以就像先执行了for循环里面的代码,后执行了for循环上面的打印语句
而且,我如果我把代码中含splice的那两句话删除,出来的结果就为2项,长度为2,所以就很奇怪。。。
删掉之后就报错了,