jQuery对象是不可变的?

时间:2011-11-16 09:27:30

标签: immutability jquery mutability

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

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

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

更新:

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

7 个答案:

答案 0 :(得分:6)

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

如果您想保留对第二个元素的引用,可以改为使用.appendTo()

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

答案 1 :(得分:3)

是的,obj2会引用obj1。它基本上做的是appendobj1的任何内容并返回引用。

您可以尝试console obj1obj2查看文字"something"

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

答案 2 :(得分:3)

假设我已经理解了您的问题,是的,obj2将是对obj1中存储的对象的引用。如果您对obj2执行了某些操作:

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

您会在obj1

中看到更改
console.log(obj1) //Will show <tag id="example">something</tag>

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

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

答案 3 :(得分:1)

http://jsfiddle.net/rLg9S/

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

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

答案 5 :(得分:0)

如果您需要复制对象,可以使用$.clone()

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

答案 6 :(得分: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

因此,obj1obj2会引用相同的内容

证明:

console.log(obj1 === obj2);