Які символи дійсні для імен змінних JavaScript?


557

Які символи можна використовувати для іменування змінної JavaScript?

Я хочу створити невелику "бібліотеку розширень" для моїх користувачів, які не мають JavaScript, на роботі (які, здається, мовчазні, коли мова йде про мову). Мені подобається, як jQuery і Prototype обидва використовують $знак долара, а оскільки я використовую jQuery, шукаю ще один симпатичний односимвольний символ.

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


44
НІ. Букви Unicode прийнятні. Спробуйте, наприклад, π.
nalply

14
Хоча букви unicode прийнятні в назвах змінних, використання Unicode в коді може бути проблематичним . Я б запропонував не використовувати їх у назвах змінних, якщо ви можете обійтись без них.
Гері С. Вівер

це F # дійсне ім'я змінної? Я будую невелику функціональну бібліотеку javascript, і я хочу використовувати F # для його назви модуля. Типовий виклик функції виглядатиме так: F # .partial (fn, ... presetArgs);
Жуль Менсон

@JulesManson Ні, оскільки символ фунта зарезервований для інших цілей.
Айдан Ловелас

@JulesManson До речі, ім'я F # вже взято Microsoft від .NET
Люк

Відповіді:


986

Щоб процитувати дійсні імена змінних JavaScript , моя реєстрація підсумовує відповідні розділи специфікації:

Ідентифікатор повинен починатися з $, _або будь-який символ в категорії Юникода : «Прописна буква (Lu)» , «Рядкове буква (Ll)» , «Titlecase лист (Lt)» , «Модифікатор буква (Lm)» , «Інший лист ( Lo) ” або “ Літерний номер (Nl) ” .

Решта рядка може містити однакові символи, плюс будь -які символи нульової ширини U + 200C нульової ширини , U + 200D нульові знаки ширини нульової ширини та символи у категоріях Unicode "Непромінна позначка (Mn)" , "Розміщення між інтервалом" позначка (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
Чорт, так що я не можу бути розумним і використовую ¢для доповнення $... ой добре ...)-:
гіпетрейл

3
Це правда (і приголомшлива відповідь). Однак це не робить правильним: оскаржуючий код за допомогою використання подібних за формою букв, але насправді різних букв (або використання букв, які не-унікодове середовище НЕ МОЖЕ використовувати) є неправильним, imo. Це не допоможе кодування, а може створити численні помилки. Єдиний гарний перелом: він дасть змогу людям (болісно) усвідомити таку можливість, що якийсь код використовує Unicode (і до болю в курсі Unicode та його різних представлень) ... Про unicode: joelonsoftware.com/articles/Unicode.html
Олів'є Дулак

4
@ n2liquid-GuilhermeVieira Тільки якщо ви припускаєте, що всі двигуни JavaScript 100% сумісні з технічними характеристиками, що не завжди так - це точно не було, коли я робив це дослідження. Повідомлення в блозі, в якому я посилався, згадує всі помилки браузера / двигунів, які я подав і виправляв.
Mathias Bynens

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)
  • Заголовок літери (Lt)
  • Буква модифікатора (Lm)
  • Інший лист (Ло)
  • Літерний номер (Nl)

Це одне пояснює деякі шалені можливості - приклади роботи . Якщо він працює не у всіх браузерах, тоді називайте його помилкою, викликайте це.

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

1
Чи можете ви скопіювати приклади рядків на цю сторінку «Код розетки» , яка наразі не має прикладу JavaScript?
Вальтер Трос

73

В принципі, в звичайній формі вираження: [a-zA-Z_$][0-9a-zA-Z_$]*. Іншими словами, перший символ може бути літерою або _ або $, а інші символи можуть бути літерами або _ або $ або цифрами.

