Я узнал, что массив - это тип объекта. Объекты - это набор свойств с парами ключ / значение. Я всегда думал, что массивы - это набор элементов, которые численно индексируются, начиная с 0. Совсем недавно я смог добавить нечисловой ключ к массиву.
let arr = ['cribriform plate','mastoid','hyoid'];
arr.eyes = 'brown';
arr.skin = 'white';
Это привело к
['cribriform plate','mastoid','hyoid',eyes : 'brown', skin : 'white'];
Цикл for ... in arr дал:
for(let i in arr){
console.info(i);
//0,1,2,3,eyes,skin
}
Цикл for ... of дал:
for(let i of arr){
console.info(i);
//0,1,2,3
}
Я смог перебрать все ключи массива, используя цикл for ... in. Однако, когда я использовал цикл for ... of, я мог перебирать только ключи с числовой индексацией. Это почему?
И какое определение массива является наиболее точным?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В цикле for..of вызывается свойство объекта Symbol.iterator. В случае массива это эквивалентно методу массива .values(), который содержит значения для каждого индекса в массиве. Нечисловые свойства не включены - массивы обычно не имеют произвольных нечисловых свойств, и код, который делает присваивает массиву произвольные нечисловые свойства, вероятно, нуждается в рефакторинге.
for..in зацикливает повторяется всех перечислимых свойств объекта, включая унаследованные от прототипа. Таким образом, for..of в массиве будет исключать нечисловые свойства в массиве, который будет включать цикл for..in.
Массивы, будучи объектами, жестяная банка имеют произвольные свойства, назначенные им по большей части, точно так же, как свойства могут быть назначены обычным функциям - это просто не очень хорошая идея.
Вы сказали, что цикл for ... in выполняет итерацию по всем свойствам объекта, включая унаследованные, но разве большинство методов и свойств, которые унаследованы, не являются перечислимыми? И тогда, делает ли это свойства ключей с числовым индексом?
Для массивов - да. Он имеет много методов, унаследованных от своего прототипа (например, .forEach, .join), а также он наследуется от Object, который предоставляет такие методы, как .hasOwnProperty, .valueOf. Но все это не перечислимое. В обычном массиве он не имеет перечислимых свойств по умолчанию - единственными перечисляемыми свойствами, которые он будет иметь, являются указатели массива или произвольные свойства, которым случайно назначаются (не очень хорошая идея).
Массивы - это тип объектов в javascript. Когда вы делаете что-то вроде arr.skin = 'white';, вы в основном устанавливаете переменную в коллекцию свойств объекта массива. Вот почему вы можете получить к нему доступ с помощью for...of, который выполняет итерацию по перечислимым свойствам объекта.
Однако, поскольку это новое свойство не является частью списка элементов массива, к нему нельзя получить доступ через for...in.
Взято из Веб-документы MDN для массивов:
Setting or accessing via non-integers using bracket notation (or dot notation) will not set or retrieve an element from the array list itself, but will set or access a variable associated with that array's object property collection. The array's object properties and list of array elements are separate, and the array's traversal and mutation operations cannot be applied to these named properties.
Привет, @hayden, добавишь ли ты в массив дополнительно?