Почему переменная JavaScript начинается со знака доллара? [Дубликат]

1038

Я довольно часто вижу JavaScript с переменными, которые начинаются со знака доллара. Когда / почему вы выбрали бы префикс переменной таким образом?

(Я не спрашиваю о $('p.foo')синтаксисе, который вы видите в jQuery и других, но нормальные переменные, такие как $nameи $order)

кругозор
источник
16
Это, вероятно, привычка, взятая из программирования на Perl. (изменить: или PHP)
Брайен
5
Некоторые языки требуют этого, например, PHP или Perl - я предполагаю, что разработчик не помнил, что он не нужен в javascript.
Рич Брэдшоу
3
или они не хотели, чтобы их бросили курить. Скорее всего, это правильный ответ, так как многие разработчики, которые собирают свои собственные веб-страницы, делают это, используя PHP и javascript.
BlueRaja - Дэнни Пфлюгофт
@DonaldDuck Я думаю, что ваши дубликаты могут быть неправильными - это на 7 месяцев старше, чем ваша ссылка
Кен
1
@ Кен Согласно этому ответу , важен не возраст, а то, насколько хороши ответы. Я лично думаю, что ответы на другой вопрос лучше, поэтому я проголосовал за то, чтобы закрыть этот вопрос как дубликат. Если вы считаете, что ответы на этот вопрос лучше, вы можете проголосовать за то, чтобы закрыть другой как дубликат.
Дональд Дак

Ответы:

1420

Очень распространенное использование в jQuery - это различать объекты jQuery, хранящиеся в переменных, от других переменных.

Например, я бы определил:

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

Я считаю, что это очень полезно при написании кода jQuery и позволяет легко видеть объекты jQuery, которые имеют другой набор свойств.

jonstjohn
источник
98
Это НАСТОЯЩАЯ венгерская нотация. Он передает информацию о том, что хранится в переменной, помимо того, что делает имя переменной. А ++ бы снова Венгрию.
Артемида
2
Я хотел бы, чтобы документация jquery также использовала эту запись ... Это действительно очень полезно.
Педроманоэль
1
@ Артемида Я взял венгерский почти 20 лет назад и никогда не мог прекратить использовать его. На протяжении многих лет многие люди выражали большое недовольство по поводу того, как я его использую, но это настолько полезно, что я не могу понять почему.
Ночная сова
10
Недурно за $. Но подчеркивания в именах переменных следует избегать, обычные JS-переменные должны использовать camelCase. email_fields -> emailField. Только действительный вариант использования для _ является префиксом для частных / защищенных свойств.
cschuff 22.09.14
11
@cschuff Это вполне утверждение ... Я предпочитаю подчеркивания для всех локальных переменных, и резервный случай верблюда для свойств объектов-прототипов.
Пол
250

В 1-м, 2-м и 3-м изданиях ECMAScript использование имен переменных с префиксом $ явно не поощрялось спецификацией, кроме как в контексте сгенерированного кода:

Знак доллара ( $) и подчеркивание ( _) разрешены в любом месте идентификатора. Знак доллара предназначен для использования только в механически сгенерированном коде.

Тем не менее, в следующей версии ( 5-е издание , которое является текущим) это ограничение было снято, и вышеупомянутый отрывок заменен на

Знак доллара ( $) и знак подчеркивания ( _) разрешены в любом месте в IdentifierName .

Таким образом, знак $ теперь может свободно использоваться в именах переменных. Определенные структуры и библиотеки имеют свои собственные соглашения о значении символа, отмеченные в других ответах здесь.

CIC
источник
3
Хотя это может быть правдой, действительно ли это помогает ответить на вопрос ОП? В настоящее время принятый ответ лучше - когда новичок видит JS-программист $variable, скорее всего, потому что он содержит целый объект jQuery.
Риного
14
@rinogo Это ответ на вопрос с некоторой абсолютной правдой, которая не зависит от предположений об используемых библиотеках.
Oriol
1
@yoyo_fun: код, который генерируется компьютером, а не человеком.
cic
3
«Это отвечает на вопрос с некоторой абсолютной правдой». На самом деле, правда была в том, что разработчики полностью игнорировали это замечание из спецификации языка ... и, вероятно, до сих пор. :)
Стейн де Витт
61

Как уже упоминалось, знак доллара предназначен для использования механически сгенерированным кодом. Однако это соглашение было нарушено некоторыми чрезвычайно популярными библиотеками JavaScript. JQuery, Prototype и MS AJAX (AKA Atlas) все используют этот символ в своих идентификаторах (или как полный идентификатор).

Короче говоря, вы можете использовать $когда угодно. (Переводчик не будет жаловаться.) Вопрос в том, когда вы хотите его использовать?

Я лично не использую это, но я думаю, что это использование допустимо. Я думаю, что MS AJAX использует его, чтобы показать, что функция является псевдонимом для более подробного вызова.

Например:

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

Это похоже на разумное соглашение.

