Dlaczego zmienna JavaScript miałaby zaczynać się od znaku dolara? [duplikować]


1036

Dość często widzę JavaScript ze zmiennymi zaczynającymi się od znaku dolara. Kiedy / dlaczego miałbyś wybrać prefiks zmiennej w ten sposób?

(Nie pytam o $('p.foo')składnię, którą widzisz w jQuery i innych, ale normalne zmienne, takie jak $namei $order)


16
Prawdopodobnie jest to nawyk wyjęty z programowania Perla. (edytuj: lub PHP)
brien

5
Niektóre języki tego wymagają, na przykład PHP lub Perl - zgaduję, że deweloper nie pamiętał, że nie jest potrzebny w javascript.
Rich Bradshaw

3
albo nie chcieli przeszkadzać, by porzucić nawyk. Jest to najprawdopodobniej poprawna odpowiedź, ponieważ tak wielu programistów, którzy hakują razem własną stronę internetową, robi to za pomocą PHP i javascript.
BlueRaja - Danny Pflughoeft

@DonaldDuck Myślę, że twoje duplikaty mogą być niewłaściwe - jest to o 7 miesięcy starsze niż twój link
Ken,

1
@Ken Zgodnie z tą odpowiedzią nie liczy się wiek, ale jak dobre są odpowiedzi. Osobiście uważam, że odpowiedzi na inne pytanie są lepsze i dlatego głosowałem za zamknięciem tego pytania jako duplikatu. Jeśli uważasz, że odpowiedzi na to pytanie są lepsze, możesz głosować za zamknięciem drugiego jako duplikatu.
Kaczor Donald

Odpowiedzi:


1419

Bardzo częstym zastosowaniem w jQuery jest odróżnianie obiektów jQuery przechowywanych w zmiennych od innych zmiennych.

Na przykład zdefiniowałbym:

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

Uważam, że jest to bardzo pomocne przy pisaniu kodu jQuery i ułatwia oglądanie obiektów jQuery, które mają inny zestaw właściwości.


98
To jest PRAWDZIWY zapis węgierski. Przekazuje informacje o tym, co jest przechowywane w zmiennej poza tym, co robi nazwa zmiennej. A ++ znów by Węgry.
Artemis,

2
Chciałbym, aby dokumentacja jquery również używała tego zapisu ... Jest to naprawdę bardzo pomocne.
pedromanoel

1
@Artemis Nabrałem węgierskiego prawie 20 lat temu i nigdy nie byłem w stanie przestać go używać. Przez lata wiele osób wyraziło niezadowolenie z mojego korzystania z niego, ale jest to tak pomocne, że nie mogę zrozumieć, dlaczego.
Night Owl

10
Kciuki za $. Jednak należy unikać podkreślania nazw zmiennych, normalne zmienne JS powinny używać camelCase. email_fields -> emailField. Tylko poprawny przypadek użycia _ jest prefiksem właściwości prywatnych / chronionych.
cschuff

11
@cschuff To jest całkiem stwierdzenie ... Wolę podkreślenia dla wszystkich zmiennych lokalnych i rezerwuję wielbłąd dla właściwości obiektów prototypowych.
Paul

250

W 1., 2. i 3. wydaniu ECMAScript używanie nazw zmiennych z prefiksem $ było wyraźnie odradzane przez specyfikację, z wyjątkiem kontekstu kodu generowanego automatycznie:

Znak dolara ( $) i znak podkreślenia ( _) są dozwolone w dowolnym miejscu w identyfikatorze. Znak dolara jest przeznaczony do użycia wyłącznie w kodzie generowanym mechanicznie.

Jednak w następnej wersji ( 5. edycja , która jest aktualna) to ograniczenie zostało zniesione, a powyższy fragment zastąpiono

Znak dolara ( $) i znak podkreślenia ( _) są dozwolone w dowolnym miejscu w identyfikatorze .

Jako taki znak $ może być teraz swobodnie używany w nazwach zmiennych. Niektóre frameworki i biblioteki mają swoje własne konwencje dotyczące znaczenia symbolu, odnotowane w innych odpowiedziach tutaj.


3
Chociaż może to być prawda, czy naprawdę pomaga odpowiedzieć na pytanie PO? Akceptowana obecnie odpowiedź jest lepsza - gdy początkujący programista JS widzi $variable, prawdopodobnie dzieje się tak, ponieważ zawiera cały obiekt jQuery.
rinogo

