Array.length在for循环中未产生预期结果

时间:2018-10-31 12:56:14

标签: javascript arrays

所以我在做一个涉及反转数组的问题。它以数组作为参数,并产生一个新数组,该数组具有相反的顺序相同的元素。这是我起初想到的。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var array = [];

for(var i = 0; i < fruits.length; i++){
 array.push(fruits.pop(i))
}
console.log(array);

我最终得到的结果是["Mango", "Apple"],这不是我想要的。所以我尝试了这个:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var array = [];
var count = fruits.length;

for(var i = 0; i < count; i++){
 array.push(fruits.pop(i))
}
console.log(array);

这个版本给了我我想要的["Mango", "Apple", "Orange", "Banana"]。因此,它们之间的唯一区别是,在第一个中,我直接在for循环中使用fruits.length,在第二个中将fruits.length的值分配给count,然后在第二个中使用for循环。我不明白为什么他们会产生两种不同的结果。他们不是同一回事吗?有人可以帮忙了解一下这里发生了什么吗?

5 个答案:

答案 0 :(得分:2)

您要从数组中删除水果,即fruits.pop(i),这将使fruits.length减少。然后在循环中每次对其进行评估。

因此,您的第二个示例正常工作是完全有意义的。在这里,您一次只能设置一次长度。

答案 1 :(得分:2)

使用fruits.pop()从数组中删除最后一个元素,因此在第一次通过时,i = 0和fruits.length = 4,下一次通过i = 1并且fruits.length = 3,下一遍i = 2并且fruits.length也= 2,因此您的i < fruits.length检查不再通过,循环结束。

在第二个示例中,您将长度预定义为等于4,并且在您从数组中删除元素时该长度不变,因此循环在i <4时继续。

答案 2 :(得分:2)

基本上,array.length将在每个循环中求值,并且每次将数组大小更改-1。由于您是在进入循环之前将计数分配给变量,因此该变量不会更改。

让我们分解一下:

您的数组有4个项目,您的计数器为0。 迭代一次,从数组中删除一项,计数器将增加1。现在array.length是3。

发生同样的事情,现在counter为2,array.length为2。

当第三次尝试运行时,条件将不匹配,并且代码将无法运行。这就是数组仅包含两个元素的原因。

答案 3 :(得分:1)

嗯,您正在使用 pop() 方法,该方法在读取数组后将其从数组中删除。

一开始,您有4个元素。

因此,循环开始访问最后一个元素,并将其从 fruits 中删除,然后添加到新数组中。
在下一个循环长度为3而不是4。
然后长度为2,这是循环不符合继续条件的地方。

如果将计数编号存储在变量中,则不会影响后面的数组计数。

答案 4 :(得分:1)

首先,Array.pop不确认任何参数。因此,fruits.pop(i)fruits.pop()是一回事。

了解第一个循环

for(var i = 0; i < fruits.length; i++){
 array.push(fruits.pop(i))
}

对于 i = 0 fruits = ["Banana", "Orange", "Apple", "Mango"]fruits.length = 4-> i TRUE ,进入循环并弹出1个值

对于 i = 1 fruits = ["Banana", "Orange", "Apple"]fruits.length = 3-> i TRUE ,进入循环并弹出1个值

对于 i = 2 fruits = ["Banana", "Orange"]fruits.length = 2-> i FALSE ,打破循环


了解第二个循环

for(var i = 0; i < count; i++){
 array.push(fruits.pop(i))
}

对于 i = 0 fruits = ["Banana", "Orange", "Apple", "Mango"]count = 4-> i <计数 TRUE ,进入循环并弹出1个值

对于 i = 1 fruits = ["Banana", "Orange", "Apple"]count = 4-> i <计数 TRUE ,进入循环并弹出1个值

对于 i = 2 fruits = ["Banana", "Orange"]count = 4-> i <计数 TRUE ,进入循环并弹出1个值

对于 i = 3 fruits = ["Banana"]count = 4-> i <计数 TRUE ,进入循环并弹出1个值

对于 i = 4 fruits = []count = 4-> i <计数 FALSE ,中断循环