3462 Stimmen

Mehrzeilige Zeichenketten in JavaScript erstellen

Ich habe den folgenden Code in Ruby. Ich möchte diesen Code in JavaScript umwandeln. Was ist der entsprechende Code in JS?

text = <<"HERE"
This
Is
A
Multiline
String
HERE

4473voto

Anonymous Punkte 45953

Aktualisierung:

ECMAScript 6 (ES6) führt einen neuen Typ von Literalen ein, nämlich Vorlagenliterale . Sie haben viele Eigenschaften, unter anderem variable Interpolation, aber am wichtigsten für diese Frage ist, dass sie mehrzeilig sein können.

Ein Schablonenliteral wird begrenzt durch Backticks :

var html = `
  <div>
    <span>Some HTML here</span>
  </div>
`;

(Anmerkung: Ich plädiere nicht für die Verwendung von HTML in Zeichenketten)

Browserunterstützung ist OK , aber Sie können Transporter besser kompatibel zu sein.


Original ES5-Antwort:

Javascript hat keine Here-Dokumenten-Syntax. Sie können jedoch den buchstäblichen Zeilenumbruch umgehen, was dem nahe kommt:

"foo \
bar"

282 Stimmen

Seien Sie gewarnt: Einige Browser fügen an der Fortsetzung Zeilenumbrüche ein, andere nicht.

45 Stimmen

Auch Visual Studio 2010 scheint von dieser Syntax verwirrt zu sein.

63 Stimmen

@Nate Es ist angegeben in ECMA-262 5. Auflage Abschnitt 7.8.4 und genannt LineContinuation : "Ein Zeilenabschlußzeichen kann nicht in einem Stringliteral erscheinen, außer als Teil eines LineContinuation um die leere Zeichenfolge zu erzeugen. Der korrekte Weg, um ein Zeilenabschlusszeichen in den String-Wert eines String-Literales einzubinden, ist die Verwendung einer Escape-Sequenz wie \n o \u000A. "

1545voto

Devin Rhode Punkte 20592

ES6-Aktualisierung:

Wie in der ersten Antwort erwähnt, können Sie mit ES6/Babel jetzt mehrzeilige Zeichenketten einfach mit Backticks erstellen:

const htmlString = `Say hello to 
multi-line
strings!`;

Die Interpolation von Variablen ist eine beliebte neue Funktion, die mit durch Backticks begrenzten Zeichenketten einhergeht:

const htmlString = `${user.name} liked your post about strings`;

Dies lässt sich einfach auf die Verkettung übertragen:

user.name + ' liked your post about strings'

Original ES5-Antwort:

Google's JavaScript-Style Guide empfiehlt die Verkettung von Zeichenketten anstelle von Zeilenumbrüchen:

Tun Sie dies nicht:

var myString = 'A rather long string of English text, an error message \
                actually that just keeps going and going -- an error \
                message to make the Energizer bunny blush (right through \
                those Schwarzenegger shades)! Where was I? Oh yes, \
                you\'ve got an error and all the extraneous whitespace is \
                just gravy.  Have a nice day.';

Das Leerzeichen am Anfang jeder Zeile kann beim Kompilieren nicht sicher entfernt werden; Leerzeichen nach dem Schrägstrich führen zu komplizierten Fehlern; und obwohl die meisten Skript-Engines dies unterstützen, ist es nicht Teil von ECMAScript.

Verwenden Sie stattdessen die String-Verkettung:

var myString = 'A rather long string of English text, an error message ' +
               'actually that just keeps going and going -- an error ' +
               'message to make the Energizer bunny blush (right through ' +
               'those Schwarzenegger shades)! Where was I? Oh yes, ' +
               'you\'ve got an error and all the extraneous whitespace is ' +
               'just gravy.  Have a nice day.';

0 Stimmen

Das funktioniert bei mir in Canary Chrome für Windows nicht, auch wenn ich Experimental JavaScript aktiviert habe

29 Stimmen

Ich verstehe die Empfehlung von Google nicht. Alle Browser außer den extrem alten unterstützen den Backslash gefolgt von einem Zeilenumbruch und werden dies auch in Zukunft aus Gründen der Abwärtskompatibilität tun. Der einzige Fall, in dem man dies vermeiden müsste, wäre, wenn man sicher sein wollte, dass am Ende jeder Zeile nur ein einziger Zeilenumbruch (oder gar kein Zeilenumbruch) hinzugefügt wird (siehe auch meinen Kommentar zur akzeptierten Antwort).

0 Stimmen

Diejenigen, die diese Dinge ausprobieren möchten, sollten sich [Chrome Canary][1] [1] ansehen: google.com/intl/de/chrome/browser/canary.html

738voto

KooiInc Punkte 111454

Das Muster text = <<"HERE" This Is A Multiline String HERE ist in js nicht verfügbar (ich erinnere mich, dass ich es in meinen guten alten Perl-Tagen oft benutzt habe).

Um bei komplexen oder langen mehrzeiligen Zeichenfolgen den Überblick zu behalten, verwende ich manchmal ein Array-Muster:

