个人理解 仅供参考 如有不当 欢迎指正
浅拷贝(shallow copy):只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存;
当修改新旧对象某一个值时,新旧对象都会被修改;
深拷贝(deep copy):复制并创建一个一摸一样的对象,不共享内存,修改新对象,旧对象保持不变。
一、浅拷贝
var o = {
a:[123, {a1: "a1-value"}],
b:{b1: 12, b2: {b3: "b3-balue"}},
c:"c-value"
}
var oCopy = o;
console.log(o) // {a:[123, {a1: "a1-value"}],b:{b1: 12, b2: {b3: "b3-balue"}},c:"c-value"}
console.log(oCopy) // {a:[123, {a1: "a1-value"}],b:{b1: 12, b2: {b3: "b3-balue"}},c:"c-value"}
//修改 新对象中的值
oCopy.b.b2.b3 = "new-b3-value";
console.log(o) // {a:[123, {a1: "a1-value"}],b:{b1: 12, b2: {b3: "new-b3-balue"}},c:"c-value"}
console.log(oCopy) // {a:[123, {a1: "a1-value"}],b:{b1: 12, b2: {b3: "new-b3-balue"}},c:"c-value"}
二、深拷贝
如果环境支持JSON 则可以使用JSON.stringify()和JSON.parse() 来实现深拷贝如果不支持的话使用递归
function deepCopyFn(o){
var deepCopy = deepCopy || {};
if( window.JSON ){
var strJson = JSON.stringify(o);
deepCopy = JSON.parse(strJson);
} else {
for ( _item in o) {
if( typeof o[_item] === "object" ){
deepCopy = o[_item].constructor === Array ? [] : {};
deepCopyFn(o[_item]);
} else {
deepCopy[_item] = o[_item]
}
}
}
return deepCopy;
}