Pourquoi une variable JavaScript commencerait-elle par un signe dollar? [dupliquer]

1037

Je vois assez souvent JavaScript avec des variables qui commencent par un signe dollar. Quand / pourquoi choisiriez-vous de préfixer une variable de cette façon?

(Je ne parle pas de la $('p.foo')syntaxe que vous voyez dans jQuery et autres, mais des variables normales comme $nameet $order)

Ken
la source
16
C'est probablement une habitude reprise de la programmation Perl. (modifier: ou PHP)
brien
5
Certains langages l'exigent, comme PHP ou Perl - je suppose que le développeur ne se souvenait pas qu'il n'était pas nécessaire en javascript.
Rich Bradshaw
3
ou ils ne voulaient pas être dérangés d'abandonner l'habitude. C'est probablement la bonne réponse, car de nombreux développeurs qui piratent leur propre page Web le font en utilisant PHP et javascript.
BlueRaja - Danny Pflughoeft
@DonaldDuck Je pense que vous pourriez avoir vos doublons dans le mauvais sens - c'est 7 mois de plus que votre lien
Ken
1
@Ken Selon cette réponse , ce n'est pas l'âge qui compte mais la qualité des réponses. Personnellement, je pense que les réponses à l'autre question sont meilleures, c'est pourquoi j'ai voté pour fermer celle-ci en double. Si vous pensez que les réponses à cette question sont meilleures, vous pouvez voter pour fermer l'autre en double.
Donald Duck

Réponses:

1420

L'utilisation très courante dans jQuery consiste à distinguer les objets jQuery stockés dans des variables des autres variables.

Par exemple, je définirais:

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

Je trouve cela très utile pour écrire du code jQuery et permet de voir facilement les objets jQuery qui ont un ensemble de propriétés différent.

jonstjohn
la source
98
Ceci est la vraie notation hongroise. Il transmet des informations sur ce qui est stocké dans la variable au-delà de ce que fait le nom de la variable. A ++ serait à nouveau la Hongrie.
Artemis
2
Je souhaite que la documentation jquery utilise également cette notation ... C'est vraiment très utile.
pedromanoel
1
@Artemis J'ai acheté le hongrois il y a près de 20 ans et je n'ai jamais pu arrêter de l'utiliser. Au fil des ans, beaucoup de gens ont exprimé un grand mécontentement à l'égard de mon utilisation, mais c'est tellement utile que je ne comprends pas pourquoi.
Night Owl
10
Bravo pour le $. Mais les soulignements dans les noms de variables doivent être évités, les variables JS normales doivent utiliser camelCase. email_fields -> emailField. Seul le cas d'utilisation valide pour _ est comme préfixe pour les propriétés privées / protégées.
cschuff
11
@cschuff C'est tout à fait l'énoncé ... Je préfère les traits de soulignement pour toutes les variables locales, et réserve camel-case pour les propriétés des objets prototypes.
Paul
250

Dans les 1re, 2e et 3e éditions d'ECMAScript , l'utilisation de noms de variables préfixés par $ était explicitement déconseillée par la spécification, sauf dans le contexte du code généré automatiquement:

Le signe dollar ( $) et le trait de soulignement ( _) sont autorisés n'importe où dans un identifiant. Le signe dollar est destiné à être utilisé uniquement dans le code généré mécaniquement.

Cependant, dans la prochaine version (la 5e édition , qui est actuelle), cette restriction a été supprimée et le passage ci-dessus remplacé par

Le signe dollar ( $) et le trait de soulignement ( _) sont autorisés n'importe où dans un IdentifierName .

En tant que tel, le signe $ peut désormais être utilisé librement dans les noms de variables. Certains cadres et bibliothèques ont leurs propres conventions sur la signification du symbole, notées dans d'autres réponses ici.

