在javascript中,在Visual Studio Code中编辑,在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
为什么我在第二种情况下得到错误,但第一种情况包括相同的属性?
修改的
我一直在阅读这些关于短路的答案,但它没有点击,有人可以帮助我形成一个布尔表达式吗? 基本上,piece.color可能是三种情况之一
我想跑
continue;
在情况下
(piece.color == null || piece.color == swap_color(us))
以及piece.color !== UNION
因此我错误的第一次尝试
答案 0 :(得分:4)
为什么我在第二种情况下得到错误,但第一种情况包括相同的属性?
布尔运算符为short circuiting。这意味着
a || b
:b
仅在a
为false
时评估a && b
:b
仅在a
为true
时评估因此,如果piece.color !== us
为piece == null
,则false
仅执行,即piece
不是null
或{{1} }}。这意味着访问undefined
将始终"工作" (它不会抛出错误)。
另一方面,如果piece.color
为piece.color !== UNION
,则会执行piece == null
。您写的内容基本上意味着"如果true
为空且piece
不是piece.color
。但这并没有多大意义(因为UNION
为piece
意味着null
不存在)。
我想在
的情况下运行piece.color
和continue;
(piece.color == null || piece.color == swap_color(us))
"和"在这句话中转换为布尔OR。但您仍需检查piece.color !== UNION
是否piece
并且您可以简化表达式,因为null
隐含piece.color !== UNION
。
piece.color == swap_color(us)
答案 1 :(得分:0)
如果piece
为空,那么piece == null || piece.color !== us))
将为真,而不会检查piece.color !== us
,因此会piece.color !== UNION
进行评估,但因为piece
为空piece.color
是未定义的。
你的逻辑就是这样的错误。事实上我有点不对,我不确定你的意思。看来你的意思是;如果piece
为空,您希望发生什么?
答案 2 :(得分:0)
这是因为名为short-circuit evaluation:
的事情让我们假设piece == null
:在第一种情况下,编译器只需要评估or
的左侧。获得true
后,它可以跳过右侧,因为无论如何整个表达式都是true
。
在第二种情况下,左表达式评估为true
,如上所述,但编译器尝试评估右侧,因为and
要求双方都为true
。这就是它遇到不存在的财产的地方。
试试这个:
if (piece === null || (piece && piece.color && piece.color !== us && piece.color !== UNION)