Как раз с длиной всё очевидно.
length – количество элементов массива:
[]; // сколько элементов? – 0
['a']; // сколько элементов: 1
['a', 'b', 'c'] // 3
Индексы начинают с нуля, потому, что индекс – это
смещение.
Исторически, с низкоуровневых языков программирования.
В памяти под массив выделена некоторая память, начиная с адреса
X.
Последовательно находятся ячейки одинаковой длины. Чтобы найти, где лежит значение
i-го элемента, к адресу
X прибавляют
i * size байт. Самый первый элемент начинается сразу с адреса
X. Его индекс
0.
Так же и со строкой в JavaScript: к буквам можно обращаться по индексу, как к элементам массива.
"abcd"[1] // "b"
"abcd"[3] // "d"
Представьте, что в начале строки стоит курсор. Курсор возвращает букву перед которой стоит. Индекс – на сколько вправо надо этот курсор подвинуть.
Эта особенность index / length общепринята во многих языках программирования. Так же, как для интервалов часто принято включать начало и исключать конец:
[a; b) – например, в методе массива
slice(), который вырезает кусок массива, если указать
slice(1, 5) — вытащит элементы с индексами
1, 2, 3, 4 – включая 1-й, но не доходя до 5.