JS深拷贝的实现

JS深拷贝, 即传值拷贝, 需要新建一处内存,实现拷贝,具体实现如下:

//ES5深拷贝

(1)循环递归:

function deepClone(obj){

    var newObj= obj instanceof Array?[]:{};

    for(var i in obj){ // 注意:typeof 无法将null去除

      newObj[i]= obj[i] && (typeof obj[i]=='object') ?  deepClone(obj[i]):obj[i];

    }

    return newObj;

}

(2)转json再转回来:只有可以转成JSON格式的对象才可以这样用,像function,RegExp对象没办法转成JSON。

var obj1 = { body: { a: 10 } };

var obj2 = JSON.parse(JSON.stringify(obj1));

obj2.body.a = 20;

(3)Jquery: $.extend():底层依然是递归循环调用.

var $ = require('jquery');

var obj1 = {

a: 1,

b: { f: { g: 1 } },

c: [1, 2, 3]

};

var obj2 = $.extend(true, {}, obj1);

(4) lodash : _.cloneDeep:

var _ = require('lodash');

var obj1 = {

a: 1,

b: { f: { g: 1 } },

c: [1, 2, 3]

};

var obj2 = _.cloneDeep(obj1);

console.log(obj1.b.f === obj2.b.f);

//ES6深拷贝:确切说ES6没有提供完善的深拷贝方法,但是如果数据只有一层的话,可以简单实现:

(1)数组只有一层的话可以用:Array.from:

var arr1=[1,2,3];

var arr2=Array.from(arr1);

(2)数组只有一层的话可以用三个点:...

var arr1=[1,2,3];

var arr2=[...arr1];

(3)对象只有一层的话可以用:Object.assign()函数

let aClone = Object.assign({}, a);

你可能感兴趣的:(JS深拷贝的实现)