修改JavaScript对象的副本会导致原始对象发生更改

我正在将myObj复制到tempMyObj

 var tempMyObj = myObj; 

tempMyObj.entity是一个对象数组。 我正在修改tempMyObj.entity基于一些条件。 问题是如果我修改tempMyObj.entity myObj.entity也正在修改。

 for (j = 0; j < myObj.length; j++) { if (myObj[j].type == "TableShape") { var dupEntites = new Array(); for (i = 0; i < myObj[j].entities.length; i++) { if (chk.value != myObj[j].entities[i].id) { var obj = {}; obj.text = myObj[j].entities[i].text; obj.id = myObj[j].entities[i].id; dupEntites.push(obj); } else { if (chk.checked) { var obj = {}; obj.text = myObj[j].entities[i].text; obj.id = myObj[j].entities[i].id; dupEntites.push(obj); } } } tempMyObj[j].entities = dupEntites; } } 

很明显,你对var tempMyObj = myObj;的声明有一些误解var tempMyObj = myObj; 确实。

在JavaScript中,对象是通过引用(更准确地说是引用的值)传递和分配的,所以tempMyObjmyObj都是对同一个对象的引用。

这里有一个简单的例子,可以帮助你看到正在发生的事情

 // [Object1]<--------- myObj var tempMyObj = myObj; // [Object1]<--------- myObj // ^ // | // ----------- tempMyObj 

正如您在作业后可以看到的,两个引用都指向同一个对象。

如果需要修改而不是另一个,则需要创build副本

 // [Object1]<--------- myObj var tempMyObj = jQuery.extend(true, {}, myObj); // [Object1]<--------- myObj // [Object2]<--------- tempMyObj 

以下是创build对象副本的几种方法

既然你已经在使用jQuery:

 var newObject = jQuery.extend(true, {}, myObj); 

用香草JavaScript

 function clone(obj) { if (null == obj || "object" != typeof obj) return obj; var copy = obj.constructor(); for (var attr in obj) { if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; } return copy; } var newObject = clone(myObj); 

看到这里和这里

尝试使用$ .extend() :

但是,如果要保留两个原始对象,则可以通过将空对象作为目标进行传递:

var object = $.extend({}, object1, object2);


 var tempMyObj = $.extend({}, myObj);