我看了下面的代码,是关于如何在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
,或者不是一个对象,或者使用一个循环'isActiveClone' in obj
,如果这些都失败了,我们就返回对象。现在,我们检查对象是否是一个Date对象,如果是,我无法理解新的obj.constructor();
和var temp = obj.constructor();
,我们在这里做什么?
然后,我们在我们的对象上运行一个循环。如果一个key
存在于使用Object.prototype.hasOwnProperty.call(obj, key)
的obj中。那么我不理解obj['isActiveClone'] = null;
和delete obj['isActiveClone'];
。在temp[key] = clone(obj[key]);
行,我们递归地调用我们的函数来处理对象中的嵌套。最后,我们返回temp
,它将是对象的深层副本。
1条答案
按热度按时间z9ju0rcb1#
运行.constructor将构造你正在克隆的对象。new关键字是一个特例。你可能需要多次检查它(例如,如果你有使用new-able构造函数的自定义类),但是对于深度复制通用json对象和日期,这是有效的。
就我所知,删除delete语句所在的键“isActiveClone”并不能完成任何事情。如果给定的对象中存在“isActiveClone”键,则永远无法访问该代码。在函数的第一行中,如果obj包含isActiveClone键,则它会立即返回,因此逻辑上,当有任何内容要删除时,代码不应该到达delete语句。另外,在循环开始时将“isActiveClone”键设置为null也不会完成任何事情,并且会运行循环的每次迭代。删除这些行将提高效率和可读性。