Как массивы JavaScript могут иметь нечисловые ключи? - PullRequest
0 голосов
/ 19 сентября 2018

Что я узнал, так это массив типа объекта.Объекты - это набор свойств с парами ключ / значение.Я всегда думал, что массивы - это набор элементов, которые численно индексируются, начиная с 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.log(i);
    //0,1,2,3,eyes,skin
}

Цикл for ... дал:

for(let i of arr){
     console.log(i);
     //0,1,2,3
}

Мне удалось перебрать всеключи массива, использующие цикл for ... in.Однако, когда я использовал цикл for ... of, я мог выполнять итерации только по численно проиндексированным ключам.Почему это так?

И какое самое точное определение массива?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Массивы - это тип объектов в javascript.Когда вы делаете что-то вроде arr.skin = 'white';, вы в основном устанавливаете переменную в коллекцию свойств объекта массива.Вот почему вы можете получить к нему доступ через for...of, который перебирает перечисляемые свойства объекта.

Однако, поскольку это новое свойство не является частью списка элементов массива, к нему нельзя получить доступ через for...in

Взято из MDN веб-документов для массивов :

Установка или доступ через нецелые числа с использованием скобочных обозначений (или точечных обозначений) не будут установлены илиизвлекает элемент из самого списка массива, но устанавливает или обращается к переменной, связанной с коллекцией свойств объекта этого массива.Свойства объекта массива и список элементов массива разделены, и операции обхода и мутации массива нельзя применять к этим именованным свойствам.

0 голосов
/ 19 сентября 2018

С помощью цикла for..of вызывается свойство объекта Symbol.iterator.В случае массива это эквивалентно методу .values() массива, который содержит значения для каждого индекса в массиве .Нечисловые свойства не включены - массивы обычно не имеют произвольных нечисловых свойств, и код, который присваивает произвольные нечисловые свойства массиву, вероятно, нуждается в рефакторинге.

A for..in loop перебирает всех перечисляемых свойств объекта, включая те, которые унаследованы от прототипа.Таким образом, for..of в массиве исключит нечисловые свойства в массиве, в который будет включен цикл for..in.

Массивы, являющиеся объектами, может иметь произвольные свойства, назначенные имПо большей части точно так же, как свойства могут быть назначены обычным функциям - это не очень хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...