它们变得非常庞大时,JavaScript数组中的浮点精度会丢失吗?

Tho*_*ell 3 javascript arrays floating-point

我对JavaScript比较熟悉,最近我被告知JavaScript数组包含一个length类型的变量Number.当数组更新为数组中的元素数时,此长度会自动更新.

但是,我也被告知在内部,JavaScript为其Number类使用64位浮点表示.我们知道浮点运算不能精确地表示其范围内的所有整数.

所以我的问题是,大型数组会发生什么,哪些length + 1不能完全代表序列中的下一个最大整数?

Cod*_*gue 5

根据这个数组的最大长度是4,294,967,295.Number.MAX_SAFE_INTEGER就是9,007,199,254,740,991这样,你将不必担心,因为引擎不会让你走到这一步,例如:

new Array(4294967296); // RangeError: Invalid array length
Run Code Online (Sandbox Code Playgroud)

规范的相关部分:

  1. C.设newLen为ToUint32(Desc.[[Value]]).
    湾 如果newLen不等于ToNumber(Desc.[[Value]]),则抛出RangeError异常

所以给出我们的示例长度4294967296:

var length = 4294967296;
var int32length = length >>> 0; // Convert to int32
int32length === 0; // Can't represent this as int32
length !== int32length; // Therefore RangeException
Run Code Online (Sandbox Code Playgroud)

  • @Shaktal欢迎你.这似乎是对的,但是对JS内部知识有更多了解的人可能会证明我错了! (2认同)
  • 这似乎符合逻辑,我会等待一段时间才接受确认! (2认同)