Какие символы допустимы для имен переменных JavaScript?

557

Какие символы можно использовать для именования переменной JavaScript?

Я хочу создать небольшую «библиотеку расширений» для моих не-JavaScript пользователей здесь, на работе (которые кажутся брезгливыми, когда дело доходит до языка). Мне нравится, что в jQuery и Prototype оба используют $знак доллара, и, поскольку я использую jQuery, я ищу другой хороший односимвольный символ для использования.

Я понимаю, что мог бы просто протестировать несколько символов, но я надеюсь сузить список символов для начала (возможно, с учетом будущей интеграции с другой популярной библиотекой).

Ричард Клейтон
источник
44
NO. Юникод буквы допустимы. Попробуйте π, например.
nalply
14
Хотя в именах переменных допустимы буквы Юникода, использование Юникода в коде может быть проблематичным . Я бы предложил не использовать их в именах переменных, если вы можете обойтись без них.
Гэри С. Уивер
F # является допустимым именем переменной? Я строю небольшую функциональную библиотеку JavaScript и хочу использовать F # для имени модуля. Типичный вызов функции будет выглядеть следующим образом: F # .partial (fn, ... presetArgs);
Жюль Мэнсон
@JulesManson Нет, потому что символ фунта зарезервирован для других целей.
Эйдан Лавлейс
@JulesManson Кстати, имя F # уже взято Microsoft из .NET
Luke the Geek

Ответы:

986

Чтобы процитировать действительные имена переменных JavaScript , моя статья обобщает соответствующие разделы спецификации:

Идентификатор должен начинаться с $, _или любой символ в категории Юникода : «Прописная буква (Lu)» , «Строчная буква (Ll)» , «Titlecase письмо (Lt)» , «Модификатор буква (Lm)» , «Другое письмо ( Lo) » или « Буквенный номер (Nl) » .

Остальная часть строки может содержать одни и те же символы, плюс любые U + 200C нулевой ширины без столярных символов, U + 200D нулевой ширины символов, а символы в категориях Юникода «Не-пробельный знак (Mn)» , «Spacing объединение знак (Mc) » , « Десятичное число (Nd) » или « Знаки препинания (Pc) » .

Я также создал инструмент , который сообщит вам, является ли введенная вами строка действительным именем переменной JavaScript в соответствии с ECMAScript 5.1 и Unicode 6.1:

Валидатор имени переменной JavaScript


PS Чтобы дать вам представление о том, как неправильный ответ Энтони Миллса: если бы вы суммировали все эти правила в одном регулярном выражении только для ASCII для JavaScript, его длина составляла бы 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
Я дам вам кредит на количество времени, которое у вас ушло на его создание.
Ричард Клейтон
18
@marsbear Я тоже написал статью об этом: mathiasbynens.be/notes/javascript-properties И инструмент тоже: mothereff.in/js-properties#12e34 Вот мой соответствующий ответ о переполнении стека .
Матиас Биненс
2
Черт возьми, так что я не могу стать умным и использовать ¢в качестве дополнения $... да ладно ...)-:
hippietrail
3
Это правда (и отличный ответ). Однако это не делает его правильным: запутывание кода с использованием похожих букв, но на самом деле разных букв (или с помощью букв, которые среда UNICODE НЕ МОЖЕТ использовать), неверно, imo. Это не поможет кодированию и может создать множество ошибок. Единственный хороший плюс: это заставит людей (болезненно) осознавать возможность того, что какой-то код использует Unicode (и до боли знает о Unicode и его различных представлениях) ... О unicode: joelonsoftware.com/articles/Unicode.html
Olivier Dulac
4
@ n2liquid-GuilhermeVieira Только если вы предполагаете, что все движки JavaScript на 100% соответствуют спецификациям, что не всегда так - точно не было, когда я проводил это исследование. В блоге, на который я ссылаюсь, упоминаются все ошибки браузера / движка, которые я отправил и исправил.
Матиас Биненс
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 - это любой символ из этих категорий ( см. Все категории ):

  • Прописная буква (Лу)
  • Строчная буква (Ll)
  • Заглавная буква (Лт)
  • Буква модификатора (Лм)
  • Другое письмо (Ло)
  • Буквенный номер (Nl)

