下面的代码是如何执行的?
if(a=2 && (b=8))
{
console.log(a)
}
输出
a=8
下面的代码是如何执行的?
if(a=2 && (b=8))
{
console.log(a)
}
输出
a=8
与if
语句无关,但是:
if(a=2 && (b=8))
这里的最后一个,(b=8)
,实际上返回的是8,因为赋值操作总是返回被赋的值,所以它与写成下面这样是一样的
a = 2 && 8;
而 2 && 8
返回 8
,因为 2 是真值,所以这与写 a = 8
是相同的。
在if
语句中进行变量赋值通常是一个不好的做法。然而,在这种特殊情况下,你基本上正在做这件事:
if(a = (2 && (b = 8)));
(b = 8)
部分返回 8
,因此我们可以将其重写为:
if(a = (2 && 8))
&&
运算符如果左侧被视为真,则返回右侧的值,因此2 && 8
返回8
,所以我们可以再次重写为:
if(a = 8)
(a=2 && (b=8))
(a=2 && (b=8)) evaluated to a = 2 && 8
所以当2 && 8时,返回a = 8
a = (2 && (b=8))
&&
语句时,最后一个true语句的值将被返回。在这里(b=8)将成为值8
,它是最后一个语句并且为true。您正在将 a
设置为 2 && (b=8)
,而不是进行比较。由于 2
是真值,表达式的第二部分将被执行,即 a = true && (b = 8)
,即 a = (b = 8)
,即 a = 8
。
a = 2 && (b = 8)
的计算如下:
&&
运算符在=
之前进行计算,因为它具有更高的优先级
2
被计算为真b = 8
被计算(b
变成了8
并返回8
)8
被返回a = 8
被计算(a
变成了8
并返回8
)最后,if
语句检查8
。
2
并不起任何作用。但是,如果我们使用一些假值,则结果将完全不同。在这种情况下,a
将包含该假值,而b
将保持不变。2
为什么是真值? - Engineer2021
b=8
放在括号里但不把a=2
放进去?看起来几乎像是一个捣乱的尝试。 - Niklas B.b=
时,为什么不去检查一下b
的值呢?那样就足够提供线索了... - rvighneb=8
更高的优先级,或者简单地说,避免错误。 - Jay Shuklaa = (2 && (b=8))
。这基本上可以帮助你找出问题所在。至少在在发布 Stack Overflow 上的问题之前,我期望你进行最少量的调试。 - Niklas B.