Inkonsistenz der Argumentationsreferenzen in Javascript
Ich habe vor kurzem ein böses Problem in JS festgestellt.
Angenommen, wir übergeben einer Funktion f eine Karte, ein Array von Objekten.
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!
Wir können jedoch nicht die gesamte Verantwortung eines Objekts auf eine Funktion als Argument übertragen, wie dies auch im Funktionsparadigma der Fall isto=(function(o){return o})()
, weil jede Änderung an o nicht referenziert wird!
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!
Warum ist der oben beschriebene Referenzverlust und die vermutlich unterschiedliche Referenzbehandlung im zweiten Anwendungsfall, obwohl in beiden Fällen die Funktionen das Array-Argument an der 0-Position haben?