Почему переменная JavaScript начинается со знака доллара? - PullRequest
975 голосов
/ 15 октября 2008

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

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

Ответы [ 16 ]

1336 голосов
/ 16 февраля 2009

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

236 голосов
/ 15 октября 2008

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

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

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

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

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

57 голосов
/ 16 октября 2008

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

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

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

Например:

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

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

53 голосов
/ 31 августа 2012

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

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

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

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

22 голосов
/ 01 февраля 2018

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

$<del>("#</del>email<del>")</del></code>
<code>$<del>(</del>email<del>)</del>

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

$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( ... );
20 голосов
/ 08 августа 2009

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

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

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

7 голосов
/ 28 июля 2009

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

2 голосов
/ 05 сентября 2015

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

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

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

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

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

2 голосов
/ 04 мая 2014

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

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

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

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

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

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

0 голосов
/ 21 октября 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...