Прежде всего я хочу отметить, что пример, который вы взяли со страницы w3schools для массивов , взят из раздела «Ассоциативные массивы», в котором есть это важное введение:
Многие языки программирования поддерживают массивы с именованными индексами.
Массивы с именованными индексами называются ассоциативными массивами (или хэшами).
JavaScript поддерживает , а не поддерживает массивы с именованными индексами.
В JavaScript, массивы всегда используют пронумерованные индексы .
Это помещает пример в контекст, потому что на самом деле нет смысла определять переменную как массив, а затем использовать строковые ключи.Но это был пример, иллюстрирующий эту точку.
Массив становится объектом?
То, что JavaScript все еще считает переменную массивом, является ожидаемым.Он становится массивом в момент присвоения []
, и это не меняет , добавляя свойства к этому объекту.Да, массивы являются объектами.У них просто есть дополнительные возможности.
Массив не потерял ни одной из своих массивоподобных возможностей, но эти функции просто не работают с этими строковыми свойствами, а только с числовыми (точнее,целые неотрицательные).
Вы свободно цитировали следующее утверждение из w3schools:
Если вы используете именованные индексы, JavaScript переопределит массив в стандартный объект.
Это неверная информация и ведет к вашему недоразумению.Переопределения не происходит.Когда вы добавляете свойства к любому объекту, объект не меняет «тип».Он остается экземпляром того, что было раньше ... Массив остается массивом, объект даты остается датой, объект регулярного выражения остается регулярным выражением, даже если вы назначаете ему другие свойства.Но нечисловые свойства не «учитываются» для массива: длина будет оставаться неизменной при добавлении таких свойств.Длина только показывает что-то о числовых свойствах объекта.
Эта цитата является еще одной иллюстрацией того, что сообщество JavaScript думает о w3schools.com, то есть, что оно не самое надежноессылка, даже если она имеет значение для изучения языка.
Пример добавления полезных свойств к массивам
Сказав выше, есть случаи, когда вы можете намеренно использовать такиесвойства на массивах.Давайте, например, подумаем о массиве слов, который сортируется:
const arr = ["apple", "banana", "grapefruit", "orange", "pear"];
Теперь давайте добавим что-то в этот массив, который будет обозначать, что он в данный момент отсортирован:
arr.isSorted = true;
Мы могли бы представитьфункция, которая позволит добавить значение в этот массив, но также проверяет, отсортирован ли массив:
function addFruit(arr, fruit) {
if (arr.length && fruit < arr[arr.length-1]) {
arr.sorted = false;
}
arr.push(fruit);
}
Затем, после добавления нескольких значений, было бы интересно проверить, является ли массивнужна сортировка:
if (!arr.sorted) arr.sort();
Так что это дополнительное свойство помогает избежать выполнения ненужной сортировки.Но в остальном массив обладает всеми функциями, как если бы у него не было этого дополнительного свойства.