LearningRecord icon indicating copy to clipboard operation
LearningRecord copied to clipboard

深拷贝的实现

Open Rashomon511 opened this issue 5 years ago • 0 comments

function cloneDeep(x) {
    const root = {};

    // 栈
    const loopList = [
        {
            parent: root,
            key: undefined,
            data: x,
        }
    ];

    while(loopList.length) {
        // 广度优先
        const node = loopList.pop();
        const parent = node.parent;
        const key = node.key;
        const data = node.data;

        // 初始化赋值目标,key为undefined则拷贝到父元素,否则拷贝到子元素
        let res = parent;
        if (typeof key !== 'undefined') {
            res = parent[key] = {};
        }

        for(let k in data) {
            if (data.hasOwnProperty(k)) {
                if (typeof data[k] === 'object') {
                    // 下一次循环
                    loopList.push({
                        parent: res,
                        key: k,
                        data: data[k],
                    });
                } else {
                    res[k] = data[k];
                }
            }
        }
    }

    return root;
}

扩展:深拷贝和浅拷贝的区别 浅拷贝只是新开一个别名来引用这个内存区。即拷贝原对象的引用

深拷贝会重新开辟一个内存区,并把之前内存区的值复制进来,这样两个内存区初始值是一样的,但接下去的操作互不影响 深拷贝终极探索

Rashomon511 avatar Mar 28 '19 07:03 Rashomon511