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

IT技术 javascript naming-conventions
2021-01-30 03:02:14

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

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

6个回答

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对象。

这是真正的匈牙利符号。它传达了有关存储在变量中的信息,而不是变量名称的作用。A++ 又会是匈牙利。
2021-03-21 03:02:14
@Artemis 我大约 20 年前开始使用匈牙利语,并且一直无法停止使用它。多年来,很多人对我使用它表示非常不满,但它非常有用,我不明白为什么。
2021-03-27 03:02:14
@cschuff 这就是声明......我更喜欢所有局部变量的下划线,并为原型对象的属性保留驼峰式大小写。
2021-03-28 03:02:14
为美元竖起大拇指。但是应该防止变量名中的下划线,正常的 JS-Variables 应该使用驼峰命名。email_fields -> emailField。只有 _ 的有效用例才能作为私有/受保护属性的前缀。
2021-04-05 03:02:14
我希望 jquery 文档也使用这个符号......它确实很有帮助。
2021-04-08 03:02:14

ECMAScript的第 1、第 2 和第 3 版中,规范明确不鼓励使用 $-prefixed 变量名,除了在自动生成代码的上下文中:

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

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

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

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

“它用一些绝对的真理回答了这个问题”。实际上,事实是开发人员完全忽略了语言规范中的这一评论……而且可能仍然如此。:)
2021-03-13 03:02:14
虽然这可能是真的,但它真的有助于回答 OP 的问题吗?当前接受的答案更好——当 JS 新手程序员看到 时$variable,很可能是因为它包含了一个完整的 jQuery 对象。
2021-03-16 03:02:14
@yoyo_fun:由计算机生成而不是由人类编写的代码。
2021-03-20 03:02:14
2021-03-22 03:02:14
@rinogo 它用一些不依赖于对所用库的假设的绝对真理来回答这个问题。
2021-04-01 03:02:14

正如其他人所提到的,美元符号旨在由机械生成的代码使用。但是,该约定已被一些广受欢迎的 JavaScript 库打破。JQuery、Prototype 和 MS AJAX(AKA Atlas)都在它们的标识符中使用这个字符(或作为一个完整的标识符)。

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

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

例如:

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

这似乎是一个合理的约定。

@specializt 正如我 5 年前所说的“或作为一个完整的标识符”。我所说的标识符是指标准的 CS 定义,它是一个词汇标记,它不是语言中的关键字。在这种情况下,$ 和 jQuery 是引用相同值的两个不同标识符。但它们都是标识符。
2021-03-21 03:02:14
JQuery 不在标识符中使用它,$.X 的原因只是必须输入更少 - jQuery.X 是相同的,实际上 $.X 是 jQuery.X 的命名空间别名 - 每个 jQuery 功能都在jQuery-ns,而不是 $
2021-04-09 03:02:14

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

Angular 命名空间$$$

为了防止与您的代码发生意外的名称冲突,Angular 在公共对象的$名称前加上$$. 请不要在您的代码中使用$$$前缀。

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

我是 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那里很好。$当我们已经有两个不同的名称时,为什么我们需要将 a放入其中一个名称中?

实际上,我不会在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 元素,但在另一段代码中,emailDOM 元素并且emailJQ是 jQuery 对象。

没有一致性,我一直把它们混在一起。另外,为同一事物不断地组成两个不同的名称有点麻烦:一个用于 jQuery 对象,另一个用于匹配的 DOM 元素。除了email, emailElement, 和emailJQ,我也一直在尝试其他变体。

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

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

由于 JavaScript 仅将$名称视为另一个字母,而且我总是从$(whatever)调用中返回一个 jQuery 对象,因此我终于意识到了这种模式。我可以接听$(...)电话并删除一些字符,它会想出一个非常好的名字:

$("#email")
$(email)

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

$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!
}

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

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

或者:

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