incoerência de referência de referência em javascript

Eu encontrei recentemente um problema desagradável no JS.

Vamos dizer que nós passamos um mapa, uma matriz de objetos para uma função 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!

Mas, não podemos passar total responsabilidade de um objeto para uma função como argumento, assim como no paradigma funcionalo=(function(o){return o})(), porque qualquer tipo de modificação para o não é referenciada!

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 que a perda de referência descrita acima e o tratamento de referência presumivelmente diferente no segundo caso de uso, embora em ambos os casos, as funções obtiveram o argumento matriz na posição 0.?

questionAnswers(1)

yourAnswerToTheQuestion