molily: Link mit festen Index möglich?

Beitrag lesen

Ich nehme an, damit hat auch (wahrscheinlich indirekt) der Umstand zu tun, dass Strings u.ä. an Funktionen nicht als Referenz, sondern als Kopie übergeben, liege ich da richtig?

Jein. Im Grunde wird alles als Referenz übergeben, genau gesagt »by sharing« bzw. »by value where the value is a reference copy«.
</archiv/2011/1/t202555/#m1368388>
http://dmitrysoshnikov.com/ecmascript/chapter-8-evaluation-strategy/

Allerdings besteht bei Primitives einfach keine Möglichkeit, sie »an sich« zu ändern. Man kann höchstens das Binding zwischen Funktionsparameter und Wert lösen, indem man dem Parameter einen neuen Wert zuweist. Damit ändert man aber nicht den Wert in dem Scope, aus dem die Funktion aufgerufen wurde (das wäre ja »by reference«).

Es gibt String-Objects, die im Grunde nur Wrapper um einen internen String-Wert sind. Man spricht von »boxed strings«.

var s = new String('foo');

s hat nun keine Methode, mit der sich der String-Primitive im Object selbst ändern lässt. Sämtliche Methoden geben wieder einen String-Primitive zurück und lassen den im Object gekapselten Wert unberührt.

Daher ist es nicht wirklich sinnvoll und möglich, mit Number-, String- und Boolean-Objects zu arbeiten, man kann nirgends die Vorteile davon nutzen.

Bei Ruby etwa ist das anders, dort gibt es die Unterscheidung zwischen Methoden, die ein neues Objekt erzeugen und solchen, die das vorhandene ändern. Letztere enden auf »!«. Beispiel:

ruby-1.8.7-p302 :006 > s = "Hallo"
 => "Hallo"
ruby-1.8.7-p302 :007 > s.upcase
 => "HALLO"
ruby-1.8.7-p302 :008 > s
 => "Hallo"
ruby-1.8.7-p302 :009 > s.upcase!
 => "HALLO"
ruby-1.8.7-p302 :010 > s
 => "HALLO"

new String("Hallo").toUpperCase() in JavaScript hingegen ändert das vorhandenen String-Object nicht, sondern erzeugt einen neuen Primitive.

Primitives werden wie gesagt im Moment der Auswertung in Objects umgewandelt, damit man auf ihnen die Methoden von String.prototype aufrufen kann. Die erzeugten Objects werden aber weggeworfen. Der Primitive bleibt ein Primitive. Beim nächsten Verwenden als ein Object wird ein neues Object (ein neuer »boxed« String) erzeugt.

var s = "Hallo";  
s.prop = "val"; // Intern wird ToObject aufgerufen, damit die Eigenschaft gesetzt werden kann - das erzeugte Object wird aber weggeworfen  
alert(s.prop); // undefined, weil noch einmal ToObject aufgerufen wird

Mathias