Javascript 为什么过滤新的JSON对象会导致旧的JSON对象自我更新?

Javascript 为什么过滤新的JSON对象会导致旧的JSON对象自我更新?,javascript,jquery,json,Javascript,Jquery,Json,我有一个名为arr的JSON数组和一个从arr创建的名为new_arr的新数组 阵列arr和新阵列arr都变为: 我的问题是:为什么修改新数组会改变旧数组?没有新数组。它只是对旧数组的新引用。 再举一个例子: var a = {}; var b = a; // check to see if they are equal alert(a === b); // modify one of them b.foo = 'bar'; // check to see if they are equal

我有一个名为arr的JSON数组和一个从arr创建的名为new_arr的新数组

阵列arr和新阵列arr都变为:

我的问题是:为什么修改新数组会改变旧数组?

没有新数组。它只是对旧数组的新引用。 再举一个例子:

var a = {};
var b = a;
// check to see if they are equal
alert(a === b);
// modify one of them 
b.foo = 'bar';
 // check to see if they are equal
alert(a === b);
// modify one of them 
a.bar = 'foo';
 // check to see if they are equal
alert(a === b);
a和b引用同一个对象,因此,当您修改a时,您也会修改b,依此类推

如果使用jquery,则应使用extend方法:

var new_arr = $.extend(true,arr);
没有新的数组。它只是对旧数组的新引用。 再举一个例子:

var a = {};
var b = a;
// check to see if they are equal
alert(a === b);
// modify one of them 
b.foo = 'bar';
 // check to see if they are equal
alert(a === b);
// modify one of them 
a.bar = 'foo';
 // check to see if they are equal
alert(a === b);
a和b引用同一个对象,因此,当您修改a时,您也会修改b,依此类推

如果使用jquery,则应使用extend方法:

var new_arr = $.extend(true,arr);

可能是因为arr是一个对象 var new_arr=arr 只是将它的引用分配给new_arr?试试这个
new_arr=arr.clone可能是因为arr是一个对象 var new_arr=arr 只是将它的引用分配给new_arr?试试这个
new_arr=arr.clone

执行以下操作时引用的是同一数组:

var new_arr = arr;
如果您想要一份副本,您需要制作一份副本:

var new_arr = arr.data.slice( 0 ); // 0 is the optional starting index of the copy
这只是创建数组的浅层副本,因此嵌套对象将被两者引用


如果需要对所有嵌套对象进行深度克隆,则需要遍历每个对象并进行复制。

执行以下操作时,您引用的是同一数组:

var new_arr = arr;
如果您想要一份副本,您需要制作一份副本:

var new_arr = arr.data.slice( 0 ); // 0 is the optional starting index of the copy
这只是创建数组的浅层副本,因此嵌套对象将被两者引用


如果需要对所有嵌套对象进行深度克隆,则需要遍历每个对象并进行复制。

您应该克隆阵列。这是我从约翰·雷斯格那里抄来的。更多解释请参见他的帖子

// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

这应该适用于您的阵列和新阵列。

您应该克隆阵列。这是我从约翰·雷斯格那里抄来的。更多解释请参见他的帖子

// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);


这应该适用于您的arr和新的arr。

对不起,您能更具体一点吗?对不起,您能更具体一点吗?它说arr.clone不是函数它说arr.clone不是函数我在代码中没有看到任何JSON,只有JavaScript对象。它是从$getJSON方法获得的JSON对象。我删去并简化了这里的代码。好吧,但即使这样,问题也与JSON无关,而是与JavaScript中如何处理数组和对象引用有关。我尝试过使用线性数组,使用var new_arr=arr时旧数组没有改变。我在代码中没有看到任何JSON,仅JavaScript对象。它是从$getJSON方法获得的JSON对象。我删去并简化了这里的代码。好吧,但即使这样,问题也与JSON无关,而是与JavaScript中如何处理数组和对象引用有关。我尝试过使用线性数组,但使用var new_arr=arr时旧数组没有改变。我很好奇是否建议传递0?arr.slice也应该可以工作,或者在某些浏览器中是否存在我不知道的问题?@FelixKling:不,不需要,因为0是默认值,我不知道有任何浏览器问题。我只是觉得在这种情况下我最好说得更清楚一点。添加了代码注释以澄清:好的,我最近看到很多人这么做,我想知道…:谢谢仅仅因为他把它命名为arr,它并不能使它成为一个数组。它实际上是一个对象,对它调用slice会触发一个错误。@gion:我想patrick可能被描述搞糊涂了,它说的是JSON数组。我很好奇是否建议传递0?arr.slice也应该可以工作,或者在某些浏览器中是否存在我不知道的问题?@FelixKling:不,不需要,因为0是默认值,我不知道有任何浏览器问题。我只是觉得在这种情况下我最好说得更清楚一点。添加了代码注释以澄清:好的,我最近看到很多人这么做,我想知道…:谢谢仅仅因为他把它命名为arr,它并不能使它成为一个数组。它实际上是一个对象,对它调用slice会触发一个错误。@gion:我想patrick可能被描述搞糊涂了,它说的是JSON数组。