2012-02-17 2 views
1

Я создаю маленькую игру, и у меня есть мир кода, который собирает нажатые клавиши в течение промежутка времени.Неопознанные значения, появляющиеся в моем массиве javascript

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

Это ...

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, и так далее ...

+0

'pressKeys.push (key)' будет еще лучше. –

+0

@Rocket: Это вариант, но как это лучше? –

+0

Зачем нужно свойство 'length', а затем добавить к массиву в этой позиции, когда вы можете просто сказать« добавить в конец »? –

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); 
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 
}); 
Смежные вопросы