一尘不染

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

javascript

我要复制myObjtempMyObj

var tempMyObj = myObj;

tempMyObj.entity是一组对象。我正在tempMyObj.entity根据某些条件进行修改。问题是,如果我修改tempMyObj.entitymyObj.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;
    }
}

阅读 294

收藏
2020-04-25

共1个答案

一尘不染

显然,您对声明的var tempMyObj = myObj;功能有一些误解。

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

这是一个简化的插图,可以帮助您可视化正在发生的事情

// [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);
2020-04-25