Por que uma variável JavaScript começaria com um cifrão? [duplicado]

1037

Frequentemente vejo JavaScript com variáveis ​​que começam com um cifrão. Quando / por que você escolheria o prefixo de uma variável dessa maneira?

(Eu não estou perguntando sobre a $('p.foo')sintaxe que você vê no jQuery e outros, mas variáveis ​​normais como $namee $order)

Ken
fonte
16
Provavelmente é um hábito adquirido na programação Perl. (edit: or PHP)
brien
5
Algumas linguagens exigem isso, como PHP ou Perl - acho que o desenvolvedor não se lembrava de que não era necessário em javascript.
Rich Bradshaw
3
ou eles não queriam se preocupar em abandonar o hábito. Essa é provavelmente a resposta correta, pois muitos desenvolvedores que hackearam sua própria página da Web o fazem usando PHP e javascript.
BlueRaja - Danny Pflughoeft
@DonaldDuck Eu acho que você pode ter suas duplicatas da maneira errada - isso é 7 meses mais antigo que o seu link #
21717 Ken #:
1
@ Ken De acordo com esta resposta , não é a idade que importa, mas o quão boas são as respostas. Pessoalmente, acho que as respostas para a outra pergunta são melhores, e foi por isso que votei para fechar esta como uma duplicata. Se você acha que as respostas para essa são melhores, você pode votar para fechar a outra como duplicada.
Donald Duck

Respostas:

1420

O uso muito comum no jQuery é distinguir objetos jQuery armazenados em variáveis ​​de outras variáveis.

Por exemplo, eu definiria:

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

Acho que isso é muito útil para escrever código jQuery e facilita a exibição de objetos jQuery que possuem um conjunto diferente de propriedades.

Jonstjohn
fonte
98
Esta é a notação húngara REAL. Ele transmite informações sobre o que é armazenado na variável além do que o nome da variável faz. A ++ faria a Hungria novamente.
Artemis
2
Eu gostaria que a documentação do jquery também usasse essa notação ... É realmente muito útil.
pedromanoel 28/01
1
@Artemis Peguei húngaro há quase 20 anos e nunca consegui parar de usá-lo. Ao longo dos anos, muitas pessoas manifestaram grande descontentamento com o uso, mas é tão útil que não consigo entender o porquê.
Night Owl
10
Polegares para cima para o $. Porém, sublinhados nos nomes das variáveis ​​devem ser evitados, as variáveis ​​JS normais devem usar camelCase. email_fields -> emailField. Somente casos de uso válidos para _ são como prefixo para propriedades privadas / protegidas.
Cschuff # 22/14
11
@cschuff Essa é bem a afirmação ... prefiro sublinhados para todas as variáveis ​​locais e reservo camel-case para propriedades de objetos protótipos.
Paul
250

Na 1ª, 2ª e 3ª edição do ECMAScript , o uso de nomes de variáveis ​​com prefixo $ foi explicitamente desencorajado pelas especificações, exceto no contexto do código gerado automaticamente:

O cifrão ( $) e o sublinhado ( _) são permitidos em qualquer lugar do identificador. O cifrão destina-se ao uso somente em código gerado mecanicamente.

No entanto, na próxima versão (a 5ª edição , atual), essa restrição foi descartada e a passagem acima substituída por

O cifrão ( $) e o sublinhado ( _) são permitidos em qualquer lugar em um IdentifierName .

Como tal, o sinal $ agora pode ser usado livremente em nomes de variáveis. Certas estruturas e bibliotecas têm suas próprias convenções sobre o significado do símbolo, anotadas em outras respostas aqui.

cic
fonte
3
Embora isso possa ser verdade, realmente ajuda a responder à pergunta do OP? A resposta atualmente aceita é melhor - quando um programador iniciante em JS vê $variable, é provável que contenha um objeto jQuery inteiro.
rinogo 24/03
14
@rinogo Responde à pergunta com alguma verdade absoluta, que não depende de suposições sobre as bibliotecas usadas.
Oriol
1
@yoyo_fun: código que é gerado por um computador e não escrito por um ser humano.
28616
3
"Responde à pergunta com alguma verdade absoluta". Na verdade, a verdade é que os desenvolvedores estavam ignorando completamente essa observação das especificações da linguagem ... e provavelmente ainda o são. :)
Stijn de Witt
61

Como outros mencionaram, o cifrão deve ser usado pelo código gerado mecanicamente. No entanto, essa convenção foi quebrada por algumas bibliotecas JavaScript muito populares. JQuery, Prototype e MS AJAX (AKA Atlas), todos usam esse caractere em seus identificadores (ou como um identificador inteiro).

Em suma, você pode usar o $quando quiser. (O intérprete não vai reclamar.) A questão é quando você quer usá-lo?

Eu pessoalmente não o uso, mas acho que seu uso é válido. Eu acho que o MS AJAX usa para significar que uma função é um alias para uma chamada mais detalhada.

Por exemplo:

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

Parece uma convenção razoável.

