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


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

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


906
2017-10-15 18:26


origen


Respuestas:


Un uso muy común en jQuery es distinguir los objetos jQuery almacenados en variables de otras variables. Por ejemplo, yo 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

Encuentro que esto es muy útil para escribir el código jQuery y hace que sea más fácil ver los objetos jQuery que tienen un conjunto diferente de propiedades.


1268
2018-02-16 15:42



En el 1º, 2º y 3ra Edición de ECMAScriptLa especificación desaconseja explícitamente el uso de nombres de variables prefijados en $, excepto en el contexto del código autogenerado:

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á destinado para su uso solo en código generado mecánicamente.

Sin embargo, en la próxima versión (el 5th Edition, que es actual), esta restricción se eliminó y el pasaje anterior se reemplazó por

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

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


220
2017-10-15 18:59



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

En resumen, puedes usar el $ cuando quieras. (El intérprete no se quejará). La pregunta es cuándo lo haces querer para usarlo?

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

Por ejemplo:

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

Eso parece una convención razonable.


56
2017-10-15 22:57



En el contexto de AngularJS, el $ el prefijo se usa solo para identificadores en el código del marco. Los usuarios del framework tienen instrucciones de no usarlo en sus propios identificadores:

Espacios de nombres angulares $ y $$

Para prevenir colisiones accidentales de nombres con su código, Angular prefija los nombres de objetos públicos con $ y nombres de objetos privados con $$. Por favor no use el $ o $$ prefijo en tu código.

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


49
2017-08-30 22:51



Stevo tiene razón, el significado y el uso del signo del script en dólares (en Javascript y en la plataforma jQuery, pero no en PHP) es completamente semántico. $ es un personaje que se puede usar como parte de un nombre de identificador. Además, el signo de dólar quizás no sea la cosa más "rara" que pueda encontrar en Javascript. Aquí hay algunos ejemplos de nombres 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 los ejemplos anteriores funcionarán.

Pruébalos.


19
2017-08-08 00:34



Fui la persona que originó esta convención en 2006 y la promocioné en la lista de correo de jQuery, así que permítanme compartir algo de la historia y la motivación a su alrededor.

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 el $, todavía tendríamos dos nombres de variable diferentes aquí, email y email_field. Eso es bastante bueno allí mismo. ¿Por qué tendríamos que lanzar un $ en uno de los nombres cuando ya tenemos dos nombres diferentes?

En realidad, no habría usado email_field aquí por dos razones: names_with_underscores no son idiomáticos JavaScript, y field realmente no tiene sentido para un elemento DOM. Pero sí seguí la misma idea.

Intenté 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 muchas id selectores, entonces 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 para ello:

// 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 bits de código, email es el objeto jQuery y emailElement es el elemento DOM, pero en el otro, email es el elemento DOM y emailJQ es el objeto jQuery.

No hubo consistencia y seguí mezclándolas. Además, era un poco molesto tener que inventar dos nombres diferentes para la misma cosa: uno para el objeto jQuery y otro para el elemento DOM correspondiente. Además email, emailElementy emailJQ, Seguí probando otras variaciones también.

Entonces noté un patrón común:

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

Dado que JavaScript trata $ simplemente como otra letra para nombres, y como siempre recibí un objeto jQuery de un $(whatever) llamada, el patrón finalmente se me ocurrió. Podría tomar una $(...) llame y simplemente elimine algunos caracteres, y se obtendría un nombre bastante bonito:

$("#email")
$(email)

Strikeout no es perfecto, pero puede hacerse una idea: con algunos personajes eliminados, ambas líneas terminan pareciéndose a:

$email

Fue entonces cuando me di cuenta de que no necesitaba inventar una convención como emailElement o emailJQ. Ya había una linda convención mirándome: saca algunos personajes de un $(whatever) llamar 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 tuve que inventar dos nombres diferentes todo el tiempo, pero podría usar el mismo nombre con o sin un $ prefijo. Y el $ prefix 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( ... );

10
2018-02-01 09:05



El caracter $ no tiene un significado especial para el motor de JavaScript. Es solo otro carácter válido en un nombre de variable como a-z, A-Z, _, 0-9, etc.


6
2017-07-28 15:26