Массивы - это объекты JavaScript, как и любые другие, которые вы создаете.(Почти) все в JavaScript наследует свой прототип от Object
.
Теперь спецификация массива такова, что индексы - это просто свойства с конкретными именами.a[1]
и a['1']
указывают на одно и то же свойство.Единственное, что вам нужно - это иметь числовое свойство length
.В словах спецификации языка ECMAScript «Массивы - это экзотические объекты, которые предоставляют особую обработку определенному классу имен свойств».
Теперь forEach
определяется как функция, которая будетОбходите только те «специальные» свойства, которые есть у экземпляра Array.Он начинается с 0
и заканчивается length - 1
и пропускает неопределенные значения.Это не смотрит на другие реквизиты.Таким образом, вы получаете только поля в массиве.
for of
является итератором - если у вас есть объект iterable
, вы в основном получаете его функцию итератора, а затем перебираете значения, которые ондает тебе.Итеративный массив дает только те индексированные имена свойств.Вы можете прочитать чуть больше в MDN .
Еще раз, массив является объектом, как и любой другой, но мы придаем некоторым его свойствам особое значение, и он наследует некоторые функции из прототипа Array, которые могут иметь дело с этими свойствами .
Но for in
не волнует, является ли этот объект особенным или нет. Он будет просто зацикливаться на ВСЕХ свойствах любого объекта, который вы ему дадите, включая массив. Вот почему, когда вы for in
зацикливаете объект, вы зацикливаете свойства объекта, и индексы массива включаются в него.,
Примечание: использование for ... in ...
не рекомендуется. Например, в разреженном массиве (где вы устанавливаете, например, [0] = 1, a [10] = 1 иоставьте все остальные индексы неопределенными), for in
просто выйдет из этих двух свойств.
Итак, если кто-то даст вам объект со свойствами, называемыми 0
и 10
, вы бы назвали его массивом?Нету.Еще одна плохая вещь - это то, что он также пройдет по прототипу объекта и выведет список свойств всех объектов, от которых этот массив мог бы унаследоваться - и вы, вероятно, этого не хотите.