所以我正试图用我所掌握的有限知识编写一个棋盘,我取得了惊人的成功。但是有一些奇怪的事情。
在for循环中,我必须检查所有可能的动作并缩小范围(我知道不是最有效的,但我试图在尽可能少的帮助下做到这一点(。我所做的基本上是通过几个数组来尝试做到这一点
当我做时
for (i = 0; i < legalMoves.length; i++) {
if (legalMoves[i] > 63 || legalMoves[i] < 0) {
legalMoves.splice(i, 1)
i--
}
console.log(squareInfo[legalMoves[i]][2]) // line to pay attention to
}
它工作得很好,正如预期的那样,但当我做时
for (i = 0; i < legalMoves.length; i++) {
lM = squareInfo[legalMoves[i]] // variable to pay attention to
if (legalMoves[i] > 63 || legalMoves[i] < 0) {
legalMoves.splice(i, 1)
i--
}
console.log(lM[2]) // line to pay attention to
}
错误为TypeError: Cannot read property '2' of undefined
这真的很奇怪。
需要注意的是,我的数组不包含未定义的字符,当我在没有变量的情况下运行它时,它可以完美地工作,正如预期的那样。
有人知道为什么会发生这种情况吗?因为能够使用lM变量会让这个过程变得更容易。
要澄清的是,问题是为什么在变量中出现错误时会出现相同的情况
真正的问题是,您的lM
是用具有错误值的i
初始化的,因为legalMoves[i]
不被接受。
只有当i通过检查时,才应该执行lM = ...
部分。
for (i = 0; i < legalMoves.length; i++) {
if (legalMoves[i] > 63 || legalMoves[i] < 0) {
legalMoves.splice(i, 1)
i--
} else {
lM = squareInfo[legalMoves[i]] // variable to pay attention to
console.log(lM[2]) // line to pay attention to
}
}
但更好的方法是在循环之前从legalMoves
数组中移除无效值,这样就不必在循环中执行这些技巧。
const onlyLegalMoves = legalMoves.filter((move) => (move >= 0 && move <= 63));
for (i = 0; i < onlyLegalMoves.length; i++) {
const legalMove = onlyLegalMoves[i];
console.log(squareInfo[legalMove][2]) // line to pay attention to
}
最后,如果你只想找到第一个真正有效的移动,你可以使用.find
,而不是整个循环。
const moveToUse = legalMoves.find( (move) => (move >= 0 && move <= 63) );
console.log( squareInfo[moveToUse][2] );
Tradis,使用数组存储在单独变量中的方式才是真正的问题。在Javascript中,当您使用简单变量Javascript时,实际上会创建新的内存空间并将其分配给该内存空间。
- 但是,当您将数组或对象分配给新的javascript变量时,它只是引用该特定变量,而不是复制该变量
- 因此,当您将数组分配给变量
IM
,然后从实际数组中删除i时。因此,IM
变得未定义,因为该特定索引正在被删除 - 实际问题是在你的if条件中,你可以通过评论if条件来检查它
- 如果您真的想使用这种可变技术,请使用深度复制来制作
legalMoves
数组的实际副本