Это один из тех, кто всегда сбивает людей с толку.Свойство length применяется только к упорядоченным элементам.Вы не можете расширить массив, затем вставить произвольный несекретный ключ и ожидать, что он будет работать.Это потому, что связь между свойством length и содержимым массива нарушается после расширения массива.Приведенная выше ссылка Pointy очень хорошо объясняет это более подробно.
Чтобы доказать это, добавьте это в конец вашего примера:
console.log(x[4]);
Как видите, ваша запись присутствуети правильно, это просто не часть упорядоченного массива.
Как и все остальное в javascript, объект Array - это просто ассоциативный массив со строковыми ключами.Нечисловые, не последовательные ключи скрыты, чтобы обмануть вас, заставляя думать, что это «правильный» численно проиндексированный массив.
Этот странный смешанный дизайн объекта Array действительно означает, что вы можете делать некоторые странные и замечательные вещи, такие как хранение упорядоченных инеупорядоченная информация в том же объекте.Я не говорю, что это хорошая идея, я просто говорю, что это возможно.
Как вы уже заметили, когда итерируете подобные структуры, не появляются несекретные ключи, что имеет смысл дляобщий случай использования массивов для упорядоченной информации.Это менее полезно или фактически бесполезно, когда вы хотите получить ключевую информацию.Я бы рискнул, если упорядочение неважно, вы должны использовать объект, а не массив.Если вам нужно как упорядоченное, так и неупорядоченное, сохраните массив как свойство объекта.