Welche Zeichen können zum Benennen einer JavaScript-Variablen verwendet werden?
Ich möchte hier bei der Arbeit eine kleine "Erweiterungsbibliothek" für meine Nicht-JavaScript-Benutzer erstellen (die alle in Bezug auf die Sprache zimperlich zu sein scheinen). Ich finde es toll, wie sowohl jQuery als auch Prototype das $
Dollarzeichen verwenden, und da ich jQuery verwende, suche ich nach einem weiteren schönen Symbol für einzelne Zeichen.
Mir ist klar, dass ich nur eine Reihe von Zeichen testen konnte, aber ich hoffe, dass ich zunächst meine Liste der Zeichen eingrenzen kann (im Hinblick auf die zukünftige Integration in eine andere beliebte Bibliothek vielleicht).
javascript
character
Richard Clayton
quelle
quelle
Antworten:
Um gültige JavaScript-Variablennamen zu zitieren, fasse ich die relevanten Spezifikationsabschnitte zusammen:
Ich habe auch ein Tool erstellt , mit dem Sie feststellen können, ob eine von Ihnen eingegebene Zeichenfolge ein gültiger JavaScript-Variablenname gemäß ECMAScript 5.1 und Unicode 6.1 ist:
PS Um Ihnen eine Vorstellung davon zu geben, wie falsch die Antwort von Anthony Mills lautet: Wenn Sie alle diese Regeln in einem einzigen regulären ASCII-Ausdruck für JavaScript zusammenfassen würden, wären sie 11.236 Zeichen lang . Hier ist es:
quelle
¢
ergänzen$
...)-:
Aus der ECMAScript-Spezifikation in Abschnitt 7.6 Bezeichnernamen und Bezeichner wird ein gültiger Bezeichner wie folgt definiert:
Dies schafft viele Möglichkeiten für die Benennung von Variablen und auch für das Golfen. Versuchen wir einige Beispiele.
Ein gültiger Bezeichner könnte beginnen entweder mit einem
UnicodeLetter
,$
,_
, oder\ UnicodeEscapeSequence
. Ein Unicode-Buchstabe ist ein beliebiges Zeichen aus diesen Kategorien ( siehe alle Kategorien ):Dies allein erklärt einige verrückte Möglichkeiten - Arbeitsbeispiele . Wenn es nicht in allen Browsern funktioniert, nennen Sie es einen Fehler, weil es sollte.
quelle
Grundsätzlich in regulärer Ausdrucksform :
[a-zA-Z_$][0-9a-zA-Z_$]*
. Mit anderen Worten, das erste Zeichen kann ein Buchstabe oder _ oder $ sein, und die anderen Zeichen können Buchstaben oder _ oder $ oder Zahlen sein.Hinweis: Während andere Antworten darauf hingewiesen haben, dass Sie Unicode-Zeichen in JavaScript-Bezeichnern verwenden können, lautete die eigentliche Frage "Welche Zeichen sollte ich für den Namen einer Erweiterungsbibliothek wie jQuery verwenden?". Dies ist eine Antwort auf diese Frage. Sie können Unicode-Zeichen in Bezeichnern verwenden, tun Sie dies jedoch nicht. Kodierungen werden ständig vermasselt. Bewahren Sie Ihre öffentlichen Kennungen im ASCII-Bereich 32-126 auf, wo dies sicher ist.
quelle
Console.WriteLine("привет")
C # einzugeben und es tatsächlich funktionieren zu lassen !Vor JavaScript 1.5:
^[a-zA-Z_$][0-9a-zA-Z_$]*$
Auf Englisch: Es muss mit einem Dollarzeichen, einem Unterstrich oder einem Buchstaben im 26-stelligen Alphabet in Groß- oder Kleinbuchstaben beginnen. Nachfolgende Zeichen (falls vorhanden) können eines dieser Zeichen oder eine Dezimalstelle sein.
JavaScript 1.5 und höher * :
^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$
Dies ist auf Englisch schwieriger auszudrücken, ähnelt jedoch konzeptionell der älteren Syntax, mit dem Zusatz, dass die Buchstaben und Ziffern aus jeder Sprache stammen können. Nach dem ersten Zeichen sind zusätzliche Unterstrich-ähnliche Zeichen (zusammen als „Konnektoren“ bezeichnet) und zusätzliche Zeichen-Kombinationsmarkierungen („Modifikatoren“) zulässig. (Andere Währungssymbole sind in diesem erweiterten Satz nicht enthalten.)
JavaScript 1.5 und höher erlaubt auch Unicode-Escape-Sequenzen, vorausgesetzt, das Ergebnis ist ein Zeichen, das im obigen regulären Ausdruck zulässig wäre.
Bezeichner dürfen auch kein aktuell reserviertes Wort sein oder für die zukünftige Verwendung in Betracht gezogen werden.
Es gibt keine praktische Begrenzung für die Länge eines Bezeichners. (Browser variieren, aber Sie haben sicher 1000 Zeichen und wahrscheinlich mehrere Größenordnungen mehr.)
Links zu den Charakterkategorien:
(im obigen regulären Ausdruck als "L" kombiniert)
* nb Dieser Perl-Regex soll nur die Syntax beschreiben - er funktioniert nicht in JavaScript, das (noch) keine Unterstützung für Unicode-Eigenschaften enthält. (Es gibt einige Pakete von Drittanbietern, die behaupten, solche Unterstützung hinzuzufügen.)
quelle
"test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
obwohl "test" ein gültiger JS-Variablenname ist\uD87E\uDC00
nicht zulässig , da JavaScript sie als zwei einzelne Ersatzhälften (z. B. ) interpretiert, die keinem der zulässigen Unicodes entsprechen Kategorien. Ihre Regex würde jedoch einen solchen Charakter zulassen. Außerdem fehlen U + 200C und U + 200D.Tatsächlich sagt ECMAScript auf Seite 15: Dass ein Bezeichner mit einem $, einem Unterstrich oder einem UnicodeLetter beginnen kann, und dann (direkt darunter) angegeben wird, dass ein UnicodeLetter ein beliebiges Zeichen aus den Unicode-Kategorien Lo, Ll sein kann , Lu, Lt, Lm und Nl. Und wenn Sie diese Kategorien nachschlagen, werden Sie feststellen, dass dies viel mehr Möglichkeiten eröffnet als nur lateinische Buchstaben. Suchen Sie einfach in Google nach "Unicode-Kategorien" und Sie können sie finden.
quelle
Javascript-Variablen
Sie können eine Variable mit einem beliebigen Buchstaben
$
oder_
Zeichen beginnen. Solange es nicht mit einer Zahl beginnt, können Sie auch Zahlen einfügen.Start:
[a-z], $, _
Enthalten:
[a-z], [0-9], $, _
jQuery
Sie können
_
für Ihre Bibliothek verwenden, damit sie neben jQuery steht. Es gibt jedoch eine Konfiguration, die Sie so festlegen können, dass jQuery nicht verwendet wird$
. Es wird stattdessen verwendetjQuery
. Stellen Sie dazu einfach Folgendes ein:Diese Seite erklärt, wie das geht.
quelle
Die akzeptierte Antwort würde , soweit ich sehen kann , viele gültige Kennungen ausschließen . Hier ist ein regulärer Ausdruck, den ich zusammengestellt habe und der der Spezifikation folgen sollte (siehe Kapitel 7.6 zu Bezeichnern). Erstellt es mit RegexBuddy und Sie können einen Export der Erklärung unter http://samples.geekality.net/js-identifiers finden .
Außerdem darf der Name keines der folgenden reservierten Wörter sein.
quelle
^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$
. Selbst mit der Korrektur kann ich diesen regulären Ausdruck nicht dazu bringen, tatsächlich zu funktionieren."test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
obwohl "test" ein gültiger JS-Variablenname isttest
wird auch akzeptiert.\uD87E\uDC00
nicht zulässig , da JavaScript sie als zwei einzelne Ersatzhälften (z. B. ) interpretiert, die keinem der zulässigen Unicodes entsprechen Kategorien. Ihre Regex würde jedoch einen solchen Charakter zulassen.eval
,arguments
,NaN
,Infinity
undundefined
Grenzfälle .Javascript-Variablen können Buchstaben, Ziffern, Dollarzeichen ($) und Unterstriche (_) enthalten. Sie können nicht mit Ziffern beginnen.
Normalerweise verwenden Bibliotheken
$
und_
als Verknüpfungen für Funktionen, die Sie überall verwenden werden. Obwohl die Namen$
oder_
nicht aussagekräftig sind, sind sie für ihre Kürze nützlich und da Sie die Funktion überall dort verwenden, wo Sie wissen sollen, was sie bedeuten.Wenn Ihre Bibliothek nicht darin besteht, dass eine einzige Funktion überall verwendet wird, würde ich empfehlen, dass Sie aussagekräftigere Namen verwenden, da diese Ihnen und anderen helfen, zu verstehen, was Ihr Code tut, ohne die Quellcode- Schönheit unbedingt zu beeinträchtigen .
Sie können zum Beispiel einen Blick auf die fantastische DateJS- Bibliothek werfen und auf den synthetischen Zucker, den sie zulässt, ohne dass Symbole oder Variablen mit kurzen Namen erforderlich sind.
Sie sollten Ihren Code zuerst praktisch machen und erst, nachdem Sie versucht haben, ihn hübsch zu machen.
quelle
Wenn reguläre Ausdrücke kein Muss sind, ist es nicht besser, den Browser zu bitten, sich für die Verwendung zu entscheiden
eval
?quelle
xss = alert("I'm in your vars executin mah scrip's");;;;;
Zum Beispiel ist kein gültiger Javascript-Variablenname.xss;alert("try again");
name
durch(typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )
? Wenn es sich um eine Zeichenfolge handelt, werden Klammern ersetzt (in Variablen definitiv nicht zulässig). Daher denke ich, dass es nahezu unmöglich wäre, etwas auszuführen.isValidVarName('aler(t')
wird es wahr. UndisValidVarName('_;;;')
bleibt wahr. Sie können aber zu Beginn prüfen, ob es mit so etwas übereinstimmt,/[;,\(\)]/
aber dann können Sie es trotzdem ausführen_=location="#!?"
, um=
es der Liste hinzuzufügen , aber Sie können es weiterhin ausführen'_\ndelete foo'
(was den Test als gültigen Variablennamen besteht), sodass Sie\n
s und\r
s und möglicherweise ausschließen müssen eine Unicode-Newline? Aber `$` ist keine gültige Kennung, daher müssen Sie alle Leerzeichen ausschließen ... Es ist ein verlorener Kampf. Ich denke, das ist so weit ich gegen mich selbst gehen kannif(/[;,\(\)=\s]/.exec(name))return!1
Hier ist ein kurzer Vorschlag zum Erstellen von Variablennamen. Wenn Sie möchten, dass die Variable bei der Verwendung in FireFox nicht in Konflikt gerät, verwenden Sie nicht den Variablennamen " _content ", da dieser Variablenname bereits vom Browser verwendet wird. Ich habe das auf die harte Tour herausgefunden und musste alle Stellen ändern, an denen ich die Variable "_content" in einer großen JavaScript-Anwendung verwendet habe.
quelle
Ich habe Anas Nakawas Idee aufgegriffen und verbessert. Erstens gibt es keinen Grund, die deklarierte Funktion tatsächlich auszuführen. Wir möchten wissen, ob es korrekt analysiert wird und nicht, ob der Code funktioniert. Zweitens ist ein wörtliches Objekt ein besserer Kontext für unseren Zweck, als
var XXX
da es schwieriger ist, aus ihm auszubrechen.quelle
isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
}
sollte dies ausschließen.isValidVarName("delete") === true
Schrieb einen Glitch-Arbeitsbereich , der alle Codepunkte durchläuft und das Zeichen ausgibt, wenn es
eval('var ' + String.fromCodePoint(#) + ' = 1')
funktioniert.Es geht einfach weiter und weiter und weiter ...
quelle