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

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

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

Вероятно, это привычка, взятая из программирования на Perl. (изменить: или PHP)

brien 15.10.2008 22:27

Некоторые языки требуют этого, например PHP или Perl - я предполагаю, что разработчик не помнил, что это не нужно в javascript.

Rich Bradshaw 15.10.2008 22:30

или они не хотели отказываться от этой привычки. Скорее всего, это правильный ответ, поскольку многие разработчики, которые собирают свои собственные веб-страницы, делают это с помощью PHP и javascript.

BlueRaja - Danny Pflughoeft 21.07.2011 02:08

@DonaldDuck Я думаю, ваши дубликаты могут быть неправильными - это на 7 месяцев старше вашей ссылки

Ken 19.11.2017 14:08

@Ken Согласно этот ответ, важен не возраст, а то, насколько хороши ответы. Я лично считаю, что ответы на другой вопрос лучше, поэтому я проголосовал за то, чтобы закрыть этот как дубликат. Если вы считаете, что ответы на этот вопрос лучше, вы можете проголосовать за то, чтобы закрыть второй как дубликат.

Donald Duck 19.11.2017 17:06

Как один из тех парней, которые «взламывают» веб-страницы, я использую переменную $ в javascript, потому что я выучил php задолго до того, как выучил javascript. И дело не в том, чтобы отказаться от привычки, для меня речь идет о том, чтобы мой JS-код был легко читаемым. Если я смотрю на код, в котором не используются знаки доллара, мой мозг обрабатывает его намного медленнее. Вкратце, это делает мой код красивым, читаемым и согласованным между двумя языками, которые я использую все время.

l008com 14.04.2018 15:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1 066
6
249 122
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

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

Верно шесть лет назад, но не сейчас.

Mark Amery 04.05.2014 18:22

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

The dollar sign ($) and the underscore (_) are permitted anywhere in an identifier. The dollar sign is intended for use only in mechanically generated code.

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

The dollar sign ($) and the underscore (_) are permitted anywhere in an IdentifierName.

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

Хотя это может быть правдой, действительно ли это помогает ответить на вопрос ОП? Принятый в настоящее время ответ лучше - когда начинающий программист JS видит $variable, вероятно, потому, что он содержит весь объект jQuery.

rinogo 24.03.2016 22:36

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

Oriol 09.04.2016 22:36

Что в этом контексте означает механически сгенерированный код?

yoyo_fun 28.04.2016 16:39

@yoyo_fun: код, который создается компьютером, а не написан человеком.

cic 28.04.2016 17:11

@cic, как можно применить этот сценарий? Зачем компьютеру генерировать код javascript?

yoyo_fun 28.04.2016 17:13

@yoyo_fun: github.com/jashkenas/coffeescript/wiki/…

cic 28.04.2016 17:18

«Он отвечает на вопрос с некоторой абсолютной правдой». На самом деле правда заключалась в том, что разработчики полностью игнорировали это замечание из спецификации языка ... и, вероятно, до сих пор игнорируют. :)

Stijn de Witt 02.08.2016 01:05

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

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

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

Например:

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

Это кажется разумным условием.

JQuery НЕ использует это в идентификаторах, причина того, что $ .X существует, просто в том, что нужно вводить меньше - jQuery.X идентичен, на самом деле $ .X является псевдонимом пространства имен для jQuery.X - каждая функциональность jQuery находится в пределах jQuery-ns, а не $

specializt 12.07.2013 08:15

@specializt, как я сказал 5 лет назад, «или как целый идентификатор». Под идентификатором я подразумеваю стандартное определение CS, которое представляет собой лексический токен, который не является ключевым словом в языке. В этом случае $ и jQuery - это два разных идентификатора, которые ссылаются на одно и то же значение. Но тем не менее они оба являются идентификаторами.

Benry 12.07.2013 09:32
Ответ принят как подходящий

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

Это НАСТОЯЩАЯ венгерская нотация. Он передает информацию о том, что хранится в переменной, помимо того, что делает имя переменной. А ++ снова бы Венгрия.

Artemis 29.11.2013 05:54

Я бы хотел, чтобы документация jquery также использовала эту нотацию ... Это действительно очень полезно.

pedromanoel 28.01.2014 15:05

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

Night Owl 18.02.2014 07:59

@Artemis Процитируем с другой страницы: «Однако это использование может быть, вероятно, Приложения на венгерском языке, поскольку переменная« представляет объект jQuery », а не System Hungarian (который обычно считается« плохим »или указывает на то, КАК переменная будет храниться система)."

LocalPCGuy 31.05.2014 05:12

Недурно за $. Но следует избегать подчеркивания в именах переменных, обычные JS-переменные должны использовать camelCase. email_fields -> emailField. Единственный допустимый вариант использования _ - это префикс для частных / защищенных свойств.

cschuff 22.09.2014 16:18

@cschuff Вот это утверждение ... Я предпочитаю подчеркивание для всех локальных переменных и резервирую верблюжий регистр для свойств объектов-прототипов.

Paul 20.02.2015 20:27

@cschuff JS - это не язык, созданный с типизированными ограничениями на то, как вы выбираете писать свои методы или имена переменных, это даже не должно быть предложением, поскольку это скорее индивидуальное и / или командное решение ... Это, кроме я, предпочитает подчеркивание или змейка, потому что я кодирую также для удобочитаемости и легче читать «ротация_куррент_форма_наме», чем «ротацияКуррентФормы», по этому поводу тоже проводится исследование.

Carlos 14.02.2020 21:15

Подчеркивание в качестве разделителя облегчает мне чтение собственного кода. В чем причина беспокойства о них? Если бы это была веская причина, я бы прекратил это делать. С другой стороны, я НЕНАВИЖУ подчеркивание, которое я часто вижу выполненным для локальных или частных атрибутов класса, а что нет. Так что делать? Кажется, что верблюжий регистр уступает место строчным буквам. Я просто не могу понять условности.

user3314553 27.03.2020 22:36

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

правда, но не то, о чем спрашивали. Я пришел сюда, чтобы понять, почему он использовался, и, похоже, случай, когда я это видел, заключался в том, чтобы различать var, содержащую объект jquery, между var, содержащим объект dom.

rtpHarry 02.06.2011 02:42

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

amn 28.11.2013 15:05

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

111 19.03.2015 19:36

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

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

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

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

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

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

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

В ОП прямо говорится, что он не спрашивает об этой форме префикса доллара.

Nigel Alderton 17.08.2012 13:43

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

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

Angular Namespaces $ and $$

To prevent accidental name collisions with your code, Angular prefixes names of public objects with $ and names of private objects with $$. Please do not use the $ or $$ prefix in your code.

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

$ используется, чтобы ОТЛИЧИТЬ общие переменные от переменных jquery в случае обычных переменных. позвольте вам разместить заказ в FLIPKART, тогда, если порядок является переменной, показывающей вам строковый вывод, тогда он называется просто, как «порядок», но если мы щелкнем по размещению заказа, тогда будет возвращен объект, который будет обозначен символом $ как «$ порядок », чтобы программист мог вырезать переменные javascript и переменные jquery во всем коде.

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

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

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

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

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

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

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

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

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

Например :

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

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

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

Вы только что перефразировали принятый ответ 6 лет назад.

Ken 21.01.2015 16:27

Полагаю, это не делает ответ «некачественным».

Sunny R Gupta 21.01.2015 16:55

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

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

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

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

Вопрос был не в том, «Может ли переменная Javascript начинаться с символа $?», А в том, «Почему ...». the OP искал причину использовать такое соглашение об именах.

Steve Ives 11.09.2019 12:30

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

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