评论在所有主要环境中都是 100% 安全的吗?

Posted

技术标签:

【中文标题】评论在所有主要环境中都是 100% 安全的吗?【英文标题】:Are comments 100% safe on all the major environments? 【发布时间】:2012-09-21 11:03:30 【问题描述】:

cmets 是在解析之前从源代码中直接剥离出来的,还是可以算作换行符并在某些上下文中破坏连续性?

'foo'.replace(/f/, 'b') //f->b
     .replace(/o/, 'a') //o->a
     .replace(/o/, 'r') /*o->r*/ ;

'foo'.replace(/x/, /*matches "x"*/ 'y');

var foo = ( true !== false ) ? // bikeshed
          'bar' : /*if they're equal, which they won't be, we'll want 'baz'*/ 'baz';

你知道,因为他们说空格是“安全的”和“微不足道的”或其他什么,但我们都知道有例外。 cmets 真的安全吗?

【问题讨论】:

我猜是这样,除非您使用的编译器/解析器中存在解析错误.. 史诗般的问题,这意味着它以前被问过。有吗? 无论 SO Markdown 语法高亮器在做什么,都会发生什么 @qwertymk WTF 你是基于这个吗? 另见this thread 【参考方案1】:

它们在解析期间被忽略,如果它们在解析之前被剥离,解析器将需要扫描输入两次。

但是,不考虑行尾的 LineTerminator 成为单行注释的一部分;它被单独识别 词汇语法并成为输入元素流的一部分 为句法文法。这一点非常重要,因为它 意味着单行 cmets 的存在与否不 影响自动分号插入的过程

ES5 Specification for comments.

源代码被标记化,就好像 cmets 不存在一样。

【讨论】:

abc/* A comment */def 是一个标识符 (abcdef) 还是两个(abc 后跟 def)? 好问题,@j_random_hacker @alex,他不关心规范,显然他只对浏览器的实现感兴趣。 @adlwalrus 是的,\n 是为了 ASI 的规则而保留的。 @adlwalrus:谢谢,不过如果 javascript 与 C++ 类似,那么依靠解释器/编译器来“正确处理”是自找麻烦 :) 在 C++ 中,规则是 cmets 变成单个空格.类似的极端案例是x+/* Comment */+;【参考方案2】:

是的,cmets 是安全的。

(话虽如此,我已经看到一些损坏的服务器端 html 压缩器,它们不知道内联 JavaScript 是什么,并删除了所有换行符。以 // 开头的注释将整个脚本删除。 )

【讨论】:

如果你能引用任何来源,我会在 10 分钟内接受这个。 @adlwalrus,我的消息来源是,15 年来,我还没有看到浏览器搞砸了 JavaScript cmets。如果你不想相信它,那很好。无论如何,亚历克斯的答案是一个更好的答案,有他的解释。 @adlwalrus,如果你想要规格:ecma-international.org/ecma-262/5.1/#sec-7.4 在我的书中这是一个非常好的来源,我 100% 愿意相信它。我只是想知道你的依据是什么。 对我如此谦虚以至于建议我接受其他人表示赞同。我想在 29.3k 代表时,积分短缺早已不再是挫折的根源,而且琐碎消失了? :P 另外,为规范链接升级。

以上是关于评论在所有主要环境中都是 100% 安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章

在.net 中编译成.exe 的评论?

分布式爬虫-bilibili评论

MongoDB 在评论中台的实践

腾讯新闻评论都是 NaN-NaN-NaN NaN:NaN 是啥问题啊? 和IE9有关系吗?

企业内部安全宣贯:乌云网停摆事件的思考与评论

从 WordPress 中删除所有评论数据