2009-10-19 8 views
25

Realmente no tiene que agregar líneas nuevas, solo algo legible.¿Cuál es la forma más limpia de escribir una cadena multilínea en JavaScript?

¿Algo mejor que esto?

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

Seguramente el ejemplo en esta pregunta es más legible que la respuesta de @dreftymac no? –

+0

Saludos @jasdeepkhalsa. Hay dos formas de verlo. El ejemplo anterior es definitivamente legible en virtud de tener menos caracteres. El problema surge cuando tiene que * interactuar * con el código, agregando o eliminando líneas o cambiando el orden de las líneas. El ejemplo dreftymac contiene más caracteres, pero es mucho más fácil interactuar con el código sin activar accidentalmente un error de sintaxis. – dreftymac

Respuesta

18

casi idéntica a la respuesta de NickFitz:

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

La diferencia, el código es un poco más fácil de mantener porque las líneas pueden ser reordenadas y sin tener en cuenta dónde están las comas. Sin errores de sintaxis

+1

Esto también lo hace útil para hacer saltos de línea automáticos con el carácter de unión siendo \ n. Muy útil. –

12

Usted podría hacer

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

Como se mencionó en los comentarios, javascript analizadores manejan este fino (funciona en todos los navegadores), pero no es oficialmente parte de la sintaxis ECMA Script. Como tal, puede o no funcionar con compresores, comprobadores de errores y no se garantiza que funcione en navegadores.

Esto puede ser más fácil de leer, pero no es la "mejor" forma de hacerlo. Tal vez el script ECMA sea compatible con algo como C# 's @ "algún día.

+0

Wow. Esto realmente funciona Gracias Gordon! No sabía que pudieras hacer esto ... –

+2

legible pero no correcto para los analizadores de errores js! –

+0

@Thomas: "En cada ejemplo que he visto, también pones una \ after line3". Solo que el artículo al que se vinculó tenía un error tipográfico no significa que sea correcto. lee el resto de tu artículo, solo lo hizo una vez, en el primer ejemplo. – geowa4

2

Sí! Puede use the \ character to have JavaScript ignore end of line characters.

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

Sin embargo, como pointed out by Elzo Valugi, esto no va a validar el uso de JSLint.

+1

Por lo que recuerdo, esto no funciona en algunos navegadores. Presumiblemente algunas versiones de IE. –

+0

Ionut: Sí, usted tendría que probarlo en todos los navegadores que tienen que ver con, y si fuera a fallar en un navegador, sospecharía que sería IE. Pero probé esto en Firefox y funciona allí. –

12

FYI. La forma en que lo sugiere es la forma correcta y mejor que las otras respuestas. JsLint solo valida su versión.

+1

+1 para jslint. – geowa4

+7

Consejo: mantenga esas líneas cortas. Si se extienden fuera de la pantalla, no verá el + y se vuelve ilegible. O ponga el + al comienzo de las líneas como sugiere Ionut. –

6

consistentemente.

Cualquiera que sea la forma que elija, hágalo de la misma manera en toda su aplicación. Si está trabajando en una aplicación que ya tiene un código escrito, acepte la convención que establecieron e implemente.

+0

Lástima que no se permite votar más de una vez. Esta es LA solución definitiva para perder energía y tiempo en disputas por el "One Right Way ™" para hacer cosas (tan comunes en nuestra industria). – dreftymac

16

me gusta esta versión (diferente a la suya solo en el formato del código):

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

Sí, es más fácil de entender de un vistazo. –

+1

esto tampoco valida. Una vez tuve un script con algunos html como este y tuve que rehacerlo. –

+2

Tuviste que escapar del HTML, la forma en que se construye la cadena no tiene nada que ver con la validación. –

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

Si usted quiere realmente saltos de línea en la cadena, y reemplazar .join("") con .join("\n")/

+0

¿este método es aún más rápido que la alternativa de concatenación "str" ​​+ "str" ​​o no tiene importancia para los navegadores de hoy en día? –

+0

unen es más rápido si tiene partes maaaaaaaaaany para concatenar, porque "+" se ejecutará (n-1) veces, creando resultados temporales en cada paso. Para más detalles, visite http://video.yahoo.com/watch/4141759/11157560 a las 23:08 – user123444555621

+2

. Tuvimos un script que compila toda la página a través de "str" ​​+ "str" ​​y fue bastante lento (aproximadamente 30 segundos de página) carga). Cambiamos para usar un sistema de anexos basado en arreglos como este y se redujo a menos de un segundo. Entonces, sí, es más rápido :) –

2

Esto solo funcionará en navegadores con E4X soporte - Ojalá pudiéramos usarlo en IE

var str = <><![CDATA[ 

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

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

No necesita el literal XMLList ('<> ..'). Puedes hacer '. ToString()' –

+1

¿Has probado? Por alguna razón, no funciona en Firefox. Según el estándar, una sección XMLCDATA es XMLMarkup, por lo tanto es un XMLInitialiser, que debe ser reconocido por el motor como PrimaryExpression (?) – user123444555621

+1

. Esto ya no es compatible con Firefox a partir de la versión 17. No creo que CUALQUIER navegador sea compatible. Es ahora. –

1

Aquí hay uno que puede ser útil durante el desarrollo cuando se utiliza 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); 
} 
*/}); 

Esto no funciona para Firefox , aunque funciona en Chrome.

El uso de ejemplo sería para escribir/probar sombreadores webgl. Durante el desarrollo, es mucho mejor trabajar con este y más adelante, siempre puede ejecutar esto con una simple expresión regular que convierta esa sintaxis en una versión de navegador cruzado.

+0

Esto ahora funciona en Firefox y en los navegadores más recientes. Ver [esta respuesta] (http://stackoverflow.com/a/5571069/331508). –

Cuestiones relacionadas