哪些字符对JavaScript变量名称有效?


557

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

我想为我在这里工作的非JavaScript用户创建一个小的“扩展库”(在语言方面,他们似乎都显得有些懈怠)。我喜欢jQuery和Prototype都使用$美元符号,并且由于我使用jQuery,因此我正在寻找另一个好用的单字符符号。

我意识到我可以测试一些字符,但是我希望缩小我的字符列表以作为开始(考虑到将来可能与另一个流行的库集成)。


44
没有。Unicode字母是可以接受的。例如,尝试π。
2011年

14
尽管在变量名中可以接受unicode字母,但是在代码中使用unicode可能会出现问题。如果没有它们,我建议不要以变量名使用它们。
加里·韦弗

F#是有效的变量名吗?我正在建立一个小型的功能性JavaScript库,并且希望使用F#作为其模块名称。典型的函数调用如下所示:F#.partial(fn,... presetArgs);
朱尔斯·曼森

@JulesManson否,因为英镑符号保留用于其他用途。
艾丹·洛夫莱斯

@JulesManson顺便说一句,Microsoft已经从.NET中使用了F#这个名字
Luke the Geek,

Answers:


986

为了引用有效的JavaScript变量名称,我在本文中总结了相关规范部分:

标识符必须以$_或Unicode类别中的“大写字母(Lu)”“小写字母(Ll)”“小写字母(Lt)”“修饰符(Lm)”“其他字母( Lo)”“字母数字(Nl)”

字符串的其余部分可以包含相同的字符,以及任何U + 200C零宽度非连接符,U + 200D零宽度连接符以及Unicode类别“非间距标记(Mn)”“间距合并中的字符标记(Mc)”“小数位数(Nd)”“连接器标点(Pc)”

我还创建了一个工具该工具将告诉您根据ECMAScript 5.1和Unicode 6.1输入的任何字符串是否是有效的JavaScript变量名称:

JavaScript变量名称验证器


附注:为了让您了解Anthony Mills的答案有多错误:如果您要在一个JavaScript的仅ASCII正则表达式中总结所有这些规则,则它将为11,236个字符长。这里是:

// ES5.1 / Unicode 6.1
/^(?!(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$)[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc0-9\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19b0-\u19c0\u19c8\u19c9\u19d0-\u19d9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f]*$/

31
我会给您功劳,您花了很长时间才产生这个。
理查德·克莱顿


2
该死的,所以我不能变得聪明,不能¢用来补充$……哦,好吧……)-:
hippietrail

3
是真的(一个很棒的答案)。但是,这并不正确:通过使用外观相似但实际上不同的字母(或使用非unicode环境无法使用的字母)来混淆代码是错误的,imo。它无助于编码,而是可以创建许多错误。唯一的好处是:它将使人们(痛苦地)意识到某些代码使用Unicode的可能性(并且痛苦地意识到Unicode及其不同的表示形式)...关于Unicode:joelonsoftware.com/articles/Unicode.html
Olivier Dulac

4
@ n2liquid-GuilhermeVieira仅当您假设所有JavaScript引擎都100%符合规范时,情况并非总是如此-可以肯定的是,当我进行这项研究时。我链接到的博客文章提到了我提交和修补的所有浏览器/引擎错误。
Mathias Bynens 2014年

117

根据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)

仅此一项就说明了一些疯狂的可能性-可行的例子。如果它不能在所有浏览器中都起作用,则将其称为错误,原因应该是。

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

1
您能否将示例行复制到当前缺少JavaScript示例的此Rosetta Code页面
Walter Tross 2014年

73

基本上,在正则表达式形式:[a-zA-Z_$][0-9a-zA-Z_$]*。换句话说,第一个字符可以是字母或_或$,其他字符可以是字母或_或$或数字。

注意:尽管其他答案都指出您可以在JavaScript标识符中使用Unicode字符,但实际的问题是“在扩展库(如jQuery)的名称中应使用哪些字符?” 这是该问题的答案。您可以在标识符中使用Unicode字符,但不要这样做。编码一直被搞砸。将您的公共标识符保持在安全的32-126 ASCII范围内。


71
我可能打算暗杀一个在标签名称中使用Unicode字符的联合开发人员。/具有讽刺意味的演讲
埃里克·雷彭

12
romkyns,我认为“ Unicode:字符标识符名称”不会包含在“ JavaScript:The Good Parts”中,因此,我更喜欢忽略它们的存在。但是,为了您的利益,我在回答中添加了免责声明。
安东尼•米尔斯

11
关于编码:请你的字符串文字使用非ASCII字符,至少。我们必须消除所有愚蠢的软件,这些软件会“一直扭曲”编码。只需输入Console.WriteLine("привет")C#并使其实际工作真是太幸福了!
罗曼·斯塔科夫

