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

Ken*_*Ken 1010 javascript naming-conventions

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

(我不是问$('p.foo')你在jQuery和其他人看到的语法,而是像$name和的常见变量$order)

jon*_*ohn 1377

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
Run Code Online (Sandbox Code Playgroud)

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

  • 这是真正的匈牙利表示法.它传达有关变量中存储的内容的信息,超出了变量名称的作用.A ++将再次成为匈牙利. (89认同)
  • @cschuff这就是声明......我更喜欢所有局部变量的下划线,并为原型对象的属性保留camel-case. (11认同)
  • 竖起大拇指为$.但是应该防止变量名中的下划线,正常的JS-Variables应该使用camelCase.email_fields - > emailField.只有_的有效用例是私有/受保护属性的前缀. (9认同)
  • 我希望jquery文档也使用此符号...确实非常有帮助。 (2认同)

cic*_*cic 244

ECMAScript的第1版,第2 第3版中,除了在自动生成的代码的上下文中之外,规范明确禁止使用$ -prefixed变量名:

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

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

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

因此,$ sign现在可以在变量名中自由使用.某些框架和库对符号的含义有自己的约定,这里有其他答案.

  • @rinogo它用一些绝对真理来回答这个问题,这个真理不依赖于对所用库的假设. (11认同)
  • "它回答了一些绝对真理的问题".其实,事实是,开发者完全忽略了从语言规范这句话......而且很可能仍然是.:) (3认同)
  • 虽然这可能是真的,但它真的有助于回答OP的问题吗?当前接受的答案更好 - 当新手JS程序员看到`$ variable`时,可能是因为它包含一个完整的jQuery对象. (2认同)

Ben*_*nry 60

正如其他人所提到的,美元符号旨在由机械生成的代码使用.但是,一些非常流行的JavaScript库打破了这种惯例.JQuery,Prototype和MS AJAX(AKA Atlas)都在其标识符中使用此字符(或作为整个标识符).

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

我个人不使用它,但我认为它的使用是有效的.我认为MS AJAX使用它来表示函数是一个更冗长的调用的别名.

例如:

var $get = function(id) { return document.getElementById(id); }
Run Code Online (Sandbox Code Playgroud)

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

  • 正如我5年前所说的"@specializt"或"作为一个完整的标识符".标识符是指标准CS定义,它是一种词汇标记,不是该语言中的关键字.在这种情况下,$和jQuery是引用相同值的两个不同标识符.但它们都是标识符. (5认同)

Tra*_*vis 54

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

角度命名空间$$$

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

资料来源:https://docs.angularjs.org/api


Mic*_*ary 27

我是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
Run Code Online (Sandbox Code Playgroud)

但这并没有真正说明这一点.即使没有$,我们仍然有两个不同的变量名在这里,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
Run Code Online (Sandbox Code Playgroud)

(当然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
}
Run Code Online (Sandbox Code Playgroud)

那有点令人困惑!在我的一些代码中,email是jQuery对象并且emailElement是DOM元素,但在另一个中,email是DOM元素并且emailJQ是jQuery对象.

没有一致性,我一直把它们混合起来.另外,为了同一件事情而不得不为两个不同的名称组成一个小麻烦:一个用于jQuery对象,另一个用于匹配的DOM元素.此外email,emailElementemailJQ,我一直在尝试其他变化.

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

var email = $("#email");
var emailJQ = $(email);
Run Code Online (Sandbox Code Playgroud)

由于JavaScript $只是另一个名字的字母,因为我总是从一个$(whatever)调用中得到一个jQuery对象,所以这个模式终于明白了.我可以接听$(...)电话并删除一些字符,它会得到一个非常好的名字:

$("#email")
$(email)

Strikeout并不完美,但你可能会有这样的想法:删除一些字符后,这两行最终看起来像:

$email
Run Code Online (Sandbox Code Playgroud)

就在那时我意识到我不需要像emailElement或那样组成一个会议emailJQ.已经有一个很好的会议盯着我:从$(whatever)电话中取出一些角色然后变成了$whatever.

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

和:

// 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!
}
Run Code Online (Sandbox Code Playgroud)

所以我不必一直编造两个不同的名字,但可以使用带有或不带$前缀的相同名称.而$前缀是我处理的是一个jQuery对象一个很好的提醒:

$('#email').click( ... );
Run Code Online (Sandbox Code Playgroud)

要么:

var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );
Run Code Online (Sandbox Code Playgroud)


小智 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 $$$$$"); }
Run Code Online (Sandbox Code Playgroud)

上面的所有例子都可行.

试试吧.


小智 7

$ character对JavaScript引擎没有特殊意义.它只是变量名中的另一个有效字符,如az,AZ,_,0-9等......

  • @rtpHarry你不是那个问这个问题的人,问题"为什么"已经在这里得到了充分的回答.这与JQuery无关,正如问题中所述.事实上,我认为上面的答案最适合这个问题 - 有时如果你想要掌握一些你需要最小的答案 - "$"在JavaScript中没有特殊含义.期. (3认同)
  • 是的,但不是被要求的。我来这里是想了解为什么要使用它,而且看来我所看到的情况是要在包含dom对象的var之间识别包含jquery对象的var。 (2认同)