2009-10-19 3 views
25

На самом деле не нужно добавлять новые строки, просто что-то читаемое.Какой самый чистый способ написать многострочную строку в JavaScript?

Что-нибудь лучше этого?

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

Несомненно, пример в этом вопросе более читабельен, чем ответ @dreftymac no? –

+0

Приветствия @jasdeepkhalsa. Есть два способа взглянуть на это. Вышеприведенный пример определенно читается благодаря наличию меньшего количества символов. Проблема возникает, когда вы должны * взаимодействовать * с кодом, добавляя или удаляя строки или изменяя порядок строк. Пример dreftymac содержит больше символов, но гораздо проще взаимодействовать с кодом без случайного запуска синтаксической ошибки. – dreftymac

ответ

18

Почти идентичен ответ NickFitz в:

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

Разница, код немного более ремонтопригоден, потому что линии могут быть повторно заказаны без учета где запятые. Нет синтаксических ошибок.

+1

Это также делает его полезным выполните автоматические разрывы строк с символом объединения \ n. Очень удобно. –

12

Вы могли бы сделать

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

Как уже упоминалось в комментариях, JavaScript парсеры справиться с этим штраф (он работает во всех основных браузерах), но не является официальной частью синтаксиса ECMA Script. Таким образом, он может работать или не работать с компрессорами, проверками ошибок и не гарантированно работает в браузерах.

Это может быть более читаемым, но это не лучший способ сделать это. Возможно, сценарий ECMA будет поддерживать что-то вроде C# @ "" когда-нибудь.

+0

Ничего себе. Это действительно работает. Спасибо, Гордон! Я не знал, что вы можете сделать это вообще ... –

+2

читается, но не подходит для парсеров ошибок js! –

+0

@Thomas: «В каждом примере, который я видел, вы также помещаете a \ after line3». Просто статья, которую вы связали, имела опечатку, это не значит, что это правильно. прочитайте остальную часть своей статьи, он сделал это только один раз, в первом примере. – geowa4

2

Да! Вы можете use the \ character to have JavaScript ignore end of line characters.

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

Однако, как pointed out by Elzo Valugi, это не будет проверять с помощью JSLint.

+1

Насколько я помню, это не работает в некоторых браузерах. Предположительно некоторые версии IE. –

+0

Ionut: Да, вам нужно будет протестировать его во всех браузерах, о которых вы беспокоитесь, и если бы это было неудачно в браузере, я бы заподозрил, что это будет IE. Но я тестировал это в Firefox, и он работает там. –

12

FYI. То, как вы предлагаете, это правильный путь и лучше, чем другие ответы. JsLint только подтверждает вашу версию.

+1

+1 для jslint. – geowa4

+7

Совет: держите эти строки короткими. Если они растягиваются на экране, вы не видите +, и он становится нечитаемым. Или положите + в начале строк, как предлагает Ionut. –

6

Последовательно.

Каким бы способом вы ни выбрали, сделайте это точно так же, как и во всем приложении. Если вы работаете над приложением, которое уже написало код, примите соглашение, которое они задают и идут с ним.

+0

Жаль, что не разрешено голосовать более одного раза. Это окончательное решение потерять энергию и время для споров для «One Right Way ™», чтобы делать что-то (настолько распространенное в нашей отрасли). – dreftymac

16

Мне нравится эта версия (отличается от вашей только при форматировании кода):

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

Да - это легче понять с первого взгляда. –

+1

это также не подтверждает. У меня был сценарий с некоторым html, как это, и мне пришлось его переделать. –

+2

Вы должны были избежать HTML, способ построения строки не имеет ничего общего с проверкой. –

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

Если вы действительно хотите, символы новой строки в строку, а затем заменить .join("") с .join("\n")/

+0

- этот метод все же быстрее, чем альтернатива concatenation «str» + «str» или не имеет значения для сегодняшних браузеров? –

+0

join быстрее, если у вас есть maaaaaaaaaany части для конкатенации, потому что «+» будет выполняться (n-1) раз, создавая временные результаты на каждом шаге. Для получения дополнительной информации см. Http://video.yahoo.com/watch/4141759/11157560 at 23:08 – user123444555621

+2

У нас был скрипт, который построил всю страницу через «str» + «str», и это было довольно медленно (около 30 секунд). нагрузка). Мы изменили использование такой системы на основе массива, как это, и она упала менее чем на одну секунду. Итак, да, это быстрее :) –

2

Это будет работать только в браузерах с поддержкой E4X - Хотелось бы, чтобы мы могли использовать его в IE

var str = <><![CDATA[ 

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

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

Вам не нужен литерал XMLList ('<> ..'). Вы можете просто сделать '. ToString()' –

+1

Вы протестировали? По некоторым причинам он не работает в Firefox. Согласно стандарту, раздел XMLCDATA - XMLMarkup, поэтому является XMLInitialiser, который должен быть распознан движком как PrimaryExpression (?) – user123444555621

+1

Это больше не поддерживается в Firefox начиная с версии 17. Я не верю, что ЛЮБЫЕ браузеры поддерживают это сейчас. –

1

Вот что может быть полезно при разработке 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); 
} 
*/}); 

Это не работает для Firefox, хотя он работает в Chrome.

Пример использования для написания/тестирования webgl-шейдеров. Во время разработки это гораздо приятнее для работы, и позже вы всегда можете запустить это с помощью простого регулярного выражения , которое преобразует этот синтаксис в кросс-браузерную версию.

+0

Это теперь работает в Firefox и последних браузерах. См. [Этот ответ] (http://stackoverflow.com/a/5571069/331508). –

Смежные вопросы