ChatGPT解决这个技术问题 Extra ChatGPT

在 JavaScript 中创建多行字符串

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

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

K
Kelderic

更新:

ECMAScript 6 (ES6) 引入了一种新的文字类型,即 template literals。它们有很多特性,变量插值等等,但对于这个问题最重要的是,它们可以是多行的。

模板文字由反引号分隔:

var html = `
  <div>
    <span>Some HTML here</span>
  </div>
`;

(注意:我不提倡在字符串中使用 HTML)

Browser support is OK,但您可以使用 transpilers 来提高兼容性。

原始 ES5 答案:

Javascript 没有 here-document 语法。但是,您可以转义文字换行符,这很接近:

"foo \
bar"

请注意:有些浏览器会在延续时插入换行符,有些则不会。
Visual Studio 2010 似乎也被这种语法弄糊涂了。
@Nate 它在 ECMA-262 5th Edition 第 7.8.4 节中指定并称为 LineContinuation :“行终止符不能出现在字符串文字中,除非作为 LineContinuation 的一部分产生空字符序列。使行终止符成为字符串文字的字符串值的一部分的正确方法是使用转义序列,例如 \n 或 \u000A。
当浏览器不一致地对待它时,我不明白为什么你会这样做。跨多行的 "line1\n" + "line2" 具有足够的可读性,并且可以保证您的行为一致。
“浏览器支持正常”... IE11 不支持 - 不正常
D
Devin Rhode

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 = '一个相当长的英文文本字符串,一个错误消息 \ 实际上只是不断前进 - 一个错误 \ 消息Energizer 兔子腮红(直接穿过那些施瓦辛格的色调)!我在哪里?哦,是的,\你有一个错误,所有无关的空白都是\只是肉汁。祝你今天过得愉快。';每行开头的空格不能在编译时安全地去除;斜杠后的空格会导致棘手的错误;虽然大多数脚本引擎都支持这一点,但它不是 ECMAScript 的一部分。改为使用字符串连接: var myString = '一个相当长的英文文本字符串,一个错误消息' + '实际上一直在继续 - 一个错误' + '消息让 Energizer 兔子脸红(直接通过' + '那些施瓦辛格的阴影)!我在哪里?哦,是的,'+'你有一个错误,所有无关的空格都是'+'只是肉汁。祝你今天过得愉快。';


