[英]JavaScript Debugging Challenge
根据议程,我应该得到以下输出:
Element at 1 popped-out with value 10
Element at 2 popped-out with value 20
Element at 3 popped-out with value 30
Element at 4 popped-out with value 40
Element at 5 popped-out with value 50
但是,我低于输出。
Element at 1 popped-out with value 10
Element at 2 popped-out with value 20
Element at 3 popped-out with value 30
下面是我试图调试的 JavaScript。
var writeMessage = function(i) { return document.write("Element at " + (i + 1) + " popped-out with value " + array.pop() + "<br />"); }; var array = [50, 40, 30, 20, 10]; for (var i = 0; i < array.length; i++) { writeMessage(i); }
我正在尝试在 chrome 中调试。 循环执行引起了一些混乱。 任何人都可以帮我找到我做错的地方吗?
pop()
从数组中删除元素。
这使得数组更短。
这使得length
的值更小。
当i
为 3 时,您将从数组中删除 3 个元素,因此它不再是< array.length
。
您通过弹出值来缩短数组,因此每次迭代都会更改 array.length。 你可以同时循环它..
此外,在第一次迭代中,您正在播种最后一项。当i
为零时,您将显示第 6 个索引,当i
为 5 时,您将显示第一个索引。 这是因为pop()
从数组中取出最后一个项目,您应该使用shift
来从数组中取出第一个项目。
var writeMessage = function(i) { return document.write("Element at " + (i) + " popped-out with value " + array.shift() + "<br />"); }; var array = [50, 40, 30, 20, 10], i; while (i = array.length) { writeMessage(i); }
或者您可以使用 for 循环并直接引用每个数组索引而不是更改数组。
var writeMessage = function(i) { return document.write("Element at " + (array.length - i) + " popped-out with value " + array[i] + "<br />"); }; var array = [50, 40, 30, 20, 10]; for (var i = 0; i < array.length; i++) { writeMessage(i); }
当您调用array.pop()
,数组大小将减一。 这就是为什么只打印 3 个数字的原因。
这里的问题是,每次弹出数组的长度都会变短,并且在某个点(中间)增加的索引变得大于数组的长度。
迭代看起来像这样
Initial state: array.length=5 i=0
1. if(i < array.length) pop & print (value=10)
2. array.length=4 i=1
3. if(i < array.length) pop & print (value=20)
4. array.length=3 i=2
5. if(i < array.length) pop & print (value=30)
6. array.length=2 i=3
7. if(i < array.length) <- here your iteration stops since the condition for the loop is false
当i
为 3 时,由于pop()
减小其大小,数组的长度为 2,这意味着到达了 for 循环的端点。 将长度存储在另一个变量中,您的代码就可以工作了。 工作片段:
var writeMessage = function(i) { return document.write("Element at " + (i + 1) + " popped-out with value " + array.pop() + "<br />"); }; var array = [50, 40, 30, 20, 10]; var l = array.length; for (var i = 0; i < l; i++) { writeMessage(i); }
简单的逻辑。 我才发现,但晚了。 :-(
下面是逻辑:
<html>
<head>
<script type="text/javascript">
var writeMessage = function (i) {
return document.write("Element at " + (i + 1) + " popped-out with value " + array.pop() + ". Now, the array length is: " + array.length + "<br />");
};
var array = [50, 40, 30, 20, 10];
for (var i = 0; array.length > 0; i++) {
writeMessage(i);
}
</script>
</head>
<body>
</body>
</html>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.