jQuery是否扩展了在对象之间创建引用?

Han*_*ans 4 jquery reference object extend

我用射击延长了shat.延伸后,为什么修改镜头会改变?

var shat = [{bang:true}, {bumm: false}, {bong: false}]
var shot = [{bang:false}, {bumm: false}, {bong: false}]

$.extend(shat, shot)

shot[0].bang = true

console.log("shat", shat) 
// prints
Object
bang: true // why is this true?
Object
bumm: false
Object
bong: false
Run Code Online (Sandbox Code Playgroud)

我假设创建了一个引用,或者在shot [0] .bang = true之后由于某种原因发生了扩展.问题是,我想在扩展后修改镜头,但当然不希望它对shat有任何影响.任何想法为什么会发生这种情况以及我可以做些什么来避免这种情况?

看jSfiddle测试用例:http://jsfiddle.net/yEnph/3/

小智 5

默认情况下,$.extend只是浅拷贝属性*.这不是很令人兴奋.

在这种情况下,扩展属性是"0","1","2"等,因此shat[0] === shot[0]在扩展之后是真的,仅仅是两个都评估到同一对象的情况.由于它们是同一个对象,然后......嗯,变异,这一个地方发生变异它无处不在.

为了使它们分开,请考虑"深层复制"(请参阅​​调用jQuery.extend的不同方法).我提到的另一种方法,因为它也可以在其他上下文中使用,是序列化对象然后反序列化它 - 例如使用JSON.

var shat = [{bang:true}, {bumm: false}, {bong: false}]
var shot = [{bang:false}, {bumm: false}, {bong: false}]
$.extend(true, shat, shot) // use "deep copy"
shat[0] === shot[0]        // false; different objects now so...
shot[0].bang = "boom"      // ...this will not affect the object named by shat[0]
shot[0].bang               // "boom"
shat[0].bang               // false
Run Code Online (Sandbox Code Playgroud)

快乐的编码.


*也就是说,对于每个属性,p在源对象中,它只是这样做target[p] = source[p].请记住,在JavaScript中,数组只是具有魔法的对象的特殊子类型length:索引n处的值由属性"n"命名.