Jakie znaki są poprawne dla nazw zmiennych JavaScript?

557

Których znaków można użyć do nazwania zmiennej JavaScript?

Chcę stworzyć małą „bibliotekę rozszerzeń” dla moich użytkowników nieobsługujących JavaScript w pracy (którzy wydają się być wrażliwi, jeśli chodzi o język). Uwielbiam to, jak jQuery i Prototype używają $znaku dolara, a ponieważ używam jQuery, szukam innego fajnego jednoznakowego symbolu do użycia.

Zdaję sobie sprawę, że mogłem po prostu przetestować kilka znaków, ale mam nadzieję, że zawęzię listę znaków na początek (być może, biorąc pod uwagę przyszłą integrację z inną popularną biblioteką).

Richard Clayton
źródło
44
NIE. Dopuszczalne są litery Unicode. Wypróbuj na przykład π.
dokładnie
14
Chociaż litery Unicode są dopuszczalne w nazwach zmiennych, użycie kodu Unicode w kodzie może być problematyczne . Sugerowałbym, aby nie używać ich w nazwach zmiennych, jeśli można sobie bez nich poradzić.
Gary S. Weaver,
czy F # jest prawidłową nazwą zmiennej? Buduję małą funkcjonalną bibliotekę javascript i chcę użyć F # jako nazwy modułu. Typowe wywołanie funkcji wyglądałoby tak: F # .partial (fn, ... presetArgs);
Jules Manson
@JulesManson Nie, ponieważ symbol funta jest zarezerwowany do innych zastosowań.
Aidan Lovelace
@JulesManson Nawiasem mówiąc, nazwa F # jest już zajęta przez Microsoft z .NET
Luke the Geek

Odpowiedzi:

986

Aby zacytować prawidłowe nazwy zmiennych JavaScript , mój artykuł podsumowujący odpowiednie sekcje specyfikacji:

Identyfikator musi zaczynać się od $, _lub dowolnego znaku z kategorii Unicode „Wielka litera (Lu)” , „Mała litera (Ll)” , „Litera tytułu (Lt)” , „Litera modyfikująca (Lm)” , „Inna litera ( Lo) ” lub „ Numer litery (Nl) ” .

Reszta łańcucha może zawierać te same znaki plus wszelkie U + 200C zerowej szerokości na stolarskie postaci, U + 200D zerowej szerokości stolarskie znaki, a znaki w kategoriach unikodowe „niespacyjnych oznaczenie (MN)” , „odstępy łączenia mark (Mc) ” , „ Decimal cyfrowy numer (Nd) ” lub „ Interpunkcja złącza (Pc) ” .

Stworzyłem również narzędzie , które powie ci, czy dowolny wprowadzony ciąg znaków jest prawidłową nazwą zmiennej JavaScript zgodnie z ECMAScript 5.1 i Unicode 6.1:

Walidator nazw zmiennych JavaScript


PS Aby dać wyobrażenie o tym, jak błędna jest odpowiedź Anthony'ego Millsa: jeśli podsumowałbyś wszystkie te reguły w jednym wyrażeniu regularnym tylko dla ASCII dla JavaScript, miałby on 11 236 znaków . Oto on:

// 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]*$/
Mathias Bynens
źródło
31
Udzielę ci kredytu za czas, który musiałeś zająć, aby to wygenerować.
Richard Clayton,
18
@marsbear Zdarzyło mi się też napisać artykuł na ten temat: mathiasbynens.be/notes/javascript-properties Oraz narzędzie: mothereff.in/js-properties#12e34 Oto moja odpowiednia odpowiedź na przepełnienie stosu .
Mathias Bynens
2
Cholera, więc nie mogę się ¢$)-:
sprytnie
3
To prawda (i niesamowita odpowiedź). Jednak to nie robi tego dobrze: zaciemnianie kodu przy użyciu podobnie wyglądających, ale w rzeczywistości różnych liter (lub przy użyciu liter, których środowisko inne niż Unicode NIE może używać) jest błędne, imo. Nie pomoże w kodowaniu i zamiast tego może stworzyć wiele błędów. Jedyny dobry plus: uświadomi ludziom (bolesnie), że niektóre kody używają Unicode (i boleśnie wie o Unicode i jego różnych reprezentacjach) ... O Unicode: joelonsoftware.com/articles/Unicode.html
Olivier Dulac
4
@ n2liquid-GuilhermeVieira Tylko jeśli założymy, że wszystkie silniki JavaScript są w 100% zgodne ze specyfikacją, co nie zawsze jest prawdą - na pewno nie było tak, kiedy przeprowadzałem te badania. W blogu, do którego odsyłam, wymieniono wszystkie błędy przeglądarki / silnika, które zgłosiłem i załatałem.
Mathias Bynens
117

