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

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

首先让我说我了解 ===== 之间的区别 ===。第一个用于将右侧的值分配给左侧的变量,第二个用于比较两个值的等价性,第三个不仅用于等价性还用于类型比较(即 true === 1 会 return false).

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

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

var a = 5;

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

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

根据这个 Javascript type equivalency table,true 等同于 1 但不是 0-1。因此,对我来说,第二个脚本 not 输出任何东西(至少,它不在我的 Chrome v58.0.3029.110 中)是有意义的。

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

我挖掘了我的 C# 知识来帮助我理解,但是在 C# 中你不能编译 if (a = 5) Console.WriteLine("doop"); 所以我不得不通过执行 if (Convert.ToBoolean(a = 5)) 显式地将它转换为 bool 但这是有道理的将评估为真,因为根据 MSDN 的文档,如果提供的值不是 0Convert.ToBool return 为真。所以这对我没有太大帮助,因为在 JS 中只有 1true 是相等的。

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

没有。分配被评估为分配的任何值。

这个表达式是一个真值:

a = true

但是这个表达式是一个假值:

b = false

无论您是否将其放在 if 语句中都是如此。

使用 == 进行抽象相等性比较与执行从数字值到布尔值的简单类型转换之间存在差异。在布尔值和数字之间的 == 比较中,布尔值在比较 之前被转换为 0 或 1 。因此在

if (true == 2)

首先将值true转换为1,然后与2进行比较。

在像

这样的类型转换情况下
if (x = 2)

数字被转换为布尔值,这样任何非零值都为真。即2赋值给x,整个表达式的值为2。然后作为 if 语句评估的一部分将其作为布尔值进行测试,因此转换为 true,因为 2 不是 0.

计算为布尔值 false 的各种值是 0NaN""nullundefined 和当然 false任何其他值在作为布尔值测试时为true(例如在if表达式中)。