Quais caracteres podem ser usados para nomear uma variável JavaScript?
Eu quero criar uma pequena "biblioteca de extensão" para meus usuários que não são JavaScript aqui no trabalho (que parecem todos sensíveis no que diz respeito ao idioma). Adoro como o jQuery e o Prototype usam o $
cifrão e, como uso o jQuery, estou procurando outro símbolo de caractere único para usar.
Percebo que poderia testar vários caracteres, mas espero diminuir minha lista de caracteres (considerando a integração futura com outra biblioteca popular).
javascript
character
Richard Clayton
fonte
fonte
Respostas:
Para citar nomes de variáveis JavaScript válidos , minha redação resumindo as seções de especificações relevantes:
Também criei uma ferramenta que informará se qualquer sequência digitada é um nome de variável JavaScript válido de acordo com o ECMAScript 5.1 e Unicode 6.1:
PS Para ter uma idéia de quão errada é a resposta de Anthony Mills: se você resumisse todas essas regras em uma única expressão regular somente para ASCII para JavaScript, seriam 11.236 caracteres . Aqui está:
fonte
¢
para complementar$
... oh bem ...)-:
Na especificação ECMAScript na seção 7.6 Nomes e identificadores de identificador , um identificador válido é definido como:
o que cria muitas oportunidades para nomear variáveis e também no golfe. Vamos tentar alguns exemplos.
Um identificador válido pode começar com qualquer um
UnicodeLetter
,$
,_
, ou\ UnicodeEscapeSequence
. Uma letra unicode é qualquer caractere dessas categorias ( veja todas as categorias ):Só isso explica algumas possibilidades malucas - exemplos de trabalho . Se não funcionar em todos os navegadores, chame-o de bug, pois deve.
fonte
Basicamente, na forma de expressão regular:
[a-zA-Z_$][0-9a-zA-Z_$]*
. Em outras palavras, o primeiro caractere pode ser uma letra ou _ ou $ e os outros caracteres podem ser letras ou _ ou $ ou números.Nota: Embora outras respostas tenham apontado que você pode usar caracteres Unicode em identificadores JavaScript, a pergunta real era "Quais caracteres devo usar para o nome de uma biblioteca de extensões como o jQuery?" Esta é uma resposta para essa pergunta. Você pode usar caracteres Unicode nos identificadores, mas não o faça. As codificações são estragadas o tempo todo. Mantenha seus identificadores públicos no intervalo 32-126 ASCII, onde é seguro.
fonte
Console.WriteLine("привет")
C # e fazê-lo realmente funcionar !Antes do JavaScript 1.5:
^[a-zA-Z_$][0-9a-zA-Z_$]*$
Em inglês: deve começar com um cifrão, sublinhado ou uma das letras do alfabeto de 26 caracteres, maiúsculas ou minúsculas. Os caracteres subsequentes (se houver) podem ser um desses ou um dígito decimal.
JavaScript 1.5 e posterior * :
^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$
Isso é mais difícil de expressar em inglês, mas é conceitualmente semelhante à sintaxe mais antiga, com a adição de que as letras e os dígitos podem ser de qualquer idioma. Após o primeiro caractere, também são permitidos caracteres adicionais do tipo sublinhado (coletivamente chamados de "conectores") e marcas adicionais de combinação de caracteres ("modificadores"). (Outros símbolos de moeda não estão incluídos neste conjunto estendido.)
O JavaScript 1.5 e posterior também permite seqüências de escape Unicode, desde que o resultado seja um caractere que seria permitido na expressão regular acima.
Identificadores também não devem ser uma palavra reservada atual ou que seja considerada para uso futuro.
Não há limite prático para o comprimento de um identificador. (Os navegadores variam, mas você terá 1000 caracteres com segurança e provavelmente várias mais ordens de magnitude que isso.)
Links para as categorias de personagens:
(combinadas no regex acima como "L")
* nb Este regex Perl destina-se a descrever apenas a sintaxe - não funcionará em JavaScript, que ainda não inclui suporte para Propriedades Unicode. (Existem alguns pacotes de terceiros que pretendem adicionar esse suporte.)
fonte
"test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
apesar de "teste" é um nome de variável JS válida\uD87E\uDC00
) que não correspondem a nenhum Unicode permitido categorias. Sua regex, no entanto, permitiria esse personagem. Além disso, U + 200C e U + 200D estão ausentes.Na verdade, o ECMAScript diz na página 15: que um identificador pode começar com um $, um sublinhado ou um UnicodeLetter e depois continua (logo abaixo) para especificar que um UnicodeLetter pode ser qualquer caractere das categorias unicode, Lo, Ll , Lu, Lt, Lm e Nl. E quando você procurar essas categorias, verá que isso abre muito mais possibilidades do que apenas letras latinas. Basta procurar por "categorias unicode" no google e você pode encontrá-las.
fonte
Variáveis Javascript
Você pode iniciar uma variável com qualquer letra
$
, ou_
caractere. Desde que não comece com um número, você também pode incluir números.Começar:
[a-z], $, _
Conter:
[a-z], [0-9], $, _
jQuery
Você pode usar
_
a sua biblioteca para que ela fique lado a lado com o jQuery. No entanto, existe uma configuração que você pode definir para que o jQuery não seja usado$
. Em vez disso, usarájQuery
. Para fazer isso, basta definir:Esta página explica como fazer isso.
fonte
A resposta aceita excluiria muitos identificadores válidos , até onde posso ver. Aqui está uma expressão regular que eu montei, que deve seguir as especificações (consulte o capítulo 7.6 sobre identificadores). Criei usando o RegexBuddy e você pode encontrar uma exportação da explicação em http://samples.geekality.net/js-identifiers .
Além disso, o nome não pode ser uma das seguintes palavras reservadas.
fonte
^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$
. Agora, mesmo com a correção, não consigo fazer com que esse regex funcione."test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
mesmo que "test" seja um nome de variável JS válidotest
é aceito também.\uD87E\uDC00
) que não correspondem a nenhum Unicode permitido categorias. Sua regex, no entanto, permitiria esse personagem.eval
,arguments
,NaN
,Infinity
eundefined
casos de ponta .As variáveis Javascript podem ter letras, dígitos, cifrões ($) e sublinhados (_). Eles não podem começar com dígitos.
Normalmente, as bibliotecas usam
$
e_
como atalhos para funções que você usará em qualquer lugar. Embora os nomes$
ou_
não sejam significativos, eles são úteis devido à sua falta e, como você usará a função em todos os lugares em que espera saber o que eles significam.Se sua biblioteca não consistir em usar uma única função em qualquer lugar, recomendo que você use nomes mais significativos, pois eles ajudarão você e outras pessoas a entender o que seu código está fazendo sem comprometer necessariamente a gentileza do código-fonte .
Você pode, por exemplo, dar uma olhada na incrível biblioteca DateJS e no açúcar sintático que ela permite, sem a necessidade de qualquer símbolo ou variável de nome abreviado .
Você deve primeiro fazer com que seu código seja prático e somente depois de tentar torná-lo bonito.
fonte
caso as expressões regulares não sejam obrigatórias, não seria melhor pedir ao navegador para decidir usar
eval
?fonte
xss = alert("I'm in your vars executin mah scrip's");;;;;
por exemplo, não é um nome de variável javascript válido.xss;alert("try again");
name
com(typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )
? Se for uma string, substituirá parênteses (definitivamente não é permitido em variáveis), então acho que executar qualquer coisa seria quase impossível.isValidVarName('aler(t')
se torna verdade. EisValidVarName('_;;;')
permanece verdadeiro. Mas você pode verificar no início se correspondesse algo como/[;,\(\)]/
, mas depois você ainda pode executar_=location="#!?"
para que você adicionar=
à lista, mas você ainda pode executar'_\ndelete foo'
(que passa o teste como um nome de variável válido) então você tem que excluir\n
s e\r
s e talvez alguma nova linha unicode? Mas `$` não é um identificador válido, então você deve excluir todos os espaços em branco ... É uma batalha perdida. Eu acho que é o mais longe que posso ir contra mim mesmo.if(/[;,\(\)=\s]/.exec(name))return!1
Aqui está uma sugestão rápida para criar nomes de variáveis. Se você deseja que a variável não entre em conflito ao ser usada no FireFox, não use o nome da variável " _content ", pois esse nome de variável já está sendo usado pelo navegador. Descobri isso da maneira mais difícil e tive que mudar todos os lugares em que usei a variável "_content" em um aplicativo JavaScript grande.
fonte
Peguei a ideia de Anas Nakawa e a melhorei. Primeiro de tudo, não há razão para realmente executar a função que está sendo declarada. Queremos saber se ele analisa corretamente, não se o código funciona. Segundo, um objeto literal é um contexto melhor para o nosso propósito do
var XXX
que é mais difícil de sair.fonte
isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
}
deve impedir isso.isValidVarName("delete") === true
Escreveu um espaço de trabalho de falha que itera sobre todos os pontos de código e emite o caractere, se
eval('var ' + String.fromCodePoint(#) + ' = 1')
funcionar.Apenas continua indo, indo e indo ....
fonte