JavaScript对象被推入到数组中作为参考

编辑::我忘了添加,这是为NODE的JS服务器端,一些答案有JQuery克隆(jQuery克隆工作在服务器端,我试过是引发错误,因为ReferenceError:jQuery没有定义 )。 所以,我请求每一个,请添加可以在Node JS上工作的解决scheme

首先检查这些程序和他们的输出:

var a = {}; a.name = "Jessie"; a.age = 22; var tarray = []; tarray.push(a); console.dir('------------------before-------------------------------------'); console.dir(tarray); a.name = "Monica"; a.age = 18; console.dir('------------------After-------------------------------------'); console.dir(tarray); 

输出:

 '------------------before-------------------------------------' [ { name: 'Jessie', age: 22 } ] '------------------After-------------------------------------' [ { name: 'Monica', age: 18 } ] 

同样的scheme以不同的方式,

 var a = [{"name" : "Jessie", "Age" : 22}]; var tarray = []; tarray.push(a[0]); console.dir('------------------before-------------------------------------'); console.dir(a); console.dir(tarray); a[0].name = "Monica"; a[0].Age = 18; console.dir('------------------After-------------------------------------'); console.dir(a); console.dir(tarray); 

产量

 '------------------before-------------------------------------' [ { name: 'Jessie', Age: 22 } ] [ { name: 'Jessie', Age: 22 } ] '------------------After-------------------------------------' [ { name: 'Monica', Age: 18 } ] [ { name: 'Monica', Age: 18 } ] 

从这些程序我可以看出,JS对象被推入到数组作为参考。 因此,如果对象发生变化,则推入数组中的对象的值也会发生变化。

如何在javascript中改变这种行为。 我的意思是,如果对象值改变,那么推入数组的对象不应该改变。

是的,感谢所有使用Object.assignJSON.parse的克隆可以解决这个问题:

 var a = {}; a.name = "Jessie"; a.age = 22; var clone = Object.assign({}, a); var tarray = []; tarray.push(clone); console.dir('------------------before-------------------------------------'); console.dir(tarray); a.name = "Monica"; a.age = 18; var clone = Object.assign({}, a); tarray.push(clone); console.dir('------------------After-------------------------------------'); console.dir(tarray); a.name = "Rose"; a.age = 16; var j = (JSON.parse(JSON.stringify(a))); tarray.push(j); console.dir('------------------After JSON Parse Cloning-------------------------------------'); console.dir(tarray); 

输出:

 '------------------before-------------------------------------' [ { name: 'Jessie', age: 22 } ] '------------------After-------------------------------------' [ { name: 'Jessie', age: 22 }, { name: 'Monica', age: 18 } ] '------------------After JSON Parse Cloning-------------------------------------' [ { name: 'Jessie', age: 22 }, { name: 'Monica', age: 18 }, { name: 'Rose', age: 16 } ] 

但是JavaScript中的深层/浅层复制是什么? 他们的任何概念就像在JS?

试着做

 tarray.push(jQuery.extend({}, a)); 

代替

 tarray.push(a); 

它会将对象的副本放到数组中,而不是引用

或者你可以使用tarray.push(Object.assign({}, a)); 来自ES6

你必须克隆这个对象。

这里有5个方法来做到这一点:

你可以用很多方法做到这一点。 浏览器开始支持Object.assign 。 如果您担心浏览器支持,您可以使用babel polyfill :

 var clonedObject = Object.assign({}, a); 

在这里输入图像描述

然后做你会的。

如果你进入实用程序库,你也可以使用lodash中的_.assign 。

您也可以使用ES7对象扩展运算符:

 var clonedObject = { ...a }; 

如果你想要所有的本地和老派,你可以使用Array.prototype.reduce :

 var clonedObject = Object.keys(a).reduce(function(result, prop) { result[prop] = a[prop]; return result; }, {}); 

或者你可以做这个答案说 :

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