¿Qué caracteres se pueden usar para nombrar una variable de JavaScript?
Quiero crear una pequeña "biblioteca de extensiones" para mis usuarios que no usan JavaScript aquí en el trabajo (que parecen ser aprensivos cuando se trata del lenguaje). Me encanta cómo jQuery y Prototype han usado el $
signo de dólar, y dado que uso jQuery, estoy buscando otro buen símbolo de un solo carácter para usar.
Me doy cuenta de que podría probar una serie de caracteres, pero espero reducir mi lista de caracteres para empezar (en consideración a la futura integración con otra biblioteca popular, tal vez).
javascript
character
Richard Clayton
fuente
fuente
Respuestas:
Para citar nombres de variables válidos de JavaScript , mi escrito resume las secciones de especificaciones relevantes:
También he creado una herramienta que le dirá si alguna cadena que ingrese es un nombre válido de variable de JavaScript de acuerdo con ECMAScript 5.1 y Unicode 6.1:
PD: para darle una idea de cuán incorrecta es la respuesta de Anthony Mills: si tuviera que resumir todas estas reglas en una sola expresión regular ASCII solo para JavaScript, tendría una longitud de 11,236 caracteres . Aquí está:
fuente
¢
para complementar$
... oh, bueno ...)-:
De la especificación ECMAScript en la sección 7.6 Nombres e identificadores de identificador , un identificador válido se define como:
lo que crea muchas oportunidades para nombrar variables y también en el golf. Probemos algunos ejemplos.
Un identificador válido podría comenzar con una cualquiera
UnicodeLetter
,$
,_
, o\ UnicodeEscapeSequence
. Una letra unicode es cualquier carácter de estas categorías ( ver todas las categorías ):Esto solo explica algunas posibilidades locas: ejemplos de trabajo . Si no funciona en todos los navegadores, llámelo un error, porque debería hacerlo.
fuente
Básicamente, en forma de expresiones regulares:
[a-zA-Z_$][0-9a-zA-Z_$]*
. En otras palabras, el primer carácter puede ser una letra o _ o $, y los otros caracteres pueden ser letras o _ o $ o números.Nota: Si bien otras respuestas han señalado que puede usar caracteres Unicode en identificadores de JavaScript, la pregunta real fue "¿Qué caracteres debo usar para el nombre de una biblioteca de extensiones como jQuery?" Esta es una respuesta a esa pregunta. Puede usar caracteres Unicode en los identificadores, pero no lo haga. Las codificaciones se arruinan todo el tiempo. Mantenga sus identificadores públicos en el rango ASCII 32-126 donde sea seguro.
fuente
Console.WriteLine("привет")
C # y hacer que realmente funcione !Antes de JavaScript 1.5:
^[a-zA-Z_$][0-9a-zA-Z_$]*$
En inglés: debe comenzar con un signo de dólar, un guión bajo o una de las letras en el alfabeto de 26 caracteres, mayúsculas o minúsculas. Los caracteres posteriores (si los hay) pueden ser uno de esos o un dígito decimal.
JavaScript 1.5 y posterior * :
^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$
Esto es más difícil de expresar en inglés, pero es conceptualmente similar a la sintaxis anterior con la adición de que las letras y los dígitos pueden ser de cualquier idioma. Después del primer carácter, también se permiten caracteres adicionales de subrayado (denominados colectivamente "conectores") y marcas de combinación de caracteres adicionales ("modificadores"). (Otros símbolos de moneda no están incluidos en este conjunto extendido).
JavaScript 1.5 y posterior también permite secuencias de escape Unicode, siempre que el resultado sea un carácter que se permitiría en la expresión regular anterior.
Los identificadores tampoco deben ser una palabra reservada actual o una que se considere para uso futuro.
No hay límite práctico para la longitud de un identificador. (Los navegadores varían, pero seguramente tendrá 1000 caracteres y probablemente varios órdenes de magnitud más que eso).
Enlaces a las categorías de personajes:
(combinadas en la expresión regular anterior como "L")
* nb Esta expresión regular de Perl está destinada a describir únicamente la sintaxis: no funcionará en JavaScript, que (todavía) no incluye soporte para las propiedades Unicode. (Hay algunos paquetes de terceros que afirman agregar dicho soporte).
fuente
"test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
a pesar de que "prueba" es un nombre de variable JS válido\uD87E\uDC00
. Ej. ) Que no coinciden con ninguna de las Unicode permitidas categorías. Su expresión regular, sin embargo, permitiría tal personaje. Además, faltan U + 200C y U + 200D.En realidad, ECMAScript dice en la página 15: que un identificador puede comenzar con un $, un guión bajo o un UnicodeLetter, y luego continúa (justo debajo de eso) para especificar que UnicodeLetter puede ser cualquier personaje de las categorías unicode, Lo, Ll , Lu, Lt, Lm y Nl. Y cuando busque esas categorías verá que esto abre muchas más posibilidades que solo letras latinas. Simplemente busque "categorías unicode" en google y podrá encontrarlas.
fuente
Variables Javascript
Puede comenzar una variable con cualquier letra
$
, o_
carácter. Siempre que no comience con un número, también puede incluir números.Comienzo:
[a-z], $, _
Contiene:
[a-z], [0-9], $, _
jQuery
Puede usarlo
_
para su biblioteca para que se mantenga al lado de jQuery. Sin embargo, hay una configuración que puede establecer para que jQuery no se use$
. En su lugar lo usarájQuery
. Para hacer esto, simplemente configure:Esta página explica cómo hacer esto.
fuente
La respuesta aceptada descartaría muchos identificadores válidos , por lo que puedo ver. Aquí hay una expresión regular que puse junto que debería seguir la especificación (ver capítulo 7.6 sobre identificadores). Lo creé usando RegexBuddy y puede encontrar una exportación de la explicación en http://samples.geekality.net/js-identifiers .
Además, el nombre no puede ser una de las siguientes palabras reservadas.
fuente
^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$
. Ahora, incluso con la corrección, parece que no puedo hacer que esta expresión regular funcione realmente."test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
a pesar de que "prueba" es un nombre de variable JS válidotest
es aceptado.\uD87E\uDC00
. Ej. ) Que no coinciden con ninguna de las Unicode permitidas categorías. Su expresión regular, sin embargo, permitiría tal personaje.eval
,arguments
,NaN
,Infinity
yundefined
casos extremos .Las variables de Javascript pueden tener letras, dígitos, signos de dólar ($) y guiones bajos (_). No pueden comenzar con dígitos.
Por lo general, las bibliotecas usan
$
y_
como accesos directos para funciones que usará en todas partes. Aunque los nombres$
o_
no son significativos, son útiles por su brevedad y dado que utilizará la función en todas partes, se espera que sepa lo que significan.Si su biblioteca no consiste en usar una sola función en todas partes, le recomiendo que use nombres más significativos, ya que estos lo ayudarán a usted y a otros a comprender lo que está haciendo su código sin comprometer necesariamente la simplicidad del código fuente .
Podría, por ejemplo, echar un vistazo a la increíble biblioteca DateJS y al azúcar sintético que permite sin la necesidad de ningún símbolo o variables con nombres cortos .
Primero debe hacer que su código sea práctico, y solo después de intentar hacerlo bonito.
fuente
en caso de que las expresiones regulares no sean obligatorias, ¿no sería mejor pedirle al navegador que decida usar
eval
?fuente
xss = alert("I'm in your vars executin mah scrip's");;;;;
por ejemplo, no es un nombre de variable javascript válido.xss;alert("try again");
name
con(typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )
? Si es una cadena, reemplazará los paréntesis (definitivamente no está permitido en las variables), por lo que creo que ejecutar cualquier cosa sería casi imposible.isValidVarName('aler(t')
hace realidad. Y seisValidVarName('_;;;')
mantiene fiel. Pero podría verificar al inicio si coincidía con algo como,/[;,\(\)]/
pero aún puede ejecutar_=location="#!?"
para agregar=
a la lista, pero aún puede ejecutar'_\ndelete foo'
(que pasa la prueba como un nombre de variable válido), por lo que debe excluir\n
sy\r
s y tal vez alguna nueva línea unicode? Pero `$` no es un identificador válido, por lo que debe excluir todos los espacios en blanco ... Es una batalla perdida. Creo que es lo más lejos que puedo ir en mi contraif(/[;,\(\)=\s]/.exec(name))return!1
Aquí hay una sugerencia rápida para crear nombres de variables. Si desea que la variable no entre en conflicto cuando se usa en FireFox, no use el nombre de la variable " _content " ya que el navegador ya está usando este nombre de variable. Descubrí esto de la manera difícil y tuve que cambiar todos los lugares en los que utilicé la variable "_contenido" en una gran aplicación de JavaScript.
fuente
Tomé la idea de Anas Nakawa y la mejoré. En primer lugar, no hay ninguna razón para ejecutar realmente la función que se declara. Queremos saber si se analiza correctamente, no si el código funciona. Segundo, un objeto literal es un mejor contexto para nuestro propósito que
var XXX
porque es más difícil de romper.fuente
isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
}
debería excluir eso.isValidVarName("delete") === true
Escribió un espacio de trabajo de falla que itera sobre todos los puntos de código y emite el carácter si
eval('var ' + String.fromCodePoint(#) + ' = 1')
funciona.Simplemente sigue y sigue y sigue ...
fuente