2013-03-27 18 views
12

Da Strings in JavaScript Basistypen sind, wird durch die Übergabe einer Zeichenfolge an eine Funktion eine lokale Kopie davon erstellt? Ich frage mich, da Sie Zeichenketten nach der Erstellung nicht ändern können. Es wäre daher unlogisch, dass JavaScript-VMs die Adresse der Zeichenfolge nicht intern an die Funktion übergeben.Wird eine Zeichenfolge an eine Funktion übergeben, die nach Wert kopiert oder als Referenz übergeben wird?

Wenn mir irgendjemand sagt, dass ich mir keine Sorgen machen sollte (dies passiert viel mit Webentwicklern), arbeite ich an HTML5-Spielen und die Müllsammlung ist ein Hauptanliegen, also muss ich wirklich wissen.

+4

Vielleicht eine dumme Frage, aber warum versuchst du es nicht einfach? – Uby

+2

Jeder primitive Typ wird als Wert übergeben. Siehe http://snook.ca/archives/javascript/javascript_pass –

+0

@silentboy: String-Werte können wie Primitive behandelt werden, aber ich * garantiere * Sie, die Zeichenfolge wird nicht nach Wert übergeben. –

Antwort

10

Die Zeichenfolge wird als Referenz übergeben.

Eine Zeichenkette ist nicht veränderbar. Wenn Sie also versuchen, sie zu ändern, erhalten Sie eine neue Zeichenkette (zB value+="more").

Siehe auch: What does immutable mean?

@ T. J. Crowder: nach Wert vs durch Ref - wenn Sie die Sprachdefinition betrachten, sind Sie richtig. Ich glaube jedoch nicht, dass es eine Implementierung gibt, die tatsächlich eine Kopie der Zeichenfolge erstellt, weil sie unglaublich langsam wäre. Auch da Strings unveränderliche Primitive sind, müssen sie nicht kopiert werden, da sie sich nicht ändern können.

+2

* "Die Zeichenfolge wird als Referenz übergeben." * Das erklären Sie als Tatsache. Hast du irgendwelche Beweise dafür? Ich glaube, es ist wahr (oder genauer gesagt, ich glaube, ein Verweis auf die Zeichenfolge wird durch Wert übergeben, ** nichts ** in JavaScript ist "pass by reference"), aber ohne in der Lage zu sein, etwas anzuführen, würde ich zögern, es zu sagen als kahle Tatsache. –

+0

@ Chris: Ich sage nicht, dass eine Kopie des Inhalts der Zeichenfolge kopiert wird.Ich bin ziemlich sicher, dass sie nicht (wie ich in meiner Antwort sagte), dass ein Verweis auf diese Inhalte (nach Wert) in die Funktion übergeben wird. –

+0

Ich weiß, Strings sind unveränderlich, ich sagte, dass in der Frage, deshalb habe ich es in erster Linie gefragt. Ich werde diese Antwort wahrscheinlich morgen annehmen, es sei denn jemand kann einen Hinweis geben. Antwort basiert auf gesundem Menschenverstand, obwohl ich denke, dass es schwer ist, mehr zu verlangen, wenn es um diese Dinge geht. – dreta

5

Ich glaube, dass die Spezifikation zu diesem Punkt schweigt. Es wäre jedoch eine wirklich idiotische Implementation, die den tatsächlichen Inhalt der Zeichenkette übergibt, anstatt eine Referenz auf diesen Inhalt im Speicher zu übergeben, selbst wenn Strings theoretisch "primitiv" sind. Ich vermute, dass die meisten Implementierungen "primitive" Strings so behandeln, wie sie Objektreferenzen behandeln (in dieser Hinsicht offensichtlich nicht in einigen anderen, wie ===), aber nur nicht mit den Object Fallen.

+0

Schöner Punkt auf dem '==='. – Taurus

+0

Wenn ein Verweis auf etwas übergeben wird, wäre es dann nicht angemessener für 'b' im folgenden Beispiel eine 'bar'-Eigenschaft zu haben? 'var a =" foo " var b = a; a ["bar"] = "baz"; console.log (b ["bar"]); 'Nun, ich bin mir sicher, da ist etwas mit dem Boxen, das diese Verwirrung für mich verursacht, was ist das? – Taurus

+0

@Taurus: Dies ist ein verwirrender Teil von JavaScript, aber es ist von der Spezifikation abgedeckt. :-) Denken Sie daran, dass JavaScript sowohl string * primitives * als auch string * objects * hat. 'a' [enthält/hat einen Verweis auf] den * primitiven * String' "foo" '. Die Anweisung 'a [" bar "] =" baz "' erhält die primitive Zeichenkette von 'a', aber da sie diese dann wie ein Objekt verwendet, wird ein neues temporäres Zeichenkettenobjekt erstellt und für diesen Teil des Ausdrucks verwendet. Dieses temporäre String-Objekt erhält die 'bar'-Eigenschaft, aber da nichts speichert ... * (Forts.) * –

Verwandte Themen