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

Posted

技术标签:

【中文标题】哪些字符对 JavaScript 变量名有效?【英文标题】:What characters are valid for JavaScript variable names? 【发布时间】:2010-12-12 06:48:33 【问题描述】:

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

我想为工作中的非 JavaScript 用户创建一个小型“扩展库”(他们似乎都对语言感到不安)。我喜欢 jQuery 和 Prototype 都使用 $ 美元符号的方式,并且由于我使用 jQuery,我正在寻找另一个不错的单字符符号来使用。

我意识到我可以测试一些字符,但我希望缩小我的字符列表开始使用(考虑到未来与另一个流行库的集成,也许)。

【问题讨论】:

如果你只是在寻找替代符号,希腊字母是有效的(例如,αβγδεζηθικλμνξοπρσςτυφχψω)......或者如果你真的想搞砸你的其他开发人员,你可以选择英文字母,但使用另一种字体(例如,ABCDEFGHIJKLM NOPQRSTUVWXYZ abcdefghijklm nopqrstuvwxyz)......也有效! ?????? 【参考方案1】:

引用Valid JavaScript variable names,我总结了相关规范部分的文章:

标识符必须以$_ 或Unicode 类别“Uppercase letter (Lu)”、“Lowercase letter (Ll)”、“Titlecase letter (Lt)”、“Modifier letter (Lm)”、“Other letter (Lo)” 或“Letter number (Nl)” 中的任何字符开头。

字符串的其余部分可以包含相同的字符,以及任何 U+200C 零宽度非连接符字符、U+200D 零宽度连接符字符和字符在 Unicode 类别中 “Non-spacing mark (Mn)”、“Spacing combining mark (Mc)”、“Decimal digit number (Nd)” 或 “Connector punctuation (Pc)”。

我还创建了a tool,它会根据 ECMAScript 5.1 和 Unicode 6.1 告诉您输入的任何字符串是否是有效的 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|undefined|NaN|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]*$/

【讨论】:

@marsbear 我碰巧也写过一篇文章:mathiasbynens.be/notes/javascript-properties 还有一个工具:mothereff.in/js-properties#12e34 这是我的a relevant Stack Overflow answer。【参考方案2】:

根据7.6 Identifier Names and Identifiers 部分的 ECMAScript 规范,有效标识符定义为:

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 字母是这些类别中的任何字符 (see all categories):

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

仅此一项就说明了一些疯狂的可能性 - working examples。如果它不适用于所有浏览器,则称其为错误,因为它应该。

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

【讨论】:

能否将您的示例行复制到this Rosetta Code page,目前缺少 JavaScript 示例? 上面评论中的链接应该是“this Rosetta Code page”。 【参考方案3】:

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

注意: 虽然其他答案指出您可以在 JavaScript 标识符中使用 Unicode 字符,但实际的问题是“我应该使用哪些字符来命名像 jQuery 这样的扩展库?”这是对那个问题的回答。您可以在标识符中使用 Unicode 字符,但不要这样做。编码总是搞砸了。在安全的情况下,将您的公共标识符保持在 32-126 ASCII 范围内。

【讨论】:

我可能会密谋暗杀一个在标签名称中使用 unicode 字符的合作开发者。 /几乎没有讽刺意味的演讲 romkyns,我认为“Unicode 字符标识符名称”永远不会包含在“JavaScript: The Good Parts”中,因此,我更愿意忽略它们的存在。但是,为了您的利益,我在回答中添加了免责声明。 关于编码:请使用非ASCII字符,至少在你的字符串文字中。我们必须消除所有“一直搞砸”编码的愚蠢软件。只需在 C# 中输入 Console.WriteLine("привет")让它真正起作用,真是太幸福了! 看,@Timwi,尤其是当您编写库时(正如 Richard 所说的那样),最好不要强迫您的用户进入 Alt-blah 废话或复制粘贴。此外,对于您自己的东西,您可能会很好地处理遇到浏览器或代理服务器错误或其他问题时出现的烦恼,但是让您的库的用户处理这些东西并不酷。一个好的答案不仅仅是处理手头的问题,而是回答“我应该做什么”。所以是的,我想帮助人们。我不会包含无用和危险的信息,除非我说“哦,不要这样做。” @Tchalvak 对于您正在使用的代码,使用Ʒ 作为您的主库名称可能没问题。 (哦,你以为是 3?很抱歉,它实际上是 U+01B7 拉丁大写字母 Ezh!还是 З,西里尔大写字母 Ze?)如果你要编写一个可能被其他人使用的库,不过,最好还是坚持使用 ASCII。【参考方案4】:

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

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

JavaScript 1.5 及更高版本 * : ^[\pL\pNl$_][\pL\pNl$\pMn\pMc\pNd\pPc]*$

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

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

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

标识符的长度没有实际限制。 (浏览器各不相同,但您可以安全地拥有 1000 个字符,并且可能比这多几个数量级。)

