哪些字符可以用来命名JavaScript变量?
我想为工作中的非javascript用户创建一个小型的“扩展库”(当涉及到这种语言时,他们似乎都很拘谨)。我喜欢jQuery和Prototype都使用$ dollar符号,因为我使用jQuery,所以我正在寻找另一个很好的单字符符号来使用。
我意识到我可以只测试一些字符,但我希望缩小字符列表的范围(考虑到未来可能与另一个流行库集成)。
哪些字符可以用来命名JavaScript变量?
我想为工作中的非javascript用户创建一个小型的“扩展库”(当涉及到这种语言时,他们似乎都很拘谨)。我喜欢jQuery和Prototype都使用$ dollar符号,因为我使用jQuery,所以我正在寻找另一个很好的单字符符号来使用。
我意识到我可以只测试一些字符,但我希望缩小字符列表的范围(考虑到未来可能与另一个流行库集成)。
当前回答
基本上,以正则表达式形式:[a-zA-Z_$][0-9a-zA-Z_$]*。换句话说,第一个字符可以是字母、_或$,其他字符可以是字母、_、$或数字。
注意:虽然其他回答指出可以在JavaScript标识符中使用Unicode字符,但实际的问题是“我应该使用什么字符作为像jQuery这样的扩展库的名称?”这就是那个问题的答案。您可以在标识符中使用Unicode字符,但不要这样做。编码总是被搞砸。将公共标识符保持在32-126 ASCII范围内,这样比较安全。
其他回答
我写了一个小故障工作空间,迭代所有的代码点,并在eval('var ' + String.fromCodePoint(#) + ' = 1')工作时发出字符。
它一直在继续,继续,继续....
JavaScript 1.5之前:^[a-zA-Z_$][0-9a-zA-Z_$]*$
在英语中:必须以美元符号、下划线或26个字符中的一个字母开头,大写或小写。后续字符(如果有)可以是这些字符中的任意一个,也可以是十进制数字。
JavaScript 1.5及以后*:^ [\ p {L} \ p{问}$ _][\ p {L} \ p{问}$ \ p {Mn} \ p {Mc} \ p{和}\ p{电脑}]*美元
这在英语中更难以表达,但它在概念上类似于旧的语法,只是字母和数字可以来自任何语言。在第一个字符之后,还允许有额外的类似下划线的字符(统称为“连接符”)和额外的字符组合标记(“修饰符”)。(其他货币符号不包括在这个扩展集。)
JavaScript 1.5及更高版本还允许Unicode转义序列,前提是结果是在上述正则表达式中允许的字符。
标识符也不能是当前的保留字,也不能是将来使用的保留字。
标识符的长度没有实际限制。(浏览器各不相同,但你可以拥有1000个字符,甚至更多数量级。)
字符类别的链接:
字母:Lu, Ll, Lt, Lm, Lo, Nl(在上述正则表达式中合并为“L”) 组合符号(“修饰语”):Mn, Mc 数字:Nd 连接器:电脑
*注意。这个Perl正则表达式仅用于描述语法——它在JavaScript中不起作用,因为JavaScript(目前)还不支持Unicode属性。(有一些第三方软件包声称添加了这种支持。)
基本上,以正则表达式形式:[a-zA-Z_$][0-9a-zA-Z_$]*。换句话说,第一个字符可以是字母、_或$,其他字符可以是字母、_、$或数字。
注意:虽然其他回答指出可以在JavaScript标识符中使用Unicode字符,但实际的问题是“我应该使用什么字符作为像jQuery这样的扩展库的名称?”这就是那个问题的答案。您可以在标识符中使用Unicode字符,但不要这样做。编码总是被搞砸。将公共标识符保持在32-126 ASCII范围内,这样比较安全。
如果正则表达式不是必须的,最好是让浏览器决定使用eval:
function isValidVarName( name ) {
try {
// Update, previoulsy it was
// eval('(function() { var ' + name + '; })()');
Function('var ' + name);
} catch( e ) {
return false;
}
return true;
}
isValidVarName('my_var'); // true
isValidVarName('1'); // false
JavaScript变量
可以用任意字母、$或_字符作为变量的开头。只要不是以数字开头,你也可以包含数字。
开始:[a-z], $, _
包含:[a-z], [0-9], $, _
jQuery
你可以在你的库中使用_,这样它就可以和jQuery并肩作战了。但是,可以设置一个配置,使jQuery不使用$。它将使用jQuery。要做到这一点,只需设置:
jQuery.noConflict();
本页解释了如何做到这一点。