【问题标题】:Can someone explain the below code for deep copy of an object?有人可以解释下面的对象深拷贝代码吗?
【发布时间】:2022-11-10 01:53:22
【问题描述】:

我看到了下面关于如何在 JavaScript 中深度复制对象的代码。但我无法理解这段代码中的一些事情。

function clone(obj) {
    if (obj === null || typeof (obj) !== 'object' || 'isActiveClone' in obj)
        return obj;

    if (obj instanceof Date)
        var temp = new obj.constructor(); //or new Date(obj);
    else
        var temp = obj.constructor();

    for (var key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
            obj['isActiveClone'] = null;
            temp[key] = clone(obj[key]);
            delete obj['isActiveClone'];
        }
    }
    return temp;
 }

让我根据我的理解解释这段代码。我们要做的第一件事是检查对象是否为null 或不是对象或isEmpty 使用循环'isActiveClone' in obj 如果其中任何一个失败,我们将返回该对象。 现在,我们检查对象是否是 Date 对象,如果是,我无法理解新的 obj.constructor();var temp = obj.constructor(); 我们在这里做什么?

然后,我们在对象上运行一个循环。如果 key 存在于 obj 中,则使用 Object.prototype.hasOwnProperty.call(obj, key)。然后我不明白 obj['isActiveClone'] = null;delete obj['isActiveClone'];。在 temp[key] = clone(obj[key]); 行中,我们递归地调用我们的函数来处理对象中的嵌套。最后我们返回temp,这将是对象的深层副本。

【问题讨论】:

  • “我们在这里做什么?” - 调用构造函数。你有什么具体的关于该代码的问题?
  • 此外,您可以通过删除它们并克隆对象来检查特定行的作用。您可能会发现原始代码中的克隆对象和修改后的代码之间的差异?
  • @NicoHaase 为什么?我们是在创建一个空对象吗?

标签: javascript


【解决方案1】:

我会删除这个答案,但我不能,因为它是公认的答案?‍♀️。

【讨论】:

  • 看起来isActiveClone 阻止了自我或祖先的复制。该函数是递归的,并使用密钥存在作为标志。
  • @Ouroborus 如果我删除 isActiveClone,你能说出代码会失败的边缘情况吗?
  • 我们为什么要做hasOwnProperty 检查?如果我们在对象上运行一个循环,它不会只迭代可用的键吗?那为什么要做这个检查?
  • 如果没有isActiveClone,像x = {}; x.self = x; y = clone(x) 这样的东西会是个问题。 hasOwnProperty 检查防止继承的属性包含在副本中。
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 2012-04-09
相关资源
最近更新 更多