为什么 if 语句中的赋值等同于 true?

Why does an assignment in an if statement equate to true?

提问人:sab669 提问时间:6/19/2017 最后编辑:decezesab669 更新时间:6/19/2017 访问量:398

问:

首先,我要说的是,我理解 、 和 之间的区别。第一个用于将右侧值分配给左侧变量,第二个用于比较两个值的等价性,第三个不仅用于等价性,还用于类型比较(即返回)。======true === 1false

所以我知道,几乎任何时候你看到,作者很有可能打算使用。if (... = ...)==

也就是说,我不完全理解这些脚本发生了什么:

var a = 5;

if (a = 6)
	console.log("doop");

if (true == 2)
	console.log('doop');

根据此 Javascript 类型等价表,等价于 但不是 或 。因此,对我来说,第二个脚本不输出任何内容是有道理的(至少,它在我的 Chrome v58.0.3029.110 中)。true10-1

那么,为什么第一个脚本输出到控制台,而第二个脚本没有呢?第一个脚本的语句正在评估什么?if

我深入研究了我的 C# 知识来帮助我理解,但在 C# 中您无法编译,因此我不得不通过这样做将其显式转换为布尔值,但这是有道理的,它将计算为 true,因为根据 MSDN 的文档,如果提供的值不是 .所以这对我没有多大帮助,因为仅在 JS 中并且是相等的。if (a = 5) Console.WriteLine("doop");if (Convert.ToBoolean(a = 5))Convert.ToBool01true

javascript if 语句 相等 等于运算符

评论

2赞 Pointy 6/19/2017
那个“等价表”是错误的。任何非零数字在测试时都作为布尔值进行测试,任何非空字符串也是如此。true
2赞 CBroe 6/19/2017
因为赋值表达式的值是赋值。
1赞 Bathsheba 6/19/2017
@CBroe:稍微正式一点,它是“lvalue”的新值。
0赞 deceze 6/19/2017
运算符返回分配的值。这意味着表达式的值是 。这用于诸如 ()...=a = 66a = b = 6a = (b = 6)
0赞 epascarello 6/19/2017
stackoverflow.com/questions/19839952/......

答:

1赞 Quentin 6/19/2017 #1

为什么 if 语句中的赋值等同于 true?

事实并非如此。赋值将按赋值进行评估。

此表达式为真值:

a = true

但是这个表达式是一个错误值:

b = false

无论你是否把它放在声明中,都是真的。if

评论

1赞 Quentin 6/19/2017
抽象相等比较算法不会比较真实性,因为 LHS 上有布尔值。
1赞 Pointy 6/19/2017 #2

与数字值进行抽象相等性比较和执行简单的类型转换到数字值的布尔值是有区别的。在布尔值和数字之间的比较中,布尔值在比较之前转换为 0 或 1。因此在====

if (true == 2)

该值首先转换为 ,然后与 进行比较。true12

在类型转换情况下,例如

if (x = 2)

该数字将转换为布尔值,以便任何非零值都为 true。也就是说,将值赋给 ,并且整体表达式的值为 。然后,作为语句计算的一部分,将其测试为布尔值,因此被转换为 ,因为不是 。2x2iftrue20

计算结果为布尔值的各种值是 、 、 、 、 ,当然还有 。任何其他值在测试为布尔值时(例如,在表达式中)。false0NaN""nullundefinedfalsetrueif