Warum sollte eine JavaScript-Variable mit einem Dollarzeichen beginnen? [Duplikat]

1037

Ich sehe ziemlich oft JavaScript mit Variablen, die mit einem Dollarzeichen beginnen. Wann / warum würden Sie eine Variable auf diese Weise voranstellen?

(Ich frage nicht nach der $('p.foo')Syntax, die Sie in jQuery und anderen sehen, sondern nach normalen Variablen wie $nameund $order)

Ken
quelle
16
Es ist wahrscheinlich eine Gewohnheit, die aus der Perl-Programmierung übernommen wurde. (edit: oder PHP)
brien
5
Einige Sprachen erfordern es, wie PHP oder Perl - ich vermute, dass der Entwickler sich nicht daran erinnert hat, dass es in Javascript nicht benötigt wird.
Rich Bradshaw
3
oder sie wollten sich nicht die Mühe machen, die Gewohnheit aufzugeben. Dies ist höchstwahrscheinlich die richtige Antwort, da so viele Entwickler, die ihre eigene Webseite zusammen hacken, dies mit PHP und Javascript tun.
BlueRaja - Danny Pflughoeft
@ DonaldDuck Ich denke, Sie könnten Ihre Duplikate falsch herum haben - dies ist 7 Monate älter als Ihr Link
Ken
1
@ Ken Nach dieser Antwort ist es nicht das Alter, das zählt, sondern wie gut die Antworten sind. Ich persönlich denke, die Antworten auf die andere Frage sind besser, weshalb ich dafür gestimmt habe, diese als Duplikat zu schließen. Wenn Sie der Meinung sind, dass die Antworten auf diese Frage besser sind, können Sie abstimmen, um die andere als Duplikat zu schließen.
Donald Duck

Antworten:

1420

In jQuery wird häufig verwendet , um in Variablen gespeicherte jQuery- Objekte von anderen Variablen zu unterscheiden.

Zum Beispiel würde ich definieren:

var $email = $("#email"); // refers to the jQuery object representation of the dom object
var email_field = $("#email").get(0); // refers to the dom object itself

Ich finde dies sehr hilfreich beim Schreiben von jQuery- Code und mache es einfach, jQuery- Objekte zu sehen , die andere Eigenschaften haben.

Jonstjohn
quelle
98
Dies ist die echte ungarische Notation. Es vermittelt Informationen darüber, was in der Variablen gespeichert ist, über das hinaus, was der Variablenname tut. A ++ würde Ungarn wieder.
Artemis
2
Ich wünschte, die jquery-Dokumentation würde auch diese Notation verwenden ... Es ist in der Tat sehr hilfreich.
Pedromanoel
1
@Artemis Ich habe vor fast 20 Jahren Ungarisch gelernt und konnte nie aufhören, es zu benutzen. Im Laufe der Jahre haben viele Menschen großes Missfallen über meine Verwendung zum Ausdruck gebracht, aber es ist so hilfreich, dass ich nicht verstehen kann, warum.
Nachteule
10
Daumen hoch für den $. Unterstriche in Variablennamen sollten jedoch vermieden werden, normale JS-Variablen sollten camelCase verwenden. email_fields -> emailField. Nur ein gültiger Anwendungsfall für _ ist ein Präfix für private / geschützte Eigenschaften.
Cschuff
11
@cschuff Das ist schon die Aussage ... Ich bevorzuge Unterstriche für alle lokalen Variablen und reserviere Camel-Case für Eigenschaften von Prototypobjekten.
Paul
250

In der 1., 2. und 3. Ausgabe von ECMAScript wurde von der Verwendung von $ -präfixierten Variablennamen ausdrücklich von der Spezifikation abgeraten, außer im Zusammenhang mit automatisch generiertem Code:

Das Dollarzeichen ( $) und der Unterstrich ( _) sind an einer beliebigen Stelle in einer Kennung zulässig. Das Dollarzeichen ist nur zur Verwendung in mechanisch generiertem Code vorgesehen.

In der nächsten Version (der 5. Ausgabe , die aktuell ist) wurde diese Einschränkung jedoch aufgehoben und die obige Passage durch ersetzt

