Как массивы JavaScript могут иметь нечисловые ключи?

Я узнал, что массив - это тип объекта. Объекты - это набор свойств с парами ключ / значение. Я всегда думал, что массивы - это набор элементов, которые численно индексируются, начиная с 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, я мог перебирать только ключи с числовой индексацией. Это почему?

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

Привет, @hayden, добавишь ли ты в массив дополнительно?

Eric 19.09.2018 01:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
2 684
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

Вы сказали, что цикл for ... in выполняет итерацию по всем свойствам объекта, включая унаследованные, но разве большинство методов и свойств, которые унаследованы, не являются перечислимыми? И тогда, делает ли это свойства ключей с числовым индексом?

Hayden 19.09.2018 01:46

Для массивов - да. Он имеет много методов, унаследованных от своего прототипа (например, .forEach, .join), а также он наследуется от Object, который предоставляет такие методы, как .hasOwnProperty, .valueOf. Но все это не перечислимое. В обычном массиве он не имеет перечислимых свойств по умолчанию - единственными перечисляемыми свойствами, которые он будет иметь, являются указатели массива или произвольные свойства, которым случайно назначаются (не очень хорошая идея).

CertainPerformance 19.09.2018 01:51

Массивы - это тип объектов в 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.

Другие вопросы по теме