JavaScript変数がドル記号で始まるのはなぜですか?[重複]


1037

ドル記号で始まる変数を持つJavaScriptをよく目にします。いつ/なぜこのように変数にプレフィックスを付けるのを選ぶのですか?

(私は$('p.foo')あなたがjQueryなどで見る構文について尋ねているのではなく、$nameandのような通常の変数です$order


16
これはおそらく、Perlプログラミングから取り入れた習慣です。(編集:またはPHP)
2008年

5
PHPやPerlなど、一部の言語ではこれが必要です。開発者がJavaScriptでは不要であることを覚えていないようです。
リッチブラッドショー、

3
または、彼らは習慣を落とすことに煩わされたくありませんでした。これはおそらく正しい答えです。自分のWebページをハッキングする多くの開発者がPHPとJavaScriptを使用してそうするためです。
BlueRaja-Danny Pflughoeft、2011

@DonaldDuck私はあなたがあなたの複製を間違った方法で持っているかもしれないと思う-これはあなたのリンクより7ヶ月古い
Ken

1
@ケンこの回答によると、重要なのは年齢ではなく、回答の質です。私は個人的に他の質問への回答の方が良いと思います。そのため、私はこの質問を重複として閉じることに投票しました。これに対する回答の方が優れていると思われる場合は、投票して他の回答を複製として閉じることができます。
ドナルドダック

回答:


1420

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
これはREALハンガリー語表記です。これは、変数名が何をするかを超えて、変数に何が格納されているかについての情報を伝えます。A ++は再びハンガリーでしょう。
アルテミス

2
jqueryドキュメントでもこの表記法を使用したいと思います...本当に役に立ちます。
pedromanoel 2014年

1
@Artemis私はハンガリー語をほぼ20年前に手に入れ、それを使うのをやめることができませんでした。何年にもわたって、多くの人々が私の使用に大きな不快感を示してきましたが、それが役に立ったのはなぜでしょうか。
夜更かし

10
$の高評価。ただし、変数名の下線は使用しないでください。通常のJS変数では、キャメルケースを使用してください。email_fields-> emailField。_の有効な使用例は、プライベート/保護されたプロパティのプレフィックスとしてのみです。
cschuff、2014

11
@cschuffそれはかなりステートメントです...私はすべてのローカル変数にアンダースコアを好み、プロトタイプオブジェクトのプロパティにキャメルケースを予約します。
ポール、

250

ECMAScriptの第1版、第2 、および第3版では、自動生成されたコードのコンテキストを除いて、$接頭辞付きの変数名の使用は仕様で明示的に推奨されていません。

ドル記号($)と下線(_)は、識別子のどこでも使用できます。ドル記号は、機械的に生成されたコードでのみ使用するためのものです。

ただし、次のバージョン(最新である第5版)では、この制限がなくなり、上記の文章が次のように置き換えられました。

ドル記号($)とアンダースコア(_)は、IdentifierNameの任意の場所で使用できます。

そのため、$記号を変数名で自由に使用できるようになりました。特定のフレームワークとライブラリには、シンボルの意味に関する独自の規則があります。


3
これは本当かもしれませんが、OPの質問に答えるのに本当に役立ちますか?現在受け入れられている答えの方が優れ$variableています。初心者のJSプログラマーがを見ると、jQueryオブジェクト全体が含まれていることが原因と考えられます。
rinogo 2016年

14
@rinogo使用されているライブラリに関する仮定に依存しない絶対的な真実で質問に答えます。
Oriol

1
@yoyo_fun:人間が作成したのではなく、コンピューターが生成したコード。
cic


3
「それはいくつかの絶対的な真実で質問に答えます」。実際、真実は開発者が言語仕様からこの発言を完全に無視していたということでした...そしておそらくまだそうです。:)
Stijn de Witt

61

他の人が述べたように、ドル記号は機械的に生成されたコードで使用されることを意図しています。ただし、その慣例は、非常に人気のあるJavaScriptライブラリによって破られています。JQuery、プロトタイプ、MS AJAX(AKAアトラス)はすべて、この文字を識別子に(または識別子全体として)使用します。

