Массивы

Массив - структура данных для хранения и манипулирования коллекцией индексированных значений. Используeтся для хранения упорядоченных коллекций данных, например списка курортов, товаров, клиентов в отеле и т. п.

Создание

Массив объявляется открывающей и закрывающей квадратной скобками [] - литералом массива. Внутри скобок каждый элемент массива разделяется запятой.

const clients = ["Mango", "Poly", "Ajax"];

Доступ к элементам

Для доступа к значению элемента массива используется синтаксис квадратных скобок массив[индекс]. Между именем переменной хранящей массив и квадратными скобками не должно быть пробела.

const clients = ["Mango", "Poly", "Ajax"];// Указывая в скобках индекс элемента мы получаем его значениеconsole.log(clients[0]); // Mangoconsole.log(clients[1]); // Polyconsole.log(clients[2]); // Ajax

Индексация элементов массива начинается с нуля.

Переопределение

В отличии от строк, элементы массива можно изменять обратившись к ним по индексу и присвоив другое значение.

const clients = ["Mango", "Poly", "Ajax"];clients[0] = "Kiwi";
clients[1] = "Pango";
console.log(clients); // ["Kiwi", "Pango", "Ajax"]

Длина массива

Длина массива, то есть число его элементов, хранится в свойстве length. Это динамическая величина, которая изменяется автоматически при добавлении или удалении элементов.

const clients = ["Mango", "Poly", "Ajax"];
console.log(clients.length); // 3

Индекс последнего элемента

Чаще всего мы заранее в коде не знаем какая будет длина массива. Для того чтобы получить значение последнего элемента применяется следующий подход - длина массива всегда на единицу больше чем индекс последнего элемента. Используя формулу длина массива - 1 можно получить значение последнего элемента массива произвольной длины.

const clients = ["Mango", "Poly", "Ajax"];
const lastElementIndex = clients.length - 1;
console.log(lastElementIndex); // 2
console.log(clients[lastElementIndex]); // "Ajax"

Присвоение по ссылке и по значению

Фундаментальным отличием сложных типов от примитивов, является то, как они хранятся и копируются. Примитивы: строки, числа, були,null и undefined, при присваивании копируются целиком, по значению (by value).

Со сложными типами всё не так. В переменной, которой присвоен массив или объект, хранится не само значение, а адрес его места в памяти, иными словами - ссылка (указатель) на него и передаются они по ссылке (by reference).

Представим переменную в виде листа бумаги. Её значение мы представим в виде записи на этом листе.

Если мы захотим сообщить содержимое этой записи пользователям, то можем поступить так - сделать физические копии и вручить их каждому, то есть сделать множественные независимые копии (присвоение по значению).

Или поместить лист в закрытой комнате и дать пользователям ключ от этой комнаты, то есть один экземпляр с общим доступом (присвоение по ссылке).

Теперь изменим данные на листе бумаги - значение переменной. Очевидно, что посетители комнаты всегда будут видеть изменения которые мы вносим, так как изменяется оригинал и они имеют к нему доступ. И также очевидно, что владельцы бумажных копий не заметят изменений глядя на свои копии.

При передаче по значению, переменным выделяется новая ячейка памяти и в нее копируются данные. Аналогия с множественными копиями бумажного листа имеет вполне реальное воплощение, отдельный лист для каждой копии.

При передаче по ссылке, вместо создания нового объекта, переменной присваивается ссылка (указатель) на уже существующий объект, то есть на его место в памяти. Таким образом, несколько переменных могут указывать на один и тот же объект, по аналогии с закрытой комнатой, у них есть ключ доступа к оригиналу листа.

Все примитивные типы присваиваются по значению, то есть создается копия.

let a = 5;
// Присвоение по значению, в памяти будет создана еще
// одна ячейка в которую будет скопировано значение 5
let b = a;

console.log(a); // 5
console.log(b); // 5

// Изменим значение aa = 10;
console.log(a); // 10

// Значение b не изменилось так как это отдельная копия
console.log(b); // 5

Сложные типы - объекты, массивы, функции присваиваются по ссылке, то есть переменная просто получает ссылку на уже существующий объект.

const a = ["Mango"];
// Так как a это массив, в b записывается ссылка на уже существующий
// массив в памяти. Теперь a и b указывают на один и тот же массив.

const b = a;console.log(a); // ["Mango"]
console.log(b); // ["Mango"]

// Изменим массив, добавив еще один элемент, используя указатель из aa.push("Poly");
console.log(a); // ["Mango", "Poly"]

// b также изменилось, потому что b, как и a,
// просто содержит ссылку на одно и то же место в памяти
console.log(b); // ["Mango", "Poly"]

// Результат повторяетсяb.push("Ajax");
console.log(a); // ["Mango", "Poly", "Ajax"]
console.log(b); // ["Mango", "Poly", "Ajax"]

Last updated