Mengapa variabel JavaScript dimulai dengan tanda dolar? [duplikat]

1037

Saya cukup sering melihat JavaScript dengan variabel yang dimulai dengan tanda dolar. Kapan / mengapa Anda memilih untuk awalan variabel dengan cara ini?

(Saya tidak bertanya tentang $('p.foo')sintaks yang Anda lihat di jQuery dan lainnya, tetapi variabel normal suka $namedan $order)

Ken
sumber
16
Mungkin kebiasaan yang diambil dari pemrograman Perl. (edit: atau PHP)
brien
5
Beberapa bahasa memerlukannya, seperti PHP atau Perl - Saya menduga bahwa dev tidak ingat bahwa itu tidak diperlukan dalam javascript.
Rich Bradshaw
3
atau mereka tidak mau repot untuk menghentikan kebiasaan itu. Kemungkinan besar ini adalah jawaban yang benar, karena begitu banyak pengembang yang meretas laman web mereka sendiri menggunakan PHP dan javascript.
BlueRaja - Danny Pflughoeft
@DonaldDuck Saya pikir Anda mungkin memiliki duplikat yang salah - ini 7 bulan lebih tua dari tautan Anda
Ken
1
@ Ken Menurut jawaban ini , bukan usia yang penting tetapi seberapa bagus jawabannya. Saya pribadi berpikir jawaban untuk pertanyaan lain lebih baik, itulah sebabnya saya memilih untuk menutup yang ini sebagai duplikat. Jika Anda berpikir jawaban untuk yang ini lebih baik, Anda dapat memilih untuk menutup yang lain sebagai duplikat.
Donald Duck

Jawaban:

1420

Penggunaan yang sangat umum di jQuery adalah untuk membedakan jQuery objek disimpan dalam variabel dari variabel lain.

Sebagai contoh, saya akan mendefinisikan:

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

Saya menemukan ini sangat membantu dalam menulis kode jQuery dan membuatnya mudah untuk melihat objek jQuery yang memiliki set properti yang berbeda.

Johnstjohn
sumber
98
Ini adalah notasi NYATA NYATA. Ini menyampaikan info tentang apa yang disimpan dalam variabel di luar apa yang dilakukan nama variabel. A ++ akan Hongaria lagi.
Artemis
2
Saya berharap dokumentasi jquery menggunakan notasi ini juga ... Ini memang sangat membantu.
pedromanoel
1
@Artemis saya mengambil Hongaria hampir 20 tahun yang lalu dan tidak pernah bisa berhenti menggunakannya. Selama bertahun-tahun banyak orang telah menyatakan ketidaksenangan yang luar biasa terhadap penggunaannya tetapi sangat membantu sehingga saya tidak mengerti mengapa.
Night Owl
10
Jempol untuk $. Tetapi garis bawah pada nama variabel harus dicegah, JS-Variabel normal harus menggunakan camelCase. email_fields -> emailField. Hanya case-use yang valid untuk _ adalah sebagai awalan untuk properti pribadi / yang dilindungi.
cschuff
11
@cschuff Cukup pernyataan ... Saya lebih suka menggarisbawahi untuk semua variabel lokal, dan cadangan-unta kasus untuk properti objek prototipe.
Paul
250

Dalam ECMAScript Edisi 1, 2, dan 3 , menggunakan nama variabel $ -prefixed secara eksplisit tidak disarankan oleh spec kecuali dalam konteks kode autogenerated:

Tanda dolar ( $) dan garis bawah ( _) diizinkan di mana saja di pengidentifikasi. Tanda dolar dimaksudkan untuk digunakan hanya dalam kode yang dihasilkan secara mekanis.

Namun, dalam versi berikutnya ( Edisi ke - 5 , yang saat ini), pembatasan ini dibatalkan, dan bagian di atas diganti dengan

Tanda dolar ( $) dan garis bawah ( _) diizinkan di mana saja di IdentifierName .

Dengan demikian, tanda $ sekarang dapat digunakan secara bebas dalam nama variabel. Kerangka kerja dan perpustakaan tertentu memiliki konvensi sendiri tentang arti simbol, yang dicatat dalam jawaban lain di sini.

cic
sumber
3
Meskipun ini mungkin benar, apakah itu benar-benar membantu menjawab pertanyaan OP? Jawaban yang saat ini diterima lebih baik - ketika seorang programmer JS pemula melihat $variable, kemungkinan karena berisi seluruh objek jQuery.
rinogo
14
@rinogo Menjawab pertanyaan dengan beberapa kebenaran absolut yang tidak bergantung pada asumsi tentang perpustakaan yang digunakan.
Oriol
1
@yoyo_fun: Kode yang dihasilkan oleh komputer alih-alih ditulis oleh manusia.
cic
3
"Itu menjawab pertanyaan dengan beberapa kebenaran absolut". Sebenarnya, kebenarannya adalah para devs benar-benar mengabaikan pernyataan ini dari spek bahasa ... dan mungkin masih demikian. :)
Stijn de Witt
61

