缺陷:当对象中有undefined和function和symbol时会被自动忽略jquery
例如:测试
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"}
因此当你遇到这种状况时,能够本身写一个递归来进行深拷贝code
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: ƒ}