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

Javascript 属性被标记为未定义,即使它在同一行上被完美地使用?,javascript,short-circuiting,Javascript,Short Circuiting,在javascript中,在Visual Studio代码中编辑,在Google Chrome上运行 if ((piece == null || piece.color !== us)) 但是,当我将上面的行更改为以下内容时,它运行的属性没有任何问题: if ((piece == null || piece.color !== us) && piece.color !== UNION) 或者改变这一点: if (piece.color == null || piece.c

在javascript中,在Visual Studio代码中编辑,在Google Chrome上运行

if ((piece == null || piece.color !== us)) 
但是,当我将上面的行更改为以下内容时,它运行的属性没有任何问题:

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
为什么在第二种情况下会出现错误,而第一种情况下却包含相同的属性

编辑

我一直在读这些关于短路的答案,但它没有点击,有人能帮我形成一个布尔表达式吗? 基本上,单色可以是三种情况之一

  • 空的
  • 美国
  • 它们(与swap_color(美国)相同)
  • 联合
我想跑步

continue;
在以下情况下:
(piece.color==null | | piece.color==swap_color(us))
piece.color!==UNION

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

为什么在第二种情况下会出现错误,而第一种情况下却包含相同的属性

布尔运算符是。这意味着

  • a | | b
    b
    仅当
    a
    false
  • a和&b
    b
    仅当
    a
    true
因此,
piece.color!==us
仅在
piece==null
false
时执行,即
piece
不是
null
undefined
。这意味着访问
piece.color
将始终“工作”(不会抛出错误)

另一方面,如果
piece==null
true
,则执行
piece.color!==UNION
。您编写的基本意思是“如果
piece
为null且
piece.color
不是
UNION
。但这没有多大意义(因为
piece
null
意味着
piece.color
不存在)


我想在
(piece.color==null | | | | piece.color==swap_color(us))
piece.color!==UNION时运行

这个句子中的“and”转换为布尔或。但是您仍然需要检查
piece
是否为
null
,并且您可以简化表达式,因为
piece.color!==UNION
意味着
piece.color==swap\u color(us)

为什么在第二种情况下会出现错误,而第一种情况下却包含相同的属性

布尔运算符是。这意味着

  • a | | b
    b
    仅当
    a
    false
  • a和&b
    b
    仅当
    a
    true
因此,
piece.color!==us
仅在
piece==null
false
时执行,即
piece
不是
null
undefined
。这意味着访问
piece.color
将始终“工作”(不会抛出错误)

另一方面,如果
piece==null
true
,则执行
piece.color!==UNION
。您编写的基本意思是“如果
piece
为null且
piece.color
不是
UNION
。但这没有多大意义(因为
piece
null
意味着
piece.color
不存在)


我想在
(piece.color==null | | | | piece.color==swap_color(us))
piece.color!==UNION时运行

这个句子中的“and”转换为布尔或。但是您仍然需要检查
piece
是否为
null
,并且您可以简化表达式,因为
piece.color!==UNION
意味着
piece.color==swap\u color(us)


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


你的逻辑在这方面是错误的。事实上是错误的,我不知道你的意思。你的意思似乎是:如果
piece
为空,你想发生什么?

如果
piece
为空,那么
piece==null | | piece.color!==us))
将是真的,而无需检查
piece.color!==美国
,所以
piece.color!==将对UNION
进行计算,但因为
工件
为空
工件。颜色
未定义


你的逻辑在这方面是错误的。事实上我不知道你的意思。你的意思似乎是;如果
piece
为空,您希望发生什么情况?

这是由于一种称为:

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

在第二种情况下,左侧表达式的计算结果与上面类似,为
true
,但编译器会尝试计算右侧,因为
要求两侧都为
true
。这就是它遇到不存在属性的地方

试试这个:

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

发生这种情况的原因是:

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

在第二种情况下,左侧表达式的计算结果与上面类似,为
true
,但编译器会尝试计算右侧,因为
要求两侧都为
true
。这就是它遇到不存在属性的地方

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