在ECMA-262,第三版[PDF] ,第7.6( “标识符”,第26页),我们可以看到下面的注释:
美元符号仅用于在机械产生的代码中使用。
这似乎是合理的。 通常用于生成或嵌入的JavaScript举行具有特殊意义的许多语言$
,而这两种语言内的JavaScript标识符使用它会导致意外的行为 。
在“机械产生的条款”出现在2版在版1,这是不存在的。 由于5版,它再次消失,不用解释,它仍然没有从第6版的工作草案。
如果我猜的话,我认为它最初被省略,因为潜在的缺陷没有被考虑,然后在未来的版本中增加的时候很明显,这是造成问题。 我想不出一个很好的理由在第5版再次删除它,但。
是否有(从邮件列表,新闻组,或其它地方的“文件线索”),用于从所述说明书中的“机械产生的条款”的夹杂物和随后除去任何解释? 我找不到这个记录任何地方。
作为一个方面的问题,任何人都可以解释背后的基本原理包括零宽度字中的版本6草案? 这似乎是它会造成更大的麻烦,因为你看不到这些字符在所有,我想不出你会希望在一个标识符这些字符的任何原因。
更新:在“机械产生的代码”的说明最初的包容和零宽字符列入以下codewaggle的回答进行了说明。 有待回答的唯一的事情就是这个问题的主要焦点, 去除 “机械产生的代码”音符。
这里是一个开始: 主题:SC22 N2745 -在DIS 16262意见报告的处置-ECMAScript
看来,“只应被用于机械地生成的代码”增加,因为这是为JAVA规范。
D6)7.5:DOLLAR SIGN不应该在标识符列表,根据在TR 10176. 7.5应参照ISO / IEC 14652的“I18N”规范的字母和数字的定义的建议。
>>>>>>
操作:部分接受--- ECMAScript中遵循Java先例。 注释会添加$应仅用于机械生成的代码。 <<<<<
如果你想通过过去的会议纪要苦干,你可以看看这里:
ECMAScript的维基:Notes和分钟从过去的会议
关于以后的变化:
所有这一切是从邮件列表“ ES5 -讨论-的ECMAScript 3.X的讨论 ”。
ZWNJ和ZWJ的标识(是:4月ES5标准tc39-2009-025最终草案的意见)
约翰·考恩写道:
原来,Unicode的5.1做了繁重:坏消息是,提升确实是沉重的。 要允许比照字符,当且仅当它们实际上使当代利用语义差别。 即证明,Unicode的5.1说,只允许U + 200C和U + 200D,然后只在某些情况下:规则涉及知道的附近标识符字符脚本和Joining_Type性质。 在详细http://unicode.org/reports/tr31/#Layout_and_Format_Control_Characters 。
大卫 - 萨拉·霍普伍德回答:
什么是简单地添加U + 200C和U + 200D到IdentifierPart无需任何额外的上下文相关的规则下侧?
我认为,这是输入方法组合责任和程序员,以确保<ZWNJ>
和<ZWJ>
字符用作旨在标识; 是一种编程语言的语法需要做的一切都是为了让他们。
需要注意的是目标“排除尽可能多的情况下,尽可能在没有明显的区别结果”(据说出于安全原因)是不是真的适用,因为ECMAScript中不执行甚至NFC标准化。 为了不强制NFC而是相当复杂的添加到语法,如UTR#31表明,为了防止一些潜在的(但相对无害的,AFAICS)滥用<ZWNJ>
和<ZWJ>
似乎是一个集设计选择不一致对我来说。
这其中一起拉了一堆的讨论: 最后通话对格式控制字符共识。 问题
有15篇这一点,你可能会想通过这些阅读:
https://mail.mozilla.org/pipermail/es5-discuss/2009-June/thread.html#2832
艾伦夫斯 - 布洛克写道:
从五月F2F瓦尔德马手记不记录上的问题作出任何决定<ZWNJ>
和<ZWJ>
的标识符。 但是,我个人的笔记说,我需要“保持标识符和修复语法”,这也是我对我们在会议上决定的回忆。
该决定的最简单的实现是简单地添加<ZWNJ>
和<ZWJ>
作为IdentifierPart替代品。 另外,在第7.1节,指出格式控制字符可在标识符发生文本大概需要被缩小到只说<ZWNJ>
和<ZWJ>
在大约为F2F大卫-萨拉做了一个比较完整的方案(以下重复)的同时,除了解决<ZWNJ>
和<ZWJ>
还显著细化规则<BOM>
包括字符串字面量和正则表达式中排除并使其成为一个一个语法错误<BOM>
到的标识符内出现。
我不是一个Unicode的专家,但我的感觉是,大卫 - 莎拉的建议是合理的,并可能与规范中清理类Cf的最初目标是一致的。 然而,他对规则<BOM>
也似乎是他们可以实现的词法分析阶段显著复杂化。
我从F2F感觉是,达成的共识是更上面我简单的解决方案的方向( <ZWNJ>
和<ZWJ>
的标识符, <BOM>
是空格),而不是大卫-萨拉的更全面的治疗<BOM>
我需要对此有最终决定这样我就可以相应地更新草案。 基于我的F2F的回忆,我会去用“简单的解决方案”,除非有明显的共识,否则。
最后的想法?
他回复了该邮件,分为基于消息引用块:
-----原始消息-----从:在mozilla.org ES5 - 讨论 - 反弹[至mailto:在mozilla.org ES5-discuss-反弹]上发送的代表大卫 - 莎拉·霍普伍德:周四,5月28日, 2009年下午5时44分:以mozilla.org ES5-讨论主题:文法IdentifierName不允许<ZWNJ>
和<ZWJ>
约翰·考恩写道:
大卫 - 萨拉·霍普伍德scripsit:
的格式控制字符从省略<IdentifierName>
似乎只是一个监督。
-1
打破
事实上,我已经忘记了,我们已经讨论了这一点,并得出了不同的结论:
https://mail.mozilla.org/pipermail/es5-discuss/2009-April/002432.html https://mail.mozilla.org/pipermail/es5-discuss/2009-April/002435.html 。
打破
让所有的人都将导致同样的问题为使BOM。 他们中的大多数对即使在完全符合统一渲染周围的文字(尤其是拉丁脚本文本)没有明显的效果,从不介意他们裹住渲染器。 其结果是,“foobar的”和“富<Cf>
栏”看起来相同,但都没有。
每Unicode的5.1,实际上影响标识符的自然语言含义,仅仅是U + 200C ZWNJ和U + 200D ZWJ。 这些都是应该,即使在ES5标识符被认为是唯一的。 UAX#31(其通过以Unicode 5.1参考包括)指定更窄的条件,使ZWNJ和ZWJ是必不可少的; 坚持的条件是不平凡的,但最大限度地减少欺骗的机会。
考虑到风险,我不确定ZWNJ和ZWJ是否应该被允许。
打破
忘记试图尽量减少标识欺骗的安全风险。 这是不可能的,如果统一标识符都被允许。 这是许多不同的(即使是标准化的时候)的字符串看起来是一样的Unicode的固有特性。 这不是完全清楚,这是一般的编程真正的安全风险 - 而不是需要对抗的代码审查,这充分ECMAScript是从能够支持很长的路要走的情况。
什么是试图减少有用的是意外打字是不同的,但看起来是一样的标识,或者看到一个标识符,并且暂时无法可靠地重现它的机会。 这是一个可用性问题,而不是安全问题。
可用性,它可能确实是一个好方法,以允许<ZWNJ>
和<ZWJ>
但不允许其他格式控制字符。 我不是不够熟悉,需要这些字符是肯定这一点的脚本,但基于其在Unicode标准的描述似乎是合理的。
然而,在UAX#31用于限制在该上下文中描述的复杂的脚本相关的规则<ZWNJ>
和<ZWJ>
可能会发生,似乎相当过度的顶部给定防止欺骗是不可能的。 再次,看https://mail.mozilla.org/pipermail/es5-discuss/2009-April/002435.html 。
从该职位与变化相结合的提案<NEL>
<ZWSP>
和<BOM>
因为这两个影响7.1节),我们结束了这一点。
====变更部7.2: -还原添加的<NEL>
<ZWSP>
和<BOM>
到空白和到表中。
变更部分7.8.4:
DoubleStringCharacter :: SourceCharacter但不是双引号“或反斜线\或LineTerminator或<BOM>
\ EscapeSequence LineContinuation
SingleStringCharacter :: SourceCharacter但不是单引号'或反斜线\或LineTerminator或<BOM>
\ EscapeSequence LineContinuation
NonEscapeCharacter :: SourceCharacter但不EscapeCharacter或LineTerminator或<BOM>
DoubleStringCharacter的CV :: SourceCharacter但没有双引号“或反斜杠\或LineTerminator或<BOM>
是SourceCharacter字符本身
SingleStringCharacter的CV :: SourceCharacter但不是单引号'或反斜线\或LineTerminator或<BOM>
是SourceCharacter字符本身。
NonEscapeCharacter的CV :: SourceCharacter但不EscapeCharacter或LineTerminator或<BOM>
是SourceCharacter字符本身。
替换7.1节:
7.1 Unicode格式控制字符
Unicode格式控制字符(即,在Unicode字符数据库如左至右符号或右至左符号普通类“CF”的字符)是用于控制的范围内的格式控制码文字在没有更高级别的协议对于这一点,如标记语言。
<BOM>
主要是在文本的开始用于将其标记为Unicode和允许文本的编码和字节顺序的检测的格式控制字符。 <BOM>
用于此目的的字符可以有时也出现在文本的开始之后,例如作为串联文件的结果。
ECMAScript中源, <BOM>
如果他们的令牌之前或之后立即出现的字符被忽略,或连续的空白字符(7.2)的跨度内。 词法文法没有明确包括这样忽略<BOM>
字符。 它为一个语法错误<BOM>
字符到一个令牌内出现(即,如果去除<BOM>
会导致前面和后面的字符是相同的令牌的一部分)。
请注意,注释不是令牌,并且因此上述规则允许<BOM>
字符的评论内显示。 它不允许他们字符串常量或正则表达式文字(转义序列\ uFEFF应改为使用)中出现。
它允许其他格式控制字符中的源文本,以便编辑和显示是有用的。 比其他格式控制字符<BOM>
可以注释,字符串,和正则表达式文字内使用。 两个特定格式的控制字符, <ZWNJ>
和<ZWJ>
也可以在一个标识符的第一个字符之后使用。
代号单位数值名称正式名称
\ u200C零宽度非木匠<ZWNJ> \ u200D零宽度木匠<ZWJ> \ uFEFF字节顺序标记(也称为 零宽度不间断空格)<BOM>
变更部分7.6:
[...]本标准规定了特定的字符补充:美元符号($)和下划线(_)的任何地方允许在标识符。 <ZWNJ>
和<ZWJ>
在第一字符之后允许的。
变更部分7.8.5:
RegularExpressionNonTerminator :: SourceCharacter但不LineTerminator或<BOM>
更改附件A: - 更新所有生产上述改变。
更改附件E: - 增加了条目7.1节:字符标记之间和意见被忽略,但令牌(包括串并正则表达式文字)中是不允许的。 <ZWNJ>
和<ZWJ>
是标识符内显著而不是被剥离。
-大卫-莎拉·霍普伍德⚥ http://davidsarah.livejournal.com
在mozilla.org ES5-讨论邮件列表ES5,讨论https://mail.mozilla.org/listinfo/es5-discuss
我不打算尝试齐心协力这一切,给你一个简洁的答案,也许别人会和你能接受的答案,看看这个为出发点。
最后一个环节:
2009年8月存档的初稿,并发布候选ES5 1所讨论。
文章来源: Why is the dollar sign no longer “intended for use only in mechanically generated code?”