深拷贝,浅拷贝

2022-04-30  本文已影响0人  小鹿_xiaolu

1. 网上有很多关于深拷贝和浅拷贝的理论,这里就不细讲了,下面说一下深拷贝实现方法

```

function deepCopy(data) {

        var newdata = Array.isArray(data) ? [] : {}

        if (data && typeof data === "object") {

            for (var k in data) {

                // 判断data的k子元素是不是对象。如果是递归,如果不是,直接复制

                if (data.hasOwnProperty(k)) {

                    if (data[k] && typeof data[k] === "object") {

                      // 如果对象里面的属性还是对象则递归调用

                        newdata[k] = deepCopy(data[k]);

                    } else {

                        newdata[k] = data[k];

                    }

                }

            }

        }

        return newdata

    }

```


  var newdata = Array.isArray(data) ? [] : {}

  newdata[k] = data[k];

实现深拷贝主要看这两行,可以看到deepCopy函数里面新建了一个变量newdata,然后做了类型判断,如果是数组类型则定义为空数组,如果不是,则定义为空对象类型。并且把data[k] 赋值给了newdata[k]。这里data,是指传参,是指要拷贝的对象,所以data[k]是指对象里面的具体属性,所以newdata[k]=data[k]就是把拷贝对象的每个属性都一一赋值给新变量newdata,然后最后再retrun newdata;

所以深拷贝的中心思想则是,把A对象直接赋值给B对象,因为对象共用一个栈,所以修改b会影响会产生浅拷贝影响,所以这时创建一个第三方变量C,把对象A的属性都一一赋值给C,然后C再赋值B,所以A 和B 没有直接关系了,这时B再去修改其属性值也不会对A造成影响了

示例:

上一篇下一篇

猜你喜欢

热点阅读