2009-10-19 13 views
25

Non ha bisogno di aggiungere newline, solo qualcosa di leggibile.Qual è il modo più pulito per scrivere una stringa multilinea in JavaScript?

Qualcosa di meglio di questo?

str = "line 1" + 
     "line 2" + 
     "line 3"; 
+1

Sicuramente l'esempio in questa domanda è più leggibile della risposta di @dreftymac no? –

+0

Saluti @jasdeepkhalsa. Ci sono due modi per vederlo. L'esempio sopra è sicuramente leggibile in quanto ha un minor numero di caratteri. Il problema si presenta quando devi * interagire * con il codice, aggiungendo o rimuovendo linee o modificando l'ordine delle linee. L'esempio di dreftymac contiene più caratteri, ma è molto più semplice interagire con il codice senza innescare accidentalmente un errore di sintassi. – dreftymac

risposta

18

Quasi identica alla risposta di NickFitz:

var str = ["" 
    ,"line 1" 
    ,"line 2" 
    ,"line 3" 
].join(""); 
// str will contain "line1line2line3" 

La differenza, il codice è leggermente più gestibile perché le linee possono essere riordinate senza riguardo a dove le virgole sono. Nessun errore di sintassi.

+1

Ciò rende anche utile si verificano interruzioni di riga automatiche con il carattere di join \ n. Molto maneggevole. –

12

Si potrebbe fare

str = "\ 
line 1\ 
line 2\ 
line 3"; 

Come accennato nei commenti, javascript parser gestire questo fine (opera in tutti i principali browser), ma non è ufficialmente parte della sintassi ECMA Script. Come tale può o non può funzionare con compressori, controllori di errori e non è garantito che funzioni nei browser.

Questo può essere più leggibile, ma non è il modo "migliore" per farlo. Forse lo script ECMA supporterà qualcosa come C# 's @ "" un giorno.

+0

Wow. Questo funziona davvero. Grazie Gordon! Non sapevo che potessi fare tutto questo ... –

+2

leggibile ma non corretto per i parser di errori js! –

+0

@Thomas: "In ogni esempio che ho visto, hai inserito anche \ dopo la riga3." Solo che l'articolo che hai collegato a un refuso non significa che sia giusto. leggi il resto del tuo articolo, l'ha fatto solo una volta, nel primo esempio. – geowa4

2

Sì! È possibile use the \ character to have JavaScript ignore end of line characters.

str = 'line 1 \ 
line 2 \ 
line 3'; 

Tuttavia, come pointed out by Elzo Valugi, questo non convalida utilizzando JSLint.

+1

Per quanto mi ricordo, questo non funziona in alcuni browser. Presumibilmente alcune versioni di IE. –

+0

Ionut: Sì, avresti bisogno di testarlo in tutti i browser che ti interessano, e se dovesse fallire in un browser, sospetto che sarebbe IE. Ma ho provato questo in Firefox e funziona lì. –

12

FYI. Il modo in cui lo suggerisci è il modo corretto e migliore delle altre risposte. JsLint convalida solo la tua versione.

+1

+1 per jslint. – geowa4

+7

Suggerimento: mantieni le linee corte. Se si allungano dallo schermo, non vedi il + e diventa illeggibile. O metti il ​​+ all'inizio delle linee come suggerisce Ionut. –

6

Coerentemente.

In qualsiasi modo, lo si fa esattamente nello stesso modo in tutta l'applicazione. Se stai lavorando su un'applicazione che ha già scritto del codice, accetta la convenzione che hanno impostato e segui.

+0

Peccato che non sia permesso votare più di una volta. Questa è la soluzione definitiva per perdere energia e tempo per le controversie per il "One Right Way ™" per fare le cose (così comuni nel nostro settore). – dreftymac

16

mi piace questa versione (diversa dalla vostra solo nella formattazione del codice):

var str = "line 1" 
     + "line 2" 
     + "line 3"; 
+1

Sì, è più facile da capire a colpo d'occhio. –

+1

non convalida anche questo. Ho avuto una volta una sceneggiatura con un html come questo e ho dovuto rifarlo. –

+2

Dovevi sfuggire all'HTML, il modo in cui è costruita la stringa non ha nulla a che fare con la convalida. –

10
var str = [ 
    "line 1", 
    "line 2", 
    "line 3" 
].join(""); 
// str will contain "line1line2line3" 

Se si desidera veramente a capo nella stringa, quindi sostituire .join("") con .join("\n")/

+0

questo metodo è ancora più veloce rispetto all'opzione di concatenazione "str" ​​+ "str" ​​o non ha importanza per i browser di oggi? –

+0

join è più veloce se si dispone di parti di maaaaaaaaaa per concatenare, perché "+" sarà eseguito (n-1) volte, creando risultati temporanei in ogni passaggio. Per i dettagli, vedi http://video.yahoo.com/watch/4141759/11157560 alle 23:08 – user123444555621

+2

Avevamo uno script che creava l'intera pagina tramite "str" ​​+ "str" ​​ed era piuttosto lento (circa 30 secondi di pagina caricare). Abbiamo deciso di utilizzare un sistema di aggiunta basato su array come questo, che è sceso a meno di un secondo. Quindi, sì, è più veloce :) –

2

Funzionerà solo nei browser con supporto E4X - Vorrei poterlo utilizzare in IE

var str = <><![CDATA[ 

    Look, a multi-line 
    string! < " // ' ? & 

]]></>.toString(); 
+0

Non è necessario il valore letterale XMLList ('<> ..'). Puoi semplicemente fare '. ToString()' –

+1

Hai provato? Per qualche ragione non funziona in Firefox. Secondo lo standard, una sezione XMLCDATA è XMLMarkup, quindi è un XMLInitialiser, che dovrebbe essere riconosciuto dal motore come PrimaryExpression (?) – user123444555621

+1

Questo non è più supportato in Firefox a partire dalla versione 17. Non credo che NESSUN browser supporti adesso –

1

Ecco uno che potrebbe essere utile durante lo sviluppo quando si utilizza Chrome.

function FSTR(f) { 
    // remove up to comment start and trailing spaces and one newline 
    s = f.toString().replace(/^.*\/\* *\r?\n/,""); 
    // remove the trailing */} with preceeding spaces and newline 
    s = s.replace(/\n *\*\/\s*\}\s*$/,"") 
    return s; 
} 

s = FSTR(function(){/* 
uniform vec2 resolution; 
uniform float time; 

void main(void) 
{ 
    vec2 p = -1.0 + 2.0 * gl_FragCoord.xy/resolution.xy; 
    vec2 cc = vec2(cos(.25*time), sin(.25*time*1.423)); 
    ... 
    float color = sqrt(sqrt(dmin))*0.7; 
    gl_FragColor = vec4(color,color,color,1.0); 
} 
*/}); 

Questo non funziona per Firefox , anche se funziona in Chrome.

L'utilizzo di esempio potrebbe essere per la scrittura/test di shale Webgl. Durante lo sviluppo è molto più semplice lavorare con e in seguito è sempre possibile eseguirlo con una semplice espressione regolare che converte quella sintassi in una versione cross-browser.

+0

Ora funziona su Firefox e sui browser più recenti. Vedi [questa risposta] (http://stackoverflow.com/a/5571069/331508). –

Problemi correlati