模板字符串ES6防止换行


76

我有一个长字符串,使用ES6模板字符串构建,但是我希望它没有换行符:

var string = `As all string substitutions in Template Strings are JavaScript
              expressions, we can substitute a lot more than variable names.
              For example, below we can use expression interpolation to 
              embed for some readable inline math:`

console.log(string);

结果:

As all string substitutions in Template Strings are JavaScript
expressions, we can substitute a lot more than variable names.
For example, below we can use expression interpolation to
embed for some readable inline math:

我的期望:

As all string substitutions in Template Strings are JavaScript expressions, we can substitute a lot more than variable names. For example, below we can use expression interpolation to embed for some readable inline math:

14
用斜杠“ \”逃脱换行符,即使在模板字符串中,它也会在输出中消失。
dandavis '16

Answers:


102

疯了吧。

这里几乎每个答案都建议运行一个函数运行时程序,以便对格式正确的,构建时格式错误的文本进行操作。我是唯一一个对此事实感到震惊的人,尤其是对性能的影响吗?

如@dandavis所述,正式的解决方案(同时也是unix shell脚本的历史解决方案)是使用转义符来转义回车:\

`foo \
bar` === 'foo bar'

在此过程中简单,高效,正式,易读且类似于shell


1
这有效,您逃避了回程,而不是其他空间
Cyril CHAPON

1
不需要“更多的空格”或“代码缩进”。“执行此操作的方法”不执行此操作,而是遵循代码标准。您在代码编辑器中看到的常见方式(即那些自动返回到该行的方法)是不像上一行那样重新缩进,而是转到该行,就是这样(缩进0)。如果您确实要缩进,请尝试一下,HTML仍然只打印一个转义字符。如果你真的不想要就算HTML自动解析它有X协商字符,预处理用的工具,做你的代码,但请不要运行它运行时在上帝的份
西里尔CHAPON

2
没有运气。
lwdthe1年

32

一个换行符就是一个换行符...如果您手动生产它们,我非常希望您可以在运行时得到它们。

顺便说一句,我现在发现三种解决方法:

  1. 将您的IDE或代码编辑器配置为自动换行,这样就不需要在代码中添加换行符:如果每个代码语句超出配置的最大值,则编辑器会将代码分成两行或更多行字符。

  2. 删除换行符String.prototype.replace

var string =`由于模板字符串中的所有字符串替换都是JavaScript
表达式,我们可以用变量名代替很多东西。
例如,下面我们可以使用表达式插值
嵌入一​​些可读的嵌入式数学:`.replace(/ \ n / gm,“”);

注意:这里您正在运行函数运行时来格式化您的构建时代码,这看起来像是反模式,并且会对性能产生影响

  1. 使用串联执行以下代码换行符:
var string =`因为模板字符串中的所有字符串替换都是JavaScript`
              +表达式,我们可以用变量名称代替很多东西。
              +`例如,下面我们可以使用表达式插值来` 
              +`嵌入一些可读的嵌入式数学:`;

就我而言,我会选择#1选项。


1
第二个示例无法正常工作。线之间有很大的间隙。
jaybee

@dannyid你所说的大空白是什么意思?它包含比换行符更多的字符吗?
马蒂亚斯Fidemraizer

1
@MatíasFidemraizer,将#2复制/粘贴到控制台中,然后运行string。您得到了字符串,但在Javascriptexpressionsnames.和之间有很多空格For example,等等
。– jaybee

您可能无法在浏览器中看到它,因为浏览器通常会删除多余的空格,但实际的基础数据是不正确的。
jaybee

@dannyid哦,我知道了,顺便说一句,这是字符串本身的问题,而不是方法。无论如何,我会更新我的答案来解决问题
马蒂亚斯Fidemraizer

22

如果您拥有ES6,则可以使用标签。例如,common-tags库中的stripIndent标记

通过以下方式安装:

npm install common-tags --save

要求通过:

const stripIndent = require('common-tags/lib/stripIndent')

用于:

stripIndent`
  As all string substitutions in Template Strings are JavaScript
  expressions, we can substitute a lot more than variable names.
  For example, below we can use expression interpolation to
  embed for some readable inline math:        
`

编辑:如评论中所述,您可能需要选择:const oneLine = require('common-tags/lib/oneLine')标记以获得所需的结果。

有关上述通用标签链接以及此博客的更多信息


4
对于库+1,并提及ES6标签。但是,在这种情况下,我认为OP将需要库中的oneLine标签common-tags
兰多

2
正在运行用于代码格式化目的的运行时函数。尽管lib非常有用,但感谢您分享它;对于这个特殊的用例,他说他“使用es6模板构建字符串”,意味着构建时间。性能影响?
西里尔·夏邦

14
  • 如您的第一段代码中所示,将IDE配置为自动换行并使用模板字符串1-liner。

  • \在换行符之前使用转义文字char。

    例:

    const string = `1st line\
    2nd line\ 
    3rd line`; 
    

    但这不会使您摆脱空间对齐问题。

  • 要么将老式的ES5串联使用“ +”。

    例:

    const string = '1st line' + 
                   '2nd line' + 
                   '3rd line'; 
    
  • 将hack与模板空字符串var $ {''}一起使用:

    例:

    const string = `1st line${'' 
                   }2nd line${'' 
                   }3rd line`;
    

第一种方法更好,原因是:

  • 更少的符号(尺寸方面)
  • 没有运行时操作(性能方面)

4
这是最聪明的答案。去接受这个吧
Cyril CHAPON

12

我个人更喜欢加入数组的外观:

var string = [
  `As all string substitutions in Template Strings are JavaScript`,
  `expressions, we can substitute a lot more than variable names.`,
  `For example, below we can use expression interpolation to`,
  `embed for some readable inline math:`
].join(' ');

1
此方法也比使用串联的方法要快+,因为它只会为整个集合创建一个内部StringBuilder,而不是为每个串联创建一个内部StringBuilder(尽管这是微优化)
Vinno97 '18

2
正在运行用于代码格式化目的的运行时函数。性能影响?
西里尔·夏邦

@CyrilCHAPON的性能是否真的会阻碍用户体验,以至于该代码的可读性不佳?
Yatrix '18年

想象一下,对于10000个字符串,您有答案
Cyril CHAPON

2
用不同的方式拼写,这更像是我所指的“概念异端”,即练习本身。从概念上讲,这绝对是一种不好的做法,并且人们可以简单地学习使用正确的工具来完成正确的事情。IDE配置为“他们将其视为开发人员”,编译器和预处理器,以使构建时具有目的性,并为它们保留运行时。
西里尔·查彭

2

对于段落,您可以使用\s+正则表达式将单个空格替换为单个空格,这样它将适用于换行符和缩进。因此,根据您的情况,只需.replace(/\s+/gm, ' ')在末尾添加即可。

var string = `As all string substitutions in Template Strings are JavaScript
              expressions, we can substitute a lot more than variable names.
              For example, below we can use expression interpolation to 
              embed for some readable inline math:`.replace(/\s+/gm, ' ');

console.log(string);

0

在ES6中,我更喜欢在这里\结合使用两个最佳答案(与结合使用.replace())。将替换功能与转义字符结合使用的好处是,您可以使代码块与其余代码保持一致的格式。

/\s{2}/g 是一个正则表达式,它选择两个或多个背对背空格的任何实例。

const myMessage = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis id urna \
    ligula. Suspendisse lobortis ex ut vestibulum venenatis. Donec imperdiet ante odio, \
    nec malesuada diam tristique eget. Lorem ipsum dolor sit amet, consectetur adipiscing \
    elit. Cras in vulputate tellus.`
  .replace(/\s{2,}/g, "");

这将输出一个无中断的纯字符串。

“ Lorem ipsum dolor坐满,礼节高贵。Duisid urnaligula。Suspendisselobortis ex utvesibulumvenenatis。Donecimperdiet ante dioo,新的malesuada diam tristiqueeget。Loremipsum dolor坐席,高贵。”

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.