4

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

if (something) {
    // do something
}

对比

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

有什么不同吗?

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

4

6 回答 6

13

不同之处在于 in if(something),something被评估为 boolean。基本上是

if(ToBoolean(something))

whereToBoolean是一个内部函数,被调用以将参数转换为布尔值。ToBoolean您可以使用双重否定来模拟: !!something

在第二种情况下,两个操作数(最终)都转换为 numbers first,所以你最终得到

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

这可能导致非常不同的结果。再次,ToNumber是一个内部函数。可以使用一元加运算符:来模拟(在某种程度上)+something == +true。在实际算法中,something首先传递 的是ToPrimitiveifsomething是一个对象。


示例

假使,假设

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

if(something)will be true,因为'0'是一个非空字符串。

if(something == true)will be false, since ToNumber('0')is 0, ToNumber(true)is10 == 1is false.

于 2012-08-07T19:42:14.837 回答
12

编辑:以下仅适用于===使用运算符的原始问题。

第一个将执行 if 语句的主体 ifsomething为“真”,而第二个将仅在其类型和值等于 时才执行它true

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

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

所有其他值都是真实的,尽管我可能错过了一些模糊的极端情况,有人会在评论中指出。

这是我对更新问题的回答:

有条件的if (something)andif (something == true)是等价的,尽管第二个是多余的。something在任何一种情况下都将以相同的方式进行类型强制。这是错误的。请参阅Felix Kling 的回答

于 2012-08-07T19:33:05.227 回答
3

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

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

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

于 2012-08-07T19:35:17.093 回答
2

现在问题已从===变为==,不,没有实际区别。

于 2012-08-07T19:33:26.810 回答
1

有几种方法可以查看它。第一个示例评估“某物”是否具有类真值或正值。因此,只要它不是 0、负数、null 或空,它就应该评估 if 语句的内容。

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

于 2012-08-07T19:37:57.363 回答
0

这两个条件没有区别thing == true,只是thing

thing === true但是,和之间有很大区别thing

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

“假”值如下:

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

true其他所有内容都在强制执行时进行评估。这个 jsFiddle将帮助您跟踪什么是“真”,什么是“假”。

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

于 2012-08-07T19:42:21.403 回答