Landeeyo - 1 year ago 149
Javascript Question

# Why undefined is not equal to zero in JavaScript?

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?

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

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download