Подтвердить что ты не робот

Почему индекс Javascript Array не более 4294967294, но не 4294967295?

Javascript индекс 32 бит, поэтому кажется, что индекс массива должен быть способен до 4294967295 для 4294967296 элементов. Но на самом деле самый высокий индекс - 4294967294. Поскольку массив имеет свойство length, я не вижу причины иметь нуль в качестве последнего элемента. Есть ли причина, по которой максимальный индекс составляет 4294967294, но не 4294967295?

4b9b3361

Ответ 1

Это связано с тем, что при создании массива с использованием конструктора Array вы можете указать его необязательный length следующим образом:

new Array(length);

length массива представляет собой 32-разрядное целое без знака. Следовательно, длина массива может варьироваться от 0 до Math.pow(2, 32) - 1, которая равна 4294967295.

Для массива длиной n индексы варьируются от 0 до n - 1. Следовательно, максимальный индекс массива JavaScript равен (Math.pow(2, 32) - 1) - 1 или Math.pow(2, 32) - 2, который равен 4294967294.

Таким образом, массив JavaScript может содержать максимум 4294967295 элементов, а не 4294967296 элементов.

Я знаю. Это довольно нелогично, но опять-таки один элемент не будет иметь большого значения.

Ответ 2

спецификация ECMA-262 (раздел 15.4) гласит:

Имя свойства P (в виде значения String) является индексом массива тогда и только тогда, когда ToString (ToUint32 (P)) равно P и ToUint32 (P) не равно 2 32 -1.

В спецификации также указано, что свойство length массива всегда меньше 2 32. Казалось бы, это исключает 4294967295 как индекс массива.

Ответ 3

массив javascript может содержать 2^32-1=4294967295.
но индексы массива начинаются с 0, поэтому, 4294967295-1=4294967294