如何在node.js中执行多行字符串?


128

随着node.js的兴起,JavaScript中越来越需要多行字符串。

  1. 即使在浏览器中不起作用,在Node.JS中是否有一种特殊的方法可以做到这一点?
  2. 是否有我可以支持的计划或至少有功能要求?

我已经知道您可以\n\在每一行的末尾使用,这不是我想要的。


1
为什么到底需要插入强行收益?DOM中什么都不支持(“ pre”除外),所有其他常见的返回类型都不在乎。
jcolebrand

因此,我不会在左边没有选项卡而在右边没有收益。我喜欢两者都没有。现在,我正在使用它print( '<div>')来打印HTML。它既没有制表符,也没有返回“整洁”的返回值,但是使用Perl <<EOF..EOF样式的字符串或Java样式的JSP文件会更容易。无论如何,我确实需要能够在多行字符串中输入变量。我暂时不会这样做。
Bryan Field,

9
@jcolebrand:Node.JS主要不涉及DOM操作。这是一个完整的应用程序开发环境。请参阅nodejs.org
Roy Tinker

@RoyTinker是的,但他当时调出了浏览器,最重要的是,他调出了非\n实现,所以……那只不过是浏览器。
jcolebrand

@GeorgeBailey如果您仍然使用堆栈溢出,是否可以在此处修复正确的答案?
mikemaccana

Answers:


164

节点v4和节点的当前版本

