在JavaScript中创建多行字符串

3420

我有以下的 Ruby 代码。我想将这段代码转换成 JavaScript。请问在 JavaScript 中等价的代码是什么?

text = <<"HERE"
This
Is
A
Multiline
String
HERE
43个回答

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

enter image description here


3
这会不会添加无关的空格? - tomByrer
1
@tomByrer 是的,观察得很好。它只适用于您不关心空格的字符串,例如HTML。 - seo

9
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');

简单。


8
ES6的方法是使用模板字面量:
const str = `This 

is 

a

multiline text`; 

console.log(str);

更多参考请点击此处


这个回答不仅很短,不完整,格式也很差,而且对之前的回答没有任何贡献。我会标记它并希望它被删除。 - Victor Schröder

8

在JavaScript中创建多行字符串最简单的方法是使用反引号(``)。这允许您创建多行字符串,在其中可以插入变量,格式为${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文档中查看确切的兼容性


现在这个语法已经兼容所有最新的浏览器了吗?还是有一些浏览器仍然不支持这个语法? - cmpreshn
抱歉回复晚了,已编辑答案并添加兼容性信息 ;) - Willem van der Veen

7
您可以使用 TypeScript(JavaScript 超集)来支持多行字符串,并将其转换为纯 JavaScript,而无需额外开销:

您可以使用TypeScript(JavaScript超集),它支持多行字符串,可在转换回纯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变体的多行字符串对象,将模板放入另一个文件中(您可以将其合并到捆绑包中)。

您可以在以下网址尝试TypeScript:
http://www.typescriptlang.org/Playground


有关iPad/Safari限制的任何文档资料吗?MDN似乎认为一切都很好-https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/toString - Campbeln
@Campbeln:我的同事告诉我这个(他用了这段代码)。我自己还没有测试过。可能也取决于iPad/Safari的版本 - 所以可能会有所不同。 - Stefan Steiger

6

5

您可以使用标记模板来确保您获得所需的输出结果。

例如:

// 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'

4

请注意,当使用反斜杠在每行结尾处延长字符串时,如果在反斜杠后面添加了额外的字符(大多是空格、制表符和错误添加的注释),将导致意外的字符错误。我花了一个小时才找到这个问题。

var string = "line1\  // comment, space or tabs here raise error
line2";

4

带有变量的多行字符串

var x = 1
string = string + `<label class="container">
                       <p>${x}</p>
                   </label>`;

4
请为了互联网的未来使用字符串拼接,不要使用ES6的解决方案。ES6并没有得到广泛支持,就像CSS3和某些浏览器缓慢适应CSS3一样。使用普通的JavaScript吧,你的最终用户会感谢你的。
示例: var str = "这个世界既不是平坦的,也不是圆形的。"+ "曾经失落的东西将会被找回";

3
虽然我同意你的观点,但我不会称JavaScript为“好的”老语言。 - user151496
1
这个警告在2022年还有多大的意义? - Ken Ingram
最终用户有责任保持其浏览器更新。开发人员有责任以正确的方式编码并使产品更好。 - user3221512

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接