14
@rinogo Odpowiada na to pytanie z pewną absolutną prawdą, która nie zależy od założeń dotyczących używanych bibliotek.
Oriol

1
@yoyo_fun: kod generowany przez komputer, a nie przez człowieka.
cic


3
„Odpowiada na to pytanie absolutną prawdą”. Prawda była taka, że ​​deweloperzy całkowicie ignorowali tę uwagę ze specyfikacji językowej ... i prawdopodobnie nadal. :)
Stijn de Witt

61

Jak wspomnieli inni, znak dolara ma być używany przez kod generowany mechanicznie. Konwencja ta została jednak złamana przez niektóre bardzo popularne biblioteki JavaScript. JQuery, Prototype i MS AJAX (AKA Atlas) używają tego znaku w swoich identyfikatorach (lub jako cały identyfikator).

Krótko mówiąc, możesz używać, $kiedy tylko chcesz. (Tłumacz nie narzeka.) Pytanie brzmi, kiedy chcesz go użyć?

Ja osobiście go nie używam, ale myślę, że jego użycie jest prawidłowe. Myślę, że MS AJAX używa go do oznaczenia, że ​​funkcja jest aliasem dla bardziej szczegółowego wywołania.

Na przykład:

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

To wydaje się rozsądną konwencją.


JQuery NIE używa tego w identyfikatorach, ponieważ $ .X jest po prostu zmuszony pisać mniej - jQuery.X jest identyczny, w rzeczywistości $ .X jest aliasem przestrzeni nazw dla jQuery.X - każda funkcjonalność jQuery jest w obrębie jQuery-ns, a nie $
specializt

5
@specializt, jak powiedziałem 5 lat temu „lub jako cały identyfikator”. Przez identyfikator rozumiem standardową definicję CS, która jest leksykalnym tokenem, który nie jest słowem kluczowym w języku. W tym przypadku $ i jQuery to dwa różne identyfikatory, które odnoszą się do tej samej wartości. Ale oba są jednak identyfikatorami.
Benry,

56

W kontekście AngularJS $prefiks jest używany tylko dla identyfikatorów w kodzie frameworka. Użytkownicy frameworka są pouczani, aby nie używać go we własnych identyfikatorach:

Kątowe przestrzenie nazw $i$$

Aby zapobiec przypadkowym kolizjom nazw z Twoim kodem, Angular poprzedza nazwy obiektów publicznych za pomocą $i nazw obiektów prywatnych za pomocą $$. Nie używaj prefiksu $lub $$w swoim kodzie.

Źródło: https://docs.angularjs.org/api


35

Byłem osobą, która zapoczątkowała tę konwencję w 2006 roku i wypromowałam ją na wczesnej liście mailingowej jQuery, więc pozwólcie, że podzielę się historią i motywacją wokół niej.

Zaakceptowana odpowiedź podaje następujący przykład:

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

Ale to tak naprawdę nie ilustruje tego dobrze. Nawet bez $, nadal mielibyśmy tutaj dwie różne nazwy zmiennych emaili email_field. Tam jest mnóstwo dobrych rzeczy. Dlaczego musielibyśmy wrzucić $jedno z imion, skoro mamy już dwa różne imiona?

Właściwie nie użyłbym email_fieldtutaj z dwóch powodów: names_with_underscoresnie są idiomatycznym JavaScriptem i fieldnie mają sensu dla elementu DOM. Ale podążyłem za tym samym pomysłem.

Próbowałem kilku różnych rzeczy, w tym czegoś bardzo podobnego do przykładu:

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

(Oczywiście obiekt jQuery może mieć więcej niż jeden element DOM, ale kod, nad którym pracowałem, miał wiele id selektorów, więc w tych przypadkach istniała korespondencja 1: 1).

Miałem inny przypadek, w którym funkcja otrzymała element DOM jako parametr i również potrzebowała do tego obiektu jQuery:

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

To trochę mylące! W jednym z moich fragmentów kodu emailznajduje się obiekt jQuery i emailElementelement DOM, ale w drugim emailjest element DOM i emailJQobiekt jQuery.

Nie było spójności i ciągle je mieszałem. Dodatkowo było trochę uciążliwości wymyślić dwie różne nazwy dla tej samej rzeczy: jedną dla obiektu jQuery i drugą dla pasującego elementu DOM. Poza tym email, emailElementiemailJQ , Próbowałem też inne odmiany.

