Создание многострочных строк в JavaScript
У меня есть следующий код в Ruby. Я хочу преобразовать этот код в JavaScript. что такое эквивалентный код в JS?
text = <<"HERE"
This
Is
A
Multiline
String
HERE
43 ответа
Обновить:
ECMAScript 6 (ES6) представляет новый тип литералов, а именно шаблонные литералы. У них много функций, среди которых переменная интерполяция, но, что важнее всего, для этого вопроса они могут быть многострочными.
Шаблонный литерал отделяется обратными чертами:
var html = `
<div>
<span>Some HTML here</span>
</div>
`;
(Примечание: я не рекомендую использовать HTML в строках)
Поддержка браузера в порядке, но вы можете использовать транспортеры для большей совместимости.
Оригинальный ответ ES5:
У Javascript нет синтаксиса здесь-документа. Вы можете избежать буквального перевода строки, однако, который приближается:
"foo \
bar"
Обновление ES6:
Как упоминается в первом ответе, с 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'
Оригинальный ответ ES5:
Руководство по стилю Google для JavaScript рекомендует использовать конкатенацию строк вместо экранирования:
Не делайте этого:
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.';
Шаблон 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
*/});
Метод был успешно протестирован в следующих браузерах (не упоминается = не тестировался):
- IE 4 - 10
- Опера 9.50 - 12 (не в 9-)
- Сафари 4 - 6 (не в 3-)
- Хром 1 - 45
- Firefox 17 - 21 ( не в 16-)
- Rekonq 0.7.0 - 0.8.0
- Не поддерживается в Konqueror 4.7.4
Будьте осторожны с вашим миниатором. Это имеет тенденцию удалять комментарии. Для компрессора YUI комментарий начинается с /*!
(как тот, который я использовал) будет сохранен.
Я думаю, что реальным решением было бы использовать CoffeeScript.
Вы можете сделать это...
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)
Я удивлен, что не видел этого, потому что он работает везде, где я тестировал, и очень полезен, например, для шаблонов:
<script type="bogus" id="multi">
My
multiline
string
</script>
<script>
alert($('#multi').html());
</script>
Кто-нибудь знает о среде, где есть HTML, но он не работает?
Я решил эту проблему, выведя div, сделав его скрытым, и вызвав div id с помощью jQuery, когда мне это нужно.
например
<div id="UniqueID" style="display:none;">
Strings
On
Multiple
Lines
Here
</div>
Затем, когда мне нужно получить строку, я просто использую следующий jQuery:
$('#UniqueID').html();
Который возвращает мой текст в несколько строк. Если я позвоню
alert($('#UniqueID').html());
Я получил:
Есть несколько способов добиться этого
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('');
С точки зрения производительности конкатенация Slash (первая) - самая быстрая.
Обратитесь к этому тесту для получения более подробной информации о производительности
Обновить:
С 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>
Простой способ печатать многострочные строки в JavaScript — использовать литералы шаблонов (строки шаблонов), обозначаемые обратными кавычками (` `). вы также можете использовать переменные внутри строкового шаблона (`
name is ${value}
`)
Вы также можете
Мне нравится этот синтаксис и неопределенность:
string = 'my long string...\n'
+ 'continue here\n'
+ 'and here.';
(но на самом деле не может рассматриваться как многострочная строка)
Downvoters: этот код предоставляется только для информации.
Это было проверено в 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>
</li>
EOF*/
// note the script tag here is hardcoded as the FIRST tag
new_comment=document.currentScript.innerHTML.split("EOF")[1];
alert(new_comment.replace('$text','Here goes some text'));
Вот эта библиотека, которая делает ее красивой:
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>
*/});
Нашел здесь много чрезмерно продуманных ответов. На мой взгляд, два лучших ответа были:
1:
let str = `Multiline string.
foo.
bar.`
который в конечном итоге регистрирует:
Multiline string.
foo.
bar.
2:
let str = `Multiline string.
foo.
bar.`
Это регистрирует это правильно, но это некрасиво в файле сценария, если str вложен внутри функций / объектов и т.д ...:
Multiline string.
foo.
bar.
Мой действительно простой ответ с регулярным выражением, которое правильно регистрирует str:
let str = `Multiline string.
foo.
bar.`.replace(/\n +/g, '\n');
Обратите внимание, что это не идеальное решение, но оно работает, если вы уверены, что после новой строки (\n) появится хотя бы один пробел (+ означает хотя бы одно вхождение). Он также будет работать с * (ноль или больше).
Вы можете быть более явным и использовать {n,}, что означает как минимум n вхождений.
Эквивалент в javascript:
var text = `
This
Is
A
Multiline
String
`;
Вот спецификация. Смотрите поддержку браузера внизу этой страницы. Вот также несколько примеров.
Подводя итог, я попробовал 2 подхода, перечисленных здесь в пользовательском программировании на JavaScript (Opera 11.01):
- это не сработало: создание многострочных строк в JavaScript
- это работало довольно хорошо, я также выяснил, как сделать так, чтобы он хорошо выглядел в режиме просмотра исходного кода Notepad++: Создание многострочных строк в JavaScript
Поэтому я рекомендую рабочий подход для пользователей Opera для пользователей JS. В отличие от того, что автор говорил:
Это не работает на Firefox или Opera; только на IE, Chrome и Safari.
Это работает в Opera 11. По крайней мере, в пользовательских скриптах JS. Очень жаль, что я не могу комментировать отдельные ответы или ставить перед ними ответ, я сделаю это немедленно. Если возможно, кто-то с более высокими привилегиями, пожалуйста, сделайте это для меня.
Точный
Рубиновые продукты:"This\nIs\nA\nMultiline\nString\n"
- ниже JS создает точно такую же строку
text = `This
Is
A
Multiline
String
`
// TEST
console.log(JSON.stringify(text));
console.log(text);
Это улучшение ответа Лонни Бест
Это работает в 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>
Мое расширение на /questions/48038511/sozdanie-mnogostrochnyih-strok-v-javascript/48038935#48038935. Ожидается комментарий в форме /*! 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' плагина require.js с многострочным шаблоном в template.html
var template = require('text!template.html')
NPM / browserify: модуль 'brfs'
Browserify использует модуль 'brfs' для загрузки текстовых файлов. Это фактически встроит ваш шаблон в ваш связанный HTML.
var fs = require("fs");
var template = fs.readFileSync(template.html', 'utf8');
Легко.
Если вы хотите использовать экранированные символы новой строки, их можно использовать красиво. Это выглядит как документ с рамкой страницы.
Самый простой способ создания многострочных строк в Javascrips - использование обратных галочек ( ``). Это позволяет создавать многострочные строки, в которые можно вставлять переменные с помощью ${variableName}
,
Пример:
let name = 'Willem';
let age = 26;
let multilineString = `
my name is: ${name}
my age is: ${age}
`;
console.log(multilineString);
совместимость:
- Это было введено в
ES6
//es2015
- Теперь он изначально поддерживается всеми основными поставщиками браузеров (кроме Internet Explorer)
Точную совместимость с документами Mozilla можно посмотреть здесь
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
ES6 позволяет использовать обратную галочку для указания строки в несколько строк. Это называется литералом шаблона. Как это:
var multilineString = `One line of text
second line of text
third line of text
fourth line of text`;
Использование backtick работает в NodeJS и поддерживается Chrome, Firefox, Edge, Safari и Opera.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
Вы можете использовать шаблоны с тегами, чтобы получить желаемый результат.
Например:
// 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'
Пожалуйста, ради любви к Интернету используйте конкатенацию строк и не используйте для этого решения ES6. ES6 НЕ поддерживается повсеместно, во многом как CSS3 и некоторые браузеры медленно адаптируются к движению CSS3. Используйте обычный старый JavaScript, ваши конечные пользователи будут вам благодарны.
Пример:
var str = "This world is neither flat nor round. "+
"Once was lost will be found";
Также обратите внимание, что при расширении строки на несколько строк с использованием обратной косой черты в конце каждой строки любые дополнительные символы (в основном пробелы, табуляции и комментарии, добавленные по ошибке) после обратной косой черты вызовут непредвиденную ошибку символа, которую я нашел в течение часа, чтобы найти из
var string = "line1\ // comment, space or tabs here raise error
line2";
Многострочная строка с переменными
var x = 1
string = string + `<label class="container">
<p>${x}</p>
</label>`;