最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

节点js,for循环奇怪的情况

IT培训 admin 6浏览 0评论

节点js,for循环奇怪的情况

我试图了解节点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)。

这不是一直发生的,但是它弹出了几次,而0条件下的if实际上是一个变量,并不总是具有删除元素的真实结果。所有代码都更大,包含许多其他功能和事件。但是'从数组中删除元素'只出现在我在这里展示的for循环部分中。其他异步代码部分有一个push元素,可以向元素添加元素。

我知道我可以通过添加if确保objInLoop != undefined的条件来避免它。但关键是我无法理解该异常是如何发生的。

回答如下:

如果数组中存在间隙,则会发生这种情况。如果你将arr的任务改为let arr = [obj, obj,, obj, obj], otherArr = [];,你可以看到这个。

如何在阵列中出现间隙?好吧,有一件事可能导致它是因为数组之前已经完成了循环并删除了东西。

let arr = [{}, {}, {}];
console.log(arr[1]); // {}
delete arr[1];
console.log(arr[1]); // undefined
console.log(arr); // [ {}, <1 empty item>, {} ]

如果delete是你真正想要的,如果数组可能不止一次通过循环,那么你需要检查undefined.

或者,如果对象的索引可以更改,则可以使用Array.prototype.splice()

let arr = ['a', 'b', 'c', 'd'];
let i = 2;
arr.splice(i, 1); // remove one item at index i, i is 2, arr[i] is 'c'
console.log(arr); // ['a', 'b', 'd']

或者您可以完全放弃循环并使用Array.prototype.filter()Array.prototype.map()Array.prototype.forEach(),具体取决于哪种情况适合您的情况。

节点js,for循环奇怪的情况

我试图了解节点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)。

这不是一直发生的,但是它弹出了几次,而0条件下的if实际上是一个变量,并不总是具有删除元素的真实结果。所有代码都更大,包含许多其他功能和事件。但是'从数组中删除元素'只出现在我在这里展示的for循环部分中。其他异步代码部分有一个push元素,可以向元素添加元素。

我知道我可以通过添加if确保objInLoop != undefined的条件来避免它。但关键是我无法理解该异常是如何发生的。

回答如下:

如果数组中存在间隙,则会发生这种情况。如果你将arr的任务改为let arr = [obj, obj,, obj, obj], otherArr = [];,你可以看到这个。

如何在阵列中出现间隙?好吧,有一件事可能导致它是因为数组之前已经完成了循环并删除了东西。

let arr = [{}, {}, {}];
console.log(arr[1]); // {}
delete arr[1];
console.log(arr[1]); // undefined
console.log(arr); // [ {}, <1 empty item>, {} ]

如果delete是你真正想要的,如果数组可能不止一次通过循环,那么你需要检查undefined.

或者,如果对象的索引可以更改,则可以使用Array.prototype.splice()

let arr = ['a', 'b', 'c', 'd'];
let i = 2;
arr.splice(i, 1); // remove one item at index i, i is 2, arr[i] is 'c'
console.log(arr); // ['a', 'b', 'd']

或者您可以完全放弃循环并使用Array.prototype.filter()Array.prototype.map()Array.prototype.forEach(),具体取决于哪种情况适合您的情况。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论