ECMA-262, 9- е издание, июнь 2018 г. (стандарт, которому должен соответствовать JavaScript) в 6.1.6 «Тип числа» гласит:
… 9007199254740990 (то есть 2 53 -2) различных значений «Not-a-Number» стандарта IEEE представлены в ECMAScript как отдельное специальное значение NaN.… В некоторых реализациях внешний код может обнаруживать разницу между различными значениями Not-a-Number, но такое поведение зависит от реализации; для кода ECMAScript все значения NaN неотличимы друг от друга.
24.1.17 «NumberToRawBytes (тип, значение, isLittleEndian)» говорит:
… Если значение равно NaN, rawBytes может быть установлен для любой выбранной реализации кодировки Not-a-Number формата IEEE 754-2008 binary64. Реализация всегда должна выбирать одну и ту же кодировку для каждого различимого значения реализации NaN…
Я не вижу других отрывков, в которых упоминается NaN, освещающих этот вопрос. С одной стороны, 24.1.17 фактически говорит нам, что биты NaN должны быть сохранены при преобразовании NaN в необработанные байты. Однако больше ничего не говорит нам, что биты должны быть сохранены в других операциях. Можно сделать вывод, что это намерение, потому что это требование в 24.1.17 не будет иметь смысла, если биты могут быть произвольно изменены любой другой операцией. Но я бы не стал полагаться на реализации JavaScript, чтобы реализовать это в соответствии с этим намерением.