所以我在做一个涉及反转数组的问题。它以数组作为参数,并产生一个新数组,该数组具有相反的顺序相同的元素。这是我起初想到的。
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循环。我不明白为什么他们会产生两种不同的结果。他们不是同一回事吗?有人可以帮忙了解一下这里发生了什么吗?
答案 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
对于 i = 1 ,fruits = ["Banana", "Orange", "Apple"]
,fruits.length = 3
-> i
对于 i = 2 ,fruits = ["Banana", "Orange"]
,fruits.length = 2
-> i
了解第二个循环
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 ,中断循环