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

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

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

Ответы

Ответ 1

Очень часто использование 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, у которых есть другой набор свойств.

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

Например:

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

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

Ответ 4

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

Angular Пространства имен $ и $$

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

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

Ответ 5

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

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

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

Ответ 6

Символ $не имеет особого значения для механизма JavaScript. Это просто еще один действительный символ в имени переменной, например a-z, A-Z, _, 0-9 и т.д.

Ответ 7

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

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

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

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

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

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

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

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

Например:

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

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

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

Ответ 11

Я был человеком, который создал эту конвенцию еще в 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)

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

$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( ... );

Ответ 12

Ниже приведены правила для переменных

Все переменные JavaScript должны быть идентифицированы с уникальными именами.

Эти уникальные имена называются идентификаторами.

Идентификаторами могут быть короткие имена (например, x и y) или более описательные имена (возраст, сумма, totalVolume).

Общие правила построения имен переменных (уникальные идентификаторы):

Имена могут содержать буквы, цифры, символы подчеркивания и знаки доллара. Имена должны начинаться с буквы Имена также могут начинаться с $и _ (но мы не будем использовать его в этом уроке) Имена чувствительны к регистру (y и Y - разные переменные) Зарезервированные слова (например, ключевые слова JavaScript) не могут использоваться в качестве имен.

Вы также можете использовать $, но практиковать использование $в случае jquery как дескриптора.

Ответ 13

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

Ответ 14

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

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

Ответ 15

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

Ответ 16

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

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

Ответ 17

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

Детали:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variables