14
看,@ Timwi,尤其是当您在编写库时(正如Richard所说的那样),这是一种不强迫您的用户陷入Alt-blah垃圾或复制粘贴状态的方法。另外,对于您自己的东西,当您遇到浏览器或代理服务器错误或其他问题时出现的烦恼可能会很好,但是让您的库用户处理这些东西并不酷。一个好的答案不仅可以解决眼前的问题,还可以回答“我该怎么办”。是的,我想帮助别人。除非我说“哦,不要这样做”,否则我不会包括无用和危险的信息。
安东尼·米尔斯

37
@Tchalvak对于只在使用的代码,使用Ʒ作为主库名称可能很好。(哦,您以为那是3?对不起,它实际上是U + 01B7拉丁大写字母Ezh!还是З,西里尔大写字母Ze?)如果您要编写一个可能被其他人使用的库,不过,最好还是坚持使用ASCII。
Anthony Mills

18

在JavaScript 1.5之前: ^[a-zA-Z_$][0-9a-zA-Z_$]*$

英文:必须以美元符号,下划线或26个字符的字母中的一个字母(大写或小写)开头。后续字符(如果有)可以是其中任何一个或十进制数字。

JavaScript 1.5及更高版本*^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$

这用英语很难表达,但是在概念上与旧语法相似,并且字母和数字可以来自任何语言。在第一个字符之后,还允许使用其他类似下划线的字符(统称为“连接器”)和其他字符组合标记(“修饰符”)。(其他货币符号不包括在此扩展集中。)

JavaScript 1.5和更高版本还允许Unicode转义序列,条件是结果是上述正则表达式中允许的字符。

标识符也不能是当前的保留字,也不能是考虑将来使用的字。

标识符的长度没有实际限制。(浏览器各不相同,但您可以放心地拥有1000个字符,而且数量级可能会更多。)

链接到角色类别:

  • 字母:LuLlLtLmLoNl
    (在上面的正则表达式中组合为“ L”)
  • 组合标记(“修饰语”):MnMc
  • 位数:Nd
  • 连接器:PC

* nb 此Perl正则表达式仅用于描述语法-在JavaScript中不起作用,JavaScript还(尚未)包括对Unicode属性的支持。(有些第三方软件包声称添加了这种支持。)


我似乎无法使此正则表达式真正起作用。"test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null即使“测试”是有效的JS变量名
David Murdoch'2

抱歉,JavaScript不支持此正则表达式。我添加了注释以澄清。
danorton '02

5
应该注意的是,您的第二个正则表达式有一些误报。标识符名称不允许使用补充Unicode字符(例如,在[Lo]类别中列出的U + 2F800 CJ​​K兼容性Ideograph),因为JavaScript会将它们解释为两个单独的替代半部(例如),与任何允许的Unicode不匹配类别。但是,您的正则表达式将允许这样的字符。此外,缺少U + 200C和U + 200D。\uD87E\uDC00
Mathias Bynens 2012年

1
ES6使用明确为此目的而使用的字符类(在编程中使用)正式定义了有效的标识符-不确定以前是否是这样-意味着,如果不考虑保留字,则可以使此regex更具可读性-或至少如果不是因为Unicode转义序列现在在标识符中也是有效的事实的话!根据ES6规范,这是完全正确的:(?:[\ p {ID_Start} \ $ _] | \\ u(?:[\ dA-Fa-f] {4} | \ {[\ dA-Fa-f ] + \})))([\ p {ID_Continue} \ $ _ \ u200C \ u200D] | \\ u(?:[\ dA-Fa-f] {4} | \ {[\ dA-Fa-f] + \}))*
分号

14

实际上,ECMAScript在第15页上说:标识符可以以$,下划线或UnicodeLetter开头,然后继续(恰好在其下)指定UnicodeLetter可以是Unicode分类中的任何字符,Lo,Ll。 ,Lu,Lt,Lm和Nl。当您查找这些类别时,您会发现这不仅提供了拉丁字母,而且还提供了更多的可能性。只需在Google中搜索“ unicode类别”,即可找到它们。


搜寻

13

Javascript变量

您可以以任何字母$、、或_字符开头的变量。只要它不是以数字开头,就可以包含数字。

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

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

jQuery的

您可以_为您的库使用它,使其与jQuery并存。但是,您可以设置一个配置,以使jQuery不使用$。它将改为使用jQuery。为此,只需设置:

jQuery.noConflict();

此页面说明了如何执行此操作。


这是绝对正确的,但是我给了安东尼(Anthony)答案,他在您之前回答了.02123413124毫秒。抱歉。
理查德·克莱顿

8
@Richard:不,这不是绝对正确的。请参阅@Yuvalik和@Anurag的答案。
蒂姆·

