Ich war verblüfft, als mir ein Kollege diese Zeile der JavaScript-Warnung 42 zeigte.
alert(2+ 40);
Es stellt sich schnell heraus, dass das, was wie ein Minuszeichen aussieht, tatsächlich ein arkanes Unicode-Zeichen mit deutlich unterschiedlicher Semantik ist.
Daher habe ich mich gefragt, warum dieses Zeichen beim Analysieren des Ausdrucks keinen Syntaxfehler erzeugt. Ich würde auch gerne wissen, ob sich mehr Charaktere so verhalten.
javascript
unicode
GOTO 0
quelle
quelle
;
, ändert der Editor das seltsame `` Zeichen in einen normalen Bereich. Wenn Sie diese "Autokorrektur" jedoch rückgängig machen, haben Sie dasselbe Verhalten . Dieses Zeichen hat dieselbe Semantik wie ein Leerzeichen, auch wenn es wie ein Bindestrich oder ein Minus aussieht (in üblichen Schriftarten).Antworten:
Dieses Zeichen ist "OGHAM SPACE MARK" , ein Leerzeichen. Der Code entspricht also
alert(2+ 40)
.Jedes Unicode-Zeichen in der Zs-Klasse ist ein Leerzeichen in JavaScript , aber es scheint nicht so viele zu geben .
Allerdings erlaubt JavaScript auch Unicode - Zeichen in Bezeichnern , die Sie wie verwenden interessante Variablennamen können
ಠ_ಠ
.quelle
Zs
in JavaScript nicht nur Zeichen als Leerzeichen betrachtet werden. Es gibt mehr: github.com/mathiasbynens/regexpu/blob/…ಠ_ಠ
als Kennung in JS verwendet werden kann: ಠ_ಠಠ
als Brief behandelt zu werden ist nur gesunder Menschenverstand, da es ein Brief ist. Es wäre ein klarer Fehler, wenn erಠ_ಠ
nicht als Kennung verwendet werden könnte.Nachdem ich die anderen Antworten gelesen hatte, schrieb ich ein einfaches Skript, um alle Unicode-Zeichen im Bereich U + 0000 - U + FFFF zu finden, die sich wie Leerzeichen verhalten. Wie es scheint, gibt es je nach Browser 26 oder 27 davon, mit Meinungsverschiedenheiten über U + 0085 und U + FFFE.
Beachten Sie, dass die meisten dieser Zeichen nur wie ein normaler Leerraum aussehen.
Code-Snippet anzeigen
quelle
\p{Default Ignorable Code Point}
, nicht nur ein\p{Noncharacter Code Pount}
. U + 0085 war schon immer ein\p{Whitespace}
Codepunkt. Der Böse ist der MONGOLISCHE Vokaltrenner U + 180E, der „vor kurzem“ sein\p{Whitespace}
Eigentum verloren hat . Beachten Sie, dass dies\p{Pattern Whitespace}
eine viel kleinere Menge und eine unveränderliche Eigenschaft ist. Ist\p{Whitespace}
aber nicht.FEFF
ist die Stückliste und kann in Texten wie ein "No-Break-Leerzeichen mit der Breite Null" behandelt werden.FFFE
ist es Endian getauscht Äquivalent. Vielleicht ist das der Grund, warum manche Browser Whitespace behandeln.Es scheint, dass das von Ihnen verwendete Zeichen tatsächlich länger ist als das tatsächliche Minuszeichen (ein Bindestrich).
Oben ist das, was Sie verwenden, unten ist das Minuszeichen. Sie scheinen das bereits zu wissen. Lassen Sie uns nun sehen, warum Javascript dies tut.
Das Zeichen, das Sie verwenden, ist eigentlich das ogham-Leerzeichen, bei dem es sich um ein Leerzeichen handelt. Daher wird es im Grunde genommen als dasselbe wie ein Leerzeichen interpretiert, was bedeutet, dass Ihre Aussage
alert(2+ 40)
für Javascript aussieht .Es gibt andere Zeichen wie dieses in Javascript. Eine vollständige Liste finden Sie hier auf Wikipedia .
Interessant an diesem Charakter ist die Art und Weise, wie Google Chrome (und möglicherweise andere Browser) ihn in der oberen Leiste der Seite interpretiert.
Es ist ein Block mit
1680
innen. Das ist eigentlich die Unicode-Nummer für die Ogham-Leerzeichen. Es scheint nur meine Maschine zu sein, die das tut, aber es ist eine seltsame Sache.Ich habe beschlossen, dies in anderen Sprachen auszuprobieren, um zu sehen, was passiert, und dies sind die Ergebnisse, die ich erhalten habe.
Sprachen, in denen es nicht funktioniert:
Python 2 & 3
Rubin
Java (innerhalb der
main
Methode)PHP
C.
Gehen
Perl 5
Sprachen, in denen es funktioniert:
Planen
C # (innerhalb der
Main()
Methode)Perl 6
quelle
sudo apt-get install unicode
obwohl erst nach stundenlangen Nachforschungen und fehlgeschlagenen Versuchen)Ich denke, es hat etwas damit zu tun, dass es aus irgendeinem seltsamen Grund als Leerzeichen klassifiziert wird:
quelle
unicode
.unicode
von Radovan Garabík (warte darauf ...) . Das entsprechende Repo finden Sie unter github.com/garabik/unicode .' '.codePointAt(0)
an der Konsole ergibt 5760. Jetzt google 5760 Unicode.Ich erinnere mich an ein Stück, in dem es vor einiger Zeit darum ging, Semikolons (U + 003B) in einem Code durch U + 037E, das griechische Fragezeichen, zu ersetzen.
Sie sehen beide gleich aus (soweit ich glaube, dass die Griechen selbst U + 003B verwenden), aber in diesem Artikel heißt es, dass der andere nicht funktionieren würde.
Weitere Informationen hierzu aus Wikipedia finden Sie hier: https://en.wikipedia.org/wiki/Question_mark#Greek_question_mark
Und eine (geschlossene) Frage, wie man dies als Streich von SO selbst benutzt. Nicht dort, wo ich es ursprünglich AFAIR gelesen habe: JavaScript Prank / Joke
quelle