つまり、$いつでも好きなときに使用できます。(通訳は文句を言わないでしょう。)問題はいつそれを使いたいですか?

個人的には使用していませんが、使用は妥当だと思います。MS AJAXはこれを使用して、関数がさらに詳細な呼び出しのエイリアスであることを示していると思います。

例えば:

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

それは合理的な慣習のようです。


jQueryはこれを識別子で使用しません。$。Xが単にタイプする必要があるという理由です-jQuery.Xは同一です。実際、$。XはjQuery.Xの名前空間エイリアスです-すべてのjQuery機能はjQueryの-NS、ない$
specializt

5
@specializtは、5年前に「または全体の識別子として」言ったとおりです。識別子とは、言語のキーワードではない字句トークンである標準のCS定義を意味します。この場合、$とjQueryは、同じ値を参照する2つの異なる識別子です。しかし、それでも両方とも識別子です。
ベンリー2013

56

AngularJSのコンテキストでは、$プレフィックスはフレームワークのコードの識別子にのみ使用されます。フレームワークのユーザーは、自分の識別子で使用しないように指示されています。

Angular名前空間$$$

コードとの偶発的な名前の衝突を防ぐために、Angularは、パブリックオブジェクトの$名前の前にとプライベートオブジェクトの名前の前にを付け$$ます。コードで$または$$プレフィックスを使用しないでください。

出典: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

しかし、それは本当にそれをよく説明していません。がなくても$、ここには2つの異なる変数名emailとがありemail_fieldます。それはそこに十分良いです。$すでに2つの異なる名前がある場合、なぜ名前の1つにをスローする必要があるのでしょうか。

実際、私はemail_field2つの理由でここでは使用しませんでした。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
}

まあそれは少し混乱しています!私のコードの1つemailは、jQueryオブジェクトでemailElementDOM要素ですが、もう1つemailはDOM要素でemailJQあり、jQueryオブジェクトです。

一貫性がなく、混ぜ続けました。さらに、同じものに対して2つの異なる名前を作成しなければならないのは少し厄介でした。1つはjQueryオブジェクト用で、もう1つは一致するDOM要素用です。加えてemailemailElementemailJQ、私も他のバリエーションをしようとし続けました。

それから私は一般的なパターンに気づきました:

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

JavaScriptは$名前の単なる別の文字として扱うので、$(whatever)呼び出しから常にjQueryオブジェクトが返されるので、最終的にパターンが浮かび上がりました。私は$(...)電話をかけて、いくつかの文字を削除するだけで、かなりいい名前が付けられます:

$("#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!
}

したがって、常に2つの異なる名前を作成する必要はありませんでしたが、$プレフィックスの有無にかかわらず同じ名前を使用できました。そして、$接頭辞は、私はjQueryオブジェクトを扱ったことの素敵なリマインダーでした。

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

または:

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

21