Potem zauważyłem wspólny wzór:

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

Ponieważ JavaScript traktuje $jak zwykłą literę nazw, a ponieważ zawsze otrzymywałem obiekt jQuery po $(whatever)wywołaniu, wzorzec ostatecznie do mnie dotarł . Mógłbym odebrać $(...)telefon i po prostu usunąć niektóre postacie, a to wymyśliłoby całkiem ładne imię:

$("#email")
$(email)

Strikeout nie jest idealny, ale możesz wpaść na pomysł: po usunięciu niektórych znaków obie te linie wyglądają następująco:

$email

Wtedy zdałem sobie sprawę, że nie muszę wymyślać konwencji takiej jak emailElementlub emailJQ. Wpatrywała się we mnie już ładna konwencja: wyjmij niektóre postacie z $(whatever)rozmowy, a to się zmieni $whatever.

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

i:

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

Nie musiałem więc wymyślać dwóch różnych nazw przez cały czas, ale mogłem używać tej samej nazwy z $prefiksem lub bez . A $prefiks był miłym przypomnieniem, że miałem do czynienia z obiektem jQuery:

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

lub:

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

21

Stevo ma rację, znaczenie i użycie znaku skryptu dolara (w JavaScript i platformie jQuery, ale nie w PHP) jest całkowicie semantyczne. $ jest znakiem, który może być użyty jako część nazwy identyfikatora. Ponadto znak dolara nie jest może najbardziej „dziwną” rzeczą, jaką można spotkać w JavaScript. Oto kilka przykładów prawidłowych nazw identyfikatorów:

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

Wszystkie powyższe przykłady będą działać.

Spróbuj ich.


7

Znak $ nie ma specjalnego znaczenia dla silnika JavaScript. To po prostu kolejny prawidłowy znak w nazwie zmiennej, np. Az, AZ, _, 0-9 itp.


2
prawda, ale nie o co pytano. Przybyłem tutaj, chcąc zrozumieć, dlaczego został użyty i wydaje się, że przypadek, w którym go widziałem, polegał na rozróżnieniu zmiennej zawierającej obiekt jquery między zmienną zawierającą obiekt dom.
rtpHarry

3
@rtpHarry to nie ty zadawałeś pytanie, a pytanie „dlaczego” zostało tutaj odpowiednio udzielone. Nie ma to nic wspólnego z JQuery, jak stwierdzono w pytaniu. W rzeczywistości uważam, że powyższa odpowiedź najlepiej pasuje do pytania - czasami jeśli chcesz uchwycić coś, czego potrzebujesz najmniejszą klarowną odpowiedź - $nie ma specjalnego znaczenia w JavaScript. Kropka.
am

Uważam, że pewne… hmm… ludzie chcą dodawać znaki dolara do nazw zmiennych, aby wyglądały bardziej kątowo.
glif

2

Ponieważ _na początku nazwa zmiennej jest często używana do wskazania zmiennej prywatnej (lub przynajmniej takiej, która ma pozostać prywatna), uważam, że $wygodnie jest dodać przed własnymi krótkimi aliasami do ogólnych bibliotek kodów.

Na przykład, używając jQuery, wolę używać zmiennej $J(zamiast po prostu $) i używać, $Pgdy używam php.js itp.

Prefiks odróżnia go wizualnie od innych zmiennych, takich jak moje własne zmienne statyczne, co uwikłuje mnie w fakt, że kod jest częścią jakiejś biblioteki lub innej i jest mniej prawdopodobne, że konflikt lub pomieszanie innych, gdy poznają konwencję.

Nie zaśmieca także kodu (ani nie wymaga dodatkowego pisania), podobnie jak w przypadku pełnej nazwy biblioteki powtarzanej w pełni.

Lubię myśleć, że jest podobny do tego, co robią klawisze modyfikujące w celu rozszerzenia możliwości pojedynczych klawiszy.

Ale to tylko moja konwencja.


2

Jak doświadczyłem przez ostatnie 4 lata, pozwoli to na łatwą identyfikację, czy zmienna wskazująca wartość / obiekt lub element DOM zawinięty w jQuery

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

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

