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)
解决方案
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
推荐阅读
- android-studio - 如何安装 Android Studio 3.5 Canary 12?
- anaconda - 无法激活确实存在的 anaconda venv
- vb.net - 执行存储过程时如何在vb.net编码中放入进度条
- javascript - 我如何将 URL 添加到数组中的对象
- python - 如何在使用 Glob 读取多个 CSV 文件时将标签传递给连接的数据框以指定哪些数据来自哪个 CSV 文件
- c - 使用函数调用其他处理链表的函数的语法?
- node.js - 为什么 CORS 策略会阻止我的 ip 访问我的 API?
- jestjs - 如何监视类属性中的方法?
- optaplanner - Optaplanner 无法将 nearSelection 添加到 subChainSelector
- amazon-web-services - Kafka Connect S3 动态 S3 文件夹结构创建?