Примітка. Хоча в інших відповідях вказано, що ви можете використовувати символи Unicode в ідентифікаторах JavaScript, актуальним питанням було "Які символи я повинен використовувати для імені бібліотеки розширень, наприклад jQuery?" Це відповідь на це питання. Ви можете використовувати символи Unicode в ідентифікаторах, але не робіть цього. Кодування постійно викручуються. Тримайте ваші загальнодоступні ідентифікатори в діапазоні 32-126 ASCII там, де це безпечно.


71
Я, мабуть, змова вчинити вбивство співавтора, який використовував символи unicode у своїх іменах етикетки. / ледь іронічна промова
Ерік Реппен

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 і пізніші версії також дозволяють послідовності виходу Unicode, за умови, що результат є символом, дозволеним у вищенаведеному регулярному виразі.

Ідентифікатори також не повинні бути поточним зарезервованим словом або таким, яке розглядається для подальшого використання.

Немає практичного обмеження довжини ідентифікатора. (Браузери різняться, але ви сміливо матимете 1000 символів і, ймовірно, ще кілька порядків, ніж це.)

Посилання на категорії персонажів:

  • Літери: Lu , Ll , Lt , Lm , Lo , Nl
    (об'єднані в регулярному виразі як "L")
  • Поєднання марок ("модифікаторів"): Mn , Mc
  • Цифри: Nd
  • З'єднувачі: ПК

* nb Цей регекс Perl призначений лише для опису синтаксису - він не працюватиме в JavaScript, що не (ще) не підтримує властивості Unicode. (Є кілька сторонніх пакетів, які заявляють про надання такої підтримки.)


Я не можу, здається, цей регекс насправді працює. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullнезважаючи на те, що "тест" - дійсне ім'я змінної JS
Девід Мердок

На жаль, JavaScript не підтримує цей регулярний вираз. Я додав замітку для уточнення.
Данртон

5
Слід зазначити, що ваш другий регулярний вираз має деякі помилкові позитиви. Додаткові символи Unicode (наприклад, U + 2F800 CJK Ideograph Compatibility , який вказаний у категорії [Lo]) заборонено в іменах ідентифікаторів , оскільки JavaScript інтерпретує їх як дві окремі сурогатні половинки (наприклад \uD87E\uDC00), які не відповідають жодній із дозволених Unicode категорій. Однак ваш регулярний вираз дозволив би такого характеру. Також відсутні U + 200C і U + 200D.
Матіас Байненс

1
ES6 формально визначає дійсні ідентифікатори, використовуючи класи символів, призначені прямо для цієї мети (використання в програмі) - не впевнений, чи це було правдою раніше - це означає, що ви можете зробити цей регулярний вираз трохи читабельнішим, якщо не враховувати зарезервовані слова - або принаймні, якби не те, що послідовності втечі 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. І коли ви подивитесь на ці каталоги, ви побачите, що це відкриває набагато більше можливостей, ніж просто латинські літери. Просто шукайте "каталоги Unicode" в google, і ви можете їх знайти.


Помилки підключення та 404 - все, що я отримую за всі відповідні результати під час googling для ("категорій unicode") ... :(
Кальмарій

13

Змінні Javascript

Ви можете запустити змінну з будь-якої літери $, або _символу. Поки це не починається з числа, ви можете також включати числа.

Початок: [a-z], $, _

Містить: [a-z], [0-9], $, _

jQuery

Ви можете використовувати _для своєї бібліотеки так, щоб вона стояла поруч з jQuery. Однак є конфігурація, яку ви можете встановити так, що jQuery не буде використовувати $. Він замість цього використовуватиме jQuery. Для цього просто встановіть:

jQuery.noConflict();

На цій сторінці пояснено, як це зробити.


Це абсолютно правильно, але я дав відповідь Ентоні, який відповів .02123413124 мілісекунд перед тобою. Вибачте.
Річард Клейтон

8
@Richard: Ні, це не зовсім коректно. Дивіться відповіді @Yuvalik та @ Anurag.
Tim Down

@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, else, new, var, catch, нарешті, повернути, недійсно, продовжити, для, переключити, в той час, налагоджувач, функція, це, з, за ​​замовчуванням, якщо, кинути, видалити, в, спробувати, клас, перерахунок, розширює, супер, const, експорт, імпорт, реалізація, нехай, приватне, публічне, вихід, інтерфейс, пакет, захищений, статичний, нульовий, справжній, помилковий


Цей регулярний вираз не є дійсним регулярним виразом 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незважаючи на те, що "тест" - дійсне ім'я змінної JS
Девід Мердок

Ні, я майже впевнений, що я мав на увазі те, що я написав :) Питання, як я зрозумів, просто запитав, що є дійсним ім'ям функції JavaScript, а не яким чином буде виражений для цього специфічний javascript. Я зробив це в RegexBuddy, і я використовую його в PHP на прикладі сторінки, на яку я посилаюся. Чудово працює, і testце також прийнято.
Свиш

3
@DavidMurdoch Я написав регулярний вираз, сумісний з JavaScript, який має 11355 символів, який можна використовувати для перевірки ідентифікаторів (імен. Змінних). Дивіться мою відповідь .
Mathias Bynens

3
@Svish Слід зазначити, що ваш регекс має деякі помилкові позитиви. Додаткові символи Unicode (наприклад, U + 2F800 CJK Ideograph Compatibility , який вказаний у категорії [Lo]) заборонено в іменах ідентифікаторів , оскільки JavaScript інтерпретує їх як дві окремі сурогатні половинки (наприклад \uD87E\uDC00), які не відповідають жодній із дозволених Unicode категорій. Однак ваш регулярний вираз дозволив би такого характеру.
Матіас Байненс

2
@Svish Ну да, виписуючи діапазони себе, як я зробив :) Зверніть увагу , що ваше регулярний вираз також не враховує в eval, arguments, NaN, Infinityі undefinedкрайніх випадках .
Mathias Bynens

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

