function changeStuff(num, obj1, obj2)
{
num = num * 10;
obj1.item = "nuevo";
obj2 = {item: "nuevo"};
}
var num = 10;
var obj1 = {};
obj1.item = "original";
var obj2 = {};
obj2.item = "original";
changeStuff(num, obj1, obj2);
console.log(num);
console.log(obj1.item);
console.log(obj2.item);
Produce:
10
changed
unchanged
Si fuera puramente pass by value, entonces cambiar obj1.item no hubiera tenido efecto fuera de la función.
Si fuera puramente pass by reference, entonces todo hubiera cambiado, num hubiera valido 100 y obj2.item valdría "nuevo".
Lo que sucede, es que que
los argumentos son pasados por valor. Pero el
elemento que es pasado por valor es en sí una referencia.
En términos prácticos, si cambias el parámetro mismo(num y obj2), no tiene efecto fuera de la función. Pero si cambias los internos del parámetro, el cambio se propaga (como con obj1)