Jeder sagt immer wieder, dass eines der Probleme von JavaScript darin besteht, +
[ example ] für die Verkettung von Zeichenfolgen zu verwenden. Einige sagen, das Problem wird nicht verwendet +
, es ist Typenzwang [siehe die Kommentare aus dem vorherigen Beispiel]. Stark typisierte Sprachen verwenden jedoch +, um Typen problemlos zu verketten und zu erzwingen. Zum Beispiel in C #:
int number = 1;
MyObject obj = new MyObject();
var result = "Hello" + number + obj;
// is equivalent to
string result = "hello" + number.ToString() + obj.ToString();
Warum ist die Verkettung von Zeichenfolgen in JavaScript ein so großes Problem?
javascript
Konfigurator
quelle
quelle
bad
. Wer istEveryone
?Antworten:
Betrachten Sie diesen JavaScript-Code:
Dies wird protokolliert
Was höchstwahrscheinlich nicht das ist, was beabsichtigt war, und ein schwer zu verfolgender Fehler sein kann.
quelle
a
undb
instr(a)
undstr(b)
Anrufe; ansonsten bekommst du eineValueError: cannot concatenate 'str' and 'int'
.'result is ' + (a + b)
.System.Console.WriteLine("result is " + 10 + 20);
aber niemand beschwert sich jemals darüber in C #. Das verstehe ich nicht - was macht JavaScript so verwirrend?Wenn Sie "schlecht" sagen, meinen Sie dann "falsch" oder "langsam"? Das Argument über die Verwendung von mathematischen Operatoren String - Verkettung zu tun , ist wohl ein „falsche“ Argument, aber es gibt auch ein Argument gemacht werden , dass die Verwendung
+
zu tun eine Menge von String - Verkettung kann sehr langsam sein.Wir
"Hello" + number
reden nicht über Performance, wir reden über den Aufbau einer relativ großen Zeichenkette, indem wir sie wiederholt in einer Schleife anhängen.In JavaScript (und C #) sind Zeichenfolgen unveränderlich. Sie können niemals geändert, sondern nur durch andere Saiten ersetzt werden. Sie wissen wahrscheinlich, dass
combined + "hello "
diecombined
Variable nicht direkt geändert wird - die Operation erstellt eine neue Zeichenfolge, die das Ergebnis der Verknüpfung der beiden Zeichenfolgen ist. Sie müssen diese neue Zeichenfolge jedoch dercombined
Variablen zuweisen, wenn sie geändert werden soll.Diese Schleife erstellt also eine Million verschiedener Zeichenfolgenobjekte und wirft 999.999 davon weg. Es ist nicht schnell, so viele Zeichenfolgen zu erstellen, die ständig größer werden, und jetzt muss der Garbage Collector eine Menge Arbeit leisten, um danach aufzuräumen.
C # hat genau dasselbe Problem, das in dieser Umgebung von der StringBuilder- Klasse gelöst wird . In JavaScript erzielen Sie eine viel bessere Leistung, wenn Sie ein Array aller zu verkettenden Zeichenfolgen erstellen und sie am Ende einmal anstatt millionenfach in der Schleife zusammenfügen:
quelle
Es ist nicht schlecht, + sowohl für das Hinzufügen als auch für das Verketten zu verwenden, solange Sie nur Zahlen hinzufügen und nur Zeichenfolgen verketten können. JavaScript konvertiert jedoch bei Bedarf automatisch zwischen Zahlen und Zeichenfolgen. Sie haben also folgende Möglichkeiten:
Das Überladen von "+" bei Vorhandensein einer automatischen Typkonvertierung bricht möglicherweise einfacher die erwartete Assoziativität des Operators +:
quelle
3 + 5 == 5 + 3
aber"3" + "5" != "5" + "3"
Das typische Problem, das bei der Verkettung von Zeichenfolgen auftritt, betrifft einige Probleme:
+
Symbol ist überladen# 1
Das erste und wichtigste Problem bei der Verwendung
+
für die Verkettung und Hinzufügung von Zeichenfolgen ist, dass Sie+
für die Verkettung und Hinzufügung von Zeichenfolgen verwenden .Wenn Sie Variablen
a
undb
haben und festlegenc = a + b
, gibt es eine Mehrdeutigkeit, die von den Typena
und abhängtb
. Diese Mehrdeutigkeit zwingt Sie dazu, zusätzliche Schritte zu unternehmen, um das Problem zu beheben:String Concat:
Zusatz:
Dies bringt mich zu meinem zweiten Punkt
# 2
Es ist sehr einfach, eine Variable versehentlich in einen String umzuwandeln, ohne es zu merken. Es ist auch leicht zu vergessen, dass Ihre Eingabe als Zeichenfolge eingeht:
Erzeugt nicht intuitive Ergebnisse, da die Eingabeaufforderung den Zeichenfolgenwert der Eingabe zurückgibt.
#3
Zu tippen
parseFloat
oderNumber()
jedes Mal, wenn ich etwas hinzufügen möchte, ist mühsam und nervig. Ich halte mich für klug genug, um daran zu denken, meine dynamischen Typen nicht durcheinander zu bringen , aber das bedeutet nicht, dass ich meine dynamischen Typen nie durcheinander gebracht habe . Die Wahrheit ist, dass ich zu faul bin, um zu tippen,parseFloat
oderNumber()
jedes Mal, wenn ich Addition mache, weil ich viel Addition mache .Lösung?
Nicht alle Sprachen werden
+
für die Verkettung von Zeichenfolgen verwendet. PHP verwendet,.
um Zeichenfolgen zu verketten, wodurch unterschieden werden kann, wann Sie Zahlen hinzufügen und wann Sie Zeichenfolgen verbinden möchten.Jedes Symbol kann zum Verketten von Zeichenfolgen verwendet werden, die meisten werden jedoch bereits verwendet. Vermeiden Sie daher Doppelungen. Wenn es nach mir ginge, würde ich wahrscheinlich verwenden
_
, um Zeichenfolgen zu verbinden und die_
in-Variablennamen nicht zuzulassen.quelle