Fiquei perplexo quando um colega me mostrou essa linha de JavaScript alertando 42.
alert(2+ 40);
Acontece rapidamente que o que parece ser um sinal de menos é realmente um caractere Unicode arcano com semântica claramente diferente.
Isso me deixou pensando por que esse caractere não produz um erro de sintaxe quando a expressão é analisada. Eu também gostaria de saber se há mais personagens se comportando assim.
javascript
unicode
GOTO 0
fonte
fonte
;
, o editor tende a alterar o caractere `` estranho para um espaço normal, mas se você desfazer essa "correção automática", tem o mesmo comportamento . Esse caractere tem a mesma semântica que um espaço, mesmo que pareça um hífen ou menos (em fontes comuns).Respostas:
Esse personagem é "OGHAM SPACE MARK" , que é um caractere de espaço. Portanto, o código é equivalente a
alert(2+ 40)
.Qualquer caractere Unicode na classe Zs é um caractere de espaço em branco no JavaScript , mas parece não haver muitos .
No entanto, o JavaScript também permite caracteres Unicode nos identificadores , o que permite usar nomes de variáveis interessantes como
ಠ_ಠ
.fonte
Zs
caracteres são considerados espaços em branco no JavaScript. Existem mais: github.com/mathiasbynens/regexpu/blob/…ಠ_ಠ
pode ser usado como um identificador em JS: #ಠ
ser tratado como uma carta é apenas senso comum, já que é uma carta. Seria um erro claro seಠ_ಠ
não pudesse ser usado como um identificador.Depois de ler as outras respostas, escrevi um script simples para encontrar todos os caracteres Unicode no intervalo U + 0000 – U + FFFF que se comportam como espaços em branco. Como parece, existem 26 ou 27 deles, dependendo do navegador, com divergências sobre o U + 0085 e o U + FFFE.
Observe que a maioria desses caracteres parece um espaço em branco comum.
Mostrar snippet de código
fonte
\p{Default Ignorable Code Point}
, não apenas um\p{Noncharacter Code Pount}
. U + 0085 sempre foi um\p{Whitespace}
ponto de código. O maligno é o separador de vozes da Mongólia U + 180E, que "recentemente" perdeu suas\p{Whitespace}
propriedades. Observe que\p{Pattern Whitespace}
é um conjunto muito menor e uma propriedade imutável. Mas\p{Whitespace}
não é.FEFF
é a lista técnica e pode ser tratada como um "espaço sem quebra de largura zero" nos textos.FFFE
é o equivalente trocado endian. Talvez essa seja a razão pela qual alguns navegadores tratam seja o espaço em branco.Parece que o caractere que você está usando é realmente maior do que o sinal de menos real (um hífen).
A parte superior é o que você está usando, a parte inferior é o que o sinal de menos deve ser. Você já sabe disso, então agora vamos ver por que o Javascript faz isso.
O caractere que você usa é, na verdade, a marca de espaço ogham, que é um caractere de espaço em branco; portanto, é basicamente interpretado como a mesma coisa que um espaço, o que significa que sua declaração se parece com
alert(2+ 40)
com Javascript.Existem outros caracteres como este em Javascript. Você pode ver uma lista completa aqui na Wikipedia .
Algo interessante que notei sobre esse personagem é a maneira como o Google Chrome (e possíveis outros navegadores) o interpreta na barra superior da página.
É um bloco com
1680
dentro dele. Na verdade, esse é o número unicode da marca de espaço ogham. Parece ser apenas minha máquina fazendo isso, mas é uma coisa estranha.Decidi tentar isso em outros idiomas para ver o que acontece e esses são os resultados que obtive.
Idiomas em que não funciona:
Python 2 e 3
Rubi
Java (dentro do
main
método)PHP
C
Vai
Perl 5
Idiomas em que trabalha:
Esquema
C # (dentro do
Main()
método)Perl 6
fonte
sudo apt-get install unicode
, embora só depois de horas de pesquisa e tentativas falhadas)Eu acho que tem a ver com o fato de que, por algum motivo estranho, classifica como espaço em branco:
fonte
unicode
.unicode
por Radovan Garabík. O repo correspondente está em github.com/garabik/unicode .' '.codePointAt(0)
no console renderá 5760. agora google 5760 unicode.Parece que me lembro de ler um artigo sobre a substituição maliciosa de ponto e vírgula (U + 003B) no código de alguém por U + 037E, que é o ponto de interrogação grego.
Ambos têm a mesma aparência (na medida em que acredito que os próprios gregos usam U + 003B), mas este artigo afirmou que o outro não funcionaria.
Mais algumas informações sobre isso na Wikipedia estão aqui: https://en.wikipedia.org/wiki/Question_mark#Greek_question_mark
E uma pergunta (fechada) sobre como usar isso como brincadeira do próprio SO. Não é onde eu originalmente li AFAIR: JavaScript Prank / Joke
fonte