Perché una variabile JavaScript dovrebbe iniziare con un simbolo di dollaro? [duplicare]


1037

Vedo spesso JavaScript con variabili che iniziano con un segno di dollaro. Quando / perché dovresti scegliere di aggiungere un prefisso a una variabile in questo modo?

(Non sto chiedendo della $('p.foo')sintassi che vedi in jQuery e altri, ma variabili normali come $namee $order)


16
Probabilmente è un'abitudine presa dalla programmazione Perl. (modifica: o PHP)
brien,

5
Alcune lingue lo richiedono, come PHP o Perl - Immagino che lo sviluppatore non abbia ricordato che non è necessario in JavaScript.
Rich Bradshaw,

3
o non volevano preoccuparsi di abbandonare l'abitudine. Questa è probabilmente la risposta corretta, dal momento che così tanti sviluppatori che hackerano la propria pagina web lo fanno usando PHP e javascript.
BlueRaja - Danny Pflughoeft,

@DonaldDuck Penso che potresti avere i tuoi duplicati nel modo sbagliato - sono 7 mesi più vecchi del tuo link
Ken,

1
@Ken Secondo questa risposta , non è l'età che conta ma quanto sono buone le risposte. Personalmente penso che le risposte all'altra domanda siano migliori, motivo per cui ho votato per chiudere questo come duplicato. Se ritieni che le risposte a questa siano migliori, puoi votare per chiudere l'altra come duplicato.
Paperino,

Risposte:


1420

L'uso molto comune in jQuery è di distinguere gli oggetti jQuery memorizzati in variabili da altre variabili.

Ad esempio, definirei:

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

Trovo che ciò sia molto utile nella scrittura del codice jQuery e facilita la visualizzazione di oggetti jQuery che hanno un diverso set di proprietà.


98
Questa è la vera notazione ungherese. Fornisce informazioni su ciò che è memorizzato nella variabile oltre a ciò che fa il nome della variabile. A ++ sarebbe di nuovo l'Ungheria.
Artemide,

2
Vorrei che anche la documentazione di jquery usasse questa notazione ... È davvero molto utile.
Pedromanoel,

1
@Artemis Ho raccolto l'ungherese quasi 20 anni fa e non sono mai riuscito a smettere di usarlo. Nel corso degli anni molte persone hanno espresso grande dispiacere per il mio uso ma è così utile che non riesco a capire il perché.
Nottambulo,

10
Complimenti per $. Ma i caratteri di sottolineatura nei nomi delle variabili dovrebbero essere evitati, le normali variabili JS dovrebbero usare camelCase. email_fields -> emailField. Solo un caso d'uso valido per _ è come prefisso per proprietà private / protette.
cschuff,

11
@cschuff Questa è piuttosto l'affermazione ... Preferisco i trattini bassi per tutte le variabili locali e riservo il caso cammello per le proprietà degli oggetti prototipo.
Paul,

250

Nella prima, seconda e terza edizione di ECMAScript , l'utilizzo di nomi di variabili prefissati in $ era esplicitamente scoraggiato dalle specifiche, tranne nel contesto del codice generato automaticamente:

Il simbolo del dollaro ( $) e il trattino basso ( _) sono consentiti ovunque in un identificatore. Il simbolo del dollaro è destinato esclusivamente all'uso nel codice generato meccanicamente.

Tuttavia, nella prossima versione (la 5a edizione , che è attuale), questa restrizione è stata abbandonata e il passaggio precedente è stato sostituito

Il simbolo del dollaro ( $) e il trattino basso ( _) sono consentiti ovunque in un IdentifierName .

Pertanto, il simbolo $ può ora essere utilizzato liberamente nei nomi delle variabili. Alcuni framework e librerie hanno le loro convenzioni sul significato del simbolo, annotate in altre risposte qui.


3
Sebbene ciò possa essere vero, aiuta davvero a rispondere alla domanda del PO? La risposta attualmente accettata è migliore: quando vede un programmatore JS alle prime armi $variable, è probabile che contenga un intero oggetto jQuery.
Rinogo,