人物类别的链接:

字母:Lu、Ll、Lt、Lm、Lo、Nl(在上面的正则表达式中组合为“L”) 组合标记(“修饰符”):Mn、Mc 数字:Nd 连接器:Pc

*n.b. 这个 Perl 正则表达式仅用于描述语法——它不适用于 JavaScript,它(还)不包括对 Unicode 属性的支持。 (有一些第三方包声称会添加这种支持。)

【讨论】:

应该注意你的第二个正则表达式有一些误报。 Supplementary Unicode characters(例如 U+2F800 CJK Compatibility Ideograph,列在 [Lo] 类别中)是 disallowed in identifier names,因为 JavaScript 将它们解释为两个单独的代理部分(例如 \uD87E\uDC00),它们不匹配任何允许的 Unicode 类别.但是,您的正则表达式将允许这样的字符。此外,还缺少 U+200C 和 U+200D。 ES6 使用明确用于此目的的字符类正式定义有效标识符(在编程中使用)——不确定以前是否如此——这意味着你可以使这个正则表达式更具可读性,如果不是考虑到保留字——或者至少如果不是因为 Unicode 转义序列现在在标识符中也有效的话!这完全符合 ES6 规范: (?:[\pID_Start\$_]|\\u(?:[\dA-Fa-f]4|\[\dA-Fa-f ]+\))([\pID_Continue\$_\u200C\u200D]|\\u(?:[\dA-Fa-f]4|\[\dA-Fa-f] +\))*【参考方案5】:

Javascript 变量

您可以使用任何字母、$_ 字符来开始变量。只要不以数字开头,您也可以包含数字。

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

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

jQuery

您可以将_ 用于您的库,这样它就可以与jQuery 并排使用。但是,您可以设置一个配置,使 jQuery 不会使用$。它将改为使用jQuery。为此,只需设置:

jQuery.noConflict();

This page 解释了如何做到这一点。

【讨论】:

这完全正确,但我把答案交给了比你早 0.02123413124 毫秒回答的 Anthony。对不起。 @Richard:不,这不是绝对正确的。请参阅 @Yuvalik 和 @Anurag 的答案。 @EndangeredMassa 为什么使用变量“_name”?为什么不只是名字?【参考方案6】:

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

【讨论】:

连接错误和 404 都是我在谷歌搜索(“unicode 类别”)时得到的所有相关结果...... :(【参考方案7】:

据我所知,接受的答案会排除很多有效的标识符。这是我放在一起的一个正则表达式,它应该遵循the spec(参见第 7.6 章标识符)。使用 RegexBuddy 创建它,您可以在 http://samples.geekality.net/js-identifiers 找到解释的导出。

^[$_\pL][$_\pL\pMn\pMc\pNd\pPc\u200C\u200D]*+$

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

break、do、instanceof、typeof、case、else、new、var、catch、finally、return、void、continue、for、switch、while、调试器、函数、this、with、default、if、throw、delete , in, try, class, enum, extends, super, const, export, import, implements, let, private, public, yield, interface, package, protected, static, null, true, false

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

Javascript 变量可以有字母、数字、美元符号 ($) 和下划线 (_)。它们不能以数字开头。

通常库使用$_ 作为您将在任何地方使用的函数的快捷方式。尽管名称 $_ 没有意义,但它们的简短性很有用,因为您将在需要知道它们含义的任何地方使用该函数。

如果您的库不包括在任何地方使用单个函数,我建议您使用更有意义的名称,因为这些名称将帮助您和其他人理解您的代码在做什么,而不必损害源代码 尼斯

例如,您可以看看很棒的 DateJS 库和它所允许的语法糖,而不需要任何 symbolshort-named 变量。

你应该首先让你的代码实用,并且只有在尝试让它变得漂亮之后。

【讨论】:

【参考方案10】:

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

【讨论】:

这是一个jsfiddle,当变量“_content”不是“未定义”并且当“_content”被FireFox设置时,它被设置为等于“window.content”jsfiddle.net/R2qvt/3跨度> 【参考方案11】:

我采纳了 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'));

【讨论】:

不要尝试。 isValidVarName('; ); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid'); @1j01,啊,我忘记了代码注释。我希望仅靠括号的不平衡就可以阻止代码运行。对 的简单检查应该可以排除这种情况。 isValidVarName("delete") === true【参考方案12】:

编写了a glitch workspace,它遍历所有代码点并在eval('var ' + String.fromCodePoint(#) + ' = 1') 有效时发出字符。

它一直在继续,继续,继续......

【讨论】:

以上是关于哪些字符对 JavaScript 变量名有效?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript对象

Scala 中的有效标识符字符

测试一个字符是不是是有效的 Julia 单字符变量名?

如何在 python 中将字符串转换为有效的变量名?

JavaScript 中变量名的最大长度

在过程宏中,如何检查字符串是不是是有效的变量名而不是关键字?