两种javascript深拷贝的方法

2015-08-12 Lim Geng 更多博文 » 博客 » GitHub »

前端 javascript deepCopy

原文链接 http://gengliming.com/2015/08/12/two-implements-of-js-deep-copy/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


递归

function deepCopy(obj) {
    if (!obj || typeof obj !== 'object') return obj;

    var target = isPlainObject(obj) ? {} : [],
        property, val;

    for (var key in obj) {
        val = obj[key];
        // 防止循环引用
        if (val === obj) continue;
        if (Array.isArray(val) || isPlainObject(val)) {
            target[key] = deepCopy(val);
        } else {
            target[key] = val;
        }
    }
    return target;
}

function isPlainObject(o) {
    return Object.prototype.toString.call(o) === "[object Object]";
}

非递归

function deepCopy(obj) {
    if (!obj || typeof obj !== 'object') return obj;

    var target = isPlainObject(obj) ? {} : [],
        auxlity = [
            [target, obj]
        ];

    while (auxlity.length) {
        var item = auxlity.shift(),
            to = item[0],
            from = item[1];
        for (var key in from) {
            var prop = from[key];
            // 防止循环引用
            if (from === prop) continue;
            if (Array.isArray(prop)) {
                to[key] = [];
                auxlity.push([to[key], prop]);
            } else if (isPlainObject(prop)) {
                to[key] = {};
                auxlity.push([to[key], prop]);
            } else {
                to[key] = prop;
            }
        }
    }
    return target;
}

function isPlainObject(o) {
    return Object.prototype.toString.call(o) === "[object Object]";
}