Benry
fonte
O JQuery NÃO usa isso nos identificadores, o motivo pelo qual $ .X é simplesmente digitar menos - jQuery.X é idêntico; na verdade, $ .X é um alias de namespace para jQuery.X - todas as funcionalidades do jQuery estão dentro do jQuery-ns, e não $
specializt
5
@specializt como eu disse há 5 anos "ou como um identificador inteiro". Por identificador, quero dizer a definição padrão de CS, que é um token lexical que não é uma palavra-chave no idioma. Nesse caso, $ e jQuery são dois identificadores diferentes que referenciam o mesmo valor. Mas ambos são identificadores, no entanto.
Benry 12/07/2013
56

No contexto do AngularJS, o $prefixo é usado apenas para identificadores no código da estrutura. Os usuários da estrutura são instruídos a não usá-la em seus próprios identificadores:

Namespaces angulares $e$$

Para evitar colisões acidentais de nomes com seu código, Angular prefixa nomes de objetos públicos $e nomes de objetos particulares $$. Por favor, não use o prefixo $ou $$no seu código.

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

Travis Watson
fonte
35

Eu fui a pessoa que originou essa convenção em 2006 e a promoveu na lista de discussão inicial do jQuery, então deixe-me compartilhar um pouco da história e da motivação em torno dela.

A resposta aceita dá este exemplo:

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

Mas isso realmente não ilustra bem. Mesmo sem o $, ainda teríamos dois nomes de variáveis ​​diferentes aqui, emaile email_field. Isso é muito bom aqui. Por que precisaríamos colocar um $em um dos nomes quando já temos dois nomes diferentes?

Na verdade, eu não teria usado email_fieldaqui por dois motivos: names_with_underscoresnão é JavaScript idiomático e fieldrealmente não faz sentido para um elemento DOM. Mas eu segui a mesma ideia.

Eu tentei algumas coisas diferentes, entre elas algo muito semelhante ao exemplo:

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

(É claro que um objeto jQuery pode ter mais de um elemento DOM, mas o código no qual eu estava trabalhando tinha muitas id seletores; portanto, nesses casos, havia uma correspondência 1: 1.)

Eu tive outro caso em que uma função recebeu um elemento DOM como parâmetro e também precisava de um objeto 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
}

Bem, isso é um pouco confuso! Em um dos meus bits de código, emailestá o objeto jQuery e emailElementé o elemento DOM, mas no outro, emailé o elemento DOM e emailJQé o objeto jQuery.

Não havia consistência e eu continuei misturando-os. Além disso, era um pouco incômodo continuar criando dois nomes diferentes para a mesma coisa: um para o objeto jQuery e outro para o elemento DOM correspondente. Além de email, emailElementeemailJQ , eu continuei tentando outras variações também.

Então notei um padrão comum:

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

Como o JavaScript trata $simplesmente como outra letra para nomes, e como sempre recebi um objeto jQuery de uma $(whatever)chamada, o padrão finalmente me ocorreu. Eu poderia atender uma $(...)ligação e apenas remover alguns caracteres, e ele teria um nome muito bonito:

$("#email")
$(email)

Strikeout não é perfeito, mas você pode ter a idéia: com alguns caracteres excluídos, ambas as linhas acabam parecendo:

$email

Foi quando percebi que não precisava criar uma convenção como emailElementou emailJQ. Já havia uma boa convenção me encarando: desconecte alguns caracteres de uma $(whatever)ligação e ela se transforma $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!
}

Portanto, não tive que inventar dois nomes diferentes o tempo todo, mas poderia usar o mesmo nome com ou sem um $prefixo. E o $prefixo era um bom lembrete de que eu estava lidando com um objeto jQuery:

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

ou:

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

Stevo está certo, o significado e o uso do cifrão (em Javascript e na plataforma jQuery, mas não em PHP) é totalmente semântico. $ é um caractere que pode ser usado como parte de um nome de identificador. Além disso, o cifrão talvez não seja a coisa mais "estranha" que você pode encontrar em Javascript. Aqui estão alguns exemplos de nomes de identificadores válidos:

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

Todos os exemplos acima funcionarão.

Tente eles.

Matt
fonte
7

O caractere $ não tem significado especial para o mecanismo JavaScript. É apenas outro caractere válido em um nome de variável como az, AZ, _, 0-9, etc ...


fonte
2
verdadeiro, mas não o que foi solicitado. Eu vim aqui querendo entender por que ele foi usado e parece que o caso em que eu estava vendo era discernir um var contendo um objeto jquery entre um var contendo um objeto dom.
precisa saber é o seguinte
3
@rtpHarry, não foi você quem fez a pergunta, e a pergunta "por que" foi respondida aqui adequadamente. Isso não tem nada a ver com o JQuery, como também foi afirmado na pergunta. Na verdade, acho que a resposta acima se encaixa melhor na pergunta - às vezes, se você deseja entender algo que precisa da menor resposta mais clara - $não tem significado especial no JavaScript. Período.
quer
Acho que ... ah ... as pessoas querem adicionar cifrões a nomes de variáveis ​​para fazer as coisas parecerem mais angulares.
Glifo
2

