Хранение разных значений NaN в переменной - PullRequest
0 голосов
/ 06 июля 2018

Я подумал, что ничто не мешает коду хранить NaN-значение, отличное от глобального NaN в переменной. Тем не менее, я быстро почувствовал, что это зависит от браузера. Хранение такого значения в переменной прекрасно работало в Chrome (Версия 67.0.3396.99 (Официальная сборка) (64-разрядная версия)), в отличие от Firefox (61.0.1 (64-разрядная версия)).

Поведение относительно этого не ясно из спецификации, или FF не полностью следует этому здесь? Почему FF преобразует число в значение глобального NaN?

Вот соответствующий фрагмент для тестирования:

let buffer = new ArrayBuffer(8);
let float = new Float64Array(buffer);
let bytes = new Uint8Array(buffer);

float[0] = NaN
bytes[0] = 1;

let differentNaN = float[0];

float[0] = differentNaN;

console.log(`We are ${bytes[0] === 0 ? "not" : "potentially"} on chrome!`);

1 Ответ

0 голосов
/ 06 июля 2018

6.1.6 Тип номера объясняет это полностью:

[...] за исключением того, что 9007199254740990 (то есть 2 53 -2) отличается Значения «не число» стандарта IEEE представлены в ECMAScript как отдельное специальное значение NaN. (Обратите внимание, что значение NaN производится выражением программы NaN.) В некоторых реализациях внешний код может быть в состоянии обнаружить разницу между различными Не-числовые значения, но такое поведение зависит от реализации; к коду ECMAScript, все значения NaN неотличимы от каждого другой.

вместе с нижеследующим

Примечание

Битовая комбинация, которая может наблюдаться в ArrayBuffer (см. 24.1) или SharedArrayBuffer (см. 24.2) после сохранения числового значения в это не обязательно совпадает с внутренним представлением это значение Number, используемое реализацией ECMAScript.


Я знал, что видел что-то подобное в спецификации раньше, но почему-то не нашел этого в своем исследовании до публикации вопроса, и все равно потребовалось 40 минут, чтобы найти его после публикации (я должен быть слепым).

...