11

你好,这里有一个关于 jQuery 的新菜鸟,我想知道 jQuery 对象是否是不可变的。例如:

var obj1 = $("<tag></tag>");
var obj2 = obj1.append("something");

obj1 和 obj2 的含义相同吗 obj2 会引用 obj1 吗?

更新:

上面的例子有点触及我想知道的表面,一个更准确的问题是:如果我从 jQuery api 链接函数,它们会返回相同的对象还是新的对象(就像 Java 中的字符串一样)?

4

7 回答 7

6

两者都obj1obj2是对包含该<tag></tag>元素的 jQuery 对象的引用,是的。

如果要保留对第二个元素的引用,可以.appendTo()改用:

var obj1 = $("<p>foo</p>"),
    obj2 = $("<span>bar</span>").appendTo(obj1);
于 2011-11-16T09:33:50.580 回答
3

是的,它obj2会引用obj1. 它基本上所做的是append给予obj1并返回参考。

您可以尝试查看consoleobj1查看obj2文本"something"

console.log(obj1);
console.log(obj2);
于 2011-11-16T09:33:44.510 回答
3

假设我已经理解您的问题,是的,obj2将是对存储在obj1. 如果你做某事obj2

obj2.attr("id", "example");

您将看到以下变化obj1

console.log(obj1) //Will show <tag id="example">something</tag>

您可以通过测试两个对象的相等性来进一步确认这一点:

console.log(obj1 == obj2) //true
于 2011-11-16T09:34:26.443 回答
1

http://jsfiddle.net/rLg9S/

两个对象都返回相同的元素,所以是的。

于 2011-11-16T09:32:54.823 回答
1

如果一个函数改变了选择中的哪些元素,那么是的,将会创建一个新对象。

例如:

var link = $('#myLink'),
    span = link.find('span');

link是不同的对象span但是,原始对象实际上并没有丢失。您可以使用该方法非常轻松地返回它,该end方法基本上回滚操作操作。

$('#myLink')
    .find('span') // get the span elements
        .css('color', '#fff')  // modify them
    .end() // go back to the original selection
    .css('font-size', '24px'); // modify that

因此,如果您有大量未使用的链接选择调用end,您最终可能会得到一个非常大的对象(因为会有一系列对象引用了创建它们的对象)。然而,这将是非常尴尬的设计,因此您不太可能这样做,而 Javascript 的垃圾收集通常意味着您已完成的对象不会在内存中徘徊。

于 2011-11-16T11:22:09.183 回答
0
var obj1 = $("<p></p>");
var obj2 = obj1.append("something"); // in this is you just assign the `obj1` object to `obj2`

喜欢:

var x = 5;
var y = x; //here, both x and y are 5

所以,obj1并且obj2会提到同样的事情

证明:

console.log(obj1 === obj2);
于 2011-11-16T09:43:07.320 回答
0

如果您需要对象的副本,可以使用$.clone() 。

var obj2 = obj1.clone().append("something");
于 2011-11-16T09:36:20.553 回答