当前位置:  开发笔记 > 编程语言 > 正文

在JavaScript中创建多行字符串

如何解决《在JavaScript中创建多行字符串》经验,为你挑选了22个好方法。

我在Ruby中有以下代码.我想将此代码转换为JavaScript.什么是JS中的等效代码?

text = <<"HERE"
This
Is
A
Multiline
String
HERE

Anonymous.. 3007

更新:

ECMAScript 6(ES6)引入了一种新的文字,即模板文字.它们具有许多特征,可变插值等,但最重要的是,对于这个问题,它们可以是多线的.

模板文字由反引号分隔:

var html = `
  
Some HTML here
`;

(注意:我不主张在字符串中使用HTML)

浏览器支持是可以的,但您可以使用转换器更兼容.


原ES5答案:

Javascript没有here-document语法.但是,你可以逃避文字换行符:

"foo \
bar"

请注意:某些浏览器会在延续时插入换行符,有些则不会. (221认同)

@Nate在[ECMA-262第5版](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf)第7.8.4节中规定并称为*LineContinuation*: "行终止符不能出现在字符串文字中,除非作为*LineContinuation*的一部分产生空字符序列.使行终止符字符成为字符串文字的字符串值的一部分的正确方法是使用转义序列,例如\n或\ u000A." (47认同)

Visual Studio 2010似乎也被这种语法搞糊涂了. (34认同)

当浏览器不一致地对待它时,我不明白为什么你会这样做.多行中的"line1 \n"+"line2"足够可读,并保证您的行为一致. (15认同)

"浏览器支持正常"...... IE11不支持 - 不行 (8认同)

总而言之,这似乎是最直接的方法,与所有浏览器兼容,至少回到IE6(可能更早),只要你不关心是否可以在每一行的末尾添加额外的换行符.有谁知道哪些浏览器/版本添加换行符,哪些没有? (7认同)

这种语法非常适合永远不会在反斜杠和换行符之间放置空格的机器.其他人都必须将他们的代码粘贴到SO的评论编辑器中,以查看`\`和\之间突出显示的区别 (3认同)

`'line1'+'\n'`...这有什么问题? (2认同)

这个解决方案并没有错 - 但显然不是最好的.很难过这里有如此高的数量.向下滚动以阅读更好的解决方案. (2认同)


Devin G Rhod.. 1253

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.';

@MattBrowne谷歌的建议已经由他们记录,按照重要性的顺序:(1)每行开头的空白[在这个例子中,你不希望你的字符串中有空格,但它在代码中看起来更好](2)斜杠之后的空格会导致棘手的错误[如果你用'\`而不是'\\`结束一行很难注意到]和(3)虽然大多数脚本引擎支持这一点,但它不是ECMAScript [即为什么使用非标准功能?]记住它是一个样式指南,它使代码易于阅读+维护+调试:不只是"它工作"正确. (26认同)

我不明白谷歌的建议.除了极端旧的浏览器之外的所有浏览器都支持反斜杠后跟换行方法,并且将来会继续这样做以实现向后兼容性.你需要避免它的唯一一次是你需要确保在每一行的末尾添加一个且只有一个换行符(或没有换行符)(另请参阅我对已接受答案的评论). (19认同)

请注意,IE11,Firefox 31,Chrome 35或Safari 7不支持模板字符串.请参阅http://kangax.github.io/compat-table/es6/ (6认同)


KooiInc.. 665

这种模式text = <<"HERE" This Is A Multiline String HERE在js中不可用(我记得在我很好的旧Perl时代使用它).

为了保持对复杂或长多行字符串的监督,我有时使用数组模式:

