javascript对象作为引用被推送到数组中

javascript对象作为引用被推送到数组中,javascript,node.js,nodes,Javascript,Node.js,Nodes,编辑:我忘了添加,这是针对节点JS服务器端的,一些答案有Jquery克隆(Jquery克隆在服务器端有效吗,我尝试过它会抛出错误,因为引用错误:Jquery未定义)。所以,我要求每一个,请添加解决方案,可以在节点JS上工作 首先检查这些程序及其输出: var a = {}; a.name = "Jessie"; a.age = 22; var tarray = []; tarray.push(a); console.dir('------------------before--------

编辑:我忘了添加,这是针对节点JS服务器端的,一些答案有Jquery克隆(Jquery克隆在服务器端有效吗,我尝试过它会抛出错误,因为引用错误:Jquery未定义)。所以,我要求每一个,请添加解决方案,可以在节点JS上工作

首先检查这些程序及其输出:

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 } ]
以不同的方式执行相同的程序

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种方法: 你可以用很多方法来做到这一点。浏览器开始支持。如果您担心浏览器支持,可以使用:

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

那就做你想做的

如果您对实用程序库感兴趣,还可以使用

您还可以使用ES7对象扩展操作符:

var clonedObject = { ...a };
如果你想学习所有的本土和老派,你可以使用:

或者你可以:


您必须克隆对象。有多种方法可以做到这一点。请参阅@LucasRodriguez的可能副本,建议的副本不会告诉OP如何克隆对象而不是引用它。请注意,通过JSON.parse(JSON.stringify())复制对象在一般使用中存在一些严重问题。这不是为了那个。JSON是一种传输数据的方式,而不是序列化对象。很抱歉,我没有在问题中提到它,但它在节点JS(服务器端)上,jQuery在服务器端也可以工作。那么您应该使用第二种ES6变体,我建议使用tarray.push(Object.assign({},a));
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);