1. JSON.parse(JOSN.stringify(obj)) 系列化对象
此方法在要拷贝的数据属性为 undefined,NaN,Infinity,-Infinity,Error,Date,RegExp,function 时,在JSON.parse时无法转换为原始的数据
2. 递归实现深拷贝
// 递归实现深拷贝
function deepClone(data) {
const type = Object.prototype.toString.call(data);
let result;
if (type === '[object Array]') {
result = [];
} else if (type === '[object Object]') {
result = {};
} else {
// 不再具有下一层次
return data;
}
if (type === '[object Array]') {
for (let i = 0, len = data.length; i < len; i++) {
result.push(deepClone(data[i]));
}
} else if (type === '[object Object]') {
for (const key in data) {
if (data.hasOwnProperty(key)) {
result[key] = deepClone(data[key]);
}
}
}
return result;
}
3. 扩展运算符 ... 深拷贝一维数据
const arr = [...[1, 3, 4]]
const obj ={...{name: '李明', age: 18}}
4. lodash.cloneDeep()
import _ from 'lodash'
var obj = {id:1,name:{a:'xx'},fn:function(){}};
var obj2 = _.cloneDeep(obj);
obj2.name.a = 'obj2';
console.log(obj,obj2)
5. jQuery.extend()
$.extend( [deep ], target, object1 [, objectN ] )
参数 | 描述 |
---|---|
deep | 可选。 Boolean类型 指示是否深度合并对象,默认为false。如果该值为true,且多个对象的某个同名属性也都是对象,则该"属性对象"的属性也将进行合并。 |
target | Object类型 目标对象,其他对象的成员属性将被附加到该对象上。 |
object1 | 可选。 Object类型 第一个被合并的对象。 |
objectN | 可选。 Object类型 第N个被合并的对象。 |