примитивы передаются значением (создается копия объекта), объекты передаются ссылкой (передается исходный объект)
let n = 2
let o = {
n: 2
}
function changeN(n) { // здесь копия (новый экземпляр) n
n = 3 // замена копии
}
changeN(n) // здесь n = 2
function changeNObject(o) { // здесь ссылка на объект "o"
o.n = 3 // заменим n внутри объекта
}
changeNObject(o)
console.log(n, o) // 2, {n: 3}