Как заметил еретик Обезьяна, в спецификации конкретно указано, что числа NaN в javascript все неразличимы -
"В некоторых реализациях внешний код может обнаруживать разницу между различными значениями Not-a-Number, но такое поведение зависит от реализации; для кода ECMAScript все значения NaN неотличимы друг от друга. "
https://www.ecma -international.org / ecma-262 / 6.0 / # sec-ecmascript-language-types-number-type
Таким образом, похоже, что это невозможно - или, по крайней мере, невозможно в зависимости от платформы.
Одним из предложений было использование типизированных массивов.Кажется, это работает в IE и Chrome, но не в Firefox!Проблема в том, что когда вы сохраняете double в переменной, в Firefox он потеряет все битовые комбинации, которые вы установили для значения NaN ...
var buffer = new ArrayBuffer(8);
var floats = new Float64Array(buffer);
var bytes = new Uint8Array(buffer);
floats[0] = NaN;
var print_float_bytes = function() {
var pstr = "";
for (var i = 0; i < 8; i += 1) {
pstr = pstr + " " + bytes[i];
}
console.log(pstr);
};
console.log("printing a fresh NaN");
print_float_bytes();
bytes[7] = 255;
console.log("printing a NaN with the sign bit as 1");
print_float_bytes();
bytes[0] = 1;
console.log("printing a NaN with the significand as a number slightly bigger than 1 and a positive sign");
print_float_bytes();
console.log("printing the floating point number: " + floats[0]);
var p = floats[0];
floats[0] = p;
console.log("printing roundtripped NaN");
print_float_bytes();
var pointless = function(pdbl) {
return pdbl;
};
p = floats[0];
p = pointless(p);
floats[0] = p;
console.log("printing even more roundtripped NaN");
print_float_bytes();