Quels caractères sont valides pour les noms de variables JavaScript?

557

Quels caractères peuvent être utilisés pour nommer une variable JavaScript?

Je veux créer une petite "bibliothèque d'extension" pour mes utilisateurs non-JavaScript ici au travail (qui semblent tous être délicats en ce qui concerne la langue). J'adore la façon dont jQuery et Prototype utilisent tous les deux le $signe dollar, et depuis que j'utilise jQuery, je cherche un autre joli symbole à caractère unique à utiliser.

Je me rends compte que je pourrais simplement tester un certain nombre de caractères, mais j'espère réduire ma liste de caractères pour commencer (en considération de l'intégration future avec une autre bibliothèque populaire, peut-être).

Richard Clayton
la source
44
NON. Les lettres Unicode sont acceptables. Essayez π, par exemple.
nalply
14
Bien que les lettres unicode soient acceptables dans les noms de variables, l'utilisation d'unicode dans le code peut être problématique . Je suggérerais de ne pas les utiliser dans les noms de variables si vous pouvez vous en passer.
Gary S. Weaver,
F # est-il un nom de variable valide? Je construis une petite bibliothèque javascript fonctionnelle et je souhaite utiliser F # pour le nom de son module. Un appel de fonction typique ressemblerait à ceci: F # .partial (fn, ... presetArgs);
Jules Manson
@JulesManson Non, car le symbole dièse est réservé à d'autres usages.
Aidan Lovelace
@JulesManson Soit dit en passant, le nom F # est déjà pris par Microsoft à partir de .NET
Luke the Geek

Réponses:

986

Pour citer des noms de variables JavaScript valides , mon article résumant les sections de spécifications pertinentes:

Un identifiant doit commencer par $, _ou tout caractère dans les catégories Unicode "Lettre majuscule (Lu)" , "Lettre minuscule (Ll)" , "Lettre majuscule (Lt)" , "Lettre modificatrice (Lm)" , "Autre lettre ( Lo) » ou « Numéro de lettre (Nl) » .

Le reste de la chaîne peut contenir les mêmes caractères, plus tous les caractères de non-jonction U + 200C de largeur nulle, les caractères de jonction de largeur zéro U + 200D et les caractères des catégories Unicode "Marque d'espacement (Mn)" , "Combinaison d'espacement marque (Mc) » , « Nombre de chiffres décimaux (Nd) » ou « Ponctuation du connecteur (Pc) » .

J'ai également créé un outil qui vous dira si une chaîne que vous entrez est un nom de variable JavaScript valide selon ECMAScript 5.1 et Unicode 6.1:

Validateur de nom de variable JavaScript


PS Pour vous donner une idée de la mauvaise réponse d'Anthony Mills: si vous deviez résumer toutes ces règles dans une seule expression régulière ASCII uniquement pour JavaScript, ce serait 11 236 caractères . C'est ici:

// 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
la source
31
Je vous rendrai hommage pour le temps qu'il vous a fallu pour le générer.
Richard Clayton
18
@marsbear J'ai également écrit un article à ce sujet: mathiasbynens.be/notes/javascript-properties Et un outil aussi: mothereff.in/js-properties#12e34 Voici une réponse pertinente de Stack Overflow .
Mathias Bynens
2
¢$)-:
Bon sang
3
C'est vrai (et une réponse géniale). Cependant, cela ne fait pas les choses: brouiller le code en utilisant des lettres similaires, mais en fait différentes (ou en utilisant des lettres que l'environnement non-unicode ne peut PAS utiliser) est faux, imo. Cela n'aidera pas le codage et peut créer de nombreux bogues à la place. Le seul bon côté: cela rendra les gens (douloureusement) conscients de la possibilité que certains codes utilisent Unicode (et douloureusement conscients d'Unicode et de ses différentes représentations) ... À propos d'Unicode: joelonsoftware.com/articles/Unicode.html
Olivier Dulac
4
@ n2liquid-GuilhermeVieira Seulement si vous supposez que tous les moteurs JavaScript sont 100% conformes aux spécifications, ce qui n'est pas toujours le cas - ce n'était certainement pas le cas lorsque j'ai fait cette recherche. Le billet de blog que j'ai lié mentionne tous les bogues du navigateur / moteur que j'ai déposés et corrigés.
Mathias Bynens
117

D'après la spécification ECMAScript de la section 7.6 Noms et identifiants des identifiants , un identifiant valide est défini comme:

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

ce qui crée de nombreuses opportunités pour nommer les variables et aussi pour le golf. Essayons quelques exemples.

Un identifiant valide pourrait commencer soit avec un UnicodeLetter, $, _ou \ UnicodeEscapeSequence. Une lettre unicode est n'importe quel caractère de ces catégories ( voir toutes les catégories ):

  • Lettre majuscule (Lu)
  • Lettre minuscule (Ll)
  • Lettre de majuscule (Lt)
  • Lettre modificatrice (Lm)
  • Autre lettre (Lo)
  • Numéro de lettre (Nl)

Cela représente à lui seul quelques possibilités folles - des exemples pratiques . Si cela ne fonctionne pas dans tous les navigateurs, appelez-le un bogue, car il devrait.

var  = "something";
var ĦĔĽĻŎ = "hello";
var 〱〱〱〱 = "less than? wtf";
var जावास्क्रिप्ट = "javascript"; // ok that's JavaScript in hindi
var KingGeorge = "Roman numerals, awesome!";
Anurag
la source
1
Pourriez-vous s'il vous plaît copier vos lignes d'exemple sur cette page de code Rosetta , qui manque actuellement d'un exemple JavaScript?
Walter Tross du
73

En gros, sous forme d'expression régulière: [a-zA-Z_$][0-9a-zA-Z_$]*. En d'autres termes, le premier caractère peut être une lettre ou _ ou $, et les autres caractères peuvent être des lettres ou _ ou $ ou des chiffres.

Remarque: Alors que d'autres réponses ont souligné que vous pouvez utiliser des caractères Unicode dans les identificateurs JavaScript, la question réelle était "Quels caractères dois-je utiliser pour le nom d'une bibliothèque d'extension comme jQuery?" Ceci est une réponse à cette question. Vous pouvez utiliser des caractères Unicode dans les identificateurs, mais ne le faites pas. Les encodages se foutent tout le temps. Conservez vos identifiants publics dans la plage 32-126 ASCII où ils sont en sécurité.

Anthony Mills
la source
71
Je comploterais probablement d'assassiner un co-développeur qui a utilisé des caractères Unicode dans les noms de ses labels. / discours à peine ironique
Erik Reppen
12
romkyns, je ne pense pas que les "noms d'identificateurs de caractères Unicode" soient jamais inclus dans "JavaScript: The Good Parts", et en tant que tel, je préfère ignorer leur existence. Cependant, j'ai ajouté un avertissement à ma réponse pour votre bénéfice.
Anthony Mills
11
En ce qui concerne codages: s'il vous plaît faire utiliser des caractères non-ASCII, au moins dans vos chaînes littérales. Nous devons éliminer tous les logiciels stupides qui font que les encodages sont "bousillés tout le temps". Quel bonheur de simplement taper Console.WriteLine("привет")en C # et de le faire fonctionner !
Roman Starkov
14
Écoutez, @Timwi, surtout lorsque vous écrivez une bibliothèque (comme Richard le dit), c'est gentil de ne pas forcer vos utilisateurs à faire de la merde Alt-blah ou à copier-coller. De plus, pour vos propres trucs, vous pourriez bien gérer les ennuis qui surviennent lorsque vous rencontrez des bogues de navigateur ou de serveur proxy ou autre, mais faire en sorte que les utilisateurs de votre bibliothèque traitent ces trucs n'est pas cool. Une bonne réponse répond à "que dois-je faire" plus que de simplement traiter la question en question. Alors oui, je veux aider les gens. Je ne vais pas inclure les informations inutiles et dangereuses, sauf si je dis «oh, et ne fais pas ça».
Anthony Mills
37
@Tchalvak Pour le code que vous utilisez, c'est très bien, en utilisant Ʒ comme nom de bibliothèque principal. (Oh, vous pensiez que c'était un 3? Alors désolé, c'est en fait U + 01B7 Lettre majuscule latine Ezh! Ou était-ce З, Lettre majuscule cyrillique Ze?) Si vous allez écrire une bibliothèque qui pourrait être utilisée par d'autres personnes , cependant, il est probablement préférable de s'en tenir à ASCII.
Anthony Mills
18

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

En anglais: il doit commencer par un signe dollar, un trait de soulignement ou une des lettres de l'alphabet à 26 caractères, en majuscule ou en minuscule. Les caractères suivants (le cas échéant) peuvent être l'un de ceux-ci ou un chiffre décimal.

JavaScript 1.5 et versions ultérieures * :^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$

Ceci est plus difficile à exprimer en anglais, mais il est conceptuellement similaire à l'ancienne syntaxe avec l'ajout que les lettres et les chiffres peuvent provenir de n'importe quelle langue. Après le premier caractère, il est également autorisé des caractères de type soulignement supplémentaires (appelés collectivement «connecteurs») et des marques de combinaison de caractères supplémentaires («modificateurs»). (Les autres symboles monétaires ne sont pas inclus dans cet ensemble étendu.)

JavaScript 1.5 et versions ultérieures autorisent également les séquences d'échappement Unicode, à condition que le résultat soit un caractère qui serait autorisé dans l'expression régulière ci-dessus.

Les identifiants ne doivent pas non plus être un mot réservé actuel ou considéré comme pouvant être utilisé ultérieurement.

Il n'y a pas de limite pratique à la longueur d'un identifiant. (Les navigateurs varient, mais vous aurez en toute sécurité 1 000 caractères et probablement plusieurs ordres de grandeur de plus que cela.)

Liens vers les catégories de personnages:

  • Lettres: Lu , Ll , Lt , Lm , Lo , Nl
    (combinées dans l'expression régulière ci-dessus comme «L»)
  • Marques combinées («modificateurs»): Mn , Mc
  • Chiffres: Nd
  • Connecteurs: PC

* nb Ce regex Perl est destiné à décrire la syntaxe uniquement - il ne fonctionnera pas en JavaScript, qui n'inclut pas (encore) la prise en charge des propriétés Unicode. (Il existe des packages tiers qui prétendent ajouter un tel support.)

danorton
la source
Je n'arrive pas à faire fonctionner cette expression régulière. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullmême si "test" est un nom de variable JS valide
David Murdoch
Désolé, mais JavaScript ne prend pas en charge cette expression régulière. J'ai ajouté une note pour clarifier.
danorton
5
Il convient de noter que votre deuxième expression régulière a des faux positifs. Les caractères Unicode supplémentaires (par exemple , l' idéogramme de compatibilité CJC U + 2F800 , qui est répertorié dans la catégorie [Lo]) sont interdits dans les noms d'identificateurs , car JavaScript les interprète comme deux moitiés de substitution individuelles (par exemple \uD87E\uDC00) qui ne correspondent à aucun des codes Unicode autorisés. catégories. Votre expression régulière, cependant, permettrait un tel personnage. De plus, U + 200C et U + 200D sont manquants.
Mathias Bynens
1
ES6 définit formellement des identificateurs valides à l'aide de classes de caractères expressément conçues à cet effet (à utiliser dans la programmation) - vous ne savez pas si cela était vrai précédemment - ce qui signifie que vous pouvez rendre cette expression régulière légèrement plus lisible, si vous ne tenez pas compte des mots réservés - ou du moins ce serait le cas si ce n'était le fait que les séquences d'échappement Unicode sont désormais également valides dans les identifiants! Ceci est exact selon la spécification 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] + \})) *
Point
14

En fait, ECMAScript dit à la page 15: qu'un identifiant peut commencer par un $, un trait de soulignement ou un UnicodeLetter, puis il continue (juste en dessous) pour spécifier qu'un UnicodeLetter peut être n'importe quel caractère des catégories unicode, Lo, Ll , Lu, Lt, Lm et Nl. Et lorsque vous recherchez ces catégories, vous verrez que cela ouvre beaucoup plus de possibilités que les lettres latines. Recherchez simplement les "catégories unicode" dans google et vous pouvez les trouver.

Yuvalik
la source
Erreurs de connexion et 404 tout ce que j'obtiens pour tous les résultats pertinents lors de la recherche sur ("catégories unicode") ... :(
Calmarius
13

Variables Javascript

Vous pouvez démarrer une variable avec n'importe quelle lettre $, ou _caractère. Tant qu'il ne commence pas par un nombre, vous pouvez également inclure des nombres.

Début: [a-z], $, _

Contenir: [a-z], [0-9], $, _

jQuery

Vous pouvez l'utiliser _pour votre bibliothèque afin qu'elle soit côte à côte avec jQuery. Cependant, il existe une configuration que vous pouvez définir afin que jQuery ne l'utilise pas $. Il utilisera à la place jQuery. Pour ce faire, définissez simplement:

jQuery.noConflict();

Cette page explique comment procéder.

En dangerMassa
la source
C'est tout à fait correct, mais j'ai donné la réponse à Anthony qui a répondu 0,02123413124 millisecondes devant vous. Désolé.
Richard Clayton
8
@Richard: Non, ce n'est pas tout à fait correct. Voir les réponses de @Yuvalik et @ Anurag.
Tim Down le
@EndangeredMassa pourquoi utiliser la variable "_name"? pourquoi ne pas simplement nommer?
Tomasz Waszczyk
9

La réponse acceptée exclurait beaucoup d'identifiants valides , pour autant que je puisse voir. Voici une expression régulière que j'ai mise en place qui devrait suivre la spécification (voir le chapitre 7.6 sur les identifiants). Créé à l'aide de RegexBuddy et vous pouvez trouver une exportation de l'explication à http://samples.geekality.net/js-identifiers .

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

En outre, le nom ne peut pas être l'un des mots réservés suivants.

break, do, instanceof, typeof, case, else, new, var, catch, enfin, return, void, continue, for, switch, while, debugger, function, this, with, default, if, throw, delete, in, essayez, classe, énumération, étend, super, const, exportation, importation, implémente, laissez, privé, public, rendement, interface, package, protégé, statique, null, true, false

Svish
la source
Cette expression régulière n'est pas une expression régulière JS valide. Je pense que vous vouliez dire: ^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$. Maintenant, même avec la correction, je n'arrive pas à faire fonctionner cette expression régulière. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullmême si "test" est un nom de variable JS valide
David Murdoch
Non, je suis sûr que je voulais dire ce que j'ai écrit :) La question, si j'ai bien compris, demandait simplement quel est un nom de fonction javascript valide, pas comment une expression rationnelle pour cela serait spécifiquement en javascript. Je l'ai fait dans RegexBuddy et je l'utilise en PHP sur la page d'exemple à laquelle je renvoie. Fonctionne très bien et testest également accepté.
Svish
3
@DavidMurdoch J'ai écrit une expression régulière compatible avec JavaScript de 11 335 caractères qui peut être utilisée pour valider des identifiants (aussi appelés noms de variables). Voir ma réponse .
Mathias Bynens
3
@Svish Il faut noter que votre regex a des faux positifs. Les caractères Unicode supplémentaires (par exemple , l' idéogramme de compatibilité CJC U + 2F800 , qui est répertorié dans la catégorie [Lo]) sont interdits dans les noms d'identificateurs , car JavaScript les interprète comme deux moitiés de substitution individuelles (par exemple \uD87E\uDC00) qui ne correspondent à aucun des codes Unicode autorisés. catégories. Votre expression régulière, cependant, permettrait un tel personnage.
Mathias Bynens
2
@Svish Eh bien oui, en écrivant les gammes vous, comme je l'ai fait :) Notez que votre regex ne tient pas compte non les eval, arguments, NaN, Infinityet les undefinedcas de pointe .
Mathias Bynens
6

Les variables Javascript peuvent avoir des lettres, des chiffres, des signes dollar ($) et des traits de soulignement (_). Ils ne peuvent pas commencer par des chiffres.

Habituellement, les bibliothèques utilisent $et _comme raccourcis pour les fonctions que vous utiliserez partout. Bien que les noms $ou _ne soient pas significatifs, ils sont utiles pour leur brièveté et puisque vous utiliserez la fonction partout où vous êtes censé savoir ce qu'ils signifient.

Si votre bibliothèque ne consiste pas à utiliser une seule fonction partout, je vous recommande d'utiliser des noms plus significatifs car ceux-ci vous aideront, vous et d'autres, à comprendre ce que fait votre code sans nécessairement compromettre la gentillesse du code source .

Vous pouvez par exemple jeter un œil à la bibliothèque impressionnante DateJS et au sucre syntaxique qu'elle permet sans avoir besoin de symbole ou de variables à nom court .

Vous devez d'abord obtenir votre code pour être pratique, et seulement après avoir essayé de le rendre joli.

Miguel Ventura
la source
4

dans le cas où les expressions régulières ne sont pas un must, ne serait-il pas préférable de simplement demander au navigateur de décider d'utiliser 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
la source
6
Non, ce ne serait pas le cas. xss = alert("I'm in your vars executin mah scrip's");;;;;par exemple, n'est pas un nom de variable javascript valide.
1j01
6
xss;alert("try again");
1j01
1
C'est une idée assez intelligente, malgré la vulnérabilité aux attaques XSS.
Brosse à dents
@ 1j01 Que diriez-vous de remplacer namepar (typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )? S'il s'agit d'une chaîne, elle remplacera les parenthèses (certainement pas autorisées dans les variables), donc je pense que l'exécution de quoi que ce soit serait presque impossible.
royhowie
2
Eh bien, cela isValidVarName('aler(t')devient vrai. Et isValidVarName('_;;;')reste vrai. Mais vous pouvez vérifier au début si cela correspond à quelque chose comme, /[;,\(\)]/mais vous pouvez toujours exécuter _=location="#!?"afin d'ajouter =à la liste, mais vous pouvez toujours exécuter '_\ndelete foo'(qui réussit le test en tant que nom de variable valide), vous devez donc exclure \ns et \rs et peut-être une nouvelle ligne unicode? Mais `$` n'est pas un identifiant valide, vous devez donc exclure tous les espaces ... C'est une bataille perdue. Je pense que c'est aussi loin que je peux aller contre moi-même avecif(/[;,\(\)=\s]/.exec(name))return!1
1j01
1

Voici une suggestion rapide pour créer des noms de variables. Si vous souhaitez que la variable n'entre pas en conflit lorsqu'elle est utilisée dans FireFox, n'utilisez pas le nom de variable " _content " car ce nom de variable est déjà utilisé par le navigateur. J'ai découvert cela à la dure et j'ai dû changer tous les endroits où j'ai utilisé la variable "_content" dans une grande application JavaScript.

DanBrianWhite
la source
Pouvez-vous le prouver avec du code source qui échoue? Il ne semble rien faire dans Firefox.
Brosse à dents
Voici un jsfiddle qui avertit lorsque la variable "_content" n'est pas "non définie" et lorsque "_content" est définie par FireFox, elle est définie sur "window.content" jsfiddle.net/R2qvt/3
DanBrianWhite
1

J'ai repris l'idée d'Anas Nakawa et l'ai améliorée. Tout d'abord, il n'y a aucune raison d'exécuter réellement la fonction déclarée. Nous voulons savoir s'il analyse correctement, pas si le code fonctionne. Deuxièmement, un objet littéral est un meilleur contexte pour notre objectif que var XXXcar il est plus difficile d'en sortir.

    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
la source
1
N'essayez même pas. isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
1j01
1
@ 1j01, Agh, j'ai oublié le commentaire du code. J'espérais que le déséquilibrage des crochets seul pourrait empêcher le code de fonctionner. Une simple vérification }devrait empêcher cela.
cleong
isValidVarName("delete") === true
1j01
1

A écrit un espace de travail glitch qui itère sur tous les points de code et émet le personnage si cela eval('var ' + String.fromCodePoint(#) + ' = 1')fonctionne.

Cela continue, et continue, et continue ...

Allain Lalonde
la source