提问人:sab669 提问时间:6/19/2017 最后编辑:decezesab669 更新时间:6/19/2017 访问量:398
为什么 if 语句中的赋值等同于 true?
Why does an assignment in an if statement equate to true?
问:
首先,我要说的是,我理解 、 和 之间的区别。第一个用于将右侧值分配给左侧变量,第二个用于比较两个值的等价性,第三个不仅用于等价性,还用于类型比较(即返回)。=
==
===
true === 1
false
所以我知道,几乎任何时候你看到,作者很有可能打算使用。if (... = ...)
==
也就是说,我不完全理解这些脚本发生了什么:
var a = 5;
if (a = 6)
console.log("doop");
if (true == 2)
console.log('doop');
根据此 Javascript 类型等价表,等价于 但不是 或 。因此,对我来说,第二个脚本不输出任何内容是有道理的(至少,它不在我的 Chrome v58.0.3029.110 中)。true
1
0
-1
那么,为什么第一个脚本输出到控制台,而第二个脚本没有呢?第一个脚本的语句正在评估什么?if
我深入研究了我的 C# 知识来帮助我理解,但在 C# 中您无法编译,因此我不得不通过这样做将其显式转换为布尔值,但这是有道理的,它将计算为 true,因为根据 MSDN 的文档,如果提供的值不是 .所以这对我没有多大帮助,因为仅在 JS 中并且是相等的。if (a = 5) Console.WriteLine("doop");
if (Convert.ToBoolean(a = 5))
Convert.ToBool
0
1
true
答:
为什么 if 语句中的赋值等同于 true?
事实并非如此。赋值将按赋值进行评估。
此表达式为真值:
a = true
但是这个表达式是一个错误值:
b = false
无论你是否把它放在声明中,都是真的。if
评论
与数字值进行抽象相等性比较和执行简单的类型转换到数字值的布尔值是有区别的。在布尔值和数字之间的比较中,布尔值在比较之前转换为 0 或 1。因此在==
==
if (true == 2)
该值首先转换为 ,然后与 进行比较。true
1
2
在类型转换情况下,例如
if (x = 2)
该数字将转换为布尔值,以便任何非零值都为 true。也就是说,将值赋给 ,并且整体表达式的值为 。然后,作为语句计算的一部分,将其测试为布尔值,因此被转换为 ,因为不是 。2
x
2
if
true
2
0
计算结果为布尔值的各种值是 、 、 、 、 ,当然还有 。任何其他值在测试为布尔值时(例如,在表达式中)。false
0
NaN
""
null
undefined
false
true
if
评论
true
=
a = 6
6
a = b = 6
a = (b = 6)