Estaba desconcertado cuando un colega me mostró esta línea de alertas de JavaScript 42.
alert(2+ 40);
Resulta rápidamente que lo que parece un signo menos es en realidad un personaje arcano de Unicode con una semántica claramente diferente.
Esto me dejó preguntándome por qué ese personaje no produce un error de sintaxis cuando se analiza la expresión. También me gustaría saber si hay más personajes que se comportan así.
javascript
unicode
GOTO 0
fuente
fuente
;
, el editor tiende a cambiar el extraño `` personaje en un espacio normal, pero si deshace esa 'autocorrección', tiene el mismo comportamiento . Ese personaje tiene la misma semántica que un espacio, incluso si parece un guión o menos (en las fuentes habituales).Respuestas:
Ese personaje es "OGHAM SPACE MARK" , que es un personaje espacial. Entonces el código es equivalente a
alert(2+ 40)
.Cualquier carácter Unicode en la clase Zs es un espacio en blanco en JavaScript , pero no parece haber tantos .
Sin embargo, JavaScript también permite caracteres Unicode en los identificadores , lo que le permite usar nombres de variables interesantes como
ಠ_ಠ
.fuente
Zs
caracteres se consideran espacios en blanco en JavaScript. Hay más: github.com/mathiasbynens/regexpu/blob/…ಠ_ಠ
se puede utilizar como un identificador en JS: ಠ_ಠಠ
ser tratado como una carta es solo sentido común, ya que es una carta. Sería un error claro siಠ_ಠ
no se pudiera utilizar como identificador.Después de leer las otras respuestas, escribí un script simple para encontrar todos los caracteres Unicode en el rango U + 0000 – U + FFFF que se comportan como espacios en blanco. Como parece, hay 26 o 27 de ellos dependiendo del navegador, con desacuerdos sobre U + 0085 y U + FFFE.
Tenga en cuenta que la mayoría de estos caracteres se parecen a un espacio en blanco normal.
Mostrar fragmento de código
fuente
\p{Default Ignorable Code Point}
, no solo un\p{Noncharacter Code Pount}
. U + 0085 siempre ha sido un\p{Whitespace}
punto de código. El maligno es el SEPARADOR DE VOCALES MONGOLIANO U + 180E, que "recientemente" perdió su\p{Whitespace}
propiedad. Tenga en cuenta que\p{Pattern Whitespace}
es un conjunto mucho más pequeño y una propiedad inmutable. Pero\p{Whitespace}
no lo es.FEFF
es la lista de materiales y se puede tratar como un "espacio sin interrupción de ancho cero" dentro de los textos.FFFE
es su equivalente endian intercambiado. Quizás esa es la razón por la que algunos navegadores tratan es como un espacio en blanco.Parece que el carácter que está utilizando es más largo que el signo menos real (un guión).
La parte superior es lo que está utilizando, la parte inferior es lo que debería ser el signo menos. Parece que ya lo sabes, así que ahora veamos por qué Javascript hace esto.
El carácter que usa es en realidad la marca de espacio ogham, que es un carácter de espacio en blanco, por lo que básicamente se interpreta como lo mismo que un espacio, lo que significa que su declaración se parece
alert(2+ 40)
a Javascript.Hay otros caracteres como este en Javascript. Puedes ver una lista completa aquí en Wikipedia .
Algo interesante que noté sobre este personaje es la forma en que Google Chrome (y otros posibles navegadores) lo interpreta en la barra superior de la página.
Es un bloque con
1680
adentro. Ese es en realidad el número unicode para la marca de espacio ogham. Parece que solo mi máquina está haciendo esto, pero es algo extraño.Decidí probar esto en otros idiomas para ver qué pasa y estos son los resultados que obtuve.
Idiomas en los que no funciona:
Python 2 y 3
Rubí
Java (dentro del
main
método)PHP
C
Vamos
Perl 5
Idiomas en los que funciona:
Esquema
C # (dentro del
Main()
método)Perl 6
fuente
sudo apt-get install unicode
aunque solo después de horas de investigación e intentos fallidos)Supongo que tiene que ver algo con el hecho de que por alguna extraña razón se clasifica como espacio en blanco:
fuente
unicode
.unicode
por Radovan Garabík. El repositorio correspondiente está en github.com/garabik/unicode .' '.codePointAt(0)
en la consola producirá 5760. ahora google 5760 unicode.Me parece recordar haber leído un artículo hace un tiempo sobre el reemplazo travieso de punto y coma (U + 003B) en el código de alguien con U + 037E, que es el signo de interrogación griego.
Ambos se ven iguales (en la medida en que creo que los griegos mismos usan U + 003B), pero este artículo declaró que el otro no funcionaría.
Puede encontrar más información sobre esto en Wikipedia aquí: https://en.wikipedia.org/wiki/Question_mark#Greek_question_mark
Y una pregunta (cerrada) sobre el uso de esto como una broma del propio SO. No es donde originalmente lo leí AFAIR: JavaScript Prank / Joke
fuente