J'ai été déconcerté lorsqu'un collègue m'a montré cette ligne d'alerte JavaScript 42.
alert(2+ 40);
Il s'avère rapidement que ce qui ressemble à un signe moins est en fait un caractère Unicode obscur avec une sémantique clairement différente.
Cela m'a laissé me demander pourquoi ce caractère ne produit pas d'erreur de syntaxe lorsque l'expression est analysée. J'aimerais aussi savoir s'il y a plus de personnages se comportant comme ça.
javascript
unicode
GOTO 0
la source
la source
;
, l'éditeur a tendance à changer l'étrange "caractère dans un espace normal, mais si vous annulez cette" auto-correction ", vous avez le même comportement . Ce caractère a la même sémantique qu'un espace, même s'il ressemble à un trait d'union ou à un signe moins (dans les polices habituelles).Réponses:
Ce caractère est "OGHAM SPACE MARK" , qui est un caractère spatial. Le code est donc équivalent à
alert(2+ 40)
.Tout caractère Unicode de la classe Zs est un caractère d'espace blanc en JavaScript , mais il ne semble pas y en avoir autant .
Cependant, JavaScript autorise également les caractères Unicode dans les identificateurs , ce qui vous permet d'utiliser des noms de variables intéressants comme
ಠ_ಠ
.la source
Zs
caractères sont considérés comme des espaces blancs en JavaScript. Il y a plus: github.com/mathiasbynens/regexpu/blob/…ಠ_ಠ
peut être utilisé comme identifiant dans JS: ಠ_ಠಠ
être traité comme une lettre est du bon sens, car c'est une lettre. Ce serait un bug clair s'ilಠ_ಠ
ne pouvait pas être utilisé comme identifiant.Après avoir lu les autres réponses, j'ai écrit un script simple pour trouver tous les caractères Unicode dans la plage U + 0000 – U + FFFF qui se comportent comme des espaces blancs. Il semble qu'il y en ait 26 ou 27 selon le navigateur, avec des désaccords sur U + 0085 et U + FFFE.
Notez que la plupart de ces personnages ressemblent à un espace blanc normal.
Afficher l'extrait de code
la source
\p{Default Ignorable Code Point}
, pas seulement un\p{Noncharacter Code Pount}
. U + 0085 a toujours été un\p{Whitespace}
point de code. Le maléfique est le SÉPARATEUR DE VOIX MONGOLES U + 180E, qui a «récemment» perdu ses\p{Whitespace}
biens. Notez qu'il\p{Pattern Whitespace}
s'agit d'un ensemble beaucoup plus petit et d'une propriété immuable. Mais\p{Whitespace}
non.FEFF
est la nomenclature et peut être traitée comme un "espace sans interruption de largeur nulle" dans les textes.FFFE
est son équivalent swap endian. C'est peut-être la raison pour laquelle certains navigateurs traitent les espaces.Il semble que le caractère que vous utilisez est en réalité plus long que le signe moins réel (un trait d'union).
Le haut est ce que vous utilisez, le bas est ce que le signe moins devrait être. Vous semblez déjà le savoir, alors voyons maintenant pourquoi Javascript fait cela.
Le caractère que vous utilisez est en fait la marque d'espace ogham qui est un caractère d'espace, donc il est fondamentalement interprété comme la même chose qu'un espace, ce qui signifie que votre déclaration ressemble
alert(2+ 40)
à Javascript.Il existe d'autres caractères comme celui-ci en Javascript. Vous pouvez voir une liste complète ici sur Wikipedia .
Quelque chose d'intéressant que j'ai remarqué à propos de ce personnage est la façon dont Google Chrome (et d'autres navigateurs possibles) l'interprète dans la barre supérieure de la page.
C'est un bloc avec l'
1680
intérieur. Il s'agit en fait du numéro unicode de la marque d'espace ogham. Il semble que ce soit juste ma machine qui le fasse, mais c'est étrange.J'ai décidé d'essayer cela dans d'autres langues pour voir ce qui se passe et ce sont les résultats que j'ai obtenus.
Langues dans lesquelles il ne fonctionne pas:
Python 2 et 3
Rubis
Java (à l'intérieur de la
main
méthode)PHP
C
Aller
Perl 5
Langues dans lesquelles il fonctionne:
Schème
C # (à l'intérieur de la
Main()
méthode)Perl 6
la source
sudo apt-get install unicode
Je suppose que cela doit faire quelque chose avec le fait que pour une raison étrange, il se classe comme un espace blanc:
la source
unicode
.unicode
par Radovan Garabík. Le dépôt correspondant se trouve sur github.com/garabik/unicode .' '.codePointAt(0)
sur la console donnera 5760. maintenant google 5760 unicode.Il me semble me souvenir d'avoir lu il y a quelque temps un article sur le remplacement malicieux des points-virgules (U + 003B) dans le code de quelqu'un par U + 037E qui est le point d'interrogation grec.
Ils ont tous deux la même apparence (dans la mesure où je pense que les Grecs eux-mêmes utilisent U + 003B), mais cet article a déclaré que l'autre ne fonctionnerait pas.
Vous trouverez plus d'informations à ce sujet sur Wikipedia: https://en.wikipedia.org/wiki/Question_mark#Greek_question_mark
Et une question (fermée) sur l'utilisation de cela comme farce de SO lui-même. Pas là où je l'avais lu AFAIR cependant: JavaScript Prank / Joke
la source