JavaScript之浅拷贝与深拷贝

个人理解 仅供参考 如有不当 欢迎指正

浅拷贝(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;
}   

猜你喜欢

转载自blog.csdn.net/fly_wugui/article/details/82381748