问题 jQuery对象是不可变的?


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

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

obj1和obj2是否相同意味着obj2会引用obj1?

更新:

上面的例子有点划破我想知道的表面,一个更准确的问题是:如果我从jQuery api链接函数将返回相同的对象或新的(如Java中的字符串的情况)?


6491
2017-11-16 09:27


起源

许多jQuery方法(不是.append)由于它们的性质而返回一个新的jQuery对象,你需要所有这些方法的综合列表吗?如果你是链接并不重要,重要的是方法返回的内容。 $("div").append("something").bind( "click", fn ) 返回同一个对象 $("div").parent() 返回一个新对象 $("div").html() 除了字符串之外根本不返回jQuery对象 - Esailija
@Esailija我不需要列表,我只是想如果你链并且将返回一个新对象那么那就是内存泄漏 - Daniel
是的,例如,它会 var a = $("div").parent() 将创建2个对象,虽然它看起来没有任何东西是指第一个对象,它将被垃圾收集,第二个对象实际上是指其中的第一个对象 .prevObject 财产所以,在这种情况下,如果你存储 a即使您只使用第二个对象,也永远不会摆脱第一个对象。 - Esailija


答案:


obj1 和 obj2 将是对包含该jQuery对象的jQuery对象的引用 <tag></tag> 元素,是的。

如果你想保留对第二个元素的引用,你可以使用 .appendTo() 代替:

var obj1 = $("<p>foo</p>"),
    obj2 = $("<span>bar</span>").appendTo(obj1);

6
2017-11-16 09:33





是的,它 obj2 会参考 obj1。它基本上是做什么的 append 无论给予什么 obj1 并返回引用。

你可以尝试看看 console 那 obj1 和 obj2 有文字 "something"

console.log(obj1);
console.log(obj2);

3
2017-11-16 09:33





假设我理解你的问题,是的, obj2 将是对存储的对象的引用 obj1。如果你做了什么 obj2

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

您将看到更改 obj1

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

您可以通过测试两个对象是否相等来进一步确认:

console.log(obj1 == obj2) //true

3
2017-11-16 09:34





http://jsfiddle.net/rLg9S/

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


1
2017-11-16 09:32



这不回答这个问题。 - Tadeck
obj1 没有被修改但是底层的dom元素(obj1["0"])是。 - Esailija


如果函数更改选择中的哪些元素,则是,将创建一个新对象。

例如:

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的垃圾收集通常应该意味着你已完成的对象不会在内存中闲逛。


1
2017-11-16 11:22





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

var obj2 = obj1.clone().append("something");

0
2017-11-16 09:36





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);

0
2017-11-16 09:43