JavaScript中if条件语句内的变量赋值

36

下面的代码是如何执行的?

if(a=2 && (b=8))
{
    console.log(a)
}

输出

a=8

8
为什么你把b=8放在括号里但不把a=2放进去?看起来几乎像是一个捣乱的尝试。 - Niklas B.
当你看到 b= 时,为什么不去检查一下 b 的值呢?那样就足够提供线索了... - rvighne
@NiklasB。如果我不把b=8放在括号里,那么它会给我一个错误,因为它会执行类似于a = (2 && b=8)的操作。我对这个错误不是很清楚,但是把b=8放在括号里的原因只是为了给b=8更高的优先级,或者简单地说,避免错误。 - Jay Shukla
1
@Jay,你已经知道代码解析为a = (2 && (b=8))。这基本上可以帮助你找出问题所在。至少在在发布 Stack Overflow 上的问题之前,我期望你进行最少量的调试。 - Niklas B.
6个回答

44

if语句无关,但是:

if(a=2 && (b=8))

这里的最后一个,(b=8),实际上返回的是8,因为赋值操作总是返回被赋的值,所以它与写成下面这样是一样的

a = 2 && 8;

2 && 8 返回 8,因为 2 是真值,所以这与写 a = 8 是相同的。


太好了。非常感谢您的详细解释。 - Jay Shukla
4
当然,这个副作用是b也会变成8。 - CompuChip
@CompuChip - 是的,这个赋值将 8 分配给了 b,但是分配语句也会返回已分配的值,所以这是正确的。 - adeneo
赋值操作总是返回被赋的值 - 我不知道这个,谢谢。 - Valdas

19

if语句中进行变量赋值通常是一个不好的做法。然而,在这种特殊情况下,你基本上正在做这件事:

if(a = (2 && (b = 8)));

(b = 8) 部分返回 8,因此我们可以将其重写为:


if(a = (2 && 8))

&&运算符如果左侧被视为真,则返回右侧的值,因此2 && 8返回8,所以我们可以再次重写为:

if(a = 8)

是因为任何大于0的值都被视为真吗? - Engineer2021
@staticx 当将任何非零整数(正数或负数)转换为布尔值时,都被视为真。 - Anthony Grist

8
它被称为“操作符优先级”。
(a=2 && (b=8))

在上述例子中,结果对主要的&&符号进行评估。
(a=2 && (b=8)) evaluated to a = 2 && 8

所以当2 && 8时,返回a = 8


5
您的陈述被解释为:
a = (2 && (b=8))

当您使用&&语句时,最后一个true语句的值将被返回。在这里(b=8)将成为值8,它是最后一个语句并且为true。

5

您正在将 a 设置为 2 && (b=8),而不是进行比较。由于 2 是真值,表达式的第二部分将被执行,即 a = true && (b = 8),即 a = (b = 8),即 a = 8


4
为了理解发生了什么,请参考运算符优先级和结合性表。表达式a = 2 && (b = 8)的计算如下:
  • && 运算符在=之前进行计算,因为它具有更高的优先级
    • 左侧表达式2被计算为真
    • 右侧表达式b = 8被计算(b变成了8并返回8
    • 8被返回
  • a = 8被计算(a变成了8并返回8

最后,if语句检查8

请注意,此示例中2并不起任何作用。但是,如果我们使用一些假值,则结果将完全不同。在这种情况下,a将包含该假值,而b将保持不变。

2 为什么是真值? - Engineer2021

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接