cic
la source
3
Bien que cela puisse être vrai, cela aide-t-il vraiment à répondre à la question du PO? La réponse actuellement acceptée est meilleure - quand un programmeur JS novice voit $variable, c'est probablement parce qu'il contient un objet jQuery entier.
rinogo
14
@rinogo Il répond à la question avec une vérité absolue qui ne dépend pas des hypothèses sur les bibliothèques utilisées.
Oriol
1
@yoyo_fun: code généré par un ordinateur plutôt qu'écrit par un humain.
cic
3
"Il répond à la question avec une vérité absolue". En fait, la vérité était que les développeurs ignoraient complètement cette remarque de la spécification linguistique ... et le sont probablement toujours. :)
Stijn de Witt
61

Comme d'autres l'ont mentionné, le signe dollar est destiné à être utilisé par du code généré mécaniquement. Cependant, cette convention a été rompue par certaines bibliothèques JavaScript très populaires. JQuery, Prototype et MS AJAX (AKA Atlas) utilisent tous ce caractère dans leurs identifiants (ou comme identifiant complet).

En bref, vous pouvez utiliser le $quand vous le souhaitez. (L'interprète ne se plaindra pas.) La question est quand voulez- vous l' utiliser?

Personnellement, je ne l'utilise pas, mais je pense que son utilisation est valable. Je pense que MS AJAX l'utilise pour signifier qu'une fonction est un alias pour un appel plus détaillé.

Par exemple:

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

Cela semble être une convention raisonnable.

Benry
la source
JQuery ne l'utilise PAS dans les identificateurs, la raison pour laquelle $ .X est là doit simplement taper moins - jQuery.X est identique, en fait $ .X est un alias d'espace de noms pour jQuery.X - chaque fonctionnalité jQuery est dans le jQuery-ns, not $
specializt
5
@specializt comme je l'ai dit il y a 5 ans "ou comme identifiant complet". Par identifiant, je veux dire la définition CS standard qui est un jeton lexical qui n'est pas un mot-clé dans la langue. Dans ce cas, $ et jQuery sont deux identifiants différents qui font référence à la même valeur. Mais ce sont néanmoins des identifiants.
Benry
56

Dans le contexte d'AngularJS, le $préfixe est utilisé uniquement pour les identifiants dans le code du framework. Les utilisateurs du framework sont invités à ne pas l'utiliser dans leurs propres identifiants:

Espaces de noms angulaires $et$$

Pour éviter les collisions de noms accidentelles avec votre code, Angular préfixe les noms des objets publics avec $et les noms des objets privés avec $$. Veuillez ne pas utiliser le préfixe $ou $$dans votre code.

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

Travis Watson
la source
35

J'étais la personne qui a créé cette convention en 2006 et l'a promue sur la première liste de diffusion jQuery, alors permettez-moi de partager une partie de l'histoire et de la motivation autour d'elle.

La réponse acceptée donne cet exemple:

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

Mais cela ne l'illustre pas vraiment bien. Même sans le $, nous aurions toujours deux noms de variables différents ici, emailet email_field. C'est très bien ici. Pourquoi aurions-nous besoin de mettre un $dans l'un des noms alors que nous avons déjà deux noms différents?

En fait, je ne l'aurais pas utilisé email_fieldici pour deux raisons: names_with_underscoresne sont pas du JavaScript idiomatique et fieldn'ont pas vraiment de sens pour un élément DOM. Mais j'ai suivi la même idée.

J'ai essayé quelques choses différentes, parmi lesquelles quelque chose de très similaire à l'exemple:

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

(Bien sûr, un objet jQuery peut avoir plus d'un élément DOM, mais le code sur lequel je travaillais avait beaucoup de idsélecteurs, donc dans ces cas, il y avait une correspondance 1: 1.)

J'ai eu un autre cas où une fonction a reçu un élément DOM en tant que paramètre et avait également besoin d'un objet jQuery pour cela:

// 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
}

Eh bien, c'est un peu déroutant! Dans l'un de mes morceaux de code, emailest l'objet jQuery et emailElementest l'élément DOM, mais dans l'autre, emailest l'élément DOM et emailJQest l'objet jQuery.

Il n'y avait aucune consistance et je continuais à les mélanger. De plus, c'était un peu gênant de devoir inventer deux noms différents pour la même chose: un pour l'objet jQuery et un autre pour l'élément DOM correspondant. De plus email, emailElementet emailJQ, j'ai continué à essayer d'autres variantes aussi.

Ensuite, j'ai remarqué un schéma commun:

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

Étant donné que JavaScript traite $simplement comme une autre lettre pour les noms, et comme je récupère toujours un objet jQuery à partir d'un $(whatever)appel, le modèle est finalement apparu sur moi. Je pourrais prendre un $(...)appel et simplement supprimer certains caractères, et cela donnerait un nom assez sympa:

$("#email")
$(email)

Strikeout n'est pas parfait, mais vous pouvez avoir l'idée: avec certains caractères supprimés, ces deux lignes finissent par ressembler à:

$email

C'est alors que j'ai réalisé que je n'avais pas besoin de créer une convention comme emailElementou emailJQ. Il y avait déjà une belle convention qui me fixait: retirer certains personnages d'un $(whatever)appel et ça se transforme en $whatever.

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

et:

// 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!
}

