Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не понимаю каким образом модифицировался исходный объект (https://javascript.ru/forum/misc/85565-ne-ponimayu-kakim-obrazom-modificirovalsya-iskhodnyjj-obekt.html)

Himmelin 23.10.2023 18:29

Не понимаю каким образом модифицировался исходный объект
 
Всем доброго времени!

Есть вот такой простенький исходный объект в форме связного списка:

const baseList = {
  value: 6,
  next: {
    value: 4,
    next: {
      value: 2,
      next: null,
    },
  },
}


Его я прогоняю через такую функцию:

function backwards(list) {
  let prevValue;

  while (list) {
    let next = list.next;
    
    list.next = prevValue;
    prevValue = list;
    list = next;
  }

  return prevValue;
}


В итоге после вызова
backwards(baseList)
я вывожу в консоль исходный объект
console.log(baseList)
и с удивлением обнаруживаю что он равен
{ value: 6, next: null }
, а не
null
как я рассчитывал. Подскажите как и на каком моменте так вышло? По ходу у меня пробелы в знаниях о ссылочных типах данных...

Aetae 23.10.2023 19:47

null не передаётся по ссылке, аргументы и возврат функции тоже не ссылка(все аргументы - копия, для объектов - копия ссылки).
В baseList остаётся лежать то, что лежало, внутри функции ты можешь изменить содержимое объекта, но никак не сам объект.

Himmelin 23.10.2023 19:55

Хорошо, про null понятно. Про значение объекта тоже понятно, но все еще непонятно, почему именно такое значение? Я проверил все итерации цикла, такое значение только в первых итерациях, но не в последних

Himmelin 23.10.2023 20:28

Почему именно
{ value: 6, next: null }

voraa 23.10.2023 23:33

Потому, что вы выводите именно baseList, у которого свойство value: 6;
Со свойством next вы делаете разные манипуляции, пока оно не станет null, а свойство value так и остается 6.

Himmelin 24.10.2023 12:28

Я понял, весь фокус был в строке
list = next
которая таким образом перезаписывает свойство next, всем спасибо!


Часовой пояс GMT +3, время: 16:45.