我想知道下面的条件语法之间的核心区别是什么?
if (something) {
// do something
}
对比
if (something == true) {
// do something
}
有什么不同吗?
编辑:我很抱歉。问这个问题时我打错了。我不是故意放一个三等号。我知道三等号是一个严格的运算符。我的意思是问'=='是否等同于if(某事)。
我想知道下面的条件语法之间的核心区别是什么?
if (something) {
// do something
}
对比
if (something == true) {
// do something
}
有什么不同吗?
编辑:我很抱歉。问这个问题时我打错了。我不是故意放一个三等号。我知道三等号是一个严格的运算符。我的意思是问'=='是否等同于if(某事)。
不同之处在于 in if(something)
,something
被评估为 boolean。基本上是
if(ToBoolean(something))
whereToBoolean
是一个内部函数,被调用以将参数转换为布尔值。ToBoolean
您可以使用双重否定来模拟: !!something
。
在第二种情况下,两个操作数(最终)都转换为 numbers first,所以你最终得到
if(ToNumber(something) == ToNumber(true))
这可能导致非常不同的结果。再次,ToNumber
是一个内部函数。可以使用一元加运算符:来模拟(在某种程度上)+something == +true
。在实际算法中,something
首先传递 的是ToPrimitive
ifsomething
是一个对象。
示例:
假使,假设
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)
is1
和0 == 1
is false
.
编辑:以下仅适用于===
使用运算符的原始问题。
第一个将执行 if 语句的主体 ifsomething
为“真”,而第二个将仅在其类型和值等于 时才执行它true
。
那么,什么是“真实”?要理解这一点,您需要知道它的反面是什么:虚假。如果放在条件表达式中,JavaScript 中的所有值都将被强制转换为布尔值。这是虚假值的列表:
false
0
(零)""
(空字符串)null
undefined
NaN
所有其他值都是真实的,尽管我可能错过了一些模糊的极端情况,有人会在评论中指出。
这是我对更新问题的回答:
有条件的这是错误的。请参阅Felix Kling 的回答。if (something)
andif (something == true)
是等价的,尽管第二个是多余的。something
在任何一种情况下都将以相同的方式进行类型强制。
if(something)
相当于if(someting == true)
。
运算符在检查相同性的==
同时检查相等性===
。在这种情况下,任何真值都会导致第一个值满足条件,但只会true
导致第二个值满足条件。
编辑:Felix Kling 的回答是正确的。请改为参考。
现在问题已从===
变为==
,不,没有实际区别。
有几种方法可以查看它。第一个示例评估“某物”是否具有类真值或正值。因此,只要它不是 0、负数、null 或空,它就应该评估 if 语句的内容。
在您的第二个语句中,您正在测试“某事”是否等同于布尔真值。另一个词“TRUE”或1。您还可以进行“===”比较,以便它必须与您的比较相同。所以在这种情况下,如果你做了某事 === true 那么“某事”必须是布尔值 true,值 1 是不够的。
这两个条件没有区别thing == true
,只是thing
。
thing === true
但是,和之间有很大区别thing
。
在 javascript 中,值在条件中被强制转换为布尔值。这意味着所有类型的所有值都必须能够强制转换为true
或false
。强制转换为的值true
通常称为“真”,而强制转换为的值false
称为“假”。
“假”值如下:
NaN
(不是数字)''
(空字符串)undefined
null
0
(数字 0)true
其他所有内容都在强制执行时进行评估。这个 jsFiddle将帮助您跟踪什么是“真”,什么是“假”。
标识运算符 ( ===
) 不执行任何类型强制:如果类型不同,则比较立即失败。