Reputation: 18443
I'm discovering odds of JavaScript comparisons. I wanted to find an example of how tricky comparisons may be, and how can cause bugs in some situations.
I thought about example where some input variable remains undefined, and is compared to zero. Because undefined is false when converted to Boolean, and zero is false when converted to Boolean I decided to test following code:
var x;
//Here x should be initialized but due to some circumstances is not
if(x == 0){
//This should run
}
Surprisingly...
Boolean(undefined) //false
Boolean(0) //false
x //undefined
x == 0 //false
Why it's like that?
Upvotes: 6
Views: 10977
Reputation: 318342
This behaviour is in the specification for The Abstract Equality Comparison Algorithm
From the specification
The comparison x == y
, where x
and y
are values, produces true or false. Such a comparison is performed as follows:
If Type(x)
is the same as Type(y)
, then ...
...
If x
is null and y
is undefined, return true.
x
is undefined and y
is null
, return true.Type(x)
is Number and Type(y)
is String, return the result of the comparison x == ToNumber(y)
.Type(x)
is String and Type(y)
is Number, return the result of the comparison ToNumber(x) == y
.Type(x)
is Boolean, return the result of the comparison ToNumber(x) == y
.Type(y)
is Boolean, return the result of the comparison x == ToNumber(y)
.Type(x)
is either String or Number and Type(y)
is Object, return the result of the comparison x == ToPrimitive(y)
.Type(x)
is Object and Type(y)
is either String or Number, return the result of the comparison ToPrimitive(x) == y
.As undefined
and a number (0
) is not of the same type, it's only in the third point where it mentions what to do if the left hand side is undefined
.
Then, if the right hand side is null
, it returns true, any other value, and it goes straight to 10.
, which says "return false
".
Upvotes: 15
Reputation: 7117
Boolean(undefined) //false
Boolean(0) //false
Actually, The Boolean
function returns false
for all non-real values such as 0, null, undefined, ""(empty string), etc.
It does not mean that the undefined == 0
Upvotes: 1