属性 标记为未定义,即使它在同一行上完美使用?

property marked as undefined even though it is being used on the same line flawlessly?

in javascript,编辑 Visual Studio 代码,运行ning on Google Chrome

if ((piece == null || piece.color !== us)) 

上面的行 运行s 属性 没有问题,但是,当我将其更改为:

if ((piece == null || piece.color !== us) && piece.color !== UNION) 

或更改此:

if (piece.color == null || piece.color == swap_color(us))

我收到以下错误:

Uncaught TypeError: Cannot read property 'color' of undefined

为什么我在第二种情况下得到错误,而第一种情况包含相同的错误属性?

编辑

我一直在阅读这些关于短路的答案,但没有点击,有人可以帮我构造一个布尔表达式吗? 基本上,piece.color 可能是三种情况之一

我要运行

continue;

在某些情况下 (piece.color == null || piece.color == swap_color(us))piece.color !== UNION

因此我的第一次尝试是错误的

Why do I get the error in the second case, yet the first case included that same property?

布尔运算符是 short circuiting。这意味着

  • a || b:仅当 afalse
  • 时才评估 b
  • a && b:仅当 atrue
  • 时才评估 b

因此,如果 piece == nullfalsepiece.color !== us 执行 ,即 piece 不是 null ] 或 undefined。这意味着访问 piece.color 将始终 "work" (它不会抛出错误)。

另一方面,如果 piece == nulltrue,则执行 piece.color !== UNION。你写的基本上意味着“如果 piece 是空的并且 piece.color 不是 UNION。但这没有多大意义(因为 piecenull 意味着piece.color 不存在)。


I want to run continue; in situations when (piece.color == null || piece.color == swap_color(us)) and when piece.color !== UNION

这句话中的"and"翻译成布尔OR。但是你仍然需要检查 piece 不是 null 并且你可以简化表达式,因为 piece.color !== UNION 意味着 piece.color == swap_color(us).

if (piece == null || piece.color !== UNION) {
  continue;
}

如果 piece 为空,则 piece == null || piece.color !== us)) 将为真而不检查 piece.color !== us,因此 piece.color !== UNION 将被评估,但因为 piece 为空 piece.color 未定义。

你的逻辑在这方面是有问题的。事实上如此错误,我不确定你的意思。你的意思似乎是;如果 piece 为空,你希望发生什么?

发生这种情况是因为 short-circuit evaluation:

假设piece == null:在第一种情况下,编译器只需要评估or 的左侧。在获得 true 后,它可以跳过右侧,因为整个表达式无论如何都是 true

在第二种情况下,左边的表达式像上面一样计算为 true,但是编译器随后尝试计算右边的值,因为 and 要求两边都是 true.那就是它遇到不存在的 属性.

的地方

试试这个:

if (piece === null || (piece && piece.color && piece.color !== us && piece.color !== UNION)