JavaScript 有文字字符串吗?

Posted

技术标签:

【中文标题】JavaScript 有文字字符串吗?【英文标题】:Does JavaScript have literal strings? 【发布时间】:2011-02-02 23:14:32 【问题描述】:

在C#、Ruby 和许多其他语言中,您可以将字符串表示为不需要转义。 在 C# 中是这样的

string s = @"\whatever\this\is";

打印时的结果:

\whatever\this\is

这在 javascript 中是否以任何形式支持?

【问题讨论】:

迂腐澄清:Microsoft 将此称为逐字字符串文字,而不是常规字符串文字。所以后者也是字面意思,据我所知,这并不是微软独有的。 msdn.microsoft.com/en-us/library/aa691090%28v=vs.71%29.aspx 【参考方案1】:

文字字符串可通过使用ES6 语言功能获得。 Node.js v4.x 现在支持这些以及大约 90% 的其他 ES6 添加。

Template literals (Template strings)

在 JavaScript 中,字符串字面量被称为 模板字符串。而且语法非常简单。

【讨论】:

文字字符串和模板字符串并不是一回事。文字字符串根本没有具有特殊含义的字符。模板字符串将 $ 视为特殊序列。 我认为事实上String.raw() method(它是模板文字的一部分)是最接近模板字符串的地方。 试试这个:String.raw`this is a \useless feature`:它会导致“Uncaught SyntaxError: Invalid Unicode escape sequence”。与 Python 中的 r'this is a \useless feature' 进行比较。所以模板字符串(即使是String.raw)不仅可以解释$,还可以解释\u(和其他)转义序列。问题的\whatever\this\is 恰好与String.raw 一起使用,但这仅仅是因为这三个单词中没有一个恰好以ux 开头。 :-) 所谓的“文字字符串”现在被称为“模板文字”,它们不满足原始问题中的示例,因为当我输入 `\whatever\this\is` 时,结果是“whatever hisis” (所有反斜杠都消失了,并且 t 已变成制表符)。另一个问题:JavaScript 一直有“字符串文字”的概念(意思是代码中用引号括起来的字符串),但它们不是逐字字符串文字(或标题所说的“文字字符串”)。 顺便说一句,在我在 2017 年 7 月发表较早的评论后的大约半年里,看起来像 console.log(String.raw`\whatever\this\is\a\useless\xylophone`) 这样的东西现在可以工作了(从某个时候开始 after this proposal),所以现在唯一String.raw 文字不能包含(如果您不希望它被视为特殊)是 $【参考方案2】:

我有一个解决方案;)

function literalString(regex) 
    return ('' + regex).slice(1, -1);
;

O.innerhtml = literalString(/\whatever\this\is/);
<pre id=O>

您基本上将正则表达式转换为字符串并删除第一个和最后一个字符。

【讨论】:

一个可爱的想法,但不幸的是它需要你的文字字符串是一个有效的正则表达式。 (例如,尝试形成文字字符串[a-*2,3**,在其两侧用/ 包围。)这比简单地需要双反斜杠更加繁琐。【参考方案3】:

我不知道你在说什么,但解决逃跑(等)问题的一种方法是使用 John Resig 似乎很喜欢的技巧。您在页面中包含 <script> 块,但给它们一个“类型”,如“text/plain”,以确保浏览器不会将它们交给 Javascript。然后将脚本块的文本用于您喜欢的任何内容。

<script id='a_string' type='text/plain'>
  Here is some stuff.
  There might be some \escape sequences in it.
</script>

然后你可以用$('#a_string').text()(或者getElementById,如果你不使用jQuery或类似的东西)来获取它。

编辑:以下是 John Resig 关于为什么将内容放入这样的脚本块中是个好主意的解释:

快速提示:在页面中嵌入具有未知内容类型的脚本(这里就是这种情况 - 浏览器不知道如何执行 text/html 脚本)会被浏览器和搜索忽略引擎和屏幕阅读器。它是一个完美的隐藏设备,可以将模板偷偷带入您的页面。我喜欢将这种技术用于快速而肮脏的情况,我只需要页面上的一两个小模板,并且想要一些轻巧快速的东西。

取自此页面:http://ejohn.org/blog/javascript-micro-templating/

【讨论】:

与使用 CSS 隐藏的其他随机 DOM 元素相比,这样做有什么优势?似乎它破坏了脚本元素的语义。 坦率地说,我不知道;我一直试图弄清楚这一点。我第一次遇到它是在新的 jQuery“模板”东西的示例中。我同意这看起来很奇怪,尤其是当您考虑 jQuery 在通过“html()”动态插入内容时对脚本块做了什么时。尽管如此,这是人们做的事情。我不确定 OP 试图发现或实现什么。 @Syntactic 我已经用 Resig 博客中的 sn-p 更新了答案 我认为这比使用隐藏的 来完成任务要好,因为您可以更随意地使用“”。如果模板只是一个有效的 HTML,那么请确保您可以使用 将其括起来。但是,如果模板是用某种支持条件表达式(if、try、catch)和循环(for、for in、foreach、map ...)的模板语言(车把、下划线等)编写的,那么您很快就会得到没有平衡的开始和结束标签、违反嵌套规则、具有未完成属性等的字符串 blob。 @qbolec 同意。当我在我的答案上写下评论时,我并不像现在这样了解:) 此外,jQuery 不会删除具有非 JavaScript 的显式类型属性(如“text/html”)的脚本块。 【参考方案4】:

简短回答:否

长答案:Noooooooooooooooooooooooo

【讨论】:

我已经恢复了最近完全改变这个答案的编辑,声称模板文字可以用作文字字符串。有很多原因:(1)以这种方式彻底改变答案会产生误导,(2)已经有另一个答案(由下面的伊恩·里德(Iain Reid)提出)提出模板文字,(3)正如对另一个答案的评论,模板文字是 not 文字字符串;例如,您不能将包含\useless$what is this 的字符串放在其中一个字符串中。 绝对没有理由修改这个答案 - “它出现在搜索引擎中”不是理由。 也许在你的回答中详细说明为什么模板文字字符串不能用于此。【参考方案5】:

只要您不将\x 放入字符串中,这将起作用!

var str = String.raw`\whatever\this\is`;

console.log(str);

【讨论】:

\x 不是唯一的:例如,字符串中也不能有 \u 您能详细说明一下吗?应该发生什么?【参考方案6】:

只要逃过一劫

var myCrazyString = "\\yes\\we\\have\\no\\bananas"

【讨论】:

特别要求的问题“在 javascript 中是否以任何形式支持”,并且指的是“表示 [ing] 不需要转义的字符串”。添加更多转义符与不需要转义符相反......

以上是关于JavaScript 有文字字符串吗?的主要内容,如果未能解决你的问题,请参考以下文章

UPnP 发现可以通过 Javascript 完成吗?

你可以在javascript中使用模板文字创建对象属性名称吗?

在任何情况下,由于我们有模板文字(反引号),JavaScript仍需要单引号或双引号吗?

JavaScript入门

javascript 编写

JavaScript学习笔记