В основе каждого языка программирования лежит концепция хранения небольших фрагментов информации (данных) в неких держателях, называемых переменными. JavaScript как язык не является исключением из этого шаблона. Поэтому очень важно, чтобы мы понимали эти переменные и то, как они принимают различные возможные значения.

В JavaScript, как и в других языках, переменные служат способом хранения или хранения данных в течение некоторого времени до тех пор, пока они снова не потребуются в будущем. Поскольку мы хотим иметь возможность извлекать сохраненные данные позже, имеет смысл иметь способ идентификации каждой части данных, которые нам нужны. Это больше похоже на ярлык. Угадайте, что это за метки, переменные! Мы поймем все это лучше через мгновение.

Типы данных подразделяются на две большие группы: примитивные типы и ссылочные или объектные типы. Простое эмпирическое правило заключается в том, что все значения, кроме примитивных, являются объектами в JavaScript.

Тип данных Primitive, также известный как типы значений, гораздо проще в работе. Члены этой группы включают числа, строки, логические значения, undefined, null и символ. Когда мы делаем копию переменной, содержащей примитивный тип, мы в конечном итоге копируем фактическое значение этой конкретной переменной. Например,

let age = 35; //variable 'age' holds the value 35 (a number)
let count = age; // we make a copy of age
console.log(count) //35 :count also holds the value of 35.
count = 56 // count now hold 56;
console.log(age) //35 :age still has 35 in it.

Из приведенного выше кода мы можем вывести некоторые жизненно важные функции примитивных типов. Во-первых, когда создается копия примитивного типа данных, такого как «возраст», копия «счетчик» также содержит то же значение. Во-вторых, когда мы меняем значение в копии, исходная версия (возраст в нашем примере) остается прежней. Отсюда можно сделать вывод, что изменения, сделанные в одной копии примитивного типа, не видны в другой копии.

Теперь давайте подробнее рассмотрим ссылочные типы. В JavaScript есть несколько типов объектов, с которыми мы можем работать, например, объекты, массивы, функции и многие другие. С ссылочными типами гораздо сложнее иметь дело, и поэтому их необходимо правильно объяснить. В JavaScript объекты — это переменные, содержащие набор пар ключ-значение. Например,

let person = {
   age: 45,
   job: 'developers'
   technologies: ['React.js', 'Next.js', 'TypeScript']
};

В приведенном выше примере человек — это объект с ключами возраст, работа и технологии. Значения: 45, «разработчик» и массив строк соответственно. Когда дело доходит до создания копий типов объектов, процесс отличается от процесса создания примитивов.

Ссылочные типы копируются не по их значениям, а по ссылке, на которую они указывают в памяти. В приведенном выше примере 'person' содержит не значение, а ссылку или указатель на ячейку памяти, где хранится фактическое значение. То, что на самом деле содержит человек, похоже на адрес, который в конечном итоге указывает на определенное место. По этой же причине, когда мы делаем копию типа данных объекта, мы также присваиваем адрес новой копии. Следовательно, и исходный объект, и его копия содержат ссылку на один и тот же адрес в памяти, и, поскольку они обращаются к одному и тому же местоположению, они имеют одинаковое значение.

let person = {
   age: 45,
   job: 'developers'
   technologies: ['React.js', 'Next.js', 'TypeScript']
};
let employee = person; //person and employee point to same reference
console.log(person.age) // 45
console.log(employee.age) // 45 : same reference as person
let employee.age = 18; // altered age on employee
console.log(employee.age) // 18
console.log(person.age) // 18 : also altered on the original version

Из приведенного выше фрагмента кода видно, что при изменении копии ссылочного типа исходная версия также мутирует. Это может показаться немного запутанным, но способ создания копий может служить намеком на это странное поведение. Ранее мы установили, что для типов объектов копирование выполняется по ссылке. Предположим, что aui345xl — это адрес склада. Изначально на этом складе пять автомобилей. Если мистеру «человеку» дать адрес, и он доберется до склада, он увидит там пять машин. Если тот же адрес дать мистеру «сотруднику», он тоже увидит пять машин по пути к месту. Теперь, если г-н «сотрудник» добавит одну машину, он сможет увидеть шесть машин. Гораздо позже господин «человек» идет на тот же склад, как машины машины он увидит? Тоже шесть, да? Да, поскольку они обращаются к одному и тому же адресу, они всегда будут видеть любые изменения, внесенные одним из них на склад. Это простая причина, по которой мы говорим, что типы объектов являются ссылочными и что они могут быть изменены.

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