14
@rinogo Risponde alla domanda con una verità assoluta che non dipende da ipotesi sulle librerie utilizzate.
Oriol,

1
@yoyo_fun: codice generato da un computer anziché scritto da un essere umano.
cic


3
"Risponde alla domanda con una verità assoluta". In realtà, la verità era che gli sviluppatori stavano completamente ignorando questa osservazione dalle specifiche della lingua ... e probabilmente lo sono ancora. :)
Stijn de Witt,

61

Come altri hanno già detto, il simbolo del dollaro deve essere utilizzato dal codice generato meccanicamente. Tuttavia, tale convenzione è stata infranta da alcune librerie JavaScript estremamente popolari. JQuery, Prototype e MS AJAX (AKA Atlas) usano tutti questo personaggio nei loro identificatori (o come un intero identificatore).

In breve, puoi usare il $quando vuoi. (L'interprete non si lamenterà.) La domanda è quando vuoi usarlo?

Personalmente non lo uso, ma penso che sia valido. Penso che MS AJAX lo usi per indicare che una funzione è un alias per qualche chiamata più dettagliata.

Per esempio:

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

Sembra una convenzione ragionevole.


JQuery NON lo usa negli identificatori, la ragione per cui $ .X è semplicemente il fatto che bisogna semplicemente digitare di meno - jQuery.X è identico, infatti $ .X è un alias dello spazio dei nomi per jQuery.X - ogni funzionalità di jQuery è all'interno del jQuery-ns, non $
specializt

5
@specializt come ho detto 5 anni fa "o come un intero identificatore". Per identificatore intendo la definizione CS standard che è un token lessicale che non è una parola chiave nella lingua. In questo caso $ e jQuery sono due identificatori diversi che fanno riferimento allo stesso valore. Ma sono comunque entrambi identificatori.
Benry,

56

Nel contesto di AngularJS, il $prefisso viene utilizzato solo per gli identificatori nel codice del framework. Agli utenti del framework viene richiesto di non utilizzarlo nei propri identificatori:

Spazi dei nomi angolari $e$$

Per evitare collisioni accidentali di nomi con il codice, Prefissi angolari indica nomi di oggetti pubblici $e nomi di oggetti privati ​​con $$. Non utilizzare il prefisso $o $$nel codice.

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


35

Ero la persona che ha dato origine a questa convenzione nel 2006 e l'ho promossa nella prima mailing list di jQuery, quindi vorrei condividere un po 'della storia e della motivazione che la circondano.

La risposta accettata fornisce questo esempio:

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

Ma questo non lo illustra davvero bene. Anche senza il $, avremmo comunque due nomi di variabili differenti qui emaile email_field. Va molto bene proprio lì. Perché dovremmo aggiungere a $uno dei nomi quando abbiamo già due nomi diversi?

In realtà, non avrei usato email_fieldqui per due motivi: names_with_underscoresnon sono JavaScript idiomatico e fieldnon ha davvero senso per un elemento DOM. Ma ho seguito la stessa idea.

Ho provato alcune cose diverse, tra cui qualcosa di molto simile all'esempio:

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

(Naturalmente un oggetto jQuery può avere più di un elemento DOM, ma il codice su cui stavo lavorando aveva molti idselettori, quindi in quei casi c'era una corrispondenza 1: 1.)

Ho avuto un altro caso in cui una funzione ha ricevuto un elemento DOM come parametro e ha anche bisogno di un oggetto jQuery per esso:

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

Bene, questo è un po 'confuso! In uno dei miei bit di codice, emailè l'oggetto jQuery ed emailElementè l'elemento DOM, ma nell'altro emailè l'elemento DOM ed emailJQè l'oggetto jQuery.

Non c'era coerenza e ho continuato a mescolarli. Inoltre, è stato un po 'fastidioso dover continuare a creare due nomi diversi per la stessa cosa: uno per l'oggetto jQuery e un altro per l'elemento DOM corrispondente. Inoltre email, emailElemente emailJQ, ho continuato a provare anche altre varianti.

Poi ho notato uno schema comune:

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

Dato che JavaScript tratta $semplicemente un'altra lettera per i nomi e dato che da una $(whatever)chiamata ho sempre ricevuto un oggetto jQuery , il modello mi è finalmente apparso. Potrei rispondere a una $(...)chiamata e rimuovere solo alcuni caratteri, e sarebbe venuto fuori con un bel nome:

$("#email")
$(email)

Strikeout non è perfetto, ma potresti avere l'idea: con alcuni caratteri eliminati, entrambe le linee finiscono per apparire come:

$email

Fu allora che mi resi conto che non avevo bisogno di inventare una convention come emailElemento emailJQ. C'era già una simpatica convention che mi fissava: prendi alcuni personaggi da una $(whatever)chiamata e si trasforma in $whatever.

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

e:

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

Quindi non ho dovuto inventarmi sempre due nomi diversi, ma potevo semplicemente usare lo stesso nome con o senza $prefisso. E il $prefisso mi ha ricordato che avevo a che fare con un oggetto jQuery:

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

o:

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

21

Stevo ha ragione, il significato e l'uso del segno del dollaro (in Javascript e nella piattaforma jQuery, ma non in PHP) è completamente semantico. $ è un carattere che può essere utilizzato come parte del nome di un identificatore. Inoltre, il simbolo del dollaro non è forse la cosa più "strana" che puoi incontrare in Javascript. Ecco alcuni esempi di nomi identificativi validi:

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

Tutti gli esempi sopra funzioneranno.

Provali.


7

Il carattere $ non ha alcun significato speciale per il motore JavaScript. È solo un altro carattere valido in un nome variabile come az, AZ, _, 0-9, ecc ...


2
vero ma non quello che è stato chiesto. Sono venuto qui volendo capire perché è stato usato e sembra che il caso in cui stavo vedendo fosse di discernere una var contenente un oggetto jquery tra una var contenente un oggetto dom.
rtpHarry,

3
@rtpHarry non sei stato tu a porre la domanda e alla domanda "perché" è stata data una risposta adeguata qui. Questo non ha nulla a che fare con JQuery, come è stato affermato anche nella domanda. In effetti, penso che la risposta sopra si adatti meglio alla domanda - a volte se vuoi cogliere qualcosa di cui hai bisogno della risposta più piccola più chiara - $non ha alcun significato speciale in JavaScript. Periodo.
AMN

Trovo che certe ... ehm ... le persone vogliono aggiungere segni di dollaro ai nomi delle variabili per far sembrare le cose più angolari.
glifo

2

Dal momento che _all'inizio di un nome di variabile viene spesso utilizzato per indicare una variabile privata (o almeno una destinata a rimanere privata), trovo $conveniente per aggiungere davanti ai miei brevi alias a librerie di codici generici.

Ad esempio, quando utilizzo jQuery, preferisco usare la variabile $J (anziché solo $) e usare $Pquando si usa php.js, ecc.

Il prefisso lo rende visivamente distinto da altre variabili come le mie variabili statiche, indicandomi nel fatto che il codice fa parte di qualche libreria o altro, ed è meno probabile che sia in conflitto o confonda gli altri una volta che conoscono la convenzione.

Inoltre, non ingombra il codice (o non richiede una digitazione aggiuntiva) come un nome completamente specificato ripetuto per ogni chiamata in libreria.

Mi piace pensarlo come simile a quello che fanno i tasti modificatori per espandere le possibilità dei singoli tasti.

Ma questa è solo la mia convenzione.


2

Come ho sperimentato negli ultimi 4 anni, permetterà a qualcuno di identificare facilmente se la variabile che punta un valore / oggetto o un elemento DOM avvolto jQuery

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

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

nell'esempio sopra quando vedo la variabile "$ dataDiv" posso facilmente dire che questa variabile punta a un elemento DOM avvolto jQuery (in questo caso è div). e posso anche chiamare tutti i metodi jQuery senza ricoprire l'oggetto come $ dataDiv.append (), $ dataDiv.html (), $ dataDiv.find () invece di $ ($ dataDiv) .append ().

Spero che possa essere d'aiuto. quindi finalmente voglio dire che sarà una buona pratica seguire questo ma non obbligatorio.


0

${varname} è solo una convenzione di denominazione utilizzata dagli sviluppatori jQuery per distinguere le variabili che contengono elementi jQuery.

Plain {varname}è usato per archiviare cose generali come testi e stringhe. ${varname}contiene elementi restituiti da jQuery.

Puoi usare anche plain {varname}per memorizzare elementi jQuery, ma come ho detto all'inizio questo lo distingue dalle variabili semplici e rende molto più facile la comprensione (immagina di confonderlo per una variabile semplice e di cercare dappertutto per capire cosa contiene) .

Per esempio :

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

Qui, blah sta memorizzando un elemento jQuery restituito.

Quindi, quando qualcun altro vede il $blahcodice, capirà che non è solo una stringa o un numero, è un elemento jQuery.


6
Hai appena riformulato la risposta accettata da 6 anni fa.
Ken,

Suppongo che non renda la risposta "di bassa qualità".
Sunny R Gupta

-1

Mentre puoi semplicemente usarlo per aggiungere il prefisso ai tuoi identificatori, dovrebbe essere usato per il codice generato, come ad esempio i token di sostituzione in un modello.


1
Vero sei anni fa, ma non più.
Mark Amery,

-2

Gli usi angolari sono per le proprietà generate dal framework. Indovina, stanno seguendo il suggerimento (ora defunto) fornito dall'ECMA-262 3.0.


-3

$ viene utilizzato per distinguere tra variabili comuni e variabili jquery in caso di variabili normali. ti consente di effettuare un ordine in FLIPKART, quindi se l'ordine è una variabile che ti mostra l'output della stringa, allora viene chiamato semplice come "ordine" ma se facciamo clic sull'ordine del posto, viene restituito un oggetto che verrà indicato da $ come "$ ordine "in modo che il programmatore sia in grado di estrarre le variabili javascript e le variabili jquery nell'intero codice.


-4

Se vedi il simbolo del dollaro ($) o il doppio simbolo del dollaro ($$) e sei curioso di sapere cosa significhi nel framework Prototype, ecco la tua risposta:

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

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


5
Il PO afferma specificamente che non sta chiedendo questa forma del prefisso del dollaro.
Nigel Alderton,

-5

Il motivo per cui a volte utilizzo convenzioni di nomi php con variabili javascript: quando eseguo la convalida dell'input, voglio eseguire gli stessi identici algoritmi sia sul lato client che sul lato server. Voglio davvero che le due parti del codice siano il più simili possibile, per semplificare la manutenzione. L'uso del simbolo del dollaro nei nomi delle variabili rende tutto più semplice.

(Inoltre, alcune funzioni di supporto giudiziose aiutano a rendere il codice simile, ad esempio il wrapping di ricerche di valori di input, versioni non OO di strlen, substr, ecc. Tuttavia richiede comunque alcune modifiche manuali.)


-5

Un shuold identificatore JavaScript valido deve iniziare con una lettera, un trattino basso (_) o un segno di dollaro ($); i caratteri successivi possono anche essere cifre (0-9). Poiché JavaScript fa distinzione tra maiuscole e minuscole, le lettere includono i caratteri da "A" a "Z" (lettere maiuscole) e i caratteri da "a" a "z" (lettere minuscole).

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


La domanda non era "Può una variabile JavasScript iniziare con $?", Ma "Perché dovrebbe ...". il PO stava cercando un motivo per usare una simile convenzione di denominazione.
Steve Ives,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.