好的,这是我的简短问题:
我知道===
和!==
运算符会比较类型和值,而==
和!=
会转换类型,然后只比较值
if(myVar)
和if(!myVar)
呢?
if(myVar == true)
和if(myVar == false)
的行为是否存在差异?
答案 0 :(得分:3)
是的,有区别。例如:
if('true' == true) {
alert("This doesn't happen");
}
if('true') {
alert("But this does happen.");
}
原因?他们都转换为number
进行比较。 'true'
转换为NaN
,true
转换为1
。
避免这种愚蠢,永远不要写== true
或== false
。
答案 1 :(得分:2)
是的,有区别。正如您已经提到的,如果您将值与==
进行比较,则会发生类型转换。
如果值不属于同一类型,则它们都将转换为字符串或数字。如果其中一个值是布尔值而另一个值不是,则两个值都将转换为数字。
比较算法在section 11.9.3 of the specification中定义。重要的一步是:
7。如果Type(y)是布尔值,则返回比较结果
x == ToNumber(y)
。
首先将true
转换为数字,然后将myVar
转换为数字。
如果您只有if(myVar)
,那么the value is converted to a boolean:
2。如果
ToBoolean(GetValue(exprRef))
为真,那么
ToNumber
[spec]和ToBoolean
[spec]可能会返回截然不同的结果。
注意:如果myVar
实际上是布尔值,则if(myVar == true)
和if(myVar)
之间没有区别。
答案 2 :(得分:1)
是的,if(myVar) and if(!myVar)
和if(myVar == true) and if(myVar == false)
在if(myVar) and if(!myVar)
中,!myVar将为每个“false”值返回true(空字符串,0,null,false,undefined,NaN)
while if(myVar == true)
和if(myVar == false)
检查myVar值是true还是false。即使myVar值为NULL,NaN或未定义0,它也会像
if(NULL == true)
总结:
NOT operator'!' converts a value into its opposite boolean equivalent. This is different than actually comparing two values.
And if you compare values with '==', JavaScript does type conversion which can lead to unexpected behavior (like undefined == null).