我想知道下面的条件语法之间的核心区别是什么?
if (something) {
// do something
}
VS
if (something == true) {
// do something
}
有什么不同吗?
编辑:我道歉。当问到这个问题时我打错了。我不是故意放三等号。我知道三等于是严格的算子。我的意思是问'=='是否等同于if(某事)。
答案 0 :(得分:12)
编辑:以下仅适用于原始问题,其中使用了===
运算符。
如果something
是“truthy”,第一个将执行if语句的主体,而第二个只在类型和值等于true
时执行它。
那么,什么是“真理”?要理解这一点,你需要知道它的反面是什么:falsey。如果放在条件表达式中,JavaScript中的所有值都将被强制转换为布尔值。这是一个虚假值列表:
false
0
(零)""
(空字符串)null
undefined
NaN
所有其他价值都是真实的,尽管我可能错过了一些有人会在评论中指出的模糊角落案例。
以下是我对更新后问题的回答:
条件这是错误的。请参阅Felix Kling's answer。if (something)
和if (something == true)
是等价的,但第二个是多余的。在任何一种情况下,something
都将以相同的方式强制类型。
答案 1 :(得分:12)
区别在于if(something)
,something
is evaluated as boolean。基本上是
if(ToBoolean(something))
其中ToBoolean
是一个内部函数,用于将参数转换为布尔值。您可以使用双negation:ToBoolean
模拟!!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')
为0
,ToNumber(true)
为1
且0 == 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 == true
和thing
之间没有区别。
然而,thing === true
与thing
之间存在很大差异。
在javascript中,当值被置于条件中时,值被强制转换为布尔值。这意味着所有类型的所有值都必须能够强制为true
或false
。强制为true
的值通常称为“truthy”,强制为false
的值称为“falsey”。
“假”值如下:
NaN
(不是数字)''
(空字符串)undefined
null
0
(数字0)强迫时,其他所有内容都会评估为true
。 This jsFiddle会帮助您跟踪什么是“真实”,什么是“虚假”。
身份运算符(===
)不执行任何类型强制:如果类型不同,则比较会立即失败。