【问题标题】:JavaScript if(x) vs if(x==true)JavaScript if(x) 与 if(x==true)
【发布时间】:2014-04-14 13:50:32
【问题描述】:

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

if(x){}

if(x==true){}

谢谢

【问题讨论】:

  • x = 'test'为例。
  • x=' ', x=[], x='\n', x='false'...
  • x = "0" 是另一个

标签: javascript


【解决方案1】:

它们根本不相等。

if (x)

检查x 是否为Truthy,后者检查x 的布尔值是否为true

例如,

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

不仅是一个对象,任何字符串(空字符串除外),任何数字(0 除外(因为0 是 Falsy)和1)都会被认为是真值,但它们不会等于真的。

根据ECMA 5.1 Standards,在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,包括对象和数组。

但在后一种情况下,按照The Abstract Equality Comparison Algorithm

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

【讨论】:

  • 意思是后面可以用string,int other of boolean吗?
  • var x = 'a'; if (x) alert("X"); if (x == true) alert("X true"); 这只会提醒"X" 而不会提醒"X true"
  • 1 被认为是真的(来自 ECMA 5.1:如果参数为 +0、-0 或 NaN,则结果为假;否则结果为真)
  • @VitorTyburski 正确。这就是为什么我在回答中提到除了 0 和 1 :)
  • @TheZver 很好。我在表格底部添加了一条注释:)
【解决方案2】:

第一种形式有几种情况判断为false,如空字符串、0、undefined、null。

如果你想更加语义化,试试表达式前面的 bang bang:

if(!!x){...}

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

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

因此它们并不相同,但通常在逻辑上表示相同的测试,这要归功于语言的语义和 !!你可以使用

【讨论】:

  • 谢谢。 “if(!!x)”总是等于“if(x)”吗?
  • 不不,想象一下这种情况 if(!!"hello") 和 if("hello" == true),第一个表达式将评估为 true,因为 "hello" 不是空字符串,未定义或 null 等,因此当转换为真值时,为真。而第二个表达式将是假的,因为“你好”不能被强制等于真值。 jsfiddle.net/CEtN5
  • 抱歉,我的问题有误。我的意思是与 if(x) 进行比较
  • 好的,我看到你的编辑了。本质上,您使用 if(!!x) 和 if(x) 测试相同的东西,它只是 !!x 的值保证为真或假,而 if(x) 仅在语言评估某些条件时才有效是真/假,如前所述,0,空字符串,null,未定义..这些都不是严格意义上的真实,但可以在逻辑上这样解释
  • 他们都会评估相同的东西,所以从这个意义上说他们是平等的......在引擎盖下他们的效率会有所不同,我想
猜你喜欢
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多