Одно это объясняет некоторые безумные возможности - рабочие примеры . Если это не работает во всех браузерах, то назовите это ошибкой, потому что это должно.

var  = "something";
var ĦĔĽĻŎ = "hello";
var 〱〱〱〱 = "less than? wtf";
var जावास्क्रिप्ट = "javascript"; // ok that's JavaScript in hindi
var KingGeorge = "Roman numerals, awesome!";
Анураг
источник
1
Не могли бы вы скопировать строки с примерами на эту кодовую страницу Rosetta , которой в настоящее время не хватает примера JavaScript?
Уолтер Тросс
73

В основном в форме регулярного выражения: [a-zA-Z_$][0-9a-zA-Z_$]* . Другими словами, первый символ может быть буквой или _ или $, а другие символы могут быть буквами или _ или $ или цифрами.

Примечание. Хотя в других ответах указывалось, что в идентификаторах JavaScript можно использовать символы Unicode, реальным вопросом было: «Какие символы следует использовать для имени библиотеки расширений, такой как jQuery?» Это ответ на этот вопрос. Вы можете использовать символы Unicode в идентификаторах, но не делайте этого. Кодировки все время испорчены. Держите ваши открытые идентификаторы в диапазоне 32-126 ASCII, где это безопасно.

Энтони Миллс
источник
71
Я, вероятно, планирую убить со-разработчика, который использовал символы юникода в названиях своих ярлыков. / едва ироничная речь
Эрик Реппен
12
romkyns, я не думаю, что «имена идентификаторов символов Unicode» когда-либо были бы включены в «JavaScript: хорошие части», и поэтому я предпочитаю игнорировать их существование. Тем не менее, я добавил заявление об отказе от ответственности в ваш ответ.
Энтони Миллс
11
Что касается кодировок: пожалуйста , используйте не-ASCII символы, по крайней мере, в строковых литералах. Мы должны устранить все глупые программы, которые постоянно "портят" кодировки. Какое блаженство - просто набрать Console.WriteLine("привет")C # и заставить его работать !
Роман Старков
14
Послушай, @Timwi, особенно когда ты пишешь библиотеку (как говорит Ричард), было бы любезно не принуждать своих пользователей к чушь Alt-blah или copy'n'pasting. Кроме того, для ваших собственных вещей вы можете справиться с неприятностями, которые возникают, когда вы сталкиваетесь с ошибками браузера или прокси-сервера или чего-то еще, но заставить пользователей вашей библиотеки справляться с этими вещами не круто. Хороший ответ отвечает «что мне делать» больше, чем просто на вопрос. Так что да, я хочу помочь людям. Я не собираюсь включать бесполезную и опасную информацию, если я не скажу «о, и не делай этого».
Энтони Миллс
37
@Tchalvak Для кода, который вы только используете, это, вероятно, хорошо, используя Ʒ в качестве имени вашей основной библиотеки. (О, вы думали, что это было 3? Так что извините, это на самом деле U + 01B7 латинская заглавная буква Ezh! Или это З, заглавная буква кириллицы Ze?) Если вы собираетесь написать библиотеку, которая может использоваться другими людьми Тем не менее, вероятно, лучше придерживаться ASCII.
Энтони Миллс
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 и более поздние версии также допускают escape-последовательности Unicode при условии, что результатом является символ, который будет разрешен в приведенном выше регулярном выражении.

Идентификаторы также не должны быть текущим зарезервированным словом или словом, которое рассматривается для будущего использования.

Нет практического ограничения на длину идентификатора. (Браузеры различаются, но у вас будет 1000 символов и, возможно, на несколько порядков больше.)

Ссылки на категории персонажей:

  • Буквы: Lu , Ll , Lt , Lm , Lo , Nl
    (объединены в регулярном выражении выше как «L»)
  • Объединяющие знаки («модификаторы»): Mn , Mc
  • Цифры: Nd
  • Разъемы: ПК

