Ответ
В JavaScript используется передача по значению (pass-by-value), но важно понимать, что это значит для разных типов данных:
- Для примитивных типов (Number, String, Boolean, null, undefined, Symbol, BigInt) передается копия значения. Изменение параметра внутри функции не влияет на внешнюю переменную.
- Для объектов (включая Array, Function, Date) передается копия ссылки на объект в памяти. Сама ссылка передается по значению, но через нее можно мутировать исходный объект. Присвоение параметру нового объекта разрывает эту связь.
Примеры:
// Примитив: передача копии значения
function changePrimitive(val) {
val = 10; // Меняется локальная копия
}
let a = 5;
changePrimitive(a);
console.log(a); // 5 - исходное значение не изменилось
// Объект: передача копии ссылки
function mutateObject(obj) {
obj.value = 100; // Мутация исходного объекта через ссылку
}
function reassignObject(obj) {
obj = { value: 200 }; // Присваивание новой ссылки локальному параметру
}
let myObj = { value: 5 };
mutateObject(myObj);
console.log(myObj.value); // 100 - объект изменен
reassignObject(myObj);
console.log(myObj.value); // 100 - исходный объект НЕ изменился Ответ 18+ 🔞
А, ну это классика, ёпта! Вечная тема, про которую новички ломают голову, а потом у них волнение ебать начинается, когда код ведёт себя не так, как они ожидали.
Смотри, в JavaScript всё передаётся по значению, но тут есть хитрая жопа, которую нужно разжевать. Не как кот сука собака, а нормально.
- Для всяких примитивов (циферки, буковки, true/false и прочая мелочь) — передаётся тупо копия самого значения. Внутри функции ты можешь его хоть перекрашивай, исходная переменная снаружи об этом нихуя не узнает. Это как если бы ты дал другу ксерокс своей фотки — пусть он на ней усы рисует, твоё оригинальное лицо от этого не пострадает.
- Для объектов (массивы, функции, даты — всё, что не примитив) — передаётся копия ссылки на этот самый объект в памяти. Сама ссылка-то передаётся по значению, но через неё ты лезешь прямо в оригинальную банку с вареньем. Можешь там всё перемешать. Но! Если ты внутри функции этой локальной ссылке скажешь «ты теперь указываешь на другую банку», то снаружи все продолжат смотреть на старую. Понимаешь разницу? Мутация — да, перепривязка — нет.
Примеры, чтобы совсем ясно стало:
// Примитив: копия значения, как та самая фотка
function changePrimitive(val) {
val = 10; // Рисуем усы на копии
}
let a = 5;
changePrimitive(a);
console.log(a); // 5 - а наша оригинальная фотка всё ещё чистая, красота!
// Объект: копия ссылки на банку с вареньем
function mutateObject(obj) {
obj.value = 100; // Лезем в банку и меняем варенье на говно, простите, на другое варенье
}
function reassignObject(obj) {
obj = { value: 200 }; // Говорим локальной ссылке: "Забудь старую банку, вот тебе новая, смотри на неё"
}
let myObj = { value: 5 };
mutateObject(myObj);
console.log(myObj.value); // 100 - ой, а в оригинальной банке уже не то! Мутация прошла успешно.
reassignObject(myObj);
console.log(myObj.value); // 100 - а тут нихуя! Снаружи-то ссылка как смотрела на старую банку, так и смотрит. Ей похуй на то, куда там внутри функции что переназначили.
Вот и вся магия. Главное — не путать мутацию объекта через полученную ссылку с попыткой заставить внешнюю переменную смотреть на что-то новое. Для этого нужно работать уже с самой внешней переменной, а не с её локальной копией-ссылкой.