JavaScript uses IEEE 754 standard to represent numbers. From Wikipedia:

Signed zerois zero with an associated sign. In ordinary arithmetic, −0 = +0 = 0. However, in computing, some number representations allow for the existence of two zeros, often denoted by−0 (negative zero)and+0 (positive zero). This occurs in some signed number representations for integers, and in most floating point number representations. The number 0 is usually encoded as +0, but can be represented by either +0 or −0.The IEEE 754 standard for floating point arithmetic (presently used by most computers and programming languages that support floating point numbers) requires both +0 and −0. The zeroes can be considered as a variant of the extended real number line such that 1/−0 = −∞ and 1/+0 = +∞, division by zero is only undefined for ±0/±0 and ±∞/±∞.

The article contains further information about the different representations.

So this is the reason why, technically, both zeros have to be distinguished.

However,

`+0 === -0`

evaluates to true. Why is that (…) ?

This behaviour is explicitly defined in section 11.9.6, the *Strict Equality Comparison Algorithm* (emphasis partly mine):

The comparison

`x === y`

, where`x`

and`y`

are values, producestrueorfalse. Such a comparison is performed as follows:(…)

If Type(x) is Number, then

- If x is NaN, return false.
- If y is NaN, return false.
- If x is the same Number value as y, return true.
If x is +0 and y is −0, return true.If x is −0 and y is +0, return true.- Return false.
(…)

*(The same holds for +0 == -0 btw.)*

It seems logically to treat `+0`

and `-0`

as equal. Otherwise we would have to take this into account in our code and I, personally, don’t want to do that 😉

**Note:**

ES2015 introduces a new comparison method, `Object.is`

. `Object.is`

explicitly distinguishes between `-0`

and `+0`

:

```
Object.is(-0, +0); // false
```