В JavaScript у нас есть примитивные значения и ссылочные значения. Примитивные значения — это string , number , boolean , undefined , null и reference значения — это объекты массива. Еще одна вещь, о которой следует помнить, что примитивные типы данных неизменяемы, а ссылочные типы изменяемы. Итак, теперь приходит основная концепция, когда я говорю, что a = 10, чтобы все знали, что когда-либо значения справа копируются слева. Теперь давайте рассмотрим пример, чтобы увидеть, как работает передача по значению в js.

let name = 'jello';
let age = 22;
console.log(name); //jello
console.log(age); //22
let newName = name;
let newAge = age;
name = 'mello';
age = 26;
console.log(newName); //jello
console.log(name); //mello
console.log(newAge); //22
console.log(age); //26

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

Теперь давайте поговорим о передаче по ссылке, так что все, что не является примитивным, передается по ссылке.

let iplTeams = ['kkr' , 'csk'];

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

let iplSeason = {
season : 2018,
teams : ['kkr' , 'csk' , 'MI']
}
let newIplSeason = iplSeason;
console.log(iplSeason);    //{season : 2018 , 
                              teams  : ['kkr','csk' ,'MI']}
console.log(newIplSeason);  //{season : 2018 , 
                               teams  : ['kkr','csk' ,'MI']}
newIplSeason.teams.push('rcb');
console.log(iplSeason);     //{season : 2018 , 
                               teams  : ['kkr','csk' ,'MI' ,'rcb']}
console.log(newIplSeason);  //{season : 2018 , 
                               teams  : ['kkr','csk' ,'MI' ,'rcb']}

когда мы объявляем объект, адрес памяти этого объекта копируется в iplSeason, а когда мы назначаем его newIplSeason, тогда тот же адрес памяти копируется в newIplSeason, теперь и iplSeason, и newIplSeason указывают на один и тот же адрес памяти, что означает, что теперь оба ссылаются на один и тот же объект в памяти, поэтому, когда мы изменяем свойство команды newIplSeason, изменяются как iplSeason, так и newIplSeason. Куча используется для хранения данных в памяти, а стек используется для хранения адресов памяти.

let teams = ['kkr' , 'rcb' , 'csk'];
let newTeams = teams;
console.log(newTeams === teams); // true
newTeams = ['kkr' , 'rcb' , 'csk'];
console.log(newTeams === teams); // false

Итак, теперь здесь мы сначала получаем true, потому что для сравнения это фактически проверенные значения, и это массив, поэтому значением команд является адрес памяти, и мы назначаем один и тот же адрес памяти для newTeams, теперь они оба имеют одинаковые адреса памяти, а затем мы получаем false, хотя массив выглядит совершенно одинаково, потому что они хранятся в разных местах памяти и имеют разные адреса памяти.