Benry
источник
JQuery НЕ использует это в идентификаторах, причина, по которой $ .X заключается в том, что просто приходится вводить меньше - jQuery.X идентичен, фактически $ .X является псевдонимом пространства имен для jQuery.X - каждая функциональность jQuery находится внутри jQuery-нс, а не $
специалист
5
@specializt, как я сказал 5 лет назад "или как полный идентификатор". Под идентификатором я подразумеваю стандартное определение CS, которое является лексическим токеном, который не является ключевым словом в языке. В этом случае $ и jQuery - это два разных идентификатора, которые ссылаются на одно и то же значение. Но они оба являются идентификаторами, тем не менее.
Бенри
56

В контексте AngularJS $префикс используется только для идентификаторов в коде платформы. Пользователям платформы рекомендуется не использовать ее в своих идентификаторах:

Угловые пространства имен $и$$

Чтобы предотвратить случайные конфликты имен с вашим кодом, Angular ставит префиксы перед именами публичных объектов $и именами приватных объектов с $$. Пожалуйста, не используйте префикс $или $$в вашем коде.

Источник: https://docs.angularjs.org/api

Трэвис Уотсон
источник
35

Я был тем человеком, который создал это соглашение еще в 2006 году и продвигал его в раннем списке рассылки jQuery, поэтому позвольте мне поделиться историей и мотивацией вокруг него.

Принятый ответ дает этот пример:

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

Но это не очень хорошо иллюстрирует это. Даже без $, у нас все равно было бы два разных имени переменной, emailи email_field. Это очень хорошо, прямо там. Зачем нам нужно бросать $в одно из имен, когда у нас уже есть два разных имени?

На самом деле, я бы не использовал email_fieldздесь по двум причинам: names_with_underscoresне является идиоматическим JavaScript и fieldне имеет смысла для элемента DOM. Но я следовал той же идее.

Я пробовал несколько разных вещей, среди которых что-то очень похожее на пример:

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

(Конечно, объект jQuery может иметь более одного элемента DOM, но в коде, над которым я работал, было много idселекторов, поэтому в этих случаях имелось соответствие 1: 1.)

У меня был другой случай, когда функция получила элемент DOM в качестве параметра, а также для него был нужен объект 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
}

Ну, это немного сбивает с толку! В одном из моих фрагментов кода emailэто объект jQuery и emailElementэлемент DOM, а в другом email- элемент DOM и emailJQобъект jQuery.

Последовательности не было, и я продолжал смешивать их. Кроме того, было немного неприятно продолжать составлять два разных имени для одной и той же вещи: одно для объекта jQuery, а другое для соответствующего элемента DOM. Кроме того email, emailElementи emailJQя продолжал пробовать и другие варианты.

Тогда я заметил общую закономерность:

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

Поскольку JavaScript воспринимается $как просто еще одна буква для имен, и поскольку я всегда возвращал объект jQuery из $(whatever)вызова, шаблон, наконец, меня осенило. Я мог бы взять $(...)вызов и просто удалить некоторые символы, и это придумало бы довольно красивое имя:

$("#email")
$(email)

Зачеркнутый не идеален, но вы можете понять, что при удалении некоторых символов обе эти строки выглядят так:

$email

Вот тогда я понял, что мне не нужно составлять соглашение вроде emailElementили emailJQ. На меня уже смотрелась хорошая конвенция: убрать некоторых персонажей из $(whatever)звонка, и это превращается в $whatever.

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

а также:

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

Поэтому мне не приходилось все время придумывать два разных имени, я мог просто использовать одно и то же имя с $префиксом или без него . И $префикс был хорошим напоминанием, что я имел дело с объектом jQuery:

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

или:

var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );
Майкл Гири
источник
21

Стево прав, значение и использование знака сценария доллара (в Javascript и платформе jQuery, но не в PHP) полностью семантическое. $ - это символ, который можно использовать как часть имени идентификатора. Кроме того, знак доллара, возможно, не самая «странная» вещь, с которой вы можете столкнуться в Javascript. Вот несколько примеров допустимых имен идентификаторов:

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

Все приведенные выше примеры будут работать.

Попробовать их.

Matt
источник
7

Символ $ не имеет особого значения для движка JavaScript. Это просто еще один допустимый символ в имени переменной, например, az, AZ, _, 0-9 и т. Д.


источник
2
правда, но не то, что спросили. Я пришел сюда, чтобы понять, почему он использовался, и похоже, что в этом случае я увидел различную переменную, содержащую объект jquery, между переменной, содержащей объект dom.
rtpHarry
3
@ rtpHarry Вы были не тем, кто задавал вопрос, и на вопрос «почему» здесь был дан адекватный ответ. Это не имеет ничего общего с JQuery, как также было указано в вопросе. На самом деле, я думаю, что приведенный выше ответ лучше всего подходит для вопроса - иногда, если вы хотите понять что-то, что вам нужно, самый маленький и ясный ответ - $в JavaScript нет особого значения. Период.
AMN
Я нахожу это определенным ... хм ... люди хотят добавлять знаки доллара к именам переменных, чтобы вещи казались более угловатыми.
глиф
2

