- Массивы и объекты в JavaScript
- Создание и чтение массивов
- Создание и чтение объектов
- Добавление элементов в массивы и объекты
- Удаление элементов из массивов и объектов
- Строку в массив и обратно
- JavaScript: массивы vs объекты
- Наследование
- Разница между объектами и массивами
- Странности
- Неиндексированные свойства
- length
- Так как же быть?
- Массивы и объекты в JavaScript как книги и газеты
- Массивы: порядок данных очень важен
- Объекты: заголовок имеет значение
- Объединяем объекты и массивы
Массивы и объекты в JavaScript
Массивы — это один из наиболее популярных типов данных в JavaScript. На реальных проектах сайтов они являются лучшим помощником разработчика.
Создание и чтение массивов
Можно создать не пустой массив, а содержащий элементы. Элементами массива могут быть практически любые типы данных. Попробуем заполнить массив числами и словами:
var a = ['Сыр', 'Мышь', 15, 'Кот', 18];
Внутри массива, через запятую, записываются его элементы. Получился массив, который содержит 5 элементов. Строки надо записывать в кавычках, а цифры можно без. Чтобы получить значение элемента массива, необходимо выбрать его по порядковому номеру, начиная с нуля. Приведём пример обращения:
var a = ['Сыр', 'Мышь', 15, 'Кот', 18]; console.log(a[0]); // результат: 'Сыр' console.log(a[1]); // результат: 'Мышь' console.log(a[4]); // результат: '18'
Читатель наверняка заметит, что обращение к элементам массива по их порядковому номеру — это неудобно. Лучше задать пару «ключ-значение» и обращаться по текстовому ключу. Поговорим об этом далее.
Создание и чтение объектов
Если Вы уже знакомы с языком программирования PHP, то наверняка спросите про ассоциативные массивы, которые используется крайне часто. Так для этих целей в JavaScript есть объекты. В объектах можно создать подобие ассоциативных массивов с доступом к значениям по ключу. Создадим объект и получим значение по ключу:
var a = ; console.log(a['Мышь']); // результат: 'Большая' console.log(a['Кот']); // результат: 'Маленький' console.log(a['Сыр']); // результат - число 100
В отличии от массива, объект задаётся через фигурные скобки . Ключами могут быть как строки, так и цифры. Существует другой способ обращение к элементам объекта — через точки на название ключа. Но для него лучше сделать ключи в виде латинских символов. Продемонстрируем:
var a = ; console.log(a.mouse); // результат: 'Большая' console.log(a.cat); // результат: 'Маленький'
Добавление элементов в массивы и объекты
Рассмотрим способы добавления пары «ключ-значение» в массив и в объект. Сначала добавим в массив произвольные элементы несколькими разными способами:
var a = ['Сыр', 'Мышь']; a[2] = 'Кот'; // на пустую третью позицию добавили значение a[3] = 15; // на пустую четвёртую позицию добавили значение
Если таким образом добавить элемент на позицию, которая не является последней, то пропущенные позиции будут содержать значение «undefined». При этом длина массива, полученная челе метод «.length» будет считать все элементы, в том числе «undefined».
Есть функции, которые добавляют элементы в конец или начало массива. Это удобно, потому что не надо высчитывать порядковые номера:
var a = ['Сыр', 'Мышь']; m.push(6); a.push('Кот'); // добавляет элемент 'Кот' в конец массива a.unshift('Кот'); // добавляет 'Кот' в начало массива
var b = ; b['Сыр'] = 100; // в конец добавили ключ 'Сыр' и значение 100 b[18] = 'Котята'; // в конец добавили ключ '18' и значение 'Котята'
Удаление элементов из массивов и объектов
var a = ['Сыр', 'Мышь']; a.pop('Кот'); // удаляет элемент из конца массива a.shift('Кот'); // удаляет элемент из начала массива
Если необходимо удалить элемент из центра массива, то необходимо использовать функцию X.splice( Y, Z );. Эта функция удаляет из массива X элементы начаиня с позиции Y в количестве следующих Z элементов. Позиция Y считается от нуля. Продемонстрируем это:
var a = ['Сыр', 'Мышь', 'Кот', 18]; a.splice(2, 1); // удаляет 1 элемент с позиции 2 console.log(a); // вернёт ['Сыр', 'Мышь', 18]
var b = ; delete b['Кот']; // удалили элемент с ключом 'Кот' console.log(b); // вернёт
Обратите внимание, что с помощью delete нельзя удалить весь объект, а только элемент внутри. Чтобы обнулить объект используйте такую конструкцию:
var b = ; b = <>; // удалим все элементы из объекта console.log(b); // вернёт пустой объект
Строку в массив и обратно
Существуют функция split( ), которая позволяет быстро создать массив из строки. В скобках у неё ставится один аргумент — разделитель, по которому строка будет разбита на элементы массива. Это довольно популярная функция, она часто используется в проектах. Приведём пример её использования:
var a = 'Тише, мыши, кот на крыше'; var b = a.split(','); console.log(b); // вернёт массив [ "Тише", " мыши", " кот на крыше" ]
В параметр функции split( ) ставится разделитель, по которому строка будет разделена на элементы массива. Это может быть точка, запятая, пробел или любой другой символ, который есть в строке. Если разделитель не будет найден в строке, то будет возвращён массив с одним элементом, в котором будет вся строка. Если же разделитель встречается в строке, то она будет разделена на элементы массива.
Существует функция join( ). По своей работе она противоположна split( ) и тоже часто используется в проектах. Эта функция объединяет элементы массива в строку. Параметром в этой функции ставится строка-соединитель, которая будет между элементами. Соединителем может быть любой символ, даже пробел и пустая строка (по умолчанию соединитель — это запятая):
var a = ['Тише', 'мыши', 'кот на крыше']; var b = a.join(', '); console.log(b); // вернёт строку "Тише, мыши, кот на крыше"
JavaScript: массивы vs объекты
При изучении JavaScript объектов, все мы натыкаемся на фразы типа “ Массивы – это простые объекты в Javascript ”. Сегодня я хочу глубже изучить это утверждение:
Если посмотреть на пример, приведенный выше, то становится очевидно, что массив — это тип объекта. Но что это значит?
Если вы не знакомы с оператором typeof , то подробнее узнать о нем можно здесь .
Наследование
Чтобы понять разницу между JavaScript работой с объектами и массивами, рассмотрим принцип наследования.
Каждый объект содержит ссылку на родительский ( прототип ) объект. При вызове метода, JavaScript начнет искать его в объекте, с которым вы работаете. Если метод не будет найден, то начнется поиска прототипа. Поиск осуществляется по всей цепочке прототипов до тех пор, пока не будет найден метод или достигнут корневой объект.
В примере выше создается объект person с собственным параметром name. При вызове метода toString сначала проверяется объект person, за которым следует проверка его прототипа ( Object.prototype ). Используется логика прототипа, которая обычно возвращает [object Object] .
Далее, в самом объекте person создайте метод toString , который мы и будем использовать при запуске toString .
Разница между объектами и массивами
У массивов есть существенные отличия от традиционных JavaScript объектов. Причина кроется в объекте Array.prototype , в котором представлены все методы, присущие массивам. Каждый новый массив наследует эти методы из Array.prototype .
Важно отметить, что значением свойства prototype в Array.prototype является Object.prototype . Это означает, что массивы – это просто объекты, но с дополнительными методами. Нет ничего такого, что делает объект, но не смог бы сделать массив.
Странности
Как и у JavaScript объектов, у массивов есть свои особенности.
Неиндексированные свойства
Так как массивы – это просто объекты, к ним можно применять неиндексированные свойства. Обычно это первое, что удивляет. В примере ниже я устанавливаю два неиндексированных свойства с названиями sorted и authored by массиву groceries .
Примечание: как и в объектах, здесь поддерживается как точка, так и скобка.
length
Свойство массива length также часто сбивает с толку. Часто это свойство путают с подсчетом элементов в массиве. Однако значение length в числовом выражении больше самого большого индекса массива. Из-за этого неиндексированные свойства не влияют на длину массива, как показано в примере.
Еще одна ситуация, в которой length может ввести в заблуждение, заключается в том, что мы пытаемся добавить элемент с индексом больше текущего значения массива length . Обратите внимание, что в примере length у массива прыгнул с 2 до 10 сразу после того, как добавил третий элемент в массив при индексе 9 .
Когда значение свойства length изменяется, каждый элемент с индексом выше нового значения length подлежит удалению.
Чтобы получить корректное значение length , можно использовать Object.keys(groceries).length . Учтите, что это также включает неиндексированные свойства до тех пор, пока вы не определите их как не перечисляемые. То есть:
Object.defineProperty(groceries, "sorted", < value: false, enumerable: false, configurable: true, writable: true >);
Так как же быть?
Если нужно создать коллекцию свойств различного типа, используйте JavaScript создание объектов. Во всех других случаях можно пользоваться массивом.
Массивы и объекты в JavaScript как книги и газеты
Если вы читали книги и газеты, то легко поймёте разницу между объектами и массивами в JavaScript.
В начале изучения JavaScript можно легко запутаться в способах хранения данных. С одной стороны, массивы могут быть знакомы вам благодаря циклу for . Но, по мере того, как вы будете заполнять массив данными, код может стать всё менее поддерживаемым.
Выбор между объектом и массивом станет проще, если представлять себе зачем нужна та или иная структура. Массивы подобны книгам, в которых содержится та или иная информация, а объекты похожи на газету.
Массивы: порядок данных очень важен
Взглянем на нашу небольшую книгу, если бы она была массивом:
var book = [`foreword`, `boyWhoLived`, `vanishingGlass`, `lettersFromNoOne`, `afterword`];
Кстати, обратите внимание — это первые три главы книги «Гарри Поттер и философский камень». И вот как можно визуализировать их:
Использовать массивы нужно тогда, когда последовательность информации имеет большое значение.
Надеюсь, что никто не глядит на оглавление книги и не думает: «Хм, эта глава выглядит интересной, пожалуй начну с неё». Порядок глав в книге указывает, как её нужно читать.
Когда нужно перебрать массив, то используется номер для каждого элемента массива. Массивы — это структуры данных, где нумерация начинается с нуля, поэтому мы начинаем в них отсчёт с 0, а не 1.
Так что, если вы хотите получить доступ к первому элементу массива, то пишите так:
Если нужна третья глава, то напишите так:
Вы читаете книгу, основываясь на порядке глав в книге, а не по названию этих глав.
Объекты: заголовок имеет значение
Посмотрите как бы выглядела газета в виде объекта:
А вот так можно визуализировать её:
Объекты — лучший выбор если вы хотите структурировать информацию по названию данных.
Читая газету, мы не обязаны читать её «от корки до корки». Можно начать чтение с любого интересного для вас раздела. Неважно, где именно этот раздел находится в газете, контекст сохраняется. Это и отличает газету от книги, где важна строгая последовательность чтения глав.
Объекты хранят информацию в виде пары ключ-значение. Вот как это выглядит:
Если хотите начать читать газету с новостей бизнеса, то использовать следует такой ключ:
Это вернёт нам значение: GE Stock Dips Again Поэтому когда легче получить доступ к данным на основании их имён (ключа), то вам необходимо хранить эти данные в виде объекта.
Объединяем объекты и массивы
В примерах выше в наших массивах и объектах мы хранили только строки. Но можно хранить и другие структуры данных, такие как числа или булевы значения, а также:
- Массивы внутри объектов.
- Объекты внутри массивов.
- Массивы внутри массивов.
- Объекты внутри объектов.
Это начинает становиться сложным. Но вам всегда нужна будет комбинация из двух типов для лучшей масштабируемости данных. Вы же хотите разобраться в коде спустя время, когда нужно будет что-то в нём исправить?
Давайте снова возьмём книгу, как пример. Что если мы хотим также хранить и количество страниц в каждой главе? В таком случае стоит заполнить наш массив объектами:
var book = [ [`foreword`, 14], [`boywholived`, 18] ]
Таким образом, мы сохранили порядок глав и в то же время разные свойства для каждой главы. Например, если захотите узнать сколько страниц во второй главе, то можете написать:
В результате мы увидим, что в книге будет 18 страниц.
Теперь давайте представим, что нам нужен топ-писателей для каждой колонки новостей в газете. Можно быстро сделать это с помощью массива внутри объекта:
Массив отлично подходит для хранения информации о рейтинге писателей, поскольку в массиве порядок имеет значение. Вы знаете, что старые авторы оцениваются выше, чем новые и это характерно для каждого массива. Писатель с номером 0 будет топ-писателем.
Можно оптимизировать этот объект, просто создав объект внутри нашего объекта newspaper . Например, объект sports с заголовком и списком писателей. Но теперь я хочу, чтобы вы сами попробовали.
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.