【发布时间】: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