¿Por qué una variable de JavaScript comenzaría con un signo de dólar? [duplicar]

Resuelto Ken asked hace 15 años • 16 respuestas

Muy a menudo veo JavaScript con variables que comienzan con un signo de dólar. ¿Cuándo y por qué elegirías anteponer una variable de esta manera?

(No estoy preguntando sobre $('p.foo')la sintaxis que ves en jQuery y otros, sino sobre variables normales como $namey $order)

Ken avatar Oct 16 '08 01:10 Ken
Aceptado

Un uso muy común en jQuery es distinguir los objetos jQuery almacenados en variables de otras variables.

Por ejemplo, definiría:

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

Considero que esto es muy útil para escribir código jQuery y facilita ver los objetos jQuery que tienen un conjunto diferente de propiedades.

jonstjohn avatar Feb 16 '2009 15:02 jonstjohn

En la primera, segunda y tercera edición de ECMAScript , la especificación desaconsejaba explícitamente el uso de nombres de variables con prefijo $, excepto en el contexto del código generado automáticamente:

El signo de dólar ( $) y el guión bajo ( _) están permitidos en cualquier parte de un identificador. El signo de dólar está diseñado para usarse únicamente en código generado mecánicamente.

Sin embargo, en la siguiente versión (la quinta edición , que es la actual), esta restricción se eliminó y el pasaje anterior se reemplazó con

El signo de dólar ( $) y el guión bajo ( _) están permitidos en cualquier parte de un IdentifierName .

Como tal, el signo $ ahora se puede utilizar libremente en nombres de variables. Ciertos marcos y bibliotecas tienen sus propias convenciones sobre el significado del símbolo, como se indica en otras respuestas aquí.

andreas avatar Oct 15 '2008 18:10 andreas

Como otros han mencionado, el signo de dólar está destinado a ser utilizado mediante código generado mecánicamente. Sin embargo, algunas bibliotecas de JavaScript muy populares han roto esa convención. JQuery, Prototype y MS AJAX (AKA Atlas) usan este carácter en sus identificadores (o como un identificador completo).

En resumen, puedes usarlo $cuando quieras. (El intérprete no se quejará.) La pregunta es ¿cuándo quiere usarlo ?

Yo personalmente no lo uso, pero creo que es válido su uso. Creo que MS AJAX lo usa para indicar que una función es un alias para alguna llamada más detallada.

Por ejemplo:

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

Parece una convención razonable.

Benry avatar Oct 15 '2008 22:10 Benry

Yo fui la persona que originó esta convención en 2006 y la promovió en la lista de correo de jQuery, así que permítanme compartir algo de la historia y la motivación en torno a ella.

La respuesta aceptada da este ejemplo:

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

Pero eso realmente no lo ilustra bien. Incluso sin $, todavía tendríamos dos nombres de variables diferentes aquí, emaily email_field. Eso está muy bien ahí mismo. ¿Por qué necesitaríamos incluir uno $en uno de los nombres cuando ya tenemos dos nombres diferentes?

En realidad, no lo habría usado email_fieldaquí por dos razones: names_with_underscoresno es JavaScript idiomático y fieldrealmente no tiene sentido para un elemento DOM. Pero seguí la misma idea.

Probé algunas cosas diferentes, entre ellas algo muy similar al ejemplo:

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

(Por supuesto, un objeto jQuery puede tener más de un elemento DOM, pero el código en el que estaba trabajando tenía muchos idselectores, por lo que en esos casos había una correspondencia 1:1).

Tuve otro caso en el que una función recibió un elemento DOM como parámetro y también necesitaba un 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
}

Bueno, ¡eso es un poco confuso! En uno de mis fragmentos de código, emailestá el objeto jQuery y emailElementes el elemento DOM, pero en el otro, emailestá el elemento DOM y emailJQes el objeto jQuery.

No había consistencia y seguí mezclándolos. Además, era un poco molesto tener que inventar dos nombres diferentes para lo mismo: uno para el objeto jQuery y otro para el elemento DOM correspondiente. Además email, emailElementy emailJQtambién seguí probando otras variaciones.

Entonces noté un patrón común:

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

Dado que JavaScript trata $simplemente como otra letra más para los nombres, y dado que siempre recibía un objeto jQuery de una $(whatever)llamada, finalmente me di cuenta del patrón. Podría atender una $(...)llamada y simplemente eliminar algunos caracteres, y obtendría un nombre bastante bonito:

$("#email")
$(email)

El tachado no es perfecto, pero puede que te hagas una idea: con algunos caracteres eliminados, ambas líneas terminan luciendo así:

$email

Fue entonces cuando me di cuenta de que no necesitaba inventar una convención como emailElemento emailJQ. Ya había una bonita convención mirándome: saca algunos caracteres de una $(whatever)llamada y se convierte en $whatever.

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

y:

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

Así que no tenía que inventar dos nombres diferentes todo el tiempo, sino que podía usar el mismo nombre con o sin $prefijo. Y el $prefijo fue un buen recordatorio de que estaba tratando con un objeto jQuery:

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

o:

var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );
Michael Geary avatar Feb 01 '2018 09:02 Michael Geary

En el contexto de AngularJS, el $prefijo se usa solo para identificadores en el código del marco. Se indica a los usuarios del marco que no lo utilicen en sus propios identificadores:

Espacios de nombres angulares $y$$

Para evitar colisiones accidentales de nombres con su código, Angular antepone nombres de objetos públicos con $y nombres de objetos privados con $$. No utilice el prefijo $o $$en su código.

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

Travis Watson avatar Aug 30 '2012 22:08 Travis Watson