В чем отличие массивов от объектов в JavaScript
Что проверяют
Понимаете ли вы, что массив это объект с особым поведением, и знаете ли, чем это оборачивается на практике.
Как отвечать
Массив это объект специального вида: у него числовые ключи, автоматически поддерживаемое свойство length и прототип Array.prototype с методами перебора. typeof [] возвращает "object", и проверять массив надо через Array.isArray.
Отличия по назначению: массив это упорядоченная последовательность, где важен порядок и доступ по индексу. Объект это набор именованных свойств, где порядок вторичен, а доступ по ключу.
Что важно на практике:
- порядок ключей: у объекта целочисленные ключи обходятся первыми и по возрастанию, остальные в порядке добавления. Поэтому объект с числовыми ключами ведёт себя неожиданно;
- перебор: массив перебирают
for...of,map,forEach; объект черезObject.keys,entries,for...in.for...inпо массиву тоже работает, но идёт по строковым ключам и захватывает унаследованные свойства, поэтому его не используют; - разреженность:
arr[100] = 1у пустого массива даёт длину 101 и дырки, по которымmapиforEachне идут, аfor...ofидёт, выдаваяundefined; - производительность: движок оптимизирует массив с последовательными числовыми индексами, но переводит его в словарное представление, если сделать разреженным или добавить строковые ключи.
Когда нужен словарь с произвольными ключами, современный ответ это Map: любые ключи, гарантированный порядок вставки, size без перебора.
Где спотыкаются
Проверяют массив через typeof.
Используют for...in для массива.
Удаляют элемент через delete arr[i] и получают дырку вместо сдвига.
Считают, что порядок ключей объекта всегда соответствует порядку добавления.