Das Dollarzeichen ( $) und der Unterstrich ( _) sind an einer beliebigen Stelle in einem IdentifierName zulässig .

Daher kann das $ -Zeichen jetzt in Variablennamen frei verwendet werden. Bestimmte Frameworks und Bibliotheken haben ihre eigenen Konventionen zur Bedeutung des Symbols, die in anderen Antworten hier angegeben sind.

cic
quelle
3
Dies mag zwar zutreffen, hilft es aber wirklich, die Frage des OP zu beantworten? Die derzeit akzeptierte Antwort ist besser - wenn ein unerfahrener JS-Programmierer dies sieht $variable, liegt dies wahrscheinlich daran, dass es ein gesamtes jQuery-Objekt enthält.
Rinogo
14
@rinogo Es beantwortet die Frage mit einer absoluten Wahrheit, die nicht von Annahmen über die verwendeten Bibliotheken abhängt.
Oriol
1
@yoyo_fun: Code, der von einem Computer generiert und nicht von einem Menschen geschrieben wird.
Cic
3
"Es beantwortet die Frage mit einer absoluten Wahrheit". Tatsächlich war die Wahrheit, dass Entwickler diese Bemerkung aus der Sprachspezifikation völlig ignorierten ... und es wahrscheinlich immer noch sind. :)
Stijn de Witt
61

Wie andere bereits erwähnt haben, soll das Dollarzeichen von mechanisch generiertem Code verwendet werden. Diese Konvention wurde jedoch von einigen äußerst beliebten JavaScript-Bibliotheken verletzt. JQuery, Prototype und MS AJAX (AKA Atlas) verwenden dieses Zeichen in ihren Bezeichnern (oder als vollständige Bezeichner).

Kurz gesagt, Sie können das verwenden, $wann immer Sie möchten. (Der Dolmetscher wird sich nicht beschweren.) Die Frage ist, wann Sie es verwenden möchten ?

Ich persönlich benutze es nicht, aber ich denke, seine Verwendung ist gültig. Ich denke, MS AJAX verwendet es, um anzuzeigen, dass eine Funktion ein Alias ​​für einen ausführlicheren Aufruf ist.

Zum Beispiel:

var $get = function(id) { return document.getElementById(id); }

Das scheint eine vernünftige Konvention zu sein.

Benry
quelle
JQuery verwendet dies NICHT in Bezeichnern. Der Grund dafür, dass $ .X vorhanden ist, besteht darin, dass weniger eingegeben werden muss. JQuery.X ist identisch. Tatsächlich ist $ .X ein Namespace-Alias ​​für jQuery.X. Jede jQuery-Funktionalität befindet sich innerhalb von jQuery-ns, nicht $
spezialisiert
5
@specializt wie gesagt vor 5 Jahren "oder als ganze Kennung". Mit Bezeichner meine ich die Standard-CS-Definition, bei der es sich um ein lexikalisches Token handelt, das kein Schlüsselwort in der Sprache ist. In diesem Fall sind $ und jQuery zwei verschiedene Bezeichner, die auf denselben Wert verweisen. Trotzdem sind sie beide Identifikatoren.
Benry
56

Im Kontext von AngularJS wird das $Präfix nur für Bezeichner im Code des Frameworks verwendet. Benutzer des Frameworks werden angewiesen, es nicht in ihren eigenen Kennungen zu verwenden:

Angular Namespaces $und$$

Um versehentliche Namenskollisionen mit Ihrem Code zu vermeiden, stellt Angular Namen von öffentlichen Objekten mit $und Namen von privaten Objekten mit voran $$. Bitte verwenden Sie nicht das Präfix $oder $$in Ihrem Code.

Quelle: https://docs.angularjs.org/api

Travis Watson
quelle
35

Ich war die Person, die diese Konvention im Jahr 2006 ins Leben gerufen und auf der frühen jQuery-Mailingliste beworben hat. Lassen Sie mich also einen Teil der Geschichte und Motivation darüber teilen.

Die akzeptierte Antwort gibt dieses Beispiel:

var $email = $("#email"); // refers to the jQuery object representation of the dom object
var email_field = $("#email").get(0); // refers to the dom object itself

