Why does 0.-5 evaluate to -5?
Solution 1:
Trailing digits after a .
are optional:
console.log(0. === 0); // true
So
0.-5
evalutes to
0 - 5
which is just -5
. Similarly,
0.-5+1
is
0 - 5 + 1
which is
-5 + 1
or -4
.
Solution 2:
0.-5
could be successfully parsed as 0.
[1], -
and 5
. Below is the abstract syntax tree for the expression generated by AST explorer:
This (in an unexpected way) is valid JavaScript and evaluates to -5
.
[1] According to the grammar for numeric literals the decimal digits and exponent parts are optional:
NumericLiteral ::
DecimalLiteral
[...]DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigitsopt ExponentPartopt
Solution 3:
In JS you can express a number with optional decimal point.
x = 5.; //5
x = 5. + 6. //11
And as of Tvde1's comment, any Number method can be applied too.
5..toString()
This syntax let us run the Number functions without parentheses.
5.toString() //error
(5).toString() //good
5..toString() //good
5 .toString() // awesome
See this question to find out why.