条件“if(x)”是否与“if(x == true)”不同?

时间:2012-08-07 19:31:26

标签: javascript conditional

我想知道下面的条件语法之间的核心区别是什么?

if (something) {
    // do something
}

VS

if (something == true) {
    // do something
}

有什么不同吗?

编辑:我道歉。当问到这个问题时我打错了。我不是故意放三等号。我知道三等于是严格的算子。我的意思是问'=='是否等同于if(某事)。

6 个答案:

答案 0 :(得分:12)

编辑:以下仅适用于原始问题,其中使用了===运算符。

如果something是“truthy”,第一个将执行if语句的主体,而第二个只在类型和值等于true时执行它。

那么,什么是“真理”?要理解这一点,你需要知道它的反面是什么:falsey。如果放在条件表达式中,JavaScript中的所有值都将被强制转换为布尔值。这是一个虚假值列表:

  • false
  • 0(零)
  • ""(空字符串)
  • null
  • undefined
  • NaN

所有其他价值都是真实的,尽管我可能错过了一些有人会在评论中指出的模糊角落案例。

以下是我对更新后问题的回答:

条件if (something)if (something == true)是等价的,但第二个是多余的。在任何一种情况下,something都将以相同的方式强制类型。这是错误的。请参阅Felix Kling's answer

答案 1 :(得分:12)

区别在于if(something)something is evaluated as boolean。基本上是

if(ToBoolean(something))

其中ToBoolean是一个内部函数,用于将参数转换为布尔值。您可以使用双negationToBoolean模拟!!something

在第二种情况下,both operands are (eventually) converted to numbers first,最后是

if(ToNumber(something) == ToNumber(true))

可能会导致非常不同的结果。同样,ToNumber是一个内部函数。可以使用unary plus operator+something == +true模拟(在某种程度上)。在实际算法中,如果something是对象,则something首先通过ToPrimitive


示例

假设

var something = '0'; // or any other number (not 0) / numeric string != 1

if(something)将为true,因为'0'是非空字符串。

if(something == true)将为false,因为ToNumber('0')0ToNumber(true)10 == 1为{{1} }}

答案 2 :(得分:3)

if(something)相当于if(someting == true)

==运算符检查相等性,而===检查相同性。在这种情况下,任何truthy值都将导致第一个条件满足条件,但只有true将导致第二个条件满足。

编辑:Felix Kling的回答是正确的。请改为参考。

答案 3 :(得分:2)

现在问题已从===更改为==,不,没有实际差异。

答案 4 :(得分:1)

有几种方法可以看待它。第一个示例评估“某事”是否具有真值或正值。因此,只要它不是0,否定,空或空,它应该评估该if语句的内容。

在你的第二个陈述中,你正在测试“某事”是否相当于布尔值。另一个词是“TRUE”或1.​​您还可以进行“===”比较,以便它必须与您比较它的相同。所以在这种情况下,如果你做了某些事情=== true,那么“something”必须是布尔值true,值1是不够的。

答案 5 :(得分:0)

两个条件thing == truething之间没有区别。

然而,thing === truething之间存在很大差异。

在javascript中,当值被置于条件中时,值被强制转换为布尔值。这意味着所有类型的所有值都必须能够强制为truefalse。强制为true的值通常称为“truthy”,强制为false的值称为“falsey”。

“假”值如下:

  • NaN(不是数字)
  • ''(空字符串)
  • undefined
  • null
  • 0(数字0)

强迫时,其他所有内容都会评估为trueThis jsFiddle会帮助您跟踪什么是“真实”,什么是“虚假”。

身份运算符(===)不执行任何类型强制:如果类型不同,则比较会立即失败。