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

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


当前回答

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

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

其他回答

正如我在过去4年的经验,它将允许一些人很容易地识别变量是否指向值/对象或jQuery包装的DOM元素

前任: 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()。

希望能有所帮助。 所以最后想说的是,这将是一个很好的实践,但不是强制性的。

早在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

但这并没有很好地说明它。即使没有$,我们仍然有两个不同的变量名,email和email_field。这已经足够好了。当我们已经有两个不同的名称时,为什么还要在其中一个名称中添加$呢?

实际上,我在这里没有使用email_field,原因有两个:names_with_下划线不是惯用的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元素。除了email、emailElement和emailJQ,我还一直在尝试其他变体。

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

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

由于JavaScript仅仅把$当作另一个字母来表示名称,而且我总是从$(无论什么)调用中返回一个jQuery对象,所以我终于明白了这个模式。我可以使用$(…)调用并删除一些字符,它会产生一个非常不错的名称:

$("#email")
$(email)

三振出局并不完美,但你可能会明白:删除了一些字符,这两行最终看起来像:

$email

这时我意识到我不需要编写emailElement或emailJQ这样的约定。已经有一个很好的约定在盯着我:从$(whatever)调用中取出一些字符,它就会变成$whatever。

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

and:

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

or:

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

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

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

(此外,一些明智的帮助函数有助于使代码看起来相似,例如包装输入值查找,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'

来源: http://www.prototypejs.org/api/utility/dollar-dollar