在变量中存储不同的NaN值

时间:2018-07-06 05:06:42

标签: javascript floating-point nan

我发现没有什么可以阻止代码在变量中存储与全局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 :(得分:0)

6.1.6 The Number Type对此进行了详细说明:

  

[...]除了9007199254740990(即2 53 -2)与众不同   IEEE标准的“非数字”值表示为   ECMAScript作为单个特殊的NaN值。 (请注意,NaN值为   由程序表达式NaN生成。)在某些实现中,   外部代码可能能够检测到各种   非数字值,但这种行为与实现有关;   到ECMAScript代码,所有NaN值与每个值都没有区别   其他。

以及以下内容

  

注意

     

在ArrayBuffer中可能观察到的位模式(请参见24.1)或   存储Number值之后的SharedArrayBuffer(请参阅24.2)   不一定与的内部表示相同   ECMAScript实现使用的Number值。


我知道我以前在规范中已经看到过类似的东西,但是在发布问题之前,我不知为什么没有在研究中找到它,发布后仍​​然花了40分钟才能找到它(我一定是瞎子)。