缺陷:當對象中有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: ƒ}