var myString = 
   ['
', 'some content
', 'someRefTxt', '
' ].join('\n');

或者匿名模式已经显示(转义换行符),这可能是代码中的一个丑陋的块:

    var myString = 
       '
\ some content
\ someRefTxt \
';

这是另一个奇怪但有效的'技巧' 1:

var myString = (function () {/*
   
some content
someRefTxt
*/}).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注意:在缩小/混淆代码后,这将丢失



1> Anonymous..:

更新:

ECMAScript 6(ES6)引入了一种新的文字,即模板文字.它们具有许多特征,可变插值等,但最重要的是,对于这个问题,它们可以是多线的.

模板文字由反引号分隔:

var html = `
  
Some HTML here
`;

(注意:我不主张在字符串中使用HTML)

浏览器支持是可以的,但您可以使用转换器更兼容.


原ES5答案:

Javascript没有here-document语法.但是,你可以逃避文字换行符:

"foo \
bar"


请注意:某些浏览器会在延续时插入换行符,有些则不会.
@Nate在[ECMA-262第5版](http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf)第7.8.4节中规定并称为*LineContinuation*: "行终止符不能出现在字符串文字中,除非作为*LineContinuation*的一部分产生空字符序列.使行终止符字符成为字符串文字的字符串值的一部分的正确方法是使用转义序列,例如\n或\ u000A."
Visual Studio 2010似乎也被这种语法搞糊涂了.
当浏览器不一致地对待它时,我不明白为什么你会这样做.多行中的"line1 \n"+"line2"足够可读,并保证您的行为一致.
"浏览器支持正常"...... IE11不支持 - 不行
总而言之,这似乎是最直接的方法,与所有浏览器兼容,至少回到IE6(可能更早),只要你不关心是否可以在每一行的末尾添加额外的换行符.有谁知道哪些浏览器/版本添加换行符,哪些没有?
这种语法非常适合永远不会在反斜杠和换行符之间放置空格的机器.其他人都必须将他们的代码粘贴到SO的评论编辑器中,以查看`\`和\之间突出显示的区别
`'line1'+'\n'`...这有什么问题?
这个解决方案并没有错 - 但显然不是最好的.很难过这里有如此高的数量.向下滚动以阅读更好的解决方案.

2> Devin G Rhod..:

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.';


@MattBrowne谷歌的建议已经由他们记录,按照重要性的顺序:(1)每行开头的空白[在这个例子中,你不希望你的字符串中有空格,但它在代码中看起来更好](2)斜杠之后的空格会导致棘手的错误[如果你用'\`而不是'\\`结束一行很难注意到]和(3)虽然大多数脚本引擎支持这一点,但它不是ECMAScript [即为什么使用非标准功能?]记住它是一个样式指南,它使代码易于阅读+维护+调试:不只是"它工作"正确.
我不明白谷歌的建议.除了极端旧的浏览器之外的所有浏览器都支持反斜杠后跟换行方法,并且将来会继续这样做以实现向后兼容性.你需要避免它的唯一一次是你需要确保在每一行的末尾添加一个且只有一个换行符(或没有换行符)(另请参阅我对已接受答案的评论).
请注意,IE11,Firefox 31,Chrome 35或Safari 7不支持模板字符串.请参阅http://kangax.github.io/compat-table/es6/

3> KooiInc..:

这种模式text = <<"HERE" This Is A Multiline String HERE在js中不可用(我记得在我很好的旧Perl时代使用它).

为了保持对复杂或长多行字符串的监督,我有时使用数组模式:

