Conversion runs on BigInt rather than on ordinary numbers, and that is not a detail. parseInt("FFFFFFFFFFFFFFFF", 16) returns 18446744073709552000 — a value that is not the number in the string, and not even odd. Anything past 2^53 is approximate as a double, and values past 2^53 are precisely what a base converter gets asked about: a register dump, a 64-bit mask, a Snowflake id, a hash fragment. BigInt is exact at any size, so the answer is the value that was typed rather than the nearest one a double can hold.
The base is inferred from the input. A 0x, 0b or 0o prefix is honoured, letters with no prefix are read as hexadecimal because that is how a value is pasted out of a debugger, and anything else is decimal. Underscores, spaces and commas are ignored, so a grouped literal copied out of source can be pasted as it is. The base can also be stated explicitly, in which case the inference is skipped entirely — necessary for a value like 1010, which is a valid number in every base.
For a negative value the two’s complement representation is shown at each width it fits in, which is what the number actually looks like in memory. This is the reason -1 reads as 0xFF in a byte, 0xFFFF in a 16-bit word and 0xFFFFFFFF in a 32-bit one: the same value, three different widths, and the source of a whole category of confusion when reading a hex dump or a bitmask.