Javascript Google闭包编译器如何处理引号(字符串文字)?

Javascript Google闭包编译器如何处理引号(字符串文字)?,javascript,quotes,options,google-closure-compiler,Javascript,Quotes,Options,Google Closure Compiler,“Google闭包编译器如何处理引号(字符串文字)?”这一问题也可以重新表述为: 为什么闭包用双引号替换/交换单引号 闭包如何决定使用哪种报价格式/样式 (如何)更改此(默认)行为 注1:这个问题不是关于为什么闭包(或其他一些迷你们)选择使用双引号(如所问和所述) 注2:这个问题不是关于单引号和双引号的讨论,但是一些理解GCC对我们的代码做了什么(以及为什么)是非常有用的 经常有人说(或问为什么)谷歌闭包编译器(GCC)用双引号替换单引号(即使编译级别设置为仅空格): 示例xmp_1.js:

“Google闭包编译器如何处理引号(字符串文字)?”这一问题也可以重新表述为:

  • 为什么闭包用双引号替换/交换单引号
  • 闭包如何决定使用哪种报价格式/样式
  • (如何)更改此(默认)行为
注1:这个问题不是关于为什么闭包(或其他一些迷你们)选择使用双引号(如所问和所述)

注2:这个问题不是关于单引号和双引号的讨论,但是一些理解GCC对我们的代码做了什么(以及为什么)是非常有用的

经常有人说(或问为什么)谷歌闭包编译器(GCC)用双引号替换单引号(即使
编译级别设置为
仅空格
):

示例xmp_1.js:

alert('Hello world!');           // output: alert("Hello world!");
然而。。。这只是“真相”的一半,因为:

示例xmp_2.js:

alert('Hello "world"!');         // output: alert('Hello "world"!');
                                 //  *NOT*: alert("Hello \"world\"!");
GCC本质上是一个从“原始javascript”到“更小(更高效)javascript”的翻译器:因此它不会“盲目地”用双引号替换单引号,而是尝试选择一个“最佳引号字符”(毕竟……主要目标之一是“缩小”脚本)

从源代码()可以了解到:

如果字符串包含的单引号多于双引号,则 编译器将使用双引号包装字符串,反之亦然。
如果字符串不包含引号或相等数量的单引号和双引号 双引号,然后编译器将默认使用双引号

如以下示例xmp_3.js:

alert('Hello "w\'orld"!');       // output: alert('Hello "w\'orld"!');
alert('Hello "w\'o\'rld"!');     //         alert("Hello \"w'o'rld\"!");
请注意,上面的xmp_3是如何产生一个“混合”输出的,该输出同时使用
作为外部引号:最佳选择后跟默认值(当它不重要时)

如何将默认双引号更改/覆盖为单引号? 事实证明,在现实世界中存在一些严重的合法案例,违约单报价会更好。如上文(2012年10月8日起)所述:

《金融时报》网站应用程序(app.FT.com)和《经济学人》Playbook应用程序交付 通过以下方式将JavaScript更新到客户端以及其他资源 将它们作为JSON编码对象的一部分传输 以本机方式引用,因此编译的JavaScript中的所有双引号 需要转义。这会使FT web应用程序的JS大小膨胀 传输大型更新时,大约20kB

该问题的报告者带来了一个礼物:一个补丁添加了选项
preference\u single\u quotes
,将默认引号字符从双引号更改为单引号

这个问题得到了足够的重视,项目成员桑托斯考虑将默认的双引号更改为单引号('并查看是否有人投诉')…两次(也是在报告者/补丁贡献者声明他将其作为一个选项来实现,这样它就不会产生任何向后兼容性的后果,因为“有人可能因为某种奇怪的原因依赖于使用双引号输出的字符串”)

然而,大约一周后,该修补程序被接受(r2258),另一周后进行了返工(r2257),2012年10月30日,桑托斯报告说,该选项现在可以启用:
--格式化=单引号

(除了
格式设置
-键的
漂亮打印
打印输入
分隔符之外,还有第三个选项)。
(注意:在当前的源代码中,我们仍然可以找到许多对“preference\u single\u quotes”的引用。)

用法:
如果您(下载并)使用(本地java)应用程序:

java-jar compiler.jar--js xmp_1.js--格式化单引号
您将看到:
alert('Hello world!');
现在编译为
alert('Hello world!');

但是,在编写本文时,位于的编译器服务API和UI(很可能使用API)不接受第三个(新的,尽管存在一年)格式选项:
单引号
,并将抛出错误:
17:未知格式选项单引号。

在(再次)挖掘源代码之后,似乎(我不是Java专家)这是因为只接受较旧的
PRETTY\u PRINT
PRINT\u输入分隔符

 * All the possible values for the FORMATTING key.
 */
public static enum FormattingKey implements ProtocolEnum {
  PRETTY_PRINT("pretty_print"),
  PRINT_INPUT_DELIMITER("print_input_delimiter"),
  ;
如果此选项在API和/或UI中可用,我将更新此答案

希望这能帮助并节省一些时间,因为谷歌能找到的关于
单引号的唯一文档和参考资料目前在这一期836和源代码中的一些评论中。现在它有了一些解释(在我期待的地方)