var myString = 
   ['
', 'some content
', 'someRefTxt', '
' ].join('\n');

或者匿名模式已经显示(转义换行符),这可能是代码中的一个丑陋的块:

    var myString = 
       '
\ some content
\ someRefTxt \
';

这是另一个奇怪但有效的'技巧' 1:

var myString = (function () {/*
   
some content
someRefTxt
*/}).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注意:在缩小/混淆代码后,这将丢失


阵列模式更具可读性,应用程序的性能损失通常可以忽略不计.正如该perf测试所示,即使IE7每秒也可以进行数万次操作.
请不要使用阵列模式.在大多数情况下,它将比普通的字符串连接慢.
@KooiInc您的测试从已创建的数组开始,这会使结果出现偏差.如果添加数组的初始化,则直接连接更快http://jsperf.com/string-concat-without-sringbuilder/7请参阅http://stackoverflow.com/questions/51185/are-javascript-strings-immutable -do-i-need-a-string-builder-in-javascript/4717855#4717855作为换行的技巧,它可能没关系,但它肯定做的工作比它应该做的更多
+1是一个优雅的选择,不仅在所有浏览器中以相同的方式工作,但也是面向未来的.
@BMiner:1)"过早优化是所有邪恶的根源" - 唐纳德克努特,以及2)'可读性'在旁观者的眼中
小心"功能评论"解决方案.请记住,只要您想要最小化JS代码,您的评论就会被删除.
这是我最喜欢的方式(它看起来不错),并且足够快以至于我愿意为代码可读性带来轻微的速度.
我个人只是连接字符串,并在JS缩小并组合字符串时解决性能问题.
在*大多数情况下......你还包括分配/构建阵列所需的时间吗?无论如何......它比连接数组更具可读性.
@Kooilnc:有些浏览器可以将几个文字连接编译成单个文字字符串,而且在机器代码中也可以.基准测试也应该尝试大量的字符串变量,这与join()的公平比较.
@RoyTinker:随意自己做一个jsperf.com测试,或者在我的测试中捣乱;)
你可以做一个小函数来做快速连接:function fastjoin(array){out =''; for(i in array){out + = i; 退出; }
@bat根据jsperf(9.72亿vs 100万操作/秒),在使用Firefox 32的Mac 10.9上进行测试时,连接比连接慢"100%".
除非这是在一百万个嵌套循环内并在马铃薯上运行,否则效率可能与可读性无关.数组为+1

4> Jordão..:

可以在纯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

Opera 9.50 - 12(不是9-)

Safari 4 - 6(不是3-)

Chrome 1 - 45

Firefox 17 - 21(不是16-)

Rekonq 0.7.0 - 0.8.0

Konqueror 4.7.4不支持

但是要小心你的缩放器.它往往会删除评论.对于YUI压缩器,/*!将保留以(与我使用的)相似的注释.

我认为真正的解决方案是使用CoffeeScript.


什么!?创建和反编译函数以将多行注释破解为多行字符串?现在*那是*丑陋的.
它实际上是_beyond_丑陋...虽然,没有_decompiling_涉及......
http://jsfiddle.net/fqpwf/适用于Chrome 13和IE8/9,但不适用于FF6.我讨厌说出来,但我喜欢它,如果它可能是每个浏览器的故意特征(因此它不会消失),我会使用它.
非常方便.我正在将它用于(Jasmine)单元测试,但是将其用于生产代码.

5> alex..:

你可以这样做...

var string = 'This is\n' +
'a multiline\n' + 
'string';



6> Luke..:

我想出了这种多线式弦乐器的装配方法.由于将函数转换为字符串也会返回函数内的任何注释,您可以使用多行注释/**/将注释用作字符串.你只需要修剪两端,你就有了你的字符串.

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)


