Чому змінна JavaScript починається зі знака долара? [дублікат]


1036

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

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


16
Це, мабуть, звичка, взята з програмування Perl. (редагувати: або PHP)
підкупити

5
Деякі мови вимагають цього, наприклад PHP або Perl - я здогадуюсь, що розробник не пам’ятав, що він не потрібен у JavaScript.
Річ Бредшоу

3
або вони не хотіли, щоб заважали кинути звичку. Це, швидше за все, правильна відповідь, оскільки так багато розробників, які взломають свою власну веб-сторінку, роблять це за допомогою PHP та javascript.
BlueRaja - Danny Pflughoeft

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

1
@Ken Відповідно до цієї відповіді , важливий не вік, а наскільки хороші відповіді. Я особисто думаю, що відповіді на інше питання краще, тому я проголосував за закриття цього, як дубліката. Якщо ви вважаєте, що відповіді на цю відповідь кращі, ви можете проголосувати за закриття другого як дублікат.
Дональд Дак

Відповіді:


1419

Дуже поширене використання 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, які мають інший набір властивостей.


98
Це СУЧАСНА Угорська нотація. Він передає інформацію про те, що зберігається у змінній, ніж те, що робить ім'я змінної. Знову A ++ буде Угорщина.
Артеміда

2
Я б хотів, щоб документація jquery використовувала цю нотацію ... Це справді корисно.
pedromanoel

1
@Artemis Я взяв угорську майже 20 років тому і ніколи не зміг її припинити. Протягом багатьох років багато людей висловлювали велике невдоволення моїм використанням цього, але це так корисно, що я не можу зрозуміти, чому.
Сова

10
Великі пальці за $. Але слід підкреслити підкреслення змінних імен, звичайні JS-змінні повинні використовувати camelCase. email_fields -> emailField. Тільки допустимий регістр використання для _ є префіксом для приватних / захищених властивостей.
cschuff

11
@cschuff Це цілком твердження ... Я віддаю перевагу підкресленню для всіх локальних змінних і резервую верблюда у випадку властивостей об'єктів-прототипів.
Павло

250

У 1-му, 2-му та 3-му виданні ECMAScript використання імен змінних $ -префіксів явно відмовляло специфіці, за винятком контексту автогенерованого коду:

Знак долара ( $) та підкреслення ( _) дозволені в будь-якому місці ідентифікатора. Знак долара призначений для використання тільки в механічно створеному коді.

Однак у наступній версії ( 5-е видання , яке є чинним) це обмеження було скасовано, а вищезазначений уривок замінено на

Знак долара ( $) та підкреслення ( _) дозволені в будь-якому місці IdentifierName .

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


3
Хоча це може бути правдою, чи справді це допомагає відповісти на питання ОП? В даний час прийнята відповідь краще - коли початківець програміст JS бачить $variable, це, ймовірно, тому, що він містить цілий об’єкт jQuery.
rinogo

14
@rinogo Він відповідає на питання абсолютною правдою, яка не залежить від припущень щодо використовуваних бібліотек.
Оріол

1
@yoyo_fun: код, який генерується комп'ютером, а не записується людиною.
cic


3
"Він відповідає на питання якоюсь абсолютною правдою". Власне, правда полягала в тому, що чорти повністю ігнорували це зауваження з мовної специфікації ... і, мабуть, досі є. :)
Штійн де Вітт

61

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

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

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

Наприклад:

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

Це здається розумною умовою.


JQuery НЕ використовує це в ідентифікаторах, тому що у. jQuery-ns, не $
спеціалізується

5
@specializt, як я вже говорив 5 років тому "або як цілий ідентифікатор". Під ідентифікатором я маю на увазі стандартне визначення CS, яке є лексичним лексемою, яке не є ключовим словом у мові. У цьому випадку $ і jQuery - це два різних ідентифікатори, які посилаються на одне значення. Але вони обоє ідентифікатори.
Бенрі

56

У контексті AngularJS $префікс використовується лише для ідентифікаторів у коді фреймворку. Користувачам фреймворку доручається не використовувати його у власних ідентифікаторах:

Кутові простори імен $та$$

