Nerog: Zeiger-Verhalten bei Arrays

Beitrag lesen

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

Stimmt nicht ganz (oder legt zumindest falsche Schlüsse nahe ;-).

Welche falschen Schlüsse legt es denn nah?

Dass in JavaScript Objekte by reference übergeben werden.

Variablen in JavaScript können nie Objekte enthalten, sondern immer nur Objektreferenzen. Diese werden aber auch by value übergeben. Somit kennt JavaScript kein „call by reference“ sondern _nur_ „call by value“.

Diese Unterscheidung wird oft nicht sauber dargestellt

Okay, ist es eine vereinfachte Darstellung.
Aber was ist der praktische Unterschied?

Hast du dir das Beispiel im von mir verlinkten Wikipedia-Artikel angesehen?

Das lässt sich direkt auf JavaScript übertragen:

function main()  
{  
    s = new Date(100000000000);  
    alert("main 1: " + s);  
    call(s);  
    alert("main 2: " + s);  
}  
  
function call(s)  
{  
    alert("call 1: " + s);  
    s = new Date(200000000000);  
    alert("call 2: " + s);  
}

Ein Aufruf von main() ergibt die Ausgabe

main 1: Sat Mar 03 1973 10:46:40 GMT+0100
call 1: Sat Mar 03 1973 10:46:40 GMT+0100
call 2: Mon May 03 1976 21:33:20 GMT+0200
main 2: Sat Mar 03 1973 10:46:40 GMT+0100

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“.

Um das Verhalten von JavaScript bei obigem Anwendungsfall nachvollziehen zu können, muss man wissen, dass JavaScript Parameter by value übergibt.
Die Ausgabe, die man bei einer Übergabe by reference erwarten würde, wäre:

main 1: Sat Mar 03 1973 10:46:40 GMT+0100
call 1: Sat Mar 03 1973 10:46:40 GMT+0100
call 2: Mon May 03 1976 21:33:20 GMT+0200
main 2: Mon May 03 1976 21:33:20 GMT+0200

Gruß,
Nerog