Seperti orang lain telah menyebutkan tanda dolar dimaksudkan untuk digunakan oleh kode yang dihasilkan secara mekanis. Namun, konvensi itu telah dipatahkan oleh beberapa perpustakaan JavaScript yang sangat populer. JQuery, Prototype dan MS AJAX (AKA Atlas) semua menggunakan karakter ini dalam pengidentifikasi mereka (atau sebagai pengidentifikasi keseluruhan).

Singkatnya, Anda dapat menggunakan $kapan saja Anda inginkan. (Penerjemah tidak akan mengeluh.) Pertanyaannya adalah kapan Anda ingin menggunakannya?

Saya pribadi tidak menggunakannya, tapi saya pikir penggunaannya valid. Saya pikir MS AJAX menggunakannya untuk menandakan bahwa suatu fungsi adalah alias untuk beberapa panggilan verbal.

Sebagai contoh:

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

Itu tampak seperti konvensi yang masuk akal.

Benry
sumber
JQuery TIDAK menggunakan ini dalam pengidentifikasi, alasan untuk $ .X karena hanya perlu mengetik lebih sedikit - jQuery.X identik, pada kenyataannya $ .X adalah namespace-alias untuk jQuery.X - setiap fungsionalitas jQuery berada dalam jQuery-ns, bukan $
specializt
5
@specializt seperti yang saya katakan 5 tahun lalu "atau sebagai pengidentifikasi keseluruhan". Dengan pengidentifikasi maksud saya definisi standar CS yang merupakan token leksikal yang bukan kata kunci dalam bahasa. Dalam hal ini $ dan jQuery adalah dua pengidentifikasi berbeda yang mereferensikan nilai yang sama. Namun keduanya adalah pengidentifikasi.
Benry
56

Dalam konteks AngularJS, $awalan hanya digunakan untuk pengidentifikasi dalam kode kerangka kerja. Pengguna kerangka kerja diperintahkan untuk tidak menggunakannya dalam pengidentifikasi mereka sendiri:

Ruang Nama sudut $dan$$

Untuk mencegah tabrakan nama yang tidak disengaja dengan kode Anda, Angular mengawali nama-nama objek publik dengan $dan nama-nama objek pribadi dengan $$. Tolong jangan gunakan $atau $$awalan dalam kode Anda.

Sumber: https://docs.angularjs.org/api

Travis Watson
sumber
35

Saya adalah orang yang memulai konvensi ini pada tahun 2006 dan mempromosikannya di milis awal jQuery, jadi izinkan saya berbagi beberapa sejarah dan motivasi di sekitarnya.

Jawaban yang diterima memberikan contoh ini:

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

Tapi itu tidak benar-benar menggambarkannya dengan baik. Bahkan tanpa $, kita masih akan memiliki dua nama variabel yang berbeda di sini, emaildan email_field. Cukup bagus di sana. Mengapa kita perlu membuang $salah satu nama ketika kita sudah memiliki dua nama yang berbeda?

Sebenarnya, saya tidak akan menggunakan di email_fieldsini karena dua alasan: names_with_underscoresbukan JavaScript idiomatik, danfield tidak terlalu masuk akal untuk elemen DOM. Tapi saya memang mengikuti ide yang sama.

Saya mencoba beberapa hal berbeda, di antaranya sesuatu yang sangat mirip dengan contoh:

var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it

(Tentu saja objek jQuery dapat memiliki lebih dari satu elemen DOM, tetapi kode yang saya kerjakan memiliki banyak id penyeleksi, jadi dalam kasus tersebut ada korespondensi 1: 1.)

Saya punya kasus lain di mana fungsi menerima elemen DOM sebagai parameter dan juga membutuhkan objek jQuery untuk itu:

// 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
}

Yah itu agak membingungkan! Di salah satu bit kode saya, emailadalah objek jQuery dan emailElementmerupakan elemen DOM, tetapi di bagian lain, emailadalah elemen DOM dan emailJQmerupakan objek jQuery.

Tidak ada konsistensi dan saya terus mencampurnya. Ditambah itu sedikit gangguan untuk tetap harus membuat dua nama berbeda untuk hal yang sama: satu untuk objek jQuery dan satu lagi untuk elemen DOM yang cocok. Selain itu email,, emailElementdan emailJQ, saya terus mencoba variasi lain juga.

Lalu saya perhatikan pola umum:

