js深拷贝的几种实现

转成 JSON 字符串再转回来

var obj = { body: { a: 10 } };
var new_obj = JSON.parse(JSON.stringify(obj));

这种方法能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,即那些能够被 json 直接表示的数据结构,像function属性会丢失;

自定义递归函数拷贝

function deepClone(initalObj, finalObj) {    
  var obj = finalObj || {};    
    for (var k in initalObj) { 
        if(initalObj.hasOwnProperty(k)){ //只拷贝实例属性,不进行原型的拷贝
            if(typeof initalObj[k] == 'object') { //引用类型的数据单独处理
                finalObj[k] = Array.isArray(initalObj[k]) ? [] : {};
                deepClone(initalObj[k], finalObj[k]); //递归处理引用类型数据
            }else{
                finalObj[k] = initalObj[k]; //值类型的数据直接进行拷贝
            }
        }
    }
  return obj;
}

var str = {};
var obj = { a: {a: "hello", b: 21} };
deepClone(obj, str);
console.log(str.a);

其他待续

Author: thinkwei

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注