Ответ 1
В ECMAScript 5 индексы Array определяются следующим образом:
Имя свойства P (в виде значения String) представляет собой массив индекс тогда и только тогда, когда ToString (ToUint32 (P)) равен P и ToUint32 (P) не равно 2 32 -1.
(Определение в ECMAScript 2015 сформулировано иначе, но должно быть эквивалентным.)
Тогда код будет
function isArrayIndex(str) {
return (str >>> 0) + '' === str && str < 4294967295
}
Шаг за шагом,
-
ToUint32 (P) можно сделать, сдвинув 0 бит с помощью без знакового оператора сдвига вправо
P >>> 0
-
ToString (ToUint32 (P)) можно выполнить, объединив пустую строку с оператором добавления.
(P >>> 0) + ''
-
ToString (ToUint32 (P)) равно P, можно проверить с помощью оператора strict equals.
(P >>> 0) + '' === P
Обратите внимание, что это также гарантирует, что P действительно был в виде значения String.
-
ToUint32 (P) не равно 2 32 -1 можно проверить с помощью оператора strict do-not-equal
(P >>> 0) !== 4294967295
Но как только мы знаем, что ToString (ToUint32 (P)) равно P, достаточно одного из следующих:
P !== "4294967295" P < 4294967295