Коллекции данных

До сих пор большинство из вас хорошо знакомы с простыми типами, такими как число, строка, логическое значение, которые используются для обработки одиночных значений. Но в приложениях реального типа нам приходится иметь дело с более сложной организацией данных. Для организации множества элементов данных используются массивы.

Массивы представляют собой упорядоченные наборы значений…
1. Список товаров в корзине покупок
2. Песни в плейлисте

Чтобы понять массивы, см. контейнер для таблеток ниже, который содержит таблетки для каждого дня недели, начиная с первого дня недели (вс) до последнего дня недели (сб).

Создание массива

// To make an empty array
let employees = [];
// Array of strings
let cars = ['BMW','VW','OODI'];
// Array of numbers
let numbers = [95,88,30,99,65];
// Mixed array
let employeeInfo = ['Alex',10000,'HR'];

Массивы индексируются

Каждый элемент массива имеет связанный с ним позиционный индекс, начинающийся с 0. Это означает, что первый элемент имеет индекс 0, второй элемент имеет индекс 1 и т. д., что указывает на то, что массивы представляют собой упорядоченную коллекцию.

let colors = ['Red', 'Green', 'Blue', 'Yellow', 'Pink', 'Black'];
console.log(colors.length) // 6
console.log(colors[0]) // Red
console.log(colors[1]) // Green
console.log(colors[5]) // Black
console.log(colors[6]) // undefined
console.log(colors[100]) // undefined

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

let colors = ['Red', 'Green', 'Blue', 'Yellow', 'Pink', 'Black'];
Step-1: Get the array length
   colors.length // 6 - Returns the array size
Step-2: Convert length to the last index as index start with 0.
   colors.length - 1 // 5, Last index of array
Step-3: Get the last element from the array
    colors[ colors.length - 1] // Black

Изменение массивов

let colors = ['Red', 'Blue', 'Green']
colors[2] = 'Lime'
console.log(colors) // ['Red', 'Blue', 'Lime']
console.log(colors[3]) // undefined
colors[3] = 'Black' // ['Red', 'Blue', 'Lime', 'Black']

Добавление элемента в конец массива

let shoppingCart = [];
shoppingCart[0] = 'Mobile'
shoppingCart[1] = 'Earpods'
console.log(shoppingCart) // [Mobile, Earpods]
// Adding element to the end of the array
shoppingCart[shoppingCart.length] = 'Mobile Case'
shoppingCart[shoppingCart.length] = 'Jeans'

Введение в ссылочные типы

Мы все хорошо знакомы с примитивными типами. Всякий раз, когда мы создаем примитивную переменную, создается пространство в памяти для хранения двоичных эквивалентных значений в памяти. См. рисунок ниже…

Любое изменение переменной будет обновлено значением в ранее зарезервированной области памяти, что означает, что значение будет обновлено в памяти.

// Creates new variable in memory with label fruit
let fruit = 'Orange'
// Create another variable color with same value of fruit
let color = fruit
console.log(fruit + " - " + color) // Orange Orange
// Update value of color variable
color = 'Red'
// Notice only color variable's value is changed
console.log(fruit + " - " + color) // Orange Red

Поскольку переменные primitive напрямую хранят значение в памяти, они называются Value Type Variable.

Значения primitive всегда хранятся в Stack в памяти в порядке LIFO (последний вошел, первый вышел).

Но если рассматривать array и object как типы, то они отличаются от типов primitive тем, что не хранят значения непосредственно в памяти.

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

let nums = [1,2,3,4,5] /* Creates an array and save the reference(address) of array into a variable called nums.*/

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

let otherNums = nums // copy array into another array

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

Посмотрите на пример ниже, если мы изменим otherNums array, это также повлияет на массив nums, так как оба ссылаются на один и тот же массив значений.

otherNums[3] = 11 // update the 4th value of array
console.log(nums) // [1,2,3,11,5]
console.log(otherNums) // [1,2,3,11,5]

Таким образом, массив и объект называются Reference Types.

Посмотрите на полный пример ниже…

let nums = [1,2,3,4,5]
let otherNums = nums // Copy reference of array
console.log(nums) // [1,2,3,4,5]
console.log(otherNums) // [1,2,3,4,5]
otherNums[3] = 11 // Update values
console.log(nums) // [1,2,3,11,5]
console.log(otherNums) // [1,2,3,11,5]

Reference types работают только при создании клонов массивов или объектов. Массивы с одинаковыми значениями не создают ссылочных копий. Посмотрите на пример ниже…

let arr1 = [1,2,3,4,5]
let arr2 = [1,2,3,4,5]
console.log(arr1) // [1,2,3,4,5]
console.log(arr2) // [1,2,3,4,5]
arr1[2] = 0
console.log(arr1) // [1,2,0,4,5]
console.log(arr2) // [1,2,3,4,5]

Как показано в приведенном выше примере, изменения в arr1 не влияют на arr2, поскольку оба они хранятся в разных местах памяти.

Использование Const с массивом

Как мы узнали, массив не хранит значения, он хранит только ссылки на массив.

let fruits = ['Apple','Grapes','Banana']
console.log(fruits) // [Apple, Grapes, Banana]

В приведенном выше примере создается переменная fruits, которая содержит ссылку на значения массива ['Apple','Grapes','Banana'].

Теперь во время операций с массивами мы обычно меняем значения массива, как показано ниже…

fruits.push('papaya') // Adding new item in fruits
console.log(fruits) // [Apple,Grapes,Banana,papaya]

Но поскольку мы определили массив fruits с ключевым словом let, можно изменить ссылку, а переменной fruits можно назначить другую ссылку на массив, как показано в примере ниже…

fruits = ['BMW','VW','Maruti','Toyoto']
console.log(fruits) // [BMW,VW,Maruti,Toyoto]

Таким образом, в приведенном выше примере fruits назначаются новые значения массива, которые содержат автомобили, что концептуально неверно.

Мы можем предотвратить такое поведение, создав переменную с ключевым словом const, поскольку const не позволяет изменять переменную после ее создания.

const fruits = ['Apple','Banana','Grapes']
console.log(fruits) // [Apple, Banana, Grapes]
fruits.push('Orange') 
console.log(fruits) // [Apple, Banana, Grapes, Orange]
fruits = ['BMW','VW','Maruti'] /* Error, as array is const and reference can't be changed. */

Если вам понравился пост, не забудьте подписаться на меня:

Канал: https://medium.com/@maheshshittlani
Github: https://github.com/maheshshittlani
LinkedIn: https://in.linkedin.com/in/mahesh-shittlani-638b7429