Aber das zeigt es nicht wirklich gut. Auch ohne die hätten $wir hier noch zwei verschiedene Variablennamen emailund email_field. Das ist genau dort genug gut. Warum sollten wir einen $in einen der Namen werfen müssen, wenn wir bereits zwei verschiedene Namen haben?

Eigentlich hätte ich email_fieldhier aus zwei Gründen nicht verwendet : names_with_underscoresSind kein idiomatisches JavaScript und fieldmachen für ein DOM-Element keinen Sinn. Aber ich bin der gleichen Idee gefolgt.

Ich habe ein paar verschiedene Dinge ausprobiert, darunter etwas, das dem Beispiel sehr ähnlich ist:

var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it

(Natürlich kann ein jQuery-Objekt mehr als ein DOM-Element haben, aber der Code, an dem ich gearbeitet habe, hatte viele idSelektoren, sodass in diesen Fällen eine 1: 1-Entsprechung bestand.)

Ich hatte einen anderen Fall, in dem eine Funktion ein DOM-Element als Parameter erhielt und dafür auch ein jQuery-Objekt benötigte:

// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
    var emailJQ = $(email);
    // Now email is the DOM element and emailJQ is a jQuery object for it
}

Nun, das ist ein bisschen verwirrend! In einem meiner Codebits emailbefindet sich das jQuery-Objekt und emailElementdas DOM-Element, in dem anderen emaildas DOM-Element und emailJQdas jQuery-Objekt.

Es gab keine Konsistenz und ich mischte sie weiter. Außerdem war es ein bisschen lästig, immer wieder zwei verschiedene Namen für dasselbe zu erfinden: einen für das jQuery-Objekt und einen für das passende DOM-Element. Außerdem email, emailElementund emailJQbehielt ich auch andere Variationen zu versuchen.

Dann bemerkte ich ein gemeinsames Muster:

var email = $("#email");
var emailJQ = $(email);

Da JavaScript $einfach als ein weiterer Buchstabe für Namen behandelt wird und ich bei einem $(whatever)Aufruf immer ein jQuery-Objekt zurückbekommen habe , ist mir das Muster endlich aufgefallen. Ich könnte einen $(...)Anruf entgegennehmen und nur einige Zeichen entfernen, und es würde sich ein ziemlich schöner Name ergeben:

$("#email")
$(email)

Strikeout ist nicht perfekt, aber Sie könnten auf die Idee kommen: Wenn einige Zeichen gelöscht werden, sehen beide Zeilen wie folgt aus:

$email

Da wurde mir klar, dass ich keine Konvention wie emailElementoder erfinden musste emailJQ. Es gab bereits eine nette Konvention, die mich anstarrte: Nehmen Sie einige Charaktere aus einem $(whatever)Anruf heraus und es wird zu $whatever.

var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object

und:

// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
    var $email = $(email);
    // $email is the jQuery object and email is the DOM object
    // Same names as in the code above. Yay!
}

Ich musste also nicht immer zwei verschiedene Namen erfinden, sondern konnte nur denselben Namen mit oder ohne $Präfix verwenden. Und das $Präfix war eine nette Erinnerung daran, dass ich es mit einem jQuery-Objekt zu tun hatte:

$('#email').click( ... );

oder:

var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );
Michael Geary
quelle
21

Stevo hat recht, die Bedeutung und Verwendung des Dollar-Skriptzeichens (in Javascript und der jQuery-Plattform, jedoch nicht in PHP) ist vollständig semantisch. $ ist ein Zeichen, das als Teil eines Bezeichnernamens verwendet werden kann. Darüber hinaus ist das Dollarzeichen vielleicht nicht das "seltsamste", was Sie in Javascript antreffen können. Hier einige Beispiele für gültige Bezeichnernamen:

var _       = function() { alert("hello from _"); }
var \u0024  = function() { alert("hello from $ defined as u0024"); }
var Ø       = function() { alert("hello from Ø"); }
var $$$$$   = function() { alert("hello from $$$$$"); }

Alle obigen Beispiele funktionieren.

Versuch sie.

Matt
quelle
7

