2016-04-26 8 views
0

Angenommen, ich habe ein Objekt als:Sind Variablen/Objekte nach Wert übergeben und warum kann ich Objekteigenschaft nicht mit Variable in Javascript ändern?

var obj = { 
     len: 4, 
     bred: 5 
    } 

Jetzt nehme ich dieses Objekt einer Variablen x als var x = obj; zuweisen. Soweit ich es verstehe, erstellt es eine Kopie von obj und weisen Sie diese Kopie x - das ist nach Wert übergeben. Jetzt, wenn ich eine Eigenschaft von x ändere, dann ändert es auch diese Eigenschaft des Objekts obj. Z.B.

x.len = 99 

Dann werden beide obj.len und x.len werden 99. Auf der anderen Seite dieses Szenario vor:

var r = 2, s = 3, t = 4; 
s = r; 
s = 88; 

Jetzt r von Wert zu s dass s eine Kopie r wurde s gegeben geben wird. Die Änderung von s zu 88 ändert also nicht den ursprünglichen Wert von r Variable. Die Eingabe r in der Konsole gibt immer noch 2.

Frage 1: Wenn Variablen (Objekte enthalten) sind je nach Wert in JavaScript übergeben, warum dann x.len Änderung der ursprünglichen obj.len auch nicht zu ändern?

Ein anderes Problem ist, dass ich die Eigenschaft eines Objekts nicht ändern kann, wenn es einer Variablen zuweist. Betrachten Sie dieses Szenario:

var obj2 = { 
     len: 4, 
     bred: 5 
    } 
var x2; 
x2 = obj.len; 

Jetzt eingeben x2 in der Konsole einfach 4 zurückgibt. Aber wenn ich versuche, den Wert von x2 wie x2 = 77; zu ändern, dann ändert sich das nicht obj2.len.

Question2: Warum kann ich Objekteigenschaft nicht mit einer Variablen ändern?

+0

Was Sie in Ihrem ersten Absatz beschreiben, ist keine Passage nach Wert, es ist durch Bezugnahme. –

+0

Nur Objekte sind vom Referenzdatentyp Ich glaube, 'var xyz' sind Primitive Datentypen. –

+0

Eine gute lesen Sie hier http://javascriptssexy.com/javascript-objects-in-detail/ –

Antwort

3

Alles wird als Wert übergeben, aber wenn Sie ein Objekt erstellen, erhalten Sie einen Verweis auf dieses Objekt.

// Create an object. Assign a reference to that object to `obj` 
var obj = { 
    len: 4, 
    bred: 5 
}; 
// Copy the value of `obj` to `x`. Now `x` is also a reference to that object. 
var x = obj; 

Änderungen an Eigenschaften von x oder obj werden nun das gleiche Objekt ändern, weil sie durch Kopien des gleichen Bezugs gehen.


var obj2 = { 
    len: 4, 
    bred: 5 
} 
var x2; 
x2 = obj.len; 

len eine Zahl ist, nicht ein Objekt, so dass der Wert ist keine Referenz. Wenn Sie es also kopieren, erhalten Sie eine Kopie der Nummer (anstelle einer Kopie der Referenz auf das Objekt).

2

Primitive Typen (Strings, Zahlen, booleans, null, undefined und Symbole) werden als Wert übergeben, Objekte dagegen werden als Referenz übergeben.

Soweit ich es verstehe, erstellt es eine Kopie von obj und weisen Sie diese Kopie an x ​​- das ist nach Wert übergeben.

Nein, x wird eine Referenz auf das Objekt zugeordnet, die zuerst zu obj zugewiesen wurde. Es ist das gleiche Objekt, daher wird es sowohl auf x als auch auf obj aktualisiert.

obj.len auf der anderen Seite enthält einen Grundwert, so dass es kopiert wird, nicht referenziert.