哪些字符可以用来命名JavaScript变量?

我想为工作中的非javascript用户创建一个小型的“扩展库”(当涉及到这种语言时,他们似乎都很拘谨)。我喜欢jQuery和Prototype都使用$ dollar符号,因为我使用jQuery,所以我正在寻找另一个很好的单字符符号来使用。

我意识到我可以只测试一些字符,但我希望缩小字符列表的范围(考虑到未来可能与另一个流行库集成)。


当前回答

JavaScript变量

可以用任意字母、$或_字符作为变量的开头。只要不是以数字开头,你也可以包含数字。

开始:[a-z], $, _

包含:[a-z], [0-9], $, _

jQuery

你可以在你的库中使用_,这样它就可以和jQuery并肩作战了。但是,可以设置一个配置,使jQuery不使用$。它将使用jQuery。要做到这一点,只需设置:

jQuery.noConflict();

本页解释了如何做到这一点。

其他回答

JavaScript变量

可以用任意字母、$或_字符作为变量的开头。只要不是以数字开头,你也可以包含数字。

开始:[a-z], $, _

包含:[a-z], [0-9], $, _

jQuery

你可以在你的库中使用_,这样它就可以和jQuery并肩作战了。但是,可以设置一个配置,使jQuery不使用$。它将使用jQuery。要做到这一点,只需设置:

jQuery.noConflict();

本页解释了如何做到这一点。

在ECMAScript规范第7.6节的标识符名称和标识符中,一个有效的标识符定义为:

Identifier ::
    IdentifierName but not ReservedWord

IdentifierName ::
    IdentifierStart
    IdentifierName IdentifierPart

IdentifierStart ::
    UnicodeLetter
    $
    _
    \ UnicodeEscapeSequence

IdentifierPart ::
    IdentifierStart
    UnicodeCombiningMark
    UnicodeDigit
    UnicodeConnectorPunctuation
    \ UnicodeEscapeSequence

UnicodeLetter
    any character in the Unicode categories “Uppercase letter (Lu)”, “Lowercase letter (Ll)”, “Titlecase letter (Lt)”,
    “Modifier letter (Lm)”, “Other letter (Lo)”, or “Letter number (Nl)”.

UnicodeCombiningMark
    any character in the Unicode categories “Non-spacing mark (Mn)” or “Combining spacing mark (Mc)”

UnicodeDigit
    any character in the Unicode category “Decimal number (Nd)”

UnicodeConnectorPunctuation
    any character in the Unicode category “Connector punctuation (Pc)”

UnicodeEscapeSequence
    see 7.8.4.

HexDigit :: one of
    0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

这为命名变量创造了很多机会,在高尔夫运动中也是如此。我们来举几个例子。

有效的标识符可以以UnicodeLetter、$、_或\ UnicodeEscapeSequence开头。Unicode字母是以下类别中的任何字符(请参阅所有类别):

大写字母(Lu) 小写字母(Ll) 头衔信(Lt) 修饰字母(Lm) 其他字母(Lo) 字母编号(Nl)

仅这一点就说明了一些疯狂的可能性-工作的例子。如果它不能在所有浏览器中工作,那么就称它为bug,因为它应该是bug。

var ᾩ = "something";
var ĦĔĽĻŎ = "hello";
var 〱〱〱〱 = "less than? wtf";
var जावास्क्रिप्ट = "javascript"; // OK, that's JavaScript in Hindi
var KingGeorgeⅦ = "Roman numerals, awesome!";

我采纳了Anas Nakawa的想法并加以改进。首先,没有理由实际运行被声明的函数。我们想知道它是否正确地解析,而不是代码是否工作。其次,对于我们的目的来说,文字对象是一个比var XXX更好的上下文,因为它更难摆脱。

    function isValidVarName( name ) {
    try {
        return name.indexOf('}') === -1 && eval('(function() { a = {' + name + ':1}; a.' + name + '; var ' + name + '; }); true');
    } catch( e ) {
        return false;
    }
    return true;
}

// so we can see the test code
var _eval = eval;
window.eval = function(s) {
    console.log(s);
    return _eval(s);
}

console.log(isValidVarName('name'));
console.log(isValidVarName('$name'));
console.log(isValidVarName('not a name'));
console.log(isValidVarName('a:2,b'));
console.log(isValidVarName('"a string"'));

console.log(isValidVarName('xss = alert("I\'m in your vars executin mah scrip\'s");;;;;'));
console.log(isValidVarName('_;;;'));
console.log(isValidVarName('_=location="#!?"'));

console.log(isValidVarName('ᾩ'));
console.log(isValidVarName('ĦĔĽĻŎ'));
console.log(isValidVarName('〱〱〱〱'));
console.log(isValidVarName('जावास्क्रिप्ट'));
console.log(isValidVarName('KingGeorgeⅦ'));
console.log(isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid'));
console.log(isValidVarName('if'));

如果正则表达式不是必须的,最好是让浏览器决定使用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

实际上,ECMAScript在第15页上说: 标识符可以以$、下划线或UnicodeLetter开头,然后继续(就在它下面)指定UnicodeLetter可以是Unicode类别Lo、Ll、Lu、Lt、Lm和Nl中的任何字符。 当你查阅这些分类时,你会发现它提供了比拉丁字母更多的可能性。只要在谷歌中搜索“Unicode类别”,你就可以找到它们。