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