Javascript实现对象拷贝

在日常开发中,当想用某个变量去获取另外一个对象变量数据时,最直接的方法是:

let obj2 = obj1

由于对象是引用类型,当改变obj2中某属性的值时,obj1中的属性也会随着改变,有时候我们并不希望出现这种情况。那么,我们可以采取以下方法:

let obj2 = Object.assign({}, obj1)

这时,当改变obj2中某属性时,obj1的对应属性并不会随之变化,很多情况下是这样,但当obj1内部的属性又是对象时,这样的方法还是会出现在obj2中改变某属性,obj1中的属性也随之改变的情况。这样的拷贝,我们称之为浅拷贝。要实现深拷贝,简便的方法是借用JSON.parse和JSON.stringify来实现:

let obj2 = JSON.parse(JSON.stringify(obj1))

这样,obj2与obj1已经没有半毛钱关系了,随意改变obj2中的属性值,obj1都不会有任何改变,这样我们称之为深拷贝。但是利用JSON的方法,会把function给忽略掉,也就是说,当数据中有方法时,方法并不会被拷贝。但是,我们真的还想把方法也给拷贝,那只有自己写方法了。我自己写的一个方法如下:

let cloneObject = (obj) => {

        let object

        if(obj && typeof obj === 'object') {

            if(obj instanceof Array) {

                object = []

                for(let i = 0; i < obj.length; i++) {

                    if(obj[i] && typeof obj[i] === 'object') {

                        object.push(cloneObject(obj[i]))

                    }else{

                        object.push(obj[i])

                    }

                }

            }else{

                object = {}

                for(let key in obj) {

                    let value = obj[key]

                    if(typeof value === 'object') {

                        object[key] = cloneObject(value)

                    }else {

                        object[key] = value

                    }

                }

            }


        }

        return object

    }

这样的方法传入数组或都对象就能实现对象深拷贝

你可能感兴趣的:(Javascript实现对象拷贝)