2009-10-19 7 views
25

Il n'a pas vraiment besoin d'ajouter de nouvelles lignes, juste quelque chose de lisible.Quelle est la manière la plus propre d'écrire une chaîne multiligne en JavaScript?

Quelque chose de mieux que cela?

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

Sûrement l'exemple de cette question est plus lisible que la réponse de @dreftymac no? –

+0

Salutations @jasdeepkhalsa. Il y a deux façons de le regarder. L'exemple ci-dessus est définitivement lisible en raison d'avoir moins de caractères. Le problème vient quand vous devez * interagir * avec le code, en ajoutant ou en supprimant des lignes ou en changeant l'ordre des lignes. L'exemple dreftymac contient plus de caractères, mais il est beaucoup plus facile d'interagir avec le code sans déclencher accidentellement une erreur de syntaxe. – dreftymac

Répondre

18

Presque identique à la réponse de NickFitz:

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

La différence, le code est un peu plus maintenable car les lignes peuvent être commandés sans égard à l'endroit où les virgules sont. Aucune erreur de syntaxe

+1

Cela rend également utile de Faites des sauts de ligne automatiques avec le caractère de jointure étant \ n. Très utile. –

12

Vous pouvez faire

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

Comme mentionné dans les commentaires, javascript parseurs gérer ce bien (cela fonctionne dans tous les principaux navigateurs), mais ne sont pas officiellement partie de la syntaxe ECMA Script. En tant que tel, il peut ou ne peut pas fonctionner avec des compresseurs, des vérificateurs d'erreur, et n'est pas garanti pour fonctionner dans les navigateurs.

Cela peut être plus lisible, mais ce n'est pas la meilleure façon de le faire. Peut-être que le script ECMA supportera quelque chose comme C# 's @ "" un jour.

+0

Wow. Cela fonctionne vraiment. Merci Gordon! Je ne savais pas que vous pouviez faire cela du tout ... –

+2

lisible mais pas correct pour les analyseurs d'erreur js! –

+0

@Thomas: "Dans chaque exemple que j'ai vu, vous mettez aussi un \ after line3." Juste bc l'article que vous avez lié à une faute de frappe ne signifie pas que c'est juste. lisez le reste de votre article, il ne l'a fait qu'une seule fois, dans le premier exemple. – geowa4

2

Oui! Vous pouvez use the \ character to have JavaScript ignore end of line characters.

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

Cependant, comme pointed out by Elzo Valugi, ce ne sera pas validé en utilisant JSLint.

+1

Autant que je me souvienne, cela ne fonctionne pas dans certains navigateurs. Vraisemblablement une version (s) de IE. –

+0

Ionut: Oui, vous devriez le tester dans tous les navigateurs qui vous intéressent, et s'il devait échouer dans un navigateur, je suppose que ce serait IE. Mais j'ai testé ça dans Firefox et ça marche là-bas. –

12

FYI. La façon dont vous le suggérez est correcte et meilleure que les autres réponses. JsLint ne valide que votre version.

+1

+1 pour jslint. – geowa4

+7

Astuce: gardez ces lignes courtes. Si elles s'étendent sur l'écran, vous ne voyez pas le + et il devient illisible. Ou mettez le + au début des lignes comme le suggère Ionut. –

6

Constamment.

Quel que soit votre choix, faites-le exactement de la même manière tout au long de votre application. Si vous travaillez sur une application qui a déjà du code écrit, acceptez la convention qu'ils ont définie et suivez-la.

+0

Dommage qu'il ne soit pas permis de voter plus d'une fois. C'est LA solution définitive pour perdre de l'énergie et du temps sur les disputes pour le "One Right Way ™" pour faire des choses (si courantes dans notre industrie). – dreftymac

16

J'aime cette version (différente de la vôtre juste au formatage du code):

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

Oui - c'est plus facile à comprendre en un coup d'œil. –

+1

cela ne valide pas aussi bien. J'ai eu une fois un script avec du html comme celui-ci et j'ai dû le refaire. –

+2

Vous avez dû échapper au HTML, la façon dont la chaîne est construite n'a rien à voir avec la validation. –

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

Si vous voulez réellement des sauts de ligne dans la chaîne, puis remplacer .join("") avec .join("\n")/

+0

est cette méthode encore plus rapide que l'option de concaténation "str" ​​+ "str" ​​ou n'est-ce pas important pour les navigateurs d'aujourd'hui? –

+0

rejoindre est plus rapide si vous avez des parties maaaaaaaaaany à concaténer, car "+" sera exécuté (n-1) fois, créant des résultats temporaires à chaque étape. Pour plus de détails, voir http://video.yahoo.com/watch/4141759/11157560 à 23:08 – user123444555621

+2

Nous avons eu un script qui construit toute la page à travers "str" ​​+ "str" ​​et il était assez lent (environ 30 sec page charge). Nous avons changé pour utiliser un système d'ajout basé sur un tableau comme celui-ci et il a chuté à moins d'une seconde. Donc, oui, c'est plus rapide :) –

2

Cela ne fonctionnera que dans les navigateurs avec E4X support - Je souhaite que nous puissions l'utiliser dans IE

var str = <><![CDATA[ 

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

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

Vous n'avez pas besoin du littéral XMLList ('<> ..'). Vous pouvez juste faire '. ToString()' –

+1

Avez-vous testé? Pour une raison quelconque, cela ne fonctionne pas dans Firefox. Selon la norme, une section XMLCDATA est XMLMarkup, donc un XMLInitialiser, qui devrait être reconnu par le moteur comme une expression primaire (?) – user123444555621

+1

Ceci n'est plus supporté dans Firefox à partir de la version 17. Je ne crois pas que TOUTES les navigateurs supportent maintenant. –

1

Voici un exemple qui peut s'avérer utile lors du développement de 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); 
} 
*/}); 

Cela ne fonctionne pas pour Firefox , bien que cela fonctionne dans Chrome.

Exemple d'utilisation pour l'écriture/le test de webgl shaders. Pendant le développement c'est beaucoup plus agréable de travailler avec et plus tard, vous pouvez toujours courir dessus avec une simple expression rationnelle qui convertit cette syntaxe dans une version multi-navigateur.

+0

Cela fonctionne maintenant dans Firefox et dans les navigateurs les plus récents. Voir [cette réponse] (http://stackoverflow.com/a/5571069/331508). –

Questions connexes