* nb Это регулярное выражение Perl предназначено только для описания синтаксиса - оно не будет работать в JavaScript, который (пока) не включает поддержку свойств Unicode. (Есть некоторые сторонние пакеты, которые утверждают, что добавляют такую ​​поддержку.)

danorton
источник
Я не могу заставить это регулярное выражение работать. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullнесмотря на то, что «test» является допустимым именем переменной JS
Дэвид Мердок
Извините, но JavaScript не поддерживает это регулярное выражение. Я добавил примечание, чтобы уточнить.
Данортон
5
Следует отметить, что у вашего второго регулярного выражения есть некоторые ложные срабатывания. Дополнительные символы Unicode (например, идеограмма совместимости CJK U + 2F800 , которая указана в категории [Lo]) не допускаются в именах идентификаторов , так как JavaScript интерпретирует их как две отдельные суррогатные половины (например \uD87E\uDC00), которые не соответствуют ни одному из разрешенных Unicode категории. Ваше регулярное выражение, однако, позволило бы такого персонажа. Кроме того, U + 200C и U + 200D отсутствуют.
Матиас Биненс
1
ES6 формально определяет допустимые идентификаторы, используя классы символов, специально предназначенные для этой цели (используйте при программировании) - не уверен, если это было верно ранее - то есть вы можете сделать это регулярное выражение немного более читабельным, если не принимать во внимание зарезервированные слова - или по крайней мере, если бы не тот факт, что escape-последовательности Unicode теперь также действительны в идентификаторах! Это точно в соответствии со спецификацией ES6: (?: [\ P {ID_Start} \ $ _] | \\ u (?: [\ DA-Fa-f] {4} | \ {[\ dA-Fa-f ] + \})) ([\ р {ID_Continue} \ $ _ \ u200C \ u200D] | \\ и (?: [\ дА-Fa-е] {4} | \ {[\ дА-Fa-е] + \})) *
точка с запятой
14

На самом деле ECMAScript говорит на странице 15: что идентификатор может начинаться с символа $, символа подчеркивания или UnicodeLetter, а затем он (чуть ниже) указывает, что UnicodeLetter может быть любым символом из категорий Unicode, Lo, Ll , Lu, Lt, Lm и Nl. И когда вы посмотрите на эти категории, вы увидите, что это открывает гораздо больше возможностей, чем просто латинские буквы. Просто выполните поиск по «категориям Unicode» в Google, и вы сможете найти их.