1
Це досить розумна ідея, незважаючи на вразливість атаки XSS.
Зубна щітка

@ 1j01 Як щодо заміни nameз (typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )? Якщо це рядок, він замінить круглі дужки (напевно заборонено в змінних), тому я думаю, що виконати що-небудь було б майже неможливо.
royhowie

2
Ну, тоді isValidVarName('aler(t')стає правдою. І isValidVarName('_;;;')залишається правдою. Але ви можете перевірити на початку, чи відповідає воно чимось на кшталт, /[;,\(\)]/але тоді ви все ще можете виконати, _=location="#!?"так що ви додасте =до списку, але ви все одно можете виконати '_\ndelete foo'(який передає тест як дійсне ім'я змінної), тому вам доведеться виключити \ns і \rs, а може бути якийсь unicode новий рядок? Але `$` не є дійсним ідентифікатором, тому вам доведеться виключити всі пробіли ... Це програшний бій. Я думаю, що настільки, наскільки я можу піти проти себе,if(/[;,\(\)=\s]/.exec(name))return!1
1j01

1

Ось одна швидка пропозиція щодо створення змінних імен. Якщо ви хочете, щоб змінна не конфліктувала при використанні у FireFox, не використовуйте ім'я змінної " _content ", оскільки це ім'я змінної вже використовується браузером. Я виявив це важким способом і довелося змінити всі місця, де я використовував змінну "_content" у великому додатку JavaScript.


Чи можете ви довести це за допомогою якогось вихідного коду, який не вдається? Здається, це нічого не робить у Firefox.
Зубна щітка

Ось jsfiddle, який попереджає, коли змінна "_content" не є "невизначеною" і коли "_content" встановлюється FireFox, вона встановлюється рівною "window.content" jsfiddle.net/R2qvt/3
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'));

1
Навіть не намагайся. isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
1j01

1
@ 1j01, Ага, я забув про коментар коду. Я сподівався, що неврівноваженість дужок лише може запобігти роботі коду. Проста перевірка на це }повинна виключати це.
cleong

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.