У меня есть следующий код на Ruby. Я хочу преобразовать этот код в JavaScript. Каков эквивалентный код в JS?
text = <<"HERE"
This
Is
A
Multiline
String
HERE
У меня есть следующий код на Ruby. Я хочу преобразовать этот код в JavaScript. Каков эквивалентный код в JS?
text = <<"HERE"
This
Is
A
Multiline
String
HERE
ECMAScript 6 (ES6) представляет новый тип литерала, а именно литералы шаблона. У них много функций, среди прочего, переменная интерполяция, но, что наиболее важно в этом вопросе, они могут быть многострочными.
Литерал шаблона отделяется обратными кавычками:
var html = `
<div>
<span>Some HTML here</span>
</div>
`;
(Примечание: я не рекомендую использовать HTML в строках)
Поддержка браузера в порядке, но вы можете использовать transpilers для большей совместимости.
В Javascript нет синтаксиса здесь-документа. Однако вы можете избежать буквального символа новой строки, который приближается:
"foo \
bar"
node 0.10.0
и \
- person mklement0; 25.03.2013
Как упоминается в первом ответе, с ES6 / Babel теперь вы можете создавать многострочные строки, просто используя обратные кавычки:
const htmlString = `Say hello to
multi-line
strings!`;
Интерполяция переменных - это популярная новая функция, в которой используются строки, разделенные обратным тиком:
const htmlString = `${user.name} liked your post about strings`;
Это просто сводится к конкатенации:
user.name + ' liked your post about strings'
Руководство по стилю JavaScript от Google рекомендует использовать конкатенацию строк вместо экранирования новой строки. :
Не делайте этого:
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.';
Пробелы в начале каждой строки нельзя безопасно удалить во время компиляции; пробел после косой черты приведет к хитрым ошибкам; и хотя большинство движков сценариев поддерживают это, это не часть ECMAScript.
Вместо этого используйте конкатенацию строк:
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.';
In EcmaScript 6, you'll be able to use backticks for Template Strings, known in the spec as a NoSubstitutionTemplate. I think you can try this and other features by first downloading canary chrome and then turning on Enable Experimental JavaScript.
вместо `\`, это трудно заметить] и (3) хотя большинство скриптовых движков поддерживают это, это не является частью ECMAScript [т.е. зачем использовать нестандартные функции?] Помните, что это руководство по стилю, которое касается облегчения чтения кода + поддержки + отладки: а не просто правильной работы.
- person Synetech; 01.06.2014
шаблон text = <<"HERE" This Is A Multiline String HERE
недоступен в js (я помню, как часто использовал его в старые добрые времена Perl).
Чтобы контролировать сложные или длинные многострочные строки, я иногда использую шаблон массива:
var myString =
['<div id="someId">',
'some content<br />',
'<a href="#someRef">someRefTxt</a>',
'</div>'
].join('\n');
или уже показанный анонимный шаблон (экранирование новой строки), что может быть некрасивым блоком в вашем коде:
var myString =
'<div id="someId"> \
some content<br /> \
<a href="#someRef">someRefTxt</a> \
</div>';
Вот еще один странный, но работающий трюк 1:
var myString = (function () {/*
<div id="someId">
some content<br />
<a href="#someRef">someRefTxt</a>
</div>
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
внешнее редактирование: jsfiddle
ES20xx поддерживает объединение строк в несколько строк с помощью шаблонных строк а>:
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 Примечание: это будет потеряно после уменьшения / запутывания вашего кода.
Вы можете иметь многострочные строки в чистом JavaScript.
Этот метод основан на сериализации функций, которая определяется как зависящая от реализации . Он работает в большинстве браузеров (см. Ниже), но нет гарантии, что он будет работать в будущем, поэтому не полагайтесь на него.
Используя следующую функцию:
function hereDoc(f) {
return f.toString().
replace(/^[^\/]+\/\*!?/, '').
replace(/\*\/[^\/]+$/, '');
}
У вас могут быть вот такие документы:
var tennysonQuote = hereDoc(function() {/*!
Theirs not to make reply,
Theirs not to reason why,
Theirs but to do and die
*/});
Метод успешно протестирован в следующих браузерах (не упоминается = не тестировалось):
Однако будьте осторожны со своим минификатором. Имеет тенденцию удалять комментарии. Для компрессора YUI комментарий, начинающийся с /*!
(например, тот, который я использовал), будет сохранен.
Я думаю, что реальным решением было бы использовать CoffeeScript.
ОБНОВЛЕНИЕ ES6: вы можете использовать обратную кавычку вместо создания функции с комментарием и запуска toString для комментария. Регулярное выражение необходимо будет обновить только для удаления пробелов. У вас также может быть метод строкового прототипа для этого:
let foo = `
bar loves cake
baz loves beer
beer loves people
`.removeIndentation()
Кто-то должен написать этот строковый метод .removeIndentation ...;)
.removeIndentation()
- person foobored; 22.04.2020
Ты можешь сделать это...
var string = 'This is\n' +
'a multiline\n' +
'string';
Я придумал этот очень джимми-риггированный метод многострочной струны. Поскольку преобразование функции в строку также возвращает любые комментарии внутри функции, вы можете использовать комментарии в качестве своей строки, используя многострочный комментарий / ** /. Вам просто нужно обрезать концы, и у вас есть веревка.
var myString = function(){/*
This is some
awesome multi-lined
string using a comment
inside a function
returned as a string.
Enjoy the jimmy rigged code.
*/}.toString().slice(14,-3)
alert(myString)
trim()
. Но этого может хватить.
- person schmijos; 17.10.2014
function ( ) { ...
- person Kevin Cox; 18.10.2014
Я удивлен, что не увидел этого, потому что он работает везде, где я его тестировал, и очень полезен, например, для шаблоны:
<script type="bogus" id="multi">
My
multiline
string
</script>
<script>
alert($('#multi').html());
</script>
Кто-нибудь знает среду, в которой есть HTML, но он не работает?
Я решил это, выведя div, сделав его скрытым и вызвав id div с помощью jQuery, когда мне это нужно.
e.g.
<div id="UniqueID" style="display:none;">
Strings
On
Multiple
Lines
Here
</div>
Затем, когда мне нужно получить строку, я просто использую следующий jQuery:
$('#UniqueID').html();
Что возвращает мой текст на нескольких строках. Если я позвоню
alert($('#UniqueID').html());
Я получил:
display:none
контент, скорее всего, из-за популярности интерфейсов в стиле JavaScript. (Например, страница часто задаваемых вопросов с функцией скрытия / отображения.) Вы должны быть осторожны, потому что Google заявляет, что они могут наказать вас, если скрытый контент будет создан для искусственного завышения вашего SEO-рейтинга.
- person Pacerier; 07.08.2017
Есть несколько способов добиться этого
1. Конкатенация косой черты
var MultiLine= '1\
2\
3\
4\
5\
6\
7\
8\
9';
2. обычная конкатенация
var MultiLine = '1'
+'2'
+'3'
+'4'
+'5';
3. Объединение массивов
var MultiLine = [
'1',
'2',
'3',
'4',
'5'
].join('');
С точки зрения производительности, конкатенация косой черты (первая) является самой быстрой.
См. этот тестовый пример для получения дополнительных сведений о производительности.
Обновление:
В ES2015 мы можем воспользоваться его функцией шаблонных строк. С его помощью нам просто нужно использовать обратные тики для создания многострочных строк.
Пример:
`<h1>{{title}}</h1>
<h2>{{hero.name}} details!</h2>
<div><label>id: </label>{{hero.id}}</div>
<div><label>name: </label>{{hero.name}}</div>
`
Используя теги скрипта:
<script>...</script>
, содержащий ваш многострочный текст, в тег head
;получить многострочный текст как есть ... (обратите внимание на кодировку текста: UTF-8, ASCII)
<script>
// pure javascript
var text = document.getElementById("mySoapMessage").innerHTML ;
// using JQuery's document ready for safety
$(document).ready(function() {
var text = $("#mySoapMessage").html();
});
</script>
<script id="mySoapMessage" type="text/plain">
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="...">
<soapenv:Header/>
<soapenv:Body>
<typ:getConvocadosElement>
...
</typ:getConvocadosElement>
</soapenv:Body>
</soapenv:Envelope>
<!-- this comment will be present on your string -->
//uh-oh, javascript comments... SOAP request will fail
</script>
Мне нравится этот синтаксис и отступы:
string = 'my long string...\n'
+ 'continue here\n'
+ 'and here.';
(но на самом деле не может рассматриваться как многострочная строка)
Вот эта библиотека, которая делает его красивым:
https://github.com/sindresorhus/multiline
var str = '' +
'<!doctype html>' +
'<html>' +
' <body>' +
' <h1>❤ unicorns</h1>' +
' </body>' +
'</html>' +
'';
var str = multiline(function(){/*
<!doctype html>
<html>
<body>
<h1>❤ unicorns</h1>
</body>
</html>
*/});
nodejs
.
- person Huei Tan; 05.05.2014
Голосующие против: этот код предоставляется только для информации.
Это было протестировано в Fx 19 и Chrome 24 на Mac.
var new_comment; /*<<<EOF
<li class="photobooth-comment">
<span class="username">
<a href="#">You</a>:
</span>
<span class="comment-text">
$text
</span>
@<span class="comment-time">
2d
</span> ago
</li>
EOF*/
// note the script tag here is hardcoded as the FIRST tag
new_comment=document.currentScript.innerHTML.split("EOF")[1];
document.querySelector("ul").innerHTML=new_comment.replace('$text','This is a dynamically created text');
<ul></ul>
Эквивалент в javascript:
var text = `
This
Is
A
Multiline
String
`;
Вот спецификация. См. Информацию о поддержке браузера внизу этой страницы. Вот несколько примеров.
Это работает в IE, Safari, Chrome и Firefox:
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<div class="crazy_idea" thorn_in_my_side='<table border="0">
<tr>
<td ><span class="mlayouttablecellsdynamic">PACKAGE price $65.00</span></td>
</tr>
</table>'></div>
<script type="text/javascript">
alert($(".crazy_idea").attr("thorn_in_my_side"));
</script>
Подводя итог, я попробовал 2 подхода, перечисленных здесь в пользовательском программировании javascript (Opera 11.01):
Поэтому я рекомендую рабочий подход пользователям Opera, использующим JS. В отличие от того, что говорил автор:
Не работает в Firefox или Opera; только в IE, Chrome и Safari.
Он ДЕЙСТВИТЕЛЬНО работает в Opera 11. По крайней мере, в пользовательских JS-скриптах. Жаль, что я не могу комментировать отдельные ответы или голосовать за ответ, я бы сделал это немедленно. Если возможно, кто-нибудь с более высокими привилегиями, пожалуйста, сделайте это за меня.
Мое расширение для https://stackoverflow.com/a/15558082/80404. Он ожидает комментарий в виде /*! any multiline comment */
, где символ! используется для предотвращения удаления путем минификации (по крайней мере, для компрессора YUI)
Function.prototype.extractComment = function() {
var startComment = "/*!";
var endComment = "*/";
var str = this.toString();
var start = str.indexOf(startComment);
var end = str.lastIndexOf(endComment);
return str.slice(start + startComment.length, -(str.length - end));
};
Пример:
var tmpl = function() { /*!
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
</ul>
</div>
*/}.extractComment();
Обновлено к 2015 году: прошло шесть лет: большинство людей используют загрузчик модулей, и каждая из основных модульных систем имеет способы загрузки шаблонов. Он не является встроенным, но наиболее распространенным типом многострочных строк являются шаблоны, и шаблоны, как правило, в любом случае не следует использовать в JS.
Использование плагина require.js 'text' с многострочным шаблоном в template.html strong >
var template = require('text!template.html')
Browserify использует модуль brfs для загрузки текстовых файлов. Это фактически встроит ваш шаблон в ваш связанный HTML.
var fs = require("fs");
var template = fs.readFileSync(template.html', 'utf8');
Легкий.
Если вы хотите использовать экранированные символы новой строки, их можно использовать красиво. Похоже на документ с рамкой страницы.
В ES6 это можно сделать с помощью шаблонных литералов:
const str = `This
is
a
multiline text`;
console.log(str);
Дополнительная информация здесь
Вы можете использовать TypeScript (JavaScript SuperSet), он поддерживает многострочные строки и переносит обратно в чистый JavaScript без накладных расходов. :
var templates = {
myString: `this is
a multiline
string`
}
alert(templates.myString);
Если вы хотите добиться того же с помощью простого JavaScript:
var templates =
{
myString: function(){/*
This is some
awesome multi-lined
string using a comment
inside a function
returned as a string.
Enjoy the jimmy rigged code.
*/}.toString().slice(14,-3)
}
alert(templates.myString)
Обратите внимание, что iPad / Safari не поддерживает 'functionName.toString()'
Если у вас много устаревшего кода, вы также можете использовать простой вариант JavaScript в TypeScript (для очистки):
interface externTemplates
{
myString:string;
}
declare var templates:externTemplates;
alert(templates.myString)
и вы можете использовать многострочный объект из простого варианта JavaScript, где вы помещаете шаблоны в другой файл (который вы можете объединить в пакет).
Вы можете попробовать TypeScript на
http://www.typescriptlang.org/Playground.
Самый простой способ сделать многострочные строки в Javascrips - использовать обратные кавычки (``). Это позволяет вам создавать многострочные строки, в которые вы можете вставлять переменные с ${variableName}
.
let name = 'Willem';
let age = 26;
let multilineString = `
my name is: ${name}
my age is: ${age}
`;
console.log(multilineString);
Проверьте точную совместимость в документации Mozilla здесь
ES6 позволяет использовать обратную кавычку для указания строки на нескольких строках. Это называется шаблонным литералом. Нравится:
var multilineString = `One line of text
second line of text
third line of text
fourth line of text`;
Использование обратной кавычки работает в NodeJS и поддерживается Chrome, Firefox, Edge, Safari и Opera.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
Также обратите внимание, что при расширении строки на несколько строк с использованием прямой обратной косой черты в конце каждой строки любые дополнительные символы (в основном пробелы, табуляции и комментарии, добавленные по ошибке) после прямой обратной косой черты вызовут неожиданную символьную ошибку, на поиск которой мне потребовался час. из
var string = "line1\ // comment, space or tabs here raise error
line2";
Пожалуйста, из любви к Интернету используйте конкатенацию строк и не используйте для этого решения ES6. ES6 НЕ поддерживается повсеместно, как и CSS3, и некоторые браузеры медленно адаптируются к движению CSS3. Используйте старый простой JavaScript, ваши конечные пользователи будут вам благодарны.
Пример:
var str = "This world is neither flat nor round. "+
"Once was lost will be found";
Моя версия объединения на основе массивов для конкатенации строк:
var c = []; //c stands for content
c.push("<div id='thisDiv' style='left:10px'></div>");
c.push("<div onclick='showDo(\'something\');'></div>");
$(body).append(c.join('\n'));
Это хорошо сработало для меня, особенно потому, что я часто вставляю значения в HTML, построенный таким образом. Но у него много ограничений. Отступы были бы хороши. Было бы неплохо не иметь дело с вложенными кавычками, и меня беспокоит только их громоздкость.
Требуется ли много времени для добавления в массив .push ()? См. Соответствующий ответ:
(Есть ли причина, по которой разработчики JavaScript не используют массив? .push ()?)
Посмотрев на эти (противоположные) тестовые прогоны, похоже, что .push () подходит для строковых массивов, которые вряд ли вырастут более чем на 100 элементов - я буду избегать его в пользу индексированных добавлений для более крупных массивов.
Вы можете использовать +=
для объединения вашей строки, похоже, никто не ответил на это, что будет читабельно, а также аккуратно ... что-то вроде этого
var hello = 'hello' +
'world' +
'blah';
можно также записать как
var hello = 'hello';
hello += ' world';
hello += ' blah';
console.log(hello);
Вы должны использовать оператор конкатенации "+".
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p id="demo"></p>
<script>
var str = "This "
+ "\n<br>is "
+ "\n<br>multiline "
+ "\n<br>string.";
document.getElementById("demo").innerHTML = str;
</script>
</body>
</html>
При использовании \n
ваш исходный код будет выглядеть так:
This <br>is <br>multiline <br>string.
При использовании <br>
вывод вашего браузера будет выглядеть так:
This is multiline string.
Ruby производит: "This\nIs\nA\nMultiline\nString\n"
- ниже JS создает точно такую же строку
text = `This
Is
A
Multiline
String
`
// TEST
console.log(JSON.stringify(text));
console.log(text);
Это улучшение Лонни Лучший ответ, потому что символы новой строки в его ответе не совсем те же позиции, что и в выводе ruby.
\n
устарел. Это может быть разрешено в HTML, но не должно использоваться никакими авторами. См. stackoverflow.com/questions/ 8307846 /
- person Kamil Kiełczewski; 12.07.2020
Я думаю, что этот обходной путь должен работать в IE, Chrome, Firefox, Safari, Opera -
Использование jQuery:
<xmp id="unique_id" style="display:none;">
Some plain text
Both type of quotes : " ' " And ' " '
JS Code : alert("Hello World");
HTML Code : <div class="some_class"></div>
</xmp>
<script>
alert($('#unique_id').html());
</script>
Использование чистого Javascript:
<xmp id="unique_id" style="display:none;">
Some plain text
Both type of quotes : " ' " And ' " '
JS Code : alert("Hello World");
HTML Code : <div class="some_class"></div>
</xmp>
<script>
alert(document.getElementById('unique_id').innerHTML);
</script>
Ваше здоровье!!
<xmp>
с экранированием не поможет в моем решении ... Сегодня я столкнулся с подобной проблемой и пытался найти обходной путь ... но в моем случае я нашел один очень неловкий способ исправить эту проблему помещая вывод в html-комментарии вместо ‹xmp› или любого другого тега. ржу не могу. Я знаю, что это не стандартный способ сделать это, но я буду работать над этим вопросом завтра утром .. Ура !!
- person Bergi; 28.01.2013
<pre>;
Chrome пытается загрузить любые _2_ изображения, упомянутые в блоке примера.
- person Aditya Hajare; 28.01.2013
Вы можете использовать шаблоны с тегами, чтобы получить желаемый результат.
Например:
// Merging multiple whitespaces and trimming the output
const t = (strings) => { return strings.map((s) => s.replace(/\s+/g, ' ')).join("").trim() }
console.log(t`
This
Is
A
Multiline
String
`);
// Output: 'This Is A Multiline String'
// Similar but keeping whitespaces:
const tW = (strings) => { return strings.map((s) => s.replace(/\s+/g, '\n')).join("").trim() }
console.log(tW`
This
Is
A
Multiline
String
`);
// Output: 'This\nIs\nA\nMultiline\nString'
Просто попробовал анонимный ответ и обнаружил, что здесь есть небольшая хитрость, он не работает, если после обратной косой черты есть пробел \
Итак, следующее решение не работает -
var x = { test:'<?xml version="1.0"?>\ <-- One space here
<?mso-application progid="Excel.Sheet"?>'
};
Но когда пространство удалено, это работает -
var x = { test:'<?xml version="1.0"?>\<-- No space here now
<?mso-application progid="Excel.Sheet"?>'
};
alert(x.test);
Надеюсь, это поможет !!
Я программирую так:
sys = {
layout: null,
makeLayout: function (obCLS) {
this.layout = $('<div />').addClass('editor').appendTo($(obCLS)).append(
/* Cargador */
/* @this.layout.find('> div:nth-of-child(1)'); */
'<div>' +
' <p>Seleccione la imagen que desea procesar.</p>' +
' <input type="button" value="Seleccionar" class="btn btn-xlarge btn-success" />' +
' <span></span>' +
'</div>' +
/* Cargador - Progreso */
/* @this.layout.find('> div:nth-of-child(2)'); */
'<div>' +
' <div>' +
' <div></div>' +
' <div>' +
' <div></div>' +
' </div>' +
' </div>' +
'</div>' +
/* Editor */
/* @this.layout.find('> div:nth-of-child(3)');
* @sidebar = this.layout.find('> div:nth-of-child(3) > div > div > div:nth-of-type(1)');
* @body = this.layout.find('> div:nth-of-child(3) > div > div > div:nth-of-type(2) > div'); */
'<div>' +
' <div>' +
' <div>' +
' <div></div>' +
' <div>' +
' <div></div>' +
' </div>' +
' </div>' +
' </div>' +
'</div>'
);
}
}
sys.makeLayout('#div');
Думаю, я нашел другой способ сделать это встроенным без какого-либо инвазивного синтаксиса в каждой строке. Используйте возможность Javascript для преобразования функции в строку и создания многострочного комментария с синтаксисом /**/
, затем удалите «function () {/ * \ n» и «\ n * /}».
var multiline = function(string) { return string.toString().replace(/(^[^\n]*\n)|(\n\*\/\})/g, ""); };
console.log(multiline(function() {/*
Hello world!
I'm a multiline string!
Tada!
*/}));
Единственная ошибка, которую я вижу в этом, - это подсветка синтаксиса.
РЕДАКТИРОВАТЬ: если бы я прокрутил еще немного, я бы увидел, что этот ответ делает то же самое: https://stackoverflow.com/a/5571069/916553
Если вы работаете только в Node, вы можете использовать модуль fs для чтения многострочной строки из файла:
var diagram;
var fs = require('fs');
fs.readFile( __dirname + '/diagram.txt', function (err, data) {
if (err) {
throw err;
}
diagram = data.toString();
});
Это довольно экономичный подход, по крайней мере, с точки зрения исходного кода:
function s() {
var args = [],index;
for (index = 0; index< arguments.length; index++) {
args.push (arguments [index]);
}
return args.join ("\n");
}
console.log (s (
"This is the first line",
"and this is the second",
"finally a third"
));
function s() {return arguments.join ("\n")}
было бы, конечно, лучше, если бы свойство «arguments» было правильным массивом.
Вторая версия может использовать "" для объединения в случаях, когда вы хотите контролировать разрывы строк в очень длинной строке.
Правило: внутри строки используйте \ n везде, где хотите новую строку; вам не нужно ставить пробел до или после \ n, интерпретатор JavaScript достаточно умен, чтобы знать, как долго длится непечатаемое символьное представление.
Я нашел более элегантное решение, возможно, немного не связанное с темой, потому что оно использует PHP, но я уверен, что оно будет полезно и привлекательно * для некоторых из вас ...
этот код javascript должен оставаться внутри тегов скрипта.
var html=<?php echo json_encode("
<div class=container>
<div class=area1>
xxx
</div>
<div class=area2>
".$someVar."
</div>
</div>
"); ?>
в своем выходном HTML вы увидите что-то вроде
var html="\r\n\r\n\t\t\t<div class=container>\r\n\t\t\t\t<div class=area1>\r\n\t\t\t\t\txxx\r\n\t\t\t\t<\/div>\r\n\t\t\t\t<div class=area2>\r\n\t\t\t\t\t44\r\n\t\t\t\t<\/div>\r\n\t\t\t<\/div>\r\n\r\n\t\t";
и et voilà!, это обеспечивает читаемость кода в вашем файле.
pD: в этом примере используется функция PHP json_encode (), но, безусловно, существуют эквиваленты функций для языков ASP, Ruby и JSP.
pD: однако у этого решения тоже есть свои ограничения, одно из них - вы не можете использовать переменные javascript внутри инкапсулированного кода.
Это не очень элегантно, но для меня достаточно чистое:
Будьте осторожны: некоторые браузеры будут вставлять новые строки при продолжении, некоторые нет.
var myString = "First line" + "\n";
var myString = myString + "Second line" + "\n";
var myString = myString + "Third line" + "\n";
var myString += "Second line \n";
. _2_ не следует повторять.
- person Colin; 27.02.2013