为什么没有 ◎ܫ◎ 和☺有效的 JavaScript 变量名称?

我注意到在Internet Explorer中(但不幸的是,在我测试的其他浏览器中没有),您可以使用一些Unicode变量名称。这让我度过了一天,我非常高兴我能像这样编写有趣的Unicode代码:

var ктоείναι草泥马 = "You dirty horse.",
    happy☺n☺mat☺p☺eia = ":)Yay!",
    ಠ_ಠ = "emoticon";

alert(ктоείναι草泥马 + happy☺n☺mat☺p☺eia + ಠ_ಠ);

但是,由于某种原因,和 不是有效的变量名。◎ܫ◎♨_♨

为什么做和工作,但是,和不工作?ಠ_ಠ草泥马◎ܫ◎♨_♨

编辑:在JSFiddle上的浏览器中进行测试。我已经在Internet Explorer 9,Chrome,Firefox和Opera中测试了它。到目前为止,它似乎只能在Internet Explorer 9中工作。(我不了解Internet Explorer 8及更低版本。让我知道它是否在另一个浏览器中工作。


答案 1

ಠ_ಠ和草泥马只包含实际字母表中使用的“字母”;也就是说,ಠ是卡纳达语字母表中的符号,草泥马由汉字组成。

◎ 和☺,但是,纯粹是符号;它们不与任何字母表相关联。

ECMAScript 标准第 7.6 章(除 Internet Explorer 之外的所有浏览器都遵循该标准)规定,标识符必须以下列之一开头。

  • 一个 Unicode 字母
  • $_
  • \后跟 unicode 转义序列。

标识符的以下字符必须是下列字符之一。

  • 开头允许的任何字符
  • 一个 Unicode 组合标记
  • 一个统一码数字
  • Unicode 连接器标点符号
  • 零宽度非细木工
  • 零宽度连接器

IE超出了标准,并且足够宽松,允许某些符号,例如☺.

一个工具可以告诉您输入的任何字符串是否是符合 ECMAScript 5.1 和 Unicode 6.1 的有效 JavaScript 变量名称。


答案 2

EcmaScript 262 第 7.6 节规定,名称必须以 $、_ 或 Unicode 字母开头,之后可能包含这些字符、Unicode 组合标记、Unicode 数字或 Unicode 连接器标点符号(以及几个特定于语言的格式控制字符)。

因此,在您的案例中,允许和不允许的标识符之间的区别可能是前导字符是否被视为“字母”。