Je n'ai donc pas eu à inventer deux noms différents tout le temps, mais je pouvais simplement utiliser le même nom avec ou sans $préfixe. Et le $préfixe était un bon rappel que j'avais affaire à un objet jQuery:

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

ou:

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

Stevo a raison, la signification et l'utilisation du signe du script dollar (en Javascript et sur la plate-forme jQuery, mais pas en PHP) sont complètement sémantiques. $ est un caractère qui peut être utilisé dans le cadre d'un nom d'identifiant. De plus, le signe dollar n'est peut-être pas la chose la plus "bizarre" que vous puissiez rencontrer en Javascript. Voici quelques exemples de noms d'identificateurs valides:

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

Tous les exemples ci-dessus fonctionneront.

Essayez les.

Mat
la source
7

Le caractère $ n'a pas de signification particulière pour le moteur JavaScript. C'est juste un autre caractère valide dans un nom de variable comme az, AZ, _, 0-9, etc ...


la source
2
vrai mais pas ce qui a été demandé. Je suis venu ici pour comprendre pourquoi il était utilisé et il semble que le cas où je le voyais était de discerner un var contenant un objet jquery entre un var contenant un objet dom.
rtpHarry
3
@rtpHarry vous n'êtes pas celui qui a posé la question, et la question "pourquoi" a été répondue ici de manière adéquate. Cela n'a rien à voir avec JQuery, comme cela a également été indiqué dans la question. En fait, je pense que la réponse ci-dessus correspond le mieux à la question - parfois si vous voulez saisir quelque chose dont vous avez besoin de la plus petite réponse claire - $n'a pas de signification particulière en JavaScript. Période.
amn
Je trouve que certains .. ahem ... les gens veulent ajouter des signes dollar aux noms de variables pour rendre les choses plus anguleuses.
glyphe
2

Puisqu'au _début d'un nom de variable est souvent utilisé pour indiquer une variable privée (ou au moins une destinée à rester privée), je trouve $pratique d'ajouter devant mes propres brèves alias aux bibliothèques de code génériques.

Par exemple, lorsque j'utilise jQuery, je préfère utiliser la variable $J(au lieu de simplement $) et utiliser $Plors de l'utilisation de php.js, etc.

Le préfixe le rend visuellement distinct des autres variables telles que mes propres variables statiques, m'indiquant que le code fait partie d'une bibliothèque ou d'une autre, et est moins susceptible de contredire ou de confondre les autres une fois qu'ils connaissent la convention.

Il n'encombre pas non plus le code (ou ne nécessite pas de saisie supplémentaire) comme le fait un nom entièrement spécifié répété pour chaque appel de bibliothèque.

J'aime à penser que c'est similaire à ce que font les touches de modification pour étendre les possibilités des touches simples.

Mais ce n'est que ma propre convention.

Brett Zamir
la source
2

Comme je l'ai expérimenté au cours des 4 dernières années, cela permettra à quelqu'un d'identifier facilement si la variable pointant une valeur / un objet ou un élément DOM enveloppé par jQuery

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

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

