All numbers in JavaScript are actually IEEE-754 compliant floating-point doubles. These have a 53-bit mantissa which should mean that any integer value with a magnitude of approximately 9 quadrillion or less -- more specifically, 9,007,199,254,740,991 -- will be represented accurately.
NOTICE: in 2018 main browsers and NodeJS are working also with the new Javascript's primitive-type, BigInt, solving the problems with integer value magnitude.
Answer from LukeH on Stack OverflowNumber of bits in Javascript numbers - Stack Overflow
JavaScript Numbers - Stack Overflow
JavaScript numbers have an (adoption) problem
Numscrubber.js | Let's change values of input numbers by dragging the mouse left & right
Videos
All numbers in JavaScript are actually IEEE-754 compliant floating-point doubles. These have a 53-bit mantissa which should mean that any integer value with a magnitude of approximately 9 quadrillion or less -- more specifically, 9,007,199,254,740,991 -- will be represented accurately.
NOTICE: in 2018 main browsers and NodeJS are working also with the new Javascript's primitive-type, BigInt, solving the problems with integer value magnitude.
All answers are partially wrong - Maybe due the new ES6/ES7 specs - , read why:
First of all, in JavaScript, the representation of the number is 2^53 - 1 that is true for @Luke answer,
we can prove that by running Number.MAX_SAFE_INTEGER that will show a big number, then we do log2 to confirm that the number of bits is the same :
Number.MAX_SAFE_INTEGER
// 9007199254740991
Math.log2(9007199254740991)
// 53

However, Bitwise operation are calculated on 32 bits ( 4 bytes ), meaning if you exceed 32bits shifts you will start loosing bits.
Welcome to Javascript!
does JavaScript abstract away the details of integers and doubles in its number type, or does JavaScript only have double precision Number types
Yes.
A JS engine may choose to optimise some uses of Number to use integer math behind the scenes, but as far as JS apps are concerned, there is only Number, and it always behaves exactly like an IEEE double-precision float.
and the functions parseInt and parseFloat are poorly named?
Arguably, but parseFloatThatHappensToBeAWholeNumber would be a bit unwieldy. :-)
The MDN reference is pretty good, there's nothing in these answers that isn't in that article. I suggest you read ECMA-262 4.3.19 to 21 to understand the difference between a number value, a number Type and a number Object (and probably the whole section to understand Types in general).
An important aspect of javascript is that it is not strongly typed. There is no floating point precision type, nor is there an integer type. There are values, Types and Objects.
Variables don't have a type, their values do. You can assign a value to a variable, and that value can have a Type of String, Number, Boolean, etc. Don't get confused between Types and Objects - you can't specify that a variable has a particular Type, you can only assign it a value that has a Type. e.g.
Copyvar num = '5'; // the value of num is a String Type
num = +num; // its value is now a Number Type
num = num/2; // its value is still a Number Type
// but if printed looks like a float (2.5)
There is a Number object too (though rarely used) and javascript handily converts number primitives to objects for the sake of evaluating expressions:
Copy(5).toString(); // 5 is converted to a Number object
// its toString method is called, returning '5'
In the above, the grouping operator is required as otherwise the 'dot' will be interpreted as a decimal place and the following 't' as a syntax error. It is essentially the reverse of parseInt.
The parseInt and parseFloat methods are used to convert a string Type value to a number Type value as shown in the MDN article. There are other methods, such as:
Copyvar num = '5'; // string Type
var x = num * 2; // number Type
Variable x has a number Type value because multiplication will convert the string value of num to a number before doing multiplication.
Copyvar y = x + 'px'; // string Type
The '+' operator is overloaded - because one of the terms in the expression is a string, it will be treated as a concatenation operator so x will be converted to a string Type, 'px' will be concatenated and the string '10px' will be assigned to y, so its value is a string Type.
Read relevant parts of ECMA-262, it explains how it all works in detail.