Щоб запобігти випадковим зіткненням імен з вашим кодом, кутові префікси назви загальнодоступних об'єктів із $та назви приватних об’єктів $$. Будь ласка, не використовуйте $або $$префікс у своєму коді.

Джерело: 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 $$$$$"); }

Усі наведені вище приклади спрацюють.

Спробуйте їх.


7

Символ $ не має особливого значення для двигуна JavaScript. Це просто ще один дійсний символ у назві змінної типу az, AZ, _, 0-9 тощо.


2
правда, але не те, що просили. Я прийшов сюди, бажаючи зрозуміти, для чого він використовується, і, здається, випадок, коли я його бачив, полягав у тому, щоб розрізнити var, що містить об'єкт jquery між var, що містить об'єкт dom.
rtpHarry

3
@rtpHarry, ти не задав це питання, а на питання "чому" тут відповіли адекватно. Це не має нічого спільного з JQuery, як також було зазначено у запитанні. Насправді, я думаю, що відповідь вище відповідає найкращому питанню - іноді, якщо ви хочете зрозуміти щось, вам потрібна найменша ясна відповідь - $не має особливого значення в JavaScript. Період.
amn

Я вважаю це певним ... ах, люди хочуть додавати знаки долара до змінних імен, щоб зробити речі більш кутовими.
гліф

2

Оскільки _на початку ім'я змінної часто використовується для вказівки приватної змінної (або принаймні однієї, призначеної залишатися приватною), мені здається $зручним для додавання перед власними короткими псевдонімами до загальних бібліотек коду.

Наприклад, при використанні jQuery я вважаю за краще використовувати змінну $J(а не просто $) та використовувати $Pphp.js тощо.

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

Він також не захаращує код (або вимагає додаткового набору тексту), як і повністю вказане ім'я, що повторюється для кожного виклику бібліотеки.

Мені подобається вважати це подібним до того, що клавіші-модифікатори роблять для розширення можливостей окремих клавіш.

Але це лише моя власна умова.


2

Як я відчував протягом останніх 4 років, це дозволить комусь легко визначити, чи змінна, що вказує на значення / об'єкт, або на JQuery, обгорнутий елемент DOM

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

Сподіваюся, це може допомогти. тому, нарешті, хочу сказати, що це буде вдалою практикою слідувати цьому, але не обов'язково.


0

${varname} - це лише умова іменування, яке розробники jQuery використовують для розрізнення змінних, що містять елементи jQuery.

Звичайна {varname}використовується для зберігання загальних матеріалів, таких як тексти та рядки. ${varname}містить елементи, повернуті з jQuery.

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

Наприклад :

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

Тут бла зберігає повернений елемент jQuery.

Отже, коли хтось ще побачить $blahкод у коді, він зрозуміє, що це не просто рядок або число, це елемент jQuery.


6
Ви щойно перефразовували прийняту відповідь від 6 років тому.
Кен

Я вважаю, що це не дає відповіді "неякісною".
Сонячний Р Гупта

-1

Хоча ви можете просто використовувати його для префіксації своїх ідентифікаторів, він повинен використовуватися для генерованого коду, наприклад, заміни жетонів у шаблоні, наприклад.


1
Щоправда шість років тому, але вже не.
Марк Амері

-2

Кутове використання - це властивості, породжені рамкою. Здогадайтесь, вони йдуть за (на даний момент неіснуючим) натяком, наданим ECMA-262 3.0.


-3

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


-4

Якщо ви бачите знак долара ($) або подвійний знак долара ($$) і хочете цікаво, що це означає в рамках прототипу, ось ваша відповідь:

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


5
ОП конкретно заявляє, що він не запитує про цю форму префікса долара.
Найджел Олдертон

-5

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

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


-5

Дійсний ідентифікатор JavaScript повинен починатися з літери, підкреслення (_) або знака долара ($); наступні символи також можуть бути цифрами (0-9). Оскільки JavaScript відрізняється великими літерами, літери включають символи «А» до «Z» (пропис) та символи «а» через «z» (малі літери).

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


Питання були не "Чи може змінна JavasScript починатися з $?", А "Чому б ...". thee OP шукав причину використовувати таку умову іменування.
Стів
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.