Problembeschreibung
Einige leere Zeichenfolgen „“ erscheinen, wenn die Split-Methode von JavaScript zum Teilen einer Zeichenfolge verwendet wird, insbesondere wenn reguläre Ausdrücke als Trennzeichen verwendet werden.
Verwandte Fragen
Der reguläre Javascript-Ausdruck erzeugt beim Gruppieren von Zeichenfolgen eine leere Zeichenfolgengruppe?
Als der Betreff in der obigen Frage reguläre Ausdrücke zum Teilen der Zeichenfolge verwendete, wurden mehrere leere Zeichenfolgen „“ generiert. Der Code lautet wie folgt:
Was ist also der Grund für diese leeren Zeichenfolgen?
Problemanalyse
Nachdem ich bei Google gesucht habe, habe ich festgestellt, dass es nicht viele verwandte Ergebnisse gibt, und selbst wenn, gibt es nicht viele detaillierte Erklärungen. Ich habe eine kurze Einführung gegeben und dann einen Link zur ECMAScript-Spezifikation angegeben. Es scheint, dass man, wenn man den wahren Grund wissen will, in den sauren Apfel beißen und die Vorschriften lesen muss.
Verwandte Standards
Als nächstes beginnen wir in Übereinstimmung mit der internationalen Praxis mit dem Standard-Rathaus von ECMAScript.
In diesem Kapitel werden die Ausführungsschritte der Split-Methode ausführlich beschrieben. Wenn Sie interessiert sind, können Sie die Schritte zum Generieren einer leeren Zeichenfolge hier nur erläutern. Jeder ist willkommen.
Verwandte Schritte
Einige Schritte extrahieren:
Der wichtigste Schritt im gesamten Prozess ist der Zyklus von Schritt 13, und die wichtigsten Dinge, die dieser Zyklus bewirkt, sind folgende:
•Definieren Sie die Werte von p und q. Die Werte von p und q sind zu Beginn jeder Schleife gleich (dieser Schritt liegt außerhalb der Schleife).
•Rufen Sie die SplitMatch(S, q, R)-Methode auf, um die Zeichenfolge zu teilen;
•Entsprechend den unterschiedlichen zurückgegebenen Ergebnissen werden unterschiedliche Zweige ausgeführt, und der Hauptzweig ist Zweig ⅲ;
•Zweig ⅲ ist in 8 kleine Schritte unterteilt, um die zurückgegebenen Ergebnisse in das vordefinierte Array A
zu füllen
•In diesen 8 kleinen Schritten besteht die Funktion von Schritt 1 darin, einen Teilstring des ursprünglichen Strings zurückzugeben. Die Startposition ist p (einschließlich) und die Endposition ist q (nicht enthalten). Hinweis: In diesem Schritt handelt es sich um einen leeren String generiert, den ich zur leichteren Bezugnahme unten als abgeschnittene Zeichenfolge markiere.
•Fügen Sie den Teilstring aus dem vorherigen Schritt zu Array A
hinzu
•Die nächsten Schritte bestehen darin, die relevanten Variablen zu aktualisieren und mit dem nächsten Zyklus fortzufahren. (Die Funktion von Schritt 7 besteht darin, die Capture-Gruppe im regulären Ausdruck in Array A zu speichern und hat nichts mit der Generierung einer leeren Zeichenfolge zu tun)
SplitMatch(S, q, R)
Als nächstes müssen wir verstehen, was die SplitMatch(S, q, R)-Methode bewirkt. Diese Methode wird weiter unten in der Split-Spezifikation erwähnt. Die Hauptaufgabe besteht darin, entsprechende Vorgänge je nach Trennzeichentyp auszuführen:
•Wenn das Trennzeichen vom Typ RegExp ist, rufen Sie die interne Methode [[Match]] auf, um die Zeichenfolge abzugleichen. Wenn die Übereinstimmung fehlschlägt, wird ein Fehler zurückgegeben.
MatchResult
Mit den obigen Schritten wird eine weitere Variable vom Typ MatchResult eingeführt. Bei der Überprüfung der Dokumentation haben wir festgestellt, dass dieser Variablentyp zwei Attribute hat: endIndex und Captures. Der Wert von endIndex ist die Zeichenfolge, die mit der Position plus 1 übereinstimmt. Captures können als Array verstanden werden, wenn das Trennzeichen ein regulärer Ausdruck ist darin ist der von der Gruppe erfasste Wert; wenn das Trennzeichen eine Zeichenfolge ist, ist es ein leeres Array.
Aus den obigen Schritten können wir ersehen, dass die geteilte Zeichenfolge im Schritt des Abfangens der Zeichenfolge generiert wird (mit Ausnahme der Gruppenerfassung regulärer Ausdrücke). Seine Funktion besteht darin, die Zeichenfolge zwischen der angegebenen Startposition (einschließlich) und Endposition (nicht enthalten) abzufangen. Es gibt einen Sonderfall, bei dem die Werte der Startposition und der Endposition gleich sind. Dies ist nur eine Vermutung, da die Spezifikation keine Standardschritte zum Abfangen der Zeichenfolge vorsieht.
Wir sind so weit gekommen, warum nicht noch einen Schritt nach vorne machen?
Also habe ich versucht, etwas V8-Quellcode zu durchsuchen, um zu sehen, ob ich eine bestimmte Implementierungsmethode finden könnte. Ich habe den relevanten Code und den Quellcode-Link
gefunden
Hier ist ein Auszug aus einem davon: