web-dev-qa-db-ja.com

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

私はドル記号で始まる変数を持つJavaScriptをよく見ます。いつ/なぜあなたはこのように変数に接頭辞を付けることを選びますか?

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

970
Ken

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オブジェクトを見るのを容易にします。

1329
jonstjohn

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

ドル記号($)とアンダースコア(_)は、識別子のどこでも使用できます。ドル記号は、機械的に生成されたコードでのみ使用することを目的としています。

しかし、次のバージョン(現在の 5th Edition )では、この制限はなくなり、上記の箇所は次のように置き換えられました。

ドル記号($)およびアンダースコア(_)は、 IdentifierName のどこにでも使用できます。

そのため、$記号は変数名に自由に使用できるようになりました。特定のフレームワークやライブラリは、シンボルの意味について独自の規則を持っています。これについては、他の回答で説明されています。

234
cic

他の人が述べたように、ドル記号は機械的に生成されたコードによって使われることを意図しています。しかし、その慣習は、広く普及しているJavaScriptライブラリーによっては破られています。 JQuery、Prototype、およびMS AJAX(AKA Atlas)はすべて、この文字を識別子に(または識別子全体として)使用します。

要するにいつでも$を使うことができます。 (通訳は文句を言うことはありません。) 欲しいです それを使用する?

私は個人的には使用しませんが、その使用は有効であると思います。私は、MS AJAXが、ある関数がより冗長な呼び出しの別名であることを示すためにそれを使用していると思います。

例えば:

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

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

57
Benry

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

Angular名前空間$$$

誤って名前がコードと衝突しないように、Angularはパブリックオブジェクトの名前に$を、プライベートオブジェクトの名前に$$を付加したものです。コードに接頭辞$または$$を使用しないでください。

ソース: https://docs.angularjs.org/api

52
Travis

私はこのコンベンションを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つの異なる変数名emailemail_fieldがあります。それはたくさんあります。すでに2つの異なる名前があるのに、なぜ$を1つの名前にする必要があるのでしょうか。

実際、ここではemail_fieldを2つの理由で使用しませんでした。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オブジェクト、emailElementはDOM要素ですが、もう一方ではemailはDOM要素、emailJQはjQueryオブジェクトです。

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

それから私は共通のパターンに気づいた:

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

JavaScriptは$を単なる名前の別の文字として扱うので、そして私は$(whatever)呼び出しからjQueryオブジェクトを受け取ったので、そのパターンはようやく生まれました。私は$(...)呼び出しを受けて、単にいくつかの文字を削除することができました、そしてそれはかなりいい名前を思い付くでしょう:

$("#email")$(email)

取り消し線は完璧ではありませんが、アイデアを思いつくかもしれません。いくつかの文字を削除すると、両方の行が次のようになります。

$email

emailElementemailJQのような規約を作る必要がないことに気づいたときです。私を見つめているニース規約がすでにありました:$(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
Michael Geary

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 $$$$$"); }

上記の例はすべてうまくいきます。

試してみてください。

$文字は、JavaScriptエンジンにとって特別な意味はありません。これは、a-z、A-Z、_、0-9などのような変数名の中の別の有効な文字です。

7
Stevo

変数名の先頭にある_は、プライベート変数(または少なくともプライベートを維持するためのもの)を示すためによく使われるので、$は私自身の簡単なエイリアスの前にジェネリックコードライブラリに追加するのに便利です。

たとえば、jQueryを使用するときは、(単に$Jではなく)変数$を使用し、php.jsなどを使用するときは$Pを使用することを好みます。

接頭辞は私自身の静的変数のような他の変数と視覚的に区別され、コードがあるライブラリまたは他のものの一部であり、慣例を知った後に他のものと衝突したり混乱させたりする可能性が低いという事実に私を結びつけます。

完全に指定された名前が各ライブラリ呼び出しに対して繰り返されるのと同様に、コードが乱雑になる(または余分な入力が必要になる)こともありません。

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

しかし、これは私自身の慣習です。

2
Brett Zamir

私が過去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
Ryan Abbott

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

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

プレーンな{varname}を使ってjQuery要素を格納することもできますが、最初に述べたように、プレーンな変数と区別して理解しやすくなります(プレーンな変数と混同して何が成り立つかを理解するために検索してください).

例えば ​​:

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

ここで、blahは返されたjQuery要素を格納しています。

したがって、他の誰かがコード内の$blahを見たとき、彼らはそれが単なる文字列や数値ではなく、それがjQuery要素であることを理解するでしょう。

0