#javascript
Вопрос:
Я создавал программу, которая записывала каждое нажатие клавиши и помещала ее в массив, и она отлично работает. Проблема в том, что когда я пытаюсь получить доступ к первому элементу массива и зарегистрировать его, он печатается неопределенным. Но весь массив регистрируется нормально.Почему он печатается незапятнанным? Я добавил как консольный журнал массива, так и элемент массива в свой код и прокомментировал их, чтобы указать. Любая помощь будет признательна. Заранее спасибо.
ИЗМЕНИТЬ: оказывается, что не работает, так это доступ к последнему элементу. Я обновил приведенный выше код
var cacheW = [] var cacheA = [] var cacheD = [] var cacheS = [] // (B1) CAPTURE KEY STROKES window.addEventListener("keydown", function(evt) { if (evt.key == "w") { cacheW.push('w'); //console.log("this: " evt.key) } else if (evt.key == "a") { cacheA.push('a'); //console.log("this: " evt.key) } else if (evt.key == "d") { cacheD.push('d'); //console.log("this: " evt.key) } else if (evt.key == "s") { cacheS.push('s'); //console.log("this: " evt.key) } }); window.addEventListener("keyup", function(evt) { if (evt.key == "w") { cacheW.push("!w"); //console.log("this: " evt.key " removed") } else if (evt.key == "a") { cacheA.push("!a"); //console.log("this: " evt.key " removed") } else if (evt.key == "d") { cacheD.push("!d"); //console.log("this: " evt.key " removed") } else if (evt.key == "s") { cacheS.push("!s"); //console.log("this: " evt.key " removed") } }); //works setInterval(function() { console.log(cacheW) //logs an array }, 50) //doesn't work setInterval(function() { console.log(cacheW[-1]) //logs undefined, should have logged the last element }, 50)
Комментарии:
1. его значение не определено , потому
cacheW[0]
что индекс 0 не существует в массиве2. @AlexYu, но я только что зарегистрировал весь массив выше, и он явно имеет длину gt; 1, поэтому индекс 0 должен существовать
3. @серьезно
[]
— это пустой массив. Он имеет длину 0, а не 1. Как только вы нажмете клавишу хотя бы один раз, обе ваши интервальные функции напечатают массив и первый элемент соответственно4. @knittl оказывается, что не работает доступ к последнему элементу. Я обновил приведенный выше код
5.
cacheW[-1]
не делает того, что ты думаешь. Javascript отличается от Python.
Ответ №1:
Элементы массива доступа Javascript по их индексу. -1
является недопустимым индексом. Чтобы получить доступ к последнему элементу, используйте arr[arr.length - 1]
.
Другие языки, такие как python, предлагают синтаксический сахар для доступа к элементам из конца массива. В JavaScript нет такого синтаксического сахара. Самое близкое , что вы можете получить,-это написать arr.slice(-1)[0]
, но это создаст временный массив из одного элемента, а затем получит доступ к первому элементу этого массива.
На самом деле -1
это свойство, а не действительный индекс. Имена свойств сначала строятся, а затем добавляются к объекту (каждый массив является объектом).:
a = []; a[-1] = 42; console.log(a); // [], array itself is still empty console.log(a[-1]); // 42, property -1 on the object has value assigned console.log(a['-1']); // 42, object property keys are always converted to string first
Ответ №2:
Вместо этого:
//doesn't work setInterval(function() { console.log(cacheW[0])//logs undefined, should have logged the first element }, 50)
Этот:
setInterval(function() { if (cacheW.length gt; 0) { console.log(cacheW[0]); } else { console.log("lt;emptygt;"); } }, 50);
Обновить Если вы хотите распечатать последний элемент:
setInterval(function() { if (cacheW.length gt; 0) { console.log(cacheW[cacheW.length-1]); } else { console.log("lt;emptygt;"); } }, 50);
Комментарии:
1. оказывается, то, что не работает, — это доступ к последнему элементу. Я обновил приведенный выше код
2. @серьезно — Как ты думаешь
cacheW[-1]
, что делает? Подсказка: Javascript-это не Python.3. относился к этому так, как будто ты прав. Спасибо