2016-07-08 12 views
0

Ich las somewhere, dass wenn wir ein Objekt in eine Funktion übergeben "... JavaScript verwendet immer das Objekt als Referenz, wenn es als Argument übergeben ..." Was ich denke, dies ist (korrigiere mich, wenn ich falsch liege) ist, dass, wenn die Funktion das Objekt irgendwie verändern würde, es das ursprünglich definierte Objekt verändern würde. Ich habe versucht, dies mit etwas Code zu illustrieren, und es tut, was ich denke, aber wenn ich das Beispiel im Blogbeitrag mit einem Number-Obj versuche, ändert es nicht den ursprünglichen Wert in diesem Objekt. Bitte beachten Sie meine jsbin: https://jsbin.com/wociro/edit?js,console,outputAnzahl Objekte, die durch Referenz in Funktionen übergeben wurden

console.clear(); 
 
/**myobject Object**/ 
 
function myobject() { 
 
    this.value = 5; 
 
} 
 
var o = new myobject(); 
 
console.log("Original value of o: " + o.value); // o.value = 5 
 

 
function objectchanger(fnc) { 
 
    fnc.value = 6; 
 
} 
 

 
objectchanger(o); 
 
console.log("New value of o: " + o.value); // o.value is now equal to 6 
 

 
/*Number Object*/ 
 

 
var num2 = new Number(2); 
 
console.log("Original value of num2: " + num2); 
 

 
function numberChanger(fnc) { 
 
    return fnc + 1; 
 
} 
 
console.log("num2 after running numberChanger: " + numberChanger(num2)); 
 

 
console.log("New value of num2: " + num2); //looks the same

Bin ich etwas fehlt?

+1

Nummer ist, waschamacallit ... [ein primitiv.] (Https://developer.mozilla.org/en-US/docs/Glossary/Primitive) – nullpotent

+0

In Zukunft, bitte fügen Sie alle Code in der Frage selbst, anstatt auf einer anderen Seite. –

Antwort

0

In JavaScript verweisen Objekte auf ein Array, das durch [] oder ein Objekt {} angezeigt wird. Sie können den Typ der Variablen mit typeof überprüfen. Diese werden als Referenz übergeben.

typeof [2, 5, 3] //object 
typeof { a: 10} // object 

Wenn Sie die Objektliteral auf eine Funktion und ändern Sie den Wert der Eigenschaft ‚a‘ passieren, wäre es ergeben sich der Wert geändert werden.

+0

Hmm aber wenn ich type a laufe. Ich bekomme "Objekt" zurück – leyu

+0

Entschuldigung, hatte mein Beispiel nicht durch die Konsole ausgeführt. Meine Antwort war falsch. –

2

Anzahl Objekte sind immer noch Objekte. Daher ist ihr Wert eine Referenz, und wenn eine Funktion eine Eigenschaft eines als Argument übergebenen Objekts ändert, wird dieses Objekt außerhalb der Funktion beeinflusst.

function changer(obj) { 
 
    obj.foo = 'bar'; 
 
} 
 
var num = new Number(123); 
 
console.log(num.foo); // undefined 
 
changer(num); 
 
console.log(num.foo); // 'bar'

der Wert jedoch in der Anzahl zu umwickelnde Gegenstand wird als Eigenschaft nicht gespeichert. Es wird als interner [[NumberData]] - Slot gespeichert. ECMAScript bietet keine Möglichkeit, diesen Slot zu ändern, sodass Sie die Nummer nicht ändern können.

Ihr Versuch von fnc+1 wickelt das Nummernobjekt ab, um dessen [[NumberData]] zu erhalten, und fügt 1 hinzu. Das Ergebnis wird jedoch einfach verworfen. Es wird nicht im Slot [[NumberData]] von fnc gespeichert.

Wenn Sie wollen in der Lage sein, etwas zu erreichen, analog die Änderung der [[NumberData]] können Sie

function MyNumber(num) { 
 
    this.__number__ = +num; 
 
} 
 
MyNumber.prototype = Object.create(Number.prototype); 
 
Object.getOwnPropertyNames(Number.prototype).forEach(function(prop) { 
 
    var desc = Object.getOwnPropertyDescriptor(Number.prototype, prop); 
 
    if(desc && desc.value && typeof desc.value == 'function') { 
 
    var native = desc.value; 
 
    desc.value = function() { 
 
     return native.apply(this.__number__, arguments); 
 
    }; 
 
    Object.defineProperty(MyNumber.prototype, prop, desc); 
 
    } 
 
}); 
 
var num = new MyNumber(123); 
 
console.log(+num, num+'', num.toFixed(2)); // 123, "123", "123.00" 
 
num.__number__ = 456; 
 
console.log(+num, num+'', num.toFixed(2)); // 456, "456", "456.00"

+0

Danke für Ihre Antwort. War mir der internen Details nicht bewusst. –

+0

All das und du hast die "Unveränderlichkeit" nicht auf den Tisch gebracht. Ich bin so beeindruckt. – nullpotent

+0

Hm das macht viel Sinn. Vielen Dank – leyu

0

Ich hatte tatsächlich eine Menge Probleme, wenn ich immer in die gestartet Objektseite von JavaScript selbst. Am besten kann ich das anhand dieser Beispiele erklären.

Objekte verknüpfen.

var obj = {a: 5}; 
var b = obj.a; 
b = 2; 
// obj.a: 2 
// b: 2 

Dies wird den Objektwert verknüpfen, glaube ich. Wenn Sie also b ändern, ändert sich auch obj.a.

HTML DOM-Objekt Link mit merkwürdigem Verhalten

var x = document.getElementById("some_div_id"); 
x.innerHTML = "example"; // this works 

var x = document.getElementById("some_div_id").innerHTML; 
x = "example"; // this doesn't, it thinks that it's document.getElementById("some_div_id"); 

nahm mir Zeit zu Figur, was falsch war, als ich die zweite DOM Methode tat zuerst.

Variablen werden nicht verknüpft, sondern kopiert.

var a = 5; 
var b = a; 
b = 2; 
// a: 5 
// b: 2 

Wie Sie sehen können, bedeutet dies nicht den Wert verknüpfen, sondern schafft eine neue von ihm basiert.

Tiefes Kopieren von Objekten Trick.

function deepCopy(objValue) { 
    return JSON.parse(JSON.stringify(objValue)); 
} 
var obj = {a: 5}; 
var b = deepCopy(obj.a); 
b = 2; 
// obj.a: 5 
// b: 2 

Das war ein Trick, um mich vor einiger Zeit gegeben, als ich Fragen hatte einen Objektwert zu wollen in einer Variablen und bearbeitet gespeichert werden, ohne sie jedoch zu dem Objektwert verknüpft sind. Nach einer Weile stellte ich fest, dass ich es nie brauchte, nachdem ich meine Programmierkenntnisse verbessert hatte.

Auch letzte Anmerkung. Ich habe irgendwo in sauberer JavaScript-Codierung gelesen, dass Sie die Objektmethode new nicht verwenden müssen, es sei denn, es handelt sich um ein Date()-Objekt oder eine simulierte Klasse, oder Sie können mit === in Typeof- und Wertüberprüfungsprobleme geraten.

Kann nicht sicher sein, wenn dies fehlerfrei ist, aber hoffe, dass dies hilft, erklärt besser.

Verwandte Themen