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);