Как в JavaScript происходит передача аргументов - по ссылке или по значению?

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

Вот пример:

function обновитьИнформацию(пользователь, возраст) {
    пользователь.имя = "Новое имя";
    возраст = 25;
}

let человек = {имя: "Иван"};
let годы = 30;

обновитьИнформацию(человек, годы);
console.log(человек.имя); // что выведется здесь?
console.log(годы); // а что здесь?

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

Можете рассказать, какая официальная позиция JavaScript по данной теме? Мне бы хотелось разобраться с этой концепцией.

Джуниоры постоянно на этом спотыкаются. JavaScript всегда передает по значению, но для объектов это значение — ссылка на место в памяти. Можешь менять свойства через эту ссылку, но заменить весь объект — нет. У тебя человек.имя покажет “Новое имя”, а годы так и останется 30. Думай об этом как о “копировании указателя”.

А вот попробуй эксперимент - внутри функции добавь пользователь = {имя: "Совсем другое"} и посмотри что получится. Исходный объект не изменится! Ты переписываешь локальную переменную, а не сам объект. Такие моменты прям мозг ломают поначалу. У тебя есть опыт с другими языками программирования?