javascript 有人能解释一下下面的代码吗?

bjp0bcyl  于 2022-10-30  发布在  Java
关注(0)|答案(1)|浏览(171)

我看了下面的代码,是关于如何在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,它将是对象的深层副本。

z9ju0rcb

z9ju0rcb1#

运行.constructor将构造你正在克隆的对象。new关键字是一个特例。你可能需要多次检查它(例如,如果你有使用new-able构造函数的自定义类),但是对于深度复制通用json对象和日期,这是有效的。
就我所知,删除delete语句所在的键“isActiveClone”并不能完成任何事情。如果给定的对象中存在“isActiveClone”键,则永远无法访问该代码。在函数的第一行中,如果obj包含isActiveClone键,则它会立即返回,因此逻辑上,当有任何内容要删除时,代码不应该到达delete语句。另外,在循环开始时将“isActiveClone”键设置为null也不会完成任何事情,并且会运行循环的每次迭代。删除这些行将提高效率和可读性。

相关问题