2 Stimmen

jQuery: object[property].push() ändert das alte Objekt, wenn das neue mit jQuery.extend() erstellt wird

Betrachten Sie diesen Beispielcode:

a={};
a['herp']=['derp'];

var b = jQuery.extend({}, a);
b['herp'].push('foo');
alert(a['herp']); //this produces message box with "derp,foo"

Ich gehe davon aus, dass var b = jQuery.extend({}, a); klont ein Objekt (als erwähnt von John Resig), d.h. es wird ein neues Objekt mit denselben Eigenschaften wie das vorherige erstellt. Wenn dies richtig ist, warum wird dann b['herp'].push('foo'); ändern. a wie angegeben durch alert(a['herp']); ?

jsFiddle-Beispiel: http://jsfiddle.net/M48tr/

3voto

Nicola Peluchetti Punkte 74314

Ich denke, das sollten Sie tun:

var b = jQuery.extend(true, {}, a);

Hier fummeln http://jsfiddle.net/M48tr/1/

Dies liegt daran, dass die Eigenschaft ein Array ist und Sie einen tiefen Klon benötigen. Wie es in der Dokumentation geschrieben steht:

Die von $.extend() durchgeführte Zusammenführung ist standardmäßig nicht rekursiv; wenn eine Eigenschaft des ersten Objekts selbst ein Objekt oder Array ist, wird es vollständig durch eine Eigenschaft mit dem gleichen Schlüssel im zweiten Die Werte werden nicht zusammengeführt, aber durch die Übergabe von true für das erste übergeben, werden die Objekte rekursiv zusammengeführt.

Wenn Sie keine Tiefenkopie machen, b['herp'] nur einen Verweis auf das Array enthalten, das sich in a['herp']

Anders sieht es aus, wenn es sich bei den Eigenschaften nicht um Arrays oder Objekte wie in diesem Beispiel handelt:

a={};
a['herp']='derp';

var b = jQuery.extend({}, a);
b['herp'] = 'foo';
alert(a['herp']);//alerts derp

alert(b['herp']);//alerts foo

hier fummeln http://jsfiddle.net/M48tr/2

1voto

Bakudan Punkte 18446

Sie sollten genauer lesen und Google benutzen. Im Allgemeinen Seichte Kopie - wird eine neue "Kopie" erstellt. Sie verweist jedoch auf denselben Speicherbereich (Daten - Variablen, Konstanten usw.). Sie stellt also ein "Synonym" des ursprünglichen Objekts dar. Und nun das Wichtigste: Egal, was Sie ändern, es wirkt sich auf beide aus.

Tiefe Kopie ist zeitaufwändiger, weil todos der Daten des ursprünglichen Objekts wird in das neue Objekt kopiert. Die beiden Objekte haben die gleiche Struktur (und zeigen nicht auf dasselbe). Änderungen wirken sich jedoch nur auf eines der Objekte aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X