Пояснение
Объекты в JavaScript в качестве имени свойства могут иметь только тип String или тип Symbol.
В литерале объекта (т.е. в записи между фигурными скобкам) можно не писать кавычки в имени свойства слева от двоеточия.
Строка 1: 5, поставила свойству obj['1'] значение 5, но потом строка '1': 1, изменила это значение на 1.
Кстати, в браузерах с поддержкой ECMAScript 2015 такая дублирующая запись зачем-то перестала считаться синтаксической ошибкой в строгом режиме!
Массивы в JavaScript - самые обыкновенные объекты. Методы массивов работают с массивами, как с объектами.
Мы не знаем код встроенного метода Array.prototype.forEach. Я предполагаю, что там совершенно обычный цикл for со счётчиком, начинающимся с 0 и ограниченным значением свойства 'length' объекта.
Скорее всего, метод даже не проверяет наличие свойства, а просто обращается к свойству obj['i'] и если оно возвращает undefined, то не вызывает callback-фукнцию, а переходит к следующей итерации цикла.
Таким образом, в forEach пропускаются "пустые" элементы массива, а фактически это отсутствующие свойства объекта, при обращении к которым по правилам JS возвращается undefined. Также пропускаются существующие свойства, значением которых является undefined.