我不明白谷歌的建议。除了非常旧的浏览器之外,所有浏览器都支持反斜杠后跟换行符的方法,并且将来会继续这样做以实现向后兼容性。唯一需要避免的情况是,如果您需要确保在每行末尾添加一个且只有一个换行符(或没有换行符)(另请参阅我对已接受答案的评论)。
请注意,IE11、Firefox 31、Chrome 35 或 Safari 7 不支持模板字符串。请参阅 kangax.github.io/compat-table/es6
@MattBrowne Google 的建议已经被他们记录下来,按照原因的重要性排列:(1)每行开头的空格[在示例中,您不希望字符串中出现该空格,但它在代码中看起来更好] (2) 斜杠后的空格会导致棘手的错误 [如果您以 \ 而不是 `\` 结束一行,则很难注意到] 和 (3) 虽然大多数脚本引擎都支持这一点,但它不是 ECMAScript 的一部分[即为什么要使用非标准功能?] 请记住,它是一个样式指南,它是关于使代码易于阅读+维护+调试:不仅仅是“它工作”正确。
令人惊讶的是,经过这么多年,字符串连接仍然是最好/最安全/最合规的方式。模板文字(上面的答案)在 IE 中不起作用,转义行只是一团糟,你很快就会后悔
发现旧版本的 Android 不支持反引号的困难方式,所以如果您有一个使用 webView 的 Android 应用程序,您的反引号会导致您的应用程序无法运行!
K
KooiInc

模式 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 支持使用 template strings 跨越多行字符串:

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 注意:缩小/混淆您的代码后,这将丢失


请不要使用数组模式。在大多数情况下,它会比普通的字符串连接慢。
数组模式更具可读性,应用程序的性能损失通常可以忽略不计。正如那个性能测试所示,即使是 IE7 每秒也可以执行数万次操作。
+1 是一种优雅的替代方案,它不仅在所有浏览器中都以相同的方式工作,而且面向未来。
@KooiInc您的测试从已经创建的数组开始,这会扭曲结果。如果添加数组的初始化,直接连接会更快 jsperf.com/string-concat-without-sringbuilder/7 请参阅 stackoverflow.com/questions/51185/… 作为换行符的技巧,它可能没问题,但它肯定做的工作比它应该做的要多
@BMiner:1)“过早的优化是万恶之源” - Donald Knuth,2)“可读性”在旁观者的眼中
g
gpl

您可以在纯 JavaScript 中使用多行字符串。

该方法基于函数的序列化,即defined to be implementation-dependent。它在大多数浏览器中都可以工作(见下文),但不能保证它在将来仍然可以工作,所以不要依赖它。

使用以下功能:

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
*/});

该方法已在以下浏览器中成功测试(未提及=未测试):

即 4 - 10

Opera 9.50 - 12(不在 9- 中)

Safari 4 - 6(不在 3- 中)

铬 1 - 45

Firefox 17 - 21(不在 16- 中)

Rekonq 0.7.0 - 0.8.0

Konqueror 4.7.4 不支持

不过要小心你的缩小器。它倾向于删除评论。对于 YUI compressor,将保留以 /*! 开头的评论(就像我使用的评论一样)。

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

ES6 更新:您可以使用反引号而不是创建带有注释的函数并在注释上运行 toString。正则表达式需要更新为仅去除空格。您还可以使用字符串原型方法来执行此操作:

let foo = `
  bar loves cake
  baz loves beer
  beer loves people
`.removeIndentation()

有人应该写这个 .removeIndentation 字符串方法... ;)


什么!?创建和反编译函数以将多行注释破解为多行字符串?现在这很难看。
jsfiddle.net/fqpwf 适用于 Chrome 13 和 IE8/9,但不适用于 FF6。我不想这么说,但我喜欢它,如果它可以成为每个浏览器的有意功能(这样它就不会消失),我会使用它。
@uosɐſ:为了它是故意的,它必须在规范中;或者如此广泛使用,以至于浏览器制造商不想删除这个“意外”功能。不过感谢您的实验……尝试一些咖啡脚本。
a.toString().substring(15, a.toString().length-4) 也有效,并且不需要扫描整个字符串(尽管它很可能会扫描,并且计数无论如何都会使其再次扫描。哦,好吧.)
非常方便。我将它用于(Jasmine)单元测试,但避免将它用于生产代码。
5
5 revs, 2 users 97%

你可以这样做...

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

第一个例子很好很简单。比 \ 方法要好得多,因为我不确定浏览器如何将反斜杠作为转义字符和多行字符处理。
e4x.js 将是面向未来的良好解决方案
L
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)

这绝对是可怕的。我喜欢它(尽管您可能需要进行正则表达式匹配,因为我不确定 toString() 的空格有多精确。
该解决方案似乎不适用于Firefox,也许它是浏览器的安全功能?编辑:没关系,它仅不适用于 Firefox 版本 16。
还要提防删除评论的缩小器...:D
这就是为什么我们不能拥有美好的事物。
你可以在 javascript 领域做一些奇怪的事情。虽然老实说,你不应该使用它。
P
Peter V. Mørch

我很惊讶我没有看到这个,因为它在我测试过的任何地方都可以工作,并且对于例如模板非常有用:

<script type="bogus" id="multi">
    My
    multiline
    string
</script>
<script>
    alert($('#multi').html());
</script>

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


任何你不想将你的字符串放入单独和遥远的脚本元素的地方。
一个有效的反对!它并不完美。但是对于模板,这种分离不仅可以,甚至可以鼓励。
我更喜欢将超过 80/120 个字符的所有内容拆分为多行,恐怕这不仅仅是模板。我现在更喜欢 'line1 ' + 'line2' 语法。它也是最快的(尽管这可能与非常大的文本相媲美)。不过这是一个不错的技巧。
实际上,这是 HTML 而不是 Javascript:-/
然而,在 javascript 中获取多行字符串的任务可以通过这种方式完成
X
XXN

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

例如

<div id="UniqueID" style="display:none;">
     Strings
     On
     Multiple
     Lines
     Here
</div>

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

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

它在多行上返回我的文本。如果我打电话

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

我得到:

https://i.stack.imgur.com/vIVFc.png


谢谢你!这是我发现的唯一解决我的问题的答案,其中涉及可能包含单引号和双引号的任意组合的未知字符串,这些字符串直接插入到代码中,没有机会进行预编码。 (它来自创建 JS 的模板语言——仍然来自受信任的来源,而不是表单提交,所以它不是完全疯狂的)。
这是唯一对我有用的从 Java 字符串创建多行 javascript 字符串变量的方法。
如果字符串是 HTML 怎么办?
$('#UniqueID').content()
@Pacerier 我从 Google 和其他网站读到的所有内容都表示,现在 Google 确实索引 display:none 内容,这很可能是由于 JavaScript 样式前端的流行。 (例如,具有隐藏/显示功能的常见问题解答页面。)但您需要小心,因为谷歌表示如果隐藏内容似乎旨在人为地提高您的 SEO 排名,他们会惩罚您。
V
Vignesh Subramanian

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

1.斜线连接

  var MultiLine=  '1\
    2\
    3\
    4\
    5\
    6\
    7\
    8\
    9';

2. 正则连接

var MultiLine = '1'
+'2'
+'3'
+'4'
+'5';

3. Array Join 串联

var MultiLine = [
'1',
'2',
'3',
'4',
'5'
].join('');

性能方面,斜线连接(第一个)是最快的。

请参阅 this test case 了解有关性能的更多详细信息

更新:

使用 ES2015,我们可以利用其模板字符串功能。有了它,我们只需要使用反引号来创建多行字符串

例子:

 `<h1>{{title}}</h1>
  <h2>{{hero.name}} details!</h2>
  <div><label>id: </label>{{hero.id}}</div>
  <div><label>name: </label>{{hero.name}}</div>
  `

我认为这是您刚刚在页面上重复了五年的内容,但是以一种更简洁的方式。
斜线连接不会在行首包含空格吗?
j
jpfreire

使用脚本标签:

将包含多行文本的 块添加到 head 标签中;

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


我认为这种策略是干净的,而且远未得到充分利用。 jsrender 使用这个。
我将它与 innerText iso innerHTML 一起使用,但是如何确保保留空格?
如果您正在使用它们,还有 ajax 查询。您可以尝试更改您的标题 xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 我不记得除了在 JS 中输入错误的注释之外还有其他问题。没有问题的空间。
s
semente

我喜欢这种语法和缩进:

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

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


我使用它,除了我在前一行的末尾加上“+”,以明确该语句在下一行继续。不过,您的方式确实可以更均匀地排列缩进。
@Sean我也用这个,我还是喜欢把'+'放在每一个新行的开头,最后是';'在一条新线上,因为我发现它更“正确”。
将 + 放在开头可以注释掉该行,而无需在序列的第一行/最后一行时编辑其他行。
我也更喜欢前面的 +,因为在视觉上我不需要扫描到行尾就知道下一个是延续。
m
mplungjan

Downvoters:此代码仅供参考。

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

DEMO

var new_comment; /*<< : $text @ 2d ago EOF*/ // 注意这里的 script 标签被硬编码为 FIRST 标签 new_comment=document.currentScript .innerHTML.split("EOF")[1]; document.querySelector("ul").innerHTML=new_comment.replace('$text','这是一个动态创建的文本');


    这太可怕了。 +1。您可以使用 document.currentScript 代替 getElement...
    在 chrome for osx 中未定义的“你”
    jsfiddle-fixed - 我必须在我的控制台中全局定义了“你”。现在可以使用(chrome/osx)。将注释添加到 var 的好处是您不在函数上下文中,jsfiddle-function-heredoc 尽管函数对于类方法来说很酷。无论如何,将它传递给 replace { this: that } 对象可能会更好。无论如何,将疯狂的事情推向极限很有趣:)
    忘记仇恨者。这是 ES6 唯一正确的答案栏。所有其他答案都需要连接、某种计算或转义。这实际上非常酷,我将使用它作为一种向我作为爱好工作的游戏添加文档的方式。只要这个技巧不用于任何可能引发错误的事情(我可以看到有人会如何“分号,derp。让我们把评论放在下一行。”然后它会破坏你的代码。)但是,是这对我的爱好游戏来说真的很重要吗?不,我可以用这个很酷的技巧来做一些有用的事情。很好的答案。
    我从来没有足够的勇气在生产代码中使用这种技术,但我经常使用它的地方是在单元测试中,通常最容易将某些结构的值转储为(相当长的)字符串并将其与它“应该”是什么。
    m
    mightyiam

    有这个库使它很漂亮:

    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>
    */});
    

    此支持在nodejs中,在浏览器中使用必须小心。
    @HueiTan Docs 声明它也适用于浏览器。这是有道理的 - 它只是 Function.prototype.String()
    是的,但它说“虽然它在浏览器中运行良好,但主要用于 Node.js。使用风险自负。虽然它在浏览器中运行良好,但主要用于 Node.js。使用风险自负。” (小心点XD)
    @HueiTanYep 我读了那部分。但是 Function.prototype.toString() 非常稳定且众所周知。
    对我来说最好的答案,因为它至少实现了多行,中间没有所有垃圾(开头和结尾的垃圾我可以处理)。
    N
    Niv

    在这里找到了很多过度设计的答案。我认为最好的两个答案是:

    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 次。


    你为什么不只是[ "line", "line2", "line3" ].join("\n")
    L
    Lonnie Best

    javascript中的等价物是:

    var text = `
    This
    Is
    A
    Multiline
    String
    `;
    

    这是specification。请参阅此 page 底部的浏览器支持。这里也有一些examples


    s
    stillatmycomputer

    这适用于 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>
    

    考虑一下。你认为它有效吗?你不认为它会导致显示问题吗?
    为什么投反对票?这是一个创造性的答案,如果不是很实用!
    不,这不对。应该使用模板:$.tmpl() (api.jquery.com/tmpl) 或 EJS (embeddedjs.com/getting_started.html) 等。被否决的一个原因是它与有效代码相差甚远,使用它会导致巨大的显示问题。
    我希望没有人在实践中使用这个答案,但这是一个好主意
    html 中有 ' 时的边缘情况。在这种情况下,您可能必须使用 html 实体 &#39;
    C
    Community

    总而言之,我尝试了用户 javascript 编程(Opera 11.01)中列出的 2 种方法:

    这个没用:在 JavaScript 中创建多行字符串

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

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

    它不适用于 Firefox 或 Opera;仅在 IE、chrome 和 safari 上。

    它确实在 Opera 11 中工作。至少在用户 JS 脚本中。太糟糕了,我不能评论个别答案或支持答案,我会立即这样做。如果可能,请有更高权限的人为我做。


    这是我的第一个实际评论。两天前我获得了投票特权,所以我立即投票赞成我上面提到的一个答案。感谢任何支持我的微弱尝试的人。
    感谢所有真正支持这个答案的人:我现在有足够的权限发表正常评论!所以再次感谢。
    C
    Community

    我对 https://stackoverflow.com/a/15558082/80404 的扩展。它期望以 /*! 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();
    

    m
    mikemaccana

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

    require.js: '需要文本'。

    使用 require.js 'text' plugin,在 template.html 中使用多行模板

    var template = require('text!template.html')
    

    NPM/browserify:“brfs”模块

    Browserify uses a 'brfs' module 加载文本文件。这实际上会将您的模板构建到捆绑的 HTML 中。

    var fs = require("fs");
    var template = fs.readFileSync(template.html', 'utf8');
    

    简单的。


    s
    seo

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

    https://i.stack.imgur.com/e51kg.png


    这不会增加多余的空格吗?
    @tomByrer 是的,很好的观察。它只适用于您不关心空格的字符串,例如 HTML。
    K
    Kamil Kiełczewski

    精确的

    Ruby produce: "This\nIs\nA\nMultiline\nString\n" - 下面的 JS 产生完全相同的字符串

    text = `This Is A Multiline String ` // 测试 console.log(JSON.stringify(text));控制台.log(文本);

    这是对 Lonnie Best answer 的改进,因为他的答案中的换行符与 ruby 输出中的位置不完全相同


    文本是字符串为什么是 json.stringify?
    @FlatLander这仅用于测试-查看换行符\n的确切位置(与ruby输出进行比较(答案中链接的工作示例))-这是Lonnie答案的改进,因为他的答案中的换行符是与红宝石输出中的位置不完全相同
    a
    ankit bhusal

    在 JavaScript 中打印多行字符串的一种简单方法是使用由反引号 (` `) 表示的模板文字(模板字符串)。您还可以在模板字符串中使用变量(` name is ${value} `)

    你也可以

    const value = `multiline` const text = `这是js中的${value}字符串`;控制台.log(文本);


    W
    Willem van der Veen

    在 Javascrips 中创建多行字符串的最简单方法是使用反引号 ( `` )。这允许您创建多行字符串,您可以在其中使用 ${variableName} 插入变量。

    例子:

    让名称='威廉';让年龄= 26; let multilineString = ` 我的名字是:${name} 我的年龄是:${age} `; console.log(multilineString);

    兼容性:

    它是在 ES6//es2015 中引入的

    它现在得到所有主要浏览器供应商的原生支持(除了 Internet Explorer)

    Check exact compatibility in Mozilla docs here


    这现在与所有最近的浏览器兼容吗?还是有一些浏览器仍然不支持这种语法?
    抱歉我的评论太晚了,编辑了答案添加了兼容性信息;)
    j
    jenil christo

    ES6 的做法是使用模板文字:

    const str = `This 
    
    is 
    
    a
    
    multiline text`; 
    
    console.log(str);
    

    更多参考here


    这个答案不仅小,不完整和格式错误,而且绝对没有对以前的答案添加任何内容。标记它并跳到被删除。
    S
    Stefan Steiger

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


    关于 iPad/Safari 限制的任何文档? MDN 似乎认为一切都很好 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    @Campbeln:同事告诉我这个(他使用了代码)。自己没有测试过。可能还取决于 iPad/Safari 版本 - 所以可能取决于。
    e
    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


    P
    Prakash GPz

    另请注意,当在每行末尾使用正反斜杠将字符串扩展到多行时,正反斜杠之后的任何额外字符(主要是空格、制表符和错误添加的注释)都会导致意外的字符错误,我花了一个小时才找到出去

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

    P
    Pragmatiq

    出于对互联网的热爱,请使用字符串连接并选择不使用 ES6 解决方案。 ES6 并非全面支持,就像 CSS3 和某些浏览器在适应 CSS3 运动方面很慢。使用普通的 JavaScript,您的最终用户会感谢您。

    例子:

    var str = "This world is neither flat nor round. "+ "Once was lost will be found";


    虽然我同意你的观点,但我不会称 javascript “好” ol
    这个警告在 2022 年如何站得住脚?
    P
    Pedro Andrade

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

    例如:

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

    C
    Community

    我的字符串连接的基于数组的连接版本:

    var c = []; //c stands for content
    c.push("<div id='thisDiv' style='left:10px'></div>");
    c.push("<div onclick='showDo(\'something\');'></div>");
    $(body).append(c.join('\n'));
    

    这对我来说效果很好,尤其是当我经常将值插入以这种方式构造的 html 时。但它有很多限制。缩进会很好。不必处理嵌套引号会非常好,只是它的笨重困扰着我。

    添加到数组中的 .push() 是否会占用大量时间?请参阅此相关答案:

    (Is there a reason JavaScript developers don't use Array.push()?)

    在查看了这些(相反的)测试运行之后,看起来 .push() 对于不太可能增长超过 100 个项目的字符串数组很好 - 我会避免它,而支持更大数组的索引添加。