2 is just a number, it doesn't have any methods to call.
2. can be coerced into a string, which is an object (i.e. '2.0'), hence can have the method.
Just 2.toString() will be parsed as 2.0tostring(), which of course doesn't make sense.
Looking at how the two are parsed:

vs

The tool to generate these is here by the way: http://jsparse.meteor.com/