var myString = 
   ['<div id="someId">',
    'some content<br />',
    '<a href="#someRef">someRefTxt</a>',
    '</div>'
   ].join('\n');

oder das bereits gezeigte anonyme Muster (escape newline), das einen hässlichen Block in Ihrem Code darstellen kann:

    var myString = 
       '<div id="someId"> \
some content<br /> \
<a href="#someRef">someRefTxt</a> \
</div>';

Hier ist ein weiterer seltsamer, aber funktionierender 'Trick' 1 :

var myString = (function () {/*
   <div id="someId">
     some content<br />
     <a href="#someRef">someRefTxt</a>
    </div>        
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

externe Bearbeitung: jsfiddle

ES20xx unterstützt das Überbrücken von Strings über mehrere Leitungen mit Vorlagezeichenfolgen :

let str = `This is a text
    with multiple lines.
    Escapes are interpreted,
    \n is a newline.`;
let str = String.raw`This is a text
    with multiple lines.
    Escapes are not interpreted,
    \n is not a newline.`;

1 Hinweis: Dies geht nach dem Mining/Obfuscating Ihres Codes verloren.

40 Stimmen

Bitte verwenden Sie nicht das Array-Muster. Es wird in den meisten Fällen langsamer sein als die einfache String-Verkettung.

2 Stimmen

In Die meisten Fällen... haben Sie auch die Zeit eingerechnet, die für die Zuweisung/Erstellung des Arrays benötigt wird? Unabhängig davon... es ist ein bisschen mehr lesbar als das Verbinden von Arrays.

86 Stimmen

Das Array-Muster ist besser lesbar und der Leistungsverlust für eine Anwendung ist oft vernachlässigbar. Wie der Perf-Test zeigt, kann selbst IE7 Zehntausende von Operationen pro Sekunde durchführen.

371voto

Jordão Punkte 53117

Sie puede haben mehrzeilige Strings in reinem JavaScript.

Diese Methode basiert auf der Serialisierung von Funktionen, die als implementierungsabhängig definiert . Sie funktioniert in den meisten Browsern (siehe unten), aber es gibt keine Garantie dafür, dass sie auch in Zukunft noch funktioniert, also verlassen Sie sich nicht darauf.

Verwenden Sie die folgende Funktion:

function hereDoc(f) {
  return f.toString().
      replace(/^[^\/]+\/\*!?/, '').
      replace(/\*\/[^\/]+$/, '');
}

Sie können hier Dokumente wie dieses haben:

var tennysonQuote = hereDoc(function() {/*!
  Theirs not to make reply,
  Theirs not to reason why,
  Theirs but to do and die
*/});

Die Methode wurde in den folgenden Browsern erfolgreich getestet (nicht erwähnt = nicht getestet):

  • IE 4 - 10
  • Oper 9.50 - 12 (nicht in 9-)
  • Safari 4 - 6 (nicht in 3-)
  • Chrom 1 - 45
  • Firefox 17 - 21 ( nicht in 16- )
  • Rekonq 0.7.0 - 0.8.0
  • Nicht unterstützt in Konqueror 4.7.4

Seien Sie jedoch vorsichtig mit Ihrem Minifier. Er neigt dazu, Kommentare zu entfernen. Für die YUI-Kompressor einen Kommentar, der mit /*! (wie die, die ich verwendet habe) erhalten bleiben.

Ich denke, ein real Die Lösung wäre die Verwendung von CoffeeScript .

ES6 UPDATE: Sie können backtick verwenden, anstatt eine Funktion mit einem Kommentar zu erstellen und toString auf den Kommentar anzuwenden. Die Regex müsste aktualisiert werden, um nur Leerzeichen zu entfernen. Sie könnten auch eine String-Prototyp-Methode für diese Aufgabe haben:

let foo = `
  bar loves cake
  baz loves beer
  beer loves people
`.removeIndentation()

Jemand sollte diese .removeIndentation-String-Methode schreiben... ;)

285 Stimmen

Was? Eine Funktion erstellen und dekompilieren, um einen mehrzeiligen Kommentar in einen mehrzeiligen String zu verwandeln? Jetzt das ist hässlich.

5 Stimmen

jsfiddle.net/fqpwf funktioniert in Chrome 13 und IE8/9, aber nicht in FF6. Ich sage es nur ungern, aber ich mag es, und wenn es ein absichtliches Merkmal jedes Browsers sein könnte (damit es nicht verschwindet), würde ich es nutzen.

0 Stimmen

Ich hatte Hoffnung auf Funktion. toSource () für FF, aber nein.

223voto

alex Punkte 457905

Sie können dies tun...

var string = 'This is\n' +
'a multiline\n' + 
'string';

0 Stimmen

Das erste Beispiel ist großartig und einfach. Viel besser als der Ansatz von \, da ich mir nicht sicher bin, wie die Browser den Backslash als Escape-Zeichen und als mehrzeiliges Zeichen behandeln würden.

0 Stimmen

0 Stimmen

e4x.js wäre eine gute zukunftssichere Lösung

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X