Das $ -Zeichen hat für die JavaScript-Engine keine besondere Bedeutung. Es ist nur ein weiteres gültiges Zeichen in einem Variablennamen wie az, AZ, _, 0-9 usw.


quelle
2
wahr, aber nicht was gefragt wurde. Ich bin hierher gekommen, um zu verstehen, warum es verwendet wurde, und es scheint, dass der Fall, in dem ich es sah, darin bestand, eine Variable, die ein Abfrageobjekt enthält, zwischen einer Variablen zu unterscheiden, die ein dom-Objekt enthält.
RTPHarry
3
@rtpHarry Sie waren nicht derjenige, der die Frage gestellt hat, und die Frage "warum" wurde hier angemessen beantwortet. Dies hat nichts mit JQuery zu tun, wie auch in der Frage angegeben wurde. Tatsächlich denke ich, dass die obige Antwort am besten zur Frage passt - manchmal, wenn Sie etwas erfassen möchten, brauchen Sie die kleinste klarste Antwort - hat $in JavaScript keine besondere Bedeutung. Zeitraum.
Amn
Ich finde, dass bestimmte ... ähm ... Leute Variablennamen Dollarzeichen hinzufügen wollen, um die Dinge eckiger erscheinen zu lassen.
Glyphe
2

Da _am Anfang eines Variablennamens häufig eine private Variable angegeben wird (oder mindestens eine, die privat bleiben soll), finde ich es $praktisch, generische Codebibliotheken vor meinen eigenen kurzen Aliasnamen hinzuzufügen.

Wenn ich zum Beispiel jQuery verwende, bevorzuge ich die Variable $J(anstatt nur $) und die Verwendung $Pvon php.js usw.

Das Präfix unterscheidet es visuell von anderen Variablen wie meinen eigenen statischen Variablen, was mich darauf hinweist, dass der Code Teil einer Bibliothek oder einer anderen ist und andere weniger wahrscheinlich in Konflikt geraten oder verwirren, sobald sie die Konvention kennen.

Der Code wird auch nicht unübersichtlich (oder erfordert zusätzliche Eingabe), ebenso wenig wie ein vollständig angegebener Name, der für jeden Bibliotheksaufruf wiederholt wird.

Ich stelle mir das gerne so vor, wie es Modifizierertasten tun, um die Möglichkeiten einzelner Tasten zu erweitern.

Dies ist jedoch nur meine eigene Konvention.

Brett Zamir
quelle
2

Wie ich in den letzten 4 Jahren erlebt habe, kann jemand leicht erkennen, ob die Variable auf einen Wert / ein Objekt oder ein mit jQuery umschlossenes DOM-Element verweist

Ex:
var name = 'jQuery';
var lib = {name:'jQuery',version:1.6};

var $dataDiv = $('#myDataDiv');

Wenn ich im obigen Beispiel die Variable "$ dataDiv" sehe, kann ich leicht sagen, dass diese Variable auf ein mit jQuery umschlossenes DOM-Element verweist (in diesem Fall ist es div). Außerdem kann ich alle jQuery-Methoden aufrufen, ohne das Objekt erneut zu verpacken, z. B. $ dataDiv.append (), $ dataDiv.html (), $ dataDiv.find () anstelle von $ ($ dataDiv) .append ().

Hoffe es hat geholfen. Abschließend möchte ich sagen, dass es eine gute Praxis ist, dies zu befolgen, aber nicht obligatorisch.

Naga Srinu Kapusetti
quelle
0

${varname} ist nur eine Namenskonvention, mit der jQuery-Entwickler Variablen unterscheiden, die jQuery-Elemente enthalten.

In Plain {varname}werden allgemeine Inhalte wie Texte und Zeichenfolgen gespeichert. ${varname}enthält von jQuery zurückgegebene Elemente.

Sie können einfach verwenden {varname}, um jQuery-Elemente zu speichern, aber wie ich am Anfang sagte, unterscheidet es dies von den einfachen Variablen und erleichtert das Verständnis erheblich (stellen Sie sich vor, Sie verwechseln es mit einer einfachen Variablen und suchen überall, um zu verstehen, was es enthält). .

