Javascript深层嵌套对象副本更新它';s值,甚至在它被更改之前

Javascript深层嵌套对象副本更新它';s值,甚至在它被更改之前,javascript,object,deep-copy,Javascript,Object,Deep Copy,我编写了一个普通代码,用于在对复制对象进行一些更改之前和之后,深度复制对象,然后打印原始对象和复制对象 这是为了表明更改没有影响原始对象,并且两个对象彼此独立 问题是,即使在进行更改之前,复制对象也会显示深度更改的属性 一个答案可能是,不知何故,它使用了一些旧的值,因为我在Google Chrome浏览器上测试了这段代码。(我做了很多次测试来找出它行为的原因。)但是这似乎不可能,因为我再次声明它们,并在每次代码执行时分配新的值 守则: function deepCopy(obj) {

我编写了一个普通代码,用于在对复制对象进行一些更改之前和之后,深度复制对象,然后打印原始对象和复制对象

这是为了表明更改没有影响原始对象,并且两个对象彼此独立

问题是,即使在进行更改之前,复制对象也会显示深度更改的属性

一个答案可能是,不知何故,它使用了一些旧的值,因为我在Google Chrome浏览器上测试了这段代码。(我做了很多次测试来找出它行为的原因。)但是这似乎不可能,因为我再次声明它们,并在每次代码执行时分配新的值


守则:

function deepCopy(obj) {
    let tempObj = {};

    for(let key in obj) {
        if(typeof obj[key] == "object") {
            tempObj[key] = deepCopy(obj[key]);
        }
        else {
            tempObj[key] = obj[key];
        }        
    }

    return tempObj;
}

let user = {
    name: "goku",
    age: 18,
    info: {
        powerLevel: 10000,
        race: "saiyan",
    },
};

let copyUser = deepCopy(user);

console.log("Before changing");
console.log(user);
console.log(copyUser);

copyUser.info.powerLevel = 50;

console.log("After changing");
console.log(user);
console.log(copyUser);
代码的输出应如下所示:

更换前 (原始对象的)功率级:10000 (复制对象的)功率级别:10000

更换后 (原始对象的)功率级:10000 (复制对象的)功率级别:50

proxyConsoleLog.js:12 Before changing
proxyConsoleLog.js:12 {name: "goku", age: 18, info: {…}}age: 18info: {powerLevel: 10000, race: "saiyan"}name: "goku"__proto__: Object
proxyConsoleLog.js:12 {name: "goku", age: 18, info: {…}}age: 18info: {powerLevel: 50, race: "saiyan"}name: "goku"__proto__: Object
proxyConsoleLog.js:12 After changing
proxyConsoleLog.js:12 {name: "goku", age: 18, info: {…}}age: 18info: {powerLevel: 10000, race: "saiyan"}name: "goku"__proto__: Object
proxyConsoleLog.js:12 {name: "goku", age: 18, info: {…}}age: 18info: {powerLevel: 50, race: "saiyan"}name: "goku"__proto__: Object
undefined

为什么复制对象中的powerLevel值在实际更改之前发生更改?控制台延迟加载对象。chrome控制台中的蓝色方形图标是一个指示牌,告诉您发生了这种情况

var obj={foo:{bar:1};
控制台日志(obj);
log(JSON.stringify(obj));
obj.foo.bar=2;
控制台日志(obj);

log(JSON.stringify(obj))控制台的日志记录并不总是准确的。stringify,看看这不是你认为的问题。另一个问题,这是一个明显的重复,投票结束