JavaScript中的if(x)与if(x==true)的区别

14

在 JavaScript 中,以下哪些情况下以下语句不会逻辑上相等?

if(x){}

并且

if(x==true){}

谢谢


1
尝试使用 x = 'test' 作为示例。 - VisioN
1
x=' ',x=[],x='\n',x='false' - nderscore
x = "0" 是另一个。 - Bergi
2个回答

34

它们并不完全相等。

if (x)

检查x的真值性,而后者检查x的布尔值是否为true

例如:

var x = {};
if (x) {
    console.log("Truthy");
}
if (x == true) {
    console.log("Equal to true");
}

除了空字符串和数字0 (因为0是假值) 以及数字1之外,任何字符串(非空)或数字都会被视为真值,但它们不等于true。

根据ECMA 5.1标准,在if (x)语句中,将根据以下表格决定x的真值性:

+-----------------------------------------------------------------------+
| Argument Type | Result                                                |
|:--------------|------------------------------------------------------:|
| Undefined     | false                                                 |
|---------------|-------------------------------------------------------|
| Null          | false                                                 |
|---------------|-------------------------------------------------------|
| Boolean       | The result equals the input argument (no conversion). |
|---------------|-------------------------------------------------------|
| Number        | The result is false if the argument is +0, −0, or NaN;|
|               | otherwise the result is true.                         |
|---------------|-------------------------------------------------------|
| String        | The result is false if the argument is the empty      |
|               | String (its length is zero); otherwise the result is  |
|               | true.                                                 |
|---------------|-------------------------------------------------------|
| Object        | true                                                  |
+-----------------------------------------------------------------------+

注意:最后一行object包括对象和数组。

但在后一种情况下,根据抽象相等比较算法

If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).

x的值将被转换成数字,并将该数字与true进行比较。

注意:

在JavaScript中,true1false0

console.log(1 == true);
# true
console.log(0 == false);
# true

这句话的意思是后面的内容可以使用字符串、整数或布尔值吗? - Poomrokc The 3years
1
var x = 'a'; if (x) alert("X"); if (x == true) alert("X true"); 这将只会弹出 "X" 而不是 "X true"。 - peirix
1
1 被认为是真值(来自 ECMA 5.1:如果参数是 +0、-0 或 NaN,则结果为 false;否则结果为 true)。 - Vitor Tyburski
@VitorTyburski 我已经在答案中澄清了。请检查。 - thefourtheye
1
@TheZver 好的。我在表格底部添加了一条注释 :) - thefourtheye
显示剩余6条评论

0

在第一种形式中,有几种情况会评估为false,例如空字符串、0、未定义、null。

如果你想更语义化一些,可以在表达式前面加上双感叹号:

if(!!x){...}

这将把表达式结果转换为表示相同语义的真值。这更接近于您描述的表达式(x == true)

还要注意,==是带有类型强制转换的值比较,例如"3" == 3,而===也断言相等的类型。

因此它们不是相同的,但通常在逻辑上表示相同的测试,由于语言的语义和您可以使用的!!


谢谢。"if(!!x)" 是否总是等同于 "if(x)"? - TheZver
不要想象这种情况,如果(!!"hello")和if("hello" == true),第一个表达式将评估为true,因为"hello"不是空字符串、未定义或null等,所以当转换为真值时,它是true。而第二个表达式将是false,因为"hello"不能被强制转换为等于true的值。http://jsfiddle.net/CEtN5/ - Darius
抱歉,我在问题中犯了一个错误。我指的是与if(x)的比较。 - TheZver
1
好的,我看到了你的编辑。本质上,你正在使用if(!!x)和if(x)测试相同的东西,只是!!x的值保证为true或false,而if(x)之所以起作用是因为语言评估某些条件为true/false,如前面提到的0、空字符串、null、undefined等,它们并不严格符合truthy的定义,但可以在逻辑上解释为这样。 - Darius
所以,为了澄清,以下的语句都是完全相等的吗?if( x ),if( !!x ),if( !!x == true ),if( !!x === true ) - TheZver
1
它们都会评估为相同的结果,因此从这个意义上说它们是相等的......但在底层,它们的效率是不同的,我想。 - Darius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接