一 直接使用JSON.stringfy()和JSON.parse()
缺陷:当对象中有undefined和function和symbol时会被自动忽略
例如:
var syb = Symbol('obj');
var person = {
name: 'tino',
say: function () {
console.log('hi');
},
ok: syb,
un: undefined
}
var copy = JSON.parse(JSON.stringify(person))
console.log(copy);//{name: "tino"}
所以当你遇到这种情况时,可以自己写一个递归来进行深拷贝
二 递归深拷贝
function deepCopy(obj) {
var result = Array.isArray(obj) ? [] : {};
for (var key in obj) {
if (typeof (obj[key]) === "object" && obj[key] !== null) {
result[key] = deepCopy(obj[key]);
} else {
result[key] = obj[key];
}
}
return result;
}
测试:
var personCopy = deepCopy(person);
console.log(personCopy);//{name: "tino", ok: Symbol(obj), un: undefined, say: ƒ}
personCopy.test = "hahahha";
console.log(personCopy);//{name: "tino", ok: Symbol(obj), un: undefined, test: "hahahha", say: ƒ}
console.log(person); //{name: "tino", ok: Symbol(obj), un: undefined, say: ƒ}
var arr = [1, 2, 3, 4, 5, 6];
var arr1 = deepCopy(arr);
console.log(arr1); //[1, 2, 3, 4, 5, 6]
arr1.push(7);
console.log(arr1); //[1, 2, 3, 4, 5, 6, 7]
console.log(arr); //[1, 2, 3, 4, 5, 6]
也可以使用jQuery的extend来进行对象深拷贝,缺陷,当属性值为undefined的时候会被直接忽略
例如:
// jquery 的extend,当属性值为undefined时会被直接忽略
var person3 = $.extend({}, person);
console.log(person3);//{name: "tino", ok: Symbol(obj), say: ƒ}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。