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.assign和JSON.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);