标记为未定义的属性,即使它在同一条线上使用完美无瑕?

时间:2017-10-31 23:22:33

标签: javascript short-circuiting

在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可能是三种情况之一

  • us
  • 他们(与swap_color(我们)相同
  • UNION

我想跑

continue;

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

因此我错误的第一次尝试

3 个答案:

答案 0 :(得分:4)

  

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

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

  • a || bb仅在afalse时评估
  • a && bb仅在atrue时评估

因此,如果piece.color !== uspiece == null,则false 仅执行,即piece不是null或{{1} }}。这意味着访问undefined将始终"工作" (它不会抛出错误)。

另一方面,如果piece.colorpiece.color !== UNION,则会执行piece == null。您写的内容基本上意味着"如果true为空且piece不是piece.color。但这并没有多大意义(因为UNIONpiece意味着null不存在)。

  

我想在piece.colorcontinue;

的情况下运行(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)