为什么JavaScript变量会以美元符号开头?


1036

我经常看到JavaScript带有以美元符号开头的变量。您何时/为什么选择以这种方式为变量添加前缀?

(我不是在问$('p.foo')您在jQuery和其他语言中看到的语法,而是在询问诸如$name和的普通变量$order


16
这可能是从Perl编程中学到的习惯。(编辑:或PHP)
brien

5
有些语言需要它,例如PHP或Perl-我猜开发人员不记得javascript中不需要它。
Rich Bradshaw

3
或者他们不想被打扰放弃习惯。这很可能是正确的答案,因为如此多的将自己的网页黑客在一起的开发人员都是使用PHP和javascript这样做的。
BlueRaja-Danny Pflughoeft


1
@Ken根据此答案,不是年龄重要,而是答案的好坏。我个人认为,对其他问题的答案更好,这就是为什么我投票决定将其重复作为一个副本。如果您认为此答案更好,则可以投票关闭另一个副本。
唐老鸭

Answers:


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 ++会再次出现在匈牙利。
Artemis

2
我希望jquery文档也使用此符号...确实非常有帮助。
pedromanoel 2014年

1
@Artemis我在20年前就开始学习匈牙利语,但从未停止过使用它。多年来,很多人对我的使用表示非常不满意,但是它非常有用,我无法理解为什么。
猫头鹰2014年

10
竖起大拇指的美元。但是应避免在变量名中使用下划线,普通的JS变量应使用camelCase。email_fields-> emailField。_的唯一有效用例用作私有/受保护属性的前缀。
cschuff

11
@cschuff这是相当不错的声明……我更喜欢所有局部变量都使用下划线,并为原型对象的属性保留驼峰式大小写。
保罗

250

ECMAScript的第一版,第二第三版中,规范明确禁止使用$前缀的变量名,除非在自动生成的代码的上下文中:

标识符中的任何位置均允许使用美元符号($)和下划线(_)。美元符号仅适用于机械生成的代码。

但是,在下一个版本(当前为第5版)中,此限制已被删除,上述段落替换为

IdentifierName中的任何位置都允许使用美元符号($)和下划线(_)。

因此,现在可以在变量名中自由使用$符号。某些框架和库在符号含义上有自己的约定,在此处的其他答案中也有提及。


3
虽然这可能是正确的,但这是否真的有助于回答OP的问题?当前接受的答案更好-当JS新手看到时$variable,可能是因为它包含整个jQuery对象。
rinogo

14
@rinogo它用一些绝对的事实来回答这个问题,这并不取决于所用库的假设。
Oriol 2016年

1
@yoyo_fun:由计算机而不是由人类编写的代码。
cic 2016年


3
“它以某种绝对的真理回答了这个问题”。实际上,事实是开发人员完全忽略了语言规范中的这一说法……而且可能仍然如此。:)
Stijn de Witt

61

正如其他人提到的那样,美元符号旨在由机械生成的代码使用。但是,一些流行的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

5
正如我5年前所说的“ @specializt”或“整个标识符”。标识符是指标准CS定义,它是词汇标记,不是语言中的关键字。在这种情况下,$和jQuery是引用相同值的两个不同的标识符。但是它们都是标识符。
Benry

56

在AngularJS的上下文中,$前缀仅用于框架代码中的标识符。指示框架的用户不要在自己的标识符中使用它:

角命名空间$$$

为了防止代码意外发生名称冲突,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

但这并不能很好地说明这一点。即使没有$,我们在这里仍然会有两个不同的变量名,emailemail_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元素。除了emailemailElement和之外emailJQ,我也一直尝试其他变体。

然后我注意到一个常见的模式:

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

由于JavaScript $只是名称的另一个字母,而且由于我总是从$(whatever)调用中得到一个jQuery对象,因此模式终于在我身上浮现。我可以打个$(...)电话,只删除一些字符,然后会得到一个很好的名字:

$("#email")
$(email)

删除线并不完美,但您可能会明白:删除了某些字符后,这两行最终看起来像:

$email

从那时起,我意识到我不需要像emailElementor 这样的约定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

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等。


2
是的,但不是被要求的。我来这里是想了解为什么要使用它,而且看来我所看到的情况是要在包含dom对象的var之间识别包含jquery对象的var。
rtpHarry 2011年

3
@rtpHarry您不是问这个问题的人,在这里已经充分回答了“为什么”的问题。正如问题所指出的,这与JQuery无关。实际上,我认为上述答案最适合这个问题-有时,如果您想掌握某些内容,则需要最小的最清晰答案- $在JavaScript中没有特殊含义。期。

我发现某些……人们希望将美元符号添加到变量名中,以使事情看起来更加棱角分明。
字形

2

以来 _变量名的开头经常用于表示私有变量(或至少一个打算保持私有状态的变量),因此我发现$将自己的简短别名添加到通用代码库之前很方便。

例如,当使用jQuery时,我更喜欢使用变量$J(而不是just $)并使用$P在使用php.js等时使用。

前缀使它在视觉上与其他变量(例如我自己的静态变量)区分开来,这使我意识到,代码是某个库或其他库的一部分,并且一旦他们了解约定,就不太可能与其他库发生冲突或混淆。

它也不会使代码混乱(或要求额外的键入),对于每个库调用都重复一个完全指定的名称。

我喜欢认为它类似于修饰键在扩展单个键的可能性方面所做的工作。

但这只是我自己的约定。


2

正如我在过去四年中所经历的那样,它将使某些人可以轻松地确定变量是指向值/对象还是由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元素的变量的命名约定。

Plain {varname}用于存储常规内容,例如文本和字符串。 ${varname}保存从jQuery返回的元素。

你可以用普通的 {varname}来存储jQuery元素,但是正如我在一开始所说的,这将其与Plain变量区分开并使其更容易理解(想象将其与Plain变量混淆并进行遍历以了解其含义)。 。

例如 :

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

在这里,blah存储了一个返回的jQuery元素。

因此,当其他人$blah在代码中看到时,他们会理解它不仅是字符串或数字,而且是jQuery元素。


6
您刚刚改写了6年前接受的答案。
肯(Ken)

我想这并不能回答“低质量”。
Sunny R Gupta 2015年



-3

$用于区分普通变量和普通变量时的jquery变量。让您在FLIPKART中下订单,然后,如果该订单是一个向您显示字符串输出的变量,则将其简单命名为“ order”,但是如果我们单击“下订单”,则会返回一个对象,该对象将由$表示为“ $顺序”,以便程序员可以剪掉整个代码中的javascript变量和jquery变量。


-4

如果您看到美元符号($)或双美元符号($$),并且对Prototype框架中的含义感到好奇,那么您的答案是:

$$('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特别指出,他没有询问这种美元前缀形式。
奈杰尔·奥尔德顿

-5

我有时将php名称约定与javascript变量一起使用的原因:在进行输入验证时,我想在客户端和服务器端运行完全相同的算法。我真的希望代码的两个侧面看起来尽可能相似,以简化维护。在变量名中使用美元符号使此操作更加容易。

(此外,一些明智的辅助函数有助于使代码看起来相似,例如包装输入值查找,strlen,substr的非OO版本等。不过,它仍然需要进行一些手动调整。)


-5

有效的JavaScript标识符shuold必须以字母,下划线(_)或美元符号($)开头;后续字符也可以是数字(0-9)。因为JavaScript区分大小写,所以字母包括字符“ A”至“ Z”(大写)和字符“ a”至“ z”(小写)。

详细信息:https :
//developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types#Variables


问题不是“ JavasScript变量可以以$开头吗?”,而是“为什么……...”。您正在寻找使用这种命名约定的理由。
史蒂夫·艾夫斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.