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