Yuvalik
источник
Ошибки соединения и все 404, которые я получаю для каждого релевантного результата при поиске в Google («категории
Юникода
13

Переменные Javascript

Вы можете начать переменную с любой буквы $или _символа. Пока это не начинается с числа, вы можете также включать числа.

Начните: [a-z], $, _

содержать: [a-z], [0-9], $, _

JQuery

Ты можешь использовать _ свою библиотеку, чтобы она стояла рядом с jQuery. Однако есть конфигурация, которую вы можете установить, чтобы jQuery не использовал $. Вместо этого он будет использовать jQuery. Для этого просто установите:

jQuery.noConflict();

Эта страница объясняется, как это сделать.

EndangeredMassa
источник
Это абсолютно правильно, но я дал ответ Энтони, который ответил за 0,02123413124 миллисекунды раньше вас. Сожалею.
Ричард Клейтон
8
@Richard: нет, это не совсем правильно. Смотрите ответы @Yuvalik и @ Anurag.
Тим Даун
@EndangeredMassa, зачем использовать переменную "_name"? почему не просто имя?
Томаш Ващик
9

Насколько я понимаю, принятый ответ исключил бы множество допустимых идентификаторов . Вот регулярное выражение, которое я собрал, которое должно следовать спецификации (см. Главу 7.6 об идентификаторах). Создал его с помощью RegexBuddy, и вы можете найти экспорт объяснения на http://samples.geekality.net/js-identifiers .

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

Кроме того, имя не может быть одним из следующих зарезервированных слов.

break, do, instanceof, typeof, case, else, new, var, catch, finally, return, void, continue, for, switch, while, отладчик, function, this, по умолчанию, if, throw, delete, in, try, class, enum, extends, super, const, экспорт, импорт, реализует, let, private, public, yield, интерфейс, пакет, защищенный, статический, ноль, true, false

Svish
источник
Это регулярное выражение не является допустимым регулярным выражением 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
Дэвид Мердок
Нет, я почти уверен, что имел в виду то, что написал :) Вопрос, как я понял, просто задал вопрос о том, что является допустимым именем функции javascript, а не о том, как регулярное выражение для этого будет в конкретном javascript. Я сделал это в RegexBuddy, и я использую его в PHP на странице примера, на которую я ссылаюсь. Прекрасно работает, а также testпринимается.
Свиш
3
@DavidMurdoch Я написал JavaScript-совместимое регулярное выражение длиной 11,335 символов, которое можно использовать для проверки идентификаторов (или имен переменных). Смотри мой ответ .
Матиас Биненс
3
@Svish Следует отметить, что у вашего регулярного выражения есть некоторые ложные срабатывания. Дополнительные символы Unicode (например, идеограмма совместимости CJK U + 2F800 , которая указана в категории [Lo]) не допускаются в именах идентификаторов , поскольку JavaScript интерпретирует их как две отдельные суррогатные половины (например \uD87E\uDC00), которые не соответствуют ни одному из допустимых Unicode категории. Ваше регулярное выражение, однако, позволило бы такого персонажа.
Матиас Биненс
2
@Svish Ну да, выписывая диапазоны себя, как я сделал :) Обратите внимание , что ваше регулярное выражение также не учитывает в eval, arguments, NaN, Infinityи undefinedкрайних случаях .
Матиас Биненс
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.
января 2011 года,
6
xss;alert("try again");
января 2011 года
1
Это довольно умная идея, несмотря на уязвимость атаки XSS.
Зубная щетка
@ 1j01 Как насчет замены nameна (typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )? Если это строка, она заменит круглые скобки (определенно не допускается в переменных), поэтому я думаю, что выполнить что-либо будет почти невозможно.
Royhowie
2
Ну, тогда isValidVarName('aler(t')становится правдой. И isValidVarName('_;;;')остается верным. Но вы можете проверить в начале, соответствует ли оно чему-то вроде, /[;,\(\)]/но затем вы все равно можете выполнить _=location="#!?"его, добавив =в список, но вы все равно можете выполнить '_\ndelete foo'(который проходит тест как допустимое имя переменной), поэтому вы должны исключить \ns и \rs и, возможно, какой-нибудь юникод newline? Но `$` не является допустимым идентификатором, поэтому вы должны исключить все пробелы ... Это проигрышная битва. Я думаю, что это насколько я могу пойти против себяif(/[;,\(\)=\s]/.exec(name))return!1
1j01
1

Вот одно быстрое предложение для создания имен переменных. Если вы хотите, чтобы переменная не конфликтовала при использовании в FireFox, не используйте имя переменной « _content », так как это имя переменной уже используется браузером. Я нашел это нелегко, и мне пришлось поменять все места, где я использовал переменную "_content" в большом приложении JavaScript.

DanBrianWhite
источник
Можете ли вы доказать это с помощью некоторого исходного кода, который не работает? Похоже, что ничего не делает в Firefox.
Зубная щетка
Вот jsfiddle, который предупреждает, когда переменная «_content» не является «неопределенной», а когда «Firefox» устанавливает «_content», он равен « window.content
DanBrianWhite
1

Я взял идею Анаса Накавы и улучшил ее. Прежде всего, нет никаких причин фактически запускать объявленную функцию. Мы хотим знать, правильно ли он анализирует, а не работает ли код. Во-вторых, буквальный объект - лучший контекст для нашей цели, чем 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'));
cleong
источник
1
Даже не пытайся. isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
1j01
1
@ 1j01, ах, я забыл про комментарий кода. Я надеялся, что несбалансированность скобок может помешать запуску кода. Простая проверка }должна исключить это.
Cleong
isValidVarName("delete") === true
1j01
1

Написал рабочую область сбоя, которая перебирает все кодовые точки и испускает символ, еслиeval('var ' + String.fromCodePoint(#) + ' = 1') работает.

Он просто продолжает идти и идти, и идти ....

Аллен Лалонд
источник