Javascript 在变量中存储不同的NaN值

Javascript 在变量中存储不同的NaN值,javascript,floating-point,nan,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=新的Float64Ar

我认为没有什么可以阻止代码在变量中存储与全局
NaN
不同的NaN值。然而,我很快就体会到这取决于浏览器。在Chrome(版本67.0.3396.99(官方版本)(64位))中,将这样的值存储在变量中工作得很好,而在Firefox(61.0.1(64位))中则没有

规范中是否没有明确说明这方面的行为,或者FF在这里没有完全遵循它?为什么FF会将数字转换为全局
NaN

以下是用于测试的相关代码段:

let buffer=new ArrayBuffer(8);
let float=新的Float64Array(缓冲区);
let bytes=新的Uint8Array(缓冲区);
浮点[0]=NaN
字节[0]=1;
设differentNaN=float[0];
浮点数[0]=差分数;
log(`We are${bytes[0]==0?“not”:“可能”}在chrome上!`)充分解释了这一点:

[…]除了9007199254740990(即253-2)之外 IEEE标准的“非数字”值表示为 ECMAScript作为一个特殊的NaN值。(请注意,NaN值为 在某些实现中,由程序表达式NaN.生成, 外部代码可能能够检测到不同 不是数字值,但这种行为取决于实现; 对于ECMAScript代码,所有的NaN值都是不可区分的 其他。

连同下面的

注意

在ArrayBuffer(参见24.1)或 存储数值后的SharedArrayBuffer(见24.2) 它的内在表现形式不一定是相同的 ECMAScript实现使用的数值



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

发现得不错。我检查并存储了一个变量中的特殊NaN值,该值在FF中起作用(differentNaN!==NaN),正是返回浮点的赋值清除了该位。@niry注意
NaN!==NaN
始终(对于所有不同的NaN值,因为它们与ecmascript相同,甚至是
Object.is(differentNaN,NaN)==true
)。您需要检查实际的实现,或者将内存挂钩放入FF中,以了解内部表示是否不同。正如答案中所描述的,任何显示它们是不同值的东西都是特定实现的产物,而不是期望的东西(从某种意义上说,FF在这里有更好的行为)。我关于存储的观点不正确,我也说不出来,因为在FF上执行
float[0]=float[0]
将清除该位,但在Chrome或node上则不然。所以与其说是存储,不如说是分配。