var email = $("#email");
var emailJQ = $(email);

Karena JavaScript memperlakukan $hanya sebagai huruf untuk nama, dan karena saya selalu mendapatkan objek jQuery kembali dari $(whatever)panggilan, polanya akhirnya menyadarkan saya. Saya bisa menerima $(...)telepon dan menghapus beberapa karakter, dan itu akan muncul dengan nama yang cukup bagus:

$("#email")
$(email)

Strikeout tidak sempurna, tetapi Anda mungkin mendapatkan idenya: dengan beberapa karakter dihapus, kedua baris tersebut pada akhirnya tampak seperti:

$email

Saat itulah saya menyadari saya tidak perlu membuat konvensi seperti emailElementatau emailJQ. Sudah ada konvensi yang bagus menatapku: mengambil beberapa karakter dari $(whatever)panggilan dan berubah menjadi $whatever.

var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object

dan:

// 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!
}

Jadi saya tidak harus membuat dua nama yang berbeda sepanjang waktu, tetapi cukup menggunakan nama yang sama dengan atau tanpa $awalan. Dan $awalan adalah pengingat yang bagus bahwa saya berurusan dengan objek jQuery:

$('#email').click( ... );

atau:

var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );
Michael Geary
sumber
21

Stevo benar, arti dan penggunaan tanda skrip dolar (dalam Javascript dan platform jQuery, tetapi tidak dalam PHP) sepenuhnya semantik. $ adalah karakter yang dapat digunakan sebagai bagian dari nama pengenal. Selain itu, tanda dolar mungkin bukan hal paling "aneh" yang dapat Anda temui di Javascript. Berikut adalah beberapa contoh nama pengidentifikasi yang valid:

var _       = function() { alert("hello from _"); }
var \u0024  = function() { alert("hello from $ defined as u0024"); }
var Ø       = function() { alert("hello from Ø"); }
var $$$$$   = function() { alert("hello from $$$$$"); }

Semua contoh di atas akan berfungsi.

Coba mereka.

Mat
sumber
7

$ Karakter tidak memiliki arti khusus untuk mesin JavaScript. Ini hanya karakter lain yang valid dalam nama variabel seperti az, AZ, _, 0-9, dll ...


sumber
2
benar tetapi tidak apa yang diminta. Saya datang ke sini ingin memahami mengapa itu digunakan dan tampaknya kasus di mana saya melihatnya adalah untuk melihat var yang berisi objek jquery antara var yang berisi objek dom.
rtpHarry
3
@rtpHarry Anda bukan orang yang mengajukan pertanyaan, dan pertanyaan "mengapa" telah dijawab di sini dengan memadai. Ini tidak ada hubungannya dengan JQuery, seperti juga dinyatakan dalam pertanyaan. Bahkan, saya pikir jawaban di atas cocok dengan pertanyaan terbaik - kadang-kadang jika Anda ingin memahami sesuatu yang Anda butuhkan jawaban terkecil yang paling jelas - $tidak membawa arti khusus dalam JavaScript. Titik.
amn
Saya menemukan bahwa tertentu .. ahem ... orang ingin menambahkan tanda dolar ke nama variabel untuk membuat segala sesuatu tampak lebih angular-ish.
mesin terbang
2

Karena _pada awal nama variabel sering digunakan untuk menunjukkan variabel pribadi (atau setidaknya satu yang dimaksudkan untuk tetap pribadi), saya menemukan$ nyaman untuk menambahkan di depan alias singkat saya sendiri ke perpustakaan kode generik.

Misalnya, saat menggunakan jQuery, saya lebih suka menggunakan variabel $J(bukan hanya $) dan menggunakan$P saat menggunakan php.js, dll.

Awalan membuatnya berbeda secara visual dari variabel lain seperti variabel statis saya sendiri, memberi saya fakta bahwa kode tersebut adalah bagian dari beberapa pustaka atau lainnya, dan kecil kemungkinannya akan konflik atau membingungkan orang lain setelah mereka mengetahui konvensi.

Itu juga tidak mengacaukan kode (atau memerlukan pengetikan ekstra) seperti halnya nama yang ditentukan sepenuhnya diulang untuk setiap panggilan perpustakaan.

Saya suka menganggapnya mirip dengan apa yang dilakukan tombol pengubah untuk memperluas kemungkinan tombol tunggal.

Tapi ini hanya konvensi saya sendiri.

Brett Zamir
sumber
2

Seperti yang saya alami selama 4 tahun terakhir, itu akan memungkinkan seseorang untuk dengan mudah mengidentifikasi apakah variabel menunjuk nilai / objek atau elemen DOM dibungkus jQuery

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

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

