所有这些答案都是整个答案的一部分……让我再添加另一个部分。 :)
正如其他人所说,
$(...)
表示一个 JQuery 函数,返回一个 JQuery 对象。取决于 "..." 是什么,决定了如何完成它。
一些例子:
- 如果你放一个选择器,比如 "div",你会得到一个包含所有匹配选择器模式的 DOM 元素的 JQuery 对象……在这种情况下,所有的
<div>
元素。
- 如果你传递一个 HTML 元素的字符串表示形式(例如,
"<div></div>"
),你会得到一个指向新创建的
<div>
元素的 JQuery 对象。
- 如果你把一个 DOM 节点引用放进去(例如,使用
document.getElementsByTagName("div")
创建的节点),它将创建一个指向该引用中的节点的 JQuery 对象。
整个目的是 JQuery 使用 JQuery 对象,因此这些各种函数帮助程序员创建它们。
现在我们来回答你的问题...
每次你使用 `$(“...”)` ,你都会创建一个全新的对象,所以例如下面的代码将产生两个唯一的 JQuery 对象,每个对象都指向相同的 DOM 元素:
var $firstObject = $("div");
var $secondObject = $("div");
所以,如果你对它们进行比较(例如这样
($firstObject === $secondObject)
),它们将不被视为相等,因为它们不是同一个对象。
现在,让我稍微改变一下你的第二个例子,以使其更加清晰。如果你创建一个第三个变量并将其设置为与第二个变量相等,就像这样:
var $thirdObject = $secondObject;
“你有两个元素实际上指向同一个 JQuery 对象,因此它们实际上是相等的(即
($secondObject === $thirdObject)
将评估为 true)。
现在最后,你展示了这段代码:”
$(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上进行了快速测试,发现在Firefox、IE9和Chrome中,$($foo)
方法比.clone()
方法要快得多:http://jsperf.com/clone-technique-test