在JavaScript中的“if”条件中进行variables赋值
下面的代码是如何执行的?
if(a=2 && (b=8)) { console.log(a) }
OUTPUT
a=8
它与if
语句无关,但是:
if(a=2 && (b=8))
这里最后一个(b=8)
实际上返回8,因为赋值总是返回赋值,所以它和写
a = 2 && 8;
2 && 8
返回8
,因为2是真,所以和写a = 8
。
像这样的if
语句中进行variables赋值通常是一个糟糕的主意。 但是,在这个特定的情况下,你基本上是这样做的:
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)
。 因为2
是a = true && (b = 8)
,所以expression式的后半部分将被执行,即a = true && (b = 8)
,即a = (b = 8)
,即a = 8
。
你的陈述被解释为
a = (2 && (b=8))
当你使用&&
语句时,最后的真实语句值将被返回。 这里(b = 8)将变成值8
,这是真实的和最后的陈述。
要了解正在发生的事情,请参阅运算符优先级和关联性图表 。 expression式a = 2 && (b = 8)
的评估如下:
-
&&
操作符在=
之前被评估,因为它具有更高的优先级- 评估左手expression式
2
是真实的 - 评估右边expression式
b = 8
(b
变成8
并且返回8
) -
8
返回
- 评估左手expression式
- 评估
a = 8
(a
变成8
和8
返回)
最后, if
语句被testing了8
。
请注意,在这个例子中2
不起任何作用。 但是,如果我们使用一些虚假的价值,那么结果将是完全不同的。 在这种情况下, a
将包含这个虚假值,而b
将保持不变。