我正在创建一个小游戏,我有一个代码可以在一段时间内收集按键。
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做循环,我就不会得到不明的值。
有人可以向我解释一下。我会非常感激。
答案 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
});