Inconsistencia argumental de referencia en javascript
Recientemente he encontrado un problema desagradable en JS.
Digamos que pasamos un mapa, una matriz de objetos a una función f.
var o=[{a:0}];
function f(a){
for(var i in a){
if (a.hasOwnProperty(i)){
a[i]=null;
}
}
return a;
};
var outp=f(o);
alert(outp[0]+" === "+o[0]+" : "+(outp[0]===o[0]));
// here we expect loose equality, and equality in type,
//furthermore it should identically equal as well, and we got right!
Pero, no podemos pasar la responsabilidad total de un objeto a una función como argumento, igual que en el paradigma funcionalo=(function(o){return o})()
, porque no se hace referencia a cualquier tipo de modificación a o!
var o=[];
function ff(a){
return (a=undefined);
};
var outp=ff(o);
alert(outp+" === "+o.constructor+" : "+(outp===o));
// here we expect true, but we got false!
¿Por qué la pérdida de referencia descrita anteriormente y el manejo de referencia presumiblemente diferente en el segundo caso de uso, aunque en ambos casos, las funciones obtuvieron el argumento de la matriz en la posición 0.?