dalam contoh di atas ketika saya melihat variabel "$ dataDiv" saya dapat dengan mudah mengatakan bahwa variabel ini menunjuk ke elemen DOM yang dibungkus jQuery (dalam hal ini adalah div). dan juga saya bisa memanggil semua metode jQuery tanpa membungkus objek lagi seperti $ dataDiv.append (), $ dataDiv.html (), $ dataDiv.find (), bukan $ ($ dataDiv) .append ().

Semoga ini bisa membantu. jadi akhirnya ingin mengatakan bahwa itu akan menjadi praktik yang baik untuk mengikuti ini tetapi tidak wajib.

Naga Srinu Kapusetti
sumber
0

${varname} hanyalah konvensi penamaan yang digunakan pengembang jQuery untuk membedakan variabel yang memegang elemen jQuery.

Plain {varname}digunakan untuk menyimpan barang-barang umum seperti teks dan string. ${varname}memegang elemen yang dikembalikan dari jQuery.

Anda bisa menggunakan polos {varname} untuk menyimpan elemen jQuery juga, tetapi seperti yang saya katakan di awal ini membedakannya dari variabel polos dan membuatnya lebih mudah untuk dipahami (bayangkan membingungkannya untuk variabel polos dan mencari di seluruh untuk memahami apa yang dipegangnya) .

Sebagai contoh :

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

Di sini, bla sedang menyimpan elemen jQuery yang dikembalikan.

Jadi, ketika orang lain melihat $blahdalam kode, mereka akan mengerti itu bukan hanya string atau angka, itu elemen jQuery.

Satyabrata Mishra
sumber
6
Anda baru saja mengulangi jawaban yang diterima dari 6 tahun yang lalu.
Ken
Saya kira itu tidak membuat jawaban "berkualitas rendah".
Sunny R Gupta
-1

Meskipun Anda dapat menggunakannya untuk awalan pengidentifikasi Anda, itu seharusnya digunakan untuk kode yang dihasilkan, misalnya token pengganti dalam templat, misalnya.

Ryan Abbott
sumber
1
Benar enam tahun lalu, tetapi tidak lagi.
Mark Amery
-2

Penggunaan sudut adalah untuk properti yang dihasilkan oleh framework. Tebak, mereka akan dengan petunjuk (sekarang sudah tidak ada) yang disediakan oleh ECMA-262 3.0.

Manish Jhawar
sumber
-3

$ digunakan untuk membedakan antara variabel umum dan variabel jquery jika variabel normal. membiarkan Anda memesan di FLIPKART maka jika pesanan adalah variabel yang menunjukkan kepada Anda keluaran string maka itu dinamai sederhana sebagai "pesanan" tetapi jika kita mengklik pesanan tempat maka objek dikembalikan maka objek akan dilambangkan dengan $ sebagai "$ memesan "sehingga pemrogram dapat menghapus variabel javascript dan variabel jquery di seluruh kode.

Saurabh Saluja
sumber
-4

Jika Anda melihat tanda dolar ($) atau tanda dolar ganda ($$), dan ingin tahu apa artinya ini dalam kerangka Prototipe, inilah jawaban Anda:

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

Sumber:
http://www.prototypejs.org/api/utility/dollar-dollar

RussellW
sumber
5
OP secara khusus menyatakan bahwa ia tidak bertanya tentang bentuk awalan dolar ini.
Nigel Alderton
-5

Alasan saya kadang-kadang menggunakan konvensi nama php dengan variabel javascript: Saat melakukan validasi input, saya ingin menjalankan algoritma yang persis sama, baik sisi klien, maupun sisi server. Saya benar-benar ingin kedua sisi kode terlihat semirip mungkin, untuk mempermudah perawatan. Menggunakan tanda dolar dalam nama variabel membuat ini lebih mudah.

(Juga, beberapa fungsi pembantu yang bijaksana membantu membuat kode terlihat serupa, misalnya membungkus pencarian nilai-input, versi non-OO dari strlen, substr, dll. Namun masih membutuhkan beberapa penyesuaian manual.)

bukan-just-yeti
sumber
-5

Shuold pengidentifikasi JavaScript yang valid harus dimulai dengan huruf, garis bawah (_), atau tanda dolar ($); karakter selanjutnya juga bisa berupa digit (0-9). Karena JavaScript peka terhadap huruf besar-kecil, huruf menyertakan karakter "A" hingga "Z" (huruf besar) dan karakter "a" hingga "z" (huruf kecil).

Detail:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variables

Harikesh Yadav
sumber
Pertanyaannya bukan 'Bisakah variabel JavasScript dimulai dengan $?', Tapi 'Kenapa a ...'. kamu OP sedang mencari alasan untuk menggunakan konvensi penamaan tersebut.
Steve Ives