浅拷贝和深拷贝

125 阅读2分钟

浅拷贝

浅拷贝是将原数据中所有的数据复制一份,放到新的变量空间中,两个变量不共享一个内存地址。

  1. 对象的浅拷贝,Obeject.assign({},新对象)
const obj1={
	age:12,
    sayhi(){
    	console.log('hi')
    }
}
const obj2=Object.assign({},obj1)
console.log(obj1)
console.log(obj2)

obj1.age = 20;
console.log(obj1);
console.log(obj2);

但是浅拷贝中如果有引用数据类型,在创建新对象的过程中会将,这个引用数据类型的地址也放到新对象中,也就是说没有完全的形成一个新对象,还是跟原对象有些关联。这就是浅拷贝。 2. 数组浅拷贝

let arr1 = [1,2,3]
let arr2 = arr1.concat()/或者slice()
arr1.push(4)
console.log(arr1)
console.log(arr2)

同理,如果数组内有引用数据类型,同样会把地址拷贝过来 所以,所谓的浅拷贝就是说如果数组或对象的值是基本数据类型,那么两个就是完全没有关联,互不影响的两个数据,如果,其中有引用数据类型,那么两个数据中的引用数据类型还是公用一个地址

深拷贝

深拷贝,就是不管原数据中值是什么类型的数据,拷贝后的新数据跟原数据是完全没有关联的。

  1. 、利用json数据和json字符串之间的转换(对象和数组均可)
var obj = {
    name:"张三",
    age:12,
    wife:{
        name:"翠花",
        age:20
    }
}
var str = JSON.stringify(obj);
var pbj = JSON.parse(str);
obj.wife.gender = '女';
console.log(obj.wife);
console.log(pbj.wife);

但这个方法存在一些问题:

无法序列化函数 忽略symbol和undefined等 无法解决循环引用的对象(即为对象内部的属性互相赋值形成一个循环) 以上问题会导致对象拷贝时出现忽略问题存在的属性

2.递归

   function deepClone(obj){
            if(typeof obj!=='object'||obj== null){
                return
            }
            let result
            if(obj instanceof Array){
                result = []
            }else {
                result = {}
            }
            for(let key in obj){
                //保证key不是原型属性
                if(obj.hasOwnProperty(key)){
                    result[key]=deepClone(obj[key])
                }
            }
            return result
        }