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

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

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

16 ответов

Решение

В 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, которые имеют другой набор свойств.

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

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

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

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

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

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

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

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

Например:

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

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

Я был тем человеком, который создал это соглашение еще в 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( ... );

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

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

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

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

Стево прав, значение и использование знака сценария доллара (в 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 $$$$$"); }

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

Попробуйте их.

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

Как я испытал за последние 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 ().

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

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

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

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

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

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

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

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

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

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

Например:

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

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

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

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

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

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

Если вы видите знак доллара ($) или двойной знак доллара ($$) и вам интересно, что это означает в среде 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

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

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

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

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

Другие вопросы по тегам