当前位置: 首页 > 面试题库 >

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

宦琪
2023-03-14
问题内容

我要复制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;
    }
}

问题答案:

显然,您对声明的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);


 类似资料:
  • 本文向大家介绍JavaScript更改原始对象valueOf的方法,包括了JavaScript更改原始对象valueOf的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript更改原始对象valueOf的方法。分享给大家供大家参考。具体分析如下: JS中的对象都包含valueOf方法,我们可以通过自定义valueOf函数替换掉原始object的valueOf 希望本文所述

  • 让我们开始讨论这个问题 但为什么会导致 我期待结果 我用nodejs得到的结果

  • 我克隆了一个flutter项目,并试图在android设备上运行它。但我遇到了这个错误: 任务': app: check DebugAarMetadata'执行失败。发生多个任务操作失败:执行com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction时发生失败 该错误提到当前的compileSdkVersion为30,但某些

  • 这是我的复制构造函数 怎么会这样?这不像是我使用进行克隆,所以我不理解。

  • 问题内容: 我想知道是否有可能在不进行内联样式的情况下修改Css样式表声明。 这是一个简单的例子: 这给出了一个蓝色的书写框,在悬停时变为绿色。 如果我为颜色提供内联样式,则悬停行为将丢失: 无论如何,这都会显示一个红色的书写框。 所以我的问题是,如何能访问和修改css声明对象,而不是用内联样式覆盖样式。 谢谢, 问题答案: 您可以使用与原始样式表相对应的DOM样式表对象上的来修改规则。 请注意,