为什么要执行以下代码:
var foo=10;
foo==true //false
返回假?因为任何数字都是真的,所以不应该是真的吗?
答案 0 :(得分:2)
这取决于上下文。如果foo
如代码中那样初始化
var foo = 10;
然后
if (foo) alert("it's true!");
将触发alert()
,因为在这种情况下,if
测试只是变量的值,即“真实”值10。
但是,比较foo == true
是不同的上下文:这是“抽象”相等操作。在那里,数字和布尔值之间的比较会首先将布尔值转换为数字。根据定义,true
变为1。然后进行比较,并且10显然不等于1。
几乎没有理由将表达式值与true
或false
进行显式比较。如果要查看某个值是否为“真值”(您知道的值是数字,但您不知道 exact 值),则可以得到与{{1} }测试将获得:
if
将var isTruthy = !!foo;
布尔补余运算符两次应用于!
的值。第一个应用程序首先将10转换为foo
,然后将其转换为true
。第二个应用程序将false
转换回false
,因此true
的值将为isTruthy
。
答案 1 :(得分:1)
在您的比较中,true
变成了1
,因为foo
是一个数字。
检查以下示例代码片段:
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));