从ES6(以及大于v4的Node版本)开始,向Javascript添加了新的“模板文字”固有类型(以反引号“`”表示),该固有类型也可用于构造多行字符串,例如:

`this is a 
single string`

结果为:'this is a\nsingle string'

请注意,在第一行的末尾的换行符包括在生成的字符串英寸

添加了模板文字,以允许程序员构造字符串,而无需使用util.format或其他模板程序,就可以将值或代码直接注入到字符串文字中,如下所示:

let num=10;

console.log(`the result of ${num} plus ${num} is ${num + num}.`);

它将显示“ 10加10的结果为20”。到控制台。

旧版本的节点

较旧版本的节点可以使用“行连续”字符,使您可以编写多行字符串,例如:

'this is a \
single string'

结果为:'this is a single string'

请注意,第一行末尾的换行符包含在结果字符串中。


我想我最终将使用stackoverflow.com/questions/805107/…。我可以扩展它,以便可以使用变量。肯定会很有创意!但是因为这是Node.JS,所以我不必担心浏览器的兼容性,就我而言,甚至不必担心版本兼容性。
布赖恩·菲尔德

6
“ Javascript不支持多行字符串...”从ES5开始,它就在V8(Google的JavaScript引擎)中,因此大概在NodeJS(使用V8)中。参见LineContinuation在[节7.8.4] *(es5.github.com/#x7.8.4)。工具支持可能会略有一段时间。
TJ Crowder 2012年

它在io.js中,但还没有Node.JS-我添加了一个包含更多链接的答案
Simon D

1
现在,Node 4.0+内部支持多行字符串。
罗布·赖斯

46

多行字符串是JavaScript(自ES6起)的最新组成部分,在node.js v4.0.0及更高版本中受支持。

var text = `Lorem ipsum dolor 
sit amet, consectetur 
adipisicing 
elit.  `;

console.log(text);

2
这个答案应该立即投票给最高!有关模板字符串的详细信息,请参见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
user3413723 2015年

2
可能要注意,你可以很容易地通过添加模板内$ {} variablehere添加语法变量(``蜱)
约瑟夫Astrahan

40

当您指的是多行字符串时,您到底在寻找什么。

您是否正在寻找类似的东西:

var str = "Some \
    String \
    Here";

哪个会打印为“ Some String Here”?

如果是这样,请记住上面的是有效的Javascript,但这不是:

var str = "Some \ 
    String \
    Here";

有什么不同?空格后\。祝您调试愉快。


很好地支持了这一点。它不会让我在\后面显示空格而不在其中放置一个字符。
jcolebrand

1
@jcolebrand:是的,不是很有趣吗?:P
罗伯特·罗伯特(Robert


1
这是一个肮脏的hack。请不!
雷诺斯2011年

1
感谢@Robert,'\'洞察力后的空格为我节省了一些时间!
gpestana

8

看一下node.js 的mstring模块。

这是一个简单的小模块,可让您在JavaScript中使用多行字符串。

只是这样做:

var M = require('mstring')

var mystring = M(function(){/*** Ontario Mining and Forestry Group ***/})

要得到

mystring === "Ontario\nMining and\nForestry\nGroup"

就是这样。

工作原理
在Node.js中,您可以调用.toString函数的方法,它将为您提供函数定义的源代码,包括所有注释。正则表达式获取注释的内容。

是的,这是黑客。受到多米尼克·塔尔Dominic Tarr)抛弃式评论的启发。


注意:该模块(自2012/13/11起)在结束之前不允许使用空格***/,因此您需要自己修改它。


1
或使用包含空格修复程序的mstring分支。谢谢!github.com/davidmurdoch/mstring
Druska

6

除了人们在这里发布的内容外,我听说串联可以比加入现代javascript vm快得多。含义:

var a = 
[ "hey man, this is on a line",
  "and this is on another",
  "and this is on a third"
].join('\n');

会慢于:

var a = "hey man, this is on a line\n" + 
        "and this is on another\n" +
        "and this is on a third";    

在某些情况下。http://jsperf.com/string-concat-versus-array-join/3

另外,我发现这是Coffeescript中更具吸引力的功能之一。是的,是的,我知道,仇恨者会讨厌。

html = '''
       <strong>
         cup of coffeescript
       </strong>
       '''

对于html片段特别好。我并不是说使用它是有原因的,但是我希望它能落在ecma领域:-(。

乔希


1
对我而言,CoffeeScript唯一的问题是我上次检查的Groovy也是同样的问题。当一个文件被从转换.coffee.js时,行号错杂。我没有尝试过CoffeeScript,但是当我尝试Groovy时,发现没有获取生成的.java文件很难调试。
布莱恩·菲尔德

我已经在咖啡方面写了一些相当大的项目。您最终不得不查看编译后的代码。但是,它很容易阅读。imo中,尽管在其中编写了几个大型项目(zombie.js,pow,riak-js),但在节点社区中仍然存在不可接受的带有Coffeescript的污名。我目前正在移植我的一些较小的OSS,因为人们说“哦,咖啡,讨厌”并立即继续前进,尽管事实上您不必使用咖啡即可使用库。
乔什

我讨厌Coffeescript。:P但是,我绝对是'''字符串块的粉丝!或者... PHP heredoc语法。
BMiner 2011年

在大多数情况下,数组模式(使用join('\ n'))比普通旧式字符串连接要慢。
BMiner

1
除了IE7及以下版本,这是正确的。您会注意到,我是这么说的并链接到jsperf。
乔什(Josh)



1

除了可接受的答案:

`this is a 
single string`

结果为:“这是\ ns单个字符串”。

如果要使用字符串插值但没有换行,只需像普通字符串一样添加反斜杠即可:

`this is a \
single string`

=>'这是一个字符串'。

请记住,手动空白是必需的:

`this is a\
single string`

=>'这是单个字符串'


0

Vanilla Javascipt不支持多行字符串。这些天来,语言预处理器变得可行。

其中最流行的CoffeeScript具有此功能,但并不是最少,它是一种新语言。Google的traceur编译器以超集的形式向语言添加了新功能,但我不认为多行字符串是其中的新增功能之一。

我正在寻找一个最小的javascript超集,它支持多行字符串和几个其他功能。我在写咖啡脚本的初始编译器之前就开始使用这种小语言了。我计划今年夏天完成。

如果不能选择预编译器,那么还有一个脚本标记hack,您可以在其中将多行数据存储在html的脚本标记中,但要为其指定一个自定义类型,以免被逃避。然后,在以后使用javascript时,您可以提取script标记的内容。

另外,如果在源代码中任何行的末尾加上\,则会导致换行符被忽略,就好像它不在那里一样。如果要换行,则必须以“ \ n \”结尾。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.