属性 标记为未定义,即使它在同一行上完美使用?
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 可能是三种情况之一
- 无
- 我们
- 他们(与 swap_color(us)
相同
- 联盟
我要运行
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
:仅当 a
为 false
时才评估 b
a && b
:仅当 a
为 true
时才评估 b
因此,如果 piece == null
是 false
,piece.color !== us
仅 执行 ,即 piece
不是 null
] 或 undefined
。这意味着访问 piece.color
将始终 "work" (它不会抛出错误)。
另一方面,如果 piece == null
是 true
,则执行 piece.color !== UNION
。你写的基本上意味着“如果 piece
是空的并且 piece.color
不是 UNION
。但这没有多大意义(因为 piece
是 null
意味着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)
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 可能是三种情况之一
- 无
- 我们
- 他们(与 swap_color(us) 相同
- 联盟
我要运行
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
:仅当a
为false
时才评估 a && b
:仅当a
为true
时才评估
b
b
因此,如果 piece == null
是 false
,piece.color !== us
仅 执行 ,即 piece
不是 null
] 或 undefined
。这意味着访问 piece.color
将始终 "work" (它不会抛出错误)。
另一方面,如果 piece == null
是 true
,则执行 piece.color !== UNION
。你写的基本上意味着“如果 piece
是空的并且 piece.color
不是 UNION
。但这没有多大意义(因为 piece
是 null
意味着piece.color
不存在)。
I want to run
continue;
in situations when(piece.color == null || piece.color == swap_color(us))
and whenpiece.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)