在for循环中,某个东西在变量中时作为错误响应,但在变量中不存在时则是正常的



所以我正试图用我所掌握的有限知识编写一个棋盘,我取得了惊人的成功。但是有一些奇怪的事情。

在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时,实际上会创建新的内存空间并将其分配给该内存空间。

  1. 但是,当您将数组或对象分配给新的javascript变量时,它只是引用该特定变量,而不是复制该变量
  2. 因此,当您将数组分配给变量IM,然后从实际数组中删除i时。因此,IM变得未定义,因为该特定索引正在被删除
  3. 实际问题是在你的if条件中,你可以通过评论if条件来检查它
  4. 如果您真的想使用这种可变技术,请使用深度复制来制作legalMoves数组的实际副本

最新更新