【发布时间】:2018-06-06 19:43:23
【问题描述】:
我试图了解在 node js 中发生在我身上的一种情况,但我无法弄清楚它为什么会发生。
假设我有下一个代码:
let obj = {x:1,y:2};
let arr = [obj, obj, obj, obj, obj], otherArr = [];
for(let i = arr.length - 1; i >=0; i--){
let objInLoop = arr[i];
if(objInLoop.x >= 0){ // <= this line throws an exception: Cannot read property 'x' of undefined
otherArr.push(objInLoop);
delete arr[i];
}
}
我得到的错误在代码的第 6 行,异常说明 objInLoop 是 undefined,我无法理解它是怎么回事。
很明显,我在每个循环中都从数组中删除一个元素,但循环从末尾开始,因此每个 delete 不应该影响下一个循环。
当我调试这种情况时,我看到当异常弹出时,i 变量的值小于当前的arr 长度(长度有 1 个元素,i 显示 1在价值中。
这种情况并非一直发生,但它弹出了几次,if 条件中的0 实际上是一个变量,并不总是具有删除元素的真实结果。所有代码都大得多,并且包含许多其他功能和事件。但是“从数组中删除元素”仅出现在我在这里展示的 for 循环部分中。其他异步代码部分具有向数组添加元素的推送功能。
我知道我可以通过向if 添加一个条件来避免它,以确保objInLoop != undefined。但关键是我无法理解这种异常是如何发生的。
【问题讨论】:
-
AFAICT,不太可能是因为
delete。这几乎可以肯定是因为您有一个格式错误的对象,没有来自某个地方的x属性。它很可能是代码中其他地方的错误,而不是循环中的错误。 -
但问题不是
x,未定义的是arr[i],我也在网上调试过,所以看到长度小于i的情况 -
也许数组的构造方式有误,里面有空隙?基本上,相当于这样做:
let arr = [obj, obj,, obj, obj], otherArr = []; -
其实,如果数组之前经过了这个循环,数组中很可能会出现间隙。您可能想使用 splice() 而不是 delete()。