Поскольку _в начале имя переменной часто используется для обозначения закрытой переменной (или, по крайней мере, одной, предназначенной для сохранения приватности), я считаю $удобным добавлять перед моими собственными краткими псевдонимами библиотеки общего кода.

Например, при использовании jQuery я предпочитаю использовать переменную $J(а не просто $) и использовать $Pпри использовании php.js и т. Д.

Префикс делает его визуально отличным от других переменных, таких как мои собственные статические переменные, указывая на тот факт, что код является частью той или иной библиотеки и с меньшей вероятностью будет конфликтовать или путать других, когда они знают соглашение.

Он также не загромождает код (или не требует дополнительной типизации), как и полностью указанное имя, повторяемое для каждого вызова библиотеки.

Мне нравится думать, что это похоже на то, что делают клавиши-модификаторы для расширения возможностей отдельных клавиш.

Но это всего лишь мое собственное соглашение.

Бретт Замир
источник
2

Как я испытал за последние 4 года, это позволит кому-то легко определить, является ли переменная, указывающая значение / объект, или DOM-элементом в JQuery-оболочке.

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

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

В приведенном выше примере, когда я вижу переменную «$ dataDiv», я могу легко сказать, что эта переменная указывает на элемент DOM, заключенный в jQuery (в данном случае это div). а также я могу вызывать все методы jQuery без повторного переноса объекта, например $ dataDiv.append (), $ dataDiv.html (), $ dataDiv.find () вместо $ ($ dataDiv) .append ().

Надеюсь, что это помогло. поэтому, наконец, хочу сказать, что это будет хорошей практикой, но не обязательно.

Нага Срину Капусетти
источник
0

${varname} это просто соглашение об именах, которое разработчики jQuery используют для различения переменных, содержащих элементы jQuery.

Обычный {varname}используется для хранения общих вещей, таких как тексты и строки. ${varname}содержит элементы, возвращенные из jQuery.

Вы также можете использовать plain {varname}для хранения элементов jQuery, но, как я уже сказал в начале, это отличает его от простых переменных и делает его намного проще для понимания (представьте, что вы путаете его с простой переменной и ищите все, чтобы понять, что в нем содержится) ,

Например :

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

Здесь бла хранит возвращенный элемент jQuery.

Поэтому, когда кто-то еще увидит $blahв коде код, он поймет, что это не просто строка или число, это элемент jQuery.

Сатьябрата Мишра
источник
6
Вы только что перефразировали принятый ответ от 6 лет назад.
Кен
Я полагаю, что не делает ответ "некачественным".
Санни Р Гупта
-1

Хотя вы можете просто использовать его для добавления префиксов к своим идентификаторам, он должен использоваться для сгенерированного кода, например, для замены токенов в шаблоне.

Райан Эбботт
источник
1
Правда шесть лет назад, но не больше.
Марк Эмери
-2

Угловое использование для свойств, созданных структурой. Думаю, они идут по (ныне несуществующей) подсказке, предоставленной ECMA-262 3.0.

Маниш Джавар
источник
-3

$ используется для DISTINGUISH между общими переменными и переменными jquery в случае нормальных переменных. позвольте вам разместить заказ во FLIPKART, тогда, если заказ представляет собой переменную, показывающую вывод строки, он называется простым как «заказ», но если мы щелкнем по порядку размещения, то объект будет возвращен, этот объект будет обозначен через $ как «$ упорядочить », чтобы программист мог выхватывать переменные javascript и jquery во всем коде.

Саурабх Салуджа
источник
-4

Если вы видите знак доллара ($) или двойной знак доллара ($$) и вам интересно, что это означает в среде Prototype, вот ваш ответ:

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

Источник:
http://www.prototypejs.org/api/utility/dollar-dollar

RussellW
источник
5
ОП конкретно заявляет, что он не спрашивает об этой форме префикса доллара.
Найджел Олдертон
-5

Причина, по которой я иногда использую соглашения имен php с переменными javascript: при проверке входных данных я хочу запускать одинаковые алгоритмы как на стороне клиента, так и на стороне сервера. Я действительно хочу, чтобы две стороны кода выглядели как можно более одинаково, чтобы упростить обслуживание. Использование знаков доллара в именах переменных делает это проще.

(Кроме того, некоторые разумные вспомогательные функции помогают сделать код похожим, например, обтекание поисков по входным значениям, не-OO-версии strlen, substr и т. Д. Это все же требует некоторой ручной настройки.)

не-только-йети
источник
-5

Действительный идентификатор JavaScript shuold должен начинаться с буквы, подчеркивания (_) или знака доллара ($); последующие символы также могут быть цифрами (0-9). Поскольку JavaScript чувствителен к регистру, буквы включают символы от «A» до «Z» (заглавные буквы) и символы от «a» до «z» (строчные буквы).

Подробности:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variables

Харикеш Ядав
источник
Вопросы были не «Может ли переменная JavasScript начинаться с $?», А «Почему бы ...». ты искал причину использовать такое соглашение об именах.
Стив Айвс