w powyższym przykładzie, gdy widzę zmienną „$ dataDiv”, mogę łatwo powiedzieć, że ta zmienna wskazuje na element DOM zawinięty w jQuery (w tym przypadku jest to div). a także mogę wywoływać wszystkie metody jQuery bez ponownego zawijania obiektu, takie jak $ dataDiv.append (), $ dataDiv.html (), $ dataDiv.find () zamiast $ ($ dataDiv) .append ().

Mam nadzieję, że to może pomóc. więc w końcu chcę powiedzieć, że dobrą praktyką będzie przestrzeganie tego, ale nie będzie to obowiązkowe.


0

${varname} jest tylko konwencją nazewnictwa używaną przez programistów jQuery do rozróżniania zmiennych, które przechowują elementy jQuery.

Zwykły {varname}służy do przechowywania ogólnych rzeczy, takich jak teksty i ciągi znaków. ${varname}przechowuje elementy zwrócone z jQuery.

Możesz używać zwykłego {varname}do przechowywania elementów jQuery, ale jak powiedziałem na początku, to odróżnia go od zwykłych zmiennych i znacznie ułatwia zrozumienie (wyobraź sobie, że mylę go dla zwykłej zmiennej i szukam wszystkiego, aby zrozumieć, co ona zawiera) .

Na przykład :

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

Tutaj bla przechowuje zwrócony element jQuery.

Kiedy więc ktoś zobaczy $blahkod, zrozumie, że to nie tylko ciąg znaków lub liczba, to element jQuery.


6
Właśnie sformułowałeś zaakceptowaną odpowiedź sprzed 6 lat.
Ken

Przypuszczam, że to nie czyni odpowiedzi „niskiej jakości”.
Sunny R Gupta

-1

Chociaż można go po prostu użyć do prefiksu identyfikatorów, należy go użyć do wygenerowanego kodu, na przykład tokenów zastępczych w szablonie.


1
Prawda sześć lat temu, ale już nie.
Mark Amery

-2

Zastosowania kątowe dotyczą właściwości generowanych przez środowisko. Sądzą, że podążają za (teraz nieistniejącą) wskazówką ECMA-262 3.0.


-3

$ służy do rozróżnienia między zmiennymi wspólnymi a zmiennymi jquery w przypadku zmiennych normalnych. pozwól nam złożyć zamówienie we FLIPKART, a jeśli zamówienie jest zmienną pokazującą wynik łańcucha, wówczas jest nazywane prostym jako „zamówienie”, ale jeśli klikniemy polecenie zamówienia, obiekt zostanie zwrócony, ten obiekt będzie oznaczony przez $ jako „$ order ”, aby programista mógł wyciąć zmienne javascript i zmienne jquery w całym kodzie.


-4

Jeśli widzisz znak dolara ($) lub podwójny znak dolara ($$) i zastanawiasz się, co to oznacza w ramach Prototypu, oto Twoja odpowiedź:

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

Źródło:
http://www.prototypejs.org/api/utility/dollar-dollar


5
OP wyraźnie stwierdza, że ​​nie pyta o tę formę prefiksu dolara.
Nigel Alderton,

-5

Powód, dla którego czasami używam konwencji nazw php ze zmiennymi javascript: Podczas sprawdzania poprawności danych wejściowych chcę uruchamiać dokładnie te same algorytmy zarówno po stronie klienta, jak i po stronie serwera. Naprawdę chcę, aby obie strony kodu wyglądały tak podobnie, jak to możliwe, aby uprościć konserwację. Użycie znaków dolara w nazwach zmiennych ułatwia to.

(Ponadto niektóre rozsądne funkcje pomocnicze pomagają upodabniać kod, np. Owijanie odnośników wartości wejściowych, wersje strlen, substr itp. Inne niż OO. Mimo to wymaga to ręcznego dostosowania).


-5

Prawidłowy shuold identyfikatora JavaScript musi zaczynać się od litery, podkreślenia (_) lub znaku dolara ($); kolejne znaki mogą być również cyframi (0–9). Ponieważ JavaScript rozróżnia małe i duże litery, litery zawierają znaki od „A” do „Z” (wielkie litery) oraz znaki „a” do „z” (małe litery).

Szczegóły:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variables


Pytania nie brzmiały: „Czy zmienna JavaScript może zaczynać się od $?”, Ale „Dlaczego miałaby ...”. OP szukał powodu do zastosowania takiej konwencji nazewnictwa.
Steve Ives,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.