Inconséquence de référence argumentaire dans javascript

J'ai récemment rencontré un problème méchant dans JS.

Disons que nous passons une carte, un ensemble d'objets à une fonction 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! 

Mais, nous ne pouvons pas passer la responsabilité totale d'un objet à une fonction comme argument, comme dans le paradigme fonctionnel o=(function(o){return o})() , car tout type de modification à o n'est pas référencé!

 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! 

Pourquoi la perte de référence décrite ci-dessus et la manipulation de références présumément différentes dans le deuxième cas d'utilisation, bien que dans les deux cas, les fonctions ont-elles obtenu l'argument de tableau dans la position 0.?

Javascript passe toujours des arguments par valeur, donc cela ne fonctionnera pas:

  function foo(x) { x = 100; } y = 5 foo(y) y == 100 // nope 

Cependant, cela fonctionne:

  function foo(x) { x.bar = 100; } y = {} foo(y) y.bar == 100 // yes 

Dans le deuxième extrait x est encore transmis par valeur, mais cette valeur est une référence (pointeur) sur un objet. Il est donc possible dans une fonction de le décréter et d'accéder à ce qui est "à l'intérieur" de l'objet.