【发布时间】:2019-04-29 07:37:05
【问题描述】:
为什么会出现以下代码:
var foo=10;
foo==true //false
返回假?不应该是真的,因为任何数字都是真的?
【问题讨论】:
-
以前在这里回答过:stackoverflow.com/a/12236341/1024832。要点是
true转换为1。要将数字强制转换为布尔值,您可以像这样将其加倍:!!foo==true。
标签: javascript
为什么会出现以下代码:
var foo=10;
foo==true //false
返回假?不应该是真的,因为任何数字都是真的?
【问题讨论】:
true 转换为1。要将数字强制转换为布尔值,您可以像这样将其加倍:!!foo==true。
标签: javascript
这是一个上下文问题。如果foo 已按照您的代码进行初始化
var foo = 10;
然后
if (foo) alert("it's true!");
将触发 alert(),因为在这种情况下,if 测试只是变量的值,即“真实”值 10。
但是,比较 foo == true 是一个不同的上下文:它是“抽象”相等操作。在那里,数字和布尔值之间的比较首先强制将布尔值转换为数字。根据定义,这会将true 变为 1。然后进行比较,10显然不等于1。
很少有理由明确地将表达式值与true 或false 进行比较。如果您想查看一个值是否“真实”(您知道的值是数字,但您不知道 exact 值),您可以获得与if 测试相同的结果会得到:
var isTruthy = !!foo;
这会将! 布尔补码运算符两次 应用于foo 的值。第一个应用程序首先将 10 转换为 true,然后将其反转为 false。第二个应用程序将false 转换回true,因此isTruthy 的值将是true。
【讨论】:
在您的比较中,true 变成了1,因为foo 是一个数字。
检查此示例 sn-p:
var foo = 10;
console.log("foo: " + foo);
console.log(foo==true);
var foo = 1;
console.log("foo: " + foo);
console.log(foo==true);
您可能还想了解严格比较,这将防止数字和布尔值之间的比较返回 true 值:
var foo = 1;
console.log("foo: " + foo);
console.log("Regular comparison: " + (foo==true));
console.log("Strict comparison: " + (foo===true));
【讨论】: