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).
javascript
character
Richard Clayton
la source
la source
Réponses:
Pour citer des noms de variables JavaScript valides , mon article résumant les sections de spécifications pertinentes:
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:
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:
la source
¢
$
)-:
D'après la spécification ECMAScript de la section 7.6 Noms et identifiants des identifiants , un identifiant valide est défini comme:
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 ):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.
la source
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é.
la source
Console.WriteLine("привет")
en C # et de le faire fonctionner !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:
(combinées dans l'expression régulière ci-dessus comme «L»)
* 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.)
la source
"test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
même si "test" est un nom de variable JS valide\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.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.
la source
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 placejQuery
. Pour ce faire, définissez simplement:Cette page explique comment procéder.
la source
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 .
En outre, le nom ne peut pas être l'un des mots réservés suivants.
la source
^[$_\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}]*$/) === null
même si "test" est un nom de variable JS validetest
est également accepté.\uD87E\uDC00
) qui ne correspondent à aucun des codes Unicode autorisés. catégories. Votre expression régulière, cependant, permettrait un tel personnage.eval
,arguments
,NaN
,Infinity
et lesundefined
cas de pointe .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.
la source
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
?la source
xss = alert("I'm in your vars executin mah scrip's");;;;;
par exemple, n'est pas un nom de variable javascript valide.xss;alert("try again");
name
par(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.isValidVarName('aler(t')
devient vrai. EtisValidVarName('_;;;')
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\n
s et\r
s 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
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.
la source
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 XXX
car il est plus difficile d'en sortir.la source
isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
}
devrait empêcher cela.isValidVarName("delete") === true
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 ...
la source