我发现没有什么可以阻止代码在变量中存储与全局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!`);
答案 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分钟才能找到它(我一定是瞎子)。