Zgodnie ze specyfikacją ECMAScript w sekcji 7.6 Nazwy identyfikatorów i identyfikatory prawidłowy identyfikator definiuje się jako:

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

co stwarza wiele możliwości nazywania zmiennych, a także gry w golfa. Spróbujmy kilku przykładów.

Ważny identyfikator można uruchomić albo z UnicodeLetter, $, _, lub \ UnicodeEscapeSequence. Litera unicode to dowolny znak z tych kategorii ( zobacz wszystkie kategorie ):

  • Wielka litera (Lu)
  • Mała litera (Ll)
  • Titlecase letter (Lt)
  • Litera modyfikatora (Lm)
  • Inny list (Lo)
  • Numer litery (Nl)

Już to wyjaśnia pewne szalone możliwości - przykłady działania . Jeśli nie działa we wszystkich przeglądarkach, nazwij go błędem, bo powinien.

var  = "something";
var ĦĔĽĻŎ = "hello";
var 〱〱〱〱 = "less than? wtf";
var जावास्क्रिप्ट = "javascript"; // ok that's JavaScript in hindi
var KingGeorge = "Roman numerals, awesome!";
Anurag
źródło
1
Czy możesz skopiować swoje przykładowe wiersze na tę stronę z kodem Rosetta , której obecnie brakuje przykładu JavaScript?
Walter Tross
73

Zasadniczo, w zwykłej postaci wyrażenie: [a-zA-Z_$][0-9a-zA-Z_$]*. Innymi słowy, pierwszym znakiem może być litera lub _ lub $, a pozostałe znaki mogą być literami _ lub $ lub cyframi.

Uwaga: Podczas gdy inne odpowiedzi wskazywały, że można używać znaków Unicode w identyfikatorach JavaScript, pytanie brzmiało: „Jakich znaków powinienem użyć w nazwie biblioteki rozszerzeń, takiej jak jQuery?”. To jest odpowiedź na to pytanie. W identyfikatorach można używać znaków Unicode, ale nie rób tego. Kodowania cały czas psują się. Trzymaj swoje publiczne identyfikatory w zakresie 32-126 ASCII, gdzie jest to bezpieczne.

Anthony Mills
źródło
71
Prawdopodobnie planowałbym zamordować współtwórcę, który używał znaków unicode w swoich nazwach etykiet. / ledwo ironiczna mowa
Erik Reppen
12
romkyns, nie sądzę, by „Nazwy znaków Unicode” były kiedykolwiek zawarte w „JavaScript: The Good Parts” i dlatego wolę zignorować ich istnienie. Dodałem jednak do mojej odpowiedzi wyłączenie odpowiedzialności dla Twojej korzyści.
Anthony Mills
11
Odnośnie kodowania: proszę zrobić znaki użycie spoza ASCII, przynajmniej w swoim napisowych. Musimy wyeliminować całe głupie oprogramowanie, które powoduje, że kodowanie „psuje się cały czas”. Cóż za błogość po prostu wpisać Console.WriteLine("привет")C # i sprawić, by faktycznie działał !
Roman Starkov
14
Posłuchaj, @Timwi, zwłaszcza gdy piszesz bibliotekę (jak twierdzi Richard), miło jest nie zmuszać użytkowników do bzdur Alt-blaha lub kopiowania i wklejania. Ponadto, jeśli chodzi o własne rzeczy, możesz być w stanie poradzić sobie z irytacjami, które pojawiają się, gdy napotkasz błędy przeglądarki lub serwera proxy lub cokolwiek innego, ale zmuszanie użytkowników biblioteki do radzenia sobie z tymi rzeczami nie jest fajne. Dobra odpowiedź jest odpowiedzią na „co powinienem zrobić”, nie tylko zajmując się danym pytaniem. Więc tak, chcę pomagać ludziom. Nie zamierzam podawać bezużytecznych i niebezpiecznych informacji, chyba że powiem „och, i nie rób tego”.
Anthony Mills,
37
@Tchalvak W przypadku kodu, którego właśnie używasz, prawdopodobnie nie ma problemu, używając Ʒ jako głównej nazwy biblioteki. (Och, myślałeś, że to 3? Tak przykro, to tak naprawdę U + 01B7 Łacińska Wielka Litera Ezh! A może to była З, Cyrylica Wielka Litera Ze?) Jeśli masz zamiar napisać bibliotekę, z której mogą korzystać inni ludzie , jednak prawdopodobnie najlepiej trzymać się ASCII.
Anthony Mills,
18

Przed JavaScript 1.5: ^[a-zA-Z_$][0-9a-zA-Z_$]*$

W języku angielskim: musi zaczynać się od znaku dolara, podkreślenia lub jednej z liter alfabetu 26 znaków, wielkich lub małych liter. Kolejnymi znakami (jeśli występują) może być dowolny z nich lub cyfra dziesiętna.

JavaScript 1.5 i nowsze * :^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$

Trudniej to wyrazić w języku angielskim, ale jest ona koncepcyjnie podobna do starszej składni z tym, że litery i cyfry mogą pochodzić z dowolnego języka. Po pierwszym znaku dozwolone są również dodatkowe znaki podobne do podkreślenia (zwane łącznie „łącznikami”) i dodatkowe znaki łączące znaki („modyfikatory”). (Inne symbole walut nie są uwzględnione w tym rozszerzonym zestawie).

JavaScript 1.5 i nowsze wersje zezwalają również na sekwencje specjalne Unicode, pod warunkiem, że wynik jest znakiem dozwolonym w powyższym wyrażeniu regularnym.

Identyfikatory również nie mogą być bieżącym zarezerwowanym słowem lub słowem rozważanym do wykorzystania w przyszłości.

Długość identyfikatora nie ma praktycznego ograniczenia. (Przeglądarki różnią się, ale bezpiecznie będziesz mieć 1000 znaków i prawdopodobnie kilka rzędów wielkości więcej niż to.)

Linki do kategorii postaci:

  • Litery: Lu , Ll , Lt , Lm , Lo , Nl
    (połączone w wyrażeniu regularnym powyżej jako „L”)
  • Łączenie znaków („modyfikatorów”): Mn , Mc
  • Cyfry: Nd
  • Złącza: szt

* nb To wyrażenie regularne w Perlu ma opisywać tylko składnię - nie będzie działać w JavaScript, który nie obejmuje (jeszcze) obsługi właściwości Unicode. (Istnieją pakiety innych firm, które twierdzą, że dodają takie wsparcie).

Danorton
źródło
Nie mogę sprawić, by ten regex faktycznie zadziałał. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullmimo że „test” jest prawidłową nazwą zmiennej JS
David Murdoch
Przepraszamy, ale JavaScript nie obsługuje tego wyrażenia regularnego. Dodałem notatkę w celu wyjaśnienia.
danorton
5
Należy zauważyć, że twoje drugie wyrażenie regularne ma pewne fałszywe alarmy. Dodatkowe znaki Unicode (np. Ideogram U + 2F800 CJK Compatibility , który jest wymieniony w kategorii [Lo]) są niedozwolone w nazwach identyfikatorów , ponieważ JavaScript interpretuje je jako dwie indywidualne połówki zastępcze (np. \uD87E\uDC00), Które nie pasują do żadnego z dozwolonych znaków Unicode kategorie. Twoje wyrażenie regularne pozwoliłoby jednak na taką postać. Brakuje również U + 200C i U + 200D.
Mathias Bynens,
1
ES6 formalnie definiuje prawidłowe identyfikatory za pomocą klas znaków przeznaczonych specjalnie do tego celu (użyj w programowaniu) - nie jestem pewien, czy było to prawdą wcześniej - co oznacza, że ​​możesz zrobić ten regex nieco bardziej czytelny, jeśli nie bierze się pod uwagę zarezerwowanych słów - lub przynajmniej tak by było, gdyby nie fakt, że sekwencje specjalne Unicode są teraz również ważne w identyfikatorach! Jest to zgodne ze specyfikacją 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] + \})) *
Semicolon
14

W rzeczywistości ECMAScript mówi na stronie 15: że identyfikator może zaczynać się od $, podkreślenia lub UnicodeLetter, a następnie (dalej poniżej) określa, że ​​UnicodeLetter może być dowolnym znakiem z kategorii Unicode, Lo, Ll , Lu, Lt, Lm i Nl. A kiedy spojrzysz na te kategorie, zobaczysz, że otwiera to o wiele więcej możliwości niż tylko litery łacińskie. Wystarczy wyszukać „google catagories” w Google i można je znaleźć.

Yuvalik
źródło
Błędy połączenia i 404 wszystkich, które otrzymuję za każde istotne wyniki, kiedy googluje („kategorie Unicode”) ... :(
Calmarius
13

Zmienne JavaScript

Możesz rozpocząć zmienną dowolną literą $lub _znakiem. Tak długo, jak nie zaczyna się od cyfry, możesz także dołączyć liczby.

Początek: [a-z], $, _

Zawierać: [a-z], [0-9], $, _

jQuery

Możesz użyć _swojej biblioteki, aby stała obok siebie z jQuery. Istnieje jednak konfiguracja, którą można ustawić tak, aby jQuery nie używał $. Zamiast tego użyje jQuery. Aby to zrobić, po prostu ustaw:

jQuery.noConflict();

Ta strona wyjaśnia, jak to zrobić.

Zagrożone Masa
źródło
To jest absolutnie poprawne, ale dałem odpowiedź Anthony'emu, który odpowiedział 0,02123413124 milisekund przed tobą. Przepraszam.
Richard Clayton
8
@Richard: Nie, to nie jest absolutnie poprawne. Zobacz odpowiedzi na @Yuvalik i @ Anurag.
Tim Down
@EndangeredMassa dlaczego warto używać zmiennej „_name”? dlaczego nie tylko nazwa?
Tomasz Waszczyk,
9

O ile mi wiadomo, zaakceptowana odpowiedź wykluczałaby wiele ważnych identyfikatorów . Oto wyrażenie regularne, które zestawiłem, które powinno być zgodne ze specyfikacją (patrz rozdział 7.6 na temat identyfikatorów). Utworzono go za pomocą RegexBuddy, a eksport wyjaśnienia można znaleźć na stronie http://samples.geekality.net/js-identifiers .

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

Ponadto nazwa nie może być jednym z następujących zastrzeżonych słów.

break, do, instanceof, typeof, case, else, new, var, catch, wreszcie, return, void, Continue, for, switch, while, debugger, function, this, with, default, if, throw, delete, in, spróbuj, klasa, wyliczanie, rozszerza, super, const, eksport, import, implementuje, let, prywatny, publiczny, wydajność, interfejs, pakiet, chroniony, statyczny, null, true, false

Svish
źródło
Ten wyrażenie regularne nie jest prawidłowym wyrażeniem regularnym JS. Myślę, że masz na myśli: ^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$. Teraz nawet z korektą nie wydaje mi się, aby ten regex działał. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullmimo że „test” jest prawidłową nazwą zmiennej JS
David Murdoch
Nie, jestem całkiem pewien, że miałem na myśli to, co napisałem :) Pytanie, jak zrozumiałem, po prostu pytało o to, jaka jest poprawna nazwa funkcji javascript, a nie o to, jak będzie to wyrażenie regularne w javascript. Zrobiłem to w RegexBuddy i używam go w PHP na przykładowej stronie, do której linkuję. Działa świetnie i testjest również akceptowany.
Svish
3
@DavidMurdoch Napisałem wyrażenie regularne kompatybilne z JavaScript, o długości 11 335 znaków, którego można używać do sprawdzania poprawności identyfikatorów (inaczej nazw zmiennych). Zobacz moją odpowiedź .
Mathias Bynens
3
@Svish Należy zauważyć, że wyrażenie regularne ma kilka fałszywych trafień. Dodatkowe znaki Unicode (np. Ideogram U + 2F800 CJK Compatibility , który jest wymieniony w kategorii [Lo]) są niedozwolone w nazwach identyfikatorów , ponieważ JavaScript interpretuje je jako dwie indywidualne połówki zastępcze (np. \uD87E\uDC00), Które nie pasują do żadnego z dozwolonych znaków Unicode kategorie. Twoje wyrażenie regularne pozwoliłoby jednak na taką postać.
Mathias Bynens
2
@Svish No tak, przez wypisywanie zakresy siebie, tak jak ja :) Pamiętaj, że Twój regex również nie uwzględnia się eval, arguments, NaN, Infinityi undefinedprzypadków brzegowych .
Mathias Bynens,
6

Zmienne JavaScript mogą mieć litery, cyfry, znaki dolara ($) i podkreślenia (_). Nie mogą zaczynać się cyframi.

