我要复制myObj到tempMyObj
myObj
tempMyObj
var tempMyObj = myObj;
tempMyObj.entity是一组对象。我正在tempMyObj.entity根据某些条件进行修改。问题是,如果我修改tempMyObj.entity,myObj.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;功能有一些误解。
在JavaScript中,对象是通过引用传递和分配的(更准确地说是引用的值),所以tempMyObj和myObj都是对同一对象的引用。
这是一个简化的插图,可以帮助您可视化正在发生的事情
// [Object1]<--------- myObj var tempMyObj = myObj; // [Object1]<--------- myObj // ^ // | // ----------- tempMyObj
如您在分配后所看到的,两个引用都指向同一对象。
如果需要修改一个而不是另一个,则需要 创建一个副本 。
// [Object1]<--------- myObj const tempMyObj = Object.assign({}, myObj); // [Object1]<--------- myObj // [Object2]<--------- tempMyObj
旧答案:
这是创建对象副本的其他几种方法
由于您已经在使用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);