JavaScript调试挑战

时间:2018-02-23 13:15:30

标签: javascript

根据议程,我应该得到以下结果:

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);
}
&#13;
&#13;
&#13;

我正在尝试使用chrome进行调试。循环执行几乎没有造成混淆。谁能帮助我找到我做错的地方?

6 个答案:

答案 0 :(得分:2)

pop()从数组中删除元素。

这会缩短数组。

这会使length的值变小。

i为3时,您将从阵列中删除3个元素,使其不再是< array.length

答案 1 :(得分:0)

您通过关闭值来缩短数组,因此每次迭代都会更改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);
}

答案 2 :(得分:0)

当您致电array.pop()时,数组大小将减少一个。 这就是为什么只打印3个数字的原因。

答案 3 :(得分:0)

这里的问题是每次弹出数组的长度变短一个并且在某个时刻(在中间),增加的索引变得大于数组的长度。

迭代看起来像这样

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

答案 4 :(得分:-1)

i为3时,由于pop()减小其大小,数组的长度为2,这意味着已达到for循环的端点。将长度存储在另一个变量中,您的代码就可以运行工作片段:

&#13;
&#13;
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);
}
&#13;
&#13;
&#13;

答案 5 :(得分:-1)

简单的逻辑。我才发现,但很晚。 : - (

以下是逻辑:

<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>