Zwykle biblioteki używają $i _jako skróty do funkcji, których będziesz używać wszędzie. Chociaż nazwy $lub _nie są znaczące, są przydatne ze względu na ich skrót i ponieważ będziesz używać tej funkcji wszędzie, gdzie oczekuje się, że wiesz, co one oznaczają.

Jeśli twoja biblioteka nie polega na używaniu wszędzie jednej funkcji, radzę użyć bardziej znaczących nazw, ponieważ pomogą one tobie i innym zrozumieć, co robi twój kod, niekoniecznie narażając na szwank jakość kodu źródłowego .

Możesz na przykład rzucić okiem na niesamowitą bibliotekę DateJS i na cukier syntetyczny, na który pozwala bez żadnego symbolu lub zmiennych o krótkiej nazwie .

Najpierw powinieneś uzyskać praktyczny kod i dopiero po jego upiększeniu.

Miguel Ventura
źródło
4

jeśli wyrażenia regularne nie są koniecznością, czy nie lepiej byłoby po prostu poprosić przeglądarkę, aby zdecydowała się na użycie 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
Anas Nakawa
źródło
6
Nie zrobiłby tego. xss = alert("I'm in your vars executin mah scrip's");;;;;na przykład nie jest prawidłową nazwą zmiennej javascript.
1j01
6
xss;alert("try again");
1j01
1
Jest to całkiem sprytny pomysł, pomimo podatności na atak XSS.
Szczoteczka do zębów
@ 1j01 Jak o wymianie namez (typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )? Jeśli jest to ciąg, zastąpi nawiasy (zdecydowanie nie dozwolone w zmiennych), więc myślę, że wykonanie czegokolwiek byłoby prawie niemożliwe.
royhowie
2
Cóż, wtedy isValidVarName('aler(t')staje się prawdą. I isValidVarName('_;;;')pozostaje prawdą. Ale możesz na początku sprawdzić, czy pasuje do czegoś podobnego, /[;,\(\)]/ale nadal możesz wykonać, _=location="#!?"aby dodać =do listy, ale nadal możesz wykonać '_\ndelete foo'(który przechodzi test jako prawidłową nazwę zmiennej), więc musisz wykluczyć \ns i \rsi jakaś nowa linia Unicode? Ale „$” nie jest prawidłowym identyfikatorem, więc musisz wykluczyć wszystkie białe znaki ... To przegrana bitwa. Myślę, że to jest tak daleko, jak mogę przeciwstawić się sobieif(/[;,\(\)=\s]/.exec(name))return!1
1j01
1

Oto jedna szybka sugestia dotycząca tworzenia nazw zmiennych. Jeśli chcesz, aby zmienna nie powodowała konfliktu, gdy jest używana w FireFox, nie używaj nazwy zmiennej „ _content ”, ponieważ ta nazwa zmiennej jest już używana przez przeglądarkę. Odkryłem to na własnej skórze i musiałem zmienić wszystkie miejsca, w których używałem zmiennej „_content” w dużej aplikacji JavaScript.

DanBrianWhite
źródło
Czy możesz to udowodnić za pomocą jakiegoś kodu źródłowego, który zawodzi? Wygląda na to, że nic nie robi w Firefoksie.
Szczoteczka do zębów
Oto jsfiddle, który ostrzega, gdy zmienna „_content” nie jest „niezdefiniowana”, a gdy FireFox ustawia „_content”, jest ona równa „ window.content
DanBrianWhite
1

Wziąłem pomysł Anasa Nakawy i ulepszyłem go. Po pierwsze, nie ma powodu, aby faktycznie uruchamiać deklarowaną funkcję. Chcemy wiedzieć, czy poprawnie analizuje, a nie czy kod działa. Po drugie, dosłowny obiekt jest lepszym kontekstem dla naszych celów niż var XXXtrudniej się z niego wyrwać.

    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
źródło
1
Nawet nie próbuj. isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
1j01,
1
@ 1j01, Agh, zapomniałem o komentarzu do kodu. Miałem nadzieję, że sam brak równowagi w nawiasach może uniemożliwić uruchomienie kodu. Proste sprawdzenie }powinno to wykluczać.
cleong
isValidVarName("delete") === true
1j01
1

Napisałem obszar roboczy usterki, który iteruje wszystkie punkty kodowe i emituje znak, jeśli eval('var ' + String.fromCodePoint(#) + ' = 1')działa.

Po prostu idzie dalej i idzie dalej ...

Allain Lalonde
źródło