繁体   English   中英

JavaScript 调试挑战

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM