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

W3G*_*eek 4 javascript conditional

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

if (something) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

if (something == true) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

有什么不同吗?

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

Fis*_*rdo 12

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

第一个将执行if语句的主体,如果something是"truthy",而第二个只执行它,如果它的类型和值相等true.

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

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

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

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

条件if (something)if (something == true)等价,虽然第二是多余的.something在任何一种情况下都将以相同的方式强制进行类型化.这是错的.见Felix Kling的回答.

  • 他们不等同!请参阅我的答案http://stackoverflow.com/a/11852927/218196 (5认同)
  • 可悲的是,这已不再完全正确,因为OP指定他的意思是`==`而不是`===`. (4认同)

Fel*_*ing 12

区别在于if(something),something被评估为布尔值.基本上就是这样

if(ToBoolean(something))
Run Code Online (Sandbox Code Playgroud)

where ToBoolean是一个内部函数,用于将参数转换为布尔值.你可以ToBoolean用双重否定来模拟:!!something.

在第二种情况下,两个操作数首先(最终)转换为数字,所以最终会得到

if(ToNumber(something) == ToNumber(true))
Run Code Online (Sandbox Code Playgroud)

这会导致非常不同的结果.同样,ToNumber是一个内部功能.它可以模拟使用(在某种程度上)一元加运算符:+something == +true.在实际算法中,如果是对象,something则首先传递 .ToPrimitivesomething


示例:

假使,假设

var something = '0'; // or any other number (not 0) / numeric string != 1
Run Code Online (Sandbox Code Playgroud)

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

if(something == true)false,因为ToNumber('0')IS 0,ToNumber(true)10 == 1false.