首页 > 解决方案 > 按返回未定义的索引记录数组项

问题描述

我正在制作一个程序,它记录每个按键并将其推送到一个数组,它工作正常。问题是当我尝试访问数组的第一个元素并记录它时,它打印未定义。但是整个数组的日志很好。为什么打印不受影响?我在我的代码中添加了数组的控制台日志和数组项,并在它们旁边进行了注释以表明。任何帮助表示赞赏。提前致谢。

编辑:结果是访问最后一项不起作用。我已经更新了上面的代码

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

解决方案


Javascript 通过索引访问数组项。-1是无效索引。要访问最后一项,请使用arr[arr.length - 1]

其他语言(例如 python)提供语法糖来访问数组末尾的项目。JavaScript 没有这样的语法糖。您可以获得的最接近的是 write 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

推荐阅读