我的javascript数组中出现了未识别的值

时间:2012-02-17 20:35:16

标签: javascript arrays

我正在创建一个小游戏,我有一个代码可以在一段时间内收集按键。

var pressedKeys = [];

setTimeout(function() {
     for(var i = 0; i < pressedKeys.length; i++)
     alert("Time is up you have inputed " + pressedKeys[i] + " length " + pressedKeys.length);
}, 3000);

$(document).keydown(function(evt) {
    var key = evt.keyCode;
if (pressedKeys.length < 1) {
    pressedKeys[0] = key;
} else {
    pressedKeys[pressedKeys.length + 1] = key;
}
});

我是javascript的新手,我无法理解为什么我在数组中有未识别的值。对我来说有趣的是,如果我用foreach做循环,我就不会得到不明的值。

有人可以向我解释一下。我会非常感激。

3 个答案:

答案 0 :(得分:3)

此...

pressedKeys[pressedKeys.length + 1] = key;

应该是这个......

pressedKeys[pressedKeys.length] = key;

由于数组索引从零开始,数组中当前的最后一项将是length - 1,这意味着下一个要填充的项目将是.length处的项目。


你实际上可以摆脱if陈述......

$(document).keydown(function(evt) {
    pressedKeys[pressedKeys.length] = evt.keyCode;
});

它以.length 0开头,因此第一个条目位于索引0,这使得.length等于1,所以下一个条目将在索引1,依此类推......

答案 1 :(得分:2)

因此:

} else {
    pressedKeys[pressedKeys.length + 1] = key;
}

length属性返回数组的长度。数组是从零开始的,所以当你引用length索引时,你指的是一个不存在的元素。
在位置length + 1添加元素时,您将在最后一个元素和新元素之间创建一个间隙。

发生这种情况:

var pressedKeys = [];
var length = pressedKeys.length; // Equal to zero, 0
pressedKeys[length + 1] = key;   // Inserts key at position 0 + 1 = 1
// result: pressedKeys = [undefined, key]

要解决此问题,请不要添加+1或使用push方法:

pressedKeys.push(key);

答案 2 :(得分:0)

pressedKeys[pressedKeys.length + 1] = key;

这实际上会跳过元素。数组是零索引的。

假设你在数组中有3个元素,它们将是:

  • pressedKeys[0]
  • pressedKeys[1]
  • pressedKeys[2]

当该行运行时pressedKeys.length将为3,从而将值插入pressedKeys[4]。这将使pressedKeys[3]未定义。

该行应为pressedKeys[pressedKeys.length] = key,或者更好,不要使用长度,只需push到数组上。

$(document).keydown(function(evt) {
    var key = evt.keyCode;
    pressedKeys.push(key); // this will add to the end of the array,
                           // no need to calculate the position
});