Stevoは正解です。ドル記号の記号(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などの変数名に含まれるもう1つの有効な文字です。


2
本当ですが、尋ねられたものではありません。なぜそれが使用されたのかを理解するためにここに来ました。私がそれを見ていたのは、domオブジェクトを含むvarとjqueryオブジェクトを含むvarを区別することだったようです。
rtpHarry

3
@rtpHarryあなたは質問をしているのはあなたではありません、そして「なぜ」という質問はここで適切に答えられました。これも質問で述べたように、JQueryとは関係ありません。実際、上記の答えは質問に最もよく当てはまると思います。場合によっては、最も明確な答えが必要なものを把握したい場合でも$、JavaScriptでは特別な意味がありません。限目。
午前

私は特定の..エヘムを見つける...人々は物事をより角張ったように見えるようにするために変数名にドル記号を追加したいのです。
グリフ

2

以来_、変数名の先頭にしばしばプライベート変数を示すために使用される(あるいは少なくとも一方がプライベート残ることを意図し)されて、私が見つけ$、一般的なコードライブラリに私自身の簡単なエイリアスの前に追加するための便利。

たとえば、jQueryを使用する場合は、変数を$J(の代わりに$)使用$Pし、php.js を使用する場合などを使用します。

プレフィックスは、自分の静的変数などの他の変数と視覚的に区別し、コードが一部のライブラリまたはその他の一部であるという事実に私を導き、規則を知っていれば、他の変数と競合したり混乱したりする可能性が低くなります。

また、ライブラリを呼び出すたびに完全に指定された名前が繰り返されるので、コードが煩雑になりません(または追加の入力が必要になります)。

私はそれを修飾キーが単一キーの可能性を拡張するために何をするかに似ていると考えたいです。

しかし、これは単なる私の慣習です。


2

私が過去4年間経験してきたように、値/オブジェクトを指す変数か、jQueryでラップされたDOM要素かを簡単に識別できるようになります

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

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

上記の例で変数 "$ dataDiv"を見ると、この変数がjQueryでラップされたDOM要素(この場合はdiv)を指していると簡単に言えます。また、$($ dataDiv).append()の代わりに$ dataDiv.append()、$ dataDiv.html()、$ dataDiv.find()のようにオブジェクトを再度ラップせずにすべてのjQueryメソッドを呼び出すこともできます。

それが役に立てば幸いです。最後に、これに従うことは良い習慣であるが必須ではないということを言いたい。


0

${varname} jQuery開発者がjQuery要素を保持している変数を区別するために使用する単なる命名規則です。

プレーン{varname}は、テキストや文字列などの一般的なものを格納するために使用されます。 ${varname}jQueryから返された要素を保持します。

プレーン{varname}を使用してjQuery要素を格納することもできますが、冒頭で述べたように、プレーン変数とは区別され、はるかに理解しやすくなります(プレーン変数と混同して全体を検索して、何が保持されているかを理解することを想像してください)。 。

例えば ​​:

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

ここでは、何とか返されたjQuery要素が格納されています。

したがって、誰かが$blahコードでを見ると、それが単なる文字列や数値ではなく、jQuery要素であることがわかります。


6
あなたは6年前から受け入れられた答えを言い換えました。
Ken

それは「低品質」の答えにならないと思います。
Sunny R Gupta、2015年

-1

単に識別子のプレフィックスとして使用できますが、たとえば、テンプレートの置換トークンなど、生成されたコードに使用されることが想定されています。


1
6年前は真実でしたが、もはやそうではありません。
マークアメリー2014年

-2

Angularの用途は、フレームワークによって生成されるプロパティです。推測、それらはECMA-262 3.0によって提供された(現在は機能しなくなった)ヒントによって進んでいます。


-3

$は、通常の変数の場合に、共通変数とjquery変数を区別するために使用されます。FLIPKARTで注文を出すと、注文が文字列出力を示す変数の場合、「注文」という単純な名前が付けられますが、注文注文をクリックすると、オブジェクトが返され、そのオブジェクトは$で「$」と表示されますプログラマーがコード全体で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
OPは特に、この形式のドルプレフィックスについて質問していないと述べています。
Nigel Alderton、2012

-5

php name-conventionsをjavascript変数と一緒に使用する理由:入力検証を実行するとき、クライアント側とサーバー側の両方でまったく同じアルゴリズムを実行したいと思います。メンテナンスを簡略化するために、コードの2つの側面をできるだけ似たものにしたいと思っています。変数名にドル記号を使用すると、これが簡単になります。

(また、いくつかの賢明なヘルパー関数は、コードを似たものにするのに役立ちます。たとえば、入力値のルックアップ、非OOバージョンのstrlen、substrなどです。ただし、手動で微調整する必要があります。)


-5

有効なJavaScript識別子shuoldは、文字、アンダースコア(_)、またはドル記号($)で始まる必要があります。後続の文字も数字(0-9)にすることができます。JavaScriptでは大文字と小文字が区別されるため、文字には「A」〜「Z」(大文字)の文字と「a」〜「z」(小文字)の文字が含まれます。

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


質問は、「JavasScript変数は$で始めることができますか?」ではなく、「なぜ...なのか」です。OPは、このような命名規則を使用する理由を探していました。
Steve Ives
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.