Como _no início de um nome de variável é frequentemente usado para indicar uma variável privada (ou pelo menos uma que se destina a permanecer privada), acho$ conveniente adicionar em frente aos meus breves aliases às bibliotecas de códigos genéricas.

Por exemplo, ao usar jQuery, prefiro usar a variável $J(em vez de apenas $) e usar$P ao usar o php.js, etc.

O prefixo o torna visualmente distinto de outras variáveis, como minhas próprias variáveis ​​estáticas, levando-me ao fato de que o código faz parte de alguma biblioteca ou outra e é menos provável que entre em conflito ou confunda outras pessoas quando conhecerem a convenção.

Ele também não confunde o código (ou requer digitação extra), assim como um nome totalmente especificado repetido para cada chamada de biblioteca.

Eu gosto de pensar nisso como sendo semelhante ao que as teclas modificadoras fazem para expandir as possibilidades de teclas únicas.

Mas esta é apenas a minha própria convenção.

Brett Zamir
fonte
2

Como experimentei nos últimos 4 anos, permitirá que alguém identifique facilmente se a variável que aponta um valor / objeto ou um elemento DOM envolto por jQuery

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

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

no exemplo acima, quando vejo a variável "$ dataDiv", posso facilmente dizer que essa variável está apontando para um elemento DOM envolto em jQuery (nesse caso, é div). e também posso chamar todos os métodos jQuery sem quebrar o objeto novamente como $ dataDiv.append (), $ dataDiv.html (), $ dataDiv.find () em vez de $ ($ dataDiv) .append ().

Espero que possa ter ajudado. então, finalmente, quero dizer que será uma boa prática seguir isso, mas não obrigatório.

Naga Srinu Kapusetti
fonte
0

${varname} é apenas uma convenção de nomenclatura que os desenvolvedores do jQuery usam para distinguir variáveis ​​que estão contendo elementos do jQuery.

Plain {varname}é usado para armazenar materiais em geral, como textos e strings. ${varname}contém elementos retornados do jQuery.

Você pode usar planície {varname} para armazenar elementos jQuery, mas, como eu disse no começo, isso os diferencia das variáveis ​​simples e facilita muito o entendimento (imagine confundi-lo com uma variável simples e pesquisar por tudo para entender o que ele contém) .

Por exemplo :

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

Aqui, blá está armazenando um elemento jQuery retornado.

Portanto, quando alguém vê o $blahcódigo, ele entende que não é apenas uma sequência ou um número, é um elemento jQuery.

Satyabrata Mishra
fonte
6
Você acabou de reformular a resposta aceita de 6 anos atrás.
Ken
Suponho que isso não torne a resposta "de baixa qualidade".
Ensolarado R Gupta
-1

Embora você possa simplesmente usá-lo para prefixar seus identificadores, ele deve ser usado para o código gerado, como tokens de substituição em um modelo, por exemplo.

Ryan Abbott
fonte
1
É verdade seis anos atrás, mas não mais.
Mark Amery
-2

Usos angulares são para propriedades geradas pela estrutura. Acho que eles estão seguindo a dica (agora extinta) fornecida pelo ECMA-262 3.0.

Manish Jhawar
fonte
-3

$ é usado para DISTINGUISH entre variáveis ​​comuns e variáveis ​​de jquery no caso de variáveis ​​normais. permitir que você faça um pedido no FLIPKART; se o pedido for uma variável que mostre a saída da string, ele será nomeado simples como "order"; order "para que o programador consiga extrair as variáveis ​​javascript e as variáveis ​​jquery em todo o código.

Saurabh Saluja
fonte
-4

Se você vir o cifrão ($) ou o cifrão duplo ($$) e estiver curioso para saber o que isso significa na estrutura do Prototype, aqui está sua resposta:

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

RussellW
fonte
5
O OP afirma especificamente que ele não está perguntando sobre essa forma do prefixo do dólar.
Nigel Alderton
-5

Às vezes, uso convenções de nomes php com variáveis ​​javascript: Ao fazer a validação de entrada, quero executar exatamente os mesmos algoritmos, tanto do lado do cliente quanto do lado do servidor. Eu realmente quero que os dois lados do código pareçam o mais semelhante possível, para simplificar a manutenção. O uso de cifrões em nomes de variáveis ​​facilita isso.

(Além disso, algumas funções auxiliares criteriosas ajudam a tornar o código parecido, por exemplo, agrupar pesquisas de valor de entrada, versões não OO de strlen, substr, etc. Ainda requer alguns ajustes manuais.)

não-apenas-yeti
fonte
-5

Um identificador JavaScript válido deve começar com uma letra, sublinhado (_) ou cifrão ($); caracteres subsequentes também podem ser dígitos (0-9). Como o JavaScript diferencia maiúsculas de minúsculas, as letras incluem os caracteres "A" a "Z" (maiúsculas) e os caracteres "a" a "z" (minúsculas).

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

Harikesh Yadav
fonte
As perguntas não eram 'Uma variável JavasScript pode começar com $?', Mas 'Por que uma ...'. o OP estava procurando um motivo para usar essa convenção de nomenclatura.
Steve Ives