Estaba haciendo un programa que registraba cada pulsación de tecla y lo empujaba a una matriz y funciona bien. El problema es que cuando intento acceder al primer elemento de la matriz y registrarlo, se imprime sin definir. Pero toda la matriz registra bien. ¿Por qué se imprime sin definir? He agregado tanto el registro de la consola de la matriz como el elemento de la matriz en mi código y he comentado además de ellos para indicar. Cualquier ayuda es apreciada. Gracias por adelantado.
EDITAR: resulta que lo que no funciona es acceder al último elemento. He actualizado el código de arriba
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)Javascript accede a los elementos de la matriz por su índice. -1 es un índice no válido. Para acceder al último elemento, use arr[arr.length - 1] .
Otros lenguajes, como python, ofrecen azúcar sintáctico para acceder a elementos desde el final de una matriz. JavaScript no tiene tal azúcar sintáctico. Lo más cercano que puede obtener es escribir arr.slice(-1)[0] , pero esto creará una matriz temporal de un solo elemento y luego accederá al primer elemento de esta matriz.
De hecho, -1 es una propiedad , no un índice válido. Los nombres de las propiedades primero se clasifican en cadenas y luego se agregan al objeto (cada matriz es un objeto):
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 firstEn lugar de esto:
//doesn't work setInterval(function() { console.log(cacheW[0])//logs undefined, should have logged the first element }, 50)Este:
setInterval(function() { if (cacheW.length > 0) { console.log(cacheW[0]); } else { console.log("<empty>"); } }, 50);Actualizar Si desea imprimir el último elemento:
setInterval(function() { if (cacheW.length > 0) { console.log(cacheW[cacheW.length-1]); } else { console.log("<empty>"); } }, 50);