dans l'exemple ci-dessus, lorsque je vois la variable "$ dataDiv", je peux facilement dire que cette variable pointant vers un élément DOM enveloppé par jQuery (dans ce cas, il s'agit de div). et je peux également appeler toutes les méthodes jQuery sans encapsuler à nouveau l'objet comme $ dataDiv.append (), $ dataDiv.html (), $ dataDiv.find () au lieu de $ ($ dataDiv) .append ().

J'espère que cela peut aider. Je veux donc enfin dire que ce sera une bonne pratique de suivre cela, mais pas obligatoire.

Naga Srinu Kapusetti
la source
0

${varname} est juste une convention de dénomination que les développeurs jQuery utilisent pour distinguer les variables qui contiennent des éléments jQuery.

Plain {varname}est utilisé pour stocker des éléments généraux comme des textes et des chaînes. ${varname}contient les éléments renvoyés par jQuery.

Vous pouvez utiliser plain {varname} pour stocker des éléments jQuery, mais comme je l'ai dit au début, cela le distingue des variables simples et le rend beaucoup plus facile à comprendre (imaginez-le confondre pour une variable simple et chercher partout pour comprendre ce qu'elle contient) .

Par exemple :

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

Ici, blah stocke un élément jQuery retourné.

Ainsi, lorsque quelqu'un d'autre le verra $blahdans le code, il comprendra que ce n'est pas seulement une chaîne ou un nombre, c'est un élément jQuery.

Satyabrata Mishra
la source
6
Vous venez de reformuler la réponse acceptée d'il y a 6 ans.
Ken
Je suppose que cela ne rend pas la réponse "de mauvaise qualité".
Sunny R Gupta
-1

Bien que vous puissiez simplement l'utiliser pour préfixer vos identifiants, il est censé être utilisé pour le code généré, comme les jetons de remplacement dans un modèle, par exemple.

Ryan Abbott
la source
1
C'est vrai il y a six ans, mais plus.
Mark Amery
-2

Les utilisations angulaires concernent les propriétés générées par le framework. Devinez, ils vont par l'indice (maintenant disparu) fourni par l'ECMA-262 3.0.

Manish Jhawar
la source
-3

$ est utilisé pour DISTINGUER entre les variables communes et les variables jquery en cas de variables normales. laissez-vous passer une commande dans FLIPKART puis si la commande est une variable vous montrant la sortie de la chaîne alors elle est nommée simple comme "commande" mais si nous cliquons sur passer commande alors un objet est retourné cet objet sera désigné par $ comme "$ order "afin que le programmeur puisse extraire les variables javascript et les variables jquery dans tout le code.

Saurabh Saluja
la source
-4

Si vous voyez le signe dollar ($) ou le double signe dollar ($$) et que vous êtes curieux de savoir ce que cela signifie dans le cadre du prototype, voici votre réponse:

$$('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'

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

RussellW
la source
5
Le PO déclare spécifiquement qu'il ne pose pas de questions sur cette forme de préfixe dollar.
Nigel Alderton
-5

La raison pour laquelle j'utilise parfois des conventions de nom php avec des variables javascript: lors de la validation des entrées, je veux exécuter exactement les mêmes algorithmes côté client et côté serveur. Je veux vraiment que les deux côtés du code soient aussi similaires que possible, pour simplifier la maintenance. L'utilisation des signes dollar dans les noms de variables facilite cette opération.

(De plus, certaines fonctions d'aide judicieuses aident à rendre le code similaire, par exemple, en regroupant les recherches de valeur d'entrée, les versions non OO de strlen, substr, etc. Cela nécessite cependant quelques ajustements manuels.)

pas-juste-yeti
la source
-5

Un identifiant JavaScript valide shuold doit commencer par une lettre, un trait de soulignement (_) ou un signe dollar ($); les caractères suivants peuvent également être des chiffres (0-9). Parce que JavaScript est sensible à la casse, les lettres incluent les caractères "A" à "Z" (majuscules) et les caractères "a" à "z" (minuscules).

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

Harikesh Yadav
la source
La question n'était pas «Une variable JavasScript peut-elle commencer par un $?», Mais «Pourquoi un ...». toi OP cherchait une raison d'utiliser une telle convention de dénomination.
Steve Ives du