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.