0
Это из-за того, что в JS все числа — 64-битные double по стандарту IEEE 754. Для целых чисел за пределами Number.MAX_SAFE_INTEGER (9e15) точность теряется, и операции идут с округлением до ближайшего представимого значения. Вот и получается, что 18014398509481984 (2^54) ещё норм, но при сложении результат вылетает на 2 единицы — стандартная плавающая жесть.