6

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?

4

2 Answers 2

15

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:

  1. If Type(x) is the same as Type(y), then ... ...

  2. If x is null and y is undefined, return true.

  3. If x is undefined and y is null, return true.
  4. If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
  5. If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.
  6. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
  7. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
  8. If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
  9. If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.
  10. Return false.

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".

Sign up to request clarification or add additional context in comments.

4 Comments

Wow! That's amazing. If I'd compare undefined variable to any variable with already "known type" (so to speak) would it try to convert undefined to that type?
@Landeeyo - actually no, it's a bit more complicated, the specification has the answer to this, and I posted a bit hasty, let me edit.
This part of specification is stunning. Great answer. Thank you a lot!
So in other words, comparing two "falsy" values of different type doesn't always return true, especially when the first value is undefined, then the only right hand value that is of an other type, and that would return true, is null.
1
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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.