还要注意剥离注释的缩小器......:D
这绝对是可怕的.我喜欢它(虽然你可能需要进行正则表达式匹配,因为我不确定`toString()`的空白有多精确.
您可以在JavaScript领域中做一些奇怪的事情。虽然老实说,您永远不要使用此功能。
这就是为什么我们不能拥有好东西.

7> Peter V. Mør..:

我很惊讶我没有看到这个,因为它适用于我测试过的所有地方,对于例如模板非常有用:



有没有人知道有HTML的环境但它不起作用?


实际上,这是HTML而不是Javascript: - /
在任何地方,您都不希望将字符串放入单独且远程的脚本元素中.
有效的反对意见!它并不完美.但对于模板而言,这种分离不仅可以,而且甚至可能会受到鼓励.
但是,在javascript中获取多行字符串的任务可以通过这种方式完成

8> Tom Beech..:

我通过输出div,使其隐藏,并在需要时通过jQuery调用div id来解决这个问题.

例如

Strings On Multiple Lines Here

然后,当我需要获取字符串时,我只使用以下jQuery:

$('#UniqueID').html();

这会在多行返回我的文字.如果我打电话

alert($('#UniqueID').html());

我明白了:

在此输入图像描述


如果字符串是HTML怎么办?
$( '#的UniqueID').内容()
谢谢你!这是我发现的唯一解决我的问题的答案,其中涉及未知的字符串,可能包含直接插入代码的单引号和双引号的任意组合,没有预编码的机会.(它来自一个创建JS的模板语言 - 仍然来自可靠的来源而不是表单提交,所以它不是完全痴迷的).

9> jpfreire..:

使用脚本标签:

包含多行文字的块添加到head标记中;

按原样获取多行文本...(注意文本编码:UTF-8,ASCII)






10> Vignesh Subr..:

有多种方法可以实现这一目标

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,我们可以利用其模板字符串功能.有了它,我们只需要使用反向标记来创建多行字符串

例:

 `

{{title}}

{{hero.name}} details!

{{hero.id}}
{{hero.name}}
`


我认为这是你刚刚在页面上已经回流了五年,但是以更清洁的方式.

11> semente..:

我喜欢这种语法和压句:

string = 'my long string...\n'
       + 'continue here\n'
       + 'and here.';

(但实际上不能被视为多行字符串)


将+放在开头允许一个注释掉该行,而不必在序列的第一行/最后一行编辑其他行.
我使用它,除了我在前一行的末尾加上'+',以清楚说明语句在下一行继续.你的方式确实更均匀地排列缩进.
我更喜欢前面的+,因为在视觉上我不需要扫描到行的末尾就知道下一个是延续.

12> mightyiam..:

有这个图书馆使它美丽:

https://github.com/sindresorhus/multiline

之前

var str = '' +
'' +
'' +
'   ' +
'       

? unicorns

' + ' ' + '' + '';

var str = multiline(function(){/*


    
        

? unicorns

*/});


@HuiiTan Docs声明它也适用于浏览器.这是有道理的 - 它只是`Function.prototype.String()`.

13> mplungjan..:

Downvoters:此代码仅供参考.

这已经在Mac上的Fx 19和Chrome 24中进行了测试

DEMO

var new_comment; /*<<
       
          You
       
       
          $text
       
       
          2d
       
    
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'));


那太可怕了.+1.您可以使用[document.currentScript](https://developer.mozilla.org/en-US/docs/Web/API/Document/currentScript)代替getElement ...
我从来没有勇敢在生产代码中使用这种技术,但我在其中使用它的很多是在单元测试中,通常最容易将某些结构的值转储为(相当长的)字符串并将其与应该是什么.

14> Tyler..:

总结一下,我在用户javascript编程中尝试了2种方法(Opera 11.01):

这个不起作用:在JavaScript中创建多行字符串

这工作得相当好,我也想出了如何在Notepad ++源视图中使它看起来很好:在JavaScript中创建多行字符串

所以我推荐Opera用户JS用户的工作方法.与作者所说的不同:

它不适用于Firefox或Opera; 仅适用于IE,Chrome和Safari.

它可以在Opera 11中运行.至少在用户JS脚本中.太糟糕了,我不能评论个别答案或提出答案,我会马上做.如果可能,有特权的人请为我做.



15> mikemaccana..:

2015年更新:现在已经六年了:大多数人使用模块加载器,主模块系统都有加载模板的方法.它不是内联的,但最常见的多行字符串类型是模板,并且模板通常应该保留在JS之外.

require.js:'require text'.

使用require.js'text'插件,在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');

简单.



16> seo..:

如果您愿意使用转义换行符,可以很好地使用它们. 它看起来像带有页面边框的文档.

在此输入图像描述


这不会添加多余的空格吗?

17> 小智..:

这适用于IE,Safari,Chrome和Firefox:



考虑一下.你认为它有效吗?你不觉得它会导致显示问题吗?
为什么选票呢?这是一个创造性的答案,如果不是很实用!
不,这不对.应该使用模板:$ .tmpl()(http://api.jquery.com/tmpl/)或EJS(http://embeddedjs.com/getting_started.html)等.downvotes的一个原因是它真的远离有效的代码,使用它可能会导致巨大的显示问题.

18> pocheptsov..:

我对/sf/ask/17360801/的扩展.它希望以/*! 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() { /*!
 
*/}.extractComment();



19> Lonnie Best..:

javascript中的等价物是:

var text = `
This
Is
A
Multiline
String
`;

这是规范.请参阅本页底部的浏览器支持.这里有一些例子.



20> Stefan Steig..:

您可以使用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()'

如果你有很多遗留代码,你也可以在TypeScript中使用普通的JavaScript变体(用于清理):

interface externTemplates
{
    myString:string;
}

declare var templates:externTemplates;

alert(templates.myString)

并且您可以使用普通JavaScript变体中的多行字符串对象,您可以将模板放入另一个文件(可以在捆绑包中合并).

您可以在http://www.typescriptlang.org/Playground上尝试TypeScript



21> earl3s..:

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



22> jenil christ..:

ES6的实现方式是使用模板文字:

const str = `This 

is 

a

multiline text`; 

console.log(str);

在这里更多参考

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有