@EndangeredMassa为什么使用变量“ _name”?为什么不只是名字?
Tomasz Waszczyk

9

据我所知,可接受的答案将排除许多有效的标识符。这是我按照规范编写的正则表达式(请参阅有关标识符的第7.6章)。使用RegexBuddy创建了它,您可以在http://samples.geekality.net/js-identifiers找到说明的导出。

^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*+$

此外,名称不能是以下保留字之一。

中断,执行,instanceof,typeof,case,其他,new,var,catch,finally,return,void,continue,for,switch,while,debugger,function,this,with,default,if,throw,delete,in,尝试,类,枚举,扩展,超级,常量,导出,导入,实现,让,私有,公共,收益,接口,包,受保护,静态,null,true,false


此正则表达式不是有效的JS正则表达式。我认为您的意思是:^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$。现在即使进行了更正,我似乎也无法使此正则表达式真正起作用。"test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null即使“ test”是有效的JS变量名
David Murdoch'2

不,我很确定我的意思是我写的:)据我了解,这个问题只是询问什么是有效的javascript函数名称,而不是特定javascript的正则表达式。我在RegexBuddy中创建了它,并在链接到的示例页面上的PHP中使用了它。效果很好,也test被接受。
Svish 2012年

3
@DavidMurdoch我编写了一个11335个字符的JavaScript兼容正则表达式,可用于验证标识符(又称变量名)。看我的回答
Mathias Bynens'2

3
@Svish应该注意的是,您的正则表达式有一些误报。标识符名称不允许使用补充Unicode字符(例如,在[Lo]类别中列出的U + 2F800 CJ​​K兼容性Ideograph),因为JavaScript会将它们解释为两个单独的替代半部(例如),与任何允许的Unicode不匹配类别。但是,您的正则表达式将允许这样的字符。\uD87E\uDC00
Mathias Bynens 2012年

2
@Svish好耶,自己写出来的范围,像我一样:)注意,你的正则表达式也没有考虑evalargumentsNaNInfinityundefined边缘情况
Mathias Bynens 2012年

6

Javascript变量可以包含字母,数字,美元符号($)和下划线(_)。他们不能以数字开头。

通常库使用$,并_作为功能快捷键,你将使用随处可见。尽管名称$_没什么意义,但是它们对于缩短名称很有用,并且由于您将在各处使用该函数,因此您应该知道它们的含义。

如果您的库不是要在每个地方都使用一个函数,那么我建议您使用更有意义的名称,因为这些名称将帮助您和其他人理解您的代码在做什么,而不必损害源代码的优美性

例如,您可以看看很棒的DateJS库以及它允许​​的语法糖,而不需要任何符号短名称变量。

您应该首先使代码实用,并且只有在尝试使其变得漂亮之后才能使用。


4

如果不是必须要使用正则表达式,请浏览器决定使用,这会更好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

6
不,不会。xss = alert("I'm in your vars executin mah scrip's");;;;;例如不是有效的javascript变量名称。
1j01

6
xss;alert("try again");
1j01 2014年

1
尽管存在XSS攻击漏洞,但这是一个非常聪明的主意。
牙刷

@ 1j01替换name(typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )怎么样?如果是字符串,它将替换括号(在变量中绝对不允许),因此我认为执行任何操作几乎是不可能的。
royhowie 2014年

2
好吧,那就isValidVarName('aler(t')成真了。并isValidVarName('_;;;')保持真实。但是您可以在开始时检查它是否与类似项匹配,/[;,\(\)]/但是仍然可以执行,_=location="#!?"因此您可以添加=到列表中,但是仍然可以执行'_\ndelete foo'(将测试作为有效变量名通过),因此必须排除\ns和\rs,也许一些unicode换行符?但是`$`不是有效的标识符,因此您必须排除所有空格...这是一场失败的战斗。我认为这是我所能与之if(/[;,\(\)=\s]/.exec(name))return!1
抗衡的

1

这是创建变量名的一个快速建议。如果您希望变量在FireFox中使用时不冲突,请不要使用变量名“ _content ”,因为浏览器已在使用此变量名。我发现这很困难,不得不在大型JavaScript应用程序中更改在变量“ _content”中使用的所有位置。


您能用一些失败的源代码来证明这一点吗?在Firefox中似乎没有任何作用。
牙刷

这是一个jsfiddle,当变量“ _content”不是“ undefined”且FireFox设置了“ _content”时,它会发出警报,该值等于“ window.content” jsfiddle.net/R2qvt/3
DanBrianWhite 2014年

1

我接受了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'));

1
甚至不要尝试。isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
2015年

1
@ 1j01,Agh,我忘记了代码注释。我希望仅通过括号的不平衡就可以阻止代码运行。一个简单的检查}应该排除了这一点。
cleong

isValidVarName("delete") === true
1j01

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.