Beispielsweise :

var $blah = $(this).parents('.blahblah');

Hier speichert blah ein zurückgegebenes jQuery-Element.

Wenn jemand anderes das $blahim Code sieht , wird er verstehen, dass es sich nicht nur um eine Zeichenfolge oder eine Zahl handelt, sondern um ein jQuery-Element.

Satyabrata Mishra
quelle
6
Sie haben gerade die akzeptierte Antwort von vor 6 Jahren umformuliert.
Ken
Ich nehme an, das macht die Antwort nicht "minderwertig".
Sunny R Gupta
-1

Sie können es einfach zum Präfixieren Ihrer Bezeichner verwenden, es soll jedoch für generierten Code verwendet werden, z. B. für Ersatz-Token in einer Vorlage.

Ryan Abbott
quelle
1
Richtig vor sechs Jahren, aber nicht mehr.
Mark Amery
-2

Winkelverwendungen gelten für Eigenschaften, die vom Framework generiert werden. Vermutlich folgen sie dem (inzwischen nicht mehr existierenden) Hinweis des ECMA-262 3.0.

Manish Jhawar
quelle
-3

$ wird verwendet, um bei normalen Variablen zwischen allgemeinen Variablen und jquery-Variablen zu unterscheiden. Wenn Sie eine Bestellung in FLIPKART aufgeben, wird die Bestellung, wenn es sich um eine Variable handelt, die Ihnen die Zeichenfolgenausgabe anzeigt, einfach als "Bestellung" bezeichnet. Wenn wir jedoch auf "Bestellung aufgeben" klicken, wird ein Objekt zurückgegeben, das mit $ als "$" bezeichnet wird order ", damit der Programmierer die Javascript-Variablen und jquery-Variablen im gesamten Code herausschneiden kann.

Saurabh Saluja
quelle
-4

Wenn Sie das Dollarzeichen ($) oder das doppelte Dollarzeichen ($$) sehen und neugierig sind, was dies im Prototyp-Framework bedeutet, finden Sie hier Ihre Antwort:

$$('div');
// -> all DIVs in the document.  Same as document.getElementsByTagName('div')!

$$('#contents');
// -> same as $('contents'), only it returns an array anyway (even though IDs must be unique within a document).

$$('li.faux');
// -> all LI elements with class 'faux'

Quelle:
http://www.prototypejs.org/api/utility/dollar-dollar

RussellW
quelle
5
Das OP gibt ausdrücklich an, dass er nicht nach dieser Form des Dollarpräfix fragt.
Nigel Alderton
-5

Der Grund, warum ich manchmal PHP-Namenskonventionen mit Javascript-Variablen verwende: Bei der Eingabeüberprüfung möchte ich genau die gleichen Algorithmen sowohl auf der Clientseite als auch auf der Serverseite ausführen. Ich möchte wirklich, dass die beiden Seiten des Codes so ähnlich wie möglich aussehen, um die Wartung zu vereinfachen. Die Verwendung von Dollarzeichen in Variablennamen erleichtert dies.

(Außerdem helfen einige vernünftige Hilfsfunktionen dabei, den Code ähnlich aussehen zu lassen, z. B. das Umschließen von Eingabewert-Lookups, Nicht-OO-Versionen von strlen, substr usw. Es sind jedoch noch einige manuelle Anpassungen erforderlich.)

nicht nur Yeti
quelle
-5

Eine gültige JavaScript-Kennung muss mit einem Buchstaben, einem Unterstrich (_) oder einem Dollarzeichen ($) beginnen. Nachfolgende Zeichen können auch Ziffern (0-9) sein. Da bei JavaScript zwischen Groß- und Kleinschreibung unterschieden wird, enthalten Buchstaben die Zeichen "A" bis "Z" (Großbuchstaben) und die Zeichen "a" bis "z" (Kleinbuchstaben).

Details:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variables

Harikesh Yadav
quelle
Die Fragen lauteten nicht "Kann eine JavasScript-Variable mit einem $ beginnen?", Sondern "Warum sollte ein ...". Das OP suchte nach einem Grund, eine solche Namenskonvention zu verwenden.
Steve Ives