所有这些答案都是整个答案的一部分。. . 让我再补充一点。:)
正如其他人所说,$(...)
符号是一个返回 JQuery 对象的 JQuery 函数。根据“...”是什么,确定如何完成。
一些例子:
如果您在其中放置一个选择器,例如“div”,您将获得一个 JQuery 对象,其中包含与选择器模式匹配的所有 DOM 元素。. . 在这种情况下,所有<div>
元素。
如果您传递一个 HTML 元素的字符串表示形式(例如,"<div></div>"
),您将获得一个指向新创建<div>
元素的 JQuery 对象。
如果您在其中放置一个 DOM 节点引用(例如,通过 using 创建的document.getElementsByTagName("div")
),它将创建一个指向该引用中该节点的 JQuery 对象。
整个问题在于 JQuery 与 JQuery 对象一起工作,因此这些不同的函数可以帮助程序员创建它们。
现在这是我们回答您的问题的地方。. .
每次使用 时$("...")
,都会创建一个全新的对象,因此,例如以下代码将生成两个唯一的 JQuery 对象,每个对象都指向相同的 DOM 元素:
var $firstObject = $("div");
var $secondObject = $("div");
因此,如果您对它们进行比较(像这样($firstObject === $secondObject)
),它们将不会被视为相等,因为它们不是同一个对象。
现在,让我对您的第二个示例稍作改动,以增加一点清晰度。如果您创建第三个变量并将其设置为等于第二个变量,如下所示:
var $thirdObject = $secondObject;
. . . 你有两个元素实际上指向同一个 JQuery 对象,所以它们实际上是相等的(即,($secondObject === $thirdObject)
将评估为真)。
现在终于,你用这段代码展示了:
$(nav).hide();
. . . 只是尝试创建 JQuery 对象的另一个示例。. . 这次使用另一个 JQuery 对象。但是,使用我在上面创建的第三个变量执行此操作现在将破坏它与第二个变量的关系。. . ($secondObject === $($thirdObject))
. . . 它们不再相等,因为比较的两侧不再指向同一个对象。$firstObject
与之前的比较非常相似$secondObject
,该比较使用两个唯一的 JQuery 对象。
然而 。. .
与其他一些答案不同,我不同意这是一种完全不正确的编码形式。. . 虽然我永远不会在您在示例中提供的情况下使用它,但将 JQuery 对象传递给$(...)
函数与使用.clone()
. 下面的两个$bar
赋值在功能上是等效的:
var $foo = $("<div></div>");
var $bar = $($foo);
var $bar = $foo.clone();
JQuery API 甚至提出了同样的观点(http://api.jquery.com/jQuery/):
克隆 jQuery 对象
当一个 jQuery 对象被传递给 $() 函数时,会创建一个对象的克隆。这个新的 jQuery 对象引用了与初始对象相同的 DOM 元素。
编辑 :
出于好奇,我在 jsPerf 上设置了一个快速测试,该$($foo)
方法比.clone()
在 Firefox、IE9 和 Chrome 中快得多:http: //jsperf.com/clone-technique-test