molily: Zeiger-Verhalten bei Arrays

Beitrag lesen

Das Ändern der „Referenz“ s (die ja eben keine ist) in call hat keine Auswirkung auf s in main; bei „call by reference“ wäre dies aber der Fall.
Sprachen wie C++ oder Pascal unterstützen „call by reference“, JavaScript (oder auch z.B. Java) unterstützen nur „call by value“.

Achso, klar. Dann war mir nicht bekannt, was »by reference« wirklich bedeutet, weil in den mir geläufigen Sprachen nicht vorhanden. Insofern ist die Unterscheidung auf JavaScript nicht anwendbar. Man kann natürlich nicht in einem Scope einer Variable (bzw. Parameter) einen Wert zuweisen und damit in einem anderen Scope den Wert ändern (also die Referenz auf ein neues Objekt umbiegen - Scope Chain mal ausgenommen).

JavaScript macht insofern etwas drittes (Java wohl auch, weshalb es als Sonderfall bezeichnet wird), wie Dmitry Soshnikov schreibt:
http://dmitrysoshnikov.com/ecmascript/chapter-8-evaluation-strategy/

»Call by sharing
...
Alternative names of this strategy are “call by object” or “call by object-sharing”.
Strategy “by sharing” has been offered and named first by Barbara Liskov for CLU programming language in 1974.
The main point of this strategy is that function receives the copy of the reference to object. This reference copy is associated with the formal parameter and is its value.«

Er schlägt dann vor, es entweder als dritte Strategie »Call by Sharing« zu nennen oder als Unterfall »call by value where value is the reference copy«.

Objekte werden per Referenz übergeben, skalare Datentypen by value.

... müsste dann eher heißen, Objects haben einen veränderbaren Status und man übergibt eine Referenz auf ein und dasselbe Objekt, Primitives werden kopiert (und haben keinen veränderbaren Status, es kommen bei Methodenaufrufen usw. wieder neue Primitives heraus).

Ein Array ist da ja ein klassisches Beispiel, das ist ein Objekt mit numerischen Eigenschaften. Fügt man Eigenschaften hinzu, geschieht es beim selben Array wie im Scope, aus dem der Array heraus übergeben wurde (weil beide Variablen auf dieselbe Speicherstelle referenzieren).

Mathias