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

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

(我不是在问你在jQuery和其他jQuery中看到的$('p.foo')语法,而是像$name$order这样的普通变量)

280931 次浏览

虽然您可以简单地使用它作为标识符的前缀,但它应该用于生成的代码,例如模板中的替换令牌。

在第1条、第2条和第0条中,使用$前缀的变量名被规范明确劝阻,除非在自动生成代码的上下文中:

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

然而,在下一个版本中(当前的第五版),这个限制被删除了,上面的段落被替换为

美元符号($)和下划线(_)允许出现在IdentifierName中的任何位置。

因此,$符号现在可以在变量名中自由使用。某些框架和库对符号的含义有自己的约定,在这里的其他回答中说明了这一点。

正如其他人所提到的,美元符号是用于机械生成的代码。然而,这种惯例已经被一些非常流行的JavaScript库打破了。JQuery, Prototype和MS AJAX(又名Atlas)都在它们的标识符中使用这个字符(或作为一个完整的标识符)。

简而言之,您可以随时使用$。(翻译不会抱怨。)问题是你什么时候使用它?

我个人不使用它,但我认为它的使用是有效的。我认为MS AJAX使用它来表示函数是一些更详细调用的别名。

例如:

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

这似乎是一个合理的惯例。

jQuery中非常常见的用途是将存储在变量中的jQuery对象与其他变量区分开来。

例如,我会定义:

var $email = $("#email"); // refers to the jQuery object representation of the dom objectvar email_field = $("#email").get(0); // refers to the dom object itself

我发现这在编写jQuery代码时非常有用,并且可以很容易地看到具有不同属性集的jQuery对象。

$字符对于JavaScript引擎没有特殊意义。它只是变量名中的另一个有效字符,如a-z, a-z, _, 0-9等…

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

以上所有的例子都可以。

试一试。

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

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

如果你看到美元符号($)或双美元符号($$),并想知道这在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'
< p >来源:< br ># 0 < / p >

使用的是框架生成的属性。我猜,他们是根据ECMA-262 3.0提供的提示(现在已经失效了)。

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

Angular命名空间$$$

为了防止与代码的名称意外冲突,Angular将公共对象的名称前缀为$,私有对象的名称前缀为$$。请不要在代码中使用$$$前缀。

来源:# 0

$用于区分普通变量和jquery变量。让你在FLIPKART中下订单,然后如果订单是一个显示字符串输出的变量,那么它被命名为“order”,但如果我们单击place order,则返回一个对象,该对象将被标记为“$order”,以便程序员可以在整个代码中剪切出javascript变量和jquery变量

由于变量名开头的_通常用于表示私有变量(或者至少是一个私有变量),因此我发现$便于在我自己的简短别名前面添加到泛型代码库中。

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

前缀使它在视觉上与其他变量(如我自己的静态变量)不同,提示我代码是某个库或其他库的一部分,一旦他们知道了约定,就不太可能与他人冲突或混淆。

它也不会像对每个库调用重复完全指定的名称那样使代码变得混乱(或需要额外的输入)。

我喜欢把它看作是类似于修饰键扩展单键可能性的作用。

但这只是我自己的习惯。

${varname}只是jQuery开发人员用来区分包含jQuery元素的变量的命名约定。

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

您也可以使用plain {varname}来存储jQuery元素,但正如我在开始时所说的,这将它与普通变量区别开来,使其更容易理解(想象一下,将它与普通变量混淆,并搜索它以了解它所包含的内容)。

例如:

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

这里,blah存储返回的jQuery元素。

因此,当其他人在代码中看到$blah时,他们会明白它不仅仅是一个字符串或数字,它是一个jQuery元素。

正如我在过去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()。

希望能有所帮助。所以最后想说的是,这将是一个很好的实践,但不是强制性的。< / p >
有效的JavaScript标识符必须以字母开头,下划线(_)或美元符号($);后续字符也可以是数字(0-9)。因为JavaScript是区分大小写的,信包括字母“A”到“Z”(大写)和字符“a”到“z”(小写)。

< p >细节:< br ># 0 < / p >

早在2006年,我就发起了这个惯例,并在早期的jQuery邮件列表中推广它,所以让我分享一些关于它的历史和动机。

公认的答案给出了这样一个例子:

var $email = $("#email"); // refers to the jQuery object representation of the dom objectvar 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 functionfunction 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元素。除了emailemailElementemailJQ,我也一直在尝试其他的变化。

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

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