Javascript 为什么是;及;“之前评估”;“相等”;

Javascript 为什么是;及;“之前评估”;“相等”;,javascript,operator-precedence,Javascript,Operator Precedence,在Javascript中,strict equal(10)大于逻辑和(6)那么这段代码是如何工作的 var-a; console.log(“a的值为”,a); 如果(a&&a.test==“test”){}某些编程语言,如JavaScript,会延迟计算逻辑表达式。这意味着如果表达式的第一部分(a)为false,解释器甚至没有理由执行第二部分(a.test==“test”),因此不会抛出错误 为了澄清,优先级并不定义表达式的实际执行顺序,只定义有效顺序。因此,成员访问运算符具有最高优先级并不意

在Javascript中,
strict equal
(10)大于
逻辑和
(6)那么这段代码是如何工作的

var-a;
console.log(“a的值为”,a);

如果(a&&a.test==“test”){}
某些编程语言,如JavaScript,会延迟计算逻辑表达式。这意味着如果表达式的第一部分(
a
)为false,解释器甚至没有理由执行第二部分(
a.test==“test”
),因此不会抛出错误


为了澄清,优先级并不定义表达式的实际执行顺序,只定义有效顺序。因此,
成员访问
运算符具有最高优先级并不意味着它将首先执行。解释器仍然可以首先计算
a
,而不影响任何更高优先级运算符的结果。您可以将优先级视为隐式括号,如果您将表达式编写为
(a)&&((a.test)==“test”)
,您可以清楚地看到
a
可以并且将首先计算,因为它位于表达式的最左边。

一些编程语言,如JavaScript,会对逻辑表达式进行惰性计算。这意味着如果表达式的第一部分(
a
)为false,解释器甚至没有理由执行第二部分(
a.test==“test”
),因此不会抛出错误


为了澄清,优先级并不定义表达式的实际执行顺序,只定义有效顺序。因此,
成员访问
运算符具有最高优先级并不意味着它将首先执行。解释器仍然可以首先计算
a
,而不影响任何更高优先级运算符的结果。您可以将优先级视为隐式括号,如果您将表达式写成
(a)&&((a.test)==“test”)
,您可以清楚地看到
a
可以并且将首先求值,因为它位于表达式的最左边。

该表的意思是,在类似这样的表达式中,元素的求值为

a&&(a.test=='something')
而不是作为
(a&&a.test=='something'


这完全独立于逻辑表达式的求值方式(按出现顺序)。因此,如果
a
为false,则没有理由计算表达式的其余部分,因为无论
&&
后面是什么,表达式都将为false。如果
a
true
且运算符为
|
,则会发生同样的情况。这也称为短路

该表的意思是,在这样的表达式中,元素的求值为

a&&(a.test=='something')
而不是作为
(a&&a.test=='something'



这完全独立于逻辑表达式的求值方式(按出现顺序)。因此,如果
a
为false,则没有理由计算表达式的其余部分,因为无论
&&
后面是什么,表达式都将为false。如果
a
true
且运算符为
|
,则会发生同样的情况。这也称为短路

a
未定义的
,因此它是“falsy”,快捷方式求值不能到达
a。test
否,
a
已定义,其属性
test
为undefined@LarsBeck不,请看@MatteoTassinari,@kalsowerus我知道
快捷方式求值
不会让它到达表达式的后半部分,但我的问题是为什么这里不遵循运算符优先级。它是否应该首先计算
成员访问权限
,然后计算
严格相等
,然后计算
逻辑和
?@Claies
a
的值是
未定义的
,因为我没有设置任何值。
a
未定义的
,因此它是“错误的”,快捷方式计算不会到达
a.test
否,
a
已定义,其属性
test
为undefined@LarsBeck不,请参见@MatteoTassinari,@kalsowerus我确实理解
快捷方式求值
不允许它到达表达式的后半部分,但我的问题是为什么这里不遵循运算符优先级。它是否应该首先计算
成员访问权限
,然后计算
严格相等
,然后计算
逻辑和
的@Claies值是
未定义的
,因为我没有设置任何值。最后一行听起来很有趣。你能解释一下吗?如果是这样的话,为什么不增加逻辑运算符的优先级,让它更清楚。@a1626因为它们没有更高的优先级,
&&
是最后执行的,但在某些情况下根本不必执行。对不起,据我所知,这让人很困惑,如果根本没有执行
&&
,那么代码就不应该知道不应该执行RHS。据我所知,根据
短路
,它看到了
错误&&(未评估的代码)
,并给出了错误的结果。@a1626是的,完全正确。因为当它看到这一点时,未赋值代码的优先级就不再重要了。最后一行听起来很有趣。你能解释一下吗?如果是这样的话,为什么不增加逻辑运算符的优先级,让它更清楚。@a1626因为它们没有更高的优先级,
&&
是最后执行的,但在某些情况下根本不必执行。对不起,据我所知,这让人很困惑,如果根本没有执行
&&
,那么代码就不应该知道不应该执行RHS。据我所知,根据
短路
,它看到了
错误&&(未评估的代码)
,并给出了错误的结果。@a1626是的,完全正确。和