Javascript 属性被标记为未定义,即使它在同一行上被完美地使用?
在javascript中,在Visual Studio代码中编辑,在Google Chrome上运行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
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)